diff --git a/pkgs/clan-app/ui-2d/knip.json b/pkgs/clan-app/ui-2d/knip.json new file mode 100644 index 000000000..8701e0425 --- /dev/null +++ b/pkgs/clan-app/ui-2d/knip.json @@ -0,0 +1,9 @@ +{ + "ignore": [ + "gtk.webview.js", + "stylelint.config.js", + "util.ts", + "src/components/v2/**", + "api/**" + ] +} diff --git a/pkgs/clan-app/ui-2d/package.json b/pkgs/clan-app/ui-2d/package.json index 25ea99623..9850e1550 100644 --- a/pkgs/clan-app/ui-2d/package.json +++ b/pkgs/clan-app/ui-2d/package.json @@ -10,6 +10,7 @@ "convert-html": "node gtk.webview.js", "serve": "vite preview", "check": "tsc --noEmit --skipLibCheck && eslint ./src", + "knip": "knip", "test": "vitest run --project unit --typecheck", "storybook": "storybook", "storybook-build": "storybook build", @@ -43,6 +44,7 @@ "eslint-plugin-tailwindcss": "^3.17.0", "http-server": "^14.1.1", "jsdom": "^26.1.0", + "knip": "^5.61.2", "playwright": "~1.52.0", "postcss": "^8.4.38", "postcss-url": "^10.1.3", diff --git a/pkgs/clan-app/ui-2d/src/index.tsx b/pkgs/clan-app/ui-2d/src/index.tsx index 8cbedad85..664fac32b 100644 --- a/pkgs/clan-app/ui-2d/src/index.tsx +++ b/pkgs/clan-app/ui-2d/src/index.tsx @@ -23,7 +23,6 @@ import { ApiTester } from "./api_test"; import { IconVariant } from "./components/icon"; import { Components } from "./routes/components"; import { VarsPage } from "./routes/machines/install/vars-step"; -import { ThreePlayground } from "./three"; import { ClanProvider } from "./contexts/clan"; export const client = new QueryClient(); @@ -160,28 +159,12 @@ export const routes: AppRoute[] = [ path: "/internal-dev", label: "Internal (Only visible in dev mode)", children: [ - { - path: "/hosts", - label: "Local Hosts", - component: () => , - }, - { - path: "/3d", - label: "3D-Playground", - component: () => , - }, { path: "/api_testing", label: "api_testing", hidden: false, component: () => , }, - { - path: "/components", - label: "Components", - hidden: false, - component: () => , - }, ], }, ]; diff --git a/pkgs/clan-app/ui-2d/src/three.tsx b/pkgs/clan-app/ui-2d/src/three.tsx deleted file mode 100644 index a3b35adf9..000000000 --- a/pkgs/clan-app/ui-2d/src/three.tsx +++ /dev/null @@ -1,271 +0,0 @@ -import { createEffect, createSignal, onCleanup, onMount, Show } from "solid-js"; -import * as THREE from "three"; -import { Button } from "./components/Button/Button"; -import Icon from "./components/icon"; - -function addCubesSpiral({ - scene, - count, - gap, - selected, -}: { - scene: THREE.Scene; - count: number; - gap: number; - selected?: string; -}) { - const cubeSize = 1; - const baseSize = 1.4; - - const cubeGeometry = new THREE.BoxGeometry(cubeSize, cubeSize, cubeSize); - const baseGeometry = new THREE.BoxGeometry(baseSize, 0.05, baseSize); - - const cubeMaterial = new THREE.MeshStandardMaterial({ - color: 0xe0e0e0, - roughness: 0.6, - metalness: 0.1, - }); - - const baseMaterial = new THREE.MeshStandardMaterial({ - color: 0xffffff, - roughness: 0.8, - metalness: 0, - }); - - let placed = 0; - const visited = new Set(); - - let x = 0; - let z = 0; - - let dx = 1; - let dz = 0; - - let segmentLength = 1; - let segmentPassed = 0; - let stepsTaken = 0; - let turnCounter = 0; - - while (placed < count) { - const key = `${x},${z}`; - if (!visited.has(key)) { - if ((x + z) % 2 === 0) { - // Place base - const base = new THREE.Mesh(baseGeometry, baseMaterial); - base.position.set(x * gap, 0, z * gap); - base.receiveShadow = true; - base.castShadow = true; - scene.add(base); - - // Place cube - const cube = new THREE.Mesh(cubeGeometry, cubeMaterial); - if (selected && +selected === placed) { - console.log("Selected", placed); - cube.material = new THREE.MeshStandardMaterial({ - color: 0x99e0ff, - roughness: 0.6, - metalness: 0.1, - }); - base.material = new THREE.MeshStandardMaterial({ - color: 0x99e0ff, - roughness: 0.6, - metalness: 0.1, - }); - } - // Store - cube.userData = { id: placed }; - - cube.position.set(x * gap, 0.55, z * gap); - cube.castShadow = true; - scene.add(cube); - - placed++; - } - visited.add(key); - } - - x += dx; - z += dz; - segmentPassed++; - stepsTaken++; - - if (segmentPassed === segmentLength) { - segmentPassed = 0; - - // Turn right: [1,0] → [0,1] → [-1,0] → [0,-1] - const temp = dx; - dx = -dz; - dz = temp; - - turnCounter++; - if (turnCounter % 2 === 0) { - segmentLength++; - } - } - - // Fail-safe to prevent infinite loops - if (stepsTaken > count * 20) break; - } - - // Clean up geometry - cubeGeometry.dispose(); - baseGeometry.dispose(); -} - -interface ViewProps { - count: number; - onCubeClick: (id: number) => void; - selected?: string; -} -const View = (props: ViewProps) => { - let container: HTMLDivElement | undefined; - - onMount(() => { - const scene = new THREE.Scene(); - - const camera = new THREE.PerspectiveCamera( - 75, - container!.clientWidth / container!.clientHeight, - 0.1, - 1000, - ); - - // Transparent renderer - const renderer = new THREE.WebGLRenderer({ antialias: true, alpha: true }); - renderer.setSize(container!.clientWidth, container!.clientHeight); - renderer.setClearColor(0x000000, 0); // Transparent background - renderer.shadowMap.enabled = true; - renderer.shadowMap.type = THREE.PCFSoftShadowMap; - container!.appendChild(renderer.domElement); - - // Cube (casts shadow) - const cubeGeometry = new THREE.BoxGeometry(); - const cubeMaterial = new THREE.MeshStandardMaterial({ - color: 0xb0c0c2, - roughness: 0.4, - metalness: 0.1, - }); - - const cube = new THREE.Mesh(cubeGeometry, cubeMaterial); - cube.castShadow = true; - cube.position.y = 1; - // scene.add(cube); - addCubesSpiral({ - scene, - count: props.count, - gap: 1.5, - selected: props.selected, - }); - - const factor = Math.log10(props.count) / 10 + 1; - camera.position.set(5 * factor, 6 * factor, 5 * factor); // from above and to the side - camera.lookAt(0, 0, 0); - - // Floor (receives shadow) - const floorGeometry = new THREE.PlaneGeometry(100, 100); - const floorMaterial = new THREE.ShadowMaterial({ opacity: 0.1 }); - const floor = new THREE.Mesh(floorGeometry, floorMaterial); - floor.rotation.x = -Math.PI / 2; - floor.position.y = -0.1; - floor.receiveShadow = true; - scene.add(floor); - - // Light (casts shadow) - const directionalLight = new THREE.DirectionalLight(0xffffff, 1); - directionalLight.position.set(-20, 30, 20); // above & behind the cube - directionalLight.castShadow = true; - directionalLight.shadow.mapSize.width = 2048; // higher res = smoother shadow - directionalLight.shadow.mapSize.height = 2048; - directionalLight.shadow.radius = 6; - // directionalLight.shadow.radius - - scene.add(directionalLight); - // Optional ambient light for slight scene illumination - scene.add(new THREE.AmbientLight(0xffffff, 0.2)); - - // Animate - // const animate = () => { - // animationId = requestAnimationFrame(animate); - // }; - - const raycaster = new THREE.Raycaster(); - const mouse = new THREE.Vector2(); - - const handleClick = (event: MouseEvent) => { - const rect = renderer.domElement.getBoundingClientRect(); - mouse.x = ((event.clientX - rect.left) / rect.width) * 2 - 1; - mouse.y = -((event.clientY - rect.top) / rect.height) * 2 + 1; - - raycaster.setFromCamera(mouse, camera); - const intersects = raycaster.intersectObjects(scene.children, true); - const cube = intersects.find((i) => i.object.userData?.id !== undefined); - - if (cube) { - props.onCubeClick(cube.object.userData.id); - } - }; - - renderer.domElement.addEventListener("click", handleClick); - - renderer.render(scene, camera); - // let animationId = requestAnimationFrame(animate); - - onCleanup(() => { - // cancelAnimationFrame(animationId); - renderer.dispose(); - cubeGeometry.dispose(); - cubeMaterial.dispose(); - floorGeometry.dispose(); - floorMaterial.dispose(); - container?.removeChild(renderer.domElement); - renderer.domElement.removeEventListener("click", handleClick); - }); - }); - - return ( -
- ); -}; - -export const ThreePlayground = () => { - const [count, setCount] = createSignal(1); - const [selected, setSelected] = createSignal(""); - - const onCubeClick = (id: number) => { - console.log(`Cube ${id} clicked`); - setSelected(`${id}`); - }; - - return ( -
- - - {(c) => ( - - )} - - -
-
- - - - -
-
-
- ); -}; diff --git a/pkgs/clan-app/ui-2d/vite.config.ts b/pkgs/clan-app/ui-2d/vite.config.ts index 61ab1c40e..c35ef512b 100644 --- a/pkgs/clan-app/ui-2d/vite.config.ts +++ b/pkgs/clan-app/ui-2d/vite.config.ts @@ -51,4 +51,4 @@ export default defineConfig({ // assetsDi manifest: true, }, -}); \ No newline at end of file +}); diff --git a/pkgs/clan-app/ui/package-lock.json b/pkgs/clan-app/ui/package-lock.json index e2447f821..9d37be13f 100644 --- a/pkgs/clan-app/ui/package-lock.json +++ b/pkgs/clan-app/ui/package-lock.json @@ -49,6 +49,7 @@ "eslint-plugin-tailwindcss": "^3.17.0", "http-server": "^14.1.1", "jsdom": "^26.1.0", + "knip": "^5.61.2", "playwright": "~1.52.0", "postcss": "^8.4.38", "postcss-url": "^10.1.3", @@ -738,6 +739,40 @@ "dev": true, "license": "Apache-2.0" }, + "node_modules/@emnapi/core": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.4.3.tgz", + "integrity": "sha512-4m62DuCE07lw01soJwPiBGC0nAww0Q+RY70VZ+n49yDIO13yyinhbWCeNnaob0lakDtWQzSdtNWzJeOJt2ma+g==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/wasi-threads": "1.0.2", + "tslib": "^2.4.0" + } + }, + "node_modules/@emnapi/runtime": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.4.3.tgz", + "integrity": "sha512-pBPWdu6MLKROBX05wSNKcNb++m5Er+KQ9QkB+WVM+pW2Kx9hoSrVTnu3BdkI5eBLZoKu/J6mW/B6i6bJB2ytXQ==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@emnapi/wasi-threads": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.0.2.tgz", + "integrity": "sha512-5n3nTJblwRi8LlXkJ9eBzu+kZR8Yxcc7ubakyQTFzPMtIhFpUBRbsnc2Dv88IZDIbCDlBiWrknhB4Lsz7mg6BA==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, "node_modules/@esbuild/aix-ppc64": { "version": "0.25.5", "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.5.tgz", @@ -1637,6 +1672,19 @@ "solid-js": "^1.3.1" } }, + "node_modules/@napi-rs/wasm-runtime": { + "version": "0.2.11", + "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-0.2.11.tgz", + "integrity": "sha512-9DPkXtvHydrcOsopiYpUgPHpmj0HWZKMUnL2dZqpvC42lsratuBG06V5ipyno0fUek5VlFsNQ+AcFATSrJXgMA==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/core": "^1.4.3", + "@emnapi/runtime": "^1.4.3", + "@tybys/wasm-util": "^0.9.0" + } + }, "node_modules/@nodelib/fs.scandir": { "version": "2.1.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", @@ -1679,6 +1727,191 @@ "dev": true, "license": "MIT" }, + "node_modules/@oxc-resolver/binding-darwin-arm64": { + "version": "11.2.0", + "resolved": "https://registry.npmjs.org/@oxc-resolver/binding-darwin-arm64/-/binding-darwin-arm64-11.2.0.tgz", + "integrity": "sha512-ruKLkS+Dm/YIJaUhzEB7zPI+jh3EXxu0QnNV8I7t9jf0lpD2VnltuyRbhrbJEkksklZj//xCMyFFsILGjiU2Mg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@oxc-resolver/binding-darwin-x64": { + "version": "11.2.0", + "resolved": "https://registry.npmjs.org/@oxc-resolver/binding-darwin-x64/-/binding-darwin-x64-11.2.0.tgz", + "integrity": "sha512-0zhgNUm5bYezdSFOg3FYhtVP83bAq7FTV/3suGQDl/43MixfQG7+bl+hlrP4mz6WlD2SUb2u9BomnJWl1uey9w==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@oxc-resolver/binding-freebsd-x64": { + "version": "11.2.0", + "resolved": "https://registry.npmjs.org/@oxc-resolver/binding-freebsd-x64/-/binding-freebsd-x64-11.2.0.tgz", + "integrity": "sha512-SHOxfCcZV1axeIGfyeD1BkdLvfQgjmPy18tO0OUXGElcdScxD6MqU5rj/AVtiuBT+51GtFfOKlwl1+BdVwhD1A==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@oxc-resolver/binding-linux-arm-gnueabihf": { + "version": "11.2.0", + "resolved": "https://registry.npmjs.org/@oxc-resolver/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-11.2.0.tgz", + "integrity": "sha512-mgEkYrJ+N90sgEDqEZ07zH+4I1D28WjqAhdzfW3aS2x2vynVpoY9jWfHuH8S62vZt3uATJrTKTRa8CjPWEsrdw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@oxc-resolver/binding-linux-arm64-gnu": { + "version": "11.2.0", + "resolved": "https://registry.npmjs.org/@oxc-resolver/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-11.2.0.tgz", + "integrity": "sha512-BhEzNLjn4HjP8+Q18D3/jeIDBxW7OgoJYIjw2CaaysnYneoTlij8hPTKxHfyqq4IGM3fFs9TLR/k338M3zkQ7g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@oxc-resolver/binding-linux-arm64-musl": { + "version": "11.2.0", + "resolved": "https://registry.npmjs.org/@oxc-resolver/binding-linux-arm64-musl/-/binding-linux-arm64-musl-11.2.0.tgz", + "integrity": "sha512-yxbMYUgRmN2V8x8XoxmD/Qq6aG7YIW3ToMDILfmcfeeRRVieEJ3DOWBT0JSE+YgrOy79OyFDH/1lO8VnqLmDQQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@oxc-resolver/binding-linux-riscv64-gnu": { + "version": "11.2.0", + "resolved": "https://registry.npmjs.org/@oxc-resolver/binding-linux-riscv64-gnu/-/binding-linux-riscv64-gnu-11.2.0.tgz", + "integrity": "sha512-QG1UfgC2N2qhW1tOnDCgB/26vn1RCshR5sYPhMeaxO1gMQ3kEKbZ3QyBXxrG1IX5qsXYj5hPDJLDYNYUjRcOpg==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@oxc-resolver/binding-linux-s390x-gnu": { + "version": "11.2.0", + "resolved": "https://registry.npmjs.org/@oxc-resolver/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-11.2.0.tgz", + "integrity": "sha512-uqTDsQdi6mrkSV1gvwbuT8jf/WFl6qVDVjNlx7IPSaAByrNiJfPrhTmH8b+Do58Dylz7QIRZgxQ8CHIZSyBUdg==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@oxc-resolver/binding-linux-x64-gnu": { + "version": "11.2.0", + "resolved": "https://registry.npmjs.org/@oxc-resolver/binding-linux-x64-gnu/-/binding-linux-x64-gnu-11.2.0.tgz", + "integrity": "sha512-GZdHXhJ7p6GaQg9MjRqLebwBf8BLvGIagccI6z5yMj4fV3LU4QuDfwSEERG+R6oQ/Su9672MBqWwncvKcKT68w==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@oxc-resolver/binding-linux-x64-musl": { + "version": "11.2.0", + "resolved": "https://registry.npmjs.org/@oxc-resolver/binding-linux-x64-musl/-/binding-linux-x64-musl-11.2.0.tgz", + "integrity": "sha512-YBAC3GOicYznReG2twE7oFPSeK9Z1f507z1EYWKg6HpGYRYRlJyszViu7PrhMT85r/MumDTs429zm+CNqpFWOA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@oxc-resolver/binding-wasm32-wasi": { + "version": "11.2.0", + "resolved": "https://registry.npmjs.org/@oxc-resolver/binding-wasm32-wasi/-/binding-wasm32-wasi-11.2.0.tgz", + "integrity": "sha512-+qlIg45CPVPy+Jn3vqU1zkxA/AAv6e/2Ax/ImX8usZa8Tr2JmQn/93bmSOOOnr9fXRV9d0n4JyqYzSWxWPYDEw==", + "cpu": [ + "wasm32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@napi-rs/wasm-runtime": "^0.2.11" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@oxc-resolver/binding-win32-arm64-msvc": { + "version": "11.2.0", + "resolved": "https://registry.npmjs.org/@oxc-resolver/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-11.2.0.tgz", + "integrity": "sha512-AI4KIpS8Zf6vwfOPk0uQPSC0pQ1m5HU4hCbtrgL21JgJSlnJaeEu3/aoOBB45AXKiExBU9R+CDR7aSnW7uhc5A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@oxc-resolver/binding-win32-x64-msvc": { + "version": "11.2.0", + "resolved": "https://registry.npmjs.org/@oxc-resolver/binding-win32-x64-msvc/-/binding-win32-x64-msvc-11.2.0.tgz", + "integrity": "sha512-r19cQc7HaEJ76HFsMsbiKMTIV2YqFGSof8H5hB7e5Jkb/23Y8Isv1YrSzkDaGhcw02I/COsrPo+eEmjy35eFuA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, "node_modules/@pkgjs/parseargs": { "version": "0.11.0", "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", @@ -2348,6 +2581,17 @@ "dev": true, "license": "MIT" }, + "node_modules/@tybys/wasm-util": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.9.0.tgz", + "integrity": "sha512-6+7nlbMVX/PVDCwaIQ8nTOPveOcFLSt8GcXdx8hD0bt39uWxYT88uXzqTd4fTvqta7oeUJqudepapKNt2DYJFw==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, "node_modules/@types/aria-query": { "version": "5.0.4", "resolved": "https://registry.npmjs.org/@types/aria-query/-/aria-query-5.0.4.tgz", @@ -4619,6 +4863,16 @@ "reusify": "^1.0.4" } }, + "node_modules/fd-package-json": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/fd-package-json/-/fd-package-json-2.0.0.tgz", + "integrity": "sha512-jKmm9YtsNXN789RS/0mSzOC1NUq9mkVd65vbSSVsKdjGvYXBuE4oWe2QOEoFeRmJg+lPuZxpmrfFclNhoRMneQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "walk-up-path": "^4.0.0" + } + }, "node_modules/fflate": { "version": "0.8.2", "resolved": "https://registry.npmjs.org/fflate/-/fflate-0.8.2.tgz", @@ -4739,6 +4993,22 @@ "node": ">= 6" } }, + "node_modules/formatly": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/formatly/-/formatly-0.2.4.tgz", + "integrity": "sha512-lIN7GpcvX/l/i24r/L9bnJ0I8Qn01qijWpQpDDvTLL29nKqSaJJu4h20+7VJ6m2CAhQ2/En/GbxDiHCzq/0MyA==", + "dev": true, + "license": "MIT", + "dependencies": { + "fd-package-json": "^2.0.0" + }, + "bin": { + "formatly": "bin/index.mjs" + }, + "engines": { + "node": ">=18.3.0" + } + }, "node_modules/fraction.js": { "version": "4.3.7", "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.3.7.tgz", @@ -5491,6 +5761,89 @@ "node": ">=6" } }, + "node_modules/knip": { + "version": "5.61.2", + "resolved": "https://registry.npmjs.org/knip/-/knip-5.61.2.tgz", + "integrity": "sha512-ZBv37zDvZj0/Xwk0e93xSjM3+5bjxgqJ0PH2GlB5tnWV0ktXtmatWLm+dLRUCT/vpO3SdGz2nNAfvVhuItUNcQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/webpro" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/knip" + }, + { + "type": "polar", + "url": "https://polar.sh/webpro-nl" + } + ], + "license": "ISC", + "dependencies": { + "@nodelib/fs.walk": "^1.2.3", + "fast-glob": "^3.3.3", + "formatly": "^0.2.4", + "jiti": "^2.4.2", + "js-yaml": "^4.1.0", + "minimist": "^1.2.8", + "oxc-resolver": "^11.1.0", + "picocolors": "^1.1.1", + "picomatch": "^4.0.1", + "smol-toml": "^1.3.4", + "strip-json-comments": "5.0.2", + "zod": "^3.22.4", + "zod-validation-error": "^3.0.3" + }, + "bin": { + "knip": "bin/knip.js", + "knip-bun": "bin/knip-bun.js" + }, + "engines": { + "node": ">=18.18.0" + }, + "peerDependencies": { + "@types/node": ">=18", + "typescript": ">=5.0.4" + } + }, + "node_modules/knip/node_modules/jiti": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-2.4.2.tgz", + "integrity": "sha512-rg9zJN+G4n2nfJl5MW3BMygZX56zKPNVEYYqq7adpmMh4Jn2QNEwhvQlFy6jPVdcod7txZtKHWnyZiA3a0zP7A==", + "dev": true, + "license": "MIT", + "bin": { + "jiti": "lib/jiti-cli.mjs" + } + }, + "node_modules/knip/node_modules/picomatch": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz", + "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/knip/node_modules/strip-json-comments": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-5.0.2.tgz", + "integrity": "sha512-4X2FR3UwhNUE9G49aIsJW5hRRR3GXGTBTZRMfv568O60ojM8HcWjV/VxAxCDW3SUND33O6ZY66ZuRcdkj73q2g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/levn": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", @@ -6505,6 +6858,31 @@ "node": ">= 0.8.0" } }, + "node_modules/oxc-resolver": { + "version": "11.2.0", + "resolved": "https://registry.npmjs.org/oxc-resolver/-/oxc-resolver-11.2.0.tgz", + "integrity": "sha512-3iJYyIdDZMDoj0ZSVBrI1gUvPBMkDC4gxonBG+7uqUyK5EslG0mCwnf6qhxK8oEU7jLHjbRBNyzflPSd3uvH7Q==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/Boshen" + }, + "optionalDependencies": { + "@oxc-resolver/binding-darwin-arm64": "11.2.0", + "@oxc-resolver/binding-darwin-x64": "11.2.0", + "@oxc-resolver/binding-freebsd-x64": "11.2.0", + "@oxc-resolver/binding-linux-arm-gnueabihf": "11.2.0", + "@oxc-resolver/binding-linux-arm64-gnu": "11.2.0", + "@oxc-resolver/binding-linux-arm64-musl": "11.2.0", + "@oxc-resolver/binding-linux-riscv64-gnu": "11.2.0", + "@oxc-resolver/binding-linux-s390x-gnu": "11.2.0", + "@oxc-resolver/binding-linux-x64-gnu": "11.2.0", + "@oxc-resolver/binding-linux-x64-musl": "11.2.0", + "@oxc-resolver/binding-wasm32-wasi": "11.2.0", + "@oxc-resolver/binding-win32-arm64-msvc": "11.2.0", + "@oxc-resolver/binding-win32-x64-msvc": "11.2.0" + } + }, "node_modules/p-limit": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", @@ -7549,6 +7927,19 @@ "dev": true, "license": "MIT" }, + "node_modules/smol-toml": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/smol-toml/-/smol-toml-1.3.4.tgz", + "integrity": "sha512-UOPtVuYkzYGee0Bd2Szz8d2G3RfMfJ2t3qVdZUAozZyAk+a0Sxa+QKix0YCwjL/A1RR0ar44nCxaoN9FxdJGwA==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">= 18" + }, + "funding": { + "url": "https://github.com/sponsors/cyyynthia" + } + }, "node_modules/solid-devtools": { "version": "0.34.2", "resolved": "https://registry.npmjs.org/solid-devtools/-/solid-devtools-0.34.2.tgz", @@ -9005,6 +9396,16 @@ "node": ">=12.0.0" } }, + "node_modules/walk-up-path": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/walk-up-path/-/walk-up-path-4.0.0.tgz", + "integrity": "sha512-3hu+tD8YzSLGuFYtPRb48vdhKMi0KQV5sn+uWr8+7dMEq/2G/dtLrdDinkLjqq5TIbIBjYJ4Ax/n3YiaW7QM8A==", + "dev": true, + "license": "ISC", + "engines": { + "node": "20 || >=22" + } + }, "node_modules/webidl-conversions": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz", @@ -9332,6 +9733,29 @@ "funding": { "url": "https://github.com/sponsors/sindresorhus" } + }, + "node_modules/zod": { + "version": "3.25.67", + "resolved": "https://registry.npmjs.org/zod/-/zod-3.25.67.tgz", + "integrity": "sha512-idA2YXwpCdqUSKRCACDE6ItZD9TZzy3OZMtpfLoh6oPR47lipysRrJfjzMqFxQ3uJuUPyUeWe1r9vLH33xO/Qw==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/colinhacks" + } + }, + "node_modules/zod-validation-error": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/zod-validation-error/-/zod-validation-error-3.5.2.tgz", + "integrity": "sha512-mdi7YOLtram5dzJ5aDtm1AG9+mxRma1iaMrZdYIpFO7epdKBUwLHIxTF8CPDeCQ828zAXYtizrKlEJAtzgfgrw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18.0.0" + }, + "peerDependencies": { + "zod": "^3.25.0" + } } } }