├── pnpm-workspace.yaml ├── examples ├── svelte-kit-zig-project │ ├── .npmrc │ ├── src │ │ ├── routes │ │ │ ├── +layout.js │ │ │ └── +page.svelte │ │ ├── lib │ │ │ └── main.zig │ │ └── app.html │ ├── static │ │ └── favicon.png │ ├── vite.config.js │ ├── .gitignore │ ├── svelte.config.js │ ├── package.json │ └── README.md └── vite-zig-project │ ├── module.js │ ├── vite.config.js │ ├── src │ └── main.zig │ ├── static_import_instantiate.js │ ├── dynamic_import_instantiate.js │ ├── counter.js │ ├── .gitignore │ ├── package.json │ ├── index.html │ ├── static_import.js │ ├── dynamic_import.js │ ├── javascript.svg │ ├── main.js │ ├── public │ └── vite.svg │ └── style.css ├── .gitignore ├── index.d.ts ├── package.json ├── LICENSE ├── README.md ├── index.js ├── index.cjs └── pnpm-lock.yaml /pnpm-workspace.yaml: -------------------------------------------------------------------------------- 1 | packages: 2 | - 'examples/*' 3 | -------------------------------------------------------------------------------- /examples/svelte-kit-zig-project/.npmrc: -------------------------------------------------------------------------------- 1 | engine-strict=true 2 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules/ 2 | zig-cache/ 3 | zig-out/ 4 | *.wasm 5 | -------------------------------------------------------------------------------- /examples/vite-zig-project/module.js: -------------------------------------------------------------------------------- 1 | export const add = a => b => a + b; 2 | -------------------------------------------------------------------------------- /examples/svelte-kit-zig-project/src/routes/+layout.js: -------------------------------------------------------------------------------- 1 | export const prerender = true; 2 | -------------------------------------------------------------------------------- /index.d.ts: -------------------------------------------------------------------------------- 1 | import { Plugin } from 'vite'; 2 | 3 | export function zig(): Plugin; 4 | -------------------------------------------------------------------------------- /examples/svelte-kit-zig-project/static/favicon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pluvial/vite-plugin-zig/HEAD/examples/svelte-kit-zig-project/static/favicon.png -------------------------------------------------------------------------------- /examples/svelte-kit-zig-project/vite.config.js: -------------------------------------------------------------------------------- 1 | import { sveltekit } from '@sveltejs/kit/vite'; 2 | import { defineConfig } from 'vite'; 3 | import zig from 'vite-plugin-zig'; 4 | 5 | export default defineConfig({ 6 | plugins: [sveltekit(), zig()], 7 | }); 8 | -------------------------------------------------------------------------------- /examples/vite-zig-project/vite.config.js: -------------------------------------------------------------------------------- 1 | import inspect from 'vite-plugin-inspect'; 2 | import zig from 'vite-plugin-zig'; 3 | 4 | /** @type {import('vite').UserConfig} */ 5 | export default { 6 | plugins: [zig(), inspect()], 7 | build: { target: 'esnext' }, 8 | }; 9 | -------------------------------------------------------------------------------- /examples/vite-zig-project/src/main.zig: -------------------------------------------------------------------------------- 1 | const std = @import("std"); 2 | const testing = std.testing; 3 | 4 | export fn add(a: i32, b: i32) i32 { 5 | return a + b; 6 | } 7 | 8 | test "basic add functionality" { 9 | try testing.expect(add(3, 7) == 10); 10 | } 11 | -------------------------------------------------------------------------------- /examples/vite-zig-project/static_import_instantiate.js: -------------------------------------------------------------------------------- 1 | import { exports, instance, module } from './src/main.zig?instantiate'; 2 | 3 | // call exported functions from the exports object 4 | console.log(exports.add(5, 37)); // 42 5 | 6 | console.debug({ exports, instance, module }); 7 | -------------------------------------------------------------------------------- /examples/svelte-kit-zig-project/src/lib/main.zig: -------------------------------------------------------------------------------- 1 | const std = @import("std"); 2 | const testing = std.testing; 3 | 4 | export fn add(a: i32, b: i32) i32 { 5 | return a + b; 6 | } 7 | 8 | test "basic add functionality" { 9 | try testing.expect(add(3, 7) == 10); 10 | } 11 | -------------------------------------------------------------------------------- /examples/vite-zig-project/dynamic_import_instantiate.js: -------------------------------------------------------------------------------- 1 | const { exports, instance, module } = await import( 2 | './src/main.zig?instantiate' 3 | ); 4 | 5 | // call exported functions from the exports object 6 | console.log(exports.add(5, 37)); // 42 7 | 8 | console.debug({ exports, instance, module }); 9 | -------------------------------------------------------------------------------- /examples/vite-zig-project/counter.js: -------------------------------------------------------------------------------- 1 | export function setupCounter(element) { 2 | let counter = 0 3 | const setCounter = (count) => { 4 | counter = count 5 | element.innerHTML = `count is ${counter}` 6 | } 7 | element.addEventListener('click', () => setCounter(counter + 1)) 8 | setCounter(0) 9 | } 10 | -------------------------------------------------------------------------------- /examples/svelte-kit-zig-project/.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | 3 | # Output 4 | .output 5 | .vercel 6 | /.svelte-kit 7 | /build 8 | 9 | # OS 10 | .DS_Store 11 | Thumbs.db 12 | 13 | # Env 14 | .env 15 | .env.* 16 | !.env.example 17 | !.env.test 18 | 19 | # Vite 20 | vite.config.js.timestamp-* 21 | vite.config.ts.timestamp-* 22 | -------------------------------------------------------------------------------- /examples/svelte-kit-zig-project/svelte.config.js: -------------------------------------------------------------------------------- 1 | import adapter from '@sveltejs/adapter-static'; 2 | 3 | /** @type {import('@sveltejs/kit').Config} */ 4 | const config = { 5 | kit: { 6 | // See https://kit.svelte.dev/docs/adapters for more information about adapters. 7 | adapter: adapter(), 8 | }, 9 | }; 10 | 11 | export default config; 12 | -------------------------------------------------------------------------------- /examples/vite-zig-project/.gitignore: -------------------------------------------------------------------------------- 1 | # Logs 2 | logs 3 | *.log 4 | npm-debug.log* 5 | yarn-debug.log* 6 | yarn-error.log* 7 | pnpm-debug.log* 8 | lerna-debug.log* 9 | 10 | node_modules 11 | dist 12 | dist-ssr 13 | *.local 14 | 15 | # Editor directories and files 16 | .vscode/* 17 | !.vscode/extensions.json 18 | .idea 19 | .DS_Store 20 | *.suo 21 | *.ntvs* 22 | *.njsproj 23 | *.sln 24 | *.sw? 25 | -------------------------------------------------------------------------------- /examples/vite-zig-project/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "vite-zig-project", 3 | "private": true, 4 | "version": "0.0.0", 5 | "type": "module", 6 | "scripts": { 7 | "dev": "vite", 8 | "build": "vite build", 9 | "preview": "vite preview" 10 | }, 11 | "devDependencies": { 12 | "vite": "^5.2.0", 13 | "vite-plugin-inspect": "^0.8.4", 14 | "vite-plugin-zig": "workspace:*" 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /examples/vite-zig-project/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | Vite App 8 | 9 | 10 |
11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /examples/svelte-kit-zig-project/src/routes/+page.svelte: -------------------------------------------------------------------------------- 1 | 10 | 11 |

Welcome to SvelteKit

12 |

Visit kit.svelte.dev to read the documentation

13 | -------------------------------------------------------------------------------- /examples/svelte-kit-zig-project/src/app.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | %sveltekit.head% 8 | 9 | 10 |
%sveltekit.body%
11 | 12 | 13 | -------------------------------------------------------------------------------- /examples/svelte-kit-zig-project/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "svelte-kit-zig-project", 3 | "version": "0.0.1", 4 | "private": true, 5 | "scripts": { 6 | "dev": "vite dev", 7 | "build": "vite build", 8 | "preview": "vite preview" 9 | }, 10 | "devDependencies": { 11 | "@sveltejs/adapter-static": "^3.0.2", 12 | "@sveltejs/kit": "^2.0.0", 13 | "@sveltejs/vite-plugin-svelte": "^3.0.0", 14 | "svelte": "^4.2.7", 15 | "vite": "^5.0.3", 16 | "vite-plugin-zig": "workspace:*" 17 | }, 18 | "type": "module" 19 | } 20 | -------------------------------------------------------------------------------- /examples/vite-zig-project/static_import.js: -------------------------------------------------------------------------------- 1 | import { instantiate, module } from './src/main.zig'; 2 | 3 | // pass any custom importObject here, functions should be declared 4 | // as extern in the Zig file 5 | const importObject = { 6 | // ... 7 | }; 8 | // instantiate the compiled WebAssembly module, can also be moved 9 | // to a Worker for instantiation in another thread 10 | const { exports, instance } = await instantiate(importObject); 11 | // call exported functions from the exports object 12 | console.log(exports.add(5, 37)); // 42 13 | 14 | console.debug({ exports, instance, module }); 15 | -------------------------------------------------------------------------------- /examples/vite-zig-project/dynamic_import.js: -------------------------------------------------------------------------------- 1 | const { instantiate, module } = await import('./src/main.zig'); 2 | 3 | // pass any custom importObject here, functions should be declared 4 | // as extern in the Zig file 5 | const importObject = { 6 | // ... 7 | }; 8 | // instantiate the compiled WebAssembly module, can also be moved 9 | // to a Worker for instantiation in another thread 10 | const { exports, instance } = await instantiate(importObject); 11 | // call exported functions from the exports object 12 | console.log(exports.add(5, 37)); // 42 13 | 14 | console.debug({ exports, instance, module }); 15 | -------------------------------------------------------------------------------- /examples/vite-zig-project/javascript.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "vite-plugin-zig", 3 | "version": "0.0.13", 4 | "files": [ 5 | "index.js", 6 | "index.cjs", 7 | "index.d.ts" 8 | ], 9 | "keywords": [ 10 | "rollup", 11 | "rollup-plugin", 12 | "vite", 13 | "vite-plugin", 14 | "wasm", 15 | "zig" 16 | ], 17 | "license": "MIT", 18 | "repository": { 19 | "url": "https://github.com/pluvial/vite-plugin-zig" 20 | }, 21 | "exports": { 22 | ".": { 23 | "import": "./index.js", 24 | "require": "./index.cjs" 25 | } 26 | }, 27 | "main": "index.js", 28 | "type": "module", 29 | "scripts": { 30 | "build-cjs": "esbuild index.js --bundle --platform=node --outfile=index.cjs", 31 | "prepublish": "pnpm build-cjs" 32 | }, 33 | "devDependencies": { 34 | "esbuild": "^0.21.5", 35 | "vite": "^5.3.1" 36 | }, 37 | "packageManager": "pnpm@9.3.0+sha512.ee7b93e0c2bd11409c6424f92b866f31d3ea1bef5fbe47d3c7500cdc3c9668833d2e55681ad66df5b640c61fa9dc25d546efa54d76d7f8bf54b13614ac293631" 38 | } 39 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | Copyright (c) 2021 [these people](https://github.com/pluvial/svelte-adapter-deno/graphs/contributors) 2 | 3 | Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: 4 | 5 | The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. 6 | 7 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 8 | -------------------------------------------------------------------------------- /examples/vite-zig-project/main.js: -------------------------------------------------------------------------------- 1 | import './style.css'; 2 | import javascriptLogo from './javascript.svg'; 3 | import viteLogo from '/vite.svg'; 4 | import { setupCounter } from './counter.js'; 5 | 6 | document.querySelector('#app').innerHTML = ` 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |

