Skip to content

Commit

Permalink
feat(eslint): Automatically create config for editor support
Browse files Browse the repository at this point in the history
This creates the file `.eslintrc.js` if no eslint config is available to add support
for editors.
  • Loading branch information
danez committed Apr 30, 2020
1 parent c316e59 commit e936e55
Show file tree
Hide file tree
Showing 4 changed files with 92 additions and 21 deletions.
4 changes: 2 additions & 2 deletions .eslintrc.js
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
// Keep this file for editor support
module.exports = require('spire-plugin-eslint/config');
// This file was created by spire-plugin-eslint for editor support
module.exports = require('spire-plugin-eslint/config');
51 changes: 42 additions & 9 deletions packages/spire-plugin-eslint/index.js
Original file line number Diff line number Diff line change
@@ -1,33 +1,66 @@
const execa = require('execa');
const SpireError = require('spire/error');
const { writeFile, readFile } = require('fs-extra');
const { join } = require('path');

function eslint(
{ setState, getState, hasFile, hasPackageProp },
{
command = 'lint',
config: defaultEslintConfig = require.resolve('spire-plugin-eslint/config'),
config: defaultEslintConfig = 'spire-plugin-eslint/config',
autosetEslintConfig = true,
allowCustomConfig = true,
eslintIgnore: defaultEslintIgnore = '.gitignore',
allowCustomIgnore = true,
glob = '*.js',
}
) {
async function hasCustomEslintConfig() {
return (
(await hasFile('.eslintrc')) ||
(await hasFile('.eslintrc.js')) ||
(await hasFile('.eslintrc.json')) ||
(await hasFile('.eslintrc.yaml')) ||
(await hasFile('.eslintrc.yml')) ||
(await hasPackageProp('eslintConfig'))
);
}
return {
name: 'spire-plugin-eslint',
command,
description: 'lint files with ESLint',
async setup({ cli, argv }) {
async postinstall({ cwd, logger }) {
if (autosetEslintConfig) {
const hasCustomConfig = await hasCustomEslintConfig();
const configFile = join(cwd, '.eslintrc.js');
if (hasCustomConfig) {
if (await hasFile('.eslintrc.js')) {
const currentContent = await readFile(configFile, 'UTF-8');
if (!currentContent.includes(defaultEslintConfig)) {
return logger.warn(
'Attempted to set ESLint config but it already exists. Please ensure existing config re-exports `%s`.',
defaultEslintConfig
);
}
}
}
await writeFile(
configFile,
`// This file was created by spire-plugin-eslint for editor support
module.exports = require('${defaultEslintConfig}');`
);
}
},
async setup({ cli, argv, cwd }) {
const hasCustomConfig =
argv.includes('--config') ||
(await hasFile('.eslintrc')) ||
(await hasFile('.eslintrc.js')) ||
(await hasFile('.eslintrc.json')) ||
(await hasFile('.eslintrc.yaml')) ||
(await hasPackageProp('eslintConfig'));
argv.includes('--config') || (await hasCustomEslintConfig());
const eslintConfig =
allowCustomConfig && hasCustomConfig
? []
: ['--config', defaultEslintConfig];
: [
'--config',
require.resolve(defaultEslintConfig, { paths: [__dirname, cwd] }),
];
const hasCustomIgnore =
argv.includes('--ignore-path') ||
(await hasFile('.eslintignore')) ||
Expand Down
55 changes: 46 additions & 9 deletions packages/spire-plugin-eslint/index.spec.js
Original file line number Diff line number Diff line change
@@ -1,16 +1,19 @@
const { createFixture } = require('spire-test-utils');
const { stat, readFile } = require('fs-extra');
const { join } = require('path');

const configWithEslintPlugin = JSON.stringify({
name: 'spire-plugin-eslint-test',
spire: {
plugins: [require.resolve('spire-plugin-eslint')],
},
});
const configWithEslintPlugin = config =>
JSON.stringify({
name: 'spire-plugin-eslint-test',
spire: {
plugins: [[require.resolve('spire-plugin-eslint'), { config }]],
},
});

describe('spire-plugin-eslint', () => {
it('adds lint command', async () => {
const fixture = await createFixture({
'package.json': configWithEslintPlugin,
'package.json': configWithEslintPlugin(),
});
await expect(fixture.run('spire', ['--help'])).resolves.toMatchObject({
stdout: /Commands:\s+spire lint/,
Expand All @@ -20,7 +23,7 @@ describe('spire-plugin-eslint', () => {

it('adds eslint linter', async () => {
const fixture = await createFixture({
'package.json': configWithEslintPlugin,
'package.json': configWithEslintPlugin(),
});
const { stdout } = await fixture.run('spire', [
'hook',
Expand All @@ -34,7 +37,7 @@ describe('spire-plugin-eslint', () => {

it('passes custom arguments to eslint', async () => {
const fixture = await createFixture({
'package.json': configWithEslintPlugin,
'package.json': configWithEslintPlugin(),
});
await expect(
fixture.run('spire', ['lint', '--version'])
Expand All @@ -43,4 +46,38 @@ describe('spire-plugin-eslint', () => {
});
await fixture.clean();
});

it('creates default eslint config for editors', async () => {
const fixture = await createFixture({
'package.json': configWithEslintPlugin(),
});
await fixture.run('spire', ['hook', 'postinstall']);
const eslintConfig = join(fixture.cwd, '.eslintrc.js');
expect(stat(eslintConfig)).resolves.toBeTruthy();
expect(readFile(eslintConfig, 'UTF-8')).resolves.toMatch(
/spire-plugin-eslint\/config/
);
await fixture.clean();
});

it('creates custom eslint config for editors', async () => {
// Does not yet work, as spire is trying to resolve configs starting from the plugin
// folder. It should use require.resolve(x, { paths }) from node 8.9 to search in the cwd instead
const fixture = await createFixture({
'node_modules/eslint-config-cool-test/package.json': JSON.stringify({
name: 'eslint-config-cool-test',
version: '1.0.0',
main: 'index.js',
}),
'node_modules/eslint-config-cool-test/index.js': 'module.exports = {};',
'package.json': configWithEslintPlugin('eslint-config-cool-test'),
});
await fixture.run('spire', ['hook', 'postinstall']);
const eslintConfig = join(fixture.cwd, '.eslintrc.js');
expect(stat(eslintConfig)).resolves.toBeTruthy();
expect(readFile(eslintConfig, 'UTF-8')).resolves.toMatch(
/eslint-config-cool-test/
);
await fixture.clean();
});
});
3 changes: 2 additions & 1 deletion packages/spire-plugin-eslint/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,8 @@
"eslint-config-prettier": "^6.0.0",
"eslint-config-unobtrusive": "^1.2.3",
"eslint-plugin-prettier": "^3.1.0",
"execa": "^4.0.0"
"execa": "^4.0.0",
"fs-extra": "^8.1.0"
},
"devDependencies": {
"spire-test-utils": "^1.8.2"
Expand Down

0 comments on commit e936e55

Please sign in to comment.