Skip to content

Commit 9cfafea

Browse files
committed
refactor(cli): default to .js for eslintrc and postcssrc
close #994
1 parent 23480ae commit 9cfafea

File tree

10 files changed

+50
-29
lines changed

10 files changed

+50
-29
lines changed

packages/@vue/cli-plugin-eslint/generator.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,7 @@ module.exports = (api, { config, lintOn = [] }) => {
7373
}
7474
}
7575
api.render(files => {
76-
files['tests/unit/.eslintrc'] = JSON.stringify(config, null, 2)
76+
files['tests/unit/.eslintrc.js'] = api.genJSConfig(config)
7777
})
7878
} else if (api.hasPlugin('unit-jest')) {
7979
const config = {
@@ -85,7 +85,7 @@ module.exports = (api, { config, lintOn = [] }) => {
8585
}
8686
}
8787
api.render(files => {
88-
files['tests/unit/.eslintrc'] = JSON.stringify(config, null, 2)
88+
files['tests/unit/.eslintrc.js'] = api.genJSConfig(config)
8989
})
9090
}
9191

packages/@vue/cli-plugin-typescript/generator/index.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -112,7 +112,7 @@ module.exports = (api, {
112112
// delete all js files that have a ts file of the same name
113113
// and simply rename other js files to ts
114114
const jsRE = /\.js$/
115-
const excludeRE = /^tests\/e2e\/|\.config\.js$/
115+
const excludeRE = /^tests\/e2e\/|(\.config|rc)\.js$/
116116
const convertLintFlags = require('../lib/convertLintFlags')
117117
api.postProcessFiles(files => {
118118
for (const file in files) {

packages/@vue/cli-plugin-unit-jest/__tests__/jestGenerator.spec.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ test('base', async () => {
1818
expect(pkg.scripts.test).toBeTruthy()
1919
expect(pkg.devDependencies).toHaveProperty('@vue/test-utils')
2020
expect(pkg.devDependencies).toHaveProperty('babel-jest')
21-
expect(files['tests/unit/.eslintrc']).toMatch('"jest": true')
21+
expect(files['tests/unit/.eslintrc.js']).toMatch('jest: true')
2222

2323
const spec = files['tests/unit/HelloWorld.spec.js']
2424
expect(spec).toMatch(`expect(wrapper.text()).toMatch(msg)`)

packages/@vue/cli-plugin-unit-jest/generator/index.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -65,12 +65,12 @@ module.exports = api => {
6565

6666
if (api.hasPlugin('eslint')) {
6767
api.render(files => {
68-
files['tests/unit/.eslintrc'] = JSON.stringify({
68+
files['tests/unit/.eslintrc.js'] = api.genJSConfig({
6969
env: { jest: true },
7070
rules: {
7171
'import/no-extraneous-dependencies': 'off'
7272
}
73-
}, null, 2)
73+
})
7474
})
7575
}
7676
}

packages/@vue/cli-plugin-unit-mocha/__tests__/mochaGenerator.spec.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ test('base', async () => {
1717

1818
expect(pkg.scripts.test).toBeTruthy()
1919
expect(pkg.devDependencies).toHaveProperty('@vue/test-utils')
20-
expect(files['tests/unit/.eslintrc']).toMatch('"mocha": true')
20+
expect(files['tests/unit/.eslintrc.js']).toMatch('mocha: true')
2121

2222
const spec = files['tests/unit/HelloWorld.spec.js']
2323
expect(spec).toMatch(`import { expect } from 'chai'`)

packages/@vue/cli-plugin-unit-mocha/generator/index.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,12 +15,12 @@ module.exports = api => {
1515

1616
if (api.hasPlugin('eslint')) {
1717
api.render(files => {
18-
files['tests/unit/.eslintrc'] = JSON.stringify({
18+
files['tests/unit/.eslintrc.js'] = api.genJSConfig({
1919
env: { mocha: true },
2020
rules: {
2121
'import/no-extraneous-dependencies': 'off'
2222
}
23-
}, null, 2)
23+
})
2424
})
2525
}
2626
}

packages/@vue/cli/__tests__/Generator.spec.js

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ const fs = require('fs')
44
const path = require('path')
55
const Generator = require('../lib/Generator')
66
const { logs } = require('@vue/cli-shared-utils')
7+
const stringifyJS = require('javascript-stringify')
78

89
// prepare template fixtures
910
const mkdirp = require('mkdirp')
@@ -327,7 +328,7 @@ test('api: resolve', () => {
327328
test('extract config files', async () => {
328329
const configs = {
329330
vue: {
330-
lintOnSave: true
331+
lintOnSave: false
331332
},
332333
babel: {
333334
presets: ['@vue/app']
@@ -357,9 +358,10 @@ test('extract config files', async () => {
357358
})
358359

359360
const json = v => JSON.stringify(v, null, 2)
360-
expect(fs.readFileSync('/vue.config.js', 'utf-8')).toMatch('module.exports = {\n lintOnSave: true\n}')
361+
const js = v => `module.exports = ${stringifyJS(v, null, 2)}`
362+
expect(fs.readFileSync('/vue.config.js', 'utf-8')).toMatch(js(configs.vue))
361363
expect(fs.readFileSync('/.babelrc', 'utf-8')).toMatch(json(configs.babel))
362-
expect(fs.readFileSync('/.postcssrc', 'utf-8')).toMatch(json(configs.postcss))
363-
expect(fs.readFileSync('/.eslintrc', 'utf-8')).toMatch(json(configs.eslintConfig))
364-
expect(fs.readFileSync('/jest.config.js', 'utf-8')).toMatch(`module.exports = {\n foo: 'bar'\n}`)
364+
expect(fs.readFileSync('/.postcssrc.js', 'utf-8')).toMatch(js(configs.postcss))
365+
expect(fs.readFileSync('/.eslintrc.js', 'utf-8')).toMatch(js(configs.eslintConfig))
366+
expect(fs.readFileSync('/jest.config.js', 'utf-8')).toMatch(js(configs.jest))
365367
})

packages/@vue/cli/__tests__/invoke.spec.js

Lines changed: 12 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@ jest.mock('inquirer')
44
const invoke = require('../lib/invoke')
55
const { expectPrompts } = require('inquirer')
66
const create = require('@vue/cli-test-utils/createTestProject')
7+
const stringifyJS = require('javascript-stringify')
8+
const toJS = v => `module.exports = ${stringifyJS(v, null, 2)}`
79

810
async function createAndInstall (name) {
911
const project = await create(name, {
@@ -26,11 +28,11 @@ async function assertUpdates (project) {
2628
'pre-commit': 'lint-staged'
2729
})
2830

29-
const eslintrc = JSON.parse(await project.read('.eslintrc'))
30-
expect(eslintrc).toEqual({
31+
const eslintrc = await project.read('.eslintrc.js')
32+
expect(eslintrc).toEqual(toJS({
3133
root: true,
3234
extends: ['plugin:vue/essential', '@vue/airbnb']
33-
})
35+
}))
3436

3537
const lintedMain = await project.read('src/main.js')
3638
expect(lintedMain).toMatch(';') // should've been linted in post-generate hook
@@ -78,11 +80,11 @@ test('invoke with existing files', async () => {
7880
// mock existing vue.config.js
7981
await project.write('vue.config.js', `module.exports = { lintOnSave: true }`)
8082

81-
const eslintrc = JSON.parse(await project.read('.eslintrc'))
82-
expect(eslintrc).toEqual({
83+
const eslintrc = await project.read('.eslintrc.js')
84+
expect(eslintrc).toEqual(toJS({
8385
root: true,
8486
extends: ['plugin:vue/essential', 'eslint:recommended']
85-
})
87+
}))
8688

8789
await project.run(`${require.resolve('../bin/vue')} invoke eslint --config airbnb --lintOn commit`)
8890

@@ -104,13 +106,13 @@ test('invoke with existing files (yaml)', async () => {
104106
pkg.devDependencies['@vue/cli-plugin-eslint'] = '*'
105107
await project.write('package.json', JSON.stringify(pkg, null, 2))
106108

107-
const eslintrc = JSON.parse(await project.read('.eslintrc'))
108-
expect(eslintrc).toEqual({
109+
const eslintrc = await project.read('.eslintrc.js')
110+
expect(eslintrc).toEqual(toJS({
109111
root: true,
110112
extends: ['plugin:vue/essential', 'eslint:recommended']
111-
})
113+
}))
112114

113-
await project.rm(`.eslintrc`)
115+
await project.rm(`.eslintrc.js`)
114116
await project.write(`.eslintrc.yml`, `
115117
root: true
116118
extends:

packages/@vue/cli/lib/GeneratorAPI.js

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ const resolve = require('resolve')
77
const isBinary = require('isbinaryfile')
88
const yaml = require('yaml-front-matter')
99
const mergeDeps = require('./util/mergeDeps')
10+
const stringifyJS = require('javascript-stringify')
1011
const { getPluginLink, toShortPluginId } = require('@vue/cli-shared-utils')
1112

1213
const isString = val => typeof val === 'string'
@@ -191,6 +192,13 @@ class GeneratorAPI {
191192
exitLog (msg, type = 'log') {
192193
this.generator.exitLogs.push({ id: this.id, msg, type })
193194
}
195+
196+
/**
197+
* convenience method for generating a js config file from json
198+
*/
199+
genJSConfig (value) {
200+
return `module.exports = ${stringifyJS(value, null, 2)}`
201+
}
194202
}
195203

196204
function extractCallDir () {

packages/@vue/cli/lib/util/configTransforms.js

Lines changed: 14 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -35,11 +35,20 @@ function makeJSONTransform (filename) {
3535
}
3636
}
3737

38-
function makeMutliExtensionJSONTransform (filename) {
38+
function makeMutliExtensionJSONTransform (filename, preferJS) {
3939
return function transformToMultiExtensions (value, checkExisting, context) {
40+
function defaultTransform () {
41+
if (preferJS) {
42+
return makeJSTransform(`${filename}.js`)(value, false, context)
43+
} else {
44+
return makeJSONTransform(filename)(value, false, context)
45+
}
46+
}
47+
4048
if (!checkExisting) {
41-
return makeJSONTransform(filename)(value, checkExisting, context)
49+
return defaultTransform()
4250
}
51+
4352
const absolutePath = path.resolve(context, filename)
4453
if (fs.existsSync(absolutePath)) {
4554
return makeJSONTransform(filename)(value, checkExisting, context)
@@ -52,7 +61,7 @@ function makeMutliExtensionJSONTransform (filename) {
5261
} else if (fs.existsSync(`${absolutePath}.yml`)) {
5362
return transformYAML(value, `${filename}.yml`, fs.readFileSync(`${absolutePath}.yml`, 'utf-8'))
5463
} else {
55-
return makeJSONTransform(filename)(value, false, context)
64+
return defaultTransform()
5665
}
5766
}
5867
}
@@ -69,7 +78,7 @@ function transformYAML (value, filename, source) {
6978
module.exports = {
7079
vue: makeJSTransform('vue.config.js'),
7180
babel: makeJSONTransform('.babelrc'),
72-
postcss: makeMutliExtensionJSONTransform('.postcssrc'),
73-
eslintConfig: makeMutliExtensionJSONTransform('.eslintrc'),
81+
postcss: makeMutliExtensionJSONTransform('.postcssrc', true),
82+
eslintConfig: makeMutliExtensionJSONTransform('.eslintrc', true),
7483
jest: makeJSTransform('jest.config.js')
7584
}

0 commit comments

Comments
 (0)