diff --git a/.gitignore b/.gitignore index 812b289..2308aec 100644 --- a/.gitignore +++ b/.gitignore @@ -9,3 +9,4 @@ # generated /src/data +.astro/ diff --git a/README.md b/README.md index 33fd6f2..462aa6b 100644 --- a/README.md +++ b/README.md @@ -4,41 +4,26 @@ In the project directory, you can run: -### `npm start` +### `npm run dev` -Runs the app in the development mode.
-Open [http://localhost:3000](http://localhost:3000) to view it in the browser. - -The page will reload if you make edits.
-You will also see any lint errors in the console. - -### `npm test` - -Launches the test runner in the interactive watch mode.
-See the section about [running tests](https://facebook.github.io/create-react-app/docs/running-tests) for more information. +Starts the development server at [http://localhost:3000](http://localhost:3000). ### `npm run build` -Builds the app for production to the `build` folder.
-It correctly bundles React in production mode and optimizes the build for the best performance. - -The build is minified and the filenames include the hashes.
-Your app is ready to be deployed! - -See the section about [deployment](https://facebook.github.io/create-react-app/docs/deployment) for more information. - -### `npm run eject` +Builds the app for production to the `dist` folder. +It correctly bundles and optimizes the site for the best performance. -**Note: this is a one-way operation. Once you `eject`, you can’t go back!** +The build is minified and the filenames include the hashes. +Your site is ready to be deployed! -If you aren’t satisfied with the build tool and configuration choices, you can `eject` at any time. This command will remove the single build dependency from your project. +See the section about [deployment](https://docs.astro.build/en/guides/deploy/) for more information. -Instead, it will copy all the configuration files and the transitive dependencies (Webpack, Babel, ESLint, etc) right into your project so you have full control over them. All of the commands except `eject` will still work, but they will point to the copied scripts so you can tweak them. At this point you’re on your own. +### `npm run preview` -You don’t have to ever use `eject`. The curated feature set is suitable for small and middle deployments, and you shouldn’t feel obligated to use this feature. However we understand that this tool wouldn’t be useful if you couldn’t customize it when you are ready for it. +Preview your production build locally before deploying. ## Learn More -You can learn more in the [Create React App documentation](https://facebook.github.io/create-react-app/docs/getting-started). +You can learn more in the [Astro documentation](https://docs.astro.build/). -To learn React, check out the [React documentation](https://reactjs.org/). +To learn more about Bootstrap 4 (used in this project), check out the [Bootstrap documentation](https://getbootstrap.com/docs/4.6/getting-started/introduction/). diff --git a/astro.config.mjs b/astro.config.mjs new file mode 100644 index 0000000..86dbfb9 --- /dev/null +++ b/astro.config.mjs @@ -0,0 +1,3 @@ +import { defineConfig } from 'astro/config'; + +export default defineConfig({}); diff --git a/index.html b/index.html deleted file mode 100644 index 2404ef1..0000000 --- a/index.html +++ /dev/null @@ -1,22 +0,0 @@ - - - - - - - - - Flix | The Flix Programming Language - - - - Fork me on GitHub - - -
- - - - diff --git a/package-lock.json b/package-lock.json index ad0f457..5deaad4 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,135 +1,60 @@ { "name": "web", - "version": "0.1.0", - "lockfileVersion": 2, + "version": "0.2.0", + "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "web", - "version": "0.1.0", - "dependencies": { - "bootstrap": "^4.6.2", - "react": "^19.2.4", - "react-ace": "^14.0.1", - "react-dom": "^19.2.4", - "react-icons": "^5.6.0", - "react-router": "^7.13.2", - "react-router-dom": "^7.13.2", - "react-spinners": "^0.17.0", - "reactstrap": "^9.2.3" - }, - "devDependencies": { - "@vitejs/plugin-react": "^6.0.1", - "vite": "^8.0.2" - } - }, - "node_modules/@babel/runtime": { - "version": "7.22.6", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.22.6.tgz", - "integrity": "sha512-wDb5pWm4WDdF6LFUde3Jl8WzPA+3ZbxYqkC6xAXuD3irdEHN1k0NfTRrJD8ZD378SJ61miMLCqIOXYhd8x+AJQ==", - "dependencies": { - "regenerator-runtime": "^0.13.11" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@emnapi/core": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.9.1.tgz", - "integrity": "sha512-mukuNALVsoix/w1BJwFzwXBN/dHeejQtuVzcDsfOEsdpCumXb/E9j8w11h5S54tT1xhifGfbbSm/ICrObRb3KA==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "@emnapi/wasi-threads": "1.2.0", - "tslib": "^2.4.0" - } - }, - "node_modules/@emnapi/runtime": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.9.1.tgz", - "integrity": "sha512-VYi5+ZVLhpgK4hQ0TAjiQiZ6ol0oe4mBx7mVv7IflsiEp0OWoVsp/+f9Vc1hOhE0TtkORVrI1GvzyreqpgWtkA==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "tslib": "^2.4.0" - } - }, - "node_modules/@emnapi/wasi-threads": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.2.0.tgz", - "integrity": "sha512-N10dEJNSsUx41Z6pZsXU8FjPjpBEplgH24sfkmITrBED1/U2Esum9F3lfLrMjKHHjmi557zQn7kR9R+XWXu5Rg==", - "dev": true, - "license": "MIT", - "optional": true, + "version": "0.2.0", "dependencies": { - "tslib": "^2.4.0" + "astro": "^7.0.3", + "bootstrap": "^4.6.2" } }, - "node_modules/@napi-rs/wasm-runtime": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-1.1.1.tgz", - "integrity": "sha512-p64ah1M1ld8xjWv3qbvFwHiFVWrq1yFvV4f7w+mzaqiR4IlSgkqhcRdHwsGgomwzBH51sRY4NEowLxnaBjcW/A==", - "dev": true, + "node_modules/@astrojs/compiler-binding": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/@astrojs/compiler-binding/-/compiler-binding-0.2.3.tgz", + "integrity": "sha512-Xz3iBNse+hXXD25IXxsuXEt2ai8klAWE15CRm/EQBc9+aE3jXaF07DZx+iakk3HC6NHvWlEPzLPyxsLgPzOJsw==", "license": "MIT", - "optional": true, - "dependencies": { - "@emnapi/core": "^1.7.1", - "@emnapi/runtime": "^1.7.1", - "@tybys/wasm-util": "^0.10.1" + "engines": { + "node": "^20.19.0 || >=22.12.0" }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/Brooooooklyn" - } - }, - "node_modules/@oxc-project/types": { - "version": "0.122.0", - "resolved": "https://registry.npmjs.org/@oxc-project/types/-/types-0.122.0.tgz", - "integrity": "sha512-oLAl5kBpV4w69UtFZ9xqcmTi+GENWOcPF7FCrczTiBbmC0ibXxCwyvZGbO39rCVEuLGAZM84DH0pUIyyv/YJzA==", - "dev": true, - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/Boshen" - } - }, - "node_modules/@popperjs/core": { - "version": "2.11.8", - "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.8.tgz", - "integrity": "sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==", - "license": "MIT", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/popperjs" + "optionalDependencies": { + "@astrojs/compiler-binding-darwin-arm64": "0.2.3", + "@astrojs/compiler-binding-darwin-x64": "0.2.3", + "@astrojs/compiler-binding-linux-arm64-gnu": "0.2.3", + "@astrojs/compiler-binding-linux-arm64-musl": "0.2.3", + "@astrojs/compiler-binding-linux-x64-gnu": "0.2.3", + "@astrojs/compiler-binding-linux-x64-musl": "0.2.3", + "@astrojs/compiler-binding-wasm32-wasi": "0.2.3", + "@astrojs/compiler-binding-win32-arm64-msvc": "0.2.3", + "@astrojs/compiler-binding-win32-x64-msvc": "0.2.3" } }, - "node_modules/@rolldown/binding-android-arm64": { - "version": "1.0.0-rc.11", - "resolved": "https://registry.npmjs.org/@rolldown/binding-android-arm64/-/binding-android-arm64-1.0.0-rc.11.tgz", - "integrity": "sha512-SJ+/g+xNnOh6NqYxD0V3uVN4W3VfnrGsC9/hoglicgTNfABFG9JjISvkkU0dNY84MNHLWyOgxP9v9Y9pX4S7+A==", + "node_modules/@astrojs/compiler-binding-darwin-arm64": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/@astrojs/compiler-binding-darwin-arm64/-/compiler-binding-darwin-arm64-0.2.3.tgz", + "integrity": "sha512-sJIHeL1ONXEBLob8ZaXfmX6iCftUno08G/cMXj2FJnL0xNbHuELcEq1mjxHVFHNgUYu4P7xJNm2mpc0zUEPoKw==", "cpu": [ "arm64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ - "android" + "darwin" ], "engines": { "node": "^20.19.0 || >=22.12.0" } }, - "node_modules/@rolldown/binding-darwin-arm64": { - "version": "1.0.0-rc.11", - "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-arm64/-/binding-darwin-arm64-1.0.0-rc.11.tgz", - "integrity": "sha512-7WQgR8SfOPwmDZGFkThUvsmd/nwAWv91oCO4I5LS7RKrssPZmOt7jONN0cW17ydGC1n/+puol1IpoieKqQidmg==", + "node_modules/@astrojs/compiler-binding-darwin-x64": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/@astrojs/compiler-binding-darwin-x64/-/compiler-binding-darwin-x64-0.2.3.tgz", + "integrity": "sha512-P0NYu6aaIeLCqFfszxxBHL0a5WRaYigNVbDoO654Gi5Q2au5duDb5xZBv5EqUg4qnQVC173FXNvGZu1M7nk+/w==", "cpu": [ - "arm64" + "x64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -139,48 +64,54 @@ "node": "^20.19.0 || >=22.12.0" } }, - "node_modules/@rolldown/binding-darwin-x64": { - "version": "1.0.0-rc.11", - "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-x64/-/binding-darwin-x64-1.0.0-rc.11.tgz", - "integrity": "sha512-39Ks6UvIHq4rEogIfQBoBRusj0Q0nPVWIvqmwBLaT6aqQGIakHdESBVOPRRLacy4WwUPIx4ZKzfZ9PMW+IeyUQ==", + "node_modules/@astrojs/compiler-binding-linux-arm64-gnu": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/@astrojs/compiler-binding-linux-arm64-gnu/-/compiler-binding-linux-arm64-gnu-0.2.3.tgz", + "integrity": "sha512-PqVN5AqhuDqfx3ejaerwrC8codpV9jnyKV+IOel027qsJ1anFUJLdjUlY8VVys0xgd8lmqveX11OkcaQj/otTg==", "cpu": [ - "x64" + "arm64" + ], + "libc": [ + "glibc" ], - "dev": true, "license": "MIT", "optional": true, "os": [ - "darwin" + "linux" ], "engines": { "node": "^20.19.0 || >=22.12.0" } }, - "node_modules/@rolldown/binding-freebsd-x64": { - "version": "1.0.0-rc.11", - "resolved": "https://registry.npmjs.org/@rolldown/binding-freebsd-x64/-/binding-freebsd-x64-1.0.0-rc.11.tgz", - "integrity": "sha512-jfsm0ZHfhiqrvWjJAmzsqiIFPz5e7mAoCOPBNTcNgkiid/LaFKiq92+0ojH+nmJmKYkre4t71BWXUZDNp7vsag==", + "node_modules/@astrojs/compiler-binding-linux-arm64-musl": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/@astrojs/compiler-binding-linux-arm64-musl/-/compiler-binding-linux-arm64-musl-0.2.3.tgz", + "integrity": "sha512-O3e2CbN4yTsRguWYNnRd0p5YQ0H3fb7KpcR0W4R319q/gq5B1pJ7eqNbiO3b8g2AuiEcRTiUz5jeGT9j69cxOQ==", "cpu": [ - "x64" + "arm64" + ], + "libc": [ + "musl" ], - "dev": true, "license": "MIT", "optional": true, "os": [ - "freebsd" + "linux" ], "engines": { "node": "^20.19.0 || >=22.12.0" } }, - "node_modules/@rolldown/binding-linux-arm-gnueabihf": { - "version": "1.0.0-rc.11", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-1.0.0-rc.11.tgz", - "integrity": "sha512-zjQaUtSyq1nVe3nxmlSCuR96T1LPlpvmJ0SZy0WJFEsV4kFbXcq2u68L4E6O0XeFj4aex9bEauqjW8UQBeAvfQ==", + "node_modules/@astrojs/compiler-binding-linux-x64-gnu": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/@astrojs/compiler-binding-linux-x64-gnu/-/compiler-binding-linux-x64-gnu-0.2.3.tgz", + "integrity": "sha512-hbLBjXVp+96psMe7/7uqyrquGiULXANrq6REVxxPK/I5VzebZ7LHmSfykmByUbLyR1u+K6CTBKgvdQsK2L+2Xw==", "cpu": [ - "arm" + "x64" + ], + "libc": [ + "glibc" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -190,14 +121,16 @@ "node": "^20.19.0 || >=22.12.0" } }, - "node_modules/@rolldown/binding-linux-arm64-gnu": { - "version": "1.0.0-rc.11", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.0.0-rc.11.tgz", - "integrity": "sha512-WMW1yE6IOnehTcFE9eipFkm3XN63zypWlrJQ2iF7NrQ9b2LDRjumFoOGJE8RJJTJCTBAdmLMnJ8uVitACUUo1Q==", + "node_modules/@astrojs/compiler-binding-linux-x64-musl": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/@astrojs/compiler-binding-linux-x64-musl/-/compiler-binding-linux-x64-musl-0.2.3.tgz", + "integrity": "sha512-vIiEvOwrJfHZMaTmqUCrFTIwMYL0+PD3Rvy7kFDQgERyx3zhaw8CPa01MCCqa+/sj344BGrXKZ6ti37SgNLMhw==", "cpu": [ - "arm64" + "x64" + ], + "libc": [ + "musl" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -207,873 +140,3794 @@ "node": "^20.19.0 || >=22.12.0" } }, - "node_modules/@rolldown/binding-linux-arm64-musl": { - "version": "1.0.0-rc.11", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.0.0-rc.11.tgz", - "integrity": "sha512-jfndI9tsfm4APzjNt6QdBkYwre5lRPUgHeDHoI7ydKUuJvz3lZeCfMsI56BZj+7BYqiKsJm7cfd/6KYV7ubrBg==", + "node_modules/@astrojs/compiler-binding-wasm32-wasi": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/@astrojs/compiler-binding-wasm32-wasi/-/compiler-binding-wasm32-wasi-0.2.3.tgz", + "integrity": "sha512-p9S2X8z/mUR2SMzAVJRFMCt8YaalKR+pjl2DgpdjzCQc6ww4bo8kiy54tgKqxZeNF5c+/2tCDTQIxVSm9V1FsA==", "cpu": [ - "arm64" + "wasm32" ], - "dev": true, "license": "MIT", "optional": true, - "os": [ - "linux" - ], + "dependencies": { + "@napi-rs/wasm-runtime": "^1.1.6" + }, "engines": { - "node": "^20.19.0 || >=22.12.0" + "node": ">=14.0.0" } }, - "node_modules/@rolldown/binding-linux-ppc64-gnu": { - "version": "1.0.0-rc.11", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-1.0.0-rc.11.tgz", - "integrity": "sha512-ZlFgw46NOAGMgcdvdYwAGu2Q+SLFA9LzbJLW+iyMOJyhj5wk6P3KEE9Gct4xWwSzFoPI7JCdYmYMzVtlgQ+zfw==", + "node_modules/@astrojs/compiler-binding-win32-arm64-msvc": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/@astrojs/compiler-binding-win32-arm64-msvc/-/compiler-binding-win32-arm64-msvc-0.2.3.tgz", + "integrity": "sha512-vcCG6JttIb5vbSmcxO2O398hpVj7lQ349iS7cjgYP6ZuLVEnw+9qPAr2MM2kJkU5wEGZqJ2gyi/M7UJoPwH1iQ==", "cpu": [ - "ppc64" + "arm64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ - "linux" + "win32" ], "engines": { "node": "^20.19.0 || >=22.12.0" } }, - "node_modules/@rolldown/binding-linux-s390x-gnu": { - "version": "1.0.0-rc.11", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-1.0.0-rc.11.tgz", - "integrity": "sha512-hIOYmuT6ofM4K04XAZd3OzMySEO4K0/nc9+jmNcxNAxRi6c5UWpqfw3KMFV4MVFWL+jQsSh+bGw2VqmaPMTLyw==", + "node_modules/@astrojs/compiler-binding-win32-x64-msvc": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/@astrojs/compiler-binding-win32-x64-msvc/-/compiler-binding-win32-x64-msvc-0.2.3.tgz", + "integrity": "sha512-hKssjNvC36e00Inb1GW1JsVyCFSCGnIjKem4S8q0VIW6cpWAUpvYB4qQU2HIDGD6SDX0ork4F5sWkNWkp2hrGQ==", "cpu": [ - "s390x" + "x64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ - "linux" + "win32" ], "engines": { "node": "^20.19.0 || >=22.12.0" } }, - "node_modules/@rolldown/binding-linux-x64-gnu": { - "version": "1.0.0-rc.11", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.0.0-rc.11.tgz", - "integrity": "sha512-qXBQQO9OvkjjQPLdUVr7Nr2t3QTZI7s4KZtfw7HzBgjbmAPSFwSv4rmET9lLSgq3rH/ndA3ngv3Qb8l2njoPNA==", + "node_modules/@astrojs/compiler-rs": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/@astrojs/compiler-rs/-/compiler-rs-0.2.3.tgz", + "integrity": "sha512-JRAtRcPxS4JeAZEIQFQ6GecBs/Wyp4m6/E8vBNxSgVfo1AtRVLUqRCl5oCGOZ0X/BSBB3Vef/7IlzyiGKi2ORA==", + "license": "MIT", + "dependencies": { + "@astrojs/compiler-binding": "0.2.3" + } + }, + "node_modules/@astrojs/internal-helpers": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/@astrojs/internal-helpers/-/internal-helpers-0.10.0.tgz", + "integrity": "sha512-Ry2R3VPeIN4uPCSA4xQc+e+vsJXkalKpEbDc07hV+a/o5Bs2N/s/uDcPJH/05L19DKh9tAy7e6JM3YZ6Cxfezw==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.4", + "@types/mdast": "^4.0.4", + "js-yaml": "^4.1.1", + "picomatch": "^4.0.4", + "retext-smartypants": "^6.2.0", + "shiki": "^4.0.2", + "smol-toml": "^1.6.0", + "unified": "^11.0.5" + } + }, + "node_modules/@astrojs/markdown-satteri": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/@astrojs/markdown-satteri/-/markdown-satteri-0.3.2.tgz", + "integrity": "sha512-feXuUPy41gVfeM7EHT1ciUim8ozGr+YHXab9uUBc1Hk8y60DQosO8ldL+AoPXnCAoGj1OChwHfvXmmJ6XVnY9A==", + "license": "MIT", + "dependencies": { + "@astrojs/internal-helpers": "0.10.0", + "@astrojs/prism": "4.0.2", + "github-slugger": "^2.0.0", + "satteri": "^0.9.1" + } + }, + "node_modules/@astrojs/prism": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@astrojs/prism/-/prism-4.0.2.tgz", + "integrity": "sha512-KTivpmnz6lDsC6o9H4+DNm2SrE/GHzw8cNAvEJwAvUT+eoaEnn/4NtbDNfRRaxaJHdp15gf+tfHAWiXR4wB3BA==", + "license": "MIT", + "dependencies": { + "prismjs": "^1.30.0" + }, + "engines": { + "node": ">=22.12.0" + } + }, + "node_modules/@astrojs/telemetry": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/@astrojs/telemetry/-/telemetry-3.3.2.tgz", + "integrity": "sha512-j8DNruA8ors99Al39RYZPJK4DC1bKkoNm93mAMuBhY9TCNC4R8n1q7ovFnJ5qhGh5Lsh7pa1gpQVpYpsJPeTHQ==", + "license": "MIT", + "dependencies": { + "ci-info": "^4.4.0", + "dset": "^3.1.4", + "is-docker": "^4.0.0", + "is-wsl": "^3.1.1", + "which-pm-runs": "^1.1.0" + }, + "engines": { + "node": "18.20.8 || ^20.3.0 || >=22.0.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.29.7.tgz", + "integrity": "sha512-Pb5ijPrZ89GDH8223L4UP8i6QApWxs04RbPQJTeWDV0/keR2E36MeKnyr6LYmUUvqRRI+Iv87SuF1W6ErINzYw==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.29.7.tgz", + "integrity": "sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.7.tgz", + "integrity": "sha512-hnORnjP/1P/zFEndoeX+n+t1RwWRJiJpM/jO7FW32Kn9r5+sJB2JWOdYo4L6k78j15eCwY3Gm/7364B1EMwtNg==", + "license": "MIT", + "dependencies": { + "@babel/types": "^7.29.7" + }, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/types": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.7.tgz", + "integrity": "sha512-4zBIxpPzowiZpusoFkyGVwakdRJUyuH5PxQ/PrqghfdFWWasvnCdPfQXHrenDai+gyLARulZjZowCOj6fjT4pA==", + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.29.7", + "@babel/helper-validator-identifier": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@bruits/satteri-darwin-arm64": { + "version": "0.9.3", + "resolved": "https://registry.npmjs.org/@bruits/satteri-darwin-arm64/-/satteri-darwin-arm64-0.9.3.tgz", + "integrity": "sha512-dRUZZrdwh1asfTOyM1nDNmzolhnHtlIFpqYrl1Tdd3YVcaebKmrfJgGL7NAoGPjbEwYmZxaugrxA0uzw83c0dw==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@bruits/satteri-darwin-x64": { + "version": "0.9.3", + "resolved": "https://registry.npmjs.org/@bruits/satteri-darwin-x64/-/satteri-darwin-x64-0.9.3.tgz", + "integrity": "sha512-wgNCTRp2hPSpNMGFv5A4+6+VXgRJIlBZ7XKb3iwjV8YjRWNIjzE5zV2fUeYynyZYVRkuJ9aYFqQmWhc1e5H+UQ==", "cpu": [ "x64" ], - "dev": true, - "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@bruits/satteri-linux-arm64-gnu": { + "version": "0.9.3", + "resolved": "https://registry.npmjs.org/@bruits/satteri-linux-arm64-gnu/-/satteri-linux-arm64-gnu-0.9.3.tgz", + "integrity": "sha512-A/pWy8Jb/PhDYc2/JFuYh06gFJcsfBUBDl81YydGYBrL/Z4nItDfhNDNOibyeSN/lKKDRlycIHEIajjErk00sQ==", + "cpu": [ + "arm64" + ], + "libc": [ + "glibc" + ], "optional": true, "os": [ "linux" + ] + }, + "node_modules/@bruits/satteri-linux-arm64-musl": { + "version": "0.9.3", + "resolved": "https://registry.npmjs.org/@bruits/satteri-linux-arm64-musl/-/satteri-linux-arm64-musl-0.9.3.tgz", + "integrity": "sha512-L6YxmyOSickzo4pE5WmZfNTJnjX0MtgKOsuwQfNZECTx9Ir5vl2B37EIwnxe2AybuPPHl+FqVQtthNDUdH4Vgg==", + "cpu": [ + "arm64" ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } + "libc": [ + "musl" + ], + "optional": true, + "os": [ + "linux" + ] }, - "node_modules/@rolldown/binding-linux-x64-musl": { - "version": "1.0.0-rc.11", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-musl/-/binding-linux-x64-musl-1.0.0-rc.11.tgz", - "integrity": "sha512-/tpFfoSTzUkH9LPY+cYbqZBDyyX62w5fICq9qzsHLL8uTI6BHip3Q9Uzft0wylk/i8OOwKik8OxW+QAhDmzwmg==", + "node_modules/@bruits/satteri-linux-x64-gnu": { + "version": "0.9.3", + "resolved": "https://registry.npmjs.org/@bruits/satteri-linux-x64-gnu/-/satteri-linux-x64-gnu-0.9.3.tgz", + "integrity": "sha512-RgH6GPihg9Lzs2yHUsMjqiLxfLyOdmBty8sg9pBY9B4CBnvdOzvg8vklqN+C4qrEEdA9TwpbDpHr1AshLKyRpw==", "cpu": [ "x64" ], - "dev": true, - "license": "MIT", + "libc": [ + "glibc" + ], "optional": true, "os": [ "linux" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } + ] }, - "node_modules/@rolldown/binding-openharmony-arm64": { - "version": "1.0.0-rc.11", - "resolved": "https://registry.npmjs.org/@rolldown/binding-openharmony-arm64/-/binding-openharmony-arm64-1.0.0-rc.11.tgz", - "integrity": "sha512-mcp3Rio2w72IvdZG0oQ4bM2c2oumtwHfUfKncUM6zGgz0KgPz4YmDPQfnXEiY5t3+KD/i8HG2rOB/LxdmieK2g==", + "node_modules/@bruits/satteri-linux-x64-musl": { + "version": "0.9.3", + "resolved": "https://registry.npmjs.org/@bruits/satteri-linux-x64-musl/-/satteri-linux-x64-musl-0.9.3.tgz", + "integrity": "sha512-BeWhVORjNTIomePznUKiMbHZTqC0j7sMXZFsISmbX+po5d33KLkqBqKh6K332CHJ8KUmCWx16FfPjwsoysttQg==", "cpu": [ - "arm64" + "x64" + ], + "libc": [ + "musl" ], - "dev": true, - "license": "MIT", "optional": true, "os": [ - "openharmony" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } + "linux" + ] }, - "node_modules/@rolldown/binding-wasm32-wasi": { - "version": "1.0.0-rc.11", - "resolved": "https://registry.npmjs.org/@rolldown/binding-wasm32-wasi/-/binding-wasm32-wasi-1.0.0-rc.11.tgz", - "integrity": "sha512-LXk5Hii1Ph9asuGRjBuz8TUxdc1lWzB7nyfdoRgI0WGPZKmCxvlKk8KfYysqtr4MfGElu/f/pEQRh8fcEgkrWw==", + "node_modules/@bruits/satteri-wasm32-wasi": { + "version": "0.9.3", + "resolved": "https://registry.npmjs.org/@bruits/satteri-wasm32-wasi/-/satteri-wasm32-wasi-0.9.3.tgz", + "integrity": "sha512-dFNcOHKWV2cztCPnYTn7kZ9D7kNOt8N239z5ysFkNHLxJrfK7zaKIXQbfXYN32C+JoVFqAcTIOeWH2+VnsCOHg==", "cpu": [ "wasm32" ], - "dev": true, - "license": "MIT", "optional": true, "dependencies": { - "@napi-rs/wasm-runtime": "^1.1.1" + "@emnapi/core": "1.11.1", + "@emnapi/runtime": "1.11.1", + "@napi-rs/wasm-runtime": "^1.1.6" }, "engines": { "node": ">=14.0.0" } }, - "node_modules/@rolldown/binding-win32-arm64-msvc": { - "version": "1.0.0-rc.11", - "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.0.0-rc.11.tgz", - "integrity": "sha512-dDwf5otnx0XgRY1yqxOC4ITizcdzS/8cQ3goOWv3jFAo4F+xQYni+hnMuO6+LssHHdJW7+OCVL3CoU4ycnh35Q==", + "node_modules/@bruits/satteri-win32-arm64-msvc": { + "version": "0.9.3", + "resolved": "https://registry.npmjs.org/@bruits/satteri-win32-arm64-msvc/-/satteri-win32-arm64-msvc-0.9.3.tgz", + "integrity": "sha512-VnwjBHiAra/PNNEza8eSZdQiG4A3PtTJJwUDtOPAc6iTs0BWZwZX8+OPUZE7//yQCBhgvEMcI8vpwsAwCb6qGQ==", "cpu": [ "arm64" ], - "dev": true, - "license": "MIT", "optional": true, "os": [ "win32" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } + ] }, - "node_modules/@rolldown/binding-win32-x64-msvc": { - "version": "1.0.0-rc.11", - "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.0.0-rc.11.tgz", - "integrity": "sha512-LN4/skhSggybX71ews7dAj6r2geaMJfm3kMbK2KhFMg9B10AZXnKoLCVVgzhMHL0S+aKtr4p8QbAW8k+w95bAA==", + "node_modules/@bruits/satteri-win32-x64-msvc": { + "version": "0.9.3", + "resolved": "https://registry.npmjs.org/@bruits/satteri-win32-x64-msvc/-/satteri-win32-x64-msvc-0.9.3.tgz", + "integrity": "sha512-Dsoe4reWe69MyILmMwU6iISIceTW7YIFqbyym7haf9DhUvqkYfMAyp7GMM21JzV0SpG9A2BwzFVP7iq9mmxrpA==", "cpu": [ "x64" ], - "dev": true, - "license": "MIT", "optional": true, "os": [ "win32" - ], + ] + }, + "node_modules/@capsizecss/unpack": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@capsizecss/unpack/-/unpack-4.0.1.tgz", + "integrity": "sha512-CuNiSqg7+e1cO/GjffyMOm5Tt2jUF9CWHHnvQ/UkqvtkGfHdgwEC0wpmq7fkN3gxwpRnrAN0WzO3vREKmNolMQ==", + "license": "MIT", + "dependencies": { + "fontkitten": "^1.0.3" + }, "engines": { - "node": "^20.19.0 || >=22.12.0" + "node": ">=18" } }, - "node_modules/@rolldown/pluginutils": { - "version": "1.0.0-rc.7", - "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-rc.7.tgz", - "integrity": "sha512-qujRfC8sFVInYSPPMLQByRh7zhwkGFS4+tyMQ83srV1qrxL4g8E2tyxVVyxd0+8QeBM1mIk9KbWxkegRr76XzA==", - "dev": true, - "license": "MIT" - }, - "node_modules/@tybys/wasm-util": { - "version": "0.10.1", - "resolved": "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.10.1.tgz", - "integrity": "sha512-9tTaPJLSiejZKx+Bmog4uSubteqTvFrVrURwkmHixBo0G4seD0zUxp98E1DzUBJxLQ3NPwXrGKDiVjwx/DpPsg==", - "dev": true, + "node_modules/@clack/core": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/@clack/core/-/core-1.4.2.tgz", + "integrity": "sha512-0Ty/1Gfm+Kb07sXcuESjyKfwEhSy4Ns1AgeEisHb/bDY5fWme0tTeTkU14T1Gmcs17YIjB/teiDe4uaCghbYqQ==", "license": "MIT", - "optional": true, "dependencies": { - "tslib": "^2.4.0" + "fast-wrap-ansi": "^0.2.0", + "sisteransi": "^1.0.5" + }, + "engines": { + "node": ">= 20.12.0" } }, - "node_modules/@vitejs/plugin-react": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-6.0.1.tgz", - "integrity": "sha512-l9X/E3cDb+xY3SWzlG1MOGt2usfEHGMNIaegaUGFsLkb3RCn/k8/TOXBcab+OndDI4TBtktT8/9BwwW8Vi9KUQ==", - "dev": true, + "node_modules/@clack/prompts": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@clack/prompts/-/prompts-1.6.0.tgz", + "integrity": "sha512-EYlRokl8szrP9Z25qT5aepMdBjzBvHF9ZEhzIiUBc9guz/T31EqRgvD0QSgZcpE93xiwrr+OkB4nz0BZyF6fSA==", "license": "MIT", "dependencies": { - "@rolldown/pluginutils": "1.0.0-rc.7" + "@clack/core": "1.4.2", + "fast-string-width": "^3.0.2", + "fast-wrap-ansi": "^0.2.0", + "sisteransi": "^1.0.5" }, "engines": { - "node": "^20.19.0 || >=22.12.0" - }, - "peerDependencies": { - "@rolldown/plugin-babel": "^0.1.7 || ^0.2.0", - "babel-plugin-react-compiler": "^1.0.0", - "vite": "^8.0.0" - }, - "peerDependenciesMeta": { - "@rolldown/plugin-babel": { - "optional": true - }, - "babel-plugin-react-compiler": { - "optional": true - } + "node": ">= 20.12.0" } }, - "node_modules/ace-builds": { - "version": "1.43.6", - "resolved": "https://registry.npmjs.org/ace-builds/-/ace-builds-1.43.6.tgz", - "integrity": "sha512-L1ddibQ7F3vyXR2k2fg+I8TQTPWVA6CKeDQr/h2+8CeyTp3W6EQL8xNFZRTztuP8xNOAqL3IYPqdzs31GCjDvg==", - "license": "BSD-3-Clause" - }, - "node_modules/bootstrap": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/bootstrap/-/bootstrap-4.6.2.tgz", - "integrity": "sha512-51Bbp/Uxr9aTuy6ca/8FbFloBUJZLHwnhTcnjIeRn2suQWsWzcuJhGjKDB5eppVte/8oCdOL3VuwxvZDUggwGQ==", - "deprecated": "This version of Bootstrap is no longer supported. Please upgrade to the latest version.", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/twbs" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/bootstrap" - } - ], + "node_modules/@emnapi/core": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.11.1.tgz", + "integrity": "sha512-RSvbQmHzdKzNsLYa/wHrbc3KN4sYLKAdPZxqiM2HATqv/SBk2/ENSHpvXGaLOMcsAyz0poEGqkmmKYG3OWiJEQ==", "license": "MIT", - "peerDependencies": { - "jquery": "1.9.1 - 3", - "popper.js": "^1.16.1" + "optional": true, + "dependencies": { + "@emnapi/wasi-threads": "1.2.2", + "tslib": "^2.4.0" } }, - "node_modules/classnames": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/classnames/-/classnames-2.3.1.tgz", - "integrity": "sha512-OlQdbZ7gLfGarSqxesMesDa5uz7KFbID8Kpq/SxIoNGDqY8lSYs0D+hhtBXhcdB3rcbXArFr7vlHheLk1voeNA==" - }, - "node_modules/cookie": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-1.1.1.tgz", - "integrity": "sha512-ei8Aos7ja0weRpFzJnEA9UHJ/7XQmqglbRwnf2ATjcB9Wq874VKH9kfjjirM6UhU2/E5fFYadylyhFldcqSidQ==", + "node_modules/@emnapi/runtime": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.11.1.tgz", + "integrity": "sha512-vgj7R3y3Wgx24IQaGPA/R6YFXLHVMOZ0uVEyIQPaWs+rd1AzfEMXlAC22FYwO1XkKR6NPsq7mUandH8oIRdZFw==", "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" - } - }, - "node_modules/csstype": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz", - "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==", - "license": "MIT" - }, - "node_modules/detect-libc": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz", - "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=8" + "optional": true, + "dependencies": { + "tslib": "^2.4.0" } }, - "node_modules/diff-match-patch": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/diff-match-patch/-/diff-match-patch-1.0.5.tgz", - "integrity": "sha512-IayShXAgj/QMXgB0IWmKx+rOPuGMhqm5w6jvFxmVenXKIzRqTAAsbBPT3kWQeGANj3jGgvcvv4yK6SxqYmikgw==" - }, - "node_modules/dom-helpers": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/dom-helpers/-/dom-helpers-5.2.1.tgz", - "integrity": "sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA==", + "node_modules/@emnapi/wasi-threads": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.2.2.tgz", + "integrity": "sha512-c95qOXkHdydNKhscBTebqEC1CVAZpyqOfVfBzQ1qgzyl3gfeldUjIggDbIZgDKsHLgnsM+igH7TJ/eAasaVuMA==", "license": "MIT", + "optional": true, "dependencies": { - "@babel/runtime": "^7.8.7", - "csstype": "^3.0.2" + "tslib": "^2.4.0" } }, - "node_modules/fsevents": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", - "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", - "dev": true, - "hasInstallScript": true, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.28.1.tgz", + "integrity": "sha512-Svl7tq8k/08+p6CXPpRjQ1fKX+1odH/BQbb48fV6fj3CWHhsoIOoY87w1oHXm0qEpkIK3ZfVgp0hed3XBXzXMQ==", + "cpu": [ + "ppc64" + ], + "license": "MIT", "optional": true, "os": [ - "darwin" + "aix" ], "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + "node": ">=18" } }, - "node_modules/jquery": { - "version": "3.6.1", - "resolved": "https://registry.npmjs.org/jquery/-/jquery-3.6.1.tgz", - "integrity": "sha512-opJeO4nCucVnsjiXOE+/PcCgYw9Gwpvs/a6B1LL/lQhwWwpbVEVYDZ1FokFr8PRc7ghYlrFPuyHuiiDNTQxmcw==", - "peer": true - }, - "node_modules/js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" - }, - "node_modules/lightningcss": { - "version": "1.32.0", - "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.32.0.tgz", - "integrity": "sha512-NXYBzinNrblfraPGyrbPoD19C1h9lfI/1mzgWYvXUTe414Gz/X1FD2XBZSZM7rRTrMA8JL3OtAaGifrIKhQ5yQ==", - "dev": true, - "license": "MPL-2.0", - "dependencies": { - "detect-libc": "^2.0.3" - }, + "node_modules/@esbuild/android-arm": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.28.1.tgz", + "integrity": "sha512-0k2F129Xdio1TdJfzJ8sy1Q47vUD2NnwdhiAf7drUN1EBTfPf4hsFCtmMgu/6m8JSzsBrlmVjudMBQqOfG8usQ==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - }, - "optionalDependencies": { - "lightningcss-android-arm64": "1.32.0", - "lightningcss-darwin-arm64": "1.32.0", - "lightningcss-darwin-x64": "1.32.0", - "lightningcss-freebsd-x64": "1.32.0", - "lightningcss-linux-arm-gnueabihf": "1.32.0", - "lightningcss-linux-arm64-gnu": "1.32.0", - "lightningcss-linux-arm64-musl": "1.32.0", - "lightningcss-linux-x64-gnu": "1.32.0", - "lightningcss-linux-x64-musl": "1.32.0", - "lightningcss-win32-arm64-msvc": "1.32.0", - "lightningcss-win32-x64-msvc": "1.32.0" + "node": ">=18" } }, - "node_modules/lightningcss-android-arm64": { - "version": "1.32.0", - "resolved": "https://registry.npmjs.org/lightningcss-android-arm64/-/lightningcss-android-arm64-1.32.0.tgz", - "integrity": "sha512-YK7/ClTt4kAK0vo6w3X+Pnm0D2cf2vPHbhOXdoNti1Ga0al1P4TBZhwjATvjNwLEBCnKvjJc2jQgHXH0NEwlAg==", + "node_modules/@esbuild/android-arm64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.28.1.tgz", + "integrity": "sha512-34EGEbCIAgosYz6goLcopX6Mo7NyGv9tfwEM2/7Ce2VcVRk568iSvniGWcUXIy7wEDR1wzolcxcriFVrWYcwBg==", "cpu": [ "arm64" ], - "dev": true, - "license": "MPL-2.0", + "license": "MIT", "optional": true, "os": [ "android" ], "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" + "node": ">=18" } }, - "node_modules/lightningcss-darwin-arm64": { - "version": "1.32.0", - "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.32.0.tgz", - "integrity": "sha512-RzeG9Ju5bag2Bv1/lwlVJvBE3q6TtXskdZLLCyfg5pt+HLz9BqlICO7LZM7VHNTTn/5PRhHFBSjk5lc4cmscPQ==", + "node_modules/@esbuild/android-x64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.28.1.tgz", + "integrity": "sha512-dbwY7ltSMDWsRatcRpCnES4F+im88OCUgGZjy52shC7GqHRE/cYlxNbB4Z4UpJswpcc4Qxd2oE/ufM0p61IKng==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.28.1.tgz", + "integrity": "sha512-TZbWkQY7kvTAXbXUT7uVACR5cMHsDiSz9z7ZKAX/RTq/WJEk3QyRr0wZpNhBDX+/0CtdqUIJlOiodQcta6tY3Q==", "cpu": [ "arm64" ], - "dev": true, - "license": "MPL-2.0", + "license": "MIT", "optional": true, "os": [ "darwin" ], "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" + "node": ">=18" } }, - "node_modules/lightningcss-darwin-x64": { - "version": "1.32.0", - "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.32.0.tgz", - "integrity": "sha512-U+QsBp2m/s2wqpUYT/6wnlagdZbtZdndSmut/NJqlCcMLTWp5muCrID+K5UJ6jqD2BFshejCYXniPDbNh73V8w==", + "node_modules/@esbuild/darwin-x64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.28.1.tgz", + "integrity": "sha512-zfdzgK9ACBNZLI/CyHTOx81SyNbM6YXn7rxSgX97VjyiPl9W1i4Ka4fgKECEoFCKGpvBj5qArWIGgQjOwkgskQ==", "cpu": [ "x64" ], - "dev": true, - "license": "MPL-2.0", + "license": "MIT", "optional": true, "os": [ "darwin" ], "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" + "node": ">=18" } }, - "node_modules/lightningcss-freebsd-x64": { - "version": "1.32.0", - "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.32.0.tgz", - "integrity": "sha512-JCTigedEksZk3tHTTthnMdVfGf61Fky8Ji2E4YjUTEQX14xiy/lTzXnu1vwiZe3bYe0q+SpsSH/CTeDXK6WHig==", + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.28.1.tgz", + "integrity": "sha512-wG2EA8ENdEI0qhkSZMjfqrdY+ziCYCPMmtZjjIwOmXFjmyzEHn+UUxk5of+SYsjtfs3VpnlC7QLzSI5hY/rOAw==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.28.1.tgz", + "integrity": "sha512-i7dZ9vQgnvSCzi/rYCXNgtF/U+eKZNJBzu3eTQbRgHnM7tNSizLOkRFAl3qzVc/Op/u5YkHHa4pf/3DOYHthLQ==", "cpu": [ "x64" ], - "dev": true, - "license": "MPL-2.0", + "license": "MIT", "optional": true, "os": [ "freebsd" ], "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" + "node": ">=18" } }, - "node_modules/lightningcss-linux-arm-gnueabihf": { - "version": "1.32.0", - "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.32.0.tgz", - "integrity": "sha512-x6rnnpRa2GL0zQOkt6rts3YDPzduLpWvwAF6EMhXFVZXD4tPrBkEFqzGowzCsIWsPjqSK+tyNEODUBXeeVHSkw==", + "node_modules/@esbuild/linux-arm": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.28.1.tgz", + "integrity": "sha512-qVXBOHQS+d5Y722GwJzJUtOLlX7km3CraOaGormF1pDtPd2C/l1SHRPgjLunLGe51Sh5YYWKMFDyV4SxgMQYTQ==", "cpu": [ "arm" ], - "dev": true, - "license": "MPL-2.0", + "license": "MIT", "optional": true, "os": [ "linux" ], "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" + "node": ">=18" } }, - "node_modules/lightningcss-linux-arm64-gnu": { - "version": "1.32.0", - "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.32.0.tgz", - "integrity": "sha512-0nnMyoyOLRJXfbMOilaSRcLH3Jw5z9HDNGfT/gwCPgaDjnx0i8w7vBzFLFR1f6CMLKF8gVbebmkUN3fa/kQJpQ==", + "node_modules/@esbuild/linux-arm64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.28.1.tgz", + "integrity": "sha512-yHs+0uc8+nvEAfAfxrWQKK5peSNzBc4PegcMO0EJ2hT71uA7vB8Ihg2e77R2P7SG5uYjPbHlLLmve4LLLRCf0g==", "cpu": [ "arm64" ], - "dev": true, - "license": "MPL-2.0", + "license": "MIT", "optional": true, "os": [ "linux" ], "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" + "node": ">=18" } }, - "node_modules/lightningcss-linux-arm64-musl": { - "version": "1.32.0", - "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.32.0.tgz", - "integrity": "sha512-UpQkoenr4UJEzgVIYpI80lDFvRmPVg6oqboNHfoH4CQIfNA+HOrZ7Mo7KZP02dC6LjghPQJeBsvXhJod/wnIBg==", + "node_modules/@esbuild/linux-ia32": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.28.1.tgz", + "integrity": "sha512-d1z4ZuP0ajrfz/FhGT4vv278rX8KnPPJx8i5+AtK7TYbx9Le9F1hyzurZpkEyjkGa9dUGhQow4C1NmeGvqxN2w==", "cpu": [ - "arm64" + "ia32" ], - "dev": true, - "license": "MPL-2.0", + "license": "MIT", "optional": true, "os": [ "linux" ], "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" + "node": ">=18" } }, - "node_modules/lightningcss-linux-x64-gnu": { - "version": "1.32.0", - "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.32.0.tgz", - "integrity": "sha512-V7Qr52IhZmdKPVr+Vtw8o+WLsQJYCTd8loIfpDaMRWGUZfBOYEJeyJIkqGIDMZPwPx24pUMfwSxxI8phr/MbOA==", + "node_modules/@esbuild/linux-loong64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.28.1.tgz", + "integrity": "sha512-M5sRjUVZrkm1OAPR3dlOYzNmN+loZKGVi1VUQGrwuqLcbR6qeAz+famMhjASeH3YVKvZz+zT1jlh/keC3Rj/lg==", "cpu": [ - "x64" + "loong64" ], - "dev": true, - "license": "MPL-2.0", + "license": "MIT", "optional": true, "os": [ "linux" ], "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" + "node": ">=18" } }, - "node_modules/lightningcss-linux-x64-musl": { - "version": "1.32.0", - "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.32.0.tgz", - "integrity": "sha512-bYcLp+Vb0awsiXg/80uCRezCYHNg1/l3mt0gzHnWV9XP1W5sKa5/TCdGWaR/zBM2PeF/HbsQv/j2URNOiVuxWg==", + "node_modules/@esbuild/linux-mips64el": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.28.1.tgz", + "integrity": "sha512-mRObBZeHh2OxcBFPWE/FjylkRgZdYuiTR3vaTozquCGOH14iP9oN4x4Ge81CoIDYQrXmIxpFumJBu5MtZpnQJQ==", "cpu": [ - "x64" + "mips64el" ], - "dev": true, - "license": "MPL-2.0", + "license": "MIT", "optional": true, "os": [ "linux" ], "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" + "node": ">=18" } }, - "node_modules/lightningcss-win32-arm64-msvc": { - "version": "1.32.0", - "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.32.0.tgz", - "integrity": "sha512-8SbC8BR40pS6baCM8sbtYDSwEVQd4JlFTOlaD3gWGHfThTcABnNDBda6eTZeqbofalIJhFx0qKzgHJmcPTnGdw==", + "node_modules/@esbuild/linux-ppc64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.28.1.tgz", + "integrity": "sha512-slScBsMAb3GFDcdrCgLwZtPYRoH2H/youv10QiZyRjmsP48fznoveWytSgCI/R0ZcUgpc0ZhIUEx6LHts8yrfQ==", "cpu": [ - "arm64" + "ppc64" ], - "dev": true, - "license": "MPL-2.0", + "license": "MIT", "optional": true, "os": [ - "win32" + "linux" ], "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" + "node": ">=18" } }, - "node_modules/lightningcss-win32-x64-msvc": { - "version": "1.32.0", - "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.32.0.tgz", - "integrity": "sha512-Amq9B/SoZYdDi1kFrojnoqPLxYhQ4Wo5XiL8EVJrVsB8ARoC1PWW6VGtT0WKCemjy8aC+louJnjS7U18x3b06Q==", + "node_modules/@esbuild/linux-riscv64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.28.1.tgz", + "integrity": "sha512-kw0owk1o0GFETUJyW0jc0G4Yzs0BHZn0JDZ8JRT088vjJYX777BAs1fDGxAC+q831qOs2DTC96mNsG2opdfyyQ==", "cpu": [ - "x64" + "riscv64" ], - "dev": true, - "license": "MPL-2.0", + "license": "MIT", "optional": true, "os": [ - "win32" + "linux" ], "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" + "node": ">=18" } }, - "node_modules/lodash.get": { - "version": "4.4.2", - "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz", - "integrity": "sha1-LRd/ZS+jHpObRDjVNBSZ36OCXpk=" - }, - "node_modules/lodash.isequal": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz", - "integrity": "sha1-QVxEePK8wwEgwizhDtMib30+GOA=" + "node_modules/@esbuild/linux-s390x": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.28.1.tgz", + "integrity": "sha512-/lAIjX8aYFRByhh6L5rYtPEDRqa9de/4V/juOXcta5frjvzXO4/sqEtyytse0g3zZFuWu5cDN0MkLz2qRDD2Ag==", + "cpu": [ + "s390x" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } }, - "node_modules/loose-envify": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", - "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "node_modules/@esbuild/linux-x64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.28.1.tgz", + "integrity": "sha512-u/anNYF2mmVOEDwLtnQ1wOr3EZ9sTNGLWrsYGYwHWzGA3Si84IOkHXlbWTD1NB+9/1lcnweYKO54uhxZydNzfA==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-arm64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.28.1.tgz", + "integrity": "sha512-oks0DYbLwWMmaakTsCb+zL4E+aHRVLom9IJZOAthMQEPiQmydXHkziYEsGYRx0uNV/IjEKGAV941JzH02pflqw==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.28.1.tgz", + "integrity": "sha512-aeL6lAnN89Hz43Mlh1G8ARasbuoYvSITDEx0tHh5b7jJnHcssqgjy9Yx430GDpmCa6OyrKoS0aNRjKundRizGg==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-arm64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.28.1.tgz", + "integrity": "sha512-MEFJe5C3R8pwXdZ5Y21oo6m7ePiS0d9pWucn99O/wvyJZChoIQKrQDxKrGeW8F5+T0okTHesAmDeiHDTIq0V/Q==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.28.1.tgz", + "integrity": "sha512-i/ZLIOafE0Z8cI/XANJAixoJL/uRAoS2xOA3rb0xN+KK0K177cMAsQYkzHtBrtMXAKuAc7HGgcWiZ/sRC1Nxgw==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openharmony-arm64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.28.1.tgz", + "integrity": "sha512-ge+Z7EXFNt2BO1oAMsVpiQ8EwndV9i1xXerAeTIK7AtPs3bKFXQM7nlRxDSIUIMeueR1CNXxqztLzdNeReKBJg==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.28.1.tgz", + "integrity": "sha512-BEjgtECkL3vY+SaSQ6nzVfiALUeFxpawyp8Jmf5PtYhf1Ug40N1h/hxlhts+f1FvSvarEigdxS3BlSMI2PJLcQ==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.28.1.tgz", + "integrity": "sha512-lCv9eK/H6ZJWbE7bh2nw54CZ9M2nupBxJcTsdk/QQnWkdSjKGuxmmH8/GWrlT1eMmZfn4dGcCjRte397WqfQXA==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.28.1.tgz", + "integrity": "sha512-zvb/mB2bSCoJOpoCBgYKKpX6YM6mJBlBUVUtVj41DlZJVEB6/0CKlRYxP5wWl1C1ILiCoAU5wZZ4q1P3qeS6Eg==", + "cpu": [ + "ia32" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.28.1.tgz", + "integrity": "sha512-bm4Mowrv+GXMlpWX++EcXw/iLyd1o3+bJkC2DkWXYVvgZCqD/bSj9ctZeAMC3cIxgjRVR2Dufaiu4YPxr5gW1A==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@img/colour": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@img/colour/-/colour-1.1.0.tgz", + "integrity": "sha512-Td76q7j57o/tLVdgS746cYARfSyxk8iEfRxewL9h4OMzYhbW4TAcppl0mT4eyqXddh6L/jwoM75mo7ixa/pCeQ==", + "license": "MIT", + "optional": true, + "engines": { + "node": ">=18" + } + }, + "node_modules/@img/sharp-darwin-arm64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-darwin-arm64/-/sharp-darwin-arm64-0.34.5.tgz", + "integrity": "sha512-imtQ3WMJXbMY4fxb/Ndp6HBTNVtWCUI0WdobyheGf5+ad6xX8VIDO8u2xE4qc/fr08CKG/7dDseFtn6M6g/r3w==", + "cpu": [ + "arm64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-darwin-arm64": "1.2.4" + } + }, + "node_modules/@img/sharp-darwin-x64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-darwin-x64/-/sharp-darwin-x64-0.34.5.tgz", + "integrity": "sha512-YNEFAF/4KQ/PeW0N+r+aVVsoIY0/qxxikF2SWdp+NRkmMB7y9LBZAVqQ4yhGCm/H3H270OSykqmQMKLBhBJDEw==", + "cpu": [ + "x64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-darwin-x64": "1.2.4" + } + }, + "node_modules/@img/sharp-libvips-darwin-arm64": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-arm64/-/sharp-libvips-darwin-arm64-1.2.4.tgz", + "integrity": "sha512-zqjjo7RatFfFoP0MkQ51jfuFZBnVE2pRiaydKJ1G/rHZvnsrHAOcQALIi9sA5co5xenQdTugCvtb1cuf78Vf4g==", + "cpu": [ + "arm64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "darwin" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-darwin-x64": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-x64/-/sharp-libvips-darwin-x64-1.2.4.tgz", + "integrity": "sha512-1IOd5xfVhlGwX+zXv2N93k0yMONvUlANylbJw1eTah8K/Jtpi15KC+WSiaX/nBmbm2HxRM1gZ0nSdjSsrZbGKg==", + "cpu": [ + "x64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "darwin" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-arm": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm/-/sharp-libvips-linux-arm-1.2.4.tgz", + "integrity": "sha512-bFI7xcKFELdiNCVov8e44Ia4u2byA+l3XtsAj+Q8tfCwO6BQ8iDojYdvoPMqsKDkuoOo+X6HZA0s0q11ANMQ8A==", + "cpu": [ + "arm" + ], + "libc": [ + "glibc" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-arm64": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm64/-/sharp-libvips-linux-arm64-1.2.4.tgz", + "integrity": "sha512-excjX8DfsIcJ10x1Kzr4RcWe1edC9PquDRRPx3YVCvQv+U5p7Yin2s32ftzikXojb1PIFc/9Mt28/y+iRklkrw==", + "cpu": [ + "arm64" + ], + "libc": [ + "glibc" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-ppc64": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-ppc64/-/sharp-libvips-linux-ppc64-1.2.4.tgz", + "integrity": "sha512-FMuvGijLDYG6lW+b/UvyilUWu5Ayu+3r2d1S8notiGCIyYU/76eig1UfMmkZ7vwgOrzKzlQbFSuQfgm7GYUPpA==", + "cpu": [ + "ppc64" + ], + "libc": [ + "glibc" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-riscv64": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-riscv64/-/sharp-libvips-linux-riscv64-1.2.4.tgz", + "integrity": "sha512-oVDbcR4zUC0ce82teubSm+x6ETixtKZBh/qbREIOcI3cULzDyb18Sr/Wcyx7NRQeQzOiHTNbZFF1UwPS2scyGA==", + "cpu": [ + "riscv64" + ], + "libc": [ + "glibc" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-s390x": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-s390x/-/sharp-libvips-linux-s390x-1.2.4.tgz", + "integrity": "sha512-qmp9VrzgPgMoGZyPvrQHqk02uyjA0/QrTO26Tqk6l4ZV0MPWIW6LTkqOIov+J1yEu7MbFQaDpwdwJKhbJvuRxQ==", + "cpu": [ + "s390x" + ], + "libc": [ + "glibc" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-x64": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-x64/-/sharp-libvips-linux-x64-1.2.4.tgz", + "integrity": "sha512-tJxiiLsmHc9Ax1bz3oaOYBURTXGIRDODBqhveVHonrHJ9/+k89qbLl0bcJns+e4t4rvaNBxaEZsFtSfAdquPrw==", + "cpu": [ + "x64" + ], + "libc": [ + "glibc" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linuxmusl-arm64": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-arm64/-/sharp-libvips-linuxmusl-arm64-1.2.4.tgz", + "integrity": "sha512-FVQHuwx1IIuNow9QAbYUzJ+En8KcVm9Lk5+uGUQJHaZmMECZmOlix9HnH7n1TRkXMS0pGxIJokIVB9SuqZGGXw==", + "cpu": [ + "arm64" + ], + "libc": [ + "musl" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linuxmusl-x64": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-x64/-/sharp-libvips-linuxmusl-x64-1.2.4.tgz", + "integrity": "sha512-+LpyBk7L44ZIXwz/VYfglaX/okxezESc6UxDSoyo2Ks6Jxc4Y7sGjpgU9s4PMgqgjj1gZCylTieNamqA1MF7Dg==", + "cpu": [ + "x64" + ], + "libc": [ + "musl" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-linux-arm": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm/-/sharp-linux-arm-0.34.5.tgz", + "integrity": "sha512-9dLqsvwtg1uuXBGZKsxem9595+ujv0sJ6Vi8wcTANSFpwV/GONat5eCkzQo/1O6zRIkh0m/8+5BjrRr7jDUSZw==", + "cpu": [ + "arm" + ], + "libc": [ + "glibc" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-arm": "1.2.4" + } + }, + "node_modules/@img/sharp-linux-arm64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm64/-/sharp-linux-arm64-0.34.5.tgz", + "integrity": "sha512-bKQzaJRY/bkPOXyKx5EVup7qkaojECG6NLYswgktOZjaXecSAeCWiZwwiFf3/Y+O1HrauiE3FVsGxFg8c24rZg==", + "cpu": [ + "arm64" + ], + "libc": [ + "glibc" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-arm64": "1.2.4" + } + }, + "node_modules/@img/sharp-linux-ppc64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-ppc64/-/sharp-linux-ppc64-0.34.5.tgz", + "integrity": "sha512-7zznwNaqW6YtsfrGGDA6BRkISKAAE1Jo0QdpNYXNMHu2+0dTrPflTLNkpc8l7MUP5M16ZJcUvysVWWrMefZquA==", + "cpu": [ + "ppc64" + ], + "libc": [ + "glibc" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-ppc64": "1.2.4" + } + }, + "node_modules/@img/sharp-linux-riscv64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-riscv64/-/sharp-linux-riscv64-0.34.5.tgz", + "integrity": "sha512-51gJuLPTKa7piYPaVs8GmByo7/U7/7TZOq+cnXJIHZKavIRHAP77e3N2HEl3dgiqdD/w0yUfiJnII77PuDDFdw==", + "cpu": [ + "riscv64" + ], + "libc": [ + "glibc" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-riscv64": "1.2.4" + } + }, + "node_modules/@img/sharp-linux-s390x": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-s390x/-/sharp-linux-s390x-0.34.5.tgz", + "integrity": "sha512-nQtCk0PdKfho3eC5MrbQoigJ2gd1CgddUMkabUj+rBevs8tZ2cULOx46E7oyX+04WGfABgIwmMC0VqieTiR4jg==", + "cpu": [ + "s390x" + ], + "libc": [ + "glibc" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-s390x": "1.2.4" + } + }, + "node_modules/@img/sharp-linux-x64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-x64/-/sharp-linux-x64-0.34.5.tgz", + "integrity": "sha512-MEzd8HPKxVxVenwAa+JRPwEC7QFjoPWuS5NZnBt6B3pu7EG2Ge0id1oLHZpPJdn3OQK+BQDiw9zStiHBTJQQQQ==", + "cpu": [ + "x64" + ], + "libc": [ + "glibc" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-x64": "1.2.4" + } + }, + "node_modules/@img/sharp-linuxmusl-arm64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-arm64/-/sharp-linuxmusl-arm64-0.34.5.tgz", + "integrity": "sha512-fprJR6GtRsMt6Kyfq44IsChVZeGN97gTD331weR1ex1c1rypDEABN6Tm2xa1wE6lYb5DdEnk03NZPqA7Id21yg==", + "cpu": [ + "arm64" + ], + "libc": [ + "musl" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linuxmusl-arm64": "1.2.4" + } + }, + "node_modules/@img/sharp-linuxmusl-x64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-x64/-/sharp-linuxmusl-x64-0.34.5.tgz", + "integrity": "sha512-Jg8wNT1MUzIvhBFxViqrEhWDGzqymo3sV7z7ZsaWbZNDLXRJZoRGrjulp60YYtV4wfY8VIKcWidjojlLcWrd8Q==", + "cpu": [ + "x64" + ], + "libc": [ + "musl" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linuxmusl-x64": "1.2.4" + } + }, + "node_modules/@img/sharp-wasm32": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-wasm32/-/sharp-wasm32-0.34.5.tgz", + "integrity": "sha512-OdWTEiVkY2PHwqkbBI8frFxQQFekHaSSkUIJkwzclWZe64O1X4UlUjqqqLaPbUpMOQk6FBu/HtlGXNblIs0huw==", + "cpu": [ + "wasm32" + ], + "license": "Apache-2.0 AND LGPL-3.0-or-later AND MIT", + "optional": true, + "dependencies": { + "@emnapi/runtime": "^1.7.0" + }, + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-win32-arm64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-win32-arm64/-/sharp-win32-arm64-0.34.5.tgz", + "integrity": "sha512-WQ3AgWCWYSb2yt+IG8mnC6Jdk9Whs7O0gxphblsLvdhSpSTtmu69ZG1Gkb6NuvxsNACwiPV6cNSZNzt0KPsw7g==", + "cpu": [ + "arm64" + ], + "license": "Apache-2.0 AND LGPL-3.0-or-later", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-win32-ia32": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-win32-ia32/-/sharp-win32-ia32-0.34.5.tgz", + "integrity": "sha512-FV9m/7NmeCmSHDD5j4+4pNI8Cp3aW+JvLoXcTUo0IqyjSfAZJ8dIUmijx1qaJsIiU+Hosw6xM5KijAWRJCSgNg==", + "cpu": [ + "ia32" + ], + "license": "Apache-2.0 AND LGPL-3.0-or-later", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-win32-x64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-win32-x64/-/sharp-win32-x64-0.34.5.tgz", + "integrity": "sha512-+29YMsqY2/9eFEiW93eqWnuLcWcufowXewwSNIT6UwZdUUCrM3oFjMWH/Z6/TMmb4hlFenmfAVbpWeup2jryCw==", + "cpu": [ + "x64" + ], + "license": "Apache-2.0 AND LGPL-3.0-or-later", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", + "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", + "license": "MIT" + }, + "node_modules/@napi-rs/wasm-runtime": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-1.1.6.tgz", + "integrity": "sha512-ZLv/JdUfkvOy9eCnnBaGfiO+XimbjebAeO+MRQqD/B+FR1tnRN0tpKSJHRbE8sFfS6aqsXZ67TQjfwfsxULVbg==", + "license": "MIT", + "optional": true, + "dependencies": { + "@tybys/wasm-util": "^0.10.3" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/Brooooooklyn" + }, + "peerDependencies": { + "@emnapi/core": "^1.7.1", + "@emnapi/runtime": "^1.7.1" + } + }, + "node_modules/@oslojs/encoding": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@oslojs/encoding/-/encoding-1.1.0.tgz", + "integrity": "sha512-70wQhgYmndg4GCPxPPxPGevRKqTIJ2Nh4OkiMWmDAVYsTQ+Ta7Sq+rPevXyXGdzr30/qZBnyOalCszoMxlyldQ==", + "license": "MIT" + }, + "node_modules/@oxc-project/types": { + "version": "0.137.0", + "resolved": "https://registry.npmjs.org/@oxc-project/types/-/types-0.137.0.tgz", + "integrity": "sha512-WT+Gb24i8hmvo85AIv2oEYouEXkRlKAlT9WaCa3TfLgNCN+GhrJOGZuIlMouAh38Qe4QOx26eUOVsq70qXrywA==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/Boshen" + } + }, + "node_modules/@rolldown/binding-android-arm64": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@rolldown/binding-android-arm64/-/binding-android-arm64-1.1.3.tgz", + "integrity": "sha512-DT6Z3PhvioeHMvxo+xHc3KtqggrI7CCTXCmC2h/5zUlp5jVitv7XEy+9q5/7v8IolhlioawpMo8Kg0EEBy7J0g==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-darwin-arm64": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-arm64/-/binding-darwin-arm64-1.1.3.tgz", + "integrity": "sha512-0NwgwsjM7LrsuVnXMK3koTpagBNOhloc/BNjKqZjv4V5zI5r13qx69uVhRx+o5Z0yy4Hzq+lpy7TAgUG/ocvrw==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-darwin-x64": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-x64/-/binding-darwin-x64-1.1.3.tgz", + "integrity": "sha512-YtiBp4disu6V560loT6PjMdiRaWmVvDNrUunAalbiFx2ggeJwxdAsgZMcoGP17uyAsTwAj5V1niksxlHnVQ1Sw==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-freebsd-x64": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@rolldown/binding-freebsd-x64/-/binding-freebsd-x64-1.1.3.tgz", + "integrity": "sha512-yD3EkEdXk2LypPxnf/kSZHirarsI8gcPzc62SukhR9VJTyvV+F9Q/GxWNuCojc7sXyuVC4DxRGhdDK4X8VSsbw==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-arm-gnueabihf": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-1.1.3.tgz", + "integrity": "sha512-c+8vieQbsD7HNAHKIA34w0GJ9FedFFuJGD+7E6vz7Q3uqAIugL5p45fhlsj4UaAsHpcmlqugBWMhA0/j7o0sIg==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-arm64-gnu": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.1.3.tgz", + "integrity": "sha512-50jD0uUwLvur7Zz9LHz17kaAdTPjn5wN93hEgjvmYFRZwiR7ZJYovTd5ipyWJDAnXKvZ+wgc+/Ika6dwSF5OcA==", + "cpu": [ + "arm64" + ], + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-arm64-musl": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.1.3.tgz", + "integrity": "sha512-BO9+oPL8K9poZJBfYPsXNtYjPE5uM3qeehT3aFcW4LITOl+iSqhp0abzjR2nWBUNjIZeKXjAEWBZ64WjNoHd6w==", + "cpu": [ + "arm64" + ], + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-ppc64-gnu": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-1.1.3.tgz", + "integrity": "sha512-f3VpLB1vQ0Eo6ecr/6cekLnvYMFF4YBFoVGkfkvPLq1bAkbAwHYQPZKoAmG6OJyTcxxoC+AvezGx/S1obNC0Mw==", + "cpu": [ + "ppc64" + ], + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-s390x-gnu": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-1.1.3.tgz", + "integrity": "sha512-AmurZ26Pqx/RI9N1gzEOCklkKXl927yjfXWUUS0O7Puh8ARM/Ob8qfrD3qnWksScdw6cSrW5PSHE9DyLu7+PtA==", + "cpu": [ + "s390x" + ], + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-x64-gnu": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.1.3.tgz", + "integrity": "sha512-JJpqs8bRGITDOdbkNKnlojzBabbOHrqjSvDr0IVsZObE1lBcPjxItUEY9eWIDbxaJ3cGrXPWGfGkIxFijg/URg==", + "cpu": [ + "x64" + ], + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-x64-musl": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-musl/-/binding-linux-x64-musl-1.1.3.tgz", + "integrity": "sha512-rSJcdjPxzA/by/6/rYs+v+bXU7UjvnbUWz8MJb6kh6+knqB1dCrtHg0uu7C/4haqJvqdkYHQ5IGn+tCH9GLW/g==", + "cpu": [ + "x64" + ], + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-openharmony-arm64": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@rolldown/binding-openharmony-arm64/-/binding-openharmony-arm64-1.1.3.tgz", + "integrity": "sha512-hQ3/PYkDJICgevvyNcVrihVeqq7k1Pp3VZ9lY+dauAYUJKO+auqApvANhvR1An9BhmqYKvW2Mu1F9u4DXSMLxQ==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-wasm32-wasi": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@rolldown/binding-wasm32-wasi/-/binding-wasm32-wasi-1.1.3.tgz", + "integrity": "sha512-Elcv/BtML9lXrV6JuKITc/grN2kYV9gjsQpW8Jfw4ioK0TOkjBjye0nnyqQNy9STNaI20lXNaQBRrD5gSgR0Yg==", + "cpu": [ + "wasm32" + ], + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/core": "1.11.1", + "@emnapi/runtime": "1.11.1", + "@napi-rs/wasm-runtime": "^1.1.6" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-win32-arm64-msvc": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.1.3.tgz", + "integrity": "sha512-2DrEfhluH9yhiaFApmsjsjwrSYbNcY1oFTzYSP1a535jDbV98zCFanA/96TBUd0iDFcxGmw9QRExwGCXz3U+/g==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-win32-x64-msvc": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.1.3.tgz", + "integrity": "sha512-OL4OMk7UPXOeVGGd3qo5zJyPIljf4AFgk5QAkPPS+OoLuOOozhuaQGC18MxVTnw/06q93gShAJzlwnSCY9YtqA==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/pluginutils": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.1.tgz", + "integrity": "sha512-2j9bGt5Jh8hj+vPtgzPtl72j0yRxHAyumoo6TNfAjsLB04UtpSvPbPcDcBMxz7n+9CYB0c1GxQFxYRg2jimqGw==", + "license": "MIT" + }, + "node_modules/@rollup/pluginutils": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.4.0.tgz", + "integrity": "sha512-MfPp06CjRLfXQ3wY0R8vJDYBy/MvVcc9OulEfR0B8Iv9ko+GCNaRZ+EpJYFl27LhKsZK0o420sYCRHCjfCgeUg==", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "estree-walker": "^2.0.2", + "picomatch": "^4.0.2" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0" + }, + "peerDependenciesMeta": { + "rollup": { + "optional": true + } + } + }, + "node_modules/@shikijs/core": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/@shikijs/core/-/core-4.3.0.tgz", + "integrity": "sha512-EooU3i9F6IAE8kEu+AnGf9DFZWkQBZ+hJn3tLVbsH+61mtQiva5biai66fAA6nvFPXkLgvrh7BrR7YcJU83xQQ==", + "license": "MIT", + "dependencies": { + "@shikijs/primitive": "4.3.0", + "@shikijs/types": "4.3.0", + "@shikijs/vscode-textmate": "^10.0.2", + "@types/hast": "^3.0.4", + "hast-util-to-html": "^9.0.5" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/@shikijs/engine-javascript": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/@shikijs/engine-javascript/-/engine-javascript-4.3.0.tgz", + "integrity": "sha512-hTv/KiFf2tpiqlACPiztGGurEARWIutB8YUhcrA1pUC7VzzwKO+g5crUocrLztrZ5ro5Z4hbXg7bYclETn3gSQ==", + "license": "MIT", + "dependencies": { + "@shikijs/types": "4.3.0", + "@shikijs/vscode-textmate": "^10.0.2", + "oniguruma-to-es": "^4.3.6" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/@shikijs/engine-oniguruma": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/@shikijs/engine-oniguruma/-/engine-oniguruma-4.3.0.tgz", + "integrity": "sha512-1vMdN3gHfnKfLYwecUI2ITJI4RhHt96xEaJumVn7Heb0IlJ8WQMIH0Voak+2j22BpSNKdnOfB/pCTPnPm2gq7A==", + "license": "MIT", + "dependencies": { + "@shikijs/types": "4.3.0", + "@shikijs/vscode-textmate": "^10.0.2" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/@shikijs/langs": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/@shikijs/langs/-/langs-4.3.0.tgz", + "integrity": "sha512-rnlqFbBRSys9bT4gl/5rw9RnS0W/I84ZldXPkO7cvlEMoV85TyF/aU01N7/NbSR776RNLjrJKjfFUXJR6wN1Cg==", + "license": "MIT", + "dependencies": { + "@shikijs/types": "4.3.0" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/@shikijs/primitive": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/@shikijs/primitive/-/primitive-4.3.0.tgz", + "integrity": "sha512-CPkz64PTa5diRW1ggzMZH9VM/du4RNChYgVtgqrFcgruvIybmCvySv8GkiHSczUHXYuuR8TdKEwFx+UnZMpgdg==", + "license": "MIT", + "dependencies": { + "@shikijs/types": "4.3.0", + "@shikijs/vscode-textmate": "^10.0.2", + "@types/hast": "^3.0.4" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/@shikijs/themes": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/@shikijs/themes/-/themes-4.3.0.tgz", + "integrity": "sha512-Avgt05YiT+Y3prjIc9lmQxhJzHBcCfR6cjiFW4OyaMBbt2A6trX5rfjUzx+Vj/mE9qpArYjatnqo9XPjQNW/AQ==", + "license": "MIT", + "dependencies": { + "@shikijs/types": "4.3.0" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/@shikijs/types": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/@shikijs/types/-/types-4.3.0.tgz", + "integrity": "sha512-oc8b9U2SYvofKZk8e/737nIX0qwf6eV2vHFATeObAu7r+mUVpLs8Re0BmVkIjAWAYgkmG/CzLNo7rzuBzRu/wQ==", + "license": "MIT", + "dependencies": { + "@shikijs/vscode-textmate": "^10.0.2", + "@types/hast": "^3.0.4" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/@shikijs/vscode-textmate": { + "version": "10.0.2", + "resolved": "https://registry.npmjs.org/@shikijs/vscode-textmate/-/vscode-textmate-10.0.2.tgz", + "integrity": "sha512-83yeghZ2xxin3Nj8z1NMd/NCuca+gsYXswywDy5bHvwlWL8tpTQmzGeUuHd9FC3E/SBEMvzJRwWEOz5gGes9Qg==", + "license": "MIT" + }, + "node_modules/@tybys/wasm-util": { + "version": "0.10.3", + "resolved": "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.10.3.tgz", + "integrity": "sha512-F3fo1MYrRJYL3zER0OUOmkutjr1Vp23m7OsSgp7nq4SP6OqX6C/56XFIPAl5bt3zaBRjmW7SGz3u/6LwFpYcOg==", + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@types/estree": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.9.tgz", + "integrity": "sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg==", + "license": "MIT" + }, + "node_modules/@types/estree-jsx": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@types/estree-jsx/-/estree-jsx-1.0.5.tgz", + "integrity": "sha512-52CcUVNFyfb1A2ALocQw/Dd1BQFNmSdkuC3BkZ6iqhdMfQz7JWOFRuJFloOzjk+6WijU56m9oKXFAXc7o3Towg==", + "license": "MIT", + "dependencies": { + "@types/estree": "*" + } + }, + "node_modules/@types/hast": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/hast/-/hast-3.0.4.tgz", + "integrity": "sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==", + "license": "MIT", + "dependencies": { + "@types/unist": "*" + } + }, + "node_modules/@types/mdast": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.4.tgz", + "integrity": "sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==", + "license": "MIT", + "dependencies": { + "@types/unist": "*" + } + }, + "node_modules/@types/nlcst": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@types/nlcst/-/nlcst-2.0.3.tgz", + "integrity": "sha512-vSYNSDe6Ix3q+6Z7ri9lyWqgGhJTmzRjZRqyq15N0Z/1/UnVsno9G/N40NBijoYx2seFDIl0+B2mgAb9mezUCA==", + "license": "MIT", + "dependencies": { + "@types/unist": "*" + } + }, + "node_modules/@types/unist": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.3.tgz", + "integrity": "sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==", + "license": "MIT" + }, + "node_modules/@ungap/structured-clone": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.3.2.tgz", + "integrity": "sha512-5jsZFwgR5rTdKwidH9Qmat75RKwqfpKlWWB1frDkljN127mwqBu8K0PYo7/hFpF03IEJpfVPpCQDY/eDx3iHvA==", + "license": "ISC" + }, + "node_modules/am-i-vibing": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/am-i-vibing/-/am-i-vibing-0.4.0.tgz", + "integrity": "sha512-MxT4XZL7pzLHpuvhDKdMaQHMGGkJDLluKBLsbstn+8wv9sWcFT6h+0ve9qkml95amVTZtZV83gQe2hY+ojgHLg==", + "license": "MIT", + "dependencies": { + "process-ancestry": "^0.1.0" + }, + "bin": { + "am-i-vibing": "dist/cli.mjs" + } + }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "license": "ISC", + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/anymatch/node_modules/picomatch": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz", + "integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==", + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "license": "Python-2.0" + }, + "node_modules/aria-query": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.2.tgz", + "integrity": "sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==", + "license": "Apache-2.0", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/astro": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/astro/-/astro-7.0.3.tgz", + "integrity": "sha512-CK+G+Tl2DMV1EXCwVG45vyurxf2IfRTklMxDhRKn+tst9Yl8rWXpudL62Fa6zin5Bt968FBvuyASj1aJShROZg==", + "license": "MIT", + "dependencies": { + "@astrojs/compiler-rs": "^0.2.2", + "@astrojs/internal-helpers": "0.10.0", + "@astrojs/markdown-satteri": "0.3.2", + "@astrojs/telemetry": "3.3.2", + "@capsizecss/unpack": "^4.0.0", + "@clack/prompts": "^1.1.0", + "@oslojs/encoding": "^1.1.0", + "@rollup/pluginutils": "^5.3.0", + "am-i-vibing": "^0.4.0", + "aria-query": "^5.3.2", + "axobject-query": "^4.1.0", + "ci-info": "^4.4.0", + "clsx": "^2.1.1", + "common-ancestor-path": "^2.0.0", + "cookie": "^1.1.1", + "devalue": "^5.8.1", + "diff": "^8.0.3", + "dset": "^3.1.4", + "es-module-lexer": "^2.0.0", + "esbuild": "^0.28.0", + "flattie": "^1.1.1", + "fontace": "~0.4.1", + "get-tsconfig": "5.0.0-beta.4", + "github-slugger": "^2.0.0", + "html-escaper": "3.0.3", + "http-cache-semantics": "^4.2.0", + "js-yaml": "^4.1.1", + "jsonc-parser": "^3.3.1", + "magic-string": "^0.30.21", + "magicast": "^0.5.2", + "mrmime": "^2.0.1", + "neotraverse": "^0.6.18", + "obug": "^2.1.1", + "p-limit": "^7.3.0", + "p-queue": "^9.1.0", + "package-manager-detector": "^1.6.0", + "piccolore": "^0.1.3", + "picomatch": "^4.0.4", + "rehype": "^13.0.2", + "semver": "^7.7.4", + "shiki": "^4.0.2", + "smol-toml": "^1.6.0", + "svgo": "^4.0.1", + "tinyclip": "^0.1.12", + "tinyexec": "^1.0.4", + "tinyglobby": "^0.2.15", + "ultrahtml": "^1.6.0", + "unifont": "~0.7.4", + "unist-util-visit": "^5.1.0", + "unstorage": "^1.17.5", + "vfile": "^6.0.3", + "vite": "^8.0.13", + "vitefu": "^1.1.2", + "xxhash-wasm": "^1.1.0", + "yargs-parser": "^22.0.0", + "zod": "^4.3.6" + }, + "bin": { + "astro": "bin/astro.mjs" + }, + "engines": { + "node": ">=22.12.0", + "npm": ">=9.6.5", + "pnpm": ">=7.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/astrodotbuild" + }, + "optionalDependencies": { + "sharp": "^0.34.0" + }, + "peerDependencies": { + "@astrojs/markdown-remark": "7.2.0" + }, + "peerDependenciesMeta": { + "@astrojs/markdown-remark": { + "optional": true + } + } + }, + "node_modules/axobject-query": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-4.1.0.tgz", + "integrity": "sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==", + "license": "Apache-2.0", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/bail": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/bail/-/bail-2.0.2.tgz", + "integrity": "sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/boolbase": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", + "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==", + "license": "ISC" + }, + "node_modules/bootstrap": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/bootstrap/-/bootstrap-4.6.2.tgz", + "integrity": "sha512-51Bbp/Uxr9aTuy6ca/8FbFloBUJZLHwnhTcnjIeRn2suQWsWzcuJhGjKDB5eppVte/8oCdOL3VuwxvZDUggwGQ==", + "deprecated": "This version of Bootstrap is no longer supported. Please upgrade to the latest version.", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/twbs" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/bootstrap" + } + ], + "license": "MIT", + "peerDependencies": { + "jquery": "1.9.1 - 3", + "popper.js": "^1.16.1" + } + }, + "node_modules/ccount": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/ccount/-/ccount-2.0.1.tgz", + "integrity": "sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/character-entities-html4": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/character-entities-html4/-/character-entities-html4-2.1.0.tgz", + "integrity": "sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/character-entities-legacy": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-3.0.0.tgz", + "integrity": "sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/chokidar": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-5.0.0.tgz", + "integrity": "sha512-TQMmc3w+5AxjpL8iIiwebF73dRDF4fBIieAqGn9RGCWaEVwQ6Fb2cGe31Yns0RRIzii5goJ1Y7xbMwo1TxMplw==", + "license": "MIT", + "dependencies": { + "readdirp": "^5.0.0" + }, + "engines": { + "node": ">= 20.19.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/ci-info": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-4.4.0.tgz", + "integrity": "sha512-77PSwercCZU2Fc4sX94eF8k8Pxte6JAwL4/ICZLFjJLqegs7kCuAsqqj/70NQF6TvDpgFjkubQB2FW2ZZddvQg==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/sibiraj-s" + } + ], + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/clsx": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz", + "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/comma-separated-tokens": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-2.0.3.tgz", + "integrity": "sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/commander": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-11.1.0.tgz", + "integrity": "sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ==", + "license": "MIT", + "engines": { + "node": ">=16" + } + }, + "node_modules/common-ancestor-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/common-ancestor-path/-/common-ancestor-path-2.0.0.tgz", + "integrity": "sha512-dnN3ibLeoRf2HNC+OlCiNc5d2zxbLJXOtiZUudNFSXZrNSydxcCsSpRzXwfu7BBWCIfHPw+xTayeBvJCP/D8Ng==", + "license": "BlueOak-1.0.0", + "engines": { + "node": ">= 18" + } + }, + "node_modules/cookie": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-1.1.1.tgz", + "integrity": "sha512-ei8Aos7ja0weRpFzJnEA9UHJ/7XQmqglbRwnf2ATjcB9Wq874VKH9kfjjirM6UhU2/E5fFYadylyhFldcqSidQ==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/cookie-es": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/cookie-es/-/cookie-es-1.2.3.tgz", + "integrity": "sha512-lXVyvUvrNXblMqzIRrxHb57UUVmqsSWlxqt3XIjCkUP0wDAf6uicO6KMbEgYrMNtEvWgWHwe42CKxPu9MYAnWw==", + "license": "MIT" + }, + "node_modules/crossws": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/crossws/-/crossws-0.3.5.tgz", + "integrity": "sha512-ojKiDvcmByhwa8YYqbQI/hg7MEU0NC03+pSdEq4ZUnZR9xXpwk7E43SMNGkn+JxJGPFtNvQ48+vV2p+P1ml5PA==", + "license": "MIT", + "dependencies": { + "uncrypto": "^0.1.3" + } + }, + "node_modules/css-select": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-5.2.2.tgz", + "integrity": "sha512-TizTzUddG/xYLA3NXodFM0fSbNizXjOKhqiQQwvhlspadZokn1KDy0NZFS0wuEubIYAV5/c1/lAr0TaaFXEXzw==", + "license": "BSD-2-Clause", + "dependencies": { + "boolbase": "^1.0.0", + "css-what": "^6.1.0", + "domhandler": "^5.0.2", + "domutils": "^3.0.1", + "nth-check": "^2.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/css-tree": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-3.2.1.tgz", + "integrity": "sha512-X7sjQzceUhu1u7Y/ylrRZFU2FS6LRiFVp6rKLPg23y3x3c3DOKAwuXGDp+PAGjh6CSnCjYeAul8pcT8bAl+lSA==", + "license": "MIT", + "dependencies": { + "mdn-data": "2.27.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0" + } + }, + "node_modules/css-what": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.2.2.tgz", + "integrity": "sha512-u/O3vwbptzhMs3L1fQE82ZSLHQQfto5gyZzwteVIEyeaY5Fc7R4dapF/BvRoSYFeqfBk4m0V1Vafq5Pjv25wvA==", + "license": "BSD-2-Clause", + "engines": { + "node": ">= 6" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/csso": { + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/csso/-/csso-5.0.5.tgz", + "integrity": "sha512-0LrrStPOdJj+SPCCrGhzryycLjwcgUSHBtxNA8aIDxf0GLsRh1cKYhB00Gd1lDOS4yGH69+SNn13+TWbVHETFQ==", + "license": "MIT", + "dependencies": { + "css-tree": "~2.2.0" + }, + "engines": { + "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0", + "npm": ">=7.0.0" + } + }, + "node_modules/csso/node_modules/css-tree": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-2.2.1.tgz", + "integrity": "sha512-OA0mILzGc1kCOCSJerOeqDxDQ4HOh+G8NbOJFOTgOCzpw7fCBubk0fEyxp8AgOL/jvLgYA/uV0cMbe43ElF1JA==", + "license": "MIT", + "dependencies": { + "mdn-data": "2.0.28", + "source-map-js": "^1.0.1" + }, + "engines": { + "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0", + "npm": ">=7.0.0" + } + }, + "node_modules/csso/node_modules/mdn-data": { + "version": "2.0.28", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.28.tgz", + "integrity": "sha512-aylIc7Z9y4yzHYAJNuESG3hfhC+0Ibp/MAMiaOZgNv4pmEdFyfZhhhny4MNiAfWdBQ1RQ2mfDWmM1x8SvGyp8g==", + "license": "CC0-1.0" + }, + "node_modules/defu": { + "version": "6.1.7", + "resolved": "https://registry.npmjs.org/defu/-/defu-6.1.7.tgz", + "integrity": "sha512-7z22QmUWiQ/2d0KkdYmANbRUVABpZ9SNYyH5vx6PZ+nE5bcC0l7uFvEfHlyld/HcGBFTL536ClDt3DEcSlEJAQ==", + "license": "MIT" + }, + "node_modules/dequal": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", + "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/destr": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/destr/-/destr-2.0.5.tgz", + "integrity": "sha512-ugFTXCtDZunbzasqBxrK93Ik/DRYsO6S/fedkWEMKqt04xZ4csmnmwGDBAb07QWNaGMAmnTIemsYZCksjATwsA==", + "license": "MIT" + }, + "node_modules/detect-libc": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz", + "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==", + "license": "Apache-2.0", + "engines": { + "node": ">=8" + } + }, + "node_modules/devalue": { + "version": "5.8.1", + "resolved": "https://registry.npmjs.org/devalue/-/devalue-5.8.1.tgz", + "integrity": "sha512-4CXDYRBGqN+57wVJkuXBYmpAVUSg3L6JAQa/DFqm238G73E1wuyc/JhGQJzN7vUf/CMphYau2zXbfWzDR5aTEw==", + "license": "MIT" + }, + "node_modules/devlop": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/devlop/-/devlop-1.1.0.tgz", + "integrity": "sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==", + "license": "MIT", + "dependencies": { + "dequal": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/diff": { + "version": "8.0.4", + "resolved": "https://registry.npmjs.org/diff/-/diff-8.0.4.tgz", + "integrity": "sha512-DPi0FmjiSU5EvQV0++GFDOJ9ASQUVFh5kD+OzOnYdi7n3Wpm9hWWGfB/O2blfHcMVTL5WkQXSnRiK9makhrcnw==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.3.1" + } + }, + "node_modules/dom-serializer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", + "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", + "license": "MIT", + "dependencies": { + "domelementtype": "^2.3.0", + "domhandler": "^5.0.2", + "entities": "^4.2.0" + }, + "funding": { + "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" + } + }, + "node_modules/dom-serializer/node_modules/entities": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/domelementtype": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", + "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ], + "license": "BSD-2-Clause" + }, + "node_modules/domhandler": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", + "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", + "license": "BSD-2-Clause", + "dependencies": { + "domelementtype": "^2.3.0" + }, + "engines": { + "node": ">= 4" + }, + "funding": { + "url": "https://github.com/fb55/domhandler?sponsor=1" + } + }, + "node_modules/domutils": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.2.2.tgz", + "integrity": "sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw==", + "license": "BSD-2-Clause", + "dependencies": { + "dom-serializer": "^2.0.0", + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3" + }, + "funding": { + "url": "https://github.com/fb55/domutils?sponsor=1" + } + }, + "node_modules/dset": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/dset/-/dset-3.1.4.tgz", + "integrity": "sha512-2QF/g9/zTaPDc3BjNcVTGoBbXBgYfMTTceLaYcFJ/W9kggFUkhxD/hMEeuLKbugyef9SqAx8cpgwlIP/jinUTA==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/entities": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/entities/-/entities-6.0.1.tgz", + "integrity": "sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/es-module-lexer": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-2.1.0.tgz", + "integrity": "sha512-n27zTYMjYu1aj4MjCWzSP7G9r75utsaoc8m61weK+W8JMBGGQybd43GstCXZ3WNmSFtGT9wi59qQTW6mhTR5LQ==", + "license": "MIT" + }, + "node_modules/esbuild": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.28.1.tgz", + "integrity": "sha512-HrJrvZv5ayxBzPfwphOoNzkzOIIlifzk0KJrGK2c8R4+LKpMtpYLQeUdjnwjWv/LZlkH2laZk+4w78pi99D4Vw==", + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.28.1", + "@esbuild/android-arm": "0.28.1", + "@esbuild/android-arm64": "0.28.1", + "@esbuild/android-x64": "0.28.1", + "@esbuild/darwin-arm64": "0.28.1", + "@esbuild/darwin-x64": "0.28.1", + "@esbuild/freebsd-arm64": "0.28.1", + "@esbuild/freebsd-x64": "0.28.1", + "@esbuild/linux-arm": "0.28.1", + "@esbuild/linux-arm64": "0.28.1", + "@esbuild/linux-ia32": "0.28.1", + "@esbuild/linux-loong64": "0.28.1", + "@esbuild/linux-mips64el": "0.28.1", + "@esbuild/linux-ppc64": "0.28.1", + "@esbuild/linux-riscv64": "0.28.1", + "@esbuild/linux-s390x": "0.28.1", + "@esbuild/linux-x64": "0.28.1", + "@esbuild/netbsd-arm64": "0.28.1", + "@esbuild/netbsd-x64": "0.28.1", + "@esbuild/openbsd-arm64": "0.28.1", + "@esbuild/openbsd-x64": "0.28.1", + "@esbuild/openharmony-arm64": "0.28.1", + "@esbuild/sunos-x64": "0.28.1", + "@esbuild/win32-arm64": "0.28.1", + "@esbuild/win32-ia32": "0.28.1", + "@esbuild/win32-x64": "0.28.1" + } + }, + "node_modules/estree-walker": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", + "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", + "license": "MIT" + }, + "node_modules/eventemitter3": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.4.tgz", + "integrity": "sha512-mlsTRyGaPBjPedk6Bvw+aqbsXDtoAyAzm5MO7JgU+yVRyMQ5O8bD4Kcci7BS85f93veegeCPkL8R4GLClnjLFw==", + "license": "MIT" + }, + "node_modules/extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", + "license": "MIT" + }, + "node_modules/fast-string-truncated-width": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/fast-string-truncated-width/-/fast-string-truncated-width-3.0.3.tgz", + "integrity": "sha512-0jjjIEL6+0jag3l2XWWizO64/aZVtpiGE3t0Zgqxv0DPuxiMjvB3M24fCyhZUO4KomJQPj3LTSUnDP3GpdwC0g==", + "license": "MIT" + }, + "node_modules/fast-string-width": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/fast-string-width/-/fast-string-width-3.0.2.tgz", + "integrity": "sha512-gX8LrtNEI5hq8DVUfRQMbr5lpaS4nMIWV+7XEbXk2b8kiQIizgnlr12B4dA3ZEx3308ze0O4Q1R+cHts8kyUJg==", + "license": "MIT", + "dependencies": { + "fast-string-truncated-width": "^3.0.2" + } + }, + "node_modules/fast-wrap-ansi": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/fast-wrap-ansi/-/fast-wrap-ansi-0.2.2.tgz", + "integrity": "sha512-7F2Fl+TjRSenLqlU3UjSH0iyqopqoZIu7eZVpEirP2g1GtWa2G/ecEmBdgz31+Mxr+ELclgg6sokpSFIQiZ02Q==", + "license": "MIT", + "dependencies": { + "fast-string-width": "^3.0.2" + } + }, + "node_modules/fdir": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", + "license": "MIT", + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/flattie": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/flattie/-/flattie-1.1.1.tgz", + "integrity": "sha512-9UbaD6XdAL97+k/n+N7JwX46K/M6Zc6KcFYskrYL8wbBV/Uyk0CTAMY0VT+qiK5PM7AIc9aTWYtq65U7T+aCNQ==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/fontace": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/fontace/-/fontace-0.4.1.tgz", + "integrity": "sha512-lDMvbAzSnHmbYMTEld5qdtvNH2/pWpICOqpean9IgC7vUbUJc3k+k5Dokp85CegamqQpFbXf0rAVkbzpyTA8aw==", + "license": "MIT", + "dependencies": { + "fontkitten": "^1.0.2" + } + }, + "node_modules/fontkitten": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/fontkitten/-/fontkitten-1.0.3.tgz", + "integrity": "sha512-Wp1zXWPVUPBmfoa3Cqc9ctaKuzKAV6uLstRqlR56kSjplf5uAce+qeyYym7F+PHbGTk+tCEdkCW6RD7DX/gBZw==", + "license": "MIT", + "dependencies": { + "tiny-inflate": "^1.0.3" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/get-tsconfig": { + "version": "5.0.0-beta.4", + "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-5.0.0-beta.4.tgz", + "integrity": "sha512-7nF7C9fIPFEMHgEMEfgIlO9wDdZ8CyHw27rWciFZfHvHDReIiPhsYuzPRXsfvBCqFy1l8RRyyWV7QLM+ZhUJsQ==", + "license": "MIT", + "dependencies": { + "resolve-pkg-maps": "^1.0.0" + }, + "engines": { + "node": ">=20.20.0" + }, + "funding": { + "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1" + } + }, + "node_modules/github-slugger": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/github-slugger/-/github-slugger-2.0.0.tgz", + "integrity": "sha512-IaOQ9puYtjrkq7Y0Ygl9KDZnrf/aiUJYUpVf89y8kyaxbRG7Y1SrX/jaumrv81vc61+kiMempujsM3Yw7w5qcw==", + "license": "ISC" + }, + "node_modules/h3": { + "version": "1.15.11", + "resolved": "https://registry.npmjs.org/h3/-/h3-1.15.11.tgz", + "integrity": "sha512-L3THSe2MPeBwgIZVSH5zLdBBU90TOxarvhK9d04IDY2AmVS8j2Jz2LIWtwsGOU3lu2I5jCN7FNvVfY2+XyF+mg==", + "license": "MIT", + "dependencies": { + "cookie-es": "^1.2.3", + "crossws": "^0.3.5", + "defu": "^6.1.6", + "destr": "^2.0.5", + "iron-webcrypto": "^1.2.1", + "node-mock-http": "^1.0.4", + "radix3": "^1.1.2", + "ufo": "^1.6.3", + "uncrypto": "^0.1.3" + } + }, + "node_modules/hast-util-from-html": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/hast-util-from-html/-/hast-util-from-html-2.0.3.tgz", + "integrity": "sha512-CUSRHXyKjzHov8yKsQjGOElXy/3EKpyX56ELnkHH34vDVw1N1XSQ1ZcAvTyAPtGqLTuKP/uxM+aLkSPqF/EtMw==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "devlop": "^1.1.0", + "hast-util-from-parse5": "^8.0.0", + "parse5": "^7.0.0", + "vfile": "^6.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-from-parse5": { + "version": "8.0.3", + "resolved": "https://registry.npmjs.org/hast-util-from-parse5/-/hast-util-from-parse5-8.0.3.tgz", + "integrity": "sha512-3kxEVkEKt0zvcZ3hCRYI8rqrgwtlIOFMWkbclACvjlDw8Li9S2hk/d51OI0nr/gIpdMHNepwgOKqZ/sy0Clpyg==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/unist": "^3.0.0", + "devlop": "^1.0.0", + "hastscript": "^9.0.0", + "property-information": "^7.0.0", + "vfile": "^6.0.0", + "vfile-location": "^5.0.0", + "web-namespaces": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-parse-selector": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/hast-util-parse-selector/-/hast-util-parse-selector-4.0.0.tgz", + "integrity": "sha512-wkQCkSYoOGCRKERFWcxMVMOcYE2K1AaNLU8DXS9arxnLOUEWbOXKXiJUNzEpqZ3JOKpnha3jkFrumEjVliDe7A==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-to-html": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/hast-util-to-html/-/hast-util-to-html-9.0.5.tgz", + "integrity": "sha512-OguPdidb+fbHQSU4Q4ZiLKnzWo8Wwsf5bZfbvu7//a9oTYoqD/fWpe96NuHkoS9h0ccGOTe0C4NGXdtS0iObOw==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/unist": "^3.0.0", + "ccount": "^2.0.0", + "comma-separated-tokens": "^2.0.0", + "hast-util-whitespace": "^3.0.0", + "html-void-elements": "^3.0.0", + "mdast-util-to-hast": "^13.0.0", + "property-information": "^7.0.0", + "space-separated-tokens": "^2.0.0", + "stringify-entities": "^4.0.0", + "zwitch": "^2.0.4" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-whitespace": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/hast-util-whitespace/-/hast-util-whitespace-3.0.0.tgz", + "integrity": "sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hastscript": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/hastscript/-/hastscript-9.0.1.tgz", + "integrity": "sha512-g7df9rMFX/SPi34tyGCyUBREQoKkapwdY/T04Qn9TDWfHhAYt4/I0gMVirzK5wEzeUqIjEB+LXC/ypb7Aqno5w==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "comma-separated-tokens": "^2.0.0", + "hast-util-parse-selector": "^4.0.0", + "property-information": "^7.0.0", + "space-separated-tokens": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/html-escaper": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-3.0.3.tgz", + "integrity": "sha512-RuMffC89BOWQoY0WKGpIhn5gX3iI54O6nRA0yC124NYVtzjmFWBIiFd8M0x+ZdX0P9R4lADg1mgP8C7PxGOWuQ==", + "license": "MIT" + }, + "node_modules/html-void-elements": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/html-void-elements/-/html-void-elements-3.0.0.tgz", + "integrity": "sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/http-cache-semantics": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.2.0.tgz", + "integrity": "sha512-dTxcvPXqPvXBQpq5dUr6mEMJX4oIEFv6bwom3FDwKRDsuIjjJGANqhBuoAn9c1RQJIdAKav33ED65E2ys+87QQ==", + "license": "BSD-2-Clause" + }, + "node_modules/iron-webcrypto": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/iron-webcrypto/-/iron-webcrypto-1.2.1.tgz", + "integrity": "sha512-feOM6FaSr6rEABp/eDfVseKyTMDt+KGpeB35SkVn9Tyn0CqvVsY3EwI0v5i8nMHyJnzCIQf7nsy3p41TPkJZhg==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/brc-dd" + } + }, + "node_modules/is-docker": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-4.0.0.tgz", + "integrity": "sha512-LHE+wROyG/Y/0ZnbktRCoTix2c1RhgWaZraMZ8o1Q7zCh0VSrICJQO5oqIIISrcSBtrXv0o233w1IYwsWCjTzA==", + "license": "MIT", + "bin": { + "is-docker": "cli.js" + }, + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-inside-container": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-inside-container/-/is-inside-container-1.0.0.tgz", + "integrity": "sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==", + "license": "MIT", + "dependencies": { + "is-docker": "^3.0.0" + }, + "bin": { + "is-inside-container": "cli.js" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-inside-container/node_modules/is-docker": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-3.0.0.tgz", + "integrity": "sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==", + "license": "MIT", + "bin": { + "is-docker": "cli.js" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-plain-obj": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-4.1.0.tgz", + "integrity": "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-wsl": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-3.1.1.tgz", + "integrity": "sha512-e6rvdUCiQCAuumZslxRJWR/Doq4VpPR82kqclvcS0efgt430SlGIk05vdCN58+VrzgtIcfNODjozVielycD4Sw==", + "license": "MIT", + "dependencies": { + "is-inside-container": "^1.0.0" + }, + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/jquery": { + "version": "3.7.1", + "resolved": "https://registry.npmjs.org/jquery/-/jquery-3.7.1.tgz", + "integrity": "sha512-m4avr8yL8kmFN8psrbFFFmB/If14iN5o9nw/NgnnM+kybDJpRsAynV2BsfpTYrTRysYUdADVD7CkUUizgkpLfg==", + "license": "MIT", + "peer": true + }, + "node_modules/js-yaml": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.2.0.tgz", + "integrity": "sha512-ePWsvanv0DWuDRsW8dnt+R4jQ31SCRCQ7hhNcPXZPsoBZiemuZNYGf7adZdqX2D86j6rvKp3RpCxVTSb8WQlOw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/puzrin" + }, + { + "type": "github", + "url": "https://github.com/sponsors/nodeca" + } + ], + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/jsonc-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.3.1.tgz", + "integrity": "sha512-HUgH65KyejrUFPvHFPbqOY0rsFip3Bo5wb4ngvdi1EpCYWUQDC5V+Y7mZws+DLkr4M//zQJoanu1SP+87Dv1oQ==", + "license": "MIT" + }, + "node_modules/lightningcss": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.32.0.tgz", + "integrity": "sha512-NXYBzinNrblfraPGyrbPoD19C1h9lfI/1mzgWYvXUTe414Gz/X1FD2XBZSZM7rRTrMA8JL3OtAaGifrIKhQ5yQ==", + "license": "MPL-2.0", + "dependencies": { + "detect-libc": "^2.0.3" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "optionalDependencies": { + "lightningcss-android-arm64": "1.32.0", + "lightningcss-darwin-arm64": "1.32.0", + "lightningcss-darwin-x64": "1.32.0", + "lightningcss-freebsd-x64": "1.32.0", + "lightningcss-linux-arm-gnueabihf": "1.32.0", + "lightningcss-linux-arm64-gnu": "1.32.0", + "lightningcss-linux-arm64-musl": "1.32.0", + "lightningcss-linux-x64-gnu": "1.32.0", + "lightningcss-linux-x64-musl": "1.32.0", + "lightningcss-win32-arm64-msvc": "1.32.0", + "lightningcss-win32-x64-msvc": "1.32.0" + } + }, + "node_modules/lightningcss-android-arm64": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-android-arm64/-/lightningcss-android-arm64-1.32.0.tgz", + "integrity": "sha512-YK7/ClTt4kAK0vo6w3X+Pnm0D2cf2vPHbhOXdoNti1Ga0al1P4TBZhwjATvjNwLEBCnKvjJc2jQgHXH0NEwlAg==", + "cpu": [ + "arm64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-darwin-arm64": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.32.0.tgz", + "integrity": "sha512-RzeG9Ju5bag2Bv1/lwlVJvBE3q6TtXskdZLLCyfg5pt+HLz9BqlICO7LZM7VHNTTn/5PRhHFBSjk5lc4cmscPQ==", + "cpu": [ + "arm64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-darwin-x64": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.32.0.tgz", + "integrity": "sha512-U+QsBp2m/s2wqpUYT/6wnlagdZbtZdndSmut/NJqlCcMLTWp5muCrID+K5UJ6jqD2BFshejCYXniPDbNh73V8w==", + "cpu": [ + "x64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-freebsd-x64": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.32.0.tgz", + "integrity": "sha512-JCTigedEksZk3tHTTthnMdVfGf61Fky8Ji2E4YjUTEQX14xiy/lTzXnu1vwiZe3bYe0q+SpsSH/CTeDXK6WHig==", + "cpu": [ + "x64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm-gnueabihf": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.32.0.tgz", + "integrity": "sha512-x6rnnpRa2GL0zQOkt6rts3YDPzduLpWvwAF6EMhXFVZXD4tPrBkEFqzGowzCsIWsPjqSK+tyNEODUBXeeVHSkw==", + "cpu": [ + "arm" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm64-gnu": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.32.0.tgz", + "integrity": "sha512-0nnMyoyOLRJXfbMOilaSRcLH3Jw5z9HDNGfT/gwCPgaDjnx0i8w7vBzFLFR1f6CMLKF8gVbebmkUN3fa/kQJpQ==", + "cpu": [ + "arm64" + ], + "libc": [ + "glibc" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm64-musl": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.32.0.tgz", + "integrity": "sha512-UpQkoenr4UJEzgVIYpI80lDFvRmPVg6oqboNHfoH4CQIfNA+HOrZ7Mo7KZP02dC6LjghPQJeBsvXhJod/wnIBg==", + "cpu": [ + "arm64" + ], + "libc": [ + "musl" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-x64-gnu": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.32.0.tgz", + "integrity": "sha512-V7Qr52IhZmdKPVr+Vtw8o+WLsQJYCTd8loIfpDaMRWGUZfBOYEJeyJIkqGIDMZPwPx24pUMfwSxxI8phr/MbOA==", + "cpu": [ + "x64" + ], + "libc": [ + "glibc" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-x64-musl": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.32.0.tgz", + "integrity": "sha512-bYcLp+Vb0awsiXg/80uCRezCYHNg1/l3mt0gzHnWV9XP1W5sKa5/TCdGWaR/zBM2PeF/HbsQv/j2URNOiVuxWg==", + "cpu": [ + "x64" + ], + "libc": [ + "musl" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-win32-arm64-msvc": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.32.0.tgz", + "integrity": "sha512-8SbC8BR40pS6baCM8sbtYDSwEVQd4JlFTOlaD3gWGHfThTcABnNDBda6eTZeqbofalIJhFx0qKzgHJmcPTnGdw==", + "cpu": [ + "arm64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-win32-x64-msvc": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.32.0.tgz", + "integrity": "sha512-Amq9B/SoZYdDi1kFrojnoqPLxYhQ4Wo5XiL8EVJrVsB8ARoC1PWW6VGtT0WKCemjy8aC+louJnjS7U18x3b06Q==", + "cpu": [ + "x64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lru-cache": { + "version": "11.5.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.5.1.tgz", + "integrity": "sha512-RPimw/7aMdv2oqRrxKwvZXcPfwBrn/JZ2xYcY9Hus/6LaS3VOAKVWKWgNLCFSiOm1ESXinjsDlidVU7JlnCN2A==", + "license": "BlueOak-1.0.0", + "engines": { + "node": "20 || >=22" + } + }, + "node_modules/magic-string": { + "version": "0.30.21", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz", + "integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==", + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.5" + } + }, + "node_modules/magicast": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/magicast/-/magicast-0.5.3.tgz", + "integrity": "sha512-pVKE4UdSQ7DvHzivsCIFx2BJn1mHG6KsyrFcaxFx6tONdneEuThrDx0Cj3AMg58KyN4pzYT+LHOotxDQDjNvkw==", + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.29.3", + "@babel/types": "^7.29.0", + "source-map-js": "^1.2.1" + } + }, + "node_modules/mdast-util-to-hast": { + "version": "13.2.1", + "resolved": "https://registry.npmjs.org/mdast-util-to-hast/-/mdast-util-to-hast-13.2.1.tgz", + "integrity": "sha512-cctsq2wp5vTsLIcaymblUriiTcZd0CwWtCbLvrOzYCDZoWyMNV8sZ7krj09FSnsiJi3WVsHLM4k6Dq/yaPyCXA==", + "license": "MIT", "dependencies": { - "js-tokens": "^3.0.0 || ^4.0.0" + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "@ungap/structured-clone": "^1.0.0", + "devlop": "^1.0.0", + "micromark-util-sanitize-uri": "^2.0.0", + "trim-lines": "^3.0.0", + "unist-util-position": "^5.0.0", + "unist-util-visit": "^5.0.0", + "vfile": "^6.0.0" }, - "bin": { - "loose-envify": "cli.js" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdn-data": { + "version": "2.27.1", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.27.1.tgz", + "integrity": "sha512-9Yubnt3e8A0OKwxYSXyhLymGW4sCufcLG6VdiDdUGVkPhpqLxlvP5vl1983gQjJl3tqbrM731mjaZaP68AgosQ==", + "license": "CC0-1.0" + }, + "node_modules/micromark-util-character": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", + "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-encode": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-encode/-/micromark-util-encode-2.0.1.tgz", + "integrity": "sha512-c3cVx2y4KqUnwopcO9b/SCdo2O67LwJJ/UyqGfbigahfegL9myoEFoDYZgkT7f36T0bLrM9hZTAaAyH+PCAXjw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-util-sanitize-uri": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-2.0.1.tgz", + "integrity": "sha512-9N9IomZ/YuGGZZmQec1MbgxtlgougxTodVwDzzEouPKo3qFWvymFHWcnDi2vzV1ff6kas9ucW+o3yzJK9YB1AQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-encode": "^2.0.0", + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-util-types": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-2.0.2.tgz", + "integrity": "sha512-Yw0ECSpJoViF1qTU4DC6NwtC4aWGt1EkzaQB8KPPyCRR8z9TWeV0HbEFGTO+ZY1wB22zmxnJqhPyTpOVCpeHTA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/mrmime": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/mrmime/-/mrmime-2.0.1.tgz", + "integrity": "sha512-Y3wQdFg2Va6etvQ5I82yUhGdsKrcYox6p7FfL1LbK2J4V01F9TGlepTIhnK24t7koZibmg82KGglhA1XK5IsLQ==", + "license": "MIT", + "engines": { + "node": ">=10" } }, "node_modules/nanoid": { - "version": "3.3.11", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", - "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", - "dev": true, + "version": "3.3.15", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.15.tgz", + "integrity": "sha512-y7Wygv/7mEOvxTuEQDB8StXdMRBWf1kR/tlhAzBRUFkB2jfcLOAxO/SHmOO2zgz1pVgK29/kyupn059/bCHdjA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/neotraverse": { + "version": "0.6.18", + "resolved": "https://registry.npmjs.org/neotraverse/-/neotraverse-0.6.18.tgz", + "integrity": "sha512-Z4SmBUweYa09+o6pG+eASabEpP6QkQ70yHj351pQoEXIs8uHbaU2DWVmzBANKgflPa47A50PtB2+NgRpQvr7vA==", + "license": "MIT", + "engines": { + "node": ">= 10" + } + }, + "node_modules/nlcst-to-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/nlcst-to-string/-/nlcst-to-string-4.0.0.tgz", + "integrity": "sha512-YKLBCcUYKAg0FNlOBT6aI91qFmSiFKiluk655WzPF+DDMA02qIyy8uiRqI8QXtcFpEvll12LpL5MXqEmAZ+dcA==", + "license": "MIT", + "dependencies": { + "@types/nlcst": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/node-fetch-native": { + "version": "1.6.7", + "resolved": "https://registry.npmjs.org/node-fetch-native/-/node-fetch-native-1.6.7.tgz", + "integrity": "sha512-g9yhqoedzIUm0nTnTqAQvueMPVOuIY16bqgAJJC8XOOubYFNwz6IER9qs0Gq2Xd0+CecCKFjtdDTMA4u4xG06Q==", + "license": "MIT" + }, + "node_modules/node-mock-http": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/node-mock-http/-/node-mock-http-1.0.4.tgz", + "integrity": "sha512-8DY+kFsDkNXy1sJglUfuODx1/opAGJGyrTuFqEoN90oRc2Vk0ZbD4K2qmKXBBEhZQzdKHIVfEJpDU8Ak2NJEvQ==", + "license": "MIT" + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/nth-check": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", + "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", + "license": "BSD-2-Clause", + "dependencies": { + "boolbase": "^1.0.0" + }, + "funding": { + "url": "https://github.com/fb55/nth-check?sponsor=1" + } + }, + "node_modules/obug": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/obug/-/obug-2.1.3.tgz", + "integrity": "sha512-9miFgM2OFba7hB+pRgvtV84pYTBaoTHohvmIgiRt6dRIzbwEOIaNaP+dIlGs2fNFoB0SeISs0Jz5WFVRid6Xyg==", + "funding": [ + "https://github.com/sponsors/sxzz", + "https://opencollective.com/debug" + ], + "license": "MIT", + "engines": { + "node": ">=12.20.0" + } + }, + "node_modules/ofetch": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/ofetch/-/ofetch-1.5.1.tgz", + "integrity": "sha512-2W4oUZlVaqAPAil6FUg/difl6YhqhUR7x2eZY4bQCko22UXg3hptq9KLQdqFClV+Wu85UX7hNtdGTngi/1BxcA==", + "license": "MIT", + "dependencies": { + "destr": "^2.0.5", + "node-fetch-native": "^1.6.7", + "ufo": "^1.6.1" + } + }, + "node_modules/ohash": { + "version": "2.0.11", + "resolved": "https://registry.npmjs.org/ohash/-/ohash-2.0.11.tgz", + "integrity": "sha512-RdR9FQrFwNBNXAr4GixM8YaRZRJ5PUWbKYbE5eOsrwAjJW0q2REGcf79oYPsLyskQCZG1PLN+S/K1V00joZAoQ==", + "license": "MIT" + }, + "node_modules/oniguruma-parser": { + "version": "0.12.2", + "resolved": "https://registry.npmjs.org/oniguruma-parser/-/oniguruma-parser-0.12.2.tgz", + "integrity": "sha512-6HVa5oIrgMC6aA6WF6XyyqbhRPJrKR02L20+2+zpDtO5QAzGHAUGw5TKQvwi5vctNnRHkJYmjAhRVQF2EKdTQw==", + "license": "MIT" + }, + "node_modules/oniguruma-to-es": { + "version": "4.3.6", + "resolved": "https://registry.npmjs.org/oniguruma-to-es/-/oniguruma-to-es-4.3.6.tgz", + "integrity": "sha512-csuQ9x3Yr0cEIs/Zgx/OEt9iBw9vqIunAPQkx19R/fiMq2oGVTgcMqO/V3Ybqefr1TBvosI6jU539ksaBULJyA==", + "license": "MIT", + "dependencies": { + "oniguruma-parser": "^0.12.2", + "regex": "^6.1.0", + "regex-recursion": "^6.0.2" + } + }, + "node_modules/p-limit": { + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-7.3.0.tgz", + "integrity": "sha512-7cIXg/Z0M5WZRblrsOla88S4wAK+zOQQWeBYfV3qJuJXMr+LnbYjaadrFaS0JILfEDPVqHyKnZ1Z/1d6J9VVUw==", + "license": "MIT", + "dependencies": { + "yocto-queue": "^1.2.1" + }, + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-queue": { + "version": "9.3.0", + "resolved": "https://registry.npmjs.org/p-queue/-/p-queue-9.3.0.tgz", + "integrity": "sha512-7NED7xhQ74Ngp4JP/2e0VZHp7vSWfJfqeiR92jPgxsz6m0Se4P03YoTKa9dDXyZ3r6P616gUXttrB6nnHYKang==", + "license": "MIT", + "dependencies": { + "eventemitter3": "^5.0.4", + "p-timeout": "^7.0.0" + }, + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-timeout": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-7.0.1.tgz", + "integrity": "sha512-AxTM2wDGORHGEkPCt8yqxOTMgpfbEHqF51f/5fJCmwFC3C/zNcGT63SymH2ttOAaiIws2zVg4+izQCjrakcwHg==", + "license": "MIT", + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/package-manager-detector": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/package-manager-detector/-/package-manager-detector-1.6.0.tgz", + "integrity": "sha512-61A5ThoTiDG/C8s8UMZwSorAGwMJ0ERVGj2OjoW5pAalsNOg15+iQiPzrLJ4jhZ1HJzmC2PIHT2oEiH3R5fzNA==", + "license": "MIT" + }, + "node_modules/parse5": { + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.3.0.tgz", + "integrity": "sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw==", + "license": "MIT", + "dependencies": { + "entities": "^6.0.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } + }, + "node_modules/piccolore": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/piccolore/-/piccolore-0.1.3.tgz", + "integrity": "sha512-o8bTeDWjE086iwKrROaDf31K0qC/BENdm15/uH9usSC/uZjJOKb2YGiVHfLY4GhwsERiPI1jmwI2XrA7ACOxVw==", + "license": "ISC" + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "license": "ISC" + }, + "node_modules/picomatch": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz", + "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/popper.js": { + "version": "1.16.1", + "resolved": "https://registry.npmjs.org/popper.js/-/popper.js-1.16.1.tgz", + "integrity": "sha512-Wb4p1J4zyFTbM+u6WuO4XstYx4Ky9Cewe4DWrel7B0w6VVICvPwdOpotjzcf6eD8TsckVnIMNONQyPIUFOUbCQ==", + "deprecated": "You can find the new Popper v2 at @popperjs/core, this package is dedicated to the legacy v1", + "license": "MIT", + "peer": true, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/popperjs" + } + }, + "node_modules/postcss": { + "version": "8.5.15", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.15.tgz", + "integrity": "sha512-FfR8sjd4em2T6fb3I2MwAJU7HWVMr9zba+enmQeeWFfCbm+UOC/0X4DS8XtpUTMwWMGbjKYP7xjfNekzyGmB3A==", "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, { "type": "github", "url": "https://github.com/sponsors/ai" } ], "license": "MIT", - "bin": { - "nanoid": "bin/nanoid.cjs" - }, + "dependencies": { + "nanoid": "^3.3.12", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/prismjs": { + "version": "1.30.0", + "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.30.0.tgz", + "integrity": "sha512-DEvV2ZF2r2/63V+tK8hQvrR2ZGn10srHbXviTlcv7Kpzw8jWiNTqbVgjO3IY8RxrrOUF8VPMQQFysYYYv0YZxw==", + "license": "MIT", "engines": { - "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + "node": ">=6" } }, - "node_modules/object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", + "node_modules/process-ancestry": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/process-ancestry/-/process-ancestry-0.1.0.tgz", + "integrity": "sha512-tGqJW/UnclpYASFcM6Xh8D8l/BMtaQ9+CSG0vlJSJTcdMM4lDRv4c6H0Pdcsfted+bVczdYSfk2fdukg2gQkZg==", + "license": "MIT", "engines": { - "node": ">=0.10.0" + "node": ">=18.0.0" } }, - "node_modules/picocolors": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", - "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", - "dev": true, - "license": "ISC" + "node_modules/property-information": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/property-information/-/property-information-7.2.0.tgz", + "integrity": "sha512-IAtzIB6sUiWaJYrX9smp3V46pBGbBeLFRGdh25kg1334VcBlD8HzhPeNIWQH9zhGmo2itIe25EHt9dQP7G5hmg==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } }, - "node_modules/popper.js": { - "version": "1.16.1", - "resolved": "https://registry.npmjs.org/popper.js/-/popper.js-1.16.1.tgz", - "integrity": "sha512-Wb4p1J4zyFTbM+u6WuO4XstYx4Ky9Cewe4DWrel7B0w6VVICvPwdOpotjzcf6eD8TsckVnIMNONQyPIUFOUbCQ==", - "deprecated": "You can find the new Popper v2 at @popperjs/core, this package is dedicated to the legacy v1", - "peer": true, + "node_modules/radix3": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/radix3/-/radix3-1.1.2.tgz", + "integrity": "sha512-b484I/7b8rDEdSDKckSSBA8knMpcdsXudlE/LNL639wFoHKwLbEkQFZHWEYwDC0wa0FKUcCY+GAF73Z7wxNVFA==", + "license": "MIT" + }, + "node_modules/readdirp": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-5.0.0.tgz", + "integrity": "sha512-9u/XQ1pvrQtYyMpZe7DXKv2p5CNvyVwzUB6uhLAnQwHMSgKMBR62lc7AHljaeteeHXn11XTAaLLUVZYVZyuRBQ==", + "license": "MIT", + "engines": { + "node": ">= 20.19.0" + }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/popperjs" + "type": "individual", + "url": "https://paulmillr.com/funding/" } }, - "node_modules/prop-types": { - "version": "15.8.1", - "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", - "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", + "node_modules/regex": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/regex/-/regex-6.1.0.tgz", + "integrity": "sha512-6VwtthbV4o/7+OaAF9I5L5V3llLEsoPyq9P1JVXkedTP33c7MfCG0/5NOPcSJn0TzXcG9YUrR0gQSWioew3LDg==", + "license": "MIT", "dependencies": { - "loose-envify": "^1.4.0", - "object-assign": "^4.1.1", - "react-is": "^16.13.1" + "regex-utilities": "^2.3.0" } }, - "node_modules/react": { - "version": "19.2.4", - "resolved": "https://registry.npmjs.org/react/-/react-19.2.4.tgz", - "integrity": "sha512-9nfp2hYpCwOjAN+8TZFGhtWEwgvWHXqESH8qT89AT/lWklpLON22Lc8pEtnpsZz7VmawabSU0gCjnj8aC0euHQ==", + "node_modules/regex-recursion": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/regex-recursion/-/regex-recursion-6.0.2.tgz", + "integrity": "sha512-0YCaSCq2VRIebiaUviZNs0cBz1kg5kVS2UKUfNIx8YVs1cN3AV7NTctO5FOKBA+UT2BPJIWZauYHPqJODG50cg==", "license": "MIT", - "engines": { - "node": ">=0.10.0" + "dependencies": { + "regex-utilities": "^2.3.0" } }, - "node_modules/react-ace": { - "version": "14.0.1", - "resolved": "https://registry.npmjs.org/react-ace/-/react-ace-14.0.1.tgz", - "integrity": "sha512-z6YAZ20PNf/FqmYEic//G/UK6uw0rn21g58ASgHJHl9rfE4nITQLqthr9rHMVQK4ezwohJbp2dGrZpkq979PYQ==", + "node_modules/regex-utilities": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/regex-utilities/-/regex-utilities-2.3.0.tgz", + "integrity": "sha512-8VhliFJAWRaUiVvREIiW2NXXTmHs4vMNnSzuJVhscgmGav3g9VDxLrQndI3dZZVVdp0ZO/5v0xmX516/7M9cng==", + "license": "MIT" + }, + "node_modules/rehype": { + "version": "13.0.2", + "resolved": "https://registry.npmjs.org/rehype/-/rehype-13.0.2.tgz", + "integrity": "sha512-j31mdaRFrwFRUIlxGeuPXXKWQxet52RBQRvCmzl5eCefn/KGbomK5GMHNMsOJf55fgo3qw5tST5neDuarDYR2A==", "license": "MIT", "dependencies": { - "ace-builds": "^1.36.3", - "diff-match-patch": "^1.0.5", - "lodash.get": "^4.4.2", - "lodash.isequal": "^4.5.0", - "prop-types": "^15.8.1" + "@types/hast": "^3.0.0", + "rehype-parse": "^9.0.0", + "rehype-stringify": "^10.0.0", + "unified": "^11.0.0" }, - "peerDependencies": { - "react": "^0.13.0 || ^0.14.0 || ^15.0.1 || ^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", - "react-dom": "^0.13.0 || ^0.14.0 || ^15.0.1 || ^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/react-dom": { - "version": "19.2.4", - "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.2.4.tgz", - "integrity": "sha512-AXJdLo8kgMbimY95O2aKQqsz2iWi9jMgKJhRBAxECE4IFxfcazB2LmzloIoibJI3C12IlY20+KFaLv+71bUJeQ==", + "node_modules/rehype-parse": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/rehype-parse/-/rehype-parse-9.0.1.tgz", + "integrity": "sha512-ksCzCD0Fgfh7trPDxr2rSylbwq9iYDkSn8TCDmEJ49ljEUBxDVCzCHv7QNzZOfODanX4+bWQ4WZqLCRWYLfhag==", "license": "MIT", "dependencies": { - "scheduler": "^0.27.0" + "@types/hast": "^3.0.0", + "hast-util-from-html": "^2.0.0", + "unified": "^11.0.0" }, - "peerDependencies": { - "react": "^19.2.4" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/react-fast-compare": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/react-fast-compare/-/react-fast-compare-3.2.2.tgz", - "integrity": "sha512-nsO+KSNgo1SbJqJEYRE9ERzo7YtYbou/OqjSQKxV7jcKox7+usiUVZOAC+XnDOABXggQTno0Y1CpVnuWEc1boQ==", - "license": "MIT" + "node_modules/rehype-stringify": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/rehype-stringify/-/rehype-stringify-10.0.1.tgz", + "integrity": "sha512-k9ecfXHmIPuFVI61B9DeLPN0qFHfawM6RsuX48hoqlaKSF61RskNjSm1lI8PhBEM0MRdLxVVm4WmTqJQccH9mA==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "hast-util-to-html": "^9.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } }, - "node_modules/react-icons": { - "version": "5.6.0", - "resolved": "https://registry.npmjs.org/react-icons/-/react-icons-5.6.0.tgz", - "integrity": "sha512-RH93p5ki6LfOiIt0UtDyNg/cee+HLVR6cHHtW3wALfo+eOHTp8RnU2kRkI6E+H19zMIs03DyxUG/GfZMOGvmiA==", + "node_modules/resolve-pkg-maps": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz", + "integrity": "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==", "license": "MIT", - "peerDependencies": { - "react": "*" + "funding": { + "url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1" } }, - "node_modules/react-is": { - "version": "16.13.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", - "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" + "node_modules/retext-smartypants": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/retext-smartypants/-/retext-smartypants-6.2.0.tgz", + "integrity": "sha512-kk0jOU7+zGv//kfjXEBjdIryL1Acl4i9XNkHxtM7Tm5lFiCog576fjNC9hjoR7LTKQ0DsPWy09JummSsH1uqfQ==", + "license": "MIT", + "dependencies": { + "@types/nlcst": "^2.0.0", + "nlcst-to-string": "^4.0.0", + "unist-util-visit": "^5.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } }, - "node_modules/react-router": { - "version": "7.13.2", - "resolved": "https://registry.npmjs.org/react-router/-/react-router-7.13.2.tgz", - "integrity": "sha512-tX1Aee+ArlKQP+NIUd7SE6Li+CiGKwQtbS+FfRxPX6Pe4vHOo6nr9d++u5cwg+Z8K/x8tP+7qLmujDtfrAoUJA==", + "node_modules/rolldown": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/rolldown/-/rolldown-1.1.3.tgz", + "integrity": "sha512-1F1eEtUBtFvcGm1HQ9TiUIUHPQG7mSAODrhIzjxoUEFuo8OcbrGLiVLkevNgj84TE4lnHvnumwFjhJO5Eu135g==", "license": "MIT", "dependencies": { - "cookie": "^1.0.1", - "set-cookie-parser": "^2.6.0" + "@oxc-project/types": "=0.137.0", + "@rolldown/pluginutils": "^1.0.0" + }, + "bin": { + "rolldown": "bin/cli.mjs" }, "engines": { - "node": ">=20.0.0" + "node": "^20.19.0 || >=22.12.0" }, - "peerDependencies": { - "react": ">=18", - "react-dom": ">=18" + "optionalDependencies": { + "@rolldown/binding-android-arm64": "1.1.3", + "@rolldown/binding-darwin-arm64": "1.1.3", + "@rolldown/binding-darwin-x64": "1.1.3", + "@rolldown/binding-freebsd-x64": "1.1.3", + "@rolldown/binding-linux-arm-gnueabihf": "1.1.3", + "@rolldown/binding-linux-arm64-gnu": "1.1.3", + "@rolldown/binding-linux-arm64-musl": "1.1.3", + "@rolldown/binding-linux-ppc64-gnu": "1.1.3", + "@rolldown/binding-linux-s390x-gnu": "1.1.3", + "@rolldown/binding-linux-x64-gnu": "1.1.3", + "@rolldown/binding-linux-x64-musl": "1.1.3", + "@rolldown/binding-openharmony-arm64": "1.1.3", + "@rolldown/binding-wasm32-wasi": "1.1.3", + "@rolldown/binding-win32-arm64-msvc": "1.1.3", + "@rolldown/binding-win32-x64-msvc": "1.1.3" + } + }, + "node_modules/satteri": { + "version": "0.9.3", + "resolved": "https://registry.npmjs.org/satteri/-/satteri-0.9.3.tgz", + "integrity": "sha512-2XfBh89LCnBMFkNOeVKkBLelAZcIA17VLHsgJum1tJ2fXiPZDN/TDXv4ku46rFOQXYd41LJ0kiZh5gPqExcCsg==", + "dependencies": { + "@types/estree-jsx": "^1.0.5", + "@types/hast": "^3.0.4", + "@types/mdast": "^4.0.4", + "@types/unist": "^3.0.3" }, - "peerDependenciesMeta": { - "react-dom": { - "optional": true - } + "optionalDependencies": { + "@bruits/satteri-darwin-arm64": "0.9.3", + "@bruits/satteri-darwin-x64": "0.9.3", + "@bruits/satteri-linux-arm64-gnu": "0.9.3", + "@bruits/satteri-linux-arm64-musl": "0.9.3", + "@bruits/satteri-linux-x64-gnu": "0.9.3", + "@bruits/satteri-linux-x64-musl": "0.9.3", + "@bruits/satteri-wasm32-wasi": "0.9.3", + "@bruits/satteri-win32-arm64-msvc": "0.9.3", + "@bruits/satteri-win32-x64-msvc": "0.9.3" } }, - "node_modules/react-router-dom": { - "version": "7.13.2", - "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-7.13.2.tgz", - "integrity": "sha512-aR7SUORwTqAW0JDeiWF07e9SBE9qGpByR9I8kJT5h/FrBKxPMS6TiC7rmVO+gC0q52Bx7JnjWe8Z1sR9faN4YA==", - "license": "MIT", + "node_modules/sax": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.6.0.tgz", + "integrity": "sha512-6R3J5M4AcbtLUdZmRv2SygeVaM7IhrLXu9BmnOGmmACak8fiUtOsYNWUS4uK7upbmHIBbLBeFeI//477BKLBzA==", + "license": "BlueOak-1.0.0", + "engines": { + "node": ">=11.0.0" + } + }, + "node_modules/semver": { + "version": "7.8.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.5.tgz", + "integrity": "sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/sharp": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.34.5.tgz", + "integrity": "sha512-Ou9I5Ft9WNcCbXrU9cMgPBcCK8LiwLqcbywW3t4oDV37n1pzpuNLsYiAV8eODnjbtQlSDwZ2cUEeQz4E54Hltg==", + "hasInstallScript": true, + "license": "Apache-2.0", + "optional": true, "dependencies": { - "react-router": "7.13.2" + "@img/colour": "^1.0.0", + "detect-libc": "^2.1.2", + "semver": "^7.7.3" }, "engines": { - "node": ">=20.0.0" + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" }, - "peerDependencies": { - "react": ">=18", - "react-dom": ">=18" + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-darwin-arm64": "0.34.5", + "@img/sharp-darwin-x64": "0.34.5", + "@img/sharp-libvips-darwin-arm64": "1.2.4", + "@img/sharp-libvips-darwin-x64": "1.2.4", + "@img/sharp-libvips-linux-arm": "1.2.4", + "@img/sharp-libvips-linux-arm64": "1.2.4", + "@img/sharp-libvips-linux-ppc64": "1.2.4", + "@img/sharp-libvips-linux-riscv64": "1.2.4", + "@img/sharp-libvips-linux-s390x": "1.2.4", + "@img/sharp-libvips-linux-x64": "1.2.4", + "@img/sharp-libvips-linuxmusl-arm64": "1.2.4", + "@img/sharp-libvips-linuxmusl-x64": "1.2.4", + "@img/sharp-linux-arm": "0.34.5", + "@img/sharp-linux-arm64": "0.34.5", + "@img/sharp-linux-ppc64": "0.34.5", + "@img/sharp-linux-riscv64": "0.34.5", + "@img/sharp-linux-s390x": "0.34.5", + "@img/sharp-linux-x64": "0.34.5", + "@img/sharp-linuxmusl-arm64": "0.34.5", + "@img/sharp-linuxmusl-x64": "0.34.5", + "@img/sharp-wasm32": "0.34.5", + "@img/sharp-win32-arm64": "0.34.5", + "@img/sharp-win32-ia32": "0.34.5", + "@img/sharp-win32-x64": "0.34.5" } }, - "node_modules/react-spinners": { - "version": "0.17.0", - "resolved": "https://registry.npmjs.org/react-spinners/-/react-spinners-0.17.0.tgz", - "integrity": "sha512-L/8HTylaBmIWwQzIjMq+0vyaRXuoAevzWoD35wKpNTxxtYXWZp+xtgkfD7Y4WItuX0YvdxMPU79+7VhhmbmuTQ==", + "node_modules/shiki": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/shiki/-/shiki-4.3.0.tgz", + "integrity": "sha512-NKKjWzR6LIGL3sXBrWDw9sDS9cxx42/DkysaNqJEeOWE8Kix5gpak0bc00OfDVEO4oyXSyz8+aRaqKoBD1yo7A==", "license": "MIT", - "peerDependencies": { - "react": "^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", - "react-dom": "^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" + "dependencies": { + "@shikijs/core": "4.3.0", + "@shikijs/engine-javascript": "4.3.0", + "@shikijs/engine-oniguruma": "4.3.0", + "@shikijs/langs": "4.3.0", + "@shikijs/themes": "4.3.0", + "@shikijs/types": "4.3.0", + "@shikijs/vscode-textmate": "^10.0.2", + "@types/hast": "^3.0.4" + }, + "engines": { + "node": ">=20" } }, - "node_modules/react-transition-group": { - "version": "4.4.5", - "resolved": "https://registry.npmjs.org/react-transition-group/-/react-transition-group-4.4.5.tgz", - "integrity": "sha512-pZcd1MCJoiKiBR2NRxeCRg13uCXbydPnmB4EOeRrY7480qNWO8IIgQG6zlDkm6uRMsURXPuKq0GWtiM59a5Q6g==", + "node_modules/sisteransi": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", + "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", + "license": "MIT" + }, + "node_modules/smol-toml": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/smol-toml/-/smol-toml-1.7.0.tgz", + "integrity": "sha512-aqVvWoyO21L23mb+drl4RmMXbf6N7FdHjAhTRA9ZBL7apWBgfWC16KjrASI+1p9GAroljyMHj6fK67i0UiTNvQ==", "license": "BSD-3-Clause", - "dependencies": { - "@babel/runtime": "^7.5.5", - "dom-helpers": "^5.0.1", - "loose-envify": "^1.4.0", - "prop-types": "^15.6.2" + "engines": { + "node": ">= 18" }, - "peerDependencies": { - "react": ">=16.6.0", - "react-dom": ">=16.6.0" + "funding": { + "url": "https://github.com/sponsors/cyyynthia" + } + }, + "node_modules/source-map-js": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" } }, - "node_modules/reactstrap": { - "version": "9.2.3", - "resolved": "https://registry.npmjs.org/reactstrap/-/reactstrap-9.2.3.tgz", - "integrity": "sha512-1nXy7FIBIoOgXr3AIHOpgzcZXdj6rZE5YvNSPd1hYgwv8X64m6TAJsU0ExlieJdlRXhaRfTYRSZoTWa127b0gw==", + "node_modules/space-separated-tokens": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/space-separated-tokens/-/space-separated-tokens-2.0.2.tgz", + "integrity": "sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==", "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.12.5", - "@popperjs/core": "^2.6.0", - "classnames": "^2.2.3", - "prop-types": "^15.5.8", - "react-popper": "^2.2.4", - "react-transition-group": "^4.4.2" - }, - "peerDependencies": { - "react": ">=16.8.0", - "react-dom": ">=16.8.0" + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" } }, - "node_modules/reactstrap/node_modules/react-popper": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/react-popper/-/react-popper-2.3.0.tgz", - "integrity": "sha512-e1hj8lL3uM+sgSR4Lxzn5h1GxBlpa4CQz0XLF8kx4MDrDRWY0Ena4c97PUeSX9i5W3UAfDP0z0FXCTQkoXUl3Q==", + "node_modules/stringify-entities": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/stringify-entities/-/stringify-entities-4.0.4.tgz", + "integrity": "sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg==", "license": "MIT", "dependencies": { - "react-fast-compare": "^3.0.1", - "warning": "^4.0.2" + "character-entities-html4": "^2.0.0", + "character-entities-legacy": "^3.0.0" }, - "peerDependencies": { - "@popperjs/core": "^2.0.0", - "react": "^16.8.0 || ^17 || ^18", - "react-dom": "^16.8.0 || ^17 || ^18" + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" } }, - "node_modules/regenerator-runtime": { - "version": "0.13.11", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz", - "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==" - }, - "node_modules/rolldown": { - "version": "1.0.0-rc.11", - "resolved": "https://registry.npmjs.org/rolldown/-/rolldown-1.0.0-rc.11.tgz", - "integrity": "sha512-NRjoKMusSjfRbSYiH3VSumlkgFe7kYAa3pzVOsVYVFY3zb5d7nS+a3KGQ7hJKXuYWbzJKPVQ9Wxq2UvyK+ENpw==", - "dev": true, + "node_modules/svgo": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/svgo/-/svgo-4.0.1.tgz", + "integrity": "sha512-XDpWUOPC6FEibaLzjfe0ucaV0YrOjYotGJO1WpF0Zd+n6ZGEQUsSugaoLq9QkEZtAfQIxT42UChcssDVPP3+/w==", "license": "MIT", "dependencies": { - "@oxc-project/types": "=0.122.0", - "@rolldown/pluginutils": "1.0.0-rc.11" + "commander": "^11.1.0", + "css-select": "^5.1.0", + "css-tree": "^3.0.1", + "css-what": "^6.1.0", + "csso": "^5.0.5", + "picocolors": "^1.1.1", + "sax": "^1.5.0" }, "bin": { - "rolldown": "bin/cli.mjs" + "svgo": "bin/svgo.js" }, "engines": { - "node": "^20.19.0 || >=22.12.0" + "node": ">=16" }, - "optionalDependencies": { - "@rolldown/binding-android-arm64": "1.0.0-rc.11", - "@rolldown/binding-darwin-arm64": "1.0.0-rc.11", - "@rolldown/binding-darwin-x64": "1.0.0-rc.11", - "@rolldown/binding-freebsd-x64": "1.0.0-rc.11", - "@rolldown/binding-linux-arm-gnueabihf": "1.0.0-rc.11", - "@rolldown/binding-linux-arm64-gnu": "1.0.0-rc.11", - "@rolldown/binding-linux-arm64-musl": "1.0.0-rc.11", - "@rolldown/binding-linux-ppc64-gnu": "1.0.0-rc.11", - "@rolldown/binding-linux-s390x-gnu": "1.0.0-rc.11", - "@rolldown/binding-linux-x64-gnu": "1.0.0-rc.11", - "@rolldown/binding-linux-x64-musl": "1.0.0-rc.11", - "@rolldown/binding-openharmony-arm64": "1.0.0-rc.11", - "@rolldown/binding-wasm32-wasi": "1.0.0-rc.11", - "@rolldown/binding-win32-arm64-msvc": "1.0.0-rc.11", - "@rolldown/binding-win32-x64-msvc": "1.0.0-rc.11" - } - }, - "node_modules/rolldown/node_modules/@rolldown/pluginutils": { - "version": "1.0.0-rc.11", - "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-rc.11.tgz", - "integrity": "sha512-xQO9vbwBecJRv9EUcQ/y0dzSTJgA7Q6UVN7xp6B81+tBGSLVAK03yJ9NkJaUA7JFD91kbjxRSC/mDnmvXzbHoQ==", - "dev": true, - "license": "MIT" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/svgo" + } }, - "node_modules/scheduler": { - "version": "0.27.0", - "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.27.0.tgz", - "integrity": "sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q==", + "node_modules/tiny-inflate": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/tiny-inflate/-/tiny-inflate-1.0.3.tgz", + "integrity": "sha512-pkY1fj1cKHb2seWDy0B16HeWyczlJA9/WW3u3c4z/NiWDsO3DOU5D7nhTLE9CF0yXv/QZFY7sEJmj24dK+Rrqw==", "license": "MIT" }, - "node_modules/set-cookie-parser": { - "version": "2.7.2", - "resolved": "https://registry.npmjs.org/set-cookie-parser/-/set-cookie-parser-2.7.2.tgz", - "integrity": "sha512-oeM1lpU/UvhTxw+g3cIfxXHyJRc/uidd3yK1P242gzHds0udQBYzs3y8j4gCCW+ZJ7ad0yctld8RYO+bdurlvw==", - "license": "MIT" + "node_modules/tinyclip": { + "version": "0.1.15", + "resolved": "https://registry.npmjs.org/tinyclip/-/tinyclip-0.1.15.tgz", + "integrity": "sha512-uo33abH+Ays0xYaDysoBt494Hb3hsEczMpcC0MwFl773pazORx4fmvKhclhR1wonUbB6vvpRsvVMwnhfqeMc+A==", + "license": "MIT", + "engines": { + "node": "^16.14.0 || >= 17.3.0" + } }, - "node_modules/source-map-js": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", - "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", - "dev": true, - "license": "BSD-3-Clause", + "node_modules/tinyexec": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-1.2.4.tgz", + "integrity": "sha512-SHf/r48b7vOrjve9PxJo3MN5v5yuyjHvdUcrQffT3WXMUfnGmHDVbC4k3sHJaJTgZCwpUplIaAo5ANtMyp3YHg==", + "license": "MIT", "engines": { - "node": ">=0.10.0" + "node": ">=18" } }, "node_modules/tinyglobby": { - "version": "0.2.15", - "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.15.tgz", - "integrity": "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==", - "dev": true, + "version": "0.2.17", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.17.tgz", + "integrity": "sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g==", "license": "MIT", "dependencies": { "fdir": "^6.5.0", - "picomatch": "^4.0.3" + "picomatch": "^4.0.4" }, "engines": { "node": ">=12.0.0" @@ -1082,56 +3936,298 @@ "url": "https://github.com/sponsors/SuperchupuDev" } }, - "node_modules/tinyglobby/node_modules/fdir": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", - "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", - "dev": true, + "node_modules/trim-lines": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/trim-lines/-/trim-lines-3.0.1.tgz", + "integrity": "sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==", "license": "MIT", - "engines": { - "node": ">=12.0.0" + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/trough": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/trough/-/trough-2.2.0.tgz", + "integrity": "sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "license": "0BSD", + "optional": true + }, + "node_modules/ufo": { + "version": "1.6.4", + "resolved": "https://registry.npmjs.org/ufo/-/ufo-1.6.4.tgz", + "integrity": "sha512-JFNbkD1Svwe0KvGi8GOeLcP4kAWQ609twvCdcHxq1oSL8svv39ZuSvajcD8B+5D0eL4+s1Is2D/O6KN3qcTeRA==", + "license": "MIT" + }, + "node_modules/ultrahtml": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/ultrahtml/-/ultrahtml-1.6.0.tgz", + "integrity": "sha512-R9fBn90VTJrqqLDwyMph+HGne8eqY1iPfYhPzZrvKpIfwkWZbcYlfpsb8B9dTvBfpy1/hqAD7Wi8EKfP9e8zdw==", + "license": "MIT" + }, + "node_modules/uncrypto": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/uncrypto/-/uncrypto-0.1.3.tgz", + "integrity": "sha512-Ql87qFHB3s/De2ClA9e0gsnS6zXG27SkTiSJwjCc9MebbfapQfuPzumMIUMi38ezPZVNFcHI9sUIepeQfw8J8Q==", + "license": "MIT" + }, + "node_modules/unified": { + "version": "11.0.5", + "resolved": "https://registry.npmjs.org/unified/-/unified-11.0.5.tgz", + "integrity": "sha512-xKvGhPWw3k84Qjh8bI3ZeJjqnyadK+GEFtazSfZv/rKeTkTjOJho6mFqh2SM96iIcZokxiOpg78GazTSg8+KHA==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "bail": "^2.0.0", + "devlop": "^1.0.0", + "extend": "^3.0.0", + "is-plain-obj": "^4.0.0", + "trough": "^2.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unifont": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/unifont/-/unifont-0.7.4.tgz", + "integrity": "sha512-oHeis4/xl42HUIeHuNZRGEvxj5AaIKR+bHPNegRq5LV1gdc3jundpONbjglKpihmJf+dswygdMJn3eftGIMemg==", + "license": "MIT", + "dependencies": { + "css-tree": "^3.1.0", + "ofetch": "^1.5.1", + "ohash": "^2.0.11" + } + }, + "node_modules/unist-util-is": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-6.0.1.tgz", + "integrity": "sha512-LsiILbtBETkDz8I9p1dQ0uyRUWuaQzd/cuEeS1hoRSyW5E5XGmTzlwY1OrNzzakGowI9Dr/I8HVaw4hTtnxy8g==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-position": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/unist-util-position/-/unist-util-position-5.0.0.tgz", + "integrity": "sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-stringify-position": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-4.0.0.tgz", + "integrity": "sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-visit": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-5.1.0.tgz", + "integrity": "sha512-m+vIdyeCOpdr/QeQCu2EzxX/ohgS8KbnPDgFni4dQsfSCtpz8UqDyY5GjRru8PDKuYn7Fq19j1CQ+nJSsGKOzg==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-is": "^6.0.0", + "unist-util-visit-parents": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-visit-parents": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-6.0.2.tgz", + "integrity": "sha512-goh1s1TBrqSqukSc8wrjwWhL0hiJxgA8m4kFxGlQ+8FYQ3C/m11FcTs4YYem7V664AhHVvgoQLk890Ssdsr2IQ==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-is": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unstorage": { + "version": "1.17.5", + "resolved": "https://registry.npmjs.org/unstorage/-/unstorage-1.17.5.tgz", + "integrity": "sha512-0i3iqvRfx29hkNntHyQvJTpf5W9dQ9ZadSoRU8+xVlhVtT7jAX57fazYO9EHvcRCfBCyi5YRya7XCDOsbTgkPg==", + "license": "MIT", + "dependencies": { + "anymatch": "^3.1.3", + "chokidar": "^5.0.0", + "destr": "^2.0.5", + "h3": "^1.15.10", + "lru-cache": "^11.2.7", + "node-fetch-native": "^1.6.7", + "ofetch": "^1.5.1", + "ufo": "^1.6.3" }, "peerDependencies": { - "picomatch": "^3 || ^4" + "@azure/app-configuration": "^1.8.0", + "@azure/cosmos": "^4.2.0", + "@azure/data-tables": "^13.3.0", + "@azure/identity": "^4.6.0", + "@azure/keyvault-secrets": "^4.9.0", + "@azure/storage-blob": "^12.26.0", + "@capacitor/preferences": "^6 || ^7 || ^8", + "@deno/kv": ">=0.9.0", + "@netlify/blobs": "^6.5.0 || ^7.0.0 || ^8.1.0 || ^9.0.0 || ^10.0.0", + "@planetscale/database": "^1.19.0", + "@upstash/redis": "^1.34.3", + "@vercel/blob": ">=0.27.1", + "@vercel/functions": "^2.2.12 || ^3.0.0", + "@vercel/kv": "^1 || ^2 || ^3", + "aws4fetch": "^1.0.20", + "db0": ">=0.2.1", + "idb-keyval": "^6.2.1", + "ioredis": "^5.4.2", + "uploadthing": "^7.4.4" }, "peerDependenciesMeta": { - "picomatch": { + "@azure/app-configuration": { + "optional": true + }, + "@azure/cosmos": { + "optional": true + }, + "@azure/data-tables": { + "optional": true + }, + "@azure/identity": { + "optional": true + }, + "@azure/keyvault-secrets": { + "optional": true + }, + "@azure/storage-blob": { + "optional": true + }, + "@capacitor/preferences": { + "optional": true + }, + "@deno/kv": { + "optional": true + }, + "@netlify/blobs": { + "optional": true + }, + "@planetscale/database": { + "optional": true + }, + "@upstash/redis": { + "optional": true + }, + "@vercel/blob": { + "optional": true + }, + "@vercel/functions": { + "optional": true + }, + "@vercel/kv": { + "optional": true + }, + "aws4fetch": { + "optional": true + }, + "db0": { + "optional": true + }, + "idb-keyval": { + "optional": true + }, + "ioredis": { + "optional": true + }, + "uploadthing": { "optional": true } } }, - "node_modules/tinyglobby/node_modules/picomatch": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz", - "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==", - "dev": true, + "node_modules/vfile": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/vfile/-/vfile-6.0.3.tgz", + "integrity": "sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/vfile-location": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/vfile-location/-/vfile-location-5.0.3.tgz", + "integrity": "sha512-5yXvWDEgqeiYiBe1lbxYF7UMAIm/IcopxMHrMQDq3nvKcjPKIhZklUKL+AE7J7uApI4kwe2snsK+eI6UTj9EHg==", "license": "MIT", - "engines": { - "node": ">=12" + "dependencies": { + "@types/unist": "^3.0.0", + "vfile": "^6.0.0" }, "funding": { - "url": "https://github.com/sponsors/jonschlinkert" + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/tslib": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", - "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==", - "dev": true, - "optional": true + "node_modules/vfile-message": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-4.0.3.tgz", + "integrity": "sha512-QTHzsGd1EhbZs4AsQ20JX1rC3cOlt/IWJruk893DfLRr57lcnOeMaWG4K0JrRta4mIJZKth2Au3mM3u03/JWKw==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-stringify-position": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } }, "node_modules/vite": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/vite/-/vite-8.0.2.tgz", - "integrity": "sha512-1gFhNi+bHhRE/qKZOJXACm6tX4bA3Isy9KuKF15AgSRuRazNBOJfdDemPBU16/mpMxApDPrWvZ08DcLPEoRnuA==", - "dev": true, + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/vite/-/vite-8.1.0.tgz", + "integrity": "sha512-BuJcQK/56NQTWDGn4ABea3q4SSBdNPWwNZKTkkUpcMPnLoquSYH8llRtSUIgoL1KSCpHt5eghLShn50mH36y7Q==", "license": "MIT", "dependencies": { "lightningcss": "^1.32.0", - "picomatch": "^4.0.3", - "postcss": "^8.5.8", - "rolldown": "1.0.0-rc.11", - "tinyglobby": "^0.2.15" + "picomatch": "^4.0.4", + "postcss": "^8.5.15", + "rolldown": "~1.1.2", + "tinyglobby": "^0.2.17" }, "bin": { "vite": "bin/vite.js" @@ -1147,8 +4243,8 @@ }, "peerDependencies": { "@types/node": "^20.19.0 || >=22.12.0", - "@vitejs/devtools": "^0.1.0", - "esbuild": "^0.27.0", + "@vitejs/devtools": "^0.3.0", + "esbuild": "^0.27.0 || ^0.28.0", "jiti": ">=1.21.0", "less": "^4.0.0", "sass": "^1.70.0", @@ -1198,690 +4294,88 @@ } } }, - "node_modules/vite/node_modules/picomatch": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz", - "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==", - "dev": true, + "node_modules/vitefu": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/vitefu/-/vitefu-1.1.3.tgz", + "integrity": "sha512-ub4okH7Z5KLjb6hDyjqrGXqWtWvoYdU3IGm/NorpgHncKoLTCfRIbvlhBm7r0YstIaQRYlp4yEbFqDcKSzXSSg==", "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/vite/node_modules/postcss": { - "version": "8.5.8", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.8.tgz", - "integrity": "sha512-OW/rX8O/jXnm82Ey1k44pObPtdblfiuWnrd8X7GJ7emImCOstunGbXUpp7HdBrFQX6rJzn3sPT397Wp5aCwCHg==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/postcss" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } + "workspaces": [ + "tests/deps/*", + "tests/projects/*", + "tests/projects/workspace/packages/*" ], - "license": "MIT", - "dependencies": { - "nanoid": "^3.3.11", - "picocolors": "^1.1.1", - "source-map-js": "^1.2.1" + "peerDependencies": { + "vite": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0" }, - "engines": { - "node": "^10 || ^12 || >=14" + "peerDependenciesMeta": { + "vite": { + "optional": true + } } }, - "node_modules/warning": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/warning/-/warning-4.0.3.tgz", - "integrity": "sha512-rpJyN222KWIvHJ/F53XSZv0Zl/accqHR8et1kpaMTD/fLCRxtV8iX8czMzY7sVZupTI3zcUTg8eycS2kNF9l6w==", + "node_modules/web-namespaces": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/web-namespaces/-/web-namespaces-2.0.1.tgz", + "integrity": "sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ==", "license": "MIT", - "dependencies": { - "loose-envify": "^1.0.0" - } - } - }, - "dependencies": { - "@babel/runtime": { - "version": "7.22.6", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.22.6.tgz", - "integrity": "sha512-wDb5pWm4WDdF6LFUde3Jl8WzPA+3ZbxYqkC6xAXuD3irdEHN1k0NfTRrJD8ZD378SJ61miMLCqIOXYhd8x+AJQ==", - "requires": { - "regenerator-runtime": "^0.13.11" - } - }, - "@emnapi/core": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.9.1.tgz", - "integrity": "sha512-mukuNALVsoix/w1BJwFzwXBN/dHeejQtuVzcDsfOEsdpCumXb/E9j8w11h5S54tT1xhifGfbbSm/ICrObRb3KA==", - "dev": true, - "optional": true, - "requires": { - "@emnapi/wasi-threads": "1.2.0", - "tslib": "^2.4.0" - } - }, - "@emnapi/runtime": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.9.1.tgz", - "integrity": "sha512-VYi5+ZVLhpgK4hQ0TAjiQiZ6ol0oe4mBx7mVv7IflsiEp0OWoVsp/+f9Vc1hOhE0TtkORVrI1GvzyreqpgWtkA==", - "dev": true, - "optional": true, - "requires": { - "tslib": "^2.4.0" - } - }, - "@emnapi/wasi-threads": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.2.0.tgz", - "integrity": "sha512-N10dEJNSsUx41Z6pZsXU8FjPjpBEplgH24sfkmITrBED1/U2Esum9F3lfLrMjKHHjmi557zQn7kR9R+XWXu5Rg==", - "dev": true, - "optional": true, - "requires": { - "tslib": "^2.4.0" - } - }, - "@napi-rs/wasm-runtime": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-1.1.1.tgz", - "integrity": "sha512-p64ah1M1ld8xjWv3qbvFwHiFVWrq1yFvV4f7w+mzaqiR4IlSgkqhcRdHwsGgomwzBH51sRY4NEowLxnaBjcW/A==", - "dev": true, - "optional": true, - "requires": { - "@emnapi/core": "^1.7.1", - "@emnapi/runtime": "^1.7.1", - "@tybys/wasm-util": "^0.10.1" - } - }, - "@oxc-project/types": { - "version": "0.122.0", - "resolved": "https://registry.npmjs.org/@oxc-project/types/-/types-0.122.0.tgz", - "integrity": "sha512-oLAl5kBpV4w69UtFZ9xqcmTi+GENWOcPF7FCrczTiBbmC0ibXxCwyvZGbO39rCVEuLGAZM84DH0pUIyyv/YJzA==", - "dev": true - }, - "@popperjs/core": { - "version": "2.11.8", - "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.8.tgz", - "integrity": "sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==" - }, - "@rolldown/binding-android-arm64": { - "version": "1.0.0-rc.11", - "resolved": "https://registry.npmjs.org/@rolldown/binding-android-arm64/-/binding-android-arm64-1.0.0-rc.11.tgz", - "integrity": "sha512-SJ+/g+xNnOh6NqYxD0V3uVN4W3VfnrGsC9/hoglicgTNfABFG9JjISvkkU0dNY84MNHLWyOgxP9v9Y9pX4S7+A==", - "dev": true, - "optional": true - }, - "@rolldown/binding-darwin-arm64": { - "version": "1.0.0-rc.11", - "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-arm64/-/binding-darwin-arm64-1.0.0-rc.11.tgz", - "integrity": "sha512-7WQgR8SfOPwmDZGFkThUvsmd/nwAWv91oCO4I5LS7RKrssPZmOt7jONN0cW17ydGC1n/+puol1IpoieKqQidmg==", - "dev": true, - "optional": true - }, - "@rolldown/binding-darwin-x64": { - "version": "1.0.0-rc.11", - "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-x64/-/binding-darwin-x64-1.0.0-rc.11.tgz", - "integrity": "sha512-39Ks6UvIHq4rEogIfQBoBRusj0Q0nPVWIvqmwBLaT6aqQGIakHdESBVOPRRLacy4WwUPIx4ZKzfZ9PMW+IeyUQ==", - "dev": true, - "optional": true - }, - "@rolldown/binding-freebsd-x64": { - "version": "1.0.0-rc.11", - "resolved": "https://registry.npmjs.org/@rolldown/binding-freebsd-x64/-/binding-freebsd-x64-1.0.0-rc.11.tgz", - "integrity": "sha512-jfsm0ZHfhiqrvWjJAmzsqiIFPz5e7mAoCOPBNTcNgkiid/LaFKiq92+0ojH+nmJmKYkre4t71BWXUZDNp7vsag==", - "dev": true, - "optional": true - }, - "@rolldown/binding-linux-arm-gnueabihf": { - "version": "1.0.0-rc.11", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-1.0.0-rc.11.tgz", - "integrity": "sha512-zjQaUtSyq1nVe3nxmlSCuR96T1LPlpvmJ0SZy0WJFEsV4kFbXcq2u68L4E6O0XeFj4aex9bEauqjW8UQBeAvfQ==", - "dev": true, - "optional": true - }, - "@rolldown/binding-linux-arm64-gnu": { - "version": "1.0.0-rc.11", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.0.0-rc.11.tgz", - "integrity": "sha512-WMW1yE6IOnehTcFE9eipFkm3XN63zypWlrJQ2iF7NrQ9b2LDRjumFoOGJE8RJJTJCTBAdmLMnJ8uVitACUUo1Q==", - "dev": true, - "optional": true - }, - "@rolldown/binding-linux-arm64-musl": { - "version": "1.0.0-rc.11", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.0.0-rc.11.tgz", - "integrity": "sha512-jfndI9tsfm4APzjNt6QdBkYwre5lRPUgHeDHoI7ydKUuJvz3lZeCfMsI56BZj+7BYqiKsJm7cfd/6KYV7ubrBg==", - "dev": true, - "optional": true - }, - "@rolldown/binding-linux-ppc64-gnu": { - "version": "1.0.0-rc.11", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-1.0.0-rc.11.tgz", - "integrity": "sha512-ZlFgw46NOAGMgcdvdYwAGu2Q+SLFA9LzbJLW+iyMOJyhj5wk6P3KEE9Gct4xWwSzFoPI7JCdYmYMzVtlgQ+zfw==", - "dev": true, - "optional": true - }, - "@rolldown/binding-linux-s390x-gnu": { - "version": "1.0.0-rc.11", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-1.0.0-rc.11.tgz", - "integrity": "sha512-hIOYmuT6ofM4K04XAZd3OzMySEO4K0/nc9+jmNcxNAxRi6c5UWpqfw3KMFV4MVFWL+jQsSh+bGw2VqmaPMTLyw==", - "dev": true, - "optional": true - }, - "@rolldown/binding-linux-x64-gnu": { - "version": "1.0.0-rc.11", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.0.0-rc.11.tgz", - "integrity": "sha512-qXBQQO9OvkjjQPLdUVr7Nr2t3QTZI7s4KZtfw7HzBgjbmAPSFwSv4rmET9lLSgq3rH/ndA3ngv3Qb8l2njoPNA==", - "dev": true, - "optional": true - }, - "@rolldown/binding-linux-x64-musl": { - "version": "1.0.0-rc.11", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-musl/-/binding-linux-x64-musl-1.0.0-rc.11.tgz", - "integrity": "sha512-/tpFfoSTzUkH9LPY+cYbqZBDyyX62w5fICq9qzsHLL8uTI6BHip3Q9Uzft0wylk/i8OOwKik8OxW+QAhDmzwmg==", - "dev": true, - "optional": true - }, - "@rolldown/binding-openharmony-arm64": { - "version": "1.0.0-rc.11", - "resolved": "https://registry.npmjs.org/@rolldown/binding-openharmony-arm64/-/binding-openharmony-arm64-1.0.0-rc.11.tgz", - "integrity": "sha512-mcp3Rio2w72IvdZG0oQ4bM2c2oumtwHfUfKncUM6zGgz0KgPz4YmDPQfnXEiY5t3+KD/i8HG2rOB/LxdmieK2g==", - "dev": true, - "optional": true - }, - "@rolldown/binding-wasm32-wasi": { - "version": "1.0.0-rc.11", - "resolved": "https://registry.npmjs.org/@rolldown/binding-wasm32-wasi/-/binding-wasm32-wasi-1.0.0-rc.11.tgz", - "integrity": "sha512-LXk5Hii1Ph9asuGRjBuz8TUxdc1lWzB7nyfdoRgI0WGPZKmCxvlKk8KfYysqtr4MfGElu/f/pEQRh8fcEgkrWw==", - "dev": true, - "optional": true, - "requires": { - "@napi-rs/wasm-runtime": "^1.1.1" - } - }, - "@rolldown/binding-win32-arm64-msvc": { - "version": "1.0.0-rc.11", - "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.0.0-rc.11.tgz", - "integrity": "sha512-dDwf5otnx0XgRY1yqxOC4ITizcdzS/8cQ3goOWv3jFAo4F+xQYni+hnMuO6+LssHHdJW7+OCVL3CoU4ycnh35Q==", - "dev": true, - "optional": true - }, - "@rolldown/binding-win32-x64-msvc": { - "version": "1.0.0-rc.11", - "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.0.0-rc.11.tgz", - "integrity": "sha512-LN4/skhSggybX71ews7dAj6r2geaMJfm3kMbK2KhFMg9B10AZXnKoLCVVgzhMHL0S+aKtr4p8QbAW8k+w95bAA==", - "dev": true, - "optional": true - }, - "@rolldown/pluginutils": { - "version": "1.0.0-rc.7", - "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-rc.7.tgz", - "integrity": "sha512-qujRfC8sFVInYSPPMLQByRh7zhwkGFS4+tyMQ83srV1qrxL4g8E2tyxVVyxd0+8QeBM1mIk9KbWxkegRr76XzA==", - "dev": true - }, - "@tybys/wasm-util": { - "version": "0.10.1", - "resolved": "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.10.1.tgz", - "integrity": "sha512-9tTaPJLSiejZKx+Bmog4uSubteqTvFrVrURwkmHixBo0G4seD0zUxp98E1DzUBJxLQ3NPwXrGKDiVjwx/DpPsg==", - "dev": true, - "optional": true, - "requires": { - "tslib": "^2.4.0" - } - }, - "@vitejs/plugin-react": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-6.0.1.tgz", - "integrity": "sha512-l9X/E3cDb+xY3SWzlG1MOGt2usfEHGMNIaegaUGFsLkb3RCn/k8/TOXBcab+OndDI4TBtktT8/9BwwW8Vi9KUQ==", - "dev": true, - "requires": { - "@rolldown/pluginutils": "1.0.0-rc.7" - } - }, - "ace-builds": { - "version": "1.43.6", - "resolved": "https://registry.npmjs.org/ace-builds/-/ace-builds-1.43.6.tgz", - "integrity": "sha512-L1ddibQ7F3vyXR2k2fg+I8TQTPWVA6CKeDQr/h2+8CeyTp3W6EQL8xNFZRTztuP8xNOAqL3IYPqdzs31GCjDvg==" - }, - "bootstrap": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/bootstrap/-/bootstrap-4.6.2.tgz", - "integrity": "sha512-51Bbp/Uxr9aTuy6ca/8FbFloBUJZLHwnhTcnjIeRn2suQWsWzcuJhGjKDB5eppVte/8oCdOL3VuwxvZDUggwGQ==", - "requires": {} - }, - "classnames": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/classnames/-/classnames-2.3.1.tgz", - "integrity": "sha512-OlQdbZ7gLfGarSqxesMesDa5uz7KFbID8Kpq/SxIoNGDqY8lSYs0D+hhtBXhcdB3rcbXArFr7vlHheLk1voeNA==" - }, - "cookie": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-1.1.1.tgz", - "integrity": "sha512-ei8Aos7ja0weRpFzJnEA9UHJ/7XQmqglbRwnf2ATjcB9Wq874VKH9kfjjirM6UhU2/E5fFYadylyhFldcqSidQ==" - }, - "csstype": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz", - "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==" - }, - "detect-libc": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz", - "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==", - "dev": true - }, - "diff-match-patch": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/diff-match-patch/-/diff-match-patch-1.0.5.tgz", - "integrity": "sha512-IayShXAgj/QMXgB0IWmKx+rOPuGMhqm5w6jvFxmVenXKIzRqTAAsbBPT3kWQeGANj3jGgvcvv4yK6SxqYmikgw==" - }, - "dom-helpers": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/dom-helpers/-/dom-helpers-5.2.1.tgz", - "integrity": "sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA==", - "requires": { - "@babel/runtime": "^7.8.7", - "csstype": "^3.0.2" - } - }, - "fsevents": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", - "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", - "dev": true, - "optional": true - }, - "jquery": { - "version": "3.6.1", - "resolved": "https://registry.npmjs.org/jquery/-/jquery-3.6.1.tgz", - "integrity": "sha512-opJeO4nCucVnsjiXOE+/PcCgYw9Gwpvs/a6B1LL/lQhwWwpbVEVYDZ1FokFr8PRc7ghYlrFPuyHuiiDNTQxmcw==", - "peer": true - }, - "js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" - }, - "lightningcss": { - "version": "1.32.0", - "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.32.0.tgz", - "integrity": "sha512-NXYBzinNrblfraPGyrbPoD19C1h9lfI/1mzgWYvXUTe414Gz/X1FD2XBZSZM7rRTrMA8JL3OtAaGifrIKhQ5yQ==", - "dev": true, - "requires": { - "detect-libc": "^2.0.3", - "lightningcss-android-arm64": "1.32.0", - "lightningcss-darwin-arm64": "1.32.0", - "lightningcss-darwin-x64": "1.32.0", - "lightningcss-freebsd-x64": "1.32.0", - "lightningcss-linux-arm-gnueabihf": "1.32.0", - "lightningcss-linux-arm64-gnu": "1.32.0", - "lightningcss-linux-arm64-musl": "1.32.0", - "lightningcss-linux-x64-gnu": "1.32.0", - "lightningcss-linux-x64-musl": "1.32.0", - "lightningcss-win32-arm64-msvc": "1.32.0", - "lightningcss-win32-x64-msvc": "1.32.0" + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" } }, - "lightningcss-android-arm64": { - "version": "1.32.0", - "resolved": "https://registry.npmjs.org/lightningcss-android-arm64/-/lightningcss-android-arm64-1.32.0.tgz", - "integrity": "sha512-YK7/ClTt4kAK0vo6w3X+Pnm0D2cf2vPHbhOXdoNti1Ga0al1P4TBZhwjATvjNwLEBCnKvjJc2jQgHXH0NEwlAg==", - "dev": true, - "optional": true - }, - "lightningcss-darwin-arm64": { - "version": "1.32.0", - "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.32.0.tgz", - "integrity": "sha512-RzeG9Ju5bag2Bv1/lwlVJvBE3q6TtXskdZLLCyfg5pt+HLz9BqlICO7LZM7VHNTTn/5PRhHFBSjk5lc4cmscPQ==", - "dev": true, - "optional": true - }, - "lightningcss-darwin-x64": { - "version": "1.32.0", - "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.32.0.tgz", - "integrity": "sha512-U+QsBp2m/s2wqpUYT/6wnlagdZbtZdndSmut/NJqlCcMLTWp5muCrID+K5UJ6jqD2BFshejCYXniPDbNh73V8w==", - "dev": true, - "optional": true - }, - "lightningcss-freebsd-x64": { - "version": "1.32.0", - "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.32.0.tgz", - "integrity": "sha512-JCTigedEksZk3tHTTthnMdVfGf61Fky8Ji2E4YjUTEQX14xiy/lTzXnu1vwiZe3bYe0q+SpsSH/CTeDXK6WHig==", - "dev": true, - "optional": true - }, - "lightningcss-linux-arm-gnueabihf": { - "version": "1.32.0", - "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.32.0.tgz", - "integrity": "sha512-x6rnnpRa2GL0zQOkt6rts3YDPzduLpWvwAF6EMhXFVZXD4tPrBkEFqzGowzCsIWsPjqSK+tyNEODUBXeeVHSkw==", - "dev": true, - "optional": true - }, - "lightningcss-linux-arm64-gnu": { - "version": "1.32.0", - "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.32.0.tgz", - "integrity": "sha512-0nnMyoyOLRJXfbMOilaSRcLH3Jw5z9HDNGfT/gwCPgaDjnx0i8w7vBzFLFR1f6CMLKF8gVbebmkUN3fa/kQJpQ==", - "dev": true, - "optional": true - }, - "lightningcss-linux-arm64-musl": { - "version": "1.32.0", - "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.32.0.tgz", - "integrity": "sha512-UpQkoenr4UJEzgVIYpI80lDFvRmPVg6oqboNHfoH4CQIfNA+HOrZ7Mo7KZP02dC6LjghPQJeBsvXhJod/wnIBg==", - "dev": true, - "optional": true - }, - "lightningcss-linux-x64-gnu": { - "version": "1.32.0", - "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.32.0.tgz", - "integrity": "sha512-V7Qr52IhZmdKPVr+Vtw8o+WLsQJYCTd8loIfpDaMRWGUZfBOYEJeyJIkqGIDMZPwPx24pUMfwSxxI8phr/MbOA==", - "dev": true, - "optional": true - }, - "lightningcss-linux-x64-musl": { - "version": "1.32.0", - "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.32.0.tgz", - "integrity": "sha512-bYcLp+Vb0awsiXg/80uCRezCYHNg1/l3mt0gzHnWV9XP1W5sKa5/TCdGWaR/zBM2PeF/HbsQv/j2URNOiVuxWg==", - "dev": true, - "optional": true - }, - "lightningcss-win32-arm64-msvc": { - "version": "1.32.0", - "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.32.0.tgz", - "integrity": "sha512-8SbC8BR40pS6baCM8sbtYDSwEVQd4JlFTOlaD3gWGHfThTcABnNDBda6eTZeqbofalIJhFx0qKzgHJmcPTnGdw==", - "dev": true, - "optional": true - }, - "lightningcss-win32-x64-msvc": { - "version": "1.32.0", - "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.32.0.tgz", - "integrity": "sha512-Amq9B/SoZYdDi1kFrojnoqPLxYhQ4Wo5XiL8EVJrVsB8ARoC1PWW6VGtT0WKCemjy8aC+louJnjS7U18x3b06Q==", - "dev": true, - "optional": true - }, - "lodash.get": { - "version": "4.4.2", - "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz", - "integrity": "sha1-LRd/ZS+jHpObRDjVNBSZ36OCXpk=" - }, - "lodash.isequal": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz", - "integrity": "sha1-QVxEePK8wwEgwizhDtMib30+GOA=" - }, - "loose-envify": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", - "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", - "requires": { - "js-tokens": "^3.0.0 || ^4.0.0" + "node_modules/which-pm-runs": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/which-pm-runs/-/which-pm-runs-1.1.0.tgz", + "integrity": "sha512-n1brCuqClxfFfq/Rb0ICg9giSZqCS+pLtccdag6C2HyufBrh3fBOiy9nb6ggRMvWOVH5GrdJskj5iGTZNxd7SA==", + "license": "MIT", + "engines": { + "node": ">=4" } }, - "nanoid": { - "version": "3.3.11", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", - "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", - "dev": true - }, - "object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" - }, - "picocolors": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", - "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", - "dev": true - }, - "popper.js": { - "version": "1.16.1", - "resolved": "https://registry.npmjs.org/popper.js/-/popper.js-1.16.1.tgz", - "integrity": "sha512-Wb4p1J4zyFTbM+u6WuO4XstYx4Ky9Cewe4DWrel7B0w6VVICvPwdOpotjzcf6eD8TsckVnIMNONQyPIUFOUbCQ==", - "peer": true - }, - "prop-types": { - "version": "15.8.1", - "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", - "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", - "requires": { - "loose-envify": "^1.4.0", - "object-assign": "^4.1.1", - "react-is": "^16.13.1" - } - }, - "react": { - "version": "19.2.4", - "resolved": "https://registry.npmjs.org/react/-/react-19.2.4.tgz", - "integrity": "sha512-9nfp2hYpCwOjAN+8TZFGhtWEwgvWHXqESH8qT89AT/lWklpLON22Lc8pEtnpsZz7VmawabSU0gCjnj8aC0euHQ==" - }, - "react-ace": { - "version": "14.0.1", - "resolved": "https://registry.npmjs.org/react-ace/-/react-ace-14.0.1.tgz", - "integrity": "sha512-z6YAZ20PNf/FqmYEic//G/UK6uw0rn21g58ASgHJHl9rfE4nITQLqthr9rHMVQK4ezwohJbp2dGrZpkq979PYQ==", - "requires": { - "ace-builds": "^1.36.3", - "diff-match-patch": "^1.0.5", - "lodash.get": "^4.4.2", - "lodash.isequal": "^4.5.0", - "prop-types": "^15.8.1" - } - }, - "react-dom": { - "version": "19.2.4", - "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.2.4.tgz", - "integrity": "sha512-AXJdLo8kgMbimY95O2aKQqsz2iWi9jMgKJhRBAxECE4IFxfcazB2LmzloIoibJI3C12IlY20+KFaLv+71bUJeQ==", - "requires": { - "scheduler": "^0.27.0" - } - }, - "react-fast-compare": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/react-fast-compare/-/react-fast-compare-3.2.2.tgz", - "integrity": "sha512-nsO+KSNgo1SbJqJEYRE9ERzo7YtYbou/OqjSQKxV7jcKox7+usiUVZOAC+XnDOABXggQTno0Y1CpVnuWEc1boQ==" - }, - "react-icons": { - "version": "5.6.0", - "resolved": "https://registry.npmjs.org/react-icons/-/react-icons-5.6.0.tgz", - "integrity": "sha512-RH93p5ki6LfOiIt0UtDyNg/cee+HLVR6cHHtW3wALfo+eOHTp8RnU2kRkI6E+H19zMIs03DyxUG/GfZMOGvmiA==", - "requires": {} - }, - "react-is": { - "version": "16.13.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", - "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" - }, - "react-router": { - "version": "7.13.2", - "resolved": "https://registry.npmjs.org/react-router/-/react-router-7.13.2.tgz", - "integrity": "sha512-tX1Aee+ArlKQP+NIUd7SE6Li+CiGKwQtbS+FfRxPX6Pe4vHOo6nr9d++u5cwg+Z8K/x8tP+7qLmujDtfrAoUJA==", - "requires": { - "cookie": "^1.0.1", - "set-cookie-parser": "^2.6.0" - } - }, - "react-router-dom": { - "version": "7.13.2", - "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-7.13.2.tgz", - "integrity": "sha512-aR7SUORwTqAW0JDeiWF07e9SBE9qGpByR9I8kJT5h/FrBKxPMS6TiC7rmVO+gC0q52Bx7JnjWe8Z1sR9faN4YA==", - "requires": { - "react-router": "7.13.2" - } - }, - "react-spinners": { - "version": "0.17.0", - "resolved": "https://registry.npmjs.org/react-spinners/-/react-spinners-0.17.0.tgz", - "integrity": "sha512-L/8HTylaBmIWwQzIjMq+0vyaRXuoAevzWoD35wKpNTxxtYXWZp+xtgkfD7Y4WItuX0YvdxMPU79+7VhhmbmuTQ==", - "requires": {} - }, - "react-transition-group": { - "version": "4.4.5", - "resolved": "https://registry.npmjs.org/react-transition-group/-/react-transition-group-4.4.5.tgz", - "integrity": "sha512-pZcd1MCJoiKiBR2NRxeCRg13uCXbydPnmB4EOeRrY7480qNWO8IIgQG6zlDkm6uRMsURXPuKq0GWtiM59a5Q6g==", - "requires": { - "@babel/runtime": "^7.5.5", - "dom-helpers": "^5.0.1", - "loose-envify": "^1.4.0", - "prop-types": "^15.6.2" - } - }, - "reactstrap": { - "version": "9.2.3", - "resolved": "https://registry.npmjs.org/reactstrap/-/reactstrap-9.2.3.tgz", - "integrity": "sha512-1nXy7FIBIoOgXr3AIHOpgzcZXdj6rZE5YvNSPd1hYgwv8X64m6TAJsU0ExlieJdlRXhaRfTYRSZoTWa127b0gw==", - "requires": { - "@babel/runtime": "^7.12.5", - "@popperjs/core": "^2.6.0", - "classnames": "^2.2.3", - "prop-types": "^15.5.8", - "react-popper": "^2.2.4", - "react-transition-group": "^4.4.2" - }, - "dependencies": { - "react-popper": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/react-popper/-/react-popper-2.3.0.tgz", - "integrity": "sha512-e1hj8lL3uM+sgSR4Lxzn5h1GxBlpa4CQz0XLF8kx4MDrDRWY0Ena4c97PUeSX9i5W3UAfDP0z0FXCTQkoXUl3Q==", - "requires": { - "react-fast-compare": "^3.0.1", - "warning": "^4.0.2" - } - } - } + "node_modules/xxhash-wasm": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/xxhash-wasm/-/xxhash-wasm-1.1.0.tgz", + "integrity": "sha512-147y/6YNh+tlp6nd/2pWq38i9h6mz/EuQ6njIrmW8D1BS5nCqs0P6DG+m6zTGnNz5I+uhZ0SHxBs9BsPrwcKDA==", + "license": "MIT" }, - "regenerator-runtime": { - "version": "0.13.11", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz", - "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==" - }, - "rolldown": { - "version": "1.0.0-rc.11", - "resolved": "https://registry.npmjs.org/rolldown/-/rolldown-1.0.0-rc.11.tgz", - "integrity": "sha512-NRjoKMusSjfRbSYiH3VSumlkgFe7kYAa3pzVOsVYVFY3zb5d7nS+a3KGQ7hJKXuYWbzJKPVQ9Wxq2UvyK+ENpw==", - "dev": true, - "requires": { - "@oxc-project/types": "=0.122.0", - "@rolldown/binding-android-arm64": "1.0.0-rc.11", - "@rolldown/binding-darwin-arm64": "1.0.0-rc.11", - "@rolldown/binding-darwin-x64": "1.0.0-rc.11", - "@rolldown/binding-freebsd-x64": "1.0.0-rc.11", - "@rolldown/binding-linux-arm-gnueabihf": "1.0.0-rc.11", - "@rolldown/binding-linux-arm64-gnu": "1.0.0-rc.11", - "@rolldown/binding-linux-arm64-musl": "1.0.0-rc.11", - "@rolldown/binding-linux-ppc64-gnu": "1.0.0-rc.11", - "@rolldown/binding-linux-s390x-gnu": "1.0.0-rc.11", - "@rolldown/binding-linux-x64-gnu": "1.0.0-rc.11", - "@rolldown/binding-linux-x64-musl": "1.0.0-rc.11", - "@rolldown/binding-openharmony-arm64": "1.0.0-rc.11", - "@rolldown/binding-wasm32-wasi": "1.0.0-rc.11", - "@rolldown/binding-win32-arm64-msvc": "1.0.0-rc.11", - "@rolldown/binding-win32-x64-msvc": "1.0.0-rc.11", - "@rolldown/pluginutils": "1.0.0-rc.11" - }, - "dependencies": { - "@rolldown/pluginutils": { - "version": "1.0.0-rc.11", - "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-rc.11.tgz", - "integrity": "sha512-xQO9vbwBecJRv9EUcQ/y0dzSTJgA7Q6UVN7xp6B81+tBGSLVAK03yJ9NkJaUA7JFD91kbjxRSC/mDnmvXzbHoQ==", - "dev": true - } + "node_modules/yargs-parser": { + "version": "22.0.0", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-22.0.0.tgz", + "integrity": "sha512-rwu/ClNdSMpkSrUb+d6BRsSkLUq1fmfsY6TOpYzTwvwkg1/NRG85KBy3kq++A8LKQwX6lsu+aWad+2khvuXrqw==", + "license": "ISC", + "engines": { + "node": "^20.19.0 || ^22.12.0 || >=23" } }, - "scheduler": { - "version": "0.27.0", - "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.27.0.tgz", - "integrity": "sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q==" - }, - "set-cookie-parser": { - "version": "2.7.2", - "resolved": "https://registry.npmjs.org/set-cookie-parser/-/set-cookie-parser-2.7.2.tgz", - "integrity": "sha512-oeM1lpU/UvhTxw+g3cIfxXHyJRc/uidd3yK1P242gzHds0udQBYzs3y8j4gCCW+ZJ7ad0yctld8RYO+bdurlvw==" - }, - "source-map-js": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", - "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", - "dev": true - }, - "tinyglobby": { - "version": "0.2.15", - "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.15.tgz", - "integrity": "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==", - "dev": true, - "requires": { - "fdir": "^6.5.0", - "picomatch": "^4.0.3" + "node_modules/yocto-queue": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.2.2.tgz", + "integrity": "sha512-4LCcse/U2MHZ63HAJVE+v71o7yOdIe4cZ70Wpf8D/IyjDKYQLV5GD46B+hSTjJsvV5PztjvHoU580EftxjDZFQ==", + "license": "MIT", + "engines": { + "node": ">=12.20" }, - "dependencies": { - "fdir": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", - "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", - "dev": true, - "requires": {} - }, - "picomatch": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz", - "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==", - "dev": true - } + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "tslib": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", - "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==", - "dev": true, - "optional": true - }, - "vite": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/vite/-/vite-8.0.2.tgz", - "integrity": "sha512-1gFhNi+bHhRE/qKZOJXACm6tX4bA3Isy9KuKF15AgSRuRazNBOJfdDemPBU16/mpMxApDPrWvZ08DcLPEoRnuA==", - "dev": true, - "requires": { - "fsevents": "~2.3.3", - "lightningcss": "^1.32.0", - "picomatch": "^4.0.3", - "postcss": "^8.5.8", - "rolldown": "1.0.0-rc.11", - "tinyglobby": "^0.2.15" - }, - "dependencies": { - "picomatch": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz", - "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==", - "dev": true - }, - "postcss": { - "version": "8.5.8", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.8.tgz", - "integrity": "sha512-OW/rX8O/jXnm82Ey1k44pObPtdblfiuWnrd8X7GJ7emImCOstunGbXUpp7HdBrFQX6rJzn3sPT397Wp5aCwCHg==", - "dev": true, - "requires": { - "nanoid": "^3.3.11", - "picocolors": "^1.1.1", - "source-map-js": "^1.2.1" - } - } + "node_modules/zod": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/zod/-/zod-4.4.3.tgz", + "integrity": "sha512-ytENFjIJFl2UwYglde2jchW2Hwm4GJFLDiSXWdTrJQBIN9Fcyp7n4DhxJEiWNAJMV1/BqWfW/kkg71UDcHJyTQ==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/colinhacks" } }, - "warning": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/warning/-/warning-4.0.3.tgz", - "integrity": "sha512-rpJyN222KWIvHJ/F53XSZv0Zl/accqHR8et1kpaMTD/fLCRxtV8iX8czMzY7sVZupTI3zcUTg8eycS2kNF9l6w==", - "requires": { - "loose-envify": "^1.0.0" + "node_modules/zwitch": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/zwitch/-/zwitch-2.0.4.tgz", + "integrity": "sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" } } } diff --git a/package.json b/package.json index 5cd9cb0..2e44a87 100644 --- a/package.json +++ b/package.json @@ -1,25 +1,14 @@ { "name": "web", - "version": "0.1.0", + "version": "0.2.0", "private": true, "dependencies": { - "bootstrap": "^4.6.2", - "react": "^19.2.4", - "react-ace": "^14.0.1", - "react-dom": "^19.2.4", - "react-icons": "^5.6.0", - "react-router": "^7.13.2", - "react-router-dom": "^7.13.2", - "react-spinners": "^0.17.0", - "reactstrap": "^9.2.3" + "astro": "^7.0.3", + "bootstrap": "^4.6.2" }, "scripts": { - "dev": "vite", - "build": "vite build", - "preview": "vite preview" - }, - "devDependencies": { - "@vitejs/plugin-react": "^6.0.1", - "vite": "^8.0.2" + "dev": "astro dev --port 3000 --host 0.0.0.0", + "build": "astro build", + "preview": "astro preview" } } diff --git a/src/gif/autoComplete.png b/public/gif/autoComplete.png similarity index 100% rename from src/gif/autoComplete.png rename to public/gif/autoComplete.png diff --git a/src/gif/codelens.png b/public/gif/codelens.png similarity index 100% rename from src/gif/codelens.png rename to public/gif/codelens.png diff --git a/src/gif/hover.png b/public/gif/hover.png similarity index 100% rename from src/gif/hover.png rename to public/gif/hover.png diff --git a/src/gif/inlineDiagnostics.png b/public/gif/inlineDiagnostics.png similarity index 100% rename from src/gif/inlineDiagnostics.png rename to public/gif/inlineDiagnostics.png diff --git a/src/gif/install.png b/public/gif/install.png similarity index 100% rename from src/gif/install.png rename to public/gif/install.png diff --git a/src/gif/quickfix.png b/public/gif/quickfix.png similarity index 100% rename from src/gif/quickfix.png rename to public/gif/quickfix.png diff --git a/src/gif/rename.png b/public/gif/rename.png similarity index 100% rename from src/gif/rename.png rename to public/gif/rename.png diff --git a/src/gif/snippetComplete.png b/public/gif/snippetComplete.png similarity index 100% rename from src/gif/snippetComplete.png rename to public/gif/snippetComplete.png diff --git a/src/App.jsx b/src/App.jsx deleted file mode 100644 index 277705e..0000000 --- a/src/App.jsx +++ /dev/null @@ -1,79 +0,0 @@ -import './App.css'; - -import Home from "./page/Home"; -import GetStarted from "./page/GetStarted"; -import VSCode from "./page/VSCode"; -import Documentation from "./page/Documentation"; -import Principles from "./page/Principles"; -import Contribute from "./page/Contribute"; -import Faq from "./page/Faq"; -import { Container, Navbar, Nav, NavItem, NavLink, Row } from 'reactstrap'; -import { Route, Routes } from "react-router"; -import { Link } from "react-router-dom"; - -import Blog from "./page/Blog"; -import Internships from "./page/Internships"; - -function App() { - return ( - - - - - - - } /> - } /> - } /> - } /> - } /> - } /> - } /> - } /> - } /> - - - - - - ); -} - -export default App; diff --git a/src/components/Badge.astro b/src/components/Badge.astro new file mode 100644 index 0000000..3232622 --- /dev/null +++ b/src/components/Badge.astro @@ -0,0 +1,7 @@ +--- + +--- + +
+ +
diff --git a/src/components/FAQ/Answer.astro b/src/components/FAQ/Answer.astro new file mode 100644 index 0000000..83d7622 --- /dev/null +++ b/src/components/FAQ/Answer.astro @@ -0,0 +1,5 @@ +--- + +--- + +
diff --git a/src/components/FAQ/QA.astro b/src/components/FAQ/QA.astro new file mode 100644 index 0000000..50c63a9 --- /dev/null +++ b/src/components/FAQ/QA.astro @@ -0,0 +1,9 @@ +--- + +--- + +
+
+ +
+
diff --git a/src/components/FAQ/Question.astro b/src/components/FAQ/Question.astro new file mode 100644 index 0000000..80bd2ed --- /dev/null +++ b/src/components/FAQ/Question.astro @@ -0,0 +1,5 @@ +--- + +--- + +
diff --git a/src/components/InlineEditor.astro b/src/components/InlineEditor.astro new file mode 100644 index 0000000..5d2c453 --- /dev/null +++ b/src/components/InlineEditor.astro @@ -0,0 +1,152 @@ +--- +import { Code } from "astro:components"; +const { code } = Astro.props; + +// TODO write a proper TextMate grammar and contribute upstream +// (this one has been vibe-converted from react-ace) +const flixGrammar = { + name: "Flix", + scopeName: "source.flix", + fileTypes: [".flix"], + patterns: [ + { include: "#comments" }, + { include: "#strings" }, + { include: "#regex" }, + { include: "#chars" }, + { include: "#numbers" }, + { include: "#keywords" }, + { include: "#operators" }, + { include: "#brackets" }, + ], + repository: { + comments: { + patterns: [ + { name: "comment.line.double-slash.flix", match: "//.*$" }, + { + name: "comment.block.flix", + begin: "/\\*", + end: "\\*/", + }, + ], + }, + strings: { + patterns: [ + { + name: "string.quoted.double.flix", + begin: '"', + end: '"', + patterns: [ + { + name: "constant.character.escape.flix", + match: "\\\\(u[0-9a-fA-F]{4}|.)", + }, + ], + }, + ], + }, + regex: { + patterns: [ + { + name: "string.regexp.flix", + begin: 'regex"', + end: '"', + patterns: [ + { + name: "constant.character.escape.flix", + match: "\\\\(u[0-9a-fA-F]{4}|.)", + }, + ], + }, + ], + }, + chars: { + patterns: [ + { + name: "string.quoted.single.flix", + begin: "'", + end: "'", + patterns: [ + { + name: "constant.character.escape.flix", + match: "\\\\(u[0-9a-fA-F]{4}|.)", + }, + ], + }, + ], + }, + numbers: { + patterns: [ + { + name: "constant.numeric.hex.flix", + match: "\\b0x[a-fA-F0-9](_*[a-fA-F0-9])*(i8|i16|i32|i64|ii)?\\b", + }, + { + name: "constant.numeric.float.flix", + match: "\\b[0-9](_*[0-9])*\\.[0-9](_*[0-9])*(f32|f64)?\\b", + }, + { + name: "constant.numeric.integer.flix", + match: "\\b[0-9](_*[0-9])*(i8|i16|i32|i64|ii)?\\b", + }, + { name: "constant.language.boolean.flix", match: "\\b(true|false)\\b" }, + { name: "constant.language.null.flix", match: "\\bnull\\b" }, + ], + }, + keywords: { + patterns: [ + { + name: "keyword.control.flix", + match: + "\\b(choose|forA|forM|foreach|yield|if|else|case|match|ematch|try|catch|throw|spawn|par)\\b", + }, + { + name: "keyword.flix", + match: + "\\b(use|checked_cast|checked_ecast|unchecked_cast|as|discard|from|into|inject|project|solve|query|where|select|force|import|region|handler|instanceof|new|pquery|psolve|run|super)\\b", + }, + { + name: "storage.type.flix", + match: + "\\b(eff|def|redef|law|enum|case|type|alias|trait|instance|mod|struct|let)\\b", + }, + { + name: "storage.modifier.flix", + match: + "\\b(with|lazy|lawful|pub|override|sealed|static|mut|unsafe)\\b", + }, + { + name: "support.type.primitive.flix", + match: + "\\b(Unit|Bool|Char|Float32|Float64|Int8|Int16|Int32|Int64|BigInt|String)\\b", + }, + { name: "keyword.operator.flix", match: "\\b(not|and|or|fix)\\b" }, + { + name: "storage.modifier.annotation.flix", + match: + "@(Deprecated|Experimental|Internal|ParallelWhenPure|Parallel|LazyWhenPure|Lazy|Skip|Test)\\b", + }, + { name: "keyword.flix", match: "(\\?\\?\\?|\\?[a-zA-Z0-9]+)" }, + ], + }, + operators: { + patterns: [{ name: "keyword.operator.flix", match: "->|~>|<\\-|=>" }], + }, + brackets: { + patterns: [ + { name: "punctuation.section.parens.begin.flix", match: "\\(" }, + { name: "punctuation.section.parens.end.flix", match: "\\)" }, + { name: "punctuation.section.brackets.begin.flix", match: "\\[" }, + { name: "punctuation.section.brackets.end.flix", match: "\\]" }, + { name: "punctuation.section.braces.begin.flix", match: "\\{" }, + { name: "punctuation.section.braces.end.flix", match: "\\}" }, + ], + }, + }, +}; +--- + +
+
+ +
+
diff --git a/src/components/Principle.astro b/src/components/Principle.astro new file mode 100644 index 0000000..d0bb9de --- /dev/null +++ b/src/components/Principle.astro @@ -0,0 +1,10 @@ +--- +const { name } = Astro.props; +--- + +
+
+
{name}
+ +
+
diff --git a/src/index.jsx b/src/index.jsx deleted file mode 100644 index b9d75f4..0000000 --- a/src/index.jsx +++ /dev/null @@ -1,11 +0,0 @@ -import 'bootstrap/dist/css/bootstrap.min.css'; -import { createRoot } from 'react-dom/client'; -import App from './App'; -import { BrowserRouter } from 'react-router-dom'; - -const root = createRoot(document.getElementById('root')); -root.render( - - - -); diff --git a/src/layouts/Layout.astro b/src/layouts/Layout.astro new file mode 100644 index 0000000..78ab5f4 --- /dev/null +++ b/src/layouts/Layout.astro @@ -0,0 +1,57 @@ +--- +import 'bootstrap/dist/css/bootstrap.min.css'; + +const { title } = Astro.props; +const currentPath = Astro.url.pathname; + +const navLinks = [ + { href: "/", label: "Home" }, + { href: "/get-started/", label: "Get Started" }, + { href: "/vscode/", label: "VSCode" }, + { href: "/principles/", label: "Principles" }, + { href: "/documentation/", label: "Documentation" }, + { href: "/faq/", label: "FAQ" }, + { href: "/blog/", label: "Blog" }, + { href: "/contribute/", label: "Contribute" }, + { href: "/internships/", label: "Internships" }, +]; +--- + + + + + + {title} + + + + + + + Fork me on GitHub + +
+ + + +
+ + + + diff --git a/src/page/Blog.jsx b/src/page/Blog.jsx deleted file mode 100644 index 35c00ad..0000000 --- a/src/page/Blog.jsx +++ /dev/null @@ -1,26 +0,0 @@ -import { useEffect } from 'react'; -import {Col, Container, Row} from "reactstrap"; - -function Blog() { - useEffect(() => { - document.title = "Flix | Blog"; - }, []); - - return ( - - - -

Blog

- - The Flix Blog is now available at:
- -
-

https://blog.flix.dev/

-
- -
-
- ); -} - -export default Blog; diff --git a/src/page/Contribute.jsx b/src/page/Contribute.jsx deleted file mode 100644 index a3501f8..0000000 --- a/src/page/Contribute.jsx +++ /dev/null @@ -1,90 +0,0 @@ -import { useEffect } from 'react'; -import {Card, CardBody, CardTitle, Col, Container, Row} from "reactstrap"; - -function Contribute() { - useEffect(() => { - document.title = "Flix | Contribute"; - }, []); - - return ( - - - - -

Contribute

- -

- Flix is developed at Aarhus - University, at the University of Waterloo, and by - a community of open source - contributors. -

- -

- Flix is open-source and freely available under the Apache 2.0 license. -

- -

- All source code is available on GitHub. - - We organize development using GitHub issues and Zulip. -

- -

- If you are interested working on Flix, please feel free to reach out to us. -

- -
- -

Projects

- - - - - - Open Source Mentoring -

- We are more than happy to mentor someone who is interested in working on compilers - and/or programming language design and wants to contribute to Flix. We have already - had several positive experiences working with open source - contributors. -

-
-
- - - - - - Talent Track Projects -

- Aarhus University offers a talent track program for capable students that are in - their second or third year of studies and are interested in working on a research - project for up to one year as an extracurricular activity. -

-
-
- - - - - - Bachelor and Master Projects -

- If you are a bachelor or master student at Aarhus University you can - write your thesis on a topic related to Flix. -

-
-
- -
-
- ); -} - -export default Contribute; diff --git a/src/page/Documentation.jsx b/src/page/Documentation.jsx deleted file mode 100644 index bc72254..0000000 --- a/src/page/Documentation.jsx +++ /dev/null @@ -1,155 +0,0 @@ -import { useEffect } from 'react'; -import {Card, CardSubtitle, CardText, CardTitle, Col, Container, Row} from "reactstrap"; -import {Link} from "react-router-dom"; - -import {FaBookReader} from 'react-icons/fa'; -import {FaStream} from 'react-icons/fa'; -import {FaMicroblog} from 'react-icons/fa'; -import {SiZulip} from 'react-icons/si'; -import {FaGithub} from 'react-icons/fa'; -import {FaTwitter} from 'react-icons/fa'; -import {GoGraph} from 'react-icons/go'; -import {MdSchool} from 'react-icons/md'; - -function Documentation() { - useEffect(() => { - document.title = "Flix | Documentation"; - }, []); - - return ( - - - -

Documentation

- -
- - - - - - - - - - - - Programming Flix (doc.flix.dev) - - - - A detailed introduction to the Flix Programming Language. - - - - - - - - - - - - - Standard Library (api.flix.dev) - - - - A Javadoc-style description of the Flix Standard Library. - - - - - - - -

- You may also be interested in these additional resources: -

- -
- - - - - - - - - - Research - - - - - - - - - - - - - Blog - - - - - - - - - - - - - Zulip - - - - - - - - - - - - - GitHub - - - - - - - - - - - - - Twitter - - - - - - - - - - - - - Perf - - - - - -
- ); -} - -export default Documentation; diff --git a/src/page/Faq.jsx b/src/page/Faq.jsx deleted file mode 100644 index 5a135e8..0000000 --- a/src/page/Faq.jsx +++ /dev/null @@ -1,500 +0,0 @@ -import { useEffect } from 'react'; -import {Card, CardBody, CardTitle} from 'reactstrap'; -import {Container} from 'reactstrap'; -import {Link} from "react-router-dom"; - -function Faq() { - useEffect(() => { - document.title = "Flix | FAQ"; - }, []); - - return ( - -

Frequently Asked Questions

- -

- A collection of information that did not seem to fit in anywhere else. -

- - - - What is the best way to start learning Flix? - - -

- We recommend to read the Programming Flix book. -

- -

- If you get stuck or need help feel free to reach out to - us on Zulip. -

-
-
- - - - Does Flix have Language Server Protocol (LSP) support? - - - Yes, in addition to Visual Studio Code support, Flix also has generic LSP support. - - - - - - Does Flix have a read-eval-print-loop (REPL)? - - - - Flix has a nascent REPL. It can be started with the repl command. - - - - - - Are you looking for help with the compiler or language design? - - - Yes! We welcome any contributions and we are happy to mentor someone who wants to work - on the compiler. We are also open to general feedback and discussion about the language - design. Head on over to GitHub or Zulip and reach out to us! - - - - - - Does Flix compile to LLVM? - - - No and we don't have any plans to target LLVM. - - - - - - Does Flix compile to WebAssembly (WASM)? - - - Not yet. It is something we are open to. We are waiting for the WASM ecosystem to mature. - - - - - - Is Flix a domain specific language (DSL)? - - -

- No, Flix is a full-blown general-purpose programming language. -

-
-
- - - - Flix looks similar to Scala. How are the two languages related? - - -

- Flix borrows a lot of syntax from Scala, hence the two languages have a similar feel. -

-

- We think Scala made many good design choices with respect to syntax, including: -

- -
    -
  • the use of short keywords,
  • -
  • the x : T syntax for type annotations,
  • -
  • the List[Int32] syntax for type parameters, and
  • -
  • if, match, etc. as expressions.
  • -
- -

- However, other than syntax, the two languages are very different: -

- -
    -
  • Scala is object-oriented, Flix is not.
  • -
  • Scala has sub-typing, Flix does not.
  • -
  • Flix has an effect system, Scala does not.
  • -
  • And so on.
  • -
-
-
- - - - What is the runtime performance of Flix programs? - - -

- Flix runs on the JVM which means that the performance of Flix programs is comparable to that - of Java and Scala programs. -

- -

- Flix is a whole-program optimizing compiler that uses monomorphization and inlining (like - Rust and MLton). Hence, sometimes, Flix programs run faster than their Java or Scala - equivalent. -

-
-
- - - - Haskell and OCaml compile to native code thus by definition they must be faster than Flix. - - - This is not necessarily true. For example, Java sometimes beats both OCaml and Haskell in The Computer - Language Benchmarks Game. - - - - - - What controversial design choices are made in Flix? - - - - -

- The following design choices may be considered controversial by some: -

- -
    -
  • - Unused variables are compile-time errors. -
  • -
  • - Shadowed variables are compile-time errors. -
  • -
  • - Unused definitions, type declarations, etc. are compile-time errors. -
  • -
  • - No variadic or labelled function arguments. -
  • -
  • - No warnings, only compile-time errors. -
  • -
  • - Dividing by zero yields - zero. -
  • -
- -
-
- - - Wait, division by zero is zero, really? - - - Yes. But focusing on this is a bit like focusing on the color of the seats in a spacecraft. - - - - - - Where does the "Flix" name come from? - - - We do not remember, but we believe it may have come from FIXpoint Language. - - - - - - Does Flix have a network library with streaming support? - - - Not yet, but maybe we could call it net-flix? - - - - - - You do not seem to understand parsing / type theory / code generation / computers! - - - We are always happy to learn! We are ready to discuss design choices made in Flix. - Swing by Zulip or on GitHub. - - - - - - Why does the website require JavaScript? - - - We built the website using the popular React framework. - Using React was easy. - Ultimately, we want to spend our time writing compilers, not writing websites. - - - - - - The page does not load without JavaScript enabled. If I cannot even view the website without - that bloat, I wonder what the language is like? - - - Indeed, if your computer is too old to run a modern browser that supports JavaScript then - probably your computer is too old to run a modern JVM that supports Flix. Sorry. - - - - - "This site requires JavaScript" - -

- People who have criticized the website for using JavaScript: [1], [2], [3], [4], [5]. -

- -

- People who have offered to help refactor the site to use static html: 0. -

-
-
- - - - It appears that an example on the website does not work? - - -

- The latest compiler version and the website are not always in sync, hence occasionally some - examples may stop to work. -

- -

- Occasionally a mischievous visitor will crash the online editor (or rather the virtual - machine on which the compiler runs). -

-
-
- - - - The language is probably great from a technical point of view, but unless Apple, Google, - Mozilla, or Microsoft is on-board it is pointless. - - -

- Yes, no programming language developed outside of those four corporations have ever been - successful. See also C, C++, Java, Python, PHP, MatLab, Perl, R, Ruby, Scala, ... -

- -

- That said, if you work for a company and would like to help sponsor Flix, please feel free - to reach out to us :) -

-
-
- - - - Why is it that all the "big-brain" programming language ideas seems to happen in weird new - functional programming languages? Are they just a better petri dish for experimenting - with weird shit? I assume that all of this gets funding because ten years later it makes C# - programmers more productive, not because of mass appeal. - - -

- Yes, we do it all for C#. -

-
-
- - - - "Flix is inspired by OCaml and Haskell with ideas from Rust and Scala". - Inspirations and ideas from four of the arguably most complex languages of the modern world, all - the best with that. - - -

- Yes, we take inspiration from programming languages that are pushing on the boundary of - language design. -

- -

- What would be the point of taking ideas from C, Perl, PHP, and Visual Basic? -

- -

- Also, who said that we are taking their most complex ideas? Rather we should take - their best ideas. -

-
-
- - - - Wow! Amazing! A language where you can iterate through lists and call functions recursively. - - - Magical, isn't it? - - - - - - Great! Yet-another-programming-language™. This is exactly what we need; the gazillion of - existing programming languages is not enough. - - - Flix aims to offer a collection of features that are not found in any existing programming - language. - - - - - - Do we really need any more programming languages? - - -

- Do we really need safer airplanes? Do we really need electric cars? Do we - really need more ergonomic chairs? -

- -

- I mean, after all, we already have airplanes, cars, and chairs! -

- -

- We build new programming languages and we conduct research on programming language design - because we want to offer developers better tools to write programs. We want to make - it simpler, safer, and faster to write correct programs. -

- -

- And we want to increase developer happiness. It should be a pleasure to use Flix! -

-
-
- - - - This sounds like vaporware. All big promises and no delivery. - - - The research, - the code, - and the performance. - - - - - - I was disappointed to learn that Flix has feature X instead of my favorite - feature Y. - - - We are deeply sorry to have let you down. - - - - - - It boggles my mind that any developer of a new language would not use Python’s significant use - of white space. - - - Right, because significant whitespace poses no challenges or gotchas whatsoever. - - - - - - Interesting project but whoever decided "forM" is a good name for a language keyword should be - made to gurgle Tabasco sauce for a few minutes. - - -

- We much prefer Cholula Hot - Sauce. -

-

- That said, forM is clear, concise, and works well - with forA allowing one to easily switch - between monadic-code and applicative-code. -

-
-
- - - - How the fuck can anyone understand such weird syntax? I hate all these symbols. - - -

- The Flix syntax is based on keywords except when there is a - clearly established historical precedent for using a symbol. For example: -

- -
    -
  • The cons of an element x and a list xs is written as x - :: xs. -
  • -
  • The underscore _ denotes a wildcard (or an unused variable).
  • -
  • The symbol :- denotes logical implication in Datalog rules.
  • -
-
-
- - - - This is – by far – the worst syntax I have ever seen in a functional language. Semicolons, - braces, symbolic soup, et al. It is like if Scala, Java and Haskell had a one night stand in the - center of Chernobyl. - - - Quite an achievement, wouldn't you say? - - - - - - The examples all look horrible. The site looks horrible. This needs a lot of work before it - gets close to anything I would even consider using. - - - Sorry, what was the question? - - - -
- ); -} - -function Question({ children }) { - return {children}; -} - -function Answer({ children }) { - return
{children}
; -} - -function QA({ children }) { - return ( - - - {children} - - - ); -} - -export default Faq; diff --git a/src/page/GetStarted.jsx b/src/page/GetStarted.jsx deleted file mode 100644 index 43852d4..0000000 --- a/src/page/GetStarted.jsx +++ /dev/null @@ -1,37 +0,0 @@ -import { useEffect } from 'react'; -import {Card, CardImg, Col, Container, Row} from "reactstrap"; -import VSCode from '../gif/install.png' - -function GetStarted() { - useEffect(() => { - document.title = "Flix | Getting Started"; - }, []); - - return ( - -

Get Started

- - - -

- We recommend to use Flix from Visual Studio Code. In addition, Flix has an online playground and can be installed locally. -

- -
- - - -

Installing the Flix Visual Studio Code Extension

- - - - -
- -
- ); -} - -export default GetStarted; diff --git a/src/page/Home.jsx b/src/page/Home.jsx deleted file mode 100644 index be0d88a..0000000 --- a/src/page/Home.jsx +++ /dev/null @@ -1,1420 +0,0 @@ -import { useEffect } from 'react'; -import { - Card, - CardBody, - CardImg, - CardText, - CardTitle, - Col, - Container, - Row, - UncontrolledCarousel -} from 'reactstrap'; -import InlineEditor from "../util/InlineEditor"; - -const carousel = [ - { - src: '/images/vscode1.png', - caption: 'Slide 1', - header: 'Semantic Highlighting', - }, - { - src: '/images/vscode2.png', - caption: 'Slide 2', - header: 'Hover to Inspect', - }, - { - src: '/images/vscode3.png', - caption: 'Slide 3', - header: 'Highlight References', - }, - { - src: '/images/vscode4.png', - caption: 'Slide 4', - header: 'Inline Errors', - } -]; - -function Home() { - useEffect(() => { - document.title = "The Flix Programming Language"; - }, []); - - return ( - - - -

Flix —

- -

- A powerful effect-oriented programming language -

- -

- Flix is a principled effect-oriented functional, - imperative, and logic programming language developed at Aarhus University and by a community of open source contributors. -

- -

Why effect-oriented? And why Flix?

- -

- Why Effects? Effect systems represent the next major - evolution in statically typed programming languages. By explicitly modeling side effects, - effect-oriented programming enforces modularity and helps program reasoning. User-defined - effects and handlers allow programmers to implement their own control structures. -

- -

- Why Flix? We claim that of all the upcoming - effect-oriented programming languages, Flix offers the most complete language implementation, the most extensive standard library, the most detailed documentation, and the best tool support. -

- -

- Moreover, Flix builds on proven programming language technology, including: algebraic data types and pattern matching, extensible records, traits, higher-kinded types, associated types and effects, structured concurrency, - and more. -

- - - {`/// Demonstrates composing multiple HTTP middleware -/// via \`with\` clauses. Stacks base URL, default -/// headers, retry, circuit breaker, and logging. -/// Each \`with\` wraps the -/// preceding block. The \`Http\` and \`Logger\` effects -/// propagate to \`main\` and are handled automatically -/// via their default handlers. Relative paths are -/// resolved against the base URL; absolute URLs -/// bypass it. -def main(): Unit \\ { Clock, Http, Logger, IO } = - let defaultHeaders = Map#{ - "Accept" => List#{"application/json"}, - "Authorization" => List#{"Bearer tok123"} - }; - run { - let urls = List#{"/api/users", "/api/posts"}; - foreach (url <- urls) { - match Http.get(url) { - case Ok(res) => println("\${url} -> \${status(res)}") - case Err(err) => println("\${url} -> \${err}") - } - }; - match Http.get("https://notfound.flix.dev/") { - case Ok(res) => println("notfound -> \${status(res)}") - case Err(err) => println("notfound -> \${err}") - } - } with Http.withBaseUrl("https://flix.dev") - with Http.withDefaultHeaders(defaultHeaders) - with Http.withRetry( - Retry.linear(maxRetries = 2, delay = milliseconds(100))) - with Http.withCircuitBreaker( - failureThreshold = 3, cooldown = seconds(5)) - with Http.withLogging`} - -
- -
- - - - - -

Algebraic Data Types and Pattern Matching

- -

- Algebraic data types and pattern matching are the bread-and-butter of functional - programming and are supported by Flix with minimal fuss. -

-
-
-
- - - - - {`enum Shape { - case Circle(Int32), - case Square(Int32), - case Rectangle(Int32, Int32) -} - -def area(s: Shape): Int32 = match s { - case Circle(r) => 3 * (r * r) - case Square(w) => w * w - case Rectangle(h, w) => h * w -}`} - - -
- - - - - {`def origin(): (Int32, Int32) = (0, 0) - -def oneByOne(): {w = Int32, h = Int32} = {w = 1, h = 1} - -def twoByFour(): {w = Int32, h = Int32} = {w = 2, h = 4} - -def area(rect: {w = Int32, h = Int32 | r}): Int32 = - rect#w * rect#h - -def f(): Int32 = area({h = 1, color = "Blue", w = 2})`} - - - - - - -

Tuples and Records

- -

- Flix has built-in support for tuples and records. -

- -

- Records use structural typing and are extensible. -

-
-
-
- -
- - - - - -

Purity and Impurity

- -

- Flix precisely tracks the purity of every expression in a program. -

- -

- The Flix compiler provides an ironclad guarantee that if an expression is pure - then it cannot have side-effects and it is referentially transparent. -

-
-
-
- - - - {`/// A pure function is annotated with \`\\ {}\`. -def inc1(x: Int32): Int32 \\ {} = x + 1 - -/// An impure function is annotated with \`\\ IO\`. -def inc2(x: Int32): Int32 \\ IO = - println("x = \${x}"); - x + 1 - -def f(): Int32 \\ IO = // f is impure - let r1 = inc1(123); // pure - let r2 = inc2(456); // impure - r1 + r2 // pure`} - - -
- - - - - {`/// -/// The purity of \`map\` depends on the purity of \`f\`. -/// -def map(f: a -> b \\ ef, l: List[a]): List[b] \\ ef = - match l { - case Nil => Nil - case x :: xs => f(x) :: map(f, xs) - } -`} - - - - - -

Polymorphic Effects

- -

- Flix is able to track purity through higher-order effect polymorphic functions. -

- -

- For example, Flix knows that the purity of List.map depends on the - purity of its function argument f. -

-
-
-
- -
- - - - - -

Algebraic Effects

- -

- Flix supports algebraic effects, i.e. user-defined effects and handlers. - In particular, Flix supports multi-shot resumptions. -

- -

- Effect-oriented programming, with algebraic effects, allow programmers to - write pure functions modulo effects. Effect handlers enable program reasoning, - modularity, and testability. -

- -

- For example, the program on the right expresses a greeting function - that is pure modulo the current time of the day. In main we call - the function and handle the HourOfDay effect by getting the - real-world time from Java's LocalDateTime. -

-
-
-
- - - - {`import java.time.LocalDateTime - -eff HourOfDay { - def getCurrentHour(): Int32 -} - -def greeting(): String \\ {HourOfDay} = - let h = HourOfDay.getCurrentHour(); - if (h <= 12) "Good morning" - else if (h <= 18) "Good afternoon" - else "Good evening" - -def main(): Unit \\ IO = - run { - println(greeting()) - } with handler HourOfDay { - def getCurrentHour(_, resume) = - let dt = LocalDateTime.now(); - resume(dt.getHour()) - } -`} - - -
- - - - - -

Region-based Local Mutation

- -

- Flix supports region-based local mutation, which makes it possible to - implement pure functions that internally uses mutable state and - destructive operations, as long as these operations are confined to the region. -

- -

- We can use local mutation when it is more natural to write a function using - mutable data and in a familiar imperative-style while still remaining pure - to the outside world. -

- -

- We can also use local mutation when it is more efficient to use mutable - data structures, e.g. when implementing a sorting algorithm. -

-
-
-
- - - - {`/// -/// We can implement a *pure* \`sort\` function which -/// internally converts an immutable list to an array, -/// sorts the array in-place, and then converts it -/// back to an immutable list. -/// -def sort(l: List[a]): List[a] \\ {} with Order[a] = - region r { - List.toArray(r,l) !> Array.sort! |> Array.toList - } - -/// -/// We can also write a *pure* \`toString\` function which -/// internally uses a mutable StringBuilder. -/// -def toString(l: List[a]): String with ToString[a] = - region r { - let sb = StringBuilder.new(r); - foreach (x <- l) { - StringBuilder.appendString!("\${x} :: ", sb) - }; - StringBuilder.appendString!("Nil", sb); - StringBuilder.toString(sb) - } -`} - - -
- - - - - {`/// -/// We can inspect the purity of a function argument. -/// -def inspect(f: a -> b \\ ef): Unit \\ IO = - reifyEff(f) { - case Pure(g) => println("f is pure") - case _ => println("f is not pure") - } - -/// -/// We can use purity information to safely switch between -/// lazy (or parallel) evaluation. In this case, if f is -/// pure then perform the map operation lazily. -/// -def map(f: a -> b \\ ef, l: LazyList[a]): LazyList[b] \\ ef = - reifyEff(f) { - case Pure(g) => mapL(g, l) - case _ => mapE(f, l) - }`} - - - - - -

Purity Reflection

- -

- Flix supports a meta-programming construct that enables higher-order functions - to inspect the purity of a function argument and use that information to vary - their behavior. -

- -

- For example, the DelayList.map function varies its behavior between - eager and lazy evaluation depending on the purity of its function argument. -

- -

- We can exploit purity reflection to selectively use lazy or parallel - evaluation inside a library without changing the semantics from the - point-of-view of the clients. -

-
-
-
- -
- - - - - -

Parallelism

- -

- Flix makes it simple and easy to evaluate pure code in parallel. -

-

- For example, the code on the right shows a parallel implementation of - the List.map function using the par construct. -

-

- Internally, the par construct uses - light-weight VirtualThreads. -

-
-
-
- - - - {`/// -/// A parallel implementation of the List.map function. -/// -def parMap(f: a -> b, l: List[a]): List[b] = match l { - case Nil => Nil - case x :: xs => - // Evaluate f(x) and parMap(f, xs) in parallel. - par (r <- f(x); rs <- parMap(f, xs)) - yield r :: rs -}`} - - -
- - - - - {`def main(): Unit \\ IO = - region rc { - // A channel which can buffer one message. - let (tx, rx) = Channel.buffered(rc, 1); - spawn say("Meow!", tx) @ rc; // thread 1 - spawn say("Woof!", tx) @ rc; // thread 2 - Channel.recv(rx) |> println - } // Execution is blocked until both threads finish. - -/// Sends the string s on the given channel tx. -def say(s: String, tx: Sender[String, r]): Unit \\ r = - Channel.send(s, tx) - -`} - - - - - -

Structured Concurrency

- -

- Flix supports structured - concurrency. -

-

- For example, the code on the left shows the creation of a fresh - region named rc in which two threads are spawned. -

-

- Importantly, control-flow does not leave the region before both threads - have terminated. Hence the two threads cannot outlive the lifetime of their - enclosing region. -

-
-
-
- -
- - - - - -

Traits

- -

- Flix uses traits to abstract over types that support a common set of - operations. -

-

- For example, the Eq trait captures the notion of equality - and is used throughout the standard library. -

-
-
-
- - - - {`trait Eq[a] { - def eq(x: a, y: a): Bool - def neq(x: a, y: a): Bool = not Eq.eq(x, y) -} - -instance Eq[(a1, a2)] with Eq[a1], Eq[a2] { - def eq(t1: (a1, a2), t2: (a1, a2)): Bool = - let (x1, x2) = t1; - let (y1, y2) = t2; - x1 == y1 and x2 == y2 -}`} - - -
- - - - - {`trait Foldable[t : Type -> Type] { - - /// - /// Left-associative fold of a structure. - /// - def foldLeft(f: (b, a) -> b \\ ef, s: b, t: t[a]): b \\ ef - - /// - /// Right-associative fold of a structure. - /// - def foldRight(f: (a, b) -> b \\ ef, s: b, t: t[a]): b \\ ef - -}`} - - - - - -

Higher-Kinded Types

- -

- Flix supports higher-kinded types making it possible to abstract over type - constructors. For example, - both Option and List implement Foldable. -

- -

- The Flix standard library ships with many common traits, such - as Monoid, Functor, and Foldable. -

-
-
-
- -
- - - - - -

Associated Types

- -

- Flix supports associated types, which allow the types in instance signatures - to depend on the instance type. -

- -

- The code on the right defines a trait with an associated type Elm, - which enables each Coll instance to define its element type. -

-
-
-
- - - - {`trait Coll[a] { - - /// The element type of the collection. - type Elm - - /// Converts the collection to a list of its elements. - def toList(coll: a): List[Coll.Elm[a]] -} - -instance Coll[Map[k, v]] { - type Elm = (k, v) - - def toList(m: Map[k, v]): List[(k, v)] = ... -} -`} - - -
- - - - - {`trait Coll[a] { - - /// The element type of the collection. - type Elm - - /// The effect associated with the collection. - type Aef - - /// Converts the collection to a list of its elements. - def toList(coll: a): List[Coll.Elm[a]] \\ Coll.Aef[a] -} - -instance Coll[MutMap[k, v, r]] { - type Elm = (k, v) - type Aef = r - - def toList(m: Map[k, v]): List[(k, v)] \\ r = ... -} -`} - - - - - -

Associated Effects

- -

- Associated effects allow the effects in trait members to depend on the instance - type. - This makes it easy to create abstractions over both pure and effectful - operations, - and mutable and immutable data structures. -

- -

- The code on the left adds an associated effect Aef to - the Coll trait, - which makes it possible to add instances for mutable collections. -

-
-
-
- -
- - - - - -

Monadic For-Yield

- -

- Flix supports a monadic forM-yield construct similar to Scala's - for-comprehensions and Haskell's do notation. - The forM construct is syntactic sugar for uses - of point and flatMap (which are provided by - the Monad trait). -

-
-
-
- - - - {`def divide(x: Int32, y: Int32): Option[Int32] = - if (y == 0) None else Some(x / y) - -def f(): Option[Int32] = - forM ( - x <- divide(5, 2); - y <- divide(x, 8); - z <- divide(9, y) - ) yield x + y + z -`} - - -
- - - - - {`def validateUser(s: String): Validation[Err, String] = ... - -def validatePass(s: String): Validation[Err, String] = ... - -def conn(u: String, p: String): Validation[Err, Connection] = - forA ( - user <- validateUser(u); - pass <- validatePass(p) - ) yield Connection(user, pass) -`} - - - - - -

Applicative For-Yield

- -

- In addition to the monadic forM expression, Flix supports an - applicative forA expression that builds on - the Applicative trait. The forA construct makes - it simple to write error-handling code which uses the Validation[e, - t] data type. -

-
-
-
- -
- - - - - -

Seamless Java Interoperability

- -

- Flix supports seamless Java interoperability, making it possible to reuse code - from the Java Standard Library and the Java ecosystem, e.g., via Maven. -

-

- Java support includes object creation, method invocation, exceptions, and - class/interface extension. -

-
-
-
- - - - {`import java.io.File -import java.io.FileWriter -import java.io.IOException - -def main(): Unit \\ IO = - let f = new File("foo.txt"); - try { - let w = new FileWriter(f); - w.append("Hello World\\n"); - w.close() - } catch { - case ex: IOException => - println("Unable to write file") - }`} - - -
- - - - - -

First-class Datalog Constraints

- -

- Another unique feature of Flix is its embedded Datalog support. Datalog, a - powerful logic programming language in its own right, makes it simple and - elegant to express many fixpoint problems (including various graph reachability - problems): -

- - - {`def reachable(g: List[(String, Int32, String)], minSpeed: Int32): List[(String, String)] = - let facts = inject g into Road/3; - let rules = #{ - Path(x, y) :- Road(x, maxSpeed, y), if maxSpeed >= minSpeed. - Path(x, z) :- Path(x, y), Road(y, maxSpeed, z), if maxSpeed >= minSpeed. - }; - query facts, rules select (src, dst) from Path(src, dst) |> Foldable.toList`} - - -

- Datalog constraints are first-class which means that they may be passed - to and returned from functions, stored in data structures, composed with other - Datalog constraints, and solved. This makes it possible to express families of - Datalog programs. -

-
-
-
- -
- - - - - -

Datalog Enriched with Lattice Semantics

- -

- Flix supports Datalog constraints enriched with lattice semantics. -

- -

- The program on the right computes the delivery date for a collection of - parts. Each part is assembled from a collection of sub-components with various - delivery dates. For example, a car depends on a chassis and an engine. To build - a car, we need to wait for the chassis and engine to assembled and then we can - assemble the car itself. -

- -

- Note that parts may depend on sub-components that themselves may depend on other - sub-components. In other words, the problem is recursive. -

- -
- -

- Datalog constraints enriched with lattice semantics is one of the more - advanced features of Flix and requires some background knowledge of lattice - theory and fixpoints. -

-
-
-
- - - - {`let p = #{ - /// Parts and the components they depend on. - PartDepends("Car", "Chassis"). - PartDepends("Car", "Engine"). - PartDepends("Engine", "Piston"). - PartDepends("Engine", "Ignition"). - - /// Time required to assemble a part from its components. - AssemblyTime("Car", 7). - AssemblyTime("Engine", 2). - - /// Expected delivery date for certain components. - DeliveryDate("Chassis"; 2). - DeliveryDate("Piston"; 1). - DeliveryDate("Ignition"; 7). - - /// A part is ready when it is delivered. - ReadyDate(part; date) :- - DeliveryDate(part; date). - - /// Or when it can be assembled from its components. - ReadyDate(part; assemblyTime + componentDate) :- - PartDepends(part, component), - AssemblyTime(part, assemblyTime), - ReadyDate(component; componentDate). -}; - -// Computes the delivery date for each component. -let r = query p select (c, d) from ReadyDate(c; d) -`} - - -
- -
- - - -

Complete Feature List

- - -
    -
  • algebraic data types
  • -
  • pattern matching
  • -
  • first-class functions
  • -
  • extensible records
  • -
  • parametric polymorphism
  • -
  • traits (i.e. type classes)
  • -
  • higher-kinded types
  • -
  • associated types and effects
  • -
- - - -
    -
  • effect polymorphism + subeffecting
  • -
  • purity reflection
  • -
  • CSP-style concurrency
  • -
  • buffered & unbuffered channels
  • -
  • first-class datalog constraints
  • -
  • seamless interoperability with Java
  • -
  • unboxed primitives
  • -
  • keyword-based syntax
  • -
- - - -
    -
  • monadic forM expressions
  • -
  • applicative forA expressions
  • -
  • expressions holes
  • -
  • compilation to JVM bytecode
  • -
  • full tail call elimination
  • -
  • resilient compiler architecture
  • -
  • parallel compiler architecture
  • -
  • human friendly errors
  • -
- -
- -
- - - -

Standard Library with Batteries Included

- -

- Flix comes with a fully-featured Standard Library that offers access to more than 3,100+ functions. -

- -

- For example, the List module has more than 100 functions and - the Foldable trait has more than 47 functions. -

- -

- The full library can be explored at: https://api.flix.dev/ -

- -

- In addition, Flix also provides access to the entire Java ecosystem via Maven. -

- - - - - - - -
- -
- - - -

Modern Compiler Architecture

- -

- Flix features a modern compiler architecture which is resilient, incremental, and parallel. -

- -

- In Flix, every compiler phase is parallel. The plot on the right shows the speed-up of each - compiler phase when run on a 24 core machine. -

- -

- In other words, Flix can take full advantage of modern hardware, leading to speed-ups of - between 5x – 7x on multi-core machines. -

- -

- Furthermore, the Flix compiler is incremental which leads to significant speed-ups when - recompiling code that has already been compiled in the same compiler instance. -

- - - - -
- -
- - - -

Compiler Performance: The Raw Numbers

- -

- The following table illustrates the performance of the Flix compiler on an Apple M2 Pro with - a 10‑core CPU running on OpenJDK 21: -

- - - - - - - - - - - - - -
Throughput (entire compiler):60,159 lines/sec
Throughput (frontend only):140,382 lines/sec
- - -

- The above results can be reproduced by running the commands: java -jar flix.jar Xperf - --n 21 and java -jar flix.jar Xperf --frontend --n 21. -

- -

- The Flix compiler achieves these results despite supporting costly programming language - features, including: (a) type and effect inference, (b) monomorphization, and (c) - whole-program optimization. -

- -

- The performance of Flix compiler is mostly determined by CPU performance and memory - bandwidth. -

- - -
- -
- - - -

Visual Studio Code Support

- -

- The Flix compiler integrates with Visual Studio Code to provide a rich development - experience. -

- -

- The VSCode extension uses the real Flix compiler hence there is a 1:1 correspondence between the extension - and the compiler. -

- -

- If VSCode reports no errors there are no errors. Moreover, if there is no error, - VSCode will never report a spurious error. -

- -

- The VSCode extension supports most features, including: -

- - - -
    -
  • - Semantic Syntax Highlighting -
      -
    • Code highlighting for *.flix files.
    • -
    -
  • -
  • - Diagnostics -
      -
    • Inline compiler error messages.
    • -
    -
  • -
  • - Auto-complete -
      -
    • Auto-complete as you type.
    • -
    • Auto-completion is context aware.
    • -
    • Auto-complete trait instances.
    • -
    • Type-directed hole completion.
    • -
    -
  • -
  • - Snippets -
      -
    • Auto-complete common code constructs.
    • -
    -
  • -
  • - Inlay Hints -
      -
    • Shows inline type information.
    • -
    -
  • -
- - - -
    -
  • - Type and Effect Hovers -
      -
    • Hover over any expression to see its type and effect.
    • -
    • Hover over any local variable or formal parameter to see its type.
    • -
    • Hover over any function to see its type signature and documentation. -
    • -
    -
  • -
  • - Jump to Definition -
      -
    • Jump to the definition of any function.
    • -
    • Jump to the definition of any local variable.
    • -
    • Jump to the definition of any enum.
    • -
    -
  • -
- - - -
    -
  • - Find References -
      -
    • Find all references to a function.
    • -
    • Find all references to a local variable.
    • -
    • Find all references to an enum.
    • -
    • Find all implementations of a trait.
    • -
    -
  • -
  • - Symbols -
      -
    • List all document symbols.
    • -
    • List all workspace symbols.
    • -
    -
  • -
  • - Rename -
      -
    • Rename local variables.
    • -
    • Rename functions.
    • -
    -
  • -
  • - Code Lenses -
      -
    • Run main from within the editor.
    • -
    • Run tests from within the editor.
    • -
    -
  • -
- -
- - - -
- -
- - - -

Tooling Comparison Table

- -

- Many programming languages come with a lot of external tooling. -

- -

- Such tooling must be installed and configured correctly. -

- -

- In Flix, most tooling is built directly into the compiler. -

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
ToolFlixOCamlHaskell
Compilerflixocamlghc
LSPflixocaml-lspHLS
REPLflixutopghci
Build Toolflixdunecabal, stack
Package Managerflixopamcabal
Package RepositoryGitHubopamHackage
- -
- -
- - - -

Actively Developed and Maintained

- -

- Flix is actively developed by programming language researchers from Aarhus University in Denmark in collaboration with researchers - from the University - of Waterloo in Canada, the University of - Tubingen in Germany, and Copenhagen University in Denmark. -

- -

- Flix is also increasingly developed by a growing community of open source - contributors from all over the world. -

- -

- We invite everyone to contribute. -

- - - -

Project Statistics

- - - - - - - - - - - - - - - - - - - -
4,900+Merged Pull Requests (PRs)
3,100+Resolved Issues (Tickets)
70+Contributors
272,000+Lines in Compiler Codebase
- -
- -
- - - - - - -

Flix runs on Java

- -

- Flix targets the Java Virtual Machine (JVM) for a multitude of reasons: -

- -
    -
  • The JVM has multiple battle-tested, open-source and commercial implementations, - including OpenJDK, J9, Azul, Graal, and more. -
  • -
  • JVMs exists for all platforms: Mac, Linux, and Windows.
  • -
  • - Modern JVMs feature multiple state-of-the-art garbage collectors. -
  • -
  • Modern JVMs have excellent support for concurrency and parallelism. In particular, - light-weight threads added in Java 21. -
  • -
  • - Excellent tool support, including debuggers and profilers. -
  • -
  • The Java Platform comes with a rich ecosystem of packages which is accessible thru - integration with Maven. -
  • -
- -
- -
- - - -

Funding and Grants

- -

- Flix is generously funded by a range of instruments from: -

- - - - -

Total Funding: €1.1 million -

- -

- This funding helps ensure the continuity and independence of the project. -

- -
- -
- - - -

Sponsors and Funding

- - - - - - - - - - - - - - - - - - - - - - - - -
- -
- - - -

Collaborators

- - - - - - - - - - - - - - - - - - - -
- -
- - - -

- We kindly thank EJ Technologies for providing - us with JProfiler and JetBrains for providing us with IntelliJ IDEA. -

- -
- -
- ); -} - -export default Home; diff --git a/src/page/Internships.jsx b/src/page/Internships.jsx deleted file mode 100644 index 7f37da4..0000000 --- a/src/page/Internships.jsx +++ /dev/null @@ -1,71 +0,0 @@ -import { useEffect } from 'react'; -import {CardImg, Col, Container, Row} from "reactstrap"; - -function Internships() { - useEffect(() => { - document.title = "Flix | Internships"; - }, []); - - return ( - - -

Research Internships

- - - -

- Interested in programming language research? - Want to work on compilers? - Want to work on Flix? -

- -

- Then join us for a internship at Aarhus University in Denmark! -

- -
- -

- A typical internship lasts 8-10 weeks in the summer period (but other times of year - may also be possible). -

- -

- Aarhus University will reimburse travel and visa costs for coming to Denmark. - In addition, it is possible to apply for a small stipend to help cover housing and living - expenses. -

- -

- To apply, you should be enrolled in a bachelor's or master's degree programme at an accredited - university. -

- -

- We are looking for candidates that have experience with compilers, - programming languages, and functional programming — either through course work or from - working on their own language. -

- -
- -

- If you have questions, feel free to head over to Zulip and talk to us. -

- -
- -

- To apply, send an email to magnusm at cs dot au dot dk with a bit of - information about yourself and why you want to work on Flix. -

- - - - -
-
); -} - -export default Internships; diff --git a/src/page/Principles.jsx b/src/page/Principles.jsx deleted file mode 100644 index 0bd07df..0000000 --- a/src/page/Principles.jsx +++ /dev/null @@ -1,617 +0,0 @@ -import { useEffect } from 'react'; -import {Badge, Card, CardBody, CardColumns, CardTitle, Container} from 'reactstrap'; - -function Principles() { - useEffect(() => { - document.title = "Flix | Principles"; - }, []); - - return ( - -

Design Principles

- -

- We believe that the development of a programming language should follow a set of principles. - That is, when a design decision is made there should exist some rationale for why that - decision was made. By outlining these principles, as we develop Flix, we hope to keep ourselves - honest and to communicate the kind of language Flix aspires to be. -

- -

- Many of these ideas and principles come from languages that have inspired Flix, including Ada, Elm, - F#, Go, Haskell, OCaml, Rust, and Scala. -

- -

- Update: The Flix Principles has been published in a paper at Onward! '22. Read it here: The Principles of the Flix Programming - Language. -

- -

Language Principles

- - - - - We believe in Rich Hickey's creed: simple - is not easy. We prefer a language that gets things right to one that makes things - easy. Such a language might take longer to learn in the short run, but its simplicity pays off - in the long run. - - - - Flix is a functional language and embraces the idea that everything should be an expression. - Flix has no local variable declarations or if-then-else statements, instead it has - let-bindings and if-then-else expressions. - - However, Flix does not take this idea as far as the Scheme languages. Flix still has - declarations, namespaces, and so forth that are not expressions. - - - - Flix supports functional, imperative, and logic programming. The type and effect system of Flix - cleanly and safely separates pure code from impure code. That is, if a function is pure then the - programmer can trust that the function behaves like a mathematical function: it returns the same - value when given the same arguments and it has no side-effects. - - - - Flix aims to support developer productivity; the ability to do a lot with little ceremony or - boilerplate. A hand-crafted C program might run faster than a Flix program, but it won't be as - short, concise, or expressive as the Flix program. Flix aims to be a language with powerful - constructs and high-level abstractions. This does not mean that Flix is slow. - - - - Flix aims to ensure program correctness and considers it more important than raw performance. - Languages such as C and C++ often rely on undefined behaviour to achieve stellar performance, - whereas most other languages, including Flix, try to eschew undefined behaviour in favor of - runtime checks for things that are hard to statically ensure. For example, most languages will - dynamically check that array accesses are not out of bounds. The cost is a small performance - hit, but in our view the benefit towards correctness is immense. Inspired by Ada, Flix aims to - offer strong guarantees, ideally ensured statically, but when necessary with dynamic checks. - - - - Flix is one programming language. The Flix compiler does not have feature flags or - compiler plugins that change or extend the semantics of the language. We want to avoid - fragmentation in the ecosystem where programs end up being written in different "dialects" of - the language. There is one language, now and forever. Of course that does not imply that the - language will not evolve over time. - - - - We should strive to adhere to the principle of least - surprise. That is, we should favor sane defaults, and when there is no immediately obvious - default, we should not have a default at all, but force the programmer to be explicit about his - or her intention. - - - - The Flix type system is based on Hindley-Milner which - supports full type inference. As a design choice, we require all functions to be annotated with - their argument and return types. We believe that requiring type signatures has three distinct - advantages that outweigh the disadvantages. -
    -
  1. Type signatures are useful as documentation and to aid program understanding.
  2. -
  3. Type signatures accurately assign blame for type errors.
  4. -
  5. Type signatures enable parallel type checking.
  6. -
- Of these, we think the former two are significantly more important than the latter. -
- - - While we require type signatures, we also believe that such signatures should be as minimal - as possible. Thus, while the full type signature of List.map is def map[a, - b](f: a -{'>'} b, xs: List[a]): List[b], we can use type parameter elision to - write it - simply as: def map(f: a -{'>'} b, xs: List[a]): List[b] omitting the type - arguments. - - - - Syntax is important. Semantics are important. But we should not confuse the two. A syntactic - issue should not be resolved by a enrichment of the semantics. For example, extension methods and implicit - classes seem to be semantic solutions to (mostly) syntactic issues. Flix aims to avoid such - pitfalls. - - - - The Flix syntax is inspired by Scala. We believe that short key words make it - easy to visually identify the overall structure of a piece of code. Flix tries to use - three letter keywords where appropriate: def, let, law, - rel, but not for commonly established concepts: if ... else - and match. - - - - Flix aims to have consistent and predictable syntax. As an example, we try to have the - syntax of types mirror that of expressions: -
    -
  • - A function application is written as f(a, b, c) whereas a type application - is written as f[a, b, c]. -
  • -
  • - A function expression is written as x -> x + 1 whereas a function type - is written as Int -> Int. -
  • -
  • - A tuple is written as (true, 12345) whereas a tuple type - is written as (Bool, Int). -
  • -
-
- - - In the spirit of Elm and Rust, - Flix aims to have human readable and understandable compiler messages. - Messages should describe the problem in - detail and provide information about the context, including suggestions for how to correct - the problem. - - - - Flix embraces the principle of least privilege. In Flix, declarations are hidden by default - (i.e. private) and cannot be accessed from outside of their namespace (or - sub-namespaces). - We believe it is important that programmers are forced to make a conscious - choice about when to make a declaration publicly visible. - - - - Flix requires all code to be available at compile-time. This enables a range of - compilation techniques, such as: - -
    -
  • Monomorphization to avoid unnecessary boxing of primitives.
  • -
  • Aggressive dead code elimination ("tree shaking") to remove unused functions.
  • -
  • Inlining across namespaces.
  • -
  • Whole-program analysis.
  • -
-
- - - We believe that a language should make it easy to make illegal states unrepresentable. - For example, algebraic data types can be used to precisely define the possible values of a type. - In Flix, in the future, we want to take this a step further, and allow refinement of some types. - For example, to express that some value must not only be an integer, but also that it must - fall within a range, e.g. [0-99]. -
- in progress -
- - - In Flix, main is the entry point of a program. - No (user-defined) code is ever executed before main. - No static initializers, no static fields. No class loaders. Main is always first. - This makes it easy to reason about startup behavior. - - - - Flix has a small standard library with a few common data types, - e.g. Option, List, Set, - and Map, but for these it offers a comprehensive collection of functionality. - For example, the standard library has more than 65 functions for working with lists. - We want the standard library to offer a common set of abstractions which are usable - by most programs, but not much else. - - - - In Flix things must be defined before they can be used. - Algebraic data types, functions, local variables, and other programming elements must be - declared before they can be used by other program parts. Declarations make it easy to assign - blame; we assume declarations to be correct and check every use against its declaration. - For example, an algebraic data type declares a set of cases, and the compiler checks that - every use refers to one of these cases, and that every case is covered. - - - - We believe that a programming language should reduce the volume of declarations - it requires. Declarations may be useful and are sometimes necessary, but Flix aims to - minimize its internal dependence on them. To give an example, Flix supports extensible - records which permits the usage of flexible and type-safe records without a strict - requirement that record types must be declared upfront. - - - - In Flix there is no global shared state. - This avoids a plethora of issues, including difficulties with initialization order and race - conditions in the presence of concurrency. A Flix programmer is free to construct some - state in the main function and pass it around, but there is no built-in mechanism to declare - global variables. In a real system, the programmer still has to deal with the state of - the world, e.g. the state of the file system, the network, and other resources. - - - - Flix follows the Go mantra: Do - not communicate by sharing memory; instead, share memory by - communicating. In other words: mutable memory should never be shared between processes. - Processes should only share immutable messages (and data structures). We believe this - significantly reduces the risk of race - conditions. - - - - We believe in the Midori Error - Model; that is, there are two kinds of errors: recoverable errors and program - bugs. Recoverable errors are things like illegal user input, network errors, etc. Errors - that can be anticipated and where there is a chance of recovery. Program bugs, on the other - hand, are unanticipated and we cannot expect to recover from them. We should treat these two - types of errors differently: For recoverable errors, we should enforce that they are checked - and handled. For program bugs, we should terminate execution as quickly as possible to prevent - data corruption and security issues. - - - - To aid debugging and prevent potential harmful behaviour, Flix aborts execution when an - unrecoverable error is encountered. - - In the presence of concurrency, if a process fails, Flix aborts the entire program. - This ensures that the outside environment is duly notified and can take corrective action, e.g. - to restart the program. - - - - Flix does not have and will not have a pre-processor. Programs that use pre-processing for - textual code generation are notoriously difficult to understand and debug. We want to avoid - that for Flix. Instead, Flix may some day have a macro system, but so far there has been little - need. - - - - Flix does not have the null value. The null value is now widely considered a - mistake and languages such as C#, Dart, Kotlin and Scala are scrambling to adopt mechanisms to - ensure non-nullness. - In Flix, we adopt the standard solution from functional languages which is to represent - the absence of a value using the Option type. This solution is simple to - understand, works well, and guarantees the absence of dreaded NullPointerExceptions. - - - - In Flix, a value of one type is never implicitly coerced or converted into a value of another - type. For example, - -
    -
  • No value is ever coerced to a boolean.
  • -
  • No value is ever coerced to a string.
  • -
  • Integers and floating-point are never truncated or promoted.
  • -
-
- - - Flix does not support reflection, i.e. the ability to inspect the structure of the program - at run-time. Reflection tends to break the kind of program reasoning that both compilers and - humans rely on. At some point in the future, Flix might support some notion of compile-time - meta programming. - - - - The Flix compiler never emits warnings; only compile-time errors which abort compilation. - Warnings can be ignored or turned off. People disagree on whether a warning is harmless or not. - For Flix, we believe that any code that appears troublesome or incorrect to the compiler should - outright be rejected. - - - - Inspired by Rust, - the Flix compiler will reject programs that contain unused declarations. We believe - that rejecting such programs will help programmers avoid mistakes where some algebraic data - type or function is unintentionally left unused. - - - - Flix disallows unused local variables, whether they are introduced by let, introduced by pattern - matching, or part of the formal parameters of a function. Research [1] [2] has repeatedly shown that minor - mistakes are a common source of bugs, e.g. using the wrong local variable. Disallowing unused - local variables help avoid such mistakes. - - - - Flix disallows variable shadowing for the same reasons why it disallows unused local variables: - it is a persistent and common source of minor mistakes leading to bugs. - - - - Flix does not support function overloading (using the same name for different functions). - Instead, Flix encourages the use of meaningful names, - e.g. Map.filter and Map.filterWithKey, for functions that share - similar functionality. - - - - Flix does not support variadic (varargs) functions. It is not clear to us how a language design - can support both currying and variadic functions cleanly. Moreover, it seems that the supposed - benefits of variadic functions is not that great in a language which already has concise syntax - for list and array literals. - - - - Flix does not support labelled function arguments. The motivation for labelled arguments is a - reasonable: to avoid calling a function with arguments of the same type, but in the wrong order. - Unfortunately, labelled function arguments do not work in the presence of higher-order - functions. Instead, we suggest to overcome the problem by either (i) using richer types - (e.g. Celsius instead of Int) or alternatively (ii) using record types - which can be used to emulate the same functionality and works with higher-order functions. - - - - Flix does not support binary or octal literals. It is our understanding that these features are - rarely used in practice. - - - - The Flix compiler enforces that pattern matches handle all cases of an algebraic data type. - If a match expression is found to be non-exhaustive, the program is rejected. We believe this - encourages more robust code and enables safer refactoring of algebraic data types. - - - - A few years ago HTML was all the rage. Hence it was only natural that Java adopted HTML-style - comments. A bit later, XML was all the rage, hence it was only natural that Scala - added support for native XML literals. Today, JSON and Markdown are all the rage, but if - history is any guide, we should not add any special support for these to Flix. - - - - Flix supports comments as part of the language. We believe such integration avoids fragmentation - of the ecosystem and ultimately leads to better tool support. - - - - Flix supports unit tests as part of the language. We believe such integration avoids - fragmentation of the ecosystem and ultimately leads to better tool support. - - -
- -

Compiler Message Principles

- -

- Compiler messages are the main interface between Flix and programmers. We should invest into it. -

- - - -

- The rule states that 80% of the time a developer will need minimal information to understand - a compiler message. Most likely the developer will already have seen the specific - error message hundreds of times before. But 20% of the time, the developer will - never have seen the message before and will need more information. -

- -

- Flix compiler messages should accommodate both scenarios. -

-
- - -

- A compiler message consists of three components: - -

    -
  • Summary: A one sentence summary. The message shown on hover in Visual Studio - Code. -
  • -
  • Message: A multi-line text that contains all relevant details, including - the program symbol(s) and fragment(s) relevant for the message. -
  • -
  • Explanation: A description of why the problem occurs and what can be done - to fix it. -
  • -
-

-
- - -

- A message should be crisp, concise, and clear. - The language should be friendly or neutral. An error message should not blame - the programmer. For example, we should prefer Unexpected foo over Illegal - foo, since the latter implies that the programmer did something wrong. -

-
- - -

- The error message: Duplicate definition: 'foo' is better than the error - message: The definition 'foo' is defined twice because in the former the - programmer only has to scan the first word to understand what is wrong. -

-
- - -

- When relevant, a Flix compiler error should explain how Flix differs from other languages - and explain how the specific problem can be solved in Flix. -

-
-
- -

Type Class Principles

- - - -

- A type class is conceptually a function from a type to a set of lawful - operations (called signatures) on values of that type. -

- -

- For example, the Eq type class takes a type and returns - the eq and neq functions where eq must be reflexive, - symmetric, and transitive, and neq must be - the negation of eq. -

-
- - -

- Every type class must specify a collection of laws that instances of the type - class must satisfy. If a type class does not specify any laws it is lawless. -

- -

- Here are some examples of lawful and lawless type classes: - -

    -
  • Lawful: Eq, Order, Functor, Foldable. -
  • -
  • Lawless: FromString, ToString, Add.
  • -
-

- -

- A type class is lawful if every signature of the class is used in at least one law. -

- -

- Note: Laws are not checked by the compiler – that is an undecidable - problem – but they may be used in a future SmallCheck / QuickCheck library. -

- -
- - -

- A sub-class (i.e. a type class A that refines a type class B) must - specify additional laws that its instances must satisfy. -

- -

- For example, the Applicative type class extends the Functor type - class with additional operations and laws. -

-
- - - An instance must be declared in the same namespace as either: - -
    -
  1. the type class declaration, or
  2. -
  3. the type declaration of the instance
  4. -
-
- - - A type class may be declared sealed in which case no further instances, other than - those in the same namespace, can be defined. A sealed type class can be used when the programmer - wants to maintain tight control over what instances should be permitted. - - - -

- The Flix compiler ensures that the selection of type class instances is always unambiguous. -

- -

- In the future, we may allow a limited form of overlapping instances. -

-
- - -

- Every type class belongs to a namespace. Hence it is possible to define multiple operations - with the same name, as long as they belong to type classes in different namespaces. -

- -

- Every type class also defines a companion namespace which typically holds functions - that are not part of the type class, but nevertheless are related to the functionality of - the type class. -

-
- - -

- Type classes may provide default implementations of functions. -

- -

- For example, the Foldable type class may provide default function - implementations, e.g. count and length, based on - the foldLeft and foldRight signatures defined in that class. -

- -

- A default implementation can always be overriden by a specific type class instance. - For example, to provide a more efficient version. -

-
- - - A type class instance that wants to override / redefine a default implementation must explicitly do - so using the redef keyword. This ensures that there are no dangling overrides / redefinitions, - i.e. functions definitions that do not match any signature of the type class. - - -
- -

Library Principles

- - - - - The Flix standard library is implemented in Flix. It has no special support from the compiler. - If you don't like it or if you don't need it, you can replace it. - - - - The Flix prelude contains algebraic data types and functions that are imported into every - compilation unit. Therefore we aim to keep the prelude very small and only include extremely - common functionality. - - - - In Flix, every mutable data structure supports functional operations. - For example, mutable collections, such as Array and MutSet support - the map operation. Flix, being functional-first, reserves functional names for - functional operations. Across the standard library map has the same name and the - same type signature. - - - - In Flix, every destructive operation is suffixed with an exclamation point. For - example, Array.reverse(a) returns a new array with the elements - of a in reverse - order, whereas Array.reverse!(a) destructively re-orders the elements - of a. Note: This principle applies to destructive operations that operate on data - structures, not to impure functions in general, e.g. Console.printLine. - - - - In Flix, functional and destructive operations that share (i) similar behavior and (ii) similar - type signatures share similar names. For - example, Array.reverse and Array.reverse! share the - same name. On the other hand, Array.transform! is - called transform! and not map! because its type signature is - dissimilar to map (i.e. map works on functions of type a -{'>'} b, but transform - requires functions of type a -{'>'} a.) - - - - -
- ); -} - -function Principle({ name, children }) { - return ( - - - {name} - {children} - - - ); -} - -export default Principles; diff --git a/src/page/VSCode.jsx b/src/page/VSCode.jsx deleted file mode 100644 index f96e0f0..0000000 --- a/src/page/VSCode.jsx +++ /dev/null @@ -1,116 +0,0 @@ -import { useEffect } from 'react'; -import {Card, CardImg, Col, Container, Row} from "reactstrap"; -import inlineDiagnostics from '../gif/inlineDiagnostics.png' -import autoComplete from '../gif/autoComplete.png' -import snippetComplete from '../gif/snippetComplete.png' -import hover from '../gif/hover.png' -import rename from '../gif/rename.png' -import quickfix from '../gif/quickfix.png' -import codelens from '../gif/codelens.png' - -function VSCode() { - useEffect(() => { - document.title = "Flix | Visual Studio Code Features"; - }, []); - - return ( - - -

Visual Studio Code Features

-

- A few short videos to demonstrate various Visual Studio Code features. -

- -
- - - -

Inline Diagnostics

-

- Flix shows inline diagnostics. -

- - - - -
- - - -

Auto Completion

-

- Flix supports auto-completion of a range of program elements. -

- - - - -
- - - -

Snippet Completion

-

- Flix supports snippet completion for large program fragments. -

-

- For example, we can auto-complete trait instances. -

- - - - -
- - - -

Hover

-

- Flix supports hovering over program fragments to show their documentation, type, effect, and kind. -

- - - - -
- - - -

Rename

-

- Flix supports automatic renaming of most program elements. -

- - - - -
- - - -

Quick Fixes

-

- Flix supports some quick fixes for simple program errors. - Here we automatically derive a missing eq instance. -

- - - - -
- - - -

Code Lenses

-

- Flix supports code lenses for running main, functions, and tests. -

- - - - -
-
); -} - -export default VSCode; diff --git a/src/pages/blog.astro b/src/pages/blog.astro new file mode 100644 index 0000000..70b9ad7 --- /dev/null +++ b/src/pages/blog.astro @@ -0,0 +1,16 @@ +--- +import Layout from '../layouts/Layout.astro'; +--- + +
+
+
+

Blog

+

The Flix Blog is now available at:

+ +
+
+
+
diff --git a/src/pages/contribute.astro b/src/pages/contribute.astro new file mode 100644 index 0000000..c11565e --- /dev/null +++ b/src/pages/contribute.astro @@ -0,0 +1,87 @@ +--- +import Layout from "../layouts/Layout.astro"; +--- + + +
+
+
+

Contribute

+ +

+ Flix is developed at Aarhus University, at the University of Waterloo, and by a community of open source contributors. +

+ +

+ Flix is open-source and freely available under the Apache 2.0 license. +

+ +

+ All source code is available on GitHub. We organize development using GitHub issues and Zulip. +

+ +

+ If you are interested working on Flix, please feel free to reach out + to us. +

+
+
+ +

Projects

+ +
+
+
+
+
Open Source Mentoring
+

+ We are more than happy to mentor someone who is interested in + working on compilers and/or programming language design and wants + to contribute to Flix. We have already had several positive + experiences working with open source contributors. +

+
+
+
+ +
+
+
+
Talent Track Projects
+

+ Aarhus University offers a talent track program for capable + students that are in their second or third year of studies and are + interested in working on a research project for up to one year as + an extracurricular activity. +

+
+
+
+ +
+
+
+
Bachelor and Master Projects
+

+ If you are a bachelor or master student at Aarhus University you + can write your thesis on a topic related to Flix. +

+
+
+
+
+
+
diff --git a/src/pages/documentation.astro b/src/pages/documentation.astro new file mode 100644 index 0000000..8dcf56e --- /dev/null +++ b/src/pages/documentation.astro @@ -0,0 +1,128 @@ +--- +import Layout from '../layouts/Layout.astro'; +--- + + + + diff --git a/src/pages/faq.astro b/src/pages/faq.astro new file mode 100644 index 0000000..a4b9572 --- /dev/null +++ b/src/pages/faq.astro @@ -0,0 +1,471 @@ +--- +import Layout from "../layouts/Layout.astro"; +import QA from "../components/FAQ/QA.astro"; +import Question from "../components/FAQ/Question.astro"; +import Answer from "../components/FAQ/Answer.astro"; +--- + + +
+

Frequently Asked Questions

+

+ A collection of information that did not seem to fit in anywhere else. +

+ + + What is the best way to start learning Flix? + +

+ We recommend to read the Programming Flix book. +

+ +

+ If you get stuck or need help feel free to reach out to us on Zulip. +

+
+
+ + + + Does Flix have Language Server Protocol (LSP) support? + + + Yes, in addition to Visual Studio Code support, Flix also has generic + LSP support. + + + + + Does Flix have a read-eval-print-loop (REPL)? + + + Flix has a nascent REPL. It can be started with the repl command. + + + + + + Are you looking for help with the compiler or language design? + + + Yes! We welcome any contributions and we are happy to mentor someone who + wants to work on the compiler. We are also open to general feedback and + discussion about the language design. Head on over to GitHub or Zulip and reach out to us! + + + + + Does Flix compile to LLVM? + No and we don't have any plans to target LLVM. + + + + Does Flix compile to WebAssembly (WASM)? + + Not yet. It is something we are open to. We are waiting for the WASM + ecosystem to mature. + + + + + Is Flix a domain specific language (DSL)? + +

No, Flix is a full-blown general-purpose programming language.

+
+
+ + + + Flix looks similar to Scala. How are the two languages related? + + +

+ Flix borrows a lot of syntax from Scala, hence the two languages have + a similar feel. +

+

+ We think Scala made many good design choices with respect to syntax, + including: +

+ +
    +
  • the use of short keywords,
  • +
  • the x : T syntax for type annotations,
  • +
  • the List[Int32] syntax for type parameters, and
  • +
  • if, match, etc. as expressions.
  • +
+ +

However, other than syntax, the two languages are very different:

+ +
    +
  • Scala is object-oriented, Flix is not.
  • +
  • Scala has sub-typing, Flix does not.
  • +
  • Flix has an effect system, Scala does not.
  • +
  • And so on.
  • +
+
+
+ + + What is the runtime performance of Flix programs? + +

+ Flix runs on the JVM which means that the performance of Flix programs + is comparable to that of Java and Scala programs. +

+ +

+ Flix is a whole-program optimizing compiler that uses monomorphization + and inlining (like Rust and MLton). Hence, sometimes, Flix programs + run faster than their Java or Scala equivalent. +

+
+
+ + + + Haskell and OCaml compile to native code thus by definition they must be + faster than Flix. + + + This is not necessarily true. For example, Java sometimes beats both OCaml and Haskell in The Computer Language Benchmarks Game. + + + + + What controversial design choices are made in Flix? + + +

+ The following design choices may be considered controversial by some: +

+ +
    +
  • Unused variables are compile-time errors.
  • +
  • Shadowed variables are compile-time errors.
  • +
  • + Unused definitions, type declarations, etc. are compile-time errors. +
  • +
  • No variadic or labelled function arguments.
  • +
  • No warnings, only compile-time errors.
  • +
  • + Dividing by zero yields zero. +
  • +
+
+
+ + + Wait, division by zero is zero, really? + + + Yes. But focusing on this is a bit like focusing on the color of the + seats in a spacecraft. + + + + + Where does the "Flix" name come from? + + We do not remember, but we believe it may have come from FIXpoint Language. + + + + + + Does Flix have a network library with streaming support? + + Not yet, but maybe we could call it net-flix? + + + + + You do not seem to understand parsing / type theory / code generation / + computers! + + + We are always happy to learn! We are ready to discuss design choices + made in Flix. Swing by Zulip or + on GitHub. + + + + + Why does the website require JavaScript? + + We built the website using the popular React framework. Using React was + easy. Ultimately, we want to spend our time writing compilers, not + writing websites. + + + + + + The page does not load without JavaScript enabled. If I cannot even view + the website without that bloat, I wonder what the language is like? + + + Indeed, if your computer is too old to run a modern browser that + supports JavaScript then probably your computer is too old to run a + modern JVM that supports Flix. Sorry. + + + + + "This site requires JavaScript" + +

+ People who have criticized the website for using JavaScript: [1], [2], [3], [4], [5]. +

+ +

+ People who have offered to help refactor the site to use static html: 0. +

+
+
+ + + + It appears that an example on the website does not work? + + +

+ The latest compiler version and the website are not always in sync, + hence occasionally some examples may stop to work. +

+ +

+ Occasionally a mischievous visitor will crash the online editor (or + rather the virtual machine on which the compiler runs). +

+
+
+ + + + The language is probably great from a technical point of view, but + unless Apple, Google, Mozilla, or Microsoft is on-board it is pointless. + + +

+ Yes, no programming language developed outside of those four + corporations have ever been successful. See also C, C++, Java, Python, + PHP, MatLab, Perl, R, Ruby, Scala, ... +

+ +

+ That said, if you work for a company and would like to help sponsor + Flix, please feel free to reach out to us :) +

+
+
+ + + + Why is it that all the "big-brain" programming language ideas seems to + happen in weird new functional programming languages? Are they just a + better petri dish for experimenting with weird shit? I assume that all + of this gets funding because ten years later it makes C# programmers + more productive, not because of mass appeal. + + +

Yes, we do it all for C#.

+
+
+ + + + "Flix is inspired by OCaml and Haskell with ideas from Rust and Scala". + Inspirations and ideas from four of the arguably most complex languages + of the modern world, all the best with that. + + +

+ Yes, we take inspiration from programming languages that are pushing + on the boundary of language design. +

+ +

+ What would be the point of taking ideas from C, Perl, PHP, and Visual + Basic? +

+ +

+ Also, who said that we are taking their most complex ideas? Rather we + should take their best ideas. +

+
+
+ + + + Wow! Amazing! A language where you can iterate through lists and call + functions recursively. + + Magical, isn't it? + + + + + Great! Yet-another-programming-language™. This is exactly what we need; + the gazillion of existing programming languages is not enough. + + + Flix aims to offer a collection of features that are not found in any + existing programming language. + + + + + Do we really need any more programming languages? + +

+ Do we really need safer airplanes? + Do we really need electric cars? + Do we really need more ergonomic chairs? +

+ +

I mean, after all, we already have airplanes, cars, and chairs!

+ +

+ We build new programming languages and we conduct research on + programming language design because we want to offer developers better tools to write programs. We want to make it simpler, safer, and faster to + write correct programs. +

+ +

+ And we want to increase developer happiness. It should be a pleasure + to use Flix! +

+
+
+ + + + This sounds like vaporware. All big promises and no delivery. + + + The research, the code, and the performance. + + + + + + I was disappointed to learn that Flix has feature X instead of my favorite + feature Y. + + We are deeply sorry to have let you down. + + + + + It boggles my mind that any developer of a new language would not use + Python’s significant use of white space. + + + Right, because significant whitespace poses no challenges or gotchas + whatsoever. + + + + + + Interesting project but whoever decided "forM" is a good name for a + language keyword should be made to gurgle Tabasco sauce for a few + minutes. + + +

+ We much prefer Cholula Hot Sauce. +

+

+ That said, forM is clear, concise, and works well with forA allowing one to easily switch between monadic-code and applicative-code. +

+
+
+ + + + How the fuck can anyone understand such weird syntax? I hate all these + symbols. + + +

+ The Flix syntax is based on keywords except when + there is a + clearly established historical precedent for using a symbol. For + example: +

+ +
    +
  • + The cons of an element x and a list xs is written + as x :: xs. +
  • +
  • + The underscore _ denotes a wildcard (or an unused variable). +
  • +
  • + The symbol :- denotes logical implication in Datalog rules. +
  • +
+
+
+ + + + This is – by far – the worst syntax I have ever seen in a functional + language. Semicolons, braces, symbolic soup, et al. It is like if Scala, + Java and Haskell had a one night stand in the center of Chernobyl. + + Quite an achievement, wouldn't you say? + + + + + The examples all look horrible. The site looks horrible. This needs a + lot of work before it gets close to anything I would even consider + using. + + Sorry, what was the question? + +
+
diff --git a/src/pages/get-started.astro b/src/pages/get-started.astro new file mode 100644 index 0000000..aa1f560 --- /dev/null +++ b/src/pages/get-started.astro @@ -0,0 +1,36 @@ +--- +import Layout from "../layouts/Layout.astro"; +--- + + +
+

Get Started

+ +
+
+

+ We recommend to use Flix from Visual Studio Code. In addition, Flix + has an online playground and can be installed locally. +

+
+
+ +
+
+

+ Installing the Flix Visual Studio Code Extension +

+
+ Install VSCode extension +
+
+
+
+
diff --git a/src/pages/index.astro b/src/pages/index.astro new file mode 100644 index 0000000..0af333d --- /dev/null +++ b/src/pages/index.astro @@ -0,0 +1,1398 @@ +--- +import Layout from "../layouts/Layout.astro"; +import InlineEditor from "../components/InlineEditor.astro"; + +// FIXME inline all of it +const httpExample = `/// Demonstrates composing multiple HTTP middleware +/// via \`with\` clauses. Stacks base URL, default +/// headers, retry, circuit breaker, and logging. +/// Each \`with\` wraps the +/// preceding block. The \`Http\` and \`Logger\` effects +/// propagate to \`main\` and are handled automatically +/// via their default handlers. Relative paths are +/// resolved against the base URL; absolute URLs +/// bypass it. +def main(): Unit \\ { Clock, Http, Logger, IO } = + let defaultHeaders = Map#{ + "Accept" => List#{"application/json"}, + "Authorization" => List#{"Bearer tok123"} + }; + run { + let urls = List#{"/api/users", "/api/posts"}; + foreach (url <- urls) { + match Http.get(url) { + case Ok(res) => println("\${url} -> \${status(res)}") + case Err(err) => println("\${url} -> \${err}") + } + }; + match Http.get("https://notfound.flix.dev/") { + case Ok(res) => println("notfound -> \${status(res)}") + case Err(err) => println("notfound -> \${err}") + } + } with Http.withBaseUrl("https://flix.dev") + with Http.withDefaultHeaders(defaultHeaders) + with Http.withRetry( + Retry.linear(maxRetries = 2, delay = milliseconds(100))) + with Http.withCircuitBreaker( + failureThreshold = 3, cooldown = seconds(5)) + with Http.withLogging`; + +const adtExample = `enum Shape { + case Circle(Int32), + case Square(Int32), + case Rectangle(Int32, Int32) +} + +def area(s: Shape): Int32 = match s { + case Circle(r) => 3 * (r * r) + case Square(w) => w * w + case Rectangle(h, w) => h * w +}`; + +const recordExample = `def origin(): (Int32, Int32) = (0, 0) + +def oneByOne(): {w = Int32, h = Int32} = {w = 1, h = 1} + +def twoByFour(): {w = Int32, h = Int32} = {w = 2, h = 4} + +def area(rect: {w = Int32, h = Int32 | r}): Int32 = + rect#w * rect#h + +def f(): Int32 = area({h = 1, color = "Blue", w = 2})`; + +const purityExample = `/// A pure function is annotated with \`\\ {}\`. +def inc1(x: Int32): Int32 \\ {} = x + 1 + +/// An impure function is annotated with \`\\ IO\`. +def inc2(x: Int32): Int32 \\ IO = + println("x = \${x}"); + x + 1 + +def f(): Int32 \\ IO = // f is impure + let r1 = inc1(123); // pure + let r2 = inc2(456); // impure + r1 + r2 // pure`; + +const polyEffectsExample = `/// +/// The purity of \`map\` depends on the purity of \`f\`. +/// +def map(f: a -> b \\ ef, l: List[a]): List[b] \\ ef = + match l { + case Nil => Nil + case x :: xs => f(x) :: map(f, xs) + }`; + +const effectsExample = `import java.time.LocalDateTime + +eff HourOfDay { + def getCurrentHour(): Int32 +} + +def greeting(): String \\ {HourOfDay} = + let h = HourOfDay.getCurrentHour(); + if (h <= 12) "Good morning" + else if (h <= 18) "Good afternoon" + else "Good evening" + +def main(): Unit \\ IO = + run { + println(greeting()) + } with handler HourOfDay { + def getCurrentHour(_, resume) = + let dt = LocalDateTime.now(); + resume(dt.getHour()) + }`; + +const regionExample = `/// +/// We can implement a *pure* \`sort\` function which +/// internally converts an immutable list to an array, +/// sorts the array in-place, and then converts it +/// back to an immutable list. +/// +def sort(l: List[a]): List[a] \\ {} with Order[a] = + region r { + List.toArray(r,l) !> Array.sort! |> Array.toList + } + +/// +/// We can also write a *pure* \`toString\` function which +/// internally uses a mutable StringBuilder. +/// +def toString(l: List[a]): String with ToString[a] = + region r { + let sb = StringBuilder.new(r); + foreach (x <- l) { + StringBuilder.appendString!("\${x} :: ", sb) + }; + StringBuilder.appendString!("Nil", sb); + StringBuilder.toString(sb) + }`; + +const purityReflectionExample = `/// +/// We can inspect the purity of a function argument. +/// +def inspect(f: a -> b \\ ef): Unit \\ IO = + reifyEff(f) { + case Pure(g) => println("f is pure") + case _ => println("f is not pure") + } + +/// +/// We can use purity information to safely switch between +/// lazy (or parallel) evaluation. In this case, if f is +/// pure then perform the map operation lazily. +/// +def map(f: a -> b \\ ef, l: LazyList[a]): LazyList[b] \\ ef = + reifyEff(f) { + case Pure(g) => mapL(g, l) + case _ => mapE(f, l) + }`; + +const parallelismExample = `/// +/// A parallel implementation of the List.map function. +/// +def parMap(f: a -> b, l: List[a]): List[b] = match l { + case Nil => Nil + case x :: xs => + // Evaluate f(x) and parMap(f, xs) in parallel. + par (r <- f(x); rs <- parMap(f, xs)) + yield r :: rs +}`; + +const concurrencyExample = `def main(): Unit \\ IO = + region rc { + // A channel which can buffer one message. + let (tx, rx) = Channel.buffered(rc, 1); + spawn say("Meow!", tx) @ rc; // thread 1 + spawn say("Woof!", tx) @ rc; // thread 2 + Channel.recv(rx) |> println + } // Execution is blocked until both threads finish. + +/// Sends the string s on the given channel tx. +def say(s: String, tx: Sender[String, r]): Unit \\ r = + Channel.send(s, tx)`; + +const traitsExample = `trait Eq[a] { + def eq(x: a, y: a): Bool + def neq(x: a, y: a): Bool = not Eq.eq(x, y) +} + +instance Eq[(a1, a2)] with Eq[a1], Eq[a2] { + def eq(t1: (a1, a2), t2: (a1, a2)): Bool = + let (x1, x2) = t1; + let (y1, y2) = t2; + x1 == y1 and x2 == y2 +}`; + +const hktExample = `trait Foldable[t : Type -> Type] { + + /// + /// Left-associative fold of a structure. + /// + def foldLeft(f: (b, a) -> b \\ ef, s: b, t: t[a]): b \\ ef + + /// + /// Right-associative fold of a structure. + /// + def foldRight(f: (a, b) -> b \\ ef, s: b, t: t[a]): b \\ ef + +}`; + +const associatedTypesExample = `trait Coll[a] { + + /// The element type of the collection. + type Elm + + /// Converts the collection to a list of its elements. + def toList(coll: a): List[Coll.Elm[a]] +} + +instance Coll[Map[k, v]] { + type Elm = (k, v) + + def toList(m: Map[k, v]): List[(k, v)] = ... +}`; + +const associatedEffectsExample = `trait Coll[a] { + + /// The element type of the collection. + type Elm + + /// The effect associated with the collection. + type Aef + + /// Converts the collection to a list of its elements. + def toList(coll: a): List[Coll.Elm[a]] \\ Coll.Aef[a] +} + +instance Coll[MutMap[k, v, r]] { + type Elm = (k, v) + type Aef = r + + def toList(m: Map[k, v]): List[(k, v)] \\ r = ... +}`; + +const monadicForExample = `def divide(x: Int32, y: Int32): Option[Int32] = + if (y == 0) None else Some(x / y) + +def f(): Option[Int32] = + forM ( + x <- divide(5, 2); + y <- divide(x, 8); + z <- divide(9, y) + ) yield x + y + z`; + +const applicativeForExample = `def validateUser(s: String): Validation[Err, String] = ... + +def validatePass(s: String): Validation[Err, String] = ... + +def conn(u: String, p: String): Validation[Err, Connection] = + forA ( + user <- validateUser(u); + pass <- validatePass(p) + ) yield Connection(user, pass)`; + +const javaInteropExample = `import java.io.File +import java.io.FileWriter +import java.io.IOException + +def main(): Unit \\ IO = + let f = new File("foo.txt"); + try { + let w = new FileWriter(f); + w.append("Hello World\\n"); + w.close() + } catch { + case ex: IOException => + println("Unable to write file") + }`; + +const datalogExample = `def reachable(g: List[(String, Int32, String)], minSpeed: Int32): List[(String, String)] = + let facts = inject g into Road/3; + let rules = #{ + Path(x, y) :- Road(x, maxSpeed, y), if maxSpeed >= minSpeed. + Path(x, z) :- Path(x, y), Road(y, maxSpeed, z), if maxSpeed >= minSpeed. + }; + query facts, rules select (src, dst) from Path(src, dst) |> Foldable.toList`; + +const latticeExample = `let p = #{ + /// Parts and the components they depend on. + PartDepends("Car", "Chassis"). + PartDepends("Car", "Engine"). + PartDepends("Engine", "Piston"). + PartDepends("Engine", "Ignition"). + + /// Time required to assemble a part from its components. + AssemblyTime("Car", 7). + AssemblyTime("Engine", 2). + + /// Expected delivery date for certain components. + DeliveryDate("Chassis"; 2). + DeliveryDate("Piston"; 1). + DeliveryDate("Ignition"; 7). + + /// A part is ready when it is delivered. + ReadyDate(part; date) :- + DeliveryDate(part; date). + + /// Or when it can be assembled from its components. + ReadyDate(part; assemblyTime + componentDate) :- + PartDepends(part, component), + AssemblyTime(part, assemblyTime), + ReadyDate(component; componentDate). +}; + +// Computes the delivery date for each component. +let r = query p select (c, d) from ReadyDate(c; d)`; +--- + + +
+
+
+

Flix —

+

+ A powerful effect-oriented programming language +

+

+ Flix is a principled effect-oriented functional, imperative, and logic + programming language developed at Aarhus University and by a community of open source contributors. +

+

Why effect-oriented? And why Flix?

+

+ Why Effects? Effect systems represent the + next major evolution in statically typed programming languages. By explicitly + modeling side effects, effect-oriented programming enforces modularity and + helps program reasoning. User-defined effects and handlers allow programmers + to implement their own control structures. +

+

+ Why Flix? We claim that of all the upcoming + effect-oriented programming languages, Flix offers the most complete language implementation, the most extensive standard library, the most detailed documentation, and the best tool support. +

+

+ Moreover, Flix builds on proven programming language technology, + including: algebraic data types and pattern matching, extensible records, traits, higher-kinded types, associated types and effects, structured concurrency, and more. +

+
+
+ +
+
+ +
+ +
+
+
+
+

Algebraic Data Types and Pattern Matching

+

+ Algebraic data types and pattern matching are the bread-and-butter + of functional programming and are supported by Flix with minimal + fuss. +

+
+
+
+
+ +
+
+ +
+
+ +
+
+
+
+

Tuples and Records

+

Flix has built-in support for tuples and records.

+

Records use structural typing and are extensible.

+
+
+
+
+ +
+
+
+
+

Purity and Impurity

+

+ Flix precisely tracks the purity of every expression in a program. +

+

+ The Flix compiler provides an ironclad guarantee that if an + expression is pure then it cannot have side-effects and it is + referentially transparent. +

+
+
+
+
+ +
+
+ +
+
+ +
+
+
+
+

Polymorphic Effects

+

+ Flix is able to track purity through higher-order effect + polymorphic functions. +

+

+ For example, Flix knows that the purity of List.map depends + on the purity of its function argument f. +

+
+
+
+
+ +
+
+
+
+

Algebraic Effects

+

+ Flix supports algebraic effects, i.e. user-defined effects and + handlers. In particular, Flix supports multi-shot resumptions. +

+

+ Effect-oriented programming, with algebraic effects, allow + programmers to write pure functions modulo effects. Effect + handlers enable program reasoning, modularity, and testability. +

+

+ For example, the program on the right expresses a greeting function that is pure modulo the current time of the day. In main we call the function and handle the HourOfDay effect + by getting the real-world time from Java's LocalDateTime. +

+
+
+
+
+ +
+
+ +
+
+
+
+

Region-based Local Mutation

+

+ Flix supports region-based local mutation, which makes it possible + to implement pure functions that internally uses mutable state + and destructive operations, as long as these operations are confined + to the region. +

+

+ We can use local mutation when it is more natural to write a + function using mutable data and in a familiar imperative-style + while still remaining pure to the outside world. +

+

+ We can also use local mutation when it is more efficient to use + mutable data structures, e.g. when implementing a sorting + algorithm. +

+
+
+
+
+ +
+
+ +
+
+ +
+
+
+
+

Purity Reflection

+

+ Flix supports a meta-programming construct that enables + higher-order functions to inspect the purity of a function + argument and use that information to vary their behavior. +

+

+ For example, the DelayList.map function varies its behavior + between eager and lazy evaluation depending on the purity of its function + argument. +

+

+ We can exploit purity reflection to selectively use lazy or + parallel evaluation inside a library without changing the + semantics from the point-of-view of the clients. +

+
+
+
+
+ +
+
+
+
+

Parallelism

+

+ Flix makes it simple and easy to evaluate pure code in parallel. +

+

+ For example, the code on the right shows a parallel implementation + of the List.map function using the par construct. +

+

+ Internally, the par construct uses light-weight VirtualThreads. +

+
+
+
+
+ +
+
+ +
+
+ +
+
+
+
+

Structured Concurrency

+

+ Flix supports structured concurrency. +

+

+ For example, the code on the left shows the creation of a fresh + region named rc in which two threads are spawned. +

+

+ Importantly, control-flow does not leave the region before both threads have terminated. Hence the two threads cannot outlive the + lifetime of their enclosing region. +

+
+
+
+
+ +
+
+
+
+

Traits

+

+ Flix uses traits to abstract over types that support a common set + of operations. +

+

+ For example, the Eq trait captures the notion of equality + and is used throughout the standard library. +

+
+
+
+
+ +
+
+ +
+
+ +
+
+
+
+

Higher-Kinded Types

+

+ Flix supports higher-kinded types making it possible to abstract + over type constructors. For example, both Option and List implement Foldable. +

+

+ The Flix standard library ships with many common traits, such as Monoid, Functor, and Foldable. +

+
+
+
+
+ +
+
+
+
+

Associated Types

+

+ Flix supports associated types, which allow the types in instance + signatures to depend on the instance type. +

+

+ The code on the right defines a trait with an associated type Elm, which enables each Coll instance to define its element + type. +

+
+
+
+
+ +
+
+ +
+
+ +
+
+
+
+

Associated Effects

+

+ Associated effects allow the effects in trait members to depend on + the instance type. This makes it easy to create abstractions over + both pure and effectful operations, and mutable and immutable data + structures. +

+

+ The code on the left adds an associated effect Aef to the + Coll trait, which makes it possible to add instances for + mutable collections. +

+
+
+
+
+ +
+
+
+
+

Monadic For-Yield

+

+ Flix supports a monadic forM-yield construct similar + to Scala's + for-comprehensions and Haskell's do notation. + The forM construct is syntactic sugar for uses of point and flatMap (which are provided by the Monad trait). +

+
+
+
+
+ +
+
+ +
+
+ +
+
+
+
+

Applicative For-Yield

+

+ In addition to the monadic forM expression, Flix supports + an applicative forA expression that builds on the Applicative trait. The forA construct makes it simple to write error-handling + code which uses the Validation[e, t] data type. +

+
+
+
+
+ +
+
+
+
+

Seamless Java Interoperability

+

+ Flix supports seamless Java interoperability, making it possible + to reuse code from the Java Standard Library and the Java + ecosystem, e.g., via Maven. +

+

+ Java support includes object creation, method invocation, + exceptions, and class/interface extension. +

+
+
+
+
+ +
+
+ +
+
+
+
+

First-class Datalog Constraints

+

+ Another unique feature of Flix is its embedded Datalog support. + Datalog, a powerful logic programming language in its own right, + makes it simple and elegant to express many fixpoint problems + (including various graph reachability problems): +

+ +

+ Datalog constraints are first-class which means that they may + be passed to and returned from functions, stored in data structures, + composed with other Datalog constraints, and solved. This makes it possible + to express families of Datalog programs. +

+
+
+
+
+ +
+
+
+
+

Datalog Enriched with Lattice Semantics

+

+ Flix supports Datalog constraints enriched with lattice semantics. +

+

+ The program on the right computes the delivery date for a + collection of parts. Each part is assembled from a collection of + sub-components with various delivery dates. For example, a car + depends on a chassis and an engine. To build a car, we need to + wait for the chassis and engine to be assembled and then we can + assemble the car itself. +

+

+ Note that parts may depend on sub-components that themselves may + depend on other sub-components. In other words, the problem is + recursive. +

+
+

+ Datalog constraints enriched with lattice semantics is one of the + more advanced features of Flix and requires some background + knowledge of lattice theory and fixpoints. +

+
+
+
+
+ +
+
+ +
+ +
+
+

Complete Feature List

+
+
+
    +
  • algebraic data types
  • +
  • pattern matching
  • +
  • first-class functions
  • +
  • extensible records
  • +
  • parametric polymorphism
  • +
  • traits (i.e. type classes)
  • +
  • higher-kinded types
  • +
  • associated types and effects
  • +
+
+
+
    +
  • effect polymorphism + subeffecting
  • +
  • purity reflection
  • +
  • CSP-style concurrency
  • +
  • buffered & unbuffered channels
  • +
  • first-class datalog constraints
  • +
  • seamless interoperability with Java
  • +
  • unboxed primitives
  • +
  • keyword-based syntax
  • +
+
+
+
    +
  • monadic forM expressions
  • +
  • applicative forA expressions
  • +
  • expressions holes
  • +
  • compilation to JVM bytecode
  • +
  • full tail call elimination
  • +
  • resilient compiler architecture
  • +
  • parallel compiler architecture
  • +
  • human friendly errors
  • +
+
+
+ +
+ +
+
+

Standard Library with Batteries Included

+

+ Flix comes with a fully-featured Standard Library that offers access + to more than + 3,100+ functions. +

+

+ For example, the List module has more than 100 functions and + the Foldable trait has more than 47 functions. +

+

+ The full library can be explored at: https://api.flix.dev/ +

+

+ In addition, Flix also provides access to the entire Java ecosystem + via Maven. +

+
+
+
+ Standard Library +
+
+
+ +
+ +
+
+

Modern Compiler Architecture

+

+ Flix features a modern compiler architecture which is resilient, incremental, and parallel. +

+

+ In Flix, every compiler phase is parallel. The plot on the right shows + the speed-up of each compiler phase when run on a 24 core machine. +

+

+ In other words, Flix can take full advantage of modern hardware, + leading to speed-ups of between 5x – 7x on multi-core machines. +

+

+ Furthermore, the Flix compiler is incremental which leads to + significant speed-ups when recompiling code that has already been + compiled in the same compiler instance. +

+
+
+ Parallel Speedup +
+
+ +
+ +
+
+

Compiler Performance: The Raw Numbers

+

+ The following table illustrates the performance of the Flix compiler + on an Apple M2 Pro with a 10‑core CPU running on OpenJDK 21: +

+
+ + + + + + + + + + + +
Throughput (entire compiler):60,159 lines/sec
Throughput (frontend only):140,382 lines/sec
+
+

+ The above results can be reproduced by running the commands: java -jar flix.jar Xperf --n 21 + and java -jar flix.jar Xperf --frontend --n 21. +

+

+ The Flix compiler achieves these results despite supporting costly + programming language features, including: (a) type and effect + inference, (b) monomorphization, and (c) whole-program optimization. +

+ +

+ The performance of Flix compiler is mostly determined by CPU + performance and memory bandwidth. +

+
+
+ +
+ +
+
+

Visual Studio Code Support

+ +

+ The Flix compiler integrates with Visual Studio Code to provide a rich + development experience. +

+ +

+ The VSCode extension uses the real Flix compiler hence there is a 1:1 correspondence between the extension and the compiler. +

+ +

+ If VSCode reports no errors there are no errors. Moreover, if + there is no error, + VSCode will never report a spurious error. +

+ +

The VSCode extension supports most features, including:

+
+ +
+
    +
  • + Semantic Syntax Highlighting +
    • Code highlighting for *.flix files.
    +
  • +
  • + Diagnostics +
    • Inline compiler error messages.
    +
  • +
  • + Auto-complete +
      +
    • Auto-complete as you type.
    • +
    • Auto-completion is context aware.
    • +
    • Auto-complete trait instances.
    • +
    • Type-directed hole completion.
    • +
    +
  • +
  • + Snippets +
    • Auto-complete common code constructs.
    +
  • +
  • + Inlay Hints +
    • Shows inline type information.
    +
  • +
+
+ +
+
    +
  • + Type and Effect Hovers +
      +
    • Hover over any expression to see its type and effect.
    • +
    • + Hover over any local variable or formal parameter to see its + type. +
    • +
    • + Hover over any function to see its type signature and + documentation. +
    • +
    +
  • +
  • + Jump to Definition +
      +
    • Jump to the definition of any function.
    • +
    • Jump to the definition of any local variable.
    • +
    • Jump to the definition of any enum.
    • +
    +
  • +
+
+ +
+
    +
  • + Find References +
      +
    • Find all references to a function.
    • +
    • Find all references to a local variable.
    • +
    • Find all references to an enum.
    • +
    • Find all implementations of a trait.
    • +
    +
  • +
  • + Symbols +
      +
    • List all document symbols.
    • +
    • List all workspace symbols.
    • +
    +
  • +
  • + Rename +
      +
    • Rename local variables.
    • +
    • Rename functions.
    • +
    +
  • +
  • + Code Lenses +
      +
    • Run main from within the editor.
    • +
    • Run tests from within the editor.
    • +
    +
  • +
+
+ + + +
+
+
+ Semantic Highlighting +

+ Semantic Highlighting +

+
+
+ Hover to Inspect +

Hover to Inspect

+
+
+ Highlight References +

+ Highlight References +

+
+
+ Inline Errors +

Inline Errors

+
+
+
+
+ +
+ +
+
+

Tooling Comparison Table

+

Many programming languages come with a lot of external tooling.

+

Such tooling must be installed and configured correctly.

+

In Flix, most tooling is built directly into the compiler.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ToolFlixOCamlHaskell
Compilerflixocamlghc
LSPflixocaml-lspHLS
REPLflixutopghci
Build Toolflixdunecabal, stack
Package Managerflixopamcabal
Package RepositoryGitHubopamHackage
+
+
+ +
+ +
+
+

Actively Developed and Maintained

+

+ Flix is actively developed by programming language researchers from Aarhus University in Denmark in collaboration with researchers from the University of Waterloo in Canada, the University of Tubingen in Germany, and Copenhagen University in Denmark. +

+

+ Flix is also increasingly developed by a growing community of open + source contributors from all over the world. +

+

We invite everyone to contribute.

+
+
+

Project Statistics

+ + + + + + + + + + + + + + + + + + + +
4,900+Merged Pull Requests (PRs)
3,100+Resolved Issues (Tickets)
70+Contributors
272,000+Lines in Compiler Codebase
+
+
+ +
+ +
+
+ Java Logo +
+
+

Flix runs on Java

+

+ Flix targets the Java Virtual Machine (JVM) for a multitude of + reasons: +

+
    +
  • + The JVM has multiple battle-tested, open-source and commercial + implementations, including OpenJDK, J9, Azul, Graal, and more. +
  • +
  • JVMs exists for all platforms: Mac, Linux, and Windows.
  • +
  • + Modern JVMs feature multiple state-of-the-art garbage collectors. +
  • +
  • + Modern JVMs have excellent support for concurrency and parallelism. + In particular, light-weight threads added in Java 21. +
  • +
  • Excellent tool support, including debuggers and profilers.
  • +
  • + The Java Platform comes with a rich ecosystem of packages which is + accessible thru integration with Maven. +
  • +
+
+
+ +
+ +
+
+

Funding and Grants

+

+ Flix is generously funded by a range of instruments from: +

+ +
+
+

+ Total Funding: €1.1 million +

+

+ This funding helps ensure the continuity and independence of the + project. +

+
+
+ +
+ +
+
+

Sponsors and Funding

+
+
+
+
+ Independent Research Fund Denmark +
+
+
+
+ Digital Research Centre Denmark +
+
+
+
+ Amazon Research Award +
+
+
+
+ StiboFonden +
+
+
+
+ +
+ +
+
+

Collaborators

+
+
+
+
+ Aarhus University +
+
+
+
+ University of Waterloo +
+
+
+
+ University of Tubingen +
+
+
+
+ +
+ +
+
+

+ We kindly thank EJ Technologies for providing + us with JProfiler and JetBrains for providing us with IntelliJ IDEA. +

+
+
+
+
diff --git a/src/pages/internships.astro b/src/pages/internships.astro new file mode 100644 index 0000000..d7f9bee --- /dev/null +++ b/src/pages/internships.astro @@ -0,0 +1,62 @@ +--- +import Layout from '../layouts/Layout.astro'; +--- + + +
+
+
+

Research Internships

+
+ +
+

+ Interested in programming language research? + Want to work on compilers? + Want to work on Flix? +

+ +

Then join us for a internship at Aarhus University in Denmark!

+ +
+ +

+ A typical internship lasts 8-10 weeks in the summer period (but other times of year + may also be possible). +

+ +

+ Aarhus University will reimburse travel and visa costs for coming to Denmark. + In addition, it is possible to apply for a small stipend to help cover housing and living expenses. +

+ +

+ To apply, you should be enrolled in a bachelor's or master's degree programme at an accredited university. +

+ +

+ We are looking for candidates that have experience with compilers, + programming languages, and functional programming — either through course work or from + working on their own language. +

+ +
+ +

+ If you have questions, feel free to head over to Zulip and talk to us. +

+ +
+ +

+ To apply, send an email to magnusm at cs dot au dot dk with a bit of + information about yourself and why you want to work on Flix. +

+
+ +
+ Dept. of Computer Science +
+
+
+
diff --git a/src/pages/principles.astro b/src/pages/principles.astro new file mode 100644 index 0000000..1c1de1d --- /dev/null +++ b/src/pages/principles.astro @@ -0,0 +1,599 @@ +--- +import Layout from "../layouts/Layout.astro" +import Principle from "../components/Principle.astro" +import Badge from "../components/Badge.astro" +--- + +
+

Design Principles

+ +

+ We believe that the development of a programming language should follow a set of principles. + That is, when a design decision is made there should exist some rationale for why that + decision was made. By outlining these principles, as we develop Flix, we hope to keep ourselves + honest and to communicate the kind of language Flix aspires to be. +

+ +

+ Many of these ideas and principles come from languages that have inspired Flix, including Ada, Elm, + F#, Go, Haskell, OCaml, Rust, and Scala. +

+ +

+ Update: The Flix Principles has been published in a paper at Onward! '22. Read it here: The Principles of the Flix Programming + Language. +

+ +

Language Principles

+ +
+ + + We believe in Rich Hickey's creed: simple + is not easy. We prefer a language that gets things right to one that makes things + easy. Such a language might take longer to learn in the short run, but its simplicity pays off + in the long run. + + + + Flix is a functional language and embraces the idea that everything should be an expression. + Flix has no local variable declarations or if-then-else statements, instead it has + let-bindings and if-then-else expressions. + + However, Flix does not take this idea as far as the Scheme languages. Flix still has + declarations, namespaces, and so forth that are not expressions. + + + + Flix supports functional, imperative, and logic programming. The type and effect system of Flix + cleanly and safely separates pure code from impure code. That is, if a function is pure then the + programmer can trust that the function behaves like a mathematical function: it returns the same + value when given the same arguments and it has no side-effects. + + + + Flix aims to support developer productivity; the ability to do a lot with little ceremony or + boilerplate. A hand-crafted C program might run faster than a Flix program, but it won't be as + short, concise, or expressive as the Flix program. Flix aims to be a language with powerful + constructs and high-level abstractions. This does not mean that Flix is slow. + + + + Flix aims to ensure program correctness and considers it more important than raw performance. + Languages such as C and C++ often rely on undefined behaviour to achieve stellar performance, + whereas most other languages, including Flix, try to eschew undefined behaviour in favor of + runtime checks for things that are hard to statically ensure. For example, most languages will + dynamically check that array accesses are not out of bounds. The cost is a small performance + hit, but in our view the benefit towards correctness is immense. Inspired by Ada, Flix aims to + offer strong guarantees, ideally ensured statically, but when necessary with dynamic checks. + + + + Flix is one programming language. The Flix compiler does not have feature flags or + compiler plugins that change or extend the semantics of the language. We want to avoid + fragmentation in the ecosystem where programs end up being written in different "dialects" of + the language. There is one language, now and forever. Of course that does not imply that the + language will not evolve over time. + + + + We should strive to adhere to the principle of least + surprise. That is, we should favor sane defaults, and when there is no immediately obvious + default, we should not have a default at all, but force the programmer to be explicit about his + or her intention. + + + + The Flix type system is based on Hindley-Milner which + supports full type inference. As a design choice, we require all functions to be annotated with + their argument and return types. We believe that requiring type signatures has three distinct + advantages that outweigh the disadvantages. +
    +
  1. Type signatures are useful as documentation and to aid program understanding.
  2. +
  3. Type signatures accurately assign blame for type errors.
  4. +
  5. Type signatures enable parallel type checking.
  6. +
+ Of these, we think the former two are significantly more important than the latter. +
+ + + While we require type signatures, we also believe that such signatures should be as minimal + as possible. Thus, while the full type signature of List.map is def map[a, + b](f: a -{'>'} b, xs: List[a]): List[b], we can use type parameter elision to + write it + simply as: def map(f: a -{'>'} b, xs: List[a]): List[b] omitting the type + arguments. + + + + Syntax is important. Semantics are important. But we should not confuse the two. A syntactic + issue should not be resolved by a enrichment of the semantics. For example, extension methods and implicit + classes seem to be semantic solutions to (mostly) syntactic issues. Flix aims to avoid such + pitfalls. + + + + The Flix syntax is inspired by Scala. We believe that short key words make it + easy to visually identify the overall structure of a piece of code. Flix tries to use + three letter keywords where appropriate: def, let, law, + rel, but not for commonly established concepts: if ... else + and match. + + + + Flix aims to have consistent and predictable syntax. As an example, we try to have the + syntax of types mirror that of expressions: +
    +
  • + A function application is written as f(a, b, c) whereas a type application + is written as f[a, b, c]. +
  • +
  • + A function expression is written as x -> x + 1 whereas a function type + is written as Int -> Int. +
  • +
  • + A tuple is written as (true, 12345) whereas a tuple type + is written as (Bool, Int). +
  • +
+
+ + + In the spirit of Elm and Rust, + Flix aims to have human readable and understandable compiler messages. + Messages should describe the problem in + detail and provide information about the context, including suggestions for how to correct + the problem. + + + + Flix embraces the principle of least privilege. In Flix, declarations are hidden by default + (i.e. private) and cannot be accessed from outside of their namespace (or + sub-namespaces). + We believe it is important that programmers are forced to make a conscious + choice about when to make a declaration publicly visible. + + + + Flix requires all code to be available at compile-time. This enables a range of + compilation techniques, such as: + +
    +
  • Monomorphization to avoid unnecessary boxing of primitives.
  • +
  • Aggressive dead code elimination ("tree shaking") to remove unused functions.
  • +
  • Inlining across namespaces.
  • +
  • Whole-program analysis.
  • +
+
+ + + We believe that a language should make it easy to make illegal states unrepresentable. + For example, algebraic data types can be used to precisely define the possible values of a type. + In Flix, in the future, we want to take this a step further, and allow refinement of some types. + For example, to express that some value must not only be an integer, but also that it must + fall within a range, e.g. [0-99]. +
+ in progress +
+ + + In Flix, main is the entry point of a program. + No (user-defined) code is ever executed before main. + No static initializers, no static fields. No class loaders. Main is always first. + This makes it easy to reason about startup behavior. + + + + Flix has a small standard library with a few common data types, + e.g. Option, List, Set, + and Map, but for these it offers a comprehensive collection of functionality. + For example, the standard library has more than 65 functions for working with lists. + We want the standard library to offer a common set of abstractions which are usable + by most programs, but not much else. + + + + In Flix things must be defined before they can be used. + Algebraic data types, functions, local variables, and other programming elements must be + declared before they can be used by other program parts. Declarations make it easy to assign + blame; we assume declarations to be correct and check every use against its declaration. + For example, an algebraic data type declares a set of cases, and the compiler checks that + every use refers to one of these cases, and that every case is covered. + + + + We believe that a programming language should reduce the volume of declarations + it requires. Declarations may be useful and are sometimes necessary, but Flix aims to + minimize its internal dependence on them. To give an example, Flix supports extensible + records which permits the usage of flexible and type-safe records without a strict + requirement that record types must be declared upfront. + + + + In Flix there is no global shared state. + This avoids a plethora of issues, including difficulties with initialization order and race + conditions in the presence of concurrency. A Flix programmer is free to construct some + state in the main function and pass it around, but there is no built-in mechanism to declare + global variables. In a real system, the programmer still has to deal with the state of + the world, e.g. the state of the file system, the network, and other resources. + + + + Flix follows the Go mantra: Do + not communicate by sharing memory; instead, share memory by + communicating. In other words: mutable memory should never be shared between processes. + Processes should only share immutable messages (and data structures). We believe this + significantly reduces the risk of race + conditions. + + + + We believe in the Midori Error + Model; that is, there are two kinds of errors: recoverable errors and program + bugs. Recoverable errors are things like illegal user input, network errors, etc. Errors + that can be anticipated and where there is a chance of recovery. Program bugs, on the other + hand, are unanticipated and we cannot expect to recover from them. We should treat these two + types of errors differently: For recoverable errors, we should enforce that they are checked + and handled. For program bugs, we should terminate execution as quickly as possible to prevent + data corruption and security issues. + + + + To aid debugging and prevent potential harmful behaviour, Flix aborts execution when an + unrecoverable error is encountered. + + In the presence of concurrency, if a process fails, Flix aborts the entire program. + This ensures that the outside environment is duly notified and can take corrective action, e.g. + to restart the program. + + + + Flix does not have and will not have a pre-processor. Programs that use pre-processing for + textual code generation are notoriously difficult to understand and debug. We want to avoid + that for Flix. Instead, Flix may some day have a macro system, but so far there has been little + need. + + + + Flix does not have the null value. The null value is now widely considered a + mistake and languages such as C#, Dart, Kotlin and Scala are scrambling to adopt mechanisms to + ensure non-nullness. + In Flix, we adopt the standard solution from functional languages which is to represent + the absence of a value using the Option type. This solution is simple to + understand, works well, and guarantees the absence of dreaded NullPointerExceptions. + + + + In Flix, a value of one type is never implicitly coerced or converted into a value of another + type. For example, + +
    +
  • No value is ever coerced to a boolean.
  • +
  • No value is ever coerced to a string.
  • +
  • Integers and floating-point are never truncated or promoted.
  • +
+
+ + + Flix does not support reflection, i.e. the ability to inspect the structure of the program + at run-time. Reflection tends to break the kind of program reasoning that both compilers and + humans rely on. At some point in the future, Flix might support some notion of compile-time + meta programming. + + + + The Flix compiler never emits warnings; only compile-time errors which abort compilation. + Warnings can be ignored or turned off. People disagree on whether a warning is harmless or not. + For Flix, we believe that any code that appears troublesome or incorrect to the compiler should + outright be rejected. + + + + Inspired by Rust, + the Flix compiler will reject programs that contain unused declarations. We believe + that rejecting such programs will help programmers avoid mistakes where some algebraic data + type or function is unintentionally left unused. + + + + Flix disallows unused local variables, whether they are introduced by let, introduced by pattern + matching, or part of the formal parameters of a function. Research [1] [2] has repeatedly shown that minor + mistakes are a common source of bugs, e.g. using the wrong local variable. Disallowing unused + local variables help avoid such mistakes. + + + + Flix disallows variable shadowing for the same reasons why it disallows unused local variables: + it is a persistent and common source of minor mistakes leading to bugs. + + + + Flix does not support function overloading (using the same name for different functions). + Instead, Flix encourages the use of meaningful names, + e.g. Map.filter and Map.filterWithKey, for functions that share + similar functionality. + + + + Flix does not support variadic (varargs) functions. It is not clear to us how a language design + can support both currying and variadic functions cleanly. Moreover, it seems that the supposed + benefits of variadic functions is not that great in a language which already has concise syntax + for list and array literals. + + + + Flix does not support labelled function arguments. The motivation for labelled arguments is a + reasonable: to avoid calling a function with arguments of the same type, but in the wrong order. + Unfortunately, labelled function arguments do not work in the presence of higher-order + functions. Instead, we suggest to overcome the problem by either (i) using richer types + (e.g. Celsius instead of Int) or alternatively (ii) using record types + which can be used to emulate the same functionality and works with higher-order functions. + + + + Flix does not support binary or octal literals. It is our understanding that these features are + rarely used in practice. + + + + The Flix compiler enforces that pattern matches handle all cases of an algebraic data type. + If a match expression is found to be non-exhaustive, the program is rejected. We believe this + encourages more robust code and enables safer refactoring of algebraic data types. + + + + A few years ago HTML was all the rage. Hence it was only natural that Java adopted HTML-style + comments. A bit later, XML was all the rage, hence it was only natural that Scala + added support for native XML literals. Today, JSON and Markdown are all the rage, but if + history is any guide, we should not add any special support for these to Flix. + + + + Flix supports comments as part of the language. We believe such integration avoids fragmentation + of the ecosystem and ultimately leads to better tool support. + + + + Flix supports unit tests as part of the language. We believe such integration avoids + fragmentation of the ecosystem and ultimately leads to better tool support. + + +
+ +

Compiler Message Principles

+ +

+ Compiler messages are the main interface between Flix and programmers. We should invest into it. +

+ +
+ +

+ The rule states that 80% of the time a developer will need minimal information to understand + a compiler message. Most likely the developer will already have seen the specific + error message hundreds of times before. But 20% of the time, the developer will + never have seen the message before and will need more information. +

+ +

+ Flix compiler messages should accommodate both scenarios. +

+
+ + +

+ A compiler message consists of three components: + +

    +
  • Summary: A one sentence summary. The message shown on hover in Visual Studio + Code. +
  • +
  • Message: A multi-line text that contains all relevant details, including + the program symbol(s) and fragment(s) relevant for the message. +
  • +
  • Explanation: A description of why the problem occurs and what can be done + to fix it. +
  • +
+

+
+ + +

+ A message should be crisp, concise, and clear. + The language should be friendly or neutral. An error message should not blame + the programmer. For example, we should prefer Unexpected foo over Illegal + foo, since the latter implies that the programmer did something wrong. +

+
+ + +

+ The error message: Duplicate definition: 'foo' is better than the error + message: The definition 'foo' is defined twice because in the former the + programmer only has to scan the first word to understand what is wrong. +

+
+ + +

+ When relevant, a Flix compiler error should explain how Flix differs from other languages + and explain how the specific problem can be solved in Flix. +

+
+
+ +

Type Class Principles

+ +
+ +

+ A type class is conceptually a function from a type to a set of lawful + operations (called signatures) on values of that type. +

+ +

+ For example, the Eq type class takes a type and returns + the eq and neq functions where eq must be reflexive, + symmetric, and transitive, and neq must be + the negation of eq. +

+
+ + +

+ Every type class must specify a collection of laws that instances of the type + class must satisfy. If a type class does not specify any laws it is lawless. +

+ +

+ Here are some examples of lawful and lawless type classes: + +

    +
  • Lawful: Eq, Order, Functor, Foldable. +
  • +
  • Lawless: FromString, ToString, Add.
  • +
+

+ +

+ A type class is lawful if every signature of the class is used in at least one law. +

+ +

+ Note: Laws are not checked by the compiler – that is an undecidable + problem – but they may be used in a future SmallCheck / QuickCheck library. +

+ +
+ + +

+ A sub-class (i.e. a type class A that refines a type class B) must + specify additional laws that its instances must satisfy. +

+ +

+ For example, the Applicative type class extends the Functor type + class with additional operations and laws. +

+
+ + + An instance must be declared in the same namespace as either: + +
    +
  1. the type class declaration, or
  2. +
  3. the type declaration of the instance
  4. +
+
+ + + A type class may be declared sealed in which case no further instances, other than + those in the same namespace, can be defined. A sealed type class can be used when the programmer + wants to maintain tight control over what instances should be permitted. + + + +

+ The Flix compiler ensures that the selection of type class instances is always unambiguous. +

+ +

+ In the future, we may allow a limited form of overlapping instances. +

+
+ + +

+ Every type class belongs to a namespace. Hence it is possible to define multiple operations + with the same name, as long as they belong to type classes in different namespaces. +

+ +

+ Every type class also defines a companion namespace which typically holds functions + that are not part of the type class, but nevertheless are related to the functionality of + the type class. +

+
+ + +

+ Type classes may provide default implementations of functions. +

+ +

+ For example, the Foldable type class may provide default function + implementations, e.g. count and length, based on + the foldLeft and foldRight signatures defined in that class. +

+ +

+ A default implementation can always be overriden by a specific type class instance. + For example, to provide a more efficient version. +

+
+ + + A type class instance that wants to override / redefine a default implementation must explicitly do + so using the redef keyword. This ensures that there are no dangling overrides / redefinitions, + i.e. functions definitions that do not match any signature of the type class. + + +
+ +

Library Principles

+ +
+ + + The Flix standard library is implemented in Flix. It has no special support from the compiler. + If you don't like it or if you don't need it, you can replace it. + + + + The Flix prelude contains algebraic data types and functions that are imported into every + compilation unit. Therefore we aim to keep the prelude very small and only include extremely + common functionality. + + + + In Flix, every mutable data structure supports functional operations. + For example, mutable collections, such as Array and MutSet support + the map operation. Flix, being functional-first, reserves functional names for + functional operations. Across the standard library map has the same name and the + same type signature. + + + + In Flix, every destructive operation is suffixed with an exclamation point. For + example, Array.reverse(a) returns a new array with the elements + of a in reverse + order, whereas Array.reverse!(a) destructively re-orders the elements + of a. Note: This principle applies to destructive operations that operate on data + structures, not to impure functions in general, e.g. Console.printLine. + + + + In Flix, functional and destructive operations that share (i) similar behavior and (ii) similar + type signatures share similar names. For + example, Array.reverse and Array.reverse! share the + same name. On the other hand, Array.transform! is + called transform! and not map! because its type signature is + dissimilar to map (i.e. map works on functions of type a -{'>'} b, but transform + requires functions of type a -{'>'} a.) + + +
+
+
\ No newline at end of file diff --git a/src/pages/vscode.astro b/src/pages/vscode.astro new file mode 100644 index 0000000..a688247 --- /dev/null +++ b/src/pages/vscode.astro @@ -0,0 +1,73 @@ +--- +import Layout from '../layouts/Layout.astro'; + +const base = "/gif/"; + +const features = [ + { + title: "Inline Diagnostics", + desc: "Flix shows inline diagnostics.", + img: base + "inlineDiagnostics.png", + alt: "Inline Diagnostics", + }, + { + title: "Auto Completion", + desc: "Flix supports auto-completion of a range of program elements.", + img: base + "autoComplete.png", + alt: "Auto Completion", + }, + { + title: "Snippet Completion", + desc: "Flix supports snippet completion for large program fragments. For example, we can auto-complete trait instances.", + img: base + "snippetComplete.png", + alt: "Snippet Completion", + }, + { + title: "Hover", + desc: "Flix supports hovering over program fragments to show their documentation, type, effect, and kind.", + img: base + "hover.png", + alt: "Hover", + }, + { + title: "Rename", + desc: "Flix supports automatic renaming of most program elements.", + img: base + "rename.png", + alt: "Rename", + }, + { + title: "Quick Fixes", + desc: "Flix supports some quick fixes for simple program errors. Here we automatically derive a missing eq instance.", + img: base + "quickfix.png", + alt: "Quick Fixes", + }, + { + title: "Code Lenses", + desc: "Flix supports code lenses for running main, functions, and tests.", + img: base + "codelens.png", + alt: "Code Lenses", + }, +]; +--- + + +
+
+
+

Visual Studio Code Features

+

A few short videos to demonstrate various Visual Studio Code features.

+
+
+ + {features.map(f => ( +
+
+

{f.title}

+

+
+ {f.alt} +
+
+
+ ))} +
+
diff --git a/src/App.css b/src/styles/global.css similarity index 81% rename from src/App.css rename to src/styles/global.css index 5d94835..b37b57e 100644 --- a/src/App.css +++ b/src/styles/global.css @@ -1,7 +1,6 @@ body { font-family: 'Open Sans', sans-serif; overflow-y: scroll; - background-color: #efefef; } @@ -49,6 +48,13 @@ p:last-child { .inline-editor-code { padding: 1em 1.5em; background-color: #f7f7f7; + overflow-x: auto; + font-size: 0.875rem; +} + +.inline-editor-code pre { + margin: 0; + background: transparent !important; } .nav-item { @@ -56,26 +62,19 @@ p:last-child { } .navbar-nav .nav-item .nav-link { - color: rgba(255, 255, 255, .85) + color: rgba(255, 255, 255, .85); } .navbar-nav .nav-item .nav-link:hover { - color: rgba(255, 255, 255, 1.00) -} - -.btn-group .btn, .btn-xs { - padding: .1rem .5rem; - font-size: .875rem; - line-height: 1.5; - border-radius: .2rem; + color: rgba(255, 255, 255, 1.00); } .card-title { font-size: 1.2rem; } -.ace_hidden-cursors { - opacity: 0 +h4 { + font-size: 1.5 rem; } .w-33 { diff --git a/src/util/InlineEditor.jsx b/src/util/InlineEditor.jsx deleted file mode 100644 index fe41757..0000000 --- a/src/util/InlineEditor.jsx +++ /dev/null @@ -1,31 +0,0 @@ -import { useState } from 'react'; -import AceEditor from 'react-ace' - -import 'ace-builds/src-noconflict/mode-flix' -import 'ace-builds/src-noconflict/theme-chrome' - -function InlineEditor({ children }) { - const [input] = useState(children); - - return ( -
-
- -
-
- ) -} - -export default InlineEditor diff --git a/vite.config.js b/vite.config.js deleted file mode 100644 index 94b5ac5..0000000 --- a/vite.config.js +++ /dev/null @@ -1,14 +0,0 @@ -import { defineConfig } from 'vite'; -import react from '@vitejs/plugin-react'; - -export default defineConfig({ - plugins: [ - react(), - ], - build: { - outDir: 'dist', - }, - server: { - open: true, - }, -});