eslint-plugin-prettier-doc
Version:
ESLint rules for Prettier Doc.
74 lines (67 loc) • 2.08 kB
JavaScript
const concatCallSelector = [
'CallExpression',
'[optional!=true]',
'[callee.type="Identifier"]',
'[callee.name="concat"]',
'[arguments.length=1]',
].join('')
const selector = [
concatCallSelector,
'>',
'ArrayExpression.arguments',
'>',
`${concatCallSelector}.elements`,
].join('')
const messageId = 'no-nested-concat'
module.exports = {
meta: {
type: 'suggestion',
docs: {
url: 'https://github.com/fisker/eslint-plugin-prettier-doc#no-nested-concat',
},
messages: {
[]: 'Do not use `concat(…)` in `concat(…)`.',
},
fixable: 'code',
},
create(context) {
const sourceCode = context.getSourceCode()
return {
[](node) {
context.report({
node,
messageId,
*fix(fixer) {
// Remove `concat`
yield fixer.remove(node.callee)
const openingParenthesisToken = sourceCode.getTokenAfter(
node.callee,
)
yield fixer.remove(openingParenthesisToken)
const closingParenthesisToken = sourceCode.getLastToken(node)
yield fixer.remove(closingParenthesisToken)
const [concatParts] = node.arguments
if (concatParts.type === 'ArrayExpression') {
const firstToken = sourceCode.getFirstToken(concatParts)
yield fixer.remove(firstToken)
const lastToken = sourceCode.getLastToken(concatParts)
yield fixer.remove(lastToken)
// trailing comma
const lastElement =
concatParts.elements[concatParts.elements.length - 1]
const penultimateToken = sourceCode.getTokenAfter(lastElement)
if (
penultimateToken.type === 'Punctuator' &&
penultimateToken.value === ','
) {
yield fixer.remove(penultimateToken)
}
} else {
yield fixer.insertTextBefore(concatParts, '...')
}
},
})
},
}
},
}