2 Commits

Author SHA1 Message Date
731a9683e7 feat: add initial e2e tests 2026-02-03 20:57:29 +01:00
91492c0696 fix(ci): only fmt CHANGELOG 2026-02-03 16:36:27 +01:00
25 changed files with 66 additions and 562 deletions

View File

@@ -4,8 +4,6 @@ on:
push: push:
branches: ["*"] branches: ["*"]
tags: ["*"] tags: ["*"]
pull_request:
branches: ["*"]
env: env:
PNPM_CACHE_FOLDER: ~/.pnpm-store PNPM_CACHE_FOLDER: ~/.pnpm-store
@@ -61,24 +59,3 @@ jobs:
body_path: CHANGELOG.md body_path: CHANGELOG.md
draft: false draft: false
prerelease: false prerelease: false
- name: 🔑 Configure rclone
if: github.ref_type == 'tag'
run: |
echo "$SSH_PRIVATE_KEY" > /tmp/id_rsa
chmod 600 /tmp/id_rsa
mkdir -p ~/.config/rclone
echo -e "[sftp-remote]\ntype = sftp\nhost = ${SSH_HOST}\nuser = ${SSH_USER}\nport = ${SSH_PORT}\nkey_file = /tmp/id_rsa" > ~/.config/rclone/rclone.conf
env:
SSH_PRIVATE_KEY: ${{ secrets.SSH_PRIVATE_KEY }}
SSH_HOST: ${{ vars.SSH_HOST }}
SSH_PORT: ${{ vars.SSH_PORT }}
SSH_USER: ${{ vars.SSH_USER }}
- name: 🚀 Deploy Changed Files via rclone
if: github.ref_type == 'tag'
run: |
echo "Uploading the rest"
rclone sync --update -v --progress --exclude _astro/** --stats 2s --stats-one-line ./app/build/ sftp-remote:${REMOTE_DIR} --transfers 4
env:
REMOTE_DIR: ${{ vars.REMOTE_DIR }}

View File

@@ -1,17 +1,3 @@
## v0.0.2 (2026-02-03)
fix(ci): actually deploy on tags
---
## v0.0.2 (2026-02-03)
fix(app): correctly handle false value in settings
This caused a bug where random seed could not be false.
---
## v0.0.1 (2026-02-03) ## v0.0.1 (2026-02-03)
chore: format chore: format

View File

@@ -1,7 +1,7 @@
{ {
"name": "@nodarium/app", "name": "@nodarium/app",
"private": true, "private": true,
"version": "0.0.2", "version": "0.0.1",
"type": "module", "type": "module",
"scripts": { "scripts": {
"dev": "vite dev", "dev": "vite dev",

View File

@@ -1,6 +1,6 @@
import { describe, it, expect } from 'vitest';
import { grid } from '$lib/graph-templates/grid'; import { grid } from '$lib/graph-templates/grid';
import { tree } from '$lib/graph-templates/tree'; import { tree } from '$lib/graph-templates/tree';
import { describe, expect, it } from 'vitest';
describe('graph-templates', () => { describe('graph-templates', () => {
describe('grid', () => { describe('grid', () => {

View File

@@ -1,5 +1,12 @@
import { clone, debounce, humanizeDuration, humanizeNumber, lerp, snapToGrid } from '$lib/helpers'; import { describe, it, expect } from 'vitest';
import { describe, expect, it } from 'vitest'; import {
snapToGrid,
lerp,
humanizeNumber,
humanizeDuration,
debounce,
clone
} from '$lib/helpers';
describe('helpers', () => { describe('helpers', () => {
describe('snapToGrid', () => { describe('snapToGrid', () => {
@@ -105,9 +112,7 @@ describe('helpers', () => {
it('should only call once when invoked multiple times within delay', () => { it('should only call once when invoked multiple times within delay', () => {
let callCount = 0; let callCount = 0;
const fn = debounce(() => { const fn = debounce(() => { callCount++; }, 100);
callCount++;
}, 100);
fn(); fn();
const firstCall = callCount; const firstCall = callCount;
fn(); fn();

View File

@@ -1,5 +1,5 @@
import { isObject, mergeDeep } from '$lib/helpers/deepMerge'; import { describe, it, expect } from 'vitest';
import { describe, expect, it } from 'vitest'; import { mergeDeep, isObject } from '$lib/helpers/deepMerge';
describe('deepMerge', () => { describe('deepMerge', () => {
describe('isObject', () => { describe('isObject', () => {

View File

@@ -98,7 +98,7 @@
&& typeof internalValue === 'number' && typeof internalValue === 'number'
) { ) {
value[key] = node?.options?.[internalValue]; value[key] = node?.options?.[internalValue];
} else if (internalValue !== undefined) { } else if (internalValue) {
value[key] = internalValue; value[key] = internalValue;
} }
}); });
@@ -124,6 +124,7 @@
{#if key && isNodeInput(type?.[key])} {#if key && isNodeInput(type?.[key])}
{@const inputType = type[key]} {@const inputType = type[key]}
<!-- Leaf input -->
<div class="input input-{inputType.type}" class:first-level={depth === 1}> <div class="input input-{inputType.type}" class:first-level={depth === 1}>
{#if inputType.type === 'button'} {#if inputType.type === 'button'}
<button onclick={handleClick}> <button onclick={handleClick}>
@@ -137,6 +138,7 @@
{/if} {/if}
</div> </div>
{:else if depth === 0} {:else if depth === 0}
<!-- Root: iterate over top-level keys -->
{#each Object.keys(type ?? {}).filter((k) => k !== 'title') as childKey (childKey)} {#each Object.keys(type ?? {}).filter((k) => k !== 'title') as childKey (childKey)}
<NestedSettings <NestedSettings
id={`${id}.${childKey}`} id={`${id}.${childKey}`}
@@ -148,6 +150,7 @@
{/each} {/each}
<hr /> <hr />
{:else if key && type?.[key]} {:else if key && type?.[key]}
<!-- Group -->
{#if depth > 0} {#if depth > 0}
<hr /> <hr />
{/if} {/if}

View File

@@ -1,5 +1,5 @@
{ {
"version": "0.0.2", "version": "0.0.1",
"scripts": { "scripts": {
"postinstall": "pnpm run -r --filter 'ui' build", "postinstall": "pnpm run -r --filter 'ui' build",
"build": "pnpm build:nodes && pnpm build:app", "build": "pnpm build:nodes && pnpm build:app",

View File

@@ -1,6 +1,6 @@
{ {
"name": "@nodarium/types", "name": "@nodarium/types",
"version": "0.0.2", "version": "0.0.1",
"description": "", "description": "",
"main": "src/index.ts", "main": "src/index.ts",
"scripts": { "scripts": {

View File

@@ -1,6 +1,6 @@
{ {
"name": "@nodarium/ui", "name": "@nodarium/ui",
"version": "0.0.2", "version": "0.0.1",
"scripts": { "scripts": {
"dev": "vite", "dev": "vite",
"build": "vite build && npm run package", "build": "vite build && npm run package",
@@ -34,17 +34,14 @@
"@eslint/eslintrc": "^3.3.3", "@eslint/eslintrc": "^3.3.3",
"@eslint/js": "^9.39.2", "@eslint/js": "^9.39.2",
"@nodarium/types": "workspace:", "@nodarium/types": "workspace:",
"@playwright/test": "^1.58.1",
"@sveltejs/adapter-static": "^3.0.10", "@sveltejs/adapter-static": "^3.0.10",
"@sveltejs/kit": "^2.50.0", "@sveltejs/kit": "^2.50.0",
"@sveltejs/package": "^2.5.7", "@sveltejs/package": "^2.5.7",
"@sveltejs/vite-plugin-svelte": "^6.2.4", "@sveltejs/vite-plugin-svelte": "^6.2.4",
"@testing-library/svelte": "^5.3.1",
"@types/eslint": "^9.6.1", "@types/eslint": "^9.6.1",
"@types/three": "^0.182.0", "@types/three": "^0.182.0",
"@typescript-eslint/eslint-plugin": "^8.53.0", "@typescript-eslint/eslint-plugin": "^8.53.0",
"@typescript-eslint/parser": "^8.53.0", "@typescript-eslint/parser": "^8.53.0",
"@vitest/browser-playwright": "^4.0.18",
"dprint": "^0.51.1", "dprint": "^0.51.1",
"eslint": "^9.39.2", "eslint": "^9.39.2",
"eslint-plugin-svelte": "^3.14.0", "eslint-plugin-svelte": "^3.14.0",
@@ -57,8 +54,7 @@
"typescript": "^5.9.3", "typescript": "^5.9.3",
"typescript-eslint": "^8.54.0", "typescript-eslint": "^8.54.0",
"vite": "^7.3.1", "vite": "^7.3.1",
"vitest": "^4.0.18", "vitest": "^4.0.17"
"vitest-browser-svelte": "^2.0.2"
}, },
"svelte": "./dist/index.js", "svelte": "./dist/index.js",
"types": "./dist/index.d.ts", "types": "./dist/index.d.ts",

View File

@@ -1,13 +0,0 @@
import { describe, expect, it } from 'vitest';
import { render } from 'vitest-browser-svelte';
import { page } from 'vitest/browser';
import Details from './Details.svelte';
describe('Details', () => {
it('should render summary element', async () => {
render(Details, { title: 'Click me' });
const summary = page.getByText('Click me');
await expect.element(summary).toBeInTheDocument();
});
});

View File

@@ -1,34 +0,0 @@
import { describe, expect, it } from 'vitest';
import { render } from 'vitest-browser-svelte';
import { page } from 'vitest/browser';
import ShortCut from './ShortCut.svelte';
describe('ShortCut', () => {
it('should render with key label', async () => {
render(ShortCut, { key: 'S' });
const shortcut = page.getByText('S');
await expect.element(shortcut).toBeInTheDocument();
});
it('should render ctrl modifier', async () => {
render(ShortCut, { ctrl: true, key: 'S' });
const shortcut = page.getByText(/Ctrl/);
await expect.element(shortcut).toBeInTheDocument();
});
it('should render alt modifier', async () => {
render(ShortCut, { alt: true, key: 'F4' });
const shortcut = page.getByText(/Alt/);
await expect.element(shortcut).toBeInTheDocument();
});
it('should render multiple modifiers', async () => {
render(ShortCut, { ctrl: true, alt: true, key: 'Delete' });
const shortcut = page.getByText(/Ctrl/);
await expect.element(shortcut).toBeInTheDocument();
});
});

View File

@@ -1,55 +0,0 @@
import { describe, expect, it } from 'vitest';
import { getBoundingValue } from './getBoundingValue';
describe('getBoundingValue', () => {
it('should return 1 for values between 0 and 1', () => {
expect(getBoundingValue(0)).toBe(1);
expect(getBoundingValue(0.5)).toBe(1);
expect(getBoundingValue(1)).toBe(1);
});
it('should return 2 for values between 1 and 2', () => {
expect(getBoundingValue(1.1)).toBe(2);
expect(getBoundingValue(1.5)).toBe(2);
expect(getBoundingValue(2)).toBe(2);
});
it('should return 4 for values between 2 and 4', () => {
expect(getBoundingValue(2.1)).toBe(4);
expect(getBoundingValue(3)).toBe(4);
expect(getBoundingValue(4)).toBe(4);
});
it('should return positive level for positive input', () => {
expect(getBoundingValue(5)).toBe(10);
expect(getBoundingValue(15)).toBe(20);
expect(getBoundingValue(50)).toBe(50);
expect(getBoundingValue(150)).toBe(200);
});
it('should return negative level for negative input', () => {
expect(getBoundingValue(-5)).toBe(-10);
expect(getBoundingValue(-15)).toBe(-20);
expect(getBoundingValue(-50)).toBe(-50);
expect(getBoundingValue(-150)).toBe(-200);
});
it('should return correct level for boundary values', () => {
expect(getBoundingValue(10)).toBe(10);
expect(getBoundingValue(20)).toBe(20);
expect(getBoundingValue(50)).toBe(50);
expect(getBoundingValue(100)).toBe(100);
expect(getBoundingValue(200)).toBe(200);
});
it('should handle large values', () => {
expect(getBoundingValue(1000)).toBe(1000);
expect(getBoundingValue(1500)).toBe(1000);
expect(getBoundingValue(-1000)).toBe(-1000);
});
it('should handle very small values', () => {
expect(getBoundingValue(0.001)).toBe(1);
expect(getBoundingValue(-0.001)).toBe(-1);
});
});

View File

@@ -1,27 +0,0 @@
import { describe, expect, it } from 'vitest';
import { render } from 'vitest-browser-svelte';
import { page } from 'vitest/browser';
import InputCheckbox from './InputCheckbox.svelte';
describe('InputCheckbox', () => {
it('should render checkbox label', async () => {
render(InputCheckbox, { value: false });
const checkbox = page.getByRole('checkbox');
await expect.element(checkbox).toBeInTheDocument();
});
it('should be unchecked when value is false', async () => {
render(InputCheckbox, { value: false });
const input = page.getByRole('checkbox');
await expect.element(input).not.toBeChecked();
});
it('should be checked when value is true', async () => {
render(InputCheckbox, { value: true });
const input = page.getByRole('checkbox');
await expect.element(input).toBeChecked();
});
});

View File

@@ -1,45 +0,0 @@
import { describe, expect, it } from 'vitest';
import { render } from 'vitest-browser-svelte';
import { page } from 'vitest/browser';
import InputNumber from './InputNumber.svelte';
describe('InputNumber', () => {
it('should render input element', async () => {
render(InputNumber, { value: 0.5 });
const input = page.getByRole('spinbutton');
await expect.element(input).toBeInTheDocument();
});
it('should render with step buttons when step is provided', async () => {
render(InputNumber, { value: 0.5, step: 0.1 });
const decrementBtn = page.getByRole('button', { name: 'step down' });
const incrementBtn = page.getByRole('button', { name: 'step up' });
await expect.element(decrementBtn).toBeInTheDocument();
await expect.element(incrementBtn).toBeInTheDocument();
});
it('should not render step buttons when step is undefined', async () => {
const screen = render(InputNumber, { value: 0.5 });
const buttons = screen.locator.getByRole('button');
const count = buttons.all().length;
expect(count).toBe(0);
});
it('should accept numeric value', async () => {
render(InputNumber, { value: 42 });
const input = page.getByRole('spinbutton');
await expect.element(input).toHaveValue(42);
});
it('should accept min and max bounds', async () => {
render(InputNumber, { value: 5, min: 0, max: 10 });
const input = page.getByRole('spinbutton');
await expect.element(input).toHaveAttribute('min', '0');
await expect.element(input).toHaveAttribute('max', '10');
});
});

View File

@@ -1,27 +0,0 @@
import { describe, expect, it } from 'vitest';
import { render } from 'vitest-browser-svelte';
import { page } from 'vitest/browser';
import InputSelect from './InputSelect.svelte';
describe('InputSelect', () => {
it('should render select element', async () => {
render(InputSelect, { options: ['a', 'b', 'c'], value: 0 });
const select = page.getByRole('combobox');
await expect.element(select).toBeInTheDocument();
});
it('should render all options', async () => {
render(InputSelect, { options: ['apple', 'banana', 'cherry'], value: 0 });
const select = page.getByRole('combobox');
await expect.element(select).toHaveTextContent('applebananacherry');
});
it('should select correct option by index', async () => {
render(InputSelect, { options: ['first', 'second', 'third'], value: 1 });
const select = page.getByRole('combobox');
await expect.element(select).toHaveTextContent('second');
});
});

View File

@@ -1,26 +0,0 @@
import { describe, expect, it } from 'vitest';
import { render } from 'vitest-browser-svelte';
import { page } from 'vitest/browser';
import InputVec3 from './InputVec3.svelte';
describe('InputVec3', () => {
it('should render with correct initial values', async () => {
const value = $state([1.5, 2.5, 3.5]);
render(InputVec3, { value });
const inputs = page.getByRole('spinbutton');
await expect.element(inputs.first()).toBeInTheDocument();
expect(inputs.nth(0)).toHaveValue(1.5);
expect(inputs.nth(1)).toHaveValue(2.5);
expect(inputs.nth(2)).toHaveValue(3.5);
});
it('should have step attribute', async () => {
const value = $state([0, 0, 0]);
render(InputVec3, { value });
const input = page.getByRole('spinbutton').first();
await expect.element(input).toHaveAttribute('step', '0.01');
});
});

View File

@@ -11,7 +11,7 @@ const config = {
kit: { kit: {
paths: { paths: {
base: BASE_URL === '/' ? '' : BASE_URL base: BASE_URL
}, },
// adapter-auto only supports some environments, see https://kit.svelte.dev/docs/adapter-auto for a list. // adapter-auto only supports some environments, see https://kit.svelte.dev/docs/adapter-auto for a list.
// If your environment is not supported, or you settled on a specific environment, switch out the adapter. // If your environment is not supported, or you settled on a specific environment, switch out the adapter.

View File

@@ -1,6 +1,5 @@
import { sveltekit } from '@sveltejs/kit/vite'; import { sveltekit } from '@sveltejs/kit/vite';
import tailwindcss from '@tailwindcss/vite'; import tailwindcss from '@tailwindcss/vite';
import { playwright } from '@vitest/browser-playwright';
import { exec } from 'node:child_process'; import { exec } from 'node:child_process';
import { readFileSync } from 'node:fs'; import { readFileSync } from 'node:fs';
import { defineConfig } from 'vitest/config'; import { defineConfig } from 'vitest/config';
@@ -22,31 +21,6 @@ const postDevPackagePlugin = () => {
export default defineConfig({ export default defineConfig({
plugins: [tailwindcss(), sveltekit(), postDevPackagePlugin()], plugins: [tailwindcss(), sveltekit(), postDevPackagePlugin()],
test: { test: {
expect: { requireAssertions: true }, include: ['src/**/*.{test,spec}.{js,ts}']
projects: [
{
extends: './vite.config.ts',
test: {
name: 'client',
browser: {
enabled: true,
provider: playwright(),
instances: [{ browser: 'firefox', headless: true }]
},
include: ['src/**/*.svelte.ts'],
exclude: ['src/lib/server/**']
}
},
{
extends: './vite.config.ts',
test: {
name: 'server',
environment: 'node',
include: ['src/**/*.{test,spec}.{js,ts}'],
exclude: ['src/**/*.svelte.{test,spec}.{js,ts}']
}
}
]
} }
}); });

View File

@@ -1,6 +1,6 @@
{ {
"name": "@nodarium/utils", "name": "@nodarium/utils",
"version": "0.0.2", "version": "0.0.1",
"description": "", "description": "",
"main": "src/index.ts", "main": "src/index.ts",
"scripts": { "scripts": {

View File

@@ -5,6 +5,7 @@ test('encode_float', () => {
const input = 1.23; const input = 1.23;
const encoded = encodeFloat(input); const encoded = encodeFloat(input);
const output = decodeFloat(encoded); const output = decodeFloat(encoded);
console.log(input, output);
expect(output).toBeCloseTo(input); expect(output).toBeCloseTo(input);
}); });

View File

@@ -21,6 +21,24 @@ test('fastHashArray doesnt product collisions', () => {
expect(hash_a).not.toEqual(hash_b); expect(hash_a).not.toEqual(hash_b);
}); });
test('fastHashArray is fast(ish) < 20ms', () => {
const a = new Int32Array(10_000);
const t0 = performance.now();
fastHashArrayBuffer(a);
const t1 = performance.now();
a[0] = 1;
fastHashArrayBuffer(a);
const t2 = performance.now();
expect(t1 - t0).toBeLessThan(20);
expect(t2 - t1).toBeLessThan(20);
});
// test if the fastHashArray function is deterministic // test if the fastHashArray function is deterministic
test('fastHashArray is deterministic', () => { test('fastHashArray is deterministic', () => {
const a = new Int32Array(1000); const a = new Int32Array(1000);

View File

@@ -8,6 +8,8 @@ test('it correctly concats nested arrays', () => {
const output = concatEncodedArrays([input_a, input_b, input_c]); const output = concatEncodedArrays([input_a, input_b, input_c]);
console.log('Output', output);
const decoded = decodeNestedArray(output); const decoded = decodeNestedArray(output);
expect(decoded[0]).toEqual([1, 2, 3]); expect(decoded[0]).toEqual([1, 2, 3]);

View File

@@ -88,7 +88,7 @@ function decode_recursive(dense: number[] | Int32Array, index = 0) {
dense, dense,
index index
); );
decoded.push(p as number[]); decoded.push(...p);
index = nextIndex + 1; index = nextIndex + 1;
nextBracketIndex = _nextBracketIndex; nextBracketIndex = _nextBracketIndex;
} else { } else {

269
pnpm-lock.yaml generated
View File

@@ -4,12 +4,6 @@ settings:
autoInstallPeers: true autoInstallPeers: true
excludeLinksFromLockfile: false excludeLinksFromLockfile: false
catalogs:
default:
chokidar-cli:
specifier: github:open-cli-tools/chokidar-cli#semver:v4.0.0
version: 4.0.0
importers: importers:
.: .:
@@ -185,9 +179,6 @@ importers:
'@nodarium/types': '@nodarium/types':
specifier: 'workspace:' specifier: 'workspace:'
version: link:../types version: link:../types
'@playwright/test':
specifier: ^1.58.1
version: 1.58.1
'@sveltejs/adapter-static': '@sveltejs/adapter-static':
specifier: ^3.0.10 specifier: ^3.0.10
version: 3.0.10(@sveltejs/kit@2.50.0(@sveltejs/vite-plugin-svelte@6.2.4(svelte@5.46.4)(vite@7.3.1(@types/node@22.8.6)(jiti@2.6.1)(less@4.2.0)(lightningcss@1.30.2)(sass@1.80.6)(terser@5.36.0)(tsx@4.19.2)))(svelte@5.46.4)(typescript@5.9.3)(vite@7.3.1(@types/node@22.8.6)(jiti@2.6.1)(less@4.2.0)(lightningcss@1.30.2)(sass@1.80.6)(terser@5.36.0)(tsx@4.19.2))) version: 3.0.10(@sveltejs/kit@2.50.0(@sveltejs/vite-plugin-svelte@6.2.4(svelte@5.46.4)(vite@7.3.1(@types/node@22.8.6)(jiti@2.6.1)(less@4.2.0)(lightningcss@1.30.2)(sass@1.80.6)(terser@5.36.0)(tsx@4.19.2)))(svelte@5.46.4)(typescript@5.9.3)(vite@7.3.1(@types/node@22.8.6)(jiti@2.6.1)(less@4.2.0)(lightningcss@1.30.2)(sass@1.80.6)(terser@5.36.0)(tsx@4.19.2)))
@@ -200,9 +191,6 @@ importers:
'@sveltejs/vite-plugin-svelte': '@sveltejs/vite-plugin-svelte':
specifier: ^6.2.4 specifier: ^6.2.4
version: 6.2.4(svelte@5.46.4)(vite@7.3.1(@types/node@22.8.6)(jiti@2.6.1)(less@4.2.0)(lightningcss@1.30.2)(sass@1.80.6)(terser@5.36.0)(tsx@4.19.2)) version: 6.2.4(svelte@5.46.4)(vite@7.3.1(@types/node@22.8.6)(jiti@2.6.1)(less@4.2.0)(lightningcss@1.30.2)(sass@1.80.6)(terser@5.36.0)(tsx@4.19.2))
'@testing-library/svelte':
specifier: ^5.3.1
version: 5.3.1(svelte@5.46.4)(vite@7.3.1(@types/node@22.8.6)(jiti@2.6.1)(less@4.2.0)(lightningcss@1.30.2)(sass@1.80.6)(terser@5.36.0)(tsx@4.19.2))(vitest@4.0.18)
'@types/eslint': '@types/eslint':
specifier: ^9.6.1 specifier: ^9.6.1
version: 9.6.1 version: 9.6.1
@@ -215,9 +203,6 @@ importers:
'@typescript-eslint/parser': '@typescript-eslint/parser':
specifier: ^8.53.0 specifier: ^8.53.0
version: 8.53.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) version: 8.53.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3)
'@vitest/browser-playwright':
specifier: ^4.0.18
version: 4.0.18(playwright@1.58.1)(vite@7.3.1(@types/node@22.8.6)(jiti@2.6.1)(less@4.2.0)(lightningcss@1.30.2)(sass@1.80.6)(terser@5.36.0)(tsx@4.19.2))(vitest@4.0.18)
dprint: dprint:
specifier: ^0.51.1 specifier: ^0.51.1
version: 0.51.1 version: 0.51.1
@@ -255,11 +240,8 @@ importers:
specifier: ^7.3.1 specifier: ^7.3.1
version: 7.3.1(@types/node@22.8.6)(jiti@2.6.1)(less@4.2.0)(lightningcss@1.30.2)(sass@1.80.6)(terser@5.36.0)(tsx@4.19.2) version: 7.3.1(@types/node@22.8.6)(jiti@2.6.1)(less@4.2.0)(lightningcss@1.30.2)(sass@1.80.6)(terser@5.36.0)(tsx@4.19.2)
vitest: vitest:
specifier: ^4.0.18 specifier: ^4.0.17
version: 4.0.18(@types/node@22.8.6)(@vitest/browser-playwright@4.0.18)(jiti@2.6.1)(jsdom@25.0.1)(less@4.2.0)(lightningcss@1.30.2)(sass@1.80.6)(terser@5.36.0)(tsx@4.19.2) version: 4.0.17(@types/node@22.8.6)(@vitest/browser-playwright@4.0.18)(jiti@2.6.1)(jsdom@25.0.1)(less@4.2.0)(lightningcss@1.30.2)(sass@1.80.6)(terser@5.36.0)(tsx@4.19.2)
vitest-browser-svelte:
specifier: ^2.0.2
version: 2.0.2(svelte@5.46.4)(vitest@4.0.18)
packages/utils: packages/utils:
dependencies: dependencies:
@@ -275,7 +257,7 @@ importers:
version: 7.3.1(@types/node@22.8.6)(jiti@2.6.1)(less@4.2.0)(lightningcss@1.30.2)(sass@1.80.6)(terser@5.36.0)(tsx@4.19.2) version: 7.3.1(@types/node@22.8.6)(jiti@2.6.1)(less@4.2.0)(lightningcss@1.30.2)(sass@1.80.6)(terser@5.36.0)(tsx@4.19.2)
vitest: vitest:
specifier: ^4.0.17 specifier: ^4.0.17
version: 4.0.17(@types/node@22.8.6)(@vitest/browser-playwright@4.0.18)(jiti@2.6.1)(jsdom@25.0.1)(less@4.2.0)(lightningcss@1.30.2)(sass@1.80.6)(terser@5.36.0)(tsx@4.19.2) version: 4.0.17(jiti@2.6.1)(jsdom@25.0.1)(less@4.2.0)(lightningcss@1.30.2)(sass@1.80.6)(terser@5.36.0)(tsx@4.19.2)
packages: packages:
@@ -285,18 +267,6 @@ packages:
'@asamuzakjp/css-color@3.2.0': '@asamuzakjp/css-color@3.2.0':
resolution: {integrity: sha512-K1A6z8tS3XsmCMM86xoWdn7Fkdn9m6RSVtocUrJYIwZnFVkng/PvkEoWtOWmP+Scc6saYWHWZYbndEEXxl24jw==} resolution: {integrity: sha512-K1A6z8tS3XsmCMM86xoWdn7Fkdn9m6RSVtocUrJYIwZnFVkng/PvkEoWtOWmP+Scc6saYWHWZYbndEEXxl24jw==}
'@babel/code-frame@7.29.0':
resolution: {integrity: sha512-9NhCeYjq9+3uxgdtp20LSiJXJvN0FeCtNGpJxuMFZ1Kv3cWUNb6DOhJwUvcVCzKGR66cw4njwM6hrJLqgOwbcw==}
engines: {node: '>=6.9.0'}
'@babel/helper-validator-identifier@7.28.5':
resolution: {integrity: sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==}
engines: {node: '>=6.9.0'}
'@babel/runtime@7.28.6':
resolution: {integrity: sha512-05WQkdpL9COIMz4LjTxGpPNCdlpyimKppYNoJ5Di5EUObifl8t4tuLuUBBZEpoLYOmfvIWrsp9fCl0HoPRVTdA==}
engines: {node: '>=6.9.0'}
'@cspotcode/source-map-support@0.8.1': '@cspotcode/source-map-support@0.8.1':
resolution: {integrity: sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==} resolution: {integrity: sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==}
engines: {node: '>=12'} engines: {node: '>=12'}
@@ -1168,29 +1138,12 @@ packages:
peerDependencies: peerDependencies:
vite: ^5.2.0 || ^6 || ^7 vite: ^5.2.0 || ^6 || ^7
'@testing-library/dom@10.4.1':
resolution: {integrity: sha512-o4PXJQidqJl82ckFaXUeoAW+XysPLauYI43Abki5hABd853iMhitooc6znOnczgbTYmEP6U6/y1ZyKAIsvMKGg==}
engines: {node: '>=18'}
'@testing-library/svelte-core@1.0.0': '@testing-library/svelte-core@1.0.0':
resolution: {integrity: sha512-VkUePoLV6oOYwSUvX6ShA8KLnJqZiYMIbP2JW2t0GLWLkJxKGvuH5qrrZBV/X7cXFnLGuFQEC7RheYiZOW68KQ==} resolution: {integrity: sha512-VkUePoLV6oOYwSUvX6ShA8KLnJqZiYMIbP2JW2t0GLWLkJxKGvuH5qrrZBV/X7cXFnLGuFQEC7RheYiZOW68KQ==}
engines: {node: '>=16'} engines: {node: '>=16'}
peerDependencies: peerDependencies:
svelte: ^3 || ^4 || ^5 || ^5.0.0-next.0 svelte: ^3 || ^4 || ^5 || ^5.0.0-next.0
'@testing-library/svelte@5.3.1':
resolution: {integrity: sha512-8Ez7ZOqW5geRf9PF5rkuopODe5RGy3I9XR+kc7zHh26gBiktLaxTfKmhlGaSHYUOTQE7wFsLMN9xCJVCszw47w==}
engines: {node: '>= 10'}
peerDependencies:
svelte: ^3 || ^4 || ^5 || ^5.0.0-next.0
vite: '*'
vitest: '*'
peerDependenciesMeta:
vite:
optional: true
vitest:
optional: true
'@threejs-kit/instanced-sprite-mesh@2.5.1': '@threejs-kit/instanced-sprite-mesh@2.5.1':
resolution: {integrity: sha512-pmt1ALRhbHhCJQTj2FuthH6PeLIeaM4hOuS2JO3kWSwlnvx/9xuUkjFR3JOi/myMqsH7pSsLIROSaBxDfttjeA==} resolution: {integrity: sha512-pmt1ALRhbHhCJQTj2FuthH6PeLIeaM4hOuS2JO3kWSwlnvx/9xuUkjFR3JOi/myMqsH7pSsLIROSaBxDfttjeA==}
peerDependencies: peerDependencies:
@@ -1226,9 +1179,6 @@ packages:
'@tweenjs/tween.js@23.1.3': '@tweenjs/tween.js@23.1.3':
resolution: {integrity: sha512-vJmvvwFxYuGnF2axRtPYocag6Clbb5YS7kLL+SO/TeVFzHqDIWrNKYtcsPMibjDx9O+bu+psAy9NKfWklassUA==} resolution: {integrity: sha512-vJmvvwFxYuGnF2axRtPYocag6Clbb5YS7kLL+SO/TeVFzHqDIWrNKYtcsPMibjDx9O+bu+psAy9NKfWklassUA==}
'@types/aria-query@5.0.4':
resolution: {integrity: sha512-rfT93uj5s0PRL7EzccGMs3brplhcrghnDoV26NqKhCAS1hVo+WdNsPvE/yb6ilfr5hi2MEk6d5EWJTKdxg8jVw==}
'@types/chai@5.2.3': '@types/chai@5.2.3':
resolution: {integrity: sha512-Mw558oeA9fFbv65/y4mHtXDs9bPnFMZAL/jxdPFUpOHHIXX91mcgEHbS5Lahr+pwZFR8A7GQleRWeI6cGFC2UA==} resolution: {integrity: sha512-Mw558oeA9fFbv65/y4mHtXDs9bPnFMZAL/jxdPFUpOHHIXX91mcgEHbS5Lahr+pwZFR8A7GQleRWeI6cGFC2UA==}
@@ -1394,9 +1344,6 @@ packages:
'@vitest/expect@4.0.17': '@vitest/expect@4.0.17':
resolution: {integrity: sha512-mEoqP3RqhKlbmUmntNDDCJeTDavDR+fVYkSOw8qRwJFaW/0/5zA9zFeTrHqNtcmwh6j26yMmwx2PqUDPzt5ZAQ==} resolution: {integrity: sha512-mEoqP3RqhKlbmUmntNDDCJeTDavDR+fVYkSOw8qRwJFaW/0/5zA9zFeTrHqNtcmwh6j26yMmwx2PqUDPzt5ZAQ==}
'@vitest/expect@4.0.18':
resolution: {integrity: sha512-8sCWUyckXXYvx4opfzVY03EOiYVxyNrHS5QxX3DAIi5dpJAAkyJezHCP77VMX4HKA2LDT/Jpfo8i2r5BE3GnQQ==}
'@vitest/mocker@4.0.17': '@vitest/mocker@4.0.17':
resolution: {integrity: sha512-+ZtQhLA3lDh1tI2wxe3yMsGzbp7uuJSWBM1iTIKCbppWTSBN09PUC+L+fyNlQApQoR+Ps8twt2pbSSXg2fQVEQ==} resolution: {integrity: sha512-+ZtQhLA3lDh1tI2wxe3yMsGzbp7uuJSWBM1iTIKCbppWTSBN09PUC+L+fyNlQApQoR+Ps8twt2pbSSXg2fQVEQ==}
peerDependencies: peerDependencies:
@@ -1428,15 +1375,9 @@ packages:
'@vitest/runner@4.0.17': '@vitest/runner@4.0.17':
resolution: {integrity: sha512-JmuQyf8aMWoo/LmNFppdpkfRVHJcsgzkbCA+/Bk7VfNH7RE6Ut2qxegeyx2j3ojtJtKIbIGy3h+KxGfYfk28YQ==} resolution: {integrity: sha512-JmuQyf8aMWoo/LmNFppdpkfRVHJcsgzkbCA+/Bk7VfNH7RE6Ut2qxegeyx2j3ojtJtKIbIGy3h+KxGfYfk28YQ==}
'@vitest/runner@4.0.18':
resolution: {integrity: sha512-rpk9y12PGa22Jg6g5M3UVVnTS7+zycIGk9ZNGN+m6tZHKQb7jrP7/77WfZy13Y/EUDd52NDsLRQhYKtv7XfPQw==}
'@vitest/snapshot@4.0.17': '@vitest/snapshot@4.0.17':
resolution: {integrity: sha512-npPelD7oyL+YQM2gbIYvlavlMVWUfNNGZPcu0aEUQXt7FXTuqhmgiYupPnAanhKvyP6Srs2pIbWo30K0RbDtRQ==} resolution: {integrity: sha512-npPelD7oyL+YQM2gbIYvlavlMVWUfNNGZPcu0aEUQXt7FXTuqhmgiYupPnAanhKvyP6Srs2pIbWo30K0RbDtRQ==}
'@vitest/snapshot@4.0.18':
resolution: {integrity: sha512-PCiV0rcl7jKQjbgYqjtakly6T1uwv/5BQ9SwBLekVg/EaYeQFPiXcgrC2Y7vDMA8dM1SUEAEV82kgSQIlXNMvA==}
'@vitest/spy@4.0.17': '@vitest/spy@4.0.17':
resolution: {integrity: sha512-I1bQo8QaP6tZlTomQNWKJE6ym4SHf3oLS7ceNjozxxgzavRAgZDc06T7kD8gb9bXKEgcLNt00Z+kZO6KaJ62Ew==} resolution: {integrity: sha512-I1bQo8QaP6tZlTomQNWKJE6ym4SHf3oLS7ceNjozxxgzavRAgZDc06T7kD8gb9bXKEgcLNt00Z+kZO6KaJ62Ew==}
@@ -1473,10 +1414,6 @@ packages:
ajv@6.12.6: ajv@6.12.6:
resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==}
ansi-regex@5.0.1:
resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==}
engines: {node: '>=8'}
ansi-regex@6.2.2: ansi-regex@6.2.2:
resolution: {integrity: sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==} resolution: {integrity: sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==}
engines: {node: '>=12'} engines: {node: '>=12'}
@@ -1485,10 +1422,6 @@ packages:
resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==}
engines: {node: '>=8'} engines: {node: '>=8'}
ansi-styles@5.2.0:
resolution: {integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==}
engines: {node: '>=10'}
ansi-styles@6.2.3: ansi-styles@6.2.3:
resolution: {integrity: sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==} resolution: {integrity: sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==}
engines: {node: '>=12'} engines: {node: '>=12'}
@@ -1503,9 +1436,6 @@ packages:
argparse@2.0.1: argparse@2.0.1:
resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==}
aria-query@5.3.0:
resolution: {integrity: sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==}
aria-query@5.3.2: aria-query@5.3.2:
resolution: {integrity: sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==} resolution: {integrity: sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==}
engines: {node: '>= 0.4'} engines: {node: '>= 0.4'}
@@ -1694,10 +1624,6 @@ packages:
resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==}
engines: {node: '>=0.4.0'} engines: {node: '>=0.4.0'}
dequal@2.0.3:
resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==}
engines: {node: '>=6'}
detect-libc@2.1.2: detect-libc@2.1.2:
resolution: {integrity: sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==} resolution: {integrity: sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==}
engines: {node: '>=8'} engines: {node: '>=8'}
@@ -1712,9 +1638,6 @@ packages:
resolution: {integrity: sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==} resolution: {integrity: sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==}
engines: {node: '>=0.3.1'} engines: {node: '>=0.3.1'}
dom-accessibility-api@0.5.16:
resolution: {integrity: sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg==}
dom-serializer@2.0.0: dom-serializer@2.0.0:
resolution: {integrity: sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==} resolution: {integrity: sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==}
@@ -2060,9 +1983,6 @@ packages:
resolution: {integrity: sha512-ekilCSN1jwRvIbgeg/57YFh8qQDNbwDb9xT/qu2DAHbFFZUicIl4ygVaAvzveMhMVr3LnpSKTNnwt8PoOfmKhQ==} resolution: {integrity: sha512-ekilCSN1jwRvIbgeg/57YFh8qQDNbwDb9xT/qu2DAHbFFZUicIl4ygVaAvzveMhMVr3LnpSKTNnwt8PoOfmKhQ==}
hasBin: true hasBin: true
js-tokens@4.0.0:
resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==}
js-yaml@4.1.1: js-yaml@4.1.1:
resolution: {integrity: sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==} resolution: {integrity: sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==}
hasBin: true hasBin: true
@@ -2207,10 +2127,6 @@ packages:
lru-cache@10.4.3: lru-cache@10.4.3:
resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==}
lz-string@1.5.0:
resolution: {integrity: sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ==}
hasBin: true
maath@0.10.8: maath@0.10.8:
resolution: {integrity: sha512-tRvbDF0Pgqz+9XUa4jjfgAQ8/aPKmQdWXilFu2tMy4GWj4NOsx99HlULO4IeREfbO3a0sA145DZYyvXPkybm0g==} resolution: {integrity: sha512-tRvbDF0Pgqz+9XUa4jjfgAQ8/aPKmQdWXilFu2tMy4GWj4NOsx99HlULO4IeREfbO3a0sA145DZYyvXPkybm0g==}
peerDependencies: peerDependencies:
@@ -2422,10 +2338,6 @@ packages:
resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==}
engines: {node: '>= 0.8.0'} engines: {node: '>= 0.8.0'}
pretty-format@27.5.1:
resolution: {integrity: sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==}
engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0}
prr@1.0.1: prr@1.0.1:
resolution: {integrity: sha512-yPw4Sng1gWghHQWj0B3ZggWUm4qVbPwPFcRG8KyxiU7J2OHFSoEHKS+EZ3fv5l1t9CyCiop6l/ZYeWbrgoQejw==} resolution: {integrity: sha512-yPw4Sng1gWghHQWj0B3ZggWUm4qVbPwPFcRG8KyxiU7J2OHFSoEHKS+EZ3fv5l1t9CyCiop6l/ZYeWbrgoQejw==}
@@ -2438,9 +2350,6 @@ packages:
resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==}
engines: {node: '>=6'} engines: {node: '>=6'}
react-is@17.0.2:
resolution: {integrity: sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==}
readdirp@3.6.0: readdirp@3.6.0:
resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==}
engines: {node: '>=8.10.0'} engines: {node: '>=8.10.0'}
@@ -2857,40 +2766,6 @@ packages:
jsdom: jsdom:
optional: true optional: true
vitest@4.0.18:
resolution: {integrity: sha512-hOQuK7h0FGKgBAas7v0mSAsnvrIgAvWmRFjmzpJ7SwFHH3g1k2u37JtYwOwmEKhK6ZO3v9ggDBBm0La1LCK4uQ==}
engines: {node: ^20.0.0 || ^22.0.0 || >=24.0.0}
hasBin: true
peerDependencies:
'@edge-runtime/vm': '*'
'@opentelemetry/api': ^1.9.0
'@types/node': ^20.0.0 || ^22.0.0 || >=24.0.0
'@vitest/browser-playwright': 4.0.18
'@vitest/browser-preview': 4.0.18
'@vitest/browser-webdriverio': 4.0.18
'@vitest/ui': 4.0.18
happy-dom: '*'
jsdom: '*'
peerDependenciesMeta:
'@edge-runtime/vm':
optional: true
'@opentelemetry/api':
optional: true
'@types/node':
optional: true
'@vitest/browser-playwright':
optional: true
'@vitest/browser-preview':
optional: true
'@vitest/browser-webdriverio':
optional: true
'@vitest/ui':
optional: true
happy-dom:
optional: true
jsdom:
optional: true
w3c-xmlserializer@5.0.0: w3c-xmlserializer@5.0.0:
resolution: {integrity: sha512-o8qghlI8NZHU1lLPrpi2+Uq7abh4GGPpYANlalzWxyWteJOCsr/P+oPBA49TOLu5FTZO4d3F9MnWJfiMo4BkmA==} resolution: {integrity: sha512-o8qghlI8NZHU1lLPrpi2+Uq7abh4GGPpYANlalzWxyWteJOCsr/P+oPBA49TOLu5FTZO4d3F9MnWJfiMo4BkmA==}
engines: {node: '>=18'} engines: {node: '>=18'}
@@ -2998,16 +2873,6 @@ snapshots:
lru-cache: 10.4.3 lru-cache: 10.4.3
optional: true optional: true
'@babel/code-frame@7.29.0':
dependencies:
'@babel/helper-validator-identifier': 7.28.5
js-tokens: 4.0.0
picocolors: 1.1.1
'@babel/helper-validator-identifier@7.28.5': {}
'@babel/runtime@7.28.6': {}
'@cspotcode/source-map-support@0.8.1': '@cspotcode/source-map-support@0.8.1':
dependencies: dependencies:
'@jridgewell/trace-mapping': 0.3.9 '@jridgewell/trace-mapping': 0.3.9
@@ -3636,30 +3501,10 @@ snapshots:
tailwindcss: 4.1.18 tailwindcss: 4.1.18
vite: 7.3.1(@types/node@22.8.6)(jiti@2.6.1)(less@4.2.0)(lightningcss@1.30.2)(sass@1.80.6)(terser@5.36.0)(tsx@4.19.2) vite: 7.3.1(@types/node@22.8.6)(jiti@2.6.1)(less@4.2.0)(lightningcss@1.30.2)(sass@1.80.6)(terser@5.36.0)(tsx@4.19.2)
'@testing-library/dom@10.4.1':
dependencies:
'@babel/code-frame': 7.29.0
'@babel/runtime': 7.28.6
'@types/aria-query': 5.0.4
aria-query: 5.3.0
dom-accessibility-api: 0.5.16
lz-string: 1.5.0
picocolors: 1.1.1
pretty-format: 27.5.1
'@testing-library/svelte-core@1.0.0(svelte@5.46.4)': '@testing-library/svelte-core@1.0.0(svelte@5.46.4)':
dependencies: dependencies:
svelte: 5.46.4 svelte: 5.46.4
'@testing-library/svelte@5.3.1(svelte@5.46.4)(vite@7.3.1(@types/node@22.8.6)(jiti@2.6.1)(less@4.2.0)(lightningcss@1.30.2)(sass@1.80.6)(terser@5.36.0)(tsx@4.19.2))(vitest@4.0.18)':
dependencies:
'@testing-library/dom': 10.4.1
'@testing-library/svelte-core': 1.0.0(svelte@5.46.4)
svelte: 5.46.4
optionalDependencies:
vite: 7.3.1(@types/node@22.8.6)(jiti@2.6.1)(less@4.2.0)(lightningcss@1.30.2)(sass@1.80.6)(terser@5.36.0)(tsx@4.19.2)
vitest: 4.0.18(@types/node@22.8.6)(@vitest/browser-playwright@4.0.18)(jiti@2.6.1)(jsdom@25.0.1)(less@4.2.0)(lightningcss@1.30.2)(sass@1.80.6)(terser@5.36.0)(tsx@4.19.2)
'@threejs-kit/instanced-sprite-mesh@2.5.1(@types/three@0.182.0)(three@0.182.0)': '@threejs-kit/instanced-sprite-mesh@2.5.1(@types/three@0.182.0)(three@0.182.0)':
dependencies: dependencies:
diet-sprite: 0.0.1 diet-sprite: 0.0.1
@@ -3706,8 +3551,6 @@ snapshots:
'@tweenjs/tween.js@23.1.3': {} '@tweenjs/tween.js@23.1.3': {}
'@types/aria-query@5.0.4': {}
'@types/chai@5.2.3': '@types/chai@5.2.3':
dependencies: dependencies:
'@types/deep-eql': 4.0.2 '@types/deep-eql': 4.0.2
@@ -3942,19 +3785,6 @@ snapshots:
- utf-8-validate - utf-8-validate
- vite - vite
'@vitest/browser-playwright@4.0.18(playwright@1.58.1)(vite@7.3.1(@types/node@22.8.6)(jiti@2.6.1)(less@4.2.0)(lightningcss@1.30.2)(sass@1.80.6)(terser@5.36.0)(tsx@4.19.2))(vitest@4.0.18)':
dependencies:
'@vitest/browser': 4.0.18(vite@7.3.1(@types/node@22.8.6)(jiti@2.6.1)(less@4.2.0)(lightningcss@1.30.2)(sass@1.80.6)(terser@5.36.0)(tsx@4.19.2))(vitest@4.0.18)
'@vitest/mocker': 4.0.18(vite@7.3.1(@types/node@22.8.6)(jiti@2.6.1)(less@4.2.0)(lightningcss@1.30.2)(sass@1.80.6)(terser@5.36.0)(tsx@4.19.2))
playwright: 1.58.1
tinyrainbow: 3.0.3
vitest: 4.0.18(@types/node@22.8.6)(@vitest/browser-playwright@4.0.18)(jiti@2.6.1)(jsdom@25.0.1)(less@4.2.0)(lightningcss@1.30.2)(sass@1.80.6)(terser@5.36.0)(tsx@4.19.2)
transitivePeerDependencies:
- bufferutil
- msw
- utf-8-validate
- vite
'@vitest/browser@4.0.18(vite@7.3.1(@types/node@22.8.6)(jiti@2.6.1)(less@4.2.0)(lightningcss@1.30.2)(sass@1.80.6)(terser@5.36.0)(tsx@4.19.2))(vitest@4.0.17)': '@vitest/browser@4.0.18(vite@7.3.1(@types/node@22.8.6)(jiti@2.6.1)(less@4.2.0)(lightningcss@1.30.2)(sass@1.80.6)(terser@5.36.0)(tsx@4.19.2))(vitest@4.0.17)':
dependencies: dependencies:
'@vitest/mocker': 4.0.18(vite@7.3.1(@types/node@22.8.6)(jiti@2.6.1)(less@4.2.0)(lightningcss@1.30.2)(sass@1.80.6)(terser@5.36.0)(tsx@4.19.2)) '@vitest/mocker': 4.0.18(vite@7.3.1(@types/node@22.8.6)(jiti@2.6.1)(less@4.2.0)(lightningcss@1.30.2)(sass@1.80.6)(terser@5.36.0)(tsx@4.19.2))
@@ -3972,23 +3802,6 @@ snapshots:
- utf-8-validate - utf-8-validate
- vite - vite
'@vitest/browser@4.0.18(vite@7.3.1(@types/node@22.8.6)(jiti@2.6.1)(less@4.2.0)(lightningcss@1.30.2)(sass@1.80.6)(terser@5.36.0)(tsx@4.19.2))(vitest@4.0.18)':
dependencies:
'@vitest/mocker': 4.0.18(vite@7.3.1(@types/node@22.8.6)(jiti@2.6.1)(less@4.2.0)(lightningcss@1.30.2)(sass@1.80.6)(terser@5.36.0)(tsx@4.19.2))
'@vitest/utils': 4.0.18
magic-string: 0.30.21
pixelmatch: 7.1.0
pngjs: 7.0.0
sirv: 3.0.2
tinyrainbow: 3.0.3
vitest: 4.0.18(@types/node@22.8.6)(@vitest/browser-playwright@4.0.18)(jiti@2.6.1)(jsdom@25.0.1)(less@4.2.0)(lightningcss@1.30.2)(sass@1.80.6)(terser@5.36.0)(tsx@4.19.2)
ws: 8.19.0
transitivePeerDependencies:
- bufferutil
- msw
- utf-8-validate
- vite
'@vitest/expect@4.0.17': '@vitest/expect@4.0.17':
dependencies: dependencies:
'@standard-schema/spec': 1.1.0 '@standard-schema/spec': 1.1.0
@@ -3998,15 +3811,6 @@ snapshots:
chai: 6.2.2 chai: 6.2.2
tinyrainbow: 3.0.3 tinyrainbow: 3.0.3
'@vitest/expect@4.0.18':
dependencies:
'@standard-schema/spec': 1.1.0
'@types/chai': 5.2.3
'@vitest/spy': 4.0.18
'@vitest/utils': 4.0.18
chai: 6.2.2
tinyrainbow: 3.0.3
'@vitest/mocker@4.0.17(vite@7.3.1(@types/node@22.8.6)(jiti@2.6.1)(less@4.2.0)(lightningcss@1.30.2)(sass@1.80.6)(terser@5.36.0)(tsx@4.19.2))': '@vitest/mocker@4.0.17(vite@7.3.1(@types/node@22.8.6)(jiti@2.6.1)(less@4.2.0)(lightningcss@1.30.2)(sass@1.80.6)(terser@5.36.0)(tsx@4.19.2))':
dependencies: dependencies:
'@vitest/spy': 4.0.17 '@vitest/spy': 4.0.17
@@ -4015,6 +3819,14 @@ snapshots:
optionalDependencies: optionalDependencies:
vite: 7.3.1(@types/node@22.8.6)(jiti@2.6.1)(less@4.2.0)(lightningcss@1.30.2)(sass@1.80.6)(terser@5.36.0)(tsx@4.19.2) vite: 7.3.1(@types/node@22.8.6)(jiti@2.6.1)(less@4.2.0)(lightningcss@1.30.2)(sass@1.80.6)(terser@5.36.0)(tsx@4.19.2)
'@vitest/mocker@4.0.17(vite@7.3.1(jiti@2.6.1)(less@4.2.0)(lightningcss@1.30.2)(sass@1.80.6)(terser@5.36.0)(tsx@4.19.2))':
dependencies:
'@vitest/spy': 4.0.17
estree-walker: 3.0.3
magic-string: 0.30.21
optionalDependencies:
vite: 7.3.1(@types/node@22.8.6)(jiti@2.6.1)(less@4.2.0)(lightningcss@1.30.2)(sass@1.80.6)(terser@5.36.0)(tsx@4.19.2)
'@vitest/mocker@4.0.18(vite@7.3.1(@types/node@22.8.6)(jiti@2.6.1)(less@4.2.0)(lightningcss@1.30.2)(sass@1.80.6)(terser@5.36.0)(tsx@4.19.2))': '@vitest/mocker@4.0.18(vite@7.3.1(@types/node@22.8.6)(jiti@2.6.1)(less@4.2.0)(lightningcss@1.30.2)(sass@1.80.6)(terser@5.36.0)(tsx@4.19.2))':
dependencies: dependencies:
'@vitest/spy': 4.0.18 '@vitest/spy': 4.0.18
@@ -4036,23 +3848,12 @@ snapshots:
'@vitest/utils': 4.0.17 '@vitest/utils': 4.0.17
pathe: 2.0.3 pathe: 2.0.3
'@vitest/runner@4.0.18':
dependencies:
'@vitest/utils': 4.0.18
pathe: 2.0.3
'@vitest/snapshot@4.0.17': '@vitest/snapshot@4.0.17':
dependencies: dependencies:
'@vitest/pretty-format': 4.0.17 '@vitest/pretty-format': 4.0.17
magic-string: 0.30.21 magic-string: 0.30.21
pathe: 2.0.3 pathe: 2.0.3
'@vitest/snapshot@4.0.18':
dependencies:
'@vitest/pretty-format': 4.0.18
magic-string: 0.30.21
pathe: 2.0.3
'@vitest/spy@4.0.17': {} '@vitest/spy@4.0.17': {}
'@vitest/spy@4.0.18': {} '@vitest/spy@4.0.18': {}
@@ -4090,16 +3891,12 @@ snapshots:
json-schema-traverse: 0.4.1 json-schema-traverse: 0.4.1
uri-js: 4.4.1 uri-js: 4.4.1
ansi-regex@5.0.1: {}
ansi-regex@6.2.2: {} ansi-regex@6.2.2: {}
ansi-styles@4.3.0: ansi-styles@4.3.0:
dependencies: dependencies:
color-convert: 2.0.1 color-convert: 2.0.1
ansi-styles@5.2.0: {}
ansi-styles@6.2.3: {} ansi-styles@6.2.3: {}
anymatch@3.1.3: anymatch@3.1.3:
@@ -4112,10 +3909,6 @@ snapshots:
argparse@2.0.1: {} argparse@2.0.1: {}
aria-query@5.3.0:
dependencies:
dequal: 2.0.3
aria-query@5.3.2: {} aria-query@5.3.2: {}
assertion-error@2.0.1: {} assertion-error@2.0.1: {}
@@ -4297,8 +4090,6 @@ snapshots:
delayed-stream@1.0.0: delayed-stream@1.0.0:
optional: true optional: true
dequal@2.0.3: {}
detect-libc@2.1.2: {} detect-libc@2.1.2: {}
devalue@5.6.2: {} devalue@5.6.2: {}
@@ -4308,8 +4099,6 @@ snapshots:
diff@4.0.2: diff@4.0.2:
optional: true optional: true
dom-accessibility-api@0.5.16: {}
dom-serializer@2.0.0: dom-serializer@2.0.0:
dependencies: dependencies:
domelementtype: 2.3.0 domelementtype: 2.3.0
@@ -4737,8 +4526,6 @@ snapshots:
jiti@2.6.1: {} jiti@2.6.1: {}
js-tokens@4.0.0: {}
js-yaml@4.1.1: js-yaml@4.1.1:
dependencies: dependencies:
argparse: 2.0.1 argparse: 2.0.1
@@ -4878,8 +4665,6 @@ snapshots:
lru-cache@10.4.3: lru-cache@10.4.3:
optional: true optional: true
lz-string@1.5.0: {}
maath@0.10.8(@types/three@0.182.0)(three@0.182.0): maath@0.10.8(@types/three@0.182.0)(three@0.182.0):
dependencies: dependencies:
'@types/three': 0.182.0 '@types/three': 0.182.0
@@ -5066,12 +4851,6 @@ snapshots:
prelude-ls@1.2.1: {} prelude-ls@1.2.1: {}
pretty-format@27.5.1:
dependencies:
ansi-regex: 5.0.1
ansi-styles: 5.2.0
react-is: 17.0.2
prr@1.0.1: prr@1.0.1:
optional: true optional: true
@@ -5084,8 +4863,6 @@ snapshots:
punycode@2.3.1: {} punycode@2.3.1: {}
react-is@17.0.2: {}
readdirp@3.6.0: readdirp@3.6.0:
dependencies: dependencies:
picomatch: 2.3.1 picomatch: 2.3.1
@@ -5473,12 +5250,6 @@ snapshots:
svelte: 5.46.4 svelte: 5.46.4
vitest: 4.0.17(@types/node@22.8.6)(@vitest/browser-playwright@4.0.18)(jiti@2.6.1)(jsdom@25.0.1)(less@4.2.0)(lightningcss@1.30.2)(sass@1.80.6)(terser@5.36.0)(tsx@4.19.2) vitest: 4.0.17(@types/node@22.8.6)(@vitest/browser-playwright@4.0.18)(jiti@2.6.1)(jsdom@25.0.1)(less@4.2.0)(lightningcss@1.30.2)(sass@1.80.6)(terser@5.36.0)(tsx@4.19.2)
vitest-browser-svelte@2.0.2(svelte@5.46.4)(vitest@4.0.18):
dependencies:
'@testing-library/svelte-core': 1.0.0(svelte@5.46.4)
svelte: 5.46.4
vitest: 4.0.18(@types/node@22.8.6)(@vitest/browser-playwright@4.0.18)(jiti@2.6.1)(jsdom@25.0.1)(less@4.2.0)(lightningcss@1.30.2)(sass@1.80.6)(terser@5.36.0)(tsx@4.19.2)
vitest@4.0.17(@types/node@22.8.6)(@vitest/browser-playwright@4.0.18)(jiti@2.6.1)(jsdom@25.0.1)(less@4.2.0)(lightningcss@1.30.2)(sass@1.80.6)(terser@5.36.0)(tsx@4.19.2): vitest@4.0.17(@types/node@22.8.6)(@vitest/browser-playwright@4.0.18)(jiti@2.6.1)(jsdom@25.0.1)(less@4.2.0)(lightningcss@1.30.2)(sass@1.80.6)(terser@5.36.0)(tsx@4.19.2):
dependencies: dependencies:
'@vitest/expect': 4.0.17 '@vitest/expect': 4.0.17
@@ -5518,15 +5289,15 @@ snapshots:
- tsx - tsx
- yaml - yaml
vitest@4.0.18(@types/node@22.8.6)(@vitest/browser-playwright@4.0.18)(jiti@2.6.1)(jsdom@25.0.1)(less@4.2.0)(lightningcss@1.30.2)(sass@1.80.6)(terser@5.36.0)(tsx@4.19.2): vitest@4.0.17(jiti@2.6.1)(jsdom@25.0.1)(less@4.2.0)(lightningcss@1.30.2)(sass@1.80.6)(terser@5.36.0)(tsx@4.19.2):
dependencies: dependencies:
'@vitest/expect': 4.0.18 '@vitest/expect': 4.0.17
'@vitest/mocker': 4.0.18(vite@7.3.1(@types/node@22.8.6)(jiti@2.6.1)(less@4.2.0)(lightningcss@1.30.2)(sass@1.80.6)(terser@5.36.0)(tsx@4.19.2)) '@vitest/mocker': 4.0.17(vite@7.3.1(jiti@2.6.1)(less@4.2.0)(lightningcss@1.30.2)(sass@1.80.6)(terser@5.36.0)(tsx@4.19.2))
'@vitest/pretty-format': 4.0.18 '@vitest/pretty-format': 4.0.17
'@vitest/runner': 4.0.18 '@vitest/runner': 4.0.17
'@vitest/snapshot': 4.0.18 '@vitest/snapshot': 4.0.17
'@vitest/spy': 4.0.18 '@vitest/spy': 4.0.17
'@vitest/utils': 4.0.18 '@vitest/utils': 4.0.17
es-module-lexer: 1.7.0 es-module-lexer: 1.7.0
expect-type: 1.3.0 expect-type: 1.3.0
magic-string: 0.30.21 magic-string: 0.30.21
@@ -5541,8 +5312,6 @@ snapshots:
vite: 7.3.1(@types/node@22.8.6)(jiti@2.6.1)(less@4.2.0)(lightningcss@1.30.2)(sass@1.80.6)(terser@5.36.0)(tsx@4.19.2) vite: 7.3.1(@types/node@22.8.6)(jiti@2.6.1)(less@4.2.0)(lightningcss@1.30.2)(sass@1.80.6)(terser@5.36.0)(tsx@4.19.2)
why-is-node-running: 2.3.0 why-is-node-running: 2.3.0
optionalDependencies: optionalDependencies:
'@types/node': 22.8.6
'@vitest/browser-playwright': 4.0.18(playwright@1.58.1)(vite@7.3.1(@types/node@22.8.6)(jiti@2.6.1)(less@4.2.0)(lightningcss@1.30.2)(sass@1.80.6)(terser@5.36.0)(tsx@4.19.2))(vitest@4.0.18)
jsdom: 25.0.1 jsdom: 25.0.1
transitivePeerDependencies: transitivePeerDependencies:
- jiti - jiti