Files
cypress/scripts/decaff/switch-false.js
renovate[bot] eab801ae3f chore(deps): Update dependency eslint to version 6.8.0 🌟 (#6509)
* chore(deps): Update eslint to 6.8.0 🌟

* fix missing dangling commas for linter

* fix missing dangling commas for linter

* more lint fixes

* yarn lock

Co-authored-by: WhiteSource Renovate <renovatebot@gmail.com>
Co-authored-by: Jennifer Shehane <shehane.jennifer@gmail.com>
2020-02-25 00:09:47 +06:30

99 lines
2.0 KiB
JavaScript

module.exports = (fileInfo, api) => {
const j = api.jscodeshift
return j(fileInfo.source)
.find(j.SwitchStatement, {
discriminant: {
type: 'Literal',
value: false,
},
})
.replaceWith((nodePath) => {
const { node } = nodePath
const cases = node.cases.map((c) => {
const { test, consequent, comments } = c
return {
test: generateTest(j, test),
content: generateContent(j, consequent),
comments,
}
})
const ifStatement = generateIfStatement(j, cases)
ifStatement.comments = node.comments
return ifStatement
})
.toSource()
}
function generateTest (j, test) {
if (test) {
if (test.type === 'UnaryExpression') {
return test.argument
}
return j.unaryExpression('!', test)
}
return null
}
function generateContent (j, consequent) {
if (consequent.length === 1 && consequent[0].type === 'BreakStatement') {
const block = j.blockStatement([])
block.comments = consequent[0].comments
return block
}
return j.blockStatement(consequent.filter((c) => c.type !== 'BreakStatement'))
}
function generateIfStatement (j, cases) {
const nonDefaultCases = cases.filter((c) => c.test !== null)
const defaultCase = cases.filter((c) => c.test === null)[0]
let ifStatement = null
if (defaultCase) {
const content = addComment(defaultCase.content, defaultCase.comments)
ifStatement = content
}
nonDefaultCases.reverse().forEach((c) => {
const content = addComment(c.content, c.comments)
ifStatement = j.ifStatement(
c.test,
content,
ifStatement,
)
})
return ifStatement
}
function addComment (content, comments) {
if (content.body.length > 0) {
content.body[0].comments = [...(comments || []), ...(content.body[0].comments || [])]
} else {
const newComments = (comments || []).map((co) => {
return {
...co,
leading: false,
trailing: false,
}
})
content.comments = [...newComments, ...(content.comments || [])]
}
return content
}