Hello Vite!

15 |
16 | 17 |
18 |

19 | Click on the Vite logo to learn more 20 |

21 |
22 | `; 23 | 24 | setupCounter(document.querySelector('#counter')); 25 | 26 | const { add } = await import('./module.js'); 27 | console.log(add(5)(37)); 28 | 29 | // test cases 30 | import './static_import'; 31 | import './static_import_instantiate'; 32 | import './dynamic_import'; 33 | import './dynamic_import_instantiate'; 34 | -------------------------------------------------------------------------------- /examples/svelte-kit-zig-project/README.md: -------------------------------------------------------------------------------- 1 | # svelte-kit-zig-project 2 | 3 | Everything you need to build a Svelte project, powered by [`create-svelte`](https://github.com/sveltejs/kit/tree/main/packages/create-svelte). 4 | 5 | ## Creating a project 6 | 7 | If you're seeing this, you've probably already done this step. Congrats! 8 | 9 | ```bash 10 | # create a new project in the current directory 11 | npm create svelte@latest 12 | 13 | # create a new project in my-app 14 | npm create svelte@latest my-app 15 | ``` 16 | 17 | ## Developing 18 | 19 | Once you've created a project and installed dependencies with `npm install` (or `pnpm install` or `yarn`), start a development server: 20 | 21 | ```bash 22 | npm run dev 23 | 24 | # or start the server and open the app in a new browser tab 25 | npm run dev -- --open 26 | ``` 27 | 28 | ## Building 29 | 30 | To create a production version of your app: 31 | 32 | ```bash 33 | npm run build 34 | ``` 35 | 36 | You can preview the production build with `npm run preview`. 37 | 38 | > To deploy your app, you may need to install an [adapter](https://kit.svelte.dev/docs/adapters) for your target environment. 39 | -------------------------------------------------------------------------------- /examples/vite-zig-project/public/vite.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /examples/vite-zig-project/style.css: -------------------------------------------------------------------------------- 1 | :root { 2 | font-family: Inter, system-ui, Avenir, Helvetica, Arial, sans-serif; 3 | line-height: 1.5; 4 | font-weight: 400; 5 | 6 | color-scheme: light dark; 7 | color: rgba(255, 255, 255, 0.87); 8 | background-color: #242424; 9 | 10 | font-synthesis: none; 11 | text-rendering: optimizeLegibility; 12 | -webkit-font-smoothing: antialiased; 13 | -moz-osx-font-smoothing: grayscale; 14 | } 15 | 16 | a { 17 | font-weight: 500; 18 | color: #646cff; 19 | text-decoration: inherit; 20 | } 21 | a:hover { 22 | color: #535bf2; 23 | } 24 | 25 | body { 26 | margin: 0; 27 | display: flex; 28 | place-items: center; 29 | min-width: 320px; 30 | min-height: 100vh; 31 | } 32 | 33 | h1 { 34 | font-size: 3.2em; 35 | line-height: 1.1; 36 | } 37 | 38 | #app { 39 | max-width: 1280px; 40 | margin: 0 auto; 41 | padding: 2rem; 42 | text-align: center; 43 | } 44 | 45 | .logo { 46 | height: 6em; 47 | padding: 1.5em; 48 | will-change: filter; 49 | transition: filter 300ms; 50 | } 51 | .logo:hover { 52 | filter: drop-shadow(0 0 2em #646cffaa); 53 | } 54 | .logo.vanilla:hover { 55 | filter: drop-shadow(0 0 2em #f7df1eaa); 56 | } 57 | 58 | .card { 59 | padding: 2em; 60 | } 61 | 62 | .read-the-docs { 63 | color: #888; 64 | } 65 | 66 | button { 67 | border-radius: 8px; 68 | border: 1px solid transparent; 69 | padding: 0.6em 1.2em; 70 | font-size: 1em; 71 | font-weight: 500; 72 | font-family: inherit; 73 | background-color: #1a1a1a; 74 | cursor: pointer; 75 | transition: border-color 0.25s; 76 | } 77 | button:hover { 78 | border-color: #646cff; 79 | } 80 | button:focus, 81 | button:focus-visible { 82 | outline: 4px auto -webkit-focus-ring-color; 83 | } 84 | 85 | @media (prefers-color-scheme: light) { 86 | :root { 87 | color: #213547; 88 | background-color: #ffffff; 89 | } 90 | a:hover { 91 | color: #747bff; 92 | } 93 | button { 94 | background-color: #f9f9f9; 95 | } 96 | } 97 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # vite-plugin-zig 2 | 3 | Import WebAssembly modules compiled from Zig files. 4 | 5 | ## Prerequisites 6 | 7 | - Install the [Zig compiler](https://ziglang.org): the binary can be downloaded from [downloads page](https://ziglang.org/download), or built from source by following the [GitHub Wiki instructions](https://github.com/ziglang/zig/wiki/Building-Zig-From-Source), or using the [zig-bootstrap](https://github.com/ziglang/zig-bootstrap) scripts. As an alternative, the [`@ziglang/cli`](https://github.com/pluvial/node-zig/tree/main/packages/cli) npm package can be added as a dependency, useful in a CI environment for instance. 8 | 9 | ## Usage 10 | 11 | Install with `npm i -D vite-plugin-zig` (or `pnpm i -D` or `yarn i -D`), then add the plugin to your `vite.config.js`: 12 | 13 | ```js 14 | // vite.config.js 15 | import zig from 'vite-plugin-zig'; 16 | 17 | /** @type {import('vite').UserConfig} */ 18 | export default { 19 | plugins: [zig()], 20 | build: { target: 'esnext' }, 21 | }; 22 | ``` 23 | 24 | Write your Zig code and `export` any symbol to be used in JS code: 25 | 26 | ```zig 27 | // src/main.zig 28 | export fn add(a: i32, b: i32) i32 { 29 | return a + b; 30 | } 31 | ``` 32 | 33 | If available, top-level await can be used so that importing the module feels similar to importing a regular JS module: 34 | 35 | ```js 36 | // example.js 37 | import { instantiate } from './src/main.zig'; 38 | 39 | // pass any custom importObject here, functions should be declared 40 | // as extern in the Zig file 41 | const importObject = { 42 | // ... 43 | }; 44 | // instantiate the compiled WebAssembly module, can also be moved 45 | // to a Worker for instantiation in another thread 46 | const { exports, instance } = await instantiate(importObject); 47 | // call exported functions from the exports object 48 | console.log(exports.add(5, 37)); // 42 49 | ``` 50 | 51 | As a shorthand to avoid having to manually call `await instantiate()`, the `?instantiate` query parameter can be specified in the module import to both compile and instantiate the module at import time, allowing access to `instance` and `exports`: 52 | 53 | ```js 54 | import { exports, instance, module } from './src/main.zig?instantiate'; 55 | 56 | // call exported functions from the exports object 57 | console.log(exports.add(5, 37)); // 42 58 | ``` 59 | 60 | If your Vite config does not allow for top-level await (by setting `build: { target: 'esnext' }`, e.g. if the framework you're using enforces a specific target value), an alternative API is provided which instead exposes Promises (`compiled` and `instantiated` respectively depending on whether `?instantiate` is used) which resolve when the compilation or instantiation of the module are complete: 61 | 62 | ```js 63 | // example.js 64 | import { compiled, instantiate, module } from './src/main.zig'; 65 | 66 | (async () => { 67 | // `await compiled` can be used to populate the `module` import 68 | // manually before instantiation if necessary 69 | 70 | // pass any custom importObject here, functions should be declared 71 | // as extern in the Zig file 72 | const importObject = { 73 | // ... 74 | }; 75 | // instantiate the compiled WebAssembly module, can also be moved 76 | // to a Worker for instantiation in another thread 77 | const { exports, instance } = await instantiate(importObject); 78 | // call exported functions from the exports object 79 | console.log(exports.add(5, 37)); // 42 80 | })(); 81 | ``` 82 | 83 | ```js 84 | // example.js 85 | import { 86 | exports, 87 | instance, 88 | instantiated, 89 | module, 90 | } from './src/main.zig?instantiate'; 91 | 92 | (async () => { 93 | // manually await to populate the imports 94 | await instantiated; 95 | // call exported functions from the exports object 96 | console.log(exports.add(5, 37)); // 42 97 | })(); 98 | ``` 99 | 100 | To integrate with SSR frameworks such as SvelteKit, use a dynamic import: 101 | 102 | ```svelte 103 | 112 | ``` 113 | 114 | ## Notes and TODOs 115 | 116 | - It would be great to have something similar to Rust's `wasm-bindgen` to generate JS glue code and type definitions 117 | 118 | ## License 119 | 120 | [MIT](LICENSE) 121 | -------------------------------------------------------------------------------- /index.js: -------------------------------------------------------------------------------- 1 | import { spawn } from 'child_process'; 2 | import * as fs from 'fs/promises'; 3 | import * as path from 'path'; 4 | import * as os from 'os'; 5 | 6 | const ext = '.zig'; 7 | 8 | const run = p => 9 | new Promise((resolve, reject) => { 10 | p.on('close', code => 11 | code === 0 12 | ? resolve() 13 | : reject(new Error(`Command ${p.spawnargs.join(' ')} failed with error code: ${code}`)), 14 | ); 15 | p.on('error', reject); 16 | }); 17 | 18 | /** 19 | * @param {object} options 20 | * @param {string} options.outDir 21 | * @param {string} options.tmpDir 22 | * @returns {import('vite').Plugin} 23 | */ 24 | export default function zig({ outDir = 'wasm', tmpDir = os.tmpdir() } = {}) { 25 | /** @type {import('vite').ResolvedConfig} */ 26 | let config; 27 | 28 | /** @type {Map} */ 29 | const map = new Map(); 30 | 31 | return { 32 | name: 'vite-plugin-zig', 33 | // resolveId(source, importer, options) { 34 | // console.log({ source, importer, options }); 35 | // }, 36 | // load(id, options) { 37 | // console.log({ id, options }); 38 | // if (id.endsWith(ext)) { 39 | // console.log(`load ${id}`); 40 | // } 41 | // }, 42 | async transform(code, id, options) { 43 | // console.log({ code, id, options }); 44 | const [filename, raw_query] = id.split(`?`, 2); 45 | if (filename.endsWith(ext)) { 46 | const name = path.basename(filename).slice(0, -ext.length); 47 | const wasm_file = `${name}.wasm`; 48 | const temp_file = path.posix.join(tmpDir, wasm_file); 49 | // TODO: check for dev/prd here 50 | const mode = 'ReleaseSmall'; // | 'Debug' | 'ReleaseFast' | 'ReleaseSafe' 51 | const command = `zig build-exe ${filename} -femit-bin=${temp_file} -fno-entry -rdynamic -target wasm32-freestanding -O ${ 52 | mode 53 | }`; 54 | const [cmd, ...args] = command.split(' '); 55 | const zig = spawn(cmd, args, { stdio: 'inherit' }); 56 | await run(zig); 57 | const wasm = await fs.readFile(temp_file); 58 | // const wasm = await fs.readFile(output_file); 59 | const dir = path.posix.join(config.build.assetsDir, outDir); 60 | const output_file = path.posix.join(dir, wasm_file); 61 | const output_url = path.posix.join(config.base, output_file); 62 | map.set(output_file, wasm); 63 | // TODO: was previously using this.emitFile() to have Rollup emit the 64 | // file with the hashed filename and then referencing it in the exported 65 | // module, need to find an alternative as currently the wasm filename 66 | // has no hash 67 | // const wasm = await fs.readFile(output_file); 68 | // const referenceId = this.emitFile({ 69 | // type: 'asset', 70 | // source: wasm, 71 | // name: wasm_file, 72 | // }); 73 | // const output_url = `import.meta.ROLLUP_FILE_URL_${referenceId}`; 74 | 75 | const query = new URLSearchParams(raw_query); 76 | const instantiate = query.get('instantiate') !== null; 77 | const code = 78 | config.build.target === 'esnext' 79 | ? instantiate 80 | ? ` 81 | const importObject = { env: { print(result) { console.log(result); } } }; 82 | export const { module, instance } = await WebAssembly.instantiateStreaming(fetch("${output_url}"), importObject); 83 | export const { exports } = instance; 84 | ` 85 | : ` 86 | export const module = await WebAssembly.compileStreaming(fetch('${output_url}')); 87 | export const instantiate = importObject => WebAssembly.instantiate(module, importObject).then(instance => { 88 | const { exports } = instance; 89 | return { instance, exports }; 90 | }); 91 | ` 92 | : instantiate 93 | ? ` 94 | const importObject = { env: { print(result) { console.log(result); } } }; 95 | export let module, instance, exports; 96 | export const instantiated = WebAssembly.instantiateStreaming(fetch("${output_url}"), importObject).then(result => { 97 | ({ module, instance } = result); 98 | ({ exports } = instance); 99 | }) 100 | ` 101 | : ` 102 | const importObject = { env: { print(result) { console.log(result); } } }; 103 | export let module; 104 | export const compiled = WebAssembly.compileStreaming(fetch("${output_url}")).then(result => { 105 | module = result; 106 | return module; 107 | }) 108 | export const instantiate = importObject => compiled.then(module => WebAssembly.instantiate(module, importObject).then(instance => { 109 | const { exports } = instance; 110 | return { instance, exports }; 111 | }); 112 | `; 113 | return { 114 | code, 115 | map: { mappings: '' }, 116 | // moduleSideEffects: false, 117 | }; 118 | } 119 | }, 120 | // adapted from vite-plugin-wasm-pack 121 | buildEnd() { 122 | // copy xxx.wasm files to /assets/xxx.wasm 123 | map.forEach((wasm, output_file) => { 124 | this.emitFile({ 125 | type: 'asset', 126 | fileName: output_file, 127 | // name: path.basename(output_file), 128 | source: wasm, 129 | }); 130 | }); 131 | }, 132 | // alternative approach used in vite-plugin-wasm-go 133 | // closeBundle() { 134 | // map.forEach((value, output_file) => { 135 | // const buildFilename = path.posix.join(buildConfig.build.outDir, output_file); 136 | // await fs.mkdirs(path.dirname(buildFilename)); 137 | // await fs.writeFile(buildFilename, value); 138 | // }); 139 | // }, 140 | configResolved(resolvedConfig) { 141 | config = resolvedConfig; 142 | }, 143 | // adapted from vite-plugin-wasm-go 144 | configureServer(server) { 145 | server.middlewares.use((req, res, next) => { 146 | const url = req.url?.replace(/^\//, '') || ''; 147 | if (map.get(url)) { 148 | res.writeHead(200, { 'Content-Type': 'application/wasm' }); 149 | res.end(map.get(url)); 150 | return; 151 | } 152 | next(); 153 | }); 154 | }, 155 | }; 156 | } 157 | -------------------------------------------------------------------------------- /index.cjs: -------------------------------------------------------------------------------- 1 | var __create = Object.create; 2 | var __defProp = Object.defineProperty; 3 | var __getOwnPropDesc = Object.getOwnPropertyDescriptor; 4 | var __getOwnPropNames = Object.getOwnPropertyNames; 5 | var __getProtoOf = Object.getPrototypeOf; 6 | var __hasOwnProp = Object.prototype.hasOwnProperty; 7 | var __export = (target, all) => { 8 | for (var name in all) 9 | __defProp(target, name, { get: all[name], enumerable: true }); 10 | }; 11 | var __copyProps = (to, from, except, desc) => { 12 | if (from && typeof from === "object" || typeof from === "function") { 13 | for (let key of __getOwnPropNames(from)) 14 | if (!__hasOwnProp.call(to, key) && key !== except) 15 | __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); 16 | } 17 | return to; 18 | }; 19 | var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( 20 | // If the importer is in node compatibility mode or this is not an ESM 21 | // file that has been converted to a CommonJS file using a Babel- 22 | // compatible transform (i.e. "__esModule" has not been set), then set 23 | // "default" to the CommonJS "module.exports" for node compatibility. 24 | isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, 25 | mod 26 | )); 27 | var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); 28 | 29 | // index.js 30 | var vite_plugin_zig_exports = {}; 31 | __export(vite_plugin_zig_exports, { 32 | default: () => zig 33 | }); 34 | module.exports = __toCommonJS(vite_plugin_zig_exports); 35 | var import_child_process = require("child_process"); 36 | var fs = __toESM(require("fs/promises"), 1); 37 | var path = __toESM(require("path"), 1); 38 | var os = __toESM(require("os"), 1); 39 | var ext = ".zig"; 40 | var run = (p) => new Promise((resolve, reject) => { 41 | p.on( 42 | "close", 43 | (code) => code === 0 ? resolve() : reject(new Error(`Command ${p.spawnargs.join(" ")} failed with error code: ${code}`)) 44 | ); 45 | p.on("error", reject); 46 | }); 47 | function zig({ outDir = "wasm", tmpDir = os.tmpdir() } = {}) { 48 | let config; 49 | const map = /* @__PURE__ */ new Map(); 50 | return { 51 | name: "vite-plugin-zig", 52 | // resolveId(source, importer, options) { 53 | // console.log({ source, importer, options }); 54 | // }, 55 | // load(id, options) { 56 | // console.log({ id, options }); 57 | // if (id.endsWith(ext)) { 58 | // console.log(`load ${id}`); 59 | // } 60 | // }, 61 | async transform(code, id, options) { 62 | const [filename, raw_query] = id.split(`?`, 2); 63 | if (filename.endsWith(ext)) { 64 | const name = path.basename(filename).slice(0, -ext.length); 65 | const wasm_file = `${name}.wasm`; 66 | const temp_file = path.posix.join(tmpDir, wasm_file); 67 | const mode = "ReleaseSmall"; 68 | const command = `zig build-exe ${filename} -femit-bin=${temp_file} -fno-entry -rdynamic -target wasm32-freestanding -O ${mode}`; 69 | const [cmd, ...args] = command.split(" "); 70 | const zig2 = (0, import_child_process.spawn)(cmd, args, { stdio: "inherit" }); 71 | await run(zig2); 72 | const wasm = await fs.readFile(temp_file); 73 | const dir = path.posix.join(config.build.assetsDir, outDir); 74 | const output_file = path.posix.join(dir, wasm_file); 75 | const output_url = path.posix.join(config.base, output_file); 76 | map.set(output_file, wasm); 77 | const query = new URLSearchParams(raw_query); 78 | const instantiate = query.get("instantiate") !== null; 79 | const code2 = config.build.target === "esnext" ? instantiate ? ` 80 | const importObject = { env: { print(result) { console.log(result); } } }; 81 | export const { module, instance } = await WebAssembly.instantiateStreaming(fetch("${output_url}"), importObject); 82 | export const { exports } = instance; 83 | ` : ` 84 | export const module = await WebAssembly.compileStreaming(fetch('${output_url}')); 85 | export const instantiate = importObject => WebAssembly.instantiate(module, importObject).then(instance => { 86 | const { exports } = instance; 87 | return { instance, exports }; 88 | }); 89 | ` : instantiate ? ` 90 | const importObject = { env: { print(result) { console.log(result); } } }; 91 | export let module, instance, exports; 92 | export const instantiated = WebAssembly.instantiateStreaming(fetch("${output_url}"), importObject).then(result => { 93 | ({ module, instance } = result); 94 | ({ exports } = instance); 95 | }) 96 | ` : ` 97 | const importObject = { env: { print(result) { console.log(result); } } }; 98 | export let module; 99 | export const compiled = WebAssembly.compileStreaming(fetch("${output_url}")).then(result => { 100 | module = result; 101 | return module; 102 | }) 103 | export const instantiate = importObject => compiled.then(module => WebAssembly.instantiate(module, importObject).then(instance => { 104 | const { exports } = instance; 105 | return { instance, exports }; 106 | }); 107 | `; 108 | return { 109 | code: code2, 110 | map: { mappings: "" } 111 | // moduleSideEffects: false, 112 | }; 113 | } 114 | }, 115 | // adapted from vite-plugin-wasm-pack 116 | buildEnd() { 117 | map.forEach((wasm, output_file) => { 118 | this.emitFile({ 119 | type: "asset", 120 | fileName: output_file, 121 | // name: path.basename(output_file), 122 | source: wasm 123 | }); 124 | }); 125 | }, 126 | // alternative approach used in vite-plugin-wasm-go 127 | // closeBundle() { 128 | // map.forEach((value, output_file) => { 129 | // const buildFilename = path.posix.join(buildConfig.build.outDir, output_file); 130 | // await fs.mkdirs(path.dirname(buildFilename)); 131 | // await fs.writeFile(buildFilename, value); 132 | // }); 133 | // }, 134 | configResolved(resolvedConfig) { 135 | config = resolvedConfig; 136 | }, 137 | // adapted from vite-plugin-wasm-go 138 | configureServer(server) { 139 | server.middlewares.use((req, res, next) => { 140 | const url = req.url?.replace(/^\//, "") || ""; 141 | if (map.get(url)) { 142 | res.writeHead(200, { "Content-Type": "application/wasm" }); 143 | res.end(map.get(url)); 144 | return; 145 | } 146 | next(); 147 | }); 148 | } 149 | }; 150 | } 151 | -------------------------------------------------------------------------------- /pnpm-lock.yaml: -------------------------------------------------------------------------------- 1 | lockfileVersion: '9.0' 2 | 3 | settings: 4 | autoInstallPeers: true 5 | excludeLinksFromLockfile: false 6 | 7 | importers: 8 | 9 | .: 10 | devDependencies: 11 | esbuild: 12 | specifier: ^0.21.5 13 | version: 0.21.5 14 | vite: 15 | specifier: ^5.3.1 16 | version: 5.3.1 17 | 18 | examples/svelte-kit-zig-project: 19 | devDependencies: 20 | '@sveltejs/adapter-static': 21 | specifier: ^3.0.2 22 | version: 3.0.2(@sveltejs/kit@2.5.16(@sveltejs/vite-plugin-svelte@3.1.1(svelte@4.2.18)(vite@5.3.1))(svelte@4.2.18)(vite@5.3.1)) 23 | '@sveltejs/kit': 24 | specifier: ^2.0.0 25 | version: 2.5.16(@sveltejs/vite-plugin-svelte@3.1.1(svelte@4.2.18)(vite@5.3.1))(svelte@4.2.18)(vite@5.3.1) 26 | '@sveltejs/vite-plugin-svelte': 27 | specifier: ^3.0.0 28 | version: 3.1.1(svelte@4.2.18)(vite@5.3.1) 29 | svelte: 30 | specifier: ^4.2.7 31 | version: 4.2.18 32 | vite: 33 | specifier: ^5.0.3 34 | version: 5.3.1 35 | vite-plugin-zig: 36 | specifier: workspace:* 37 | version: link:../.. 38 | 39 | examples/vite-zig-project: 40 | devDependencies: 41 | vite: 42 | specifier: ^5.2.0 43 | version: 5.3.1 44 | vite-plugin-inspect: 45 | specifier: ^0.8.4 46 | version: 0.8.4(rollup@4.18.0)(vite@5.3.1) 47 | vite-plugin-zig: 48 | specifier: workspace:* 49 | version: link:../.. 50 | 51 | packages: 52 | 53 | '@ampproject/remapping@2.3.0': 54 | resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==} 55 | engines: {node: '>=6.0.0'} 56 | 57 | '@antfu/utils@0.7.8': 58 | resolution: {integrity: sha512-rWQkqXRESdjXtc+7NRfK9lASQjpXJu1ayp7qi1d23zZorY+wBHVLHHoVcMsEnkqEBWTFqbztO7/QdJFzyEcLTg==} 59 | 60 | '@esbuild/aix-ppc64@0.21.5': 61 | resolution: {integrity: sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==} 62 | engines: {node: '>=12'} 63 | cpu: [ppc64] 64 | os: [aix] 65 | 66 | '@esbuild/android-arm64@0.21.5': 67 | resolution: {integrity: sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==} 68 | engines: {node: '>=12'} 69 | cpu: [arm64] 70 | os: [android] 71 | 72 | '@esbuild/android-arm@0.21.5': 73 | resolution: {integrity: sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==} 74 | engines: {node: '>=12'} 75 | cpu: [arm] 76 | os: [android] 77 | 78 | '@esbuild/android-x64@0.21.5': 79 | resolution: {integrity: sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==} 80 | engines: {node: '>=12'} 81 | cpu: [x64] 82 | os: [android] 83 | 84 | '@esbuild/darwin-arm64@0.21.5': 85 | resolution: {integrity: sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==} 86 | engines: {node: '>=12'} 87 | cpu: [arm64] 88 | os: [darwin] 89 | 90 | '@esbuild/darwin-x64@0.21.5': 91 | resolution: {integrity: sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==} 92 | engines: {node: '>=12'} 93 | cpu: [x64] 94 | os: [darwin] 95 | 96 | '@esbuild/freebsd-arm64@0.21.5': 97 | resolution: {integrity: sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==} 98 | engines: {node: '>=12'} 99 | cpu: [arm64] 100 | os: [freebsd] 101 | 102 | '@esbuild/freebsd-x64@0.21.5': 103 | resolution: {integrity: sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==} 104 | engines: {node: '>=12'} 105 | cpu: [x64] 106 | os: [freebsd] 107 | 108 | '@esbuild/linux-arm64@0.21.5': 109 | resolution: {integrity: sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==} 110 | engines: {node: '>=12'} 111 | cpu: [arm64] 112 | os: [linux] 113 | 114 | '@esbuild/linux-arm@0.21.5': 115 | resolution: {integrity: sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==} 116 | engines: {node: '>=12'} 117 | cpu: [arm] 118 | os: [linux] 119 | 120 | '@esbuild/linux-ia32@0.21.5': 121 | resolution: {integrity: sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==} 122 | engines: {node: '>=12'} 123 | cpu: [ia32] 124 | os: [linux] 125 | 126 | '@esbuild/linux-loong64@0.21.5': 127 | resolution: {integrity: sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==} 128 | engines: {node: '>=12'} 129 | cpu: [loong64] 130 | os: [linux] 131 | 132 | '@esbuild/linux-mips64el@0.21.5': 133 | resolution: {integrity: sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==} 134 | engines: {node: '>=12'} 135 | cpu: [mips64el] 136 | os: [linux] 137 | 138 | '@esbuild/linux-ppc64@0.21.5': 139 | resolution: {integrity: sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==} 140 | engines: {node: '>=12'} 141 | cpu: [ppc64] 142 | os: [linux] 143 | 144 | '@esbuild/linux-riscv64@0.21.5': 145 | resolution: {integrity: sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==} 146 | engines: {node: '>=12'} 147 | cpu: [riscv64] 148 | os: [linux] 149 | 150 | '@esbuild/linux-s390x@0.21.5': 151 | resolution: {integrity: sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==} 152 | engines: {node: '>=12'} 153 | cpu: [s390x] 154 | os: [linux] 155 | 156 | '@esbuild/linux-x64@0.21.5': 157 | resolution: {integrity: sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==} 158 | engines: {node: '>=12'} 159 | cpu: [x64] 160 | os: [linux] 161 | 162 | '@esbuild/netbsd-x64@0.21.5': 163 | resolution: {integrity: sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==} 164 | engines: {node: '>=12'} 165 | cpu: [x64] 166 | os: [netbsd] 167 | 168 | '@esbuild/openbsd-x64@0.21.5': 169 | resolution: {integrity: sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==} 170 | engines: {node: '>=12'} 171 | cpu: [x64] 172 | os: [openbsd] 173 | 174 | '@esbuild/sunos-x64@0.21.5': 175 | resolution: {integrity: sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==} 176 | engines: {node: '>=12'} 177 | cpu: [x64] 178 | os: [sunos] 179 | 180 | '@esbuild/win32-arm64@0.21.5': 181 | resolution: {integrity: sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==} 182 | engines: {node: '>=12'} 183 | cpu: [arm64] 184 | os: [win32] 185 | 186 | '@esbuild/win32-ia32@0.21.5': 187 | resolution: {integrity: sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==} 188 | engines: {node: '>=12'} 189 | cpu: [ia32] 190 | os: [win32] 191 | 192 | '@esbuild/win32-x64@0.21.5': 193 | resolution: {integrity: sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==} 194 | engines: {node: '>=12'} 195 | cpu: [x64] 196 | os: [win32] 197 | 198 | '@jridgewell/gen-mapping@0.3.5': 199 | resolution: {integrity: sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==} 200 | engines: {node: '>=6.0.0'} 201 | 202 | '@jridgewell/resolve-uri@3.1.2': 203 | resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} 204 | engines: {node: '>=6.0.0'} 205 | 206 | '@jridgewell/set-array@1.2.1': 207 | resolution: {integrity: sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==} 208 | engines: {node: '>=6.0.0'} 209 | 210 | '@jridgewell/sourcemap-codec@1.4.15': 211 | resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==} 212 | 213 | '@jridgewell/trace-mapping@0.3.25': 214 | resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==} 215 | 216 | '@polka/url@1.0.0-next.25': 217 | resolution: {integrity: sha512-j7P6Rgr3mmtdkeDGTe0E/aYyWEWVtc5yFXtHCRHs28/jptDEWfaVOc5T7cblqy1XKPPfCxJc/8DwQ5YgLOZOVQ==} 218 | 219 | '@rollup/pluginutils@5.1.0': 220 | resolution: {integrity: sha512-XTIWOPPcpvyKI6L1NHo0lFlCyznUEyPmPY1mc3KpPVDYulHSTvyeLNVW00QTLIAFNhR3kYnJTQHeGqU4M3n09g==} 221 | engines: {node: '>=14.0.0'} 222 | peerDependencies: 223 | rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 224 | peerDependenciesMeta: 225 | rollup: 226 | optional: true 227 | 228 | '@rollup/rollup-android-arm-eabi@4.18.0': 229 | resolution: {integrity: sha512-Tya6xypR10giZV1XzxmH5wr25VcZSncG0pZIjfePT0OVBvqNEurzValetGNarVrGiq66EBVAFn15iYX4w6FKgQ==} 230 | cpu: [arm] 231 | os: [android] 232 | 233 | '@rollup/rollup-android-arm64@4.18.0': 234 | resolution: {integrity: sha512-avCea0RAP03lTsDhEyfy+hpfr85KfyTctMADqHVhLAF3MlIkq83CP8UfAHUssgXTYd+6er6PaAhx/QGv4L1EiA==} 235 | cpu: [arm64] 236 | os: [android] 237 | 238 | '@rollup/rollup-darwin-arm64@4.18.0': 239 | resolution: {integrity: sha512-IWfdwU7KDSm07Ty0PuA/W2JYoZ4iTj3TUQjkVsO/6U+4I1jN5lcR71ZEvRh52sDOERdnNhhHU57UITXz5jC1/w==} 240 | cpu: [arm64] 241 | os: [darwin] 242 | 243 | '@rollup/rollup-darwin-x64@4.18.0': 244 | resolution: {integrity: sha512-n2LMsUz7Ynu7DoQrSQkBf8iNrjOGyPLrdSg802vk6XT3FtsgX6JbE8IHRvposskFm9SNxzkLYGSq9QdpLYpRNA==} 245 | cpu: [x64] 246 | os: [darwin] 247 | 248 | '@rollup/rollup-linux-arm-gnueabihf@4.18.0': 249 | resolution: {integrity: sha512-C/zbRYRXFjWvz9Z4haRxcTdnkPt1BtCkz+7RtBSuNmKzMzp3ZxdM28Mpccn6pt28/UWUCTXa+b0Mx1k3g6NOMA==} 250 | cpu: [arm] 251 | os: [linux] 252 | 253 | '@rollup/rollup-linux-arm-musleabihf@4.18.0': 254 | resolution: {integrity: sha512-l3m9ewPgjQSXrUMHg93vt0hYCGnrMOcUpTz6FLtbwljo2HluS4zTXFy2571YQbisTnfTKPZ01u/ukJdQTLGh9A==} 255 | cpu: [arm] 256 | os: [linux] 257 | 258 | '@rollup/rollup-linux-arm64-gnu@4.18.0': 259 | resolution: {integrity: sha512-rJ5D47d8WD7J+7STKdCUAgmQk49xuFrRi9pZkWoRD1UeSMakbcepWXPF8ycChBoAqs1pb2wzvbY6Q33WmN2ftw==} 260 | cpu: [arm64] 261 | os: [linux] 262 | 263 | '@rollup/rollup-linux-arm64-musl@4.18.0': 264 | resolution: {integrity: sha512-be6Yx37b24ZwxQ+wOQXXLZqpq4jTckJhtGlWGZs68TgdKXJgw54lUUoFYrg6Zs/kjzAQwEwYbp8JxZVzZLRepQ==} 265 | cpu: [arm64] 266 | os: [linux] 267 | 268 | '@rollup/rollup-linux-powerpc64le-gnu@4.18.0': 269 | resolution: {integrity: sha512-hNVMQK+qrA9Todu9+wqrXOHxFiD5YmdEi3paj6vP02Kx1hjd2LLYR2eaN7DsEshg09+9uzWi2W18MJDlG0cxJA==} 270 | cpu: [ppc64] 271 | os: [linux] 272 | 273 | '@rollup/rollup-linux-riscv64-gnu@4.18.0': 274 | resolution: {integrity: sha512-ROCM7i+m1NfdrsmvwSzoxp9HFtmKGHEqu5NNDiZWQtXLA8S5HBCkVvKAxJ8U+CVctHwV2Gb5VUaK7UAkzhDjlg==} 275 | cpu: [riscv64] 276 | os: [linux] 277 | 278 | '@rollup/rollup-linux-s390x-gnu@4.18.0': 279 | resolution: {integrity: sha512-0UyyRHyDN42QL+NbqevXIIUnKA47A+45WyasO+y2bGJ1mhQrfrtXUpTxCOrfxCR4esV3/RLYyucGVPiUsO8xjg==} 280 | cpu: [s390x] 281 | os: [linux] 282 | 283 | '@rollup/rollup-linux-x64-gnu@4.18.0': 284 | resolution: {integrity: sha512-xuglR2rBVHA5UsI8h8UbX4VJ470PtGCf5Vpswh7p2ukaqBGFTnsfzxUBetoWBWymHMxbIG0Cmx7Y9qDZzr648w==} 285 | cpu: [x64] 286 | os: [linux] 287 | 288 | '@rollup/rollup-linux-x64-musl@4.18.0': 289 | resolution: {integrity: sha512-LKaqQL9osY/ir2geuLVvRRs+utWUNilzdE90TpyoX0eNqPzWjRm14oMEE+YLve4k/NAqCdPkGYDaDF5Sw+xBfg==} 290 | cpu: [x64] 291 | os: [linux] 292 | 293 | '@rollup/rollup-win32-arm64-msvc@4.18.0': 294 | resolution: {integrity: sha512-7J6TkZQFGo9qBKH0pk2cEVSRhJbL6MtfWxth7Y5YmZs57Pi+4x6c2dStAUvaQkHQLnEQv1jzBUW43GvZW8OFqA==} 295 | cpu: [arm64] 296 | os: [win32] 297 | 298 | '@rollup/rollup-win32-ia32-msvc@4.18.0': 299 | resolution: {integrity: sha512-Txjh+IxBPbkUB9+SXZMpv+b/vnTEtFyfWZgJ6iyCmt2tdx0OF5WhFowLmnh8ENGNpfUlUZkdI//4IEmhwPieNg==} 300 | cpu: [ia32] 301 | os: [win32] 302 | 303 | '@rollup/rollup-win32-x64-msvc@4.18.0': 304 | resolution: {integrity: sha512-UOo5FdvOL0+eIVTgS4tIdbW+TtnBLWg1YBCcU2KWM7nuNwRz9bksDX1bekJJCpu25N1DVWaCwnT39dVQxzqS8g==} 305 | cpu: [x64] 306 | os: [win32] 307 | 308 | '@sveltejs/adapter-static@3.0.2': 309 | resolution: {integrity: sha512-/EBFydZDwfwFfFEuF1vzUseBoRziwKP7AoHAwv+Ot3M084sE/HTVBHf9mCmXfdM9ijprY5YEugZjleflncX5fQ==} 310 | peerDependencies: 311 | '@sveltejs/kit': ^2.0.0 312 | 313 | '@sveltejs/kit@2.5.16': 314 | resolution: {integrity: sha512-09Ypy+ibuhTCTpRFRnR+cDI3VARiu16o7vVSjETAA43ZCLtqvrNrVxUkJ/fKHrAjx2peKWilcHE8+SbW2Z/AsQ==} 315 | engines: {node: '>=18.13'} 316 | hasBin: true 317 | peerDependencies: 318 | '@sveltejs/vite-plugin-svelte': ^3.0.0 319 | svelte: ^4.0.0 || ^5.0.0-next.0 320 | vite: ^5.0.3 321 | 322 | '@sveltejs/vite-plugin-svelte-inspector@2.1.0': 323 | resolution: {integrity: sha512-9QX28IymvBlSCqsCll5t0kQVxipsfhFFL+L2t3nTWfXnddYwxBuAEtTtlaVQpRz9c37BhJjltSeY4AJSC03SSg==} 324 | engines: {node: ^18.0.0 || >=20} 325 | peerDependencies: 326 | '@sveltejs/vite-plugin-svelte': ^3.0.0 327 | svelte: ^4.0.0 || ^5.0.0-next.0 328 | vite: ^5.0.0 329 | 330 | '@sveltejs/vite-plugin-svelte@3.1.1': 331 | resolution: {integrity: sha512-rimpFEAboBBHIlzISibg94iP09k/KYdHgVhJlcsTfn7KMBhc70jFX/GRWkRdFCc2fdnk+4+Bdfej23cMDnJS6A==} 332 | engines: {node: ^18.0.0 || >=20} 333 | peerDependencies: 334 | svelte: ^4.0.0 || ^5.0.0-next.0 335 | vite: ^5.0.0 336 | 337 | '@types/cookie@0.6.0': 338 | resolution: {integrity: sha512-4Kh9a6B2bQciAhf7FSuMRRkUWecJgJu9nPnx3yzpsfXX/c50REIqpHY4C82bXP90qrLtXtkDxTZosYO3UpOwlA==} 339 | 340 | '@types/estree@1.0.5': 341 | resolution: {integrity: sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==} 342 | 343 | acorn@8.12.0: 344 | resolution: {integrity: sha512-RTvkC4w+KNXrM39/lWCUaG0IbRkWdCv7W/IOW9oU6SawyxulvkQy5HQPVTKxEjczcUvapcrw3cFx/60VN/NRNw==} 345 | engines: {node: '>=0.4.0'} 346 | hasBin: true 347 | 348 | aria-query@5.3.0: 349 | resolution: {integrity: sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==} 350 | 351 | axobject-query@4.0.0: 352 | resolution: {integrity: sha512-+60uv1hiVFhHZeO+Lz0RYzsVHy5Wr1ayX0mwda9KPDVLNJgZ1T9Ny7VmFbLDzxsH0D87I86vgj3gFrjTJUYznw==} 353 | 354 | bundle-name@4.1.0: 355 | resolution: {integrity: sha512-tjwM5exMg6BGRI+kNmTntNsvdZS1X8BFYS6tnJ2hdH0kVxM6/eVZ2xy+FqStSWvYmtfFMDLIxurorHwDKfDz5Q==} 356 | engines: {node: '>=18'} 357 | 358 | code-red@1.0.4: 359 | resolution: {integrity: sha512-7qJWqItLA8/VPVlKJlFXU+NBlo/qyfs39aJcuMT/2ere32ZqvF5OSxgdM5xOfJJ7O429gg2HM47y8v9P+9wrNw==} 360 | 361 | cookie@0.6.0: 362 | resolution: {integrity: sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==} 363 | engines: {node: '>= 0.6'} 364 | 365 | css-tree@2.3.1: 366 | resolution: {integrity: sha512-6Fv1DV/TYw//QF5IzQdqsNDjx/wc8TrMBZsqjL9eW01tWb7R7k/mq+/VXfJCl7SoD5emsJop9cOByJZfs8hYIw==} 367 | engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0} 368 | 369 | debug@4.3.5: 370 | resolution: {integrity: sha512-pt0bNEmneDIvdL1Xsd9oDQ/wrQRkXDT4AUWlNZNPKvW5x/jyO9VFXkJUP07vQ2upmw5PlaITaPKc31jK13V+jg==} 371 | engines: {node: '>=6.0'} 372 | peerDependencies: 373 | supports-color: '*' 374 | peerDependenciesMeta: 375 | supports-color: 376 | optional: true 377 | 378 | deepmerge@4.3.1: 379 | resolution: {integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==} 380 | engines: {node: '>=0.10.0'} 381 | 382 | default-browser-id@5.0.0: 383 | resolution: {integrity: sha512-A6p/pu/6fyBcA1TRz/GqWYPViplrftcW2gZC9q79ngNCKAeR/X3gcEdXQHl4KNXV+3wgIJ1CPkJQ3IHM6lcsyA==} 384 | engines: {node: '>=18'} 385 | 386 | default-browser@5.2.1: 387 | resolution: {integrity: sha512-WY/3TUME0x3KPYdRRxEJJvXRHV4PyPoUsxtZa78lwItwRQRHhd2U9xOscaT/YTf8uCXIAjeJOFBVEh/7FtD8Xg==} 388 | engines: {node: '>=18'} 389 | 390 | define-lazy-prop@3.0.0: 391 | resolution: {integrity: sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==} 392 | engines: {node: '>=12'} 393 | 394 | dequal@2.0.3: 395 | resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==} 396 | engines: {node: '>=6'} 397 | 398 | devalue@5.0.0: 399 | resolution: {integrity: sha512-gO+/OMXF7488D+u3ue+G7Y4AA3ZmUnB3eHJXmBTgNHvr4ZNzl36A0ZtG+XCRNYCkYx/bFmw4qtkoFLa+wSrwAA==} 400 | 401 | error-stack-parser-es@0.1.4: 402 | resolution: {integrity: sha512-l0uy0kAoo6toCgVOYaAayqtPa2a1L15efxUMEnQebKwLQX2X0OpS6wMMQdc4juJXmxd9i40DuaUHq+mjIya9TQ==} 403 | 404 | esbuild@0.21.5: 405 | resolution: {integrity: sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==} 406 | engines: {node: '>=12'} 407 | hasBin: true 408 | 409 | esm-env@1.0.0: 410 | resolution: {integrity: sha512-Cf6VksWPsTuW01vU9Mk/3vRue91Zevka5SjyNf3nEpokFRuqt/KjUQoGAwq9qMmhpLTHmXzSIrFRw8zxWzmFBA==} 411 | 412 | estree-walker@2.0.2: 413 | resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==} 414 | 415 | estree-walker@3.0.3: 416 | resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==} 417 | 418 | fs-extra@11.2.0: 419 | resolution: {integrity: sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==} 420 | engines: {node: '>=14.14'} 421 | 422 | fsevents@2.3.3: 423 | resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} 424 | engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} 425 | os: [darwin] 426 | 427 | globalyzer@0.1.0: 428 | resolution: {integrity: sha512-40oNTM9UfG6aBmuKxk/giHn5nQ8RVz/SS4Ir6zgzOv9/qC3kKZ9v4etGTcJbEl/NyVQH7FGU7d+X1egr57Md2Q==} 429 | 430 | globrex@0.1.2: 431 | resolution: {integrity: sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg==} 432 | 433 | graceful-fs@4.2.11: 434 | resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} 435 | 436 | import-meta-resolve@4.1.0: 437 | resolution: {integrity: sha512-I6fiaX09Xivtk+THaMfAwnA3MVA5Big1WHF1Dfx9hFuvNIWpXnorlkzhcQf6ehrqQiiZECRt1poOAkPmer3ruw==} 438 | 439 | is-docker@3.0.0: 440 | resolution: {integrity: sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==} 441 | engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} 442 | hasBin: true 443 | 444 | is-inside-container@1.0.0: 445 | resolution: {integrity: sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==} 446 | engines: {node: '>=14.16'} 447 | hasBin: true 448 | 449 | is-reference@3.0.2: 450 | resolution: {integrity: sha512-v3rht/LgVcsdZa3O2Nqs+NMowLOxeOm7Ay9+/ARQ2F+qEoANRcqrjAZKGN0v8ymUetZGgkp26LTnGT7H0Qo9Pg==} 451 | 452 | is-wsl@3.1.0: 453 | resolution: {integrity: sha512-UcVfVfaK4Sc4m7X3dUSoHoozQGBEFeDC+zVo06t98xe8CzHSZZBekNXH+tu0NalHolcJ/QAGqS46Hef7QXBIMw==} 454 | engines: {node: '>=16'} 455 | 456 | jsonfile@6.1.0: 457 | resolution: {integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==} 458 | 459 | kleur@4.1.5: 460 | resolution: {integrity: sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==} 461 | engines: {node: '>=6'} 462 | 463 | locate-character@3.0.0: 464 | resolution: {integrity: sha512-SW13ws7BjaeJ6p7Q6CO2nchbYEc3X3J6WrmTTDto7yMPqVSZTUyY5Tjbid+Ab8gLnATtygYtiDIJGQRRn2ZOiA==} 465 | 466 | magic-string@0.30.10: 467 | resolution: {integrity: sha512-iIRwTIf0QKV3UAnYK4PU8uiEc4SRh5jX0mwpIwETPpHdhVM4f53RSwS/vXvN1JhGX+Cs7B8qIq3d6AH49O5fAQ==} 468 | 469 | mdn-data@2.0.30: 470 | resolution: {integrity: sha512-GaqWWShW4kv/G9IEucWScBx9G1/vsFZZJUO+tD26M8J8z3Kw5RDQjaoZe03YAClgeS/SWPOcb4nkFBTEi5DUEA==} 471 | 472 | mri@1.2.0: 473 | resolution: {integrity: sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==} 474 | engines: {node: '>=4'} 475 | 476 | mrmime@2.0.0: 477 | resolution: {integrity: sha512-eu38+hdgojoyq63s+yTpN4XMBdt5l8HhMhc4VKLO9KM5caLIBvUm4thi7fFaxyTmCKeNnXZ5pAlBwCUnhA09uw==} 478 | engines: {node: '>=10'} 479 | 480 | ms@2.1.2: 481 | resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} 482 | 483 | nanoid@3.3.7: 484 | resolution: {integrity: sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==} 485 | engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} 486 | hasBin: true 487 | 488 | open@10.1.0: 489 | resolution: {integrity: sha512-mnkeQ1qP5Ue2wd+aivTD3NHd/lZ96Lu0jgf0pwktLPtx6cTZiH7tyeGRRHs0zX0rbrahXPnXlUnbeXyaBBuIaw==} 490 | engines: {node: '>=18'} 491 | 492 | perfect-debounce@1.0.0: 493 | resolution: {integrity: sha512-xCy9V055GLEqoFaHoC1SoLIaLmWctgCUaBaWxDZ7/Zx4CTyX7cJQLJOok/orfjZAh9kEYpjJa4d0KcJmCbctZA==} 494 | 495 | periscopic@3.1.0: 496 | resolution: {integrity: sha512-vKiQ8RRtkl9P+r/+oefh25C3fhybptkHKCZSPlcXiJux2tJF55GnEj3BVn4A5gKfq9NWWXXrxkHBwVPUfH0opw==} 497 | 498 | picocolors@1.0.1: 499 | resolution: {integrity: sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==} 500 | 501 | picomatch@2.3.1: 502 | resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} 503 | engines: {node: '>=8.6'} 504 | 505 | postcss@8.4.38: 506 | resolution: {integrity: sha512-Wglpdk03BSfXkHoQa3b/oulrotAkwrlLDRSOb9D0bN86FdRyE9lppSp33aHNPgBa0JKCoB+drFLZkQoRRYae5A==} 507 | engines: {node: ^10 || ^12 || >=14} 508 | 509 | rollup@4.18.0: 510 | resolution: {integrity: sha512-QmJz14PX3rzbJCN1SG4Xe/bAAX2a6NpCP8ab2vfu2GiUr8AQcr2nCV/oEO3yneFarB67zk8ShlIyWb2LGTb3Sg==} 511 | engines: {node: '>=18.0.0', npm: '>=8.0.0'} 512 | hasBin: true 513 | 514 | run-applescript@7.0.0: 515 | resolution: {integrity: sha512-9by4Ij99JUr/MCFBUkDKLWK3G9HVXmabKz9U5MlIAIuvuzkiOicRYs8XJLxX+xahD+mLiiCYDqF9dKAgtzKP1A==} 516 | engines: {node: '>=18'} 517 | 518 | sade@1.8.1: 519 | resolution: {integrity: sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A==} 520 | engines: {node: '>=6'} 521 | 522 | set-cookie-parser@2.6.0: 523 | resolution: {integrity: sha512-RVnVQxTXuerk653XfuliOxBP81Sf0+qfQE73LIYKcyMYHG94AuH0kgrQpRDuTZnSmjpysHmzxJXKNfa6PjFhyQ==} 524 | 525 | sirv@2.0.4: 526 | resolution: {integrity: sha512-94Bdh3cC2PKrbgSOUqTiGPWVZeSiXfKOVZNJniWoqrWrRkB1CJzBU3NEbiTsPcYy1lDsANA/THzS+9WBiy5nfQ==} 527 | engines: {node: '>= 10'} 528 | 529 | source-map-js@1.2.0: 530 | resolution: {integrity: sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==} 531 | engines: {node: '>=0.10.0'} 532 | 533 | svelte-hmr@0.16.0: 534 | resolution: {integrity: sha512-Gyc7cOS3VJzLlfj7wKS0ZnzDVdv3Pn2IuVeJPk9m2skfhcu5bq3wtIZyQGggr7/Iim5rH5cncyQft/kRLupcnA==} 535 | engines: {node: ^12.20 || ^14.13.1 || >= 16} 536 | peerDependencies: 537 | svelte: ^3.19.0 || ^4.0.0 538 | 539 | svelte@4.2.18: 540 | resolution: {integrity: sha512-d0FdzYIiAePqRJEb90WlJDkjUEx42xhivxN8muUBmfZnP+tzUgz12DJ2hRJi8sIHCME7jeK1PTMgKPSfTd8JrA==} 541 | engines: {node: '>=16'} 542 | 543 | tiny-glob@0.2.9: 544 | resolution: {integrity: sha512-g/55ssRPUjShh+xkfx9UPDXqhckHEsHr4Vd9zX55oSdGZc/MD0m3sferOkwWtp98bv+kcVfEHtRJgBVJzelrzg==} 545 | 546 | totalist@3.0.1: 547 | resolution: {integrity: sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ==} 548 | engines: {node: '>=6'} 549 | 550 | universalify@2.0.1: 551 | resolution: {integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==} 552 | engines: {node: '>= 10.0.0'} 553 | 554 | vite-plugin-inspect@0.8.4: 555 | resolution: {integrity: sha512-G0N3rjfw+AiiwnGw50KlObIHYWfulVwaCBUBLh2xTW9G1eM9ocE5olXkEYUbwyTmX+azM8duubi+9w5awdCz+g==} 556 | engines: {node: '>=14'} 557 | peerDependencies: 558 | '@nuxt/kit': '*' 559 | vite: ^3.1.0 || ^4.0.0 || ^5.0.0-0 560 | peerDependenciesMeta: 561 | '@nuxt/kit': 562 | optional: true 563 | 564 | vite@5.3.1: 565 | resolution: {integrity: sha512-XBmSKRLXLxiaPYamLv3/hnP/KXDai1NDexN0FpkTaZXTfycHvkRHoenpgl/fvuK/kPbB6xAgoyiryAhQNxYmAQ==} 566 | engines: {node: ^18.0.0 || >=20.0.0} 567 | hasBin: true 568 | peerDependencies: 569 | '@types/node': ^18.0.0 || >=20.0.0 570 | less: '*' 571 | lightningcss: ^1.21.0 572 | sass: '*' 573 | stylus: '*' 574 | sugarss: '*' 575 | terser: ^5.4.0 576 | peerDependenciesMeta: 577 | '@types/node': 578 | optional: true 579 | less: 580 | optional: true 581 | lightningcss: 582 | optional: true 583 | sass: 584 | optional: true 585 | stylus: 586 | optional: true 587 | sugarss: 588 | optional: true 589 | terser: 590 | optional: true 591 | 592 | vitefu@0.2.5: 593 | resolution: {integrity: sha512-SgHtMLoqaeeGnd2evZ849ZbACbnwQCIwRH57t18FxcXoZop0uQu0uzlIhJBlF/eWVzuce0sHeqPcDo+evVcg8Q==} 594 | peerDependencies: 595 | vite: ^3.0.0 || ^4.0.0 || ^5.0.0 596 | peerDependenciesMeta: 597 | vite: 598 | optional: true 599 | 600 | snapshots: 601 | 602 | '@ampproject/remapping@2.3.0': 603 | dependencies: 604 | '@jridgewell/gen-mapping': 0.3.5 605 | '@jridgewell/trace-mapping': 0.3.25 606 | 607 | '@antfu/utils@0.7.8': {} 608 | 609 | '@esbuild/aix-ppc64@0.21.5': 610 | optional: true 611 | 612 | '@esbuild/android-arm64@0.21.5': 613 | optional: true 614 | 615 | '@esbuild/android-arm@0.21.5': 616 | optional: true 617 | 618 | '@esbuild/android-x64@0.21.5': 619 | optional: true 620 | 621 | '@esbuild/darwin-arm64@0.21.5': 622 | optional: true 623 | 624 | '@esbuild/darwin-x64@0.21.5': 625 | optional: true 626 | 627 | '@esbuild/freebsd-arm64@0.21.5': 628 | optional: true 629 | 630 | '@esbuild/freebsd-x64@0.21.5': 631 | optional: true 632 | 633 | '@esbuild/linux-arm64@0.21.5': 634 | optional: true 635 | 636 | '@esbuild/linux-arm@0.21.5': 637 | optional: true 638 | 639 | '@esbuild/linux-ia32@0.21.5': 640 | optional: true 641 | 642 | '@esbuild/linux-loong64@0.21.5': 643 | optional: true 644 | 645 | '@esbuild/linux-mips64el@0.21.5': 646 | optional: true 647 | 648 | '@esbuild/linux-ppc64@0.21.5': 649 | optional: true 650 | 651 | '@esbuild/linux-riscv64@0.21.5': 652 | optional: true 653 | 654 | '@esbuild/linux-s390x@0.21.5': 655 | optional: true 656 | 657 | '@esbuild/linux-x64@0.21.5': 658 | optional: true 659 | 660 | '@esbuild/netbsd-x64@0.21.5': 661 | optional: true 662 | 663 | '@esbuild/openbsd-x64@0.21.5': 664 | optional: true 665 | 666 | '@esbuild/sunos-x64@0.21.5': 667 | optional: true 668 | 669 | '@esbuild/win32-arm64@0.21.5': 670 | optional: true 671 | 672 | '@esbuild/win32-ia32@0.21.5': 673 | optional: true 674 | 675 | '@esbuild/win32-x64@0.21.5': 676 | optional: true 677 | 678 | '@jridgewell/gen-mapping@0.3.5': 679 | dependencies: 680 | '@jridgewell/set-array': 1.2.1 681 | '@jridgewell/sourcemap-codec': 1.4.15 682 | '@jridgewell/trace-mapping': 0.3.25 683 | 684 | '@jridgewell/resolve-uri@3.1.2': {} 685 | 686 | '@jridgewell/set-array@1.2.1': {} 687 | 688 | '@jridgewell/sourcemap-codec@1.4.15': {} 689 | 690 | '@jridgewell/trace-mapping@0.3.25': 691 | dependencies: 692 | '@jridgewell/resolve-uri': 3.1.2 693 | '@jridgewell/sourcemap-codec': 1.4.15 694 | 695 | '@polka/url@1.0.0-next.25': {} 696 | 697 | '@rollup/pluginutils@5.1.0(rollup@4.18.0)': 698 | dependencies: 699 | '@types/estree': 1.0.5 700 | estree-walker: 2.0.2 701 | picomatch: 2.3.1 702 | optionalDependencies: 703 | rollup: 4.18.0 704 | 705 | '@rollup/rollup-android-arm-eabi@4.18.0': 706 | optional: true 707 | 708 | '@rollup/rollup-android-arm64@4.18.0': 709 | optional: true 710 | 711 | '@rollup/rollup-darwin-arm64@4.18.0': 712 | optional: true 713 | 714 | '@rollup/rollup-darwin-x64@4.18.0': 715 | optional: true 716 | 717 | '@rollup/rollup-linux-arm-gnueabihf@4.18.0': 718 | optional: true 719 | 720 | '@rollup/rollup-linux-arm-musleabihf@4.18.0': 721 | optional: true 722 | 723 | '@rollup/rollup-linux-arm64-gnu@4.18.0': 724 | optional: true 725 | 726 | '@rollup/rollup-linux-arm64-musl@4.18.0': 727 | optional: true 728 | 729 | '@rollup/rollup-linux-powerpc64le-gnu@4.18.0': 730 | optional: true 731 | 732 | '@rollup/rollup-linux-riscv64-gnu@4.18.0': 733 | optional: true 734 | 735 | '@rollup/rollup-linux-s390x-gnu@4.18.0': 736 | optional: true 737 | 738 | '@rollup/rollup-linux-x64-gnu@4.18.0': 739 | optional: true 740 | 741 | '@rollup/rollup-linux-x64-musl@4.18.0': 742 | optional: true 743 | 744 | '@rollup/rollup-win32-arm64-msvc@4.18.0': 745 | optional: true 746 | 747 | '@rollup/rollup-win32-ia32-msvc@4.18.0': 748 | optional: true 749 | 750 | '@rollup/rollup-win32-x64-msvc@4.18.0': 751 | optional: true 752 | 753 | '@sveltejs/adapter-static@3.0.2(@sveltejs/kit@2.5.16(@sveltejs/vite-plugin-svelte@3.1.1(svelte@4.2.18)(vite@5.3.1))(svelte@4.2.18)(vite@5.3.1))': 754 | dependencies: 755 | '@sveltejs/kit': 2.5.16(@sveltejs/vite-plugin-svelte@3.1.1(svelte@4.2.18)(vite@5.3.1))(svelte@4.2.18)(vite@5.3.1) 756 | 757 | '@sveltejs/kit@2.5.16(@sveltejs/vite-plugin-svelte@3.1.1(svelte@4.2.18)(vite@5.3.1))(svelte@4.2.18)(vite@5.3.1)': 758 | dependencies: 759 | '@sveltejs/vite-plugin-svelte': 3.1.1(svelte@4.2.18)(vite@5.3.1) 760 | '@types/cookie': 0.6.0 761 | cookie: 0.6.0 762 | devalue: 5.0.0 763 | esm-env: 1.0.0 764 | import-meta-resolve: 4.1.0 765 | kleur: 4.1.5 766 | magic-string: 0.30.10 767 | mrmime: 2.0.0 768 | sade: 1.8.1 769 | set-cookie-parser: 2.6.0 770 | sirv: 2.0.4 771 | svelte: 4.2.18 772 | tiny-glob: 0.2.9 773 | vite: 5.3.1 774 | 775 | '@sveltejs/vite-plugin-svelte-inspector@2.1.0(@sveltejs/vite-plugin-svelte@3.1.1(svelte@4.2.18)(vite@5.3.1))(svelte@4.2.18)(vite@5.3.1)': 776 | dependencies: 777 | '@sveltejs/vite-plugin-svelte': 3.1.1(svelte@4.2.18)(vite@5.3.1) 778 | debug: 4.3.5 779 | svelte: 4.2.18 780 | vite: 5.3.1 781 | transitivePeerDependencies: 782 | - supports-color 783 | 784 | '@sveltejs/vite-plugin-svelte@3.1.1(svelte@4.2.18)(vite@5.3.1)': 785 | dependencies: 786 | '@sveltejs/vite-plugin-svelte-inspector': 2.1.0(@sveltejs/vite-plugin-svelte@3.1.1(svelte@4.2.18)(vite@5.3.1))(svelte@4.2.18)(vite@5.3.1) 787 | debug: 4.3.5 788 | deepmerge: 4.3.1 789 | kleur: 4.1.5 790 | magic-string: 0.30.10 791 | svelte: 4.2.18 792 | svelte-hmr: 0.16.0(svelte@4.2.18) 793 | vite: 5.3.1 794 | vitefu: 0.2.5(vite@5.3.1) 795 | transitivePeerDependencies: 796 | - supports-color 797 | 798 | '@types/cookie@0.6.0': {} 799 | 800 | '@types/estree@1.0.5': {} 801 | 802 | acorn@8.12.0: {} 803 | 804 | aria-query@5.3.0: 805 | dependencies: 806 | dequal: 2.0.3 807 | 808 | axobject-query@4.0.0: 809 | dependencies: 810 | dequal: 2.0.3 811 | 812 | bundle-name@4.1.0: 813 | dependencies: 814 | run-applescript: 7.0.0 815 | 816 | code-red@1.0.4: 817 | dependencies: 818 | '@jridgewell/sourcemap-codec': 1.4.15 819 | '@types/estree': 1.0.5 820 | acorn: 8.12.0 821 | estree-walker: 3.0.3 822 | periscopic: 3.1.0 823 | 824 | cookie@0.6.0: {} 825 | 826 | css-tree@2.3.1: 827 | dependencies: 828 | mdn-data: 2.0.30 829 | source-map-js: 1.2.0 830 | 831 | debug@4.3.5: 832 | dependencies: 833 | ms: 2.1.2 834 | 835 | deepmerge@4.3.1: {} 836 | 837 | default-browser-id@5.0.0: {} 838 | 839 | default-browser@5.2.1: 840 | dependencies: 841 | bundle-name: 4.1.0 842 | default-browser-id: 5.0.0 843 | 844 | define-lazy-prop@3.0.0: {} 845 | 846 | dequal@2.0.3: {} 847 | 848 | devalue@5.0.0: {} 849 | 850 | error-stack-parser-es@0.1.4: {} 851 | 852 | esbuild@0.21.5: 853 | optionalDependencies: 854 | '@esbuild/aix-ppc64': 0.21.5 855 | '@esbuild/android-arm': 0.21.5 856 | '@esbuild/android-arm64': 0.21.5 857 | '@esbuild/android-x64': 0.21.5 858 | '@esbuild/darwin-arm64': 0.21.5 859 | '@esbuild/darwin-x64': 0.21.5 860 | '@esbuild/freebsd-arm64': 0.21.5 861 | '@esbuild/freebsd-x64': 0.21.5 862 | '@esbuild/linux-arm': 0.21.5 863 | '@esbuild/linux-arm64': 0.21.5 864 | '@esbuild/linux-ia32': 0.21.5 865 | '@esbuild/linux-loong64': 0.21.5 866 | '@esbuild/linux-mips64el': 0.21.5 867 | '@esbuild/linux-ppc64': 0.21.5 868 | '@esbuild/linux-riscv64': 0.21.5 869 | '@esbuild/linux-s390x': 0.21.5 870 | '@esbuild/linux-x64': 0.21.5 871 | '@esbuild/netbsd-x64': 0.21.5 872 | '@esbuild/openbsd-x64': 0.21.5 873 | '@esbuild/sunos-x64': 0.21.5 874 | '@esbuild/win32-arm64': 0.21.5 875 | '@esbuild/win32-ia32': 0.21.5 876 | '@esbuild/win32-x64': 0.21.5 877 | 878 | esm-env@1.0.0: {} 879 | 880 | estree-walker@2.0.2: {} 881 | 882 | estree-walker@3.0.3: 883 | dependencies: 884 | '@types/estree': 1.0.5 885 | 886 | fs-extra@11.2.0: 887 | dependencies: 888 | graceful-fs: 4.2.11 889 | jsonfile: 6.1.0 890 | universalify: 2.0.1 891 | 892 | fsevents@2.3.3: 893 | optional: true 894 | 895 | globalyzer@0.1.0: {} 896 | 897 | globrex@0.1.2: {} 898 | 899 | graceful-fs@4.2.11: {} 900 | 901 | import-meta-resolve@4.1.0: {} 902 | 903 | is-docker@3.0.0: {} 904 | 905 | is-inside-container@1.0.0: 906 | dependencies: 907 | is-docker: 3.0.0 908 | 909 | is-reference@3.0.2: 910 | dependencies: 911 | '@types/estree': 1.0.5 912 | 913 | is-wsl@3.1.0: 914 | dependencies: 915 | is-inside-container: 1.0.0 916 | 917 | jsonfile@6.1.0: 918 | dependencies: 919 | universalify: 2.0.1 920 | optionalDependencies: 921 | graceful-fs: 4.2.11 922 | 923 | kleur@4.1.5: {} 924 | 925 | locate-character@3.0.0: {} 926 | 927 | magic-string@0.30.10: 928 | dependencies: 929 | '@jridgewell/sourcemap-codec': 1.4.15 930 | 931 | mdn-data@2.0.30: {} 932 | 933 | mri@1.2.0: {} 934 | 935 | mrmime@2.0.0: {} 936 | 937 | ms@2.1.2: {} 938 | 939 | nanoid@3.3.7: {} 940 | 941 | open@10.1.0: 942 | dependencies: 943 | default-browser: 5.2.1 944 | define-lazy-prop: 3.0.0 945 | is-inside-container: 1.0.0 946 | is-wsl: 3.1.0 947 | 948 | perfect-debounce@1.0.0: {} 949 | 950 | periscopic@3.1.0: 951 | dependencies: 952 | '@types/estree': 1.0.5 953 | estree-walker: 3.0.3 954 | is-reference: 3.0.2 955 | 956 | picocolors@1.0.1: {} 957 | 958 | picomatch@2.3.1: {} 959 | 960 | postcss@8.4.38: 961 | dependencies: 962 | nanoid: 3.3.7 963 | picocolors: 1.0.1 964 | source-map-js: 1.2.0 965 | 966 | rollup@4.18.0: 967 | dependencies: 968 | '@types/estree': 1.0.5 969 | optionalDependencies: 970 | '@rollup/rollup-android-arm-eabi': 4.18.0 971 | '@rollup/rollup-android-arm64': 4.18.0 972 | '@rollup/rollup-darwin-arm64': 4.18.0 973 | '@rollup/rollup-darwin-x64': 4.18.0 974 | '@rollup/rollup-linux-arm-gnueabihf': 4.18.0 975 | '@rollup/rollup-linux-arm-musleabihf': 4.18.0 976 | '@rollup/rollup-linux-arm64-gnu': 4.18.0 977 | '@rollup/rollup-linux-arm64-musl': 4.18.0 978 | '@rollup/rollup-linux-powerpc64le-gnu': 4.18.0 979 | '@rollup/rollup-linux-riscv64-gnu': 4.18.0 980 | '@rollup/rollup-linux-s390x-gnu': 4.18.0 981 | '@rollup/rollup-linux-x64-gnu': 4.18.0 982 | '@rollup/rollup-linux-x64-musl': 4.18.0 983 | '@rollup/rollup-win32-arm64-msvc': 4.18.0 984 | '@rollup/rollup-win32-ia32-msvc': 4.18.0 985 | '@rollup/rollup-win32-x64-msvc': 4.18.0 986 | fsevents: 2.3.3 987 | 988 | run-applescript@7.0.0: {} 989 | 990 | sade@1.8.1: 991 | dependencies: 992 | mri: 1.2.0 993 | 994 | set-cookie-parser@2.6.0: {} 995 | 996 | sirv@2.0.4: 997 | dependencies: 998 | '@polka/url': 1.0.0-next.25 999 | mrmime: 2.0.0 1000 | totalist: 3.0.1 1001 | 1002 | source-map-js@1.2.0: {} 1003 | 1004 | svelte-hmr@0.16.0(svelte@4.2.18): 1005 | dependencies: 1006 | svelte: 4.2.18 1007 | 1008 | svelte@4.2.18: 1009 | dependencies: 1010 | '@ampproject/remapping': 2.3.0 1011 | '@jridgewell/sourcemap-codec': 1.4.15 1012 | '@jridgewell/trace-mapping': 0.3.25 1013 | '@types/estree': 1.0.5 1014 | acorn: 8.12.0 1015 | aria-query: 5.3.0 1016 | axobject-query: 4.0.0 1017 | code-red: 1.0.4 1018 | css-tree: 2.3.1 1019 | estree-walker: 3.0.3 1020 | is-reference: 3.0.2 1021 | locate-character: 3.0.0 1022 | magic-string: 0.30.10 1023 | periscopic: 3.1.0 1024 | 1025 | tiny-glob@0.2.9: 1026 | dependencies: 1027 | globalyzer: 0.1.0 1028 | globrex: 0.1.2 1029 | 1030 | totalist@3.0.1: {} 1031 | 1032 | universalify@2.0.1: {} 1033 | 1034 | vite-plugin-inspect@0.8.4(rollup@4.18.0)(vite@5.3.1): 1035 | dependencies: 1036 | '@antfu/utils': 0.7.8 1037 | '@rollup/pluginutils': 5.1.0(rollup@4.18.0) 1038 | debug: 4.3.5 1039 | error-stack-parser-es: 0.1.4 1040 | fs-extra: 11.2.0 1041 | open: 10.1.0 1042 | perfect-debounce: 1.0.0 1043 | picocolors: 1.0.1 1044 | sirv: 2.0.4 1045 | vite: 5.3.1 1046 | transitivePeerDependencies: 1047 | - rollup 1048 | - supports-color 1049 | 1050 | vite@5.3.1: 1051 | dependencies: 1052 | esbuild: 0.21.5 1053 | postcss: 8.4.38 1054 | rollup: 4.18.0 1055 | optionalDependencies: 1056 | fsevents: 2.3.3 1057 | 1058 | vitefu@0.2.5(vite@5.3.1): 1059 | optionalDependencies: 1060 | vite: 5.3.1 1061 | --------------------------------------------------------------------------------