diff --git a/apps/fixtures/image/README.md b/apps/fixtures/image/README.md new file mode 100644 index 000000000..19b44a7a1 --- /dev/null +++ b/apps/fixtures/image/README.md @@ -0,0 +1,30 @@ +# SolidStart Image Fixture + +Fixture app for exercising the `@solidjs/image` component and Vite plugin. + +## Creating a project + +```bash +# create a new project in the current directory +npm init solid@latest + +# create a new project in my-app +npm init solid@latest my-app +``` + +## Developing + +Once you've created a project and installed dependencies with `npm install` (or `pnpm install` or `yarn`), start a development server: + +```bash +npm run dev + +# or start the server and open the app in a new browser tab +npm run dev -- --open +``` + +## Building + +Solid apps are built with _presets_, which optimise your project for deployment to different environments. + +By default, `npm run build` will generate a Node app that you can run with `npm start`. To use a different preset, add it to the `devDependencies` in `package.json` and specify in your `app.config.js`. diff --git a/apps/fixtures/image/package.json b/apps/fixtures/image/package.json new file mode 100644 index 000000000..ba1dcbe85 --- /dev/null +++ b/apps/fixtures/image/package.json @@ -0,0 +1,20 @@ +{ + "name": "fixture-image", + "type": "module", + "private": true, + "scripts": { + "dev": "vite dev", + "build": "vite build" + }, + "dependencies": { + "@solidjs/image": "workspace:*", + "@solidjs/meta": "^0.29.4", + "@solidjs/router": "^0.15.0", + "@solidjs/start": "workspace:*", + "solid-js": "^1.9.9", + "vite": "7.1.10" + }, + "engines": { + "node": ">=22" + } +} diff --git a/apps/fixtures/image/public/favicon.ico b/apps/fixtures/image/public/favicon.ico new file mode 100644 index 000000000..fb282da07 Binary files /dev/null and b/apps/fixtures/image/public/favicon.ico differ diff --git a/apps/fixtures/image/src/app.css b/apps/fixtures/image/src/app.css new file mode 100644 index 000000000..8596998a4 --- /dev/null +++ b/apps/fixtures/image/src/app.css @@ -0,0 +1,39 @@ +body { + font-family: Gordita, Roboto, Oxygen, Ubuntu, Cantarell, "Open Sans", "Helvetica Neue", sans-serif; +} + +a { + margin-right: 1rem; +} + +main { + text-align: center; + padding: 1em; + margin: 0 auto; +} + +h1 { + color: #335d92; + text-transform: uppercase; + font-size: 4rem; + font-weight: 100; + line-height: 1.1; + margin: 4rem auto; + max-width: 14rem; +} + +p { + max-width: 14rem; + margin: 2rem auto; + line-height: 1.35; +} + +@media (min-width: 480px) { + h1 { + max-width: none; + } + + p { + max-width: none; + } +} diff --git a/apps/fixtures/image/src/app.tsx b/apps/fixtures/image/src/app.tsx new file mode 100644 index 000000000..d1359c8d8 --- /dev/null +++ b/apps/fixtures/image/src/app.tsx @@ -0,0 +1,22 @@ +import { MetaProvider, Title } from "@solidjs/meta"; +import { Router } from "@solidjs/router"; +import { FileRoutes } from "@solidjs/start/router"; +import { Suspense } from "solid-js"; +import "./app.css"; + +export default function App() { + return ( + ( + + SolidStart - Basic + Index + About + {props.children} + + )} + > + + + ); +} diff --git a/apps/fixtures/image/src/entry-client.tsx b/apps/fixtures/image/src/entry-client.tsx new file mode 100644 index 000000000..0ca4e3c30 --- /dev/null +++ b/apps/fixtures/image/src/entry-client.tsx @@ -0,0 +1,4 @@ +// @refresh reload +import { mount, StartClient } from "@solidjs/start/client"; + +mount(() => , document.getElementById("app")!); diff --git a/apps/fixtures/image/src/entry-server.tsx b/apps/fixtures/image/src/entry-server.tsx new file mode 100644 index 000000000..401eff83f --- /dev/null +++ b/apps/fixtures/image/src/entry-server.tsx @@ -0,0 +1,21 @@ +// @refresh reload +import { createHandler, StartServer } from "@solidjs/start/server"; + +export default createHandler(() => ( + ( + + + + + + {assets} + + +
{children}
+ {scripts} + + + )} + /> +)); diff --git a/apps/fixtures/image/src/images/example.jpg b/apps/fixtures/image/src/images/example.jpg new file mode 100644 index 000000000..229e7980c Binary files /dev/null and b/apps/fixtures/image/src/images/example.jpg differ diff --git a/apps/fixtures/image/src/routes/[...404].tsx b/apps/fixtures/image/src/routes/[...404].tsx new file mode 100644 index 000000000..4ea71ec7f --- /dev/null +++ b/apps/fixtures/image/src/routes/[...404].tsx @@ -0,0 +1,19 @@ +import { Title } from "@solidjs/meta"; +import { HttpStatusCode } from "@solidjs/start"; + +export default function NotFound() { + return ( +
+ Not Found + +

Page Not Found

+

+ Visit{" "} + + start.solidjs.com + {" "} + to learn how to build SolidStart apps. +

+
+ ); +} diff --git a/apps/fixtures/image/src/routes/index.tsx b/apps/fixtures/image/src/routes/index.tsx new file mode 100644 index 000000000..aabfb3037 --- /dev/null +++ b/apps/fixtures/image/src/routes/index.tsx @@ -0,0 +1,39 @@ +import { Image } from "@solidjs/image"; +import { Title } from "@solidjs/meta"; +import { type JSX, onMount, Show } from "solid-js"; +import imageData from "../images/example.jpg?image"; + +interface PlaceholderProps { + show: () => void; +} + +function Placeholder(props: PlaceholderProps): JSX.Element { + onMount(() => { + props.show(); + }); + + return
LOADING...
; +} + +export default function Home() { + return ( +
+ Image Fixture +

Image fixture

+

+ This fixture exercises the local image pipeline and the Start image component. +

+
+ Example ( + + + + )} + /> +
+
+ ); +} diff --git a/apps/fixtures/image/src/types.d.ts b/apps/fixtures/image/src/types.d.ts new file mode 100644 index 000000000..6a24a4983 --- /dev/null +++ b/apps/fixtures/image/src/types.d.ts @@ -0,0 +1,63 @@ +/// + + +/** + * @warning do not copy this pattern in your apps + * + * duplicating types from @solidjs/image/env + * because we can't consume it within the monorepo due to the relative import + * in env.d.ts + */ +type StartImageMIME = + | "image/avif" + | "image/jpeg" + | "image/png" + | "image/webp" + | "image/tiff"; + +interface StartImageVariant { + path: string; + width: number; + type: StartImageMIME; +} + +interface StartImageSource { + source: string; + width: number; + height: number; + options: T; +} + +interface StartImageTransformer { + transform: (source: StartImageSource) => StartImageVariant | StartImageVariant[]; +} + +declare module "*.jpg?image" { + const props: { source: StartImageSource; transformer?: StartImageTransformer }; + export default props; +} + +declare module "*.png?image" { + const props: { source: StartImageSource; transformer?: StartImageTransformer }; + export default props; +} + +declare module "*.jpeg?image" { + const props: { source: StartImageSource; transformer?: StartImageTransformer }; + export default props; +} + +declare module "*.webp?image" { + const props: { source: StartImageSource; transformer?: StartImageTransformer }; + export default props; +} + +declare module "*.gif?image" { + const props: { source: StartImageSource; transformer?: StartImageTransformer }; + export default props; +} + +declare module "*.svg?image" { + const props: { source: StartImageSource; transformer?: StartImageTransformer }; + export default props; +} diff --git a/apps/fixtures/image/tsconfig.json b/apps/fixtures/image/tsconfig.json new file mode 100644 index 000000000..bf970f693 --- /dev/null +++ b/apps/fixtures/image/tsconfig.json @@ -0,0 +1,19 @@ +{ + "compilerOptions": { + "target": "ESNext", + "module": "ESNext", + "moduleResolution": "bundler", + "allowSyntheticDefaultImports": true, + "esModuleInterop": true, + "jsx": "preserve", + "jsxImportSource": "solid-js", + "allowJs": true, + "strict": true, + "noEmit": true, + "isolatedModules": true, + "paths": { + "~/*": ["./src/*"], + }, + }, + "include": ["src/**/*", "../../packages/image/env.d.ts", "../../packages/start/env.d.ts"] +} diff --git a/apps/fixtures/image/vite.config.ts b/apps/fixtures/image/vite.config.ts new file mode 100644 index 000000000..514551409 --- /dev/null +++ b/apps/fixtures/image/vite.config.ts @@ -0,0 +1,61 @@ +import path from "node:path" +import { fileURLToPath } from "node:url" +import { defineConfig } from "vite"; +import { imagePlugin } from "@solidjs/image/vite"; +import { solidStart } from "../../../packages/start/src/config/index.js"; +import { nitroV2Plugin } from "../../../packages/start-nitro-v2-vite-plugin/src"; + +const __dirname = path.dirname(fileURLToPath(import.meta.url)); + +export default defineConfig({ + plugins: [ + imagePlugin({ + local: { + sizes: [480, 600], + quality: 80, + output: ["avif"], + publicPath: "public", + }, + remote: { + transformURL(url) { + return { + src: { + source: `https://picsum.photos/seed/${url}/1200/900.webp`, + width: 1080, + height: 760, + }, + variants: [ + { + path: `https://picsum.photos/seed/${url}/800/600.jpg`, + width: 800, + type: "image/jpeg", + }, + { + path: `https://picsum.photos/seed/${url}/400/300.jpg`, + width: 400, + type: "image/jpeg", + }, + { + path: `https://picsum.photos/seed/${url}/800/600.png`, + width: 800, + type: "image/png", + }, + { + path: `https://picsum.photos/seed/${url}/400/300.png`, + width: 400, + type: "image/png", + }, + ], + }; + }, + }, + }), + solidStart(), + nitroV2Plugin(), + ], + // resolve: { + // alias: { + // "@solidjs/image": path.resolve(__dirname, "../../../packages/image/dist/index.js"), + // } + // } +}); diff --git a/apps/tests/package.json b/apps/tests/package.json index 97483d6b5..5e309eef2 100644 --- a/apps/tests/package.json +++ b/apps/tests/package.json @@ -16,6 +16,7 @@ "dependencies": { "@solidjs/meta": "^0.29.4", "@solidjs/router": "^0.15.3", + "@solidjs/image": "workspace:*", "@solidjs/start": "workspace:*", "@solidjs/testing-library": "^0.8.10", "@testing-library/jest-dom": "^6.6.2", diff --git a/apps/tests/src/routes/image-local.tsx b/apps/tests/src/routes/image-local.tsx index be4865347..5a5c9e55b 100644 --- a/apps/tests/src/routes/image-local.tsx +++ b/apps/tests/src/routes/image-local.tsx @@ -1,4 +1,4 @@ -import { StartImage as Image } from "@solidjs/start/image"; +import { Image } from "@solidjs/image"; import { type JSX, onMount, Show } from "solid-js"; import exampleImage from "../images/example.jpg?image"; @@ -20,7 +20,7 @@ export default function App(): JSX.Element { example ( + fallback={(visible: () => boolean, show: () => void) => ( diff --git a/apps/tests/src/routes/image-remote.tsx b/apps/tests/src/routes/image-remote.tsx index 524023c10..abbbc4e8b 100644 --- a/apps/tests/src/routes/image-remote.tsx +++ b/apps/tests/src/routes/image-remote.tsx @@ -1,4 +1,4 @@ -import { StartImage as Image } from "@solidjs/start/image"; +import { Image } from "@solidjs/image"; import { type JSX, onMount, Show } from "solid-js"; // local // import exampleImage from './example.jpg?image'; @@ -24,7 +24,7 @@ export default function App(): JSX.Element { example ( + fallback={(visible: () => boolean, show: () => void) => ( diff --git a/apps/tests/src/types.d.ts b/apps/tests/src/types.d.ts new file mode 100644 index 000000000..2c0931671 --- /dev/null +++ b/apps/tests/src/types.d.ts @@ -0,0 +1,61 @@ +/// + +type StartImageMIME = + | "image/avif" + | "image/jpeg" + | "image/png" + | "image/webp" + | "image/tiff"; + +interface StartImageVariant { + path: string; + width: number; + type: StartImageMIME; +} + +interface StartImageSource { + source: string; + width: number; + height: number; + options: T; +} + +interface StartImageTransformer { + transform: (source: StartImageSource) => StartImageVariant | StartImageVariant[]; +} + +interface ImagePropsWithTransformer { + src: StartImageSource; + alt: string; + transformer?: StartImageTransformer; +} + +declare module "*.jpg?image" { + const props: { src: ImagePropsWithTransformer["src"]; transformer?: ImagePropsWithTransformer["transformer"] }; + export default props; +} + +declare module "*.png?image" { + const props: { src: ImagePropsWithTransformer["src"]; transformer?: ImagePropsWithTransformer["transformer"] }; + export default props; +} + +declare module "*.jpeg?image" { + const props: { src: ImagePropsWithTransformer["src"]; transformer?: ImagePropsWithTransformer["transformer"] }; + export default props; +} + +declare module "*.webp?image" { + const props: { src: ImagePropsWithTransformer["src"]; transformer?: ImagePropsWithTransformer["transformer"] }; + export default props; +} + +declare module "*.gif?image" { + const props: { src: ImagePropsWithTransformer["src"]; transformer?: ImagePropsWithTransformer["transformer"] }; + export default props; +} + +declare module "*.svg?image" { + const props: { src: ImagePropsWithTransformer["src"]; transformer?: ImagePropsWithTransformer["transformer"] }; + export default props; +} diff --git a/apps/tests/tsconfig.json b/apps/tests/tsconfig.json index 376a974e4..eb0231ea7 100644 --- a/apps/tests/tsconfig.json +++ b/apps/tests/tsconfig.json @@ -10,10 +10,11 @@ "allowJs": true, "strict": true, "noEmit": true, - "types": ["vitest/globals", "@testing-library/jest-dom", "@solidjs/start/env"], + "types": ["vitest/globals", "@testing-library/jest-dom", "@solidjs/start/env", "@solidjs/image/env"], "isolatedModules": true, "paths": { "~/*": ["./src/*"], }, }, + "include": ["src/**/*"] } diff --git a/apps/tests/vite.config.ts b/apps/tests/vite.config.ts index 76d17c627..166da5dd8 100644 --- a/apps/tests/vite.config.ts +++ b/apps/tests/vite.config.ts @@ -1,4 +1,5 @@ import { defineConfig } from "vite"; +import { imagePlugin } from "../../packages/image/src/vite"; import { nitroV2Plugin } from "../../packages/start-nitro-v2-vite-plugin/src"; import { solidStart } from "../../packages/start/src/config"; @@ -7,45 +8,44 @@ export default defineConfig({ port: 3000, }, plugins: [ - solidStart({ - image: { - local: { - sizes: [480, 600], - quality: 80, - publicPath: "public", - }, - remote: { - transformURL(url) { - return { - src: { - source: `https://picsum.photos/seed/${url}/1200/900.webp`, - width: 1080, - height: 760, + solidStart(), + imagePlugin({ + local: { + sizes: [480, 600], + quality: 80, + publicPath: "public", + }, + remote: { + transformURL(url) { + return { + src: { + source: `https://picsum.photos/seed/${url}/1200/900.webp`, + width: 1080, + height: 760, + }, + variants: [ + { + path: `https://picsum.photos/seed/${url}/800/600.jpg`, + width: 800, + type: "image/jpeg", + }, + { + path: `https://picsum.photos/seed/${url}/400/300.jpg`, + width: 400, + type: "image/jpeg", + }, + { + path: `https://picsum.photos/seed/${url}/800/600.png`, + width: 800, + type: "image/png", + }, + { + path: `https://picsum.photos/seed/${url}/400/300.png`, + width: 400, + type: "image/png", }, - variants: [ - { - path: `https://picsum.photos/seed/${url}/800/600.jpg`, - width: 800, - type: "image/jpeg", - }, - { - path: `https://picsum.photos/seed/${url}/400/300.jpg`, - width: 400, - type: "image/jpeg", - }, - { - path: `https://picsum.photos/seed/${url}/800/600.png`, - width: 800, - type: "image/png", - }, - { - path: `https://picsum.photos/seed/${url}/400/300.png`, - width: 400, - type: "image/png", - }, - ], - }; - }, + ], + }; }, }, }), diff --git a/packages/image/README.md b/packages/image/README.md new file mode 100644 index 000000000..e02e8b6a2 --- /dev/null +++ b/packages/image/README.md @@ -0,0 +1,192 @@ +# @solidjs/image + +Image component and Vite plugin for Solid apps. Provides an `Image` component, a build-time Vite plugin for local and remote image sources, and opt-in TypeScript module declarations. + +## Install + +```bash +pnpm add @solidjs/image +``` + +## Quick Start + +1) Add the Vite plugin + +```ts +// vite.config.ts +import { defineConfig } from "vite"; +import { imagePlugin } from "@solidjs/image/vite"; + +export default defineConfig({ + plugins: [ + imagePlugin({ + local: { + sizes: [480, 800, 1200], + quality: 80, + publicPath: "public", + }, + remote: { + transformURL(url) { + return { + src: { + source: `https://picsum.photos/seed/${url}/1200/900.webp`, + width: 1200, + height: 900, + }, + variants: [ + { path: `https://picsum.photos/seed/${url}/800/600.jpg`, width: 800, type: "image/jpeg" }, + { path: `https://picsum.photos/seed/${url}/400/300.jpg`, width: 400, type: "image/jpeg" }, + ], + }; + }, + }, + }), + ], +}); +``` + +2) Opt in to module declarations + +```json +// tsconfig.json +{ + "compilerOptions": { + "types": ["@solidjs/image/env"] + } +} +``` + +3) Use the component + +```tsx +import { Image } from "@solidjs/image"; +import exampleImage from "./images/example.jpg?image"; + +export default function Example() { + return ( + Example ( + visible() ?
Loading...
: null + )} + /> + ); +} +``` + +## Local Images + +Use the `?image` query to generate responsive variants at build time: + +```tsx +import hero from "./hero.jpg?image"; + +Hero visible() &&
} /> +``` + +Configuration options (local): + +```ts +imagePlugin({ + local: { + sizes: [480, 800, 1200], + input: ["jpeg", "png", "webp"], + output: ["jpeg", "webp"], + quality: 80, + publicPath: "public", + }, +}); +``` + +## Remote Images + +Use the `image:` protocol with a `transformURL` handler: + +```tsx +import avatar from "image:users/123"; + +User visible() &&
} /> +``` + +```ts +imagePlugin({ + remote: { + transformURL(url) { + return { + src: { + source: `https://cdn.example.com/${url}.webp`, + width: 600, + height: 600, + }, + variants: [ + { path: `https://cdn.example.com/${url}.webp`, width: 600, type: "image/webp" }, + { path: `https://cdn.example.com/${url}.jpg`, width: 600, type: "image/jpeg" }, + ], + }; + }, + }, +}); +``` + +## Notes + +- The Vite plugin is **not** automatically registered in SolidStart. Add it explicitly in user land. +- The module declarations are opt-in via `@solidjs/image/env`. +- The plugin uses `sharp` to generate local variants (Node runtime only). + +## SolidStart + +Register the Vite plugin in your app config: + +```ts +// app.config.ts +import { defineConfig } from "@solidjs/start/config"; +import { imagePlugin } from "@solidjs/image/vite"; + +export default defineConfig({ + vite: { + plugins: [imagePlugin()], + }, +}); +``` + +## API + +### `Image` + +```ts +interface ImageProps { + src: { source: string; width: number; height: number }; + alt: string; + transformer?: { transform: () => StartImageVariant | StartImageVariant[] }; + onLoad?: () => void; + fallback: (visible: () => boolean, onLoad: () => void) => JSX.Element; + crossOrigin?: JSX.HTMLCrossorigin; + fetchPriority?: "high" | "low" | "auto"; + decoding?: "sync" | "async" | "auto"; +} +``` + +### `imagePlugin` + +```ts +interface StartImageOptions { + local?: { + sizes: number[]; + input?: ("png" | "jpeg" | "webp" | "avif")[]; + output?: ("png" | "jpeg" | "webp" | "avif")[]; + quality: number; + publicPath?: string; + }; + remote?: { + transformURL(url: string): Promise<{ + src: { source: string; width: number; height: number }; + variants: StartImageVariant | StartImageVariant[]; + }> | { + src: { source: string; width: number; height: number }; + variants: StartImageVariant | StartImageVariant[]; + }; + }; +} +``` diff --git a/packages/image/env.d.ts b/packages/image/env.d.ts new file mode 100644 index 000000000..aeaca8126 --- /dev/null +++ b/packages/image/env.d.ts @@ -0,0 +1,33 @@ +/// + +import type { StartImageProps } from "./dist/index"; + +declare module "*.jpg?image" { + const props: StartImageProps["src"]; + export default props; +} + +declare module "*.png?image" { + const props: StartImageProps["src"]; + export default props; +} + +declare module "*.jpeg?image" { + const props: StartImageProps["src"]; + export default props; +} + +declare module "*.webp?image" { + const props: StartImageProps["src"]; + export default props; +} + +declare module "*.gif?image" { + const props: StartImageProps["src"]; + export default props; +} + +declare module "*.svg?image" { + const props: StartImageProps["src"]; + export default props; +} diff --git a/packages/image/package.json b/packages/image/package.json new file mode 100644 index 000000000..98377d933 --- /dev/null +++ b/packages/image/package.json @@ -0,0 +1,63 @@ +{ + "name": "@solidjs/image", + "version": "0.1.0", + "type": "module", + "types": "./env.d.ts", + "scripts": { + "build": "tsdown && cp src/styles.css dist/styles.css", + "dev": "tsdown --watch", + "typecheck": "tsc --noEmit -p tsconfig.build.json", + "test": "vitest run", + "typecheck:dist": "pnpm build && pnpx @arethetypeswrong/cli --pack . --profile esm-only" + }, + "files": [ + "dist", + "env.d.ts", + "package.json", + "README.md" + ], + "exports": { + ".": { + "types": "./dist/index.d.ts", + "solid": "./dist/index.jsx", + "default": "./dist/index.jsx" + }, + "./vite": { + "types": "./dist/vite.d.ts", + "default": "./dist/vite.js" + }, + "./env": "./env.d.ts" + }, + "publishConfig": { + "access": "public", + "exports": { + ".": { + "types": "./dist/index.d.ts", + "solid": "./dist/index.jsx", + "default": "./dist/index.jsx" + }, + "./vite": { + "types": "./dist/vite.d.ts", + "default": "./dist/vite.js" + }, + "./env": "./env.d.ts" + } + }, + "dependencies": { + "sharp": "^0.34.5" + }, + "devDependencies": { + "solid-js": "^1.9.9", + "tsdown": "^0.9.0", + "vite": "^7.1.10", + "vite-plugin-solid": "^2.11.9", + "vitest": "^4.0.10" + }, + "peerDependencies": { + "solid-js": "^1.9.9", + "vite": "^7" + }, + "engines": { + "node": ">=22" + } +} diff --git a/packages/start/src/image/index.tsx b/packages/image/src/Image.tsx similarity index 86% rename from packages/start/src/image/index.tsx rename to packages/image/src/Image.tsx index 064e06faa..f341ca25e 100644 --- a/packages/start/src/image/index.tsx +++ b/packages/image/src/Image.tsx @@ -13,9 +13,11 @@ import { getAspectRatioBoxStyle } from "./utils.ts"; import "./styles.css"; export interface StartImageProps { - src: StartImageSource; + src: { + source: StartImageSource; + transformer?: StartImageTransformer; + } alt: string; - transformer?: StartImageTransformer; onLoad?: () => void; fallback: (visible: () => boolean, onLoad: () => void) => JSX.Element; @@ -47,7 +49,7 @@ function StartImageSources(props: StartImageSourcesProps): JSX.Element { ); } -export function StartImage(props: StartImageProps): JSX.Element { +export function Image(props: StartImageProps): JSX.Element { const [showPlaceholder, setShowPlaceholder] = createSignal(true); const laze = createLazyRender(); const [defer, setDefer] = createSignal(true); @@ -56,8 +58,8 @@ export function StartImage(props: StartImageProps): JSX.Element { setDefer(false); } - const width = createMemo(() => props.src.width); - const height = createMemo(() => props.src.height); + const width = createMemo(() => props.src.source.width); + const height = createMemo(() => props.src.source.height); return (
@@ -69,8 +71,8 @@ export function StartImage(props: StartImageProps): JSX.Element { })} > - }> - {cb => } + }> + {cb => } (props: StartImageProps): JSX.Element { {props.alt} { if (!defer()) { diff --git a/packages/image/src/__tests__/components.test.tsx b/packages/image/src/__tests__/components.test.tsx new file mode 100644 index 000000000..175e496df --- /dev/null +++ b/packages/image/src/__tests__/components.test.tsx @@ -0,0 +1,118 @@ +import { describe, it, expect } from "vitest"; +import { createRoot } from "solid-js"; +import { renderToString } from "solid-js/web"; +import { createLazyRender } from "../create-lazy-render"; +import { createClientSignal, ClientOnly } from "../client-only"; +import { StartImage } from "../Image"; + +// --------------------------------------------------------------------------- +// createLazyRender +// --------------------------------------------------------------------------- +describe("createLazyRender", () => { + it("starts with visible = false", () => { + let visible: boolean | undefined; + + createRoot(dispose => { + const laze = createLazyRender(); + visible = laze.visible; + dispose(); + }); + + expect(visible).toBe(false); + }); + + it("exposes a callable ref setter", () => { + createRoot(dispose => { + const laze = createLazyRender(); + expect(typeof laze.ref).toBe("function"); + dispose(); + }); + }); + + it("returns correct shape with refresh option", () => { + createRoot(dispose => { + const laze = createLazyRender({ refresh: true }); + expect(typeof laze.ref).toBe("function"); + expect(laze.visible).toBe(false); + dispose(); + }); + }); +}); + +// --------------------------------------------------------------------------- +// createClientSignal (server context -- isServer is true in Node) +// --------------------------------------------------------------------------- +describe("createClientSignal", () => { + it("returns a function that resolves to false on the server", () => { + const signal = createClientSignal(); + expect(typeof signal).toBe("function"); + expect(signal()).toBe(false); + }); +}); + +// --------------------------------------------------------------------------- +// ClientOnly (server context) +// --------------------------------------------------------------------------- +describe("ClientOnly", () => { + it("renders the fallback in a server environment", () => { + const html = renderToString(() => ( + loading}> + client content + + )); + + expect(html).toContain("loading"); + expect(html).not.toContain("client content"); + }); + + it("renders the fallback element when no children are given", () => { + const html = renderToString(() => ( + placeholder
} /> + )); + + expect(html).toContain("placeholder"); + }); +}); + +// --------------------------------------------------------------------------- +// StartImage SSR regression +// --------------------------------------------------------------------------- +describe("StartImage SSR", () => { + it("does not throw ReferenceError: document is not defined", () => { + expect(() => { + renderToString(() => ( +
loading
} + /> + )); + }).not.toThrow(); + }); + + it("produces HTML containing the image container", () => { + const html = renderToString(() => ( +
loading
} + /> + )); + + expect(html).toContain('data-start-image'); + expect(html).toContain("test.jpg"); + }); + + it("renders without a transformer (default fallback path)", () => { + const html = renderToString(() => ( + placeholder} + /> + )); + + expect(html).toContain("hero.png"); + expect(html).toContain('alt="hero image"'); + }); +}); diff --git a/packages/image/src/__tests__/transformer.test.ts b/packages/image/src/__tests__/transformer.test.ts new file mode 100644 index 000000000..660b29e5c --- /dev/null +++ b/packages/image/src/__tests__/transformer.test.ts @@ -0,0 +1,178 @@ +import { describe, it, expect } from "vitest"; +import { + createImageVariants, + mergeImageVariantsByType, + mergeImageVariantsToSrcSet, +} from "../transformer"; +import type { + StartImageSource, + StartImageTransformer, + StartImageVariant, +} from "../types"; + +describe("createImageVariants", () => { + it("returns an array with 1 item when transformer returns a single variant", () => { + const source: StartImageSource<{}> = { + source: "/img/photo.jpg", + width: 800, + height: 600, + options: {}, + }; + + const transformer: StartImageTransformer<{}> = { + transform: () => ({ + path: "/img/photo-800.webp", + width: 800, + type: "image/webp", + }), + }; + + const result = createImageVariants(source, transformer); + + expect(result).toHaveLength(1); + expect(result[0]).toEqual({ + path: "/img/photo-800.webp", + width: 800, + type: "image/webp", + }); + }); + + it("returns an array with 3 items when transformer returns 3 variants", () => { + const source: StartImageSource<{}> = { + source: "/img/hero.png", + width: 1200, + height: 800, + options: {}, + }; + + const variants: StartImageVariant[] = [ + { path: "/img/hero-400.avif", width: 400, type: "image/avif" }, + { path: "/img/hero-800.avif", width: 800, type: "image/avif" }, + { path: "/img/hero-1200.avif", width: 1200, type: "image/avif" }, + ]; + + const transformer: StartImageTransformer<{}> = { + transform: () => variants, + }; + + const result = createImageVariants(source, transformer); + + expect(result).toHaveLength(3); + expect(result[0]).toEqual({ + path: "/img/hero-400.avif", + width: 400, + type: "image/avif", + }); + expect(result[1]).toEqual({ + path: "/img/hero-800.avif", + width: 800, + type: "image/avif", + }); + expect(result[2]).toEqual({ + path: "/img/hero-1200.avif", + width: 1200, + type: "image/avif", + }); + }); + + it("passes the source to the transformer", () => { + const source: StartImageSource<{ quality: number }> = { + source: "/img/test.jpg", + width: 500, + height: 300, + options: { quality: 80 }, + }; + + let receivedSource: StartImageSource<{ quality: number }> | undefined; + + const transformer: StartImageTransformer<{ quality: number }> = { + transform: (src) => { + receivedSource = src; + return { path: "/img/test-500.webp", width: 500, type: "image/webp" }; + }, + }; + + createImageVariants(source, transformer); + + expect(receivedSource).toBe(source); + }); +}); + +describe("mergeImageVariantsByType", () => { + it("groups variants by their MIME type", () => { + const variants: StartImageVariant[] = [ + { path: "/img/a-400.webp", width: 400, type: "image/webp" }, + { path: "/img/a-800.webp", width: 800, type: "image/webp" }, + { path: "/img/a-400.avif", width: 400, type: "image/avif" }, + { path: "/img/a-800.avif", width: 800, type: "image/avif" }, + ]; + + const result = mergeImageVariantsByType(variants); + + expect(result.size).toBe(2); + + const webpGroup = result.get("image/webp")!; + expect(webpGroup).toHaveLength(2); + expect(webpGroup[0]).toEqual({ + path: "/img/a-400.webp", + width: 400, + type: "image/webp", + }); + expect(webpGroup[1]).toEqual({ + path: "/img/a-800.webp", + width: 800, + type: "image/webp", + }); + + const avifGroup = result.get("image/avif")!; + expect(avifGroup).toHaveLength(2); + expect(avifGroup[0]).toEqual({ + path: "/img/a-400.avif", + width: 400, + type: "image/avif", + }); + expect(avifGroup[1]).toEqual({ + path: "/img/a-800.avif", + width: 800, + type: "image/avif", + }); + }); + + it("returns a Map with 1 entry when all variants share the same type", () => { + const variants: StartImageVariant[] = [ + { path: "/img/x-100.png", width: 100, type: "image/png" }, + { path: "/img/x-200.png", width: 200, type: "image/png" }, + ]; + + const result = mergeImageVariantsByType(variants); + + expect(result.size).toBe(1); + expect(result.get("image/png")).toHaveLength(2); + }); +}); + +describe("mergeImageVariantsToSrcSet", () => { + it("formats a single variant into a srcset string", () => { + const variants: StartImageVariant[] = [ + { path: "/img/photo-100.webp", width: 100, type: "image/webp" }, + ]; + + const result = mergeImageVariantsToSrcSet(variants); + + expect(result).toBe("/img/photo-100.webp 100w"); + }); + + it("formats multiple variants into a comma-separated srcset string", () => { + const variants: StartImageVariant[] = [ + { path: "/img/photo-100.webp", width: 100, type: "image/webp" }, + { path: "/img/photo-200.webp", width: 200, type: "image/webp" }, + { path: "/img/photo-400.webp", width: 400, type: "image/webp" }, + ]; + + const result = mergeImageVariantsToSrcSet(variants); + + expect(result).toBe( + "/img/photo-100.webp 100w,/img/photo-200.webp 200w,/img/photo-400.webp 400w", + ); + }); +}); diff --git a/packages/start/src/image/aspect-ratio.ts b/packages/image/src/aspect-ratio.ts similarity index 100% rename from packages/start/src/image/aspect-ratio.ts rename to packages/image/src/aspect-ratio.ts diff --git a/packages/start/src/image/client-only.tsx b/packages/image/src/client-only.tsx similarity index 100% rename from packages/start/src/image/client-only.tsx rename to packages/image/src/client-only.tsx diff --git a/packages/start/src/image/create-lazy-render.ts b/packages/image/src/create-lazy-render.ts similarity index 99% rename from packages/start/src/image/create-lazy-render.ts rename to packages/image/src/create-lazy-render.ts index d5b32d370..eb54ecdae 100644 --- a/packages/start/src/image/create-lazy-render.ts +++ b/packages/image/src/create-lazy-render.ts @@ -29,6 +29,7 @@ export function createLazyRender( if (!current) { return; } + const observer = new IntersectionObserver(entries => { for (const entry of entries) { if (shouldRefresh) { diff --git a/packages/image/src/index.tsx b/packages/image/src/index.tsx new file mode 100644 index 000000000..dc1404adb --- /dev/null +++ b/packages/image/src/index.tsx @@ -0,0 +1,3 @@ +export { Image } from "./Image.tsx"; +export { ClientOnly } from "./client-only.tsx"; +export type { StartImageProps } from "./Image.tsx"; diff --git a/packages/start/src/image/plugin/fs.ts b/packages/image/src/plugin/fs.ts similarity index 100% rename from packages/start/src/image/plugin/fs.ts rename to packages/image/src/plugin/fs.ts diff --git a/packages/start/src/image/plugin/index.ts b/packages/image/src/plugin/index.ts similarity index 87% rename from packages/start/src/image/plugin/index.ts rename to packages/image/src/plugin/index.ts index 6f3dd6074..0a3af906a 100644 --- a/packages/start/src/image/plugin/index.ts +++ b/packages/image/src/plugin/index.ts @@ -1,10 +1,10 @@ import path from "node:path"; import { Plugin } from "vite"; -import { getFilesFromFormat, getMIMEFromFormat, getOutputFileFromFormat } from "../transformer.ts"; -import type { StartImageFile, StartImageFormat, StartImageVariant } from "../types.ts"; -import { outputFile } from "./fs.ts"; -import { getImageData, transformImage } from "./transformers.ts"; -import xxHash32 from "./xxhash32.ts"; +import { getFilesFromFormat, getMIMEFromFormat, getOutputFileFromFormat } from "../transformer"; +import type { StartImageFile, StartImageFormat, StartImageVariant } from "../types"; +import { outputFile } from "./fs"; +import { getImageData, transformImage } from "./transformers"; +import xxHash32 from "./xxhash32"; const DEFAULT_INPUT: StartImageFormat[] = ["png", "jpeg", "webp"]; const DEFAULT_OUTPUT: StartImageFormat[] = ["png", "jpeg", "webp"]; @@ -47,7 +47,6 @@ function isValidFileExtension(extensions: Set, target: string): target i } async function getImageSource(imagePath: string, relativePath: string): Promise { - // TODO add format variation const imageData = await getImageData(imagePath); return ` import source from ${JSON.stringify(relativePath)}; @@ -55,6 +54,7 @@ export default { width: ${JSON.stringify(imageData.width)}, height: ${JSON.stringify(imageData.height)}, source, + options: {}, }; `; } @@ -106,15 +106,15 @@ export const imagePlugin = (options: StartImageOptions) => { if (options.remote) { const transformUrl = options.remote.transformURL; plugins.push({ - name: "solid-start:image/remote", + name: "solidjs:image/remote", enforce: "pre", - resolveId(id) { + resolveId(id: string) { if (id.startsWith(REMOTE_PATH)) { return id; } return null; }, - async load(id) { + async load(id: string) { if (id.startsWith(REMOTE_PATH)) { const param = id.substring(REMOTE_PATH.length); @@ -144,20 +144,25 @@ export default { const validInputFileExtensions = getValidFileExtensions(inputFormat); plugins.push({ - name: "solid-start:image/local", + name: "solidjs:image/local", enforce: "pre", - resolveId(id, importer) { + resolveId(id: string, importer?: string) { if (LOCAL_PATH.test(id) && importer) { - return path.join(path.dirname(importer), id); + const [pathPart, query] = id.split("?"); + const resolved = path.join(path.dirname(importer), pathPart || id); + return query ? `${resolved}?${query}` : resolved; } return null; }, - async load(id) { + async load(id: string) { if (id.startsWith("\0")) { return null; } - const { dir, name, ext } = path.parse(id); - const [actualExtension, condition] = ext.substring(1).split("?"); + const [pathPart, query] = id.split("?"); + const pathWithoutQuery = pathPart || id; + const { dir, name, ext } = path.parse(pathWithoutQuery); + const actualExtension = ext.substring(1); + const condition = query || ""; // Check if extension is valid if (!isValidFileExtension(validInputFileExtensions, actualExtension!)) { return null; diff --git a/packages/start/src/image/plugin/transformers.ts b/packages/image/src/plugin/transformers.ts similarity index 100% rename from packages/start/src/image/plugin/transformers.ts rename to packages/image/src/plugin/transformers.ts diff --git a/packages/start/src/image/plugin/xxhash32.ts b/packages/image/src/plugin/xxhash32.ts similarity index 100% rename from packages/start/src/image/plugin/xxhash32.ts rename to packages/image/src/plugin/xxhash32.ts diff --git a/packages/start/src/image/styles.css b/packages/image/src/styles.css similarity index 100% rename from packages/start/src/image/styles.css rename to packages/image/src/styles.css diff --git a/packages/start/src/image/transformer.ts b/packages/image/src/transformer.ts similarity index 100% rename from packages/start/src/image/transformer.ts rename to packages/image/src/transformer.ts diff --git a/packages/start/src/image/types.ts b/packages/image/src/types.ts similarity index 92% rename from packages/start/src/image/types.ts rename to packages/image/src/types.ts index 53aec3977..d16d2db7b 100644 --- a/packages/start/src/image/types.ts +++ b/packages/image/src/types.ts @@ -1,7 +1,7 @@ /** * List of supported image types * - * Based on https://developer.mozilla.org/en-US/docs/Web/Media/Guides/Formats/Image_types + * @see https://developer.mozilla.org/en-US/docs/Web/Media/Guides/Formats/Image_types */ export type StartImageMIME = | "image/avif" diff --git a/packages/start/src/image/utils.ts b/packages/image/src/utils.ts similarity index 100% rename from packages/start/src/image/utils.ts rename to packages/image/src/utils.ts diff --git a/packages/image/src/vite/index.ts b/packages/image/src/vite/index.ts new file mode 100644 index 000000000..846123422 --- /dev/null +++ b/packages/image/src/vite/index.ts @@ -0,0 +1,2 @@ +export { imagePlugin } from "../plugin/index"; +export type { StartImageOptions } from "../plugin/index"; diff --git a/packages/image/tsconfig.build.json b/packages/image/tsconfig.build.json new file mode 100644 index 000000000..bf8d520c8 --- /dev/null +++ b/packages/image/tsconfig.build.json @@ -0,0 +1,22 @@ +{ + "compilerOptions": { + "target": "ESNext", + "module": "ESNext", + "moduleResolution": "bundler", + "strict": true, + "noUncheckedIndexedAccess": true, + "allowSyntheticDefaultImports": true, + "esModuleInterop": true, + "jsx": "preserve", + "jsxImportSource": "solid-js", + "allowJs": true, + "isolatedModules": true, + "declaration": true, + "skipLibCheck": true, + "types": ["vite/client"], + "allowImportingTsExtensions": true, + "rewriteRelativeImportExtensions": true + }, + "include": ["./src", "./env.d.ts"], + "exclude": ["./dist"] +} diff --git a/packages/image/tsconfig.json b/packages/image/tsconfig.json new file mode 100644 index 000000000..d8faaf508 --- /dev/null +++ b/packages/image/tsconfig.json @@ -0,0 +1,3 @@ +{ + "extends": "./tsconfig.build.json" +} diff --git a/packages/image/tsconfig.node.json b/packages/image/tsconfig.node.json new file mode 100644 index 000000000..cbfed2408 --- /dev/null +++ b/packages/image/tsconfig.node.json @@ -0,0 +1,22 @@ +{ + "compilerOptions": { + "target": "ESNext", + "module": "ESNext", + "moduleResolution": "bundler", + "strict": true, + "noUncheckedIndexedAccess": true, + "allowSyntheticDefaultImports": true, + "esModuleInterop": true, + "jsx": "preserve", + "jsxImportSource": "solid-js", + "allowJs": true, + "isolatedModules": true, + "declaration": true, + "skipLibCheck": true, + "types": ["node", "vite/client"], + "allowImportingTsExtensions": true, + "rewriteRelativeImportExtensions": true + }, + "include": ["./src", "./env.d.ts"], + "exclude": ["./dist"] +} diff --git a/packages/image/tsdown.config.ts b/packages/image/tsdown.config.ts new file mode 100644 index 000000000..4960c46d6 --- /dev/null +++ b/packages/image/tsdown.config.ts @@ -0,0 +1,33 @@ +import { defineConfig } from "tsdown"; + +export default defineConfig([ + { + entry: { + index: "src/index.tsx", + }, + format: ["esm"], + dts: true, + tsconfig: "tsconfig.build.json", + clean: true, + platform: "browser", + inputOptions: { jsx: "preserve" }, + outExtensions: () => ({ + js: ".jsx", + }), + external: ["solid-js", "vite", "sharp", /\.css$/], + }, + { + entry: { + vite: "src/vite/index.ts", + }, + format: ["esm"], + dts: true, + tsconfig: "tsconfig.node.json", + clean: false, + platform: "node", + outExtensions: () => ({ + js: ".js", + }), + external: ["solid-js", "vite", "sharp"], + }, +]); diff --git a/packages/image/vitest.config.ts b/packages/image/vitest.config.ts new file mode 100644 index 000000000..b815e869b --- /dev/null +++ b/packages/image/vitest.config.ts @@ -0,0 +1,27 @@ +import { defineConfig } from "vitest/config"; +import solid from "vite-plugin-solid"; + +export default defineConfig({ + plugins: [ + solid({ ssr: true }), + // vite-plugin-solid automatically injects @testing-library/jest-dom into + // setupFiles when it detects the module in pnpm's store. Because the image + // package does not depend on jest-dom, the import fails at runtime. + // Strip the injected entry so vitest never tries to load it. + { + name: "strip-jest-dom-setup", + config(config) { + const files = config.test?.setupFiles; + if (Array.isArray(files)) { + config.test!.setupFiles = files.filter( + (f) => typeof f !== "string" || !f.includes("jest-dom"), + ); + } + }, + }, + ], + test: { + globals: true, + environment: "node", + }, +}); diff --git a/packages/start/env.d.ts b/packages/start/env.d.ts index 7ef5d9c2c..2c9155d1c 100644 --- a/packages/start/env.d.ts +++ b/packages/start/env.d.ts @@ -7,19 +7,3 @@ declare namespace App { [key: string | symbol]: any; } } - -declare module 'image:*' { - import type { StartImageProps } from "./src/image.ts"; - - const props: Pick, 'src' | 'transformer'>; - - export default props; -} - -declare module '*?image' { - import type { StartImageProps } from "./src/image.ts"; - - const props: Pick, 'src' | 'transformer'>; - - export default props; -} diff --git a/packages/start/package.json b/packages/start/package.json index 6232c1e30..60bf8269a 100644 --- a/packages/start/package.json +++ b/packages/start/package.json @@ -19,8 +19,7 @@ "./client/spa": "./src/client/spa/index.tsx", "./middleware": "./src/middleware/index.ts", "./http": "./src/http/index.ts", - "./env": "./env.d.ts", - "./image": "./src/image/index.tsx" + "./env": "./env.d.ts" }, "publishConfig": { "access": "public", @@ -34,8 +33,7 @@ "./client/spa": "./dist/client/spa/index.jsx", "./middleware": "./dist/middleware/index.js", "./http": "./dist/http/index.js", - "./env": "./env.d.ts", - "./image": "./dist/image/index.jsx" + "./env": "./env.d.ts" } }, "dependencies": { @@ -60,7 +58,6 @@ "radix3": "^1.1.2", "seroval": "^1.4.1", "seroval-plugins": "^1.4.0", - "sharp": "^0.34.5", "shiki": "^1.26.1", "solid-js": "^1.9.9", "source-map-js": "^1.2.1", diff --git a/packages/start/src/config/index.ts b/packages/start/src/config/index.ts index 41edef3d8..22ed74472 100644 --- a/packages/start/src/config/index.ts +++ b/packages/start/src/config/index.ts @@ -5,7 +5,6 @@ import { extname, isAbsolute, join } from "node:path"; import { fileURLToPath } from "node:url"; import { normalizePath, type PluginOption } from "vite"; import solid, { type Options as SolidOptions } from "vite-plugin-solid"; -import { imagePlugin, type StartImageOptions } from "../image/plugin/index.ts"; import { DEFAULT_EXTENSIONS, VIRTUAL_MODULES, VITE_ENVIRONMENTS } from "./constants.ts"; import { devServer } from "./dev-server.ts"; import { SolidStartClientFileRouter, SolidStartServerFileRouter } from "./fs-router.ts"; @@ -21,8 +20,6 @@ export interface SolidStartOptions { routeDir?: string; extensions?: string[]; middleware?: string; - - image?: StartImageOptions; } const absolute = (path: string, root: string) => @@ -115,6 +112,8 @@ export function solidStart(options?: SolidStartOptions): Array { }, resolve: { alias: { + "solid-js/jsx-runtime": "solid-js/h/jsx-runtime", + "solid-js/jsx-dev-runtime": "solid-js/h/jsx-dev-runtime", "@solidjs/start/server/entry": handlers.server, "~": join(process.cwd(), start.appRoot), ...(!start.ssr @@ -201,7 +200,6 @@ export function solidStart(options?: SolidStartOptions): Array { replacer: opts => `createServerReference(${opts.fn}, '${opts.functionId}')`, }, }), - options?.image ? imagePlugin(options.image) : undefined, { name: "solid-start:virtual-modules", async resolveId(id) { diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index d7f3e3a99..c11ae8839 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -123,6 +123,27 @@ importers: specifier: 7.1.10 version: 7.1.10(@types/node@25.0.3)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.19.2)(yaml@2.8.1) + apps/fixtures/image: + dependencies: + '@solidjs/image': + specifier: workspace:* + version: link:../../../packages/image + '@solidjs/meta': + specifier: ^0.29.4 + version: 0.29.4(solid-js@1.9.9) + '@solidjs/router': + specifier: ^0.15.0 + version: 0.15.3(solid-js@1.9.9) + '@solidjs/start': + specifier: workspace:* + version: link:../../../packages/start + solid-js: + specifier: ^1.9.9 + version: 1.9.9 + vite: + specifier: 7.1.10 + version: 7.1.10(@types/node@25.0.3)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.19.2)(yaml@2.8.1) + apps/fixtures/nitro-3: dependencies: '@solidjs/meta': @@ -252,6 +273,9 @@ importers: apps/tests: dependencies: + '@solidjs/image': + specifier: workspace:* + version: link:../../packages/image '@solidjs/meta': specifier: ^0.29.4 version: 0.29.4(solid-js@1.9.9) @@ -308,6 +332,28 @@ importers: specifier: ^1.56.1 version: 1.56.1 + packages/image: + dependencies: + sharp: + specifier: ^0.34.5 + version: 0.34.5 + devDependencies: + solid-js: + specifier: ^1.9.9 + version: 1.9.9 + tsdown: + specifier: ^0.9.0 + version: 0.9.9(typescript@5.7.3) + vite: + specifier: ^7.1.10 + version: 7.1.10(@types/node@25.0.3)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.19.2)(yaml@2.8.1) + vite-plugin-solid: + specifier: ^2.11.9 + version: 2.11.9(patch_hash=71233f1afab9e3ea2dbb03dbda3d84894ef1c6bfbbe69df9f864d03bfe67b6f5)(@testing-library/jest-dom@6.6.2)(solid-js@1.9.9)(vite@7.1.10(@types/node@25.0.3)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.19.2)(yaml@2.8.1)) + vitest: + specifier: ^4.0.10 + version: 4.0.10(@types/debug@4.1.12)(@types/node@25.0.3)(@vitest/browser-playwright@4.0.10)(@vitest/ui@4.0.10)(jiti@2.6.1)(jsdom@25.0.1)(lightningcss@1.30.2)(msw@2.7.0(@types/node@25.0.3)(typescript@5.7.3))(terser@5.44.0)(tsx@4.19.2)(yaml@2.8.1) + packages/start: dependencies: '@babel/core': @@ -373,9 +419,6 @@ importers: seroval-plugins: specifier: ^1.4.0 version: 1.4.0(seroval@1.4.1) - sharp: - specifier: ^0.34.5 - version: 0.34.5 shiki: specifier: ^1.26.1 version: 1.26.1 @@ -549,10 +592,6 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/runtime@7.26.7': - resolution: {integrity: sha512-AOPI3D+a8dXnja+iwsUqGRjr1BbZIe771sXdapOtYI531gSqpi92vXivKcq2asu/DFpdl1ceFAKZyRzK2PCVcQ==} - engines: {node: '>=6.9.0'} - '@babel/runtime@7.28.4': resolution: {integrity: sha512-Q/N6JNWvIvPnLDvjlE1OUBLPQHH6l3CltCEsHIujp45zQUSSh8K+gHnaEX45yAT1nyngnINhvWtzN+Nb9D8RAQ==} engines: {node: '>=6.9.0'} @@ -1155,89 +1194,105 @@ packages: resolution: {integrity: sha512-excjX8DfsIcJ10x1Kzr4RcWe1edC9PquDRRPx3YVCvQv+U5p7Yin2s32ftzikXojb1PIFc/9Mt28/y+iRklkrw==} cpu: [arm64] os: [linux] + libc: [glibc] '@img/sharp-libvips-linux-arm@1.2.4': resolution: {integrity: sha512-bFI7xcKFELdiNCVov8e44Ia4u2byA+l3XtsAj+Q8tfCwO6BQ8iDojYdvoPMqsKDkuoOo+X6HZA0s0q11ANMQ8A==} cpu: [arm] os: [linux] + libc: [glibc] '@img/sharp-libvips-linux-ppc64@1.2.4': resolution: {integrity: sha512-FMuvGijLDYG6lW+b/UvyilUWu5Ayu+3r2d1S8notiGCIyYU/76eig1UfMmkZ7vwgOrzKzlQbFSuQfgm7GYUPpA==} cpu: [ppc64] os: [linux] + libc: [glibc] '@img/sharp-libvips-linux-riscv64@1.2.4': resolution: {integrity: sha512-oVDbcR4zUC0ce82teubSm+x6ETixtKZBh/qbREIOcI3cULzDyb18Sr/Wcyx7NRQeQzOiHTNbZFF1UwPS2scyGA==} cpu: [riscv64] os: [linux] + libc: [glibc] '@img/sharp-libvips-linux-s390x@1.2.4': resolution: {integrity: sha512-qmp9VrzgPgMoGZyPvrQHqk02uyjA0/QrTO26Tqk6l4ZV0MPWIW6LTkqOIov+J1yEu7MbFQaDpwdwJKhbJvuRxQ==} cpu: [s390x] os: [linux] + libc: [glibc] '@img/sharp-libvips-linux-x64@1.2.4': resolution: {integrity: sha512-tJxiiLsmHc9Ax1bz3oaOYBURTXGIRDODBqhveVHonrHJ9/+k89qbLl0bcJns+e4t4rvaNBxaEZsFtSfAdquPrw==} cpu: [x64] os: [linux] + libc: [glibc] '@img/sharp-libvips-linuxmusl-arm64@1.2.4': resolution: {integrity: sha512-FVQHuwx1IIuNow9QAbYUzJ+En8KcVm9Lk5+uGUQJHaZmMECZmOlix9HnH7n1TRkXMS0pGxIJokIVB9SuqZGGXw==} cpu: [arm64] os: [linux] + libc: [musl] '@img/sharp-libvips-linuxmusl-x64@1.2.4': resolution: {integrity: sha512-+LpyBk7L44ZIXwz/VYfglaX/okxezESc6UxDSoyo2Ks6Jxc4Y7sGjpgU9s4PMgqgjj1gZCylTieNamqA1MF7Dg==} cpu: [x64] os: [linux] + libc: [musl] '@img/sharp-linux-arm64@0.34.5': resolution: {integrity: sha512-bKQzaJRY/bkPOXyKx5EVup7qkaojECG6NLYswgktOZjaXecSAeCWiZwwiFf3/Y+O1HrauiE3FVsGxFg8c24rZg==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [arm64] os: [linux] + libc: [glibc] '@img/sharp-linux-arm@0.34.5': resolution: {integrity: sha512-9dLqsvwtg1uuXBGZKsxem9595+ujv0sJ6Vi8wcTANSFpwV/GONat5eCkzQo/1O6zRIkh0m/8+5BjrRr7jDUSZw==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [arm] os: [linux] + libc: [glibc] '@img/sharp-linux-ppc64@0.34.5': resolution: {integrity: sha512-7zznwNaqW6YtsfrGGDA6BRkISKAAE1Jo0QdpNYXNMHu2+0dTrPflTLNkpc8l7MUP5M16ZJcUvysVWWrMefZquA==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [ppc64] os: [linux] + libc: [glibc] '@img/sharp-linux-riscv64@0.34.5': resolution: {integrity: sha512-51gJuLPTKa7piYPaVs8GmByo7/U7/7TZOq+cnXJIHZKavIRHAP77e3N2HEl3dgiqdD/w0yUfiJnII77PuDDFdw==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [riscv64] os: [linux] + libc: [glibc] '@img/sharp-linux-s390x@0.34.5': resolution: {integrity: sha512-nQtCk0PdKfho3eC5MrbQoigJ2gd1CgddUMkabUj+rBevs8tZ2cULOx46E7oyX+04WGfABgIwmMC0VqieTiR4jg==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [s390x] os: [linux] + libc: [glibc] '@img/sharp-linux-x64@0.34.5': resolution: {integrity: sha512-MEzd8HPKxVxVenwAa+JRPwEC7QFjoPWuS5NZnBt6B3pu7EG2Ge0id1oLHZpPJdn3OQK+BQDiw9zStiHBTJQQQQ==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [x64] os: [linux] + libc: [glibc] '@img/sharp-linuxmusl-arm64@0.34.5': resolution: {integrity: sha512-fprJR6GtRsMt6Kyfq44IsChVZeGN97gTD331weR1ex1c1rypDEABN6Tm2xa1wE6lYb5DdEnk03NZPqA7Id21yg==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [arm64] os: [linux] + libc: [musl] '@img/sharp-linuxmusl-x64@0.34.5': resolution: {integrity: sha512-Jg8wNT1MUzIvhBFxViqrEhWDGzqymo3sV7z7ZsaWbZNDLXRJZoRGrjulp60YYtV4wfY8VIKcWidjojlLcWrd8Q==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [x64] os: [linux] + libc: [musl] '@img/sharp-wasm32@0.34.5': resolution: {integrity: sha512-OdWTEiVkY2PHwqkbBI8frFxQQFekHaSSkUIJkwzclWZe64O1X4UlUjqqqLaPbUpMOQk6FBu/HtlGXNblIs0huw==} @@ -1389,6 +1444,9 @@ packages: resolution: {integrity: sha512-wK+5pLK5XFmgtH3aQ2YVvA3HohS3xqV/OxuVOdNx9Wpnz7VE/fnC+e1A7ln6LFYeck7gOJ/dsZV6OLplOtAJ2w==} engines: {node: '>=18'} + '@napi-rs/wasm-runtime@0.2.12': + resolution: {integrity: sha512-ZVWUcfwY4E/yPitQJl481FjFo3K22D6qF0DuFH6Y/nbnE11GY5uguDxZMGXPQ8WQ0128MXQD7TnfHyK4oWoIJQ==} + '@napi-rs/wasm-runtime@1.0.7': resolution: {integrity: sha512-SeDnOO0Tk7Okiq6DbXmmBODgOAb9dp9gjlphokTUxmt8U3liIP1ZsozBahH69j/RJv+Rfs6IwUKHTgQYJ/HBAw==} @@ -1566,36 +1624,42 @@ packages: engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [linux] + libc: [glibc] '@oxc-minify/binding-linux-arm64-musl@0.96.0': resolution: {integrity: sha512-rNqoFWOWaxwMmUY5fspd/h5HfvgUlA3sv9CUdA2MpnHFiyoJNovR7WU8tGh+Yn0qOAs0SNH0a05gIthHig14IA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [linux] + libc: [musl] '@oxc-minify/binding-linux-riscv64-gnu@0.96.0': resolution: {integrity: sha512-3paajIuzGnukHwSI3YBjYVqbd72pZd8NJxaayaNFR0AByIm8rmIT5RqFXbq8j2uhtpmNdZRXiu0em1zOmIScWA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [riscv64] os: [linux] + libc: [glibc] '@oxc-minify/binding-linux-s390x-gnu@0.96.0': resolution: {integrity: sha512-9ESrpkB2XG0lQ89JlsxlZa86iQCOs+jkDZLl6O+u5wb7ynUy21bpJJ1joauCOSYIOUlSy3+LbtJLiqi7oSQt5Q==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [s390x] os: [linux] + libc: [glibc] '@oxc-minify/binding-linux-x64-gnu@0.96.0': resolution: {integrity: sha512-UMM1jkns+p+WwwmdjC5giI3SfR2BCTga18x3C0cAu6vDVf4W37uTZeTtSIGmwatTBbgiq++Te24/DE0oCdm1iQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [linux] + libc: [glibc] '@oxc-minify/binding-linux-x64-musl@0.96.0': resolution: {integrity: sha512-8b1naiC7MdP7xeMi7cQ5tb9W1rZAP9Qz/jBRqp1Y5EOZ1yhSGnf1QWuZ/0pCc+XiB9vEHXEY3Aki/H+86m2eOg==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [linux] + libc: [musl] '@oxc-minify/binding-wasm32-wasi@0.96.0': resolution: {integrity: sha512-bjGDjkGzo3GWU9Vg2qiFUrfoo5QxojPNV/2RHTlbIB5FWkkV4ExVjsfyqihFiAuj0NXIZqd2SAiEq9htVd3RFw==} @@ -1614,18 +1678,104 @@ packages: cpu: [x64] os: [win32] + '@oxc-project/types@0.66.0': + resolution: {integrity: sha512-KF5Wlo2KzQ+jmuCtrGISZoUfdHom7qHavNfPLW2KkeYJfYMGwtiia8KjwtsvNJ49qRiXImOCkPeVPd4bMlbR7w==} + + '@oxc-resolver/binding-darwin-arm64@9.0.2': + resolution: {integrity: sha512-MVyRgP2gzJJtAowjG/cHN3VQXwNLWnY+FpOEsyvDepJki1SdAX/8XDijM1yN6ESD1kr9uhBKjGelC6h3qtT+rA==} + cpu: [arm64] + os: [darwin] + + '@oxc-resolver/binding-darwin-x64@9.0.2': + resolution: {integrity: sha512-7kV0EOFEZ3sk5Hjy4+bfA6XOQpCwbDiDkkHN4BHHyrBHsXxUR05EcEJPPL1WjItefg+9+8hrBmoK0xRoDs41+A==} + cpu: [x64] + os: [darwin] + + '@oxc-resolver/binding-freebsd-x64@9.0.2': + resolution: {integrity: sha512-6OvkEtRXrt8sJ4aVfxHRikjain9nV1clIsWtJ1J3J8NG1ZhjyJFgT00SCvqxbK+pzeWJq6XzHyTCN78ML+lY2w==} + cpu: [x64] + os: [freebsd] + + '@oxc-resolver/binding-linux-arm-gnueabihf@9.0.2': + resolution: {integrity: sha512-aYpNL6o5IRAUIdoweW21TyLt54Hy/ZS9tvzNzF6ya1ckOQ8DLaGVPjGpmzxdNja9j/bbV6aIzBH7lNcBtiOTkQ==} + cpu: [arm] + os: [linux] + + '@oxc-resolver/binding-linux-arm64-gnu@9.0.2': + resolution: {integrity: sha512-RGFW4vCfKMFEIzb9VCY0oWyyY9tR1/o+wDdNePhiUXZU4SVniRPQaZ1SJ0sUFI1k25pXZmzQmIP6cBmazi/Dew==} + cpu: [arm64] + os: [linux] + libc: [glibc] + + '@oxc-resolver/binding-linux-arm64-musl@9.0.2': + resolution: {integrity: sha512-lxx/PibBfzqYvut2Y8N2D0Ritg9H8pKO+7NUSJb9YjR/bfk2KRmP8iaUz3zB0JhPtf/W3REs65oKpWxgflGToA==} + cpu: [arm64] + os: [linux] + libc: [musl] + + '@oxc-resolver/binding-linux-riscv64-gnu@9.0.2': + resolution: {integrity: sha512-yD28ptS/OuNhwkpXRPNf+/FvrO7lwURLsEbRVcL1kIE0GxNJNMtKgIE4xQvtKDzkhk6ZRpLho5VSrkkF+3ARTQ==} + cpu: [riscv64] + os: [linux] + libc: [glibc] + + '@oxc-resolver/binding-linux-s390x-gnu@9.0.2': + resolution: {integrity: sha512-WBwEJdspoga2w+aly6JVZeHnxuPVuztw3fPfWrei2P6rNM5hcKxBGWKKT6zO1fPMCB4sdDkFohGKkMHVV1eryQ==} + cpu: [s390x] + os: [linux] + libc: [glibc] + + '@oxc-resolver/binding-linux-x64-gnu@9.0.2': + resolution: {integrity: sha512-a2z3/cbOOTUq0UTBG8f3EO/usFcdwwXnCejfXv42HmV/G8GjrT4fp5+5mVDoMByH3Ce3iVPxj1LmS6OvItKMYQ==} + cpu: [x64] + os: [linux] + libc: [glibc] + + '@oxc-resolver/binding-linux-x64-musl@9.0.2': + resolution: {integrity: sha512-bHZF+WShYQWpuswB9fyxcgMIWVk4sZQT0wnwpnZgQuvGTZLkYJ1JTCXJMtaX5mIFHf69ngvawnwPIUA4Feil0g==} + cpu: [x64] + os: [linux] + libc: [musl] + + '@oxc-resolver/binding-wasm32-wasi@9.0.2': + resolution: {integrity: sha512-I5cSgCCh5nFozGSHz+PjIOfrqW99eUszlxKLgoNNzQ1xQ2ou9ZJGzcZ94BHsM9SpyYHLtgHljmOZxCT9bgxYNA==} + engines: {node: '>=14.0.0'} + cpu: [wasm32] + + '@oxc-resolver/binding-win32-arm64-msvc@9.0.2': + resolution: {integrity: sha512-5IhoOpPr38YWDWRCA5kP30xlUxbIJyLAEsAK7EMyUgqygBHEYLkElaKGgS0X5jRXUQ6l5yNxuW73caogb2FYaw==} + cpu: [arm64] + os: [win32] + + '@oxc-resolver/binding-win32-x64-msvc@9.0.2': + resolution: {integrity: sha512-Qc40GDkaad9rZksSQr2l/V9UubigIHsW69g94Gswc2sKYB3XfJXfIfyV8WTJ67u6ZMXsZ7BH1msSC6Aen75mCg==} + cpu: [x64] + os: [win32] + '@oxc-transform/binding-android-arm64@0.96.0': resolution: {integrity: sha512-wOm+ZsqFvyZ7B9RefUMsj0zcXw77Z2pXA51nbSQyPXqr+g0/pDGxriZWP8Sdpz/e4AEaKPA9DvrwyOZxu7GRDQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [android] + '@oxc-transform/binding-darwin-arm64@0.67.0': + resolution: {integrity: sha512-P3zBMhpOQceNSys3/ZqvrjuRvcIbVzfGFN/tH34HlVkOjOmfGK1mOWjORsGAZtbgh1muXrF6mQETLzFjfYndXQ==} + engines: {node: '>=14.0.0'} + cpu: [arm64] + os: [darwin] + '@oxc-transform/binding-darwin-arm64@0.96.0': resolution: {integrity: sha512-td1sbcvzsyuoNRiNdIRodPXRtFFwxzPpC/6/yIUtRRhKn30XQcizxupIvQQVpJWWchxkphbBDh6UN+u+2CJ8Zw==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [darwin] + '@oxc-transform/binding-darwin-x64@0.67.0': + resolution: {integrity: sha512-B52aeo/C3spYHcwFQ4nAbDkwbMKf0K6ncWM8GrVUgGu8PPECLBhjPCW11kPW/lt9FxwrdgVYVzPYlZ6wmJmpEA==} + engines: {node: '>=14.0.0'} + cpu: [x64] + os: [darwin] + '@oxc-transform/binding-darwin-x64@0.96.0': resolution: {integrity: sha512-xgqxnqhPYH2NYkgbqtnCJfhbXvxIf/pnhF/ig5UBK8PYpCEWIP/cfLpQRQ9DcQnRfuxi7RMIF6LdmB1AiS6Fkg==} engines: {node: ^20.19.0 || >=22.12.0} @@ -1638,6 +1788,12 @@ packages: cpu: [x64] os: [freebsd] + '@oxc-transform/binding-linux-arm-gnueabihf@0.67.0': + resolution: {integrity: sha512-5Ir1eQrC9lvj/rR1TJVGwOR4yLgXTLmfKHIfpVH7GGSQrzK7VMUfHWX+dAsX1VutaeE8puXIqtYvf9cHLw78dw==} + engines: {node: '>=14.0.0'} + cpu: [arm] + os: [linux] + '@oxc-transform/binding-linux-arm-gnueabihf@0.96.0': resolution: {integrity: sha512-9MJBs0SWODsqyzO3eAnacXgJ/sZu1xqinjEwBzkcZ3tQI8nKhMADOzu2NzbVWDWujeoC8DESXaO08tujvUru+Q==} engines: {node: ^20.19.0 || >=22.12.0} @@ -1650,53 +1806,104 @@ packages: cpu: [arm] os: [linux] + '@oxc-transform/binding-linux-arm64-gnu@0.67.0': + resolution: {integrity: sha512-zTqfPET5+hZfJ3/dMqJboKxrpXMXk+j2HVdvX0wVhW2MI7n7hwELl+In6Yu20nXuEyJkNQlWHbNPCUfpM+cBWw==} + engines: {node: '>=14.0.0'} + cpu: [arm64] + os: [linux] + libc: [glibc] + '@oxc-transform/binding-linux-arm64-gnu@0.96.0': resolution: {integrity: sha512-kaqvUzNu8LL4aBSXqcqGVLFG13GmJEplRI2+yqzkgAItxoP/LfFMdEIErlTWLGyBwd0OLiNMHrOvkcCQRWadVg==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [linux] + libc: [glibc] + + '@oxc-transform/binding-linux-arm64-musl@0.67.0': + resolution: {integrity: sha512-jzz/ATUhZ8wetb4gm5GwzheZns3Qj1CZ+DIMmD8nBxQXszmTS/fqnAPpgzruyLqkXBUuUfF3pHv5f/UmuHReuQ==} + engines: {node: '>=14.0.0'} + cpu: [arm64] + os: [linux] + libc: [musl] '@oxc-transform/binding-linux-arm64-musl@0.96.0': resolution: {integrity: sha512-EiG/L3wEkPgTm4p906ufptyblBgtiQWTubGg/JEw82f8uLRroayr5zhbUqx40EgH037a3SfJthIyLZi7XPRFJw==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [linux] + libc: [musl] '@oxc-transform/binding-linux-riscv64-gnu@0.96.0': resolution: {integrity: sha512-r01CY6OxKGtVeYnvH4mGmtkQMlLkXdPWWNXwo5o7fE2s/fgZPMpqh8bAuXEhuMXipZRJrjxTk1+ZQ4KCHpMn3Q==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [riscv64] os: [linux] + libc: [glibc] '@oxc-transform/binding-linux-s390x-gnu@0.96.0': resolution: {integrity: sha512-4djg2vYLGbVeS8YiA2K4RPPpZE4fxTGCX5g/bOMbCYyirDbmBAIop4eOAj8vOA9i1CcWbDtmp+PVJ1dSw7f3IQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [s390x] os: [linux] + libc: [glibc] + + '@oxc-transform/binding-linux-x64-gnu@0.67.0': + resolution: {integrity: sha512-Qy2+tfglJ8yX6guC1EDAnuuzRZIXciXO9UwOewxyiahLxwuTpj/wvvZN3Cb1SA3c14zrwb2TNMZvaXS1/OS5Pg==} + engines: {node: '>=14.0.0'} + cpu: [x64] + os: [linux] + libc: [glibc] '@oxc-transform/binding-linux-x64-gnu@0.96.0': resolution: {integrity: sha512-f6pcWVz57Y8jXa2OS7cz3aRNuks34Q3j61+3nQ4xTE8H1KbalcEvHNmM92OEddaJ8QLs9YcE0kUC6eDTbY34+A==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [linux] + libc: [glibc] + + '@oxc-transform/binding-linux-x64-musl@0.67.0': + resolution: {integrity: sha512-tHoYgDIRhgvh+/wIrzAk3cUoj/LSSoJAdsZW9XRlaixFW/TF2puxRyaS1hRco0bcKTwotXl/eDYqZmhIfUyGRQ==} + engines: {node: '>=14.0.0'} + cpu: [x64] + os: [linux] + libc: [musl] '@oxc-transform/binding-linux-x64-musl@0.96.0': resolution: {integrity: sha512-NSiRtFvR7Pbhv3mWyPMkTK38czIjcnK0+K5STo3CuzZRVbX1TM17zGdHzKBUHZu7v6IQ6/XsQ3ELa1BlEHPGWQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [linux] + libc: [musl] + + '@oxc-transform/binding-wasm32-wasi@0.67.0': + resolution: {integrity: sha512-ZPT+1HECf7WUnotodIuS8tvSkwaiCdC2DDw8HVRmlerbS6iPYIPKyBCvkSM4RyUx0kljZtB9AciLCkEbwy5/zA==} + engines: {node: '>=14.0.0'} + cpu: [wasm32] '@oxc-transform/binding-wasm32-wasi@0.96.0': resolution: {integrity: sha512-A91ARLiuZHGN4hBds9s7bW3czUuLuHLsV+cz44iF9j8e1zX9m2hNGXf/acQRbg/zcFUXmjz5nmk8EkZyob876w==} engines: {node: '>=14.0.0'} cpu: [wasm32] + '@oxc-transform/binding-win32-arm64-msvc@0.67.0': + resolution: {integrity: sha512-+E3lOHCk4EuIk6IjshBAARknAUpgH+gHTtZxCPqK4AWYA+Tls2J6C0FVM48uZ4m3rZpAq8ZszM9JZVAkOaynBQ==} + engines: {node: '>=14.0.0'} + cpu: [arm64] + os: [win32] + '@oxc-transform/binding-win32-arm64-msvc@0.96.0': resolution: {integrity: sha512-IedJf40djKgDObomhYjdRAlmSYUEdfqX3A3M9KfUltl9AghTBBLkTzUMA7O09oo71vYf5TEhbFM7+Vn5vqw7AQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [win32] + '@oxc-transform/binding-win32-x64-msvc@0.67.0': + resolution: {integrity: sha512-3pIIFb9g5aFrAODTQVJYitq+ONHgDJ4IYk/7pk+jsG6JpKUkURd0auUlxvriO11fFit5hdwy+wIbU4kBvyRUkg==} + engines: {node: '>=14.0.0'} + cpu: [x64] + os: [win32] + '@oxc-transform/binding-win32-x64-msvc@0.96.0': resolution: {integrity: sha512-0fI0P0W7bSO/GCP/N5dkmtB9vBqCA4ggo1WmXTnxNJVmFFOtcA1vYm1I9jl8fxo+sucW2WnlpnI4fjKdo3JKxA==} engines: {node: ^20.19.0 || >=22.12.0} @@ -1717,21 +1924,25 @@ packages: resolution: {integrity: sha512-TfJkMZjePbLiskmxFXVAbGI/OZtD+y+fwS0wyW8O6DWG0ARTf0AipY9zGwGoOdpFuXOJceXvN4SHGLbYNDMY4Q==} cpu: [arm64] os: [linux] + libc: [glibc] '@oxfmt/linux-arm64-musl@0.28.0': resolution: {integrity: sha512-7fyQUdW203v4WWGr1T3jwTz4L7KX9y5DeATryQ6fLT6QQp9GEuct8/k0lYhd+ys42iTV/IkJF20e3YkfSOOILg==} cpu: [arm64] os: [linux] + libc: [musl] '@oxfmt/linux-x64-gnu@0.28.0': resolution: {integrity: sha512-sRKqAvEonuz0qr1X1ncUZceOBJerKzkO2gZIZmosvy/JmqyffpIFL3OE2tqacFkeDhrC+dNYQpusO8zsfHo3pw==} cpu: [x64] os: [linux] + libc: [glibc] '@oxfmt/linux-x64-musl@0.28.0': resolution: {integrity: sha512-fW6czbXutX/tdQe8j4nSIgkUox9RXqjyxwyWXUDItpoDkoXllq17qbD7GVc0whrEhYQC6hFE1UEAcDypLJoSzw==} cpu: [x64] os: [linux] + libc: [musl] '@oxfmt/win32-arm64@0.28.0': resolution: {integrity: sha512-D/HDeQBAQRjTbD9OLV6kRDcStrIfO+JsUODDCdGmhRfNX8LPCx95GpfyybpZfn3wVF8Jq/yjPXV1xLkQ+s7RcA==} @@ -1772,30 +1983,35 @@ packages: engines: {node: '>= 10.0.0'} cpu: [arm] os: [linux] + libc: [glibc] '@parcel/watcher-linux-arm64-glibc@2.4.1': resolution: {integrity: sha512-BJ7mH985OADVLpbrzCLgrJ3TOpiZggE9FMblfO65PlOCdG++xJpKUJ0Aol74ZUIYfb8WsRlUdgrZxKkz3zXWYA==} engines: {node: '>= 10.0.0'} cpu: [arm64] os: [linux] + libc: [glibc] '@parcel/watcher-linux-arm64-musl@2.4.1': resolution: {integrity: sha512-p4Xb7JGq3MLgAfYhslU2SjoV9G0kI0Xry0kuxeG/41UfpjHGOhv7UoUDAz/jb1u2elbhazy4rRBL8PegPJFBhA==} engines: {node: '>= 10.0.0'} cpu: [arm64] os: [linux] + libc: [musl] '@parcel/watcher-linux-x64-glibc@2.4.1': resolution: {integrity: sha512-s9O3fByZ/2pyYDPoLM6zt92yu6P4E39a03zvO0qCHOTjxmt3GHRMLuRZEWhWLASTMSrrnVNWdVI/+pUElJBBBg==} engines: {node: '>= 10.0.0'} cpu: [x64] os: [linux] + libc: [glibc] '@parcel/watcher-linux-x64-musl@2.4.1': resolution: {integrity: sha512-L2nZTYR1myLNST0O632g0Dx9LyMNHrn6TOt76sYxWLdff3cB22/GZX2UPtJnaqQPdCRoszoY5rcOj4oMTtp5fQ==} engines: {node: '>= 10.0.0'} cpu: [x64] os: [linux] + libc: [musl] '@parcel/watcher-wasm@2.4.1': resolution: {integrity: sha512-/ZR0RxqxU/xxDGzbzosMjh4W6NdYFMqq2nvo2b8SLi7rsl/4jkL8S5stIikorNkdR50oVDvqb/3JT05WM+CRRA==} @@ -1875,6 +2091,73 @@ packages: '@prisma/get-platform@5.22.0': resolution: {integrity: sha512-pHhpQdr1UPFpt+zFfnPazhulaZYCUqeIcPpJViYoq9R+D/yw4fjE+CtnsnKzPYm0ddUbeXUzjGVGIRVgPDCk4Q==} + '@quansync/fs@1.0.0': + resolution: {integrity: sha512-4TJ3DFtlf1L5LDMaM6CanJ/0lckGNtJcMjQ1NAV6zDmA0tEHKZtxNKin8EgPaVX1YzljbxckyT2tJrpQKAtngQ==} + + '@rolldown/binding-darwin-arm64@1.0.0-beta.8-commit.151352b': + resolution: {integrity: sha512-2F4bhDtV6CHBx7JMiT9xvmxkcZLHFmonfbli36RyfvgThDOAu92bis28zDTdguDY85lN/jBRKX/eOvX+T5hMkg==} + cpu: [arm64] + os: [darwin] + + '@rolldown/binding-darwin-x64@1.0.0-beta.8-commit.151352b': + resolution: {integrity: sha512-8VMChhFLeD/oOAQUspFtxZaV7ctDob63w626kwvBBIHtlpY2Ohw4rsfjjtGckyrTCI/RROgZv/TVVEsG3GkgLw==} + cpu: [x64] + os: [darwin] + + '@rolldown/binding-freebsd-x64@1.0.0-beta.8-commit.151352b': + resolution: {integrity: sha512-4W28EgaIidbWIpwB3hESMBfiOSs7LBFpJGa8JIV488qLEnTR/pqzxDEoOPobhRSJ1lJlv0vUgA8+DKBIldo2gw==} + cpu: [x64] + os: [freebsd] + + '@rolldown/binding-linux-arm-gnueabihf@1.0.0-beta.8-commit.151352b': + resolution: {integrity: sha512-1ECtyzIKlAHikR7BhS4hk7Hxw8xCH6W3S+Sb74EM0vy5AqPvWSbgLfAwagYC7gNDcMMby3I757X7qih5fIrGiw==} + cpu: [arm] + os: [linux] + + '@rolldown/binding-linux-arm64-gnu@1.0.0-beta.8-commit.151352b': + resolution: {integrity: sha512-wU1kp8qPRUKC8N82dNs3F5+UyKRww9TUEO5dQ5mxCb0cG+y4l5rVaXpMgvL0VuQahPVvTMs577QPhJGb4iDONw==} + cpu: [arm64] + os: [linux] + libc: [glibc] + + '@rolldown/binding-linux-arm64-musl@1.0.0-beta.8-commit.151352b': + resolution: {integrity: sha512-odDjO2UtEEMAzwmLHEOKylJjQa+em1REAO9H19PA+O+lPu6evVbre5bqu8qCjEtHG1Q034LpZR86imCP2arb/w==} + cpu: [arm64] + os: [linux] + libc: [musl] + + '@rolldown/binding-linux-x64-gnu@1.0.0-beta.8-commit.151352b': + resolution: {integrity: sha512-Ty2T67t2Oj1lg417ATRENxdk8Jkkksc/YQdCJyvkGqteHe60pSU2GGP/tLWGB+I0Ox+u387bzU/SmfmrHZk9aw==} + cpu: [x64] + os: [linux] + libc: [glibc] + + '@rolldown/binding-linux-x64-musl@1.0.0-beta.8-commit.151352b': + resolution: {integrity: sha512-Fm1TxyeVE+gy74HM26CwbEOUndIoWAMgWkVDxYBD64tayvp5JvltpGHaqCg6x5i+X2F5XCDCItqwVlC7/mTxIw==} + cpu: [x64] + os: [linux] + libc: [musl] + + '@rolldown/binding-wasm32-wasi@1.0.0-beta.8-commit.151352b': + resolution: {integrity: sha512-AEZzTyGerfkffXmtv7kFJbHWkryNeolk0Br+yhH1wZyN6Tt6aebqICDL8KNRO2iExoEWzyYS6dPxh0QmvNTfUQ==} + engines: {node: '>=14.21.3'} + cpu: [wasm32] + + '@rolldown/binding-win32-arm64-msvc@1.0.0-beta.8-commit.151352b': + resolution: {integrity: sha512-0lskDFKQwf5PMjl17qHAroU6oVU0Zn8NbAH/PdM9QB1emOzyFDGa20d4kESGeo3Uq7xOKXcTORJV/JwKIBORqw==} + cpu: [arm64] + os: [win32] + + '@rolldown/binding-win32-ia32-msvc@1.0.0-beta.8-commit.151352b': + resolution: {integrity: sha512-DfG1S0zGKnUfr95cNCmR4YPiZ/moS7Tob5eV+9r5JGeHZVWFHWwvJdR0jArj6Ty0LbBFDTVVB3iAvqRSji+l0Q==} + cpu: [ia32] + os: [win32] + + '@rolldown/binding-win32-x64-msvc@1.0.0-beta.8-commit.151352b': + resolution: {integrity: sha512-5HZEtc8U2I1O903hXBynWtWaf+qzAFj66h5B7gOtVcvqIk+lKRVSupA85OdIvR7emrsYU25ikpfiU5Jhg9kTbQ==} + cpu: [x64] + os: [win32] + '@rollup/plugin-alias@5.1.1': resolution: {integrity: sha512-PR9zDb+rOzkRb2VD+EuKB7UC41vU5DIwZ5qqCpk0KJudcWAyi8rvYOhS7+L5aZCspw1stTViLgN5v6FF1p5cgQ==} engines: {node: '>=14.0.0'} @@ -1981,56 +2264,67 @@ packages: resolution: {integrity: sha512-PsNAbcyv9CcecAUagQefwX8fQn9LQ4nZkpDboBOttmyffnInRy8R8dSg6hxxl2Re5QhHBf6FYIDhIj5v982ATQ==} cpu: [arm] os: [linux] + libc: [glibc] '@rollup/rollup-linux-arm-musleabihf@4.52.5': resolution: {integrity: sha512-Fw4tysRutyQc/wwkmcyoqFtJhh0u31K+Q6jYjeicsGJJ7bbEq8LwPWV/w0cnzOqR2m694/Af6hpFayLJZkG2VQ==} cpu: [arm] os: [linux] + libc: [musl] '@rollup/rollup-linux-arm64-gnu@4.52.5': resolution: {integrity: sha512-a+3wVnAYdQClOTlyapKmyI6BLPAFYs0JM8HRpgYZQO02rMR09ZcV9LbQB+NL6sljzG38869YqThrRnfPMCDtZg==} cpu: [arm64] os: [linux] + libc: [glibc] '@rollup/rollup-linux-arm64-musl@4.52.5': resolution: {integrity: sha512-AvttBOMwO9Pcuuf7m9PkC1PUIKsfaAJ4AYhy944qeTJgQOqJYJ9oVl2nYgY7Rk0mkbsuOpCAYSs6wLYB2Xiw0Q==} cpu: [arm64] os: [linux] + libc: [musl] '@rollup/rollup-linux-loong64-gnu@4.52.5': resolution: {integrity: sha512-DkDk8pmXQV2wVrF6oq5tONK6UHLz/XcEVow4JTTerdeV1uqPeHxwcg7aFsfnSm9L+OO8WJsWotKM2JJPMWrQtA==} cpu: [loong64] os: [linux] + libc: [glibc] '@rollup/rollup-linux-ppc64-gnu@4.52.5': resolution: {integrity: sha512-W/b9ZN/U9+hPQVvlGwjzi+Wy4xdoH2I8EjaCkMvzpI7wJUs8sWJ03Rq96jRnHkSrcHTpQe8h5Tg3ZzUPGauvAw==} cpu: [ppc64] os: [linux] + libc: [glibc] '@rollup/rollup-linux-riscv64-gnu@4.52.5': resolution: {integrity: sha512-sjQLr9BW7R/ZiXnQiWPkErNfLMkkWIoCz7YMn27HldKsADEKa5WYdobaa1hmN6slu9oWQbB6/jFpJ+P2IkVrmw==} cpu: [riscv64] os: [linux] + libc: [glibc] '@rollup/rollup-linux-riscv64-musl@4.52.5': resolution: {integrity: sha512-hq3jU/kGyjXWTvAh2awn8oHroCbrPm8JqM7RUpKjalIRWWXE01CQOf/tUNWNHjmbMHg/hmNCwc/Pz3k1T/j/Lg==} cpu: [riscv64] os: [linux] + libc: [musl] '@rollup/rollup-linux-s390x-gnu@4.52.5': resolution: {integrity: sha512-gn8kHOrku8D4NGHMK1Y7NA7INQTRdVOntt1OCYypZPRt6skGbddska44K8iocdpxHTMMNui5oH4elPH4QOLrFQ==} cpu: [s390x] os: [linux] + libc: [glibc] '@rollup/rollup-linux-x64-gnu@4.52.5': resolution: {integrity: sha512-hXGLYpdhiNElzN770+H2nlx+jRog8TyynpTVzdlc6bndktjKWyZyiCsuDAlpd+j+W+WNqfcyAWz9HxxIGfZm1Q==} cpu: [x64] os: [linux] + libc: [glibc] '@rollup/rollup-linux-x64-musl@4.52.5': resolution: {integrity: sha512-arCGIcuNKjBoKAXD+y7XomR9gY6Mw7HnFBv5Rw7wQRvwYLR7gBAgV7Mb2QTyjXfTveBNFAtPt46/36vV9STLNg==} cpu: [x64] os: [linux] + libc: [musl] '@rollup/rollup-openharmony-arm64@4.52.5': resolution: {integrity: sha512-QoFqB6+/9Rly/RiPjaomPLmR/13cgkIGfA40LHly9zcH1S0bN2HVFYk3a1eAyHQyjs3ZJYlXvIGtcCs5tko9Cw==} @@ -2216,24 +2510,28 @@ packages: engines: {node: '>= 10'} cpu: [arm64] os: [linux] + libc: [glibc] '@tailwindcss/oxide-linux-arm64-musl@4.1.17': resolution: {integrity: sha512-HvZLfGr42i5anKtIeQzxdkw/wPqIbpeZqe7vd3V9vI3RQxe3xU1fLjss0TjyhxWcBaipk7NYwSrwTwK1hJARMg==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] + libc: [musl] '@tailwindcss/oxide-linux-x64-gnu@4.1.17': resolution: {integrity: sha512-M3XZuORCGB7VPOEDH+nzpJ21XPvK5PyjlkSFkFziNHGLc5d6g3di2McAAblmaSUNl8IOmzYwLx9NsE7bplNkwQ==} engines: {node: '>= 10'} cpu: [x64] os: [linux] + libc: [glibc] '@tailwindcss/oxide-linux-x64-musl@4.1.17': resolution: {integrity: sha512-k7f+pf9eXLEey4pBlw+8dgfJHY4PZ5qOUFDyNf7SI6lHjQ9Zt7+NcscjpwdCEbYi6FI5c2KDTDWyf2iHcCSyyQ==} engines: {node: '>= 10'} cpu: [x64] os: [linux] + libc: [musl] '@tailwindcss/oxide-wasm32-wasi@4.1.17': resolution: {integrity: sha512-cEytGqSSoy7zK4JRWiTCx43FsKP/zGr0CsuMawhH67ONlH+T79VteQeJQRO/X7L0juEUA8ZyuYikcRBf0vsxhg==} @@ -2358,9 +2656,6 @@ packages: '@types/node@12.20.55': resolution: {integrity: sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==} - '@types/node@24.9.1': - resolution: {integrity: sha512-QoiaXANRkSXK6p0Duvt56W208du4P9Uye9hWLWgGMDTEoKPhuenzNcC4vGUmrNkiOKTlIrBoyNQYNpSwfEZXSg==} - '@types/node@25.0.3': resolution: {integrity: sha512-W609buLVRVmeW693xKfzHeIV6nJGGz98uCPfeXI1ELMLXVeKYZ9m15fAMSaUPBHYLGFsVRcMmSCksQOrZV9BYA==} @@ -2405,6 +2700,11 @@ packages: '@ungap/structured-clone@1.2.0': resolution: {integrity: sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==} + '@valibot/to-json-schema@1.0.0': + resolution: {integrity: sha512-/9crJgPptVsGCL6X+JPDQyaJwkalSZ/52WuF8DiRUxJgcmpNdzYRfZ+gqMEP8W3CTVfuMWPqqvIgfwJ97f9Etw==} + peerDependencies: + valibot: ^1.0.0 + '@vercel/nft@0.27.7': resolution: {integrity: sha512-FG6H5YkP4bdw9Ll1qhmbxuE8KwW2E/g8fJpM183fWQLeVDGqzeywMIeJ9h2txdWZ03psgWMn6QymTxaDLmdwUg==} engines: {node: '>=16'} @@ -2537,6 +2837,10 @@ packages: resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} engines: {node: '>=12'} + ansis@3.17.0: + resolution: {integrity: sha512-0qWUglt9JEqLFr3w1I1pbrChn1grhaiAR2ocX1PP/flRmxgtwTzPFFFnfIlD6aMOLQZgSuCRlidD70lvx8yhzg==} + engines: {node: '>=14'} + ansis@4.2.0: resolution: {integrity: sha512-HqZ5rWlFjGiV0tDm3UxxgNRqsOTniqoKZu0pIAfh7TZQMGuZK+hH0drySty0si0QXj1ieop4+SkSfPZBPPkHig==} engines: {node: '>=14'} @@ -2588,6 +2892,10 @@ packages: resolution: {integrity: sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==} engines: {node: '>=12'} + ast-kit@1.4.3: + resolution: {integrity: sha512-MdJqjpodkS5J149zN0Po+HPshkTdUyrvF7CKTafUgv69vBSPtncrj+3IiUgqdd7ElIEkbeXCsEouBUwLrw9Ilg==} + engines: {node: '>=16.14.0'} + ast-module-types@5.0.0: resolution: {integrity: sha512-JvqziE0Wc0rXQfma0HZC/aY7URXHFuZV84fJRtP8u+lhp0JYCNd5wJzVXP45t0PH0Mej3ynlzvdyITYIu0G4LQ==} engines: {node: '>=14'} @@ -2701,6 +3009,10 @@ packages: magicast: optional: true + cac@6.7.14: + resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} + engines: {node: '>=8'} + call-bind-apply-helpers@1.0.1: resolution: {integrity: sha512-BhYE+WDaywFg2TBWYNXAE+8B1ATnThNBqXHP5nQu0jWJdVvY2hvkpyB3qOmtmDePiS5/BDQ8wASEWGMWRG148g==} engines: {node: '>= 0.4'} @@ -3084,6 +3396,10 @@ packages: didyoumean@1.2.2: resolution: {integrity: sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==} + diff@7.0.0: + resolution: {integrity: sha512-PJWHUb1RFevKCwaFA9RlG5tCd+FO5iRh9A8HEtkmBH2Li03iJriB6m6JIN4rGz3K3JLawI7/veA1xzRKP6ISBw==} + engines: {node: '>=0.3.1'} + diff@8.0.2: resolution: {integrity: sha512-sSuxWU5j5SR9QQji/o2qMvqRNYRDOcBTgsJ/DeCf4iSN4gW+gNMXM7wFIP+fdXZxoNiAnHUTGjCr+TSWXdRDKg==} engines: {node: '>=0.3.1'} @@ -3198,6 +3514,10 @@ packages: sqlite3: optional: true + dts-resolver@1.2.0: + resolution: {integrity: sha512-+xNF7raXYI1E3IFB+f3JqvoKYFI8R+1Mh9mpI75yNm3F5XuiC6ErEXe2Lqh9ach+4MQ1tOefzjxulhWGVclYbg==} + engines: {node: '>=20.18.0'} + dunder-proto@1.0.1: resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==} engines: {node: '>= 0.4'} @@ -3223,6 +3543,10 @@ packages: emoji-regex@9.2.2: resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} + empathic@1.1.0: + resolution: {integrity: sha512-rsPft6CK3eHtrlp9Y5ALBb+hfK+DWnA4WFebbazxjWyx8vSm3rZeoM3z9irsjcqO3PYRzlfv27XIB4tz2DV7RA==} + engines: {node: '>=14'} + empathic@2.0.0: resolution: {integrity: sha512-i6UzDscO/XfAcNYD75CfICkmfLedpyPDdozrLMmQc5ORaQcdMoc21OnlEylMIqI7U8eniKrPMxxtj8k0vhmJhA==} engines: {node: '>=14'} @@ -3549,16 +3873,17 @@ packages: glob@10.4.5: resolution: {integrity: sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==} + deprecated: Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me hasBin: true glob@7.2.3: resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} - deprecated: Glob versions prior to v9 are no longer supported + deprecated: Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me glob@8.1.0: resolution: {integrity: sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==} engines: {node: '>=12'} - deprecated: Glob versions prior to v9 are no longer supported + deprecated: Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me globby@11.1.0: resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} @@ -3994,24 +4319,28 @@ packages: engines: {node: '>= 12.0.0'} cpu: [arm64] os: [linux] + libc: [glibc] lightningcss-linux-arm64-musl@1.30.2: resolution: {integrity: sha512-5Vh9dGeblpTxWHpOx8iauV02popZDsCYMPIgiuw97OJ5uaDsL86cnqSFs5LZkG3ghHoX5isLgWzMs+eD1YzrnA==} engines: {node: '>= 12.0.0'} cpu: [arm64] os: [linux] + libc: [musl] lightningcss-linux-x64-gnu@1.30.2: resolution: {integrity: sha512-Cfd46gdmj1vQ+lR6VRTTadNHu6ALuw2pKR9lYq4FnhvgBc4zWY1EtZcAc6EffShbb1MFrIPfLDXD6Xprbnni4w==} engines: {node: '>= 12.0.0'} cpu: [x64] os: [linux] + libc: [glibc] lightningcss-linux-x64-musl@1.30.2: resolution: {integrity: sha512-XJaLUUFXb6/QG2lGIW6aIk6jKdtjtcffUT0NKvIqhSBY3hh9Ch+1LCeH80dR9q9LBjG3ewbDjnumefsLsP6aiA==} engines: {node: '>= 12.0.0'} cpu: [x64] os: [linux] + libc: [musl] lightningcss-win32-arm64-msvc@1.30.2: resolution: {integrity: sha512-FZn+vaj7zLv//D/192WFFVA0RgHawIcHqLX9xuWiQt7P0PtdFEVaxgF9rjM/IRYHQXNnk61/H/gb2Ei+kUQ4xQ==} @@ -4484,6 +4813,13 @@ packages: resolution: {integrity: sha512-dXeeGrfPJJ4rMdw+NrqiCRtbzVX2ogq//R0Xns08zql2HjV3Zi2SBJ65saqfDaJzd2bcHqvGWH+M44EQCHPAcA==} engines: {node: ^20.19.0 || >=22.12.0} + oxc-resolver@9.0.2: + resolution: {integrity: sha512-w838ygc1p7rF+7+h5vR9A+Y9Fc4imy6C3xPthCMkdFUgFvUWkmABeNB8RBDQ6+afk44Q60/UMMQ+gfDUW99fBA==} + + oxc-transform@0.67.0: + resolution: {integrity: sha512-QXwmpLfNrXZoHgIjEtDEf6lhwmvHouNtstNgg/UveczVIjo8VSzd5h25Ea96PoX9KzReJUY/qYa4QSNkJpZGfA==} + engines: {node: '>=14.0.0'} + oxc-transform@0.96.0: resolution: {integrity: sha512-dQPNIF+gHpSkmC0+Vg9IktNyhcn28Y8R3eTLyzn52UNymkasLicl3sFAtz7oEVuFmCpgGjaUTKkwk+jW2cHpDQ==} engines: {node: ^20.19.0 || >=22.12.0} @@ -4717,6 +5053,7 @@ packages: prebuild-install@7.1.3: resolution: {integrity: sha512-8Mf2cbV7x1cXPUILADGI3wuhfqWvtiLA1iclTDbFRZkgRQS0NqsPZphna9V+HyTEadheuPmjaJMsbzKQFOzLug==} engines: {node: '>=10'} + deprecated: No longer maintained. Please contact the author of the relevant native addon; alternatives are available. hasBin: true precinct@11.0.5: @@ -4769,6 +5106,9 @@ packages: quansync@0.2.11: resolution: {integrity: sha512-AifT7QEbW9Nri4tAwR5M/uzpBuqfZf+zwaEM/QkzEjj7NBuFD2rBuy0K3dE+8wltbezDV7JMA0WfnCPYRSYbXA==} + quansync@1.0.0: + resolution: {integrity: sha512-5xZacEEufv3HSTPQuchrvV6soaiACMFnq1H8wkVioctoH3TRha9Sz66lOxRwPK/qZj7HPiSveih9yAyh98gvqA==} + querystringify@2.2.0: resolution: {integrity: sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==} @@ -4850,9 +5190,6 @@ packages: resolution: {integrity: sha512-DJnGAeenTdpMEH6uAJRK/uiyEIH9WVsUmoLwzudwGJUwZPp80PDBWPHXSAGNPwNvIXAbe7MSUB1zQFugFml66A==} engines: {node: '>=4'} - regenerator-runtime@0.14.1: - resolution: {integrity: sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==} - regex-recursion@5.1.1: resolution: {integrity: sha512-ae7SBCbzVNrIjgSbh7wMznPcQel1DNlDtzensnFxpiNpXt1U2ju/bHugH422r+4LAVS1FpW1YCwilmnNsjum9w==} @@ -4912,6 +5249,25 @@ packages: resolution: {integrity: sha512-l0OE8wL34P4nJH/H2ffoaniAokM2qSmrtXHmlpvYr5AVVX8msAyW0l8NVJFDxlSK4u3Uh/f41cQheDVdnYijwQ==} hasBin: true + rolldown-plugin-dts@0.9.11: + resolution: {integrity: sha512-iCIRKmvPLwRV4UKSxhaBo+5wDkvc3+MFiqYYvu7sGLSohzxoDn9WEsjN3y7A6xg3aCuxHh6rlRp8xbX98r1rSg==} + engines: {node: '>=20.18.0'} + peerDependencies: + rolldown: ^1.0.0-beta.7 + typescript: ^5.0.0 + peerDependenciesMeta: + typescript: + optional: true + + rolldown@1.0.0-beta.8-commit.151352b: + resolution: {integrity: sha512-TCb6GVaFBk4wB0LERofFDxTO5X1/Sgahr7Yn5UA9XjuFtCwL1CyEhUHX5lUIstcMxjbkLjn2z4TAGwisr6Blvw==} + hasBin: true + peerDependencies: + '@oxc-project/runtime': 0.66.0 + peerDependenciesMeta: + '@oxc-project/runtime': + optional: true + rollup-plugin-visualizer@5.14.0: resolution: {integrity: sha512-VlDXneTDaKsHIw8yzJAFWtrzguoJ/LnQ+lMpoVfYJ3jJF4Ihe5oYLAqLklIK/35lgUY+1yEzCkHyZ1j4A5w5fA==} engines: {node: '>=18'} @@ -5284,12 +5640,12 @@ packages: tar@6.2.1: resolution: {integrity: sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==} engines: {node: '>=10'} - deprecated: Old versions of tar are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exhorbitant rates) by contacting i@izs.me + deprecated: Old versions of tar are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me tar@7.4.3: resolution: {integrity: sha512-5S7Va8hKfV7W5U6g3aYxXmlPoZVAwUMy9AOKyF2fVuZa2UD3qZjg578OrLRt8PcNN1PleVaL/5/yYATNL0ICUw==} engines: {node: '>=18'} - deprecated: Old versions of tar are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exhorbitant rates) by contacting i@izs.me + deprecated: Old versions of tar are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me term-size@2.2.1: resolution: {integrity: sha512-wK0Ri4fOGjv/XPy8SBHZChl8CM7uMc5VML7SqiQ0zG7+J5Vr+RMQDoHa2CNT6KHUnTGIXH34UDMkPzAUyapBZg==} @@ -5325,6 +5681,10 @@ packages: tinyexec@0.3.2: resolution: {integrity: sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==} + tinyexec@1.0.2: + resolution: {integrity: sha512-W/KYk+NFhkmsYpuHq5JykngiOCnxeVL8v8dFnqxSD8qEEdRfXk1SDM6JzNqcERbcGYj9tMrDQBYV9cjgnunFIg==} + engines: {node: '>=18'} + tinyglobby@0.2.15: resolution: {integrity: sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==} engines: {node: '>=12.0.0'} @@ -5394,12 +5754,22 @@ packages: ts-interface-checker@0.1.13: resolution: {integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==} + tsdown@0.9.9: + resolution: {integrity: sha512-IIGX55rkhaPomNSVrIbA58DRBwTO4ehlDTsw20XSooGqoEZbwpunDc1dRE73wKb1rHdwwBO6NMLOcgV2n1qhpA==} + engines: {node: '>=18.0.0'} + hasBin: true + peerDependencies: + publint: ^0.3.0 + unplugin-unused: ^0.4.0 + peerDependenciesMeta: + publint: + optional: true + unplugin-unused: + optional: true + tslib@1.14.1: resolution: {integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==} - tslib@2.8.0: - resolution: {integrity: sha512-jWVzBLplnCmoaTr13V9dYbiQ99wvZRd0vNWaDRg+aVYRcjDF3nDksxFDE/+fkXnKhpnUUkmx5pK/v8mCtLVqZA==} - tslib@2.8.1: resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} @@ -5417,10 +5787,6 @@ packages: tunnel-agent@0.6.0: resolution: {integrity: sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==} - type-fest@4.33.0: - resolution: {integrity: sha512-s6zVrxuyKbbAsSAD5ZPTB77q4YIdRctkTbJ2/Dqlinwz+8ooH2gd+YA7VA6Pa93KML9GockVvoxjZ2vHP+mu8g==} - engines: {node: '>=16'} - type-fest@4.41.0: resolution: {integrity: sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA==} engines: {node: '>=16'} @@ -5436,6 +5802,12 @@ packages: ultrahtml@1.6.0: resolution: {integrity: sha512-R9fBn90VTJrqqLDwyMph+HGne8eqY1iPfYhPzZrvKpIfwkWZbcYlfpsb8B9dTvBfpy1/hqAD7Wi8EKfP9e8zdw==} + unconfig-core@7.5.0: + resolution: {integrity: sha512-Su3FauozOGP44ZmKdHy2oE6LPjk51M/TRRjHv2HNCWiDvfvCoxC2lno6jevMA91MYAdCdwP05QnWdWpSbncX/w==} + + unconfig@7.5.0: + resolution: {integrity: sha512-oi8Qy2JV4D3UQ0PsopR28CzdQ3S/5A1zwsUwp/rosSbfhJ5z7b90bIyTwi/F7hCLD4SGcZVjDzd4XoUQcEanvA==} + uncrypto@0.1.3: resolution: {integrity: sha512-Ql87qFHB3s/De2ClA9e0gsnS6zXG27SkTiSJwjCc9MebbfapQfuPzumMIUMi38ezPZVNFcHI9sUIepeQfw8J8Q==} @@ -5494,6 +5866,10 @@ packages: resolution: {integrity: sha512-6bc58dPYhCMHHuwxldQxO3RRNZ4eCogZ/st++0+fcC1nr0jiGUtAdBJ2qzmLQWSxbtz42pWt4QQMiZ9HvZf5cg==} engines: {node: '>=0.10.0'} + unplugin-lightningcss@0.3.3: + resolution: {integrity: sha512-mMNRCNIcxc/3410w7sJdXcPxn0IGZdEpq42OBDyckdGkhOeWYZCG9RkHs72TFyBsS82a4agFDOFU8VrFKF2ZvA==} + engines: {node: '>=18.12.0'} + unplugin-utils@0.2.4: resolution: {integrity: sha512-8U/MtpkPkkk3Atewj1+RcKIjb5WBimZ/WSLhhR3w6SsIj8XJuKTacSP8g+2JhfSGw0Cb125Y+2zA/IzJZDVbhA==} engines: {node: '>=18.12.0'} @@ -5797,6 +6173,14 @@ packages: resolution: {integrity: sha512-XQegIaBTVUjSHliKqcnFqYypAd4S+WCYt5NIeRs6w/UAry7z8Y9j5ZwRRL4kzq9U3sD6v+85er9FvkEaBpji2w==} hasBin: true + valibot@1.0.0: + resolution: {integrity: sha512-1Hc0ihzWxBar6NGeZv7fPLY0QuxFMyxwYR2sF1Blu7Wq7EnremwY2W02tit2ij2VJT8HcSkHAQqmFfl77f73Yw==} + peerDependencies: + typescript: '>=5' + peerDependenciesMeta: + typescript: + optional: true + validate-html-nesting@1.2.3: resolution: {integrity: sha512-kdkWdCl6eCeLlRShJKbjVOU2kFKxMF8Ghu50n+crEoyx+VKm3FxAxF9z4DCy6+bbTOqNW0+jcIYRnjoIRzigRw==} @@ -6232,10 +6616,6 @@ snapshots: transitivePeerDependencies: - supports-color - '@babel/runtime@7.26.7': - dependencies: - regenerator-runtime: 0.14.1 - '@babel/runtime@7.28.4': {} '@babel/template@7.27.2': @@ -6456,17 +6836,17 @@ snapshots: '@emnapi/core@1.7.1': dependencies: '@emnapi/wasi-threads': 1.1.0 - tslib: 2.8.0 + tslib: 2.8.1 optional: true '@emnapi/runtime@1.7.1': dependencies: - tslib: 2.8.0 + tslib: 2.8.1 optional: true '@emnapi/wasi-threads@1.1.0': dependencies: - tslib: 2.8.0 + tslib: 2.8.1 optional: true '@envelop/instrumentation@1.0.0': @@ -6962,7 +7342,7 @@ snapshots: '@motionone/easing': 10.18.0 '@motionone/types': 10.17.1 '@motionone/utils': 10.18.0 - tslib: 2.8.0 + tslib: 2.8.1 '@motionone/dom@10.18.0': dependencies: @@ -6971,18 +7351,18 @@ snapshots: '@motionone/types': 10.17.1 '@motionone/utils': 10.18.0 hey-listen: 1.0.8 - tslib: 2.8.0 + tslib: 2.8.1 '@motionone/easing@10.18.0': dependencies: '@motionone/utils': 10.18.0 - tslib: 2.8.0 + tslib: 2.8.1 '@motionone/generators@10.18.0': dependencies: '@motionone/types': 10.17.1 '@motionone/utils': 10.18.0 - tslib: 2.8.0 + tslib: 2.8.1 '@motionone/types@10.17.1': {} @@ -6990,7 +7370,7 @@ snapshots: dependencies: '@motionone/types': 10.17.1 hey-listen: 1.0.8 - tslib: 2.8.0 + tslib: 2.8.1 '@mswjs/interceptors@0.37.6': dependencies: @@ -7002,6 +7382,13 @@ snapshots: strict-event-emitter: 0.5.1 optional: true + '@napi-rs/wasm-runtime@0.2.12': + dependencies: + '@emnapi/core': 1.7.1 + '@emnapi/runtime': 1.7.1 + '@tybys/wasm-util': 0.10.1 + optional: true + '@napi-rs/wasm-runtime@1.0.7': dependencies: '@emnapi/core': 1.7.1 @@ -7280,27 +7667,85 @@ snapshots: '@oxc-minify/binding-win32-x64-msvc@0.96.0': optional: true + '@oxc-project/types@0.66.0': {} + + '@oxc-resolver/binding-darwin-arm64@9.0.2': + optional: true + + '@oxc-resolver/binding-darwin-x64@9.0.2': + optional: true + + '@oxc-resolver/binding-freebsd-x64@9.0.2': + optional: true + + '@oxc-resolver/binding-linux-arm-gnueabihf@9.0.2': + optional: true + + '@oxc-resolver/binding-linux-arm64-gnu@9.0.2': + optional: true + + '@oxc-resolver/binding-linux-arm64-musl@9.0.2': + optional: true + + '@oxc-resolver/binding-linux-riscv64-gnu@9.0.2': + optional: true + + '@oxc-resolver/binding-linux-s390x-gnu@9.0.2': + optional: true + + '@oxc-resolver/binding-linux-x64-gnu@9.0.2': + optional: true + + '@oxc-resolver/binding-linux-x64-musl@9.0.2': + optional: true + + '@oxc-resolver/binding-wasm32-wasi@9.0.2': + dependencies: + '@napi-rs/wasm-runtime': 0.2.12 + optional: true + + '@oxc-resolver/binding-win32-arm64-msvc@9.0.2': + optional: true + + '@oxc-resolver/binding-win32-x64-msvc@9.0.2': + optional: true + '@oxc-transform/binding-android-arm64@0.96.0': optional: true + '@oxc-transform/binding-darwin-arm64@0.67.0': + optional: true + '@oxc-transform/binding-darwin-arm64@0.96.0': optional: true + '@oxc-transform/binding-darwin-x64@0.67.0': + optional: true + '@oxc-transform/binding-darwin-x64@0.96.0': optional: true '@oxc-transform/binding-freebsd-x64@0.96.0': optional: true + '@oxc-transform/binding-linux-arm-gnueabihf@0.67.0': + optional: true + '@oxc-transform/binding-linux-arm-gnueabihf@0.96.0': optional: true '@oxc-transform/binding-linux-arm-musleabihf@0.96.0': optional: true + '@oxc-transform/binding-linux-arm64-gnu@0.67.0': + optional: true + '@oxc-transform/binding-linux-arm64-gnu@0.96.0': optional: true + '@oxc-transform/binding-linux-arm64-musl@0.67.0': + optional: true + '@oxc-transform/binding-linux-arm64-musl@0.96.0': optional: true @@ -7310,20 +7755,37 @@ snapshots: '@oxc-transform/binding-linux-s390x-gnu@0.96.0': optional: true + '@oxc-transform/binding-linux-x64-gnu@0.67.0': + optional: true + '@oxc-transform/binding-linux-x64-gnu@0.96.0': optional: true + '@oxc-transform/binding-linux-x64-musl@0.67.0': + optional: true + '@oxc-transform/binding-linux-x64-musl@0.96.0': optional: true + '@oxc-transform/binding-wasm32-wasi@0.67.0': + dependencies: + '@napi-rs/wasm-runtime': 0.2.12 + optional: true + '@oxc-transform/binding-wasm32-wasi@0.96.0': dependencies: '@napi-rs/wasm-runtime': 1.0.7 optional: true + '@oxc-transform/binding-win32-arm64-msvc@0.67.0': + optional: true + '@oxc-transform/binding-win32-arm64-msvc@0.96.0': optional: true + '@oxc-transform/binding-win32-x64-msvc@0.67.0': + optional: true + '@oxc-transform/binding-win32-x64-msvc@0.96.0': optional: true @@ -7466,6 +7928,48 @@ snapshots: '@prisma/debug': 5.22.0 optional: true + '@quansync/fs@1.0.0': + dependencies: + quansync: 1.0.0 + + '@rolldown/binding-darwin-arm64@1.0.0-beta.8-commit.151352b': + optional: true + + '@rolldown/binding-darwin-x64@1.0.0-beta.8-commit.151352b': + optional: true + + '@rolldown/binding-freebsd-x64@1.0.0-beta.8-commit.151352b': + optional: true + + '@rolldown/binding-linux-arm-gnueabihf@1.0.0-beta.8-commit.151352b': + optional: true + + '@rolldown/binding-linux-arm64-gnu@1.0.0-beta.8-commit.151352b': + optional: true + + '@rolldown/binding-linux-arm64-musl@1.0.0-beta.8-commit.151352b': + optional: true + + '@rolldown/binding-linux-x64-gnu@1.0.0-beta.8-commit.151352b': + optional: true + + '@rolldown/binding-linux-x64-musl@1.0.0-beta.8-commit.151352b': + optional: true + + '@rolldown/binding-wasm32-wasi@1.0.0-beta.8-commit.151352b': + dependencies: + '@napi-rs/wasm-runtime': 0.2.12 + optional: true + + '@rolldown/binding-win32-arm64-msvc@1.0.0-beta.8-commit.151352b': + optional: true + + '@rolldown/binding-win32-ia32-msvc@1.0.0-beta.8-commit.151352b': + optional: true + + '@rolldown/binding-win32-x64-msvc@1.0.0-beta.8-commit.151352b': + optional: true + '@rollup/plugin-alias@5.1.1(rollup@4.52.5)': optionalDependencies: rollup: 4.52.5 @@ -7721,7 +8225,7 @@ snapshots: '@swc/helpers@0.5.5': dependencies: '@swc/counter': 0.1.3 - tslib: 2.8.0 + tslib: 2.8.1 '@tailwindcss/node@4.1.17': dependencies: @@ -7845,7 +8349,7 @@ snapshots: '@testing-library/dom@10.4.0': dependencies: '@babel/code-frame': 7.27.1 - '@babel/runtime': 7.26.7 + '@babel/runtime': 7.28.4 '@types/aria-query': 5.0.4 aria-query: 5.3.0 chalk: 4.1.2 @@ -7869,7 +8373,7 @@ snapshots: '@tybys/wasm-util@0.10.1': dependencies: - tslib: 2.8.0 + tslib: 2.8.1 optional: true '@types/aria-query@5.0.4': {} @@ -7938,11 +8442,6 @@ snapshots: '@types/node@12.20.55': {} - '@types/node@24.9.1': - dependencies: - undici-types: 7.16.0 - optional: true - '@types/node@25.0.3': dependencies: undici-types: 7.16.0 @@ -7964,7 +8463,7 @@ snapshots: '@types/yauzl@2.10.3': dependencies: - '@types/node': 24.9.1 + '@types/node': 25.0.3 optional: true '@typescript-eslint/types@5.62.0': {} @@ -7990,6 +8489,10 @@ snapshots: '@ungap/structured-clone@1.2.0': {} + '@valibot/to-json-schema@1.0.0(valibot@1.0.0(typescript@5.7.3))': + dependencies: + valibot: 1.0.0(typescript@5.7.3) + '@vercel/nft@0.27.7(rollup@4.52.5)': dependencies: '@mapbox/node-pre-gyp': 1.0.11 @@ -8112,7 +8615,7 @@ snapshots: '@whatwg-node/disposablestack@0.0.6': dependencies: '@whatwg-node/promise-helpers': 1.3.2 - tslib: 2.8.0 + tslib: 2.8.1 '@whatwg-node/fetch@0.10.13': dependencies: @@ -8124,11 +8627,11 @@ snapshots: '@fastify/busboy': 3.1.1 '@whatwg-node/disposablestack': 0.0.6 '@whatwg-node/promise-helpers': 1.3.2 - tslib: 2.8.0 + tslib: 2.8.1 '@whatwg-node/promise-helpers@1.3.2': dependencies: - tslib: 2.8.0 + tslib: 2.8.1 '@whatwg-node/server@0.10.17': dependencies: @@ -8144,7 +8647,7 @@ snapshots: '@whatwg-node/disposablestack': 0.0.6 '@whatwg-node/fetch': 0.10.13 '@whatwg-node/promise-helpers': 1.3.2 - tslib: 2.8.0 + tslib: 2.8.1 abbrev@1.1.1: {} @@ -8186,6 +8689,8 @@ snapshots: ansi-styles@6.2.1: {} + ansis@3.17.0: {} + ansis@4.2.0: {} any-promise@1.3.0: {} @@ -8240,6 +8745,11 @@ snapshots: assertion-error@2.0.1: {} + ast-kit@1.4.3: + dependencies: + '@babel/parser': 7.28.5 + pathe: 2.0.3 + ast-module-types@5.0.0: {} async-sema@3.1.1: {} @@ -8375,6 +8885,8 @@ snapshots: optionalDependencies: magicast: 0.3.5 + cac@6.7.14: {} + call-bind-apply-helpers@1.0.1: dependencies: es-errors: 1.3.0 @@ -8699,6 +9211,8 @@ snapshots: didyoumean@1.2.2: {} + diff@7.0.0: {} + diff@8.0.2: {} dir-glob@3.0.1: @@ -8713,7 +9227,7 @@ snapshots: dot-prop@9.0.0: dependencies: - type-fest: 4.33.0 + type-fest: 4.41.0 dotenv@16.5.0: {} @@ -8726,6 +9240,11 @@ snapshots: prisma: 5.22.0 optional: true + dts-resolver@1.2.0: + dependencies: + oxc-resolver: 9.0.2 + pathe: 2.0.3 + dunder-proto@1.0.1: dependencies: call-bind-apply-helpers: 1.0.1 @@ -8746,6 +9265,8 @@ snapshots: emoji-regex@9.2.2: {} + empathic@1.1.0: {} + empathic@2.0.0: optional: true @@ -9119,7 +9640,6 @@ snapshots: get-tsconfig@4.13.0: dependencies: resolve-pkg-maps: 1.0.0 - optional: true giget@2.0.0: dependencies: @@ -10222,6 +10742,35 @@ snapshots: '@oxc-minify/binding-win32-arm64-msvc': 0.96.0 '@oxc-minify/binding-win32-x64-msvc': 0.96.0 + oxc-resolver@9.0.2: + optionalDependencies: + '@oxc-resolver/binding-darwin-arm64': 9.0.2 + '@oxc-resolver/binding-darwin-x64': 9.0.2 + '@oxc-resolver/binding-freebsd-x64': 9.0.2 + '@oxc-resolver/binding-linux-arm-gnueabihf': 9.0.2 + '@oxc-resolver/binding-linux-arm64-gnu': 9.0.2 + '@oxc-resolver/binding-linux-arm64-musl': 9.0.2 + '@oxc-resolver/binding-linux-riscv64-gnu': 9.0.2 + '@oxc-resolver/binding-linux-s390x-gnu': 9.0.2 + '@oxc-resolver/binding-linux-x64-gnu': 9.0.2 + '@oxc-resolver/binding-linux-x64-musl': 9.0.2 + '@oxc-resolver/binding-wasm32-wasi': 9.0.2 + '@oxc-resolver/binding-win32-arm64-msvc': 9.0.2 + '@oxc-resolver/binding-win32-x64-msvc': 9.0.2 + + oxc-transform@0.67.0: + optionalDependencies: + '@oxc-transform/binding-darwin-arm64': 0.67.0 + '@oxc-transform/binding-darwin-x64': 0.67.0 + '@oxc-transform/binding-linux-arm-gnueabihf': 0.67.0 + '@oxc-transform/binding-linux-arm64-gnu': 0.67.0 + '@oxc-transform/binding-linux-arm64-musl': 0.67.0 + '@oxc-transform/binding-linux-x64-gnu': 0.67.0 + '@oxc-transform/binding-linux-x64-musl': 0.67.0 + '@oxc-transform/binding-wasm32-wasi': 0.67.0 + '@oxc-transform/binding-win32-arm64-msvc': 0.67.0 + '@oxc-transform/binding-win32-x64-msvc': 0.67.0 + oxc-transform@0.96.0: optionalDependencies: '@oxc-transform/binding-android-arm64': 0.96.0 @@ -10304,7 +10853,7 @@ snapshots: dependencies: '@babel/code-frame': 7.27.1 index-to-position: 0.1.2 - type-fest: 4.33.0 + type-fest: 4.41.0 parse5@7.3.0: dependencies: @@ -10507,6 +11056,8 @@ snapshots: quansync@0.2.11: {} + quansync@1.0.0: {} + querystringify@2.2.0: optional: true @@ -10547,14 +11098,14 @@ snapshots: dependencies: find-up-simple: 1.0.1 read-pkg: 9.0.1 - type-fest: 4.33.0 + type-fest: 4.41.0 read-pkg@9.0.1: dependencies: '@types/normalize-package-data': 2.4.4 normalize-package-data: 6.0.2 parse-json: 8.1.0 - type-fest: 4.33.0 + type-fest: 4.41.0 unicorn-magic: 0.1.0 read-yaml-file@1.1.0: @@ -10609,8 +11160,6 @@ snapshots: dependencies: redis-errors: 1.2.0 - regenerator-runtime@0.14.1: {} - regex-recursion@5.1.1: dependencies: regex: 5.1.1 @@ -10647,8 +11196,7 @@ snapshots: resolve-from@5.0.0: {} - resolve-pkg-maps@1.0.0: - optional: true + resolve-pkg-maps@1.0.0: {} resolve@1.22.11: dependencies: @@ -10672,6 +11220,44 @@ snapshots: dependencies: glob: 10.4.5 + rolldown-plugin-dts@0.9.11(rolldown@1.0.0-beta.8-commit.151352b(typescript@5.7.3))(typescript@5.7.3): + dependencies: + '@babel/generator': 7.28.5 + '@babel/parser': 7.28.5 + '@babel/types': 7.28.5 + ast-kit: 1.4.3 + debug: 4.4.3 + dts-resolver: 1.2.0 + get-tsconfig: 4.13.0 + oxc-transform: 0.67.0 + rolldown: 1.0.0-beta.8-commit.151352b(typescript@5.7.3) + optionalDependencies: + typescript: 5.7.3 + transitivePeerDependencies: + - supports-color + + rolldown@1.0.0-beta.8-commit.151352b(typescript@5.7.3): + dependencies: + '@oxc-project/types': 0.66.0 + '@valibot/to-json-schema': 1.0.0(valibot@1.0.0(typescript@5.7.3)) + ansis: 3.17.0 + valibot: 1.0.0(typescript@5.7.3) + optionalDependencies: + '@rolldown/binding-darwin-arm64': 1.0.0-beta.8-commit.151352b + '@rolldown/binding-darwin-x64': 1.0.0-beta.8-commit.151352b + '@rolldown/binding-freebsd-x64': 1.0.0-beta.8-commit.151352b + '@rolldown/binding-linux-arm-gnueabihf': 1.0.0-beta.8-commit.151352b + '@rolldown/binding-linux-arm64-gnu': 1.0.0-beta.8-commit.151352b + '@rolldown/binding-linux-arm64-musl': 1.0.0-beta.8-commit.151352b + '@rolldown/binding-linux-x64-gnu': 1.0.0-beta.8-commit.151352b + '@rolldown/binding-linux-x64-musl': 1.0.0-beta.8-commit.151352b + '@rolldown/binding-wasm32-wasi': 1.0.0-beta.8-commit.151352b + '@rolldown/binding-win32-arm64-msvc': 1.0.0-beta.8-commit.151352b + '@rolldown/binding-win32-ia32-msvc': 1.0.0-beta.8-commit.151352b + '@rolldown/binding-win32-x64-msvc': 1.0.0-beta.8-commit.151352b + transitivePeerDependencies: + - typescript + rollup-plugin-visualizer@5.14.0(rollup@4.52.5): dependencies: open: 8.4.2 @@ -10747,7 +11333,7 @@ snapshots: ms: 2.1.3 on-finished: 2.4.1 range-parser: 1.2.1 - statuses: 2.0.1 + statuses: 2.0.2 transitivePeerDependencies: - supports-color @@ -10985,8 +11571,7 @@ snapshots: statuses@2.0.1: {} - statuses@2.0.2: - optional: true + statuses@2.0.2: {} std-env@3.10.0: {} @@ -11178,6 +11763,8 @@ snapshots: tinyexec@0.3.2: {} + tinyexec@1.0.2: {} + tinyglobby@0.2.15: dependencies: fdir: 6.5.0(picomatch@4.0.3) @@ -11237,12 +11824,31 @@ snapshots: ts-interface-checker@0.1.13: {} - tslib@1.14.1: {} + tsdown@0.9.9(typescript@5.7.3): + dependencies: + ansis: 3.17.0 + cac: 6.7.14 + chokidar: 4.0.3 + consola: 3.4.2 + debug: 4.4.3 + diff: 7.0.0 + empathic: 1.1.0 + hookable: 5.5.3 + lightningcss: 1.30.2 + rolldown: 1.0.0-beta.8-commit.151352b(typescript@5.7.3) + rolldown-plugin-dts: 0.9.11(rolldown@1.0.0-beta.8-commit.151352b(typescript@5.7.3))(typescript@5.7.3) + tinyexec: 1.0.2 + tinyglobby: 0.2.15 + unconfig: 7.5.0 + unplugin-lightningcss: 0.3.3 + transitivePeerDependencies: + - '@oxc-project/runtime' + - supports-color + - typescript - tslib@2.8.0: {} + tslib@1.14.1: {} - tslib@2.8.1: - optional: true + tslib@2.8.1: {} tsutils@3.21.0(typescript@5.7.3): dependencies: @@ -11262,10 +11868,7 @@ snapshots: safe-buffer: 5.2.1 optional: true - type-fest@4.33.0: {} - - type-fest@4.41.0: - optional: true + type-fest@4.41.0: {} typescript@5.7.3: {} @@ -11273,6 +11876,19 @@ snapshots: ultrahtml@1.6.0: {} + unconfig-core@7.5.0: + dependencies: + '@quansync/fs': 1.0.0 + quansync: 1.0.0 + + unconfig@7.5.0: + dependencies: + '@quansync/fs': 1.0.0 + defu: 6.1.4 + jiti: 2.6.1 + quansync: 1.0.0 + unconfig-core: 7.5.0 + uncrypto@0.1.3: {} unctx@2.4.1: @@ -11352,6 +11968,12 @@ snapshots: dependencies: normalize-path: 2.1.1 + unplugin-lightningcss@0.3.3: + dependencies: + lightningcss: 1.30.2 + magic-string: 0.30.21 + unplugin: 2.3.2 + unplugin-utils@0.2.4: dependencies: pathe: 2.0.3 @@ -11462,6 +12084,10 @@ snapshots: uuid@13.0.0: optional: true + valibot@1.0.0(typescript@5.7.3): + optionalDependencies: + typescript: 5.7.3 + validate-html-nesting@1.2.3: {} validate-npm-package-license@3.0.4: