Skip to content

Commit fa2a2ce

Browse files
authored
feat: add experimental Oxlint integration (#601)
1 parent 120bc2f commit fa2a2ce

File tree

9 files changed

+93
-44
lines changed

9 files changed

+93
-44
lines changed

index.ts

+22-6
Original file line numberDiff line numberDiff line change
@@ -141,7 +141,8 @@ async function init() {
141141
needsPinia?: boolean
142142
needsVitest?: boolean
143143
needsE2eTesting?: false | 'cypress' | 'nightwatch' | 'playwright'
144-
needsEslint?: boolean
144+
needsEslint?: false | 'eslintOnly' | 'speedUpWithOxlint'
145+
needsOxlint?: boolean
145146
needsPrettier?: boolean
146147
needsDevTools?: boolean
147148
} = {}
@@ -274,11 +275,23 @@ async function init() {
274275
},
275276
{
276277
name: 'needsEslint',
277-
type: () => (isFeatureFlagsUsed ? null : 'toggle'),
278+
type: () => (isFeatureFlagsUsed ? null : 'select'),
278279
message: language.needsEslint.message,
279-
initial: false,
280-
active: language.defaultToggleOptions.active,
281-
inactive: language.defaultToggleOptions.inactive,
280+
initial: 0,
281+
choices: [
282+
{
283+
title: language.needsEslint.selectOptions.negative.title,
284+
value: false,
285+
},
286+
{
287+
title: language.needsEslint.selectOptions.eslintOnly.title,
288+
value: 'eslintOnly',
289+
},
290+
{
291+
title: language.needsEslint.selectOptions.speedUpWithOxlint.title,
292+
value: 'speedUpWithOxlint',
293+
},
294+
],
282295
},
283296
{
284297
name: 'needsPrettier',
@@ -324,11 +337,13 @@ async function init() {
324337
needsRouter = argv.router || argv['vue-router'],
325338
needsPinia = argv.pinia,
326339
needsVitest = argv.vitest || argv.tests,
327-
needsEslint = argv.eslint || argv['eslint-with-prettier'],
328340
needsPrettier = argv['eslint-with-prettier'],
329341
needsDevTools = argv.devtools || argv['vue-devtools'],
330342
} = result
331343

344+
const needsEslint = Boolean(argv.eslint || argv['eslint-with-prettier'] || result.needsEslint)
345+
const needsOxlint = result.needsEslint === 'speedUpWithOxlint'
346+
332347
const { needsE2eTesting } = result
333348
const needsCypress = argv.cypress || argv.tests || needsE2eTesting === 'cypress'
334349
const needsCypressCT = needsCypress && !needsVitest
@@ -459,6 +474,7 @@ async function init() {
459474
if (needsEslint) {
460475
renderEslint(root, {
461476
needsTypeScript,
477+
needsOxlint,
462478
needsVitest,
463479
needsCypress,
464480
needsCypressCT,

locales/en-US.json

+10-1
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,16 @@
4545
}
4646
},
4747
"needsEslint": {
48-
"message": "Add ESLint for code quality?"
48+
"message": "Add ESLint for code quality?",
49+
"selectOptions": {
50+
"negative": { "title": "No" },
51+
"eslintOnly": {
52+
"title": "Yes"
53+
},
54+
"speedUpWithOxlint": {
55+
"title": "Yes, and speed up with Oxlint (experimental)"
56+
}
57+
}
4958
},
5059
"needsPrettier": {
5160
"message": "Add Prettier for code formatting?"

locales/fr-FR.json

+10-1
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,16 @@
4545
}
4646
},
4747
"needsEslint": {
48-
"message": "Ajouter ESLint pour la qualité du code\u00a0?"
48+
"message": "Ajouter ESLint pour la qualité du code\u00a0?",
49+
"selectOptions": {
50+
"negative": { "title": "Non" },
51+
"eslintOnly": {
52+
"title": "Oui"
53+
},
54+
"speedUpWithOxlint": {
55+
"title": "Oui, et accélérer avec Oxlint (expérimental)"
56+
}
57+
}
4958
},
5059
"needsPrettier": {
5160
"message": "Ajouter Prettier pour le formatage du code\u00a0?"

locales/tr-TR.json

+10-1
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,16 @@
4545
}
4646
},
4747
"needsEslint": {
48-
"message": "Kod kalitesi için ESLint eklensin mi?"
48+
"message": "Kod kalitesi için ESLint eklensin mi?",
49+
"selectOptions": {
50+
"negative": { "title": "Hayır" },
51+
"eslintOnly": {
52+
"title": "Evet"
53+
},
54+
"speedUpWithOxlint": {
55+
"title": "Evet ve Oxlint ile hızlanın (deneysel)"
56+
}
57+
}
4958
},
5059
"needsPrettier": {
5160
"message": "Kod formatlama için Prettier eklensin mi?"

locales/zh-Hans.json

+10-1
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,16 @@
4545
}
4646
},
4747
"needsEslint": {
48-
"message": "是否引入 ESLint 用于代码质量检测?"
48+
"message": "是否引入 ESLint 用于代码质量检测?",
49+
"selectOptions": {
50+
"negative": { "title": "" },
51+
"eslintOnly": {
52+
"title": ""
53+
},
54+
"speedUpWithOxlint": {
55+
"title": "是,并同时引入 Oxlint 以加快检测(试验阶段)"
56+
}
57+
}
4958
},
5059
"needsPrettier": {
5160
"message": "是否引入 Prettier 用于代码格式化?"

locales/zh-Hant.json

+10-1
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,16 @@
4949
}
5050
},
5151
"needsEslint": {
52-
"message": "是否引入 ESLint 用於程式碼品質檢測?"
52+
"message": "是否引入 ESLint 用於程式碼品質檢測?",
53+
"selectOptions": {
54+
"negative": { "title": "" },
55+
"eslintOnly": {
56+
"title": ""
57+
},
58+
"speedUpWithOxlint": {
59+
"title": "是,並同時引入 Oxlint 以加快檢測(試驗性功能)"
60+
}
61+
}
5362
},
5463
"needsPrettier": {
5564
"message": "是否引入 Prettier 用於程式碼格式化?"

package.json

+1-1
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@
4141
"@types/eslint": "^9.6.1",
4242
"@types/node": "^20.17.6",
4343
"@types/prompts": "^2.4.9",
44-
"@vue/create-eslint-config": "0.5.0",
44+
"@vue/create-eslint-config": "^0.6.0",
4545
"@vue/tsconfig": "^0.5.1",
4646
"ejs": "^3.1.10",
4747
"esbuild": "^0.24.0",

pnpm-lock.yaml

+6-14
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

utils/renderEslint.ts

+14-18
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,15 @@ const eslintDeps = eslintTemplatePackage.devDependencies
1111

1212
export default function renderEslint(
1313
rootDir,
14-
{ needsTypeScript, needsVitest, needsCypress, needsCypressCT, needsPrettier, needsPlaywright },
14+
{
15+
needsTypeScript,
16+
needsVitest,
17+
needsCypress,
18+
needsCypressCT,
19+
needsOxlint,
20+
needsPrettier,
21+
needsPlaywright,
22+
},
1523
) {
1624
const additionalConfigs = getAdditionalConfigs({
1725
needsVitest,
@@ -23,32 +31,20 @@ export default function renderEslint(
2331
const { pkg, files } = createESLintConfig({
2432
styleGuide: 'default',
2533
hasTypeScript: needsTypeScript,
34+
needsOxlint,
35+
// Theoretically, we could add Prettier without requring ESLint.
36+
// But it doesn't seem to be a good practice, so we just let createESLintConfig handle it.
2637
needsPrettier,
27-
2838
additionalConfigs,
2939
})
3040

31-
const scripts: Record<string, string> = {
32-
lint: 'eslint . --fix',
33-
}
34-
35-
// Theoretically, we could add Prettier without requring ESLint.
36-
// But it doesn't seem to be a good practice, so we just leave it here.
37-
if (needsPrettier) {
38-
// Default to only format the `src/` directory to avoid too much noise, and
39-
// the need for a `.prettierignore` file.
40-
// Users can still append any paths they'd like to format to the command,
41-
// e.g. `npm run format cypress/`.
42-
scripts.format = 'prettier --write src/'
43-
}
44-
4541
// update package.json
4642
const packageJsonPath = path.resolve(rootDir, 'package.json')
4743
const existingPkg = JSON.parse(fs.readFileSync(packageJsonPath, 'utf8'))
48-
const updatedPkg = sortDependencies(deepMerge(deepMerge(existingPkg, pkg), { scripts }))
44+
const updatedPkg = sortDependencies(deepMerge(existingPkg, pkg))
4945
fs.writeFileSync(packageJsonPath, JSON.stringify(updatedPkg, null, 2) + '\n', 'utf8')
5046

51-
// write to eslint.config.mjs, .prettierrc.json, .editorconfig, etc.
47+
// write to eslint.config.js, .prettierrc.json, .editorconfig, etc.
5248
for (const [fileName, content] of Object.entries(files)) {
5349
const fullPath = path.resolve(rootDir, fileName)
5450
fs.writeFileSync(fullPath, content as string, 'utf8')

0 commit comments

Comments
 (0)