Skip to content

Commit

Permalink
Autofix eslint errors 🚗
Browse files Browse the repository at this point in the history
  • Loading branch information
01taylop committed Jul 23, 2024
1 parent 351d456 commit b34098a
Show file tree
Hide file tree
Showing 5 changed files with 132 additions and 16 deletions.
4 changes: 2 additions & 2 deletions babel.config.cjs
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,6 @@ module.exports = {
plugins: [
['babel-plugin-transform-import-meta', {
module: 'ES6',
}]
]
}],
],
}
1 change: 1 addition & 0 deletions eslint.config.js
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
export default [{
rules: {
'comma-dangle': [2, 'always-multiline'],
quotes: [2, 'single'],
semi: [2, 'never'],
},
Expand Down
2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@
"scripts": {
"build": "rimraf lib && mkdir lib && rollup -c && yarn buildConfig",
"buildConfig": "tsx ./scripts/build-config.ts",
"lint": "NODE_ENV=development tsx src/index.js",
"lint": "NODE_ENV=development tsx src/index.js --ignore-dirs lib",
"publishLib": "yarn test --coverage && yarn build && cd lib && npm publish",
"test": "jest"
},
Expand Down
135 changes: 123 additions & 12 deletions src/linters/__tests__/eslint.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -13,11 +13,21 @@ describe('eslint', () => {

const testFiles = ['index.ts']
const lintFilesMock = ESLint.prototype.lintFiles as jest.Mock
const outputFixesMock = ESLint.outputFixes as jest.Mock

const resultThemes = {
messageTheme: expect.any(Function),
positionTheme: expect.any(Function),
ruleTheme: expect.any(Function),
}

it('creates a new ESLint instance', async () => {
lintFilesMock.mockImplementationOnce(() => [])

await eslintLib.lintFiles(testFiles)
await eslintLib.lintFiles({
files: testFiles,
fix: false
})

expect(ESLint).toHaveBeenCalledOnceWith({
cache: false,
Expand All @@ -28,7 +38,10 @@ describe('eslint', () => {
it('calls ESLint.lintFiles with the files', async () => {
lintFilesMock.mockImplementationOnce(() => [])

await eslintLib.lintFiles(testFiles)
await eslintLib.lintFiles({
files: testFiles,
fix: false
})

expect(ESLint.prototype.lintFiles).toHaveBeenCalledOnceWith(testFiles)
})
Expand All @@ -43,7 +56,10 @@ describe('eslint', () => {
})

try {
await eslintLib.lintFiles(testFiles)
await eslintLib.lintFiles({
files: testFiles,
fix: false
})
} catch {
expect(colourLog.error).toHaveBeenCalledOnceWith('An error occurred while running eslint', error)
expect(process.exit).toHaveBeenCalledWith(1)
Expand All @@ -55,7 +71,10 @@ describe('eslint', () => {

lintFilesMock.mockImplementationOnce(() => lintResults)

expect(await eslintLib.lintFiles([])).toStrictEqual({
expect(await eslintLib.lintFiles({
files: [],
fix: false
})).toStrictEqual({
results: {},
summary: {
deprecatedRules: [],
Expand Down Expand Up @@ -84,7 +103,10 @@ describe('eslint', () => {

lintFilesMock.mockImplementationOnce(() => lintResults)

expect(await eslintLib.lintFiles(testFiles)).toStrictEqual({
expect(await eslintLib.lintFiles({
files: testFiles,
fix: false
})).toStrictEqual({
results: {},
summary: {
deprecatedRules: [],
Expand Down Expand Up @@ -184,15 +206,12 @@ describe('eslint', () => {
warningCount: 0,
}]

const resultThemes = {
messageTheme: expect.any(Function),
positionTheme: expect.any(Function),
ruleTheme: expect.any(Function),
}

lintFilesMock.mockImplementationOnce(() => lintResults)

expect(await eslintLib.lintFiles(testFiles)).toStrictEqual({
expect(await eslintLib.lintFiles({
files: testFiles,
fix: false
})).toStrictEqual({
results: {
'index.ts': [{
...resultThemes,
Expand Down Expand Up @@ -245,4 +264,96 @@ describe('eslint', () => {
})
})

it('does not fix lint errors when the fix option is disabled', async () => {
const lintResults: Array<ESLint.LintResult> = [{
errorCount: 1,
fatalErrorCount: 0,
filePath: `${process.cwd()}/index.ts`,
fixableErrorCount: 1,
fixableWarningCount: 0,
messages: [{
column: 1,
line: 1,
message: 'Fixable error rule',
ruleId: 'fixable-error-rule',
severity: 2,
}],
suppressedMessages: [],
usedDeprecatedRules: [],
warningCount: 0,
}]

lintFilesMock.mockImplementationOnce(() => lintResults)

const result = await eslintLib.lintFiles({
files: testFiles,
fix: false
})

expect(ESLint).toHaveBeenCalledOnceWith({
cache: false,
fix: false,
})
expect(result).toStrictEqual({
results: {
'index.ts': [{
...resultThemes,
message: 'Fixable error rule',
position: '1:1',
rule: 'fixable-error-rule',
severity: 'X',
}],
},
summary: {
deprecatedRules: [],
errorCount: 1,
fileCount: 1,
fixableErrorCount: 1,
fixableWarningCount: 0,
linter: 'ESLint',
warningCount: 0,
},
})
expect(outputFixesMock).not.toHaveBeenCalled()
})

it('fixes lint errors when the fix option is enabled', async () => {
const lintResults: Array<ESLint.LintResult> = [{
errorCount: 0,
fatalErrorCount: 0,
filePath: `${process.cwd()}/index.ts`,
fixableErrorCount: 0,
fixableWarningCount: 0,
messages: [],
suppressedMessages: [],
usedDeprecatedRules: [],
warningCount: 0,
}]

lintFilesMock.mockImplementationOnce(() => lintResults)

const result = await eslintLib.lintFiles({
files: testFiles,
fix: true
})

expect(ESLint).toHaveBeenCalledOnceWith({
cache: false,
fix: true,
})
expect(result).toStrictEqual({
results: {},
summary: {
deprecatedRules: [],
errorCount: 0,
fileCount: 1,
fixableErrorCount: 0,
fixableWarningCount: 0,
linter: 'ESLint',
warningCount: 0,
},
})
expect(outputFixesMock).toHaveBeenCalledOnceWith(lintResults)
})

})
6 changes: 5 additions & 1 deletion src/linters/eslint.ts
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ const lintFiles = async ({ files, fix }: LintFiles): Promise<LintReport> => {
try {
const eslint = new ESLint({
cache: false,
fix: false,
fix,
})

const lintResults: Array<ESLint.LintResult> = await eslint.lintFiles(files)
Expand Down Expand Up @@ -51,6 +51,10 @@ const lintFiles = async ({ files, fix }: LintFiles): Promise<LintReport> => {
})
})

if (fix) {
await ESLint.outputFixes(lintResults)
}

return {
results: reportResults,
summary: reportSummary,
Expand Down

0 comments on commit b34098a

Please sign in to comment.