diff --git a/frontend/package.json b/frontend/package.json index 633ef73254..326f04781c 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -129,6 +129,7 @@ "ts-pattern": "^5.8.0", "typescript": "^5.9.2", "typescript-plugin-css-modules": "^5.2.0", + "unplugin-macros": "^0.18.3", "usehooks-ts": "^3.1.1", "vite": "^5.4.20", "vite-plugin-favicons-inject": "^2.2.0", diff --git a/frontend/src/app/dialogs/connect-gcp-frame.tsx b/frontend/src/app/dialogs/connect-gcp-frame.tsx index 7ff9e811ac..45243e4e64 100644 --- a/frontend/src/app/dialogs/connect-gcp-frame.tsx +++ b/frontend/src/app/dialogs/connect-gcp-frame.tsx @@ -2,11 +2,11 @@ import { faGoogleCloud, Icon } from "@rivet-gg/icons"; import { type DialogContentProps, Frame } from "@/components"; import ConnectManualServerlfullFrameContent from "./connect-manual-serverfull-frame"; -interface ConnectAwsFrameContentProps extends DialogContentProps {} +interface ConnectGcpFrameContentProps extends DialogContentProps {} -export default function ConnectAwsFrameContent({ +export default function ConnectGcpFrameContent({ onClose, -}: ConnectAwsFrameContentProps) { +}: ConnectGcpFrameContentProps) { return ( <> diff --git a/frontend/src/app/dialogs/connect-manual-serverless-frame.tsx b/frontend/src/app/dialogs/connect-manual-serverless-frame.tsx index 71e32cb2f1..127985b548 100644 --- a/frontend/src/app/dialogs/connect-manual-serverless-frame.tsx +++ b/frontend/src/app/dialogs/connect-manual-serverless-frame.tsx @@ -60,10 +60,13 @@ const stepper = defineStepper( }, ); -interface ConnectManualServerlessFrameContentProps extends DialogContentProps {} +interface ConnectManualServerlessFrameContentProps extends DialogContentProps { + provider: string; +} export default function ConnectManualServerlessFrameContent({ onClose, + provider, }: ConnectManualServerlessFrameContentProps) { usePrefetchInfiniteQuery({ ...useEngineCompatDataProvider().regionsQueryOptions(), @@ -74,24 +77,32 @@ export default function ConnectManualServerlessFrameContent({ useEngineCompatDataProvider().regionsQueryOptions(), ); - return ; + return ( + + ); } function FormStepper({ onClose, datacenters, + provider, }: { onClose?: () => void; datacenters: Region[]; + provider: string; }) { - const provider = useEngineCompatDataProvider(); + const dataProvider = useEngineCompatDataProvider(); const { data } = useSuspenseInfiniteQuery({ - ...provider.runnerConfigsQueryOptions(), + ...dataProvider.runnerConfigsQueryOptions(), }); const { mutateAsync } = useMutation({ - ...provider.upsertRunnerConfigMutationOptions(), + ...dataProvider.upsertRunnerConfigMutationOptions(), onSuccess: async () => { confetti({ angle: 60, @@ -105,7 +116,7 @@ function FormStepper({ }); await queryClient.invalidateQueries( - provider.runnerConfigsQueryOptions(), + dataProvider.runnerConfigsQueryOptions(), ); onClose?.(); }, @@ -117,7 +128,7 @@ function FormStepper({ let existing: Record = {}; try { const runnerConfig = await queryClient.fetchQuery( - provider.runnerConfigQueryOptions({ + dataProvider.runnerConfigQueryOptions({ name: values.runnerName, }), ); @@ -142,7 +153,7 @@ function FormStepper({ ), }, metadata: { - provider: "custom", + provider, }, }; @@ -174,7 +185,7 @@ function FormStepper({ content={{ "step-1": () => , "step-2": () => , - "step-3": () => , + "step-3": () => , }} /> ); @@ -204,11 +215,11 @@ function Step2() { ); } -function Step3() { +function Step3({ provider }: { provider: string }) { return ( <> - + ); } diff --git a/frontend/src/app/dialogs/start-with-template-frame.tsx b/frontend/src/app/dialogs/start-with-template-frame.tsx new file mode 100644 index 0000000000..7a82b83d92 --- /dev/null +++ b/frontend/src/app/dialogs/start-with-template-frame.tsx @@ -0,0 +1,51 @@ +import { useState } from "react"; +import { match } from "ts-pattern"; +import { type DialogContentProps, Frame } from "@/components"; +import { type Provider, TemplateProviders } from "../template-providers"; +import ConnectQuickVercelFrameContent from "./connect-quick-vercel-frame"; +import ConnectQuickRailwayFrameContent from "./connect-quick-railway-frame"; +import ConnectAwsFrameContent from "./connect-aws-frame"; +import ConnectGcpFrameContent from "./connect-gcp-frame"; +import ConnectHetznerFrameContent from "./connect-hetzner-frame"; +import ConnectManualServerlfullFrameContent from "./connect-manual-serverfull-frame"; +import ConnectManualServerlessFrameContent from "./connect-manual-serverless-frame"; + +interface ConnectAwsFrameContentProps extends DialogContentProps { + template: string; +} + +export default function StartWithTemplateFrame({ + template, + onClose, +}: ConnectAwsFrameContentProps) { + const [provider, setProvider] = useState(null); + + return match(provider) + .with("vercel", () => ( + + )) + .with("cloudflare", () => ) + .with("railway", () => ) + .with("kubernetes", () => ) + .with("aws-ecs", () => ) + .with("gcp-cloud-run", () => ) + .with("hetzner", () => ) + .with("vm-bare-metal", () => ) + .otherwise(() => { + return ( + <> + + +
Start With {template}
+
+
+ +
+ Select Provider +
+ +
+ + ); + }); +} diff --git a/frontend/src/app/getting-started.tsx b/frontend/src/app/getting-started.tsx new file mode 100644 index 0000000000..4d1620ab81 --- /dev/null +++ b/frontend/src/app/getting-started.tsx @@ -0,0 +1,95 @@ +import { Link } from "@tanstack/react-router"; +import { cn } from "../components/lib/utils"; +import { Button } from "../components/ui/button"; +import { H2 } from "../components/ui/typography"; + +export function GettingStarted() { + return ( +
+
+
+
+

Start With Template

+
+ +
+
+
+ +
+
+
+
+ + +
+
+
+ ); +} + +function TemplateCard({ + title, + slug, + className, + description, +}: { + title: string; + slug: string; + description?: string; + className?: string; +}) { + return ( + + ); +} diff --git a/frontend/src/app/one-click-deploy-railway-button.tsx b/frontend/src/app/one-click-deploy-railway-button.tsx new file mode 100644 index 0000000000..1c4aa4dc0b --- /dev/null +++ b/frontend/src/app/one-click-deploy-railway-button.tsx @@ -0,0 +1,19 @@ +import { faRailway, Icon } from "@rivet-gg/icons"; +import { Link } from "@tanstack/react-router"; +import { Button } from "../components/ui/button"; + +export function OneClickDeployRailwayButton() { + return ( + + ); +} diff --git a/frontend/src/app/template-providers.tsx b/frontend/src/app/template-providers.tsx new file mode 100644 index 0000000000..c885fbea61 --- /dev/null +++ b/frontend/src/app/template-providers.tsx @@ -0,0 +1,101 @@ +import { + faAws, + faCloudflare, + faGoogleCloud, + faHetznerH, + faKubernetes, + faRailway, + faServer, + faVercel, + Icon, +} from "@rivet-gg/icons"; +import { Badge, Button } from "@/components"; + +const PROVIDERS = [ + { + title: "Serverless", + items: [ + { + title: "Vercel", + icon: faVercel, + slug: "vercel", + type: "1-click-deploy", + }, + { + title: "Cloudflare Workers", + icon: faCloudflare, + slug: "cloudflare", + }, + ], + }, + { + title: "Containers", + items: [ + { + title: "Railway", + icon: faRailway, + slug: "railway", + type: "1-click-deploy", + }, + { title: "Kubernetes", icon: faKubernetes, slug: "kubernetes" }, + { title: "AWS ECS", icon: faAws, slug: "aws-ecs" }, + { + title: "Google Cloud Run", + icon: faGoogleCloud, + slug: "gcp-cloud-run", + }, + ], + }, + { + title: "Virtual Machines", + items: [ + { title: "Hetzner", icon: faHetznerH, slug: "hetzner" }, + { title: "VM & Bare Metal", icon: faServer, slug: "vm-bare-metal" }, + ], + }, +] as const; + +export type Provider = (typeof PROVIDERS)[number]["items"][number]["slug"]; + +export function TemplateProviders({ + onProviderSelect, +}: { + onProviderSelect?: (providerSlug: Provider) => void; +}) { + return ( +
+ {PROVIDERS.map((group) => ( +
+

+ {group.title} +

+
+ {group.items.map((provider) => ( + + ))} +
+
+ ))} +
+ ); +} diff --git a/frontend/src/app/use-dialog.tsx b/frontend/src/app/use-dialog.tsx index 14f84484b7..dd39c41af9 100644 --- a/frontend/src/app/use-dialog.tsx +++ b/frontend/src/app/use-dialog.tsx @@ -47,4 +47,7 @@ export const useDialog = { CreateApiToken: createDialogHook( () => import("@/app/dialogs/create-api-token-frame"), ), + StartWithTemplate: createDialogHook( + () => import("@/app/dialogs/start-with-template-frame"), + ), }; diff --git a/frontend/src/routes/__root.tsx b/frontend/src/routes/__root.tsx index 4cc72fbbc9..b7a9b761c5 100644 --- a/frontend/src/routes/__root.tsx +++ b/frontend/src/routes/__root.tsx @@ -1,6 +1,5 @@ import type { Clerk } from "@clerk/clerk-js"; import { ClerkProvider } from "@clerk/clerk-react"; -import * as ClerkComponents from "@clerk/elements/common"; import { dark } from "@clerk/themes"; import type { QueryClient } from "@tanstack/react-query"; import { diff --git a/frontend/src/routes/_context/_cloud.tsx b/frontend/src/routes/_context/_cloud.tsx index d9779d4d27..0797b96630 100644 --- a/frontend/src/routes/_context/_cloud.tsx +++ b/frontend/src/routes/_context/_cloud.tsx @@ -47,6 +47,7 @@ function CloudModals() { const ConnectHetznerDialog = useDialog.ConnectHetzner.Dialog; const EditProviderConfigDialog = useDialog.EditProviderConfig.Dialog; const DeleteConfigDialog = useDialog.DeleteConfig.Dialog; + const StartWithTemplateDialog = useDialog.StartWithTemplate.Dialog; return ( <> @@ -284,6 +285,23 @@ function CloudModals() { }, }} /> + { + if (!value) { + navigate({ + to: ".", + search: (old) => ({ + ...old, + modal: undefined, + }), + }); + } + }, + }} + /> ); } diff --git a/frontend/src/routes/_context/_cloud/orgs.$organization/projects.$project/ns.$namespace/connect.tsx b/frontend/src/routes/_context/_cloud/orgs.$organization/projects.$project/ns.$namespace/connect.tsx index 1b6b5ca41b..1b5df386c6 100644 --- a/frontend/src/routes/_context/_cloud/orgs.$organization/projects.$project/ns.$namespace/connect.tsx +++ b/frontend/src/routes/_context/_cloud/orgs.$organization/projects.$project/ns.$namespace/connect.tsx @@ -25,13 +25,13 @@ import { useParams, } from "@tanstack/react-router"; import { match } from "ts-pattern"; +import { GettingStarted } from "@/app/getting-started"; import { HelpDropdown } from "@/app/help-dropdown"; import { PublishableTokenCodeGroup } from "@/app/publishable-token-code-group"; import { RunnerConfigsTable } from "@/app/runner-config-table"; import { RunnersTable } from "@/app/runners-table"; import { Button, - DocsSheet, DropdownMenu, DropdownMenuContent, DropdownMenuItem, @@ -109,196 +109,7 @@ export function RouteComponent() { } if (!hasRunnerNames) { - return ( -
-
-
-
-

Create New Project

-
-

- Start a new RivetKit project with Rivet Cloud. Use - one of our templates to get started quickly. -

- -
-
-

1-Click Deploy From Template

-
- - -
-
-
-

Quickstart Guides

-
- - - - - - - - - -
-
-
-
-
-

Connect Existing Project

- - - -
-

- Connect your RivetKit application to Rivet Cloud. - Use your cloud of choice to run Rivet Actors. -

- -
-
-

Add Provider

-
- - - - - - - -
-
-
-
-
- ); + return ; } return ( @@ -586,19 +397,3 @@ function DataLoadingPlaceholder() { ); } - -function OneClickDeployRailwayButton() { - return ( - - ); -} diff --git a/frontend/src/routes/_context/_engine.tsx b/frontend/src/routes/_context/_engine.tsx index 085a73dd1b..5d39a69a06 100644 --- a/frontend/src/routes/_context/_engine.tsx +++ b/frontend/src/routes/_context/_engine.tsx @@ -44,6 +44,7 @@ function EngineModals() { const ConnectHetznerDialog = useDialog.ConnectHetzner.Dialog; const EditProviderConfigDialog = useDialog.EditProviderConfig.Dialog; const DeleteConfigDialog = useDialog.DeleteConfig.Dialog; + const StartWithTemplateDialog = useDialog.StartWithTemplate.Dialog; return ( <> @@ -265,6 +266,23 @@ function EngineModals() { }, }} /> + { + if (!value) { + navigate({ + to: ".", + search: (old) => ({ + ...old, + modal: undefined, + }), + }); + } + }, + }} + /> ); } diff --git a/frontend/vite.engine.config.ts b/frontend/vite.engine.config.ts index 934a7d08c8..18655da977 100644 --- a/frontend/vite.engine.config.ts +++ b/frontend/vite.engine.config.ts @@ -4,6 +4,7 @@ import { sentryVitePlugin } from "@sentry/vite-plugin"; import { tanstackRouter } from "@tanstack/router-plugin/vite"; import react from "@vitejs/plugin-react"; import favigo from "favigo/vite"; +import Macros from "unplugin-macros/vite"; import { defineConfig, loadEnv, type Plugin } from "vite"; import tsconfigPaths from "vite-tsconfig-paths"; import { commonEnvSchema } from "./src/lib/env"; @@ -58,6 +59,7 @@ export default defineConfig(({ mode }) => { background: "transparent", }, }), + Macros(), ], server: { port: 43708, diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 099dc54305..0738c7f482 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -1849,6 +1849,9 @@ importers: typescript-plugin-css-modules: specifier: ^5.2.0 version: 5.2.0(typescript@5.9.2) + unplugin-macros: + specifier: ^0.18.3 + version: 0.18.3(@types/node@20.19.13)(jiti@1.21.7)(less@4.4.1)(lightningcss@1.30.2)(sass@1.93.2)(stylus@0.62.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) usehooks-ts: specifier: ^3.1.1 version: 3.1.1(react@19.1.1) @@ -2439,7 +2442,7 @@ importers: version: 15.5.6(@mdx-js/loader@3.1.1(webpack@5.101.3(esbuild@0.25.9)))(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@19.2.0)) '@next/third-parties': specifier: latest - version: 16.0.3(next@15.5.6(@babel/core@7.28.5)(@opentelemetry/api@1.9.0)(babel-plugin-macros@3.1.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(sass@1.93.2))(react@19.2.0) + version: 16.0.6(next@15.5.6(@babel/core@7.28.5)(@opentelemetry/api@1.9.0)(babel-plugin-macros@3.1.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(sass@1.93.2))(react@19.2.0) '@rivet-gg/api': specifier: 25.5.3 version: 25.5.3 @@ -5537,8 +5540,8 @@ packages: cpu: [x64] os: [win32] - '@next/third-parties@16.0.3': - resolution: {integrity: sha512-QjTRQ4ydXguFkpMCUMl5oSslxmh8mAtmnzc9DEtLkZcGmAuQcZg2M3lswMn62sdID+F06crS3IQ58X3sjjBLVA==} + '@next/third-parties@16.0.6': + resolution: {integrity: sha512-yYZkmgc3YuMsvouklk3R3oDEmzq1rEiEm/5wGHjTfyTCsRrrD3jBX84xrMtEN7vVWbWXXWbV0SZ5TfkgeMLGWg==} peerDependencies: next: ^13.0.0 || ^14.0.0 || ^15.0.0 || ^16.0.0-beta.0 react: ^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0 @@ -8023,6 +8026,10 @@ packages: resolution: {integrity: sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==} engines: {node: '>=12'} + ast-kit@2.2.0: + resolution: {integrity: sha512-m1Q/RaVOnTp9JxPX+F+Zn7IcLYMzM8kZofDImfsKZd8MbR+ikdOzTeztStWqfrqIxZnYWryyI9ePm3NGjnZgGw==} + engines: {node: '>=20.19.0'} + ast-types-flow@0.0.8: resolution: {integrity: sha512-OH/2E5Fg20h2aPrbe+QL8JZQFko0YZaF+j4mnQ7BGhfavO7OpSLa8a0y9sBwomHdSbkhTS8TQNayBfnW5DwbvQ==} @@ -10858,6 +10865,10 @@ packages: lunr@2.3.9: resolution: {integrity: sha512-zTU3DaZaF3Rt9rhN3uBMGQD3dD2/vFQqnvZCDv4dl5iOzq2IZQqTxu90r4E5J+nP70J3ilqVCrbho2eWaeW8Ow==} + magic-string-ast@1.0.3: + resolution: {integrity: sha512-CvkkH1i81zl7mmb94DsRiFeG9V2fR2JeuK8yDgS8oiZSFa++wWLEgZ5ufEOyLHbvSbD1gTRKv9NdX69Rnvr9JA==} + engines: {node: '>=20.19.0'} + magic-string@0.30.19: resolution: {integrity: sha512-2N21sPY9Ws53PZvsEpVtNuSW+ScYbQdp4b9qUaL+9QkHUrGFKo56Lg9Emg5s9V/qrtNBmiR01sYhUOwu3H+VOw==} @@ -13602,6 +13613,10 @@ packages: resolution: {integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==} engines: {node: '>= 0.8'} + unplugin-macros@0.18.3: + resolution: {integrity: sha512-wTIAXuT/+yLxVtgIxpeNUtjb4pzebL5W7EkJwXMYlY4OqJIuFOEAsitMyX3exitT/4DtXjycs3sg+N5SIXMECw==} + engines: {node: '>=20.18.0'} + unplugin@1.0.1: resolution: {integrity: sha512-aqrHaVBWW1JVKBHmGo33T5TxeL0qWzfvjWokObHA9bYmN7eNDkwOxmLjhioHl9878qDFMAaT51XNroRyuz7WxA==} @@ -14467,7 +14482,7 @@ snapshots: '@babel/generator@7.28.3': dependencies: - '@babel/parser': 7.28.4 + '@babel/parser': 7.28.5 '@babel/types': 7.28.4 '@jridgewell/gen-mapping': 0.3.13 '@jridgewell/trace-mapping': 0.3.30 @@ -14483,7 +14498,7 @@ snapshots: '@babel/helper-annotate-as-pure@7.27.3': dependencies: - '@babel/types': 7.28.4 + '@babel/types': 7.28.5 '@babel/helper-compilation-targets@7.27.2': dependencies: @@ -14542,7 +14557,7 @@ snapshots: '@babel/helper-member-expression-to-functions@7.27.1': dependencies: '@babel/traverse': 7.28.4 - '@babel/types': 7.28.4 + '@babel/types': 7.28.5 transitivePeerDependencies: - supports-color @@ -14580,7 +14595,7 @@ snapshots: '@babel/helper-optimise-call-expression@7.27.1': dependencies: - '@babel/types': 7.28.4 + '@babel/types': 7.28.5 '@babel/helper-plugin-utils@7.27.1': {} @@ -14614,7 +14629,7 @@ snapshots: '@babel/helper-skip-transparent-expression-wrappers@7.27.1': dependencies: '@babel/traverse': 7.28.4 - '@babel/types': 7.28.4 + '@babel/types': 7.28.5 transitivePeerDependencies: - supports-color @@ -17029,7 +17044,7 @@ snapshots: '@jridgewell/remapping@2.3.5': dependencies: '@jridgewell/gen-mapping': 0.3.13 - '@jridgewell/trace-mapping': 0.3.30 + '@jridgewell/trace-mapping': 0.3.31 '@jridgewell/resolve-uri@3.1.2': {} @@ -17377,7 +17392,7 @@ snapshots: '@next/swc-win32-x64-msvc@15.5.6': optional: true - '@next/third-parties@16.0.3(next@15.5.6(@babel/core@7.28.5)(@opentelemetry/api@1.9.0)(babel-plugin-macros@3.1.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(sass@1.93.2))(react@19.2.0)': + '@next/third-parties@16.0.6(next@15.5.6(@babel/core@7.28.5)(@opentelemetry/api@1.9.0)(babel-plugin-macros@3.1.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(sass@1.93.2))(react@19.2.0)': dependencies: next: 15.5.6(@babel/core@7.28.5)(@opentelemetry/api@1.9.0)(babel-plugin-macros@3.1.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(sass@1.93.2) react: 19.2.0 @@ -19271,7 +19286,7 @@ snapshots: '@types/babel__template@7.4.4': dependencies: - '@babel/parser': 7.28.4 + '@babel/parser': 7.28.5 '@babel/types': 7.28.4 '@types/babel__traverse@7.28.0': @@ -20435,6 +20450,11 @@ snapshots: assertion-error@2.0.1: {} + ast-kit@2.2.0: + dependencies: + '@babel/parser': 7.28.5 + pathe: 2.0.3 + ast-types-flow@0.0.8: {} ast-types@0.16.1: @@ -23723,6 +23743,10 @@ snapshots: lunr@2.3.9: {} + magic-string-ast@1.0.3: + dependencies: + magic-string: 0.30.19 + magic-string@0.30.19: dependencies: '@jridgewell/sourcemap-codec': 1.5.5 @@ -27531,6 +27555,27 @@ snapshots: unpipe@1.0.0: {} + unplugin-macros@0.18.3(@types/node@20.19.13)(jiti@1.21.7)(less@4.4.1)(lightningcss@1.30.2)(sass@1.93.2)(stylus@0.62.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1): + dependencies: + ast-kit: 2.2.0 + magic-string-ast: 1.0.3 + unplugin: 2.3.10 + vite: 7.2.2(@types/node@20.19.13)(jiti@1.21.7)(less@4.4.1)(lightningcss@1.30.2)(sass@1.93.2)(stylus@0.62.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) + vite-node: 5.2.0(@types/node@20.19.13)(jiti@1.21.7)(less@4.4.1)(lightningcss@1.30.2)(sass@1.93.2)(stylus@0.62.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) + transitivePeerDependencies: + - '@types/node' + - jiti + - less + - lightningcss + - ms + - sass + - sass-embedded + - stylus + - sugarss + - terser + - tsx + - yaml + unplugin@1.0.1: dependencies: acorn: 8.15.0 @@ -27849,6 +27894,27 @@ snapshots: - supports-color - terser + vite-node@5.2.0(@types/node@20.19.13)(jiti@1.21.7)(less@4.4.1)(lightningcss@1.30.2)(sass@1.93.2)(stylus@0.62.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1): + dependencies: + cac: 6.7.14 + es-module-lexer: 1.7.0 + obug: 2.0.0(ms@2.1.3) + pathe: 2.0.3 + vite: 7.2.2(@types/node@20.19.13)(jiti@1.21.7)(less@4.4.1)(lightningcss@1.30.2)(sass@1.93.2)(stylus@0.62.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) + transitivePeerDependencies: + - '@types/node' + - jiti + - less + - lightningcss + - ms + - sass + - sass-embedded + - stylus + - sugarss + - terser + - tsx + - yaml + vite-node@5.2.0(@types/node@24.10.1)(jiti@1.21.7)(less@4.4.1)(lightningcss@1.30.2)(ms@2.1.3)(sass@1.93.2)(stylus@0.62.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1): dependencies: cac: 6.7.14 @@ -28042,6 +28108,26 @@ snapshots: tsx: 4.20.6 yaml: 2.8.1 + vite@7.2.2(@types/node@20.19.13)(jiti@1.21.7)(less@4.4.1)(lightningcss@1.30.2)(sass@1.93.2)(stylus@0.62.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1): + dependencies: + esbuild: 0.25.12 + fdir: 6.5.0(picomatch@4.0.3) + picomatch: 4.0.3 + postcss: 8.5.6 + rollup: 4.53.3 + tinyglobby: 0.2.15 + optionalDependencies: + '@types/node': 20.19.13 + fsevents: 2.3.3 + jiti: 1.21.7 + less: 4.4.1 + lightningcss: 1.30.2 + sass: 1.93.2 + stylus: 0.62.0 + terser: 5.44.0 + tsx: 4.20.6 + yaml: 2.8.1 + vite@7.2.2(@types/node@22.18.1)(jiti@1.21.7)(less@4.4.1)(lightningcss@1.30.2)(sass@1.93.2)(stylus@0.62.0)(terser@5.44.0)(tsx@4.20.5)(yaml@2.8.1): dependencies: esbuild: 0.25.12