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