Skip to content

Commit 3ee5af0

Browse files
committed
feat: add rolldown-vite features
1 parent 2ea324c commit 3ee5af0

File tree

7 files changed

+104
-23
lines changed

7 files changed

+104
-23
lines changed

index.ts

Lines changed: 46 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -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

4647
const FEATURE_OPTIONS = [
@@ -76,6 +77,20 @@ const FEATURE_OPTIONS = [
7677
value: 'prettier',
7778
label: language.needsPrettier.message,
7879
},
80+
{
81+
value: 'experimental features',
82+
label: language.needExperimenttal.message,
83+
},
84+
] as const
85+
const EXPERIMENTAL_FEATURE_OPTIONS = [
86+
{
87+
value: 'oxlint',
88+
label: language.needsOxlint.message,
89+
},
90+
{
91+
value: 'rolldown-vite',
92+
label: language.needsRolldownVite.message,
93+
},
7994
] as const
8095

8196
type PromptResult = {
@@ -84,7 +99,7 @@ type PromptResult = {
8499
packageName?: string
85100
features?: (typeof FEATURE_OPTIONS)[number]['value'][]
86101
e2eFramework?: 'cypress' | 'nightwatch' | 'playwright'
87-
experimentOxlint?: boolean
102+
experimentFeatures?: (typeof EXPERIMENTAL_FEATURE_OPTIONS)[number]['value'][]
88103
}
89104

90105
function isValidPackageName(projectName) {
@@ -177,12 +192,14 @@ Available feature flags:
177192
If used without ${cyan('--vitest')}, it will also add Nightwatch Component Testing.
178193
--eslint
179194
Add ESLint for code quality.
180-
--eslint-with-oxlint
181-
Add ESLint for code quality, and use Oxlint to speed up the linting process.
182195
--eslint-with-prettier (Deprecated in favor of ${cyan('--eslint --prettier')})
183196
Add Prettier for code formatting in addition to ESLint.
184197
--prettier
185198
Add Prettier for code formatting.
199+
--oxlint
200+
Add Oxlint for code quality and formatting.
201+
--rolldown-vite
202+
Use Rolldown Vite instead of Vite for building the project.
186203
187204
Unstable feature flags:
188205
--tests, --with-tests
@@ -232,7 +249,7 @@ async function init() {
232249
packageName: defaultProjectName,
233250
features: [],
234251
e2eFramework: undefined,
235-
experimentOxlint: false,
252+
experimentFeatures: [],
236253
}
237254

238255
intro(
@@ -322,31 +339,30 @@ async function init() {
322339
)
323340
}
324341

325-
if (result.features.includes('eslint')) {
326-
result.experimentOxlint = await unwrapPrompt(
327-
confirm({
328-
message: language.needsOxlint.message,
329-
initialValue: false,
342+
if (result.features.includes('experimental features')) {
343+
result.experimentFeatures = await unwrapPrompt(
344+
multiselect({
345+
message: `${language.needsExperimentalFeatures.message} ${dim(language.needsExperimentalFeatures.hint)}`,
346+
// @ts-expect-error @clack/prompt's type doesn't support readonly array yet
347+
options: EXPERIMENTAL_FEATURE_OPTIONS,
348+
required: false,
330349
}),
331350
)
332351
}
333352
}
334353

335-
const { features } = result
354+
const { features, experimentFeatures } = result
336355

337356
const needsTypeScript = argv.ts || argv.typescript || features.includes('typescript')
338357
const needsJsx = argv.jsx || features.includes('jsx')
339358
const needsRouter = argv.router || argv['vue-router'] || features.includes('router')
340359
const needsPinia = argv.pinia || features.includes('pinia')
341360
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')
361+
const needsEslint = argv.eslint || argv['eslint-with-prettier'] || features.includes('eslint')
347362
const needsPrettier =
348363
argv.prettier || argv['eslint-with-prettier'] || features.includes('prettier')
349-
const needsOxlint = argv['eslint-with-oxlint'] || result.experimentOxlint
364+
const needsOxlint = experimentFeatures.includes('oxlint') || argv['oxlint']
365+
const needsRolldownVite = experimentFeatures.includes('rolldown-vite') || argv['rolldown-vite']
350366

351367
const { e2eFramework } = result
352368
const needsCypress = argv.cypress || argv.tests || e2eFramework === 'cypress'
@@ -374,6 +390,13 @@ async function init() {
374390
const templateDir = path.resolve(templateRoot, templateName)
375391
renderTemplate(templateDir, root, callbacks)
376392
}
393+
const replaceVite = () => {
394+
const content = fs.readFileSync(path.resolve(root, 'package.json'), 'utf-8')
395+
const json = JSON.parse(content)
396+
// Replace `vite` with `rolldown-vite` if the feature is enabled
397+
json.devDependencies.vite = 'npm:rolldown-vite@latest'
398+
fs.writeFileSync(path.resolve(root, 'package.json'), JSON.stringify(json, null, 2))
399+
}
377400
// Render base template
378401
render('base')
379402

@@ -471,7 +494,7 @@ async function init() {
471494
}
472495

473496
// Render ESLint config
474-
if (needsEslint) {
497+
if (needsEslint || needsOxlint) {
475498
renderEslint(root, {
476499
needsTypeScript,
477500
needsOxlint,
@@ -492,6 +515,11 @@ async function init() {
492515
render('config/prettier')
493516
}
494517

518+
// use rolldown-vite if the feature is enabled
519+
if (needsRolldownVite) {
520+
replaceVite()
521+
}
522+
495523
// Render code template.
496524
// prettier-ignore
497525
const codeTemplate =

locales/en-US.json

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,17 @@
6060
}
6161
},
6262
"needsOxlint": {
63-
"message": "Install Oxlint for faster linting? (experimental)"
63+
"message": "Oxlint (experimental)"
64+
},
65+
"needExperimenttal": {
66+
"message": "Enable experimental features"
67+
},
68+
"needsExperimentalFeatures": {
69+
"message": "Select experimental features to include in your project:",
70+
"hint": "(↑/↓ to navigate, space to select, a to toggle all, enter to confirm)"
71+
},
72+
"needsRolldownVite": {
73+
"message": "rolldown-vite (experimental)"
6474
},
6575
"errors": {
6676
"operationCancelled": "Operation cancelled"

locales/fr-FR.json

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,17 @@
6060
}
6161
},
6262
"needsOxlint": {
63-
"message": "Installer Oxlint pour un linting plus rapide\u00a0? (expérimental)"
63+
"message": "Oxlint (expérimental)"
64+
},
65+
"needExperimenttal": {
66+
"message": "Activer les fonctionnalités expérimentales"
67+
},
68+
"needsExperimentalFeatures": {
69+
"message": "Sélectionnez les fonctionnalités expérimentales à inclure:",
70+
"hint": "(↑/↓ pour naviguer, espace pour sélectionner, a pour tout sélectionner, entrée pour confirmer)"
71+
},
72+
"needsRolldownVite": {
73+
"message": "rolldown-vite (expérimental)"
6474
},
6575
"errors": {
6676
"operationCancelled": "Operation annulée"

locales/tr-TR.json

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,17 @@
6060
}
6161
},
6262
"needsOxlint": {
63-
"message": "Daha hızlı linting için Oxlint eklensin mi? (deneysel)"
63+
"message": "Oxlint (deneysel)"
64+
},
65+
"needExperimenttal": {
66+
"message": "Deneysel özellikleri etkinleştir"
67+
},
68+
"needsExperimentalFeatures": {
69+
"message": "Dahil edilecek deneysel özellikleri seçin:",
70+
"hint": "(↑/↓ gezinmek için, boşluk seçmek için, a tümünü seçmek için, enter onaylamak için)"
71+
},
72+
"needsRolldownVite": {
73+
"message": "rolldown-vite (deneysel)"
6474
},
6575
"errors": {
6676
"operationCancelled": "İşlem iptal edildi"

locales/zh-Hans.json

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,17 @@
6060
}
6161
},
6262
"needsOxlint": {
63-
"message": "是否引入 Oxlint 以加快检测?(试验阶段)"
63+
"message": "Oxlint(试验阶段)"
64+
},
65+
"needExperimenttal": {
66+
"message": "启用试验特性"
67+
},
68+
"needsExperimentalFeatures": {
69+
"message": "选择要包含的试验特性:",
70+
"hint": "(↑/↓ 切换,空格选择,a 全选,回车确认)"
71+
},
72+
"needsRolldownVite": {
73+
"message": "rolldown-vite(试验阶段)"
6474
},
6575
"errors": {
6676
"operationCancelled": "操作取消"

locales/zh-Hant.json

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,17 @@
6060
}
6161
},
6262
"needsOxlint": {
63-
"message": "是否引入 Oxlint 以加快檢測?(試驗性功能)"
63+
"message": "Oxlint(試驗性功能)"
64+
},
65+
"needExperimenttal": {
66+
"message": "启用試驗性功能"
67+
},
68+
"needsExperimentalFeatures": {
69+
"message": "請選擇要包含的試驗特性:",
70+
"hint": "(↑/↓ 切換,空格選擇,a 全選,enter 確認)"
71+
},
72+
"needsRolldownVite": {
73+
"message": "rolldown-vite(試驗性功能)"
6474
},
6575
"errors": {
6676
"operationCancelled": "操作取消"

utils/getLanguage.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,10 @@ interface Language {
3737
[key: string]: { title: string; desc?: string; hintOnComponentTesting?: string }
3838
}
3939
}
40+
needExperimenttal: LanguageItem
41+
needsExperimentalFeatures: LanguageItem
4042
needsOxlint: LanguageItem
43+
needsRolldownVite: LanguageItem
4144
errors: {
4245
operationCancelled: string
4346
}

0 commit comments

Comments
 (0)