@@ -39,8 +39,9 @@ const FEATURE_FLAGS = [
3939 'playwright' ,
4040 'eslint' ,
4141 'prettier' ,
42- 'eslint-with-oxlint' ,
4342 'eslint-with-prettier' ,
43+ 'oxlint' ,
44+ 'rolldown-vite' ,
4445] as const
4546
4647const FEATURE_OPTIONS = [
@@ -77,14 +78,24 @@ const FEATURE_OPTIONS = [
7778 label : language . needsPrettier . message ,
7879 } ,
7980] as const
81+ const EXPERIMENTAL_FEATURE_OPTIONS = [
82+ {
83+ value : 'oxlint' ,
84+ label : language . needsOxlint . message ,
85+ } ,
86+ {
87+ value : 'rolldown-vite' ,
88+ label : language . needsRolldownVite . message ,
89+ } ,
90+ ] as const
8091
8192type PromptResult = {
8293 projectName ?: string
8394 shouldOverwrite ?: boolean
8495 packageName ?: string
8596 features ?: ( typeof FEATURE_OPTIONS ) [ number ] [ 'value' ] [ ]
8697 e2eFramework ?: 'cypress' | 'nightwatch' | 'playwright'
87- experimentOxlint ?: boolean
98+ experimentFeatures ?: ( typeof EXPERIMENTAL_FEATURE_OPTIONS ) [ number ] [ 'value' ] [ ]
8899}
89100
90101function isValidPackageName ( projectName ) {
@@ -177,12 +188,14 @@ Available feature flags:
177188 If used without ${ cyan ( '--vitest' ) } , it will also add Nightwatch Component Testing.
178189 --eslint
179190 Add ESLint for code quality.
180- --eslint-with-oxlint
181- Add ESLint for code quality, and use Oxlint to speed up the linting process.
182191 --eslint-with-prettier (Deprecated in favor of ${ cyan ( '--eslint --prettier' ) } )
183192 Add Prettier for code formatting in addition to ESLint.
184193 --prettier
185194 Add Prettier for code formatting.
195+ --oxlint
196+ Add Oxlint for code quality and formatting.
197+ --rolldown-vite
198+ Use Rolldown Vite instead of Vite for building the project.
186199
187200Unstable feature flags:
188201 --tests, --with-tests
@@ -232,7 +245,7 @@ async function init() {
232245 packageName : defaultProjectName ,
233246 features : [ ] ,
234247 e2eFramework : undefined ,
235- experimentOxlint : false ,
248+ experimentFeatures : [ ] ,
236249 }
237250
238251 intro (
@@ -321,32 +334,28 @@ async function init() {
321334 } ) ,
322335 )
323336 }
324-
325- if ( result . features . includes ( 'eslint' ) ) {
326- result . experimentOxlint = await unwrapPrompt (
327- confirm ( {
328- message : language . needsOxlint . message ,
329- initialValue : false ,
330- } ) ,
331- )
332- }
337+ result . experimentFeatures = await unwrapPrompt (
338+ multiselect ( {
339+ message : `${ language . needsExperimentalFeatures . message } ${ dim ( language . needsExperimentalFeatures . hint ) } ` ,
340+ // @ts -expect-error @clack/prompt's type doesn't support readonly array yet
341+ options : EXPERIMENTAL_FEATURE_OPTIONS ,
342+ required : false ,
343+ } ) ,
344+ )
333345 }
334346
335- const { features } = result
347+ const { features , experimentFeatures } = result
336348
337349 const needsTypeScript = argv . ts || argv . typescript || features . includes ( 'typescript' )
338350 const needsJsx = argv . jsx || features . includes ( 'jsx' )
339351 const needsRouter = argv . router || argv [ 'vue-router' ] || features . includes ( 'router' )
340352 const needsPinia = argv . pinia || features . includes ( 'pinia' )
341353 const needsVitest = argv . vitest || argv . tests || features . includes ( 'vitest' )
342- const needsEslint =
343- argv . eslint ||
344- argv [ 'eslint-with-oxlint' ] ||
345- argv [ 'eslint-with-prettier' ] ||
346- features . includes ( 'eslint' )
354+ const needsEslint = argv . eslint || argv [ 'eslint-with-prettier' ] || features . includes ( 'eslint' )
347355 const needsPrettier =
348356 argv . prettier || argv [ 'eslint-with-prettier' ] || features . includes ( 'prettier' )
349- const needsOxlint = argv [ 'eslint-with-oxlint' ] || result . experimentOxlint
357+ const needsOxlint = experimentFeatures . includes ( 'oxlint' ) || argv [ 'oxlint' ]
358+ const needsRolldownVite = experimentFeatures . includes ( 'rolldown-vite' ) || argv [ 'rolldown-vite' ]
350359
351360 const { e2eFramework } = result
352361 const needsCypress = argv . cypress || argv . tests || e2eFramework === 'cypress'
@@ -374,6 +383,13 @@ async function init() {
374383 const templateDir = path . resolve ( templateRoot , templateName )
375384 renderTemplate ( templateDir , root , callbacks )
376385 }
386+ const replaceVite = ( ) => {
387+ const content = fs . readFileSync ( path . resolve ( root , 'package.json' ) , 'utf-8' )
388+ const json = JSON . parse ( content )
389+ // Replace `vite` with `rolldown-vite` if the feature is enabled
390+ json . devDependencies . vite = 'npm:rolldown-vite@latest'
391+ fs . writeFileSync ( path . resolve ( root , 'package.json' ) , JSON . stringify ( json , null , 2 ) )
392+ }
377393 // Render base template
378394 render ( 'base' )
379395
@@ -471,7 +487,7 @@ async function init() {
471487 }
472488
473489 // Render ESLint config
474- if ( needsEslint ) {
490+ if ( needsEslint || needsOxlint ) {
475491 renderEslint ( root , {
476492 needsTypeScript,
477493 needsOxlint,
@@ -492,6 +508,11 @@ async function init() {
492508 render ( 'config/prettier' )
493509 }
494510
511+ // use rolldown-vite if the feature is enabled
512+ if ( needsRolldownVite ) {
513+ replaceVite ( )
514+ }
515+
495516 // Render code template.
496517 // prettier-ignore
497518 const codeTemplate =
0 commit comments