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..324b51027 --- /dev/null +++ b/apps/fixtures/image/src/routes/index.tsx @@ -0,0 +1,24 @@ +import { Image } from "@solidjs/image"; +import { Title } from "@solidjs/meta"; +import imageData from "../images/example.jpg?image"; + +const { src, transformer } = imageData; + +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..ddcbd2485 --- /dev/null +++ b/apps/fixtures/image/src/types.d.ts @@ -0,0 +1,55 @@ +/// + +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: { src: StartImageSource; transformer?: StartImageTransformer }; + export default props; +} + +declare module "*.png?image" { + const props: { src: StartImageSource; transformer?: StartImageTransformer }; + export default props; +} + +declare module "*.jpeg?image" { + const props: { src: StartImageSource; transformer?: StartImageTransformer }; + export default props; +} + +declare module "*.webp?image" { + const props: { src: StartImageSource; transformer?: StartImageTransformer }; + export default props; +} + +declare module "*.gif?image" { + const props: { src: StartImageSource; transformer?: StartImageTransformer }; + export default props; +} + +declare module "*.svg?image" { + const props: { src: 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..7333f38d7 --- /dev/null +++ b/apps/fixtures/image/vite.config.ts @@ -0,0 +1,52 @@ +import { defineConfig } from "vite"; +import { imagePlugin } from "../../../packages/image/src/vite"; +import { solidStart } from "../../../packages/start/src/config"; +import { nitroV2Plugin } from "../../../packages/start-nitro-v2-vite-plugin/src"; + +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(), + ], +}); 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..44728e416 --- /dev/null +++ b/packages/image/env.d.ts @@ -0,0 +1,33 @@ +/// + +import type { ImageProps } from "./dist/index"; + +declare module "*.jpg?image" { + const props: Pick, "src" | "transformer">; + export default props; +} + +declare module "*.png?image" { + const props: Pick, "src" | "transformer">; + export default props; +} + +declare module "*.jpeg?image" { + const props: Pick, "src" | "transformer">; + export default props; +} + +declare module "*.webp?image" { + const props: Pick, "src" | "transformer">; + export default props; +} + +declare module "*.gif?image" { + const props: Pick, "src" | "transformer">; + export default props; +} + +declare module "*.svg?image" { + const props: Pick, "src" | "transformer">; + export default props; +} diff --git a/packages/image/package.json b/packages/image/package.json new file mode 100644 index 000000000..bfe967d19 --- /dev/null +++ b/packages/image/package.json @@ -0,0 +1,46 @@ +{ + "name": "@solidjs/image", + "version": "0.1.0", + "type": "module", + "types": "./env.d.ts", + "scripts": { + "build": "tsdown", + "dev": "tsdown --watch", + "typecheck": "tsc --noEmit -p tsconfig.build.json", + "typecheck:dist": "pnpm build && pnpx @arethetypeswrong/cli --pack . --profile esm-only" + }, + "files": [ + "dist", + "env.d.ts", + "package.json", + "README.md" + ], + "exports": { + ".": "./dist/index.js", + "./vite": "./dist/vite.js", + "./env": "./env.d.ts" + }, + "publishConfig": { + "access": "public", + "exports": { + ".": "./dist/index.js", + "./vite": "./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" + }, + "peerDependencies": { + "solid-js": "^1.9.9", + "vite": "^7" + }, + "engines": { + "node": ">=22" + } +} diff --git a/packages/image/src/Image.tsx b/packages/image/src/Image.tsx new file mode 100644 index 000000000..b6bdea512 --- /dev/null +++ b/packages/image/src/Image.tsx @@ -0,0 +1,92 @@ +import type { JSX } from "solid-js"; +import { ssr as ssrHtml, isServer } from "solid-js/web"; +import type { StartImageSource, StartImageTransformer, StartImageVariant } from "./types"; + +export interface ImageProps { + src: StartImageSource; + alt: string; + transformer?: StartImageTransformer; + fallback?: (visible: () => boolean, onLoad: () => void) => JSX.Element; +} + +function mergeImageVariantsByType(variants: StartImageVariant[]) { + const map = new Map(); + for (const variant of variants) { + const arr = map.get(variant.type) || []; + arr.push(variant); + map.set(variant.type, arr); + } + return map; +} + +function mergeImageVariantsToSrcSet(variants: StartImageVariant[]) { + return variants.map(v => `${v.path} ${v.width}w`).join(","); +} + +export function Image(props: ImageProps): JSX.Element { + if (isServer) { + const variants = props.transformer + ? props.transformer.transform(props.src) + : []; + const variantArray = Array.isArray(variants) ? variants : [variants]; + + let html = `
`; + html += `
`; + html += ``; + + if (variantArray.length > 0) { + const merged = mergeImageVariantsByType(variantArray); + for (const [type, vars] of merged) { + const srcset = mergeImageVariantsToSrcSet(vars); + html += ``; + } + } + + html += `${props.alt}`; + html += `
`; + + return ssrHtml(html) as unknown as JSX.Element; + } + + return ( +
+
+ + {props.transformer && (() => { + const variants = props.transformer!.transform(props.src); + const variantArray = Array.isArray(variants) ? variants : [variants]; + const merged = mergeImageVariantsByType(variantArray); + return Array.from(merged).map(([type, vars]) => ( + + )); + })()} + {props.alt} + +
+
+ ); +} 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/image/src/create-lazy-render.ts b/packages/image/src/create-lazy-render.ts new file mode 100644 index 000000000..8d510c875 --- /dev/null +++ b/packages/image/src/create-lazy-render.ts @@ -0,0 +1,79 @@ +import { createEffect, createSignal, onCleanup } from "solid-js"; +import { isServer } from "solid-js/web"; + +export interface LazyRender { + ref: (value: T) => void; + visible: boolean; +} + +export interface LazyRenderOptions { + refresh?: boolean; +} + +export function createLazyRender( + options?: LazyRenderOptions, +): LazyRender { + const [visible, setVisible] = createSignal(false); + let element: T | null = null; + let observer: IntersectionObserver | null = null; + + function setupObserver(el: T) { + if (isServer) return; + + if (observer) { + observer.disconnect(); + } + + observer = new IntersectionObserver(entries => { + console.log("[lazy-render] intersection:", entries); + for (const entry of entries) { + if (entry.isIntersecting) { + console.log("[lazy-render] element is intersecting, setting visible to true"); + setVisible(true); + observer?.disconnect(); + } + } + }); + + observer.observe(el); + + // Check immediately in case element is already visible + requestAnimationFrame(() => { + if (!el || !observer) return; + const rect = el.getBoundingClientRect(); + const isVisible = rect.top < window.innerHeight && rect.bottom > 0; + console.log("[lazy-render] rect:", rect, "isVisible:", isVisible); + if (isVisible) { + setVisible(true); + observer.disconnect(); + } + }); + + // Also check after a short delay + setTimeout(() => { + if (!el || !observer) return; + const rect = el.getBoundingClientRect(); + const isVisible = rect.top < window.innerHeight && rect.bottom > 0; + console.log("[lazy-render] delayed check - isVisible:", isVisible); + if (isVisible) { + setVisible(true); + observer.disconnect(); + } + }, 100); + } + + return { + ref(value: T) { + console.log("[lazy-render] ref called with:", value); + element = value; + if (element && !isServer) { + setupObserver(element); + } + }, + get visible() { + const v = visible(); + console.log("[lazy-render] visible getter:", v); + return v; + }, + }; +} diff --git a/packages/image/src/index.tsx b/packages/image/src/index.tsx new file mode 100644 index 000000000..2d678e540 --- /dev/null +++ b/packages/image/src/index.tsx @@ -0,0 +1,3 @@ +export { Image } from "./Image.tsx"; +export { ClientOnly } from "./client-only"; +export type { ImageProps } 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 100% rename from packages/start/src/image/types.ts rename to packages/image/src/types.ts 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..34376b20e --- /dev/null +++ b/packages/image/tsdown.config.ts @@ -0,0 +1,32 @@ +import { defineConfig } from "tsdown"; + +export default defineConfig([ + { + entry: { + index: "src/index.tsx", + }, + format: ["esm"], + dts: true, + tsconfig: "tsconfig.build.json", + clean: true, + platform: "browser", + outExtensions: () => ({ + js: ".js", + }), + external: ["solid-js", "vite", "sharp"], + }, + { + 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/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/packages/start/src/image/create-lazy-render.ts b/packages/start/src/image/create-lazy-render.ts deleted file mode 100644 index d5b32d370..000000000 --- a/packages/start/src/image/create-lazy-render.ts +++ /dev/null @@ -1,62 +0,0 @@ -import { createEffect, createSignal, onCleanup } from "solid-js"; - -export interface LazyRender { - ref: (value: T) => void; - visible: boolean; -} - -export interface LazyRenderOptions { - refresh?: boolean; -} - -export function createLazyRender( - options?: LazyRenderOptions, -): LazyRender { - const [visible, setVisible] = createSignal(false); - - // We use a reactive ref here so that the component - // re-renders if the host element changes, therefore - // re-evaluating our intersection logic - const [ref, setRef] = createSignal(null); - - createEffect(() => { - // If the host changed, make sure that - // visibility is set to false - setVisible(false); - const shouldRefresh = options?.refresh; - - const current = ref(); - if (!current) { - return; - } - const observer = new IntersectionObserver(entries => { - for (const entry of entries) { - if (shouldRefresh) { - setVisible(entry.isIntersecting); - } else if (entry.isIntersecting) { - // Host intersected, set visibility to true - setVisible(true); - - // Stop observing - observer.disconnect(); - } - } - }); - - observer.observe(current); - - onCleanup(() => { - observer.unobserve(current); - observer.disconnect(); - }); - }); - - return { - ref(value) { - return setRef(() => value); - }, - get visible() { - return visible(); - }, - }; -} diff --git a/packages/start/src/image/index.tsx b/packages/start/src/image/index.tsx deleted file mode 100644 index 064e06faa..000000000 --- a/packages/start/src/image/index.tsx +++ /dev/null @@ -1,118 +0,0 @@ -import type { JSX } from "solid-js"; -import { createMemo, createSignal, For, Show } from "solid-js"; -import { ClientOnly } from "./client-only.tsx"; -import { createLazyRender } from "./create-lazy-render.ts"; -import { - createImageVariants, - mergeImageVariantsByType, - mergeImageVariantsToSrcSet, -} from "./transformer.ts"; -import type { StartImageSource, StartImageTransformer, StartImageVariant } from "./types.ts"; -import { getAspectRatioBoxStyle } from "./utils.ts"; - -import "./styles.css"; - -export interface StartImageProps { - src: StartImageSource; - alt: string; - transformer?: StartImageTransformer; - - onLoad?: () => void; - fallback: (visible: () => boolean, onLoad: () => void) => JSX.Element; - - crossOrigin?: JSX.HTMLCrossorigin | undefined; - fetchPriority?: "high" | "low" | "auto" | undefined; - decoding?: "sync" | "async" | "auto" | undefined; -} - -interface StartImageSourcesProps extends StartImageProps { - variants: StartImageVariant[]; -} - -function StartImageSources(props: StartImageSourcesProps): JSX.Element { - const mergedVariants = createMemo(() => { - const types = mergeImageVariantsByType(props.variants); - - const values: [type: string, srcset: string][] = []; - - for (const [key, variants] of types) { - values.push([key, mergeImageVariantsToSrcSet(variants)]); - } - - return values; - }); - - return ( - {([type, srcset]) => } - ); -} - -export function StartImage(props: StartImageProps): JSX.Element { - const [showPlaceholder, setShowPlaceholder] = createSignal(true); - const laze = createLazyRender(); - const [defer, setDefer] = createSignal(true); - - function onPlaceholderLoad() { - setDefer(false); - } - - const width = createMemo(() => props.src.width); - const height = createMemo(() => props.src.height); - - return ( -
-
- - }> - {cb => } - - - } - > - - {props.alt} { - if (!defer()) { - setShowPlaceholder(false); - props.onLoad?.(); - } - }} - style={{ - opacity: showPlaceholder() ? 0 : 1, - }} - crossOrigin={props.crossOrigin} - fetchpriority={props.fetchPriority} - decoding={props.decoding} - /> - - - -
-
- - {props.fallback(showPlaceholder, onPlaceholderLoad)} - -
-
- ); -} diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index d7f3e3a99..9599d9d4c 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,22 @@ 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) + packages/start: dependencies: '@babel/core': @@ -373,9 +413,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 +586,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'} @@ -1389,6 +1422,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==} @@ -1614,18 +1650,98 @@ 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] + + '@oxc-resolver/binding-linux-arm64-musl@9.0.2': + resolution: {integrity: sha512-lxx/PibBfzqYvut2Y8N2D0Ritg9H8pKO+7NUSJb9YjR/bfk2KRmP8iaUz3zB0JhPtf/W3REs65oKpWxgflGToA==} + cpu: [arm64] + os: [linux] + + '@oxc-resolver/binding-linux-riscv64-gnu@9.0.2': + resolution: {integrity: sha512-yD28ptS/OuNhwkpXRPNf+/FvrO7lwURLsEbRVcL1kIE0GxNJNMtKgIE4xQvtKDzkhk6ZRpLho5VSrkkF+3ARTQ==} + cpu: [riscv64] + os: [linux] + + '@oxc-resolver/binding-linux-s390x-gnu@9.0.2': + resolution: {integrity: sha512-WBwEJdspoga2w+aly6JVZeHnxuPVuztw3fPfWrei2P6rNM5hcKxBGWKKT6zO1fPMCB4sdDkFohGKkMHVV1eryQ==} + cpu: [s390x] + os: [linux] + + '@oxc-resolver/binding-linux-x64-gnu@9.0.2': + resolution: {integrity: sha512-a2z3/cbOOTUq0UTBG8f3EO/usFcdwwXnCejfXv42HmV/G8GjrT4fp5+5mVDoMByH3Ce3iVPxj1LmS6OvItKMYQ==} + cpu: [x64] + os: [linux] + + '@oxc-resolver/binding-linux-x64-musl@9.0.2': + resolution: {integrity: sha512-bHZF+WShYQWpuswB9fyxcgMIWVk4sZQT0wnwpnZgQuvGTZLkYJ1JTCXJMtaX5mIFHf69ngvawnwPIUA4Feil0g==} + cpu: [x64] + os: [linux] + + '@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 +1754,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,12 +1772,24 @@ 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] + '@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] + '@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] + '@oxc-transform/binding-linux-arm64-musl@0.96.0': resolution: {integrity: sha512-EiG/L3wEkPgTm4p906ufptyblBgtiQWTubGg/JEw82f8uLRroayr5zhbUqx40EgH037a3SfJthIyLZi7XPRFJw==} engines: {node: ^20.19.0 || >=22.12.0} @@ -1674,29 +1808,58 @@ packages: cpu: [s390x] os: [linux] + '@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] + '@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] + '@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] + '@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] + '@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} @@ -1875,6 +2038,69 @@ 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] + + '@rolldown/binding-linux-arm64-musl@1.0.0-beta.8-commit.151352b': + resolution: {integrity: sha512-odDjO2UtEEMAzwmLHEOKylJjQa+em1REAO9H19PA+O+lPu6evVbre5bqu8qCjEtHG1Q034LpZR86imCP2arb/w==} + cpu: [arm64] + os: [linux] + + '@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] + + '@rolldown/binding-linux-x64-musl@1.0.0-beta.8-commit.151352b': + resolution: {integrity: sha512-Fm1TxyeVE+gy74HM26CwbEOUndIoWAMgWkVDxYBD64tayvp5JvltpGHaqCg6x5i+X2F5XCDCItqwVlC7/mTxIw==} + cpu: [x64] + os: [linux] + + '@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'} @@ -2358,9 +2584,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 +2628,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 +2765,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 +2820,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 +2937,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 +3324,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 +3442,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 +3471,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 +3801,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==} @@ -4484,6 +4737,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 +4977,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 +5030,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 +5114,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 +5173,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 +5564,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 +5605,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 +5678,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 +5711,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 +5726,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 +5790,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 +6097,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 +6540,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 +6760,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 +7266,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 +7275,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 +7294,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 +7306,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 +7591,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 +7679,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 +7852,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 +8149,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 +8273,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 +8297,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 +8366,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 +8387,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 +8413,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 +8539,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 +8551,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 +8571,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 +8613,8 @@ snapshots: ansi-styles@6.2.1: {} + ansis@3.17.0: {} + ansis@4.2.0: {} any-promise@1.3.0: {} @@ -8240,6 +8669,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 +8809,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 +9135,8 @@ snapshots: didyoumean@1.2.2: {} + diff@7.0.0: {} + diff@8.0.2: {} dir-glob@3.0.1: @@ -8713,7 +9151,7 @@ snapshots: dot-prop@9.0.0: dependencies: - type-fest: 4.33.0 + type-fest: 4.41.0 dotenv@16.5.0: {} @@ -8726,6 +9164,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 +9189,8 @@ snapshots: emoji-regex@9.2.2: {} + empathic@1.1.0: {} + empathic@2.0.0: optional: true @@ -9119,7 +9564,6 @@ snapshots: get-tsconfig@4.13.0: dependencies: resolve-pkg-maps: 1.0.0 - optional: true giget@2.0.0: dependencies: @@ -10222,6 +10666,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 +10777,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 +10980,8 @@ snapshots: quansync@0.2.11: {} + quansync@1.0.0: {} + querystringify@2.2.0: optional: true @@ -10547,14 +11022,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 +11084,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 +11120,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 +11144,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 +11257,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 +11495,7 @@ snapshots: statuses@2.0.1: {} - statuses@2.0.2: - optional: true + statuses@2.0.2: {} std-env@3.10.0: {} @@ -11178,6 +11687,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 +11748,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 +11792,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 +11800,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 +11892,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 +12008,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: