Compare commits
3 Commits
ac2c61f221
...
v0.0.1
| Author | SHA1 | Date | |
|---|---|---|---|
|
fdc4802d68
|
|||
|
5a30fce4ec
|
|||
|
0d0eb65ddd
|
@@ -13,12 +13,16 @@
|
||||
"markdown": {},
|
||||
"toml": {},
|
||||
"dockerfile": {},
|
||||
"ruff": {},
|
||||
"jupyter": {},
|
||||
"malva": {},
|
||||
"markup": {
|
||||
// https://dprint.dev/plugins/markup_fmt/config/
|
||||
"scriptIndent": true,
|
||||
"styleIndent": true,
|
||||
},
|
||||
"yaml": {},
|
||||
"graphql": {},
|
||||
"exec": {
|
||||
"cwd": "${configDir}",
|
||||
"commands": [
|
||||
@@ -49,8 +53,13 @@
|
||||
"https://plugins.dprint.dev/markdown-0.20.0.wasm",
|
||||
"https://plugins.dprint.dev/toml-0.7.0.wasm",
|
||||
"https://plugins.dprint.dev/dockerfile-0.3.3.wasm",
|
||||
"https://plugins.dprint.dev/ruff-0.6.11.wasm",
|
||||
"https://plugins.dprint.dev/jupyter-0.2.1.wasm",
|
||||
"https://plugins.dprint.dev/g-plane/malva-v0.15.1.wasm",
|
||||
"https://plugins.dprint.dev/g-plane/markup_fmt-v0.25.3.wasm",
|
||||
"https://plugins.dprint.dev/g-plane/pretty_yaml-v0.5.1.wasm",
|
||||
"https://plugins.dprint.dev/g-plane/pretty_graphql-v0.2.3.wasm",
|
||||
"https://plugins.dprint.dev/exec-0.6.0.json@a054130d458f124f9b5c91484833828950723a5af3f8ff2bd1523bd47b83b364",
|
||||
"https://plugins.dprint.dev/biome-0.11.10.wasm",
|
||||
],
|
||||
}
|
||||
|
||||
@@ -1,28 +0,0 @@
|
||||
#!/usr/bin/env bash
|
||||
set -euo pipefail
|
||||
|
||||
mkdir -p app/static
|
||||
|
||||
cp CHANGELOG.md app/static/CHANGELOG.md
|
||||
|
||||
cat >app/static/git.json <<EOF
|
||||
{
|
||||
"ref": "${GITEA_REF:-}",
|
||||
"ref_name": "${GITEA_REF_NAME:-}",
|
||||
"ref_type": "${GITEA_REF_TYPE:-}",
|
||||
"sha": "${GITEA_SHA:-}",
|
||||
"run_number": "${GITEA_RUN_NUMBER:-}",
|
||||
"server_url": "${GITEA_SERVER_URL:-}",
|
||||
"event_name": "${GITEA_EVENT_NAME:-}",
|
||||
"workflow": "${GITEA_WORKFLOW:-}",
|
||||
"job": "${GITEA_JOB:-}",
|
||||
"commit_message": "${GITEA_COMMIT_MESSAGE:-}",
|
||||
"commit_timestamp": "${GITEA_COMMIT_TIMESTAMP:-}",
|
||||
"branch": "${GITEA_HEAD_REF:-}",
|
||||
"base_branch": "${GITEA_BASE_REF:-}"
|
||||
}
|
||||
EOF
|
||||
|
||||
pnpm build
|
||||
|
||||
cp -R packages/ui/build app/build/ui
|
||||
@@ -1,18 +0,0 @@
|
||||
#!/usr/bin/env bash
|
||||
set -euo pipefail
|
||||
|
||||
pnpm build
|
||||
|
||||
pnpm lint &
|
||||
LINT_PID=$!
|
||||
pnpm format:check &
|
||||
FORMAT_PID=$!
|
||||
pnpm check &
|
||||
TYPE_PID=$!
|
||||
xvfb-run --auto-servernum --server-args="-screen 0 1280x1024x24" pnpm test &
|
||||
TEST_PID=$!
|
||||
|
||||
wait $LINT_PID
|
||||
wait $FORMAT_PID
|
||||
wait $TYPE_PID
|
||||
wait $TEST_PID
|
||||
@@ -33,20 +33,7 @@ find . -name package.json ! -path "*/node_modules/*" | while read file; do
|
||||
done
|
||||
|
||||
# -------------------------------------------------------------------
|
||||
# 3. Generate commit list since last release
|
||||
# -------------------------------------------------------------------
|
||||
|
||||
# Get the previous tag (fallback to empty if none)
|
||||
LAST_TAG=$(git tag --sort=-creatordate | grep -v "^$TAG$" | head -n 1 || echo "")
|
||||
|
||||
if [ -n "$LAST_TAG" ]; then
|
||||
COMMITS=$(git log "$LAST_TAG"..HEAD --pretty=format:'[%h](https://git.max-richter.dev/max/nodarium/commit/%H) %s')
|
||||
else
|
||||
COMMITS=$(git log HEAD --pretty=format:'[%h](https://git.max-richter.dev/max/nodarium/commit/%H) %s')
|
||||
fi
|
||||
|
||||
# -------------------------------------------------------------------
|
||||
# 4. Update CHANGELOG.md (prepend)
|
||||
# 3. Update CHANGELOG.md (prepend)
|
||||
# -------------------------------------------------------------------
|
||||
|
||||
tmp_changelog="CHANGELOG.tmp"
|
||||
@@ -55,11 +42,6 @@ tmp_changelog="CHANGELOG.tmp"
|
||||
echo ""
|
||||
echo "$NOTES"
|
||||
echo ""
|
||||
if [ -n "$COMMITS" ]; then
|
||||
echo "All Commits:"
|
||||
echo "$COMMITS"
|
||||
echo ""
|
||||
fi
|
||||
echo "---"
|
||||
echo ""
|
||||
if [ -f CHANGELOG.md ]; then
|
||||
@@ -69,10 +51,8 @@ tmp_changelog="CHANGELOG.tmp"
|
||||
|
||||
mv "$tmp_changelog" CHANGELOG.md
|
||||
|
||||
pnpm exec dprint fmt CHANGELOG.md
|
||||
|
||||
# -------------------------------------------------------------------
|
||||
# 5. Create release commit
|
||||
# 4. Create release commit
|
||||
# -------------------------------------------------------------------
|
||||
|
||||
git config user.name "release-bot"
|
||||
@@ -89,7 +69,7 @@ fi
|
||||
git commit -m "chore(release): $TAG"
|
||||
|
||||
# -------------------------------------------------------------------
|
||||
# 6. Push changes
|
||||
# 5. Push changes
|
||||
# -------------------------------------------------------------------
|
||||
|
||||
git push origin main
|
||||
|
||||
@@ -1,43 +0,0 @@
|
||||
#!/usr/bin/env bash
|
||||
set -euo pipefail
|
||||
|
||||
echo "Configuring rclone"
|
||||
|
||||
KEY_FILE="$(mktemp)"
|
||||
echo "${SSH_PRIVATE_KEY}" >"${KEY_FILE}"
|
||||
chmod 600 "${KEY_FILE}"
|
||||
|
||||
mkdir -p ~/.config/rclone
|
||||
cat >~/.config/rclone/rclone.conf <<EOF
|
||||
[sftp-remote]
|
||||
type = sftp
|
||||
host = ${SSH_HOST}
|
||||
user = ${SSH_USER}
|
||||
port = ${SSH_PORT}
|
||||
key_file = ${KEY_FILE}
|
||||
EOF
|
||||
|
||||
if [[ "${GITHUB_REF_TYPE:-}" == "tag" ]]; then
|
||||
TARGET_DIR="${REMOTE_DIR}"
|
||||
elif [[ "${GITHUB_EVENT_NAME:-}" == "pull_request" ]]; then
|
||||
SAFE_PR_NAME="${GITHUB_HEAD_REF//\//-}"
|
||||
TARGET_DIR="${REMOTE_DIR}_${SAFE_PR_NAME}"
|
||||
elif [[ "${GITHUB_REF_NAME:-}" == "main" ]]; then
|
||||
TARGET_DIR="${REMOTE_DIR}_main"
|
||||
else
|
||||
SAFE_REF="${GITHUB_REF_NAME//\//-}"
|
||||
TARGET_DIR="${REMOTE_DIR}_${SAFE_REF}"
|
||||
fi
|
||||
|
||||
echo "Deploying to ${TARGET_DIR}"
|
||||
|
||||
rclone sync \
|
||||
--update \
|
||||
--verbose \
|
||||
--progress \
|
||||
--exclude _astro/** \
|
||||
--stats 2s \
|
||||
--stats-one-line \
|
||||
--transfers 4 \
|
||||
./app/build/ \
|
||||
"sftp-remote:${TARGET_DIR}"
|
||||
@@ -1,30 +0,0 @@
|
||||
name: Build & Push CI Image
|
||||
|
||||
on:
|
||||
push:
|
||||
paths:
|
||||
- "Dockerfile.ci"
|
||||
|
||||
jobs:
|
||||
build-and-push:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Checkout repository
|
||||
uses: actions/checkout@v4
|
||||
|
||||
- name: Login to Gitea Registry
|
||||
uses: docker/login-action@v3
|
||||
with:
|
||||
registry: git.max-richter.dev
|
||||
username: ${{ gitea.actor }}
|
||||
password: ${{ secrets.GITHUB_TOKEN }}
|
||||
|
||||
- name: Build and Push
|
||||
uses: docker/build-push-action@v5
|
||||
with:
|
||||
context: .
|
||||
file: ./Dockerfile.ci
|
||||
push: true
|
||||
tags: |
|
||||
git.max-richter.dev/${{ gitea.repository }}-ci:latest
|
||||
git.max-richter.dev/${{ gitea.repository }}-ci:${{ github.sha }}
|
||||
@@ -1,16 +1,12 @@
|
||||
name: 🚀 Lint & Test & Deploy
|
||||
name: 🚀 Release
|
||||
|
||||
on:
|
||||
push:
|
||||
branches: ["*"]
|
||||
tags: ["*"]
|
||||
pull_request:
|
||||
branches: ["*"]
|
||||
|
||||
env:
|
||||
PNPM_CACHE_FOLDER: ~/.pnpm-store
|
||||
CARGO_HOME: ~/.cargo
|
||||
CARGO_TARGET_DIR: target
|
||||
|
||||
jobs:
|
||||
release:
|
||||
@@ -22,7 +18,7 @@ jobs:
|
||||
uses: actions/checkout@v4
|
||||
with:
|
||||
fetch-depth: 0
|
||||
token: ${{ secrets.GITEA_TOKEN }}
|
||||
token: ${{ secrets.GITHUB_TOKEN }}
|
||||
|
||||
- name: 💾 Setup pnpm Cache
|
||||
uses: actions/cache@v4
|
||||
@@ -32,45 +28,31 @@ jobs:
|
||||
restore-keys: |
|
||||
${{ runner.os }}-pnpm-
|
||||
|
||||
- name: 🦀 Cache Cargo
|
||||
uses: actions/cache@v4
|
||||
with:
|
||||
path: |
|
||||
~/.cargo/registry
|
||||
~/.cargo/git
|
||||
target
|
||||
key: ${{ runner.os }}-cargo-${{ hashFiles('**/Cargo.lock') }}
|
||||
restore-keys: |
|
||||
${{ runner.os }}-cargo-
|
||||
|
||||
- name: 📦 Install Dependencies
|
||||
run: pnpm install --frozen-lockfile --store-dir ${{ env.PNPM_CACHE_FOLDER }}
|
||||
|
||||
- name: 🧹 Quality Control
|
||||
run: ./.gitea/scripts/ci-checks.sh
|
||||
- name: 🧹 Lint
|
||||
run: pnpm lint
|
||||
|
||||
- name: 🎨 Format Check
|
||||
run: pnpm format:check
|
||||
|
||||
- name: 🧬 Type Check
|
||||
run: pnpm check
|
||||
|
||||
- name: 🛠️ Build
|
||||
run: ./.gitea/scripts/build.sh
|
||||
run: pnpm build:deploy
|
||||
|
||||
- name: 🚀 Create Release Commit
|
||||
if: gitea.ref_type == 'tag'
|
||||
if: github.ref_type == 'tag'
|
||||
run: ./.gitea/scripts/create-release.sh
|
||||
|
||||
- name: 🏷️ Create Gitea Release
|
||||
if: gitea.ref_type == 'tag'
|
||||
if: github.ref_type == 'tag'
|
||||
uses: akkuman/gitea-release-action@v1
|
||||
with:
|
||||
tag_name: ${{ gitea.ref_name }}
|
||||
release_name: Release ${{ gitea.ref_name }}
|
||||
tag_name: ${{ github.ref_name }}
|
||||
release_name: Release ${{ github.ref_name }}
|
||||
body_path: CHANGELOG.md
|
||||
draft: false
|
||||
prerelease: false
|
||||
|
||||
- name: 🚀 Deploy Changed Files via rclone
|
||||
run: ./.gitea/scripts/deploy-files.sh
|
||||
env:
|
||||
REMOTE_DIR: ${{ vars.REMOTE_DIR }}
|
||||
SSH_PRIVATE_KEY: ${{ secrets.SSH_PRIVATE_KEY }}
|
||||
SSH_HOST: ${{ vars.SSH_HOST }}
|
||||
SSH_PORT: ${{ vars.SSH_PORT }}
|
||||
SSH_USER: ${{ vars.SSH_USER }}
|
||||
|
||||
13
CHANGELOG.md
13
CHANGELOG.md
@@ -1,13 +0,0 @@
|
||||
## v0.0.2 (2026-02-04)
|
||||
|
||||
fix(ci): actually deploy on tags
|
||||
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)
|
||||
|
||||
chore: format
|
||||
|
||||
---
|
||||
19
Dockerfile
Normal file
19
Dockerfile
Normal file
@@ -0,0 +1,19 @@
|
||||
FROM node:24-alpine
|
||||
|
||||
# Install all required packages in one layer
|
||||
RUN apk add --no-cache curl git jq g++ make
|
||||
|
||||
# Set Rust paths
|
||||
ENV RUSTUP_HOME=/usr/local/rustup \
|
||||
CARGO_HOME=/usr/local/cargo \
|
||||
PATH=/usr/local/cargo/bin:$PATH
|
||||
|
||||
# Install Rust, wasm target, and pnpm
|
||||
RUN curl --silent --show-error --location --fail --retry 3 \
|
||||
--proto '=https' --tlsv1.2 \
|
||||
--output /tmp/rustup-init.sh https://sh.rustup.rs \
|
||||
&& sh /tmp/rustup-init.sh -y --no-modify-path --profile minimal \
|
||||
&& rm /tmp/rustup-init.sh \
|
||||
&& rustup target add wasm32-unknown-unknown \
|
||||
&& rm -rf /usr/local/rustup/toolchains/*/share/doc \
|
||||
&& npm i -g pnpm
|
||||
@@ -1,28 +0,0 @@
|
||||
FROM node:25-bookworm-slim
|
||||
|
||||
RUN apt-get update && apt-get install -y \
|
||||
curl \
|
||||
git \
|
||||
jq \
|
||||
g++ \
|
||||
make \
|
||||
rclone \
|
||||
libglapi-mesa \
|
||||
libosmesa6 \
|
||||
xvfb
|
||||
|
||||
ENV RUSTUP_HOME=/usr/local/rustup \
|
||||
CARGO_HOME=/usr/local/cargo \
|
||||
PATH=/usr/local/cargo/bin:$PATH
|
||||
|
||||
RUN curl --silent --show-error --location --fail --retry 3 \
|
||||
--proto '=https' --tlsv1.2 \
|
||||
--output /tmp/rustup-init.sh https://sh.rustup.rs \
|
||||
&& sh /tmp/rustup-init.sh -y --no-modify-path --profile minimal \
|
||||
&& rm /tmp/rustup-init.sh \
|
||||
&& rustup target add wasm32-unknown-unknown \
|
||||
&& rm -rf /usr/local/rustup/toolchains/*/share/doc \
|
||||
&& npm i -g pnpm \
|
||||
&& pnpx playwright install-deps \
|
||||
&& pnpx playwright install --with-deps firefox \
|
||||
&& rm -rf /var/lib/apt/lists/*
|
||||
2
app/.gitignore
vendored
2
app/.gitignore
vendored
@@ -27,5 +27,3 @@ dist-ssr
|
||||
*.sln
|
||||
*.sw?
|
||||
build/
|
||||
|
||||
test-results/
|
||||
|
||||
@@ -1,62 +0,0 @@
|
||||
import { expect, test } from '@playwright/test';
|
||||
|
||||
test('test', async ({ page }) => {
|
||||
// Listen for console messages
|
||||
page.on('console', msg => {
|
||||
console.log(`[Browser Console] ${msg.type()}: ${msg.text()}`);
|
||||
});
|
||||
|
||||
await page.goto('http://localhost:4173', { waitUntil: 'load' });
|
||||
|
||||
// await expect(page).toHaveScreenshot();
|
||||
await expect(page.locator('.graph-wrapper')).toHaveScreenshot();
|
||||
|
||||
await page.getByRole('button', { name: 'projects' }).click();
|
||||
await page.getByRole('button', { name: 'New', exact: true }).click();
|
||||
await page.getByRole('combobox').selectOption('2');
|
||||
await page.getByRole('textbox', { name: 'Project name' }).click();
|
||||
await page.getByRole('textbox', { name: 'Project name' }).fill('Test Project');
|
||||
await page.getByRole('button', { name: 'Create' }).click();
|
||||
|
||||
const expectedNodes = [
|
||||
{
|
||||
id: '10',
|
||||
type: 'max/plantarium/stem',
|
||||
props: {
|
||||
amount: 50,
|
||||
length: 4,
|
||||
thickness: 1
|
||||
}
|
||||
},
|
||||
{
|
||||
id: '11',
|
||||
type: 'max/plantarium/noise',
|
||||
props: {
|
||||
scale: 0.5,
|
||||
strength: 5
|
||||
}
|
||||
},
|
||||
{
|
||||
id: '9',
|
||||
type: 'max/plantarium/output'
|
||||
}
|
||||
];
|
||||
|
||||
for (const node of expectedNodes) {
|
||||
const wrapper = page.locator(
|
||||
`div.wrapper[data-node-id="${node.id}"][data-node-type="${node.type}"]`
|
||||
);
|
||||
await expect(wrapper).toBeVisible();
|
||||
if ('props' in node) {
|
||||
const props = node.props as unknown as Record<string, number>;
|
||||
for (const propId in node.props) {
|
||||
const expectedValue = props[propId];
|
||||
const inputElement = page.locator(
|
||||
`div.wrapper[data-node-type="${node.type}"][data-node-input="${propId}"] input[type="number"]`
|
||||
);
|
||||
const value = parseFloat(await inputElement.inputValue());
|
||||
expect(value).toBe(expectedValue);
|
||||
}
|
||||
}
|
||||
}
|
||||
});
|
||||
Binary file not shown.
|
Before Width: | Height: | Size: 42 KiB |
@@ -1,14 +1,12 @@
|
||||
{
|
||||
"name": "@nodarium/app",
|
||||
"private": true,
|
||||
"version": "0.0.2",
|
||||
"version": "0.0.0",
|
||||
"type": "module",
|
||||
"scripts": {
|
||||
"dev": "vite dev",
|
||||
"build": "svelte-kit sync && vite build",
|
||||
"test:unit": "vitest",
|
||||
"test": "npm run test:unit -- --run && npm run test:e2e",
|
||||
"test:e2e": "playwright test",
|
||||
"test": "vitest",
|
||||
"preview": "vite preview",
|
||||
"format": "dprint fmt -c '../.dprint.jsonc' .",
|
||||
"format:check": "dprint check -c '../.dprint.jsonc' .",
|
||||
@@ -27,7 +25,8 @@
|
||||
"idb": "^8.0.3",
|
||||
"jsondiffpatch": "^0.7.3",
|
||||
"tailwindcss": "^4.1.18",
|
||||
"three": "^0.182.0"
|
||||
"three": "^0.182.0",
|
||||
"wabt": "^1.0.39"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@eslint/compat": "^2.0.2",
|
||||
@@ -35,13 +34,11 @@
|
||||
"@iconify-json/tabler": "^1.2.26",
|
||||
"@iconify/tailwind4": "^1.2.1",
|
||||
"@nodarium/types": "workspace:",
|
||||
"@playwright/test": "^1.58.1",
|
||||
"@sveltejs/adapter-static": "^3.0.10",
|
||||
"@sveltejs/vite-plugin-svelte": "^6.2.4",
|
||||
"@tsconfig/svelte": "^5.0.6",
|
||||
"@types/file-saver": "^2.0.7",
|
||||
"@types/three": "^0.182.0",
|
||||
"@vitest/browser-playwright": "^4.0.18",
|
||||
"dprint": "^0.51.1",
|
||||
"eslint": "^9.39.2",
|
||||
"eslint-plugin-svelte": "^3.14.0",
|
||||
@@ -55,7 +52,6 @@
|
||||
"vite-plugin-comlink": "^5.3.0",
|
||||
"vite-plugin-glsl": "^1.5.5",
|
||||
"vite-plugin-wasm": "^3.5.0",
|
||||
"vitest": "^4.0.17",
|
||||
"vitest-browser-svelte": "^2.0.2"
|
||||
"vitest": "^4.0.17"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,20 +0,0 @@
|
||||
import { defineConfig } from '@playwright/test';
|
||||
|
||||
export default defineConfig({
|
||||
webServer: { command: 'pnpm build && pnpm preview', port: 4173 },
|
||||
testDir: 'e2e',
|
||||
use: {
|
||||
browserName: 'firefox',
|
||||
launchOptions: {
|
||||
firefoxUserPrefs: {
|
||||
// Force WebGL even without a GPU
|
||||
'webgl.force-enabled': true,
|
||||
'webgl.disabled': false,
|
||||
// Use software rendering (Mesa) instead of hardware
|
||||
'layers.acceleration.disabled': true,
|
||||
'gfx.webrender.software': true,
|
||||
'webgl.enable-webgl2': true
|
||||
}
|
||||
}
|
||||
}
|
||||
});
|
||||
@@ -2,7 +2,7 @@
|
||||
@source "../../packages/ui/**/*.svelte";
|
||||
@plugin "@iconify/tailwind4" {
|
||||
prefix: "i";
|
||||
icon-sets: from-folder("custom", "./src/lib/icons");
|
||||
icon-sets: from-folder(custom, "./src/lib/icons");
|
||||
}
|
||||
|
||||
body * {
|
||||
|
||||
@@ -1,110 +0,0 @@
|
||||
import { grid } from '$lib/graph-templates/grid';
|
||||
import { tree } from '$lib/graph-templates/tree';
|
||||
import { describe, expect, it } from 'vitest';
|
||||
|
||||
describe('graph-templates', () => {
|
||||
describe('grid', () => {
|
||||
it('should create a grid graph with nodes and edges', () => {
|
||||
const result = grid(2, 3);
|
||||
expect(result.nodes.length).toBeGreaterThan(0);
|
||||
expect(result.edges.length).toBeGreaterThan(0);
|
||||
});
|
||||
|
||||
it('should have output node at the end', () => {
|
||||
const result = grid(1, 1);
|
||||
const outputNode = result.nodes.find(n => n.type === 'max/plantarium/output');
|
||||
expect(outputNode).toBeDefined();
|
||||
});
|
||||
|
||||
it('should create nodes based on grid dimensions', () => {
|
||||
const result = grid(2, 2);
|
||||
const mathNodes = result.nodes.filter(n => n.type === 'max/plantarium/math');
|
||||
expect(mathNodes.length).toBeGreaterThan(0);
|
||||
const outputNode = result.nodes.find(n => n.type === 'max/plantarium/output');
|
||||
expect(outputNode).toBeDefined();
|
||||
});
|
||||
|
||||
it('should have output node at the end', () => {
|
||||
const result = grid(1, 1);
|
||||
const outputNode = result.nodes.find(n => n.type === 'max/plantarium/output');
|
||||
expect(outputNode).toBeDefined();
|
||||
});
|
||||
|
||||
it('should create nodes based on grid dimensions', () => {
|
||||
const result = grid(2, 2);
|
||||
const mathNodes = result.nodes.filter(n => n.type === 'max/plantarium/math');
|
||||
expect(mathNodes.length).toBeGreaterThan(0);
|
||||
const outputNode = result.nodes.find(n => n.type === 'max/plantarium/output');
|
||||
expect(outputNode).toBeDefined();
|
||||
});
|
||||
|
||||
it('should have valid node positions', () => {
|
||||
const result = grid(3, 2);
|
||||
|
||||
result.nodes.forEach(node => {
|
||||
expect(node.position).toHaveLength(2);
|
||||
expect(typeof node.position[0]).toBe('number');
|
||||
expect(typeof node.position[1]).toBe('number');
|
||||
});
|
||||
});
|
||||
|
||||
it('should generate valid graph structure', () => {
|
||||
const result = grid(2, 2);
|
||||
|
||||
result.nodes.forEach(node => {
|
||||
expect(typeof node.id).toBe('number');
|
||||
expect(node.type).toBeTruthy();
|
||||
});
|
||||
|
||||
result.edges.forEach(edge => {
|
||||
expect(edge).toHaveLength(4);
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
describe('tree', () => {
|
||||
it('should create a tree graph with specified depth', () => {
|
||||
const result = tree(0);
|
||||
|
||||
expect(result.nodes.length).toBeGreaterThan(0);
|
||||
expect(result.edges.length).toBeGreaterThan(0);
|
||||
});
|
||||
|
||||
it('should have root output node', () => {
|
||||
const result = tree(2);
|
||||
|
||||
const outputNode = result.nodes.find(n => n.type === 'max/plantarium/output');
|
||||
expect(outputNode).toBeDefined();
|
||||
expect(outputNode?.id).toBe(0);
|
||||
});
|
||||
|
||||
it('should increase node count with depth', () => {
|
||||
const tree0 = tree(0);
|
||||
const tree1 = tree(1);
|
||||
const tree2 = tree(2);
|
||||
|
||||
expect(tree0.nodes.length).toBeLessThan(tree1.nodes.length);
|
||||
expect(tree1.nodes.length).toBeLessThan(tree2.nodes.length);
|
||||
});
|
||||
|
||||
it('should create binary tree structure', () => {
|
||||
const result = tree(2);
|
||||
|
||||
const mathNodes = result.nodes.filter(n => n.type === 'max/plantarium/math');
|
||||
expect(mathNodes.length).toBeGreaterThan(0);
|
||||
|
||||
const edgeCount = result.edges.length;
|
||||
expect(edgeCount).toBe(result.nodes.length - 1);
|
||||
});
|
||||
|
||||
it('should have valid node positions', () => {
|
||||
const result = tree(3);
|
||||
|
||||
result.nodes.forEach(node => {
|
||||
expect(node.position).toHaveLength(2);
|
||||
expect(typeof node.position[0]).toBe('number');
|
||||
expect(typeof node.position[1]).toBe('number');
|
||||
});
|
||||
});
|
||||
});
|
||||
});
|
||||
@@ -4,5 +4,4 @@ export { default as lottaFaces } from './lotta-faces.json';
|
||||
export { default as lottaNodesAndFaces } from './lotta-nodes-and-faces.json';
|
||||
export { default as lottaNodes } from './lotta-nodes.json';
|
||||
export { plant } from './plant';
|
||||
export { default as simple } from './simple.json';
|
||||
export { tree } from './tree';
|
||||
|
||||
@@ -1,63 +0,0 @@
|
||||
{
|
||||
"id": 0,
|
||||
"settings": {
|
||||
"resolution.circle": 54,
|
||||
"resolution.curve": 20,
|
||||
"randomSeed": true
|
||||
},
|
||||
"meta": {
|
||||
"title": "New Project",
|
||||
"lastModified": "2026-02-03T16:56:40.375Z"
|
||||
},
|
||||
"nodes": [
|
||||
{
|
||||
"id": 9,
|
||||
"position": [
|
||||
215,
|
||||
85
|
||||
],
|
||||
"type": "max/plantarium/output",
|
||||
"props": {}
|
||||
},
|
||||
{
|
||||
"id": 10,
|
||||
"position": [
|
||||
165,
|
||||
72.5
|
||||
],
|
||||
"type": "max/plantarium/stem",
|
||||
"props": {
|
||||
"amount": 50,
|
||||
"length": 4,
|
||||
"thickness": 1
|
||||
}
|
||||
},
|
||||
{
|
||||
"id": 11,
|
||||
"position": [
|
||||
190,
|
||||
77.5
|
||||
],
|
||||
"type": "max/plantarium/noise",
|
||||
"props": {
|
||||
"plant": 0,
|
||||
"scale": 0.5,
|
||||
"strength": 5
|
||||
}
|
||||
}
|
||||
],
|
||||
"edges": [
|
||||
[
|
||||
10,
|
||||
0,
|
||||
11,
|
||||
"plant"
|
||||
],
|
||||
[
|
||||
11,
|
||||
0,
|
||||
9,
|
||||
"input"
|
||||
]
|
||||
]
|
||||
}
|
||||
@@ -1,145 +0,0 @@
|
||||
import { clone, debounce, humanizeDuration, humanizeNumber, lerp, snapToGrid } from '$lib/helpers';
|
||||
import { describe, expect, it } from 'vitest';
|
||||
|
||||
describe('helpers', () => {
|
||||
describe('snapToGrid', () => {
|
||||
it('should snap to nearest grid point', () => {
|
||||
expect(snapToGrid(5, 10)).toBe(10);
|
||||
expect(snapToGrid(15, 10)).toBe(20);
|
||||
expect(snapToGrid(0, 10)).toBe(0);
|
||||
expect(snapToGrid(-10, 10)).toBe(-10);
|
||||
});
|
||||
|
||||
it('should snap exact midpoint values', () => {
|
||||
expect(snapToGrid(5, 10)).toBe(10);
|
||||
});
|
||||
|
||||
it('should use default grid size of 10', () => {
|
||||
expect(snapToGrid(5)).toBe(10);
|
||||
expect(snapToGrid(15)).toBe(20);
|
||||
});
|
||||
|
||||
it('should handle values exactly on grid', () => {
|
||||
expect(snapToGrid(10, 10)).toBe(10);
|
||||
expect(snapToGrid(20, 10)).toBe(20);
|
||||
});
|
||||
});
|
||||
|
||||
describe('lerp', () => {
|
||||
it('should linearly interpolate between two values', () => {
|
||||
expect(lerp(0, 100, 0)).toBe(0);
|
||||
expect(lerp(0, 100, 0.5)).toBe(50);
|
||||
expect(lerp(0, 100, 1)).toBe(100);
|
||||
});
|
||||
|
||||
it('should handle negative values', () => {
|
||||
expect(lerp(-50, 50, 0.5)).toBe(0);
|
||||
expect(lerp(-100, 0, 0.5)).toBe(-50);
|
||||
});
|
||||
|
||||
it('should handle t values outside 0-1 range', () => {
|
||||
expect(lerp(0, 100, -0.5)).toBe(-50);
|
||||
expect(lerp(0, 100, 1.5)).toBe(150);
|
||||
});
|
||||
});
|
||||
|
||||
describe('humanizeNumber', () => {
|
||||
it('should return unchanged numbers below 1000', () => {
|
||||
expect(humanizeNumber(0)).toBe('0');
|
||||
expect(humanizeNumber(999)).toBe('999');
|
||||
});
|
||||
|
||||
it('should add K suffix for thousands', () => {
|
||||
expect(humanizeNumber(1000)).toBe('1K');
|
||||
expect(humanizeNumber(1500)).toBe('1.5K');
|
||||
expect(humanizeNumber(999999)).toBe('1000K');
|
||||
});
|
||||
|
||||
it('should add M suffix for millions', () => {
|
||||
expect(humanizeNumber(1000000)).toBe('1M');
|
||||
expect(humanizeNumber(2500000)).toBe('2.5M');
|
||||
});
|
||||
|
||||
it('should add B suffix for billions', () => {
|
||||
expect(humanizeNumber(1000000000)).toBe('1B');
|
||||
});
|
||||
});
|
||||
|
||||
describe('humanizeDuration', () => {
|
||||
it('should return ms for very short durations', () => {
|
||||
expect(humanizeDuration(100)).toBe('100ms');
|
||||
expect(humanizeDuration(999)).toBe('999ms');
|
||||
});
|
||||
|
||||
it('should format seconds', () => {
|
||||
expect(humanizeDuration(1000)).toBe('1s');
|
||||
expect(humanizeDuration(1500)).toBe('1s500ms');
|
||||
expect(humanizeDuration(59000)).toBe('59s');
|
||||
});
|
||||
|
||||
it('should format minutes', () => {
|
||||
expect(humanizeDuration(60000)).toBe('1m');
|
||||
expect(humanizeDuration(90000)).toBe('1m 30s');
|
||||
});
|
||||
|
||||
it('should format hours', () => {
|
||||
expect(humanizeDuration(3600000)).toBe('1h');
|
||||
expect(humanizeDuration(3661000)).toBe('1h 1m 1s');
|
||||
});
|
||||
|
||||
it('should format days', () => {
|
||||
expect(humanizeDuration(86400000)).toBe('1d');
|
||||
expect(humanizeDuration(90061000)).toBe('1d 1h 1m 1s');
|
||||
});
|
||||
|
||||
it('should handle zero', () => {
|
||||
expect(humanizeDuration(0)).toBe('0ms');
|
||||
});
|
||||
});
|
||||
|
||||
describe('debounce', () => {
|
||||
it('should return a function', () => {
|
||||
const fn = debounce(() => {}, 100);
|
||||
expect(typeof fn).toBe('function');
|
||||
});
|
||||
|
||||
it('should only call once when invoked multiple times within delay', () => {
|
||||
let callCount = 0;
|
||||
const fn = debounce(() => {
|
||||
callCount++;
|
||||
}, 100);
|
||||
fn();
|
||||
const firstCall = callCount;
|
||||
fn();
|
||||
fn();
|
||||
expect(callCount).toBe(firstCall);
|
||||
});
|
||||
});
|
||||
|
||||
describe('clone', () => {
|
||||
it('should deep clone objects', () => {
|
||||
const original = { a: 1, b: { c: 2 } };
|
||||
const cloned = clone(original);
|
||||
|
||||
expect(cloned).toEqual(original);
|
||||
expect(cloned).not.toBe(original);
|
||||
expect(cloned.b).not.toBe(original.b);
|
||||
});
|
||||
|
||||
it('should handle arrays', () => {
|
||||
const original = [1, 2, [3, 4]];
|
||||
const cloned = clone(original);
|
||||
|
||||
expect(cloned).toEqual(original);
|
||||
expect(cloned).not.toBe(original);
|
||||
expect(cloned[2]).not.toBe(original[2]);
|
||||
});
|
||||
|
||||
it('should handle primitives', () => {
|
||||
expect(clone(42)).toBe(42);
|
||||
expect(clone('hello')).toBe('hello');
|
||||
expect(clone(true)).toBe(true);
|
||||
expect(clone(null)).toBe(null);
|
||||
});
|
||||
});
|
||||
});
|
||||
@@ -1,72 +0,0 @@
|
||||
import { isObject, mergeDeep } from '$lib/helpers/deepMerge';
|
||||
import { describe, expect, it } from 'vitest';
|
||||
|
||||
describe('deepMerge', () => {
|
||||
describe('isObject', () => {
|
||||
it('should return true for plain objects', () => {
|
||||
expect(isObject({})).toBe(true);
|
||||
expect(isObject({ a: 1 })).toBe(true);
|
||||
});
|
||||
|
||||
it('should return false for non-objects', () => {
|
||||
expect(isObject([])).toBe(false);
|
||||
expect(isObject('string')).toBe(false);
|
||||
expect(isObject(42)).toBe(false);
|
||||
expect(isObject(undefined)).toBe(false);
|
||||
});
|
||||
});
|
||||
|
||||
describe('mergeDeep', () => {
|
||||
it('should merge two flat objects', () => {
|
||||
const target = { a: 1, b: 2 };
|
||||
const source = { b: 3, c: 4 };
|
||||
const result = mergeDeep(target, source);
|
||||
|
||||
expect(result).toEqual({ a: 1, b: 3, c: 4 });
|
||||
});
|
||||
|
||||
it('should deeply merge nested objects', () => {
|
||||
const target = { a: { x: 1 }, b: { y: 2 } };
|
||||
const source = { a: { y: 2 }, c: { z: 3 } };
|
||||
const result = mergeDeep(target, source);
|
||||
|
||||
expect(result).toEqual({
|
||||
a: { x: 1, y: 2 },
|
||||
b: { y: 2 },
|
||||
c: { z: 3 }
|
||||
});
|
||||
});
|
||||
|
||||
it('should handle multiple sources', () => {
|
||||
const target = { a: 1 };
|
||||
const source1 = { b: 2 };
|
||||
const source2 = { c: 3 };
|
||||
const result = mergeDeep(target, source1, source2);
|
||||
|
||||
expect(result).toEqual({ a: 1, b: 2, c: 3 });
|
||||
});
|
||||
|
||||
it('should return target if no sources provided', () => {
|
||||
const target = { a: 1 };
|
||||
const result = mergeDeep(target);
|
||||
|
||||
expect(result).toBe(target);
|
||||
});
|
||||
|
||||
it('should overwrite non-object values', () => {
|
||||
const target = { a: { b: 1 } };
|
||||
const source = { a: 'string' };
|
||||
const result = mergeDeep(target, source);
|
||||
|
||||
expect(result.a).toBe('string');
|
||||
});
|
||||
|
||||
it('should handle arrays by replacing', () => {
|
||||
const target = { a: [1, 2] };
|
||||
const source = { a: [3, 4] };
|
||||
const result = mergeDeep(target, source);
|
||||
|
||||
expect(result.a).toEqual([3, 4]);
|
||||
});
|
||||
});
|
||||
});
|
||||
@@ -1,13 +1,13 @@
|
||||
<script lang="ts">
|
||||
import { defaultPlant, lottaFaces, plant, simple } from '$lib/graph-templates';
|
||||
import { defaultPlant, lottaFaces, plant } from '$lib/graph-templates';
|
||||
import type { Graph } from '$lib/types';
|
||||
import { InputSelect } from '@nodarium/ui';
|
||||
import type { ProjectManager } from './project-manager.svelte';
|
||||
|
||||
const { projectManager } = $props<{ projectManager: ProjectManager }>();
|
||||
|
||||
let showNewProject = $state(false);
|
||||
let newProjectName = $state('');
|
||||
let selectedTemplate = $state('defaultPlant');
|
||||
|
||||
const templates = [
|
||||
{
|
||||
@@ -16,27 +16,25 @@
|
||||
graph: defaultPlant as unknown as Graph
|
||||
},
|
||||
{ name: 'Plant', value: 'plant', graph: plant as unknown as Graph },
|
||||
{ name: 'Simple', value: 'simple', graph: simple as unknown as Graph },
|
||||
{
|
||||
name: 'Lotta Faces',
|
||||
value: 'lottaFaces',
|
||||
graph: lottaFaces as unknown as Graph
|
||||
}
|
||||
];
|
||||
let selectedTemplateIndex = $state(0);
|
||||
|
||||
function handleCreate() {
|
||||
const template = templates[selectedTemplateIndex] || templates[0];
|
||||
const template = templates.find((t) => t.value === selectedTemplate) || templates[0];
|
||||
projectManager.handleCreateProject(template.graph, newProjectName);
|
||||
newProjectName = '';
|
||||
showNewProject = false;
|
||||
}
|
||||
</script>
|
||||
|
||||
<header class="flex justify-between px-4 h-[70px] border-b-1 border-outline items-center bg-layer-2">
|
||||
<header class="flex justify-between px-4 h-[70px] border-b-1 border-outline items-center">
|
||||
<h3>Project</h3>
|
||||
<button
|
||||
class="px-3 py-1 bg-layer-1 rounded"
|
||||
class="px-3 py-1 bg-layer-0 rounded"
|
||||
onclick={() => (showNewProject = !showNewProject)}
|
||||
>
|
||||
New
|
||||
@@ -44,17 +42,24 @@
|
||||
</header>
|
||||
|
||||
{#if showNewProject}
|
||||
<div class="flex flex-col px-4 py-3.5 mt-[1px] border-b-1 border-outline gap-3">
|
||||
<div class="flex flex-col px-4 py-3 border-b-1 border-outline gap-2">
|
||||
<input
|
||||
type="text"
|
||||
bind:value={newProjectName}
|
||||
placeholder="Project name"
|
||||
class="w-full px-2 py-2 bg-layer-2 rounded"
|
||||
class="w-full px-2 py-2 bg-gray-800 border border-gray-700 rounded"
|
||||
onkeydown={(e) => e.key === 'Enter' && handleCreate()}
|
||||
/>
|
||||
<InputSelect options={templates.map(t => t.name)} bind:value={selectedTemplateIndex} />
|
||||
<select
|
||||
bind:value={selectedTemplate}
|
||||
class="w-full px-2 py-2 bg-gray-800 border border-gray-700 rounded"
|
||||
>
|
||||
{#each templates as template (template.name)}
|
||||
<option value={template.value}>{template.name}</option>
|
||||
{/each}
|
||||
</select>
|
||||
<button
|
||||
class="cursor-pointer self-end px-3 py-1 bg-selected rounded"
|
||||
class="cursor-pointer self-end px-3 py-1 bg-blue-600 rounded"
|
||||
onclick={() => handleCreate()}
|
||||
>
|
||||
Create
|
||||
@@ -62,22 +67,20 @@
|
||||
</div>
|
||||
{/if}
|
||||
|
||||
<div class="text-white min-h-screen">
|
||||
<div class="p-4 text-white min-h-screen">
|
||||
{#if projectManager.loading}
|
||||
<p>Loading...</p>
|
||||
{/if}
|
||||
|
||||
<ul>
|
||||
<ul class="space-y-2">
|
||||
{#each projectManager.projects as project (project.id)}
|
||||
<li>
|
||||
<div
|
||||
class="
|
||||
h-[70px] border-b-1 border-b-outline
|
||||
flex
|
||||
w-full text-left px-3 py-2 cursor-pointer {projectManager
|
||||
w-full text-left px-3 py-2 rounded cursor-pointer {projectManager
|
||||
.activeProjectId.value === project.id
|
||||
? 'border-l-2 border-l-selected pl-2.5!'
|
||||
: ''}
|
||||
? 'bg-blue-600'
|
||||
: 'bg-gray-800 hover:bg-gray-700'}
|
||||
"
|
||||
onclick={() => projectManager.handleSelectProject(project.id!)}
|
||||
role="button"
|
||||
@@ -86,10 +89,10 @@
|
||||
e.key === 'Enter'
|
||||
&& projectManager.handleSelectProject(project.id!)}
|
||||
>
|
||||
<div class="flex justify-between items-center grow">
|
||||
<div class="flex justify-between items-center">
|
||||
<span>{project.meta?.title || 'Untitled'}</span>
|
||||
<button
|
||||
class="text-layer-1! bg-red-500 w-7 text-xl rounded-sm cursor-pointer opacity-20 hover:opacity-80"
|
||||
class="text-red-400 hover:text-red-300"
|
||||
onclick={() => {
|
||||
projectManager.handleDeleteProject(project.id!);
|
||||
}}
|
||||
|
||||
@@ -54,7 +54,7 @@ export class ProjectManager {
|
||||
|
||||
g.id = id;
|
||||
if (!g.meta) g.meta = {};
|
||||
g.meta.title = title;
|
||||
if (!g.meta.title) g.meta.title = title;
|
||||
|
||||
db.saveGraph(g);
|
||||
this.projects = [...this.projects, g];
|
||||
|
||||
@@ -56,10 +56,6 @@
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (Array.isArray(inputValue) && node.type === 'vec3') {
|
||||
return inputValue;
|
||||
}
|
||||
|
||||
// If the component is supplied with a default value use that
|
||||
if (inputValue !== undefined && typeof inputValue !== 'object') {
|
||||
return inputValue;
|
||||
@@ -102,7 +98,7 @@
|
||||
&& typeof internalValue === 'number'
|
||||
) {
|
||||
value[key] = node?.options?.[internalValue];
|
||||
} else if (internalValue !== undefined) {
|
||||
} else if (internalValue) {
|
||||
value[key] = internalValue;
|
||||
}
|
||||
});
|
||||
@@ -128,6 +124,7 @@
|
||||
|
||||
{#if key && isNodeInput(type?.[key])}
|
||||
{@const inputType = type[key]}
|
||||
<!-- Leaf input -->
|
||||
<div class="input input-{inputType.type}" class:first-level={depth === 1}>
|
||||
{#if inputType.type === 'button'}
|
||||
<button onclick={handleClick}>
|
||||
@@ -141,6 +138,7 @@
|
||||
{/if}
|
||||
</div>
|
||||
{:else if depth === 0}
|
||||
<!-- Root: iterate over top-level keys -->
|
||||
{#each Object.keys(type ?? {}).filter((k) => k !== 'title') as childKey (childKey)}
|
||||
<NestedSettings
|
||||
id={`${id}.${childKey}`}
|
||||
@@ -152,6 +150,7 @@
|
||||
{/each}
|
||||
<hr />
|
||||
{:else if key && type?.[key]}
|
||||
<!-- Group -->
|
||||
{#if depth > 0}
|
||||
<hr />
|
||||
{/if}
|
||||
|
||||
@@ -34,7 +34,7 @@
|
||||
<div class="wrapper" class:hidden>
|
||||
{#if title}
|
||||
<header class="bg-layer-2">
|
||||
<h3>{title}</h3>
|
||||
<h3 class="font-bold">{title}</h3>
|
||||
</header>
|
||||
{/if}
|
||||
{@render children?.()}
|
||||
|
||||
@@ -12,7 +12,7 @@
|
||||
</script>
|
||||
|
||||
<div class='{node?"border-l-2 pl-3.5!":""} bg-layer-2 flex items-center h-[70px] border-b-1 border-l-selected border-b-outline pl-4'>
|
||||
<h3>Node Settings</h3>
|
||||
<h3 class="font-bold">Node Settings</h3>
|
||||
</div>
|
||||
|
||||
{#if node}
|
||||
|
||||
@@ -1,79 +0,0 @@
|
||||
<script lang="ts">
|
||||
type Change = { type: string; content: string };
|
||||
|
||||
async function fetchChangelog() {
|
||||
const res = await fetch('/CHANGELOG.md');
|
||||
return await res.text();
|
||||
}
|
||||
|
||||
const typeMap: Record<string, string> = {
|
||||
fix: 'bg-layer-2 bg-red-800',
|
||||
feat: 'bg-layer-2 bg-green-800',
|
||||
chore: 'bg-layer-2 bg-gray-800',
|
||||
docs: 'bg-layer-2 bg-blue-800',
|
||||
refactor: 'bg-layer-2 bg-purple-800',
|
||||
default: 'bg-layer-2 text-text'
|
||||
};
|
||||
|
||||
function parseChangelog(md: string) {
|
||||
const lines = md.split('\n');
|
||||
const parsed: (string | Change)[] = [];
|
||||
|
||||
for (let line of lines) {
|
||||
line = line.trim();
|
||||
if (!line) continue;
|
||||
|
||||
if (line === '---') {
|
||||
parsed.push({ type: 'hr', content: '' });
|
||||
continue;
|
||||
}
|
||||
|
||||
// Headers
|
||||
if (line.startsWith('## ')) {
|
||||
parsed.push(line.replace('## ', ''));
|
||||
continue;
|
||||
}
|
||||
|
||||
// Commit type
|
||||
const match = line.match(/^(fix|feat|chore|docs|refactor)(\(|:)/i);
|
||||
if (match) {
|
||||
parsed.push({ type: match[1].toLowerCase(), content: line });
|
||||
continue;
|
||||
}
|
||||
|
||||
// Other lines
|
||||
parsed.push({ type: 'default', content: line });
|
||||
}
|
||||
|
||||
let lastLine = parsed.at(-1);
|
||||
if (lastLine !== undefined && typeof lastLine !== 'string' && lastLine.type === 'hr') {
|
||||
parsed.pop();
|
||||
}
|
||||
|
||||
return parsed;
|
||||
}
|
||||
</script>
|
||||
|
||||
<div class="p-4 font-mono text-text">
|
||||
{#await fetchChangelog()}
|
||||
<p>Loading...</p>
|
||||
{:then md}
|
||||
{#each parseChangelog(md) as item (item)}
|
||||
{#if typeof item === 'string'}
|
||||
<h2 class="text-xl font-semibold mt-4 mb-4 text-layer-1">{item}</h2>
|
||||
{:else if item.type === 'hr'}
|
||||
<p></p>
|
||||
{:else}
|
||||
<p class="px-3 py-1 mb-1 leading-8 border-b-1 border-b-outline last:border-b-0">
|
||||
{#if item.type !== 'default'}
|
||||
<span class="p-1 rounded-sm font-semibold {typeMap[item.type]}">
|
||||
{item.content.split(':')[0]}
|
||||
</span> {item.content.split(':').slice(1).join(':').trim()}
|
||||
{:else}
|
||||
{item.content}
|
||||
{/if}
|
||||
</p>
|
||||
{/if}
|
||||
{/each}
|
||||
{/await}
|
||||
</div>
|
||||
@@ -7,7 +7,7 @@
|
||||
return JSON.stringify(
|
||||
{
|
||||
...g,
|
||||
nodes: g.nodes.map((n: object) => ({ ...n, tmp: undefined, state: undefined }))
|
||||
nodes: g.nodes.map((n: object) => ({ ...n, tmp: undefined }))
|
||||
},
|
||||
null,
|
||||
2
|
||||
|
||||
@@ -17,7 +17,6 @@
|
||||
import Panel from '$lib/sidebar/Panel.svelte';
|
||||
import ActiveNodeSettings from '$lib/sidebar/panels/ActiveNodeSettings.svelte';
|
||||
import BenchmarkPanel from '$lib/sidebar/panels/BenchmarkPanel.svelte';
|
||||
import Changelog from '$lib/sidebar/panels/Changelog.svelte';
|
||||
import ExportSettings from '$lib/sidebar/panels/ExportSettings.svelte';
|
||||
import GraphSource from '$lib/sidebar/panels/GraphSource.svelte';
|
||||
import Keymap from '$lib/sidebar/panels/Keymap.svelte';
|
||||
@@ -250,13 +249,6 @@
|
||||
/>
|
||||
<ActiveNodeSettings {manager} bind:node={activeNode} />
|
||||
</Panel>
|
||||
<Panel
|
||||
id="changelog"
|
||||
title="Changelog"
|
||||
icon="i-[tabler--file-text-spark] bg-green-400"
|
||||
>
|
||||
<Changelog />
|
||||
</Panel>
|
||||
</Sidebar>
|
||||
</Grid.Cell>
|
||||
</Grid.Row>
|
||||
|
||||
@@ -7,6 +7,7 @@
|
||||
import Sidebar from '$lib/sidebar/Sidebar.svelte';
|
||||
import { type NodeId, type NodeInstance } from '@nodarium/types';
|
||||
import { concatEncodedArrays, createWasmWrapper, encodeNestedArray } from '@nodarium/utils';
|
||||
import Code from './Code.svelte';
|
||||
|
||||
const registryCache = new IndexDBCache('node-registry');
|
||||
const nodeRegistry = new RemoteNodeRegistry('', registryCache);
|
||||
@@ -77,7 +78,11 @@
|
||||
</Grid.Cell>
|
||||
|
||||
<Grid.Cell>
|
||||
<div class="h-screen w-[80vw] overflow-y-auto"></div>
|
||||
<div class="h-screen w-[80vw] overflow-y-auto">
|
||||
{#if nodeWasm}
|
||||
<Code wasm={nodeWasm} />
|
||||
{/if}
|
||||
</div>
|
||||
</Grid.Cell>
|
||||
</Grid.Row>
|
||||
|
||||
|
||||
26
app/src/routes/dev/Code.svelte
Normal file
26
app/src/routes/dev/Code.svelte
Normal file
@@ -0,0 +1,26 @@
|
||||
<script lang="ts">
|
||||
import wabtInit from 'wabt';
|
||||
|
||||
const { wasm } = $props<{ wasm: ArrayBuffer }>();
|
||||
|
||||
async function toWat(arrayBuffer: ArrayBuffer) {
|
||||
const wabt = await wabtInit();
|
||||
|
||||
const module = wabt.readWasm(new Uint8Array(arrayBuffer), {
|
||||
readDebugNames: true
|
||||
});
|
||||
|
||||
module.generateNames();
|
||||
module.applyNames();
|
||||
|
||||
return module.toText({ foldExprs: false, inlineExport: false });
|
||||
}
|
||||
</script>
|
||||
|
||||
{#await toWat(wasm)}
|
||||
<p>Converting to WAT</p>
|
||||
{:then c}
|
||||
<pre>
|
||||
<code class="text-gray-50">{c}</code>
|
||||
</pre>
|
||||
{/await}
|
||||
1
app/static/.gitignore
vendored
1
app/static/.gitignore
vendored
@@ -1,2 +1 @@
|
||||
nodes/
|
||||
CHANGELOG.md
|
||||
|
||||
@@ -1,10 +1,9 @@
|
||||
import { sveltekit } from '@sveltejs/kit/vite';
|
||||
import tailwindcss from '@tailwindcss/vite';
|
||||
import { playwright } from '@vitest/browser-playwright';
|
||||
import { defineConfig } from 'vite';
|
||||
import comlink from 'vite-plugin-comlink';
|
||||
import glsl from 'vite-plugin-glsl';
|
||||
import wasm from 'vite-plugin-wasm';
|
||||
import { defineConfig } from 'vitest/config';
|
||||
|
||||
export default defineConfig({
|
||||
plugins: [
|
||||
@@ -21,36 +20,5 @@ export default defineConfig({
|
||||
},
|
||||
ssr: {
|
||||
noExternal: ['three']
|
||||
},
|
||||
build: {
|
||||
chunkSizeWarningLimit: 2000
|
||||
},
|
||||
test: {
|
||||
expect: { requireAssertions: true },
|
||||
projects: [
|
||||
{
|
||||
extends: './vite.config.ts',
|
||||
test: {
|
||||
name: 'client',
|
||||
browser: {
|
||||
enabled: true,
|
||||
provider: playwright(),
|
||||
instances: [{ browser: 'firefox', headless: true }]
|
||||
},
|
||||
include: ['src/**/*.svelte.{test,spec}.{js,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}']
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
});
|
||||
|
||||
@@ -1,15 +1,15 @@
|
||||
{
|
||||
"version": "0.0.2",
|
||||
"scripts": {
|
||||
"postinstall": "pnpm run -r --filter 'ui' build",
|
||||
"build": "pnpm build:nodes && pnpm build:app",
|
||||
"lint": "pnpm run -r --parallel lint",
|
||||
"format": "pnpm dprint fmt",
|
||||
"format:check": "pnpm dprint check",
|
||||
"test": "pnpm run -r test",
|
||||
"check": "pnpm run -r check",
|
||||
"build": "pnpm build:nodes && pnpm build:app",
|
||||
"build:story": "pnpm -r --filter 'ui' story:build",
|
||||
"build:app": "BASE_PATH=/ui pnpm -r --filter 'ui' build && pnpm -r --filter 'app' build",
|
||||
"build:nodes": "cargo build --workspace --target wasm32-unknown-unknown --release && rm -rf ./app/static/nodes/max/plantarium/ && mkdir -p ./app/static/nodes/max/plantarium/ && cp -R ./target/wasm32-unknown-unknown/release/*.wasm ./app/static/nodes/max/plantarium/",
|
||||
"build:deploy": "pnpm build && cp -R packages/ui/build app/build/ui",
|
||||
"dev:nodes": "chokidar './nodes/**' --initial -i '/pkg/' -c 'pnpm build:nodes'",
|
||||
"dev:app_ui": "pnpm -r --parallel --filter 'app' --filter './packages/ui' dev",
|
||||
"dev_ui": "pnpm -r --filter 'ui' dev:ui",
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@nodarium/types",
|
||||
"version": "0.0.2",
|
||||
"version": "0.0.0",
|
||||
"description": "",
|
||||
"main": "src/index.ts",
|
||||
"scripts": {
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@nodarium/ui",
|
||||
"version": "0.0.2",
|
||||
"version": "0.0.1",
|
||||
"scripts": {
|
||||
"dev": "vite",
|
||||
"build": "vite build && npm run package",
|
||||
@@ -34,17 +34,14 @@
|
||||
"@eslint/eslintrc": "^3.3.3",
|
||||
"@eslint/js": "^9.39.2",
|
||||
"@nodarium/types": "workspace:",
|
||||
"@playwright/test": "^1.58.1",
|
||||
"@sveltejs/adapter-static": "^3.0.10",
|
||||
"@sveltejs/kit": "^2.50.0",
|
||||
"@sveltejs/package": "^2.5.7",
|
||||
"@sveltejs/vite-plugin-svelte": "^6.2.4",
|
||||
"@testing-library/svelte": "^5.3.1",
|
||||
"@types/eslint": "^9.6.1",
|
||||
"@types/three": "^0.182.0",
|
||||
"@typescript-eslint/eslint-plugin": "^8.53.0",
|
||||
"@typescript-eslint/parser": "^8.53.0",
|
||||
"@vitest/browser-playwright": "^4.0.18",
|
||||
"dprint": "^0.51.1",
|
||||
"eslint": "^9.39.2",
|
||||
"eslint-plugin-svelte": "^3.14.0",
|
||||
@@ -57,8 +54,7 @@
|
||||
"typescript": "^5.9.3",
|
||||
"typescript-eslint": "^8.54.0",
|
||||
"vite": "^7.3.1",
|
||||
"vitest": "^4.0.18",
|
||||
"vitest-browser-svelte": "^2.0.2"
|
||||
"vitest": "^4.0.17"
|
||||
},
|
||||
"svelte": "./dist/index.js",
|
||||
"types": "./dist/index.d.ts",
|
||||
|
||||
@@ -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();
|
||||
});
|
||||
});
|
||||
@@ -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();
|
||||
});
|
||||
});
|
||||
@@ -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);
|
||||
});
|
||||
});
|
||||
@@ -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();
|
||||
});
|
||||
});
|
||||
@@ -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');
|
||||
});
|
||||
});
|
||||
@@ -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');
|
||||
});
|
||||
});
|
||||
@@ -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');
|
||||
});
|
||||
});
|
||||
@@ -11,7 +11,7 @@ const config = {
|
||||
|
||||
kit: {
|
||||
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.
|
||||
// If your environment is not supported, or you settled on a specific environment, switch out the adapter.
|
||||
|
||||
@@ -1,6 +1,5 @@
|
||||
import { sveltekit } from '@sveltejs/kit/vite';
|
||||
import tailwindcss from '@tailwindcss/vite';
|
||||
import { playwright } from '@vitest/browser-playwright';
|
||||
import { exec } from 'node:child_process';
|
||||
import { readFileSync } from 'node:fs';
|
||||
import { defineConfig } from 'vitest/config';
|
||||
@@ -22,31 +21,6 @@ const postDevPackagePlugin = () => {
|
||||
export default defineConfig({
|
||||
plugins: [tailwindcss(), sveltekit(), postDevPackagePlugin()],
|
||||
test: {
|
||||
expect: { requireAssertions: true },
|
||||
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}']
|
||||
}
|
||||
}
|
||||
]
|
||||
include: ['src/**/*.{test,spec}.{js,ts}']
|
||||
}
|
||||
});
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@nodarium/utils",
|
||||
"version": "0.0.2",
|
||||
"version": "0.0.1",
|
||||
"description": "",
|
||||
"main": "src/index.ts",
|
||||
"scripts": {
|
||||
|
||||
@@ -5,6 +5,7 @@ test('encode_float', () => {
|
||||
const input = 1.23;
|
||||
const encoded = encodeFloat(input);
|
||||
const output = decodeFloat(encoded);
|
||||
console.log(input, output);
|
||||
expect(output).toBeCloseTo(input);
|
||||
});
|
||||
|
||||
|
||||
@@ -21,6 +21,24 @@ test('fastHashArray doesnt product collisions', () => {
|
||||
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('fastHashArray is deterministic', () => {
|
||||
const a = new Int32Array(1000);
|
||||
|
||||
@@ -8,6 +8,8 @@ test('it correctly concats nested arrays', () => {
|
||||
|
||||
const output = concatEncodedArrays([input_a, input_b, input_c]);
|
||||
|
||||
console.log('Output', output);
|
||||
|
||||
const decoded = decodeNestedArray(output);
|
||||
|
||||
expect(decoded[0]).toEqual([1, 2, 3]);
|
||||
|
||||
@@ -88,7 +88,7 @@ function decode_recursive(dense: number[] | Int32Array, index = 0) {
|
||||
dense,
|
||||
index
|
||||
);
|
||||
decoded.push(p as number[]);
|
||||
decoded.push(...p);
|
||||
index = nextIndex + 1;
|
||||
nextBracketIndex = _nextBracketIndex;
|
||||
} else {
|
||||
|
||||
457
pnpm-lock.yaml
generated
457
pnpm-lock.yaml
generated
@@ -59,6 +59,9 @@ importers:
|
||||
three:
|
||||
specifier: ^0.182.0
|
||||
version: 0.182.0
|
||||
wabt:
|
||||
specifier: ^1.0.39
|
||||
version: 1.0.39
|
||||
devDependencies:
|
||||
'@eslint/compat':
|
||||
specifier: ^2.0.2
|
||||
@@ -75,9 +78,6 @@ importers:
|
||||
'@nodarium/types':
|
||||
specifier: 'workspace:'
|
||||
version: link:../packages/types
|
||||
'@playwright/test':
|
||||
specifier: ^1.58.1
|
||||
version: 1.58.1
|
||||
'@sveltejs/adapter-static':
|
||||
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)))
|
||||
@@ -93,9 +93,6 @@ importers:
|
||||
'@types/three':
|
||||
specifier: ^0.182.0
|
||||
version: 0.182.0
|
||||
'@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.17)
|
||||
dprint:
|
||||
specifier: ^0.51.1
|
||||
version: 0.51.1
|
||||
@@ -137,10 +134,7 @@ importers:
|
||||
version: 3.5.0(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:
|
||||
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)
|
||||
vitest-browser-svelte:
|
||||
specifier: ^2.0.2
|
||||
version: 2.0.2(svelte@5.46.4)(vitest@4.0.17)
|
||||
version: 4.0.17(@types/node@22.8.6)(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/types:
|
||||
dependencies:
|
||||
@@ -185,9 +179,6 @@ importers:
|
||||
'@nodarium/types':
|
||||
specifier: 'workspace:'
|
||||
version: link:../types
|
||||
'@playwright/test':
|
||||
specifier: ^1.58.1
|
||||
version: 1.58.1
|
||||
'@sveltejs/adapter-static':
|
||||
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)))
|
||||
@@ -200,9 +191,6 @@ importers:
|
||||
'@sveltejs/vite-plugin-svelte':
|
||||
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))
|
||||
'@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':
|
||||
specifier: ^9.6.1
|
||||
version: 9.6.1
|
||||
@@ -215,9 +203,6 @@ importers:
|
||||
'@typescript-eslint/parser':
|
||||
specifier: ^8.53.0
|
||||
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:
|
||||
specifier: ^0.51.1
|
||||
version: 0.51.1
|
||||
@@ -255,11 +240,8 @@ importers:
|
||||
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)
|
||||
vitest:
|
||||
specifier: ^4.0.18
|
||||
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)
|
||||
vitest-browser-svelte:
|
||||
specifier: ^2.0.2
|
||||
version: 2.0.2(svelte@5.46.4)(vitest@4.0.18)
|
||||
specifier: ^4.0.17
|
||||
version: 4.0.17(@types/node@22.8.6)(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/utils:
|
||||
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)
|
||||
vitest:
|
||||
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(@types/node@22.8.6)(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:
|
||||
|
||||
@@ -285,18 +267,6 @@ packages:
|
||||
'@asamuzakjp/css-color@3.2.0':
|
||||
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':
|
||||
resolution: {integrity: sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==}
|
||||
engines: {node: '>=12'}
|
||||
@@ -881,11 +851,6 @@ packages:
|
||||
resolution: {integrity: sha512-WYa2tUVV5HiArWPB3ydlOc4R2ivq0IDrlqhMi3l7mVsFEXNcTfxYFPIHXHXIh/ca/y/V5N4E1zecyxdIBjYnkQ==}
|
||||
engines: {node: '>= 10.0.0'}
|
||||
|
||||
'@playwright/test@1.58.1':
|
||||
resolution: {integrity: sha512-6LdVIUERWxQMmUSSQi0I53GgCBYgM2RpGngCPY7hSeju+VrKjq3lvs7HpJoPbDiY5QM5EYRtRX5fvrinnMAz3w==}
|
||||
engines: {node: '>=18'}
|
||||
hasBin: true
|
||||
|
||||
'@polka/url@1.0.0-next.29':
|
||||
resolution: {integrity: sha512-wwQAWhWSuHaag8c4q/KN/vCoeOJYshAIvMQwD4GpSb3OiZklFfvAgmj0VCBBImRpuF/aFgIRzllXlVX93Jevww==}
|
||||
|
||||
@@ -1168,29 +1133,6 @@ packages:
|
||||
peerDependencies:
|
||||
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':
|
||||
resolution: {integrity: sha512-VkUePoLV6oOYwSUvX6ShA8KLnJqZiYMIbP2JW2t0GLWLkJxKGvuH5qrrZBV/X7cXFnLGuFQEC7RheYiZOW68KQ==}
|
||||
engines: {node: '>=16'}
|
||||
peerDependencies:
|
||||
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':
|
||||
resolution: {integrity: sha512-pmt1ALRhbHhCJQTj2FuthH6PeLIeaM4hOuS2JO3kWSwlnvx/9xuUkjFR3JOi/myMqsH7pSsLIROSaBxDfttjeA==}
|
||||
peerDependencies:
|
||||
@@ -1226,9 +1168,6 @@ packages:
|
||||
'@tweenjs/tween.js@23.1.3':
|
||||
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':
|
||||
resolution: {integrity: sha512-Mw558oeA9fFbv65/y4mHtXDs9bPnFMZAL/jxdPFUpOHHIXX91mcgEHbS5Lahr+pwZFR8A7GQleRWeI6cGFC2UA==}
|
||||
|
||||
@@ -1380,23 +1319,9 @@ packages:
|
||||
resolution: {integrity: sha512-VFlhGSl4opC0bprJiItPQ1RfUhGDIBokcPwaFH4yiBCaNPeld/9VeXbiPO1cLyorQi1G1vL+ecBk1x8o1axORA==}
|
||||
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
|
||||
|
||||
'@vitest/browser-playwright@4.0.18':
|
||||
resolution: {integrity: sha512-gfajTHVCiwpxRj1qh0Sh/5bbGLG4F/ZH/V9xvFVoFddpITfMta9YGow0W6ZpTTORv2vdJuz9TnrNSmjKvpOf4g==}
|
||||
peerDependencies:
|
||||
playwright: '*'
|
||||
vitest: 4.0.18
|
||||
|
||||
'@vitest/browser@4.0.18':
|
||||
resolution: {integrity: sha512-gVQqh7paBz3gC+ZdcCmNSWJMk70IUjDeVqi+5m5vYpEHsIwRgw3Y545jljtajhkekIpIp5Gg8oK7bctgY0E2Ng==}
|
||||
peerDependencies:
|
||||
vitest: 4.0.18
|
||||
|
||||
'@vitest/expect@4.0.17':
|
||||
resolution: {integrity: sha512-mEoqP3RqhKlbmUmntNDDCJeTDavDR+fVYkSOw8qRwJFaW/0/5zA9zFeTrHqNtcmwh6j26yMmwx2PqUDPzt5ZAQ==}
|
||||
|
||||
'@vitest/expect@4.0.18':
|
||||
resolution: {integrity: sha512-8sCWUyckXXYvx4opfzVY03EOiYVxyNrHS5QxX3DAIi5dpJAAkyJezHCP77VMX4HKA2LDT/Jpfo8i2r5BE3GnQQ==}
|
||||
|
||||
'@vitest/mocker@4.0.17':
|
||||
resolution: {integrity: sha512-+ZtQhLA3lDh1tI2wxe3yMsGzbp7uuJSWBM1iTIKCbppWTSBN09PUC+L+fyNlQApQoR+Ps8twt2pbSSXg2fQVEQ==}
|
||||
peerDependencies:
|
||||
@@ -1408,47 +1333,21 @@ packages:
|
||||
vite:
|
||||
optional: true
|
||||
|
||||
'@vitest/mocker@4.0.18':
|
||||
resolution: {integrity: sha512-HhVd0MDnzzsgevnOWCBj5Otnzobjy5wLBe4EdeeFGv8luMsGcYqDuFRMcttKWZA5vVO8RFjexVovXvAM4JoJDQ==}
|
||||
peerDependencies:
|
||||
msw: ^2.4.9
|
||||
vite: ^6.0.0 || ^7.0.0-0
|
||||
peerDependenciesMeta:
|
||||
msw:
|
||||
optional: true
|
||||
vite:
|
||||
optional: true
|
||||
|
||||
'@vitest/pretty-format@4.0.17':
|
||||
resolution: {integrity: sha512-Ah3VAYmjcEdHg6+MwFE17qyLqBHZ+ni2ScKCiW2XrlSBV4H3Z7vYfPfz7CWQ33gyu76oc0Ai36+kgLU3rfF4nw==}
|
||||
|
||||
'@vitest/pretty-format@4.0.18':
|
||||
resolution: {integrity: sha512-P24GK3GulZWC5tz87ux0m8OADrQIUVDPIjjj65vBXYG17ZeU3qD7r+MNZ1RNv4l8CGU2vtTRqixrOi9fYk/yKw==}
|
||||
|
||||
'@vitest/runner@4.0.17':
|
||||
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':
|
||||
resolution: {integrity: sha512-npPelD7oyL+YQM2gbIYvlavlMVWUfNNGZPcu0aEUQXt7FXTuqhmgiYupPnAanhKvyP6Srs2pIbWo30K0RbDtRQ==}
|
||||
|
||||
'@vitest/snapshot@4.0.18':
|
||||
resolution: {integrity: sha512-PCiV0rcl7jKQjbgYqjtakly6T1uwv/5BQ9SwBLekVg/EaYeQFPiXcgrC2Y7vDMA8dM1SUEAEV82kgSQIlXNMvA==}
|
||||
|
||||
'@vitest/spy@4.0.17':
|
||||
resolution: {integrity: sha512-I1bQo8QaP6tZlTomQNWKJE6ym4SHf3oLS7ceNjozxxgzavRAgZDc06T7kD8gb9bXKEgcLNt00Z+kZO6KaJ62Ew==}
|
||||
|
||||
'@vitest/spy@4.0.18':
|
||||
resolution: {integrity: sha512-cbQt3PTSD7P2OARdVW3qWER5EGq7PHlvE+QfzSC0lbwO+xnt7+XH06ZzFjFRgzUX//JmpxrCu92VdwvEPlWSNw==}
|
||||
|
||||
'@vitest/utils@4.0.17':
|
||||
resolution: {integrity: sha512-RG6iy+IzQpa9SB8HAFHJ9Y+pTzI+h8553MrciN9eC6TFBErqrQaTas4vG+MVj8S4uKk8uTT2p0vgZPnTdxd96w==}
|
||||
|
||||
'@vitest/utils@4.0.18':
|
||||
resolution: {integrity: sha512-msMRKLMVLWygpK3u2Hybgi4MNjcYJvwTb0Ru09+fOyCXIgT5raYP041DRRdiJiI3k/2U6SEbAETB3YtBrUkCFA==}
|
||||
|
||||
'@webgpu/types@0.1.69':
|
||||
resolution: {integrity: sha512-RPmm6kgRbI8e98zSD3RVACvnuktIja5+yLgDAkTmxLr90BEwdTXRQWNLF3ETTTyH/8mKhznZuN5AveXYFEsMGQ==}
|
||||
|
||||
@@ -1473,10 +1372,6 @@ packages:
|
||||
ajv@6.12.6:
|
||||
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:
|
||||
resolution: {integrity: sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==}
|
||||
engines: {node: '>=12'}
|
||||
@@ -1485,10 +1380,6 @@ packages:
|
||||
resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==}
|
||||
engines: {node: '>=8'}
|
||||
|
||||
ansi-styles@5.2.0:
|
||||
resolution: {integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==}
|
||||
engines: {node: '>=10'}
|
||||
|
||||
ansi-styles@6.2.3:
|
||||
resolution: {integrity: sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==}
|
||||
engines: {node: '>=12'}
|
||||
@@ -1503,9 +1394,6 @@ packages:
|
||||
argparse@2.0.1:
|
||||
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:
|
||||
resolution: {integrity: sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==}
|
||||
engines: {node: '>= 0.4'}
|
||||
@@ -1694,10 +1582,6 @@ packages:
|
||||
resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==}
|
||||
engines: {node: '>=0.4.0'}
|
||||
|
||||
dequal@2.0.3:
|
||||
resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==}
|
||||
engines: {node: '>=6'}
|
||||
|
||||
detect-libc@2.1.2:
|
||||
resolution: {integrity: sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==}
|
||||
engines: {node: '>=8'}
|
||||
@@ -1712,9 +1596,6 @@ packages:
|
||||
resolution: {integrity: sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==}
|
||||
engines: {node: '>=0.3.1'}
|
||||
|
||||
dom-accessibility-api@0.5.16:
|
||||
resolution: {integrity: sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg==}
|
||||
|
||||
dom-serializer@2.0.0:
|
||||
resolution: {integrity: sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==}
|
||||
|
||||
@@ -1910,11 +1791,6 @@ packages:
|
||||
resolution: {integrity: sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w==}
|
||||
engines: {node: '>= 6'}
|
||||
|
||||
fsevents@2.3.2:
|
||||
resolution: {integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==}
|
||||
engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0}
|
||||
os: [darwin]
|
||||
|
||||
fsevents@2.3.3:
|
||||
resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==}
|
||||
engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0}
|
||||
@@ -2060,9 +1936,6 @@ packages:
|
||||
resolution: {integrity: sha512-ekilCSN1jwRvIbgeg/57YFh8qQDNbwDb9xT/qu2DAHbFFZUicIl4ygVaAvzveMhMVr3LnpSKTNnwt8PoOfmKhQ==}
|
||||
hasBin: true
|
||||
|
||||
js-tokens@4.0.0:
|
||||
resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==}
|
||||
|
||||
js-yaml@4.1.1:
|
||||
resolution: {integrity: sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==}
|
||||
hasBin: true
|
||||
@@ -2207,10 +2080,6 @@ packages:
|
||||
lru-cache@10.4.3:
|
||||
resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==}
|
||||
|
||||
lz-string@1.5.0:
|
||||
resolution: {integrity: sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ==}
|
||||
hasBin: true
|
||||
|
||||
maath@0.10.8:
|
||||
resolution: {integrity: sha512-tRvbDF0Pgqz+9XUa4jjfgAQ8/aPKmQdWXilFu2tMy4GWj4NOsx99HlULO4IeREfbO3a0sA145DZYyvXPkybm0g==}
|
||||
peerDependencies:
|
||||
@@ -2365,27 +2234,9 @@ packages:
|
||||
resolution: {integrity: sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==}
|
||||
engines: {node: '>=6'}
|
||||
|
||||
pixelmatch@7.1.0:
|
||||
resolution: {integrity: sha512-1wrVzJ2STrpmONHKBy228LM1b84msXDUoAzVEl0R8Mz4Ce6EPr+IVtxm8+yvrqLYMHswREkjYFaMxnyGnaY3Ng==}
|
||||
hasBin: true
|
||||
|
||||
pkg-types@1.3.1:
|
||||
resolution: {integrity: sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ==}
|
||||
|
||||
playwright-core@1.58.1:
|
||||
resolution: {integrity: sha512-bcWzOaTxcW+VOOGBCQgnaKToLJ65d6AqfLVKEWvexyS3AS6rbXl+xdpYRMGSRBClPvyj44njOWoxjNdL/H9UNg==}
|
||||
engines: {node: '>=18'}
|
||||
hasBin: true
|
||||
|
||||
playwright@1.58.1:
|
||||
resolution: {integrity: sha512-+2uTZHxSCcxjvGc5C891LrS1/NlxglGxzrC4seZiVjcYVQfUa87wBL6rTDqzGjuoWNjnBzRqKmF6zRYGMvQUaQ==}
|
||||
engines: {node: '>=18'}
|
||||
hasBin: true
|
||||
|
||||
pngjs@7.0.0:
|
||||
resolution: {integrity: sha512-LKWqWJRhstyYo9pGvgor/ivk2w94eSjE3RGVuzLGlr3NmD8bf7RcYGze1mNdEHRP6TRP6rMuDHk5t44hnTRyow==}
|
||||
engines: {node: '>=14.19.0'}
|
||||
|
||||
postcss-load-config@3.1.4:
|
||||
resolution: {integrity: sha512-6DiM4E7v4coTE4uzA8U//WhtPwyhiim3eyjEMFCnUpzbrkK9wJHgKDT2mR+HbtSrd/NubVaYTOpSpjUl8NQeRg==}
|
||||
engines: {node: '>= 10'}
|
||||
@@ -2422,10 +2273,6 @@ packages:
|
||||
resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==}
|
||||
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:
|
||||
resolution: {integrity: sha512-yPw4Sng1gWghHQWj0B3ZggWUm4qVbPwPFcRG8KyxiU7J2OHFSoEHKS+EZ3fv5l1t9CyCiop6l/ZYeWbrgoQejw==}
|
||||
|
||||
@@ -2438,9 +2285,6 @@ packages:
|
||||
resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==}
|
||||
engines: {node: '>=6'}
|
||||
|
||||
react-is@17.0.2:
|
||||
resolution: {integrity: sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==}
|
||||
|
||||
readdirp@3.6.0:
|
||||
resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==}
|
||||
engines: {node: '>=8.10.0'}
|
||||
@@ -2817,12 +2661,6 @@ packages:
|
||||
vite:
|
||||
optional: true
|
||||
|
||||
vitest-browser-svelte@2.0.2:
|
||||
resolution: {integrity: sha512-OLJVYoIYflwToFIy3s41pZ9mVp6dwXfYd8IIsWoc57g8DyN3SxsNJ5GB1xWFPxLFlKM+1MPExjPxLaqdELrfRQ==}
|
||||
peerDependencies:
|
||||
svelte: ^3 || ^4 || ^5 || ^5.0.0-next.0
|
||||
vitest: ^4.0.0
|
||||
|
||||
vitest@4.0.17:
|
||||
resolution: {integrity: sha512-FQMeF0DJdWY0iOnbv466n/0BudNdKj1l5jYgl5JVTwjSsZSlqyXFt/9+1sEyhR6CLowbZpV7O1sCHrzBhucKKg==}
|
||||
engines: {node: ^20.0.0 || ^22.0.0 || >=24.0.0}
|
||||
@@ -2857,44 +2695,14 @@ packages:
|
||||
jsdom:
|
||||
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:
|
||||
resolution: {integrity: sha512-o8qghlI8NZHU1lLPrpi2+Uq7abh4GGPpYANlalzWxyWteJOCsr/P+oPBA49TOLu5FTZO4d3F9MnWJfiMo4BkmA==}
|
||||
engines: {node: '>=18'}
|
||||
|
||||
wabt@1.0.39:
|
||||
resolution: {integrity: sha512-ba+dRL/75VQQY7RkU/CgriGbkoWAfS8TDyUlJfJhJ8KhtXgMl5dhNvoPNUcQ9IWRhW8u41glMSuZeTvsYq2rRg==}
|
||||
hasBin: true
|
||||
|
||||
webgl-sdf-generator@1.1.1:
|
||||
resolution: {integrity: sha512-9Z0JcMTFxeE+b2x1LJTdnaT8rT8aEp7MVxkNwoycNmJWwPdzoXzMh0BjJSh/AEFP+KPYZUli814h8bJZFIZ2jA==}
|
||||
|
||||
@@ -2998,16 +2806,6 @@ snapshots:
|
||||
lru-cache: 10.4.3
|
||||
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':
|
||||
dependencies:
|
||||
'@jridgewell/trace-mapping': 0.3.9
|
||||
@@ -3417,10 +3215,6 @@ snapshots:
|
||||
'@parcel/watcher-win32-x64': 2.5.4
|
||||
optional: true
|
||||
|
||||
'@playwright/test@1.58.1':
|
||||
dependencies:
|
||||
playwright: 1.58.1
|
||||
|
||||
'@polka/url@1.0.0-next.29': {}
|
||||
|
||||
'@publint/pack@0.1.2': {}
|
||||
@@ -3636,30 +3430,6 @@ snapshots:
|
||||
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)
|
||||
|
||||
'@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)':
|
||||
dependencies:
|
||||
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)':
|
||||
dependencies:
|
||||
diet-sprite: 0.0.1
|
||||
@@ -3706,8 +3476,6 @@ snapshots:
|
||||
|
||||
'@tweenjs/tween.js@23.1.3': {}
|
||||
|
||||
'@types/aria-query@5.0.4': {}
|
||||
|
||||
'@types/chai@5.2.3':
|
||||
dependencies:
|
||||
'@types/deep-eql': 4.0.2
|
||||
@@ -3929,66 +3697,6 @@ snapshots:
|
||||
'@typescript-eslint/types': 8.54.0
|
||||
eslint-visitor-keys: 4.2.1
|
||||
|
||||
'@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.17)':
|
||||
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.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))
|
||||
playwright: 1.58.1
|
||||
tinyrainbow: 3.0.3
|
||||
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)
|
||||
transitivePeerDependencies:
|
||||
- bufferutil
|
||||
- msw
|
||||
- utf-8-validate
|
||||
- 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)':
|
||||
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.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)
|
||||
ws: 8.19.0
|
||||
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.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':
|
||||
dependencies:
|
||||
'@standard-schema/spec': 1.1.0
|
||||
@@ -3998,16 +3706,7 @@ snapshots:
|
||||
chai: 6.2.2
|
||||
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(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
|
||||
@@ -4015,58 +3714,28 @@ snapshots:
|
||||
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))':
|
||||
dependencies:
|
||||
'@vitest/spy': 4.0.18
|
||||
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/pretty-format@4.0.17':
|
||||
dependencies:
|
||||
tinyrainbow: 3.0.3
|
||||
|
||||
'@vitest/pretty-format@4.0.18':
|
||||
dependencies:
|
||||
tinyrainbow: 3.0.3
|
||||
|
||||
'@vitest/runner@4.0.17':
|
||||
dependencies:
|
||||
'@vitest/utils': 4.0.17
|
||||
pathe: 2.0.3
|
||||
|
||||
'@vitest/runner@4.0.18':
|
||||
dependencies:
|
||||
'@vitest/utils': 4.0.18
|
||||
pathe: 2.0.3
|
||||
|
||||
'@vitest/snapshot@4.0.17':
|
||||
dependencies:
|
||||
'@vitest/pretty-format': 4.0.17
|
||||
magic-string: 0.30.21
|
||||
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.18': {}
|
||||
|
||||
'@vitest/utils@4.0.17':
|
||||
dependencies:
|
||||
'@vitest/pretty-format': 4.0.17
|
||||
tinyrainbow: 3.0.3
|
||||
|
||||
'@vitest/utils@4.0.18':
|
||||
dependencies:
|
||||
'@vitest/pretty-format': 4.0.18
|
||||
tinyrainbow: 3.0.3
|
||||
|
||||
'@webgpu/types@0.1.69': {}
|
||||
|
||||
acorn-jsx@5.3.2(acorn@8.15.0):
|
||||
@@ -4090,16 +3759,12 @@ snapshots:
|
||||
json-schema-traverse: 0.4.1
|
||||
uri-js: 4.4.1
|
||||
|
||||
ansi-regex@5.0.1: {}
|
||||
|
||||
ansi-regex@6.2.2: {}
|
||||
|
||||
ansi-styles@4.3.0:
|
||||
dependencies:
|
||||
color-convert: 2.0.1
|
||||
|
||||
ansi-styles@5.2.0: {}
|
||||
|
||||
ansi-styles@6.2.3: {}
|
||||
|
||||
anymatch@3.1.3:
|
||||
@@ -4112,10 +3777,6 @@ snapshots:
|
||||
|
||||
argparse@2.0.1: {}
|
||||
|
||||
aria-query@5.3.0:
|
||||
dependencies:
|
||||
dequal: 2.0.3
|
||||
|
||||
aria-query@5.3.2: {}
|
||||
|
||||
assertion-error@2.0.1: {}
|
||||
@@ -4297,8 +3958,6 @@ snapshots:
|
||||
delayed-stream@1.0.0:
|
||||
optional: true
|
||||
|
||||
dequal@2.0.3: {}
|
||||
|
||||
detect-libc@2.1.2: {}
|
||||
|
||||
devalue@5.6.2: {}
|
||||
@@ -4308,8 +3967,6 @@ snapshots:
|
||||
diff@4.0.2:
|
||||
optional: true
|
||||
|
||||
dom-accessibility-api@0.5.16: {}
|
||||
|
||||
dom-serializer@2.0.0:
|
||||
dependencies:
|
||||
domelementtype: 2.3.0
|
||||
@@ -4594,9 +4251,6 @@ snapshots:
|
||||
mime-types: 2.1.35
|
||||
optional: true
|
||||
|
||||
fsevents@2.3.2:
|
||||
optional: true
|
||||
|
||||
fsevents@2.3.3:
|
||||
optional: true
|
||||
|
||||
@@ -4737,8 +4391,6 @@ snapshots:
|
||||
|
||||
jiti@2.6.1: {}
|
||||
|
||||
js-tokens@4.0.0: {}
|
||||
|
||||
js-yaml@4.1.1:
|
||||
dependencies:
|
||||
argparse: 2.0.1
|
||||
@@ -4878,8 +4530,6 @@ snapshots:
|
||||
lru-cache@10.4.3:
|
||||
optional: true
|
||||
|
||||
lz-string@1.5.0: {}
|
||||
|
||||
maath@0.10.8(@types/three@0.182.0)(three@0.182.0):
|
||||
dependencies:
|
||||
'@types/three': 0.182.0
|
||||
@@ -5017,26 +4667,12 @@ snapshots:
|
||||
pify@4.0.1:
|
||||
optional: true
|
||||
|
||||
pixelmatch@7.1.0:
|
||||
dependencies:
|
||||
pngjs: 7.0.0
|
||||
|
||||
pkg-types@1.3.1:
|
||||
dependencies:
|
||||
confbox: 0.1.8
|
||||
mlly: 1.8.0
|
||||
pathe: 2.0.3
|
||||
|
||||
playwright-core@1.58.1: {}
|
||||
|
||||
playwright@1.58.1:
|
||||
dependencies:
|
||||
playwright-core: 1.58.1
|
||||
optionalDependencies:
|
||||
fsevents: 2.3.2
|
||||
|
||||
pngjs@7.0.0: {}
|
||||
|
||||
postcss-load-config@3.1.4(postcss@8.5.6)(ts-node@10.9.2(@types/node@22.8.6)(typescript@5.9.3)):
|
||||
dependencies:
|
||||
lilconfig: 2.1.0
|
||||
@@ -5066,12 +4702,6 @@ snapshots:
|
||||
|
||||
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:
|
||||
optional: true
|
||||
|
||||
@@ -5084,8 +4714,6 @@ snapshots:
|
||||
|
||||
punycode@2.3.1: {}
|
||||
|
||||
react-is@17.0.2: {}
|
||||
|
||||
readdirp@3.6.0:
|
||||
dependencies:
|
||||
picomatch: 2.3.1
|
||||
@@ -5467,22 +5095,10 @@ snapshots:
|
||||
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-browser-svelte@2.0.2(svelte@5.46.4)(vitest@4.0.17):
|
||||
dependencies:
|
||||
'@testing-library/svelte-core': 1.0.0(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-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)(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:
|
||||
'@vitest/expect': 4.0.17
|
||||
'@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(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.17
|
||||
'@vitest/runner': 4.0.17
|
||||
'@vitest/snapshot': 4.0.17
|
||||
@@ -5503,46 +5119,6 @@ snapshots:
|
||||
why-is-node-running: 2.3.0
|
||||
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.17)
|
||||
jsdom: 25.0.1
|
||||
transitivePeerDependencies:
|
||||
- jiti
|
||||
- less
|
||||
- lightningcss
|
||||
- msw
|
||||
- sass
|
||||
- sass-embedded
|
||||
- stylus
|
||||
- sugarss
|
||||
- terser
|
||||
- tsx
|
||||
- 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):
|
||||
dependencies:
|
||||
'@vitest/expect': 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))
|
||||
'@vitest/pretty-format': 4.0.18
|
||||
'@vitest/runner': 4.0.18
|
||||
'@vitest/snapshot': 4.0.18
|
||||
'@vitest/spy': 4.0.18
|
||||
'@vitest/utils': 4.0.18
|
||||
es-module-lexer: 1.7.0
|
||||
expect-type: 1.3.0
|
||||
magic-string: 0.30.21
|
||||
obug: 2.1.1
|
||||
pathe: 2.0.3
|
||||
picomatch: 4.0.3
|
||||
std-env: 3.10.0
|
||||
tinybench: 2.9.0
|
||||
tinyexec: 1.0.2
|
||||
tinyglobby: 0.2.15
|
||||
tinyrainbow: 3.0.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)
|
||||
why-is-node-running: 2.3.0
|
||||
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
|
||||
transitivePeerDependencies:
|
||||
- jiti
|
||||
@@ -5562,6 +5138,8 @@ snapshots:
|
||||
xml-name-validator: 5.0.0
|
||||
optional: true
|
||||
|
||||
wabt@1.0.39: {}
|
||||
|
||||
webgl-sdf-generator@1.1.1: {}
|
||||
|
||||
webidl-conversions@7.0.0:
|
||||
@@ -5598,7 +5176,8 @@ snapshots:
|
||||
string-width: 7.2.0
|
||||
strip-ansi: 7.1.2
|
||||
|
||||
ws@8.19.0: {}
|
||||
ws@8.19.0:
|
||||
optional: true
|
||||
|
||||
xml-name-validator@5.0.0:
|
||||
optional: true
|
||||
|
||||
Reference in New Issue
Block a user