Skip to content

Fix: if no trailing comma, not to leave trailing comma after fixed of order-in-components #569

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 3 commits into from
Sep 18, 2018
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
15 changes: 9 additions & 6 deletions lib/rules/order-in-components.js
Original file line number Diff line number Diff line change
Expand Up @@ -193,21 +193,24 @@ module.exports = {
if (hasSideEffectsPossibility) {
return undefined
}
const comma = sourceCode.getTokenAfter(propertyNode)
const hasAfterComma = isComma(comma)
const afterComma = sourceCode.getTokenAfter(propertyNode)
const hasAfterComma = isComma(afterComma)

const codeStart = sourceCode.getTokenBefore(propertyNode).range[1] // to include comments
const codeEnd = hasAfterComma ? comma.range[1] : propertyNode.range[1]
const beforeComma = sourceCode.getTokenBefore(propertyNode)
const codeStart = beforeComma.range[1] // to include comments
const codeEnd = hasAfterComma ? afterComma.range[1] : propertyNode.range[1]

const propertyCode = sourceCode.text.slice(codeStart, codeEnd) + (hasAfterComma ? '' : ',')
const insertTarget = sourceCode.getTokenBefore(firstUnorderedPropertyNode)

const removeStart = hasAfterComma ? codeStart : beforeComma.range[0]
// If we can upgrade requirements to `eslint@>4.1.0`, this code can be replaced by:
// return [
// fixer.removeRange([codeStart, codeEnd]),
// fixer.removeRange([removeStart, codeEnd]),
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We already updated to ESLint >=5 so we can use the above shorthand ☝️

// fixer.insertTextAfter(insertTarget, propertyCode)
// ]
const insertStart = insertTarget.range[1]
const newCode = propertyCode + sourceCode.text.slice(insertStart, codeStart)
const newCode = propertyCode + sourceCode.text.slice(insertStart, removeStart)
return fixer.replaceTextRange([insertStart, codeEnd], newCode)
}
})
Expand Down
87 changes: 87 additions & 0 deletions tests/lib/autofix.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,87 @@
/**
* @author Yosuke Ota <https://github.com/ota-meshi>
* See LICENSE file in root directory for full license.
*/
'use strict'

const Linter = require('eslint').Linter
const chai = require('chai')

const rules = require('../..').rules

const assert = chai.assert

const baseConfig = {
parser: 'vue-eslint-parser',
parserOptions: {
ecmaVersion: 2018,
sourceType: 'module',
ecmaFeatures: {
jsx: true
}
}
}

describe('Complex autofix test cases', () => {
const linter = new Linter()
for (const key of Object.keys(rules)) {
const ruleId = `vue/${key}`
linter.defineRule(ruleId, rules[key])
}

// https://github.com/vuejs/eslint-plugin-vue/issues/566
describe('Autofix of `vue/order-in-components` and `comma-dangle` should not conflict.', () => {
const config = Object.assign({}, baseConfig, { 'rules': {
'vue/order-in-components': ['error'],
'comma-dangle': ['error', 'always']
}})
it('Even if set comma-dangle:always, the output should be as expected.', () => {
const code = `
<script>
export default {
data() {
},
name: 'burger'
};
</script>`
const output = `
<script>
export default {
name: 'burger',
data() {
},
};
</script>`
assert.equal(
linter.verifyAndFix(code, config, 'test.vue').output,
output
)
})
it('Even if include comments, the output should be as expected.', () => {
const code = `
<script>
export default {
/**data*/
data() {
}/*after data*/,
/**name*/
name: 'burger'/*after name*/
};
</script>`
const output = `
<script>
export default {
/**name*/
name: 'burger',
/**data*/
data() {
},/*after data*//*after name*/
};
</script>`
assert.equal(
linter.verifyAndFix(code, config, 'test.vue').output,
output
)
})
})
})
32 changes: 29 additions & 3 deletions tests/lib/rules/order-in-components.js
Original file line number Diff line number Diff line change
Expand Up @@ -374,7 +374,7 @@ ruleTester.run('order-in-components', rule, {
data() {
},
test: 'ok',
name: 'burger',
name: 'burger'
};
`,
options: [{ order: ['data', 'test', 'name'] }],
Expand All @@ -401,7 +401,33 @@ ruleTester.run('order-in-components', rule, {
name: 'burger',
/** data provider */
data() {
},
}
};
`,
errors: [{
message: 'The "name" property should be above the "data" property on line 4.',
line: 7
}]
},
{
filename: 'example.vue',
code: `
export default {
/** data provider */
data() {
}/*test*/,
/** name of vue component */
name: 'burger'
};
`,
parserOptions,
output: `
export default {
/** name of vue component */
name: 'burger',
/** data provider */
data() {
}/*test*/
};
`,
errors: [{
Expand All @@ -413,7 +439,7 @@ ruleTester.run('order-in-components', rule, {
filename: 'example.vue',
code: `export default {data(){},name:'burger'};`,
parserOptions,
output: `export default {name:'burger',data(){},};`,
output: `export default {name:'burger',data(){}};`,
errors: [{
message: 'The "name" property should be above the "data" property on line 1.',
line: 1
Expand Down