diff --git a/.changeset/config.json b/.changeset/config.json index c3f4e98..d487186 100644 --- a/.changeset/config.json +++ b/.changeset/config.json @@ -4,13 +4,15 @@ "commit": false, "fixed": [ [ - "saykit", - "@saykit/react", - "@saykit/carbon", "@saykit/config", "@saykit/format-po", - "@saykit/babel-plugin", - "unplugin-saykit" + "saykit", + "@saykit/carbon", + "@saykit/react", + "babel-plugin-saykit", + "unplugin-saykit", + "@saykit/transform-js", + "@saykit/transform-jsx" ] ], "linked": [], diff --git a/.changeset/nine-zebras-greet.md b/.changeset/nine-zebras-greet.md index d4468e0..cba20a8 100644 --- a/.changeset/nine-zebras-greet.md +++ b/.changeset/nine-zebras-greet.md @@ -4,7 +4,7 @@ "saykit": patch "@saykit/carbon": patch "@saykit/react": patch -"@saykit/babel-plugin": patch +"babel-plugin-saykit": patch "unplugin-saykit": patch --- diff --git a/.changeset/silent-moose-wish.md b/.changeset/silent-moose-wish.md new file mode 100644 index 0000000..dba6d44 --- /dev/null +++ b/.changeset/silent-moose-wish.md @@ -0,0 +1,11 @@ +--- +"@saykit/react": patch +"unplugin-saykit": patch +"@saykit/transform-jsx": patch +"babel-plugin-saykit": patch +"@saykit/transform-js": patch +"@saykit/format-po": patch +"@saykit/config": patch +--- + +Split babel transformers into separate transform-js and transform-jsx packages diff --git a/.github/labeller.yml b/.github/labeller.yml index 38e4482..9999593 100644 --- a/.github/labeller.yml +++ b/.github/labeller.yml @@ -41,3 +41,11 @@ 'package: unplugin': - changed-files: - any-glob-to-any-file: ['packages/unplugin/**'] + +'package: transform-js': + - changed-files: + - any-glob-to-any-file: ['packages/transform-js/**'] + +'package: transform-jsx': + - changed-files: + - any-glob-to-any-file: ['packages/transform-jsx/**'] diff --git a/.github/labels.yml b/.github/labels.yml index f685e02..a70c92e 100644 --- a/.github/labels.yml +++ b/.github/labels.yml @@ -49,13 +49,21 @@ color: 84cc16 - name: 'package: babel-plugin' - description: Related to @saykit/babel-plugin + description: Related to babel-plugin-saykit color: f59e0b - name: 'package: unplugin' description: Related to unplugin-saykit color: 06b6d4 +- name: 'package: transform-js' + description: Related to @saykit/transform-js + color: 8b5cf6 + +- name: 'package: transform-jsx' + description: Related to @saykit/transform-jsx + color: ec4899 + # Labels primarily for both issues and pull requests - name: blocked diff --git a/.oxfmtrc.json b/.oxfmtrc.json index c4702a8..c9bfed1 100644 --- a/.oxfmtrc.json +++ b/.oxfmtrc.json @@ -1,5 +1,5 @@ { - "ignorePatterns": [".changeset/*.md"], + "ignorePatterns": [".changeset/*.md", "*.gen.ts"], "singleQuote": true, "experimentalSortImports": { "groups": ["builtin", "external", "internal", "parent", "sibling", "index", "unknown"], diff --git a/examples/carbon-tsdown/saykit.config.ts b/examples/carbon-tsdown/saykit.config.ts deleted file mode 100644 index eda11a4..0000000 --- a/examples/carbon-tsdown/saykit.config.ts +++ /dev/null @@ -1,14 +0,0 @@ -import { defineConfig } from '@saykit/config'; -import createFormatter from '@saykit/format-po'; - -export default defineConfig({ - sourceLocale: 'en', - locales: ['en', 'fr'], - buckets: [ - { - include: ['src/**/*.{ts,tsx}'], - output: 'src/locales/{locale}/messages.{extension}', - formatter: createFormatter(), - }, - ], -}); diff --git a/examples/carbon-tsdown/.dev.vars.example b/examples/carbon/.dev.vars.example similarity index 100% rename from examples/carbon-tsdown/.dev.vars.example rename to examples/carbon/.dev.vars.example diff --git a/examples/carbon-tsdown/.gitignore b/examples/carbon/.gitignore similarity index 100% rename from examples/carbon-tsdown/.gitignore rename to examples/carbon/.gitignore diff --git a/examples/carbon-tsdown/package.json b/examples/carbon/package.json similarity index 69% rename from examples/carbon-tsdown/package.json rename to examples/carbon/package.json index b841092..14657b2 100644 --- a/examples/carbon-tsdown/package.json +++ b/examples/carbon/package.json @@ -1,5 +1,5 @@ { - "name": "carbon-tsdown-example", + "name": "carbon-example", "private": true, "type": "module", "scripts": { @@ -10,17 +10,18 @@ "dev": "wrangler dev" }, "dependencies": { - "@buape/carbon": "0.14.0", + "@buape/carbon": "0.16.0", "@sapphire/snowflake": "^3.5.5", "@saykit/carbon": "workspace:^", "saykit": "workspace:^" }, "devDependencies": { - "@cloudflare/workers-types": "^4.20260210.0", + "@cloudflare/workers-types": "^4.20260417.1", "@saykit/config": "workspace:^", "@saykit/format-po": "workspace:^", - "typescript": "^5.9.3", + "@saykit/transform-js": "workspace:^", + "typescript": "^6.0.3", "unplugin-saykit": "workspace:^", - "wrangler": "^4.64.0" + "wrangler": "^4.83.0" } } diff --git a/examples/nextjs-babel/saykit.config.ts b/examples/carbon/saykit.config.ts similarity index 50% rename from examples/nextjs-babel/saykit.config.ts rename to examples/carbon/saykit.config.ts index eda11a4..71fa780 100644 --- a/examples/nextjs-babel/saykit.config.ts +++ b/examples/carbon/saykit.config.ts @@ -1,14 +1,16 @@ import { defineConfig } from '@saykit/config'; -import createFormatter from '@saykit/format-po'; +import createPoFormatter from '@saykit/format-po'; +import createJsTransformer from '@saykit/transform-js'; export default defineConfig({ sourceLocale: 'en', locales: ['en', 'fr'], buckets: [ { - include: ['src/**/*.{ts,tsx}'], + include: ['src/**/*.ts'], output: 'src/locales/{locale}/messages.{extension}', - formatter: createFormatter(), + formatter: createPoFormatter(), + transformer: createJsTransformer(), }, ], }); diff --git a/examples/carbon-tsdown/src/commands/about.ts b/examples/carbon/src/commands/about.ts similarity index 100% rename from examples/carbon-tsdown/src/commands/about.ts rename to examples/carbon/src/commands/about.ts diff --git a/examples/carbon-tsdown/src/commands/maths.ts b/examples/carbon/src/commands/maths.ts similarity index 100% rename from examples/carbon-tsdown/src/commands/maths.ts rename to examples/carbon/src/commands/maths.ts diff --git a/examples/carbon-tsdown/src/commands/ping.ts b/examples/carbon/src/commands/ping.ts similarity index 100% rename from examples/carbon-tsdown/src/commands/ping.ts rename to examples/carbon/src/commands/ping.ts diff --git a/examples/carbon-tsdown/src/commands/roll.ts b/examples/carbon/src/commands/roll.ts similarity index 100% rename from examples/carbon-tsdown/src/commands/roll.ts rename to examples/carbon/src/commands/roll.ts diff --git a/examples/carbon-tsdown/src/entry.ts b/examples/carbon/src/entry.ts similarity index 100% rename from examples/carbon-tsdown/src/entry.ts rename to examples/carbon/src/entry.ts diff --git a/examples/carbon-tsdown/src/i18n.ts b/examples/carbon/src/i18n.ts similarity index 100% rename from examples/carbon-tsdown/src/i18n.ts rename to examples/carbon/src/i18n.ts diff --git a/examples/carbon-tsdown/src/index.ts b/examples/carbon/src/index.ts similarity index 100% rename from examples/carbon-tsdown/src/index.ts rename to examples/carbon/src/index.ts diff --git a/examples/carbon-tsdown/src/locales/en/messages.po b/examples/carbon/src/locales/en/messages.po similarity index 100% rename from examples/carbon-tsdown/src/locales/en/messages.po rename to examples/carbon/src/locales/en/messages.po diff --git a/examples/carbon-tsdown/src/locales/fr/messages.po b/examples/carbon/src/locales/fr/messages.po similarity index 100% rename from examples/carbon-tsdown/src/locales/fr/messages.po rename to examples/carbon/src/locales/fr/messages.po diff --git a/examples/carbon-tsdown/tsconfig.json b/examples/carbon/tsconfig.json similarity index 100% rename from examples/carbon-tsdown/tsconfig.json rename to examples/carbon/tsconfig.json diff --git a/examples/carbon-tsdown/tsdown.config.ts b/examples/carbon/tsdown.config.ts similarity index 100% rename from examples/carbon-tsdown/tsdown.config.ts rename to examples/carbon/tsdown.config.ts diff --git a/examples/carbon-tsdown/wrangler.toml b/examples/carbon/wrangler.toml similarity index 100% rename from examples/carbon-tsdown/wrangler.toml rename to examples/carbon/wrangler.toml diff --git a/examples/nextjs-babel/.babelrc b/examples/nextjs-babel/.babelrc deleted file mode 100644 index 3f16912..0000000 --- a/examples/nextjs-babel/.babelrc +++ /dev/null @@ -1,4 +0,0 @@ -{ - "presets": ["next/babel"], - "plugins": ["@saykit/babel-plugin"] -} diff --git a/examples/nextjs/.babelrc b/examples/nextjs/.babelrc new file mode 100644 index 0000000..97c8101 --- /dev/null +++ b/examples/nextjs/.babelrc @@ -0,0 +1,4 @@ +{ + "presets": ["next/babel"], + "plugins": ["saykit"] +} diff --git a/examples/nextjs-babel/.gitignore b/examples/nextjs/.gitignore similarity index 100% rename from examples/nextjs-babel/.gitignore rename to examples/nextjs/.gitignore diff --git a/examples/nextjs-babel/next-env.d.ts b/examples/nextjs/next-env.d.ts similarity index 84% rename from examples/nextjs-babel/next-env.d.ts rename to examples/nextjs/next-env.d.ts index 20e7bcf..1511519 100644 --- a/examples/nextjs-babel/next-env.d.ts +++ b/examples/nextjs/next-env.d.ts @@ -1,6 +1,6 @@ /// /// -import './.next/dev/types/routes.d.ts'; +import './.next/types/routes.d.ts'; // NOTE: This file should not be edited // see https://nextjs.org/docs/app/api-reference/config/typescript for more information. diff --git a/examples/nextjs-babel/package.json b/examples/nextjs/package.json similarity index 50% rename from examples/nextjs-babel/package.json rename to examples/nextjs/package.json index b8be10f..5c092b0 100644 --- a/examples/nextjs-babel/package.json +++ b/examples/nextjs/package.json @@ -1,5 +1,5 @@ { - "name": "nextjs-babel-example", + "name": "nextjs-example", "private": true, "type": "module", "scripts": { @@ -12,15 +12,20 @@ }, "dependencies": { "@saykit/react": "workspace:^", - "next": "^16.1.6", - "react": "^19.2.4", - "react-dom": "^19.2.4", - "saykit": "workspace:^" + "next": "16.2.4", + "react": "^19.2.5", + "react-dom": "^19.2.5", + "saykit": "workspace:^", + "server-only": "^0.0.1" }, "devDependencies": { - "@saykit/babel-plugin": "workspace:^", "@saykit/config": "workspace:^", "@saykit/format-po": "workspace:^", - "@types/react": "^19.2.13" + "@saykit/transform-js": "workspace:^", + "@saykit/transform-jsx": "workspace:^", + "@types/node": "^25.6.0", + "@types/react": "^19.2.14", + "@types/react-dom": "^19.2.3", + "babel-plugin-saykit": "workspace:^" } } diff --git a/examples/nextjs/saykit.config.ts b/examples/nextjs/saykit.config.ts new file mode 100644 index 0000000..b8404f8 --- /dev/null +++ b/examples/nextjs/saykit.config.ts @@ -0,0 +1,17 @@ +import { defineConfig } from '@saykit/config'; +import createPoFormatter from '@saykit/format-po'; +import createJsTransformer from '@saykit/transform-js'; +import createJsxTransformer from '@saykit/transform-jsx'; + +export default defineConfig({ + sourceLocale: 'en', + locales: ['en', 'fr'], + buckets: [ + { + include: ['src/**/*.{ts,tsx}'], + output: 'src/locales/{locale}/messages.{extension}', + formatter: createPoFormatter(), + transformer: [createJsTransformer(), createJsxTransformer()], + }, + ], +}); diff --git a/examples/nextjs-babel/src/app/[locale]/client-component.tsx b/examples/nextjs/src/app/[locale]/client-component.tsx similarity index 100% rename from examples/nextjs-babel/src/app/[locale]/client-component.tsx rename to examples/nextjs/src/app/[locale]/client-component.tsx diff --git a/examples/nextjs-babel/src/app/[locale]/layout.tsx b/examples/nextjs/src/app/[locale]/layout.tsx similarity index 100% rename from examples/nextjs-babel/src/app/[locale]/layout.tsx rename to examples/nextjs/src/app/[locale]/layout.tsx diff --git a/examples/nextjs-babel/src/app/[locale]/page.tsx b/examples/nextjs/src/app/[locale]/page.tsx similarity index 100% rename from examples/nextjs-babel/src/app/[locale]/page.tsx rename to examples/nextjs/src/app/[locale]/page.tsx diff --git a/examples/nextjs-babel/src/app/[locale]/server-component.tsx b/examples/nextjs/src/app/[locale]/server-component.tsx similarity index 100% rename from examples/nextjs-babel/src/app/[locale]/server-component.tsx rename to examples/nextjs/src/app/[locale]/server-component.tsx diff --git a/examples/nextjs-babel/src/i18n.ts b/examples/nextjs/src/i18n.ts similarity index 100% rename from examples/nextjs-babel/src/i18n.ts rename to examples/nextjs/src/i18n.ts diff --git a/examples/nextjs-babel/src/locales/en/messages.po b/examples/nextjs/src/locales/en/messages.po similarity index 100% rename from examples/nextjs-babel/src/locales/en/messages.po rename to examples/nextjs/src/locales/en/messages.po diff --git a/examples/nextjs-babel/src/locales/fr/messages.po b/examples/nextjs/src/locales/fr/messages.po similarity index 100% rename from examples/nextjs-babel/src/locales/fr/messages.po rename to examples/nextjs/src/locales/fr/messages.po diff --git a/examples/nextjs-babel/src/proxy.ts b/examples/nextjs/src/proxy.ts similarity index 86% rename from examples/nextjs-babel/src/proxy.ts rename to examples/nextjs/src/proxy.ts index fe42ce2..f5213b4 100644 --- a/examples/nextjs-babel/src/proxy.ts +++ b/examples/nextjs/src/proxy.ts @@ -1,14 +1,16 @@ // TODO: abstract this away into @saykit/react/server, @saykit/next or something import { type NextRequest, NextResponse } from 'next/server'; -import saykitConfig from '../saykit.config'; + +const SOURCE_LOCALE = 'en'; +const LOCALES = ['en', 'fr']; export default function proxy(request: NextRequest) { let respondWith = NextResponse.next(); - const defaultLocale = saykitConfig.sourceLocale; + const defaultLocale = SOURCE_LOCALE; let pathLocale = fromUrlPathname(request.nextUrl.pathname); - if (pathLocale && !saykitConfig.locales.includes(pathLocale)) pathLocale = undefined; + if (pathLocale && !LOCALES.includes(pathLocale)) pathLocale = undefined; if (pathLocale === defaultLocale) { // Redirect /{defaultLocale} to / @@ -19,7 +21,7 @@ export default function proxy(request: NextRequest) { // else if (!pathLocale) { let cookieLocale = fromRequestCookies(request.cookies) ?? defaultLocale; - if (!saykitConfig.locales.includes(cookieLocale)) cookieLocale = defaultLocale; + if (!LOCALES.includes(cookieLocale)) cookieLocale = defaultLocale; request.nextUrl.pathname = `/${cookieLocale}${request.nextUrl.pathname}`; if (cookieLocale === defaultLocale) { diff --git a/examples/nextjs/tsconfig.json b/examples/nextjs/tsconfig.json new file mode 100644 index 0000000..7b19252 --- /dev/null +++ b/examples/nextjs/tsconfig.json @@ -0,0 +1,5 @@ +{ + "extends": "../../tsconfig.base.json", + "include": ["src/**/*", ".next/dev/types/**/*.ts", "next-env.d.ts"], + "compilerOptions": { "paths": { "~/*": ["./src/*"] } } +} diff --git a/examples/tanstack-start/.gitignore b/examples/tanstack-start/.gitignore new file mode 100644 index 0000000..10b8615 --- /dev/null +++ b/examples/tanstack-start/.gitignore @@ -0,0 +1,3 @@ +.tanstack/ +node_modules/ +src/locales/*/*.json \ No newline at end of file diff --git a/examples/tanstack-start/package.json b/examples/tanstack-start/package.json new file mode 100644 index 0000000..5bfc775 --- /dev/null +++ b/examples/tanstack-start/package.json @@ -0,0 +1,34 @@ +{ + "name": "tanstack-start-example", + "private": true, + "type": "module", + "sideEffects": false, + "scripts": { + "check": "tsc --noEmit", + "extract": "saykit extract", + "compile": "saykit compile", + "build": "vite build && tsc --noEmit", + "dev": "vite dev" + }, + "dependencies": { + "@saykit/react": "workspace:^", + "@tanstack/react-router": "^1.168.22", + "@tanstack/react-router-devtools": "^1.166.13", + "@tanstack/react-start": "^1.167.41", + "react": "^19.2.5", + "react-dom": "^19.2.5", + "saykit": "workspace:^" + }, + "devDependencies": { + "@saykit/config": "workspace:^", + "@saykit/format-po": "workspace:^", + "@saykit/transform-js": "workspace:^", + "@saykit/transform-jsx": "workspace:^", + "@types/node": "^25.6.0", + "@types/react": "^19.2.14", + "@types/react-dom": "^19.2.3", + "@vitejs/plugin-react": "^6.0.1", + "unplugin-saykit": "workspace:^", + "vite": "^8.0.8" + } +} diff --git a/examples/tanstack-start/saykit.config.ts b/examples/tanstack-start/saykit.config.ts new file mode 100644 index 0000000..b8404f8 --- /dev/null +++ b/examples/tanstack-start/saykit.config.ts @@ -0,0 +1,17 @@ +import { defineConfig } from '@saykit/config'; +import createPoFormatter from '@saykit/format-po'; +import createJsTransformer from '@saykit/transform-js'; +import createJsxTransformer from '@saykit/transform-jsx'; + +export default defineConfig({ + sourceLocale: 'en', + locales: ['en', 'fr'], + buckets: [ + { + include: ['src/**/*.{ts,tsx}'], + output: 'src/locales/{locale}/messages.{extension}', + formatter: createPoFormatter(), + transformer: [createJsTransformer(), createJsxTransformer()], + }, + ], +}); diff --git a/examples/tanstack-start/src/i18n.ts b/examples/tanstack-start/src/i18n.ts new file mode 100644 index 0000000..18ff8ba --- /dev/null +++ b/examples/tanstack-start/src/i18n.ts @@ -0,0 +1,11 @@ +import { Say } from 'saykit'; + +const say = new Say({ + locales: ['en', 'fr'], + messages: { + en: await import('./locales/en/messages.json').then((m) => m.default), + fr: await import('./locales/fr/messages.json').then((m) => m.default), + }, +}); + +export default say; diff --git a/examples/tanstack-start/src/locales/en/messages.po b/examples/tanstack-start/src/locales/en/messages.po new file mode 100644 index 0000000..645d445 --- /dev/null +++ b/examples/tanstack-start/src/locales/en/messages.po @@ -0,0 +1,15 @@ +msgid "" +msgstr "" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: en\n" +"X-Generator: saykit\n" + +msgid "Count: {count}" +msgstr "Count: {count}" + +msgid "Increment" +msgstr "Increment" + +msgid "Reset" +msgstr "Reset" diff --git a/examples/tanstack-start/src/locales/fr/messages.po b/examples/tanstack-start/src/locales/fr/messages.po new file mode 100644 index 0000000..b325550 --- /dev/null +++ b/examples/tanstack-start/src/locales/fr/messages.po @@ -0,0 +1,15 @@ +msgid "" +msgstr "" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: fr\n" +"X-Generator: saykit\n" + +msgid "Count: {count}" +msgstr "Compteur : {count}" + +msgid "Increment" +msgstr "Incrémenter" + +msgid "Reset" +msgstr "Réinitialiser" diff --git a/examples/tanstack-start/src/routeTree.gen.ts b/examples/tanstack-start/src/routeTree.gen.ts new file mode 100644 index 0000000..eada16c --- /dev/null +++ b/examples/tanstack-start/src/routeTree.gen.ts @@ -0,0 +1,99 @@ +/* eslint-disable */ + +// @ts-nocheck + +// noinspection JSUnusedGlobalSymbols + +// This file was automatically generated by TanStack Router. +// You should NOT make any changes in this file as it will be overwritten. +// Additionally, you should also exclude this file from your linter and/or formatter to prevent it from being checked or modified. + +import { Route as rootRouteImport } from './routes/__root' +import { Route as Char123LocaleChar125RouteRouteImport } from './routes/{-$locale}/route' +import { Route as Char123LocaleChar125IndexRouteImport } from './routes/{-$locale}/index' + +const Char123LocaleChar125RouteRoute = + Char123LocaleChar125RouteRouteImport.update({ + id: '/{-$locale}', + path: '/{-$locale}', + getParentRoute: () => rootRouteImport, + } as any) +const Char123LocaleChar125IndexRoute = + Char123LocaleChar125IndexRouteImport.update({ + id: '/', + path: '/', + getParentRoute: () => Char123LocaleChar125RouteRoute, + } as any) + +export interface FileRoutesByFullPath { + '/{-$locale}': typeof Char123LocaleChar125RouteRouteWithChildren + '/{-$locale}/': typeof Char123LocaleChar125IndexRoute +} +export interface FileRoutesByTo { + '/{-$locale}': typeof Char123LocaleChar125IndexRoute +} +export interface FileRoutesById { + __root__: typeof rootRouteImport + '/{-$locale}': typeof Char123LocaleChar125RouteRouteWithChildren + '/{-$locale}/': typeof Char123LocaleChar125IndexRoute +} +export interface FileRouteTypes { + fileRoutesByFullPath: FileRoutesByFullPath + fullPaths: '/{-$locale}' | '/{-$locale}/' + fileRoutesByTo: FileRoutesByTo + to: '/{-$locale}' + id: '__root__' | '/{-$locale}' | '/{-$locale}/' + fileRoutesById: FileRoutesById +} +export interface RootRouteChildren { + Char123LocaleChar125RouteRoute: typeof Char123LocaleChar125RouteRouteWithChildren +} + +declare module '@tanstack/react-router' { + interface FileRoutesByPath { + '/{-$locale}': { + id: '/{-$locale}' + path: '/{-$locale}' + fullPath: '/{-$locale}' + preLoaderRoute: typeof Char123LocaleChar125RouteRouteImport + parentRoute: typeof rootRouteImport + } + '/{-$locale}/': { + id: '/{-$locale}/' + path: '/' + fullPath: '/{-$locale}/' + preLoaderRoute: typeof Char123LocaleChar125IndexRouteImport + parentRoute: typeof Char123LocaleChar125RouteRoute + } + } +} + +interface Char123LocaleChar125RouteRouteChildren { + Char123LocaleChar125IndexRoute: typeof Char123LocaleChar125IndexRoute +} + +const Char123LocaleChar125RouteRouteChildren: Char123LocaleChar125RouteRouteChildren = + { + Char123LocaleChar125IndexRoute: Char123LocaleChar125IndexRoute, + } + +const Char123LocaleChar125RouteRouteWithChildren = + Char123LocaleChar125RouteRoute._addFileChildren( + Char123LocaleChar125RouteRouteChildren, + ) + +const rootRouteChildren: RootRouteChildren = { + Char123LocaleChar125RouteRoute: Char123LocaleChar125RouteRouteWithChildren, +} +export const routeTree = rootRouteImport + ._addFileChildren(rootRouteChildren) + ._addFileTypes() + +import type { getRouter } from './router.tsx' +import type { createStart } from '@tanstack/react-start' +declare module '@tanstack/react-start' { + interface Register { + ssr: true + router: Awaited> + } +} diff --git a/examples/tanstack-start/src/router.tsx b/examples/tanstack-start/src/router.tsx new file mode 100644 index 0000000..31c2f2d --- /dev/null +++ b/examples/tanstack-start/src/router.tsx @@ -0,0 +1,19 @@ +import { createRouter } from '@tanstack/react-router'; +import { routeTree } from './routeTree.gen'; + +export function getRouter() { + const router = createRouter({ + routeTree, + defaultErrorComponent: () => 'Error', + defaultNotFoundComponent: () => 'Not Found', + scrollRestoration: true, + }); + + return router; +} + +declare module '@tanstack/react-router' { + interface Register { + router: ReturnType; + } +} diff --git a/examples/tanstack-start/src/routes/__root.tsx b/examples/tanstack-start/src/routes/__root.tsx new file mode 100644 index 0000000..28ad184 --- /dev/null +++ b/examples/tanstack-start/src/routes/__root.tsx @@ -0,0 +1,44 @@ +import { HeadContent, Outlet, Scripts, createRootRoute } from '@tanstack/react-router'; +import { TanStackRouterDevtools } from '@tanstack/react-router-devtools'; +import * as React from 'react'; + +export const Route = createRootRoute({ + head: () => ({ + meta: [ + { + charSet: 'utf-8', + }, + { + name: 'viewport', + content: 'width=device-width, initial-scale=1', + }, + { + title: 'TanStack Start Starter', + }, + ], + }), + component: RootComponent, +}); + +function RootComponent() { + return ( + + + + + ); +} + +function RootDocument({ children }: { children: React.ReactNode }) { + return ( + + + + + + {children} + + + + ); +} diff --git a/examples/tanstack-start/src/routes/{-$locale}/index.tsx b/examples/tanstack-start/src/routes/{-$locale}/index.tsx new file mode 100644 index 0000000..093d6ce --- /dev/null +++ b/examples/tanstack-start/src/routes/{-$locale}/index.tsx @@ -0,0 +1,27 @@ +import { Say } from '@saykit/react'; +import { createFileRoute } from '@tanstack/react-router'; +import { useState } from 'react'; + +export const Route = createFileRoute('/{-$locale}/')({ + component: Home, +}); + +function Home() { + const [count, setCount] = useState(0); + + return ( +
+

+ Count: {count} +

+ + + + +
+ ); +} diff --git a/examples/tanstack-start/src/routes/{-$locale}/route.tsx b/examples/tanstack-start/src/routes/{-$locale}/route.tsx new file mode 100644 index 0000000..fd32c75 --- /dev/null +++ b/examples/tanstack-start/src/routes/{-$locale}/route.tsx @@ -0,0 +1,18 @@ +import { SayProvider } from '@saykit/react/client'; +import { createFileRoute, Outlet } from '@tanstack/react-router'; +import say from '../../i18n'; + +export const Route = createFileRoute('/{-$locale}')({ + component: RouteLayout, +}); + +function RouteLayout() { + const locale = say.match([Route.useParams().locale || 'en']); + const messages = say.activate(locale).messages; + + return ( + + + + ); +} diff --git a/examples/nextjs-babel/tsconfig.json b/examples/tanstack-start/tsconfig.json similarity index 50% rename from examples/nextjs-babel/tsconfig.json rename to examples/tanstack-start/tsconfig.json index 86a4dc1..070ea5d 100644 --- a/examples/nextjs-babel/tsconfig.json +++ b/examples/tanstack-start/tsconfig.json @@ -1,7 +1,7 @@ { - "extends": "../../tsconfig.react.json", - "include": ["${configDir}", ".next/types/**/*.ts"], + "extends": "../../tsconfig.base.json", "compilerOptions": { + "jsx": "preserve", "allowJs": true, "noEmit": true, "incremental": true diff --git a/examples/tanstack-start/vite.config.ts b/examples/tanstack-start/vite.config.ts new file mode 100644 index 0000000..ef04c98 --- /dev/null +++ b/examples/tanstack-start/vite.config.ts @@ -0,0 +1,11 @@ +import { tanstackStart } from '@tanstack/react-start/plugin/vite'; +import react from '@vitejs/plugin-react'; +import saykit from 'unplugin-saykit/vite'; +import { defineConfig } from 'vite'; + +export default defineConfig({ + server: { + port: 3000, + }, + plugins: [tanstackStart(), react(), saykit()], +}); diff --git a/package.json b/package.json index 7642a25..aaf7b0e 100644 --- a/package.json +++ b/package.json @@ -3,7 +3,8 @@ "private": true, "workspaces": [ "examples/*", - "packages/*" + "packages/*", + "website" ], "scripts": { "check": "turbo run check", @@ -22,18 +23,16 @@ "devDependencies": { "@changesets/cli": "^2.30.0", "@changesets/config": "^3.1.3", - "@types/node": "^25.2.3", - "@vitest/coverage-v8": "^4.0.18", + "@types/node": "^25.6.0", + "@vitest/coverage-v8": "^4.1.4", "husky": "^9.1.7", - "oxfmt": "^0.36.0", - "oxlint": "^1.51.0", + "oxfmt": "^0.45.0", + "oxlint": "^1.60.0", "ts-patch": "^3.3.0", - "tsdown": "^0.20.3", - "turbo": "^2.8.5", - "typescript": "^5.9.3", - "typescript-transform-paths": "^3.5.6", - "vite-tsconfig-paths": "^6.1.0", - "vitest": "^4.0.18" + "tsdown": "^0.21.9", + "turbo": "^2.9.6", + "typescript": "^6.0.3", + "vitest": "^4.1.4" }, - "packageManager": "pnpm@10.31.0" + "packageManager": "pnpm@10.33.0" } diff --git a/packages/config/package.json b/packages/config/package.json index 7ac3017..f28e182 100644 --- a/packages/config/package.json +++ b/packages/config/package.json @@ -30,6 +30,14 @@ ".": { "types": "./dist/index.d.mts", "default": "./dist/index.mjs" + }, + "./features/loader": { + "types": "./dist/features/loader/index.d.mts", + "default": "./dist/features/loader/index.mjs" + }, + "./features/messages": { + "types": "./dist/features/messages/index.d.mts", + "default": "./dist/features/messages/index.mjs" } }, "publishConfig": { @@ -38,21 +46,27 @@ }, "scripts": { "check": "tsc --noEmit", + "test": "vitest", + "coverage": "vitest run --coverage", "build": "tsdown", "prepack": "pnpm build" }, "dependencies": { "@commander-js/extra-typings": "^14.0.0", - "@saykit/babel-plugin": "workspace:*", "commander": "^14.0.3", - "picomatch": "^4.0.3", + "js-sha256": "^0.11.1", + "picomatch": "^4.0.4", "zod": "^4.3.6" }, "devDependencies": { - "@types/picomatch": "^4.0.2", - "typescript": "^5.9.3" + "@types/picomatch": "^4.0.3" }, "peerDependencies": { "typescript": "*" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } } diff --git a/packages/config/src/commands/build.ts b/packages/config/src/commands/build.ts index 3913cfa..7a17587 100644 --- a/packages/config/src/commands/build.ts +++ b/packages/config/src/commands/build.ts @@ -1,7 +1,7 @@ import { Command } from '@commander-js/extra-typings'; -import { useConfig } from '~/features/loader/resolve.js'; +import { resolveConfig } from '~/features/loader/resolve.js'; import Logger from '~/features/logger.js'; -import { BucketBuildWorker } from '~/features/worker.js'; +import { BucketBuildWorker } from '~/features/workers/build-worker.js'; export default new Command() .name('build') @@ -10,7 +10,7 @@ export default new Command() .option('-q, --quiet', 'suppress all logging', false) // .option('-w, --watch', 'watch source files for changes', false) .action(async (options) => { - const config = await useConfig('saykit'); + const config = await resolveConfig('saykit'); const logger = new Logger(options); logger.header('🏗 Building Messages'); @@ -20,5 +20,5 @@ export default new Command() // if (options.watch) await worker.watch(); }); - await Promise.allSettled(tasks); + await Promise.all(tasks); }); diff --git a/packages/config/src/commands/compile.ts b/packages/config/src/commands/compile.ts index 6c380e6..97568f0 100644 --- a/packages/config/src/commands/compile.ts +++ b/packages/config/src/commands/compile.ts @@ -1,14 +1,14 @@ import { Command } from '@commander-js/extra-typings'; -import { useConfig } from '~/features/loader/resolve.js'; +import { resolveConfig } from '~/features/loader/resolve.js'; import Logger from '~/features/logger.js'; -import { BucketCompileWorker } from '~/features/worker.js'; +import { BucketCompileWorker } from '~/features/workers/compile-worker.js'; export default new Command('compile') .description('Compile translations into runtime-ready locale files') .option('-v, --verbose', 'enable verbose logging', false) .option('-q, --quiet', 'suppress all logging', false) .action(async (options) => { - const config = await useConfig('saykit'); + const config = await resolveConfig('saykit'); const logger = new Logger(options); logger.header('🛠 Compiling Translations'); @@ -17,5 +17,5 @@ export default new Command('compile') await worker.compileAll(); }); - await Promise.allSettled(tasks); + await Promise.all(tasks); }); diff --git a/packages/config/src/commands/extract.ts b/packages/config/src/commands/extract.ts index 5473a37..b2c1c2c 100644 --- a/packages/config/src/commands/extract.ts +++ b/packages/config/src/commands/extract.ts @@ -1,14 +1,14 @@ import { Command } from '@commander-js/extra-typings'; -import { useConfig } from '~/features/loader/resolve.js'; +import { resolveConfig } from '~/features/loader/resolve.js'; import Logger from '~/features/logger.js'; -import { BucketExtractWorker } from '~/features/worker.js'; +import { BucketExtractWorker } from '~/features/workers/extract-worker.js'; export default new Command('extract') .description('Extract messages from source files') .option('-v, --verbose', 'enable verbose logging', false) .option('-q, --quiet', 'suppress all logging', false) .action(async (options) => { - const config = await useConfig('saykit'); + const config = await resolveConfig('saykit'); const logger = new Logger(options); logger.header('🛠 Extracting Messages'); @@ -18,5 +18,10 @@ export default new Command('extract') await worker.writeAll(); }); - await Promise.allSettled(tasks); + const results = await Promise.allSettled(tasks); + const rejections = results.filter((r): r is PromiseRejectedResult => r.status === 'rejected'); + if (rejections.length > 0) { + const errors = rejections.map((r) => r.reason).join('\n'); + throw new Error(`Bucket extraction failed:\n${errors}`); + } }); diff --git a/packages/config/src/define.ts b/packages/config/src/define.ts deleted file mode 100644 index 925a8cf..0000000 --- a/packages/config/src/define.ts +++ /dev/null @@ -1,6 +0,0 @@ -import type { input } from 'zod'; -import type { Configuration } from './shapes.js'; - -export function defineConfig>(config: C): C { - return config; -} diff --git a/packages/config/src/features/catalogue/extractor.ts b/packages/config/src/features/catalogue/extractor.ts new file mode 100644 index 0000000..169cc99 --- /dev/null +++ b/packages/config/src/features/catalogue/extractor.ts @@ -0,0 +1,17 @@ +import { readFile } from 'node:fs/promises'; +import { relative } from 'node:path'; +import type { Bucket, Message } from '~/shapes.js'; + +export async function extractMessagesFromFile(path: string, bucket: Bucket): Promise { + const content = await readFile(path, 'utf8').catch(() => ''); + if (!content) return []; + + const messages = bucket.transformer.extract(content, path); + return messages.map((message) => ({ + ...message, + translation: message.translation ?? message.message, + references: message.references.map((reference) => + relative(process.cwd(), reference).replaceAll('\\', '/'), + ), + })); +} diff --git a/packages/config/src/features/catalogue/merge.ts b/packages/config/src/features/catalogue/merge.ts new file mode 100644 index 0000000..d66840a --- /dev/null +++ b/packages/config/src/features/catalogue/merge.ts @@ -0,0 +1,53 @@ +import { generateHash } from '~/features/messages/hash.js'; +import type { Message } from '~/shapes.js'; + +function mergeUnique(...items: T[]) { + return Array.from(new Set(items.flat())); +} + +function getMessageKey(message: Message) { + return message.id ?? generateHash(message.message, message.context); +} + +export function mergeExtractedMessages(messages: Message[]) { + const mergedMessages = messages.reduce((map, message) => { + const key = getMessageKey(message); + const existing = map.get(key) ?? message; + + map.set(key, { + ...existing, + comments: mergeUnique(...existing.comments, ...message.comments), + references: mergeUnique(...existing.references, ...message.references), + }); + + return map; + }, new Map()); + + return Array.from(mergedMessages.values()); +} + +export function reconcileLocaleMessages(existingMessages: Message[], nextMessages: Message[]) { + const existingMessagesByKey = existingMessages.reduce((map, message) => { + map.set(getMessageKey(message), message); + return map; + }, new Map()); + + const reconciledMessages = nextMessages.reduce((map, message) => { + const key = getMessageKey(message); + const existingMessage = existingMessagesByKey.get(key); + + map.set(key, { + message: message.message, + translation: undefined, + ...existingMessage, + id: message.id, + context: message.context, + comments: message.comments, + references: message.references, + }); + + return map; + }, new Map()); + + return Array.from(reconciledMessages.values()); +} diff --git a/packages/config/src/features/catalogue/path.ts b/packages/config/src/features/catalogue/path.ts new file mode 100644 index 0000000..3c11021 --- /dev/null +++ b/packages/config/src/features/catalogue/path.ts @@ -0,0 +1,13 @@ +import { resolve } from 'node:path'; +import type { Bucket } from '~/shapes.js'; + +export function expandBucketOutputPath( + bucket: Bucket, + locale: string, + extension = bucket.formatter.extension, +) { + const outputMessageTemplate = bucket.output + .replaceAll('{locale}', locale) + .replaceAll('{extension}', extension.slice(1)); + return resolve(outputMessageTemplate); +} diff --git a/packages/config/src/features/catalogue/storage.ts b/packages/config/src/features/catalogue/storage.ts new file mode 100644 index 0000000..f6bb175 --- /dev/null +++ b/packages/config/src/features/catalogue/storage.ts @@ -0,0 +1,25 @@ +import { mkdir, readFile, writeFile } from 'node:fs/promises'; +import { dirname } from 'node:path'; +import type { Bucket, Message } from '~/shapes.js'; +import { expandBucketOutputPath } from './path.js'; + +export async function readCatalogueMessages( + bucket: Bucket, + locale: string, + path = expandBucketOutputPath(bucket, locale), +) { + const content = await readFile(path, 'utf8').catch(() => ''); + if (!content) return []; + return bucket.formatter.parse(content, { locale }); +} + +export async function writeCatalogueMessages( + bucket: Bucket, + locale: string, + messages: Message[], + path = expandBucketOutputPath(bucket, locale), +) { + const content = bucket.formatter.stringify(messages, { locale }); + await mkdir(dirname(path), { recursive: true }); + await writeFile(path, content); +} diff --git a/packages/config/src/features/extract.ts b/packages/config/src/features/extract.ts deleted file mode 100644 index b90dba9..0000000 --- a/packages/config/src/features/extract.ts +++ /dev/null @@ -1,99 +0,0 @@ -import { mkdir, readFile, writeFile } from 'node:fs/promises'; -import { dirname, relative, resolve } from 'node:path'; -import { collectMessages, generateHash } from '@saykit/babel-plugin/core'; -import type { Bucket, Message } from '~/shapes.js'; - -// - -export async function extractMessages(path: string): Promise { - const content = await readFile(path, 'utf8').catch(() => ''); - const messages = collectMessages(path, content); - return messages.map((m) => ({ - message: m.toICUString(), - translation: m.toICUString(), - id: m.descriptor.id, - context: m.descriptor.context, - comments: m.comments, - references: m.references // - .map((r) => relative(process.cwd(), r).replaceAll('\\', '/')), - })); -} - -function mergeUnique(...items: T[]) { - return Array.from(new Set(items.flat())); -} - -export function mergeMessages(messages: Message[]) { - const mergedMessages = messages.reduce((map, message) => { - const key = message.id ?? generateHash(message.message, message.context); - const existing = map.get(key) ?? message; - map.set(key, { - ...existing, - comments: mergeUnique(...existing.comments, ...message.comments), - references: mergeUnique(...existing.references, ...message.references), - }); - return map; - }, new Map()); - - return Array.from(mergedMessages.values()); -} - -export function reconcileMessages(existingMessages: Message[], newMessages: Message[]) { - const existingMessagesMap = existingMessages.reduce((map, message) => { - const key = message.id ?? generateHash(message.message, message.context); - map.set(key, message); - return map; - }, new Map()); - - const updatedMessagesMap = newMessages.reduce((map, message) => { - const key = message.id ?? generateHash(message.message, message.context); - const existingMessage = existingMessagesMap.get(key); - map.set(key, { - message: message.message, - translation: undefined, - ...existingMessage, - id: message.id, - context: message.context, - comments: message.comments, - references: message.references, - }); - return map; - }, new Map()); - - return Array.from(updatedMessagesMap.values()); -} - -// - -export function expandOutputPath( - bucket: Bucket, - locale: string, - extension = bucket.formatter.extension, -) { - const outputMessageTemplate = bucket.output - .replaceAll('{locale}', locale) - .replaceAll('{extension}', extension.slice(1)); - return resolve(outputMessageTemplate); -} - -export async function readMessagesFromDisk( - bucket: Bucket, - locale: string, - path = expandOutputPath(bucket, locale), -) { - const content = await readFile(path, 'utf8').catch(() => ''); - if (!content) return []; - const messages = await bucket.formatter.parse(content, { locale }); - return messages; -} - -export async function writeMessagesToDisk( - bucket: Bucket, - locale: string, - messages: Message[], - path = expandOutputPath(bucket, locale), -) { - const content = await bucket.formatter.stringify(messages, { locale }); - await mkdir(dirname(path), { recursive: true }); - await writeFile(path, content); -} diff --git a/packages/config/src/features/loader/explorer.ts b/packages/config/src/features/loader/explorer.ts deleted file mode 100644 index 4e7fcf9..0000000 --- a/packages/config/src/features/loader/explorer.ts +++ /dev/null @@ -1,26 +0,0 @@ -import { access, readFile } from 'node:fs/promises'; -import { join } from 'node:path'; - -function getFilesToTry(name: Name) { - return [ - `${name}.config.js`, - `${name}.config.cjs`, - `${name}.config.mjs`, - `${name}.config.ts`, - `${name}.config.mts`, - `${name}.config.cts`, - ] as const; -} - -export async function findConfigFile(moduleName: string, projectDir: string) { - for (const fileName of getFilesToTry(moduleName)) { - try { - const id = join(projectDir, fileName); - await access(id); - const content = await readFile(id, 'utf8'); - return { id, content }; - } catch {} - } - - return null; -} diff --git a/packages/config/src/features/loader/files.ts b/packages/config/src/features/loader/files.ts new file mode 100644 index 0000000..7002eeb --- /dev/null +++ b/packages/config/src/features/loader/files.ts @@ -0,0 +1,29 @@ +import { existsSync, readFileSync } from 'node:fs'; +import { join } from 'node:path'; + +const SUPPORTED_CONFIG_FILES = [ + 'saykit.config.js', + 'saykit.config.cjs', + 'saykit.config.mjs', + 'saykit.config.ts', + 'saykit.config.mts', + 'saykit.config.cts', +] as const; + +export function getConfigFileCandidates(name: string) { + return SUPPORTED_CONFIG_FILES.map((file) => file.replace('saykit', name)); +} + +export function findConfigFile(moduleName: string, projectDir: string) { + for (const fileName of getConfigFileCandidates(moduleName)) { + const id = join(projectDir, fileName); + if (!existsSync(id)) continue; + + return { + id, + content: readFileSync(id, 'utf8'), + }; + } + + return null; +} diff --git a/packages/config/src/features/loader/index.ts b/packages/config/src/features/loader/index.ts new file mode 100644 index 0000000..2dbab53 --- /dev/null +++ b/packages/config/src/features/loader/index.ts @@ -0,0 +1 @@ +export { resolveConfig } from './resolve.js'; diff --git a/packages/config/src/features/loader/loaders.ts b/packages/config/src/features/loader/loaders.ts deleted file mode 100644 index df8518a..0000000 --- a/packages/config/src/features/loader/loaders.ts +++ /dev/null @@ -1,65 +0,0 @@ -import { rm, writeFile } from 'node:fs/promises'; -import { createRequire } from 'node:module'; -import { dirname } from 'node:path'; -import { pathToFileURL } from 'node:url'; - -export type Loader = (path: string, content: string) => Promise; - -export const js: Loader = async (path, _content) => { - try { - const { href } = pathToFileURL(path); - const module = await import(href); - return module.default; - } catch (importError) { - try { - const require = globalThis.require ?? createRequire(path); - const module = require(path); - delete require.cache[require.resolve(path)]; - return module?.default ?? module; - } catch (requireError) { - throw new Error('Failed to import module', { - cause: [importError, requireError], - }); - } - } -}; - -export const ts: Loader = async (path, content) => { - const ts = await import('typescript'); - const outputPath = `${path}.${Date.now()}.js`; - - try { - const tsConfigPath = ts.findConfigFile(dirname(path), ts.sys.fileExists) || 'tsconfig.json'; - const { config: tsConfig, error } = ts // - .readConfigFile(tsConfigPath, ts.sys.readFile); - if (error) throw error; - - tsConfig.compilerOptions = { - ...tsConfig.compilerOptions, - module: ts.ModuleKind.ES2022, - moduleResolution: ts.ModuleResolutionKind.Bundler, - target: ts.ScriptTarget.ES2022, - noEmit: false, - }; - - const transpiledContent = ts.transpileModule(content, tsConfig).outputText; - await writeFile(outputPath, transpiledContent); - - return await js(outputPath, transpiledContent); - } catch (error) { - throw new Error('Failed to import module', { - cause: error, - }); - } finally { - if (ts.sys.fileExists(outputPath)) await rm(outputPath); - } -}; - -export default Object.freeze({ - '.js': js, - '.mjs': js, - '.cjs': js, - '.ts': ts, - '.mts': ts, - '.cts': ts, -}); diff --git a/packages/config/src/features/loader/module.ts b/packages/config/src/features/loader/module.ts new file mode 100644 index 0000000..afc1121 --- /dev/null +++ b/packages/config/src/features/loader/module.ts @@ -0,0 +1,55 @@ +import { rmSync, writeFileSync } from 'node:fs'; +import { createRequire } from 'node:module'; +import { dirname } from 'node:path'; + +export type Loader = (path: string, content: string) => unknown; + +function transpileAndRequire(path: string, content: string) { + const require = createRequire(path); + const ts = require('typescript'); + const outputPath = `${path}.${process.pid}.saykit.config.cjs`; + + try { + const tsConfigPath = ts.findConfigFile(dirname(path), ts.sys.fileExists); + const { config: tsConfig, error } = tsConfigPath + ? ts.readConfigFile(tsConfigPath, ts.sys.readFile) + : { config: {}, error: null }; + if (error) throw error; + + tsConfig.compilerOptions = { + ...tsConfig.compilerOptions, + allowJs: true, + esModuleInterop: true, + module: ts.ModuleKind.CommonJS, + moduleResolution: ts.ModuleResolutionKind.NodeJs, + target: ts.ScriptTarget.ES2022, + noEmit: false, + }; + + const transpiledContent = ts.transpileModule(content, tsConfig).outputText; + writeFileSync(outputPath, transpiledContent); + + const resolved = require.resolve(outputPath); + delete require.cache[resolved]; + + const module = require(outputPath); + delete require.cache[resolved]; + return module?.default ?? module; + } catch (error) { + throw new Error('Failed to import module', { cause: error }); + } finally { + if (ts.sys.fileExists(outputPath)) rmSync(outputPath); + } +} + +export const js: Loader = (path, content) => transpileAndRequire(path, content); +export const ts: Loader = (path, content) => transpileAndRequire(path, content); + +export const configLoaders = Object.freeze({ + '.js': js, + '.mjs': js, + '.cjs': js, + '.ts': ts, + '.mts': ts, + '.cts': ts, +}); diff --git a/packages/config/src/features/loader/resolve.ts b/packages/config/src/features/loader/resolve.ts index 96d5bff..d43d678 100644 --- a/packages/config/src/features/loader/resolve.ts +++ b/packages/config/src/features/loader/resolve.ts @@ -1,25 +1,27 @@ import { extname } from 'node:path'; import { Configuration } from '~/shapes.js'; -import { findConfigFile } from './explorer.js'; -import loaders from './loaders.js'; +import { findConfigFile } from './files.js'; +import { configLoaders } from './module.js'; -export async function useConfig(name = 'saykit') { - const file = await findConfigFile(name, process.cwd()); +function unwrapNamedConfig(config: object, name: string) { + if (!(name in config) || !config[name as keyof object]) return config; + return config[name as keyof object]; +} + +export function resolveConfig(name = 'saykit') { + const file = findConfigFile(name, process.cwd()); if (!file) throw new Error(`Could not find config file for "${name}"`); const ext = extname(file.id).toLowerCase(); - const loader = ext in loaders ? loaders[ext as keyof typeof loaders] : null; - if (!loader) throw new Error(`Unsupported config file type "${ext}" for "${name}"`); + const load = ext in configLoaders ? configLoaders[ext as keyof typeof configLoaders] : null; + if (!load) throw new Error(`Unsupported config file type "${ext}" for "${name}"`); - let config = await loader(file.id, file.content); + let config = load(file.id, file.content); if (!config || typeof config !== 'object') throw new Error(`Invalid config file for "${name}"`); - if (config && typeof config === 'object' && 'saykit' in config) config = config.saykit; + config = unwrapNamedConfig(config, name); - const result = await Configuration.safeParseAsync(config); - if (result.error) - throw new Error(`Invalid config file for "${name}"`, { - cause: result.error, - }); + const result = Configuration.safeParse(config); + if (result.error) throw new Error(`Invalid config file for "${name}"`, { cause: result.error }); return result.data; } diff --git a/packages/config/src/features/messages/convert.test.ts b/packages/config/src/features/messages/convert.test.ts new file mode 100644 index 0000000..12a977e --- /dev/null +++ b/packages/config/src/features/messages/convert.test.ts @@ -0,0 +1,121 @@ +import { describe, expect, it } from 'vitest'; +import { convertMessageToIcu } from './convert.js'; +import { + ArgumentMessage, + ChoiceMessage, + CompositeMessage, + ElementMessage, + LiteralMessage, +} from './types.js'; + +const dummy = undefined as any; + +describe('convertMessageToIcu', () => { + it('should generate literal messages', () => { + const message = new LiteralMessage('Hello'); + expect(convertMessageToIcu(message)) // + .toMatchInlineSnapshot('"Hello"'); + }); + + it('should generate argument messages', () => { + const message = new ArgumentMessage('name', dummy); + expect(convertMessageToIcu(message)) // + .toMatchInlineSnapshot('"{name}"'); + }); + + it('should generate element messages', () => { + const message = new ElementMessage('0', [new LiteralMessage('Hello world!')], dummy); + expect(convertMessageToIcu(message)) // + .toMatchInlineSnapshot('"<0>Hello world!"'); + }); + + it('should generate choice messages with numeric identifiers as `=n`', () => { + const message = new ChoiceMessage( + 'plural', + 'count', + [ + { identifier: '0', value: new LiteralMessage('none') }, + { identifier: 'one', value: new LiteralMessage('one') }, + { identifier: 'other', value: new LiteralMessage('many') }, + ], + dummy, + ); + expect(convertMessageToIcu(message)).toMatchInlineSnapshot(` + "{count, plural, + =0 {none} + one {one} + other {many} + }" + `); + }); + + it('should generate choice messages with ordinal kind', () => { + const message = new ChoiceMessage( + 'ordinal', + 'place', + [ + { identifier: '1', value: new LiteralMessage('first') }, + { identifier: '2', value: new LiteralMessage('second') }, + { identifier: '3', value: new LiteralMessage('third') }, + { identifier: 'other', value: new LiteralMessage('other') }, + ], + dummy, + ); + expect(convertMessageToIcu(message)).toMatchInlineSnapshot(` + "{place, selectordinal, + =1 {first} + =2 {second} + =3 {third} + other {other} + }" + `); + }); + + it('should generate choice messages with select kind', () => { + const message = new ChoiceMessage( + 'select', + 'gender', + [ + { identifier: 'male', value: new LiteralMessage('He') }, + { identifier: 'female', value: new LiteralMessage('She') }, + { identifier: 'other', value: new LiteralMessage('They') }, + ], + dummy, + ); + expect(convertMessageToIcu(message)).toMatchInlineSnapshot(` + "{gender, select, + male {He} + female {She} + other {They} + }" + `); + }); + + it('should generate composite messages', () => { + const message = new CompositeMessage( + {}, + [], + [], + [new LiteralMessage('Hello, '), new ArgumentMessage('name', dummy), new LiteralMessage('!')], + dummy, + ); + expect(convertMessageToIcu(message)) // + .toMatchInlineSnapshot('"Hello, {name}!"'); + }); + + it('should normalise jsx related whitespace', () => { + const message = new CompositeMessage( + {}, + [], + [], + [ + new LiteralMessage('\n Hello, '), + new ArgumentMessage('name', dummy), + new LiteralMessage('!\n'), + ], + dummy, + ); + expect(convertMessageToIcu(message)) // + .toMatchInlineSnapshot('"Hello, {name}!"'); + }); +}); diff --git a/packages/plugin-babel/src/core/messages/convert.ts b/packages/config/src/features/messages/convert.ts similarity index 71% rename from packages/plugin-babel/src/core/messages/convert.ts rename to packages/config/src/features/messages/convert.ts index 3c11b24..b47eac2 100644 --- a/packages/plugin-babel/src/core/messages/convert.ts +++ b/packages/config/src/features/messages/convert.ts @@ -14,23 +14,25 @@ export function convertMessageToIcu(message: Message) { return String(message.text); case message instanceof ArgumentMessage: - return `{${message.identifier}}`; + return `{${String(message.identifier)}}`; case message instanceof ElementMessage: { const children = message.children.map((m) => internalConvertMessageToIcu(m)).join(''); - return `<${message.identifier}>${children}`; + return `<${String(message.identifier)}>${children}`; } case message instanceof ChoiceMessage: { const branches = message.branches - .map(({ key, value }) => ({ - key: Number.isNaN(+key) ? key : `=${+key}`, + .map(({ identifier, value }) => ({ + identifier: Number.isNaN(+String(identifier)) + ? String(identifier) + : `=${+String(identifier)}`, value: internalConvertMessageToIcu(value), })) - .map(({ key, value }) => ` ${key} {${value}}\n`) + .map(({ identifier, value }) => ` ${identifier} {${value}}\n`) .join(''); const format = message.kind === 'ordinal' ? 'selectordinal' : message.kind; - return `{${message.identifier}, ${format},\n${branches}}`; + return `{${String(message.identifier)}, ${format},\n${branches}}`; } case message instanceof CompositeMessage: diff --git a/packages/plugin-babel/src/core/messages/hash.test.ts b/packages/config/src/features/messages/hash.test.ts similarity index 70% rename from packages/plugin-babel/src/core/messages/hash.test.ts rename to packages/config/src/features/messages/hash.test.ts index 135358b..10051ff 100644 --- a/packages/plugin-babel/src/core/messages/hash.test.ts +++ b/packages/config/src/features/messages/hash.test.ts @@ -4,22 +4,19 @@ import { generateHash } from './hash.js'; describe('generateHash', () => { it('should generate a hash from an input', () => { const hash = generateHash('my message'); - expect(hash) // - .toMatchInlineSnapshot('"vQhkQx"'); + expect(hash).toMatchInlineSnapshot('"vQhkQx"'); }); it('should generate a hash from an input and context', () => { const hash = generateHash('my message', 'some context'); - expect(hash) // - .toMatchInlineSnapshot('"NHsKx2"'); + expect(hash).toMatchInlineSnapshot('"NHsKx2"'); }); it('should generate different hashes for different contexts', () => { const withoutContext = generateHash('my message'); const withContext = generateHash('my message', 'some context'); - expect(withContext !== withoutContext) // - .toBeTruthy(); + expect(withContext === withoutContext).toBeFalsy(); }); it('should generate the same hash if context is falsy', () => { @@ -27,9 +24,7 @@ describe('generateHash', () => { const withUndefinedContext = generateHash('my message', undefined); const withEmptyStringContext = generateHash('my message', ''); - expect(withUndefinedContext === withoutContext) // - .toBeTruthy(); - expect(withEmptyStringContext === withoutContext) // - .toBeTruthy(); + expect(withUndefinedContext === withoutContext).toBeTruthy(); + expect(withEmptyStringContext === withoutContext).toBeTruthy(); }); }); diff --git a/packages/plugin-babel/src/core/messages/hash.ts b/packages/config/src/features/messages/hash.ts similarity index 100% rename from packages/plugin-babel/src/core/messages/hash.ts rename to packages/config/src/features/messages/hash.ts diff --git a/packages/config/src/features/messages/identifier.ts b/packages/config/src/features/messages/identifier.ts new file mode 100644 index 0000000..6d6cd24 --- /dev/null +++ b/packages/config/src/features/messages/identifier.ts @@ -0,0 +1,27 @@ +import { + ArgumentMessage, + ChoiceMessage, + CompositeMessage, + ElementMessage, + type Message, +} from './types.js'; + +export const AUTO_INCREMENT_IDENTIFIER = Symbol('auto-increment'); + +export function assignSequenceIdentifiers(message: Message, sequence = { current: 0 }) { + if ( + message instanceof ArgumentMessage || + message instanceof ElementMessage || + message instanceof ChoiceMessage + ) + if (message.identifier === AUTO_INCREMENT_IDENTIFIER) + message.identifier = `${sequence.current++}`; + if (message instanceof CompositeMessage || message instanceof ElementMessage) + for (const child of message.children) assignSequenceIdentifiers(child, sequence); + if (message instanceof ChoiceMessage) + for (const branch of message.branches) { + if (branch.identifier === AUTO_INCREMENT_IDENTIFIER) + branch.identifier = `${sequence.current++}`; + assignSequenceIdentifiers(branch.value, sequence); + } +} diff --git a/packages/config/src/features/messages/index.ts b/packages/config/src/features/messages/index.ts new file mode 100644 index 0000000..c829a8f --- /dev/null +++ b/packages/config/src/features/messages/index.ts @@ -0,0 +1,4 @@ +export * from './convert.js'; +export * from './hash.js'; +export * from './identifier.js'; +export * from './types.js'; diff --git a/packages/plugin-babel/src/core/messages/types.ts b/packages/config/src/features/messages/types.ts similarity index 60% rename from packages/plugin-babel/src/core/messages/types.ts rename to packages/config/src/features/messages/types.ts index 379f8b0..2e1dc35 100644 --- a/packages/plugin-babel/src/core/messages/types.ts +++ b/packages/config/src/features/messages/types.ts @@ -1,6 +1,6 @@ -import type * as t from '@babel/types'; import { convertMessageToIcu } from './convert.js'; import { generateHash } from './hash.js'; +import { AUTO_INCREMENT_IDENTIFIER } from './identifier.js'; abstract class Base { toICUString(this: Message) { @@ -8,7 +8,8 @@ abstract class Base { } toHashString(this: Message) { - return generateHash(this.toICUString()); + const context = this instanceof CompositeMessage ? this.descriptor.context : undefined; + return generateHash(this.toICUString(), context); } } @@ -20,8 +21,8 @@ export class LiteralMessage extends Base { export class ArgumentMessage extends Base { constructor( - public readonly identifier: string, - public readonly expression: t.Expression, + public identifier: string | typeof AUTO_INCREMENT_IDENTIFIER, + public readonly expression: any, ) { super(); } @@ -29,9 +30,9 @@ export class ArgumentMessage extends Base { export class ElementMessage extends Base { constructor( - public readonly identifier: string, + public identifier: string | typeof AUTO_INCREMENT_IDENTIFIER, public readonly children: Message[], - public readonly expression: t.Expression, + public readonly expression: any, ) { super(); } @@ -40,9 +41,12 @@ export class ElementMessage extends Base { export class ChoiceMessage extends Base { constructor( public readonly kind: string, - public readonly identifier: string, - public readonly branches: { key: string; value: Message }[], - public readonly expression: t.Expression, + public identifier: string | typeof AUTO_INCREMENT_IDENTIFIER, + public readonly branches: { + identifier: string | typeof AUTO_INCREMENT_IDENTIFIER; + readonly value: Message; + }[], + public readonly expression: any, ) { super(); } @@ -54,14 +58,10 @@ export class CompositeMessage extends Base { public readonly comments: string[], public readonly references: string[], public readonly children: Message[], - public readonly accessor: t.Expression, + public readonly accessor: any, ) { super(); } - - override toHashString() { - return generateHash(this.toICUString(), this.descriptor.context); - } } export type Message = diff --git a/packages/config/src/features/compile.ts b/packages/config/src/features/runtime/translations.ts similarity index 62% rename from packages/config/src/features/compile.ts rename to packages/config/src/features/runtime/translations.ts index c5ae42a..e13b1a5 100644 --- a/packages/config/src/features/compile.ts +++ b/packages/config/src/features/runtime/translations.ts @@ -1,10 +1,13 @@ import { mkdir, writeFile } from 'node:fs/promises'; import { dirname } from 'node:path'; -import { generateHash } from '@saykit/babel-plugin/core'; +import { expandBucketOutputPath } from '~/features/catalogue/path.js'; +import { generateHash } from '~/features/messages/hash.js'; import type { Bucket, Configuration, Message } from '~/shapes.js'; -import { expandOutputPath } from './extract.js'; +import { readCatalogueMessages } from '../catalogue/storage.js'; -// +function getFallbackLocaleChain(config: Configuration, locale: string) { + return [...(config.fallbackLocales?.[locale] ?? []), config.sourceLocale]; +} export async function hydrateTranslations( cache: Map>, @@ -14,17 +17,11 @@ export async function hydrateTranslations( messages: Message[], ) { if (cache.has(locale)) return cache.get(locale)!; - - const translations = // - await applyFallbackTranslations(cache, config, bucket, locale, messages); + const translations = await applyFallbackTranslations(cache, config, bucket, locale, messages); cache.set(locale, translations); return translations; } -function getFallbackChain(config: Configuration, locale: string) { - return [...(config.fallbackLocales?.[locale] ?? []), config.sourceLocale]; -} - export async function applyFallbackTranslations( cache: Map>, config: Configuration, @@ -32,8 +29,7 @@ export async function applyFallbackTranslations( locale: string, messages: Message[], ) { - const fallbacks = getFallbackChain(config, locale); - + const fallbackLocales = getFallbackLocaleChain(config, locale); const translations: Record = {}; for (const message of messages) { @@ -44,11 +40,14 @@ export async function applyFallbackTranslations( continue; } - for (const fallback of fallbacks) { + for (const fallbackLocale of fallbackLocales) { const fallbackMessages = // - await hydrateTranslations(cache, config, bucket, fallback, messages); - if (fallbackMessages[key]) { - translations[key] = fallbackMessages[key]; + await readCatalogueMessages(bucket, fallbackLocale); + const fallbackTranslations = // + await hydrateTranslations(cache, config, bucket, fallbackLocale, fallbackMessages); + + if (fallbackTranslations[key]) { + translations[key] = fallbackTranslations[key]; break; } } @@ -57,13 +56,11 @@ export async function applyFallbackTranslations( return translations; } -// - -export async function writeTranslationsToDisk( +export async function writeRuntimeTranslations( bucket: Bucket, locale: string, translations: Record, - path = expandOutputPath(bucket, locale, '.json'), + path = expandBucketOutputPath(bucket, locale, '.json'), ) { const content = JSON.stringify(translations, null, 2); await mkdir(dirname(path), { recursive: true }); diff --git a/packages/config/src/features/worker.ts b/packages/config/src/features/worker.ts deleted file mode 100644 index 708244c..0000000 --- a/packages/config/src/features/worker.ts +++ /dev/null @@ -1,132 +0,0 @@ -import { join, relative } from 'node:path'; -import type { Bucket, Configuration, Message } from '~/shapes.js'; -import { hydrateTranslations, writeTranslationsToDisk } from './compile.js'; -import { - extractMessages, - mergeMessages, - readMessagesFromDisk, - reconcileMessages, - writeMessagesToDisk, -} from './extract.js'; -import type Logger from './logger.js'; -import { globBucket, watchDebounced } from './watch.js'; - -function normalisePath(path: string) { - return relative(process.cwd(), path).replaceAll('\\', '/'); -} - -abstract class BucketWorker { - protected config: Configuration; - protected bucket: Bucket; - protected logger: Logger; - - constructor(config: Configuration, bucket: Bucket, logger: Logger) { - this.config = config; - this.bucket = bucket; - this.logger = logger; - } -} - -export class BucketExtractWorker extends BucketWorker { - private index = new Map(); - private get messages(): Message[] { - return Array.from(this.index.values()).flat(); - } - - private async indexPath(path: string) { - const rp = normalisePath(path); - this.logger.step(`Processing ${rp}`); - const messages = await extractMessages(path); - if (!messages.length) return false; - this.index.set(path, messages); - this.logger.step(`Found ${messages.length} messages(s) in ${rp}`); - return true; - } - - async scanAll() { - this.logger.info(`Scanning bucket: ${this.bucket.include}`); - const paths = await globBucket(this.bucket); - this.logger.step(`Found ${paths.length} file(s)`); - await Promise.all(paths.map((p) => this.indexPath(p))); - this.logger.info(`Total extracted messages: ${this.messages.length}`); - } - - async writeAll() { - const newMessages = mergeMessages(this.messages); - this.logger.info(`Writing ${newMessages.length} messages to locales`); - - for (const locale of this.config.locales) { - this.logger.step(`Writing locale file for ${locale} to disk`); - const existingMessages = await readMessagesFromDisk(this.bucket, locale); - const updatedMessages = - locale === this.config.sourceLocale - ? newMessages - : reconcileMessages(existingMessages, newMessages); - - await writeMessagesToDisk(this.bucket, locale, updatedMessages); - } - this.logger.success(`Extraction complete for bucket: ${this.bucket.include}`); - } - - async updatePath(path: string) { - const changed = await this.indexPath(path); - if (changed) await this.writeAll(); - return changed; - } -} - -export class BucketCompileWorker extends BucketWorker { - private cache = new Map>(); - - async compileAll() { - this.logger.info(`Compiling bucket: ${this.bucket.include}`); - for (const locale of this.config.locales) await this.compileLocale(locale); - this.logger.success(`Compilation complete for bucket: ${this.bucket.include}`); - } - - async compileLocale(locale: string) { - this.logger.step(`Compiling locale: ${locale}`); - const messages = await readMessagesFromDisk(this.bucket, locale); - const translations = await hydrateTranslations( - this.cache, - this.config, - this.bucket, - locale, - messages, - ); - this.logger.step(`Writing runtime file for ${locale}`); - await writeTranslationsToDisk(this.bucket, locale, translations); - } -} - -export class BucketBuildWorker extends BucketWorker { - extract: BucketExtractWorker; - compile: BucketCompileWorker; - - constructor(config: Configuration, bucket: Bucket, logger: Logger) { - super(config, bucket, logger); - this.extract = new BucketExtractWorker(config, bucket, logger); - this.compile = new BucketCompileWorker(config, bucket, logger); - } - - async buildAll() { - await this.extract.scanAll(); - await this.extract.writeAll(); - await this.compile.compileAll(); - } - - async watch() { - this.logger.header(`👀 Watching bucket for changes: ${this.bucket.include}`); - - for await (const event of watchDebounced('.', { recursive: true })) { - if (!event.filename || !this.bucket.match(event.filename)) continue; - - const filePath = join(process.cwd(), event.filename); - const changed = await this.extract.updatePath(filePath); - if (changed) { - this.logger.info(`Recompiling due to changes in ${normalisePath(filePath)}`); - await this.compile.compileAll(); - } - } - } -} diff --git a/packages/config/src/features/workers/build-worker.ts b/packages/config/src/features/workers/build-worker.ts new file mode 100644 index 0000000..2ccf442 --- /dev/null +++ b/packages/config/src/features/workers/build-worker.ts @@ -0,0 +1,41 @@ +import { join } from 'node:path'; +import type Logger from '~/features/logger.js'; +import { watchDebounced } from '~/features/watch.js'; +import type { Bucket, Configuration } from '~/shapes.js'; +import { BucketCompileWorker } from './compile-worker.js'; +import { BucketExtractWorker } from './extract-worker.js'; +import { BucketWorker, normalisePathForLogs } from './shared.js'; + +export class BucketBuildWorker extends BucketWorker { + extract: BucketExtractWorker; + compile: BucketCompileWorker; + + constructor(config: Configuration, bucket: Bucket, logger: Logger) { + const parameters = [config, bucket, logger] as const; + super(...parameters); + this.extract = new BucketExtractWorker(...parameters); + this.compile = new BucketCompileWorker(...parameters); + } + + async buildAll() { + await this.extract.scanAll(); + await this.extract.writeAll(); + await this.compile.compileAll(); + } + + async watch() { + this.logger.header(`👀 Watching bucket for changes: ${this.bucket.include}`); + + for await (const event of watchDebounced('.', { recursive: true })) { + if (!event.filename || !this.bucket.match(event.filename)) continue; + + const filePath = join(process.cwd(), event.filename); + const changed = await this.extract.updatePath(filePath); + + if (changed) { + this.logger.info(`Recompiling due to changes in ${normalisePathForLogs(filePath)}`); + await this.compile.compileAll(); + } + } + } +} diff --git a/packages/config/src/features/workers/compile-worker.ts b/packages/config/src/features/workers/compile-worker.ts new file mode 100644 index 0000000..18f2b73 --- /dev/null +++ b/packages/config/src/features/workers/compile-worker.ts @@ -0,0 +1,33 @@ +import { readCatalogueMessages } from '~/features/catalogue/storage.js'; +import { hydrateTranslations, writeRuntimeTranslations } from '~/features/runtime/translations.js'; +import { BucketWorker } from './shared.js'; + +export class BucketCompileWorker extends BucketWorker { + #translationsByLocale = new Map>(); + + async compileAll() { + this.logger.info(`Compiling bucket: ${this.bucket.include}`); + + for (const locale of this.config.locales) { + await this.compileLocale(locale); + } + + this.logger.success(`Compilation complete for bucket: ${this.bucket.include}`); + } + + async compileLocale(locale: string) { + this.logger.step(`Compiling locale: ${locale}`); + + const messages = await readCatalogueMessages(this.bucket, locale); + const translations = await hydrateTranslations( + this.#translationsByLocale, + this.config, + this.bucket, + locale, + messages, + ); + + this.logger.step(`Writing runtime file for ${locale}`); + await writeRuntimeTranslations(this.bucket, locale, translations); + } +} diff --git a/packages/config/src/features/workers/extract-worker.ts b/packages/config/src/features/workers/extract-worker.ts new file mode 100644 index 0000000..48a542b --- /dev/null +++ b/packages/config/src/features/workers/extract-worker.ts @@ -0,0 +1,68 @@ +import { extractMessagesFromFile } from '~/features/catalogue/extractor.js'; +import { mergeExtractedMessages, reconcileLocaleMessages } from '~/features/catalogue/merge.js'; +import { readCatalogueMessages, writeCatalogueMessages } from '~/features/catalogue/storage.js'; +import { globBucket } from '~/features/watch.js'; +import type { Message } from '~/shapes.js'; +import { BucketWorker, normalisePathForLogs } from './shared.js'; + +export class BucketExtractWorker extends BucketWorker { + #indexedMessagesByPath = new Map(); + + get messages(): Message[] { + return Array.from(this.#indexedMessagesByPath.values()).flat(); + } + + async #indexPath(path: string) { + const relativePath = normalisePathForLogs(path); + this.logger.step(`Processing ${relativePath}`); + + const messages = await extractMessagesFromFile(path, this.bucket); + if (!messages.length) { + if (this.#indexedMessagesByPath.has(path)) { + this.#indexedMessagesByPath.delete(path); + this.logger.step(`Removed stale entries for ${relativePath}`); + return true; + } + return false; + } + + this.#indexedMessagesByPath.set(path, messages); + this.logger.step(`Found ${messages.length} message(s) in ${relativePath}`); + return true; + } + + async scanAll() { + this.logger.info(`Scanning bucket: ${this.bucket.include}`); + + const paths = await globBucket(this.bucket); + this.logger.step(`Found ${paths.length} file(s)`); + await Promise.all(paths.map((path) => this.#indexPath(path))); + + this.logger.info(`Total extracted messages: ${this.messages.length}`); + } + + async writeAll() { + const mergedMessages = mergeExtractedMessages(this.messages); + this.logger.info(`Writing ${mergedMessages.length} messages to locales`); + + for (const locale of this.config.locales) { + this.logger.step(`Writing locale file for ${locale} to disk`); + + const existingMessages = await readCatalogueMessages(this.bucket, locale); + const nextMessages = + locale === this.config.sourceLocale + ? mergedMessages + : reconcileLocaleMessages(existingMessages, mergedMessages); + + await writeCatalogueMessages(this.bucket, locale, nextMessages); + } + + this.logger.success(`Extraction complete for bucket: ${this.bucket.include}`); + } + + async updatePath(path: string) { + const changed = await this.#indexPath(path); + if (changed) await this.writeAll(); + return changed; + } +} diff --git a/packages/config/src/features/workers/index.ts b/packages/config/src/features/workers/index.ts new file mode 100644 index 0000000..6c472ee --- /dev/null +++ b/packages/config/src/features/workers/index.ts @@ -0,0 +1,3 @@ +export { BucketBuildWorker } from './build-worker.js'; +export { BucketCompileWorker } from './compile-worker.js'; +export { BucketExtractWorker } from './extract-worker.js'; diff --git a/packages/config/src/features/workers/shared.ts b/packages/config/src/features/workers/shared.ts new file mode 100644 index 0000000..50d2ae2 --- /dev/null +++ b/packages/config/src/features/workers/shared.ts @@ -0,0 +1,19 @@ +import { relative } from 'node:path'; +import type Logger from '~/features/logger.js'; +import type { Bucket, Configuration } from '~/shapes.js'; + +export function normalisePathForLogs(path: string) { + return relative(process.cwd(), path).replaceAll('\\', '/'); +} + +export abstract class BucketWorker { + protected config: Configuration; + protected bucket: Bucket; + protected logger: Logger; + + constructor(config: Configuration, bucket: Bucket, logger: Logger) { + this.config = config; + this.bucket = bucket; + this.logger = logger; + } +} diff --git a/packages/config/src/index.ts b/packages/config/src/index.ts index f5a4c56..4e9e856 100644 --- a/packages/config/src/index.ts +++ b/packages/config/src/index.ts @@ -1,2 +1,8 @@ -export * from './define.js'; +import type { input } from 'zod'; +import { Configuration } from './shapes.js'; + +export function defineConfig>(config: C) { + return Configuration.parse(config); +} + export type * from './shapes.js'; diff --git a/packages/config/src/shapes.ts b/packages/config/src/shapes.ts index 628d946..c08a550 100644 --- a/packages/config/src/shapes.ts +++ b/packages/config/src/shapes.ts @@ -13,25 +13,44 @@ export type Message = z.infer; export const Formatter = z.object({ extension: z.templateLiteral(['.', z.string()]), - parse: z.custom<(content: string, context: { locale: string }) => Promise>( + parse: z.custom<(content: string, context: { locale: string }) => Message[]>( (v) => typeof v === 'function', ), - stringify: z.custom<(messages: Message[], context: { locale: string }) => Promise>( + stringify: z.custom<(messages: Message[], context: { locale: string }) => string>( (v) => typeof v === 'function', ), }); export type Formatter = z.infer; +export const Transformer = z.object({ + match: z.custom<(id: string) => boolean>((v) => typeof v === 'function'), + extract: z.custom<(code: string, id: string) => Message[]>((v) => typeof v === 'function'), + transform: z.custom<(code: string, id: string) => string>((v) => typeof v === 'function'), +}); +export type Transformer = z.infer; + export const Bucket = z .object({ - include: z.array(z.string()), - exclude: z.array(z.string()).optional(), + include: z.string().array(), + exclude: z.string().array().optional(), output: z.templateLiteral([z.string(), '{locale}', z.string(), '.{extension}']), formatter: Formatter, + transformer: Transformer.transform((t) => [t]) + .or(Transformer.array()) + .transform( + (t) => + ({ + match: (id: string) => t.some((t) => t.match(id)), + extract: (code: string, id: string) => + t.flatMap((t) => (t.match(id) ? t.extract(code, id) : [])), + transform: (code: string, id: string) => + t.reduce((p, t) => (t.match(id) ? t.transform(p, id) : p), code), + }) satisfies Transformer, + ), }) .transform((v) => ({ ...v, - match: picomatch(v.include, { ignore: v.exclude }), + match: picomatch(v.include, { ignore: v.exclude }) as (id: string) => boolean, })); export type Bucket = z.infer; @@ -39,8 +58,10 @@ export const Configuration = z .object({ sourceLocale: z.string(), locales: z.tuple([z.string()], z.string()), - fallbackLocales: z.record(z.string(), z.array(z.string())).optional(), - buckets: z.array(Bucket), + fallbackLocales: z.record(z.string(), z.string().array()).optional(), + buckets: Bucket.array(), }) - .refine((c) => c.sourceLocale === c.locales[0], 'sourceLocale must be the same as locales[0]'); + .refine((config) => config.sourceLocale === config.locales[0], { + error: 'sourceLocale must be the same as locales[0]', + }); export type Configuration = z.infer; diff --git a/packages/config/tsconfig.json b/packages/config/tsconfig.json index b560bec..c034c50 100644 --- a/packages/config/tsconfig.json +++ b/packages/config/tsconfig.json @@ -1 +1,4 @@ -{ "extends": "../../tsconfig.base.json" } +{ + "extends": "../../tsconfig.base.json", + "compilerOptions": { "paths": { "~/*": ["./src/*"] } } +} diff --git a/packages/config/tsdown.config.ts b/packages/config/tsdown.config.ts index f9d6529..b9fe239 100644 --- a/packages/config/tsdown.config.ts +++ b/packages/config/tsdown.config.ts @@ -1,5 +1,10 @@ import { defineConfig } from 'tsdown'; export default defineConfig({ - entry: ['src/index.ts', 'src/commands/index.ts'], + entry: [ + 'src/index.ts', + 'src/commands/index.ts', + 'src/features/loader/index.ts', + 'src/features/messages/index.ts', + ], }); diff --git a/packages/plugin-babel/vitest.config.ts b/packages/config/vitest.config.ts similarity index 69% rename from packages/plugin-babel/vitest.config.ts rename to packages/config/vitest.config.ts index d840f28..613c8e7 100644 --- a/packages/plugin-babel/vitest.config.ts +++ b/packages/config/vitest.config.ts @@ -1,8 +1,6 @@ -import tsconfigPaths from 'vite-tsconfig-paths'; import { defineConfig } from 'vitest/config'; export default defineConfig({ - plugins: [tsconfigPaths()], test: { coverage: { provider: 'v8', diff --git a/packages/format-po/src/formatter.ts b/packages/format-po/src/formatter.ts index 599f9f8..3aa52e1 100644 --- a/packages/format-po/src/formatter.ts +++ b/packages/format-po/src/formatter.ts @@ -1,11 +1,11 @@ import type { Formatter } from '@saykit/config'; import PO from 'pofile'; -function createFormatter(): Formatter { +function createPoFormatter(): Formatter { return { extension: '.po', - async parse(content, context) { + parse(content, context) { const po = PO.parse(content); if (!po.headers['X-Generator']?.startsWith('saykit')) @@ -30,7 +30,7 @@ function createFormatter(): Formatter { }); }, - async stringify(messages, context) { + stringify(messages, context) { const po = new PO(); po.headers['Content-Type'] = 'text/plain; charset=UTF-8'; @@ -59,4 +59,4 @@ function createFormatter(): Formatter { }; } -export default createFormatter; +export default createPoFormatter; diff --git a/packages/integration-carbon/package.json b/packages/integration-carbon/package.json index a58618e..cf794d9 100644 --- a/packages/integration-carbon/package.json +++ b/packages/integration-carbon/package.json @@ -40,7 +40,7 @@ "prepack": "pnpm build" }, "devDependencies": { - "@buape/carbon": "0.14.0", + "@buape/carbon": "0.16.0", "saykit": "workspace:^" }, "peerDependencies": { diff --git a/packages/integration-carbon/tsconfig.json b/packages/integration-carbon/tsconfig.json index b560bec..0ecefeb 100644 --- a/packages/integration-carbon/tsconfig.json +++ b/packages/integration-carbon/tsconfig.json @@ -1 +1,5 @@ -{ "extends": "../../tsconfig.base.json" } +{ + "extends": "../../tsconfig.base.json", + "exclude": ["dist"], + "compilerOptions": { "paths": { "~/*": ["./src/*"] } } +} diff --git a/packages/integration-react/package.json b/packages/integration-react/package.json index f7b1d54..a141ab3 100644 --- a/packages/integration-react/package.json +++ b/packages/integration-react/package.json @@ -51,8 +51,8 @@ "server-only": "^0.0.1" }, "devDependencies": { - "@types/react": "^19.2.13", - "react": "^19.2.4", + "@types/react": "^19.2.14", + "react": "^19.2.5", "saykit": "workspace:^" }, "peerDependencies": { diff --git a/packages/integration-react/src/components/renderer.ts b/packages/integration-react/src/components/renderer.ts index f123ba4..f6440fb 100644 --- a/packages/integration-react/src/components/renderer.ts +++ b/packages/integration-react/src/components/renderer.ts @@ -1,9 +1,13 @@ -import { createElement, Fragment, type PropsWithChildren, type ReactNode } from 'react'; +import { + type ComponentType, + createElement, + Fragment, + type PropsWithChildren, + type ReactNode, +} from 'react'; -type ComponentsMap = Record>; -type ComponentResolver = ( - tag?: string, -) => string | React.ComponentType | undefined; +type ComponentsMap = Record>; +type ComponentResolver = (tag?: string) => string | ComponentType | undefined; type ComponentsProp = ComponentsMap | ComponentResolver; export function Renderer({ html, components }: { html: string; components: ComponentsProp }) { diff --git a/packages/integration-react/tsconfig.json b/packages/integration-react/tsconfig.json index 00066ee..c034c50 100644 --- a/packages/integration-react/tsconfig.json +++ b/packages/integration-react/tsconfig.json @@ -1 +1,4 @@ -{ "extends": "../../tsconfig.react.json" } +{ + "extends": "../../tsconfig.base.json", + "compilerOptions": { "paths": { "~/*": ["./src/*"] } } +} diff --git a/packages/plugin-babel/package.json b/packages/plugin-babel/package.json index a057a28..67958fd 100644 --- a/packages/plugin-babel/package.json +++ b/packages/plugin-babel/package.json @@ -1,14 +1,14 @@ { - "name": "@saykit/babel-plugin", + "name": "babel-plugin-saykit", "version": "0.0.0", - "description": "Babel plugin for saykit macro transforms", + "description": "Babel plugin for SayKit", "keywords": [ - "babel", "i18n", - "macros", - "plugin", + "rollup", "saykit", - "transform" + "unplugin", + "vite", + "webpack" ], "homepage": "https://github.com/k0d13/saykit#readme", "bugs": { @@ -29,10 +29,6 @@ ".": { "types": "./dist/index.d.mts", "default": "./dist/index.mjs" - }, - "./core": { - "types": "./dist/core/index.d.mts", - "default": "./dist/core/index.mjs" } }, "publishConfig": { @@ -41,22 +37,16 @@ }, "scripts": { "check": "tsc --noEmit", - "test": "vitest", - "coverage": "vitest run --coverage", "build": "tsdown", "prepack": "pnpm build" }, "dependencies": { - "@babel/generator": "^7.29.1", - "@babel/parser": "^7.29.0", - "@babel/traverse": "^7.29.0", - "@babel/types": "^7.29.0", - "js-sha256": "^0.11.1" + "@babel/core": "^7.29.0", + "@babel/parser": "^7.29.2", + "@saykit/config": "workspace:^", + "@types/babel__core": "^7.20.5" }, "devDependencies": { - "@babel/core": "^7.29.0", - "@types/babel__core": "^7.20.5", - "@types/babel__generator": "^7.27.0", - "@types/babel__traverse": "^7.28.0" + "@types/babel__parser": "^7.1.5" } } diff --git a/packages/plugin-babel/src/core/context.ts b/packages/plugin-babel/src/core/context.ts deleted file mode 100644 index 6ea473b..0000000 --- a/packages/plugin-babel/src/core/context.ts +++ /dev/null @@ -1,26 +0,0 @@ -import type { Comment } from '@babel/types'; -import type { CompositeMessage } from './messages/types.js'; - -export class Context { - foundMessages: CompositeMessage[] = []; - identifierStore = new IdentifierStore(); - constructor(public readonly comments: Comment[] | null | undefined) {} -} - -export class IdentifierStore { - #current = 0; - - next() { - const id = this.#current; - this.#current += 1; - return id.toString(); - } - - back() { - this.#current -= 1; - } - - reset() { - this.#current = 0; - } -} diff --git a/packages/plugin-babel/src/core/index.ts b/packages/plugin-babel/src/core/index.ts deleted file mode 100644 index 1fe056d..0000000 --- a/packages/plugin-babel/src/core/index.ts +++ /dev/null @@ -1,2 +0,0 @@ -export { generateHash } from './messages/hash.js'; -export { collectMessages, transformCode } from './program.js'; diff --git a/packages/plugin-babel/src/core/messages/convert.test.ts b/packages/plugin-babel/src/core/messages/convert.test.ts deleted file mode 100644 index 1e15767..0000000 --- a/packages/plugin-babel/src/core/messages/convert.test.ts +++ /dev/null @@ -1,102 +0,0 @@ -import type { Expression } from '@babel/types'; -import { describe, expect, it } from 'vitest'; -import { convertMessageToIcu } from './convert.js'; -import { - ArgumentMessage, - ChoiceMessage, - CompositeMessage, - ElementMessage, - LiteralMessage, -} from './types.js'; - -const dummy = undefined as unknown as Expression; - -describe('convertMessageToIcu', () => { - it('should generate literal messages', () => { - const msg = new LiteralMessage('Hello'); - expect(convertMessageToIcu(msg)) // - .toMatchInlineSnapshot('"Hello"'); - }); - - it('should generate argument messages', () => { - const msg = new CompositeMessage( - {}, - [], - [], - [new LiteralMessage('Hello'), new LiteralMessage(' world!')], - dummy, - ); - expect(convertMessageToIcu(msg)) // - .toMatchInlineSnapshot('"Hello world!"'); - }); - - it('should generate argument messages', () => { - const msg = new ArgumentMessage('name', undefined as unknown as Expression); - expect(convertMessageToIcu(msg)) // - .toMatchInlineSnapshot('"{name}"'); - }); - - it('should generate element messages', () => { - const msg = new ElementMessage('0', [new LiteralMessage('Hello world!')], dummy); - expect(convertMessageToIcu(msg)) // - .toMatchInlineSnapshot('"<0>Hello world!"'); - }); - - it('should generate choice messages with numeric keys as `=n`', () => { - const msg = new ChoiceMessage( - 'plural', - 'count', - [ - { key: '0', value: new LiteralMessage('none') }, - { key: 'one', value: new LiteralMessage('one') }, - { key: 'other', value: new LiteralMessage('many') }, - ], - dummy, - ); - expect(convertMessageToIcu(msg)).toMatchInlineSnapshot(` - "{count, plural, - =0 {none} - one {one} - other {many} - }" - `); // - }); - - it('should generate choice messages with ordinal kind', () => { - const msg = new ChoiceMessage( - 'ordinal', - 'place', - [ - { key: '1', value: new LiteralMessage('first') }, - { key: '2', value: new LiteralMessage('second') }, - { key: '3', value: new LiteralMessage('third') }, - { key: 'other', value: new LiteralMessage('other') }, - ], - dummy, - ); - expect(convertMessageToIcu(msg)).toMatchInlineSnapshot(` - "{place, selectordinal, - =1 {first} - =2 {second} - =3 {third} - other {other} - }" - `); // - }); - - it('should normalise jsx related whitespace', () => { - const msg = new CompositeMessage( - {}, - [], - [], - [ - new LiteralMessage('\n Hello, '), - new ArgumentMessage('name', undefined as unknown as Expression), - new LiteralMessage('!\n'), - ], - dummy, - ); - expect(convertMessageToIcu(msg)) // - .toMatchInlineSnapshot('"Hello, {name}!"'); - }); -}); diff --git a/packages/plugin-babel/src/core/program.test.ts b/packages/plugin-babel/src/core/program.test.ts deleted file mode 100644 index f9d7275..0000000 --- a/packages/plugin-babel/src/core/program.test.ts +++ /dev/null @@ -1,260 +0,0 @@ -import { describe, expect, it } from 'vitest'; -import * as parser from './program.js'; - -describe('parseProgram', () => { - it('should parse JavaScript files', () => { - const code = 'const x = 42;'; - const result = parser.parseProgram('test.js', code); - - expect(result).not.toBeNull(); - expect(result!.context).toBeDefined(); - expect(result!.program).toBeDefined(); - }); - - it('should parse TypeScript files', () => { - const code = 'const x: number = 42;'; - const result = parser.parseProgram('test.ts', code); - - expect(result).not.toBeNull(); - expect(result!.context).toBeDefined(); - expect(result!.program).toBeDefined(); - }); - - it('should parse JSX files', () => { - const code = 'const element =
Hello
;'; - const result = parser.parseProgram('test.jsx', code); - - expect(result).not.toBeNull(); - expect(result!.context).toBeDefined(); - expect(result!.program).toBeDefined(); - }); - - it('should parse TypeScript JSX files', () => { - const code = 'const element: JSX.Element =
Hello
;'; - const result = parser.parseProgram('test.tsx', code); - - expect(result).not.toBeNull(); - expect(result!.context).toBeDefined(); - expect(result!.program).toBeDefined(); - }); - - it('should parse all supported extensions', () => { - const extensions = ['.js', '.cjs', '.mjs', '.jsx', '.ts', '.mts', '.cts', '.tsx']; - const code = 'const x = 42;'; - - extensions.forEach((ext) => { - const result = parser.parseProgram(`test${ext}`, code); - expect(result).not.toBeNull(); - }); - }); - - it('should return null for unsupported extensions', () => { - const code = 'const x = 42;'; - const unsupportedFiles = ['test.json', 'test.css', 'test.txt', 'test.html', 'test.py']; - - unsupportedFiles.forEach((file) => { - const result = parser.parseProgram(file, code); - expect(result).toBeNull(); - }); - }); - - it('should pass correct parser options', () => { - const code = 'const x = 42;'; - const result = parser.parseProgram('test.js', code); - - expect(result).not.toBeNull(); - // Program should be successfully parsed with the configured options - expect(result!.program.program).toBeDefined(); - expect(result!.program.program.type).toBe('Program'); - }); - - it('should extract comments', () => { - const code = ` - // This is a comment - const x = 42; - /* Another comment */ - `; - const result = parser.parseProgram('test.js', code); - - expect(result).not.toBeNull(); - expect(result!.context.comments).toBeDefined(); - expect(result!.context.comments!.length).toBeGreaterThan(0); - }); -}); - -describe('applyVisitor', () => { - it('should apply visitor to parsed program', () => { - const code = 'say`Hello World`;'; - const parseResult = parser.parseProgram('test.js', code); - expect(parseResult).not.toBeNull(); - - // Apply visitor - parser.applyVisitor(parseResult!.program, parseResult!.context); - - // Should have found a message - expect(parseResult!.context.foundMessages).toHaveLength(1); - }); - - it('should not crash on empty programs', () => { - const code = ''; - const parseResult = parser.parseProgram('test.js', code); - expect(parseResult).not.toBeNull(); - - if (parseResult) { - // Apply visitor - expect(() => { - parser.applyVisitor(parseResult.program, parseResult.context); - }).not.toThrow(); - } - }); -}); - -describe('printProgram', () => { - it('should print parsed program back to code', () => { - const code = 'const x = 42;'; - const result = parser.parseProgram('test.js', code); - - expect(result).not.toBeNull(); - - const printed = parser.printProgram(result!.program); - // Should return some string output (format may vary) - expect(typeof printed).toBe('object'); - expect(printed.code).toBeDefined(); - expect(printed.code.length).toBeGreaterThan(0); - }); - - it('should preserve comments', () => { - const code = '// Comment\nconst x = 42;'; - const result = parser.parseProgram('test.js', code); - - expect(result).not.toBeNull(); - - const printed = parser.printProgram(result!.program); - // Should return some string output - expect(typeof printed).toBe('object'); - expect(printed.code).toBeDefined(); - expect(printed.code.length).toBeGreaterThan(0); - }); - - it('should retain lines when possible', () => { - const code = 'const x = 42;\nconst y = 43;'; - const result = parser.parseProgram('test.js', code); - - expect(result).not.toBeNull(); - - const printed = parser.printProgram(result!.program); - // Should return some string output - expect(typeof printed).toBe('object'); - expect(printed.code).toBeDefined(); - expect(printed.code.length).toBeGreaterThan(0); - }); -}); - -describe('collectMessages', () => { - it('should extract messages from tagged templates', () => { - const code = 'say`Hello ${name}!`;'; - const messages = parser.collectMessages('test.js', code); - - expect(messages).toHaveLength(1); - if (messages[0]) { - expect(messages[0].descriptor).toEqual({ - id: undefined, - context: undefined, - }); - // Let's just check it has children (number may vary based on implementation) - expect(messages[0].children.length).toBeGreaterThan(0); - } - }); - - it('should extract messages from JSX', () => { - const code = 'Hello World;'; - const messages = parser.collectMessages('test.jsx', code); - - expect(messages).toHaveLength(1); - if (messages[0]) { - expect(messages[0].children).toHaveLength(1); - expect(messages[0].children[0]).toEqual({ text: 'Hello World' }); - } - }); - - it('should extract multiple messages', () => { - const code = ` - say\`Hello\`; - say\`World\`; - JSX Message - `; - const messages = parser.collectMessages('test.js', code); - - expect(messages).toHaveLength(3); - }); - - it('should return empty array for files with no messages', () => { - const code = 'const x = 42; console.log(x);'; - const messages = parser.collectMessages('test.js', code); - - expect(messages).toHaveLength(0); - }); - - it('should return empty array for unsupported files', () => { - const code = '{ "key": "value" }'; - const messages = parser.collectMessages('test.json', code); - - expect(messages).toHaveLength(0); - }); -}); - -describe('transformCode', () => { - it('should transform code with messages', () => { - const code = 'say`Hello World`;'; - const result = parser.transformCode('test.js', code); - - // Should be different from original (transformed) - expect(result).not.toBe(code); - // Should contain transformed output - it returns a GeneratorResult object - if (typeof result === 'object') { - expect(result.code).toContain('say'); - } - }); - - it('should return original code when no messages found', () => { - const code = 'const x = 42;'; - const result = parser.transformCode('test.js', code); - - expect(result).toBe(code); - }); - - it('should transform JSX code', () => { - const code = 'Hello World;'; - const result = parser.transformCode('test.jsx', code); - - // Should be different from original (transformed) - expect(result).not.toBe(code); - }); - - it('should return original code for unsupported files', () => { - const code = '{ "key": "value" }'; - const result = parser.transformCode('test.json', code); - - expect(result).toBe(code); - }); - - it('should preserve code structure while transforming', () => { - const code = ` - const name = 'World'; - const message = say\`Hello \${name}!\`; - console.log(message); - `; - const result = parser.transformCode('test.js', code); - - // Should contain the variable declarations and console.log - if (typeof result === 'object') { - expect(result.code).toContain('const name'); - expect(result.code).toContain('console.log'); - // Should contain transformation - expect(result.code).toContain('say'); - } else { - // If no transformation happened, it should return original code - expect(result).toBe(code); - } - }); -}); diff --git a/packages/plugin-babel/src/core/program.ts b/packages/plugin-babel/src/core/program.ts deleted file mode 100644 index 826bc47..0000000 --- a/packages/plugin-babel/src/core/program.ts +++ /dev/null @@ -1,54 +0,0 @@ -import { generate } from '@babel/generator'; -import * as parser from '@babel/parser'; -import traverse_ from '@babel/traverse'; -import { Context } from './context.js'; -import { Visitor } from './visitor.js'; - -const traverse = (traverse_ as any).default || (traverse_ as typeof traverse_); - -const supportedExtensions = ['.js', '.cjs', '.mjs', '.jsx', '.ts', '.mts', '.cts', '.tsx']; - -export function parseProgram(id: string, code: string) { - // Check if the file extension is supported - if (!supportedExtensions.some((ext) => id.endsWith(ext))) return null; - - const program = parser.parse(code, { - sourceType: 'module', - sourceFilename: id, - plugins: ['typescript', 'jsx'], - allowImportExportEverywhere: false, - allowReturnOutsideFunction: true, - ranges: true, - attachComment: true, - tokens: true, - }); - - const context = new Context(program.comments ?? []); - - return { program, context }; -} - -export function applyVisitor(program: parser.ParseResult, context: Context) { - const visitor = new Visitor(context); - traverse(program, visitor.toHandlers()); -} - -export function printProgram(program: parser.ParseResult) { - return generate(program.program, { - comments: true, - compact: false, - retainLines: true, - }); -} - -export function collectMessages(id: string, code: string) { - const result = parseProgram(id, code); - if (result) applyVisitor(result.program, result.context); - return result?.context.foundMessages ?? []; -} - -export function transformCode(id: string, code: string) { - const result = parseProgram(id, code); - if (result) applyVisitor(result.program, result.context); - return result?.context.foundMessages.length ? printProgram(result.program) : code; -} diff --git a/packages/plugin-babel/src/core/visitor.test.ts b/packages/plugin-babel/src/core/visitor.test.ts deleted file mode 100644 index 11eb5ac..0000000 --- a/packages/plugin-babel/src/core/visitor.test.ts +++ /dev/null @@ -1,309 +0,0 @@ -import * as t from '@babel/types'; -import { describe, expect, it, vi } from 'vitest'; -import { Context } from '~/core/context.js'; -import { Visitor } from './visitor.js'; - -describe('Visitor', () => { - const createMockContext = () => new Context([]); - - describe('Expression handler', () => { - it('should process and replace tagged template expressions', () => { - const context = createMockContext(); - const visitor = new Visitor(context); - - // Create a tagged template expression node - const sayIdentifier = t.identifier('say'); - const quasi = t.templateElement({ raw: 'Hello World', cooked: 'Hello World' }, false); - const taggedTemplate = t.taggedTemplateExpression( - sayIdentifier, - t.templateLiteral([quasi], []), - ); - - // Mock path object - const path = { - node: taggedTemplate, - parent: {} as any, - replaceWith: vi.fn(), - skip: vi.fn(), - }; - - visitor.Expression(path as any); - - expect(path.replaceWith).toHaveBeenCalled(); - expect(path.skip).toHaveBeenCalled(); - expect(context.foundMessages).toHaveLength(1); - }); - - it('should process and replace call expressions', () => { - const context = createMockContext(); - const visitor = new Visitor(context); - - // Create a plural call expression - const sayIdentifier = t.identifier('say'); - const pluralMember = t.memberExpression(sayIdentifier, t.identifier('plural')); - const countIdentifier = t.identifier('count'); - const choicesObject = t.objectExpression([ - t.objectProperty(t.stringLiteral('one'), t.stringLiteral('item')), - t.objectProperty(t.stringLiteral('other'), t.stringLiteral('items')), - ]); - const callExpression = t.callExpression(pluralMember, [countIdentifier, choicesObject]); - - // Mock path object - const path = { - node: callExpression, - parent: { leadingComments: [] } as any, - replaceWith: vi.fn(), - skip: vi.fn(), - }; - - visitor.Expression(path as any); - - expect(path.replaceWith).toHaveBeenCalled(); - expect(path.skip).toHaveBeenCalled(); - expect(context.foundMessages).toHaveLength(1); - }); - - it('should not process non-say expressions', () => { - const context = createMockContext(); - const visitor = new Visitor(context); - - // Create a non-say expression - const notSayIdentifier = t.identifier('console'); - const logMember = t.memberExpression(notSayIdentifier, t.identifier('log')); - const callExpression = t.callExpression(logMember, [t.stringLiteral('test')]); - - // Mock path object - const path = { - node: callExpression, - parent: {} as any, - replaceWith: vi.fn(), - skip: vi.fn(), - }; - - visitor.Expression(path as any); - - expect(path.replaceWith).not.toHaveBeenCalled(); - expect(path.skip).not.toHaveBeenCalled(); - expect(context.foundMessages).toHaveLength(0); - }); - - it('should copy leading comments from parent', () => { - const context = createMockContext(); - const visitor = new Visitor(context); - - // Create parent with comments - const leadingComments = [{ type: 'CommentLine', value: ' Some comment' }]; - - const sayIdentifier = t.identifier('say'); - const quasi = t.templateElement({ raw: 'Hello', cooked: 'Hello' }, false); - const taggedTemplate = t.taggedTemplateExpression( - sayIdentifier, - t.templateLiteral([quasi], []), - ); - - // Mock path object with parent comments - const path = { - node: taggedTemplate, - parent: { leadingComments } as any, - replaceWith: vi.fn(), - skip: vi.fn(), - }; - - visitor.Expression(path as any); - - expect(path.node.leadingComments).toEqual(leadingComments); - }); - - it('should reset identifier store after processing', () => { - const context = createMockContext(); - - // Use identifier store to generate some IDs - context.identifierStore.next(); - context.identifierStore.next(); - expect(context.identifierStore.next()).toBe('2'); - - // Now process an expression - const sayIdentifier = t.identifier('say'); - const quasi = t.templateElement({ raw: 'Hello', cooked: 'Hello' }, false); - const taggedTemplate = t.taggedTemplateExpression( - sayIdentifier, - t.templateLiteral([quasi], []), - ); - - const path = { - node: taggedTemplate, - parent: {} as any, - replaceWith: vi.fn(), - skip: vi.fn(), - }; - - const visitor = new Visitor(context); - visitor.Expression(path as any); - - // Identifier store should be reset - expect(context.identifierStore.next()).toBe('0'); - }); - }); - - describe('JSXElement handler', () => { - it('should process and replace Say container elements', () => { - const context = createMockContext(); - const visitor = new Visitor(context); - - // Create a Say container element - const sayIdentifier = t.jsxIdentifier('Say'); - const openingElement = t.jsxOpeningElement(sayIdentifier, [], false); - const closingElement = t.jsxClosingElement(sayIdentifier); - const helloText = t.jsxText('Hello World'); - const jsxElement = t.jsxElement(openingElement, closingElement, [helloText]); - - // Mock path object - const path = { - node: jsxElement, - replaceWith: vi.fn(), - skip: vi.fn(), - }; - - visitor.JSXElement(path as any); - - expect(path.replaceWith).toHaveBeenCalled(); - expect(path.skip).toHaveBeenCalled(); - expect(context.foundMessages).toHaveLength(1); - }); - - it('should process and replace Say self-closing elements', () => { - const context = createMockContext(); - const visitor = new Visitor(context); - - // Create a Say plural self-closing element - const sayIdentifier = t.jsxIdentifier('Say'); - const pluralProperty = t.jsxIdentifier('plural'); - const sayMember = t.jsxMemberExpression(sayIdentifier, pluralProperty); - - const countAttribute = t.jsxAttribute( - t.jsxIdentifier('_'), - t.jsxExpressionContainer(t.identifier('count')), - ); - const oneAttribute = t.jsxAttribute(t.jsxIdentifier('one'), t.stringLiteral('item')); - const otherAttribute = t.jsxAttribute(t.jsxIdentifier('other'), t.stringLiteral('items')); - - const openingElement = t.jsxOpeningElement( - sayMember, - [countAttribute, oneAttribute, otherAttribute], - true, - ); - const jsxElement = t.jsxElement(openingElement, null, []); - - // Mock path object - const path = { - node: jsxElement, - replaceWith: vi.fn(), - skip: vi.fn(), - }; - - visitor.JSXElement(path as any); - - expect(path.replaceWith).toHaveBeenCalled(); - expect(path.skip).toHaveBeenCalled(); - expect(context.foundMessages).toHaveLength(1); - }); - - it('should not process non-Say JSX elements', () => { - const context = createMockContext(); - const visitor = new Visitor(context); - - // Create a non-Say element - const divIdentifier = t.jsxIdentifier('div'); - const openingElement = t.jsxOpeningElement(divIdentifier, [], false); - const closingElement = t.jsxClosingElement(divIdentifier); - const helloText = t.jsxText('Hello World'); - const jsxElement = t.jsxElement(openingElement, closingElement, [helloText]); - - // Mock path object - const path = { - node: jsxElement, - replaceWith: vi.fn(), - skip: vi.fn(), - }; - - visitor.JSXElement(path as any); - - expect(path.replaceWith).not.toHaveBeenCalled(); - expect(path.skip).not.toHaveBeenCalled(); - expect(context.foundMessages).toHaveLength(0); - }); - - it('should reset identifier store after processing', () => { - const context = createMockContext(); - - // Use identifier store to generate some IDs - context.identifierStore.next(); - context.identifierStore.next(); - expect(context.identifierStore.next()).toBe('2'); - - // Process a JSX element - const sayIdentifier = t.jsxIdentifier('Say'); - const openingElement = t.jsxOpeningElement(sayIdentifier, [], false); - const closingElement = t.jsxClosingElement(sayIdentifier); - const helloText = t.jsxText('Hello'); - const jsxElement = t.jsxElement(openingElement, closingElement, [helloText]); - - const path = { - node: jsxElement, - replaceWith: vi.fn(), - skip: vi.fn(), - }; - - const visitor = new Visitor(context); - visitor.JSXElement(path as any); - - // Identifier store should be reset - expect(context.identifierStore.next()).toBe('0'); - }); - }); - - describe('toHandlers', () => { - it('should return properly structured handlers object', () => { - const context = createMockContext(); - const visitor = new Visitor(context); - - const handlers = visitor.toHandlers(); - - expect(handlers).toHaveProperty('Expression'); - expect(handlers).toHaveProperty('JSXElement'); - expect(typeof handlers.Expression).toBe('function'); - expect(typeof handlers.JSXElement).toBe('function'); - }); - - it('should bind handlers to visitor instance', () => { - const context = createMockContext(); - const visitor = new Visitor(context); - - const handlers = visitor.toHandlers(); - - // Test that handlers are bound by checking they have access to instance context - const expressionMockPath = { - node: {} as any, - parent: {} as any, - replaceWith: vi.fn(), - skip: vi.fn(), - }; - - // JSX handler needs a proper JSX element structure - const sayIdentifier = t.jsxIdentifier('Say'); - const openingElement = t.jsxOpeningElement(sayIdentifier, [], false); - const closingElement = t.jsxClosingElement(sayIdentifier); - const jsxElement = t.jsxElement(openingElement, closingElement, []); - - const jsxMockPath = { - node: jsxElement, - replaceWith: vi.fn(), - skip: vi.fn(), - }; - - // Calling handlers should not throw and should access the instance context - expect(() => handlers.Expression(expressionMockPath as any)).not.toThrow(); - expect(() => handlers.JSXElement(jsxMockPath as any)).not.toThrow(); - }); - }); -}); diff --git a/packages/plugin-babel/src/core/visitor.ts b/packages/plugin-babel/src/core/visitor.ts deleted file mode 100644 index f097243..0000000 --- a/packages/plugin-babel/src/core/visitor.ts +++ /dev/null @@ -1,47 +0,0 @@ -import type { Visitor as BabelVisitor } from '@babel/core'; -import { generateSayCallExpression } from '~/features/js/generator.js'; -import { parseExpression } from '~/features/js/parser.js'; -import { generateSayJSXElement } from '~/features/jsx/generator.js'; -import { parseJSXElement } from '~/features/jsx/parser.js'; -import type { Context } from './context.js'; - -// @ts-expect-error -type P = Parameters[0]; - -export class Visitor { - constructor(public readonly context: Context) {} - - Expression(path: P<'Expression'>) { - path.node.leadingComments = path.parent.leadingComments; - const message = parseExpression(this.context, path.node); - - if (message) { - this.context.foundMessages.push(message); - this.context.identifierStore.reset(); - - const replacement = generateSayCallExpression(message); - path.replaceWith(replacement); - path.skip(); - } - } - - JSXElement(path: P<'JSXElement'>) { - const message = parseJSXElement(this.context, path.node); - - if (message) { - this.context.foundMessages.push(message); - this.context.identifierStore.reset(); - - const replacement = generateSayJSXElement(message); - path.replaceWith(replacement); - path.skip(); - } - } - - toHandlers() { - return { - Expression: this.Expression.bind(this), - JSXElement: this.JSXElement.bind(this), - }; - } -} diff --git a/packages/plugin-babel/src/features/jsx/generator.ts b/packages/plugin-babel/src/features/jsx/generator.ts deleted file mode 100644 index 09bd649..0000000 --- a/packages/plugin-babel/src/features/jsx/generator.ts +++ /dev/null @@ -1,17 +0,0 @@ -import * as t from '@babel/types'; -import type { CompositeMessage } from '~/core/messages/types.js'; -import { generateChildExpressions } from '../js/generator.js'; - -export function generateSayJSXElement(message: CompositeMessage) { - const id = message.descriptor.id ?? message.toHashString(); - const children = generateChildExpressions(message.children); - - const attributes = [ - t.jsxAttribute(t.jsxIdentifier('id'), t.stringLiteral(id)), - ...children.map(([k, e]) => - t.jsxAttribute(t.jsxIdentifier(Number.isNaN(+k) ? k : `_${k}`), t.jsxExpressionContainer(e)), - ), - ]; - - return t.jsxElement(t.jsxOpeningElement(t.jsxIdentifier('Say'), attributes, true), null, []); -} diff --git a/packages/plugin-babel/src/index.ts b/packages/plugin-babel/src/index.ts index 95c8bda..41e5e43 100644 --- a/packages/plugin-babel/src/index.ts +++ b/packages/plugin-babel/src/index.ts @@ -1,10 +1,29 @@ +import { relative } from 'node:path'; import type { PluginObj } from '@babel/core'; -import { Context } from './core/context.js'; -import { Visitor } from './core/visitor.js'; +import { parse } from '@babel/parser'; +import { resolveConfig } from '@saykit/config/features/loader'; export default function (): PluginObj { + const config = resolveConfig(); + return { name: 'saykit', - visitor: new Visitor(new Context([])).toHandlers(), + visitor: { + Program(path, state) { + const id_ = state.file.opts.filename; + if (!id_ || id_.includes('node_modules')) return; + const code = state.file.code ?? ''; + + const id = relative(process.cwd(), id_).replaceAll('\\', '/').split('?')[0]!; + const bucket = config.buckets.find((b) => b.match(id)); + const transformed = bucket?.transformer.transform(code, id) ?? code; + + if (transformed !== code) { + const ast = parse(transformed, state.file.opts.parserOpts as any); + path.replaceWith(ast.program); + path.skip(); + } + }, + }, }; } diff --git a/packages/plugin-babel/tsdown.config.ts b/packages/plugin-babel/tsdown.config.ts index 8d98b80..e07a8f0 100644 --- a/packages/plugin-babel/tsdown.config.ts +++ b/packages/plugin-babel/tsdown.config.ts @@ -1,5 +1,5 @@ import { defineConfig } from 'tsdown'; export default defineConfig({ - entry: ['src/index.ts', 'src/core/index.ts'], + entry: ['src/index.ts', 'src/*.ts'], }); diff --git a/packages/unplugin/package.json b/packages/plugin-unplugin/package.json similarity index 92% rename from packages/unplugin/package.json rename to packages/plugin-unplugin/package.json index 0c11844..4da2ec5 100644 --- a/packages/unplugin/package.json +++ b/packages/plugin-unplugin/package.json @@ -18,7 +18,7 @@ "repository": { "type": "git", "url": "git+https://github.com/k0d13/saykit.git", - "directory": "packages/unplugin" + "directory": "packages/plugin-unplugin" }, "files": [ "dist", @@ -45,7 +45,7 @@ "prepack": "pnpm build" }, "dependencies": { - "@saykit/babel-plugin": "workspace:^", + "@saykit/config": "workspace:^", "unplugin": "^3.0.0" } } diff --git a/packages/unplugin/src/bun.ts b/packages/plugin-unplugin/src/bun.ts similarity index 100% rename from packages/unplugin/src/bun.ts rename to packages/plugin-unplugin/src/bun.ts diff --git a/packages/unplugin/src/esbuild.ts b/packages/plugin-unplugin/src/esbuild.ts similarity index 100% rename from packages/unplugin/src/esbuild.ts rename to packages/plugin-unplugin/src/esbuild.ts diff --git a/packages/unplugin/src/farm.ts b/packages/plugin-unplugin/src/farm.ts similarity index 100% rename from packages/unplugin/src/farm.ts rename to packages/plugin-unplugin/src/farm.ts diff --git a/packages/plugin-unplugin/src/index.ts b/packages/plugin-unplugin/src/index.ts new file mode 100644 index 0000000..9733ec6 --- /dev/null +++ b/packages/plugin-unplugin/src/index.ts @@ -0,0 +1,20 @@ +import { relative } from 'node:path'; +import { resolveConfig } from '@saykit/config/features/loader'; +import { createUnplugin } from 'unplugin'; + +export default createUnplugin((_options?: never) => { + const config = resolveConfig(); + + return { + name: 'saykit', + enforce: 'pre', + transform: { + filter: { id: { exclude: /node_modules/ } }, + handler: (code, id_) => { + const id = relative(process.cwd(), id_).replaceAll('\\', '/').split('?')[0]!; + const bucket = config.buckets.find((b) => b.match(id)); + return bucket?.transformer.transform(code, id) ?? code; + }, + }, + }; +}); diff --git a/packages/unplugin/src/rolldown.ts b/packages/plugin-unplugin/src/rolldown.ts similarity index 100% rename from packages/unplugin/src/rolldown.ts rename to packages/plugin-unplugin/src/rolldown.ts diff --git a/packages/unplugin/src/rollup.ts b/packages/plugin-unplugin/src/rollup.ts similarity index 100% rename from packages/unplugin/src/rollup.ts rename to packages/plugin-unplugin/src/rollup.ts diff --git a/packages/unplugin/src/rspack.ts b/packages/plugin-unplugin/src/rspack.ts similarity index 100% rename from packages/unplugin/src/rspack.ts rename to packages/plugin-unplugin/src/rspack.ts diff --git a/packages/unplugin/src/unloader.ts b/packages/plugin-unplugin/src/unloader.ts similarity index 100% rename from packages/unplugin/src/unloader.ts rename to packages/plugin-unplugin/src/unloader.ts diff --git a/packages/unplugin/src/vite.ts b/packages/plugin-unplugin/src/vite.ts similarity index 100% rename from packages/unplugin/src/vite.ts rename to packages/plugin-unplugin/src/vite.ts diff --git a/packages/unplugin/src/webpack.ts b/packages/plugin-unplugin/src/webpack.ts similarity index 100% rename from packages/unplugin/src/webpack.ts rename to packages/plugin-unplugin/src/webpack.ts diff --git a/packages/unplugin/tsconfig.json b/packages/plugin-unplugin/tsconfig.json similarity index 100% rename from packages/unplugin/tsconfig.json rename to packages/plugin-unplugin/tsconfig.json diff --git a/packages/unplugin/tsdown.config.ts b/packages/plugin-unplugin/tsdown.config.ts similarity index 100% rename from packages/unplugin/tsdown.config.ts rename to packages/plugin-unplugin/tsdown.config.ts diff --git a/packages/transform-js/package.json b/packages/transform-js/package.json new file mode 100644 index 0000000..5106d4e --- /dev/null +++ b/packages/transform-js/package.json @@ -0,0 +1,65 @@ +{ + "name": "@saykit/transform-js", + "version": "0.0.0", + "description": "JavaScript and TypeScript transformer for SayKit", + "keywords": [ + "i18n", + "javascript", + "saykit", + "transformer", + "typescript" + ], + "homepage": "https://github.com/k0d13/saykit#readme", + "bugs": { + "url": "https://github.com/k0d13/saykit/issues" + }, + "license": "MIT", + "repository": { + "type": "git", + "url": "git+https://github.com/k0d13/saykit.git", + "directory": "packages/transform-js" + }, + "files": [ + "dist", + "!dist/**/*.map" + ], + "type": "module", + "exports": { + ".": { + "types": "./dist/index.d.mts", + "default": "./dist/index.mjs" + }, + "./parser": { + "types": "./dist/parser.d.mts", + "default": "./dist/parser.mjs" + }, + "./generator": { + "types": "./dist/generator.d.mts", + "default": "./dist/generator.mjs" + } + }, + "publishConfig": { + "access": "public", + "provenance": true + }, + "scripts": { + "check": "tsc --noEmit", + "test": "vitest", + "coverage": "vitest run --coverage", + "build": "tsdown", + "prepack": "pnpm build" + }, + "dependencies": { + "@babel/generator": "^7.29.1", + "@babel/parser": "^7.29.2", + "@babel/traverse": "^7.29.0", + "@babel/types": "^7.29.0", + "@saykit/config": "workspace:^" + }, + "devDependencies": { + "@babel/core": "^7.29.0", + "@types/babel__core": "^7.20.5", + "@types/babel__generator": "^7.27.0", + "@types/babel__traverse": "^7.28.0" + } +} diff --git a/packages/plugin-babel/src/features/js/generator.ts b/packages/transform-js/src/generator.ts similarity index 74% rename from packages/plugin-babel/src/features/js/generator.ts rename to packages/transform-js/src/generator.ts index f6efcde..3f42d64 100644 --- a/packages/plugin-babel/src/features/js/generator.ts +++ b/packages/transform-js/src/generator.ts @@ -5,7 +5,7 @@ import { CompositeMessage, ElementMessage, type Message, -} from '~/core/messages/types.js'; +} from '@saykit/config/features/messages'; export function generateSayCallExpression(message: CompositeMessage) { const id = message.descriptor.id ?? message.toHashString(); @@ -13,25 +13,25 @@ export function generateSayCallExpression(message: CompositeMessage) { const properties = t.objectExpression([ t.objectProperty(t.identifier('id'), t.stringLiteral(id)), - ...children.map(([key, expr]) => t.objectProperty(t.identifier(key), expr)), + ...children.map(([ident, expr]) => t.objectProperty(t.identifier(ident), expr)), ]); return t.callExpression(t.memberExpression(message.accessor, t.identifier('call')), [properties]); } -export function generateChildExpressions(messages: Message[]) { +function generateChildExpressions(messages: Message[]) { return messages.reduce<[string, t.Expression][]>((c, m) => { if (m instanceof ArgumentMessage) { - c.push([m.identifier, m.expression]); + c.push([String(m.identifier), m.expression]); } if (m instanceof ElementMessage) { - c.push([m.identifier, m.expression]); + c.push([String(m.identifier), m.expression]); c.push(...generateChildExpressions(m.children)); } if (m instanceof ChoiceMessage) { - c.push([m.identifier, m.expression]); + c.push([String(m.identifier), m.expression]); c.push(...generateChildExpressions(m.branches.map((b) => b.value))); } diff --git a/packages/transform-js/src/index.ts b/packages/transform-js/src/index.ts new file mode 100644 index 0000000..988c797 --- /dev/null +++ b/packages/transform-js/src/index.ts @@ -0,0 +1,88 @@ +import { generate } from '@babel/generator'; +import * as parser from '@babel/parser'; +import traverse_ from '@babel/traverse'; +import type { Transformer } from '@saykit/config'; +import { assignSequenceIdentifiers, CompositeMessage } from '@saykit/config/features/messages'; +import { generateSayCallExpression } from './generator.js'; +import { parseExpression } from './parser.js'; + +const traverse = ((traverse_ as any).default || traverse_) as typeof traverse_; + +function createProgram(code: string, id: string) { + const program = parser.parse(code, { + sourceType: 'module', + sourceFilename: id, + plugins: ['typescript'], + allowImportExportEverywhere: false, + allowReturnOutsideFunction: true, + ranges: true, + attachComment: true, + tokens: true, + }); + + return Object.assign(program, { + toString() { + return generate(program, { + retainLines: true, + comments: true, + compact: false, + }).code; + }, + }); +} + +function createJsTransformer(): Transformer { + return { + match(id: string) { + return ['.js', '.cjs', '.mjs', '.ts', '.mts', '.cts'].some((e) => id.endsWith(e)); + }, + + extract(code: string, id: string) { + const program = createProgram(code, id); + const messages: CompositeMessage[] = []; + + traverse(program, { + Expression(path) { + path.node.leadingComments = path.node.leadingComments ?? []; + const message = parseExpression(path.node); + if (message) { + assignSequenceIdentifiers(message, { current: 0 }); + messages.push(message); + path.skip(); + } + }, + }); + + // TODO: Can this just return the messages themselves, and be converted upstream + return messages.map((message) => ({ + message: message.toICUString(), + translation: undefined, + id: message.descriptor.id, + context: message.descriptor.context, + comments: message.comments, + references: message.references, + })); + }, + + transform(code: string, id: string) { + const program = createProgram(code, id); + + traverse(program, { + Expression(path) { + path.node.leadingComments = path.node.leadingComments ?? []; + const message = parseExpression(path.node); + if (message) { + assignSequenceIdentifiers(message, { current: 0 }); + const replacement = generateSayCallExpression(message); + path.replaceWith(replacement); + path.skip(); + } + }, + }); + + return program.toString(); + }, + }; +} + +export default createJsTransformer; diff --git a/packages/plugin-babel/src/features/js/parser.test.ts b/packages/transform-js/src/parser.test.ts similarity index 83% rename from packages/plugin-babel/src/features/js/parser.test.ts rename to packages/transform-js/src/parser.test.ts index 42a0f1f..1132415 100644 --- a/packages/plugin-babel/src/features/js/parser.test.ts +++ b/packages/transform-js/src/parser.test.ts @@ -1,7 +1,12 @@ import * as t from '@babel/types'; +import { + ArgumentMessage, + AUTO_INCREMENT_IDENTIFIER, + ChoiceMessage, + CompositeMessage, + LiteralMessage, +} from '@saykit/config/features/messages'; import { describe, expect, it } from 'vitest'; -import { Context } from '~/core/context.js'; -import { ArgumentMessage, ChoiceMessage, LiteralMessage } from '~/core/messages/types.js'; import * as parser from './parser.js'; describe('processExpression', () => { @@ -65,8 +70,6 @@ describe('processExpression', () => { }); describe('parseTaggedTemplateExpression', () => { - const createMockContext = () => new Context([]); - it('should parse simple tagged template', () => { const sayIdentifier = t.identifier('say'); const quasi = t.templateElement({ raw: 'Hello', cooked: 'Hello' }, false); @@ -75,7 +78,7 @@ describe('parseTaggedTemplateExpression', () => { t.templateLiteral([quasi], []), ); - const result = parser.parseTaggedTemplateExpression(createMockContext(), taggedTemplate); + const result = parser.parseTaggedTemplateExpression(taggedTemplate); expect(result).not.toBeNull(); expect(result!.children).toHaveLength(1); @@ -92,7 +95,7 @@ describe('parseTaggedTemplateExpression', () => { t.templateLiteral([quasi1, quasi2], [expression]), ); - const result = parser.parseTaggedTemplateExpression(createMockContext(), taggedTemplate); + const result = parser.parseTaggedTemplateExpression(taggedTemplate); expect(result).not.toBeNull(); expect(result!.children).toHaveLength(3); @@ -114,7 +117,7 @@ describe('parseTaggedTemplateExpression', () => { const quasi = t.templateElement({ raw: 'Hello', cooked: 'Hello' }, false); const taggedTemplate = t.taggedTemplateExpression(sayCall, t.templateLiteral([quasi], [])); - const result = parser.parseTaggedTemplateExpression(createMockContext(), taggedTemplate); + const result = parser.parseTaggedTemplateExpression(taggedTemplate); expect(result).not.toBeNull(); expect(result!.descriptor).toEqual({ id: 'greeting', context: undefined }); @@ -130,7 +133,7 @@ describe('parseTaggedTemplateExpression', () => { const quasi = t.templateElement({ raw: 'Hello', cooked: 'Hello' }, false); const taggedTemplate = t.taggedTemplateExpression(sayCall, t.templateLiteral([quasi], [])); - const result = parser.parseTaggedTemplateExpression(createMockContext(), taggedTemplate); + const result = parser.parseTaggedTemplateExpression(taggedTemplate); expect(result).not.toBeNull(); expect(result!.descriptor).toEqual({ id: undefined, context: 'greeting' }); @@ -153,7 +156,7 @@ describe('parseTaggedTemplateExpression', () => { }, ] as t.Comment[]; - const result = parser.parseTaggedTemplateExpression(createMockContext(), taggedTemplate); + const result = parser.parseTaggedTemplateExpression(taggedTemplate); expect(result).not.toBeNull(); expect(result!.comments).toEqual(['Use formal greeting', 'Consider cultural context']); @@ -175,7 +178,7 @@ describe('parseTaggedTemplateExpression', () => { identifierName: undefined, }; - const result = parser.parseTaggedTemplateExpression(createMockContext(), taggedTemplate); + const result = parser.parseTaggedTemplateExpression(taggedTemplate); expect(result).not.toBeNull(); expect(result!.references).toEqual(['test.js:10']); @@ -189,15 +192,13 @@ describe('parseTaggedTemplateExpression', () => { t.templateLiteral([quasi], []), ); - const result = parser.parseTaggedTemplateExpression(createMockContext(), taggedTemplate); + const result = parser.parseTaggedTemplateExpression(taggedTemplate); expect(result).toBeNull(); }); }); describe('parseCallExpression', () => { - const createMockContext = () => new Context([]); - it('should parse simple plural call expression', () => { const sayIdentifier = t.identifier('say'); const pluralMember = t.memberExpression(sayIdentifier, t.identifier('plural')); @@ -208,7 +209,7 @@ describe('parseCallExpression', () => { ]); const callExpression = t.callExpression(pluralMember, [countIdentifier, choicesObject]); - const result = parser.parseCallExpression(createMockContext(), callExpression); + const result = parser.parseCallExpression(callExpression); expect(result).not.toBeNull(); expect(result!.children).toHaveLength(1); @@ -217,9 +218,9 @@ describe('parseCallExpression', () => { expect(choiceMessage.kind).toBe('plural'); expect(choiceMessage.identifier).toBe('count'); expect(choiceMessage.branches).toHaveLength(2); - expect(choiceMessage.branches[0]!.key).toBe('one'); + expect(choiceMessage.branches[0]!.identifier).toBe('one'); expect(choiceMessage.branches[0]!.value).toEqual({ text: 'item' }); - expect(choiceMessage.branches[1]!.key).toBe('other'); + expect(choiceMessage.branches[1]!.identifier).toBe('other'); expect(choiceMessage.branches[1]!.value).toEqual({ text: 'items' }); }); @@ -234,7 +235,7 @@ describe('parseCallExpression', () => { ]); const callExpression = t.callExpression(ordinalMember, [positionIdentifier, choicesObject]); - const result = parser.parseCallExpression(createMockContext(), callExpression); + const result = parser.parseCallExpression(callExpression); expect(result).not.toBeNull(); const choiceMessage = result!.children[0] as ChoiceMessage; @@ -242,11 +243,11 @@ describe('parseCallExpression', () => { expect(choiceMessage.kind).toBe('ordinal'); expect(choiceMessage.identifier).toBe('position'); expect(choiceMessage.branches).toHaveLength(3); - expect(choiceMessage.branches[0]!.key).toBe('1'); + expect(choiceMessage.branches[0]!.identifier).toBe('1'); expect(choiceMessage.branches[0]!.value).toEqual({ text: 'first' }); - expect(choiceMessage.branches[1]!.key).toBe('2'); + expect(choiceMessage.branches[1]!.identifier).toBe('2'); expect(choiceMessage.branches[1]!.value).toEqual({ text: 'second' }); - expect(choiceMessage.branches[2]!.key).toBe('other'); + expect(choiceMessage.branches[2]!.identifier).toBe('other'); expect(choiceMessage.branches[2]!.value).toEqual({ text: 'other' }); }); @@ -261,7 +262,7 @@ describe('parseCallExpression', () => { ]); const callExpression = t.callExpression(selectMember, [genderIdentifier, choicesObject]); - const result = parser.parseCallExpression(createMockContext(), callExpression); + const result = parser.parseCallExpression(callExpression); expect(result).not.toBeNull(); const choiceMessage = result!.children[0] as ChoiceMessage; @@ -269,11 +270,11 @@ describe('parseCallExpression', () => { expect(choiceMessage.kind).toBe('select'); expect(choiceMessage.identifier).toBe('gender'); expect(choiceMessage.branches).toHaveLength(3); - expect(choiceMessage.branches[0]!.key).toBe('male'); + expect(choiceMessage.branches[0]!.identifier).toBe('male'); expect(choiceMessage.branches[0]!.value).toEqual({ text: 'He' }); - expect(choiceMessage.branches[1]!.key).toBe('female'); + expect(choiceMessage.branches[1]!.identifier).toBe('female'); expect(choiceMessage.branches[1]!.value).toEqual({ text: 'She' }); - expect(choiceMessage.branches[2]!.key).toBe('other'); + expect(choiceMessage.branches[2]!.identifier).toBe('other'); expect(choiceMessage.branches[2]!.value).toEqual({ text: 'They' }); }); @@ -287,7 +288,7 @@ describe('parseCallExpression', () => { ]); const callExpression = t.callExpression(pluralMember, [countIdentifier, choicesObject]); - const result = parser.parseCallExpression(createMockContext(), callExpression); + const result = parser.parseCallExpression(callExpression); expect(result).not.toBeNull(); const choiceMessage = result!.children[0] as ChoiceMessage; @@ -295,7 +296,7 @@ describe('parseCallExpression', () => { expect(choiceMessage.kind).toBe('plural'); expect(choiceMessage.identifier).toBe('count'); expect(choiceMessage.branches).toHaveLength(1); - expect(choiceMessage.branches[0]!.key).toBe('one'); + expect(choiceMessage.branches[0]!.identifier).toBe('one'); expect(choiceMessage.branches[0]!.value).toBeInstanceOf(ArgumentMessage); expect((choiceMessage.branches[0]!.value as ArgumentMessage).identifier).toBe('name'); }); @@ -314,7 +315,7 @@ describe('parseCallExpression', () => { ]); const callExpression = t.callExpression(pluralMember, [countIdentifier, choicesObject]); - const result = parser.parseCallExpression(createMockContext(), callExpression); + const result = parser.parseCallExpression(callExpression); expect(result).not.toBeNull(); expect(result!.descriptor).toEqual({ id: 'itemCount', context: undefined }); @@ -325,7 +326,7 @@ describe('parseCallExpression', () => { const someMember = t.memberExpression(sayIdentifier, t.identifier('something')); const callExpression = t.callExpression(someMember, []); - const result = parser.parseCallExpression(createMockContext(), callExpression); + const result = parser.parseCallExpression(callExpression); expect(result).toBeNull(); }); @@ -336,12 +337,12 @@ describe('parseCallExpression', () => { // Missing required arguments const callExpression = t.callExpression(pluralMember, []); - const result = parser.parseCallExpression(createMockContext(), callExpression); + const result = parser.parseCallExpression(callExpression); expect(result).toBeNull(); }); - it('should handle numeric keys as exact matches', () => { + it('should handle numeric identifiers as exact matches', () => { const sayIdentifier = t.identifier('say'); const pluralMember = t.memberExpression(sayIdentifier, t.identifier('plural')); const countIdentifier = t.identifier('count'); @@ -352,7 +353,7 @@ describe('parseCallExpression', () => { ]); const callExpression = t.callExpression(pluralMember, [countIdentifier, choicesObject]); - const result = parser.parseCallExpression(createMockContext(), callExpression); + const result = parser.parseCallExpression(callExpression); expect(result).not.toBeNull(); const choiceMessage = result!.children[0] as ChoiceMessage; @@ -360,18 +361,16 @@ describe('parseCallExpression', () => { expect(choiceMessage.kind).toBe('plural'); expect(choiceMessage.identifier).toBe('count'); expect(choiceMessage.branches).toHaveLength(3); - expect(choiceMessage.branches[0]!.key).toBe('0'); + expect(choiceMessage.branches[0]!.identifier).toBe('0'); expect(choiceMessage.branches[0]!.value).toEqual({ text: 'none' }); - expect(choiceMessage.branches[1]!.key).toBe('1'); + expect(choiceMessage.branches[1]!.identifier).toBe('1'); expect(choiceMessage.branches[1]!.value).toEqual({ text: 'one' }); - expect(choiceMessage.branches[2]!.key).toBe('other'); + expect(choiceMessage.branches[2]!.identifier).toBe('other'); expect(choiceMessage.branches[2]!.value).toEqual({ text: 'many' }); }); }); describe('parseExpression', () => { - const createMockContext = () => new Context([]); - it('should delegate to tagged template parser', () => { const sayIdentifier = t.identifier('say'); const quasi = t.templateElement({ raw: 'Hello', cooked: 'Hello' }, false); @@ -380,10 +379,10 @@ describe('parseExpression', () => { t.templateLiteral([quasi], []), ); - const result = parser.parseExpression(createMockContext(), taggedTemplate); + const result = parser.parseExpression(taggedTemplate); expect(result).not.toBeNull(); - expect(result).toBeInstanceOf(Object); // CompositeMessage + expect(result).toBeInstanceOf(CompositeMessage); }); it('should delegate to call expression parser', () => { @@ -396,16 +395,16 @@ describe('parseExpression', () => { ]); const callExpression = t.callExpression(pluralMember, [countIdentifier, choicesObject]); - const result = parser.parseExpression(createMockContext(), callExpression); + const result = parser.parseExpression(callExpression); expect(result).not.toBeNull(); - expect(result).toBeInstanceOf(Object); // CompositeMessage + expect(result).toBeInstanceOf(CompositeMessage); }); it('should return argument message for fallback=true with simple identifier', () => { const identifier = t.identifier('name'); - const result = parser.parseExpression(createMockContext(), identifier, true); + const result = parser.parseExpression(identifier, true); expect(result).toBeInstanceOf(ArgumentMessage); expect((result as ArgumentMessage).identifier).toBe('name'); @@ -414,16 +413,16 @@ describe('parseExpression', () => { it('should return argument message for fallback=true with complex expression', () => { const expression = t.memberExpression(t.identifier('obj'), t.identifier('prop')); - const result = parser.parseExpression(createMockContext(), expression, true); + const result = parser.parseExpression(expression, true); expect(result).toBeInstanceOf(ArgumentMessage); - expect((result as ArgumentMessage).identifier).toBe('0'); // Generated identifier + expect((result as ArgumentMessage).identifier).toBe(AUTO_INCREMENT_IDENTIFIER); }); it('should return null for fallback=false with non-say expression', () => { const identifier = t.identifier('name'); - const result = parser.parseExpression(createMockContext(), identifier, false); + const result = parser.parseExpression(identifier, false); expect(result).toBeNull(); }); @@ -438,14 +437,14 @@ describe('parseExpression', () => { t.templateLiteral([quasi1, quasi2], [complexExpression]), ); - const result = parser.parseExpression(createMockContext(), taggedTemplate); + const result = parser.parseExpression(taggedTemplate); expect(result).not.toBeNull(); expect(result).toBeInstanceOf(Object); // CompositeMessage if (result) { expect(result.children).toHaveLength(3); expect(result.children[1]).toBeInstanceOf(ArgumentMessage); - expect((result.children[1] as ArgumentMessage).identifier).toBe('0'); // Generated identifier + expect((result.children[1] as ArgumentMessage).identifier).toBe(AUTO_INCREMENT_IDENTIFIER); } }); }); diff --git a/packages/plugin-babel/src/features/js/parser.ts b/packages/transform-js/src/parser.ts similarity index 76% rename from packages/plugin-babel/src/features/js/parser.ts rename to packages/transform-js/src/parser.ts index fef1d6d..874e60b 100644 --- a/packages/plugin-babel/src/features/js/parser.ts +++ b/packages/transform-js/src/parser.ts @@ -1,17 +1,14 @@ import * as t from '@babel/types'; -import type { Context } from '~/core/context.js'; import { ArgumentMessage, ChoiceMessage, CompositeMessage, + AUTO_INCREMENT_IDENTIFIER, LiteralMessage, type Message, -} from '~/core/messages/types.js'; - -// +} from '@saykit/config/features/messages'; export function parseTaggedTemplateExpression( - context: Context, tagged: t.TaggedTemplateExpression, ): CompositeMessage | null { const processed = processExpression(tagged.tag); @@ -19,9 +16,9 @@ export function parseTaggedTemplateExpression( const [accessor, descriptor] = processed; const children = tagged.quasi.quasis.reduce((c, q, i) => { - c.push(new LiteralMessage(q.value.cooked!)); + c.push(new LiteralMessage(q.value.cooked ?? q.value.raw)); if (t.isExpression(tagged.quasi.expressions[i])) - c.push(parseExpression(context, tagged.quasi.expressions[i]!, true)!); + c.push(parseExpression(tagged.quasi.expressions[i]!, true)!); return c; }, []); @@ -35,16 +32,13 @@ export function parseTaggedTemplateExpression( return new CompositeMessage( { id: descriptorId, context: descriptorContext }, getTranslatorComments(tagged.leadingComments ?? []), - tagged.loc ? [`${tagged.loc?.filename}:${tagged.loc?.start.line}`] : [], + tagged.loc ? [`${tagged.loc.filename}:${tagged.loc.start.line}`] : [], children, accessor, ); } -export function parseCallExpression( - context: Context, - call: t.CallExpression, -): CompositeMessage | null { +export function parseCallExpression(call: t.CallExpression): CompositeMessage | null { const processed = processExpression(call.callee); if (!processed) return null; const [accessor, descriptor, kind] = processed; @@ -60,9 +54,9 @@ export function parseCallExpression( let message: Message | null = null; if (!message && t.isStringLiteral(p.value)) message = new LiteralMessage(p.value.value); - if (!message) message = parseExpression(context, p.value, true); + if (!message) message = parseExpression(p.value, true); c.push({ - key: getPropertyNameAsString(context, p.key), + identifier: getPropertyNameAsString(p.key), value: message!, }); @@ -70,7 +64,7 @@ export function parseCallExpression( }, []); const value = call.arguments[0]; - const identifier = getExpressionAsKey(context, value); + const identifier = getExpressionAsKey(value); const choice = new ChoiceMessage(kind, identifier, branches, value); const descriptorId = descriptor @@ -83,7 +77,7 @@ export function parseCallExpression( return new CompositeMessage( { id: descriptorId, context: descriptorContext }, [], - call.loc ? [`${call.loc?.filename}:${call.loc?.start.line}`] : [], + call.loc ? [`${call.loc.filename}:${call.loc.start.line}`] : [], [choice], accessor, ); @@ -94,53 +88,6 @@ export function parseCallExpression( // -export function parseExpression( - context: Context, - expression: t.Expression, - fallback?: false, -): CompositeMessage | null; -export function parseExpression( - context: Context, - expression: t.Expression, - fallback: true, -): CompositeMessage | ArgumentMessage; -export function parseExpression(context: Context, expression: t.Expression, fallback?: boolean) { - let message: CompositeMessage | null = null; - switch (true) { - case t.isTaggedTemplateExpression(expression): - message = parseTaggedTemplateExpression(context, expression); - break; - case t.isCallExpression(expression): - message = parseCallExpression(context, expression); - break; - } - - if (message) { - return message; - } else if (fallback) { - const key = getExpressionAsKey(context, expression); - return new ArgumentMessage(key, expression); - } else { - return null; - } -} - -// - -export function getExpressionAsKey(context: Context, node: t.Node) { - if (t.isIdentifier(node)) return node.name; - if (t.isJSXIdentifier(node)) return node.name; - return context.identifierStore.next(); -} - -/** - * Recursively process an expression to extract: - * - The accessor expression (e.g. `say`, `intl.say`) - * - An optional descriptor object (e.g. options passed as an argument) - * - An optional message kind (e.g. `"plural"`, `"select"`) - * - * @param expression - */ export function processExpression( expression: t.Node, ): [t.Expression, t.ObjectExpression | null, string | null] | null { @@ -173,12 +120,49 @@ export function processExpression( return null; } -function getPropertyNameAsString(context: Context, key: t.ObjectProperty['key']) { +function getExpressionAsKey(node: t.Node) { + if (t.isIdentifier(node)) return node.name; + if (t.isJSXIdentifier(node)) return node.name; + return AUTO_INCREMENT_IDENTIFIER; +} + +export function parseExpression( + expression: t.Expression, + fallback?: false, +): CompositeMessage | null; +export function parseExpression( + expression: t.Expression, + fallback: true, +): CompositeMessage | ArgumentMessage; +export function parseExpression(expression: t.Expression, fallback?: boolean) { + let message: CompositeMessage | null = null; + switch (true) { + case t.isTaggedTemplateExpression(expression): + message = parseTaggedTemplateExpression(expression); + break; + case t.isCallExpression(expression): + message = parseCallExpression(expression); + break; + } + + if (message) { + return message; + } else if (fallback) { + const key = getExpressionAsKey(expression); + return new ArgumentMessage(key, expression); + } else { + return null; + } +} + +// + +function getPropertyNameAsString(key: t.ObjectProperty['key']) { if (t.isIdentifier(key)) return key.name; if (t.isStringLiteral(key)) return key.value; if (t.isNumericLiteral(key)) return key.value.toString(); if (t.isBigIntLiteral(key)) return key.value.toString(); - return context.identifierStore.next(); + return AUTO_INCREMENT_IDENTIFIER; } function findPropertyValueIfStringLiteralAsString(object: t.ObjectExpression, key: string) { diff --git a/packages/transform-js/tsconfig.json b/packages/transform-js/tsconfig.json new file mode 100644 index 0000000..b560bec --- /dev/null +++ b/packages/transform-js/tsconfig.json @@ -0,0 +1 @@ +{ "extends": "../../tsconfig.base.json" } diff --git a/packages/transform-js/tsdown.config.ts b/packages/transform-js/tsdown.config.ts new file mode 100644 index 0000000..bf9e5e6 --- /dev/null +++ b/packages/transform-js/tsdown.config.ts @@ -0,0 +1,5 @@ +import { defineConfig } from 'tsdown'; + +export default defineConfig({ + entry: ['src/index.ts', 'src/parser.ts', 'src/generator.ts'], +}); diff --git a/packages/transform-js/vitest.config.ts b/packages/transform-js/vitest.config.ts new file mode 100644 index 0000000..613c8e7 --- /dev/null +++ b/packages/transform-js/vitest.config.ts @@ -0,0 +1,10 @@ +import { defineConfig } from 'vitest/config'; + +export default defineConfig({ + test: { + coverage: { + provider: 'v8', + reportsDirectory: './.coverage', + }, + }, +}); diff --git a/packages/transform-jsx/package.json b/packages/transform-jsx/package.json new file mode 100644 index 0000000..01e0ce2 --- /dev/null +++ b/packages/transform-jsx/package.json @@ -0,0 +1,66 @@ +{ + "name": "@saykit/transform-jsx", + "version": "0.0.0", + "description": "JSX and TSX source transformer for SayKit", + "keywords": [ + "i18n", + "jsx", + "saykit", + "transformer", + "tsx" + ], + "homepage": "https://github.com/k0d13/saykit#readme", + "bugs": { + "url": "https://github.com/k0d13/saykit/issues" + }, + "license": "MIT", + "repository": { + "type": "git", + "url": "git+https://github.com/k0d13/saykit.git", + "directory": "packages/transform-jsx" + }, + "files": [ + "dist", + "!dist/**/*.map" + ], + "type": "module", + "exports": { + ".": { + "types": "./dist/index.d.mts", + "default": "./dist/index.mjs" + }, + "./parser": { + "types": "./dist/parser.d.mts", + "default": "./dist/parser.mjs" + }, + "./generator": { + "types": "./dist/generator.d.mts", + "default": "./dist/generator.mjs" + } + }, + "publishConfig": { + "access": "public", + "provenance": true + }, + "scripts": { + "check": "tsc --noEmit", + "test": "vitest", + "coverage": "vitest run --coverage", + "build": "tsdown", + "prepack": "pnpm build" + }, + "dependencies": { + "@babel/generator": "^7.29.1", + "@babel/parser": "^7.29.2", + "@babel/traverse": "^7.29.0", + "@babel/types": "^7.29.0", + "@saykit/config": "workspace:^", + "@saykit/transform-js": "workspace:^" + }, + "devDependencies": { + "@babel/core": "^7.29.0", + "@types/babel__core": "^7.20.5", + "@types/babel__generator": "^7.27.0", + "@types/babel__traverse": "^7.28.0" + } +} diff --git a/packages/transform-jsx/src/generator.ts b/packages/transform-jsx/src/generator.ts new file mode 100644 index 0000000..2bca15d --- /dev/null +++ b/packages/transform-jsx/src/generator.ts @@ -0,0 +1,46 @@ +import * as t from '@babel/types'; +import { + ArgumentMessage, + ChoiceMessage, + CompositeMessage, + ElementMessage, + type Message, +} from '@saykit/config/features/messages'; + +export function generateSayJSXElement(message: CompositeMessage) { + const id = message.descriptor.id ?? message.toHashString(); + const children = generateChildExpressions(message.children); + + const attributes = [ + t.jsxAttribute(t.jsxIdentifier('id'), t.stringLiteral(id)), + ...children.map(([k, e]) => + t.jsxAttribute(t.jsxIdentifier(Number.isNaN(+k) ? k : `_${k}`), t.jsxExpressionContainer(e)), + ), + ]; + + return t.jsxElement(t.jsxOpeningElement(t.jsxIdentifier('Say'), attributes, true), null, []); +} + +function generateChildExpressions(messages: Message[]) { + return messages.reduce<[string, t.Expression][]>((c, m) => { + if (m instanceof ArgumentMessage) { + c.push([String(m.identifier), m.expression]); + } + + if (m instanceof ElementMessage) { + c.push([String(m.identifier), m.expression]); + c.push(...generateChildExpressions(m.children)); + } + + if (m instanceof ChoiceMessage) { + c.push([String(m.identifier), m.expression]); + c.push(...generateChildExpressions(m.branches.map((b) => b.value))); + } + + if (m instanceof CompositeMessage) { + c.push(...generateChildExpressions(m.children)); + } + + return c; + }, []); +} diff --git a/packages/transform-jsx/src/index.ts b/packages/transform-jsx/src/index.ts new file mode 100644 index 0000000..e822811 --- /dev/null +++ b/packages/transform-jsx/src/index.ts @@ -0,0 +1,111 @@ +import { generate } from '@babel/generator'; +import * as parser from '@babel/parser'; +import traverse_ from '@babel/traverse'; +import type { Transformer } from '@saykit/config'; +import { assignSequenceIdentifiers, CompositeMessage } from '@saykit/config/features/messages'; +import { generateSayCallExpression } from '@saykit/transform-js/generator'; +import { parseExpression } from '@saykit/transform-js/parser'; +import { generateSayJSXElement } from './generator.js'; +import { parseJSXElement } from './parser.js'; + +const traverse = ((traverse_ as any).default || traverse_) as typeof traverse_; + +function createProgram(code: string, id: string) { + const program = parser.parse(code, { + sourceType: 'module', + sourceFilename: id, + plugins: ['typescript', 'jsx'], + allowImportExportEverywhere: false, + allowReturnOutsideFunction: true, + ranges: true, + attachComment: true, + tokens: true, + }); + + return Object.assign(program, { + toString() { + return generate(program, { + retainLines: true, + comments: true, + compact: false, + }).code; + }, + }); +} + +function createJsxTransformer(): Transformer { + return { + match(id: string) { + return ['.jsx', '.tsx'].some((e) => id.endsWith(e)); + }, + + extract(code: string, id: string) { + const program = createProgram(code, id); + const messages: CompositeMessage[] = []; + + traverse(program, { + Expression(path) { + path.node.leadingComments = path.node.leadingComments ?? []; + const message = parseExpression(path.node); + if (message) { + assignSequenceIdentifiers(message, { current: 0 }); + messages.push(message); + path.skip(); + } + }, + + JSXElement(path) { + path.node.leadingComments = path.node.leadingComments ?? []; + const message = parseJSXElement(path.node); + if (message) { + assignSequenceIdentifiers(message, { current: 0 }); + messages.push(message); + path.skip(); + } + }, + }); + + // TODO: Can this just return the messages themselves, and be converted upstream + return messages.map((message) => ({ + message: message.toICUString(), + translation: undefined, + id: message.descriptor.id, + context: message.descriptor.context, + comments: message.comments, + references: message.references, + })); + }, + + transform(code: string, id: string) { + const program = createProgram(code, id); + + traverse(program, { + Expression(path) { + path.node.leadingComments = path.node.leadingComments ?? []; + const message = parseExpression(path.node); + if (message) { + assignSequenceIdentifiers(message, { current: 0 }); + const replacement = generateSayCallExpression(message); + path.replaceWith(replacement); + path.skip(); + } + }, + + JSXElement(path) { + path.node.leadingComments = path.node.leadingComments ?? []; + const message = parseJSXElement(path.node); + if (message) { + assignSequenceIdentifiers(message, { current: 0 }); + const replacement = generateSayJSXElement(message); + path.replaceWith(replacement); + path.skip(); + } + }, + }); + + return program.toString(); + }, + }; +} + +export default createJsxTransformer; diff --git a/packages/plugin-babel/src/features/jsx/parser.test.ts b/packages/transform-jsx/src/parser.test.ts similarity index 85% rename from packages/plugin-babel/src/features/jsx/parser.test.ts rename to packages/transform-jsx/src/parser.test.ts index c8f81a2..ccc3801 100644 --- a/packages/plugin-babel/src/features/jsx/parser.test.ts +++ b/packages/transform-jsx/src/parser.test.ts @@ -1,17 +1,14 @@ import * as t from '@babel/types'; -import { describe, expect, it } from 'vitest'; -import { Context } from '~/core/context.js'; import { ArgumentMessage, ChoiceMessage, ElementMessage, LiteralMessage, -} from '~/core/messages/types.js'; +} from '@saykit/config/features/messages'; +import { describe, expect, it } from 'vitest'; import * as parser from './parser.js'; describe('parseJSXContainerElement', () => { - const createMockContext = () => new Context([]); - it('should parse simple JSX Say container element', () => { const sayIdentifier = t.jsxIdentifier('Say'); const openingElement = t.jsxOpeningElement(sayIdentifier, [], false); @@ -19,7 +16,7 @@ describe('parseJSXContainerElement', () => { const helloText = t.jsxText('Hello World'); const jsxElement = t.jsxElement(openingElement, closingElement, [helloText]); - const result = parser.parseJSXContainerElement(createMockContext(), jsxElement); + const result = parser.parseJSXContainerElement(jsxElement); expect(result).not.toBeNull(); expect(result!.children).toHaveLength(1); @@ -40,7 +37,7 @@ describe('parseJSXContainerElement', () => { exclamationText, ]); - const result = parser.parseJSXContainerElement(createMockContext(), jsxElement); + const result = parser.parseJSXContainerElement(jsxElement); expect(result).not.toBeNull(); expect(result!.children).toHaveLength(3); @@ -67,7 +64,7 @@ describe('parseJSXContainerElement', () => { const jsxElement = t.jsxElement(openingElement, closingElement, [helloText, strongElement]); - const result = parser.parseJSXContainerElement(createMockContext(), jsxElement); + const result = parser.parseJSXContainerElement(jsxElement); expect(result).not.toBeNull(); expect(result!.children).toHaveLength(2); @@ -89,7 +86,7 @@ describe('parseJSXContainerElement', () => { const jsxElement = t.jsxElement(openingElement, closingElement, [helloText, fragment]); - const result = parser.parseJSXContainerElement(createMockContext(), jsxElement); + const result = parser.parseJSXContainerElement(jsxElement); expect(result).not.toBeNull(); expect(result!.children).toHaveLength(2); @@ -106,7 +103,7 @@ describe('parseJSXContainerElement', () => { const helloText = t.jsxText('Hello'); const jsxElement = t.jsxElement(openingElement, closingElement, [helloText]); - const result = parser.parseJSXContainerElement(createMockContext(), jsxElement); + const result = parser.parseJSXContainerElement(jsxElement); expect(result).not.toBeNull(); expect(result!.descriptor).toEqual({ id: 'greeting', context: undefined }); @@ -123,7 +120,7 @@ describe('parseJSXContainerElement', () => { const helloText = t.jsxText('Hello'); const jsxElement = t.jsxElement(openingElement, closingElement, [helloText]); - const result = parser.parseJSXContainerElement(createMockContext(), jsxElement); + const result = parser.parseJSXContainerElement(jsxElement); expect(result).not.toBeNull(); expect(result!.descriptor).toEqual({ id: undefined, context: 'greeting' }); @@ -134,7 +131,7 @@ describe('parseJSXContainerElement', () => { const openingElement = t.jsxOpeningElement(sayIdentifier, [], true); const jsxElement = t.jsxElement(openingElement, null, []); - const result = parser.parseJSXContainerElement(createMockContext(), jsxElement); + const result = parser.parseJSXContainerElement(jsxElement); expect(result).toBeNull(); }); @@ -146,7 +143,7 @@ describe('parseJSXContainerElement', () => { const helloText = t.jsxText('Hello'); const jsxElement = t.jsxElement(openingElement, closingElement, [helloText]); - const result = parser.parseJSXContainerElement(createMockContext(), jsxElement); + const result = parser.parseJSXContainerElement(jsxElement); expect(result).toBeNull(); }); @@ -158,7 +155,7 @@ describe('parseJSXContainerElement', () => { const whitespaceText = t.jsxText('\n Hello, \n World! \n'); const jsxElement = t.jsxElement(openingElement, closingElement, [whitespaceText]); - const result = parser.parseJSXContainerElement(createMockContext(), jsxElement); + const result = parser.parseJSXContainerElement(jsxElement); expect(result).not.toBeNull(); expect(result!.children).toHaveLength(1); @@ -168,8 +165,6 @@ describe('parseJSXContainerElement', () => { }); describe('parseJSXOpeningElement', () => { - const createMockContext = () => new Context([]); - it('should parse plural self-closing element', () => { const sayIdentifier = t.jsxIdentifier('Say'); const pluralProperty = t.jsxIdentifier('plural'); @@ -188,7 +183,7 @@ describe('parseJSXOpeningElement', () => { true, ); - const result = parser.parseJSXOpeningElement(createMockContext(), openingElement); + const result = parser.parseJSXOpeningElement(openingElement); expect(result).not.toBeNull(); expect(result!.children).toHaveLength(1); @@ -197,9 +192,9 @@ describe('parseJSXOpeningElement', () => { expect(choiceMessage.kind).toBe('plural'); expect(choiceMessage.identifier).toBe('count'); expect(choiceMessage.branches).toHaveLength(2); - expect(choiceMessage.branches[0]!.key).toBe('one'); + expect(choiceMessage.branches[0]!.identifier).toBe('one'); expect(choiceMessage.branches[0]!.value).toEqual({ text: 'item' }); - expect(choiceMessage.branches[1]!.key).toBe('other'); + expect(choiceMessage.branches[1]!.identifier).toBe('other'); expect(choiceMessage.branches[1]!.value).toEqual({ text: 'items' }); }); @@ -222,7 +217,7 @@ describe('parseJSXOpeningElement', () => { true, ); - const result = parser.parseJSXOpeningElement(createMockContext(), openingElement); + const result = parser.parseJSXOpeningElement(openingElement); expect(result).not.toBeNull(); const choiceMessage = result!.children[0] as ChoiceMessage; @@ -230,11 +225,11 @@ describe('parseJSXOpeningElement', () => { expect(choiceMessage.kind).toBe('select'); expect(choiceMessage.identifier).toBe('gender'); expect(choiceMessage.branches).toHaveLength(3); - expect(choiceMessage.branches[0]!.key).toBe('male'); + expect(choiceMessage.branches[0]!.identifier).toBe('male'); expect(choiceMessage.branches[0]!.value).toEqual({ text: 'He' }); - expect(choiceMessage.branches[1]!.key).toBe('female'); + expect(choiceMessage.branches[1]!.identifier).toBe('female'); expect(choiceMessage.branches[1]!.value).toEqual({ text: 'She' }); - expect(choiceMessage.branches[2]!.key).toBe('other'); + expect(choiceMessage.branches[2]!.identifier).toBe('other'); expect(choiceMessage.branches[2]!.value).toEqual({ text: 'They' }); }); @@ -257,7 +252,7 @@ describe('parseJSXOpeningElement', () => { true, ); - const result = parser.parseJSXOpeningElement(createMockContext(), openingElement); + const result = parser.parseJSXOpeningElement(openingElement); expect(result).not.toBeNull(); const choiceMessage = result!.children[0] as ChoiceMessage; @@ -265,11 +260,11 @@ describe('parseJSXOpeningElement', () => { expect(choiceMessage.kind).toBe('ordinal'); expect(choiceMessage.identifier).toBe('position'); expect(choiceMessage.branches).toHaveLength(3); - expect(choiceMessage.branches[0]!.key).toBe('1'); + expect(choiceMessage.branches[0]!.identifier).toBe('1'); expect(choiceMessage.branches[0]!.value).toEqual({ text: 'first' }); - expect(choiceMessage.branches[1]!.key).toBe('2'); + expect(choiceMessage.branches[1]!.identifier).toBe('2'); expect(choiceMessage.branches[1]!.value).toEqual({ text: 'second' }); - expect(choiceMessage.branches[2]!.key).toBe('other'); + expect(choiceMessage.branches[2]!.identifier).toBe('other'); expect(choiceMessage.branches[2]!.value).toEqual({ text: 'other' }); }); @@ -292,16 +287,16 @@ describe('parseJSXOpeningElement', () => { true, ); - const result = parser.parseJSXOpeningElement(createMockContext(), openingElement); + const result = parser.parseJSXOpeningElement(openingElement); expect(result).not.toBeNull(); const choiceMessage = result!.children[0] as ChoiceMessage; expect(choiceMessage.branches).toHaveLength(3); - expect(choiceMessage.branches[0]!.key).toBe('0'); + expect(choiceMessage.branches[0]!.identifier).toBe('0'); expect(choiceMessage.branches[0]!.value).toEqual({ text: 'none' }); - expect(choiceMessage.branches[1]!.key).toBe('one'); + expect(choiceMessage.branches[1]!.identifier).toBe('one'); expect(choiceMessage.branches[1]!.value).toEqual({ text: 'single' }); - expect(choiceMessage.branches[2]!.key).toBe('other'); + expect(choiceMessage.branches[2]!.identifier).toBe('other'); expect(choiceMessage.branches[2]!.value).toEqual({ text: 'many' }); }); @@ -323,14 +318,14 @@ describe('parseJSXOpeningElement', () => { true, ); - const result = parser.parseJSXOpeningElement(createMockContext(), openingElement); + const result = parser.parseJSXOpeningElement(openingElement); expect(result).not.toBeNull(); const choiceMessage = result!.children[0] as ChoiceMessage; expect(choiceMessage.branches).toHaveLength(2); - expect(choiceMessage.branches[0]!.key).toBe('1'); + expect(choiceMessage.branches[0]!.identifier).toBe('1'); expect(choiceMessage.branches[0]!.value).toEqual({ text: 'first' }); - expect(choiceMessage.branches[1]!.key).toBe('2'); + expect(choiceMessage.branches[1]!.identifier).toBe('2'); expect(choiceMessage.branches[1]!.value).toEqual({ text: 'second' }); }); @@ -350,12 +345,12 @@ describe('parseJSXOpeningElement', () => { const openingElement = t.jsxOpeningElement(sayMember, [countAttribute, oneAttribute], true); - const result = parser.parseJSXOpeningElement(createMockContext(), openingElement); + const result = parser.parseJSXOpeningElement(openingElement); expect(result).not.toBeNull(); const choiceMessage = result!.children[0] as ChoiceMessage; expect(choiceMessage.branches).toHaveLength(1); - expect(choiceMessage.branches[0]!.key).toBe('one'); + expect(choiceMessage.branches[0]!.identifier).toBe('one'); expect(choiceMessage.branches[0]!.value).toBeInstanceOf(ArgumentMessage); expect((choiceMessage.branches[0]!.value as ArgumentMessage).identifier).toBe('itemText'); }); @@ -383,12 +378,12 @@ describe('parseJSXOpeningElement', () => { const openingElement = t.jsxOpeningElement(sayMember, [countAttribute, oneAttribute], true); - const result = parser.parseJSXOpeningElement(createMockContext(), openingElement); + const result = parser.parseJSXOpeningElement(openingElement); expect(result).not.toBeNull(); const choiceMessage = result!.children[0] as ChoiceMessage; expect(choiceMessage.branches).toHaveLength(1); - expect(choiceMessage.branches[0]!.key).toBe('one'); + expect(choiceMessage.branches[0]!.identifier).toBe('one'); expect(choiceMessage.branches[0]!.value).toBeInstanceOf(ElementMessage); }); @@ -411,12 +406,12 @@ describe('parseJSXOpeningElement', () => { const openingElement = t.jsxOpeningElement(sayMember, [countAttribute, oneAttribute], true); - const result = parser.parseJSXOpeningElement(createMockContext(), openingElement); + const result = parser.parseJSXOpeningElement(openingElement); expect(result).not.toBeNull(); const choiceMessage = result!.children[0] as ChoiceMessage; expect(choiceMessage.branches).toHaveLength(1); - expect(choiceMessage.branches[0]!.key).toBe('one'); + expect(choiceMessage.branches[0]!.identifier).toBe('one'); expect(choiceMessage.branches[0]!.value).toBeInstanceOf(ElementMessage); }); @@ -438,7 +433,7 @@ describe('parseJSXOpeningElement', () => { true, ); - const result = parser.parseJSXOpeningElement(createMockContext(), openingElement); + const result = parser.parseJSXOpeningElement(openingElement); expect(result).not.toBeNull(); expect(result!.descriptor).toEqual({ id: 'itemCount', context: undefined }); @@ -451,7 +446,7 @@ describe('parseJSXOpeningElement', () => { const openingElement = t.jsxOpeningElement(sayMember, [], true); - const result = parser.parseJSXOpeningElement(createMockContext(), openingElement); + const result = parser.parseJSXOpeningElement(openingElement); expect(result).toBeNull(); }); @@ -460,7 +455,7 @@ describe('parseJSXOpeningElement', () => { const sayIdentifier = t.jsxIdentifier('Say'); const openingElement = t.jsxOpeningElement(sayIdentifier, [], false); - const result = parser.parseJSXOpeningElement(createMockContext(), openingElement); + const result = parser.parseJSXOpeningElement(openingElement); expect(result).toBeNull(); }); @@ -469,15 +464,13 @@ describe('parseJSXOpeningElement', () => { const divIdentifier = t.jsxIdentifier('div'); const openingElement = t.jsxOpeningElement(divIdentifier, [], true); - const result = parser.parseJSXOpeningElement(createMockContext(), openingElement); + const result = parser.parseJSXOpeningElement(openingElement); expect(result).toBeNull(); }); }); describe('parseJSXElement', () => { - const createMockContext = () => new Context([]); - it('should delegate to container parser for non-self-closing', () => { const sayIdentifier = t.jsxIdentifier('Say'); const openingElement = t.jsxOpeningElement(sayIdentifier, [], false); @@ -485,7 +478,7 @@ describe('parseJSXElement', () => { const helloText = t.jsxText('Hello'); const jsxElement = t.jsxElement(openingElement, closingElement, [helloText]); - const result = parser.parseJSXElement(createMockContext(), jsxElement); + const result = parser.parseJSXElement(jsxElement); expect(result).not.toBeNull(); expect(result!.children).toHaveLength(1); @@ -507,7 +500,7 @@ describe('parseJSXElement', () => { const openingElement = t.jsxOpeningElement(sayMember, [countAttribute, oneAttribute], true); const jsxElement = t.jsxElement(openingElement, null, []); - const result = parser.parseJSXElement(createMockContext(), jsxElement); + const result = parser.parseJSXElement(jsxElement); expect(result).not.toBeNull(); // Self-closing elements that match patterns return CompositeMessage with ChoiceMessage as child @@ -528,7 +521,7 @@ describe('parseJSXElement', () => { const openingElement = t.jsxOpeningElement(strongIdentifier, [], true); const jsxElement = t.jsxElement(openingElement, null, []); - const result = parser.parseJSXElement(createMockContext(), jsxElement, true); + const result = parser.parseJSXElement(jsxElement, true); expect(result).toBeInstanceOf(ElementMessage); }); @@ -540,7 +533,7 @@ describe('parseJSXElement', () => { const helloText = t.jsxText('Hello'); const jsxElement = t.jsxElement(openingElement, closingElement, [helloText]); - const result = parser.parseJSXElement(createMockContext(), jsxElement, true); + const result = parser.parseJSXElement(jsxElement, true); expect(result).toBeInstanceOf(ElementMessage); }); @@ -550,7 +543,7 @@ describe('parseJSXElement', () => { const openingElement = t.jsxOpeningElement(strongIdentifier, [], true); const jsxElement = t.jsxElement(openingElement, null, []); - const result = parser.parseJSXElement(createMockContext(), jsxElement, false); + const result = parser.parseJSXElement(jsxElement, false); expect(result).toBeNull(); }); @@ -562,7 +555,7 @@ describe('parseJSXElement', () => { // Empty children won't match any patterns const jsxElement = t.jsxElement(openingElement, closingElement, []); - const result = parser.parseJSXElement(createMockContext(), jsxElement, true); + const result = parser.parseJSXElement(jsxElement, true); // This returns a CompositeMessage wrapping an ElementMessage expect(result).not.toBeNull(); diff --git a/packages/plugin-babel/src/features/jsx/parser.ts b/packages/transform-jsx/src/parser.ts similarity index 55% rename from packages/plugin-babel/src/features/jsx/parser.ts rename to packages/transform-jsx/src/parser.ts index a76d99d..7ff26b0 100644 --- a/packages/plugin-babel/src/features/jsx/parser.ts +++ b/packages/transform-jsx/src/parser.ts @@ -1,19 +1,15 @@ import * as t from '@babel/types'; -import type { Context } from '~/core/context.js'; import { ArgumentMessage, + AUTO_INCREMENT_IDENTIFIER, ChoiceMessage, CompositeMessage, ElementMessage, LiteralMessage, type Message, -} from '~/core/messages/types.js'; -import { getExpressionAsKey } from '../js/parser.js'; +} from '@saykit/config/features/messages'; -export function parseJSXContainerElement( - context: Context, - element: t.JSXElement, -): CompositeMessage | null { +export function parseJSXContainerElement(element: t.JSXElement): CompositeMessage | null { if (element.openingElement.selfClosing) return null; const processed = processJSXOpeningElement(element.openingElement); if (!processed) return null; @@ -26,25 +22,25 @@ export function parseJSXContainerElement( } if (t.isJSXElement(e)) { - c.push(parseJSXElement(context, e, true)); - } - // - else if (t.isJSXFragment(e)) { - c.push(new ElementMessage(context.identifierStore.next(), [], e)); - } - // - else if (t.isJSXExpressionContainer(e)) { + c.push(parseJSXElement(e, true)); + } else if (t.isJSXFragment(e)) { + c.push(new ElementMessage(AUTO_INCREMENT_IDENTIFIER, [], e)); + } else if (t.isJSXExpressionContainer(e)) { if (t.isExpression(e.expression)) - c.push(new ArgumentMessage(getExpressionAsKey(context, e.expression), e.expression)); + c.push(new ArgumentMessage(getExpressionAsIdentifier(e.expression), e.expression)); } return c; }, []); - const descriptorId = // - findAttributeValueIfStringLiteralAsString(element.openingElement.attributes, 'id'); - const descriptorContext = // - findAttributeValueIfStringLiteralAsString(element.openingElement.attributes, 'context'); + const descriptorId = findAttributeValueIfStringLiteralAsString( + element.openingElement.attributes, + 'id', + ); + const descriptorContext = findAttributeValueIfStringLiteralAsString( + element.openingElement.attributes, + 'context', + ); return new CompositeMessage( { id: descriptorId, context: descriptorContext }, @@ -55,51 +51,43 @@ export function parseJSXContainerElement( ); } -export function parseJSXOpeningElement( - context: Context, - element: t.JSXOpeningElement, -): CompositeMessage | null { +export function parseJSXOpeningElement(element: t.JSXOpeningElement): CompositeMessage | null { if (!element.selfClosing) return null; const processed = processJSXOpeningElement(element); if (!processed) return null; const [accessor, kind] = processed; if (typeof kind === 'string' && ['select', 'ordinal', 'plural'].includes(kind)) { - const branches = element.attributes.reduce<{ key: string; value: Message }[]>((b, a) => { + const branches = element.attributes.reduce<{ identifier: string; value: Message }[]>((b, a) => { if (!t.isJSXAttribute(a)) return b; - let key = getAttributeNameAsString(a); - if (key === '_' || key === 'id' || key === 'context') return b; - if (key.startsWith('_') && key.length > 1 && !Number.isNaN(+key.slice(1))) key = key.slice(1); + let identifier = getAttributeNameAsString(a); + if (identifier === '_' || identifier === 'id' || identifier === 'context') return b; + if ( + identifier.startsWith('_') && + identifier.length > 1 && + !Number.isNaN(+identifier.slice(1)) + ) + identifier = identifier.slice(1); if (t.isStringLiteral(a.value)) { - b.push({ key, value: new LiteralMessage(a.value.value) }); - } - // - else if (t.isLiteral(a.value)) { - b.push({ key, value: new ArgumentMessage(key, a.value) }); - } - // - else if (t.isJSXExpressionContainer(a.value)) { + b.push({ identifier, value: new LiteralMessage(a.value.value) }); + } else if (t.isJSXExpressionContainer(a.value)) { if (t.isJSXElement(a.value.expression)) { b.push({ - key, - value: parseJSXElement(context, a.value.expression, true), + identifier, + value: parseJSXElement(a.value.expression, true), }); - } - // - else if (t.isJSXFragment(a.value.expression)) { + } else if (t.isJSXFragment(a.value.expression)) { b.push({ - key, - value: new ElementMessage(context.identifierStore.next(), [], a.value.expression), + identifier, + value: new ElementMessage(AUTO_INCREMENT_IDENTIFIER, [], a.value.expression), }); - } - // - else if (t.isExpression(a.value.expression)) { + } else if (t.isExpression(a.value.expression)) { b.push({ - key, + identifier, value: new ArgumentMessage( - getExpressionAsKey(context, a.value.expression), + getExpressionAsIdentifier(a.value.expression), a.value.expression, ), }); @@ -109,15 +97,16 @@ export function parseJSXOpeningElement( return b; }, []); - const initialiser = // - findAttributeValueIfExpressionOrStringLiteral(element.attributes, '_')!; - const identifier = getExpressionAsKey(context, initialiser); + const initialiser = findAttributeValueIfExpressionOrStringLiteral(element.attributes, '_'); + if (!initialiser) return null; + const identifier = getExpressionAsIdentifier(initialiser); const choice = new ChoiceMessage(kind, identifier, branches, initialiser); - const descriptorId = // - findAttributeValueIfStringLiteralAsString(element.attributes, 'id'); - const descriptorContext = // - findAttributeValueIfStringLiteralAsString(element.attributes, 'context'); + const descriptorId = findAttributeValueIfStringLiteralAsString(element.attributes, 'id'); + const descriptorContext = findAttributeValueIfStringLiteralAsString( + element.attributes, + 'context', + ); return new CompositeMessage( { id: descriptorId, context: descriptorContext }, @@ -131,8 +120,6 @@ export function parseJSXOpeningElement( return null; } -// - function processJSXOpeningElement(element: t.JSXOpeningElement): [t.Node, string | null] | null { if (t.isJSXIdentifier(element.name) && element.name.name === 'Say') { return [element.name, null]; @@ -150,42 +137,29 @@ function processJSXOpeningElement(element: t.JSXOpeningElement): [t.Node, string return null; } -// - -export function parseJSXElement( - context: Context, - element: t.JSXElement, - fallback?: false, -): CompositeMessage | null; +export function parseJSXElement(element: t.JSXElement, fallback?: false): CompositeMessage | null; export function parseJSXElement( - context: Context, element: t.JSXElement, fallback: true, ): CompositeMessage | ElementMessage; -export function parseJSXElement( - context: Context, - element: t.JSXElement, - fallback?: boolean, -): Message | null { +export function parseJSXElement(element: t.JSXElement, fallback?: boolean): Message | null { const message = element.openingElement.selfClosing - ? parseJSXOpeningElement(context, element.openingElement) - : parseJSXContainerElement(context, element); + ? parseJSXOpeningElement(element.openingElement) + : parseJSXContainerElement(element); if (message) return message; if (!fallback) return null; if (element.openingElement.selfClosing) - return new ElementMessage(context.identifierStore.next(), [], element); + return new ElementMessage(AUTO_INCREMENT_IDENTIFIER, [], element); - const preload = context.identifierStore.next(); const fake = t.jsxElement( t.jsxOpeningElement(t.jsxIdentifier('Say'), []), t.jsxClosingElement(t.jsxIdentifier('Say')), element.children, ); - const wrapped = parseJSXElement(context, fake, true); - if (wrapped) return new ElementMessage(preload, [wrapped], element); - context.identifierStore.back(); + const wrapped = parseJSXElement(fake, true); + if (wrapped) return new ElementMessage(AUTO_INCREMENT_IDENTIFIER, [wrapped], element); return null; } @@ -198,11 +172,11 @@ function getAttributeNameAsString(attribute: t.JSXAttribute) { function findAttributeValueIfStringLiteralAsString( attributes: (t.JSXAttribute | t.JSXSpreadAttribute)[], - key: string, + identifier: string, ) { for (const attribute of attributes) { if (!t.isJSXAttribute(attribute)) continue; - if (t.isJSXIdentifier(attribute.name) && attribute.name.name === key) { + if (t.isJSXIdentifier(attribute.name) && attribute.name.name === identifier) { if (t.isStringLiteral(attribute.value)) return attribute.value.value; } } @@ -211,11 +185,11 @@ function findAttributeValueIfStringLiteralAsString( function findAttributeValueIfExpressionOrStringLiteral( attributes: (t.JSXAttribute | t.JSXSpreadAttribute)[], - key: string, + identifier: string, ) { for (const attribute of attributes) { if (!t.isJSXAttribute(attribute)) continue; - if (t.isJSXIdentifier(attribute.name) && attribute.name.name === key) { + if (t.isJSXIdentifier(attribute.name) && attribute.name.name === identifier) { if (t.isJSXExpressionContainer(attribute.value) && t.isExpression(attribute.value.expression)) return attribute.value.expression; if (t.isStringLiteral(attribute.value)) return attribute.value; @@ -223,3 +197,9 @@ function findAttributeValueIfExpressionOrStringLiteral( } return undefined; } + +function getExpressionAsIdentifier(node: t.Node) { + if (t.isIdentifier(node)) return node.name; + if (t.isJSXIdentifier(node)) return node.name; + return AUTO_INCREMENT_IDENTIFIER; +} diff --git a/packages/transform-jsx/tsconfig.json b/packages/transform-jsx/tsconfig.json new file mode 100644 index 0000000..b560bec --- /dev/null +++ b/packages/transform-jsx/tsconfig.json @@ -0,0 +1 @@ +{ "extends": "../../tsconfig.base.json" } diff --git a/packages/transform-jsx/tsdown.config.ts b/packages/transform-jsx/tsdown.config.ts new file mode 100644 index 0000000..bf9e5e6 --- /dev/null +++ b/packages/transform-jsx/tsdown.config.ts @@ -0,0 +1,5 @@ +import { defineConfig } from 'tsdown'; + +export default defineConfig({ + entry: ['src/index.ts', 'src/parser.ts', 'src/generator.ts'], +}); diff --git a/packages/transform-jsx/vitest.config.ts b/packages/transform-jsx/vitest.config.ts new file mode 100644 index 0000000..613c8e7 --- /dev/null +++ b/packages/transform-jsx/vitest.config.ts @@ -0,0 +1,10 @@ +import { defineConfig } from 'vitest/config'; + +export default defineConfig({ + test: { + coverage: { + provider: 'v8', + reportsDirectory: './.coverage', + }, + }, +}); diff --git a/packages/unplugin/src/index.ts b/packages/unplugin/src/index.ts deleted file mode 100644 index 81eae7d..0000000 --- a/packages/unplugin/src/index.ts +++ /dev/null @@ -1,12 +0,0 @@ -import { transformCode } from '@saykit/babel-plugin/core'; -import { createUnplugin } from 'unplugin'; - -export default createUnplugin(() => { - return { - name: 'saykit', - transform: { - filter: { id: { exclude: /node_modules/ } }, - handler: (code, id) => transformCode(id, code), - }, - }; -}); diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 9f7d8eb..8f0e80d 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -10,52 +10,46 @@ importers: devDependencies: '@changesets/cli': specifier: ^2.30.0 - version: 2.30.0(@types/node@25.2.3) + version: 2.30.0(@types/node@25.6.0) '@changesets/config': specifier: ^3.1.3 version: 3.1.3 '@types/node': - specifier: ^25.2.3 - version: 25.2.3 + specifier: ^25.6.0 + version: 25.6.0 '@vitest/coverage-v8': - specifier: ^4.0.18 - version: 4.0.18(vitest@4.0.18(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.31.1)(tsx@4.21.0)(yaml@2.8.2)) + specifier: ^4.1.4 + version: 4.1.4(vitest@4.1.4) husky: specifier: ^9.1.7 version: 9.1.7 oxfmt: - specifier: ^0.36.0 - version: 0.36.0 + specifier: ^0.45.0 + version: 0.45.0 oxlint: - specifier: ^1.51.0 - version: 1.51.0 + specifier: ^1.60.0 + version: 1.60.0 ts-patch: specifier: ^3.3.0 version: 3.3.0 tsdown: - specifier: ^0.20.3 - version: 0.20.3(typescript@5.9.3) + specifier: ^0.21.9 + version: 0.21.9(typescript@6.0.3) turbo: - specifier: ^2.8.5 - version: 2.8.5 + specifier: ^2.9.6 + version: 2.9.6 typescript: - specifier: ^5.9.3 - version: 5.9.3 - typescript-transform-paths: - specifier: ^3.5.6 - version: 3.5.6(typescript@5.9.3) - vite-tsconfig-paths: - specifier: ^6.1.0 - version: 6.1.0(typescript@5.9.3)(vite@7.3.1(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.31.1)(tsx@4.21.0)(yaml@2.8.2)) + specifier: ^6.0.3 + version: 6.0.3 vitest: - specifier: ^4.0.18 - version: 4.0.18(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.31.1)(tsx@4.21.0)(yaml@2.8.2) + specifier: ^4.1.4 + version: 4.1.4(@types/node@25.6.0)(@vitest/coverage-v8@4.1.4)(vite@8.0.8(@types/node@25.6.0)(esbuild@0.28.0)(jiti@2.6.1)(tsx@4.21.0)) - examples/carbon-tsdown: + examples/carbon: dependencies: '@buape/carbon': - specifier: 0.14.0 - version: 0.14.0(hono@4.11.3) + specifier: 0.16.0 + version: 0.16.0(@emnapi/core@1.9.2)(@emnapi/runtime@1.9.2) '@sapphire/snowflake': specifier: ^3.5.5 version: 3.5.5 @@ -67,79 +61,152 @@ importers: version: link:../../packages/integration devDependencies: '@cloudflare/workers-types': - specifier: ^4.20260210.0 - version: 4.20260210.0 + specifier: ^4.20260417.1 + version: 4.20260417.1 '@saykit/config': specifier: workspace:^ version: link:../../packages/config '@saykit/format-po': specifier: workspace:^ version: link:../../packages/format-po + '@saykit/transform-js': + specifier: workspace:^ + version: link:../../packages/transform-js typescript: - specifier: ^5.9.3 - version: 5.9.3 + specifier: ^6.0.3 + version: 6.0.3 unplugin-saykit: specifier: workspace:^ - version: link:../../packages/unplugin + version: link:../../packages/plugin-unplugin wrangler: - specifier: ^4.64.0 - version: 4.64.0(@cloudflare/workers-types@4.20260210.0) + specifier: ^4.83.0 + version: 4.83.0(@cloudflare/workers-types@4.20260417.1) - examples/nextjs-babel: + examples/nextjs: dependencies: '@saykit/react': specifier: workspace:^ version: link:../../packages/integration-react next: - specifier: ^16.1.6 - version: 16.1.6(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + specifier: 16.2.4 + version: 16.2.4(react-dom@19.2.5(react@19.2.5))(react@19.2.5) react: - specifier: ^19.2.4 - version: 19.2.4 + specifier: ^19.2.5 + version: 19.2.5 react-dom: - specifier: ^19.2.4 - version: 19.2.4(react@19.2.4) + specifier: ^19.2.5 + version: 19.2.5(react@19.2.5) saykit: specifier: workspace:^ version: link:../../packages/integration + server-only: + specifier: ^0.0.1 + version: 0.0.1 devDependencies: - '@saykit/babel-plugin': + '@saykit/config': + specifier: workspace:^ + version: link:../../packages/config + '@saykit/format-po': + specifier: workspace:^ + version: link:../../packages/format-po + '@saykit/transform-js': + specifier: workspace:^ + version: link:../../packages/transform-js + '@saykit/transform-jsx': + specifier: workspace:^ + version: link:../../packages/transform-jsx + '@types/node': + specifier: ^25.6.0 + version: 25.6.0 + '@types/react': + specifier: ^19.2.14 + version: 19.2.14 + '@types/react-dom': + specifier: ^19.2.3 + version: 19.2.3(@types/react@19.2.14) + babel-plugin-saykit: specifier: workspace:^ version: link:../../packages/plugin-babel + + examples/tanstack-start: + dependencies: + '@saykit/react': + specifier: workspace:^ + version: link:../../packages/integration-react + '@tanstack/react-router': + specifier: ^1.168.22 + version: 1.168.22(react-dom@19.2.5(react@19.2.5))(react@19.2.5) + '@tanstack/react-router-devtools': + specifier: ^1.166.13 + version: 1.166.13(@tanstack/react-router@1.168.22(react-dom@19.2.5(react@19.2.5))(react@19.2.5))(@tanstack/router-core@1.168.15)(csstype@3.2.3)(react-dom@19.2.5(react@19.2.5))(react@19.2.5) + '@tanstack/react-start': + specifier: ^1.167.41 + version: 1.167.41(react-dom@19.2.5(react@19.2.5))(react@19.2.5)(vite@8.0.8(@types/node@25.6.0)(esbuild@0.28.0)(jiti@2.6.1)(tsx@4.21.0)) + react: + specifier: ^19.2.5 + version: 19.2.5 + react-dom: + specifier: ^19.2.5 + version: 19.2.5(react@19.2.5) + saykit: + specifier: workspace:^ + version: link:../../packages/integration + devDependencies: '@saykit/config': specifier: workspace:^ version: link:../../packages/config '@saykit/format-po': specifier: workspace:^ version: link:../../packages/format-po + '@saykit/transform-js': + specifier: workspace:^ + version: link:../../packages/transform-js + '@saykit/transform-jsx': + specifier: workspace:^ + version: link:../../packages/transform-jsx + '@types/node': + specifier: ^25.6.0 + version: 25.6.0 '@types/react': - specifier: ^19.2.13 - version: 19.2.13 + specifier: ^19.2.14 + version: 19.2.14 + '@types/react-dom': + specifier: ^19.2.3 + version: 19.2.3(@types/react@19.2.14) + '@vitejs/plugin-react': + specifier: ^6.0.1 + version: 6.0.1(vite@8.0.8(@types/node@25.6.0)(esbuild@0.28.0)(jiti@2.6.1)(tsx@4.21.0)) + unplugin-saykit: + specifier: workspace:^ + version: link:../../packages/plugin-unplugin + vite: + specifier: ^8.0.8 + version: 8.0.8(@types/node@25.6.0)(esbuild@0.28.0)(jiti@2.6.1)(tsx@4.21.0) packages/config: dependencies: '@commander-js/extra-typings': specifier: ^14.0.0 version: 14.0.0(commander@14.0.3) - '@saykit/babel-plugin': - specifier: workspace:* - version: link:../plugin-babel commander: specifier: ^14.0.3 version: 14.0.3 + js-sha256: + specifier: ^0.11.1 + version: 0.11.1 picomatch: - specifier: ^4.0.3 - version: 4.0.3 + specifier: ^4.0.4 + version: 4.0.4 + typescript: + specifier: '*' + version: 6.0.3 zod: specifier: ^4.3.6 version: 4.3.6 devDependencies: '@types/picomatch': - specifier: ^4.0.2 - version: 4.0.2 - typescript: - specifier: ^5.9.3 - version: 5.9.3 + specifier: ^4.0.3 + version: 4.0.3 packages/format-po: dependencies: @@ -160,8 +227,8 @@ importers: packages/integration-carbon: devDependencies: '@buape/carbon': - specifier: 0.14.0 - version: 0.14.0(hono@4.11.3) + specifier: 0.16.0 + version: 0.16.0(@emnapi/core@1.9.2)(@emnapi/runtime@1.9.2) saykit: specifier: workspace:^ version: link:../integration @@ -173,32 +240,60 @@ importers: version: 0.0.1 devDependencies: '@types/react': - specifier: ^19.2.13 - version: 19.2.13 + specifier: ^19.2.14 + version: 19.2.14 react: - specifier: ^19.2.4 - version: 19.2.4 + specifier: ^19.2.5 + version: 19.2.5 saykit: specifier: workspace:^ version: link:../integration packages/plugin-babel: + dependencies: + '@babel/core': + specifier: ^7.29.0 + version: 7.29.0 + '@babel/parser': + specifier: ^7.29.2 + version: 7.29.2 + '@saykit/config': + specifier: workspace:^ + version: link:../config + '@types/babel__core': + specifier: ^7.20.5 + version: 7.20.5 + devDependencies: + '@types/babel__parser': + specifier: ^7.1.5 + version: 7.1.5 + + packages/plugin-unplugin: + dependencies: + '@saykit/config': + specifier: workspace:^ + version: link:../config + unplugin: + specifier: ^3.0.0 + version: 3.0.0 + + packages/transform-js: dependencies: '@babel/generator': specifier: ^7.29.1 version: 7.29.1 '@babel/parser': - specifier: ^7.29.0 - version: 7.29.0 + specifier: ^7.29.2 + version: 7.29.2 '@babel/traverse': specifier: ^7.29.0 version: 7.29.0 '@babel/types': specifier: ^7.29.0 version: 7.29.0 - js-sha256: - specifier: ^0.11.1 - version: 0.11.1 + '@saykit/config': + specifier: workspace:^ + version: link:../config devDependencies: '@babel/core': specifier: ^7.29.0 @@ -213,14 +308,39 @@ importers: specifier: ^7.28.0 version: 7.28.0 - packages/unplugin: + packages/transform-jsx: dependencies: - '@saykit/babel-plugin': + '@babel/generator': + specifier: ^7.29.1 + version: 7.29.1 + '@babel/parser': + specifier: ^7.29.2 + version: 7.29.2 + '@babel/traverse': + specifier: ^7.29.0 + version: 7.29.0 + '@babel/types': + specifier: ^7.29.0 + version: 7.29.0 + '@saykit/config': specifier: workspace:^ - version: link:../plugin-babel - unplugin: - specifier: ^3.0.0 - version: 3.0.0 + version: link:../config + '@saykit/transform-js': + specifier: workspace:^ + version: link:../transform-js + devDependencies: + '@babel/core': + specifier: ^7.29.0 + version: 7.29.0 + '@types/babel__core': + specifier: ^7.20.5 + version: 7.20.5 + '@types/babel__generator': + specifier: ^7.27.0 + version: 7.27.0 + '@types/babel__traverse': + specifier: ^7.28.0 + version: 7.28.0 website: dependencies: @@ -231,48 +351,48 @@ importers: specifier: ^1.1.3 version: 1.1.3 fumadocs-core: - specifier: 16.6.16 - version: 16.6.16(@mdx-js/mdx@3.1.1)(@tanstack/react-router@1.166.7(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(@types/estree-jsx@1.0.5)(@types/hast@3.0.4)(@types/mdast@4.0.4)(@types/react@19.2.14)(lucide-react@0.577.0(react@19.2.4))(next@16.1.6(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(zod@4.3.6) + specifier: 16.7.16 + version: 16.7.16(@mdx-js/mdx@3.1.1)(@tanstack/react-router@1.168.22(react-dom@19.2.5(react@19.2.5))(react@19.2.5))(@types/estree-jsx@1.0.5)(@types/hast@3.0.4)(@types/mdast@4.0.4)(@types/react@19.2.14)(lucide-react@1.8.0(react@19.2.5))(next@16.2.4(react-dom@19.2.5(react@19.2.5))(react@19.2.5))(react-dom@19.2.5(react@19.2.5))(react@19.2.5)(zod@4.3.6) fumadocs-mdx: - specifier: 14.2.9 - version: 14.2.9(@types/mdast@4.0.4)(@types/mdx@2.0.13)(@types/react@19.2.14)(fumadocs-core@16.6.16(@mdx-js/mdx@3.1.1)(@tanstack/react-router@1.166.7(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(@types/estree-jsx@1.0.5)(@types/hast@3.0.4)(@types/mdast@4.0.4)(@types/react@19.2.14)(lucide-react@0.577.0(react@19.2.4))(next@16.1.6(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(zod@4.3.6))(next@16.1.6(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(react@19.2.4)(vite@7.3.1(@types/node@25.4.0)(jiti@2.6.1)(lightningcss@1.31.1)(tsx@4.21.0)(yaml@2.8.2)) + specifier: 14.3.0 + version: 14.3.0(@types/mdast@4.0.4)(@types/mdx@2.0.13)(@types/react@19.2.14)(fumadocs-core@16.7.16(@mdx-js/mdx@3.1.1)(@tanstack/react-router@1.168.22(react-dom@19.2.5(react@19.2.5))(react@19.2.5))(@types/estree-jsx@1.0.5)(@types/hast@3.0.4)(@types/mdast@4.0.4)(@types/react@19.2.14)(lucide-react@1.8.0(react@19.2.5))(next@16.2.4(react-dom@19.2.5(react@19.2.5))(react@19.2.5))(react-dom@19.2.5(react@19.2.5))(react@19.2.5)(zod@4.3.6))(next@16.2.4(react-dom@19.2.5(react@19.2.5))(react@19.2.5))(react@19.2.5)(vite@8.0.8(@types/node@25.6.0)(esbuild@0.28.0)(jiti@2.6.1)(tsx@4.21.0)) fumadocs-typescript: - specifier: ^5.1.5 - version: 5.1.5(625b2c47a136537d69828bedd5efad50) + specifier: ^5.2.6 + version: 5.2.6(578e46be5ed1f2691a7b7125b236657d) fumadocs-ui: - specifier: 16.6.16 - version: 16.6.16(@takumi-rs/image-response@0.71.7)(@types/mdx@2.0.13)(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(fumadocs-core@16.6.16(@mdx-js/mdx@3.1.1)(@tanstack/react-router@1.166.7(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(@types/estree-jsx@1.0.5)(@types/hast@3.0.4)(@types/mdast@4.0.4)(@types/react@19.2.14)(lucide-react@0.577.0(react@19.2.4))(next@16.1.6(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(zod@4.3.6))(next@16.1.6(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(tailwindcss@4.2.1) + specifier: 16.7.16 + version: 16.7.16(@tailwindcss/oxide@4.2.2)(@takumi-rs/image-response@0.71.7)(@types/mdx@2.0.13)(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(fumadocs-core@16.7.16(@mdx-js/mdx@3.1.1)(@tanstack/react-router@1.168.22(react-dom@19.2.5(react@19.2.5))(react@19.2.5))(@types/estree-jsx@1.0.5)(@types/hast@3.0.4)(@types/mdast@4.0.4)(@types/react@19.2.14)(lucide-react@1.8.0(react@19.2.5))(next@16.2.4(react-dom@19.2.5(react@19.2.5))(react@19.2.5))(react-dom@19.2.5(react@19.2.5))(react@19.2.5)(zod@4.3.6))(next@16.2.4(react-dom@19.2.5(react@19.2.5))(react@19.2.5))(react-dom@19.2.5(react@19.2.5))(react@19.2.5)(tailwindcss@4.2.2) lucide-react: - specifier: ^0.577.0 - version: 0.577.0(react@19.2.4) + specifier: ^1.8.0 + version: 1.8.0(react@19.2.5) mermaid: specifier: ^11.13.0 - version: 11.13.0 + version: 11.14.0 next: - specifier: 16.1.6 - version: 16.1.6(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + specifier: 16.2.4 + version: 16.2.4(react-dom@19.2.5(react@19.2.5))(react@19.2.5) next-themes: specifier: ^0.4.6 - version: 0.4.6(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + version: 0.4.6(react-dom@19.2.5(react@19.2.5))(react@19.2.5) react: - specifier: ^19.2.4 - version: 19.2.4 + specifier: ^19.2.5 + version: 19.2.5 react-dom: - specifier: ^19.2.4 - version: 19.2.4(react@19.2.4) + specifier: ^19.2.5 + version: 19.2.5(react@19.2.5) tailwind-merge: specifier: ^3.5.0 version: 3.5.0 devDependencies: '@tailwindcss/postcss': specifier: ^4.2.1 - version: 4.2.1 + version: 4.2.2 '@types/mdx': specifier: ^2.0.13 version: 2.0.13 '@types/node': - specifier: ^25.4.0 - version: 25.4.0 + specifier: ^25.6.0 + version: 25.6.0 '@types/react': specifier: ^19.2.14 version: 19.2.14 @@ -280,14 +400,14 @@ importers: specifier: ^19.2.3 version: 19.2.3(@types/react@19.2.14) postcss: - specifier: ^8.5.8 - version: 8.5.8 + specifier: ^8.5.10 + version: 8.5.10 tailwindcss: specifier: ^4.2.1 - version: 4.2.1 + version: 4.2.2 typescript: - specifier: ^5.9.3 - version: 5.9.3 + specifier: ^6.0.3 + version: 6.0.3 packages: @@ -298,6 +418,10 @@ packages: '@antfu/install-pkg@1.1.0': resolution: {integrity: sha512-MGQsmw10ZyI+EJo45CdSER4zEb+p31LpDAFp2Z3gkSd1yqVZGi0Ebx++YTEMonJy4oChEMLsxZ64j8FH6sSqtQ==} + '@babel/code-frame@7.27.1': + resolution: {integrity: sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==} + engines: {node: '>=6.9.0'} + '@babel/code-frame@7.29.0': resolution: {integrity: sha512-9NhCeYjq9+3uxgdtp20LSiJXJvN0FeCtNGpJxuMFZ1Kv3cWUNb6DOhJwUvcVCzKGR66cw4njwM6hrJLqgOwbcw==} engines: {node: '>=6.9.0'} @@ -314,8 +438,8 @@ packages: resolution: {integrity: sha512-qsaF+9Qcm2Qv8SRIMMscAvG4O3lJ0F1GuMo5HR/Bp02LopNgnZBC/EkbevHFeGs4ls/oPz9v+Bsmzbkbe+0dUw==} engines: {node: '>=6.9.0'} - '@babel/generator@8.0.0-rc.1': - resolution: {integrity: sha512-3ypWOOiC4AYHKr8vYRVtWtWmyvcoItHtVqF8paFax+ydpmUdPsJpLBkBBs5ItmhdrwC3a0ZSqqFAdzls4ODP3w==} + '@babel/generator@8.0.0-rc.3': + resolution: {integrity: sha512-em37/13/nR320G4jab/nIIHZgc2Wz2y/D39lxnTyxB4/D/omPQncl/lSdlnJY1OhQcRGugTSIF2l/69o31C9dA==} engines: {node: ^20.19.0 || >=22.12.0} '@babel/helper-compilation-targets@7.28.6': @@ -336,42 +460,58 @@ packages: peerDependencies: '@babel/core': ^7.0.0 + '@babel/helper-plugin-utils@7.28.6': + resolution: {integrity: sha512-S9gzZ/bz83GRysI7gAD4wPT/AI3uCnY+9xn+Mx/KPs2JwHJIz1W8PZkg2cqyt3RNOBM8ejcXhV6y8Og7ly/Dug==} + engines: {node: '>=6.9.0'} + '@babel/helper-string-parser@7.27.1': resolution: {integrity: sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==} engines: {node: '>=6.9.0'} - '@babel/helper-string-parser@8.0.0-rc.1': - resolution: {integrity: sha512-vi/pfmbrOtQmqgfboaBhaCU50G7mcySVu69VU8z+lYoPPB6WzI9VgV7WQfL908M4oeSH5fDkmoupIqoE0SdApw==} + '@babel/helper-string-parser@8.0.0-rc.3': + resolution: {integrity: sha512-AmwWFx1m8G/a5cXkxLxTiWl+YEoWuoFLUCwqMlNuWO1tqAYITQAbCRPUkyBHv1VOFgfjVOqEj6L3u15J5ZCzTA==} engines: {node: ^20.19.0 || >=22.12.0} '@babel/helper-validator-identifier@7.28.5': resolution: {integrity: sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==} engines: {node: '>=6.9.0'} - '@babel/helper-validator-identifier@8.0.0-rc.1': - resolution: {integrity: sha512-I4YnARytXC2RzkLNVnf5qFNFMzp679qZpmtw/V3Jt2uGnWiIxyJtaukjG7R8pSx8nG2NamICpGfljQsogj+FbQ==} + '@babel/helper-validator-identifier@8.0.0-rc.3': + resolution: {integrity: sha512-8AWCJ2VJJyDFlGBep5GpaaQ9AAaE/FjAcrqI7jyssYhtL7WGV0DOKpJsQqM037xDbpRLHXsY8TwU7zDma7coOw==} engines: {node: ^20.19.0 || >=22.12.0} '@babel/helper-validator-option@7.27.1': resolution: {integrity: sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==} engines: {node: '>=6.9.0'} - '@babel/helpers@7.28.6': - resolution: {integrity: sha512-xOBvwq86HHdB7WUDTfKfT/Vuxh7gElQ+Sfti2Cy6yIWNW05P8iUslOVcZ4/sKbE+/jQaukQAdz/gf3724kYdqw==} + '@babel/helpers@7.29.2': + resolution: {integrity: sha512-HoGuUs4sCZNezVEKdVcwqmZN8GoHirLUcLaYVNBK2J0DadGtdcqgr3BCbvH8+XUo4NGjNl3VOtSjEKNzqfFgKw==} engines: {node: '>=6.9.0'} - '@babel/parser@7.29.0': - resolution: {integrity: sha512-IyDgFV5GeDUVX4YdF/3CPULtVGSXXMLh1xVIgdCgxApktqnQV0r7/8Nqthg+8YLGaAtdyIlo2qIdZrbCv4+7ww==} + '@babel/parser@7.29.2': + resolution: {integrity: sha512-4GgRzy/+fsBa72/RZVJmGKPmZu9Byn8o4MoLpmNe1m8ZfYnz5emHLQz3U4gLud6Zwl0RZIcgiLD7Uq7ySFuDLA==} engines: {node: '>=6.0.0'} hasBin: true - '@babel/parser@8.0.0-rc.1': - resolution: {integrity: sha512-6HyyU5l1yK/7h9Ki52i5h6mDAx4qJdiLQO4FdCyJNoB/gy3T3GGJdhQzzbZgvgZCugYBvwtQiWRt94QKedHnkA==} + '@babel/parser@8.0.0-rc.3': + resolution: {integrity: sha512-B20dvP3MfNc/XS5KKCHy/oyWl5IA6Cn9YjXRdDlCjNmUFrjvLXMNUfQq/QUy9fnG2gYkKKcrto2YaF9B32ToOQ==} engines: {node: ^20.19.0 || >=22.12.0} hasBin: true - '@babel/runtime@7.28.6': - resolution: {integrity: sha512-05WQkdpL9COIMz4LjTxGpPNCdlpyimKppYNoJ5Di5EUObifl8t4tuLuUBBZEpoLYOmfvIWrsp9fCl0HoPRVTdA==} + '@babel/plugin-syntax-jsx@7.28.6': + resolution: {integrity: sha512-wgEmr06G6sIpqr8YDwA2dSRTE3bJ+V0IfpzfSY3Lfgd7YWOaAdlykvJi13ZKBt8cZHfgH1IXN+CL656W3uUa4w==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-typescript@7.28.6': + resolution: {integrity: sha512-+nDNmQye7nlnuuHDboPbGm00Vqg3oO8niRRL27/4LYHUsHYh0zJ1xWOz0uRwNFmM1Avzk8wZbc6rdiYhomzv/A==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/runtime@7.29.2': + resolution: {integrity: sha512-JiDShH45zKHWyGe4ZNVRrCjBz8Nh9TMmZG1kh4QTK8hCBTWBi8Da+i7s1fJw7/lYpM4ccepSNfqzZ/QvABBi5g==} engines: {node: '>=6.9.0'} '@babel/template@7.28.6': @@ -386,8 +526,8 @@ packages: resolution: {integrity: sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A==} engines: {node: '>=6.9.0'} - '@babel/types@8.0.0-rc.1': - resolution: {integrity: sha512-ubmJ6TShyaD69VE9DQrlXcdkvJbmwWPB8qYj0H2kaJi29O7vJT9ajSdBd2W8CG34pwL9pYA74fi7RHC1qbLoVQ==} + '@babel/types@8.0.0-rc.3': + resolution: {integrity: sha512-mOm5ZrYmphGfqVWoH5YYMTITb3cDXsFgmvFlvkvWDMsR9X8RFnt7a0Wb6yNIdoFsiMO9WjYLq+U/FMtqIYAF8Q==} engines: {node: ^20.19.0 || >=22.12.0} '@bcoe/v8-coverage@1.0.2': @@ -397,8 +537,8 @@ packages: '@braintree/sanitize-url@7.1.2': resolution: {integrity: sha512-jigsZK+sMF/cuiB7sERuo9V7N9jx+dhmHHnQyDSVdpZwVutaBu7WvNYqMDLSgFgfB30n452TP3vjDAvFC973mA==} - '@buape/carbon@0.14.0': - resolution: {integrity: sha512-mavllPK2iVpRNRtC4C8JOUdJ1hdV0+LDelFW+pjpJaM31MBLMfIJ+f/LlYTIK5QrEcQsXOC+6lU2e0gmgjWhIQ==} + '@buape/carbon@0.16.0': + resolution: {integrity: sha512-OJ9Z1WCQ6gY7yBE49MOgcfxxgl2n6NIdtyDdMOGVRP/gs31xKSfxhdnp7mOz7OQfK/rskwCixAI1fsDlTiLvQQ==} '@changesets/apply-release-plan@7.1.0': resolution: {integrity: sha512-yq8ML3YS7koKQ/9bk1PqO0HMzApIFNwjlwCnwFEXMzNe8NpzeeYYKCmnhWJGkN8g7E51MnWaSbqRcTcdIxUgnQ==} @@ -474,50 +614,50 @@ packages: resolution: {integrity: sha512-SIOD2DxrRRwQ+jgzlXCqoEFiKOFqaPjhnNTGKXSRLvp1HiOvapLaFG2kEr9dYQTYe8rKrd9uvDUzmAITeNyaHQ==} engines: {node: '>=18.0.0'} - '@cloudflare/unenv-preset@2.12.1': - resolution: {integrity: sha512-tP/Wi+40aBJovonSNJSsS7aFJY0xjuckKplmzDs2Xat06BJ68B6iG7YDUWXJL8gNn0gqW7YC5WhlYhO3QbugQA==} + '@cloudflare/unenv-preset@2.16.0': + resolution: {integrity: sha512-8ovsRpwzPoEqPUzoErAYVv8l3FMZNeBVQfJTvtzP4AgLSRGZISRfuChFxHWUQd3n6cnrwkuTGxT+2cGo8EsyYg==} peerDependencies: unenv: 2.0.0-rc.24 - workerd: ^1.20260115.0 + workerd: 1.20260301.1 || ~1.20260302.1 || ~1.20260303.1 || ~1.20260304.1 || >1.20260305.0 <2.0.0-0 peerDependenciesMeta: workerd: optional: true - '@cloudflare/workerd-darwin-64@1.20260210.0': - resolution: {integrity: sha512-e3vMgzr8ZM6VjpJVFrnMBhjvFhlMIkhT+BLpBk3pKaWsrXao+azDlmzzxB3Zf4CZ8LmCEtaP7n5d2mNGL6Dqww==} + '@cloudflare/workerd-darwin-64@1.20260415.1': + resolution: {integrity: sha512-dsxaKsQm3LnPGNPEdsRv09QN3Y4DqCw7kX5j6noKqbAtro2jTr95sVlYM1jUxZ5FkOl1f7SXgaKKB9t5H5Nkbg==} engines: {node: '>=16'} cpu: [x64] os: [darwin] - '@cloudflare/workerd-darwin-arm64@1.20260210.0': - resolution: {integrity: sha512-ng2uLJVMrI5VrcAS26gDGM+qxCuWD4ZA8VR4i88RdyM8TLn+AqPFisrvn7AMA+QSv0+ck+ZdFtXek7qNp2gNuA==} + '@cloudflare/workerd-darwin-arm64@1.20260415.1': + resolution: {integrity: sha512-+JgSgVA49KyKteHRA1SnonE4Zn5Ei5zdAp5FQMxFmXI8qulZw4Hl7safXxRyK4i9sTO8gl7TFOKO5Q64VPvSDQ==} engines: {node: '>=16'} cpu: [arm64] os: [darwin] - '@cloudflare/workerd-linux-64@1.20260210.0': - resolution: {integrity: sha512-frn2/+6DV59h13JbGSk9ATvJw3uORWssFIKZ/G/to+WRrIDQgCpSrjLtGbFSSn5eBEhYOvwxPKc7IrppkmIj/w==} + '@cloudflare/workerd-linux-64@1.20260415.1': + resolution: {integrity: sha512-tU+9pwsqCy8afOVlGtiWrWQc/fedQK4SRm4KPIAt+zOiQWDxWASm6YGBUJis5c648WN80yz47qnmdDi8DQNOcA==} engines: {node: '>=16'} cpu: [x64] os: [linux] - '@cloudflare/workerd-linux-arm64@1.20260210.0': - resolution: {integrity: sha512-0fmxEHaDcAF+7gcqnBcQdBCOzNvGz3mTMwqxEYJc5xZgFwQf65/dYK5fnV8z56GVNqu88NEnLMG3DD2G7Ey1vw==} + '@cloudflare/workerd-linux-arm64@1.20260415.1': + resolution: {integrity: sha512-bR9uITnV19r5NQ14xnypi2xHXu2iQvfYV8cVgx0JouFUmWwTEEAwFVojDdssGq93VHX9hr/pi2IRUZeegbYBog==} engines: {node: '>=16'} cpu: [arm64] os: [linux] - '@cloudflare/workerd-windows-64@1.20260210.0': - resolution: {integrity: sha512-G/Apjk/QLNnwbu8B0JO9FuAJKHNr+gl8X3G/7qaUrpwIkPx5JFQElVE6LKk4teSrycvAy5AzLFAL0lOB1xsUIQ==} + '@cloudflare/workerd-windows-64@1.20260415.1': + resolution: {integrity: sha512-4NuMLlerI0Ijua3Ir8HXQ+qyNvCUDEG5gDco5Om+sAiK6rnWiz+aGoSlbB8W16yW9QAgzCstbmXLiVknUBflfQ==} engines: {node: '>=16'} cpu: [x64] os: [win32] - '@cloudflare/workers-types@4.20260120.0': - resolution: {integrity: sha512-B8pueG+a5S+mdK3z8oKu1ShcxloZ7qWb68IEyLLaepvdryIbNC7JVPcY0bWsjS56UQVKc5fnyRge3yZIwc9bxw==} + '@cloudflare/workers-types@4.20260405.1': + resolution: {integrity: sha512-PokTmySa+D6MY01R1UfYH48korsN462NK/fl3aw47Hg7XuLuSo/RTpjT0vtWaJhJoFY5tHGOBBIbDcIc8wltLg==} - '@cloudflare/workers-types@4.20260210.0': - resolution: {integrity: sha512-zHaF0RZVYUQwNCJCECnNAJdMur72Lk3FMiD6wU78Dx3Bv7DQRcuXNmPNuJmsGnosVZCcWintHlPTQ/4BEiDG5w==} + '@cloudflare/workers-types@4.20260417.1': + resolution: {integrity: sha512-ke3GkFfFyfSxdLRR6LPbnfYAu3RNKqX0eYfu/FNnluBN9rLgYVqT+QEPgSEx1yq7XTOok+Bub1td9xvknaOz4A==} '@commander-js/extra-typings@14.0.0': resolution: {integrity: sha512-hIn0ncNaJRLkZrxBIp5AsW/eXEHNKYQBh0aPdoUqNgD+Io3NIykQqpKFyKcuasZhicGaEZJX/JBSIkZ4e5x8Dg==} @@ -528,36 +668,36 @@ packages: resolution: {integrity: sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==} engines: {node: '>=12'} - '@discordjs/voice@0.19.0': - resolution: {integrity: sha512-UyX6rGEXzVyPzb1yvjHtPfTlnLvB5jX/stAMdiytHhfoydX+98hfympdOwsnTktzr+IRvphxTbdErgYDJkEsvw==} + '@discordjs/voice@0.19.2': + resolution: {integrity: sha512-3yJ255e4ag3wfZu/DSxeOZK1UtnqNxnspmLaQetGT0pDkThNZoHs+Zg6dgZZ19JEVomXygvfHn9lNpICZuYtEA==} engines: {node: '>=22.12.0'} - '@emnapi/core@1.7.1': - resolution: {integrity: sha512-o1uhUASyo921r2XtHYOHy7gdkGLge8ghBEQHMWmyJFoXlpU58kIrhhN3w26lpQb6dspetweapMn2CSNwQ8I4wg==} + '@emnapi/core@1.9.2': + resolution: {integrity: sha512-UC+ZhH3XtczQYfOlu3lNEkdW/p4dsJ1r/bP7H8+rhao3TTTMO1ATq/4DdIi23XuGoFY+Cz0JmCbdVl0hz9jZcA==} - '@emnapi/runtime@1.7.1': - resolution: {integrity: sha512-PVtJr5CmLwYAU9PZDMITZoR5iAOShYREoR45EyyLrbntV50mdePTgUn4AmOw90Ifcj+x2kRjdzr1HP3RrNiHGA==} + '@emnapi/runtime@1.9.2': + resolution: {integrity: sha512-3U4+MIWHImeyu1wnmVygh5WlgfYDtyf0k8AbLhMFxOipihf6nrWC4syIm/SwEeec0mNSafiiNnMJwbza/Is6Lw==} - '@emnapi/wasi-threads@1.1.0': - resolution: {integrity: sha512-WI0DdZ8xFSbgMjR1sFsKABJ/C5OnRrjT06JXbZKexJGrDuPTzZdDYfFlsgcCXCyf+suG5QU2e/y1Wo2V/OapLQ==} + '@emnapi/wasi-threads@1.2.1': + resolution: {integrity: sha512-uTII7OYF+/Mes/MrcIOYp5yOtSMLBWSIoLPpcgwipoiKbli6k322tcoFsxoIIxPDqW01SQGAgko4EzZi2BNv2w==} - '@esbuild/aix-ppc64@0.27.2': - resolution: {integrity: sha512-GZMB+a0mOMZs4MpDbj8RJp4cw+w1WV5NYD6xzgvzUJ5Ek2jerwfO2eADyI6ExDSUED+1X8aMbegahsJi+8mgpw==} + '@esbuild/aix-ppc64@0.27.3': + resolution: {integrity: sha512-9fJMTNFTWZMh5qwrBItuziu834eOCUcEqymSH7pY+zoMVEZg3gcPuBNxH1EvfVYe9h0x/Ptw8KBzv7qxb7l8dg==} engines: {node: '>=18'} cpu: [ppc64] os: [aix] - '@esbuild/aix-ppc64@0.27.3': - resolution: {integrity: sha512-9fJMTNFTWZMh5qwrBItuziu834eOCUcEqymSH7pY+zoMVEZg3gcPuBNxH1EvfVYe9h0x/Ptw8KBzv7qxb7l8dg==} + '@esbuild/aix-ppc64@0.27.7': + resolution: {integrity: sha512-EKX3Qwmhz1eMdEJokhALr0YiD0lhQNwDqkPYyPhiSwKrh7/4KRjQc04sZ8db+5DVVnZ1LmbNDI1uAMPEUBnQPg==} engines: {node: '>=18'} cpu: [ppc64] os: [aix] - '@esbuild/android-arm64@0.27.2': - resolution: {integrity: sha512-pvz8ZZ7ot/RBphf8fv60ljmaoydPU12VuXHImtAs0XhLLw+EXBi2BLe3OYSBslR4rryHvweW5gmkKFwTiFy6KA==} + '@esbuild/aix-ppc64@0.28.0': + resolution: {integrity: sha512-lhRUCeuOyJQURhTxl4WkpFTjIsbDayJHih5kZC1giwE+MhIzAb7mEsQMqMf18rHLsrb5qI1tafG20mLxEWcWlA==} engines: {node: '>=18'} - cpu: [arm64] - os: [android] + cpu: [ppc64] + os: [aix] '@esbuild/android-arm64@0.27.3': resolution: {integrity: sha512-YdghPYUmj/FX2SYKJ0OZxf+iaKgMsKHVPF1MAq/P8WirnSpCStzKJFjOjzsW0QQ7oIAiccHdcqjbHmJxRb/dmg==} @@ -565,10 +705,16 @@ packages: cpu: [arm64] os: [android] - '@esbuild/android-arm@0.27.2': - resolution: {integrity: sha512-DVNI8jlPa7Ujbr1yjU2PfUSRtAUZPG9I1RwW4F4xFB1Imiu2on0ADiI/c3td+KmDtVKNbi+nffGDQMfcIMkwIA==} + '@esbuild/android-arm64@0.27.7': + resolution: {integrity: sha512-62dPZHpIXzvChfvfLJow3q5dDtiNMkwiRzPylSCfriLvZeq0a1bWChrGx/BbUbPwOrsWKMn8idSllklzBy+dgQ==} engines: {node: '>=18'} - cpu: [arm] + cpu: [arm64] + os: [android] + + '@esbuild/android-arm64@0.28.0': + resolution: {integrity: sha512-+WzIXQOSaGs33tLEgYPYe/yQHf0WTU0X42Jca3y8NWMbUVhp7rUnw+vAsRC/QiDrdD31IszMrZy+qwPOPjd+rw==} + engines: {node: '>=18'} + cpu: [arm64] os: [android] '@esbuild/android-arm@0.27.3': @@ -577,10 +723,16 @@ packages: cpu: [arm] os: [android] - '@esbuild/android-x64@0.27.2': - resolution: {integrity: sha512-z8Ank4Byh4TJJOh4wpz8g2vDy75zFL0TlZlkUkEwYXuPSgX8yzep596n6mT7905kA9uHZsf/o2OJZubl2l3M7A==} + '@esbuild/android-arm@0.27.7': + resolution: {integrity: sha512-jbPXvB4Yj2yBV7HUfE2KHe4GJX51QplCN1pGbYjvsyCZbQmies29EoJbkEc+vYuU5o45AfQn37vZlyXy4YJ8RQ==} engines: {node: '>=18'} - cpu: [x64] + cpu: [arm] + os: [android] + + '@esbuild/android-arm@0.28.0': + resolution: {integrity: sha512-wqh0ByljabXLKHeWXYLqoJ5jKC4XBaw6Hk08OfMrCRd2nP2ZQ5eleDZC41XHyCNgktBGYMbqnrJKq/K/lzPMSQ==} + engines: {node: '>=18'} + cpu: [arm] os: [android] '@esbuild/android-x64@0.27.3': @@ -589,11 +741,17 @@ packages: cpu: [x64] os: [android] - '@esbuild/darwin-arm64@0.27.2': - resolution: {integrity: sha512-davCD2Zc80nzDVRwXTcQP/28fiJbcOwvdolL0sOiOsbwBa72kegmVU0Wrh1MYrbuCL98Omp5dVhQFWRKR2ZAlg==} + '@esbuild/android-x64@0.27.7': + resolution: {integrity: sha512-x5VpMODneVDb70PYV2VQOmIUUiBtY3D3mPBG8NxVk5CogneYhkR7MmM3yR/uMdITLrC1ml/NV1rj4bMJuy9MCg==} engines: {node: '>=18'} - cpu: [arm64] - os: [darwin] + cpu: [x64] + os: [android] + + '@esbuild/android-x64@0.28.0': + resolution: {integrity: sha512-+VJggoaKhk2VNNqVL7f6S189UzShHC/mR9EE8rDdSkdpN0KflSwWY/gWjDrNxxisg8Fp1ZCD9jLMo4m0OUfeUA==} + engines: {node: '>=18'} + cpu: [x64] + os: [android] '@esbuild/darwin-arm64@0.27.3': resolution: {integrity: sha512-Re491k7ByTVRy0t3EKWajdLIr0gz2kKKfzafkth4Q8A5n1xTHrkqZgLLjFEHVD+AXdUGgQMq+Godfq45mGpCKg==} @@ -601,10 +759,16 @@ packages: cpu: [arm64] os: [darwin] - '@esbuild/darwin-x64@0.27.2': - resolution: {integrity: sha512-ZxtijOmlQCBWGwbVmwOF/UCzuGIbUkqB1faQRf5akQmxRJ1ujusWsb3CVfk/9iZKr2L5SMU5wPBi1UWbvL+VQA==} + '@esbuild/darwin-arm64@0.27.7': + resolution: {integrity: sha512-5lckdqeuBPlKUwvoCXIgI2D9/ABmPq3Rdp7IfL70393YgaASt7tbju3Ac+ePVi3KDH6N2RqePfHnXkaDtY9fkw==} engines: {node: '>=18'} - cpu: [x64] + cpu: [arm64] + os: [darwin] + + '@esbuild/darwin-arm64@0.28.0': + resolution: {integrity: sha512-0T+A9WZm+bZ84nZBtk1ckYsOvyA3x7e2Acj1KdVfV4/2tdG4fzUp91YHx+GArWLtwqp77pBXVCPn2We7Letr0Q==} + engines: {node: '>=18'} + cpu: [arm64] os: [darwin] '@esbuild/darwin-x64@0.27.3': @@ -613,11 +777,17 @@ packages: cpu: [x64] os: [darwin] - '@esbuild/freebsd-arm64@0.27.2': - resolution: {integrity: sha512-lS/9CN+rgqQ9czogxlMcBMGd+l8Q3Nj1MFQwBZJyoEKI50XGxwuzznYdwcav6lpOGv5BqaZXqvBSiB/kJ5op+g==} + '@esbuild/darwin-x64@0.27.7': + resolution: {integrity: sha512-rYnXrKcXuT7Z+WL5K980jVFdvVKhCHhUwid+dDYQpH+qu+TefcomiMAJpIiC2EM3Rjtq0sO3StMV/+3w3MyyqQ==} engines: {node: '>=18'} - cpu: [arm64] - os: [freebsd] + cpu: [x64] + os: [darwin] + + '@esbuild/darwin-x64@0.28.0': + resolution: {integrity: sha512-fyzLm/DLDl/84OCfp2f/XQ4flmORsjU7VKt8HLjvIXChJoFFOIL6pLJPH4Yhd1n1gGFF9mPwtlN5Wf82DZs+LQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [darwin] '@esbuild/freebsd-arm64@0.27.3': resolution: {integrity: sha512-ipTYM2fjt3kQAYOvo6vcxJx3nBYAzPjgTCk7QEgZG8AUO3ydUhvelmhrbOheMnGOlaSFUoHXB6un+A7q4ygY9w==} @@ -625,10 +795,16 @@ packages: cpu: [arm64] os: [freebsd] - '@esbuild/freebsd-x64@0.27.2': - resolution: {integrity: sha512-tAfqtNYb4YgPnJlEFu4c212HYjQWSO/w/h/lQaBK7RbwGIkBOuNKQI9tqWzx7Wtp7bTPaGC6MJvWI608P3wXYA==} + '@esbuild/freebsd-arm64@0.27.7': + resolution: {integrity: sha512-B48PqeCsEgOtzME2GbNM2roU29AMTuOIN91dsMO30t+Ydis3z/3Ngoj5hhnsOSSwNzS+6JppqWsuhTp6E82l2w==} engines: {node: '>=18'} - cpu: [x64] + cpu: [arm64] + os: [freebsd] + + '@esbuild/freebsd-arm64@0.28.0': + resolution: {integrity: sha512-l9GeW5UZBT9k9brBYI+0WDffcRxgHQD8ShN2Ur4xWq/NFzUKm3k5lsH4PdaRgb2w7mI9u61nr2gI2mLI27Nh3Q==} + engines: {node: '>=18'} + cpu: [arm64] os: [freebsd] '@esbuild/freebsd-x64@0.27.3': @@ -637,11 +813,17 @@ packages: cpu: [x64] os: [freebsd] - '@esbuild/linux-arm64@0.27.2': - resolution: {integrity: sha512-hYxN8pr66NsCCiRFkHUAsxylNOcAQaxSSkHMMjcpx0si13t1LHFphxJZUiGwojB1a/Hd5OiPIqDdXONia6bhTw==} + '@esbuild/freebsd-x64@0.27.7': + resolution: {integrity: sha512-jOBDK5XEjA4m5IJK3bpAQF9/Lelu/Z9ZcdhTRLf4cajlB+8VEhFFRjWgfy3M1O4rO2GQ/b2dLwCUGpiF/eATNQ==} engines: {node: '>=18'} - cpu: [arm64] - os: [linux] + cpu: [x64] + os: [freebsd] + + '@esbuild/freebsd-x64@0.28.0': + resolution: {integrity: sha512-BXoQai/A0wPO6Es3yFJ7APCiKGc1tdAEOgeTNy3SsB491S3aHn4S4r3e976eUnPdU+NbdtmBuLncYir2tMU9Nw==} + engines: {node: '>=18'} + cpu: [x64] + os: [freebsd] '@esbuild/linux-arm64@0.27.3': resolution: {integrity: sha512-sZOuFz/xWnZ4KH3YfFrKCf1WyPZHakVzTiqji3WDc0BCl2kBwiJLCXpzLzUBLgmp4veFZdvN5ChW4Eq/8Fc2Fg==} @@ -649,10 +831,16 @@ packages: cpu: [arm64] os: [linux] - '@esbuild/linux-arm@0.27.2': - resolution: {integrity: sha512-vWfq4GaIMP9AIe4yj1ZUW18RDhx6EPQKjwe7n8BbIecFtCQG4CfHGaHuh7fdfq+y3LIA2vGS/o9ZBGVxIDi9hw==} + '@esbuild/linux-arm64@0.27.7': + resolution: {integrity: sha512-RZPHBoxXuNnPQO9rvjh5jdkRmVizktkT7TCDkDmQ0W2SwHInKCAV95GRuvdSvA7w4VMwfCjUiPwDi0ZO6Nfe9A==} engines: {node: '>=18'} - cpu: [arm] + cpu: [arm64] + os: [linux] + + '@esbuild/linux-arm64@0.28.0': + resolution: {integrity: sha512-RVyzfb3FWsGA55n6WY0MEIEPURL1FcbhFE6BffZEMEekfCzCIMtB5yyDcFnVbTnwk+CLAgTujmV/Lgvih56W+A==} + engines: {node: '>=18'} + cpu: [arm64] os: [linux] '@esbuild/linux-arm@0.27.3': @@ -661,10 +849,16 @@ packages: cpu: [arm] os: [linux] - '@esbuild/linux-ia32@0.27.2': - resolution: {integrity: sha512-MJt5BRRSScPDwG2hLelYhAAKh9imjHK5+NE/tvnRLbIqUWa+0E9N4WNMjmp/kXXPHZGqPLxggwVhz7QP8CTR8w==} + '@esbuild/linux-arm@0.27.7': + resolution: {integrity: sha512-RkT/YXYBTSULo3+af8Ib0ykH8u2MBh57o7q/DAs3lTJlyVQkgQvlrPTnjIzzRPQyavxtPtfg0EopvDyIt0j1rA==} engines: {node: '>=18'} - cpu: [ia32] + cpu: [arm] + os: [linux] + + '@esbuild/linux-arm@0.28.0': + resolution: {integrity: sha512-CjaaREJagqJp7iTaNQjjidaNbCKYcd4IDkzbwwxtSvjI7NZm79qiHc8HqciMddQ6CKvJT6aBd8lO9kN/ZudLlw==} + engines: {node: '>=18'} + cpu: [arm] os: [linux] '@esbuild/linux-ia32@0.27.3': @@ -673,10 +867,16 @@ packages: cpu: [ia32] os: [linux] - '@esbuild/linux-loong64@0.27.2': - resolution: {integrity: sha512-lugyF1atnAT463aO6KPshVCJK5NgRnU4yb3FUumyVz+cGvZbontBgzeGFO1nF+dPueHD367a2ZXe1NtUkAjOtg==} + '@esbuild/linux-ia32@0.27.7': + resolution: {integrity: sha512-GA48aKNkyQDbd3KtkplYWT102C5sn/EZTY4XROkxONgruHPU72l+gW+FfF8tf2cFjeHaRbWpOYa/uRBz/Xq1Pg==} engines: {node: '>=18'} - cpu: [loong64] + cpu: [ia32] + os: [linux] + + '@esbuild/linux-ia32@0.28.0': + resolution: {integrity: sha512-KBnSTt1kxl9x70q+ydterVdl+Cn0H18ngRMRCEQfrbqdUuntQQ0LoMZv47uB97NljZFzY6HcfqEZ2SAyIUTQBQ==} + engines: {node: '>=18'} + cpu: [ia32] os: [linux] '@esbuild/linux-loong64@0.27.3': @@ -685,10 +885,16 @@ packages: cpu: [loong64] os: [linux] - '@esbuild/linux-mips64el@0.27.2': - resolution: {integrity: sha512-nlP2I6ArEBewvJ2gjrrkESEZkB5mIoaTswuqNFRv/WYd+ATtUpe9Y09RnJvgvdag7he0OWgEZWhviS1OTOKixw==} + '@esbuild/linux-loong64@0.27.7': + resolution: {integrity: sha512-a4POruNM2oWsD4WKvBSEKGIiWQF8fZOAsycHOt6JBpZ+JN2n2JH9WAv56SOyu9X5IqAjqSIPTaJkqN8F7XOQ5Q==} engines: {node: '>=18'} - cpu: [mips64el] + cpu: [loong64] + os: [linux] + + '@esbuild/linux-loong64@0.28.0': + resolution: {integrity: sha512-zpSlUce1mnxzgBADvxKXX5sl8aYQHo2ezvMNI8I0lbblJtp8V4odlm3Yzlj7gPyt3T8ReksE6bK+pT3WD+aJRg==} + engines: {node: '>=18'} + cpu: [loong64] os: [linux] '@esbuild/linux-mips64el@0.27.3': @@ -697,10 +903,16 @@ packages: cpu: [mips64el] os: [linux] - '@esbuild/linux-ppc64@0.27.2': - resolution: {integrity: sha512-C92gnpey7tUQONqg1n6dKVbx3vphKtTHJaNG2Ok9lGwbZil6DrfyecMsp9CrmXGQJmZ7iiVXvvZH6Ml5hL6XdQ==} + '@esbuild/linux-mips64el@0.27.7': + resolution: {integrity: sha512-KabT5I6StirGfIz0FMgl1I+R1H73Gp0ofL9A3nG3i/cYFJzKHhouBV5VWK1CSgKvVaG4q1RNpCTR2LuTVB3fIw==} engines: {node: '>=18'} - cpu: [ppc64] + cpu: [mips64el] + os: [linux] + + '@esbuild/linux-mips64el@0.28.0': + resolution: {integrity: sha512-2jIfP6mmjkdmeTlsX/9vmdmhBmKADrWqN7zcdtHIeNSCH1SqIoNI63cYsjQR8J+wGa4Y5izRcSHSm8K3QWmk3w==} + engines: {node: '>=18'} + cpu: [mips64el] os: [linux] '@esbuild/linux-ppc64@0.27.3': @@ -709,10 +921,16 @@ packages: cpu: [ppc64] os: [linux] - '@esbuild/linux-riscv64@0.27.2': - resolution: {integrity: sha512-B5BOmojNtUyN8AXlK0QJyvjEZkWwy/FKvakkTDCziX95AowLZKR6aCDhG7LeF7uMCXEJqwa8Bejz5LTPYm8AvA==} + '@esbuild/linux-ppc64@0.27.7': + resolution: {integrity: sha512-gRsL4x6wsGHGRqhtI+ifpN/vpOFTQtnbsupUF5R5YTAg+y/lKelYR1hXbnBdzDjGbMYjVJLJTd2OFmMewAgwlQ==} engines: {node: '>=18'} - cpu: [riscv64] + cpu: [ppc64] + os: [linux] + + '@esbuild/linux-ppc64@0.28.0': + resolution: {integrity: sha512-bc0FE9wWeC0WBm49IQMPSPILRocGTQt3j5KPCA8os6VprfuJ7KD+5PzESSrJ6GmPIPJK965ZJHTUlSA6GNYEhg==} + engines: {node: '>=18'} + cpu: [ppc64] os: [linux] '@esbuild/linux-riscv64@0.27.3': @@ -721,10 +939,16 @@ packages: cpu: [riscv64] os: [linux] - '@esbuild/linux-s390x@0.27.2': - resolution: {integrity: sha512-p4bm9+wsPwup5Z8f4EpfN63qNagQ47Ua2znaqGH6bqLlmJ4bx97Y9JdqxgGZ6Y8xVTixUnEkoKSHcpRlDnNr5w==} + '@esbuild/linux-riscv64@0.27.7': + resolution: {integrity: sha512-hL25LbxO1QOngGzu2U5xeXtxXcW+/GvMN3ejANqXkxZ/opySAZMrc+9LY/WyjAan41unrR3YrmtTsUpwT66InQ==} engines: {node: '>=18'} - cpu: [s390x] + cpu: [riscv64] + os: [linux] + + '@esbuild/linux-riscv64@0.28.0': + resolution: {integrity: sha512-SQPZOwoTTT/HXFXQJG/vBX8sOFagGqvZyXcgLA3NhIqcBv1BJU1d46c0rGcrij2B56Z2rNiSLaZOYW5cUk7yLQ==} + engines: {node: '>=18'} + cpu: [riscv64] os: [linux] '@esbuild/linux-s390x@0.27.3': @@ -733,10 +957,16 @@ packages: cpu: [s390x] os: [linux] - '@esbuild/linux-x64@0.27.2': - resolution: {integrity: sha512-uwp2Tip5aPmH+NRUwTcfLb+W32WXjpFejTIOWZFw/v7/KnpCDKG66u4DLcurQpiYTiYwQ9B7KOeMJvLCu/OvbA==} + '@esbuild/linux-s390x@0.27.7': + resolution: {integrity: sha512-2k8go8Ycu1Kb46vEelhu1vqEP+UeRVj2zY1pSuPdgvbd5ykAw82Lrro28vXUrRmzEsUV0NzCf54yARIK8r0fdw==} engines: {node: '>=18'} - cpu: [x64] + cpu: [s390x] + os: [linux] + + '@esbuild/linux-s390x@0.28.0': + resolution: {integrity: sha512-SCfR0HN8CEEjnYnySJTd2cw0k9OHB/YFzt5zgJEwa+wL/T/raGWYMBqwDNAC6dqFKmJYZoQBRfHjgwLHGSrn3Q==} + engines: {node: '>=18'} + cpu: [s390x] os: [linux] '@esbuild/linux-x64@0.27.3': @@ -745,11 +975,17 @@ packages: cpu: [x64] os: [linux] - '@esbuild/netbsd-arm64@0.27.2': - resolution: {integrity: sha512-Kj6DiBlwXrPsCRDeRvGAUb/LNrBASrfqAIok+xB0LxK8CHqxZ037viF13ugfsIpePH93mX7xfJp97cyDuTZ3cw==} + '@esbuild/linux-x64@0.27.7': + resolution: {integrity: sha512-hzznmADPt+OmsYzw1EE33ccA+HPdIqiCRq7cQeL1Jlq2gb1+OyWBkMCrYGBJ+sxVzve2ZJEVeePbLM2iEIZSxA==} engines: {node: '>=18'} - cpu: [arm64] - os: [netbsd] + cpu: [x64] + os: [linux] + + '@esbuild/linux-x64@0.28.0': + resolution: {integrity: sha512-us0dSb9iFxIi8srnpl931Nvs65it/Jd2a2K3qs7fz2WfGPHqzfzZTfec7oxZJRNPXPnNYZtanmRc4AL/JwVzHQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [linux] '@esbuild/netbsd-arm64@0.27.3': resolution: {integrity: sha512-sDpk0RgmTCR/5HguIZa9n9u+HVKf40fbEUt+iTzSnCaGvY9kFP0YKBWZtJaraonFnqef5SlJ8/TiPAxzyS+UoA==} @@ -757,10 +993,16 @@ packages: cpu: [arm64] os: [netbsd] - '@esbuild/netbsd-x64@0.27.2': - resolution: {integrity: sha512-HwGDZ0VLVBY3Y+Nw0JexZy9o/nUAWq9MlV7cahpaXKW6TOzfVno3y3/M8Ga8u8Yr7GldLOov27xiCnqRZf0tCA==} + '@esbuild/netbsd-arm64@0.27.7': + resolution: {integrity: sha512-b6pqtrQdigZBwZxAn1UpazEisvwaIDvdbMbmrly7cDTMFnw/+3lVxxCTGOrkPVnsYIosJJXAsILG9XcQS+Yu6w==} engines: {node: '>=18'} - cpu: [x64] + cpu: [arm64] + os: [netbsd] + + '@esbuild/netbsd-arm64@0.28.0': + resolution: {integrity: sha512-CR/RYotgtCKwtftMwJlUU7xCVNg3lMYZ0RzTmAHSfLCXw3NtZtNpswLEj/Kkf6kEL3Gw+BpOekRX0BYCtklhUw==} + engines: {node: '>=18'} + cpu: [arm64] os: [netbsd] '@esbuild/netbsd-x64@0.27.3': @@ -769,11 +1011,17 @@ packages: cpu: [x64] os: [netbsd] - '@esbuild/openbsd-arm64@0.27.2': - resolution: {integrity: sha512-DNIHH2BPQ5551A7oSHD0CKbwIA/Ox7+78/AWkbS5QoRzaqlev2uFayfSxq68EkonB+IKjiuxBFoV8ESJy8bOHA==} + '@esbuild/netbsd-x64@0.27.7': + resolution: {integrity: sha512-OfatkLojr6U+WN5EDYuoQhtM+1xco+/6FSzJJnuWiUw5eVcicbyK3dq5EeV/QHT1uy6GoDhGbFpprUiHUYggrw==} engines: {node: '>=18'} - cpu: [arm64] - os: [openbsd] + cpu: [x64] + os: [netbsd] + + '@esbuild/netbsd-x64@0.28.0': + resolution: {integrity: sha512-nU1yhmYutL+fQ71Kxnhg8uEOdC0pwEW9entHykTgEbna2pw2dkbFSMeqjjyHZoCmt8SBkOSvV+yNmm94aUrrqw==} + engines: {node: '>=18'} + cpu: [x64] + os: [netbsd] '@esbuild/openbsd-arm64@0.27.3': resolution: {integrity: sha512-AIcMP77AvirGbRl/UZFTq5hjXK+2wC7qFRGoHSDrZ5v5b8DK/GYpXW3CPRL53NkvDqb9D+alBiC/dV0Fb7eJcw==} @@ -781,10 +1029,16 @@ packages: cpu: [arm64] os: [openbsd] - '@esbuild/openbsd-x64@0.27.2': - resolution: {integrity: sha512-/it7w9Nb7+0KFIzjalNJVR5bOzA9Vay+yIPLVHfIQYG/j+j9VTH84aNB8ExGKPU4AzfaEvN9/V4HV+F+vo8OEg==} + '@esbuild/openbsd-arm64@0.27.7': + resolution: {integrity: sha512-AFuojMQTxAz75Fo8idVcqoQWEHIXFRbOc1TrVcFSgCZtQfSdc1RXgB3tjOn/krRHENUB4j00bfGjyl2mJrU37A==} engines: {node: '>=18'} - cpu: [x64] + cpu: [arm64] + os: [openbsd] + + '@esbuild/openbsd-arm64@0.28.0': + resolution: {integrity: sha512-cXb5vApOsRsxsEl4mcZ1XY3D4DzcoMxR/nnc4IyqYs0rTI8ZKmW6kyyg+11Z8yvgMfAEldKzP7AdP64HnSC/6g==} + engines: {node: '>=18'} + cpu: [arm64] os: [openbsd] '@esbuild/openbsd-x64@0.27.3': @@ -793,11 +1047,17 @@ packages: cpu: [x64] os: [openbsd] - '@esbuild/openharmony-arm64@0.27.2': - resolution: {integrity: sha512-LRBbCmiU51IXfeXk59csuX/aSaToeG7w48nMwA6049Y4J4+VbWALAuXcs+qcD04rHDuSCSRKdmY63sruDS5qag==} + '@esbuild/openbsd-x64@0.27.7': + resolution: {integrity: sha512-+A1NJmfM8WNDv5CLVQYJ5PshuRm/4cI6WMZRg1by1GwPIQPCTs1GLEUHwiiQGT5zDdyLiRM/l1G0Pv54gvtKIg==} engines: {node: '>=18'} - cpu: [arm64] - os: [openharmony] + cpu: [x64] + os: [openbsd] + + '@esbuild/openbsd-x64@0.28.0': + resolution: {integrity: sha512-8wZM2qqtv9UP3mzy7HiGYNH/zjTA355mpeuA+859TyR+e+Tc08IHYpLJuMsfpDJwoLo1ikIJI8jC3GFjnRClzA==} + engines: {node: '>=18'} + cpu: [x64] + os: [openbsd] '@esbuild/openharmony-arm64@0.27.3': resolution: {integrity: sha512-NinAEgr/etERPTsZJ7aEZQvvg/A6IsZG/LgZy+81wON2huV7SrK3e63dU0XhyZP4RKGyTm7aOgmQk0bGp0fy2g==} @@ -805,11 +1065,17 @@ packages: cpu: [arm64] os: [openharmony] - '@esbuild/sunos-x64@0.27.2': - resolution: {integrity: sha512-kMtx1yqJHTmqaqHPAzKCAkDaKsffmXkPHThSfRwZGyuqyIeBvf08KSsYXl+abf5HDAPMJIPnbBfXvP2ZC2TfHg==} + '@esbuild/openharmony-arm64@0.27.7': + resolution: {integrity: sha512-+KrvYb/C8zA9CU/g0sR6w2RBw7IGc5J2BPnc3dYc5VJxHCSF1yNMxTV5LQ7GuKteQXZtspjFbiuW5/dOj7H4Yw==} engines: {node: '>=18'} - cpu: [x64] - os: [sunos] + cpu: [arm64] + os: [openharmony] + + '@esbuild/openharmony-arm64@0.28.0': + resolution: {integrity: sha512-FLGfyizszcef5C3YtoyQDACyg95+dndv79i2EekILBofh5wpCa1KuBqOWKrEHZg3zrL3t5ouE5jgr94vA+Wb2w==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openharmony] '@esbuild/sunos-x64@0.27.3': resolution: {integrity: sha512-PanZ+nEz+eWoBJ8/f8HKxTTD172SKwdXebZ0ndd953gt1HRBbhMsaNqjTyYLGLPdoWHy4zLU7bDVJztF5f3BHA==} @@ -817,11 +1083,17 @@ packages: cpu: [x64] os: [sunos] - '@esbuild/win32-arm64@0.27.2': - resolution: {integrity: sha512-Yaf78O/B3Kkh+nKABUF++bvJv5Ijoy9AN1ww904rOXZFLWVc5OLOfL56W+C8F9xn5JQZa3UX6m+IktJnIb1Jjg==} + '@esbuild/sunos-x64@0.27.7': + resolution: {integrity: sha512-ikktIhFBzQNt/QDyOL580ti9+5mL/YZeUPKU2ivGtGjdTYoqz6jObj6nOMfhASpS4GU4Q/Clh1QtxWAvcYKamA==} engines: {node: '>=18'} - cpu: [arm64] - os: [win32] + cpu: [x64] + os: [sunos] + + '@esbuild/sunos-x64@0.28.0': + resolution: {integrity: sha512-1ZgjUoEdHZZl/YlV76TSCz9Hqj9h9YmMGAgAPYd+q4SicWNX3G5GCyx9uhQWSLcbvPW8Ni7lj4gDa1T40akdlw==} + engines: {node: '>=18'} + cpu: [x64] + os: [sunos] '@esbuild/win32-arm64@0.27.3': resolution: {integrity: sha512-B2t59lWWYrbRDw/tjiWOuzSsFh1Y/E95ofKz7rIVYSQkUYBjfSgf6oeYPNWHToFRr2zx52JKApIcAS/D5TUBnA==} @@ -829,10 +1101,16 @@ packages: cpu: [arm64] os: [win32] - '@esbuild/win32-ia32@0.27.2': - resolution: {integrity: sha512-Iuws0kxo4yusk7sw70Xa2E2imZU5HoixzxfGCdxwBdhiDgt9vX9VUCBhqcwY7/uh//78A1hMkkROMJq9l27oLQ==} + '@esbuild/win32-arm64@0.27.7': + resolution: {integrity: sha512-7yRhbHvPqSpRUV7Q20VuDwbjW5kIMwTHpptuUzV+AA46kiPze5Z7qgt6CLCK3pWFrHeNfDd1VKgyP4O+ng17CA==} engines: {node: '>=18'} - cpu: [ia32] + cpu: [arm64] + os: [win32] + + '@esbuild/win32-arm64@0.28.0': + resolution: {integrity: sha512-Q9StnDmQ/enxnpxCCLSg0oo4+34B9TdXpuyPeTedN/6+iXBJ4J+zwfQI28u/Jl40nOYAxGoNi7mFP40RUtkmUA==} + engines: {node: '>=18'} + cpu: [arm64] os: [win32] '@esbuild/win32-ia32@0.27.3': @@ -841,10 +1119,16 @@ packages: cpu: [ia32] os: [win32] - '@esbuild/win32-x64@0.27.2': - resolution: {integrity: sha512-sRdU18mcKf7F+YgheI/zGf5alZatMUTKj/jNS6l744f9u3WFu4v7twcUI9vu4mknF4Y9aDlblIie0IM+5xxaqQ==} + '@esbuild/win32-ia32@0.27.7': + resolution: {integrity: sha512-SmwKXe6VHIyZYbBLJrhOoCJRB/Z1tckzmgTLfFYOfpMAx63BJEaL9ExI8x7v0oAO3Zh6D/Oi1gVxEYr5oUCFhw==} engines: {node: '>=18'} - cpu: [x64] + cpu: [ia32] + os: [win32] + + '@esbuild/win32-ia32@0.28.0': + resolution: {integrity: sha512-zF3ag/gfiCe6U2iczcRzSYJKH1DCI+ByzSENHlM2FcDbEeo5Zd2C86Aq0tKUYAJJ1obRP84ymxIAksZUcdztHA==} + engines: {node: '>=18'} + cpu: [ia32] os: [win32] '@esbuild/win32-x64@0.27.3': @@ -853,6 +1137,18 @@ packages: cpu: [x64] os: [win32] + '@esbuild/win32-x64@0.27.7': + resolution: {integrity: sha512-56hiAJPhwQ1R4i+21FVF7V8kSD5zZTdHcVuRFMW0hn753vVfQN8xlx4uOPT4xoGH0Z/oVATuR82AiqSTDIpaHg==} + engines: {node: '>=18'} + cpu: [x64] + os: [win32] + + '@esbuild/win32-x64@0.28.0': + resolution: {integrity: sha512-pEl1bO9mfAmIC+tW5btTmrKaujg3zGtUmWNdCw/xs70FBjwAL3o9OEKNHvNmnyylD6ubxUERiEhdsL0xBQ9efw==} + engines: {node: '>=18'} + cpu: [x64] + os: [win32] + '@floating-ui/core@1.7.5': resolution: {integrity: sha512-1Ih4WTWyw0+lKyFMcBHGbb5U5FtuHJuujoyyr5zTaWS5EYMeT6Jb2AuDeftsCsEuchO+mM2ij5+q9crhydzLhQ==} @@ -868,34 +1164,25 @@ packages: '@floating-ui/utils@0.2.11': resolution: {integrity: sha512-RiB/yIh78pcIxl6lLMG0CgBXAZ2Y0eVHqMPYugu+9U0AeT6YBeiJpf7lbdJNIugFP5SIjwNRgo4DhR1Qxi26Gg==} - '@formatjs/fast-memoize@3.1.0': - resolution: {integrity: sha512-b5mvSWCI+XVKiz5WhnBCY3RJ4ZwfjAidU0yVlKa3d3MSgKmH1hC3tBGEAtYyN5mqL7N0G5x0BOUYyO8CEupWgg==} - - '@formatjs/intl-localematcher@0.8.1': - resolution: {integrity: sha512-xwEuwQFdtSq1UKtQnyTZWC+eHdv7Uygoa+H2k/9uzBVQjDyp9r20LNDNKedWXll7FssT3GRHvqsdJGYSUWqYFA==} - - '@fumadocs/tailwind@0.0.3': - resolution: {integrity: sha512-/FWcggMz9BhoX+13xBoZLX+XX9mYvJ50dkTqy3IfocJqua65ExcsKfxwKH8hgTO3vA5KnWv4+4jU7LaW2AjAmQ==} + '@fumadocs/tailwind@0.0.5': + resolution: {integrity: sha512-ENKPWUDRmriccsrUDE4bDBq3FNr/ms3BP2rWlsAEMV1yP23pcCaan+ceGfeBUsAQjw7sj9Q3R4Kl3g/TCStPzQ==} peerDependencies: + '@tailwindcss/oxide': ^4.0.0 tailwindcss: ^4.0.0 peerDependenciesMeta: + '@tailwindcss/oxide': + optional: true tailwindcss: optional: true - '@hono/node-server@1.19.9': - resolution: {integrity: sha512-vHL6w3ecZsky+8P5MD+eFfaGTyCeOHUIFYMGpQGbrBTSmNNoxv0if69rEZ5giu36weC5saFuznL411gRX7bJDw==} - engines: {node: '>=18.14.1'} - peerDependencies: - hono: ^4 - '@iconify/types@2.0.0': resolution: {integrity: sha512-+wluvCrRhXrhyOmRDJ3q8mux9JkKy5SJ/v8ol2tu4FVjyYvtEzkc/3pK15ET6RKg4b4w4BmTk1+gsCUhf21Ykg==} '@iconify/utils@3.1.0': resolution: {integrity: sha512-Zlzem1ZXhI1iHeeERabLNzBHdOa4VhQbqAcOQaMKuTuyZCpwKbC2R4Dd0Zo3g9EAc+Y4fiarO8HIHRAth7+skw==} - '@img/colour@1.0.0': - resolution: {integrity: sha512-A5P/LfWGFSl6nsckYtjw9da+19jB8hkJ6ACTGcDfEJ0aE+l2n2El7dsVM7UVHZQ9s2lmYMWlrS21YLy2IR1LUw==} + '@img/colour@1.1.0': + resolution: {integrity: sha512-Td76q7j57o/tLVdgS746cYARfSyxk8iEfRxewL9h4OMzYhbW4TAcppl0mT4eyqXddh6L/jwoM75mo7ixa/pCeQ==} engines: {node: '>=18'} '@img/sharp-darwin-arm64@0.34.5': @@ -1084,8 +1371,8 @@ packages: '@mdx-js/mdx@3.1.1': resolution: {integrity: sha512-f6ZO2ifpwAQIpzGWaBQT2TXxPv6z3RBzQKpVftEWN78Vl/YweF1uwussDx8ECAXVtr3Rs89fKyG9YlzUs9DyGQ==} - '@mermaid-js/parser@1.0.1': - resolution: {integrity: sha512-opmV19kN1JsK0T6HhhokHpcVkqKpF+x2pPDKKM2ThHtZAB5F4PROopk0amuVYK5qMrIA4erzpNm8gmPNJgMDxQ==} + '@mermaid-js/parser@1.1.0': + resolution: {integrity: sha512-gxK9ZX2+Fex5zu8LhRQoMeMPEHbc73UKZ0FQ54YrQtUxE1VVhMwzeNtKRPAu5aXks4FasbMe4xB4bWrmq6Jlxw==} '@messageformat/date-skeleton@2.0.0-0': resolution: {integrity: sha512-gkCatAK4MYlhjKYWxkfRM6Ql0M1VmA1DK6A9rszUBprZpQox/XqX987AI2w7YoEz0p5DgkPOpI6PK1mW08yNqQ==} @@ -1100,60 +1387,63 @@ packages: '@messageformat/parser@5.1.1': resolution: {integrity: sha512-3p0YRGCcTUCYvBKLIxtDDyrJ0YijGIwrTRu1DT8gIviIDZru8H23+FkY6MJBzM1n9n20CiM4VeDYuBsrrwnLjg==} - '@napi-rs/wasm-runtime@1.1.1': - resolution: {integrity: sha512-p64ah1M1ld8xjWv3qbvFwHiFVWrq1yFvV4f7w+mzaqiR4IlSgkqhcRdHwsGgomwzBH51sRY4NEowLxnaBjcW/A==} + '@napi-rs/wasm-runtime@1.1.4': + resolution: {integrity: sha512-3NQNNgA1YSlJb/kMH1ildASP9HW7/7kYnRI2szWJaofaS1hWmbGI4H+d3+22aGzXXN9IJ+n+GiFVcGipJP18ow==} + peerDependencies: + '@emnapi/core': ^1.7.1 + '@emnapi/runtime': ^1.7.1 - '@next/env@16.1.6': - resolution: {integrity: sha512-N1ySLuZjnAtN3kFnwhAwPvZah8RJxKasD7x1f8shFqhncnWZn4JMfg37diLNuoHsLAlrDfM3g4mawVdtAG8XLQ==} + '@next/env@16.2.4': + resolution: {integrity: sha512-dKkkOzOSwFYe5RX6y26fZgkSpVAlIOJKQHIiydQcrWH6y/97+RceSOAdjZ14Qa3zLduVUy0TXcn+EiM6t4rPgw==} - '@next/swc-darwin-arm64@16.1.6': - resolution: {integrity: sha512-wTzYulosJr/6nFnqGW7FrG3jfUUlEf8UjGA0/pyypJl42ExdVgC6xJgcXQ+V8QFn6niSG2Pb8+MIG1mZr2vczw==} + '@next/swc-darwin-arm64@16.2.4': + resolution: {integrity: sha512-OXTFFox5EKN1Ym08vfrz+OXxmCcEjT4SFMbNRsWZE99dMqt2Kcusl5MqPXcW232RYkMLQTy0hqgAMEsfEd/l2A==} engines: {node: '>= 10'} cpu: [arm64] os: [darwin] - '@next/swc-darwin-x64@16.1.6': - resolution: {integrity: sha512-BLFPYPDO+MNJsiDWbeVzqvYd4NyuRrEYVB5k2N3JfWncuHAy2IVwMAOlVQDFjj+krkWzhY2apvmekMkfQR0CUQ==} + '@next/swc-darwin-x64@16.2.4': + resolution: {integrity: sha512-XhpVnUfmYWvD3YrXu55XdcAkQtOnvaI6wtQa8fuF5fGoKoxIUZ0kWPtcOfqJEWngFF/lOS9l3+O9CcownhiQxQ==} engines: {node: '>= 10'} cpu: [x64] os: [darwin] - '@next/swc-linux-arm64-gnu@16.1.6': - resolution: {integrity: sha512-OJYkCd5pj/QloBvoEcJ2XiMnlJkRv9idWA/j0ugSuA34gMT6f5b7vOiCQHVRpvStoZUknhl6/UxOXL4OwtdaBw==} + '@next/swc-linux-arm64-gnu@16.2.4': + resolution: {integrity: sha512-Mx/tjlNA3G8kg14QvuGAJ4xBwPk1tUHq56JxZ8CXnZwz1Etz714soCEzGQQzVMz4bEnGPowzkV6Xrp6wAkEWOQ==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] libc: [glibc] - '@next/swc-linux-arm64-musl@16.1.6': - resolution: {integrity: sha512-S4J2v+8tT3NIO9u2q+S0G5KdvNDjXfAv06OhfOzNDaBn5rw84DGXWndOEB7d5/x852A20sW1M56vhC/tRVbccQ==} + '@next/swc-linux-arm64-musl@16.2.4': + resolution: {integrity: sha512-iVMMp14514u7Nup2umQS03nT/bN9HurK8ufylC3FZNykrwjtx7V1A7+4kvhbDSCeonTVqV3Txnv0Lu+m2oDXNg==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] libc: [musl] - '@next/swc-linux-x64-gnu@16.1.6': - resolution: {integrity: sha512-2eEBDkFlMMNQnkTyPBhQOAyn2qMxyG2eE7GPH2WIDGEpEILcBPI/jdSv4t6xupSP+ot/jkfrCShLAa7+ZUPcJQ==} + '@next/swc-linux-x64-gnu@16.2.4': + resolution: {integrity: sha512-EZOvm1aQWgnI/N/xcWOlnS3RQBk0VtVav5Zo7n4p0A7UKyTDx047k8opDbXgBpHl4CulRqRfbw3QrX2w5UOXMQ==} engines: {node: '>= 10'} cpu: [x64] os: [linux] libc: [glibc] - '@next/swc-linux-x64-musl@16.1.6': - resolution: {integrity: sha512-oicJwRlyOoZXVlxmIMaTq7f8pN9QNbdes0q2FXfRsPhfCi8n8JmOZJm5oo1pwDaFbnnD421rVU409M3evFbIqg==} + '@next/swc-linux-x64-musl@16.2.4': + resolution: {integrity: sha512-h9FxsngCm9cTBf71AR4fGznDEDx1hS7+kSEiIRjq5kO1oXWm07DxVGZjCvk0SGx7TSjlUqhI8oOyz7NfwAdPoA==} engines: {node: '>= 10'} cpu: [x64] os: [linux] libc: [musl] - '@next/swc-win32-arm64-msvc@16.1.6': - resolution: {integrity: sha512-gQmm8izDTPgs+DCWH22kcDmuUp7NyiJgEl18bcr8irXA5N2m2O+JQIr6f3ct42GOs9c0h8QF3L5SzIxcYAAXXw==} + '@next/swc-win32-arm64-msvc@16.2.4': + resolution: {integrity: sha512-3NdJV5OXMSOeJYijX+bjaLge3mJBlh4ybydbT4GFoB/2hAojWHtMhl3CYlYoMrjPuodp0nzFVi4Tj2+WaMg+Ow==} engines: {node: '>= 10'} cpu: [arm64] os: [win32] - '@next/swc-win32-x64-msvc@16.1.6': - resolution: {integrity: sha512-NRfO39AIrzBnixKbjuo2YiYhB6o9d8v/ymU9m/Xk8cyVk+k7XylniXkHwjs4s70wedVffc6bQNbufk5v0xEm0A==} + '@next/swc-win32-x64-msvc@16.2.4': + resolution: {integrity: sha512-kMVGgsqhO5YTYODD9IPGGhA6iprWidQckK3LmPeW08PIFENRmgfb4MjXHO+p//d+ts2rpjvK5gXWzXSMrPl9cw==} engines: {node: '>= 10'} cpu: [x64] os: [win32] @@ -1170,253 +1460,272 @@ packages: resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} engines: {node: '>= 8'} + '@oozcitak/dom@2.0.2': + resolution: {integrity: sha512-GjpKhkSYC3Mj4+lfwEyI1dqnsKTgwGy48ytZEhm4A/xnH/8z9M3ZVXKr/YGQi3uCLs1AEBS+x5T2JPiueEDW8w==} + engines: {node: '>=20.0'} + + '@oozcitak/infra@2.0.2': + resolution: {integrity: sha512-2g+E7hoE2dgCz/APPOEK5s3rMhJvNxSMBrP+U+j1OWsIbtSpWxxlUjq1lU8RIsFJNYv7NMlnVsCuHcUzJW+8vA==} + engines: {node: '>=20.0'} + + '@oozcitak/url@3.0.0': + resolution: {integrity: sha512-ZKfET8Ak1wsLAiLWNfFkZc/BraDccuTJKR6svTYc7sVjbR+Iu0vtXdiDMY4o6jaFl5TW2TlS7jbLl4VovtAJWQ==} + engines: {node: '>=20.0'} + + '@oozcitak/util@10.0.0': + resolution: {integrity: sha512-hAX0pT/73190NLqBPPWSdBVGtbY6VOhWYK3qqHqtXQ1gK7kS2yz4+ivsN07hpJ6I3aeMtKP6J6npsEKOAzuTLA==} + engines: {node: '>=20.0'} + '@orama/orama@3.1.18': resolution: {integrity: sha512-a61ljmRVVyG5MC/698C8/FfFDw5a8LOIvyOLW5fztgUXqUpc1jOfQzOitSCbge657OgXXThmY3Tk8fpiDb4UcA==} engines: {node: '>= 20.0.0'} - '@oxc-project/types@0.112.0': - resolution: {integrity: sha512-m6RebKHIRsax2iCwVpYW2ErQwa4ywHJrE4sCK3/8JK8ZZAWOKXaRJFl/uP51gaVyyXlaS4+chU1nSCdzYf6QqQ==} + '@oxc-project/types@0.124.0': + resolution: {integrity: sha512-VBFWMTBvHxS11Z5Lvlr3IWgrwhMTXV+Md+EQF0Xf60+wAdsGFTBx7X7K/hP4pi8N7dcm1RvcHwDxZ16Qx8keUg==} + + '@oxc-project/types@0.126.0': + resolution: {integrity: sha512-oGfVtjAgwQVVpfBrbtk4e1XDyWHRFta6BS3GWVzrF8xYBT2VGQAk39yJS/wFSMrZqoiCU4oghT3Ch0HaHGIHcQ==} - '@oxfmt/binding-android-arm-eabi@0.36.0': - resolution: {integrity: sha512-Z4yVHJWx/swHHjtr0dXrBZb6LxS+qNz1qdza222mWwPTUK4L790+5i3LTgjx3KYGBzcYpjaiZBw4vOx94dH7MQ==} + '@oxfmt/binding-android-arm-eabi@0.45.0': + resolution: {integrity: sha512-A/UMxFob1fefCuMeGxQBulGfFE38g2Gm23ynr3u6b+b7fY7/ajGbNsa3ikMIkGMLJW/TRoQaMoP1kME7S+815w==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm] os: [android] - '@oxfmt/binding-android-arm64@0.36.0': - resolution: {integrity: sha512-3ElCJRFNPQl7jexf2CAa9XmAm8eC5JPrIDSjc9jSchkVSFTEqyL0NtZinBB2h1a4i4JgP1oGl/5G5n8YR4FN8Q==} + '@oxfmt/binding-android-arm64@0.45.0': + resolution: {integrity: sha512-L63z4uZmHjgvvqvMJD7mwff8aSBkM0+X4uFr6l6U5t6+Qc9DCLVZWIunJ7Gm4fn4zHPdSq6FFQnhu9yqqobxIg==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [android] - '@oxfmt/binding-darwin-arm64@0.36.0': - resolution: {integrity: sha512-nak4znWCqIExKhYSY/mz/lWsqWIpdsS7o0+SRzXR1Q0m7GrMcG1UrF1pS7TLGZhhkf7nTfEF7q6oZzJiodRDuw==} + '@oxfmt/binding-darwin-arm64@0.45.0': + resolution: {integrity: sha512-UV34dd623FzqT+outIGndsCA/RBB+qgB3XVQhgmmJ9PJwa37NzPC9qzgKeOhPKxVk2HW+JKldQrVL54zs4Noww==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [darwin] - '@oxfmt/binding-darwin-x64@0.36.0': - resolution: {integrity: sha512-V4GP96thDnpKx6ADnMDnhIXNdtV+Ql9D4HUU+a37VTeVbs5qQSF/s6hhUP1b3xUqU7iRcwh72jUU2Y12rtGHAw==} + '@oxfmt/binding-darwin-x64@0.45.0': + resolution: {integrity: sha512-pMNJv0CMa1pDefVPeNbuQxibh8ITpWDFEhMC/IBB9Zlu76EbgzYwrzI4Cb11mqX2+rIYN70UTrh3z06TM59ptQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [darwin] - '@oxfmt/binding-freebsd-x64@0.36.0': - resolution: {integrity: sha512-/xapWCADfI5wrhxpEUjhI9fnw7MV5BUZizVa8e24n3VSK6A3Y1TB/ClOP1tfxNspykFKXp4NBWl6NtDJP3osqQ==} + '@oxfmt/binding-freebsd-x64@0.45.0': + resolution: {integrity: sha512-xTcRoxbbo61sW2+ZRPeH+vp/o9G8gkdhiVumFU+TpneiPm14c79l6GFlxPXlCE9bNWikigbsrvJw46zCVAQFfg==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [freebsd] - '@oxfmt/binding-linux-arm-gnueabihf@0.36.0': - resolution: {integrity: sha512-1lOmv61XMFIH5uNm27620kRRzWt/RK6tdn250BRDoG9W7OXGOQ5UyI1HVT+SFkoOoKztBiinWgi68+NA1MjBVQ==} + '@oxfmt/binding-linux-arm-gnueabihf@0.45.0': + resolution: {integrity: sha512-hWL8Hdni+3U1mPFx1UtWeGp3tNb6EhBAUHRMbKUxVkOp3WwoJbpVO2bfUVbS4PfpledviXXNHSTl1veTa6FhkQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm] os: [linux] - '@oxfmt/binding-linux-arm-musleabihf@0.36.0': - resolution: {integrity: sha512-vMH23AskdR1ujUS9sPck2Df9rBVoZUnCVY86jisILzIQ/QQ/yKUTi7tgnIvydPx7TyB/48wsQ5QMr5Knq5p/aw==} + '@oxfmt/binding-linux-arm-musleabihf@0.45.0': + resolution: {integrity: sha512-6Blt/0OBT7vvfQpqYuYbpbFLPqSiaYpEJzUUWhinPEuADypDbtV1+LdjM0vYBNGPvnj85ex7lTerEX6JGcPt9w==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm] os: [linux] - '@oxfmt/binding-linux-arm64-gnu@0.36.0': - resolution: {integrity: sha512-Hy1V+zOBHpBiENRx77qrUTt5aPDHeCASRc8K5KwwAHkX2AKP0nV89eL17hsZrE9GmnXFjsNmd80lyf7aRTXsbw==} + '@oxfmt/binding-linux-arm64-gnu@0.45.0': + resolution: {integrity: sha512-jLjoLfe+hGfjhA8hNBSdw85yCA8ePKq7ME4T+g6P9caQXvmt6IhE2X7iVjnVdkmYUWEzZrxlh4p6RkDmAMJY/A==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [linux] libc: [glibc] - '@oxfmt/binding-linux-arm64-musl@0.36.0': - resolution: {integrity: sha512-SPGLJkOIHSIC6ABUQ5V8NqJpvYhMJueJv26NYqfCnwi/Mn6A61amkpJJ9Suy0Nmvs+OWESJpcebrBUbXPGZyQQ==} + '@oxfmt/binding-linux-arm64-musl@0.45.0': + resolution: {integrity: sha512-XQKXZIKYJC3GQJ8FnD3iMntpw69Wd9kDDK/Xt79p6xnFYlGGxSNv2vIBvRTDg5CKByWFWWZLCRDOXoP/m6YN4g==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [linux] libc: [musl] - '@oxfmt/binding-linux-ppc64-gnu@0.36.0': - resolution: {integrity: sha512-3EuoyB8x9x8ysYJjbEO/M9fkSk72zQKnXCvpZMDHXlnY36/1qMp55Nm0PrCwjGO/1pen5hdOVkz9WmP3nAp2IQ==} + '@oxfmt/binding-linux-ppc64-gnu@0.45.0': + resolution: {integrity: sha512-+g5RiG+xOkdrCWkKodv407nTvMq4vYM18Uox2MhZBm/YoqFxxJpWKsloskFFG5NU13HGPw1wzYjjOVcyd9moCA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [ppc64] os: [linux] libc: [glibc] - '@oxfmt/binding-linux-riscv64-gnu@0.36.0': - resolution: {integrity: sha512-MpY3itLwpGh8dnywtrZtaZ604T1m715SydCKy0+qTxetv+IHzuA+aO/AGzrlzUNYZZmtWtmDBrChZGibvZxbRQ==} + '@oxfmt/binding-linux-riscv64-gnu@0.45.0': + resolution: {integrity: sha512-V7dXKoSyEbWAkkSF4JJNtF+NJZDmJoSarSoP30WCsB3X636Rehd3CvxBj49FIJxEBFWhvcUjGSHVeU8Erck1bQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [riscv64] os: [linux] libc: [glibc] - '@oxfmt/binding-linux-riscv64-musl@0.36.0': - resolution: {integrity: sha512-mmDhe4Vtx+XwQPRPn/V25+APnkApYgZ23q+6GVsNYY98pf3aU0aI3Me96pbRs/AfJ1jIiGC+/6q71FEu8dHcHw==} + '@oxfmt/binding-linux-riscv64-musl@0.45.0': + resolution: {integrity: sha512-Vdelft1sAEYojVGgcODEFXSWYQYlIvoyIGWebKCuUibd1tvS1TjTx413xG2ZLuHpYj45CkN/ztMLMX6jrgqpgg==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [riscv64] os: [linux] libc: [musl] - '@oxfmt/binding-linux-s390x-gnu@0.36.0': - resolution: {integrity: sha512-AYXhU+DmNWLSnvVwkHM92fuYhogtVHab7UQrPNaDf1sxadugg9gWVmcgJDlIwxJdpk5CVW/TFvwUKwI432zhhA==} + '@oxfmt/binding-linux-s390x-gnu@0.45.0': + resolution: {integrity: sha512-RR7xKgNpqwENnK0aYCGYg0JycY2n93J0reNjHyes+I9Gq52dH95x+CBlnlAQHCPfz6FGnKA9HirgUl14WO6o7w==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [s390x] os: [linux] libc: [glibc] - '@oxfmt/binding-linux-x64-gnu@0.36.0': - resolution: {integrity: sha512-H16QhhQ3usoakMleiAAQ2mg0NsBDAdyE9agUgfC8IHHh3jZEbr0rIKwjEqwbOHK5M0EmfhJmr+aGO/MgZPsneA==} + '@oxfmt/binding-linux-x64-gnu@0.45.0': + resolution: {integrity: sha512-U/QQ0+BQNSHxjuXR/utvXnQ50Vu5kUuqEomZvQ1/3mhgbBiMc2WU9q5kZ5WwLp3gnFIx9ibkveoRSe2EZubkqg==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [linux] libc: [glibc] - '@oxfmt/binding-linux-x64-musl@0.36.0': - resolution: {integrity: sha512-EFFGkixA39BcmHiCe2ECdrq02D6FCve5ka6ObbvrheXl4V+R0U/E+/uLyVx1X65LW8TA8QQHdnbdDallRekohw==} + '@oxfmt/binding-linux-x64-musl@0.45.0': + resolution: {integrity: sha512-o5TLOUCF0RWQjsIS06yVC+kFgp092/yLe6qBGSUvtnmTVw9gxjpdQSXc3VN5Cnive4K11HNstEZF8ROKHfDFSw==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [linux] libc: [musl] - '@oxfmt/binding-openharmony-arm64@0.36.0': - resolution: {integrity: sha512-zr/t369wZWFOj1qf06Z5gGNjFymfUNDrxKMmr7FKiDRVI1sNsdKRCuRL4XVjtcptKQ+ao3FfxLN1vrynivmCYg==} + '@oxfmt/binding-openharmony-arm64@0.45.0': + resolution: {integrity: sha512-RnGcV3HgPuOjsGx/k9oyRNKmOp+NBLGzZTdPDYbc19r7NGeYPplnUU/BfU35bX2Y/O4ejvHxcfkvW2WoYL/gsg==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [openharmony] - '@oxfmt/binding-win32-arm64-msvc@0.36.0': - resolution: {integrity: sha512-FxO7UksTv8h4olzACgrqAXNF6BP329+H322323iDrMB5V/+a1kcAw07fsOsUmqNrb9iJBsCQgH/zqcqp5903ag==} + '@oxfmt/binding-win32-arm64-msvc@0.45.0': + resolution: {integrity: sha512-v3Vj7iKKsUFwt9w5hsqIIoErKVoENC6LoqfDlteOQ5QMDCXihlqLoxpmviUhXnNncg4zV6U9BPwlBbwa+qm4wg==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [win32] - '@oxfmt/binding-win32-ia32-msvc@0.36.0': - resolution: {integrity: sha512-OjoMQ89H01M0oLMfr/CPNH1zi48ZIwxAKObUl57oh7ssUBNDp/2Vjf7E1TQ8M4oj4VFQ/byxl2SmcPNaI2YNDg==} + '@oxfmt/binding-win32-ia32-msvc@0.45.0': + resolution: {integrity: sha512-N8yotPBX6ph0H3toF4AEpdCeVPrdcSetj+8eGiZGsrLsng3bs/Q5HPu4bbSxip5GBPx5hGbGHrZwH4+rcrjhHA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [ia32] os: [win32] - '@oxfmt/binding-win32-x64-msvc@0.36.0': - resolution: {integrity: sha512-MoyeQ9S36ZTz/4bDhOKJgOBIDROd4dQ5AkT9iezhEaUBxAPdNX9Oq0jD8OSnCj3G4wam/XNxVWKMA52kmzmPtQ==} + '@oxfmt/binding-win32-x64-msvc@0.45.0': + resolution: {integrity: sha512-w5MMTRCK1dpQeRA+HHqXQXyN33DlG/N2LOYxJmaT4fJjcmZrbNnqw7SmIk7I2/a2493PPLZ+2E/Ar6t2iKVMug==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [win32] - '@oxlint/binding-android-arm-eabi@1.51.0': - resolution: {integrity: sha512-jJYIqbx4sX+suIxWstc4P7SzhEwb4ArWA2KVrmEuu9vH2i0qM6QIHz/ehmbGE4/2fZbpuMuBzTl7UkfNoqiSgw==} + '@oxlint/binding-android-arm-eabi@1.60.0': + resolution: {integrity: sha512-YdeJKaZckDQL1qa62a1aKq/goyq48aX3yOxaaWqWb4sau4Ee4IiLbamftNLU3zbePky6QsDj6thnSSzHRBjDfA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm] os: [android] - '@oxlint/binding-android-arm64@1.51.0': - resolution: {integrity: sha512-GtXyBCcH4ti98YdiMNCrpBNGitx87EjEWxevnyhcBK12k/Vu4EzSB45rzSC4fGFUD6sQgeaxItRCEEWeVwPafw==} + '@oxlint/binding-android-arm64@1.60.0': + resolution: {integrity: sha512-7ANS7PpXCfq84xZQ8E5WPs14gwcuPcl+/8TFNXfpSu0CQBXz3cUo2fDpHT8v8HJN+Ut02eacvMAzTnc9s6X4tw==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [android] - '@oxlint/binding-darwin-arm64@1.51.0': - resolution: {integrity: sha512-3QJbeYaMHn6Bh2XeBXuITSsbnIctyTjvHf5nRjKYrT9pPeErNIpp5VDEeAXC0CZSwSVTsc8WOSDwgrAI24JolQ==} + '@oxlint/binding-darwin-arm64@1.60.0': + resolution: {integrity: sha512-pJsgd9AfplLGBm1fIr25V6V14vMrayhx4uIQvlfH7jWs2SZwSrvi3TfgfJySB8T+hvyEH8K2zXljQiUnkgUnfQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [darwin] - '@oxlint/binding-darwin-x64@1.51.0': - resolution: {integrity: sha512-NzErhMaTEN1cY0E8C5APy74lw5VwsNfJfVPBMWPVQLqAbO0k4FFLjvHURvkUL+Y18Wu+8Vs1kbqPh2hjXYA4pg==} + '@oxlint/binding-darwin-x64@1.60.0': + resolution: {integrity: sha512-Ue1aXHX49ivwflKqGJc7zcd/LeLgbhaTcDCQStgx5x06AXgjEAZmvrlMuIkWd4AL4FHQe6QJ9f33z04Cg448VQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [darwin] - '@oxlint/binding-freebsd-x64@1.51.0': - resolution: {integrity: sha512-msAIh3vPAoKoHlOE/oe6Q5C/n9umypv/k81lED82ibrJotn+3YG2Qp1kiR8o/Dg5iOEU97c6tl0utxcyFenpFw==} + '@oxlint/binding-freebsd-x64@1.60.0': + resolution: {integrity: sha512-YCyQzsQtusQw+gNRW9rRTifSO+Dt/+dtCl2NHoDMZqJlRTEZ/Oht9YnuporI9yiTx7+cB+eqzX3MtHHVHGIWhg==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [freebsd] - '@oxlint/binding-linux-arm-gnueabihf@1.51.0': - resolution: {integrity: sha512-CqQPcvqYyMe9ZBot2stjGogEzk1z8gGAngIX7srSzrzexmXixwVxBdFZyxTVM0CjGfDeV+Ru0w25/WNjlMM2Hw==} + '@oxlint/binding-linux-arm-gnueabihf@1.60.0': + resolution: {integrity: sha512-c7dxM2Zksa45Qw16i2iGY3Fti2NirJ38FrsBsKw+qcJ0OtqTsBgKJLF0xV+yLG56UH01Z8WRPgsw31e0MoRoGQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm] os: [linux] - '@oxlint/binding-linux-arm-musleabihf@1.51.0': - resolution: {integrity: sha512-dstrlYQgZMnyOssxSbolGCge/sDbko12N/35RBNuqLpoPbft2aeBidBAb0dvQlyBd9RJ6u8D4o4Eh8Un6iTgyQ==} + '@oxlint/binding-linux-arm-musleabihf@1.60.0': + resolution: {integrity: sha512-ZWALoA42UYqBEP1Tbw9OWURgFGS1nWj2AAvLdY6ZcGx/Gj93qVCBKjcvwXMupZibYwFbi9s/rzqkZseb/6gVtQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm] os: [linux] - '@oxlint/binding-linux-arm64-gnu@1.51.0': - resolution: {integrity: sha512-QEjUpXO7d35rP1/raLGGbAsBLLGZIzV3ZbeSjqWlD3oRnxpRIZ6iL4o51XQHkconn3uKssc+1VKdtHJ81BBhDA==} + '@oxlint/binding-linux-arm64-gnu@1.60.0': + resolution: {integrity: sha512-tpy+1w4p9hN5CicMCxqNy6ymfRtV5ayE573vFNjp1k1TN/qhLFgflveZoE/0++RlkHikBz2vY545NWm/hp7big==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [linux] libc: [glibc] - '@oxlint/binding-linux-arm64-musl@1.51.0': - resolution: {integrity: sha512-YSJua5irtG4DoMAjUapDTPhkQLHhBIY0G9JqlZS6/SZPzqDkPku/1GdWs0D6h/wyx0Iz31lNCfIaWKBQhzP0wQ==} + '@oxlint/binding-linux-arm64-musl@1.60.0': + resolution: {integrity: sha512-eDYDXZGhQAXyn6GwtwiX/qcLS0HlOLPJ/+iiIY8RYr+3P8oKBmgKxADLlniL6FtWfE7pPk7IGN9/xvDEvDvFeg==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [linux] libc: [musl] - '@oxlint/binding-linux-ppc64-gnu@1.51.0': - resolution: {integrity: sha512-7L4Wj2IEUNDETKssB9IDYt16T6WlF+X2jgC/hBq3diGHda9vJLpAgb09+D3quFq7TdkFtI7hwz/jmuQmQFPc1Q==} + '@oxlint/binding-linux-ppc64-gnu@1.60.0': + resolution: {integrity: sha512-nxehly5XYBHUWI9VJX1bqCf9j/B43DaK/aS/T1fcxCpX3PA4Rm9BB54nPD1CKayT8xg6REN1ao+01hSRNgy8OA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [ppc64] os: [linux] libc: [glibc] - '@oxlint/binding-linux-riscv64-gnu@1.51.0': - resolution: {integrity: sha512-cBUHqtOXy76G41lOB401qpFoKx1xq17qYkhWrLSM7eEjiHM9sOtYqpr6ZdqCnN9s6ZpzudX4EkeHOFH2E9q0vA==} + '@oxlint/binding-linux-riscv64-gnu@1.60.0': + resolution: {integrity: sha512-j1qf/NaUfOWQutjeoooNG1Q0zsK0XGmSu1uDLq3cctquRF3j7t9Hxqf/76ehCc5GEUAanth2W4Fa+XT1RFg/nw==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [riscv64] os: [linux] libc: [glibc] - '@oxlint/binding-linux-riscv64-musl@1.51.0': - resolution: {integrity: sha512-WKbg8CysgZcHfZX0ixQFBRSBvFZUHa3SBnEjHY2FVYt2nbNJEjzTxA3ZR5wMU0NOCNKIAFUFvAh5/XJKPRJuJg==} + '@oxlint/binding-linux-riscv64-musl@1.60.0': + resolution: {integrity: sha512-YELKPRefQ/q/h3RUmeRfPCUhh2wBvgV1RyZ/F9M9u8cDyXsQW2ojv1DeWQTt466yczDITjZnIOg/s05pk7Ve2A==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [riscv64] os: [linux] libc: [musl] - '@oxlint/binding-linux-s390x-gnu@1.51.0': - resolution: {integrity: sha512-N1QRUvJTxqXNSu35YOufdjsAVmKVx5bkrggOWAhTWBc3J4qjcBwr1IfyLh/6YCg8sYRSR1GraldS9jUgJL/U4A==} + '@oxlint/binding-linux-s390x-gnu@1.60.0': + resolution: {integrity: sha512-JkO3C6Gki7Y6h/MiIkFKvHFOz98/YWvQ4WYbK9DLXACMP2rjULzkeGyAzorJE5S1dzLQGFgeqvN779kSFwoV1g==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [s390x] os: [linux] libc: [glibc] - '@oxlint/binding-linux-x64-gnu@1.51.0': - resolution: {integrity: sha512-e0Mz0DizsCoqNIjeOg6OUKe8JKJWZ5zZlwsd05Bmr51Jo3AOL4UJnPvwKumr4BBtBrDZkCmOLhCvDGm95nJM2g==} + '@oxlint/binding-linux-x64-gnu@1.60.0': + resolution: {integrity: sha512-XjKHdFVCpZZZSWBCKyyqCq65s2AKXykMXkjLoKYODrD+f5toLhlwsMESscu8FbgnJQ4Y/dpR/zdazsahmgBJIA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [linux] libc: [glibc] - '@oxlint/binding-linux-x64-musl@1.51.0': - resolution: {integrity: sha512-wD8HGTWhYBKXvRDvoBVB1y+fEYV01samhWQSy1Zkxq2vpezvMnjaFKRuiP6tBNITLGuffbNDEXOwcAhJ3gI5Ug==} + '@oxlint/binding-linux-x64-musl@1.60.0': + resolution: {integrity: sha512-js29ZWIuPhNWzY8NC7KoffEMEeWG105vbmm+8EOJsC+T/jHBiKIJEUF78+F/IrgEWMMP9N0kRND4Pp75+xAhKg==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [linux] libc: [musl] - '@oxlint/binding-openharmony-arm64@1.51.0': - resolution: {integrity: sha512-5NSwQ2hDEJ0GPXqikjWtwzgAQCsS7P9aLMNenjjKa+gknN3lTCwwwERsT6lKXSirfU3jLjexA2XQvQALh5h27w==} + '@oxlint/binding-openharmony-arm64@1.60.0': + resolution: {integrity: sha512-H+PUITKHk04stFpWj3x3Kg08Afp/bcXSBi0EhasR5a0Vw7StXHTzdl655PUI0fB4qdh2Wsu6Dsi+3ACxPoyQnA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [openharmony] - '@oxlint/binding-win32-arm64-msvc@1.51.0': - resolution: {integrity: sha512-JEZyah1M0RHMw8d+jjSSJmSmO8sABA1J1RtrHYujGPeCkYg1NeH0TGuClpe2h5QtioRTaF57y/TZfn/2IFV6fA==} + '@oxlint/binding-win32-arm64-msvc@1.60.0': + resolution: {integrity: sha512-WA/yc7f7ZfCefBXVzNHn1Ztulb1EFwNBb4jMZ6pjML0zz6pHujlF3Q3jySluz3XHl/GNeMTntG1seUBWVMlMag==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [win32] - '@oxlint/binding-win32-ia32-msvc@1.51.0': - resolution: {integrity: sha512-q3cEoKH6kwjz/WRyHwSf0nlD2F5Qw536kCXvmlSu+kaShzgrA0ojmh45CA81qL+7udfCaZL2SdKCZlLiGBVFlg==} + '@oxlint/binding-win32-ia32-msvc@1.60.0': + resolution: {integrity: sha512-33YxL1sqwYNZXtn3MD/4dno6s0xeedXOJlT1WohkVD565WvohClZUr7vwKdAk954n4xiEWJkewiCr+zLeq7AeA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [ia32] os: [win32] - '@oxlint/binding-win32-x64-msvc@1.51.0': - resolution: {integrity: sha512-Q14+fOGb9T28nWF/0EUsYqERiRA7cl1oy4TJrGmLaqhm+aO2cV+JttboHI3CbdeMCAyDI1+NoSlrM7Melhp/cw==} + '@oxlint/binding-win32-x64-msvc@1.60.0': + resolution: {integrity: sha512-JOro4ZcfBLamJCyfURQmOQByoorgOdx3ZjAkSqnb/CyG/i+lN3KoV5LAgk5ZAW6DPq7/Cx7n23f8DuTWXTWgyQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [win32] @@ -1798,211 +2107,208 @@ packages: '@radix-ui/rect@1.1.1': resolution: {integrity: sha512-HPwpGIzkl28mWyZqG52jiqDJ12waP11Pa1lGoiyUkIEuMLBP0oeK/C89esbXrxsky5we7dfd8U58nm0SgAWpVw==} - '@rolldown/binding-android-arm64@1.0.0-rc.3': - resolution: {integrity: sha512-0T1k9FinuBZ/t7rZ8jN6OpUKPnUjNdYHoj/cESWrQ3ZraAJ4OMm6z7QjSfCxqj8mOp9kTKc1zHK3kGz5vMu+nQ==} + '@rolldown/binding-android-arm64@1.0.0-rc.15': + resolution: {integrity: sha512-YYe6aWruPZDtHNpwu7+qAHEMbQ/yRl6atqb/AhznLTnD3UY99Q1jE7ihLSahNWkF4EqRPVC4SiR4O0UkLK02tA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [android] - '@rolldown/binding-darwin-arm64@1.0.0-rc.3': - resolution: {integrity: sha512-JWWLzvcmc/3pe7qdJqPpuPk91SoE/N+f3PcWx/6ZwuyDVyungAEJPvKm/eEldiDdwTmaEzWfIR+HORxYWrCi1A==} + '@rolldown/binding-android-arm64@1.0.0-rc.16': + resolution: {integrity: sha512-rhY3k7Bsae9qQfOtph2Pm2jZEA+s8Gmjoz4hhmx70K9iMQ/ddeae+xhRQcM5IuVx5ry1+bGfkvMn7D6MJggVSA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] - os: [darwin] + os: [android] - '@rolldown/binding-darwin-x64@1.0.0-rc.3': - resolution: {integrity: sha512-MTakBxfx3tde5WSmbHxuqlDsIW0EzQym+PJYGF4P6lG2NmKzi128OGynoFUqoD5ryCySEY85dug4v+LWGBElIw==} + '@rolldown/binding-darwin-arm64@1.0.0-rc.15': + resolution: {integrity: sha512-oArR/ig8wNTPYsXL+Mzhs0oxhxfuHRfG7Ikw7jXsw8mYOtk71W0OkF2VEVh699pdmzjPQsTjlD1JIOoHkLP1Fg==} engines: {node: ^20.19.0 || >=22.12.0} - cpu: [x64] + cpu: [arm64] os: [darwin] - '@rolldown/binding-freebsd-x64@1.0.0-rc.3': - resolution: {integrity: sha512-jje3oopyOLs7IwfvXoS6Lxnmie5JJO7vW29fdGFu5YGY1EDbVDhD+P9vDihqS5X6fFiqL3ZQZCMBg6jyHkSVww==} - engines: {node: ^20.19.0 || >=22.12.0} - cpu: [x64] - os: [freebsd] - - '@rolldown/binding-linux-arm-gnueabihf@1.0.0-rc.3': - resolution: {integrity: sha512-A0n8P3hdLAaqzSFrQoA42p23ZKBYQOw+8EH5r15Sa9X1kD9/JXe0YT2gph2QTWvdr0CVK2BOXiK6ENfy6DXOag==} - engines: {node: ^20.19.0 || >=22.12.0} - cpu: [arm] - os: [linux] - - '@rolldown/binding-linux-arm64-gnu@1.0.0-rc.3': - resolution: {integrity: sha512-kWXkoxxarYISBJ4bLNf5vFkEbb4JvccOwxWDxuK9yee8lg5XA7OpvlTptfRuwEvYcOZf+7VS69Uenpmpyo5Bjw==} + '@rolldown/binding-darwin-arm64@1.0.0-rc.16': + resolution: {integrity: sha512-rNz0yK078yrNn3DrdgN+PKiMOW8HfQ92jQiXxwX8yW899ayV00MLVdaCNeVBhG/TbH3ouYVObo8/yrkiectkcQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] - os: [linux] - libc: [glibc] + os: [darwin] - '@rolldown/binding-linux-arm64-musl@1.0.0-rc.3': - resolution: {integrity: sha512-Z03/wrqau9Bicfgb3Dbs6SYTHliELk2PM2LpG2nFd+cGupTMF5kanLEcj2vuuJLLhptNyS61rtk7SOZ+lPsTUA==} + '@rolldown/binding-darwin-x64@1.0.0-rc.15': + resolution: {integrity: sha512-YzeVqOqjPYvUbJSWJ4EDL8ahbmsIXQpgL3JVipmN+MX0XnXMeWomLN3Fb+nwCmP/jfyqte5I3XRSm7OfQrbyxw==} engines: {node: ^20.19.0 || >=22.12.0} - cpu: [arm64] - os: [linux] - libc: [musl] + cpu: [x64] + os: [darwin] - '@rolldown/binding-linux-x64-gnu@1.0.0-rc.3': - resolution: {integrity: sha512-iSXXZsQp08CSilff/DCTFZHSVEpEwdicV3W8idHyrByrcsRDVh9sGC3sev6d8BygSGj3vt8GvUKBPCoyMA4tgQ==} + '@rolldown/binding-darwin-x64@1.0.0-rc.16': + resolution: {integrity: sha512-r/OmdR00HmD4i79Z//xO06uEPOq5hRXdhw7nzkxQxwSavs3PSHa1ijntdpOiZ2mzOQ3fVVu8C1M19FoNM+dMUQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] - os: [linux] - libc: [glibc] + os: [darwin] - '@rolldown/binding-linux-x64-musl@1.0.0-rc.3': - resolution: {integrity: sha512-qaj+MFudtdCv9xZo9znFvkgoajLdc+vwf0Kz5N44g+LU5XMe+IsACgn3UG7uTRlCCvhMAGXm1XlpEA5bZBrOcw==} + '@rolldown/binding-freebsd-x64@1.0.0-rc.15': + resolution: {integrity: sha512-9Erhx956jeQ0nNTyif1+QWAXDRD38ZNjr//bSHrt6wDwB+QkAfl2q6Mn1k6OBPerznjRmbM10lgRb1Pli4xZPw==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] - os: [linux] - libc: [musl] + os: [freebsd] - '@rolldown/binding-openharmony-arm64@1.0.0-rc.3': - resolution: {integrity: sha512-U662UnMETyjT65gFmG9ma+XziENrs7BBnENi/27swZPYagubfHRirXHG2oMl+pEax2WvO7Kb9gHZmMakpYqBHQ==} + '@rolldown/binding-freebsd-x64@1.0.0-rc.16': + resolution: {integrity: sha512-KcRE5w8h0OnjUatG8pldyD14/CQ5Phs1oxfR+3pKDjboHRo9+MkqQaiIZlZRpsxC15paeXme/I127tUa9TXJ6g==} engines: {node: ^20.19.0 || >=22.12.0} - cpu: [arm64] - os: [openharmony] - - '@rolldown/binding-wasm32-wasi@1.0.0-rc.3': - resolution: {integrity: sha512-gekrQ3Q2HiC1T5njGyuUJoGpK/l6B/TNXKed3fZXNf9YRTJn3L5MOZsFBn4bN2+UX+8+7hgdlTcEsexX988G4g==} - engines: {node: '>=14.0.0'} - cpu: [wasm32] + cpu: [x64] + os: [freebsd] - '@rolldown/binding-win32-arm64-msvc@1.0.0-rc.3': - resolution: {integrity: sha512-85y5JifyMgs8m5K2XzR/VDsapKbiFiohl7s5lEj7nmNGO0pkTXE7q6TQScei96BNAsoK7JC3pA7ukA8WRHVJpg==} + '@rolldown/binding-linux-arm-gnueabihf@1.0.0-rc.15': + resolution: {integrity: sha512-cVwk0w8QbZJGTnP/AHQBs5yNwmpgGYStL88t4UIaqcvYJWBfS0s3oqVLZPwsPU6M0zlW4GqjP0Zq5MnAGwFeGA==} engines: {node: ^20.19.0 || >=22.12.0} - cpu: [arm64] - os: [win32] + cpu: [arm] + os: [linux] - '@rolldown/binding-win32-x64-msvc@1.0.0-rc.3': - resolution: {integrity: sha512-a4VUQZH7LxGbUJ3qJ/TzQG8HxdHvf+jOnqf7B7oFx1TEBm+j2KNL2zr5SQ7wHkNAcaPevF6gf9tQnVBnC4mD+A==} + '@rolldown/binding-linux-arm-gnueabihf@1.0.0-rc.16': + resolution: {integrity: sha512-bT0guA1bpxEJ/ZhTRniQf7rNF8ybvXOuWbNIeLABaV5NGjx4EtOWBTSRGWFU9ZWVkPOZ+HNFP8RMcBokBiZ0Kg==} engines: {node: ^20.19.0 || >=22.12.0} - cpu: [x64] - os: [win32] - - '@rolldown/pluginutils@1.0.0-rc.3': - resolution: {integrity: sha512-eybk3TjzzzV97Dlj5c+XrBFW57eTNhzod66y9HrBlzJ6NsCrWCp/2kaPS3K9wJmurBC0Tdw4yPjXKZqlznim3Q==} - - '@rollup/rollup-android-arm-eabi@4.54.0': - resolution: {integrity: sha512-OywsdRHrFvCdvsewAInDKCNyR3laPA2mc9bRYJ6LBp5IyvF3fvXbbNR0bSzHlZVFtn6E0xw2oZlyjg4rKCVcng==} cpu: [arm] - os: [android] - - '@rollup/rollup-android-arm64@4.54.0': - resolution: {integrity: sha512-Skx39Uv+u7H224Af+bDgNinitlmHyQX1K/atIA32JP3JQw6hVODX5tkbi2zof/E69M1qH2UoN3Xdxgs90mmNYw==} - cpu: [arm64] - os: [android] - - '@rollup/rollup-darwin-arm64@4.54.0': - resolution: {integrity: sha512-k43D4qta/+6Fq+nCDhhv9yP2HdeKeP56QrUUTW7E6PhZP1US6NDqpJj4MY0jBHlJivVJD5P8NxrjuobZBJTCRw==} - cpu: [arm64] - os: [darwin] - - '@rollup/rollup-darwin-x64@4.54.0': - resolution: {integrity: sha512-cOo7biqwkpawslEfox5Vs8/qj83M/aZCSSNIWpVzfU2CYHa2G3P1UN5WF01RdTHSgCkri7XOlTdtk17BezlV3A==} - cpu: [x64] - os: [darwin] + os: [linux] - '@rollup/rollup-freebsd-arm64@4.54.0': - resolution: {integrity: sha512-miSvuFkmvFbgJ1BevMa4CPCFt5MPGw094knM64W9I0giUIMMmRYcGW/JWZDriaw/k1kOBtsWh1z6nIFV1vPNtA==} + '@rolldown/binding-linux-arm64-gnu@1.0.0-rc.15': + resolution: {integrity: sha512-eBZ/u8iAK9SoHGanqe/jrPnY0JvBN6iXbVOsbO38mbz+ZJsaobExAm1Iu+rxa4S1l2FjG0qEZn4Rc6X8n+9M+w==} + engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] - os: [freebsd] - - '@rollup/rollup-freebsd-x64@4.54.0': - resolution: {integrity: sha512-KGXIs55+b/ZfZsq9aR026tmr/+7tq6VG6MsnrvF4H8VhwflTIuYh+LFUlIsRdQSgrgmtM3fVATzEAj4hBQlaqQ==} - cpu: [x64] - os: [freebsd] - - '@rollup/rollup-linux-arm-gnueabihf@4.54.0': - resolution: {integrity: sha512-EHMUcDwhtdRGlXZsGSIuXSYwD5kOT9NVnx9sqzYiwAc91wfYOE1g1djOEDseZJKKqtHAHGwnGPQu3kytmfaXLQ==} - cpu: [arm] os: [linux] libc: [glibc] - '@rollup/rollup-linux-arm-musleabihf@4.54.0': - resolution: {integrity: sha512-+pBrqEjaakN2ySv5RVrj/qLytYhPKEUwk+e3SFU5jTLHIcAtqh2rLrd/OkbNuHJpsBgxsD8ccJt5ga/SeG0JmA==} - cpu: [arm] + '@rolldown/binding-linux-arm64-gnu@1.0.0-rc.16': + resolution: {integrity: sha512-+tHktCHWV8BDQSjemUqm/Jl/TPk3QObCTIjmdDy/nlupcujZghmKK2962LYrqFpWu+ai01AN/REOH3NEpqvYQg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] os: [linux] - libc: [musl] + libc: [glibc] - '@rollup/rollup-linux-arm64-gnu@4.54.0': - resolution: {integrity: sha512-NSqc7rE9wuUaRBsBp5ckQ5CVz5aIRKCwsoa6WMF7G01sX3/qHUw/z4pv+D+ahL1EIKy6Enpcnz1RY8pf7bjwng==} + '@rolldown/binding-linux-arm64-musl@1.0.0-rc.15': + resolution: {integrity: sha512-ZvRYMGrAklV9PEkgt4LQM6MjQX2P58HPAuecwYObY2DhS2t35R0I810bKi0wmaYORt6m/2Sm+Z+nFgb0WhXNcQ==} + engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [linux] - libc: [glibc] + libc: [musl] - '@rollup/rollup-linux-arm64-musl@4.54.0': - resolution: {integrity: sha512-gr5vDbg3Bakga5kbdpqx81m2n9IX8M6gIMlQQIXiLTNeQW6CucvuInJ91EuCJ/JYvc+rcLLsDFcfAD1K7fMofg==} + '@rolldown/binding-linux-arm64-musl@1.0.0-rc.16': + resolution: {integrity: sha512-3fPzdREH806oRLxpTWW1Gt4tQHs0TitZFOECB2xzCFLPKnSOy90gwA7P29cksYilFO6XVRY1kzga0cL2nRjKPg==} + engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [linux] libc: [musl] - '@rollup/rollup-linux-loong64-gnu@4.54.0': - resolution: {integrity: sha512-gsrtB1NA3ZYj2vq0Rzkylo9ylCtW/PhpLEivlgWe0bpgtX5+9j9EZa0wtZiCjgu6zmSeZWyI/e2YRX1URozpIw==} - cpu: [loong64] + '@rolldown/binding-linux-ppc64-gnu@1.0.0-rc.15': + resolution: {integrity: sha512-VDpgGBzgfg5hLg+uBpCLoFG5kVvEyafmfxGUV0UHLcL5irxAK7PKNeC2MwClgk6ZAiNhmo9FLhRYgvMmedLtnQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [ppc64] os: [linux] libc: [glibc] - '@rollup/rollup-linux-ppc64-gnu@4.54.0': - resolution: {integrity: sha512-y3qNOfTBStmFNq+t4s7Tmc9hW2ENtPg8FeUD/VShI7rKxNW7O4fFeaYbMsd3tpFlIg1Q8IapFgy7Q9i2BqeBvA==} + '@rolldown/binding-linux-ppc64-gnu@1.0.0-rc.16': + resolution: {integrity: sha512-EKwI1tSrLs7YVw+JPJT/G2dJQ1jl9qlTTTEG0V2Ok/RdOenRfBw2PQdLPyjhIu58ocdBfP7vIRN/pvMsPxs/AQ==} + engines: {node: ^20.19.0 || >=22.12.0} cpu: [ppc64] os: [linux] libc: [glibc] - '@rollup/rollup-linux-riscv64-gnu@4.54.0': - resolution: {integrity: sha512-89sepv7h2lIVPsFma8iwmccN7Yjjtgz0Rj/Ou6fEqg3HDhpCa+Et+YSufy27i6b0Wav69Qv4WBNl3Rs6pwhebQ==} - cpu: [riscv64] + '@rolldown/binding-linux-s390x-gnu@1.0.0-rc.15': + resolution: {integrity: sha512-y1uXY3qQWCzcPgRJATPSOUP4tCemh4uBdY7e3EZbVwCJTY3gLJWnQABgeUetvED+bt1FQ01OeZwvhLS2bpNrAQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [s390x] os: [linux] libc: [glibc] - '@rollup/rollup-linux-riscv64-musl@4.54.0': - resolution: {integrity: sha512-ZcU77ieh0M2Q8Ur7D5X7KvK+UxbXeDHwiOt/CPSBTI1fBmeDMivW0dPkdqkT4rOgDjrDDBUed9x4EgraIKoR2A==} - cpu: [riscv64] + '@rolldown/binding-linux-s390x-gnu@1.0.0-rc.16': + resolution: {integrity: sha512-Uknladnb3Sxqu6SEcqBldQyJUpk8NleooZEc0MbRBJ4inEhRYWZX0NJu12vNf2mqAq7gsofAxHrGghiUYjhaLQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [s390x] os: [linux] - libc: [musl] + libc: [glibc] - '@rollup/rollup-linux-s390x-gnu@4.54.0': - resolution: {integrity: sha512-2AdWy5RdDF5+4YfG/YesGDDtbyJlC9LHmL6rZw6FurBJ5n4vFGupsOBGfwMRjBYH7qRQowT8D/U4LoSvVwOhSQ==} - cpu: [s390x] + '@rolldown/binding-linux-x64-gnu@1.0.0-rc.15': + resolution: {integrity: sha512-023bTPBod7J3Y/4fzAN6QtpkSABR0rigtrwaP+qSEabUh5zf6ELr9Nc7GujaROuPY3uwdSIXWrvhn1KxOvurWA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] os: [linux] libc: [glibc] - '@rollup/rollup-linux-x64-gnu@4.54.0': - resolution: {integrity: sha512-WGt5J8Ij/rvyqpFexxk3ffKqqbLf9AqrTBbWDk7ApGUzaIs6V+s2s84kAxklFwmMF/vBNGrVdYgbblCOFFezMQ==} + '@rolldown/binding-linux-x64-gnu@1.0.0-rc.16': + resolution: {integrity: sha512-FIb8+uG49sZBtLTn+zt1AJ20TqVcqWeSIyoVt0or7uAWesgKaHbiBh6OpA/k9v0LTt+PTrb1Lao133kP4uVxkg==} + engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [linux] libc: [glibc] - '@rollup/rollup-linux-x64-musl@4.54.0': - resolution: {integrity: sha512-JzQmb38ATzHjxlPHuTH6tE7ojnMKM2kYNzt44LO/jJi8BpceEC8QuXYA908n8r3CNuG/B3BV8VR3Hi1rYtmPiw==} + '@rolldown/binding-linux-x64-musl@1.0.0-rc.15': + resolution: {integrity: sha512-witB2O0/hU4CgfOOKUoeFgQ4GktPi1eEbAhaLAIpgD6+ZnhcPkUtPsoKKHRzmOoWPZue46IThdSgdo4XneOLYw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [linux] + libc: [musl] + + '@rolldown/binding-linux-x64-musl@1.0.0-rc.16': + resolution: {integrity: sha512-RuERhF9/EgWxZEXYWCOaViUWHIboceK4/ivdtQ3R0T44NjLkIIlGIAVAuCddFxsZ7vnRHtNQUrt2vR2n2slB2w==} + engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [linux] libc: [musl] - '@rollup/rollup-openharmony-arm64@4.54.0': - resolution: {integrity: sha512-huT3fd0iC7jigGh7n3q/+lfPcXxBi+om/Rs3yiFxjvSxbSB6aohDFXbWvlspaqjeOh+hx7DDHS+5Es5qRkWkZg==} + '@rolldown/binding-openharmony-arm64@1.0.0-rc.15': + resolution: {integrity: sha512-UCL68NJ0Ud5zRipXZE9dF5PmirzJE4E4BCIOOssEnM7wLDsxjc6Qb0sGDxTNRTP53I6MZpygyCpY8Aa8sPfKPg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [openharmony] + + '@rolldown/binding-openharmony-arm64@1.0.0-rc.16': + resolution: {integrity: sha512-mXcXnvd9GpazCxeUCCnZ2+YF7nut+ZOEbE4GtaiPtyY6AkhZWbK70y1KK3j+RDhjVq5+U8FySkKRb/+w0EeUwA==} + engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [openharmony] - '@rollup/rollup-win32-arm64-msvc@4.54.0': - resolution: {integrity: sha512-c2V0W1bsKIKfbLMBu/WGBz6Yci8nJ/ZJdheE0EwB73N3MvHYKiKGs3mVilX4Gs70eGeDaMqEob25Tw2Gb9Nqyw==} + '@rolldown/binding-wasm32-wasi@1.0.0-rc.15': + resolution: {integrity: sha512-ApLruZq/ig+nhaE7OJm4lDjayUnOHVUa77zGeqnqZ9pn0ovdVbbNPerVibLXDmWeUZXjIYIT8V3xkT58Rm9u5Q==} + engines: {node: '>=14.0.0'} + cpu: [wasm32] + + '@rolldown/binding-wasm32-wasi@1.0.0-rc.16': + resolution: {integrity: sha512-3Q2KQxnC8IJOLqXmUMoYwyIPZU9hzRbnHaoV3Euz+VVnjZKcY8ktnNP8T9R4/GGQtb27C/UYKABxesKWb8lsvQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [wasm32] + + '@rolldown/binding-win32-arm64-msvc@1.0.0-rc.15': + resolution: {integrity: sha512-KmoUoU7HnN+Si5YWJigfTws1jz1bKBYDQKdbLspz0UaqjjFkddHsqorgiW1mxcAj88lYUE6NC/zJNwT+SloqtA==} + engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [win32] - '@rollup/rollup-win32-ia32-msvc@4.54.0': - resolution: {integrity: sha512-woEHgqQqDCkAzrDhvDipnSirm5vxUXtSKDYTVpZG3nUdW/VVB5VdCYA2iReSj/u3yCZzXID4kuKG7OynPnB3WQ==} - cpu: [ia32] + '@rolldown/binding-win32-arm64-msvc@1.0.0-rc.16': + resolution: {integrity: sha512-tj7XRemQcOcFwv7qhpUxMTBbI5mWMlE4c1Omhg5+h8GuLXzyj8HviYgR+bB2DMDgRqUE+jiDleqSCRjx4aYk/Q==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] os: [win32] - '@rollup/rollup-win32-x64-gnu@4.54.0': - resolution: {integrity: sha512-dzAc53LOuFvHwbCEOS0rPbXp6SIhAf2txMP5p6mGyOXXw5mWY8NGGbPMPrs4P1WItkfApDathBj/NzMLUZ9rtQ==} + '@rolldown/binding-win32-x64-msvc@1.0.0-rc.15': + resolution: {integrity: sha512-3P2A8L+x75qavWLe/Dll3EYBJLQmtkJN8rfh+U/eR3MqMgL/h98PhYI+JFfXuDPgPeCB7iZAKiqii5vqOvnA0g==} + engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [win32] - '@rollup/rollup-win32-x64-msvc@4.54.0': - resolution: {integrity: sha512-hYT5d3YNdSh3mbCU1gwQyPgQd3T2ne0A3KG8KSBdav5TiBg6eInVmV+TeR5uHufiIgSFg0XsOWGW5/RhNcSvPg==} + '@rolldown/binding-win32-x64-msvc@1.0.0-rc.16': + resolution: {integrity: sha512-PH5DRZT+F4f2PTXRXR8uJxnBq2po/xFtddyabTJVJs/ZYVHqXPEgNIr35IHTEa6bpa0Q8Awg+ymkTaGnKITw4g==} + engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [win32] + '@rolldown/pluginutils@1.0.0-beta.40': + resolution: {integrity: sha512-s3GeJKSQOwBlzdUrj4ISjJj5SfSh+aqn0wjOar4Bx95iV1ETI7F6S/5hLcfAxZ9kXDcyrAkxPlqmd1ZITttf+w==} + + '@rolldown/pluginutils@1.0.0-rc.15': + resolution: {integrity: sha512-UromN0peaE53IaBRe9W7CjrZgXl90fqGpK+mIZbA3qSTeYqg3pqpROBdIPvOG3F5ereDHNwoHBI2e50n1BDr1g==} + + '@rolldown/pluginutils@1.0.0-rc.16': + resolution: {integrity: sha512-45+YtqxLYKDWQouLKCrpIZhke+nXxhsw+qAHVzHDVwttyBlHNBVs2K25rDXrZzhpTp9w1FlAlvweV1H++fdZoA==} + + '@rolldown/pluginutils@1.0.0-rc.7': + resolution: {integrity: sha512-qujRfC8sFVInYSPPMLQByRh7zhwkGFS4+tyMQ83srV1qrxL4g8E2tyxVVyxd0+8QeBM1mIk9KbWxkegRr76XzA==} + '@sapphire/snowflake@3.5.5': resolution: {integrity: sha512-xzvBr1Q1c4lCe7i6sRnrofxeO1QTP/LKQ6A6qy0iB4x5yfiSfARMEQEghojzTNALDTcv8En04qYNIco9/K9eZQ==} engines: {node: '>=v14.0.0', npm: '>=7.0.0'} @@ -2027,10 +2333,6 @@ packages: resolution: {integrity: sha512-M6UMPrSa3fN5ayeJwFVl9qWofl273wtK1VG8ySDZ1mQBfhCpdd8nEx7nPZ/tk7k+TYcpqBZzj/AnwxT9lO+HJw==} engines: {node: '>=20'} - '@shikijs/rehype@4.0.2': - resolution: {integrity: sha512-cmPlKLD8JeojasNFoY64162ScpEdEdQUMuVodPCrv1nx1z3bjmGwoKWDruQWa/ejSznImlaeB0Ty6Q3zPaVQAA==} - engines: {node: '>=20'} - '@shikijs/themes@4.0.2': resolution: {integrity: sha512-mjCafwt8lJJaVSsQvNVrJumbnnj1RI8jbUKrPKgE6E3OvQKxnuRoBaYC51H4IGHePsGN/QtALglWBU7DoKDFnA==} engines: {node: '>=20'} @@ -2050,8 +2352,99 @@ packages: resolution: {integrity: sha512-P1Cz1dWaFfR4IR+U13mqqiGsLFf1KbayybWwdd2vfctdV6hDpUkgCY0nKOLLTMSoRd/jJNjtbqzf13K8DCCXQw==} engines: {node: '>=18'} - '@speed-highlight/core@1.2.12': - resolution: {integrity: sha512-uilwrK0Ygyri5dToHYdZSjcvpS2ZwX0w5aSt3GCEN9hrjxWCoeV4Z2DTXuxjwbntaLQIEEAlCeNQss5SoHvAEA==} + '@snazzah/davey-android-arm-eabi@0.1.11': + resolution: {integrity: sha512-T1RYbNYKN6tLOcGIDKJd8OI6FBSEemwL7DOYdTMmhqfhhMr3YVN8WOhfoxGg63OcnpTN2e2c5tdY2bAx25RmQQ==} + engines: {node: '>= 10'} + cpu: [arm] + os: [android] + + '@snazzah/davey-android-arm64@0.1.11': + resolution: {integrity: sha512-ksJn/x2VU8h6w9eku1HT96ugSRZ7lKVkKNKbFleaFN+U99DJaPM+gMu2YvnFU4V54HR06ZBnRihnVG6VLXQpDw==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [android] + + '@snazzah/davey-darwin-arm64@0.1.11': + resolution: {integrity: sha512-E1d7PbaaVMO3Lj9EiAPqOVbuV0xg5+PsHzHH097DDXiD1+zUDXvJaTnUWsnm5z50pJniHpi4GtaYmk+ieB/guA==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [darwin] + + '@snazzah/davey-darwin-x64@0.1.11': + resolution: {integrity: sha512-Tl4TI/LTmgJZepgbgVMYDi8RqlAkPtPg1OEBPl7a9Tn3AwR36Vs6lyIT1cs/lGy/ds/+B+mKI4rPObN1cyILTw==} + engines: {node: '>= 10'} + cpu: [x64] + os: [darwin] + + '@snazzah/davey-freebsd-x64@0.1.11': + resolution: {integrity: sha512-T8Iw9FXkuI1T+YBAFzh9v/TXf9IOTOSqnd/BFpTRTrlW72PR2lhIidzSmg027VxO7r5pX47iFwiOkb9I/NU/EA==} + engines: {node: '>= 10'} + cpu: [x64] + os: [freebsd] + + '@snazzah/davey-linux-arm-gnueabihf@0.1.11': + resolution: {integrity: sha512-1Txj+8pqA8uq/OGtaUaBFWAPnNMQzFgIywj0iA7EI4xZl+mab48/pv+YZ1pNb/suC6ynsW44oB9efiXSdcUAgA==} + engines: {node: '>= 10'} + cpu: [arm] + os: [linux] + + '@snazzah/davey-linux-arm64-gnu@0.1.11': + resolution: {integrity: sha512-ERzF5nM/IYW1BcN3wLXpEwBCGLFf0kGJUVhaV6yfiInz0tkU8UmvrrgpaMaACfMjIhfWdq5CcX+aTkXo/saNcg==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + libc: [glibc] + + '@snazzah/davey-linux-arm64-musl@0.1.11': + resolution: {integrity: sha512-e6pX6Hiabtz99q+H/YHNkm9JVlpqN8HGh0qPib8G2+UY4/SSH8WvqWipk3v581dMy2oyCHt7MOoY1aU1P1N/xA==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + libc: [musl] + + '@snazzah/davey-linux-x64-gnu@0.1.11': + resolution: {integrity: sha512-TW5bSoqChOJMbvsDb4wAATYrxmAXuNnse7wFNVSAJUaZKSeRfZbu3UAiPWSNn7GwLwSfU6hg322KZUn8IWCuvg==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + libc: [glibc] + + '@snazzah/davey-linux-x64-musl@0.1.11': + resolution: {integrity: sha512-5j6Pmc+Wzv5lSxVP6quA7teYRJXibkZqQyYGfTDnTsUOO5dPpcojpqlXlkhyvsA1OAQTj4uxbOCciN3cVWwzug==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + libc: [musl] + + '@snazzah/davey-wasm32-wasi@0.1.11': + resolution: {integrity: sha512-rKOwZ/0J8lp+4VEyOdMDBRP9KR+PksZpa9V1Qn0veMzy4FqTVKthkxwGqewheFe0SFg9fdvt798l/PBFrfDeZw==} + engines: {node: '>=14.0.0'} + cpu: [wasm32] + + '@snazzah/davey-win32-arm64-msvc@0.1.11': + resolution: {integrity: sha512-5fptJU4tX901m3mj0SHiBljMrPT4ZEsynbBhR7bK1yn9TY1jjyhN8EFi7QF5IWtUEni+0mia2BCMHZ5ZkmFZqQ==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [win32] + + '@snazzah/davey-win32-ia32-msvc@0.1.11': + resolution: {integrity: sha512-ualexn8SeLsiMHhWfzVrzRcjHgcBapg++FPaVgJJxoh2S/jCRiklXOu3luqIZdJdNKvhe2V9SwO/cImPeIIBKw==} + engines: {node: '>= 10'} + cpu: [ia32] + os: [win32] + + '@snazzah/davey-win32-x64-msvc@0.1.11': + resolution: {integrity: sha512-muNhc8UKXtknzsH/w4AIkbPR2I8BuvApn0pDXar0IEvY8PCjqU/M8MPbOOEYwQVvQRMwVTgExtxzrkBPSXB4nA==} + engines: {node: '>= 10'} + cpu: [x64] + os: [win32] + + '@snazzah/davey@0.1.11': + resolution: {integrity: sha512-oBN+msHzPnm1M5DDx3wVD7iBwpNXFUtkh2MrAbUJu0OhKjliLChi28hq++mu1+qdMpAVQO5JKAvQQxYVbyneiw==} + engines: {node: '>= 10'} + + '@speed-highlight/core@1.2.15': + resolution: {integrity: sha512-BMq1K3DsElxDWawkX6eLg9+CKJrTVGCBAWVuHXVUV2u0s2711qiChLSId6ikYPfxhdYocLNt3wWwSvDiTvFabw==} '@standard-schema/spec@1.1.0': resolution: {integrity: sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w==} @@ -2059,69 +2452,69 @@ packages: '@swc/helpers@0.5.15': resolution: {integrity: sha512-JQ5TuMi45Owi4/BIMAJBoSQoOJu12oOk/gADqlcUL9JEdHB8vyjUSsxqeNXnmXHjYKMi2WcYtezGEEhqUI/E2g==} - '@tailwindcss/node@4.2.1': - resolution: {integrity: sha512-jlx6sLk4EOwO6hHe1oCGm1Q4AN/s0rSrTTPBGPM0/RQ6Uylwq17FuU8IeJJKEjtc6K6O07zsvP+gDO6MMWo7pg==} + '@tailwindcss/node@4.2.2': + resolution: {integrity: sha512-pXS+wJ2gZpVXqFaUEjojq7jzMpTGf8rU6ipJz5ovJV6PUGmlJ+jvIwGrzdHdQ80Sg+wmQxUFuoW1UAAwHNEdFA==} - '@tailwindcss/oxide-android-arm64@4.2.1': - resolution: {integrity: sha512-eZ7G1Zm5EC8OOKaesIKuw77jw++QJ2lL9N+dDpdQiAB/c/B2wDh0QPFHbkBVrXnwNugvrbJFk1gK2SsVjwWReg==} + '@tailwindcss/oxide-android-arm64@4.2.2': + resolution: {integrity: sha512-dXGR1n+P3B6748jZO/SvHZq7qBOqqzQ+yFrXpoOWWALWndF9MoSKAT3Q0fYgAzYzGhxNYOoysRvYlpixRBBoDg==} engines: {node: '>= 20'} cpu: [arm64] os: [android] - '@tailwindcss/oxide-darwin-arm64@4.2.1': - resolution: {integrity: sha512-q/LHkOstoJ7pI1J0q6djesLzRvQSIfEto148ppAd+BVQK0JYjQIFSK3JgYZJa+Yzi0DDa52ZsQx2rqytBnf8Hw==} + '@tailwindcss/oxide-darwin-arm64@4.2.2': + resolution: {integrity: sha512-iq9Qjr6knfMpZHj55/37ouZeykwbDqF21gPFtfnhCCKGDcPI/21FKC9XdMO/XyBM7qKORx6UIhGgg6jLl7BZlg==} engines: {node: '>= 20'} cpu: [arm64] os: [darwin] - '@tailwindcss/oxide-darwin-x64@4.2.1': - resolution: {integrity: sha512-/f/ozlaXGY6QLbpvd/kFTro2l18f7dHKpB+ieXz+Cijl4Mt9AI2rTrpq7V+t04nK+j9XBQHnSMdeQRhbGyt6fw==} + '@tailwindcss/oxide-darwin-x64@4.2.2': + resolution: {integrity: sha512-BlR+2c3nzc8f2G639LpL89YY4bdcIdUmiOOkv2GQv4/4M0vJlpXEa0JXNHhCHU7VWOKWT/CjqHdTP8aUuDJkuw==} engines: {node: '>= 20'} cpu: [x64] os: [darwin] - '@tailwindcss/oxide-freebsd-x64@4.2.1': - resolution: {integrity: sha512-5e/AkgYJT/cpbkys/OU2Ei2jdETCLlifwm7ogMC7/hksI2fC3iiq6OcXwjibcIjPung0kRtR3TxEITkqgn0TcA==} + '@tailwindcss/oxide-freebsd-x64@4.2.2': + resolution: {integrity: sha512-YUqUgrGMSu2CDO82hzlQ5qSb5xmx3RUrke/QgnoEx7KvmRJHQuZHZmZTLSuuHwFf0DJPybFMXMYf+WJdxHy/nQ==} engines: {node: '>= 20'} cpu: [x64] os: [freebsd] - '@tailwindcss/oxide-linux-arm-gnueabihf@4.2.1': - resolution: {integrity: sha512-Uny1EcVTTmerCKt/1ZuKTkb0x8ZaiuYucg2/kImO5A5Y/kBz41/+j0gxUZl+hTF3xkWpDmHX+TaWhOtba2Fyuw==} + '@tailwindcss/oxide-linux-arm-gnueabihf@4.2.2': + resolution: {integrity: sha512-FPdhvsW6g06T9BWT0qTwiVZYE2WIFo2dY5aCSpjG/S/u1tby+wXoslXS0kl3/KXnULlLr1E3NPRRw0g7t2kgaQ==} engines: {node: '>= 20'} cpu: [arm] os: [linux] - '@tailwindcss/oxide-linux-arm64-gnu@4.2.1': - resolution: {integrity: sha512-CTrwomI+c7n6aSSQlsPL0roRiNMDQ/YzMD9EjcR+H4f0I1SQ8QqIuPnsVp7QgMkC1Qi8rtkekLkOFjo7OlEFRQ==} + '@tailwindcss/oxide-linux-arm64-gnu@4.2.2': + resolution: {integrity: sha512-4og1V+ftEPXGttOO7eCmW7VICmzzJWgMx+QXAJRAhjrSjumCwWqMfkDrNu1LXEQzNAwz28NCUpucgQPrR4S2yw==} engines: {node: '>= 20'} cpu: [arm64] os: [linux] libc: [glibc] - '@tailwindcss/oxide-linux-arm64-musl@4.2.1': - resolution: {integrity: sha512-WZA0CHRL/SP1TRbA5mp9htsppSEkWuQ4KsSUumYQnyl8ZdT39ntwqmz4IUHGN6p4XdSlYfJwM4rRzZLShHsGAQ==} + '@tailwindcss/oxide-linux-arm64-musl@4.2.2': + resolution: {integrity: sha512-oCfG/mS+/+XRlwNjnsNLVwnMWYH7tn/kYPsNPh+JSOMlnt93mYNCKHYzylRhI51X+TbR+ufNhhKKzm6QkqX8ag==} engines: {node: '>= 20'} cpu: [arm64] os: [linux] libc: [musl] - '@tailwindcss/oxide-linux-x64-gnu@4.2.1': - resolution: {integrity: sha512-qMFzxI2YlBOLW5PhblzuSWlWfwLHaneBE0xHzLrBgNtqN6mWfs+qYbhryGSXQjFYB1Dzf5w+LN5qbUTPhW7Y5g==} + '@tailwindcss/oxide-linux-x64-gnu@4.2.2': + resolution: {integrity: sha512-rTAGAkDgqbXHNp/xW0iugLVmX62wOp2PoE39BTCGKjv3Iocf6AFbRP/wZT/kuCxC9QBh9Pu8XPkv/zCZB2mcMg==} engines: {node: '>= 20'} cpu: [x64] os: [linux] libc: [glibc] - '@tailwindcss/oxide-linux-x64-musl@4.2.1': - resolution: {integrity: sha512-5r1X2FKnCMUPlXTWRYpHdPYUY6a1Ar/t7P24OuiEdEOmms5lyqjDRvVY1yy9Rmioh+AunQ0rWiOTPE8F9A3v5g==} + '@tailwindcss/oxide-linux-x64-musl@4.2.2': + resolution: {integrity: sha512-XW3t3qwbIwiSyRCggeO2zxe3KWaEbM0/kW9e8+0XpBgyKU4ATYzcVSMKteZJ1iukJ3HgHBjbg9P5YPRCVUxlnQ==} engines: {node: '>= 20'} cpu: [x64] os: [linux] libc: [musl] - '@tailwindcss/oxide-wasm32-wasi@4.2.1': - resolution: {integrity: sha512-MGFB5cVPvshR85MTJkEvqDUnuNoysrsRxd6vnk1Lf2tbiqNlXpHYZqkqOQalydienEWOHHFyyuTSYRsLfxFJ2Q==} + '@tailwindcss/oxide-wasm32-wasi@4.2.2': + resolution: {integrity: sha512-eKSztKsmEsn1O5lJ4ZAfyn41NfG7vzCg496YiGtMDV86jz1q/irhms5O0VrY6ZwTUkFy/EKG3RfWgxSI3VbZ8Q==} engines: {node: '>=14.0.0'} cpu: [wasm32] bundledDependencies: @@ -2132,24 +2525,24 @@ packages: - '@emnapi/wasi-threads' - tslib - '@tailwindcss/oxide-win32-arm64-msvc@4.2.1': - resolution: {integrity: sha512-YlUEHRHBGnCMh4Nj4GnqQyBtsshUPdiNroZj8VPkvTZSoHsilRCwXcVKnG9kyi0ZFAS/3u+qKHBdDc81SADTRA==} + '@tailwindcss/oxide-win32-arm64-msvc@4.2.2': + resolution: {integrity: sha512-qPmaQM4iKu5mxpsrWZMOZRgZv1tOZpUm+zdhhQP0VhJfyGGO3aUKdbh3gDZc/dPLQwW4eSqWGrrcWNBZWUWaXQ==} engines: {node: '>= 20'} cpu: [arm64] os: [win32] - '@tailwindcss/oxide-win32-x64-msvc@4.2.1': - resolution: {integrity: sha512-rbO34G5sMWWyrN/idLeVxAZgAKWrn5LiR3/I90Q9MkA67s6T1oB0xtTe+0heoBvHSpbU9Mk7i6uwJnpo4u21XQ==} + '@tailwindcss/oxide-win32-x64-msvc@4.2.2': + resolution: {integrity: sha512-1T/37VvI7WyH66b+vqHj/cLwnCxt7Qt3WFu5Q8hk65aOvlwAhs7rAp1VkulBJw/N4tMirXjVnylTR72uI0HGcA==} engines: {node: '>= 20'} cpu: [x64] os: [win32] - '@tailwindcss/oxide@4.2.1': - resolution: {integrity: sha512-yv9jeEFWnjKCI6/T3Oq50yQEOqmpmpfzG1hcZsAOaXFQPfzWprWrlHSdGPEF3WQTi8zu8ohC9Mh9J470nT5pUw==} + '@tailwindcss/oxide@4.2.2': + resolution: {integrity: sha512-qEUA07+E5kehxYp9BVMpq9E8vnJuBHfJEC0vPC5e7iL/hw7HR61aDKoVoKzrG+QKp56vhNZe4qwkRmMC0zDLvg==} engines: {node: '>= 20'} - '@tailwindcss/postcss@4.2.1': - resolution: {integrity: sha512-OEwGIBnXnj7zJeonOh6ZG9woofIjGrd2BORfvE5p9USYKDCZoQmfqLcfNiRWoJlRWLdNPn2IgVZuWAOM4iTYMw==} + '@tailwindcss/postcss@4.2.2': + resolution: {integrity: sha512-n4goKQbW8RVXIbNKRB/45LzyUqN451deQK0nzIeauVEqjlI49slUlgKYJM2QyUzap/PcpnS7kzSUmPb1sCRvYQ==} '@takumi-rs/core-darwin-arm64@0.71.7': resolution: {integrity: sha512-mcW/ikpqj4QToZfvC6JY1nxnCpnvioOUm9QsXiGnjmr7z/zei1Xf4GKl67P/3dEXU6bi7gqsmEf+XOc66E6taQ==} @@ -2216,32 +2609,182 @@ packages: '@takumi-rs/wasm@0.71.7': resolution: {integrity: sha512-yoau96mSOvG4kSSdypWfpvAacjK4r5tHlg90kOkAcXDp/UFe3npEwNsGe5DzHdKqTpHWsr2tzmEdhjnZW4v2VQ==} - '@tanstack/history@1.161.4': - resolution: {integrity: sha512-Kp/WSt411ZWYvgXy6uiv5RmhHrz9cAml05AQPrtdAp7eUqvIDbMGPnML25OKbzR3RJ1q4wgENxDTvlGPa9+Mww==} + '@tanstack/history@1.161.6': + resolution: {integrity: sha512-NaOGLRrddszbQj9upGat6HG/4TKvXLvu+osAIgfxPYA+eIvYKv8GKDJOrY2D3/U9MRnKfMWD7bU4jeD4xmqyIg==} engines: {node: '>=20.19'} - '@tanstack/react-router@1.166.7': - resolution: {integrity: sha512-LLcXu2nrCn2WL+w0YAbg3CRZIIO2cYVSC3y+ZYlFBxBs4hh8eoNP1EWFvRLZGCFYpqON7x6qUf1u0W7tH0cJJw==} + '@tanstack/react-router-devtools@1.166.13': + resolution: {integrity: sha512-6yKRFFJrEEOiGp5RAAuGCYsl81M4XAhJmLcu9PKj+HZle4A3dsP60lwHoqQYWHMK9nKKFkdXR+D8qxzxqtQbEA==} engines: {node: '>=20.19'} + peerDependencies: + '@tanstack/react-router': ^1.168.15 + '@tanstack/router-core': ^1.168.11 + react: '>=18.0.0 || >=19.0.0' + react-dom: '>=18.0.0 || >=19.0.0' + peerDependenciesMeta: + '@tanstack/router-core': + optional: true + + '@tanstack/react-router@1.168.22': + resolution: {integrity: sha512-W2LyfkfJtDCf//jOjZeUBWwOVl8iDRVTECpGHa2M28MT3T5/VVnjgicYNHR/ax0Filk1iU67MRjcjHheTYvK1Q==} + engines: {node: '>=20.19'} + peerDependencies: + react: '>=18.0.0 || >=19.0.0' + react-dom: '>=18.0.0 || >=19.0.0' + + '@tanstack/react-start-client@1.166.39': + resolution: {integrity: sha512-NDao1nwwM4hXiVwQjVO8ZPlL9gZ0yeIl7w0PV+75jz+V9bhXr2nGhBuBw4zBuG7px4fEVmO5E8b7kpjWgCDJtA==} + engines: {node: '>=22.12.0'} + peerDependencies: + react: '>=18.0.0 || >=19.0.0' + react-dom: '>=18.0.0 || >=19.0.0' + + '@tanstack/react-start-rsc@0.0.20': + resolution: {integrity: sha512-KPsaq/asQxu/scMduMuQlwURIXwu+qZ7SO/8xbY/PQ/DJzfp9q1ZEHs9JN7dBEOHcme/YPeHta+UxBapB5Syyw==} + engines: {node: '>=22.12.0'} + peerDependencies: + '@vitejs/plugin-rsc': '>=0.5.20' + react: '>=18.0.0 || >=19.0.0' + react-dom: '>=18.0.0 || >=19.0.0' + peerDependenciesMeta: + '@vitejs/plugin-rsc': + optional: true + + '@tanstack/react-start-server@1.166.40': + resolution: {integrity: sha512-g5OU/eHmT1MleDbebdhNybpYgDu3QeNlemMCyXxEJNewOFM4iBlfoUBdMPhONJDlHQrOBXwMk/RUEFemY94yRw==} + engines: {node: '>=22.12.0'} peerDependencies: react: '>=18.0.0 || >=19.0.0' react-dom: '>=18.0.0 || >=19.0.0' - '@tanstack/react-store@0.9.2': - resolution: {integrity: sha512-Vt5usJE5sHG/cMechQfmwvwne6ktGCELe89Lmvoxe3LKRoFrhPa8OCKWs0NliG8HTJElEIj7PLtaBQIcux5pAQ==} + '@tanstack/react-start@1.167.41': + resolution: {integrity: sha512-w51yu/VQHNecIgN3ku+EmCxPjVbBftbnucDZBnxns43zPAhL5T5bnaBi0Fx4yJ3sDAmiceWEJD2F6IUaXTlNFA==} + engines: {node: '>=22.12.0'} + hasBin: true + peerDependencies: + '@vitejs/plugin-rsc': '*' + react: '>=18.0.0 || >=19.0.0' + react-dom: '>=18.0.0 || >=19.0.0' + vite: '>=7.0.0' + peerDependenciesMeta: + '@vitejs/plugin-rsc': + optional: true + + '@tanstack/react-store@0.9.3': + resolution: {integrity: sha512-y2iHd/N9OkoQbFJLUX1T9vbc2O9tjH0pQRgTcx1/Nz4IlwLvkgpuglXUx+mXt0g5ZDFrEeDnONPqkbfxXJKwRg==} peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 - '@tanstack/router-core@1.166.7': - resolution: {integrity: sha512-MCc8wYIIcxmbeidM8PL2QeaAjUIHyhEDIZPW6NGfn/uwvyi+K2ucn3AGCxxcXl4JGGm0Mx9+7buYl1v3HdcFrg==} + '@tanstack/router-core@1.168.15': + resolution: {integrity: sha512-Wr0424NDtD8fT/uALobMZ9DdcfsTyXtW5IPR++7zvW8/7RaIOeaqXpVDId8ywaGtqPWLWOfaUg2zUtYtukoXYA==} + engines: {node: '>=20.19'} + hasBin: true + + '@tanstack/router-devtools-core@1.167.3': + resolution: {integrity: sha512-fJ1VMhyQgnoashTrP763c2HRc9kofgF61L7Jb3F6eTHAmCKtGVx8BRtiFt37sr3U0P0jmaaiiSPGP6nT5JtVNg==} + engines: {node: '>=20.19'} + peerDependencies: + '@tanstack/router-core': ^1.168.11 + csstype: ^3.0.10 + peerDependenciesMeta: + csstype: + optional: true + + '@tanstack/router-generator@1.166.32': + resolution: {integrity: sha512-VuusKwEXcgKq+myq1JQfZogY8scTXIIeFls50dJ/UXgCXWp5n14iFreYNlg41wURcak2oA3M+t2TVfD0xUUD6g==} + engines: {node: '>=20.19'} + + '@tanstack/router-plugin@1.167.22': + resolution: {integrity: sha512-wYPzIvBK8bcmXVUpZfSgGBXOrfBAdF4odKevz6rejio5rEd947NtKDF5R7eYdwlAOmRqYpLJnJ1QHkc5t8bY4w==} + engines: {node: '>=20.19'} + hasBin: true + peerDependencies: + '@rsbuild/core': '>=1.0.2' + '@tanstack/react-router': ^1.168.21 + vite: '>=5.0.0 || >=6.0.0 || >=7.0.0 || >=8.0.0' + vite-plugin-solid: ^2.11.10 || ^3.0.0-0 + webpack: '>=5.92.0' + peerDependenciesMeta: + '@rsbuild/core': + optional: true + '@tanstack/react-router': + optional: true + vite: + optional: true + vite-plugin-solid: + optional: true + webpack: + optional: true + + '@tanstack/router-utils@1.161.6': + resolution: {integrity: sha512-nRcYw+w2OEgK6VfjirYvGyPLOK+tZQz1jkYcmH5AjMamQ9PycnlxZF2aEZtPpNoUsaceX2bHptn6Ub5hGXqNvw==} + engines: {node: '>=20.19'} + + '@tanstack/start-client-core@1.167.17': + resolution: {integrity: sha512-3ZnpQ0LPnhrm/GX+HT7XfRxTcqnmBE1KJd7LtaJNuN13NH0C4ZOWchKLPEed2/gluhgsT6UgWm+Ec0kEFtxSaw==} + engines: {node: '>=22.12.0'} + hasBin: true + + '@tanstack/start-fn-stubs@1.161.6': + resolution: {integrity: sha512-Y6QSlGiLga8cHfvxGGaonXIlt2bIUTVdH6AMjmpMp7+ANNCp+N96GQbjjhLye3JkaxDfP68x5iZA8NK4imgRig==} + engines: {node: '>=22.12.0'} + + '@tanstack/start-plugin-core@1.167.35': + resolution: {integrity: sha512-Ww511KfsXd7TbPYzjiUDCMUI5VbO0chmrTgFi1oOUT0jmk5U0Xh9WVIun1cvRmaq+KBZwvWGvmeIn0UwO3mHEA==} + engines: {node: '>=22.12.0'} + peerDependencies: + vite: '>=7.0.0' + + '@tanstack/start-server-core@1.167.19': + resolution: {integrity: sha512-wzOdfzLsK91CnjoywnEjXSlVlaRVK99HJhyVijNU1TECBI2JEKvW9S6d14YfS4gD4fFH4V86tFYhkcLPe6nzWg==} + engines: {node: '>=22.12.0'} + hasBin: true + + '@tanstack/start-storage-context@1.166.29': + resolution: {integrity: sha512-KrJYudc1nbnTY43jdN+hQFMYkhz7+3T+hkgBoGnIP1OspSe6vGQaYGDB4EUXYnkLfyQp+iUuKubgS8hSKeJ0ng==} + engines: {node: '>=22.12.0'} + + '@tanstack/store@0.9.3': + resolution: {integrity: sha512-8reSzl/qGWGGVKhBoxXPMWzATSbZLZFWhwBAFO9NAyp0TxzfBP0mIrGb8CP8KrQTmvzXlR/vFPPUrHTLBGyFyw==} + + '@tanstack/virtual-file-routes@1.161.7': + resolution: {integrity: sha512-olW33+Cn+bsCsZKPwEGhlkqS6w3M2slFv11JIobdnCFKMLG97oAI2kWKdx5/zsywTL8flpnoIgaZZPlQTFYhdQ==} engines: {node: '>=20.19'} + hasBin: true + + '@ts-morph/common@0.29.0': + resolution: {integrity: sha512-35oUmphHbJvQ/+UTwFNme/t2p3FoKiGJ5auTjjpNTop2dyREspirjMy82PLSC1pnDJ8ah1GU98hwpVt64YXQsg==} - '@tanstack/store@0.9.2': - resolution: {integrity: sha512-K013lUJEFJK2ofFQ/hZKJUmCnpcV00ebLyOyFOWQvyQHUOZp/iYO84BM6aOGiV81JzwbX0APTVmW8YI7yiG5oA==} + '@turbo/darwin-64@2.9.6': + resolution: {integrity: sha512-X/56SnVXIQZBLKwniGTwEQTGmtE5brSACnKMBWpY3YafuxVYefrC2acamfjgxP7BG5w3I+6jf0UrLoSzgPcSJg==} + cpu: [x64] + os: [darwin] + + '@turbo/darwin-arm64@2.9.6': + resolution: {integrity: sha512-aalBeSl4agT/QtYGDyf/XLajedWzUC9Vg/pm/YO6QQ93vkQ91Vz5uK1ta5RbVRDozQSz4njxUNqRNmOXDzW+qw==} + cpu: [arm64] + os: [darwin] + + '@turbo/linux-64@2.9.6': + resolution: {integrity: sha512-YKi05jnNHaD7vevgYwahpzGwbsNNTwzU2c7VZdmdFm7+cGDP4oREUWSsainiMfRqjRuolQxBwRn8wf1jmu+YZA==} + cpu: [x64] + os: [linux] - '@ts-morph/common@0.28.1': - resolution: {integrity: sha512-W74iWf7ILp1ZKNYXY5qbddNaml7e9Sedv5lvU1V8lftlitkc9Pq1A+jlH23ltDgWYeZFFEqGCD1Ies9hqu3O+g==} + '@turbo/linux-arm64@2.9.6': + resolution: {integrity: sha512-02o/ZS69cOYEDczXvOB2xmyrtzjQ2hVFtWZK1iqxXUfzMmTjZK4UumrfNnjckSg+gqeBfnPRHa0NstA173Ik3g==} + cpu: [arm64] + os: [linux] + + '@turbo/windows-64@2.9.6': + resolution: {integrity: sha512-wVdQjvnBI15wB6JrA+43CtUtagjIMmX6XYO758oZHAsCNSxqRlJtdyujih0D8OCnwCRWiGWGI63zAxR0hO6s9g==} + cpu: [x64] + os: [win32] + + '@turbo/windows-arm64@2.9.6': + resolution: {integrity: sha512-1XUUyWW0W6FTSqGEhU8RHVqb2wP1SPkr7hIvBlMEwH9jr+sJQK5kqeosLJ/QaUv4ecSAd1ZhIrLoW7qslAzT4A==} + cpu: [arm64] + os: [win32] '@tybys/wasm-util@0.10.1': resolution: {integrity: sha512-9tTaPJLSiejZKx+Bmog4uSubteqTvFrVrURwkmHixBo0G4seD0zUxp98E1DzUBJxLQ3NPwXrGKDiVjwx/DpPsg==} @@ -2252,14 +2795,18 @@ packages: '@types/babel__generator@7.27.0': resolution: {integrity: sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg==} + '@types/babel__parser@7.1.5': + resolution: {integrity: sha512-yyWPJg3KawM9ydArmt2q+UE6dhy0usfXNB1yxDv0gE27KbZXeFCDtqR2L4jdVxXqq7I9tvkL9zuSY/ZVgF6fXQ==} + deprecated: This is a stub types definition. @babel/parser provides its own type definitions, so you do not need this installed. + '@types/babel__template@7.4.4': resolution: {integrity: sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==} '@types/babel__traverse@7.28.0': resolution: {integrity: sha512-8PvcXf70gTDZBgt9ptxJ8elBeBjcLOAcOtoO/mPJjtji1+CdGbHgm77om1GrsPxsiE+uXIpNSK64UYaIwQXd4Q==} - '@types/bun@1.3.6': - resolution: {integrity: sha512-uWCv6FO/8LcpREhenN1d1b6fcspAB+cefwD7uti8C8VffIv0Um08TKMn98FynpTiU38+y2dUO55T11NgDt8VAA==} + '@types/bun@1.3.11': + resolution: {integrity: sha512-5vPne5QvtpjGpsGYXiFyycfpDF2ECyPcTSsFBMa0fraoxiQyMJ3SmuQIGhzPg2WJuWxVBoxWJ2kClYTcw/4fAg==} '@types/chai@5.2.3': resolution: {integrity: sha512-Mw558oeA9fFbv65/y4mHtXDs9bPnFMZAL/jxdPFUpOHHIXX91mcgEHbS5Lahr+pwZFR8A7GQleRWeI6cGFC2UA==} @@ -2357,8 +2904,8 @@ packages: '@types/d3@7.4.3': resolution: {integrity: sha512-lZXZ9ckh5R8uiFVt8ogUNf+pIrK4EsWrx2Np75WvF/eTpJ0FMHNhjXk8CKEx/+gpHbNQyJWehbFaTvqmHWB3ww==} - '@types/debug@4.1.12': - resolution: {integrity: sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==} + '@types/debug@4.1.13': + resolution: {integrity: sha512-KSVgmQmzMwPlmtljOomayoR89W4FynCAi3E8PPs7vmDVPe84hT+vGPKkJfThkmXs0x0jAaa9U8uW8bbfyS2fWw==} '@types/deep-eql@4.0.2': resolution: {integrity: sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw==} @@ -2390,23 +2937,17 @@ packages: '@types/node@12.20.55': resolution: {integrity: sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==} - '@types/node@25.2.3': - resolution: {integrity: sha512-m0jEgYlYz+mDJZ2+F4v8D1AyQb+QzsNqRuI7xg1VQX/KlKS0qT9r1Mo16yo5F/MtifXFgaofIFsdFMox2SxIbQ==} - - '@types/node@25.4.0': - resolution: {integrity: sha512-9wLpoeWuBlcbBpOY3XmzSTG3oscB6xjBEEtn+pYXTfhyXhIxC5FsBer2KTopBlvKEiW9l13po9fq+SJY/5lkhw==} + '@types/node@25.6.0': + resolution: {integrity: sha512-+qIYRKdNYJwY3vRCZMdJbPLJAtGjQBudzZzdzwQYkEPQd+PJGixUL5QfvCLDaULoLv+RhT3LDkwEfKaAkgSmNQ==} - '@types/picomatch@4.0.2': - resolution: {integrity: sha512-qHHxQ+P9PysNEGbALT8f8YOSHW0KJu6l2xU8DYY0fu/EmGxXdVnuTLvFUvBgPJMSqXq29SYHveejeAha+4AYgA==} + '@types/picomatch@4.0.3': + resolution: {integrity: sha512-iG0T6+nYJ9FAPmx9SsUlnwcq1ZVRuCXcVEvWnntoPlrOpwtSTKNDC9uVAxTsC3PUvJ+99n4RpAcNgBbHX3JSnQ==} '@types/react-dom@19.2.3': resolution: {integrity: sha512-jp2L/eY6fn+KgVVQAOqYItbF0VY/YApe5Mz2F0aykSO8gx31bYCZyvSeYxCHKvzHG5eZjc+zyaS5BrBWya2+kQ==} peerDependencies: '@types/react': ^19.2.0 - '@types/react@19.2.13': - resolution: {integrity: sha512-KkiJeU6VbYbUOp5ITMIc7kBfqlYkKA5KhEHVrGMmUUMt7NeaZg65ojdPk+FtNrBAOXNVM5QM72jnADjM+XVRAQ==} - '@types/react@19.2.14': resolution: {integrity: sha512-ilcTH/UniCkMdtexkoCN0bI7pMcJDvmQFPvuPvmEaYA/NSfFTAgdUSLAoVjaRJm7+6PvcM+q1zYOwS4wTYMF9w==} @@ -2428,43 +2969,56 @@ packages: '@upsetjs/venn.js@2.0.0': resolution: {integrity: sha512-WbBhLrooyePuQ1VZxrJjtLvTc4NVfpOyKx0sKqioq9bX1C1m7Jgykkn8gLrtwumBioXIqam8DLxp88Adbue6Hw==} - '@vitest/coverage-v8@4.0.18': - resolution: {integrity: sha512-7i+N2i0+ME+2JFZhfuz7Tg/FqKtilHjGyGvoHYQ6iLV0zahbsJ9sljC9OcFcPDbhYKCet+sG8SsVqlyGvPflZg==} + '@vitejs/plugin-react@6.0.1': + resolution: {integrity: sha512-l9X/E3cDb+xY3SWzlG1MOGt2usfEHGMNIaegaUGFsLkb3RCn/k8/TOXBcab+OndDI4TBtktT8/9BwwW8Vi9KUQ==} + engines: {node: ^20.19.0 || >=22.12.0} + peerDependencies: + '@rolldown/plugin-babel': ^0.1.7 || ^0.2.0 + babel-plugin-react-compiler: ^1.0.0 + vite: ^8.0.0 + peerDependenciesMeta: + '@rolldown/plugin-babel': + optional: true + babel-plugin-react-compiler: + optional: true + + '@vitest/coverage-v8@4.1.4': + resolution: {integrity: sha512-x7FptB5oDruxNPDNY2+S8tCh0pcq7ymCe1gTHcsp733jYjrJl8V1gMUlVysuCD9Kz46Xz9t1akkv08dPcYDs1w==} peerDependencies: - '@vitest/browser': 4.0.18 - vitest: 4.0.18 + '@vitest/browser': 4.1.4 + vitest: 4.1.4 peerDependenciesMeta: '@vitest/browser': optional: true - '@vitest/expect@4.0.18': - resolution: {integrity: sha512-8sCWUyckXXYvx4opfzVY03EOiYVxyNrHS5QxX3DAIi5dpJAAkyJezHCP77VMX4HKA2LDT/Jpfo8i2r5BE3GnQQ==} + '@vitest/expect@4.1.4': + resolution: {integrity: sha512-iPBpra+VDuXmBFI3FMKHSFXp3Gx5HfmSCE8X67Dn+bwephCnQCaB7qWK2ldHa+8ncN8hJU8VTMcxjPpyMkUjww==} - '@vitest/mocker@4.0.18': - resolution: {integrity: sha512-HhVd0MDnzzsgevnOWCBj5Otnzobjy5wLBe4EdeeFGv8luMsGcYqDuFRMcttKWZA5vVO8RFjexVovXvAM4JoJDQ==} + '@vitest/mocker@4.1.4': + resolution: {integrity: sha512-R9HTZBhW6yCSGbGQnDnH3QHfJxokKN4KB+Yvk9Q1le7eQNYwiCyKxmLmurSpFy6BzJanSLuEUDrD+j97Q+ZLPg==} peerDependencies: msw: ^2.4.9 - vite: ^6.0.0 || ^7.0.0-0 + vite: ^6.0.0 || ^7.0.0 || ^8.0.0 peerDependenciesMeta: msw: optional: true vite: optional: true - '@vitest/pretty-format@4.0.18': - resolution: {integrity: sha512-P24GK3GulZWC5tz87ux0m8OADrQIUVDPIjjj65vBXYG17ZeU3qD7r+MNZ1RNv4l8CGU2vtTRqixrOi9fYk/yKw==} + '@vitest/pretty-format@4.1.4': + resolution: {integrity: sha512-ddmDHU0gjEUyEVLxtZa7xamrpIefdEETu3nZjWtHeZX4QxqJ7tRxSteHVXJOcr8jhiLoGAhkK4WJ3WqBpjx42A==} - '@vitest/runner@4.0.18': - resolution: {integrity: sha512-rpk9y12PGa22Jg6g5M3UVVnTS7+zycIGk9ZNGN+m6tZHKQb7jrP7/77WfZy13Y/EUDd52NDsLRQhYKtv7XfPQw==} + '@vitest/runner@4.1.4': + resolution: {integrity: sha512-xTp7VZ5aXP5ZJrn15UtJUWlx6qXLnGtF6jNxHepdPHpMfz/aVPx+htHtgcAL2mDXJgKhpoo2e9/hVJsIeFbytQ==} - '@vitest/snapshot@4.0.18': - resolution: {integrity: sha512-PCiV0rcl7jKQjbgYqjtakly6T1uwv/5BQ9SwBLekVg/EaYeQFPiXcgrC2Y7vDMA8dM1SUEAEV82kgSQIlXNMvA==} + '@vitest/snapshot@4.1.4': + resolution: {integrity: sha512-MCjCFgaS8aZz+m5nTcEcgk/xhWv0rEH4Yl53PPlMXOZ1/Ka2VcZU6CJ+MgYCZbcJvzGhQRjVrGQNZqkGPttIKw==} - '@vitest/spy@4.0.18': - resolution: {integrity: sha512-cbQt3PTSD7P2OARdVW3qWER5EGq7PHlvE+QfzSC0lbwO+xnt7+XH06ZzFjFRgzUX//JmpxrCu92VdwvEPlWSNw==} + '@vitest/spy@4.1.4': + resolution: {integrity: sha512-XxNdAsKW7C+FLydqFJLb5KhJtl3PGCMmYwFRfhvIgxJvLSXhhVI1zM8f1qD3Zg7RCjTSzDVyct6sghs9UEgBEQ==} - '@vitest/utils@4.0.18': - resolution: {integrity: sha512-msMRKLMVLWygpK3u2Hybgi4MNjcYJvwTb0Ru09+fOyCXIgT5raYP041DRRdiJiI3k/2U6SEbAETB3YtBrUkCFA==} + '@vitest/utils@4.1.4': + resolution: {integrity: sha512-13QMT+eysM5uVGa1rG4kegGYNp6cnQcsTc67ELFbhNLQO+vgsygtYJx2khvdt4gVQqSSpC/KT5FZZxUpP3Oatw==} acorn-jsx@5.3.2: resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} @@ -2492,6 +3046,10 @@ packages: resolution: {integrity: sha512-HqZ5rWlFjGiV0tDm3UxxgNRqsOTniqoKZu0pIAfh7TZQMGuZK+hH0drySty0si0QXj1ieop4+SkSfPZBPPkHig==} engines: {node: '>=14'} + anymatch@3.1.3: + resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} + engines: {node: '>= 8'} + argparse@1.0.10: resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==} @@ -2514,25 +3072,31 @@ packages: resolution: {integrity: sha512-trmleAnZ2PxN/loHWVhhx1qeOHSRXq4TDsBBxq3GqeJitfk3+jTQ+v/C1km/KYq9M7wKqCewMh+/NAvVH7m+bw==} engines: {node: '>=20.19.0'} - ast-v8-to-istanbul@0.3.10: - resolution: {integrity: sha512-p4K7vMz2ZSk3wN8l5o3y2bJAoZXT3VuJI5OLTATY/01CYWumWvwkUw0SqDBnNq6IiTO3qDa1eSQDibAV8g7XOQ==} + ast-v8-to-istanbul@1.0.0: + resolution: {integrity: sha512-1fSfIwuDICFA4LKkCzRPO7F0hzFf0B7+Xqrl27ynQaa+Rh0e1Es0v6kWHPott3lU10AyAr7oKHa65OppjLn3Rg==} astring@1.9.0: resolution: {integrity: sha512-LElXdjswlqjWrPpJFg1Fx4wpkOCxj1TDHlSV4PlaRxHGWko024xICaa97ZkMfs6DRKlCguiAI+rbXv5GWwXIkg==} hasBin: true + babel-dead-code-elimination@1.0.12: + resolution: {integrity: sha512-GERT7L2TiYcYDtYk1IpD+ASAYXjKbLTDPhBtYj7X1NuRMDTMtAx9kyBenub1Ev41lo91OHCKdmP+egTDmfQ7Ig==} + bail@2.0.2: resolution: {integrity: sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==} - balanced-match@1.0.2: - resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} - balanced-match@4.0.4: resolution: {integrity: sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==} engines: {node: 18 || 20 || >=22} - baseline-browser-mapping@2.9.11: - resolution: {integrity: sha512-Sg0xJUNDU1sJNGdfGWhVHX0kkZ+HWcvmVymJbj6NSgZZmW/8S9Y2HQ5euytnIgakgxN6papOAWiwDo1ctFDcoQ==} + baseline-browser-mapping@2.10.13: + resolution: {integrity: sha512-BL2sTuHOdy0YT1lYieUxTw/QMtPBC3pmlJC6xk8BBYVv6vcw3SGdKemQ+Xsx9ik2F/lYDO9tqsFQH1r9PFuHKw==} + engines: {node: '>=6.0.0'} + hasBin: true + + baseline-browser-mapping@2.10.19: + resolution: {integrity: sha512-qCkNLi2sfBOn8XhZQ0FXsT1Ki/Yo5P90hrkRamVFRS7/KV9hpfA4HkoWNU152+8w0zPjnxo5psx5NL3PSGgv5g==} + engines: {node: '>=6.0.0'} hasBin: true beautiful-mermaid@1.1.3: @@ -2542,37 +3106,44 @@ packages: resolution: {integrity: sha512-pbnl5XzGBdrFU/wT4jqmJVPn2B6UHPBOhzMQkY/SPUPB6QtUXtmBHBIwCbXJol93mOpGMnQyP/+BB19q04xj7g==} engines: {node: '>=4'} + binary-extensions@2.3.0: + resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==} + engines: {node: '>=8'} + birpc@4.0.0: resolution: {integrity: sha512-LShSxJP0KTmd101b6DRyGBj57LZxSDYWKitQNW/mi8GRMvZb078Uf9+pveax1DrVL89vm7mWe+TovdI/UDOuPw==} blake3-wasm@2.1.5: resolution: {integrity: sha512-F1+K8EbfOZE49dtoPtmxUQrpXaBIl3ICvasLh+nJta0xkz+9kF/7uet9fLnwKqhDrmj6g+6K3Tw9yQPUg2ka5g==} - brace-expansion@2.0.2: - resolution: {integrity: sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==} + boolbase@1.0.0: + resolution: {integrity: sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==} - brace-expansion@5.0.4: - resolution: {integrity: sha512-h+DEnpVvxmfVefa4jFbCf5HdH5YMDXRsmKflpf1pILZWRFlTbJpxeU55nJl4Smt5HQaGzg1o6RHFPJaOqnmBDg==} + brace-expansion@5.0.5: + resolution: {integrity: sha512-VZznLgtwhn+Mact9tfiwx64fA9erHH/MCXEUfB/0bX/6Fz6ny5EGTXYltMocqg4xFAQZtnO3DHWWXi8RiuN7cQ==} engines: {node: 18 || 20 || >=22} braces@3.0.3: resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} engines: {node: '>=8'} - browserslist@4.28.1: - resolution: {integrity: sha512-ZC5Bd0LgJXgwGqUknZY/vkUQ04r8NXnJZ3yYi4vDmSiZmC/pdSN0NbNRPxZpbtO4uAfDUAFffO8IZoM3Gj8IkA==} + browserslist@4.28.2: + resolution: {integrity: sha512-48xSriZYYg+8qXna9kwqjIVzuQxi+KYWp2+5nCYnYKPTr0LvD89Jqk2Or5ogxz0NUMfIjhh2lIUX/LyX9B4oIg==} engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} hasBin: true - bun-types@1.3.6: - resolution: {integrity: sha512-OlFwHcnNV99r//9v5IIOgQ9Uk37gZqrNMCcqEaExdkVq3Avwqok1bJFmvGMCkCE0FqzdY8VMOZpfpR3lwI+CsQ==} + bun-types@1.3.11: + resolution: {integrity: sha512-1KGPpoxQWl9f6wcZh57LvrPIInQMn2TQ7jsgxqpRzg+l0QPOFvJVH7HmvHo/AiPgwXy+/Thf6Ov3EdVn1vOabg==} - cac@6.7.14: - resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} - engines: {node: '>=8'} + cac@7.0.0: + resolution: {integrity: sha512-tixWYgm5ZoOD+3g6UTea91eow5z6AAHaho3g0V9CNSNb45gM8SmflpAc+GRd1InC4AqN/07Unrgp56Y94N9hJQ==} + engines: {node: '>=20.19.0'} - caniuse-lite@1.0.30001761: - resolution: {integrity: sha512-JF9ptu1vP2coz98+5051jZ4PwQgd2ni8A+gYSN7EA7dPKIMf0pDlSUxhdmVOaV3/fYK5uWBkgSXJaRLr4+3A6g==} + caniuse-lite@1.0.30001784: + resolution: {integrity: sha512-WU346nBTklUV9YfUl60fqRbU5ZqyXlqvo1SgigE1OAXK5bFL8LL9q1K7aap3N739l4BvNqnkm3YrGHiY9sfUQw==} + + caniuse-lite@1.0.30001788: + resolution: {integrity: sha512-6q8HFp+lOQtcf7wBK+uEenxymVWkGKkjFpCvw5W25cmMwEDU45p1xQFBQv8JDlMMry7eNxyBaR+qxgmTUZkIRQ==} ccount@2.0.1: resolution: {integrity: sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==} @@ -2600,6 +3171,13 @@ packages: chardet@2.1.1: resolution: {integrity: sha512-PsezH1rqdV9VvyNhxxOW32/d75r01NY7TQCmOqomRo15ZSOKbpTFVsfjghxo6JloQUCGnH4k1LGu0R4yCLlWQQ==} + cheerio-select@2.1.0: + resolution: {integrity: sha512-9v9kG0LvzrlcungtnJtpGNxY+fzECQKhK4EGJX2vByejiMX84MFNQw4UxPJl3bFbTMw+Dfs37XaIkCwTZfLh4g==} + + cheerio@1.2.0: + resolution: {integrity: sha512-WDrybc/gKFpTYQutKIK6UvfcuxijIZfMfXaYm8NMsPQxSYvf+13fXUJ4rztGGbJcBQ/GF55gvrZ0Bc0bj/mqvg==} + engines: {node: '>=20.18.1'} + chevrotain-allstar@0.3.1: resolution: {integrity: sha512-b7g+y9A0v4mxCW1qUhf3BSVPg+/NvGErk/dOkrDaHA0nQIQGAtrOjlX//9OQtRlSCy+x9rfB5N8yC71lH1nvMw==} peerDependencies: @@ -2608,6 +3186,10 @@ packages: chevrotain@11.1.2: resolution: {integrity: sha512-opLQzEVriiH1uUQ4Kctsd49bRoFDXGGSC4GUqj7pGyxM3RehRhvTlZJc1FL/Flew2p5uwxa1tUDWKzI4wNM8pg==} + chokidar@3.6.0: + resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==} + engines: {node: '>= 8.10.0'} + chokidar@5.0.0: resolution: {integrity: sha512-TQMmc3w+5AxjpL8iIiwebF73dRDF4fBIieAqGn9RGCWaEVwQ6Fb2cGe31Yns0RRIzii5goJ1Y7xbMwo1TxMplw==} engines: {node: '>= 20.19.0'} @@ -2659,8 +3241,8 @@ packages: convert-source-map@2.0.0: resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} - cookie-es@2.0.0: - resolution: {integrity: sha512-RAj4E421UYRgqokKUmotqAwuplYw15qtdXfY+hGzgCJ/MBjCVZcSoHK/kH9kocfjRjcDME7IiDWR/1WX1TM2Pg==} + cookie-es@3.1.1: + resolution: {integrity: sha512-UaXxwISYJPTr9hwQxMFYZ7kNhSXboMXP+Z3TRX6f1/NyaGPfuNUZOWP1pUEb75B2HjfklIYLVRfWiFZJyC6Npg==} cookie@1.1.1: resolution: {integrity: sha512-ei8Aos7ja0weRpFzJnEA9UHJ/7XQmqglbRwnf2ATjcB9Wq874VKH9kfjjirM6UhU2/E5fFYadylyhFldcqSidQ==} @@ -2676,10 +3258,12 @@ packages: resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} engines: {node: '>= 8'} - cssesc@3.0.0: - resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==} - engines: {node: '>=4'} - hasBin: true + css-select@5.2.2: + resolution: {integrity: sha512-TizTzUddG/xYLA3NXodFM0fSbNizXjOKhqiQQwvhlspadZokn1KDy0NZFS0wuEubIYAV5/c1/lAr0TaaFXEXzw==} + + css-what@6.2.2: + resolution: {integrity: sha512-u/O3vwbptzhMs3L1fQE82ZSLHQQfto5gyZzwteVIEyeaY5Fc7R4dapF/BvRoSYFeqfBk4m0V1Vafq5Pjv25wvA==} + engines: {node: '>= 6'} csstype@3.2.3: resolution: {integrity: sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==} @@ -2840,8 +3424,8 @@ packages: dagre-d3-es@7.0.14: resolution: {integrity: sha512-P4rFMVq9ESWqmOgK+dlXvOtLwYg0i7u0HBGJER0LZDJT2VHIPAMZ/riPxqJceWMStH5+E61QxFra9kIS3AqdMg==} - dayjs@1.11.19: - resolution: {integrity: sha512-t5EcLVS6QPBNqM2z8fakk/NKel+Xzshgt8FFKAn+qwlD1pzZWxh0nVCrvFK7ZDb6XucZeF9z8C7CBWTRIVApAw==} + dayjs@1.11.20: + resolution: {integrity: sha512-YbwwqR/uYpeoP4pu043q+LTDLFBLApUP6VxRihdfNTqu4ubqMlGDLd6ErXhEgsyvY0K6nCs7nggYumAN+9uEuQ==} debug@4.4.3: resolution: {integrity: sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==} @@ -2855,11 +3439,11 @@ packages: decode-named-character-reference@1.3.0: resolution: {integrity: sha512-GtpQYB283KrPp6nRw50q3U9/VfOutZOe103qlN7BPP6Ad27xYnOIWv4lPzo8HCAL+mMZofJ9KEy30fq6MfaK6Q==} - defu@6.1.4: - resolution: {integrity: sha512-mEQCMmwJu317oSz8CwdIOdwf3xMif1ttiM8LTufzc3g6kR+9Pe236twL8j3IYT1F7GfRgGcW6MWxzZjLIkuHIg==} + defu@6.1.7: + resolution: {integrity: sha512-7z22QmUWiQ/2d0KkdYmANbRUVABpZ9SNYyH5vx6PZ+nE5bcC0l7uFvEfHlyld/HcGBFTL536ClDt3DEcSlEJAQ==} - delaunator@5.0.1: - resolution: {integrity: sha512-8nvh+XBe96aCESrGOqMp/84b13H9cdKbG5P2ejQCh4d4sK9RL4371qou9drQjMhvnPmhWl5hnmqbEE0fXr9Xnw==} + delaunator@5.1.0: + resolution: {integrity: sha512-AGrQ4QSgssa1NGmWmLPqN5NY2KajF5MqxetNEO+o0n3ZwZZeTmt7bBnvzHWrmkZFxGgr4HdyFgelzgi06otLuQ==} dequal@2.0.3: resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==} @@ -2879,16 +3463,33 @@ packages: devlop@1.1.0: resolution: {integrity: sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==} + diff@8.0.4: + resolution: {integrity: sha512-DPi0FmjiSU5EvQV0++GFDOJ9ASQUVFh5kD+OzOnYdi7n3Wpm9hWWGfB/O2blfHcMVTL5WkQXSnRiK9makhrcnw==} + engines: {node: '>=0.3.1'} + dir-glob@3.0.1: resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} engines: {node: '>=8'} - discord-api-types@0.38.37: - resolution: {integrity: sha512-Cv47jzY1jkGkh5sv0bfHYqGgKOWO1peOrGMkDFM4UmaGMOTgOW8QSexhvixa9sVOiz8MnVOBryWYyw/CEVhj7w==} + discord-api-types@0.38.45: + resolution: {integrity: sha512-DiI01i00FPv6n+hXcFkFxK8Y/rFRpKs6U6aP32N4T73nTbj37Eua3H/95TBpLktLWB6xnLXhYDGvyLq6zzYY2w==} + + dom-serializer@2.0.0: + resolution: {integrity: sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==} + + domelementtype@2.3.0: + resolution: {integrity: sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==} + + domhandler@5.0.3: + resolution: {integrity: sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==} + engines: {node: '>= 4'} dompurify@3.3.3: resolution: {integrity: sha512-Oj6pzI2+RqBfFG+qOaOLbFXLQ90ARpcGG6UePL82bJLtdsa6CYJD7nmiU8MW9nQNOtCHV3lZ/Bzq1X0QYbBZCA==} + domutils@3.2.2: + resolution: {integrity: sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw==} + dts-resolver@2.1.3: resolution: {integrity: sha512-bihc7jPC90VrosXNzK0LTE2cuLP6jr0Ro8jk+kMugHReJVLIpHz/xadeq3MhuwyO4TD4OA3L1Q8pBBFRc08Tsw==} engines: {node: '>=20.19.0'} @@ -2898,8 +3499,8 @@ packages: oxc-resolver: optional: true - electron-to-chromium@1.5.267: - resolution: {integrity: sha512-0Drusm6MVRXSOJpGbaSVgcQsuB4hEkMpHXaVstcPmhu5LIedxs1xNK/nIxmQIU/RPC0+1/o0AVZfBTkTNJOdUw==} + electron-to-chromium@1.5.331: + resolution: {integrity: sha512-IbxXrsTlD3hRodkLnbxAPP4OuJYdWCeM3IOdT+CpcMoIwIoDfCmRpEtSPfwBXxVkg9xmBeY7Lz2Eo2TDn/HC3Q==} elkjs@0.11.1: resolution: {integrity: sha512-zxxR9k+rx5ktMwT/FwyLdPCrq7xN6e4VGGHH8hA01vVYKjTFik7nHOxBnAYtrgYUB1RpAiLvA1/U2YraWxyKKg==} @@ -2908,14 +3509,21 @@ packages: resolution: {integrity: sha512-i6UzDscO/XfAcNYD75CfICkmfLedpyPDdozrLMmQc5ORaQcdMoc21OnlEylMIqI7U8eniKrPMxxtj8k0vhmJhA==} engines: {node: '>=14'} - enhanced-resolve@5.20.0: - resolution: {integrity: sha512-/ce7+jQ1PQ6rVXwe+jKEg5hW5ciicHwIQUagZkp6IufBoY3YDgdTTY1azVs0qoRgVmvsNB+rbjLJxDAeHHtwsQ==} + encoding-sniffer@0.2.1: + resolution: {integrity: sha512-5gvq20T6vfpekVtqrYQsSCFZ1wEg5+wW0/QaZMWkFr6BqD3NfKs0rLCx4rrVlSWJeZb5NBJgVLswK/w2MWU+Gw==} + + enhanced-resolve@5.20.1: + resolution: {integrity: sha512-Qohcme7V1inbAfvjItgw0EaxVX5q2rdVEZHRBrEQdRZTssLDGsL8Lwrznl8oQ/6kuTJONLaDcGjkNP247XEhcA==} engines: {node: '>=10.13.0'} enquirer@2.4.1: resolution: {integrity: sha512-rRqJg/6gd538VHvR3PSrdRBb/1Vy2YfzHqzvbhGIQpDRKIa4FgV/54b5Q1xYSxOOwKvjXweS26E0Q+nAMwp2pQ==} engines: {node: '>=8.6'} + entities@4.5.0: + resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} + engines: {node: '>=0.12'} + entities@6.0.1: resolution: {integrity: sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==} engines: {node: '>=0.12'} @@ -2927,8 +3535,8 @@ packages: error-stack-parser-es@1.0.5: resolution: {integrity: sha512-5qucVt2XcuGMcEGgWI7i+yZpmpByQ8J1lHhcL7PwqCwu9FPP3VUXzT4ltHe5i2z9dePwEHcDVOAfSnHsOlCXRA==} - es-module-lexer@1.7.0: - resolution: {integrity: sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==} + es-module-lexer@2.0.0: + resolution: {integrity: sha512-5POEcUuZybH7IdmGsD8wlf0AI55wMecM9rVBTI/qEAy2c1kTOm3DjFYjrBdI2K3BaJjJYfYFeRtM0t9ssnRuxw==} esast-util-from-estree@2.0.0: resolution: {integrity: sha512-4CyanoAudUSBAn5K13H4JhsMH6L9ZP7XbLVe/dKybkxMO7eDyLsT8UHl9TRNrU2Gr9nz+FovfSIjuXWJ81uVwQ==} @@ -2936,13 +3544,18 @@ packages: esast-util-from-js@2.0.1: resolution: {integrity: sha512-8Ja+rNJ0Lt56Pcf3TAmpBZjmx8ZcK5Ts4cAzIOjsjevg9oSXJnl6SUQ2EevU8tv3h6ZLWmoKL5H4fgWvdvfETw==} - esbuild@0.27.2: - resolution: {integrity: sha512-HyNQImnsOC7X9PMNaCIeAm4ISCQXs5a5YasTXVliKv4uuBo1dKrG0A+uQS8M5eXjVMnLg3WgXaKvprHlFJQffw==} + esbuild@0.27.3: + resolution: {integrity: sha512-8VwMnyGCONIs6cWue2IdpHxHnAjzxnw2Zr7MkVxB2vjmQ2ivqGFb4LEG3SMnv0Gb2F/G/2yA8zUaiL1gywDCCg==} engines: {node: '>=18'} hasBin: true - esbuild@0.27.3: - resolution: {integrity: sha512-8VwMnyGCONIs6cWue2IdpHxHnAjzxnw2Zr7MkVxB2vjmQ2ivqGFb4LEG3SMnv0Gb2F/G/2yA8zUaiL1gywDCCg==} + esbuild@0.27.7: + resolution: {integrity: sha512-IxpibTjyVnmrIQo5aqNpCgoACA/dTKLTlhMHihVHhdkxKyPO1uBBthumT0rdHmcsk9uMonIWS0m4FljWzILh3w==} + engines: {node: '>=18'} + hasBin: true + + esbuild@0.28.0: + resolution: {integrity: sha512-sNR9MHpXSUV/XB4zmsFKN+QgVG82Cc7+/aaxJ8Adi8hyOac+EXptIp45QBPaVyX3N70664wRbTcLTOemCAnyqw==} engines: {node: '>=18'} hasBin: true @@ -2987,6 +3600,9 @@ packages: resolution: {integrity: sha512-knvyeauYhqjOYvQ66MznSMs83wmHrCycNEN6Ao+2AeYEfxUIkuiVxdEa1qlGEPK+We3n0THiDciYSsCcgW/DoA==} engines: {node: '>=12.0.0'} + exsolve@1.0.8: + resolution: {integrity: sha512-LmDxfWXwcTArk8fUEnOfSZpHOJ6zOMUJKOtFLFqJLoKJetuQG874Uc7/Kki7zFLzYybmZhp1M7+98pfMqeX8yA==} + extend@3.0.2: resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==} @@ -3017,8 +3633,8 @@ packages: resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==} engines: {node: '>=8'} - framer-motion@12.35.2: - resolution: {integrity: sha512-dhfuEMaNo0hc+AEqyHiIfiJRNb9U9UQutE9FoKm5pjf7CMitp9xPEF1iWZihR1q86LBmo6EJ7S8cN8QXEy49AA==} + framer-motion@12.38.0: + resolution: {integrity: sha512-rFYkY/pigbcswl1XQSb7q424kSTQ8q6eAC+YUsSKooHQYuLdzdHjrt6uxUC+PRAO++q5IS7+TamgIw1AphxR+g==} peerDependencies: '@emotion/is-prop-valid': '*' react: ^18.0.0 || ^19.0.0 @@ -3044,8 +3660,8 @@ packages: engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} os: [darwin] - fumadocs-core@16.6.16: - resolution: {integrity: sha512-OC5VRAgXDZWpmuaix6TiUlqEyfhLjqnqkQuSqFnbf5Ge4w43I4qlxACxPS7Eq7aE+pPhpqTecQSQIH8KNouLXA==} + fumadocs-core@16.7.16: + resolution: {integrity: sha512-OXZMJPS/HVAfCw8/VEgsOEQNWUXq7+U2v1A/DbKmI0Vbb08uPCUpbIqVSj4kmGr46L+Pa/PZgG596Z7iPhlbCg==} peerDependencies: '@mdx-js/mdx': '*' '@mixedbread/sdk': ^0.46.0 @@ -3103,22 +3719,19 @@ packages: zod: optional: true - fumadocs-mdx@14.2.9: - resolution: {integrity: sha512-5QbFj3KyNgojjpUsD5Xw2W+ofN9l1WiIxzthwFzGoHOLIoJkdCN4AjHcINC+YSo89d/oZlradrrKRd3uHwVKBA==} + fumadocs-mdx@14.3.0: + resolution: {integrity: sha512-OsllpIpdk6Mu595MpX1hFFXrBq7cFpFBEkKNAFgO7aKZ/ux4e4pavTesDd5xKhuOfC0J9CZSUJ8RMlad9j5yTA==} hasBin: true peerDependencies: - '@fumadocs/mdx-remote': ^1.4.0 '@types/mdast': '*' '@types/mdx': '*' '@types/react': '*' fumadocs-core: ^15.0.0 || ^16.0.0 mdast-util-directive: '*' next: ^15.3.0 || ^16.0.0 - react: '*' - vite: 6.x.x || 7.x.x + react: ^19.2.0 + vite: 6.x.x || 7.x.x || 8.x.x peerDependenciesMeta: - '@fumadocs/mdx-remote': - optional: true '@types/mdast': optional: true '@types/mdx': @@ -3134,17 +3747,17 @@ packages: vite: optional: true - fumadocs-typescript@5.1.5: - resolution: {integrity: sha512-uKXfsN2uEJKNX6A0jJbjj2Hg9uUnN9REvknwXgBdBjwK5Ap8cVQnWoKLQQqsD0bp8ypPS7pqmnXXU/6dfAfy0w==} + fumadocs-typescript@5.2.6: + resolution: {integrity: sha512-kmidpjbjrzlSbppLTW1m4SF87R3CMu3WhvD1VW8/w5A71uC2nARvfMh2o7bNJRLzjJyq/RO9v8NHYHU/cw+QUQ==} peerDependencies: '@types/estree': '*' '@types/hast': '*' '@types/mdast': '*' '@types/react': '*' - fumadocs-core: ^16.5.0 - fumadocs-ui: ^16.5.0 - react: '*' - typescript: '*' + fumadocs-core: ^16.7.0 + fumadocs-ui: ^16.7.0 + react: ^19.2.0 + react-dom: ^19.2.0 peerDependenciesMeta: '@types/estree': optional: true @@ -3157,13 +3770,13 @@ packages: fumadocs-ui: optional: true - fumadocs-ui@16.6.16: - resolution: {integrity: sha512-MEpggI+rKvXEPqPmPVb8sIfUuo8ev7X3I6qVwPkHte9kIkiODZH9DmKFEnyuGnTjVXct8Z1wf18kY2xcoJI6eg==} + fumadocs-ui@16.7.16: + resolution: {integrity: sha512-NFWH8GuVV0O6OQnGb0TCS6jsdgyB7/5phQm8YjtIkyjkxAkERwA76N5RYCpS27p41NdtWdQw4eFIEve1Aq9Siw==} peerDependencies: '@takumi-rs/image-response': '*' '@types/mdx': '*' '@types/react': '*' - fumadocs-core: 16.6.16 + fumadocs-core: 16.7.16 next: 16.x.x react: ^19.2.0 react-dom: ^19.2.0 @@ -3188,8 +3801,8 @@ packages: resolution: {integrity: sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q==} engines: {node: '>=6'} - get-tsconfig@4.13.6: - resolution: {integrity: sha512-shZT/QMiSHc/YBLxxOkMtgSid5HFoauqCE3/exfsEcwg1WkeqjG+V40yBbBrsD+jW2HDXcs28xOfcbm2jI8Ddw==} + get-tsconfig@4.14.0: + resolution: {integrity: sha512-yTb+8DXzDREzgvYmh6s9vHsSVCHeC0G3PI5bEXNBHtmshPnO+S5O7qgLEOn0I5QvMy6kpZN8K1NKGyilLb93wA==} github-slugger@2.0.0: resolution: {integrity: sha512-IaOQ9puYtjrkq7Y0Ygl9KDZnrf/aiUJYUpVf89y8kyaxbRG7Y1SrX/jaumrv81vc61+kiMempujsM3Yw7w5qcw==} @@ -3206,12 +3819,24 @@ packages: resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} engines: {node: '>=10'} - globrex@0.1.2: - resolution: {integrity: sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg==} + goober@2.1.18: + resolution: {integrity: sha512-2vFqsaDVIT9Gz7N6kAL++pLpp41l3PfDuusHcjnGLfR6+huZkl6ziX+zgVC3ZxpqWhzH6pyDdGrCeDhMIvwaxw==} + peerDependencies: + csstype: ^3.0.10 graceful-fs@4.2.11: resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} + h3@2.0.1-rc.20: + resolution: {integrity: sha512-28ljodXuUp0fZovdiSRq4G9OgrxCztrJe5VdYzXAB7ueRvI7pIUqLU14Xi3XqdYJ/khXjfpUOOD2EQa6CmBgsg==} + engines: {node: '>=20.11.1'} + hasBin: true + peerDependencies: + crossws: ^0.4.1 + peerDependenciesMeta: + crossws: + optional: true + hachure-fill@0.5.2: resolution: {integrity: sha512-3GKBOn+m2LX9iq+JC1064cSFprJY4jL1jCXTcpnfER5HYE2l/4EfWSGzkPa/ZDBmYI0ZOEj5VHV/eKnPGkHuOg==} @@ -3244,21 +3869,14 @@ packages: hast-util-to-parse5@8.0.1: resolution: {integrity: sha512-MlWT6Pjt4CG9lFCjiz4BH7l9wmrMkfkJYCxFwKQic8+RTZgWPuWxwAfjJElsXkex7DJjfSJsQIt931ilUgmwdA==} - hast-util-to-string@3.0.1: - resolution: {integrity: sha512-XelQVTDWvqcl3axRfI0xSeoVKzyIFPwsAGSLIsKdJKQMXDYJS4WYrBNF/8J7RdhIcFI2BOHgAifggsvsxp/3+A==} - hast-util-whitespace@3.0.0: resolution: {integrity: sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==} hastscript@9.0.1: resolution: {integrity: sha512-g7df9rMFX/SPi34tyGCyUBREQoKkapwdY/T04Qn9TDWfHhAYt4/I0gMVirzK5wEzeUqIjEB+LXC/ypb7Aqno5w==} - hono@4.11.3: - resolution: {integrity: sha512-PmQi306+M/ct/m5s66Hrg+adPnkD5jiO6IjA7WhWw0gSBSo1EcRegwuI1deZ+wd5pzCGynCcn2DprnE4/yEV4w==} - engines: {node: '>=16.9.0'} - - hookable@6.0.1: - resolution: {integrity: sha512-uKGyY8BuzN/a5gvzvA+3FVWo0+wUjgtfSdnmjtrOVwQCZPHpHDH2WRO3VZSOeluYrHoDCiXFffZXs8Dj1ULWtw==} + hookable@6.1.1: + resolution: {integrity: sha512-U9LYDy1CwhMCnprUfeAZWZGByVbhd54hwepegYTK7Pi5NvqEj63ifz5z+xukznehT7i6NIZRu89Ay1AZmRsLEQ==} html-escaper@2.0.2: resolution: {integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==} @@ -3266,6 +3884,9 @@ packages: html-void-elements@3.0.0: resolution: {integrity: sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg==} + htmlparser2@10.1.0: + resolution: {integrity: sha512-VTZkM9GWRAtEpveh7MSF6SjjrpNVNNVJfFup7xTY3UpFtm67foy9HDVXneLtFVt4pMz5kZtgNcvCniNFb1hlEQ==} + human-id@4.1.3: resolution: {integrity: sha512-tsYlhAYpjCKa//8rXZ9DqKEawhPoSytweBC2eNvcaDK+57RZLHGqNs3PZTQO6yekLFSuvA6AlnAfrw1uBvtb+Q==} hasBin: true @@ -3285,15 +3906,10 @@ packages: ignore@5.3.2: resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} - engines: {node: '>= 4'} - - image-size@2.0.2: - resolution: {integrity: sha512-IRqXKlaXwgSMAMtpNzZa1ZAe8m+Sa1770Dhk8VkSsP9LS+iHD62Zd8FQKs8fbPiagBE7BzoFX23cxFnwshpV6w==} - engines: {node: '>=16.x'} - hasBin: true + engines: {node: '>= 4'} - import-without-cache@0.2.5: - resolution: {integrity: sha512-B6Lc2s6yApwnD2/pMzFh/d5AVjdsDXjgkeJ766FmFuJELIGHNycKRj+l3A39yZPM4CchqNCB4RITEAYB1KUM6A==} + import-without-cache@0.3.3: + resolution: {integrity: sha512-bDxwDdF04gm550DfZHgffvlX+9kUlcz32UD0AeBTmVPFiWkrexF2XVmiuFFbDhiFuP8fQkrkvI2KdSNPYWAXkQ==} engines: {node: '>=20.19.0'} ini@4.1.3: @@ -3316,6 +3932,10 @@ packages: is-alphanumerical@2.0.1: resolution: {integrity: sha512-hmbYhX/9MUMF5uh7tOXyK/n0ZvWpad5caBA17GsC6vyuCqaWliRG5K1qS9inmUhEMaOBIW7/whAnSwveW/LtZw==} + is-binary-path@2.1.0: + resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} + engines: {node: '>=8'} + is-core-module@2.16.1: resolution: {integrity: sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==} engines: {node: '>= 0.4'} @@ -3350,16 +3970,16 @@ packages: resolution: {integrity: sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==} engines: {node: '>=0.10.0'} - isbot@5.1.36: - resolution: {integrity: sha512-C/ZtXyJqDPZ7G7JPr06ApWyYoHjYexQbS6hPYD4WYCzpv2Qes6Z+CCEfTX4Owzf+1EJ933PoI2p+B9v7wpGZBQ==} + isbot@5.1.38: + resolution: {integrity: sha512-Cus2702JamTNMEY4zTP+TShgq/3qzjvGcBC4XMOV45BLaxD4iUFENkqu7ZhFeSzwNsCSZLjnGlihDQznnpnEEA==} engines: {node: '>=18'} isexe@2.0.0: resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} - isexe@3.1.1: - resolution: {integrity: sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ==} - engines: {node: '>=16'} + isexe@3.1.5: + resolution: {integrity: sha512-6B3tLtFqtQS4ekarvLVMZ+X+VlvQekbe4taUkf/rhVO3d/h0M2rfARm/pXLcPEsjjMsFgrFgSrhQIxcSVrBz8w==} + engines: {node: '>=18'} istanbul-lib-coverage@3.2.2: resolution: {integrity: sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==} @@ -3380,12 +4000,12 @@ packages: js-sha256@0.11.1: resolution: {integrity: sha512-o6WSo/LUvY2uC4j7mO50a2ms7E/EAdbP0swigLV+nzHKTTaYnaLIWJ02VdXrsJX0vGedDESQnLsOekr94ryfjg==} + js-tokens@10.0.0: + resolution: {integrity: sha512-lM/UBzQmfJRo9ABXbPWemivdCW8V2G8FHaHdypQaIy523snUjog0W71ayWXTjiR+ixeMyVHN2XcpnTd/liPg/Q==} + js-tokens@4.0.0: resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} - js-tokens@9.0.1: - resolution: {integrity: sha512-mxa9E9ITFOt0ban3j6L5MpjwegGz6lBQmM1IJkWeBZGcMxto50+eWdjC/52xDbS2vy0k7vIMK0Fe2wfL9OQSpQ==} - js-yaml@3.14.2: resolution: {integrity: sha512-PMSmkqxr106Xa156c2M265Z+FTrPl+oxd/rgOQy2tijQeK5TxQ43psO1ZCwhVOSdnn+RzkzlRz/eY4BgJBYVpg==} hasBin: true @@ -3407,8 +4027,8 @@ packages: jsonfile@4.0.0: resolution: {integrity: sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==} - katex@0.16.38: - resolution: {integrity: sha512-cjHooZUmIAUmDsHBN+1n8LaZdpmbj03LtYeYPyuYB7OuloiaeaV6N4LcfjcnHVzGWjVQmKrxxTrpDcmSzEZQwQ==} + katex@0.16.44: + resolution: {integrity: sha512-EkxoDTk8ufHqHlf9QxGwcxeLkWRR3iOuYfRpfORgYfqc8s13bgb+YtRY59NK5ZpRaCwq1kqA6a5lpX8C/eLphQ==} hasBin: true khroma@2.1.0: @@ -3432,78 +4052,78 @@ packages: layout-base@2.0.1: resolution: {integrity: sha512-dp3s92+uNI1hWIpPGH3jK2kxE2lMjdXdr+DH8ynZHpd6PUlH6x6cbuXnoMmiNumznqaNO31xu9e79F0uuZ0JFg==} - lightningcss-android-arm64@1.31.1: - resolution: {integrity: sha512-HXJF3x8w9nQ4jbXRiNppBCqeZPIAfUo8zE/kOEGbW5NZvGc/K7nMxbhIr+YlFlHW5mpbg/YFPdbnCh1wAXCKFg==} + lightningcss-android-arm64@1.32.0: + resolution: {integrity: sha512-YK7/ClTt4kAK0vo6w3X+Pnm0D2cf2vPHbhOXdoNti1Ga0al1P4TBZhwjATvjNwLEBCnKvjJc2jQgHXH0NEwlAg==} engines: {node: '>= 12.0.0'} cpu: [arm64] os: [android] - lightningcss-darwin-arm64@1.31.1: - resolution: {integrity: sha512-02uTEqf3vIfNMq3h/z2cJfcOXnQ0GRwQrkmPafhueLb2h7mqEidiCzkE4gBMEH65abHRiQvhdcQ+aP0D0g67sg==} + lightningcss-darwin-arm64@1.32.0: + resolution: {integrity: sha512-RzeG9Ju5bag2Bv1/lwlVJvBE3q6TtXskdZLLCyfg5pt+HLz9BqlICO7LZM7VHNTTn/5PRhHFBSjk5lc4cmscPQ==} engines: {node: '>= 12.0.0'} cpu: [arm64] os: [darwin] - lightningcss-darwin-x64@1.31.1: - resolution: {integrity: sha512-1ObhyoCY+tGxtsz1lSx5NXCj3nirk0Y0kB/g8B8DT+sSx4G9djitg9ejFnjb3gJNWo7qXH4DIy2SUHvpoFwfTA==} + lightningcss-darwin-x64@1.32.0: + resolution: {integrity: sha512-U+QsBp2m/s2wqpUYT/6wnlagdZbtZdndSmut/NJqlCcMLTWp5muCrID+K5UJ6jqD2BFshejCYXniPDbNh73V8w==} engines: {node: '>= 12.0.0'} cpu: [x64] os: [darwin] - lightningcss-freebsd-x64@1.31.1: - resolution: {integrity: sha512-1RINmQKAItO6ISxYgPwszQE1BrsVU5aB45ho6O42mu96UiZBxEXsuQ7cJW4zs4CEodPUioj/QrXW1r9pLUM74A==} + lightningcss-freebsd-x64@1.32.0: + resolution: {integrity: sha512-JCTigedEksZk3tHTTthnMdVfGf61Fky8Ji2E4YjUTEQX14xiy/lTzXnu1vwiZe3bYe0q+SpsSH/CTeDXK6WHig==} engines: {node: '>= 12.0.0'} cpu: [x64] os: [freebsd] - lightningcss-linux-arm-gnueabihf@1.31.1: - resolution: {integrity: sha512-OOCm2//MZJ87CdDK62rZIu+aw9gBv4azMJuA8/KB74wmfS3lnC4yoPHm0uXZ/dvNNHmnZnB8XLAZzObeG0nS1g==} + lightningcss-linux-arm-gnueabihf@1.32.0: + resolution: {integrity: sha512-x6rnnpRa2GL0zQOkt6rts3YDPzduLpWvwAF6EMhXFVZXD4tPrBkEFqzGowzCsIWsPjqSK+tyNEODUBXeeVHSkw==} engines: {node: '>= 12.0.0'} cpu: [arm] os: [linux] - lightningcss-linux-arm64-gnu@1.31.1: - resolution: {integrity: sha512-WKyLWztD71rTnou4xAD5kQT+982wvca7E6QoLpoawZ1gP9JM0GJj4Tp5jMUh9B3AitHbRZ2/H3W5xQmdEOUlLg==} + lightningcss-linux-arm64-gnu@1.32.0: + resolution: {integrity: sha512-0nnMyoyOLRJXfbMOilaSRcLH3Jw5z9HDNGfT/gwCPgaDjnx0i8w7vBzFLFR1f6CMLKF8gVbebmkUN3fa/kQJpQ==} engines: {node: '>= 12.0.0'} cpu: [arm64] os: [linux] libc: [glibc] - lightningcss-linux-arm64-musl@1.31.1: - resolution: {integrity: sha512-mVZ7Pg2zIbe3XlNbZJdjs86YViQFoJSpc41CbVmKBPiGmC4YrfeOyz65ms2qpAobVd7WQsbW4PdsSJEMymyIMg==} + lightningcss-linux-arm64-musl@1.32.0: + resolution: {integrity: sha512-UpQkoenr4UJEzgVIYpI80lDFvRmPVg6oqboNHfoH4CQIfNA+HOrZ7Mo7KZP02dC6LjghPQJeBsvXhJod/wnIBg==} engines: {node: '>= 12.0.0'} cpu: [arm64] os: [linux] libc: [musl] - lightningcss-linux-x64-gnu@1.31.1: - resolution: {integrity: sha512-xGlFWRMl+0KvUhgySdIaReQdB4FNudfUTARn7q0hh/V67PVGCs3ADFjw+6++kG1RNd0zdGRlEKa+T13/tQjPMA==} + lightningcss-linux-x64-gnu@1.32.0: + resolution: {integrity: sha512-V7Qr52IhZmdKPVr+Vtw8o+WLsQJYCTd8loIfpDaMRWGUZfBOYEJeyJIkqGIDMZPwPx24pUMfwSxxI8phr/MbOA==} engines: {node: '>= 12.0.0'} cpu: [x64] os: [linux] libc: [glibc] - lightningcss-linux-x64-musl@1.31.1: - resolution: {integrity: sha512-eowF8PrKHw9LpoZii5tdZwnBcYDxRw2rRCyvAXLi34iyeYfqCQNA9rmUM0ce62NlPhCvof1+9ivRaTY6pSKDaA==} + lightningcss-linux-x64-musl@1.32.0: + resolution: {integrity: sha512-bYcLp+Vb0awsiXg/80uCRezCYHNg1/l3mt0gzHnWV9XP1W5sKa5/TCdGWaR/zBM2PeF/HbsQv/j2URNOiVuxWg==} engines: {node: '>= 12.0.0'} cpu: [x64] os: [linux] libc: [musl] - lightningcss-win32-arm64-msvc@1.31.1: - resolution: {integrity: sha512-aJReEbSEQzx1uBlQizAOBSjcmr9dCdL3XuC/6HLXAxmtErsj2ICo5yYggg1qOODQMtnjNQv2UHb9NpOuFtYe4w==} + lightningcss-win32-arm64-msvc@1.32.0: + resolution: {integrity: sha512-8SbC8BR40pS6baCM8sbtYDSwEVQd4JlFTOlaD3gWGHfThTcABnNDBda6eTZeqbofalIJhFx0qKzgHJmcPTnGdw==} engines: {node: '>= 12.0.0'} cpu: [arm64] os: [win32] - lightningcss-win32-x64-msvc@1.31.1: - resolution: {integrity: sha512-I9aiFrbd7oYHwlnQDqr1Roz+fTz61oDDJX7n9tYF9FJymH1cIN1DtKw3iYt6b8WZgEjoNwVSncwF4wx/ZedMhw==} + lightningcss-win32-x64-msvc@1.32.0: + resolution: {integrity: sha512-Amq9B/SoZYdDi1kFrojnoqPLxYhQ4Wo5XiL8EVJrVsB8ARoC1PWW6VGtT0WKCemjy8aC+louJnjS7U18x3b06Q==} engines: {node: '>= 12.0.0'} cpu: [x64] os: [win32] - lightningcss@1.31.1: - resolution: {integrity: sha512-l51N2r93WmGUye3WuFoN5k10zyvrVs0qfKBhyC5ogUQ6Ew6JUSswh78mbSO+IU3nTWsyOArqPCcShdQSadghBQ==} + lightningcss@1.32.0: + resolution: {integrity: sha512-NXYBzinNrblfraPGyrbPoD19C1h9lfI/1mzgWYvXUTe414Gz/X1FD2XBZSZM7rRTrMA8JL3OtAaGifrIKhQ5yQ==} engines: {node: '>= 12.0.0'} locate-path@5.0.0: @@ -3513,6 +4133,9 @@ packages: lodash-es@4.17.23: resolution: {integrity: sha512-kVI48u3PZr38HdYz98UmfPnXl2DXrpdctLrFLCd3kOx1xUkOmpFPx7gCWWM5MPkL/fD8zb+Ph0QzjGFs4+hHWg==} + lodash-es@4.18.1: + resolution: {integrity: sha512-J8xewKD/Gk22OZbhpOVSwcs60zhd95ESDwezOFuA3/099925PdHJ7OFHNTGtajL3AlZkykD32HykiMo+BIBI8A==} + lodash.startcase@4.4.0: resolution: {integrity: sha512-+WKqsK294HMSc2jEbNgpHpd0JfIBhp7rEV4aqXWqFr6AlXov+SlcgB1Fv01y2kGe3Gc8nMW7VA0SrGuSkRfIEg==} @@ -3522,16 +4145,16 @@ packages: lru-cache@5.1.1: resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} - lucide-react@0.577.0: - resolution: {integrity: sha512-4LjoFv2eEPwYDPg/CUdBJQSDfPyzXCRrVW1X7jrx/trgxnxkHFjnVZINbzvzxjN70dxychOfg+FTYwBiS3pQ5A==} + lucide-react@1.8.0: + resolution: {integrity: sha512-WuvlsjngSk7TnTBJ1hsCy3ql9V9VOdcPkd3PKcSmM34vJD8KG6molxz7m7zbYFgICwsanQWmJ13JlYs4Zp7Arw==} peerDependencies: react: ^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0 magic-string@0.30.21: resolution: {integrity: sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==} - magicast@0.5.1: - resolution: {integrity: sha512-xrHS24IxaLrvuo613F719wvOIv9xPHFWQHuvGUBmPnCA/3MQxKI3b+r7n1jAoDHmsbC5bRhTZYR77invLAxVnw==} + magicast@0.5.2: + resolution: {integrity: sha512-E3ZJh4J3S9KfwdjZhe2afj6R9lGIN5Pher1pF39UGrXRqq/VDaGVIGN13BjHd2u8B61hArAGOnso7nBOouW3TQ==} make-dir@4.0.0: resolution: {integrity: sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==} @@ -3601,8 +4224,8 @@ packages: resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} engines: {node: '>= 8'} - mermaid@11.13.0: - resolution: {integrity: sha512-fEnci+Immw6lKMFI8sqzjlATTyjLkRa6axrEgLV2yHTfv8r+h1wjFbV6xeRtd4rUV1cS4EpR9rwp3Rci7TRWDw==} + mermaid@11.14.0: + resolution: {integrity: sha512-GSGloRsBs+JINmmhl0JDwjpuezCsHB4WGI4NASHxL3fHo3o/BRXTxhDLKnln8/Q0lRFRyDdEjmk1/d5Sn1Xz8g==} messageformat@4.0.0: resolution: {integrity: sha512-XKmJ/ffTWToWOlHJzt85ZChQgVGC0LHzNWuNK8zuYpNySsB0nIEmytOdSAOW9ETKtkajAUJf520m5gFHHnrTYg==} @@ -3717,36 +4340,32 @@ packages: resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} engines: {node: '>=8.6'} - miniflare@4.20260210.0: - resolution: {integrity: sha512-HXR6m53IOqEzq52DuGF1x7I1K6lSIqzhbCbQXv/cTmPnPJmNkr7EBtLDm4nfSkOvlDtnwDCLUjWII5fyGJI5Tw==} + miniflare@4.20260415.0: + resolution: {integrity: sha512-JoExRWN4YBI2luA5BoSMFEgi8rQWXUGzo3mtE+58VXCLV3jj/Xnk5Yeqs/IXWz8Es5GJIaq6BtsixDvAxXSIng==} engines: {node: '>=18.0.0'} hasBin: true - minimatch@10.2.4: - resolution: {integrity: sha512-oRjTw/97aTBN0RHbYCdtF1MQfvusSIBQM0IZEgzl6426+8jSC0nF1a/GmnVLpfB9yyr6g6FTqWqiZVbxrtaCIg==} + minimatch@10.2.5: + resolution: {integrity: sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg==} engines: {node: 18 || 20 || >=22} - minimatch@9.0.5: - resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==} - engines: {node: '>=16 || 14 >=14.17'} - minimist@1.2.8: resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} - mlly@1.8.1: - resolution: {integrity: sha512-SnL6sNutTwRWWR/vcmCYHSADjiEesp5TGQQ0pXyLhW5IoeibRlF/CbSLailbB3CNqJUk9cVJ9dUDnbD7GrcHBQ==} + mlly@1.8.2: + resolution: {integrity: sha512-d+ObxMQFmbt10sretNDytwt85VrbkhhUA/JBGm1MPaWJ65Cl4wOgLaB1NYvJSZ0Ef03MMEU/0xpPMXUIQ29UfA==} - moo@0.5.2: - resolution: {integrity: sha512-iSAJLHYKnX41mKcJKjqvnAN9sf0LMDTXDEvFv+ffuRR9a1MIuXLjMNL6EsnDHSkKLTWNqQQ5uo61P4EbU4NU+Q==} + moo@0.5.3: + resolution: {integrity: sha512-m2fmM2dDm7GZQsY7KK2cme8agi+AAljILjQnof7p1ZMDe6dQ4bdnSMx0cPppudoeNv5hEFQirN6u+O4fDE0IWA==} - motion-dom@12.35.2: - resolution: {integrity: sha512-pWXFMTwvGDbx1Fe9YL5HZebv2NhvGBzRtiNUv58aoK7+XrsuaydQ0JGRKK2r+bTKlwgSWwWxHbP5249Qr/BNpg==} + motion-dom@12.38.0: + resolution: {integrity: sha512-pdkHLD8QYRp8VfiNLb8xIBJis1byQ9gPT3Jnh2jqfFtAsWUA3dEepDlsWe/xMpO8McV+VdpKVcp+E+TGJEtOoA==} - motion-utils@12.29.2: - resolution: {integrity: sha512-G3kc34H2cX2gI63RqU+cZq+zWRRPSsNIOjpdl9TN4AQwC4sgwYPl/Q/Obf/d53nOm569T0fYK+tcoSV50BWx8A==} + motion-utils@12.36.0: + resolution: {integrity: sha512-eHWisygbiwVvf6PZ1vhaHCLamvkSbPIeAYxWUuL3a2PD/TROgE7FvfHWTIH4vMl798QLfMw15nRqIaRDXTlYRg==} - motion@12.35.2: - resolution: {integrity: sha512-8zCi1DkNyU6a/tgEHn/GnnXZDcaMpDHbDOGORY1Rg/6lcNMSOuvwDB3i4hMSOvxqMWArc/vrGaw/Xek1OP69/A==} + motion@12.38.0: + resolution: {integrity: sha512-uYfXzeHlgThchzwz5Te47dlv5JOUC7OB4rjJ/7XTUgtBZD8CchMN8qEJ4ZVsUmTyYA44zjV0fBwsiktRuFnn+w==} peerDependencies: '@emotion/is-prop-valid': '*' react: ^18.0.0 || ^19.0.0 @@ -3771,18 +4390,14 @@ packages: engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} hasBin: true - negotiator@1.0.0: - resolution: {integrity: sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg==} - engines: {node: '>= 0.6'} - next-themes@0.4.6: resolution: {integrity: sha512-pZvgD5L0IEvX5/9GWyHMf3m8BKiVQwsCMHfoFosXtXBMnaS0ZnIJ9ST4b4NqLVKDEm8QBxoNNGNaBv2JNF6XNA==} peerDependencies: react: ^16.8 || ^17 || ^18 || ^19 || ^19.0.0-rc react-dom: ^16.8 || ^17 || ^18 || ^19 || ^19.0.0-rc - next@16.1.6: - resolution: {integrity: sha512-hkyRkcu5x/41KoqnROkfTm2pZVbKxvbZRuNvKXLRXxs3VfyO0WhY50TQS40EuKO9SW3rBj/sF3WbVwDACeMZyw==} + next@16.2.4: + resolution: {integrity: sha512-kPvz56wF5frc+FxlHI5qnklCzbq53HTwORaWBGdT0vNoKh1Aya9XC8aPauH4NJxqtzbWsS5mAbctm4cr+EkQ2Q==} engines: {node: '>=20.9.0'} hasBin: true peerDependencies: @@ -3802,12 +4417,15 @@ packages: sass: optional: true - node-releases@2.0.27: - resolution: {integrity: sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA==} + node-releases@2.0.37: + resolution: {integrity: sha512-1h5gKZCF+pO/o3Iqt5Jp7wc9rH3eJJ0+nh/CIoiRwjRxde/hAHyLPXYN4V3CqKAbiZPSeJFSWHmJsbkicta0Eg==} + + normalize-path@3.0.0: + resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} + engines: {node: '>=0.10.0'} - npm-to-yarn@3.0.1: - resolution: {integrity: sha512-tt6PvKu4WyzPwWUzy/hvPFqn+uwXO0K1ZHka8az3NnrhWJDmSqI8ncWq0fkL0k/lmmi5tAC11FXwXuh0rFbt1A==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + nth-check@2.1.1: + resolution: {integrity: sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==} obug@2.1.1: resolution: {integrity: sha512-uTqF9MuPraAQ+IsnPf366RG4cP9RtUi7MLO1N3KEc+wb0a6yKpeL0lmk2IB1jY5KHPAlTc6T/JRdC/YqxHNwkQ==} @@ -3815,23 +4433,23 @@ packages: oniguruma-parser@0.12.1: resolution: {integrity: sha512-8Unqkvk1RYc6yq2WBYRj4hdnsAxVze8i7iPfQr8e4uSP3tRv0rpZcbGUDvxfQQcdwHt/e9PrMvGCsa8OqG9X3w==} - oniguruma-to-es@4.3.4: - resolution: {integrity: sha512-3VhUGN3w2eYxnTzHn+ikMI+fp/96KoRSVK9/kMTcFqj1NRDh2IhQCKvYxDnWePKRXY/AqH+Fuiyb7VHSzBjHfA==} + oniguruma-to-es@4.3.5: + resolution: {integrity: sha512-Zjygswjpsewa0NLTsiizVuMQZbp0MDyM6lIt66OxsF21npUDlzpHi1Mgb/qhQdkb+dWFTzJmFbEWdvZgRho8eQ==} outdent@0.5.0: resolution: {integrity: sha512-/jHxFIzoMXdqPzTaCpFzAAWhpkSjZPF4Vsn6jAfNpmbH/ymsmd7Qc6VE9BGn0L6YMj6uwpQLxCECpus4ukKS9Q==} - oxfmt@0.36.0: - resolution: {integrity: sha512-/ejJ+KoSW6J9bcNT9a9UtJSJNWhJ3yOLSBLbkoFHJs/8CZjmaZVZAJe4YgO1KMJlKpNQasrn/G9JQUEZI3p0EQ==} + oxfmt@0.45.0: + resolution: {integrity: sha512-0o/COoN9fY50bjVeM7PQsNgbhndKurBIeTIcspW033OumksjJJmIVDKjAk5HMwU/GHTxSOdGDdhJ6BRzGPmsHg==} engines: {node: ^20.19.0 || >=22.12.0} hasBin: true - oxlint@1.51.0: - resolution: {integrity: sha512-g6DNPaV9/WI9MoX2XllafxQuxwY1TV++j7hP8fTJByVBuCoVtm3dy9f/2vtH/HU40JztcgWF4G7ua+gkainklQ==} + oxlint@1.60.0: + resolution: {integrity: sha512-tnRzTWiWJ9pg3ftRWnD0+Oqh78L6ZSwcEudvCZaER0PIqiAnNyXj5N1dPwjmNpDalkKS9m/WMLN1CTPUBPmsgw==} engines: {node: ^20.19.0 || >=22.12.0} hasBin: true peerDependencies: - oxlint-tsgolint: '>=0.15.0' + oxlint-tsgolint: '>=0.18.0' peerDependenciesMeta: oxlint-tsgolint: optional: true @@ -3865,6 +4483,12 @@ packages: parse-entities@4.0.2: resolution: {integrity: sha512-GG2AQYWoLgL877gQIKeRPGO1xF9+eG1ujIb5soS5gPvLQ1y2o8FL90w2QWNdf9I361Mpp7726c+lj3U0qK1uGw==} + parse5-htmlparser2-tree-adapter@7.1.0: + resolution: {integrity: sha512-ruw5xyKs6lrpo9x9rCZqZZnIUntICjQAd0Wsmp396Ul9lN/h+ifgVV1x1gZHi8euej6wTfpqX8j+BFQxF0NS/g==} + + parse5-parser-stream@7.1.2: + resolution: {integrity: sha512-JyeQc9iwFLn5TbvvqACIF/VXG6abODeB3Fwmv/TGdLk2LfbWkaySGY72at4+Ty7EkPZj854u4CrICqNk2qIbow==} + parse5@7.3.0: resolution: {integrity: sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw==} @@ -3888,9 +4512,6 @@ packages: path-to-regexp@6.3.0: resolution: {integrity: sha512-Yhpw4T9C6hPpgPeA28us07OJeqZ5EzQTkbfwuhsUg0c237RomFoETJgmp2sa3F/41gfLE6G5cqcYwznmeEeOlQ==} - path-to-regexp@8.3.0: - resolution: {integrity: sha512-7jdwVIRtsP8MYpdXSwOS0YdD0Du+qOoF/AEPIt88PcCFrZCzx41oxku1jD88hZBwbNUIEfpqvuhjFaMAqMTWnA==} - path-type@4.0.0: resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} engines: {node: '>=8'} @@ -3901,12 +4522,12 @@ packages: picocolors@1.1.1: resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} - picomatch@2.3.1: - resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} + picomatch@2.3.2: + resolution: {integrity: sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==} engines: {node: '>=8.6'} - picomatch@4.0.3: - resolution: {integrity: sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==} + picomatch@4.0.4: + resolution: {integrity: sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==} engines: {node: '>=12'} pify@4.0.1: @@ -3925,16 +4546,12 @@ packages: points-on-path@0.2.1: resolution: {integrity: sha512-25ClnWWuw7JbWZcgqY/gJ4FQWadKxGWk+3kR/7kD0tCaDtPPMj7oHu2ToLaVhfpnHrZzYby2w6tUA0eOIuUg8g==} - postcss-selector-parser@7.1.1: - resolution: {integrity: sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg==} - engines: {node: '>=4'} - postcss@8.4.31: resolution: {integrity: sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==} engines: {node: ^10 || ^12 || >=14} - postcss@8.5.8: - resolution: {integrity: sha512-OW/rX8O/jXnm82Ey1k44pObPtdblfiuWnrd8X7GJ7emImCOstunGbXUpp7HdBrFQX6rJzn3sPT397Wp5aCwCHg==} + postcss@8.5.10: + resolution: {integrity: sha512-pMMHxBOZKFU6HgAZ4eyGnwXF/EvPGGqUr0MnZ5+99485wwW41kW91A4LOGxSHhgugZmSChL5AlElNdwlNgcnLQ==} engines: {node: ^10 || ^12 || >=14} prettier@2.8.8: @@ -3942,6 +4559,11 @@ packages: engines: {node: '>=10.13.0'} hasBin: true + prettier@3.8.3: + resolution: {integrity: sha512-7igPTM53cGHMW8xWuVTydi2KO233VFiTNyF5hLJqpilHfmn8C8gPf+PS7dUT64YcXFbiMGZxS9pCSxL/Dxm/Jw==} + engines: {node: '>=14'} + hasBin: true + prism-media@1.3.5: resolution: {integrity: sha512-IQdl0Q01m4LrkN1EGIE9lphov5Hy7WWlH6ulf5QdGePLlPas9p2mhgddTEHrlaXYjjFToM1/rWuwF37VF4taaA==} peerDependencies: @@ -3971,16 +4593,10 @@ packages: queue-microtask@1.2.3: resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} - react-dom@19.2.4: - resolution: {integrity: sha512-AXJdLo8kgMbimY95O2aKQqsz2iWi9jMgKJhRBAxECE4IFxfcazB2LmzloIoibJI3C12IlY20+KFaLv+71bUJeQ==} + react-dom@19.2.5: + resolution: {integrity: sha512-J5bAZz+DXMMwW/wV3xzKke59Af6CHY7G4uYLN1OvBcKEsWOs4pQExj86BBKamxl/Ik5bx9whOrvBlSDfWzgSag==} peerDependencies: - react: ^19.2.4 - - react-medium-image-zoom@5.4.1: - resolution: {integrity: sha512-DD2iZYaCfAwiQGR8AN62r/cDJYoXhezlYJc5HY4TzBUGuGge43CptG0f7m0PEIM72aN6GfpjohvY1yYdtCJB7g==} - peerDependencies: - react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 - react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + react: ^19.2.5 react-remove-scroll-bar@2.3.8: resolution: {integrity: sha512-9r+yi9+mgU33AKcj6IbT9oRCO78WriSj6t/cF8DWBZJ9aOGPOTEDvdUDz1FwKim7QXWwmHqtdHnRJfhAxEG46Q==} @@ -4012,14 +4628,18 @@ packages: '@types/react': optional: true - react@19.2.4: - resolution: {integrity: sha512-9nfp2hYpCwOjAN+8TZFGhtWEwgvWHXqESH8qT89AT/lWklpLON22Lc8pEtnpsZz7VmawabSU0gCjnj8aC0euHQ==} + react@19.2.5: + resolution: {integrity: sha512-llUJLzz1zTUBrskt2pwZgLq59AemifIftw4aB7JxOqf1HY2FDaGDxgwpAPVzHU1kdWabH7FauP4i1oEeer2WCA==} engines: {node: '>=0.10.0'} read-yaml-file@1.1.0: resolution: {integrity: sha512-VIMnQi/Z4HT2Fxuwg5KrY174U1VdUIASQVWXXyqtNRtxSr9IYkn1rsI6Tb6HsrHCmB7gVpNwX6JxPTHcH6IoTA==} engines: {node: '>=6'} + readdirp@3.6.0: + resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} + engines: {node: '>=8.10.0'} + readdirp@5.0.0: resolution: {integrity: sha512-9u/XQ1pvrQtYyMpZe7DXKv2p5CNvyVwzUB6uhLAnQwHMSgKMBR62lc7AHljaeteeHXn11XTAaLLUVZYVZyuRBQ==} engines: {node: '>= 20.19.0'} @@ -4087,17 +4707,17 @@ packages: resolution: {integrity: sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==} engines: {iojs: '>=1.0.0', node: '>=0.10.0'} - robust-predicates@3.0.2: - resolution: {integrity: sha512-IXgzBWvWQwE6PrDI05OvmXUIruQTcoMDzRsOd5CDvHCVLcLHMTSYvOK5Cm46kWqlV3yAbuSpBZdJ5oP5OUoStg==} + robust-predicates@3.0.3: + resolution: {integrity: sha512-NS3levdsRIUOmiJ8FZWCP7LG3QpJyrs/TE0Zpf1yvZu8cAJJ6QMW92H1c7kWpdIHo8RvmLxN/o2JXTKHp74lUA==} - rolldown-plugin-dts@0.22.1: - resolution: {integrity: sha512-5E0AiM5RSQhU6cjtkDFWH6laW4IrMu0j1Mo8x04Xo1ALHmaRMs9/7zej7P3RrryVHW/DdZAp85MA7Be55p0iUw==} + rolldown-plugin-dts@0.23.2: + resolution: {integrity: sha512-PbSqLawLgZBGcOGT3yqWBGn4cX+wh2nt5FuBGdcMHyOhoukmjbhYAl8NT9sE4U38Cm9tqLOIQeOrvzeayM0DLQ==} engines: {node: '>=20.19.0'} peerDependencies: '@ts-macro/tsc': ^0.3.6 - '@typescript/native-preview': '>=7.0.0-dev.20250601.1' - rolldown: ^1.0.0-rc.3 - typescript: ^5.0.0 + '@typescript/native-preview': '>=7.0.0-dev.20260325.1' + rolldown: ^1.0.0-rc.12 + typescript: ^5.0.0 || ^6.0.0 vue-tsc: ~3.2.0 peerDependenciesMeta: '@ts-macro/tsc': @@ -4109,16 +4729,19 @@ packages: vue-tsc: optional: true - rolldown@1.0.0-rc.3: - resolution: {integrity: sha512-Po/YZECDOqVXjIXrtC5h++a5NLvKAQNrd9ggrIG3sbDfGO5BqTUsrI6l8zdniKRp3r5Tp/2JTrXqx4GIguFCMw==} + rolldown@1.0.0-rc.15: + resolution: {integrity: sha512-Ff31guA5zT6WjnGp0SXw76X6hzGRk/OQq2hE+1lcDe+lJdHSgnSX6nK3erbONHyCbpSj9a9E+uX/OvytZoWp2g==} engines: {node: ^20.19.0 || >=22.12.0} hasBin: true - rollup@4.54.0: - resolution: {integrity: sha512-3nk8Y3a9Ea8szgKhinMlGMhGMw89mqule3KWczxhIzqudyHdCIOHw8WJlj/r329fACjKLEh13ZSk7oE22kyeIw==} - engines: {node: '>=18.0.0', npm: '>=8.0.0'} + rolldown@1.0.0-rc.16: + resolution: {integrity: sha512-rzi5WqKzEZw3SooTt7cgm4eqIoujPIyGcJNGFL7iPEuajQw7vxMHUkXylu4/vhCkJGXsgRmxqMKXUpT6FEgl0g==} + engines: {node: ^20.19.0 || >=22.12.0} hasBin: true + rou3@0.8.1: + resolution: {integrity: sha512-ePa+XGk00/3HuCqrEnK3LxJW7I0SdNg6EFzKUJG73hMAdDcOUC/i/aSz7LSDwLrGr33kal/rqOGydzwl6U7zBA==} + roughjs@4.6.6: resolution: {integrity: sha512-ZUz/69+SYpFN/g/lUlo2FXcIjRkSu3nDarreVdGGndHEBJ6cXPdKguS8JGxwj5HA5xIbVKSmLgr5b3AWxtRfvQ==} @@ -4141,19 +4764,19 @@ packages: resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} hasBin: true - semver@7.7.3: - resolution: {integrity: sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==} + semver@7.7.4: + resolution: {integrity: sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==} engines: {node: '>=10'} hasBin: true - seroval-plugins@1.5.1: - resolution: {integrity: sha512-4FbuZ/TMl02sqv0RTFexu0SP6V+ywaIe5bAWCCEik0fk17BhALgwvUDVF7e3Uvf9pxmwCEJsRPmlkUE6HdzLAw==} + seroval-plugins@1.5.2: + resolution: {integrity: sha512-qpY0Cl+fKYFn4GOf3cMiq6l72CpuVaawb6ILjubOQ+diJ54LfOWaSSPsaswN8DRPIPW4Yq+tE1k5aKd7ILyaFg==} engines: {node: '>=10'} peerDependencies: seroval: ^1.0 - seroval@1.5.1: - resolution: {integrity: sha512-OwrZRZAfhHww0WEnKHDY8OM0U/Qs8OTfIDWhUD4BLpNJUfXK4cGmjiagGze086m+mhI+V2nD0gfbHEnJjb9STA==} + seroval@1.5.2: + resolution: {integrity: sha512-xcRN39BdsnO9Tf+VzsE7b3JyTJASItIV1FVFewJKCFcW4s4haIKS3e6vj8PGB9qBwC7tnuOywQMdv5N4qkzi7Q==} engines: {node: '>=10'} server-only@0.0.1: @@ -4203,11 +4826,16 @@ packages: sprintf-js@1.0.3: resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} + srvx@0.11.15: + resolution: {integrity: sha512-iXsux0UcOjdvs0LCMa2Ws3WwcDUozA3JN3BquNXkaFPP7TpRqgunKdEgoZ/uwb1J6xaYHfxtz9Twlh6yzwM6Tg==} + engines: {node: '>=20.16.0'} + hasBin: true + stackback@0.0.2: resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==} - std-env@3.10.0: - resolution: {integrity: sha512-5GS12FdOZNliM5mAOxFRg7Ir0pWz8MdpYm6AY6VPkGpbA7ZzmbzNcBJQ0GPvvyWgcY7QAhCgf9Uy89I03faLkg==} + std-env@4.0.0: + resolution: {integrity: sha512-zUMPtQ/HBY3/50VbpkupYHbRroTRZJPRLvreamgErJVys0ceuzMkD44J/QjqhHjOzK42GQ3QZIeFG1OYfOtKqQ==} stringify-entities@4.0.4: resolution: {integrity: sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg==} @@ -4257,40 +4885,42 @@ packages: tailwind-merge@3.5.0: resolution: {integrity: sha512-I8K9wewnVDkL1NTGoqWmVEIlUcB9gFriAEkXkfCjX5ib8ezGxtR3xD7iZIxrfArjEsH7F1CHD4RFUtxefdqV/A==} - tailwindcss@4.2.1: - resolution: {integrity: sha512-/tBrSQ36vCleJkAOsy9kbNTgaxvGbyOamC30PRePTQe/o1MFwEKHQk4Cn7BNGaPtjp+PuUrByJehM1hgxfq4sw==} + tailwindcss@4.2.2: + resolution: {integrity: sha512-KWBIxs1Xb6NoLdMVqhbhgwZf2PGBpPEiwOqgI4pFIYbNTfBXiKYyWoTsXgBQ9WFg/OlhnvHaY+AEpW7wSmFo2Q==} - tapable@2.3.0: - resolution: {integrity: sha512-g9ljZiwki/LfxmQADO3dEY1CbpmXT5Hm2fJ+QaGKwSXUylMybePR7/67YW7jOrrvjEgL1Fmz5kzyAjWVWLlucg==} + tapable@2.3.2: + resolution: {integrity: sha512-1MOpMXuhGzGL5TTCZFItxCc0AARf1EZFQkGqMm7ERKj8+Hgr5oLvJOVFcC+lRmR8hCe2S3jC4T5D7Vg/d7/fhA==} engines: {node: '>=6'} term-size@2.2.1: resolution: {integrity: sha512-wK0Ri4fOGjv/XPy8SBHZChl8CM7uMc5VML7SqiQ0zG7+J5Vr+RMQDoHa2CNT6KHUnTGIXH34UDMkPzAUyapBZg==} engines: {node: '>=8'} - tiny-invariant@1.3.3: - resolution: {integrity: sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg==} - - tiny-warning@1.0.3: - resolution: {integrity: sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA==} - tinybench@2.9.0: resolution: {integrity: sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==} - tinyexec@1.0.2: - resolution: {integrity: sha512-W/KYk+NFhkmsYpuHq5JykngiOCnxeVL8v8dFnqxSD8qEEdRfXk1SDM6JzNqcERbcGYj9tMrDQBYV9cjgnunFIg==} + tinyexec@1.0.4: + resolution: {integrity: sha512-u9r3uZC0bdpGOXtlxUIdwf9pkmvhqJdrVCH9fapQtgy/OeTTMZ1nqH7agtvEfmGui6e1XxjcdrlxvxJvc3sMqw==} + engines: {node: '>=18'} + + tinyexec@1.1.1: + resolution: {integrity: sha512-VKS/ZaQhhkKFMANmAOhhXVoIfBXblQxGX1myCQ2faQrfmobMftXeJPcZGp0gS07ocvGJWDLZGyOZDadDBqYIJg==} engines: {node: '>=18'} tinyglobby@0.2.15: resolution: {integrity: sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==} engines: {node: '>=12.0.0'} + tinyglobby@0.2.16: + resolution: {integrity: sha512-pn99VhoACYR8nFHhxqix+uvsbXineAasWm5ojXoN8xEwK5Kd3/TrhNn1wByuD52UxWRLy8pu+kRMniEi6Eq9Zg==} + engines: {node: '>=12.0.0'} + tinypool@2.1.0: resolution: {integrity: sha512-Pugqs6M0m7Lv1I7FtxN4aoyToKg1C4tu+/381vH35y8oENM/Ai7f7C4StcoK4/+BSw9ebcS8jRiVrORFKCALLw==} engines: {node: ^20.0.0 || >=22.0.0} - tinyrainbow@3.0.3: - resolution: {integrity: sha512-PSkbLUoxOFRzJYjjxHJt9xro7D+iilgMX/C9lawzVuYiIdcihh9DXmVibBe8lmcFrRi/VzlPjBxbN7rH24q8/Q==} + tinyrainbow@3.1.0: + resolution: {integrity: sha512-Bf+ILmBgretUrdJxzXM0SgXLZ3XfiaUuOj/IKQHuTXip+05Xn+uyEYdVg0kYDipTBcLrCVyUzAPz7QmArb0mmw==} engines: {node: '>=14.0.0'} to-regex-range@5.0.1: @@ -4311,45 +4941,38 @@ packages: resolution: {integrity: sha512-q5W7tVM71e2xjHZTlgfTDoPF/SmqKG5hddq9SzR49CH2hayqRKJtQ4mtRlSxKaJlR/+9rEM+mnBHf7I2/BQcpQ==} engines: {node: '>=6.10'} - ts-morph@27.0.2: - resolution: {integrity: sha512-fhUhgeljcrdZ+9DZND1De1029PrE+cMkIP7ooqkLRTrRLTqcki2AstsyJm0vRNbTbVCNJ0idGlbBrfqc7/nA8w==} + ts-morph@28.0.0: + resolution: {integrity: sha512-Wp3tnZ2bzwxyTZMtgWVzXDfm7lB1Drz+y9DmmYH/L702PQhPyVrp3pkou3yIz4qjS14GY9kcpmLiOOMvl8oG1g==} ts-patch@3.3.0: resolution: {integrity: sha512-zAOzDnd5qsfEnjd9IGy1IRuvA7ygyyxxdxesbhMdutt8AHFjD8Vw8hU2rMF89HX1BKRWFYqKHrO8Q6lw0NeUZg==} hasBin: true - tsconfck@3.1.6: - resolution: {integrity: sha512-ks6Vjr/jEw0P1gmOVwutM3B7fWxoWBL2KRDb1JfqGVawBmO5UsvmWOQFGHBPl5yxYz4eERr19E6L7NMv+Fej4w==} - engines: {node: ^18 || >=20} - hasBin: true - peerDependencies: - typescript: ^5.0.0 - peerDependenciesMeta: - typescript: - optional: true - - tsdown@0.20.3: - resolution: {integrity: sha512-qWOUXSbe4jN8JZEgrkc/uhJpC8VN2QpNu3eZkBWwNuTEjc/Ik1kcc54ycfcQ5QPRHeu9OQXaLfCI3o7pEJgB2w==} + tsdown@0.21.9: + resolution: {integrity: sha512-tZPv2zMaMnjj9H9h0SDqpSXa9YWVZWHlG46DnSgNTFX6aq001MSI8kuBzJumr/u099nWj+1v5S7rhbnHk5jCHA==} engines: {node: '>=20.19.0'} hasBin: true peerDependencies: '@arethetypeswrong/core': ^0.18.1 + '@tsdown/css': 0.21.9 + '@tsdown/exe': 0.21.9 '@vitejs/devtools': '*' publint: ^0.3.0 - typescript: ^5.0.0 - unplugin-lightningcss: ^0.4.0 + typescript: ^5.0.0 || ^6.0.0 unplugin-unused: ^0.5.0 peerDependenciesMeta: '@arethetypeswrong/core': optional: true + '@tsdown/css': + optional: true + '@tsdown/exe': + optional: true '@vitejs/devtools': optional: true publint: optional: true typescript: optional: true - unplugin-lightningcss: - optional: true unplugin-unused: optional: true @@ -4361,64 +4984,30 @@ packages: engines: {node: '>=18.0.0'} hasBin: true - turbo-darwin-64@2.8.5: - resolution: {integrity: sha512-3wngnZrjRh6nXjNFURY9yKV7ysTF2gibpzkQjo4/c4eWjGt39q5p/A/wpxpnVBzyT1/auaPuzxJA98Sv1ZCOJg==} - cpu: [x64] - os: [darwin] - - turbo-darwin-arm64@2.8.5: - resolution: {integrity: sha512-QAFH6X9h8M4G8uTVRBQFw6EN0LmvYYyNEA2EKJOEogyeULSUA04M+FzYuSScl6uS9P78fzOCC0hhzk/Eqo4GQg==} - cpu: [arm64] - os: [darwin] - - turbo-linux-64@2.8.5: - resolution: {integrity: sha512-o01d5g3CZWavW6vP0KD8wJwdqoHaLuOAb3PvuWY95JEcyPRAKGKNxsTW2xNifY4UYENwSVktFZXZlIO2qnrEmg==} - cpu: [x64] - os: [linux] - - turbo-linux-arm64@2.8.5: - resolution: {integrity: sha512-YSNVEUeFVGsA2pmPOokiximJOhKQnrg/M7JlJZzefjmp+j4Raj7YqLwK8pQRbAO4XDoojkf4tvmy+mRVW9O0gQ==} - cpu: [arm64] - os: [linux] - - turbo-windows-64@2.8.5: - resolution: {integrity: sha512-X0MMT+IwWS+veX8h9/SO3+gkorcuGi0nu8CIg0kBhaqbC6Me0tChvHYQpkXj/+5qG5oFpjgkCSCip4/KYesZtg==} - cpu: [x64] - os: [win32] - - turbo-windows-arm64@2.8.5: - resolution: {integrity: sha512-YBHZ1a0y8J0ITKv4TgujMFk04y84KimPDg8Br2lQaywrj3i2eRXLVuxhPi0Sqw+QuoqBVNKsHigxShA/w+rLLQ==} - cpu: [arm64] - os: [win32] - - turbo@2.8.5: - resolution: {integrity: sha512-pUhV1czFZNGOwnwCLaO727uSDH4botIrhOb/AAFqzfi3x4eeRZoOcAjoidnXD/dwCAw0HJf3+Sy4c2e8SlQKxQ==} + turbo@2.9.6: + resolution: {integrity: sha512-+v2QJey7ZUeUiuigkU+uFfklvNUyPI2VO2vBpMYJA+a1hKFLFiKtUYlRHdb3P9CrAvMzi0upbjI4WT+zKtqkBg==} hasBin: true - typescript-transform-paths@3.5.6: - resolution: {integrity: sha512-3eQTG6Ogt+pgPEh45uX2s9OwcfAVjWnyNO+osjYcOqYaWDVMIFUkqW8e0O1cOaVwdMqQFQf6alDT+76xmeS2Ag==} - peerDependencies: - typescript: '>=3.6.5' - - typescript@5.9.3: - resolution: {integrity: sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==} + typescript@6.0.3: + resolution: {integrity: sha512-y2TvuxSZPDyQakkFRPZHKFm+KKVqIisdg9/CZwm9ftvKXLP8NRWj38/ODjNbr43SsoXqNuAisEf1GdCxqWcdBw==} engines: {node: '>=14.17'} hasBin: true ufo@1.6.3: resolution: {integrity: sha512-yDJTmhydvl5lJzBmy/hyOAA0d+aqCBuwl818haVdYCRrWV84o7YyeVm4QlVHStqNrrJSTb6jKuFAVqAFsr+K3Q==} - unconfig-core@7.4.2: - resolution: {integrity: sha512-VgPCvLWugINbXvMQDf8Jh0mlbvNjNC6eSUziHsBCMpxR05OPrNrvDnyatdMjRgcHaaNsCqz+wjNXxNw1kRLHUg==} + unconfig-core@7.5.0: + resolution: {integrity: sha512-Su3FauozOGP44ZmKdHy2oE6LPjk51M/TRRjHv2HNCWiDvfvCoxC2lno6jevMA91MYAdCdwP05QnWdWpSbncX/w==} - undici-types@7.16.0: - resolution: {integrity: sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw==} + undici-types@7.19.2: + resolution: {integrity: sha512-qYVnV5OEm2AW8cJMCpdV20CDyaN3g0AjDlOGf1OW4iaDEx8MwdtChUp4zu4H0VP3nDRF/8RKWH+IPp9uW0YGZg==} - undici-types@7.18.2: - resolution: {integrity: sha512-AsuCzffGHJybSaRrmr5eHr81mwJU3kjw6M+uprWvCXiNeN9SOGwQ3Jn8jb8m3Z6izVgknn1R0FTCEAP2QrLY/w==} + undici@7.24.8: + resolution: {integrity: sha512-6KQ/+QxK49Z/p3HO6E5ZCZWNnCasyZLa5ExaVYyvPxUwKtbCPMKELJOqh7EqOle0t9cH/7d2TaaTRRa6Nhs4YQ==} + engines: {node: '>=20.18.1'} - undici@7.18.2: - resolution: {integrity: sha512-y+8YjDFzWdQlSE9N5nzKMT3g4a5UBX1HKowfdXh0uvAnTaqqwqB92Jt4UXBAeKekDs5IaDKyJFR4X1gYVCgXcw==} + undici@7.25.0: + resolution: {integrity: sha512-xXnp4kTyor2Zq+J1FfPI6Eq3ew5h6Vl0F/8d9XU5zZQf1tX9s2Su1/3PiMmUANFULpmksxkClamIZcaUqryHsQ==} engines: {node: '>=20.18.1'} unenv@2.0.0-rc.24: @@ -4452,12 +5041,16 @@ packages: resolution: {integrity: sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==} engines: {node: '>= 4.0.0'} + unplugin@2.3.11: + resolution: {integrity: sha512-5uKD0nqiYVzlmCRs01Fhs2BdkEgBS3SAVP6ndrBsuK42iC2+JHyxM05Rm9G8+5mkmRtzMZGY8Ct5+mliZxU/Ww==} + engines: {node: '>=18.12.0'} + unplugin@3.0.0: resolution: {integrity: sha512-0Mqk3AT2TZCXWKdcoaufeXNukv2mTrEZExeXlHIOZXdqYoHHr4n51pymnwV8x2BOVxwXbK2HLlI7usrqMpycdg==} engines: {node: ^20.19.0 || >=22.12.0} - unrun@0.2.27: - resolution: {integrity: sha512-Mmur1UJpIbfxasLOhPRvox/QS4xBiDii71hMP7smfRthGcwFL2OAmYRgduLANOAU4LUkvVamuP+02U+c90jlrw==} + unrun@0.2.36: + resolution: {integrity: sha512-ICAGv44LHSKjCdI4B4rk99lJLHXBweutO4MUwu3cavMlYtXID0Tn5e1Kwe/Uj6BSAuHHXfi1JheFVCYhcXHfAg==} engines: {node: '>=20.19.0'} hasBin: true peerDependencies: @@ -4497,9 +5090,6 @@ packages: peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 - util-deprecate@1.0.2: - resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} - uuid@11.1.0: resolution: {integrity: sha512-0/A9rDy9P7cJ+8w1c9WD9V//9Wj15Ce2MPz8Ri6032usz+NfePxx5AcN3bN+r6ZL6jEo066/yNYB3tn4pQEx+A==} hasBin: true @@ -4513,20 +5103,16 @@ packages: vfile@6.0.3: resolution: {integrity: sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==} - vite-tsconfig-paths@6.1.0: - resolution: {integrity: sha512-kpd3sY9glHIDaq4V/Tlc1Y8WaKtutoc3B525GHxEVKWX42FKfQsXvjFOemu1I8VIN8pNbrMLWVTbW79JaRUxKg==} - peerDependencies: - vite: '*' - - vite@7.3.0: - resolution: {integrity: sha512-dZwN5L1VlUBewiP6H9s2+B3e3Jg96D0vzN+Ry73sOefebhYr9f94wwkMNN/9ouoU8pV1BqA1d1zGk8928cx0rg==} + vite@8.0.8: + resolution: {integrity: sha512-dbU7/iLVa8KZALJyLOBOQ88nOXtNG8vxKuOT4I2mD+Ya70KPceF4IAmDsmU0h1Qsn5bPrvsY9HJstCRh3hG6Uw==} engines: {node: ^20.19.0 || >=22.12.0} hasBin: true peerDependencies: '@types/node': ^20.19.0 || >=22.12.0 + '@vitejs/devtools': ^0.1.0 + esbuild: ^0.27.0 || ^0.28.0 jiti: '>=1.21.0' less: ^4.0.0 - lightningcss: ^1.21.0 sass: ^1.70.0 sass-embedded: ^1.70.0 stylus: '>=0.54.8' @@ -4537,12 +5123,14 @@ packages: peerDependenciesMeta: '@types/node': optional: true + '@vitejs/devtools': + optional: true + esbuild: + optional: true jiti: optional: true less: optional: true - lightningcss: - optional: true sass: optional: true sass-embedded: @@ -4558,60 +5146,31 @@ packages: yaml: optional: true - vite@7.3.1: - resolution: {integrity: sha512-w+N7Hifpc3gRjZ63vYBXA56dvvRlNWRczTdmCBBa+CotUzAPf5b7YMdMR/8CQoeYE5LX3W4wj6RYTgonm1b9DA==} - engines: {node: ^20.19.0 || >=22.12.0} - hasBin: true + vitefu@1.1.3: + resolution: {integrity: sha512-ub4okH7Z5KLjb6hDyjqrGXqWtWvoYdU3IGm/NorpgHncKoLTCfRIbvlhBm7r0YstIaQRYlp4yEbFqDcKSzXSSg==} peerDependencies: - '@types/node': ^20.19.0 || >=22.12.0 - jiti: '>=1.21.0' - less: ^4.0.0 - lightningcss: ^1.21.0 - sass: ^1.70.0 - sass-embedded: ^1.70.0 - stylus: '>=0.54.8' - sugarss: ^5.0.0 - terser: ^5.16.0 - tsx: ^4.8.1 - yaml: ^2.4.2 + vite: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0 peerDependenciesMeta: - '@types/node': - optional: true - jiti: - optional: true - less: - optional: true - lightningcss: - optional: true - sass: - optional: true - sass-embedded: - optional: true - stylus: - optional: true - sugarss: - optional: true - terser: - optional: true - tsx: - optional: true - yaml: + vite: optional: true - vitest@4.0.18: - resolution: {integrity: sha512-hOQuK7h0FGKgBAas7v0mSAsnvrIgAvWmRFjmzpJ7SwFHH3g1k2u37JtYwOwmEKhK6ZO3v9ggDBBm0La1LCK4uQ==} + vitest@4.1.4: + resolution: {integrity: sha512-tFuJqTxKb8AvfyqMfnavXdzfy3h3sWZRWwfluGbkeR7n0HUev+FmNgZ8SDrRBTVrVCjgH5cA21qGbCffMNtWvg==} engines: {node: ^20.0.0 || ^22.0.0 || >=24.0.0} hasBin: true peerDependencies: '@edge-runtime/vm': '*' '@opentelemetry/api': ^1.9.0 '@types/node': ^20.0.0 || ^22.0.0 || >=24.0.0 - '@vitest/browser-playwright': 4.0.18 - '@vitest/browser-preview': 4.0.18 - '@vitest/browser-webdriverio': 4.0.18 - '@vitest/ui': 4.0.18 + '@vitest/browser-playwright': 4.1.4 + '@vitest/browser-preview': 4.1.4 + '@vitest/browser-webdriverio': 4.1.4 + '@vitest/coverage-istanbul': 4.1.4 + '@vitest/coverage-v8': 4.1.4 + '@vitest/ui': 4.1.4 happy-dom: '*' jsdom: '*' + vite: ^6.0.0 || ^7.0.0 || ^8.0.0 peerDependenciesMeta: '@edge-runtime/vm': optional: true @@ -4625,6 +5184,10 @@ packages: optional: true '@vitest/browser-webdriverio': optional: true + '@vitest/coverage-istanbul': + optional: true + '@vitest/coverage-v8': + optional: true '@vitest/ui': optional: true happy-dom: @@ -4658,6 +5221,15 @@ packages: webpack-virtual-modules@0.6.2: resolution: {integrity: sha512-66/V2i5hQanC51vBQKPH4aI8NMAcBW59FVBs+rC7eGHupMyfn34q7rZIE+ETlJ+XTevqfUhVVBgSUNSW2flEUQ==} + whatwg-encoding@3.1.1: + resolution: {integrity: sha512-6qN4hJdMwfYBtE3YBTTHhoeuUrDBPZmbQaxWAqSALV/MeEnR5z1xd8UKud2RAkFoPkmB+hli1TZSnyi84xz1vQ==} + engines: {node: '>=18'} + deprecated: Use @exodus/bytes instead for a more spec-conformant and faster implementation + + whatwg-mimetype@4.0.0: + resolution: {integrity: sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg==} + engines: {node: '>=18'} + which@2.0.2: resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} engines: {node: '>= 8'} @@ -4673,17 +5245,17 @@ packages: engines: {node: '>=8'} hasBin: true - workerd@1.20260210.0: - resolution: {integrity: sha512-Sb0WXhrvf+XHQigP2trAxQnXo7wxZFC4PWnn6I7LhFxiTvzxvOAqMEiLkIz58wggRCb54T/KAA8hdjkTniR5FA==} + workerd@1.20260415.1: + resolution: {integrity: sha512-phyPjRnx+mQDfkhN9ENPioL1L0SdhYs4S0YmJK/xF9Oga+ykNfdSy1MHnsOj8yqnOV96zcVQMx32dJ0r3pq0jQ==} engines: {node: '>=16'} hasBin: true - wrangler@4.64.0: - resolution: {integrity: sha512-0PBiVEbshQT4Av/KLHbOAks4ioIKp/eAO7Xr2BgAX5v7cFYYgeOvudBrbtZa/hDDIA6858QuJnTQ8mI+cm8Vqw==} - engines: {node: '>=20.0.0'} + wrangler@4.83.0: + resolution: {integrity: sha512-gw5g3LCiuAqVWxaoKY6+quE0HzAUEFb/FV3oAlNkE1ttd4XP3FiV91XDkkzUCcdqxS4WjhQvPhIDBNdhEi8P0A==} + engines: {node: '>=20.3.0'} hasBin: true peerDependencies: - '@cloudflare/workers-types': ^4.20260210.0 + '@cloudflare/workers-types': ^4.20260415.1 peerDependenciesMeta: '@cloudflare/workers-types': optional: true @@ -4700,8 +5272,8 @@ packages: utf-8-validate: optional: true - ws@8.19.0: - resolution: {integrity: sha512-blAT2mjOEIi0ZzruJfIhb3nps74PRWTCz1IjglWEEpQl5XS/UNama6u2/rjFkDDouqr4L67ry+1aGIALViWjDg==} + ws@8.20.0: + resolution: {integrity: sha512-sAt8BhgNbzCtgGbt2OxmpuryO63ZoDk/sqaB/znQm94T4fCEsy/yV+7CdC1kJhOU9lboAEU7R3kquuycDoibVA==} engines: {node: '>=10.0.0'} peerDependencies: bufferutil: ^4.0.1 @@ -4712,20 +5284,22 @@ packages: utf-8-validate: optional: true + xmlbuilder2@4.0.3: + resolution: {integrity: sha512-bx8Q1STctnNaaDymWnkfQLKofs0mGNN7rLLapJlGuV3VlvegD7Ls4ggMjE3aUSWItCCzU0PEv45lI87iSigiCA==} + engines: {node: '>=20.0'} + yallist@3.1.1: resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} - yaml@2.8.2: - resolution: {integrity: sha512-mplynKqc1C2hTVYxd0PU2xQAc22TI1vShAYGksCCfxbn/dFwnHTNi1bvYsBTkhdUNtGIf5xNOg938rrSSYvS9A==} - engines: {node: '>= 14.6'} - hasBin: true - youch-core@0.3.3: resolution: {integrity: sha512-ho7XuGjLaJ2hWHoK8yFnsUGy2Y5uDpqSTq1FkHLK4/oqKtyUU1AFbOOxY4IpC9f0fTLjwYbslUz0Po5BpD1wrA==} youch@4.1.0-beta.10: resolution: {integrity: sha512-rLfVLB4FgQneDr0dv1oddCVZmKjcJ6yX6mS4pU82Mq/Dt9a3cLZQ62pDBL4AUO+uVrCvtWz3ZFUL2HFAFJ/BXQ==} + zod@3.25.76: + resolution: {integrity: sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==} + zod@4.3.6: resolution: {integrity: sha512-rftlrkhHZOcjDwkGlnUtZZkvaPHCsDATp4pGpuOOMDaTdDDXF91wuVDJoWoPsKX/3YPQ5fHuF3STjcYyKr+Qhg==} @@ -4739,7 +5313,13 @@ snapshots: '@antfu/install-pkg@1.1.0': dependencies: package-manager-detector: 1.6.0 - tinyexec: 1.0.2 + tinyexec: 1.0.4 + + '@babel/code-frame@7.27.1': + dependencies: + '@babel/helper-validator-identifier': 7.28.5 + js-tokens: 4.0.0 + picocolors: 1.1.1 '@babel/code-frame@7.29.0': dependencies: @@ -4755,8 +5335,8 @@ snapshots: '@babel/generator': 7.29.1 '@babel/helper-compilation-targets': 7.28.6 '@babel/helper-module-transforms': 7.28.6(@babel/core@7.29.0) - '@babel/helpers': 7.28.6 - '@babel/parser': 7.29.0 + '@babel/helpers': 7.29.2 + '@babel/parser': 7.29.2 '@babel/template': 7.28.6 '@babel/traverse': 7.29.0 '@babel/types': 7.29.0 @@ -4771,16 +5351,16 @@ snapshots: '@babel/generator@7.29.1': dependencies: - '@babel/parser': 7.29.0 + '@babel/parser': 7.29.2 '@babel/types': 7.29.0 '@jridgewell/gen-mapping': 0.3.13 '@jridgewell/trace-mapping': 0.3.31 jsesc: 3.1.0 - '@babel/generator@8.0.0-rc.1': + '@babel/generator@8.0.0-rc.3': dependencies: - '@babel/parser': 8.0.0-rc.1 - '@babel/types': 8.0.0-rc.1 + '@babel/parser': 8.0.0-rc.3 + '@babel/types': 8.0.0-rc.3 '@jridgewell/gen-mapping': 0.3.13 '@jridgewell/trace-mapping': 0.3.31 '@types/jsesc': 2.5.1 @@ -4790,7 +5370,7 @@ snapshots: dependencies: '@babel/compat-data': 7.29.0 '@babel/helper-validator-option': 7.27.1 - browserslist: 4.28.1 + browserslist: 4.28.2 lru-cache: 5.1.1 semver: 6.3.1 @@ -4812,35 +5392,47 @@ snapshots: transitivePeerDependencies: - supports-color + '@babel/helper-plugin-utils@7.28.6': {} + '@babel/helper-string-parser@7.27.1': {} - '@babel/helper-string-parser@8.0.0-rc.1': {} + '@babel/helper-string-parser@8.0.0-rc.3': {} '@babel/helper-validator-identifier@7.28.5': {} - '@babel/helper-validator-identifier@8.0.0-rc.1': {} + '@babel/helper-validator-identifier@8.0.0-rc.3': {} '@babel/helper-validator-option@7.27.1': {} - '@babel/helpers@7.28.6': + '@babel/helpers@7.29.2': dependencies: '@babel/template': 7.28.6 '@babel/types': 7.29.0 - '@babel/parser@7.29.0': + '@babel/parser@7.29.2': dependencies: '@babel/types': 7.29.0 - '@babel/parser@8.0.0-rc.1': + '@babel/parser@8.0.0-rc.3': + dependencies: + '@babel/types': 8.0.0-rc.3 + + '@babel/plugin-syntax-jsx@7.28.6(@babel/core@7.29.0)': + dependencies: + '@babel/core': 7.29.0 + '@babel/helper-plugin-utils': 7.28.6 + + '@babel/plugin-syntax-typescript@7.28.6(@babel/core@7.29.0)': dependencies: - '@babel/types': 8.0.0-rc.1 + '@babel/core': 7.29.0 + '@babel/helper-plugin-utils': 7.28.6 - '@babel/runtime@7.28.6': {} + '@babel/runtime@7.29.2': {} '@babel/template@7.28.6': dependencies: '@babel/code-frame': 7.29.0 - '@babel/parser': 7.29.0 + '@babel/parser': 7.29.2 '@babel/types': 7.29.0 '@babel/traverse@7.29.0': @@ -4848,7 +5440,7 @@ snapshots: '@babel/code-frame': 7.29.0 '@babel/generator': 7.29.1 '@babel/helper-globals': 7.28.0 - '@babel/parser': 7.29.0 + '@babel/parser': 7.29.2 '@babel/template': 7.28.6 '@babel/types': 7.29.0 debug: 4.4.3 @@ -4860,31 +5452,31 @@ snapshots: '@babel/helper-string-parser': 7.27.1 '@babel/helper-validator-identifier': 7.28.5 - '@babel/types@8.0.0-rc.1': + '@babel/types@8.0.0-rc.3': dependencies: - '@babel/helper-string-parser': 8.0.0-rc.1 - '@babel/helper-validator-identifier': 8.0.0-rc.1 + '@babel/helper-string-parser': 8.0.0-rc.3 + '@babel/helper-validator-identifier': 8.0.0-rc.3 '@bcoe/v8-coverage@1.0.2': {} '@braintree/sanitize-url@7.1.2': {} - '@buape/carbon@0.14.0(hono@4.11.3)': + '@buape/carbon@0.16.0(@emnapi/core@1.9.2)(@emnapi/runtime@1.9.2)': dependencies: - '@types/node': 25.2.3 - discord-api-types: 0.38.37 + '@types/node': 25.6.0 + discord-api-types: 0.38.45 optionalDependencies: - '@cloudflare/workers-types': 4.20260120.0 - '@discordjs/voice': 0.19.0 - '@hono/node-server': 1.19.9(hono@4.11.3) - '@types/bun': 1.3.6 + '@cloudflare/workers-types': 4.20260405.1 + '@discordjs/voice': 0.19.2(@emnapi/core@1.9.2)(@emnapi/runtime@1.9.2) + '@types/bun': 1.3.11 '@types/ws': 8.18.1 - ws: 8.19.0 + ws: 8.20.0 transitivePeerDependencies: - '@discordjs/opus' + - '@emnapi/core' + - '@emnapi/runtime' - bufferutil - ffmpeg-static - - hono - node-opus - opusscript - utf-8-validate @@ -4903,7 +5495,7 @@ snapshots: outdent: 0.5.0 prettier: 2.8.8 resolve-from: 5.0.0 - semver: 7.7.3 + semver: 7.7.4 '@changesets/assemble-release-plan@6.0.9': dependencies: @@ -4912,13 +5504,13 @@ snapshots: '@changesets/should-skip-package': 0.1.2 '@changesets/types': 6.1.0 '@manypkg/get-packages': 1.1.3 - semver: 7.7.3 + semver: 7.7.4 '@changesets/changelog-git@0.2.1': dependencies: '@changesets/types': 6.1.0 - '@changesets/cli@2.30.0(@types/node@25.2.3)': + '@changesets/cli@2.30.0(@types/node@25.6.0)': dependencies: '@changesets/apply-release-plan': 7.1.0 '@changesets/assemble-release-plan': 6.0.9 @@ -4934,7 +5526,7 @@ snapshots: '@changesets/should-skip-package': 0.1.2 '@changesets/types': 6.1.0 '@changesets/write': 0.4.0 - '@inquirer/external-editor': 1.0.3(@types/node@25.2.3) + '@inquirer/external-editor': 1.0.3(@types/node@25.6.0) '@manypkg/get-packages': 1.1.3 ansi-colors: 4.1.3 enquirer: 2.4.1 @@ -4943,7 +5535,7 @@ snapshots: package-manager-detector: 0.2.11 picocolors: 1.1.1 resolve-from: 5.0.0 - semver: 7.7.3 + semver: 7.7.4 spawndamnit: 3.0.1 term-size: 2.2.1 transitivePeerDependencies: @@ -4969,7 +5561,7 @@ snapshots: '@changesets/types': 6.1.0 '@manypkg/get-packages': 1.1.3 picocolors: 1.1.1 - semver: 7.7.3 + semver: 7.7.4 '@changesets/get-release-plan@4.0.15': dependencies: @@ -5051,31 +5643,31 @@ snapshots: '@cloudflare/kv-asset-handler@0.4.2': {} - '@cloudflare/unenv-preset@2.12.1(unenv@2.0.0-rc.24)(workerd@1.20260210.0)': + '@cloudflare/unenv-preset@2.16.0(unenv@2.0.0-rc.24)(workerd@1.20260415.1)': dependencies: unenv: 2.0.0-rc.24 optionalDependencies: - workerd: 1.20260210.0 + workerd: 1.20260415.1 - '@cloudflare/workerd-darwin-64@1.20260210.0': + '@cloudflare/workerd-darwin-64@1.20260415.1': optional: true - '@cloudflare/workerd-darwin-arm64@1.20260210.0': + '@cloudflare/workerd-darwin-arm64@1.20260415.1': optional: true - '@cloudflare/workerd-linux-64@1.20260210.0': + '@cloudflare/workerd-linux-64@1.20260415.1': optional: true - '@cloudflare/workerd-linux-arm64@1.20260210.0': + '@cloudflare/workerd-linux-arm64@1.20260415.1': optional: true - '@cloudflare/workerd-windows-64@1.20260210.0': + '@cloudflare/workerd-windows-64@1.20260415.1': optional: true - '@cloudflare/workers-types@4.20260120.0': + '@cloudflare/workers-types@4.20260405.1': optional: true - '@cloudflare/workers-types@4.20260210.0': {} + '@cloudflare/workers-types@4.20260417.1': {} '@commander-js/extra-typings@14.0.0(commander@14.0.3)': dependencies: @@ -5085,15 +5677,18 @@ snapshots: dependencies: '@jridgewell/trace-mapping': 0.3.9 - '@discordjs/voice@0.19.0': + '@discordjs/voice@0.19.2(@emnapi/core@1.9.2)(@emnapi/runtime@1.9.2)': dependencies: + '@snazzah/davey': 0.1.11(@emnapi/core@1.9.2)(@emnapi/runtime@1.9.2) '@types/ws': 8.18.1 - discord-api-types: 0.38.37 + discord-api-types: 0.38.45 prism-media: 1.3.5 tslib: 2.8.1 - ws: 8.19.0 + ws: 8.20.0 transitivePeerDependencies: - '@discordjs/opus' + - '@emnapi/core' + - '@emnapi/runtime' - bufferutil - ffmpeg-static - node-opus @@ -5101,178 +5696,256 @@ snapshots: - utf-8-validate optional: true - '@emnapi/core@1.7.1': + '@emnapi/core@1.9.2': dependencies: - '@emnapi/wasi-threads': 1.1.0 + '@emnapi/wasi-threads': 1.2.1 tslib: 2.8.1 optional: true - '@emnapi/runtime@1.7.1': + '@emnapi/runtime@1.9.2': dependencies: tslib: 2.8.1 optional: true - '@emnapi/wasi-threads@1.1.0': + '@emnapi/wasi-threads@1.2.1': dependencies: tslib: 2.8.1 optional: true - '@esbuild/aix-ppc64@0.27.2': + '@esbuild/aix-ppc64@0.27.3': optional: true - '@esbuild/aix-ppc64@0.27.3': + '@esbuild/aix-ppc64@0.27.7': optional: true - '@esbuild/android-arm64@0.27.2': + '@esbuild/aix-ppc64@0.28.0': optional: true '@esbuild/android-arm64@0.27.3': optional: true - '@esbuild/android-arm@0.27.2': + '@esbuild/android-arm64@0.27.7': + optional: true + + '@esbuild/android-arm64@0.28.0': optional: true '@esbuild/android-arm@0.27.3': optional: true - '@esbuild/android-x64@0.27.2': + '@esbuild/android-arm@0.27.7': + optional: true + + '@esbuild/android-arm@0.28.0': optional: true '@esbuild/android-x64@0.27.3': optional: true - '@esbuild/darwin-arm64@0.27.2': + '@esbuild/android-x64@0.27.7': + optional: true + + '@esbuild/android-x64@0.28.0': optional: true '@esbuild/darwin-arm64@0.27.3': optional: true - '@esbuild/darwin-x64@0.27.2': + '@esbuild/darwin-arm64@0.27.7': + optional: true + + '@esbuild/darwin-arm64@0.28.0': optional: true '@esbuild/darwin-x64@0.27.3': optional: true - '@esbuild/freebsd-arm64@0.27.2': + '@esbuild/darwin-x64@0.27.7': + optional: true + + '@esbuild/darwin-x64@0.28.0': optional: true '@esbuild/freebsd-arm64@0.27.3': optional: true - '@esbuild/freebsd-x64@0.27.2': + '@esbuild/freebsd-arm64@0.27.7': + optional: true + + '@esbuild/freebsd-arm64@0.28.0': optional: true '@esbuild/freebsd-x64@0.27.3': optional: true - '@esbuild/linux-arm64@0.27.2': + '@esbuild/freebsd-x64@0.27.7': + optional: true + + '@esbuild/freebsd-x64@0.28.0': optional: true '@esbuild/linux-arm64@0.27.3': optional: true - '@esbuild/linux-arm@0.27.2': + '@esbuild/linux-arm64@0.27.7': + optional: true + + '@esbuild/linux-arm64@0.28.0': optional: true '@esbuild/linux-arm@0.27.3': optional: true - '@esbuild/linux-ia32@0.27.2': + '@esbuild/linux-arm@0.27.7': + optional: true + + '@esbuild/linux-arm@0.28.0': optional: true '@esbuild/linux-ia32@0.27.3': optional: true - '@esbuild/linux-loong64@0.27.2': + '@esbuild/linux-ia32@0.27.7': + optional: true + + '@esbuild/linux-ia32@0.28.0': optional: true '@esbuild/linux-loong64@0.27.3': optional: true - '@esbuild/linux-mips64el@0.27.2': + '@esbuild/linux-loong64@0.27.7': + optional: true + + '@esbuild/linux-loong64@0.28.0': optional: true '@esbuild/linux-mips64el@0.27.3': optional: true - '@esbuild/linux-ppc64@0.27.2': + '@esbuild/linux-mips64el@0.27.7': + optional: true + + '@esbuild/linux-mips64el@0.28.0': optional: true '@esbuild/linux-ppc64@0.27.3': optional: true - '@esbuild/linux-riscv64@0.27.2': + '@esbuild/linux-ppc64@0.27.7': + optional: true + + '@esbuild/linux-ppc64@0.28.0': optional: true '@esbuild/linux-riscv64@0.27.3': optional: true - '@esbuild/linux-s390x@0.27.2': + '@esbuild/linux-riscv64@0.27.7': + optional: true + + '@esbuild/linux-riscv64@0.28.0': optional: true '@esbuild/linux-s390x@0.27.3': optional: true - '@esbuild/linux-x64@0.27.2': + '@esbuild/linux-s390x@0.27.7': + optional: true + + '@esbuild/linux-s390x@0.28.0': optional: true '@esbuild/linux-x64@0.27.3': optional: true - '@esbuild/netbsd-arm64@0.27.2': + '@esbuild/linux-x64@0.27.7': + optional: true + + '@esbuild/linux-x64@0.28.0': optional: true '@esbuild/netbsd-arm64@0.27.3': optional: true - '@esbuild/netbsd-x64@0.27.2': + '@esbuild/netbsd-arm64@0.27.7': + optional: true + + '@esbuild/netbsd-arm64@0.28.0': optional: true '@esbuild/netbsd-x64@0.27.3': optional: true - '@esbuild/openbsd-arm64@0.27.2': + '@esbuild/netbsd-x64@0.27.7': + optional: true + + '@esbuild/netbsd-x64@0.28.0': optional: true '@esbuild/openbsd-arm64@0.27.3': optional: true - '@esbuild/openbsd-x64@0.27.2': + '@esbuild/openbsd-arm64@0.27.7': + optional: true + + '@esbuild/openbsd-arm64@0.28.0': optional: true '@esbuild/openbsd-x64@0.27.3': optional: true - '@esbuild/openharmony-arm64@0.27.2': + '@esbuild/openbsd-x64@0.27.7': + optional: true + + '@esbuild/openbsd-x64@0.28.0': optional: true '@esbuild/openharmony-arm64@0.27.3': optional: true - '@esbuild/sunos-x64@0.27.2': + '@esbuild/openharmony-arm64@0.27.7': + optional: true + + '@esbuild/openharmony-arm64@0.28.0': optional: true '@esbuild/sunos-x64@0.27.3': optional: true - '@esbuild/win32-arm64@0.27.2': + '@esbuild/sunos-x64@0.27.7': + optional: true + + '@esbuild/sunos-x64@0.28.0': optional: true '@esbuild/win32-arm64@0.27.3': optional: true - '@esbuild/win32-ia32@0.27.2': + '@esbuild/win32-arm64@0.27.7': + optional: true + + '@esbuild/win32-arm64@0.28.0': optional: true '@esbuild/win32-ia32@0.27.3': optional: true - '@esbuild/win32-x64@0.27.2': + '@esbuild/win32-ia32@0.27.7': + optional: true + + '@esbuild/win32-ia32@0.28.0': optional: true '@esbuild/win32-x64@0.27.3': optional: true + '@esbuild/win32-x64@0.27.7': + optional: true + + '@esbuild/win32-x64@0.28.0': + optional: true + '@floating-ui/core@1.7.5': dependencies: '@floating-ui/utils': 0.2.11 @@ -5282,33 +5955,18 @@ snapshots: '@floating-ui/core': 1.7.5 '@floating-ui/utils': 0.2.11 - '@floating-ui/react-dom@2.1.8(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': + '@floating-ui/react-dom@2.1.8(react-dom@19.2.5(react@19.2.5))(react@19.2.5)': dependencies: '@floating-ui/dom': 1.7.6 - react: 19.2.4 - react-dom: 19.2.4(react@19.2.4) + react: 19.2.5 + react-dom: 19.2.5(react@19.2.5) '@floating-ui/utils@0.2.11': {} - '@formatjs/fast-memoize@3.1.0': - dependencies: - tslib: 2.8.1 - - '@formatjs/intl-localematcher@0.8.1': - dependencies: - '@formatjs/fast-memoize': 3.1.0 - tslib: 2.8.1 - - '@fumadocs/tailwind@0.0.3(tailwindcss@4.2.1)': - dependencies: - postcss-selector-parser: 7.1.1 + '@fumadocs/tailwind@0.0.5(@tailwindcss/oxide@4.2.2)(tailwindcss@4.2.2)': optionalDependencies: - tailwindcss: 4.2.1 - - '@hono/node-server@1.19.9(hono@4.11.3)': - dependencies: - hono: 4.11.3 - optional: true + '@tailwindcss/oxide': 4.2.2 + tailwindcss: 4.2.2 '@iconify/types@2.0.0': {} @@ -5316,9 +5974,9 @@ snapshots: dependencies: '@antfu/install-pkg': 1.1.0 '@iconify/types': 2.0.0 - mlly: 1.8.1 + mlly: 1.8.2 - '@img/colour@1.0.0': {} + '@img/colour@1.1.0': {} '@img/sharp-darwin-arm64@0.34.5': optionalDependencies: @@ -5402,7 +6060,7 @@ snapshots: '@img/sharp-wasm32@0.34.5': dependencies: - '@emnapi/runtime': 1.7.1 + '@emnapi/runtime': 1.9.2 optional: true '@img/sharp-win32-arm64@0.34.5': @@ -5414,12 +6072,12 @@ snapshots: '@img/sharp-win32-x64@0.34.5': optional: true - '@inquirer/external-editor@1.0.3(@types/node@25.2.3)': + '@inquirer/external-editor@1.0.3(@types/node@25.6.0)': dependencies: chardet: 2.1.1 iconv-lite: 0.7.2 optionalDependencies: - '@types/node': 25.2.3 + '@types/node': 25.6.0 '@jridgewell/gen-mapping@0.3.13': dependencies: @@ -5447,14 +6105,14 @@ snapshots: '@manypkg/find-root@1.1.0': dependencies: - '@babel/runtime': 7.28.6 + '@babel/runtime': 7.29.2 '@types/node': 12.20.55 find-up: 4.1.0 fs-extra: 8.1.0 '@manypkg/get-packages@1.1.3': dependencies: - '@babel/runtime': 7.28.6 + '@babel/runtime': 7.29.2 '@changesets/types': 4.1.0 '@manypkg/find-root': 1.1.0 fs-extra: 8.1.0 @@ -5491,7 +6149,7 @@ snapshots: transitivePeerDependencies: - supports-color - '@mermaid-js/parser@1.0.1': + '@mermaid-js/parser@1.1.0': dependencies: langium: 4.2.1 @@ -5508,39 +6166,39 @@ snapshots: '@messageformat/parser@5.1.1': dependencies: - moo: 0.5.2 + moo: 0.5.3 - '@napi-rs/wasm-runtime@1.1.1': + '@napi-rs/wasm-runtime@1.1.4(@emnapi/core@1.9.2)(@emnapi/runtime@1.9.2)': dependencies: - '@emnapi/core': 1.7.1 - '@emnapi/runtime': 1.7.1 + '@emnapi/core': 1.9.2 + '@emnapi/runtime': 1.9.2 '@tybys/wasm-util': 0.10.1 optional: true - '@next/env@16.1.6': {} + '@next/env@16.2.4': {} - '@next/swc-darwin-arm64@16.1.6': + '@next/swc-darwin-arm64@16.2.4': optional: true - '@next/swc-darwin-x64@16.1.6': + '@next/swc-darwin-x64@16.2.4': optional: true - '@next/swc-linux-arm64-gnu@16.1.6': + '@next/swc-linux-arm64-gnu@16.2.4': optional: true - '@next/swc-linux-arm64-musl@16.1.6': + '@next/swc-linux-arm64-musl@16.2.4': optional: true - '@next/swc-linux-x64-gnu@16.1.6': + '@next/swc-linux-x64-gnu@16.2.4': optional: true - '@next/swc-linux-x64-musl@16.1.6': + '@next/swc-linux-x64-musl@16.2.4': optional: true - '@next/swc-win32-arm64-msvc@16.1.6': + '@next/swc-win32-arm64-msvc@16.2.4': optional: true - '@next/swc-win32-x64-msvc@16.1.6': + '@next/swc-win32-x64-msvc@16.2.4': optional: true '@nodelib/fs.scandir@2.1.5': @@ -5555,122 +6213,141 @@ snapshots: '@nodelib/fs.scandir': 2.1.5 fastq: 1.20.1 + '@oozcitak/dom@2.0.2': + dependencies: + '@oozcitak/infra': 2.0.2 + '@oozcitak/url': 3.0.0 + '@oozcitak/util': 10.0.0 + + '@oozcitak/infra@2.0.2': + dependencies: + '@oozcitak/util': 10.0.0 + + '@oozcitak/url@3.0.0': + dependencies: + '@oozcitak/infra': 2.0.2 + '@oozcitak/util': 10.0.0 + + '@oozcitak/util@10.0.0': {} + '@orama/orama@3.1.18': {} - '@oxc-project/types@0.112.0': {} + '@oxc-project/types@0.124.0': {} - '@oxfmt/binding-android-arm-eabi@0.36.0': + '@oxc-project/types@0.126.0': {} + + '@oxfmt/binding-android-arm-eabi@0.45.0': optional: true - '@oxfmt/binding-android-arm64@0.36.0': + '@oxfmt/binding-android-arm64@0.45.0': optional: true - '@oxfmt/binding-darwin-arm64@0.36.0': + '@oxfmt/binding-darwin-arm64@0.45.0': optional: true - '@oxfmt/binding-darwin-x64@0.36.0': + '@oxfmt/binding-darwin-x64@0.45.0': optional: true - '@oxfmt/binding-freebsd-x64@0.36.0': + '@oxfmt/binding-freebsd-x64@0.45.0': optional: true - '@oxfmt/binding-linux-arm-gnueabihf@0.36.0': + '@oxfmt/binding-linux-arm-gnueabihf@0.45.0': optional: true - '@oxfmt/binding-linux-arm-musleabihf@0.36.0': + '@oxfmt/binding-linux-arm-musleabihf@0.45.0': optional: true - '@oxfmt/binding-linux-arm64-gnu@0.36.0': + '@oxfmt/binding-linux-arm64-gnu@0.45.0': optional: true - '@oxfmt/binding-linux-arm64-musl@0.36.0': + '@oxfmt/binding-linux-arm64-musl@0.45.0': optional: true - '@oxfmt/binding-linux-ppc64-gnu@0.36.0': + '@oxfmt/binding-linux-ppc64-gnu@0.45.0': optional: true - '@oxfmt/binding-linux-riscv64-gnu@0.36.0': + '@oxfmt/binding-linux-riscv64-gnu@0.45.0': optional: true - '@oxfmt/binding-linux-riscv64-musl@0.36.0': + '@oxfmt/binding-linux-riscv64-musl@0.45.0': optional: true - '@oxfmt/binding-linux-s390x-gnu@0.36.0': + '@oxfmt/binding-linux-s390x-gnu@0.45.0': optional: true - '@oxfmt/binding-linux-x64-gnu@0.36.0': + '@oxfmt/binding-linux-x64-gnu@0.45.0': optional: true - '@oxfmt/binding-linux-x64-musl@0.36.0': + '@oxfmt/binding-linux-x64-musl@0.45.0': optional: true - '@oxfmt/binding-openharmony-arm64@0.36.0': + '@oxfmt/binding-openharmony-arm64@0.45.0': optional: true - '@oxfmt/binding-win32-arm64-msvc@0.36.0': + '@oxfmt/binding-win32-arm64-msvc@0.45.0': optional: true - '@oxfmt/binding-win32-ia32-msvc@0.36.0': + '@oxfmt/binding-win32-ia32-msvc@0.45.0': optional: true - '@oxfmt/binding-win32-x64-msvc@0.36.0': + '@oxfmt/binding-win32-x64-msvc@0.45.0': optional: true - '@oxlint/binding-android-arm-eabi@1.51.0': + '@oxlint/binding-android-arm-eabi@1.60.0': optional: true - '@oxlint/binding-android-arm64@1.51.0': + '@oxlint/binding-android-arm64@1.60.0': optional: true - '@oxlint/binding-darwin-arm64@1.51.0': + '@oxlint/binding-darwin-arm64@1.60.0': optional: true - '@oxlint/binding-darwin-x64@1.51.0': + '@oxlint/binding-darwin-x64@1.60.0': optional: true - '@oxlint/binding-freebsd-x64@1.51.0': + '@oxlint/binding-freebsd-x64@1.60.0': optional: true - '@oxlint/binding-linux-arm-gnueabihf@1.51.0': + '@oxlint/binding-linux-arm-gnueabihf@1.60.0': optional: true - '@oxlint/binding-linux-arm-musleabihf@1.51.0': + '@oxlint/binding-linux-arm-musleabihf@1.60.0': optional: true - '@oxlint/binding-linux-arm64-gnu@1.51.0': + '@oxlint/binding-linux-arm64-gnu@1.60.0': optional: true - '@oxlint/binding-linux-arm64-musl@1.51.0': + '@oxlint/binding-linux-arm64-musl@1.60.0': optional: true - '@oxlint/binding-linux-ppc64-gnu@1.51.0': + '@oxlint/binding-linux-ppc64-gnu@1.60.0': optional: true - '@oxlint/binding-linux-riscv64-gnu@1.51.0': + '@oxlint/binding-linux-riscv64-gnu@1.60.0': optional: true - '@oxlint/binding-linux-riscv64-musl@1.51.0': + '@oxlint/binding-linux-riscv64-musl@1.60.0': optional: true - '@oxlint/binding-linux-s390x-gnu@1.51.0': + '@oxlint/binding-linux-s390x-gnu@1.60.0': optional: true - '@oxlint/binding-linux-x64-gnu@1.51.0': + '@oxlint/binding-linux-x64-gnu@1.60.0': optional: true - '@oxlint/binding-linux-x64-musl@1.51.0': + '@oxlint/binding-linux-x64-musl@1.60.0': optional: true - '@oxlint/binding-openharmony-arm64@1.51.0': + '@oxlint/binding-openharmony-arm64@1.60.0': optional: true - '@oxlint/binding-win32-arm64-msvc@1.51.0': + '@oxlint/binding-win32-arm64-msvc@1.60.0': optional: true - '@oxlint/binding-win32-ia32-msvc@1.51.0': + '@oxlint/binding-win32-ia32-msvc@1.60.0': optional: true - '@oxlint/binding-win32-x64-msvc@1.51.0': + '@oxlint/binding-win32-x64-msvc@1.60.0': optional: true '@poppinss/colors@4.1.6': @@ -5693,466 +6370,463 @@ snapshots: '@radix-ui/primitive@1.1.3': {} - '@radix-ui/react-accordion@1.2.12(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': + '@radix-ui/react-accordion@1.2.12(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)': dependencies: '@radix-ui/primitive': 1.1.3 - '@radix-ui/react-collapsible': 1.1.12(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@radix-ui/react-collection': 1.1.7(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.14)(react@19.2.4) - '@radix-ui/react-context': 1.1.2(@types/react@19.2.14)(react@19.2.4) - '@radix-ui/react-direction': 1.1.1(@types/react@19.2.14)(react@19.2.4) - '@radix-ui/react-id': 1.1.1(@types/react@19.2.14)(react@19.2.4) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.14)(react@19.2.4) - react: 19.2.4 - react-dom: 19.2.4(react@19.2.4) + '@radix-ui/react-collapsible': 1.1.12(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.5(react@19.2.5))(react@19.2.5) + '@radix-ui/react-collection': 1.1.7(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.5(react@19.2.5))(react@19.2.5) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.14)(react@19.2.5) + '@radix-ui/react-context': 1.1.2(@types/react@19.2.14)(react@19.2.5) + '@radix-ui/react-direction': 1.1.1(@types/react@19.2.14)(react@19.2.5) + '@radix-ui/react-id': 1.1.1(@types/react@19.2.14)(react@19.2.5) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.5(react@19.2.5))(react@19.2.5) + '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.14)(react@19.2.5) + react: 19.2.5 + react-dom: 19.2.5(react@19.2.5) optionalDependencies: '@types/react': 19.2.14 '@types/react-dom': 19.2.3(@types/react@19.2.14) - '@radix-ui/react-arrow@1.1.7(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': + '@radix-ui/react-arrow@1.1.7(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)': dependencies: - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - react: 19.2.4 - react-dom: 19.2.4(react@19.2.4) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.5(react@19.2.5))(react@19.2.5) + react: 19.2.5 + react-dom: 19.2.5(react@19.2.5) optionalDependencies: '@types/react': 19.2.14 '@types/react-dom': 19.2.3(@types/react@19.2.14) - '@radix-ui/react-collapsible@1.1.12(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': + '@radix-ui/react-collapsible@1.1.12(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)': dependencies: '@radix-ui/primitive': 1.1.3 - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.14)(react@19.2.4) - '@radix-ui/react-context': 1.1.2(@types/react@19.2.14)(react@19.2.4) - '@radix-ui/react-id': 1.1.1(@types/react@19.2.14)(react@19.2.4) - '@radix-ui/react-presence': 1.1.5(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.14)(react@19.2.4) - '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.14)(react@19.2.4) - react: 19.2.4 - react-dom: 19.2.4(react@19.2.4) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.14)(react@19.2.5) + '@radix-ui/react-context': 1.1.2(@types/react@19.2.14)(react@19.2.5) + '@radix-ui/react-id': 1.1.1(@types/react@19.2.14)(react@19.2.5) + '@radix-ui/react-presence': 1.1.5(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.5(react@19.2.5))(react@19.2.5) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.5(react@19.2.5))(react@19.2.5) + '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.14)(react@19.2.5) + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.14)(react@19.2.5) + react: 19.2.5 + react-dom: 19.2.5(react@19.2.5) optionalDependencies: '@types/react': 19.2.14 '@types/react-dom': 19.2.3(@types/react@19.2.14) - '@radix-ui/react-collection@1.1.7(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': + '@radix-ui/react-collection@1.1.7(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)': dependencies: - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.14)(react@19.2.4) - '@radix-ui/react-context': 1.1.2(@types/react@19.2.14)(react@19.2.4) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@radix-ui/react-slot': 1.2.3(@types/react@19.2.14)(react@19.2.4) - react: 19.2.4 - react-dom: 19.2.4(react@19.2.4) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.14)(react@19.2.5) + '@radix-ui/react-context': 1.1.2(@types/react@19.2.14)(react@19.2.5) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.5(react@19.2.5))(react@19.2.5) + '@radix-ui/react-slot': 1.2.3(@types/react@19.2.14)(react@19.2.5) + react: 19.2.5 + react-dom: 19.2.5(react@19.2.5) optionalDependencies: '@types/react': 19.2.14 '@types/react-dom': 19.2.3(@types/react@19.2.14) - '@radix-ui/react-compose-refs@1.1.2(@types/react@19.2.14)(react@19.2.4)': + '@radix-ui/react-compose-refs@1.1.2(@types/react@19.2.14)(react@19.2.5)': dependencies: - react: 19.2.4 + react: 19.2.5 optionalDependencies: '@types/react': 19.2.14 - '@radix-ui/react-context@1.1.2(@types/react@19.2.14)(react@19.2.4)': + '@radix-ui/react-context@1.1.2(@types/react@19.2.14)(react@19.2.5)': dependencies: - react: 19.2.4 + react: 19.2.5 optionalDependencies: '@types/react': 19.2.14 - '@radix-ui/react-dialog@1.1.15(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': + '@radix-ui/react-dialog@1.1.15(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)': dependencies: '@radix-ui/primitive': 1.1.3 - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.14)(react@19.2.4) - '@radix-ui/react-context': 1.1.2(@types/react@19.2.14)(react@19.2.4) - '@radix-ui/react-dismissable-layer': 1.1.11(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@radix-ui/react-focus-guards': 1.1.3(@types/react@19.2.14)(react@19.2.4) - '@radix-ui/react-focus-scope': 1.1.7(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@radix-ui/react-id': 1.1.1(@types/react@19.2.14)(react@19.2.4) - '@radix-ui/react-portal': 1.1.9(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@radix-ui/react-presence': 1.1.5(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@radix-ui/react-slot': 1.2.3(@types/react@19.2.14)(react@19.2.4) - '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.14)(react@19.2.4) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.14)(react@19.2.5) + '@radix-ui/react-context': 1.1.2(@types/react@19.2.14)(react@19.2.5) + '@radix-ui/react-dismissable-layer': 1.1.11(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.5(react@19.2.5))(react@19.2.5) + '@radix-ui/react-focus-guards': 1.1.3(@types/react@19.2.14)(react@19.2.5) + '@radix-ui/react-focus-scope': 1.1.7(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.5(react@19.2.5))(react@19.2.5) + '@radix-ui/react-id': 1.1.1(@types/react@19.2.14)(react@19.2.5) + '@radix-ui/react-portal': 1.1.9(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.5(react@19.2.5))(react@19.2.5) + '@radix-ui/react-presence': 1.1.5(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.5(react@19.2.5))(react@19.2.5) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.5(react@19.2.5))(react@19.2.5) + '@radix-ui/react-slot': 1.2.3(@types/react@19.2.14)(react@19.2.5) + '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.14)(react@19.2.5) aria-hidden: 1.2.6 - react: 19.2.4 - react-dom: 19.2.4(react@19.2.4) - react-remove-scroll: 2.7.2(@types/react@19.2.14)(react@19.2.4) + react: 19.2.5 + react-dom: 19.2.5(react@19.2.5) + react-remove-scroll: 2.7.2(@types/react@19.2.14)(react@19.2.5) optionalDependencies: '@types/react': 19.2.14 '@types/react-dom': 19.2.3(@types/react@19.2.14) - '@radix-ui/react-direction@1.1.1(@types/react@19.2.14)(react@19.2.4)': + '@radix-ui/react-direction@1.1.1(@types/react@19.2.14)(react@19.2.5)': dependencies: - react: 19.2.4 + react: 19.2.5 optionalDependencies: '@types/react': 19.2.14 - '@radix-ui/react-dismissable-layer@1.1.11(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': + '@radix-ui/react-dismissable-layer@1.1.11(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)': dependencies: '@radix-ui/primitive': 1.1.3 - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.14)(react@19.2.4) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.2.14)(react@19.2.4) - '@radix-ui/react-use-escape-keydown': 1.1.1(@types/react@19.2.14)(react@19.2.4) - react: 19.2.4 - react-dom: 19.2.4(react@19.2.4) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.14)(react@19.2.5) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.5(react@19.2.5))(react@19.2.5) + '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.2.14)(react@19.2.5) + '@radix-ui/react-use-escape-keydown': 1.1.1(@types/react@19.2.14)(react@19.2.5) + react: 19.2.5 + react-dom: 19.2.5(react@19.2.5) optionalDependencies: '@types/react': 19.2.14 '@types/react-dom': 19.2.3(@types/react@19.2.14) - '@radix-ui/react-focus-guards@1.1.3(@types/react@19.2.14)(react@19.2.4)': + '@radix-ui/react-focus-guards@1.1.3(@types/react@19.2.14)(react@19.2.5)': dependencies: - react: 19.2.4 + react: 19.2.5 optionalDependencies: '@types/react': 19.2.14 - '@radix-ui/react-focus-scope@1.1.7(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': + '@radix-ui/react-focus-scope@1.1.7(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)': dependencies: - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.14)(react@19.2.4) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.2.14)(react@19.2.4) - react: 19.2.4 - react-dom: 19.2.4(react@19.2.4) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.14)(react@19.2.5) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.5(react@19.2.5))(react@19.2.5) + '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.2.14)(react@19.2.5) + react: 19.2.5 + react-dom: 19.2.5(react@19.2.5) optionalDependencies: '@types/react': 19.2.14 '@types/react-dom': 19.2.3(@types/react@19.2.14) - '@radix-ui/react-id@1.1.1(@types/react@19.2.14)(react@19.2.4)': + '@radix-ui/react-id@1.1.1(@types/react@19.2.14)(react@19.2.5)': dependencies: - '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.14)(react@19.2.4) - react: 19.2.4 + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.14)(react@19.2.5) + react: 19.2.5 optionalDependencies: '@types/react': 19.2.14 - '@radix-ui/react-navigation-menu@1.2.14(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': + '@radix-ui/react-navigation-menu@1.2.14(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)': dependencies: '@radix-ui/primitive': 1.1.3 - '@radix-ui/react-collection': 1.1.7(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.14)(react@19.2.4) - '@radix-ui/react-context': 1.1.2(@types/react@19.2.14)(react@19.2.4) - '@radix-ui/react-direction': 1.1.1(@types/react@19.2.14)(react@19.2.4) - '@radix-ui/react-dismissable-layer': 1.1.11(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@radix-ui/react-id': 1.1.1(@types/react@19.2.14)(react@19.2.4) - '@radix-ui/react-presence': 1.1.5(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.2.14)(react@19.2.4) - '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.14)(react@19.2.4) - '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.14)(react@19.2.4) - '@radix-ui/react-use-previous': 1.1.1(@types/react@19.2.14)(react@19.2.4) - '@radix-ui/react-visually-hidden': 1.2.3(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - react: 19.2.4 - react-dom: 19.2.4(react@19.2.4) + '@radix-ui/react-collection': 1.1.7(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.5(react@19.2.5))(react@19.2.5) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.14)(react@19.2.5) + '@radix-ui/react-context': 1.1.2(@types/react@19.2.14)(react@19.2.5) + '@radix-ui/react-direction': 1.1.1(@types/react@19.2.14)(react@19.2.5) + '@radix-ui/react-dismissable-layer': 1.1.11(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.5(react@19.2.5))(react@19.2.5) + '@radix-ui/react-id': 1.1.1(@types/react@19.2.14)(react@19.2.5) + '@radix-ui/react-presence': 1.1.5(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.5(react@19.2.5))(react@19.2.5) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.5(react@19.2.5))(react@19.2.5) + '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.2.14)(react@19.2.5) + '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.14)(react@19.2.5) + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.14)(react@19.2.5) + '@radix-ui/react-use-previous': 1.1.1(@types/react@19.2.14)(react@19.2.5) + '@radix-ui/react-visually-hidden': 1.2.3(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.5(react@19.2.5))(react@19.2.5) + react: 19.2.5 + react-dom: 19.2.5(react@19.2.5) optionalDependencies: '@types/react': 19.2.14 '@types/react-dom': 19.2.3(@types/react@19.2.14) - '@radix-ui/react-popover@1.1.15(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': + '@radix-ui/react-popover@1.1.15(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)': dependencies: '@radix-ui/primitive': 1.1.3 - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.14)(react@19.2.4) - '@radix-ui/react-context': 1.1.2(@types/react@19.2.14)(react@19.2.4) - '@radix-ui/react-dismissable-layer': 1.1.11(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@radix-ui/react-focus-guards': 1.1.3(@types/react@19.2.14)(react@19.2.4) - '@radix-ui/react-focus-scope': 1.1.7(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@radix-ui/react-id': 1.1.1(@types/react@19.2.14)(react@19.2.4) - '@radix-ui/react-popper': 1.2.8(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@radix-ui/react-portal': 1.1.9(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@radix-ui/react-presence': 1.1.5(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@radix-ui/react-slot': 1.2.3(@types/react@19.2.14)(react@19.2.4) - '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.14)(react@19.2.4) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.14)(react@19.2.5) + '@radix-ui/react-context': 1.1.2(@types/react@19.2.14)(react@19.2.5) + '@radix-ui/react-dismissable-layer': 1.1.11(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.5(react@19.2.5))(react@19.2.5) + '@radix-ui/react-focus-guards': 1.1.3(@types/react@19.2.14)(react@19.2.5) + '@radix-ui/react-focus-scope': 1.1.7(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.5(react@19.2.5))(react@19.2.5) + '@radix-ui/react-id': 1.1.1(@types/react@19.2.14)(react@19.2.5) + '@radix-ui/react-popper': 1.2.8(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.5(react@19.2.5))(react@19.2.5) + '@radix-ui/react-portal': 1.1.9(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.5(react@19.2.5))(react@19.2.5) + '@radix-ui/react-presence': 1.1.5(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.5(react@19.2.5))(react@19.2.5) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.5(react@19.2.5))(react@19.2.5) + '@radix-ui/react-slot': 1.2.3(@types/react@19.2.14)(react@19.2.5) + '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.14)(react@19.2.5) aria-hidden: 1.2.6 - react: 19.2.4 - react-dom: 19.2.4(react@19.2.4) - react-remove-scroll: 2.7.2(@types/react@19.2.14)(react@19.2.4) + react: 19.2.5 + react-dom: 19.2.5(react@19.2.5) + react-remove-scroll: 2.7.2(@types/react@19.2.14)(react@19.2.5) optionalDependencies: '@types/react': 19.2.14 '@types/react-dom': 19.2.3(@types/react@19.2.14) - '@radix-ui/react-popper@1.2.8(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': - dependencies: - '@floating-ui/react-dom': 2.1.8(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@radix-ui/react-arrow': 1.1.7(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.14)(react@19.2.4) - '@radix-ui/react-context': 1.1.2(@types/react@19.2.14)(react@19.2.4) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.2.14)(react@19.2.4) - '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.14)(react@19.2.4) - '@radix-ui/react-use-rect': 1.1.1(@types/react@19.2.14)(react@19.2.4) - '@radix-ui/react-use-size': 1.1.1(@types/react@19.2.14)(react@19.2.4) + '@radix-ui/react-popper@1.2.8(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)': + dependencies: + '@floating-ui/react-dom': 2.1.8(react-dom@19.2.5(react@19.2.5))(react@19.2.5) + '@radix-ui/react-arrow': 1.1.7(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.5(react@19.2.5))(react@19.2.5) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.14)(react@19.2.5) + '@radix-ui/react-context': 1.1.2(@types/react@19.2.14)(react@19.2.5) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.5(react@19.2.5))(react@19.2.5) + '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.2.14)(react@19.2.5) + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.14)(react@19.2.5) + '@radix-ui/react-use-rect': 1.1.1(@types/react@19.2.14)(react@19.2.5) + '@radix-ui/react-use-size': 1.1.1(@types/react@19.2.14)(react@19.2.5) '@radix-ui/rect': 1.1.1 - react: 19.2.4 - react-dom: 19.2.4(react@19.2.4) + react: 19.2.5 + react-dom: 19.2.5(react@19.2.5) optionalDependencies: '@types/react': 19.2.14 '@types/react-dom': 19.2.3(@types/react@19.2.14) - '@radix-ui/react-portal@1.1.9(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': + '@radix-ui/react-portal@1.1.9(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)': dependencies: - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.14)(react@19.2.4) - react: 19.2.4 - react-dom: 19.2.4(react@19.2.4) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.5(react@19.2.5))(react@19.2.5) + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.14)(react@19.2.5) + react: 19.2.5 + react-dom: 19.2.5(react@19.2.5) optionalDependencies: '@types/react': 19.2.14 '@types/react-dom': 19.2.3(@types/react@19.2.14) - '@radix-ui/react-presence@1.1.5(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': + '@radix-ui/react-presence@1.1.5(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)': dependencies: - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.14)(react@19.2.4) - '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.14)(react@19.2.4) - react: 19.2.4 - react-dom: 19.2.4(react@19.2.4) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.14)(react@19.2.5) + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.14)(react@19.2.5) + react: 19.2.5 + react-dom: 19.2.5(react@19.2.5) optionalDependencies: '@types/react': 19.2.14 '@types/react-dom': 19.2.3(@types/react@19.2.14) - '@radix-ui/react-primitive@2.1.3(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': + '@radix-ui/react-primitive@2.1.3(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)': dependencies: - '@radix-ui/react-slot': 1.2.3(@types/react@19.2.14)(react@19.2.4) - react: 19.2.4 - react-dom: 19.2.4(react@19.2.4) + '@radix-ui/react-slot': 1.2.3(@types/react@19.2.14)(react@19.2.5) + react: 19.2.5 + react-dom: 19.2.5(react@19.2.5) optionalDependencies: '@types/react': 19.2.14 '@types/react-dom': 19.2.3(@types/react@19.2.14) - '@radix-ui/react-roving-focus@1.1.11(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': + '@radix-ui/react-roving-focus@1.1.11(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)': dependencies: '@radix-ui/primitive': 1.1.3 - '@radix-ui/react-collection': 1.1.7(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.14)(react@19.2.4) - '@radix-ui/react-context': 1.1.2(@types/react@19.2.14)(react@19.2.4) - '@radix-ui/react-direction': 1.1.1(@types/react@19.2.14)(react@19.2.4) - '@radix-ui/react-id': 1.1.1(@types/react@19.2.14)(react@19.2.4) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.2.14)(react@19.2.4) - '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.14)(react@19.2.4) - react: 19.2.4 - react-dom: 19.2.4(react@19.2.4) + '@radix-ui/react-collection': 1.1.7(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.5(react@19.2.5))(react@19.2.5) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.14)(react@19.2.5) + '@radix-ui/react-context': 1.1.2(@types/react@19.2.14)(react@19.2.5) + '@radix-ui/react-direction': 1.1.1(@types/react@19.2.14)(react@19.2.5) + '@radix-ui/react-id': 1.1.1(@types/react@19.2.14)(react@19.2.5) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.5(react@19.2.5))(react@19.2.5) + '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.2.14)(react@19.2.5) + '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.14)(react@19.2.5) + react: 19.2.5 + react-dom: 19.2.5(react@19.2.5) optionalDependencies: '@types/react': 19.2.14 '@types/react-dom': 19.2.3(@types/react@19.2.14) - '@radix-ui/react-scroll-area@1.2.10(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': + '@radix-ui/react-scroll-area@1.2.10(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)': dependencies: '@radix-ui/number': 1.1.1 '@radix-ui/primitive': 1.1.3 - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.14)(react@19.2.4) - '@radix-ui/react-context': 1.1.2(@types/react@19.2.14)(react@19.2.4) - '@radix-ui/react-direction': 1.1.1(@types/react@19.2.14)(react@19.2.4) - '@radix-ui/react-presence': 1.1.5(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.2.14)(react@19.2.4) - '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.14)(react@19.2.4) - react: 19.2.4 - react-dom: 19.2.4(react@19.2.4) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.14)(react@19.2.5) + '@radix-ui/react-context': 1.1.2(@types/react@19.2.14)(react@19.2.5) + '@radix-ui/react-direction': 1.1.1(@types/react@19.2.14)(react@19.2.5) + '@radix-ui/react-presence': 1.1.5(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.5(react@19.2.5))(react@19.2.5) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.5(react@19.2.5))(react@19.2.5) + '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.2.14)(react@19.2.5) + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.14)(react@19.2.5) + react: 19.2.5 + react-dom: 19.2.5(react@19.2.5) optionalDependencies: '@types/react': 19.2.14 '@types/react-dom': 19.2.3(@types/react@19.2.14) - '@radix-ui/react-slot@1.2.3(@types/react@19.2.14)(react@19.2.4)': + '@radix-ui/react-slot@1.2.3(@types/react@19.2.14)(react@19.2.5)': dependencies: - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.14)(react@19.2.4) - react: 19.2.4 + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.14)(react@19.2.5) + react: 19.2.5 optionalDependencies: '@types/react': 19.2.14 - '@radix-ui/react-slot@1.2.4(@types/react@19.2.14)(react@19.2.4)': + '@radix-ui/react-slot@1.2.4(@types/react@19.2.14)(react@19.2.5)': dependencies: - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.14)(react@19.2.4) - react: 19.2.4 + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.14)(react@19.2.5) + react: 19.2.5 optionalDependencies: '@types/react': 19.2.14 - '@radix-ui/react-tabs@1.1.13(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': + '@radix-ui/react-tabs@1.1.13(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)': dependencies: '@radix-ui/primitive': 1.1.3 - '@radix-ui/react-context': 1.1.2(@types/react@19.2.14)(react@19.2.4) - '@radix-ui/react-direction': 1.1.1(@types/react@19.2.14)(react@19.2.4) - '@radix-ui/react-id': 1.1.1(@types/react@19.2.14)(react@19.2.4) - '@radix-ui/react-presence': 1.1.5(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@radix-ui/react-roving-focus': 1.1.11(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.14)(react@19.2.4) - react: 19.2.4 - react-dom: 19.2.4(react@19.2.4) + '@radix-ui/react-context': 1.1.2(@types/react@19.2.14)(react@19.2.5) + '@radix-ui/react-direction': 1.1.1(@types/react@19.2.14)(react@19.2.5) + '@radix-ui/react-id': 1.1.1(@types/react@19.2.14)(react@19.2.5) + '@radix-ui/react-presence': 1.1.5(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.5(react@19.2.5))(react@19.2.5) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.5(react@19.2.5))(react@19.2.5) + '@radix-ui/react-roving-focus': 1.1.11(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.5(react@19.2.5))(react@19.2.5) + '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.14)(react@19.2.5) + react: 19.2.5 + react-dom: 19.2.5(react@19.2.5) optionalDependencies: '@types/react': 19.2.14 '@types/react-dom': 19.2.3(@types/react@19.2.14) - '@radix-ui/react-use-callback-ref@1.1.1(@types/react@19.2.14)(react@19.2.4)': + '@radix-ui/react-use-callback-ref@1.1.1(@types/react@19.2.14)(react@19.2.5)': dependencies: - react: 19.2.4 + react: 19.2.5 optionalDependencies: '@types/react': 19.2.14 - '@radix-ui/react-use-controllable-state@1.2.2(@types/react@19.2.14)(react@19.2.4)': + '@radix-ui/react-use-controllable-state@1.2.2(@types/react@19.2.14)(react@19.2.5)': dependencies: - '@radix-ui/react-use-effect-event': 0.0.2(@types/react@19.2.14)(react@19.2.4) - '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.14)(react@19.2.4) - react: 19.2.4 + '@radix-ui/react-use-effect-event': 0.0.2(@types/react@19.2.14)(react@19.2.5) + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.14)(react@19.2.5) + react: 19.2.5 optionalDependencies: '@types/react': 19.2.14 - '@radix-ui/react-use-effect-event@0.0.2(@types/react@19.2.14)(react@19.2.4)': + '@radix-ui/react-use-effect-event@0.0.2(@types/react@19.2.14)(react@19.2.5)': dependencies: - '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.14)(react@19.2.4) - react: 19.2.4 + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.14)(react@19.2.5) + react: 19.2.5 optionalDependencies: '@types/react': 19.2.14 - '@radix-ui/react-use-escape-keydown@1.1.1(@types/react@19.2.14)(react@19.2.4)': + '@radix-ui/react-use-escape-keydown@1.1.1(@types/react@19.2.14)(react@19.2.5)': dependencies: - '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.2.14)(react@19.2.4) - react: 19.2.4 + '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.2.14)(react@19.2.5) + react: 19.2.5 optionalDependencies: '@types/react': 19.2.14 - '@radix-ui/react-use-layout-effect@1.1.1(@types/react@19.2.14)(react@19.2.4)': + '@radix-ui/react-use-layout-effect@1.1.1(@types/react@19.2.14)(react@19.2.5)': dependencies: - react: 19.2.4 + react: 19.2.5 optionalDependencies: '@types/react': 19.2.14 - '@radix-ui/react-use-previous@1.1.1(@types/react@19.2.14)(react@19.2.4)': + '@radix-ui/react-use-previous@1.1.1(@types/react@19.2.14)(react@19.2.5)': dependencies: - react: 19.2.4 + react: 19.2.5 optionalDependencies: '@types/react': 19.2.14 - '@radix-ui/react-use-rect@1.1.1(@types/react@19.2.14)(react@19.2.4)': + '@radix-ui/react-use-rect@1.1.1(@types/react@19.2.14)(react@19.2.5)': dependencies: '@radix-ui/rect': 1.1.1 - react: 19.2.4 + react: 19.2.5 optionalDependencies: '@types/react': 19.2.14 - '@radix-ui/react-use-size@1.1.1(@types/react@19.2.14)(react@19.2.4)': + '@radix-ui/react-use-size@1.1.1(@types/react@19.2.14)(react@19.2.5)': dependencies: - '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.14)(react@19.2.4) - react: 19.2.4 + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.14)(react@19.2.5) + react: 19.2.5 optionalDependencies: '@types/react': 19.2.14 - '@radix-ui/react-visually-hidden@1.2.3(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': + '@radix-ui/react-visually-hidden@1.2.3(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)': dependencies: - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - react: 19.2.4 - react-dom: 19.2.4(react@19.2.4) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.5(react@19.2.5))(react@19.2.5) + react: 19.2.5 + react-dom: 19.2.5(react@19.2.5) optionalDependencies: '@types/react': 19.2.14 '@types/react-dom': 19.2.3(@types/react@19.2.14) '@radix-ui/rect@1.1.1': {} - '@rolldown/binding-android-arm64@1.0.0-rc.3': - optional: true - - '@rolldown/binding-darwin-arm64@1.0.0-rc.3': + '@rolldown/binding-android-arm64@1.0.0-rc.15': optional: true - '@rolldown/binding-darwin-x64@1.0.0-rc.3': + '@rolldown/binding-android-arm64@1.0.0-rc.16': optional: true - '@rolldown/binding-freebsd-x64@1.0.0-rc.3': + '@rolldown/binding-darwin-arm64@1.0.0-rc.15': optional: true - '@rolldown/binding-linux-arm-gnueabihf@1.0.0-rc.3': + '@rolldown/binding-darwin-arm64@1.0.0-rc.16': optional: true - '@rolldown/binding-linux-arm64-gnu@1.0.0-rc.3': + '@rolldown/binding-darwin-x64@1.0.0-rc.15': optional: true - '@rolldown/binding-linux-arm64-musl@1.0.0-rc.3': + '@rolldown/binding-darwin-x64@1.0.0-rc.16': optional: true - '@rolldown/binding-linux-x64-gnu@1.0.0-rc.3': + '@rolldown/binding-freebsd-x64@1.0.0-rc.15': optional: true - '@rolldown/binding-linux-x64-musl@1.0.0-rc.3': + '@rolldown/binding-freebsd-x64@1.0.0-rc.16': optional: true - '@rolldown/binding-openharmony-arm64@1.0.0-rc.3': + '@rolldown/binding-linux-arm-gnueabihf@1.0.0-rc.15': optional: true - '@rolldown/binding-wasm32-wasi@1.0.0-rc.3': - dependencies: - '@napi-rs/wasm-runtime': 1.1.1 + '@rolldown/binding-linux-arm-gnueabihf@1.0.0-rc.16': optional: true - '@rolldown/binding-win32-arm64-msvc@1.0.0-rc.3': + '@rolldown/binding-linux-arm64-gnu@1.0.0-rc.15': optional: true - '@rolldown/binding-win32-x64-msvc@1.0.0-rc.3': + '@rolldown/binding-linux-arm64-gnu@1.0.0-rc.16': optional: true - '@rolldown/pluginutils@1.0.0-rc.3': {} - - '@rollup/rollup-android-arm-eabi@4.54.0': + '@rolldown/binding-linux-arm64-musl@1.0.0-rc.15': optional: true - '@rollup/rollup-android-arm64@4.54.0': + '@rolldown/binding-linux-arm64-musl@1.0.0-rc.16': optional: true - '@rollup/rollup-darwin-arm64@4.54.0': + '@rolldown/binding-linux-ppc64-gnu@1.0.0-rc.15': optional: true - '@rollup/rollup-darwin-x64@4.54.0': + '@rolldown/binding-linux-ppc64-gnu@1.0.0-rc.16': optional: true - '@rollup/rollup-freebsd-arm64@4.54.0': + '@rolldown/binding-linux-s390x-gnu@1.0.0-rc.15': optional: true - '@rollup/rollup-freebsd-x64@4.54.0': + '@rolldown/binding-linux-s390x-gnu@1.0.0-rc.16': optional: true - '@rollup/rollup-linux-arm-gnueabihf@4.54.0': + '@rolldown/binding-linux-x64-gnu@1.0.0-rc.15': optional: true - '@rollup/rollup-linux-arm-musleabihf@4.54.0': + '@rolldown/binding-linux-x64-gnu@1.0.0-rc.16': optional: true - '@rollup/rollup-linux-arm64-gnu@4.54.0': + '@rolldown/binding-linux-x64-musl@1.0.0-rc.15': optional: true - '@rollup/rollup-linux-arm64-musl@4.54.0': + '@rolldown/binding-linux-x64-musl@1.0.0-rc.16': optional: true - '@rollup/rollup-linux-loong64-gnu@4.54.0': + '@rolldown/binding-openharmony-arm64@1.0.0-rc.15': optional: true - '@rollup/rollup-linux-ppc64-gnu@4.54.0': + '@rolldown/binding-openharmony-arm64@1.0.0-rc.16': optional: true - '@rollup/rollup-linux-riscv64-gnu@4.54.0': + '@rolldown/binding-wasm32-wasi@1.0.0-rc.15': + dependencies: + '@emnapi/core': 1.9.2 + '@emnapi/runtime': 1.9.2 + '@napi-rs/wasm-runtime': 1.1.4(@emnapi/core@1.9.2)(@emnapi/runtime@1.9.2) optional: true - '@rollup/rollup-linux-riscv64-musl@4.54.0': + '@rolldown/binding-wasm32-wasi@1.0.0-rc.16': + dependencies: + '@emnapi/core': 1.9.2 + '@emnapi/runtime': 1.9.2 + '@napi-rs/wasm-runtime': 1.1.4(@emnapi/core@1.9.2)(@emnapi/runtime@1.9.2) optional: true - '@rollup/rollup-linux-s390x-gnu@4.54.0': + '@rolldown/binding-win32-arm64-msvc@1.0.0-rc.15': optional: true - '@rollup/rollup-linux-x64-gnu@4.54.0': + '@rolldown/binding-win32-arm64-msvc@1.0.0-rc.16': optional: true - '@rollup/rollup-linux-x64-musl@4.54.0': + '@rolldown/binding-win32-x64-msvc@1.0.0-rc.15': optional: true - '@rollup/rollup-openharmony-arm64@4.54.0': + '@rolldown/binding-win32-x64-msvc@1.0.0-rc.16': optional: true - '@rollup/rollup-win32-arm64-msvc@4.54.0': - optional: true + '@rolldown/pluginutils@1.0.0-beta.40': {} - '@rollup/rollup-win32-ia32-msvc@4.54.0': - optional: true + '@rolldown/pluginutils@1.0.0-rc.15': {} - '@rollup/rollup-win32-x64-gnu@4.54.0': - optional: true + '@rolldown/pluginutils@1.0.0-rc.16': {} - '@rollup/rollup-win32-x64-msvc@4.54.0': - optional: true + '@rolldown/pluginutils@1.0.0-rc.7': {} '@sapphire/snowflake@3.5.5': {} @@ -6168,7 +6842,7 @@ snapshots: dependencies: '@shikijs/types': 4.0.2 '@shikijs/vscode-textmate': 10.0.2 - oniguruma-to-es: 4.3.4 + oniguruma-to-es: 4.3.5 '@shikijs/engine-oniguruma@4.0.2': dependencies: @@ -6185,15 +6859,6 @@ snapshots: '@shikijs/vscode-textmate': 10.0.2 '@types/hast': 3.0.4 - '@shikijs/rehype@4.0.2': - dependencies: - '@shikijs/types': 4.0.2 - '@types/hast': 3.0.4 - hast-util-to-string: 3.0.1 - shiki: 4.0.2 - unified: 11.0.5 - unist-util-visit: 5.1.0 - '@shikijs/themes@4.0.2': dependencies: '@shikijs/types': 4.0.2 @@ -6210,9 +6875,77 @@ snapshots: '@shikijs/vscode-textmate@10.0.2': {} - '@sindresorhus/is@7.2.0': {} + '@sindresorhus/is@7.2.0': {} + + '@snazzah/davey-android-arm-eabi@0.1.11': + optional: true + + '@snazzah/davey-android-arm64@0.1.11': + optional: true + + '@snazzah/davey-darwin-arm64@0.1.11': + optional: true + + '@snazzah/davey-darwin-x64@0.1.11': + optional: true + + '@snazzah/davey-freebsd-x64@0.1.11': + optional: true + + '@snazzah/davey-linux-arm-gnueabihf@0.1.11': + optional: true + + '@snazzah/davey-linux-arm64-gnu@0.1.11': + optional: true + + '@snazzah/davey-linux-arm64-musl@0.1.11': + optional: true + + '@snazzah/davey-linux-x64-gnu@0.1.11': + optional: true + + '@snazzah/davey-linux-x64-musl@0.1.11': + optional: true + + '@snazzah/davey-wasm32-wasi@0.1.11(@emnapi/core@1.9.2)(@emnapi/runtime@1.9.2)': + dependencies: + '@napi-rs/wasm-runtime': 1.1.4(@emnapi/core@1.9.2)(@emnapi/runtime@1.9.2) + transitivePeerDependencies: + - '@emnapi/core' + - '@emnapi/runtime' + optional: true + + '@snazzah/davey-win32-arm64-msvc@0.1.11': + optional: true + + '@snazzah/davey-win32-ia32-msvc@0.1.11': + optional: true + + '@snazzah/davey-win32-x64-msvc@0.1.11': + optional: true + + '@snazzah/davey@0.1.11(@emnapi/core@1.9.2)(@emnapi/runtime@1.9.2)': + optionalDependencies: + '@snazzah/davey-android-arm-eabi': 0.1.11 + '@snazzah/davey-android-arm64': 0.1.11 + '@snazzah/davey-darwin-arm64': 0.1.11 + '@snazzah/davey-darwin-x64': 0.1.11 + '@snazzah/davey-freebsd-x64': 0.1.11 + '@snazzah/davey-linux-arm-gnueabihf': 0.1.11 + '@snazzah/davey-linux-arm64-gnu': 0.1.11 + '@snazzah/davey-linux-arm64-musl': 0.1.11 + '@snazzah/davey-linux-x64-gnu': 0.1.11 + '@snazzah/davey-linux-x64-musl': 0.1.11 + '@snazzah/davey-wasm32-wasi': 0.1.11(@emnapi/core@1.9.2)(@emnapi/runtime@1.9.2) + '@snazzah/davey-win32-arm64-msvc': 0.1.11 + '@snazzah/davey-win32-ia32-msvc': 0.1.11 + '@snazzah/davey-win32-x64-msvc': 0.1.11 + transitivePeerDependencies: + - '@emnapi/core' + - '@emnapi/runtime' + optional: true - '@speed-highlight/core@1.2.12': {} + '@speed-highlight/core@1.2.15': {} '@standard-schema/spec@1.1.0': {} @@ -6220,74 +6953,74 @@ snapshots: dependencies: tslib: 2.8.1 - '@tailwindcss/node@4.2.1': + '@tailwindcss/node@4.2.2': dependencies: '@jridgewell/remapping': 2.3.5 - enhanced-resolve: 5.20.0 + enhanced-resolve: 5.20.1 jiti: 2.6.1 - lightningcss: 1.31.1 + lightningcss: 1.32.0 magic-string: 0.30.21 source-map-js: 1.2.1 - tailwindcss: 4.2.1 + tailwindcss: 4.2.2 - '@tailwindcss/oxide-android-arm64@4.2.1': + '@tailwindcss/oxide-android-arm64@4.2.2': optional: true - '@tailwindcss/oxide-darwin-arm64@4.2.1': + '@tailwindcss/oxide-darwin-arm64@4.2.2': optional: true - '@tailwindcss/oxide-darwin-x64@4.2.1': + '@tailwindcss/oxide-darwin-x64@4.2.2': optional: true - '@tailwindcss/oxide-freebsd-x64@4.2.1': + '@tailwindcss/oxide-freebsd-x64@4.2.2': optional: true - '@tailwindcss/oxide-linux-arm-gnueabihf@4.2.1': + '@tailwindcss/oxide-linux-arm-gnueabihf@4.2.2': optional: true - '@tailwindcss/oxide-linux-arm64-gnu@4.2.1': + '@tailwindcss/oxide-linux-arm64-gnu@4.2.2': optional: true - '@tailwindcss/oxide-linux-arm64-musl@4.2.1': + '@tailwindcss/oxide-linux-arm64-musl@4.2.2': optional: true - '@tailwindcss/oxide-linux-x64-gnu@4.2.1': + '@tailwindcss/oxide-linux-x64-gnu@4.2.2': optional: true - '@tailwindcss/oxide-linux-x64-musl@4.2.1': + '@tailwindcss/oxide-linux-x64-musl@4.2.2': optional: true - '@tailwindcss/oxide-wasm32-wasi@4.2.1': + '@tailwindcss/oxide-wasm32-wasi@4.2.2': optional: true - '@tailwindcss/oxide-win32-arm64-msvc@4.2.1': + '@tailwindcss/oxide-win32-arm64-msvc@4.2.2': optional: true - '@tailwindcss/oxide-win32-x64-msvc@4.2.1': + '@tailwindcss/oxide-win32-x64-msvc@4.2.2': optional: true - '@tailwindcss/oxide@4.2.1': + '@tailwindcss/oxide@4.2.2': optionalDependencies: - '@tailwindcss/oxide-android-arm64': 4.2.1 - '@tailwindcss/oxide-darwin-arm64': 4.2.1 - '@tailwindcss/oxide-darwin-x64': 4.2.1 - '@tailwindcss/oxide-freebsd-x64': 4.2.1 - '@tailwindcss/oxide-linux-arm-gnueabihf': 4.2.1 - '@tailwindcss/oxide-linux-arm64-gnu': 4.2.1 - '@tailwindcss/oxide-linux-arm64-musl': 4.2.1 - '@tailwindcss/oxide-linux-x64-gnu': 4.2.1 - '@tailwindcss/oxide-linux-x64-musl': 4.2.1 - '@tailwindcss/oxide-wasm32-wasi': 4.2.1 - '@tailwindcss/oxide-win32-arm64-msvc': 4.2.1 - '@tailwindcss/oxide-win32-x64-msvc': 4.2.1 - - '@tailwindcss/postcss@4.2.1': + '@tailwindcss/oxide-android-arm64': 4.2.2 + '@tailwindcss/oxide-darwin-arm64': 4.2.2 + '@tailwindcss/oxide-darwin-x64': 4.2.2 + '@tailwindcss/oxide-freebsd-x64': 4.2.2 + '@tailwindcss/oxide-linux-arm-gnueabihf': 4.2.2 + '@tailwindcss/oxide-linux-arm64-gnu': 4.2.2 + '@tailwindcss/oxide-linux-arm64-musl': 4.2.2 + '@tailwindcss/oxide-linux-x64-gnu': 4.2.2 + '@tailwindcss/oxide-linux-x64-musl': 4.2.2 + '@tailwindcss/oxide-wasm32-wasi': 4.2.2 + '@tailwindcss/oxide-win32-arm64-msvc': 4.2.2 + '@tailwindcss/oxide-win32-x64-msvc': 4.2.2 + + '@tailwindcss/postcss@4.2.2': dependencies: '@alloc/quick-lru': 5.2.0 - '@tailwindcss/node': 4.2.1 - '@tailwindcss/oxide': 4.2.1 - postcss: 8.5.8 - tailwindcss: 4.2.1 + '@tailwindcss/node': 4.2.2 + '@tailwindcss/oxide': 4.2.2 + postcss: 8.5.10 + tailwindcss: 4.2.2 '@takumi-rs/core-darwin-arm64@0.71.7': optional: true @@ -6334,48 +7067,245 @@ snapshots: '@takumi-rs/wasm@0.71.7': {} - '@tanstack/history@1.161.4': - optional: true + '@tanstack/history@1.161.6': {} - '@tanstack/react-router@1.166.7(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': + '@tanstack/react-router-devtools@1.166.13(@tanstack/react-router@1.168.22(react-dom@19.2.5(react@19.2.5))(react@19.2.5))(@tanstack/router-core@1.168.15)(csstype@3.2.3)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)': dependencies: - '@tanstack/history': 1.161.4 - '@tanstack/react-store': 0.9.2(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@tanstack/router-core': 1.166.7 - isbot: 5.1.36 - react: 19.2.4 - react-dom: 19.2.4(react@19.2.4) - tiny-invariant: 1.3.3 - tiny-warning: 1.0.3 - optional: true + '@tanstack/react-router': 1.168.22(react-dom@19.2.5(react@19.2.5))(react@19.2.5) + '@tanstack/router-devtools-core': 1.167.3(@tanstack/router-core@1.168.15)(csstype@3.2.3) + react: 19.2.5 + react-dom: 19.2.5(react@19.2.5) + optionalDependencies: + '@tanstack/router-core': 1.168.15 + transitivePeerDependencies: + - csstype + + '@tanstack/react-router@1.168.22(react-dom@19.2.5(react@19.2.5))(react@19.2.5)': + dependencies: + '@tanstack/history': 1.161.6 + '@tanstack/react-store': 0.9.3(react-dom@19.2.5(react@19.2.5))(react@19.2.5) + '@tanstack/router-core': 1.168.15 + isbot: 5.1.38 + react: 19.2.5 + react-dom: 19.2.5(react@19.2.5) + + '@tanstack/react-start-client@1.166.39(react-dom@19.2.5(react@19.2.5))(react@19.2.5)': + dependencies: + '@tanstack/react-router': 1.168.22(react-dom@19.2.5(react@19.2.5))(react@19.2.5) + '@tanstack/router-core': 1.168.15 + '@tanstack/start-client-core': 1.167.17 + react: 19.2.5 + react-dom: 19.2.5(react@19.2.5) + + '@tanstack/react-start-rsc@0.0.20(react-dom@19.2.5(react@19.2.5))(react@19.2.5)(vite@8.0.8(@types/node@25.6.0)(esbuild@0.28.0)(jiti@2.6.1)(tsx@4.21.0))': + dependencies: + '@tanstack/react-router': 1.168.22(react-dom@19.2.5(react@19.2.5))(react@19.2.5) + '@tanstack/react-start-server': 1.166.40(react-dom@19.2.5(react@19.2.5))(react@19.2.5) + '@tanstack/router-core': 1.168.15 + '@tanstack/router-utils': 1.161.6 + '@tanstack/start-client-core': 1.167.17 + '@tanstack/start-fn-stubs': 1.161.6 + '@tanstack/start-plugin-core': 1.167.35(@tanstack/react-router@1.168.22(react-dom@19.2.5(react@19.2.5))(react@19.2.5))(vite@8.0.8(@types/node@25.6.0)(esbuild@0.28.0)(jiti@2.6.1)(tsx@4.21.0)) + '@tanstack/start-server-core': 1.167.19 + '@tanstack/start-storage-context': 1.166.29 + pathe: 2.0.3 + react: 19.2.5 + react-dom: 19.2.5(react@19.2.5) + transitivePeerDependencies: + - '@rsbuild/core' + - crossws + - supports-color + - vite + - vite-plugin-solid + - webpack + + '@tanstack/react-start-server@1.166.40(react-dom@19.2.5(react@19.2.5))(react@19.2.5)': + dependencies: + '@tanstack/history': 1.161.6 + '@tanstack/react-router': 1.168.22(react-dom@19.2.5(react@19.2.5))(react@19.2.5) + '@tanstack/router-core': 1.168.15 + '@tanstack/start-client-core': 1.167.17 + '@tanstack/start-server-core': 1.167.19 + react: 19.2.5 + react-dom: 19.2.5(react@19.2.5) + transitivePeerDependencies: + - crossws + + '@tanstack/react-start@1.167.41(react-dom@19.2.5(react@19.2.5))(react@19.2.5)(vite@8.0.8(@types/node@25.6.0)(esbuild@0.28.0)(jiti@2.6.1)(tsx@4.21.0))': + dependencies: + '@tanstack/react-router': 1.168.22(react-dom@19.2.5(react@19.2.5))(react@19.2.5) + '@tanstack/react-start-client': 1.166.39(react-dom@19.2.5(react@19.2.5))(react@19.2.5) + '@tanstack/react-start-rsc': 0.0.20(react-dom@19.2.5(react@19.2.5))(react@19.2.5)(vite@8.0.8(@types/node@25.6.0)(esbuild@0.28.0)(jiti@2.6.1)(tsx@4.21.0)) + '@tanstack/react-start-server': 1.166.40(react-dom@19.2.5(react@19.2.5))(react@19.2.5) + '@tanstack/router-utils': 1.161.6 + '@tanstack/start-client-core': 1.167.17 + '@tanstack/start-plugin-core': 1.167.35(@tanstack/react-router@1.168.22(react-dom@19.2.5(react@19.2.5))(react@19.2.5))(vite@8.0.8(@types/node@25.6.0)(esbuild@0.28.0)(jiti@2.6.1)(tsx@4.21.0)) + '@tanstack/start-server-core': 1.167.19 + pathe: 2.0.3 + react: 19.2.5 + react-dom: 19.2.5(react@19.2.5) + vite: 8.0.8(@types/node@25.6.0)(esbuild@0.28.0)(jiti@2.6.1)(tsx@4.21.0) + transitivePeerDependencies: + - '@rsbuild/core' + - crossws + - supports-color + - vite-plugin-solid + - webpack - '@tanstack/react-store@0.9.2(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': + '@tanstack/react-store@0.9.3(react-dom@19.2.5(react@19.2.5))(react@19.2.5)': dependencies: - '@tanstack/store': 0.9.2 - react: 19.2.4 - react-dom: 19.2.4(react@19.2.4) - use-sync-external-store: 1.6.0(react@19.2.4) - optional: true + '@tanstack/store': 0.9.3 + react: 19.2.5 + react-dom: 19.2.5(react@19.2.5) + use-sync-external-store: 1.6.0(react@19.2.5) - '@tanstack/router-core@1.166.7': + '@tanstack/router-core@1.168.15': dependencies: - '@tanstack/history': 1.161.4 - '@tanstack/store': 0.9.2 - cookie-es: 2.0.0 - seroval: 1.5.1 - seroval-plugins: 1.5.1(seroval@1.5.1) - tiny-invariant: 1.3.3 - tiny-warning: 1.0.3 - optional: true + '@tanstack/history': 1.161.6 + cookie-es: 3.1.1 + seroval: 1.5.2 + seroval-plugins: 1.5.2(seroval@1.5.2) - '@tanstack/store@0.9.2': - optional: true + '@tanstack/router-devtools-core@1.167.3(@tanstack/router-core@1.168.15)(csstype@3.2.3)': + dependencies: + '@tanstack/router-core': 1.168.15 + clsx: 2.1.1 + goober: 2.1.18(csstype@3.2.3) + optionalDependencies: + csstype: 3.2.3 + + '@tanstack/router-generator@1.166.32': + dependencies: + '@babel/types': 7.29.0 + '@tanstack/router-core': 1.168.15 + '@tanstack/router-utils': 1.161.6 + '@tanstack/virtual-file-routes': 1.161.7 + magic-string: 0.30.21 + prettier: 3.8.3 + tsx: 4.21.0 + zod: 3.25.76 + transitivePeerDependencies: + - supports-color + + '@tanstack/router-plugin@1.167.22(@tanstack/react-router@1.168.22(react-dom@19.2.5(react@19.2.5))(react@19.2.5))(vite@8.0.8(@types/node@25.6.0)(esbuild@0.28.0)(jiti@2.6.1)(tsx@4.21.0))': + dependencies: + '@babel/core': 7.29.0 + '@babel/plugin-syntax-jsx': 7.28.6(@babel/core@7.29.0) + '@babel/plugin-syntax-typescript': 7.28.6(@babel/core@7.29.0) + '@babel/template': 7.28.6 + '@babel/traverse': 7.29.0 + '@babel/types': 7.29.0 + '@tanstack/router-core': 1.168.15 + '@tanstack/router-generator': 1.166.32 + '@tanstack/router-utils': 1.161.6 + '@tanstack/virtual-file-routes': 1.161.7 + chokidar: 3.6.0 + unplugin: 2.3.11 + zod: 3.25.76 + optionalDependencies: + '@tanstack/react-router': 1.168.22(react-dom@19.2.5(react@19.2.5))(react@19.2.5) + vite: 8.0.8(@types/node@25.6.0)(esbuild@0.28.0)(jiti@2.6.1)(tsx@4.21.0) + transitivePeerDependencies: + - supports-color + + '@tanstack/router-utils@1.161.6': + dependencies: + '@babel/core': 7.29.0 + '@babel/generator': 7.29.1 + '@babel/parser': 7.29.2 + '@babel/types': 7.29.0 + ansis: 4.2.0 + babel-dead-code-elimination: 1.0.12 + diff: 8.0.4 + pathe: 2.0.3 + tinyglobby: 0.2.16 + transitivePeerDependencies: + - supports-color + + '@tanstack/start-client-core@1.167.17': + dependencies: + '@tanstack/router-core': 1.168.15 + '@tanstack/start-fn-stubs': 1.161.6 + '@tanstack/start-storage-context': 1.166.29 + seroval: 1.5.2 + + '@tanstack/start-fn-stubs@1.161.6': {} + + '@tanstack/start-plugin-core@1.167.35(@tanstack/react-router@1.168.22(react-dom@19.2.5(react@19.2.5))(react@19.2.5))(vite@8.0.8(@types/node@25.6.0)(esbuild@0.28.0)(jiti@2.6.1)(tsx@4.21.0))': + dependencies: + '@babel/code-frame': 7.27.1 + '@babel/core': 7.29.0 + '@babel/types': 7.29.0 + '@rolldown/pluginutils': 1.0.0-beta.40 + '@tanstack/router-core': 1.168.15 + '@tanstack/router-generator': 1.166.32 + '@tanstack/router-plugin': 1.167.22(@tanstack/react-router@1.168.22(react-dom@19.2.5(react@19.2.5))(react@19.2.5))(vite@8.0.8(@types/node@25.6.0)(esbuild@0.28.0)(jiti@2.6.1)(tsx@4.21.0)) + '@tanstack/router-utils': 1.161.6 + '@tanstack/start-client-core': 1.167.17 + '@tanstack/start-server-core': 1.167.19 + cheerio: 1.2.0 + exsolve: 1.0.8 + pathe: 2.0.3 + picomatch: 4.0.4 + seroval: 1.5.2 + source-map: 0.7.6 + srvx: 0.11.15 + tinyglobby: 0.2.16 + ufo: 1.6.3 + vite: 8.0.8(@types/node@25.6.0)(esbuild@0.28.0)(jiti@2.6.1)(tsx@4.21.0) + vitefu: 1.1.3(vite@8.0.8(@types/node@25.6.0)(esbuild@0.28.0)(jiti@2.6.1)(tsx@4.21.0)) + xmlbuilder2: 4.0.3 + zod: 3.25.76 + transitivePeerDependencies: + - '@rsbuild/core' + - '@tanstack/react-router' + - crossws + - supports-color + - vite-plugin-solid + - webpack + + '@tanstack/start-server-core@1.167.19': + dependencies: + '@tanstack/history': 1.161.6 + '@tanstack/router-core': 1.168.15 + '@tanstack/start-client-core': 1.167.17 + '@tanstack/start-storage-context': 1.166.29 + h3-v2: h3@2.0.1-rc.20 + seroval: 1.5.2 + transitivePeerDependencies: + - crossws - '@ts-morph/common@0.28.1': + '@tanstack/start-storage-context@1.166.29': dependencies: - minimatch: 10.2.4 + '@tanstack/router-core': 1.168.15 + + '@tanstack/store@0.9.3': {} + + '@tanstack/virtual-file-routes@1.161.7': {} + + '@ts-morph/common@0.29.0': + dependencies: + minimatch: 10.2.5 path-browserify: 1.0.1 - tinyglobby: 0.2.15 + tinyglobby: 0.2.16 + + '@turbo/darwin-64@2.9.6': + optional: true + + '@turbo/darwin-arm64@2.9.6': + optional: true + + '@turbo/linux-64@2.9.6': + optional: true + + '@turbo/linux-arm64@2.9.6': + optional: true + + '@turbo/windows-64@2.9.6': + optional: true + + '@turbo/windows-arm64@2.9.6': + optional: true '@tybys/wasm-util@0.10.1': dependencies: @@ -6384,7 +7314,7 @@ snapshots: '@types/babel__core@7.20.5': dependencies: - '@babel/parser': 7.29.0 + '@babel/parser': 7.29.2 '@babel/types': 7.29.0 '@types/babel__generator': 7.27.0 '@types/babel__template': 7.4.4 @@ -6394,18 +7324,22 @@ snapshots: dependencies: '@babel/types': 7.29.0 + '@types/babel__parser@7.1.5': + dependencies: + '@babel/parser': 7.29.2 + '@types/babel__template@7.4.4': dependencies: - '@babel/parser': 7.29.0 + '@babel/parser': 7.29.2 '@babel/types': 7.29.0 '@types/babel__traverse@7.28.0': dependencies: '@babel/types': 7.29.0 - '@types/bun@1.3.6': + '@types/bun@1.3.11': dependencies: - bun-types: 1.3.6 + bun-types: 1.3.11 optional: true '@types/chai@5.2.3': @@ -6530,7 +7464,7 @@ snapshots: '@types/d3-transition': 3.0.9 '@types/d3-zoom': 3.0.8 - '@types/debug@4.1.12': + '@types/debug@4.1.13': dependencies: '@types/ms': 2.1.0 @@ -6560,24 +7494,16 @@ snapshots: '@types/node@12.20.55': {} - '@types/node@25.2.3': - dependencies: - undici-types: 7.16.0 - - '@types/node@25.4.0': + '@types/node@25.6.0': dependencies: - undici-types: 7.18.2 + undici-types: 7.19.2 - '@types/picomatch@4.0.2': {} + '@types/picomatch@4.0.3': {} '@types/react-dom@19.2.3(@types/react@19.2.14)': dependencies: '@types/react': 19.2.14 - '@types/react@19.2.13': - dependencies: - csstype: 3.2.3 - '@types/react@19.2.14': dependencies: csstype: 3.2.3 @@ -6591,7 +7517,7 @@ snapshots: '@types/ws@8.18.1': dependencies: - '@types/node': 25.4.0 + '@types/node': 25.6.0 optional: true '@ungap/structured-clone@1.3.0': {} @@ -6601,58 +7527,65 @@ snapshots: d3-selection: 3.0.0 d3-transition: 3.0.1(d3-selection@3.0.0) - '@vitest/coverage-v8@4.0.18(vitest@4.0.18(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.31.1)(tsx@4.21.0)(yaml@2.8.2))': + '@vitejs/plugin-react@6.0.1(vite@8.0.8(@types/node@25.6.0)(esbuild@0.28.0)(jiti@2.6.1)(tsx@4.21.0))': + dependencies: + '@rolldown/pluginutils': 1.0.0-rc.7 + vite: 8.0.8(@types/node@25.6.0)(esbuild@0.28.0)(jiti@2.6.1)(tsx@4.21.0) + + '@vitest/coverage-v8@4.1.4(vitest@4.1.4)': dependencies: '@bcoe/v8-coverage': 1.0.2 - '@vitest/utils': 4.0.18 - ast-v8-to-istanbul: 0.3.10 + '@vitest/utils': 4.1.4 + ast-v8-to-istanbul: 1.0.0 istanbul-lib-coverage: 3.2.2 istanbul-lib-report: 3.0.1 istanbul-reports: 3.2.0 - magicast: 0.5.1 + magicast: 0.5.2 obug: 2.1.1 - std-env: 3.10.0 - tinyrainbow: 3.0.3 - vitest: 4.0.18(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.31.1)(tsx@4.21.0)(yaml@2.8.2) + std-env: 4.0.0 + tinyrainbow: 3.1.0 + vitest: 4.1.4(@types/node@25.6.0)(@vitest/coverage-v8@4.1.4)(vite@8.0.8(@types/node@25.6.0)(esbuild@0.28.0)(jiti@2.6.1)(tsx@4.21.0)) - '@vitest/expect@4.0.18': + '@vitest/expect@4.1.4': dependencies: '@standard-schema/spec': 1.1.0 '@types/chai': 5.2.3 - '@vitest/spy': 4.0.18 - '@vitest/utils': 4.0.18 + '@vitest/spy': 4.1.4 + '@vitest/utils': 4.1.4 chai: 6.2.2 - tinyrainbow: 3.0.3 + tinyrainbow: 3.1.0 - '@vitest/mocker@4.0.18(vite@7.3.0(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.31.1)(tsx@4.21.0)(yaml@2.8.2))': + '@vitest/mocker@4.1.4(vite@8.0.8(@types/node@25.6.0)(esbuild@0.28.0)(jiti@2.6.1)(tsx@4.21.0))': dependencies: - '@vitest/spy': 4.0.18 + '@vitest/spy': 4.1.4 estree-walker: 3.0.3 magic-string: 0.30.21 optionalDependencies: - vite: 7.3.0(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.31.1)(tsx@4.21.0)(yaml@2.8.2) + vite: 8.0.8(@types/node@25.6.0)(esbuild@0.28.0)(jiti@2.6.1)(tsx@4.21.0) - '@vitest/pretty-format@4.0.18': + '@vitest/pretty-format@4.1.4': dependencies: - tinyrainbow: 3.0.3 + tinyrainbow: 3.1.0 - '@vitest/runner@4.0.18': + '@vitest/runner@4.1.4': dependencies: - '@vitest/utils': 4.0.18 + '@vitest/utils': 4.1.4 pathe: 2.0.3 - '@vitest/snapshot@4.0.18': + '@vitest/snapshot@4.1.4': dependencies: - '@vitest/pretty-format': 4.0.18 + '@vitest/pretty-format': 4.1.4 + '@vitest/utils': 4.1.4 magic-string: 0.30.21 pathe: 2.0.3 - '@vitest/spy@4.0.18': {} + '@vitest/spy@4.1.4': {} - '@vitest/utils@4.0.18': + '@vitest/utils@4.1.4': dependencies: - '@vitest/pretty-format': 4.0.18 - tinyrainbow: 3.0.3 + '@vitest/pretty-format': 4.1.4 + convert-source-map: 2.0.0 + tinyrainbow: 3.1.0 acorn-jsx@5.3.2(acorn@8.16.0): dependencies: @@ -6670,6 +7603,11 @@ snapshots: ansis@4.2.0: {} + anymatch@3.1.3: + dependencies: + normalize-path: 3.0.0 + picomatch: 2.3.2 + argparse@1.0.10: dependencies: sprintf-js: 1.0.3 @@ -6686,25 +7624,34 @@ snapshots: ast-kit@3.0.0-beta.1: dependencies: - '@babel/parser': 8.0.0-rc.1 + '@babel/parser': 8.0.0-rc.3 estree-walker: 3.0.3 pathe: 2.0.3 - ast-v8-to-istanbul@0.3.10: + ast-v8-to-istanbul@1.0.0: dependencies: '@jridgewell/trace-mapping': 0.3.31 estree-walker: 3.0.3 - js-tokens: 9.0.1 + js-tokens: 10.0.0 astring@1.9.0: {} - bail@2.0.2: {} + babel-dead-code-elimination@1.0.12: + dependencies: + '@babel/core': 7.29.0 + '@babel/parser': 7.29.2 + '@babel/traverse': 7.29.0 + '@babel/types': 7.29.0 + transitivePeerDependencies: + - supports-color - balanced-match@1.0.2: {} + bail@2.0.2: {} balanced-match@4.0.4: {} - baseline-browser-mapping@2.9.11: {} + baseline-browser-mapping@2.10.13: {} + + baseline-browser-mapping@2.10.19: {} beautiful-mermaid@1.1.3: dependencies: @@ -6715,15 +7662,15 @@ snapshots: dependencies: is-windows: 1.0.2 + binary-extensions@2.3.0: {} + birpc@4.0.0: {} blake3-wasm@2.1.5: {} - brace-expansion@2.0.2: - dependencies: - balanced-match: 1.0.2 + boolbase@1.0.0: {} - brace-expansion@5.0.4: + brace-expansion@5.0.5: dependencies: balanced-match: 4.0.4 @@ -6731,22 +7678,24 @@ snapshots: dependencies: fill-range: 7.1.1 - browserslist@4.28.1: + browserslist@4.28.2: dependencies: - baseline-browser-mapping: 2.9.11 - caniuse-lite: 1.0.30001761 - electron-to-chromium: 1.5.267 - node-releases: 2.0.27 - update-browserslist-db: 1.2.3(browserslist@4.28.1) + baseline-browser-mapping: 2.10.13 + caniuse-lite: 1.0.30001784 + electron-to-chromium: 1.5.331 + node-releases: 2.0.37 + update-browserslist-db: 1.2.3(browserslist@4.28.2) - bun-types@1.3.6: + bun-types@1.3.11: dependencies: - '@types/node': 25.4.0 + '@types/node': 25.6.0 optional: true - cac@6.7.14: {} + cac@7.0.0: {} - caniuse-lite@1.0.30001761: {} + caniuse-lite@1.0.30001784: {} + + caniuse-lite@1.0.30001788: {} ccount@2.0.1: {} @@ -6767,10 +7716,33 @@ snapshots: chardet@2.1.1: {} + cheerio-select@2.1.0: + dependencies: + boolbase: 1.0.0 + css-select: 5.2.2 + css-what: 6.2.2 + domelementtype: 2.3.0 + domhandler: 5.0.3 + domutils: 3.2.2 + + cheerio@1.2.0: + dependencies: + cheerio-select: 2.1.0 + dom-serializer: 2.0.0 + domhandler: 5.0.3 + domutils: 3.2.2 + encoding-sniffer: 0.2.1 + htmlparser2: 10.1.0 + parse5: 7.3.0 + parse5-htmlparser2-tree-adapter: 7.1.0 + parse5-parser-stream: 7.1.2 + undici: 7.25.0 + whatwg-mimetype: 4.0.0 + chevrotain-allstar@0.3.1(chevrotain@11.1.2): dependencies: chevrotain: 11.1.2 - lodash-es: 4.17.23 + lodash-es: 4.18.1 chevrotain@11.1.2: dependencies: @@ -6781,6 +7753,18 @@ snapshots: '@chevrotain/utils': 11.1.2 lodash-es: 4.17.23 + chokidar@3.6.0: + dependencies: + anymatch: 3.1.3 + braces: 3.0.3 + glob-parent: 5.1.2 + is-binary-path: 2.1.0 + is-glob: 4.0.3 + normalize-path: 3.0.0 + readdirp: 3.6.0 + optionalDependencies: + fsevents: 2.3.3 + chokidar@5.0.0: dependencies: readdirp: 5.0.0 @@ -6817,8 +7801,7 @@ snapshots: convert-source-map@2.0.0: {} - cookie-es@2.0.0: - optional: true + cookie-es@3.1.1: {} cookie@1.1.1: {} @@ -6836,7 +7819,15 @@ snapshots: shebang-command: 2.0.0 which: 2.0.2 - cssesc@3.0.0: {} + css-select@5.2.2: + dependencies: + boolbase: 1.0.0 + css-what: 6.2.2 + domhandler: 5.0.3 + domutils: 3.2.2 + nth-check: 2.1.1 + + css-what@6.2.2: {} csstype@3.2.3: {} @@ -6882,7 +7873,7 @@ snapshots: d3-delaunay@6.0.4: dependencies: - delaunator: 5.0.1 + delaunator: 5.1.0 d3-dispatch@3.0.1: {} @@ -7022,9 +8013,9 @@ snapshots: dagre-d3-es@7.0.14: dependencies: d3: 7.9.0 - lodash-es: 4.17.23 + lodash-es: 4.18.1 - dayjs@1.11.19: {} + dayjs@1.11.20: {} debug@4.4.3: dependencies: @@ -7034,11 +8025,11 @@ snapshots: dependencies: character-entities: 2.0.2 - defu@6.1.4: {} + defu@6.1.7: {} - delaunator@5.0.1: + delaunator@5.1.0: dependencies: - robust-predicates: 3.0.2 + robust-predicates: 3.0.3 dequal@2.0.3: {} @@ -7052,41 +8043,68 @@ snapshots: dependencies: dequal: 2.0.3 + diff@8.0.4: {} + dir-glob@3.0.1: dependencies: path-type: 4.0.0 - discord-api-types@0.38.37: {} + discord-api-types@0.38.45: {} + + dom-serializer@2.0.0: + dependencies: + domelementtype: 2.3.0 + domhandler: 5.0.3 + entities: 4.5.0 + + domelementtype@2.3.0: {} + + domhandler@5.0.3: + dependencies: + domelementtype: 2.3.0 dompurify@3.3.3: optionalDependencies: '@types/trusted-types': 2.0.7 + domutils@3.2.2: + dependencies: + dom-serializer: 2.0.0 + domelementtype: 2.3.0 + domhandler: 5.0.3 + dts-resolver@2.1.3: {} - electron-to-chromium@1.5.267: {} + electron-to-chromium@1.5.331: {} elkjs@0.11.1: {} empathic@2.0.0: {} - enhanced-resolve@5.20.0: + encoding-sniffer@0.2.1: + dependencies: + iconv-lite: 0.6.3 + whatwg-encoding: 3.1.1 + + enhanced-resolve@5.20.1: dependencies: graceful-fs: 4.2.11 - tapable: 2.3.0 + tapable: 2.3.2 enquirer@2.4.1: dependencies: ansi-colors: 4.1.3 strip-ansi: 6.0.1 + entities@4.5.0: {} + entities@6.0.1: {} entities@7.0.1: {} error-stack-parser-es@1.0.5: {} - es-module-lexer@1.7.0: {} + es-module-lexer@2.0.0: {} esast-util-from-estree@2.0.0: dependencies: @@ -7102,35 +8120,6 @@ snapshots: esast-util-from-estree: 2.0.0 vfile-message: 4.0.3 - esbuild@0.27.2: - optionalDependencies: - '@esbuild/aix-ppc64': 0.27.2 - '@esbuild/android-arm': 0.27.2 - '@esbuild/android-arm64': 0.27.2 - '@esbuild/android-x64': 0.27.2 - '@esbuild/darwin-arm64': 0.27.2 - '@esbuild/darwin-x64': 0.27.2 - '@esbuild/freebsd-arm64': 0.27.2 - '@esbuild/freebsd-x64': 0.27.2 - '@esbuild/linux-arm': 0.27.2 - '@esbuild/linux-arm64': 0.27.2 - '@esbuild/linux-ia32': 0.27.2 - '@esbuild/linux-loong64': 0.27.2 - '@esbuild/linux-mips64el': 0.27.2 - '@esbuild/linux-ppc64': 0.27.2 - '@esbuild/linux-riscv64': 0.27.2 - '@esbuild/linux-s390x': 0.27.2 - '@esbuild/linux-x64': 0.27.2 - '@esbuild/netbsd-arm64': 0.27.2 - '@esbuild/netbsd-x64': 0.27.2 - '@esbuild/openbsd-arm64': 0.27.2 - '@esbuild/openbsd-x64': 0.27.2 - '@esbuild/openharmony-arm64': 0.27.2 - '@esbuild/sunos-x64': 0.27.2 - '@esbuild/win32-arm64': 0.27.2 - '@esbuild/win32-ia32': 0.27.2 - '@esbuild/win32-x64': 0.27.2 - esbuild@0.27.3: optionalDependencies: '@esbuild/aix-ppc64': 0.27.3 @@ -7160,6 +8149,64 @@ snapshots: '@esbuild/win32-ia32': 0.27.3 '@esbuild/win32-x64': 0.27.3 + esbuild@0.27.7: + optionalDependencies: + '@esbuild/aix-ppc64': 0.27.7 + '@esbuild/android-arm': 0.27.7 + '@esbuild/android-arm64': 0.27.7 + '@esbuild/android-x64': 0.27.7 + '@esbuild/darwin-arm64': 0.27.7 + '@esbuild/darwin-x64': 0.27.7 + '@esbuild/freebsd-arm64': 0.27.7 + '@esbuild/freebsd-x64': 0.27.7 + '@esbuild/linux-arm': 0.27.7 + '@esbuild/linux-arm64': 0.27.7 + '@esbuild/linux-ia32': 0.27.7 + '@esbuild/linux-loong64': 0.27.7 + '@esbuild/linux-mips64el': 0.27.7 + '@esbuild/linux-ppc64': 0.27.7 + '@esbuild/linux-riscv64': 0.27.7 + '@esbuild/linux-s390x': 0.27.7 + '@esbuild/linux-x64': 0.27.7 + '@esbuild/netbsd-arm64': 0.27.7 + '@esbuild/netbsd-x64': 0.27.7 + '@esbuild/openbsd-arm64': 0.27.7 + '@esbuild/openbsd-x64': 0.27.7 + '@esbuild/openharmony-arm64': 0.27.7 + '@esbuild/sunos-x64': 0.27.7 + '@esbuild/win32-arm64': 0.27.7 + '@esbuild/win32-ia32': 0.27.7 + '@esbuild/win32-x64': 0.27.7 + + esbuild@0.28.0: + optionalDependencies: + '@esbuild/aix-ppc64': 0.28.0 + '@esbuild/android-arm': 0.28.0 + '@esbuild/android-arm64': 0.28.0 + '@esbuild/android-x64': 0.28.0 + '@esbuild/darwin-arm64': 0.28.0 + '@esbuild/darwin-x64': 0.28.0 + '@esbuild/freebsd-arm64': 0.28.0 + '@esbuild/freebsd-x64': 0.28.0 + '@esbuild/linux-arm': 0.28.0 + '@esbuild/linux-arm64': 0.28.0 + '@esbuild/linux-ia32': 0.28.0 + '@esbuild/linux-loong64': 0.28.0 + '@esbuild/linux-mips64el': 0.28.0 + '@esbuild/linux-ppc64': 0.28.0 + '@esbuild/linux-riscv64': 0.28.0 + '@esbuild/linux-s390x': 0.28.0 + '@esbuild/linux-x64': 0.28.0 + '@esbuild/netbsd-arm64': 0.28.0 + '@esbuild/netbsd-x64': 0.28.0 + '@esbuild/openbsd-arm64': 0.28.0 + '@esbuild/openbsd-x64': 0.28.0 + '@esbuild/openharmony-arm64': 0.28.0 + '@esbuild/sunos-x64': 0.28.0 + '@esbuild/win32-arm64': 0.28.0 + '@esbuild/win32-ia32': 0.28.0 + '@esbuild/win32-x64': 0.28.0 + escalade@3.2.0: {} escape-string-regexp@5.0.0: {} @@ -7205,6 +8252,8 @@ snapshots: expect-type@1.3.0: {} + exsolve@1.0.8: {} + extend@3.0.2: {} extendable-error@0.1.7: {} @@ -7221,9 +8270,9 @@ snapshots: dependencies: reusify: 1.1.0 - fdir@6.5.0(picomatch@4.0.3): + fdir@6.5.0(picomatch@4.0.4): optionalDependencies: - picomatch: 4.0.3 + picomatch: 4.0.4 fill-range@7.1.1: dependencies: @@ -7234,14 +8283,14 @@ snapshots: locate-path: 5.0.0 path-exists: 4.0.0 - framer-motion@12.35.2(react-dom@19.2.4(react@19.2.4))(react@19.2.4): + framer-motion@12.38.0(react-dom@19.2.5(react@19.2.5))(react@19.2.5): dependencies: - motion-dom: 12.35.2 - motion-utils: 12.29.2 + motion-dom: 12.38.0 + motion-utils: 12.36.0 tslib: 2.8.1 optionalDependencies: - react: 19.2.4 - react-dom: 19.2.4(react@19.2.4) + react: 19.2.5 + react-dom: 19.2.5(react@19.2.5) fs-extra@7.0.1: dependencies: @@ -7258,61 +8307,55 @@ snapshots: fsevents@2.3.3: optional: true - fumadocs-core@16.6.16(@mdx-js/mdx@3.1.1)(@tanstack/react-router@1.166.7(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(@types/estree-jsx@1.0.5)(@types/hast@3.0.4)(@types/mdast@4.0.4)(@types/react@19.2.14)(lucide-react@0.577.0(react@19.2.4))(next@16.1.6(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(zod@4.3.6): + fumadocs-core@16.7.16(@mdx-js/mdx@3.1.1)(@tanstack/react-router@1.168.22(react-dom@19.2.5(react@19.2.5))(react@19.2.5))(@types/estree-jsx@1.0.5)(@types/hast@3.0.4)(@types/mdast@4.0.4)(@types/react@19.2.14)(lucide-react@1.8.0(react@19.2.5))(next@16.2.4(react-dom@19.2.5(react@19.2.5))(react@19.2.5))(react-dom@19.2.5(react@19.2.5))(react@19.2.5)(zod@4.3.6): dependencies: - '@formatjs/intl-localematcher': 0.8.1 '@orama/orama': 3.1.18 - '@shikijs/rehype': 4.0.2 '@shikijs/transformers': 4.0.2 estree-util-value-to-estree: 3.5.0 github-slugger: 2.0.0 hast-util-to-estree: 3.1.3 hast-util-to-jsx-runtime: 2.3.6 - image-size: 2.0.2 mdast-util-mdx: 3.0.0 mdast-util-to-markdown: 2.1.2 - negotiator: 1.0.0 - npm-to-yarn: 3.0.1 - path-to-regexp: 8.3.0 remark: 15.0.1 remark-gfm: 4.0.1 remark-rehype: 11.1.2 scroll-into-view-if-needed: 3.1.0 shiki: 4.0.2 - tinyglobby: 0.2.15 + tinyglobby: 0.2.16 unified: 11.0.5 unist-util-visit: 5.1.0 vfile: 6.0.3 optionalDependencies: '@mdx-js/mdx': 3.1.1 - '@tanstack/react-router': 1.166.7(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@tanstack/react-router': 1.168.22(react-dom@19.2.5(react@19.2.5))(react@19.2.5) '@types/estree-jsx': 1.0.5 '@types/hast': 3.0.4 '@types/mdast': 4.0.4 '@types/react': 19.2.14 - lucide-react: 0.577.0(react@19.2.4) - next: 16.1.6(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - react: 19.2.4 - react-dom: 19.2.4(react@19.2.4) + lucide-react: 1.8.0(react@19.2.5) + next: 16.2.4(react-dom@19.2.5(react@19.2.5))(react@19.2.5) + react: 19.2.5 + react-dom: 19.2.5(react@19.2.5) zod: 4.3.6 transitivePeerDependencies: - supports-color - fumadocs-mdx@14.2.9(@types/mdast@4.0.4)(@types/mdx@2.0.13)(@types/react@19.2.14)(fumadocs-core@16.6.16(@mdx-js/mdx@3.1.1)(@tanstack/react-router@1.166.7(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(@types/estree-jsx@1.0.5)(@types/hast@3.0.4)(@types/mdast@4.0.4)(@types/react@19.2.14)(lucide-react@0.577.0(react@19.2.4))(next@16.1.6(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(zod@4.3.6))(next@16.1.6(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(react@19.2.4)(vite@7.3.1(@types/node@25.4.0)(jiti@2.6.1)(lightningcss@1.31.1)(tsx@4.21.0)(yaml@2.8.2)): + fumadocs-mdx@14.3.0(@types/mdast@4.0.4)(@types/mdx@2.0.13)(@types/react@19.2.14)(fumadocs-core@16.7.16(@mdx-js/mdx@3.1.1)(@tanstack/react-router@1.168.22(react-dom@19.2.5(react@19.2.5))(react@19.2.5))(@types/estree-jsx@1.0.5)(@types/hast@3.0.4)(@types/mdast@4.0.4)(@types/react@19.2.14)(lucide-react@1.8.0(react@19.2.5))(next@16.2.4(react-dom@19.2.5(react@19.2.5))(react@19.2.5))(react-dom@19.2.5(react@19.2.5))(react@19.2.5)(zod@4.3.6))(next@16.2.4(react-dom@19.2.5(react@19.2.5))(react@19.2.5))(react@19.2.5)(vite@8.0.8(@types/node@25.6.0)(esbuild@0.28.0)(jiti@2.6.1)(tsx@4.21.0)): dependencies: '@mdx-js/mdx': 3.1.1 '@standard-schema/spec': 1.1.0 chokidar: 5.0.0 - esbuild: 0.27.3 + esbuild: 0.28.0 estree-util-value-to-estree: 3.5.0 - fumadocs-core: 16.6.16(@mdx-js/mdx@3.1.1)(@tanstack/react-router@1.166.7(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(@types/estree-jsx@1.0.5)(@types/hast@3.0.4)(@types/mdast@4.0.4)(@types/react@19.2.14)(lucide-react@0.577.0(react@19.2.4))(next@16.1.6(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(zod@4.3.6) + fumadocs-core: 16.7.16(@mdx-js/mdx@3.1.1)(@tanstack/react-router@1.168.22(react-dom@19.2.5(react@19.2.5))(react@19.2.5))(@types/estree-jsx@1.0.5)(@types/hast@3.0.4)(@types/mdast@4.0.4)(@types/react@19.2.14)(lucide-react@1.8.0(react@19.2.5))(next@16.2.4(react-dom@19.2.5(react@19.2.5))(react@19.2.5))(react-dom@19.2.5(react@19.2.5))(react@19.2.5)(zod@4.3.6) js-yaml: 4.1.1 mdast-util-mdx: 3.0.0 mdast-util-to-markdown: 2.1.2 picocolors: 1.1.1 - picomatch: 4.0.3 - tinyexec: 1.0.2 - tinyglobby: 0.2.15 + picomatch: 4.0.4 + tinyexec: 1.1.1 + tinyglobby: 0.2.16 unified: 11.0.5 unist-util-remove-position: 5.0.0 unist-util-visit: 5.1.0 @@ -7322,23 +8365,24 @@ snapshots: '@types/mdast': 4.0.4 '@types/mdx': 2.0.13 '@types/react': 19.2.14 - next: 16.1.6(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - react: 19.2.4 - vite: 7.3.1(@types/node@25.4.0)(jiti@2.6.1)(lightningcss@1.31.1)(tsx@4.21.0)(yaml@2.8.2) + next: 16.2.4(react-dom@19.2.5(react@19.2.5))(react@19.2.5) + react: 19.2.5 + vite: 8.0.8(@types/node@25.6.0)(esbuild@0.28.0)(jiti@2.6.1)(tsx@4.21.0) transitivePeerDependencies: - supports-color - fumadocs-typescript@5.1.5(625b2c47a136537d69828bedd5efad50): + fumadocs-typescript@5.2.6(578e46be5ed1f2691a7b7125b236657d): dependencies: estree-util-value-to-estree: 3.5.0 - fumadocs-core: 16.6.16(@mdx-js/mdx@3.1.1)(@tanstack/react-router@1.166.7(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(@types/estree-jsx@1.0.5)(@types/hast@3.0.4)(@types/mdast@4.0.4)(@types/react@19.2.14)(lucide-react@0.577.0(react@19.2.4))(next@16.1.6(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(zod@4.3.6) + fumadocs-core: 16.7.16(@mdx-js/mdx@3.1.1)(@tanstack/react-router@1.168.22(react-dom@19.2.5(react@19.2.5))(react@19.2.5))(@types/estree-jsx@1.0.5)(@types/hast@3.0.4)(@types/mdast@4.0.4)(@types/react@19.2.14)(lucide-react@1.8.0(react@19.2.5))(next@16.2.4(react-dom@19.2.5(react@19.2.5))(react@19.2.5))(react-dom@19.2.5(react@19.2.5))(react@19.2.5)(zod@4.3.6) hast-util-to-estree: 3.1.3 hast-util-to-jsx-runtime: 2.3.6 - react: 19.2.4 + react: 19.2.5 + react-dom: 19.2.5(react@19.2.5) remark: 15.0.1 remark-rehype: 11.1.2 - ts-morph: 27.0.2 - typescript: 5.9.3 + shiki: 4.0.2 + ts-morph: 28.0.0 unified: 11.0.5 unist-util-visit: 5.1.0 optionalDependencies: @@ -7346,43 +8390,44 @@ snapshots: '@types/hast': 3.0.4 '@types/mdast': 4.0.4 '@types/react': 19.2.14 - fumadocs-ui: 16.6.16(@takumi-rs/image-response@0.71.7)(@types/mdx@2.0.13)(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(fumadocs-core@16.6.16(@mdx-js/mdx@3.1.1)(@tanstack/react-router@1.166.7(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(@types/estree-jsx@1.0.5)(@types/hast@3.0.4)(@types/mdast@4.0.4)(@types/react@19.2.14)(lucide-react@0.577.0(react@19.2.4))(next@16.1.6(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(zod@4.3.6))(next@16.1.6(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(tailwindcss@4.2.1) + fumadocs-ui: 16.7.16(@tailwindcss/oxide@4.2.2)(@takumi-rs/image-response@0.71.7)(@types/mdx@2.0.13)(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(fumadocs-core@16.7.16(@mdx-js/mdx@3.1.1)(@tanstack/react-router@1.168.22(react-dom@19.2.5(react@19.2.5))(react@19.2.5))(@types/estree-jsx@1.0.5)(@types/hast@3.0.4)(@types/mdast@4.0.4)(@types/react@19.2.14)(lucide-react@1.8.0(react@19.2.5))(next@16.2.4(react-dom@19.2.5(react@19.2.5))(react@19.2.5))(react-dom@19.2.5(react@19.2.5))(react@19.2.5)(zod@4.3.6))(next@16.2.4(react-dom@19.2.5(react@19.2.5))(react@19.2.5))(react-dom@19.2.5(react@19.2.5))(react@19.2.5)(tailwindcss@4.2.2) transitivePeerDependencies: - supports-color - fumadocs-ui@16.6.16(@takumi-rs/image-response@0.71.7)(@types/mdx@2.0.13)(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(fumadocs-core@16.6.16(@mdx-js/mdx@3.1.1)(@tanstack/react-router@1.166.7(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(@types/estree-jsx@1.0.5)(@types/hast@3.0.4)(@types/mdast@4.0.4)(@types/react@19.2.14)(lucide-react@0.577.0(react@19.2.4))(next@16.1.6(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(zod@4.3.6))(next@16.1.6(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(tailwindcss@4.2.1): - dependencies: - '@fumadocs/tailwind': 0.0.3(tailwindcss@4.2.1) - '@radix-ui/react-accordion': 1.2.12(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@radix-ui/react-collapsible': 1.1.12(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@radix-ui/react-dialog': 1.1.15(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@radix-ui/react-direction': 1.1.1(@types/react@19.2.14)(react@19.2.4) - '@radix-ui/react-navigation-menu': 1.2.14(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@radix-ui/react-popover': 1.1.15(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@radix-ui/react-presence': 1.1.5(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@radix-ui/react-scroll-area': 1.2.10(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@radix-ui/react-slot': 1.2.4(@types/react@19.2.14)(react@19.2.4) - '@radix-ui/react-tabs': 1.1.13(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + fumadocs-ui@16.7.16(@tailwindcss/oxide@4.2.2)(@takumi-rs/image-response@0.71.7)(@types/mdx@2.0.13)(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(fumadocs-core@16.7.16(@mdx-js/mdx@3.1.1)(@tanstack/react-router@1.168.22(react-dom@19.2.5(react@19.2.5))(react@19.2.5))(@types/estree-jsx@1.0.5)(@types/hast@3.0.4)(@types/mdast@4.0.4)(@types/react@19.2.14)(lucide-react@1.8.0(react@19.2.5))(next@16.2.4(react-dom@19.2.5(react@19.2.5))(react@19.2.5))(react-dom@19.2.5(react@19.2.5))(react@19.2.5)(zod@4.3.6))(next@16.2.4(react-dom@19.2.5(react@19.2.5))(react@19.2.5))(react-dom@19.2.5(react@19.2.5))(react@19.2.5)(tailwindcss@4.2.2): + dependencies: + '@fumadocs/tailwind': 0.0.5(@tailwindcss/oxide@4.2.2)(tailwindcss@4.2.2) + '@radix-ui/react-accordion': 1.2.12(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.5(react@19.2.5))(react@19.2.5) + '@radix-ui/react-collapsible': 1.1.12(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.5(react@19.2.5))(react@19.2.5) + '@radix-ui/react-dialog': 1.1.15(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.5(react@19.2.5))(react@19.2.5) + '@radix-ui/react-direction': 1.1.1(@types/react@19.2.14)(react@19.2.5) + '@radix-ui/react-navigation-menu': 1.2.14(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.5(react@19.2.5))(react@19.2.5) + '@radix-ui/react-popover': 1.1.15(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.5(react@19.2.5))(react@19.2.5) + '@radix-ui/react-presence': 1.1.5(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.5(react@19.2.5))(react@19.2.5) + '@radix-ui/react-scroll-area': 1.2.10(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.5(react@19.2.5))(react@19.2.5) + '@radix-ui/react-slot': 1.2.4(@types/react@19.2.14)(react@19.2.5) + '@radix-ui/react-tabs': 1.1.13(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.5(react@19.2.5))(react@19.2.5) class-variance-authority: 0.7.1 - fumadocs-core: 16.6.16(@mdx-js/mdx@3.1.1)(@tanstack/react-router@1.166.7(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(@types/estree-jsx@1.0.5)(@types/hast@3.0.4)(@types/mdast@4.0.4)(@types/react@19.2.14)(lucide-react@0.577.0(react@19.2.4))(next@16.1.6(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(zod@4.3.6) - lucide-react: 0.577.0(react@19.2.4) - motion: 12.35.2(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - next-themes: 0.4.6(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - react: 19.2.4 - react-dom: 19.2.4(react@19.2.4) - react-medium-image-zoom: 5.4.1(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - react-remove-scroll: 2.7.2(@types/react@19.2.14)(react@19.2.4) + fumadocs-core: 16.7.16(@mdx-js/mdx@3.1.1)(@tanstack/react-router@1.168.22(react-dom@19.2.5(react@19.2.5))(react@19.2.5))(@types/estree-jsx@1.0.5)(@types/hast@3.0.4)(@types/mdast@4.0.4)(@types/react@19.2.14)(lucide-react@1.8.0(react@19.2.5))(next@16.2.4(react-dom@19.2.5(react@19.2.5))(react@19.2.5))(react-dom@19.2.5(react@19.2.5))(react@19.2.5)(zod@4.3.6) + lucide-react: 1.8.0(react@19.2.5) + motion: 12.38.0(react-dom@19.2.5(react@19.2.5))(react@19.2.5) + next-themes: 0.4.6(react-dom@19.2.5(react@19.2.5))(react@19.2.5) + react: 19.2.5 + react-dom: 19.2.5(react@19.2.5) + react-remove-scroll: 2.7.2(@types/react@19.2.14)(react@19.2.5) rehype-raw: 7.0.0 scroll-into-view-if-needed: 3.1.0 + shiki: 4.0.2 tailwind-merge: 3.5.0 unist-util-visit: 5.1.0 optionalDependencies: '@takumi-rs/image-response': 0.71.7 '@types/mdx': 2.0.13 '@types/react': 19.2.14 - next: 16.1.6(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + next: 16.2.4(react-dom@19.2.5(react@19.2.5))(react@19.2.5) transitivePeerDependencies: - '@emotion/is-prop-valid' + - '@tailwindcss/oxide' - '@types/react-dom' - tailwindcss @@ -7392,7 +8437,7 @@ snapshots: get-nonce@1.0.1: {} - get-tsconfig@4.13.6: + get-tsconfig@4.14.0: dependencies: resolve-pkg-maps: 1.0.0 @@ -7417,10 +8462,17 @@ snapshots: merge2: 1.4.1 slash: 3.0.0 - globrex@0.1.2: {} + goober@2.1.18(csstype@3.2.3): + dependencies: + csstype: 3.2.3 graceful-fs@4.2.11: {} + h3@2.0.1-rc.20: + dependencies: + rou3: 0.8.1 + srvx: 0.11.15 + hachure-fill@0.5.2: {} has-flag@4.0.0: {} @@ -7525,10 +8577,6 @@ snapshots: web-namespaces: 2.0.1 zwitch: 2.0.4 - hast-util-to-string@3.0.1: - dependencies: - '@types/hast': 3.0.4 - hast-util-whitespace@3.0.0: dependencies: '@types/hast': 3.0.4 @@ -7541,15 +8589,19 @@ snapshots: property-information: 7.1.0 space-separated-tokens: 2.0.2 - hono@4.11.3: - optional: true - - hookable@6.0.1: {} + hookable@6.1.1: {} html-escaper@2.0.2: {} html-void-elements@3.0.0: {} + htmlparser2@10.1.0: + dependencies: + domelementtype: 2.3.0 + domhandler: 5.0.3 + domutils: 3.2.2 + entities: 7.0.1 + human-id@4.1.3: {} husky@9.1.7: {} @@ -7564,9 +8616,7 @@ snapshots: ignore@5.3.2: {} - image-size@2.0.2: {} - - import-without-cache@0.2.5: {} + import-without-cache@0.3.3: {} ini@4.1.3: {} @@ -7583,6 +8633,10 @@ snapshots: is-alphabetical: 2.0.1 is-decimal: 2.0.1 + is-binary-path@2.1.0: + dependencies: + binary-extensions: 2.3.0 + is-core-module@2.16.1: dependencies: hasown: 2.0.2 @@ -7607,12 +8661,11 @@ snapshots: is-windows@1.0.2: {} - isbot@5.1.36: - optional: true + isbot@5.1.38: {} isexe@2.0.0: {} - isexe@3.1.1: {} + isexe@3.1.5: {} istanbul-lib-coverage@3.2.2: {} @@ -7631,9 +8684,9 @@ snapshots: js-sha256@0.11.1: {} - js-tokens@4.0.0: {} + js-tokens@10.0.0: {} - js-tokens@9.0.1: {} + js-tokens@4.0.0: {} js-yaml@3.14.2: dependencies: @@ -7652,7 +8705,7 @@ snapshots: optionalDependencies: graceful-fs: 4.2.11 - katex@0.16.38: + katex@0.16.44: dependencies: commander: 8.3.0 @@ -7674,54 +8727,54 @@ snapshots: layout-base@2.0.1: {} - lightningcss-android-arm64@1.31.1: + lightningcss-android-arm64@1.32.0: optional: true - lightningcss-darwin-arm64@1.31.1: + lightningcss-darwin-arm64@1.32.0: optional: true - lightningcss-darwin-x64@1.31.1: + lightningcss-darwin-x64@1.32.0: optional: true - lightningcss-freebsd-x64@1.31.1: + lightningcss-freebsd-x64@1.32.0: optional: true - lightningcss-linux-arm-gnueabihf@1.31.1: + lightningcss-linux-arm-gnueabihf@1.32.0: optional: true - lightningcss-linux-arm64-gnu@1.31.1: + lightningcss-linux-arm64-gnu@1.32.0: optional: true - lightningcss-linux-arm64-musl@1.31.1: + lightningcss-linux-arm64-musl@1.32.0: optional: true - lightningcss-linux-x64-gnu@1.31.1: + lightningcss-linux-x64-gnu@1.32.0: optional: true - lightningcss-linux-x64-musl@1.31.1: + lightningcss-linux-x64-musl@1.32.0: optional: true - lightningcss-win32-arm64-msvc@1.31.1: + lightningcss-win32-arm64-msvc@1.32.0: optional: true - lightningcss-win32-x64-msvc@1.31.1: + lightningcss-win32-x64-msvc@1.32.0: optional: true - lightningcss@1.31.1: + lightningcss@1.32.0: dependencies: detect-libc: 2.1.2 optionalDependencies: - lightningcss-android-arm64: 1.31.1 - lightningcss-darwin-arm64: 1.31.1 - lightningcss-darwin-x64: 1.31.1 - lightningcss-freebsd-x64: 1.31.1 - lightningcss-linux-arm-gnueabihf: 1.31.1 - lightningcss-linux-arm64-gnu: 1.31.1 - lightningcss-linux-arm64-musl: 1.31.1 - lightningcss-linux-x64-gnu: 1.31.1 - lightningcss-linux-x64-musl: 1.31.1 - lightningcss-win32-arm64-msvc: 1.31.1 - lightningcss-win32-x64-msvc: 1.31.1 + lightningcss-android-arm64: 1.32.0 + lightningcss-darwin-arm64: 1.32.0 + lightningcss-darwin-x64: 1.32.0 + lightningcss-freebsd-x64: 1.32.0 + lightningcss-linux-arm-gnueabihf: 1.32.0 + lightningcss-linux-arm64-gnu: 1.32.0 + lightningcss-linux-arm64-musl: 1.32.0 + lightningcss-linux-x64-gnu: 1.32.0 + lightningcss-linux-x64-musl: 1.32.0 + lightningcss-win32-arm64-msvc: 1.32.0 + lightningcss-win32-x64-msvc: 1.32.0 locate-path@5.0.0: dependencies: @@ -7729,6 +8782,8 @@ snapshots: lodash-es@4.17.23: {} + lodash-es@4.18.1: {} + lodash.startcase@4.4.0: {} longest-streak@3.1.0: {} @@ -7737,23 +8792,23 @@ snapshots: dependencies: yallist: 3.1.1 - lucide-react@0.577.0(react@19.2.4): + lucide-react@1.8.0(react@19.2.5): dependencies: - react: 19.2.4 + react: 19.2.5 magic-string@0.30.21: dependencies: '@jridgewell/sourcemap-codec': 1.5.5 - magicast@0.5.1: + magicast@0.5.2: dependencies: - '@babel/parser': 7.29.0 + '@babel/parser': 7.29.2 '@babel/types': 7.29.0 source-map-js: 1.2.1 make-dir@4.0.0: dependencies: - semver: 7.7.3 + semver: 7.7.4 markdown-extensions@2.0.0: {} @@ -7926,11 +8981,11 @@ snapshots: merge2@1.4.1: {} - mermaid@11.13.0: + mermaid@11.14.0: dependencies: '@braintree/sanitize-url': 7.1.2 '@iconify/utils': 3.1.0 - '@mermaid-js/parser': 1.0.1 + '@mermaid-js/parser': 1.1.0 '@types/d3': 7.4.3 '@upsetjs/venn.js': 2.0.0 cytoscape: 3.33.1 @@ -7939,11 +8994,11 @@ snapshots: d3: 7.9.0 d3-sankey: 0.12.3 dagre-d3-es: 7.0.14 - dayjs: 1.11.19 + dayjs: 1.11.20 dompurify: 3.3.3 - katex: 0.16.38 + katex: 0.16.44 khroma: 2.1.0 - lodash-es: 4.17.23 + lodash-es: 4.18.1 marked: 16.4.2 roughjs: 4.6.6 stylis: 4.3.6 @@ -8196,7 +9251,7 @@ snapshots: micromark@4.0.2: dependencies: - '@types/debug': 4.1.12 + '@types/debug': 4.1.13 debug: 4.4.3 decode-named-character-reference: 1.3.0 devlop: 1.1.0 @@ -8219,52 +9274,48 @@ snapshots: micromatch@4.0.8: dependencies: braces: 3.0.3 - picomatch: 2.3.1 + picomatch: 2.3.2 - miniflare@4.20260210.0: + miniflare@4.20260415.0: dependencies: '@cspotcode/source-map-support': 0.8.1 sharp: 0.34.5 - undici: 7.18.2 - workerd: 1.20260210.0 + undici: 7.24.8 + workerd: 1.20260415.1 ws: 8.18.0 youch: 4.1.0-beta.10 transitivePeerDependencies: - bufferutil - utf-8-validate - minimatch@10.2.4: - dependencies: - brace-expansion: 5.0.4 - - minimatch@9.0.5: + minimatch@10.2.5: dependencies: - brace-expansion: 2.0.2 + brace-expansion: 5.0.5 minimist@1.2.8: {} - mlly@1.8.1: + mlly@1.8.2: dependencies: acorn: 8.16.0 pathe: 2.0.3 pkg-types: 1.3.1 ufo: 1.6.3 - moo@0.5.2: {} + moo@0.5.3: {} - motion-dom@12.35.2: + motion-dom@12.38.0: dependencies: - motion-utils: 12.29.2 + motion-utils: 12.36.0 - motion-utils@12.29.2: {} + motion-utils@12.36.0: {} - motion@12.35.2(react-dom@19.2.4(react@19.2.4))(react@19.2.4): + motion@12.38.0(react-dom@19.2.5(react@19.2.5))(react@19.2.5): dependencies: - framer-motion: 12.35.2(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + framer-motion: 12.38.0(react-dom@19.2.5(react@19.2.5))(react@19.2.5) tslib: 2.8.1 optionalDependencies: - react: 19.2.4 - react-dom: 19.2.4(react@19.2.4) + react: 19.2.5 + react-dom: 19.2.5(react@19.2.5) mri@1.2.0: {} @@ -8272,46 +9323,48 @@ snapshots: nanoid@3.3.11: {} - negotiator@1.0.0: {} - - next-themes@0.4.6(react-dom@19.2.4(react@19.2.4))(react@19.2.4): + next-themes@0.4.6(react-dom@19.2.5(react@19.2.5))(react@19.2.5): dependencies: - react: 19.2.4 - react-dom: 19.2.4(react@19.2.4) + react: 19.2.5 + react-dom: 19.2.5(react@19.2.5) - next@16.1.6(react-dom@19.2.4(react@19.2.4))(react@19.2.4): + next@16.2.4(react-dom@19.2.5(react@19.2.5))(react@19.2.5): dependencies: - '@next/env': 16.1.6 + '@next/env': 16.2.4 '@swc/helpers': 0.5.15 - baseline-browser-mapping: 2.9.11 - caniuse-lite: 1.0.30001761 + baseline-browser-mapping: 2.10.19 + caniuse-lite: 1.0.30001788 postcss: 8.4.31 - react: 19.2.4 - react-dom: 19.2.4(react@19.2.4) - styled-jsx: 5.1.6(react@19.2.4) + react: 19.2.5 + react-dom: 19.2.5(react@19.2.5) + styled-jsx: 5.1.6(react@19.2.5) optionalDependencies: - '@next/swc-darwin-arm64': 16.1.6 - '@next/swc-darwin-x64': 16.1.6 - '@next/swc-linux-arm64-gnu': 16.1.6 - '@next/swc-linux-arm64-musl': 16.1.6 - '@next/swc-linux-x64-gnu': 16.1.6 - '@next/swc-linux-x64-musl': 16.1.6 - '@next/swc-win32-arm64-msvc': 16.1.6 - '@next/swc-win32-x64-msvc': 16.1.6 + '@next/swc-darwin-arm64': 16.2.4 + '@next/swc-darwin-x64': 16.2.4 + '@next/swc-linux-arm64-gnu': 16.2.4 + '@next/swc-linux-arm64-musl': 16.2.4 + '@next/swc-linux-x64-gnu': 16.2.4 + '@next/swc-linux-x64-musl': 16.2.4 + '@next/swc-win32-arm64-msvc': 16.2.4 + '@next/swc-win32-x64-msvc': 16.2.4 sharp: 0.34.5 transitivePeerDependencies: - '@babel/core' - babel-plugin-macros - node-releases@2.0.27: {} + node-releases@2.0.37: {} - npm-to-yarn@3.0.1: {} + normalize-path@3.0.0: {} + + nth-check@2.1.1: + dependencies: + boolbase: 1.0.0 obug@2.1.1: {} oniguruma-parser@0.12.1: {} - oniguruma-to-es@4.3.4: + oniguruma-to-es@4.3.5: dependencies: oniguruma-parser: 0.12.1 regex: 6.1.0 @@ -8319,51 +9372,51 @@ snapshots: outdent@0.5.0: {} - oxfmt@0.36.0: + oxfmt@0.45.0: dependencies: tinypool: 2.1.0 optionalDependencies: - '@oxfmt/binding-android-arm-eabi': 0.36.0 - '@oxfmt/binding-android-arm64': 0.36.0 - '@oxfmt/binding-darwin-arm64': 0.36.0 - '@oxfmt/binding-darwin-x64': 0.36.0 - '@oxfmt/binding-freebsd-x64': 0.36.0 - '@oxfmt/binding-linux-arm-gnueabihf': 0.36.0 - '@oxfmt/binding-linux-arm-musleabihf': 0.36.0 - '@oxfmt/binding-linux-arm64-gnu': 0.36.0 - '@oxfmt/binding-linux-arm64-musl': 0.36.0 - '@oxfmt/binding-linux-ppc64-gnu': 0.36.0 - '@oxfmt/binding-linux-riscv64-gnu': 0.36.0 - '@oxfmt/binding-linux-riscv64-musl': 0.36.0 - '@oxfmt/binding-linux-s390x-gnu': 0.36.0 - '@oxfmt/binding-linux-x64-gnu': 0.36.0 - '@oxfmt/binding-linux-x64-musl': 0.36.0 - '@oxfmt/binding-openharmony-arm64': 0.36.0 - '@oxfmt/binding-win32-arm64-msvc': 0.36.0 - '@oxfmt/binding-win32-ia32-msvc': 0.36.0 - '@oxfmt/binding-win32-x64-msvc': 0.36.0 - - oxlint@1.51.0: + '@oxfmt/binding-android-arm-eabi': 0.45.0 + '@oxfmt/binding-android-arm64': 0.45.0 + '@oxfmt/binding-darwin-arm64': 0.45.0 + '@oxfmt/binding-darwin-x64': 0.45.0 + '@oxfmt/binding-freebsd-x64': 0.45.0 + '@oxfmt/binding-linux-arm-gnueabihf': 0.45.0 + '@oxfmt/binding-linux-arm-musleabihf': 0.45.0 + '@oxfmt/binding-linux-arm64-gnu': 0.45.0 + '@oxfmt/binding-linux-arm64-musl': 0.45.0 + '@oxfmt/binding-linux-ppc64-gnu': 0.45.0 + '@oxfmt/binding-linux-riscv64-gnu': 0.45.0 + '@oxfmt/binding-linux-riscv64-musl': 0.45.0 + '@oxfmt/binding-linux-s390x-gnu': 0.45.0 + '@oxfmt/binding-linux-x64-gnu': 0.45.0 + '@oxfmt/binding-linux-x64-musl': 0.45.0 + '@oxfmt/binding-openharmony-arm64': 0.45.0 + '@oxfmt/binding-win32-arm64-msvc': 0.45.0 + '@oxfmt/binding-win32-ia32-msvc': 0.45.0 + '@oxfmt/binding-win32-x64-msvc': 0.45.0 + + oxlint@1.60.0: optionalDependencies: - '@oxlint/binding-android-arm-eabi': 1.51.0 - '@oxlint/binding-android-arm64': 1.51.0 - '@oxlint/binding-darwin-arm64': 1.51.0 - '@oxlint/binding-darwin-x64': 1.51.0 - '@oxlint/binding-freebsd-x64': 1.51.0 - '@oxlint/binding-linux-arm-gnueabihf': 1.51.0 - '@oxlint/binding-linux-arm-musleabihf': 1.51.0 - '@oxlint/binding-linux-arm64-gnu': 1.51.0 - '@oxlint/binding-linux-arm64-musl': 1.51.0 - '@oxlint/binding-linux-ppc64-gnu': 1.51.0 - '@oxlint/binding-linux-riscv64-gnu': 1.51.0 - '@oxlint/binding-linux-riscv64-musl': 1.51.0 - '@oxlint/binding-linux-s390x-gnu': 1.51.0 - '@oxlint/binding-linux-x64-gnu': 1.51.0 - '@oxlint/binding-linux-x64-musl': 1.51.0 - '@oxlint/binding-openharmony-arm64': 1.51.0 - '@oxlint/binding-win32-arm64-msvc': 1.51.0 - '@oxlint/binding-win32-ia32-msvc': 1.51.0 - '@oxlint/binding-win32-x64-msvc': 1.51.0 + '@oxlint/binding-android-arm-eabi': 1.60.0 + '@oxlint/binding-android-arm64': 1.60.0 + '@oxlint/binding-darwin-arm64': 1.60.0 + '@oxlint/binding-darwin-x64': 1.60.0 + '@oxlint/binding-freebsd-x64': 1.60.0 + '@oxlint/binding-linux-arm-gnueabihf': 1.60.0 + '@oxlint/binding-linux-arm-musleabihf': 1.60.0 + '@oxlint/binding-linux-arm64-gnu': 1.60.0 + '@oxlint/binding-linux-arm64-musl': 1.60.0 + '@oxlint/binding-linux-ppc64-gnu': 1.60.0 + '@oxlint/binding-linux-riscv64-gnu': 1.60.0 + '@oxlint/binding-linux-riscv64-musl': 1.60.0 + '@oxlint/binding-linux-s390x-gnu': 1.60.0 + '@oxlint/binding-linux-x64-gnu': 1.60.0 + '@oxlint/binding-linux-x64-musl': 1.60.0 + '@oxlint/binding-openharmony-arm64': 1.60.0 + '@oxlint/binding-win32-arm64-msvc': 1.60.0 + '@oxlint/binding-win32-ia32-msvc': 1.60.0 + '@oxlint/binding-win32-x64-msvc': 1.60.0 p-filter@2.1.0: dependencies: @@ -8397,6 +9450,15 @@ snapshots: is-decimal: 2.0.1 is-hexadecimal: 2.0.1 + parse5-htmlparser2-tree-adapter@7.1.0: + dependencies: + domhandler: 5.0.3 + parse5: 7.3.0 + + parse5-parser-stream@7.1.2: + dependencies: + parse5: 7.3.0 + parse5@7.3.0: dependencies: entities: 6.0.1 @@ -8413,24 +9475,22 @@ snapshots: path-to-regexp@6.3.0: {} - path-to-regexp@8.3.0: {} - path-type@4.0.0: {} pathe@2.0.3: {} picocolors@1.1.1: {} - picomatch@2.3.1: {} + picomatch@2.3.2: {} - picomatch@4.0.3: {} + picomatch@4.0.4: {} pify@4.0.1: {} pkg-types@1.3.1: dependencies: confbox: 0.1.8 - mlly: 1.8.1 + mlly: 1.8.2 pathe: 2.0.3 pofile@1.1.4: {} @@ -8442,18 +9502,13 @@ snapshots: path-data-parser: 0.1.0 points-on-curve: 0.2.0 - postcss-selector-parser@7.1.1: - dependencies: - cssesc: 3.0.0 - util-deprecate: 1.0.2 - postcss@8.4.31: dependencies: nanoid: 3.3.11 picocolors: 1.1.1 source-map-js: 1.2.1 - postcss@8.5.8: + postcss@8.5.10: dependencies: nanoid: 3.3.11 picocolors: 1.1.1 @@ -8461,6 +9516,8 @@ snapshots: prettier@2.8.8: {} + prettier@3.8.3: {} + prism-media@1.3.5: optional: true @@ -8472,44 +9529,39 @@ snapshots: queue-microtask@1.2.3: {} - react-dom@19.2.4(react@19.2.4): + react-dom@19.2.5(react@19.2.5): dependencies: - react: 19.2.4 + react: 19.2.5 scheduler: 0.27.0 - react-medium-image-zoom@5.4.1(react-dom@19.2.4(react@19.2.4))(react@19.2.4): + react-remove-scroll-bar@2.3.8(@types/react@19.2.14)(react@19.2.5): dependencies: - react: 19.2.4 - react-dom: 19.2.4(react@19.2.4) - - react-remove-scroll-bar@2.3.8(@types/react@19.2.14)(react@19.2.4): - dependencies: - react: 19.2.4 - react-style-singleton: 2.2.3(@types/react@19.2.14)(react@19.2.4) + react: 19.2.5 + react-style-singleton: 2.2.3(@types/react@19.2.14)(react@19.2.5) tslib: 2.8.1 optionalDependencies: '@types/react': 19.2.14 - react-remove-scroll@2.7.2(@types/react@19.2.14)(react@19.2.4): + react-remove-scroll@2.7.2(@types/react@19.2.14)(react@19.2.5): dependencies: - react: 19.2.4 - react-remove-scroll-bar: 2.3.8(@types/react@19.2.14)(react@19.2.4) - react-style-singleton: 2.2.3(@types/react@19.2.14)(react@19.2.4) + react: 19.2.5 + react-remove-scroll-bar: 2.3.8(@types/react@19.2.14)(react@19.2.5) + react-style-singleton: 2.2.3(@types/react@19.2.14)(react@19.2.5) tslib: 2.8.1 - use-callback-ref: 1.3.3(@types/react@19.2.14)(react@19.2.4) - use-sidecar: 1.1.3(@types/react@19.2.14)(react@19.2.4) + use-callback-ref: 1.3.3(@types/react@19.2.14)(react@19.2.5) + use-sidecar: 1.1.3(@types/react@19.2.14)(react@19.2.5) optionalDependencies: '@types/react': 19.2.14 - react-style-singleton@2.2.3(@types/react@19.2.14)(react@19.2.4): + react-style-singleton@2.2.3(@types/react@19.2.14)(react@19.2.5): dependencies: get-nonce: 1.0.1 - react: 19.2.4 + react: 19.2.5 tslib: 2.8.1 optionalDependencies: '@types/react': 19.2.14 - react@19.2.4: {} + react@19.2.5: {} read-yaml-file@1.1.0: dependencies: @@ -8518,6 +9570,10 @@ snapshots: pify: 4.0.1 strip-bom: 3.0.0 + readdirp@3.6.0: + dependencies: + picomatch: 2.3.2 + readdirp@5.0.0: {} recma-build-jsx@1.0.0: @@ -8635,71 +9691,69 @@ snapshots: reusify@1.1.0: {} - robust-predicates@3.0.2: {} + robust-predicates@3.0.3: {} - rolldown-plugin-dts@0.22.1(rolldown@1.0.0-rc.3)(typescript@5.9.3): + rolldown-plugin-dts@0.23.2(rolldown@1.0.0-rc.16)(typescript@6.0.3): dependencies: - '@babel/generator': 8.0.0-rc.1 - '@babel/helper-validator-identifier': 8.0.0-rc.1 - '@babel/parser': 8.0.0-rc.1 - '@babel/types': 8.0.0-rc.1 + '@babel/generator': 8.0.0-rc.3 + '@babel/helper-validator-identifier': 8.0.0-rc.3 + '@babel/parser': 8.0.0-rc.3 + '@babel/types': 8.0.0-rc.3 ast-kit: 3.0.0-beta.1 birpc: 4.0.0 dts-resolver: 2.1.3 - get-tsconfig: 4.13.6 + get-tsconfig: 4.14.0 obug: 2.1.1 - rolldown: 1.0.0-rc.3 + picomatch: 4.0.4 + rolldown: 1.0.0-rc.16 optionalDependencies: - typescript: 5.9.3 + typescript: 6.0.3 transitivePeerDependencies: - oxc-resolver - rolldown@1.0.0-rc.3: + rolldown@1.0.0-rc.15: dependencies: - '@oxc-project/types': 0.112.0 - '@rolldown/pluginutils': 1.0.0-rc.3 + '@oxc-project/types': 0.124.0 + '@rolldown/pluginutils': 1.0.0-rc.15 optionalDependencies: - '@rolldown/binding-android-arm64': 1.0.0-rc.3 - '@rolldown/binding-darwin-arm64': 1.0.0-rc.3 - '@rolldown/binding-darwin-x64': 1.0.0-rc.3 - '@rolldown/binding-freebsd-x64': 1.0.0-rc.3 - '@rolldown/binding-linux-arm-gnueabihf': 1.0.0-rc.3 - '@rolldown/binding-linux-arm64-gnu': 1.0.0-rc.3 - '@rolldown/binding-linux-arm64-musl': 1.0.0-rc.3 - '@rolldown/binding-linux-x64-gnu': 1.0.0-rc.3 - '@rolldown/binding-linux-x64-musl': 1.0.0-rc.3 - '@rolldown/binding-openharmony-arm64': 1.0.0-rc.3 - '@rolldown/binding-wasm32-wasi': 1.0.0-rc.3 - '@rolldown/binding-win32-arm64-msvc': 1.0.0-rc.3 - '@rolldown/binding-win32-x64-msvc': 1.0.0-rc.3 - - rollup@4.54.0: - dependencies: - '@types/estree': 1.0.8 + '@rolldown/binding-android-arm64': 1.0.0-rc.15 + '@rolldown/binding-darwin-arm64': 1.0.0-rc.15 + '@rolldown/binding-darwin-x64': 1.0.0-rc.15 + '@rolldown/binding-freebsd-x64': 1.0.0-rc.15 + '@rolldown/binding-linux-arm-gnueabihf': 1.0.0-rc.15 + '@rolldown/binding-linux-arm64-gnu': 1.0.0-rc.15 + '@rolldown/binding-linux-arm64-musl': 1.0.0-rc.15 + '@rolldown/binding-linux-ppc64-gnu': 1.0.0-rc.15 + '@rolldown/binding-linux-s390x-gnu': 1.0.0-rc.15 + '@rolldown/binding-linux-x64-gnu': 1.0.0-rc.15 + '@rolldown/binding-linux-x64-musl': 1.0.0-rc.15 + '@rolldown/binding-openharmony-arm64': 1.0.0-rc.15 + '@rolldown/binding-wasm32-wasi': 1.0.0-rc.15 + '@rolldown/binding-win32-arm64-msvc': 1.0.0-rc.15 + '@rolldown/binding-win32-x64-msvc': 1.0.0-rc.15 + + rolldown@1.0.0-rc.16: + dependencies: + '@oxc-project/types': 0.126.0 + '@rolldown/pluginutils': 1.0.0-rc.16 optionalDependencies: - '@rollup/rollup-android-arm-eabi': 4.54.0 - '@rollup/rollup-android-arm64': 4.54.0 - '@rollup/rollup-darwin-arm64': 4.54.0 - '@rollup/rollup-darwin-x64': 4.54.0 - '@rollup/rollup-freebsd-arm64': 4.54.0 - '@rollup/rollup-freebsd-x64': 4.54.0 - '@rollup/rollup-linux-arm-gnueabihf': 4.54.0 - '@rollup/rollup-linux-arm-musleabihf': 4.54.0 - '@rollup/rollup-linux-arm64-gnu': 4.54.0 - '@rollup/rollup-linux-arm64-musl': 4.54.0 - '@rollup/rollup-linux-loong64-gnu': 4.54.0 - '@rollup/rollup-linux-ppc64-gnu': 4.54.0 - '@rollup/rollup-linux-riscv64-gnu': 4.54.0 - '@rollup/rollup-linux-riscv64-musl': 4.54.0 - '@rollup/rollup-linux-s390x-gnu': 4.54.0 - '@rollup/rollup-linux-x64-gnu': 4.54.0 - '@rollup/rollup-linux-x64-musl': 4.54.0 - '@rollup/rollup-openharmony-arm64': 4.54.0 - '@rollup/rollup-win32-arm64-msvc': 4.54.0 - '@rollup/rollup-win32-ia32-msvc': 4.54.0 - '@rollup/rollup-win32-x64-gnu': 4.54.0 - '@rollup/rollup-win32-x64-msvc': 4.54.0 - fsevents: 2.3.3 + '@rolldown/binding-android-arm64': 1.0.0-rc.16 + '@rolldown/binding-darwin-arm64': 1.0.0-rc.16 + '@rolldown/binding-darwin-x64': 1.0.0-rc.16 + '@rolldown/binding-freebsd-x64': 1.0.0-rc.16 + '@rolldown/binding-linux-arm-gnueabihf': 1.0.0-rc.16 + '@rolldown/binding-linux-arm64-gnu': 1.0.0-rc.16 + '@rolldown/binding-linux-arm64-musl': 1.0.0-rc.16 + '@rolldown/binding-linux-ppc64-gnu': 1.0.0-rc.16 + '@rolldown/binding-linux-s390x-gnu': 1.0.0-rc.16 + '@rolldown/binding-linux-x64-gnu': 1.0.0-rc.16 + '@rolldown/binding-linux-x64-musl': 1.0.0-rc.16 + '@rolldown/binding-openharmony-arm64': 1.0.0-rc.16 + '@rolldown/binding-wasm32-wasi': 1.0.0-rc.16 + '@rolldown/binding-win32-arm64-msvc': 1.0.0-rc.16 + '@rolldown/binding-win32-x64-msvc': 1.0.0-rc.16 + + rou3@0.8.1: {} roughjs@4.6.6: dependencies: @@ -8724,23 +9778,21 @@ snapshots: semver@6.3.1: {} - semver@7.7.3: {} + semver@7.7.4: {} - seroval-plugins@1.5.1(seroval@1.5.1): + seroval-plugins@1.5.2(seroval@1.5.2): dependencies: - seroval: 1.5.1 - optional: true + seroval: 1.5.2 - seroval@1.5.1: - optional: true + seroval@1.5.2: {} server-only@0.0.1: {} sharp@0.34.5: dependencies: - '@img/colour': 1.0.0 + '@img/colour': 1.1.0 detect-libc: 2.1.2 - semver: 7.7.3 + semver: 7.7.4 optionalDependencies: '@img/sharp-darwin-arm64': 0.34.5 '@img/sharp-darwin-x64': 0.34.5 @@ -8803,9 +9855,11 @@ snapshots: sprintf-js@1.0.3: {} + srvx@0.11.15: {} + stackback@0.0.2: {} - std-env@3.10.0: {} + std-env@4.0.0: {} stringify-entities@4.0.4: dependencies: @@ -8826,10 +9880,10 @@ snapshots: dependencies: inline-style-parser: 0.2.7 - styled-jsx@5.1.6(react@19.2.4): + styled-jsx@5.1.6(react@19.2.5): dependencies: client-only: 0.0.1 - react: 19.2.4 + react: 19.2.5 stylis@4.3.6: {} @@ -8843,30 +9897,31 @@ snapshots: tailwind-merge@3.5.0: {} - tailwindcss@4.2.1: {} + tailwindcss@4.2.2: {} - tapable@2.3.0: {} + tapable@2.3.2: {} term-size@2.2.1: {} - tiny-invariant@1.3.3: - optional: true - - tiny-warning@1.0.3: - optional: true - tinybench@2.9.0: {} - tinyexec@1.0.2: {} + tinyexec@1.0.4: {} + + tinyexec@1.1.1: {} tinyglobby@0.2.15: dependencies: - fdir: 6.5.0(picomatch@4.0.3) - picomatch: 4.0.3 + fdir: 6.5.0(picomatch@4.0.4) + picomatch: 4.0.4 + + tinyglobby@0.2.16: + dependencies: + fdir: 6.5.0(picomatch@4.0.4) + picomatch: 4.0.4 tinypool@2.1.0: {} - tinyrainbow@3.0.3: {} + tinyrainbow@3.1.0: {} to-regex-range@5.0.1: dependencies: @@ -8880,9 +9935,9 @@ snapshots: ts-dedent@2.2.0: {} - ts-morph@27.0.2: + ts-morph@28.0.0: dependencies: - '@ts-morph/common': 0.28.1 + '@ts-morph/common': 0.29.0 code-block-writer: 13.0.3 ts-patch@3.3.0: @@ -8891,33 +9946,29 @@ snapshots: global-prefix: 4.0.0 minimist: 1.2.8 resolve: 1.22.11 - semver: 7.7.3 + semver: 7.7.4 strip-ansi: 6.0.1 - tsconfck@3.1.6(typescript@5.9.3): - optionalDependencies: - typescript: 5.9.3 - - tsdown@0.20.3(typescript@5.9.3): + tsdown@0.21.9(typescript@6.0.3): dependencies: ansis: 4.2.0 - cac: 6.7.14 - defu: 6.1.4 + cac: 7.0.0 + defu: 6.1.7 empathic: 2.0.0 - hookable: 6.0.1 - import-without-cache: 0.2.5 + hookable: 6.1.1 + import-without-cache: 0.3.3 obug: 2.1.1 - picomatch: 4.0.3 - rolldown: 1.0.0-rc.3 - rolldown-plugin-dts: 0.22.1(rolldown@1.0.0-rc.3)(typescript@5.9.3) - semver: 7.7.3 - tinyexec: 1.0.2 - tinyglobby: 0.2.15 + picomatch: 4.0.4 + rolldown: 1.0.0-rc.16 + rolldown-plugin-dts: 0.23.2(rolldown@1.0.0-rc.16)(typescript@6.0.3) + semver: 7.7.4 + tinyexec: 1.1.1 + tinyglobby: 0.2.16 tree-kill: 1.2.2 - unconfig-core: 7.4.2 - unrun: 0.2.27 + unconfig-core: 7.5.0 + unrun: 0.2.36 optionalDependencies: - typescript: 5.9.3 + typescript: 6.0.3 transitivePeerDependencies: - '@ts-macro/tsc' - '@typescript/native-preview' @@ -8929,58 +9980,34 @@ snapshots: tsx@4.21.0: dependencies: - esbuild: 0.27.3 - get-tsconfig: 4.13.6 + esbuild: 0.27.7 + get-tsconfig: 4.14.0 optionalDependencies: fsevents: 2.3.3 - optional: true - - turbo-darwin-64@2.8.5: - optional: true - - turbo-darwin-arm64@2.8.5: - optional: true - - turbo-linux-64@2.8.5: - optional: true - turbo-linux-arm64@2.8.5: - optional: true - - turbo-windows-64@2.8.5: - optional: true - - turbo-windows-arm64@2.8.5: - optional: true - - turbo@2.8.5: + turbo@2.9.6: optionalDependencies: - turbo-darwin-64: 2.8.5 - turbo-darwin-arm64: 2.8.5 - turbo-linux-64: 2.8.5 - turbo-linux-arm64: 2.8.5 - turbo-windows-64: 2.8.5 - turbo-windows-arm64: 2.8.5 - - typescript-transform-paths@3.5.6(typescript@5.9.3): - dependencies: - minimatch: 9.0.5 - typescript: 5.9.3 + '@turbo/darwin-64': 2.9.6 + '@turbo/darwin-arm64': 2.9.6 + '@turbo/linux-64': 2.9.6 + '@turbo/linux-arm64': 2.9.6 + '@turbo/windows-64': 2.9.6 + '@turbo/windows-arm64': 2.9.6 - typescript@5.9.3: {} + typescript@6.0.3: {} ufo@1.6.3: {} - unconfig-core@7.4.2: + unconfig-core@7.5.0: dependencies: '@quansync/fs': 1.0.0 quansync: 1.0.0 - undici-types@7.16.0: {} + undici-types@7.19.2: {} - undici-types@7.18.2: {} + undici@7.24.8: {} - undici@7.18.2: {} + undici@7.25.0: {} unenv@2.0.0-rc.24: dependencies: @@ -9030,43 +10057,47 @@ snapshots: universalify@0.1.2: {} + unplugin@2.3.11: + dependencies: + '@jridgewell/remapping': 2.3.5 + acorn: 8.16.0 + picomatch: 4.0.4 + webpack-virtual-modules: 0.6.2 + unplugin@3.0.0: dependencies: '@jridgewell/remapping': 2.3.5 - picomatch: 4.0.3 + picomatch: 4.0.4 webpack-virtual-modules: 0.6.2 - unrun@0.2.27: + unrun@0.2.36: dependencies: - rolldown: 1.0.0-rc.3 + rolldown: 1.0.0-rc.16 - update-browserslist-db@1.2.3(browserslist@4.28.1): + update-browserslist-db@1.2.3(browserslist@4.28.2): dependencies: - browserslist: 4.28.1 + browserslist: 4.28.2 escalade: 3.2.0 picocolors: 1.1.1 - use-callback-ref@1.3.3(@types/react@19.2.14)(react@19.2.4): + use-callback-ref@1.3.3(@types/react@19.2.14)(react@19.2.5): dependencies: - react: 19.2.4 + react: 19.2.5 tslib: 2.8.1 optionalDependencies: '@types/react': 19.2.14 - use-sidecar@1.1.3(@types/react@19.2.14)(react@19.2.4): + use-sidecar@1.1.3(@types/react@19.2.14)(react@19.2.5): dependencies: detect-node-es: 1.1.0 - react: 19.2.4 + react: 19.2.5 tslib: 2.8.1 optionalDependencies: '@types/react': 19.2.14 - use-sync-external-store@1.6.0(react@19.2.4): + use-sync-external-store@1.6.0(react@19.2.5): dependencies: - react: 19.2.4 - optional: true - - util-deprecate@1.0.2: {} + react: 19.2.5 uuid@11.1.0: {} @@ -9085,101 +10116,51 @@ snapshots: '@types/unist': 3.0.3 vfile-message: 4.0.3 - vite-tsconfig-paths@6.1.0(typescript@5.9.3)(vite@7.3.1(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.31.1)(tsx@4.21.0)(yaml@2.8.2)): - dependencies: - debug: 4.4.3 - globrex: 0.1.2 - tsconfck: 3.1.6(typescript@5.9.3) - vite: 7.3.1(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.31.1)(tsx@4.21.0)(yaml@2.8.2) - transitivePeerDependencies: - - supports-color - - typescript - - vite@7.3.0(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.31.1)(tsx@4.21.0)(yaml@2.8.2): - dependencies: - esbuild: 0.27.2 - fdir: 6.5.0(picomatch@4.0.3) - picomatch: 4.0.3 - postcss: 8.5.8 - rollup: 4.54.0 - tinyglobby: 0.2.15 - optionalDependencies: - '@types/node': 25.2.3 - fsevents: 2.3.3 - jiti: 2.6.1 - lightningcss: 1.31.1 - tsx: 4.21.0 - yaml: 2.8.2 - - vite@7.3.1(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.31.1)(tsx@4.21.0)(yaml@2.8.2): + vite@8.0.8(@types/node@25.6.0)(esbuild@0.28.0)(jiti@2.6.1)(tsx@4.21.0): dependencies: - esbuild: 0.27.3 - fdir: 6.5.0(picomatch@4.0.3) - picomatch: 4.0.3 - postcss: 8.5.8 - rollup: 4.54.0 - tinyglobby: 0.2.15 + lightningcss: 1.32.0 + picomatch: 4.0.4 + postcss: 8.5.10 + rolldown: 1.0.0-rc.15 + tinyglobby: 0.2.16 optionalDependencies: - '@types/node': 25.2.3 + '@types/node': 25.6.0 + esbuild: 0.28.0 fsevents: 2.3.3 jiti: 2.6.1 - lightningcss: 1.31.1 tsx: 4.21.0 - yaml: 2.8.2 - vite@7.3.1(@types/node@25.4.0)(jiti@2.6.1)(lightningcss@1.31.1)(tsx@4.21.0)(yaml@2.8.2): - dependencies: - esbuild: 0.27.3 - fdir: 6.5.0(picomatch@4.0.3) - picomatch: 4.0.3 - postcss: 8.5.8 - rollup: 4.54.0 - tinyglobby: 0.2.15 + vitefu@1.1.3(vite@8.0.8(@types/node@25.6.0)(esbuild@0.28.0)(jiti@2.6.1)(tsx@4.21.0)): optionalDependencies: - '@types/node': 25.4.0 - fsevents: 2.3.3 - jiti: 2.6.1 - lightningcss: 1.31.1 - tsx: 4.21.0 - yaml: 2.8.2 - optional: true - - vitest@4.0.18(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.31.1)(tsx@4.21.0)(yaml@2.8.2): - dependencies: - '@vitest/expect': 4.0.18 - '@vitest/mocker': 4.0.18(vite@7.3.0(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.31.1)(tsx@4.21.0)(yaml@2.8.2)) - '@vitest/pretty-format': 4.0.18 - '@vitest/runner': 4.0.18 - '@vitest/snapshot': 4.0.18 - '@vitest/spy': 4.0.18 - '@vitest/utils': 4.0.18 - es-module-lexer: 1.7.0 + vite: 8.0.8(@types/node@25.6.0)(esbuild@0.28.0)(jiti@2.6.1)(tsx@4.21.0) + + vitest@4.1.4(@types/node@25.6.0)(@vitest/coverage-v8@4.1.4)(vite@8.0.8(@types/node@25.6.0)(esbuild@0.28.0)(jiti@2.6.1)(tsx@4.21.0)): + dependencies: + '@vitest/expect': 4.1.4 + '@vitest/mocker': 4.1.4(vite@8.0.8(@types/node@25.6.0)(esbuild@0.28.0)(jiti@2.6.1)(tsx@4.21.0)) + '@vitest/pretty-format': 4.1.4 + '@vitest/runner': 4.1.4 + '@vitest/snapshot': 4.1.4 + '@vitest/spy': 4.1.4 + '@vitest/utils': 4.1.4 + es-module-lexer: 2.0.0 expect-type: 1.3.0 magic-string: 0.30.21 obug: 2.1.1 pathe: 2.0.3 - picomatch: 4.0.3 - std-env: 3.10.0 + picomatch: 4.0.4 + std-env: 4.0.0 tinybench: 2.9.0 - tinyexec: 1.0.2 + tinyexec: 1.0.4 tinyglobby: 0.2.15 - tinyrainbow: 3.0.3 - vite: 7.3.0(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.31.1)(tsx@4.21.0)(yaml@2.8.2) + tinyrainbow: 3.1.0 + vite: 8.0.8(@types/node@25.6.0)(esbuild@0.28.0)(jiti@2.6.1)(tsx@4.21.0) why-is-node-running: 2.3.0 optionalDependencies: - '@types/node': 25.2.3 + '@types/node': 25.6.0 + '@vitest/coverage-v8': 4.1.4(vitest@4.1.4) transitivePeerDependencies: - - jiti - - less - - lightningcss - msw - - sass - - sass-embedded - - stylus - - sugarss - - terser - - tsx - - yaml vscode-jsonrpc@8.2.0: {} @@ -9202,39 +10183,45 @@ snapshots: webpack-virtual-modules@0.6.2: {} + whatwg-encoding@3.1.1: + dependencies: + iconv-lite: 0.6.3 + + whatwg-mimetype@4.0.0: {} + which@2.0.2: dependencies: isexe: 2.0.0 which@4.0.0: dependencies: - isexe: 3.1.1 + isexe: 3.1.5 why-is-node-running@2.3.0: dependencies: siginfo: 2.0.0 stackback: 0.0.2 - workerd@1.20260210.0: + workerd@1.20260415.1: optionalDependencies: - '@cloudflare/workerd-darwin-64': 1.20260210.0 - '@cloudflare/workerd-darwin-arm64': 1.20260210.0 - '@cloudflare/workerd-linux-64': 1.20260210.0 - '@cloudflare/workerd-linux-arm64': 1.20260210.0 - '@cloudflare/workerd-windows-64': 1.20260210.0 + '@cloudflare/workerd-darwin-64': 1.20260415.1 + '@cloudflare/workerd-darwin-arm64': 1.20260415.1 + '@cloudflare/workerd-linux-64': 1.20260415.1 + '@cloudflare/workerd-linux-arm64': 1.20260415.1 + '@cloudflare/workerd-windows-64': 1.20260415.1 - wrangler@4.64.0(@cloudflare/workers-types@4.20260210.0): + wrangler@4.83.0(@cloudflare/workers-types@4.20260417.1): dependencies: '@cloudflare/kv-asset-handler': 0.4.2 - '@cloudflare/unenv-preset': 2.12.1(unenv@2.0.0-rc.24)(workerd@1.20260210.0) + '@cloudflare/unenv-preset': 2.16.0(unenv@2.0.0-rc.24)(workerd@1.20260415.1) blake3-wasm: 2.1.5 esbuild: 0.27.3 - miniflare: 4.20260210.0 + miniflare: 4.20260415.0 path-to-regexp: 6.3.0 unenv: 2.0.0-rc.24 - workerd: 1.20260210.0 + workerd: 1.20260415.1 optionalDependencies: - '@cloudflare/workers-types': 4.20260210.0 + '@cloudflare/workers-types': 4.20260417.1 fsevents: 2.3.3 transitivePeerDependencies: - bufferutil @@ -9242,13 +10229,17 @@ snapshots: ws@8.18.0: {} - ws@8.19.0: + ws@8.20.0: optional: true - yallist@3.1.1: {} + xmlbuilder2@4.0.3: + dependencies: + '@oozcitak/dom': 2.0.2 + '@oozcitak/infra': 2.0.2 + '@oozcitak/util': 10.0.0 + js-yaml: 4.1.1 - yaml@2.8.2: - optional: true + yallist@3.1.1: {} youch-core@0.3.3: dependencies: @@ -9259,10 +10250,12 @@ snapshots: dependencies: '@poppinss/colors': 4.1.6 '@poppinss/dumper': 0.6.5 - '@speed-highlight/core': 1.2.12 + '@speed-highlight/core': 1.2.15 cookie: 1.1.1 youch-core: 0.3.3 + zod@3.25.76: {} + zod@4.3.6: {} zwitch@2.0.4: {} diff --git a/tsconfig.base.json b/tsconfig.base.json index c7a634a..b5ceb2c 100644 --- a/tsconfig.base.json +++ b/tsconfig.base.json @@ -1,57 +1,31 @@ { - "$schema": "https://json.schemastore.org/tsconfig.json", + "include": ["${configDir}"], + "exclude": ["node_modules", "dist"], - "include": ["${configDir}/src"], - "exclude": [".ignore", "node_modules", "dist"], - - "compileOnSave": true, "compilerOptions": { + // Environment setup & latest features + "lib": ["DOM", "ESNext"], + "target": "ESNext", + "module": "Preserve", + "moduleDetection": "force", + "allowJs": true, + "jsx": "react-jsx", + "types": ["node"], + // Bundler mode + "moduleResolution": "bundler", + "allowImportingTsExtensions": true, + "verbatimModuleSyntax": true, + "noEmit": true, + // Best practices "strict": true, - - "allowUnreachableCode": false, - "allowUnusedLabels": false, - "exactOptionalPropertyTypes": false, + "skipLibCheck": true, "noFallthroughCasesInSwitch": true, + "noUncheckedIndexedAccess": true, "noImplicitOverride": true, - "noImplicitReturns": true, + // Some stricter flags (disabled by default) + "noUnusedLocals": false, + "noUnusedParameters": false, "noPropertyAccessFromIndexSignature": false, - "noUncheckedIndexedAccess": true, - "noUnusedLocals": true, - "noUnusedParameters": true, - - "allowArbitraryExtensions": false, - "allowImportingTsExtensions": false, - "module": "ESNext", - "moduleResolution": "Bundler", - "resolveJsonModule": true, - - "declaration": true, - "declarationMap": true, - "importHelpers": false, - "newLine": "lf", - "removeComments": false, - "sourceMap": true, - "inlineSourceMap": false, - - "allowSyntheticDefaultImports": true, - "esModuleInterop": true, - "forceConsistentCasingInFileNames": true, - "isolatedModules": true, - - "experimentalDecorators": true, - "lib": ["ES2022", "DOM", "DOM.Iterable"], - "target": "ES2022", - "useDefineForClassFields": true, - "skipLibCheck": true, - - "baseUrl": "${configDir}", - "outDir": "${configDir}/dist", - "tsBuildInfoFile": "${configDir}/dist/.tsbuildinfo", - "paths": { "~/*": ["src/*"] }, - - "plugins": [ - { "transform": "typescript-transform-paths" }, - { "transform": "typescript-transform-paths", "afterDeclarations": true } - ] + "tsBuildInfoFile": "node_modules/.cache/.tsbuildinfo" } } diff --git a/website/content/core-concepts/configuration.mdx b/website/content/core-concepts/configuration.mdx index 56040d1..5c6afaf 100644 --- a/website/content/core-concepts/configuration.mdx +++ b/website/content/core-concepts/configuration.mdx @@ -11,7 +11,8 @@ Create a `saykit.config.ts` in your project root: ```ts title='saykit.config.ts' import { defineConfig } from '@saykit/config'; -import createFormatter from '@saykit/format-po'; +import createPoFormatter from '@saykit/format-po'; +import createJsTransformer from '@saykit/transform-js'; export default defineConfig({ sourceLocale: 'en', @@ -20,7 +21,8 @@ export default defineConfig({ { include: ['src/**/*.{ts,tsx}'], output: 'src/locales/{locale}.{extension}', - formatter: createFormatter(), + transformer: createJsTransformer(), + formatter: createPoFormatter(), }, ], }); @@ -94,6 +96,18 @@ Buckets group related messages and control extraction and output: type: '`${string}{locale}${string}{extension}`', required: true, }, + transformer: { + description: 'Transformer or array of Transformers for message extraction and transformation.', + type: ( + <> + + Transformer + {' '} + | Transformer[] + + ), + required: true, + }, formatter: { description: 'Formatter for message serialisation.', type: ( @@ -108,6 +122,34 @@ Buckets group related messages and control extraction and output: }} /> +#### Transformer + +Transformers control how messages are extracted and transformed: + + boolean', + required: true, + }, + extract: { + description: 'Function to extract messages from file content. Must be synchronous - cannot return Promise.', + type: ( + <> + (code: string, id: string) {'=>'} Message[] + + ), + required: true, + }, + transform: { + description: 'Function to transform source code. Must be synchronous - cannot return Promise.', + type: '(code: string, id: string) => string', + required: true, + }, + }} +/> + #### Formatter Formatters control how messages are serialized to disk: @@ -120,27 +162,19 @@ Formatters control how messages are serialized to disk: required: true, }, parse: { - description: 'Function to parse file content into messages.', + description: 'Function to parse file content into messages. Must be synchronous - cannot return Promise.', type: ( <> - (content: string, context: {'{ locale: string }'}) {'=>'} Promise{'<'} - - Message - - []{'>'} + (content: string, context: {'{ locale: string }'}) {'=>'} Message[] ), required: true, }, stringify: { - description: 'Function to serialize messages to file content.', + description: 'Function to serialize messages to file content. Must be synchronous - cannot return Promise.', type: ( <> - (messages:{' '} - - Message - - [], context: {'{ locale: string }'}) {'=>'} Promise{''} + (messages: Message[], context: {'{ locale: string }'}) {'=>'} string ), required: true, diff --git a/website/content/core-concepts/runtime.mdx b/website/content/core-concepts/runtime.mdx index 41ad4ee..13b0e66 100644 --- a/website/content/core-concepts/runtime.mdx +++ b/website/content/core-concepts/runtime.mdx @@ -50,7 +50,7 @@ A `Say` instance exposes three key pieces of state: ## Load Messages -Use `load()` to fetch message catalogs through the configured loader. +Use `load()` to fetch message catalogues through the configured loader. ```ts await say.load('fr'); diff --git a/website/content/getting-started/installation.mdx b/website/content/getting-started/installation.mdx index 3cc6124..eb411b4 100644 --- a/website/content/getting-started/installation.mdx +++ b/website/content/getting-started/installation.mdx @@ -12,13 +12,18 @@ description: Install SayKit and set up internationalisation in your project ### Framework Integrations -- `@saykit/react` - React integration with `` component and hooks for client and server components - `@saykit/carbon` - Carbon integration for Discord bots with command localisation support +- `@saykit/react` - React integration for SayKit, i18n hooks and components ### Build Tools -- `@saykit/babel-plugin` - Babel plugin to transform `say` template literals into message calls - `unplugin-saykit` - Universal plugin for Vite, Webpack, Rollup, esbuild, and more +- `babel-plugin-saykit` - Babel plugin for SayKit + +### Transformers + +- `@saykit/transform-js` - JavaScript and TypeScript transformer for SayKit +- `@saykit/transform-jsx` - JSX and TSX source transformer for SayKit ### Translation Formats diff --git a/website/content/getting-started/introduction.mdx b/website/content/getting-started/introduction.mdx index ead462a..f42f852 100644 --- a/website/content/getting-started/introduction.mdx +++ b/website/content/getting-started/introduction.mdx @@ -26,11 +26,11 @@ import { Braces, WandSparkles, Puzzle, Languages } from 'lucide-react'; title="Compile-Time Extraction" description="Automatically extract translatable messages from your source code during build" /> - } title="Framework Agnostic" description="Works with React, Next.js, and any framework that supports plugins" - /> + /> */} } title="ICU MessageFormat" diff --git a/website/package.json b/website/package.json index b47d707..4ec0bbb 100644 --- a/website/package.json +++ b/website/package.json @@ -12,26 +12,26 @@ "dependencies": { "@takumi-rs/image-response": "^0.71.7", "beautiful-mermaid": "^1.1.3", - "fumadocs-core": "16.6.16", - "fumadocs-mdx": "14.2.9", - "fumadocs-typescript": "^5.1.5", - "fumadocs-ui": "16.6.16", - "lucide-react": "^0.577.0", + "fumadocs-core": "16.7.16", + "fumadocs-mdx": "14.3.0", + "fumadocs-typescript": "^5.2.6", + "fumadocs-ui": "16.7.16", + "lucide-react": "^1.8.0", "mermaid": "^11.13.0", - "next": "16.1.6", + "next": "16.2.4", "next-themes": "^0.4.6", - "react": "^19.2.4", - "react-dom": "^19.2.4", + "react": "^19.2.5", + "react-dom": "^19.2.5", "tailwind-merge": "^3.5.0" }, "devDependencies": { "@tailwindcss/postcss": "^4.2.1", "@types/mdx": "^2.0.13", - "@types/node": "^25.4.0", + "@types/node": "^25.6.0", "@types/react": "^19.2.14", "@types/react-dom": "^19.2.3", - "postcss": "^8.5.8", + "postcss": "^8.5.10", "tailwindcss": "^4.2.1", - "typescript": "^5.9.3" + "typescript": "^6.0.3" } }