@@ -66,6 +66,7 @@ export async function initProject(
6666 force ?: boolean | null ;
6767 tailwind ?: boolean | null ;
6868 vscode ?: boolean | null ;
69+ vite ?: boolean | null ;
6970 } = { } ,
7071) : Promise < void > {
7172 console . log ( ) ;
@@ -108,6 +109,8 @@ export async function initProject(
108109 }
109110 }
110111
112+ const useVite = flags . vite ?? false ;
113+
111114 const useDocker = flags . docker ;
112115 let useTailwind = flags . tailwind || false ;
113116 if ( flags . tailwind == null ) {
@@ -320,7 +323,13 @@ ${GRADIENT_CSS}`;
320323${ GRADIENT_CSS } `;
321324
322325 const cssStyles = useTailwind ? TAILWIND_CSS : NO_TAILWIND_STYLES ;
323- await writeFile ( "static/styles.css" , cssStyles ) ;
326+
327+ if ( useVite ) {
328+ await writeFile ( "assets/styles.css" , cssStyles ) ;
329+ await writeFile ( "client.ts" , `import "./assets/styles.css";` ) ;
330+ } else {
331+ await writeFile ( "static/styles.css" , cssStyles ) ;
332+ }
324333 // deno-fmt-ignore
325334 const STATIC_LOGO =
326335 `<svg width="40" height="40" fill="none" xmlns="http://www.w3.org/2000/svg">
@@ -458,8 +467,9 @@ export default define.page(function App({ Component }) {
458467 <head>
459468 <meta charset="utf-8" />
460469 <meta name="viewport" content="width=device-width, initial-scale=1.0" />
461- <title>${ path . basename ( projectDir ) } </title>
462- <link rel="stylesheet" href="/styles.css" />
470+ <title>${ path . basename ( projectDir ) } </title>${
471+ useVite ? "" : `\n <link rel="stylesheet" href="/styles.css" />`
472+ }
463473 </head>
464474 <body>
465475 <Component />
@@ -510,7 +520,9 @@ if (Deno.args.includes("build")) {
510520} else {
511521 await builder.listen(() => import("./main.ts"));
512522}` ;
513- await writeFile ( "dev.ts" , DEV_TS ) ;
523+ if ( ! useVite ) {
524+ await writeFile ( "dev.ts" , DEV_TS ) ;
525+ }
514526
515527 const denoJson = {
516528 nodeModulesDir : "auto" ,
@@ -555,7 +567,19 @@ if (Deno.args.includes("build")) {
555567 } ,
556568 } ;
557569
558- if ( useTailwind ) {
570+ if ( useVite ) {
571+ denoJson . tasks . dev = "vite" ;
572+ denoJson . tasks . build = "vite build" ;
573+
574+ denoJson . imports [ "@fresh/plugin-vite" ] = "jsr:@fresh/plugin-vite@^0.9.5" ;
575+ denoJson . imports [ "vite" ] = "npm:vite@^7.1.3" ;
576+
577+ if ( useTailwind ) {
578+ denoJson . imports [ "tailwindcss" ] =
579+ `npm:tailwindcss@^${ TAILWINDCSS_VERSION } ` ;
580+ denoJson . imports [ "@tailwindcss/vite" ] = `npm:@tailwindcss/vite@^4.1.12` ;
581+ }
582+ } else if ( useTailwind ) {
559583 denoJson . imports [ "tailwindcss" ] = `npm:tailwindcss@^${ TAILWINDCSS_VERSION } ` ;
560584 denoJson . imports [ "@fresh/plugin-tailwind" ] =
561585 `jsr:@fresh/plugin-tailwind@^${ FRESH_TAILWIND_VERSION } ` ;
@@ -566,6 +590,21 @@ if (Deno.args.includes("build")) {
566590
567591 await writeFile ( "deno.json" , denoJson ) ;
568592
593+ if ( useVite ) {
594+ let viteConfig = `import { defineConfig } from "vite";
595+ import { fresh } from "@fresh/plugin-vite";\n` ;
596+
597+ if ( useTailwind ) {
598+ viteConfig += `import tailwindcss from "@tailwindcss/vite";\n` ;
599+ }
600+
601+ viteConfig += `\nexport default defineConfig({
602+ plugins: [fresh()${ useTailwind ? ", tailwindcss()" : "" } ],
603+ });` ;
604+
605+ await writeFile ( "vite.config.ts" , viteConfig ) ;
606+ }
607+
569608 const README_MD = `# Fresh project
570609
571610Your new Fresh project is ready to go. You can follow the Fresh "Getting
0 commit comments