Skip to content

Commit

Permalink
Merge pull request #1887 from neviaumi/GH-1885_eslint-config
Browse files Browse the repository at this point in the history
GH-1885: eslint config include should have optional folder prefix
  • Loading branch information
neviaumi authored Jan 17, 2024
2 parents 1f5db65 + 309da6c commit 1c5e4e6
Show file tree
Hide file tree
Showing 26 changed files with 375 additions and 282 deletions.
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import { parseIssueFromHeader } from './link-title-to-issue.js';
import { defaultConfig } from './configurations.js';
import { parseIssueFromHeader } from './link-title-to-issue.js';

const linkBodyToIssue = (parsed, _, value) => {
const { issuePrefix = defaultConfig.issuePrefix } = value || {};
Expand Down
Original file line number Diff line number Diff line change
@@ -1,21 +1,22 @@
import { describe, it } from 'node:test';
import assert from 'node:assert';
import { describe, it } from 'node:test';

import linkBodyToIssue from './link-body-to-issue.js';

describe('rule: link-body-to-issue', () => {
function createParsed({ body, footer, header }) {
return {
header,
body,
footer,
header,
};
}

it('return true when body have linking keyword and issue is match to header', () => {
const [rulePass, failureReason] = linkBodyToIssue(
createParsed({
header: 'GH-1234: what is that',
body: 'this close #1234',
header: 'GH-1234: what is that',
}),
null,
);
Expand All @@ -25,8 +26,8 @@ describe('rule: link-body-to-issue', () => {
it('return false when body have linking keyword but mismatch issue id to header', () => {
const [rulePass, failureReason] = linkBodyToIssue(
createParsed({
header: 'GH-4321: what is that',
body: 'this close #1234',
header: 'GH-4321: what is that',
}),
null,
);
Expand All @@ -40,7 +41,7 @@ describe('rule: link-body-to-issue', () => {
it("return true when body don't have linking keyword but have commit message", () => {
['#1234', 'GH-1234'].forEach(body => {
const [rulePass, failureReason] = linkBodyToIssue(
createParsed({ header: 'GH-1234: what is that', body: body }),
createParsed({ body: body, header: 'GH-1234: what is that' }),
null,
);
assert.strictEqual(rulePass, true, failureReason);
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
import { describe, it } from 'node:test';
import assert from 'node:assert';
import { describe, it } from 'node:test';

import linkTitleToIssue from './link-title-to-issue.js';

describe('rule: link-title-to-issue', () => {
Expand Down
46 changes: 24 additions & 22 deletions packages/eslint-config/index.mjs
Original file line number Diff line number Diff line change
@@ -1,17 +1,18 @@
import jsCommonConfig from './preset/javascript.mjs';
import eslintGlobals from 'globals';

import cypressConfig from './preset/cypress.mjs';
import jestConfig from "./preset/jest.mjs"
import jsCommonConfig from './preset/javascript.mjs';
import jestConfig from './preset/jest.mjs';
import jsonConfig from './preset/json.mjs';
import markdownConfig from './preset/markdown.mjs';
import nestConfig from './preset/nest.mjs';
import reactConfig from './preset/react-jsx.mjs';
import storybookConfig from './preset/storybook.mjs';
import tailwindCSSConfig from './preset/tailwindcss.mjs';
import typescriptConfig from './preset/typescript.mjs';
import ymlConfig from './preset/yml.mjs';
import { hasConfig } from './utils/has-config.mjs';
import eslintGlobals from "globals";
import markdownConfig from "./preset/markdown.mjs"
import nestConfig from "./preset/nest.mjs"
import reactConfig from "./preset/react-jsx.mjs"
import storybookConfig from "./preset/storybook.mjs"
import typescriptConfig from "./preset/typescript.mjs"
import tailwindCSSConfig from "./preset/tailwindcss.mjs"
import ymlConfig from "./preset/yml.mjs"
import {isDefaultEsm} from "./utils/is-default-esm.mjs"
import { isDefaultEsm } from './utils/is-default-esm.mjs';

const hasReact = await hasConfig([
{ dependency: 'react', type: 'dependency' },
Expand Down Expand Up @@ -47,7 +48,7 @@ const hasTailwindcss = await hasConfig([
{ dependency: 'tailwindcss', dependencyType: 'dev', type: 'dependency' },
]);

const isDefaultESModule = await isDefaultEsm()
const isDefaultESModule = await isDefaultEsm();

const eslintConfig = [
jsCommonConfig,
Expand All @@ -56,17 +57,18 @@ const eslintConfig = [
ymlConfig,
hasTypescript ? typescriptConfig : [],
hasReact ? reactConfig : [],
hasJest ? jestConfig: [],
hasJest ? jestConfig : [],
hasCypress ? cypressConfig : [],
hasNest ? nestConfig: [],
hasStorybook ? storybookConfig: [],
hasTailwindcss ? tailwindCSSConfig: [],
hasNest ? nestConfig : [],
hasStorybook ? storybookConfig : [],
hasTailwindcss ? tailwindCSSConfig : [],
].flat();

export default eslintConfig
export default eslintConfig;

export function withConfigurationPrint() {
return (config) => {
return config => {
// eslint-disable-next-line no-console
console.log(`
hasTypescript: ${hasTypescript}
hasReact: ${hasReact}
Expand All @@ -76,9 +78,9 @@ hasNest: ${hasNest}
hasStorybook: ${hasStorybook}
hasTailwindcss: ${hasTailwindcss}
isDefaultEsm: ${isDefaultESModule}
`)
return config
}
`);
return config;
};
}

export const globals = eslintGlobals
export const globals = eslintGlobals;
8 changes: 4 additions & 4 deletions packages/eslint-config/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -36,19 +36,19 @@
"eslint": "8.56.0"
},
"engines": {
"node": ">=14",
"node": ">=18",
"yarn": "Use npm"
},
"exports": {
".": {
"import": "./index.mjs"
},
"./plugins/eslint-plugin-n": {
"import": "./plugins/eslint-plugin-n.mjs"
},
"./plugins/eslint-plugin-import": {
"import": "./plugins/eslint-plugin-import.mjs"
},
"./plugins/eslint-plugin-n": {
"import": "./plugins/eslint-plugin-n.mjs"
},
"./plugins/eslint-plugin-prettier": {
"import": "./plugins/eslint-plugin-prettier.mjs"
}
Expand Down
3 changes: 1 addition & 2 deletions packages/eslint-config/plugins/eslint-plugin-import.mjs
Original file line number Diff line number Diff line change
@@ -1,4 +1,3 @@
import eslintPluginImport from 'eslint-plugin-import';


export default eslintPluginImport;
export default eslintPluginImport;
3 changes: 1 addition & 2 deletions packages/eslint-config/plugins/eslint-plugin-n.mjs
Original file line number Diff line number Diff line change
@@ -1,4 +1,3 @@
import eslintPluginN from 'eslint-plugin-n';


export default eslintPluginN;
export default eslintPluginN;
3 changes: 2 additions & 1 deletion packages/eslint-config/plugins/eslint-plugin-prettier.mjs
Original file line number Diff line number Diff line change
@@ -1,2 +1,3 @@
import eslintPluginPrettier from 'eslint-plugin-prettier';
export default eslintPluginPrettier;

export default eslintPluginPrettier;
28 changes: 17 additions & 11 deletions packages/eslint-config/preset/cypress.mjs
Original file line number Diff line number Diff line change
@@ -1,24 +1,30 @@
import eslintPluginCypress from "eslint-plugin-cypress"
import {typescriptFileSuffixes, jsFileSuffixes} from "../utils/file-patterns.mjs"
import eslintPluginCypress from 'eslint-plugin-cypress';

import {
jsFileSuffixes,
typescriptFileSuffixes,
} from '../utils/file-patterns.mjs';

export default [
{
plugins: {
cypress: eslintPluginCypress,
},
files: [
[...jsFileSuffixes, ...typescriptFileSuffixes].map((fileSuffix) => `*.cy.${fileSuffix}`),
'cypress/**/*',
[...jsFileSuffixes, ...typescriptFileSuffixes].map(
fileSuffix => `**/*.cy.${fileSuffix}`,
),
'cypress/**/*',
].flat(),
languageOptions: {
globals: {
...eslintPluginCypress.environments.globals
}
...eslintPluginCypress.environments.globals,
},
},
plugins: {
cypress: eslintPluginCypress,
},
rules: {
...eslintPluginCypress.configs.recommended.rules,
'cypress/no-pause': 'error',
'no-unused-expressions': 'off',
},
}
]
},
];
57 changes: 27 additions & 30 deletions packages/eslint-config/preset/javascript.mjs
Original file line number Diff line number Diff line change
@@ -1,54 +1,49 @@
import js from '@eslint/js';
import eslintPluginImport from 'eslint-plugin-import';
import eslintPluginN from 'eslint-plugin-n';
import eslintPluginPrettier from 'eslint-plugin-prettier';
import eslintPluginSimpleImportSort from 'eslint-plugin-simple-import-sort';
import eslintPluginSortDestructureKeys from 'eslint-plugin-sort-destructure-keys';
import eslintPluginSortKeysFix from 'eslint-plugin-sort-keys-fix';
import eslintPluginUnicorn from "eslint-plugin-unicorn"
import js from "@eslint/js";
import {isDefaultEsm} from "../utils/is-default-esm.mjs";
import {jsFileSuffixes, typescriptFileSuffixes} from "../utils/file-patterns.mjs"
import globals from "globals";
import eslintPluginUnicorn from 'eslint-plugin-unicorn';
import globals from 'globals';

const isDefaultESModule = await isDefaultEsm()
const esmSuffixes = ['*.jsx',
'*.mjs',
'*.ts',
'*.tsx',
'*.mts',
'*.mtsx',];
import {
jsFileSuffixes,
typescriptFileSuffixes,
} from '../utils/file-patterns.mjs';
import { isDefaultEsm } from '../utils/is-default-esm.mjs';

const isDefaultESModule = await isDefaultEsm();
const esmSuffixes = ['*.jsx', '*.mjs', '*.ts', '*.tsx', '*.mts', '*.mtsx'];
export default [
{
files: ['*.js'],
files: ['**/*.js'],
languageOptions: {
ecmaVersion: 'latest',
sourceType: isDefaultESModule ? 'commonjs': 'module',
}
sourceType: isDefaultESModule ? 'commonjs' : 'module',
},
},
{
files: esmSuffixes,
files: esmSuffixes.map(fileSuffix => `**/${fileSuffix}`),
languageOptions: {
ecmaVersion: 'latest',
sourceType: 'module',
},
},
{
files: [
'*.cjs',
'*.cts',
'*.ctsx',
'*.cjsx'
],
files: ['*.cjs', '*.cts', '*.ctsx', '*.cjsx'].map(
fileSuffix => `**/${fileSuffix}`,
),
languageOptions: {
ecmaVersion: 'latest',
sourceType: 'commonjs',
},
},
{
files: [
...jsFileSuffixes,
...typescriptFileSuffixes,
],
files: [...jsFileSuffixes, ...typescriptFileSuffixes].map(
fileSuffix => `**/*.${fileSuffix}`,
),
plugins: {
import: eslintPluginImport,
n: eslintPluginN,
Expand All @@ -59,7 +54,7 @@ export default [
},
rules: {
...js.configs.recommended.rules, // Recommended config applied to all files
...eslintPluginImport.configs.recommended.rules,
// ...eslintPluginImport.configs.recommended.rules,
...eslintPluginN.configs['recommended-module'].rules,
'block-scoped-var': 'error',
'import/first': 'error',
Expand Down Expand Up @@ -116,13 +111,15 @@ export default [
},
},
{
files: isDefaultESModule ? ['*.js',...esmSuffixes] : esmSuffixes,
files: (isDefaultESModule ? ['*.js', ...esmSuffixes] : esmSuffixes).map(
fileSuffix => `**/${fileSuffix}`,
),
languageOptions: {
ecmaVersion: 'latest',
sourceType: 'module',
globals: {
...globals.es2024,
},
sourceType: 'module',
},
plugins: {
import: eslintPluginImport,
Expand All @@ -131,7 +128,7 @@ export default [
rules: {
'import/extensions': ['error', 'ignorePackages'],
'n/no-missing-import': ['off'],
'unicorn/consistent-function-scoping': 'error',
'unicorn/consistent-function-scoping': 'off',
'unicorn/prefer-node-protocol': 'error',
},
},
Expand Down
37 changes: 21 additions & 16 deletions packages/eslint-config/preset/jest.mjs
Original file line number Diff line number Diff line change
@@ -1,20 +1,25 @@
import eslintPluginJest from "eslint-plugin-jest"
import eslintParserTypescript from "@typescript-eslint/parser"
import eslintPluginTypescript from "@typescript-eslint/eslint-plugin"
import eslintPluginTypescript from '@typescript-eslint/eslint-plugin';
import eslintParserTypescript from '@typescript-eslint/parser';
import eslintPluginJest from 'eslint-plugin-jest';

import {typescriptTestFilePatterns, jsTestFilePatterns} from "../utils/file-patterns.mjs"
import {
jsTestFilePatterns,
typescriptTestFilePatterns,
} from '../utils/file-patterns.mjs';

export default [
{
files: [...jsTestFilePatterns,...typescriptTestFilePatterns],
files: [...jsTestFilePatterns, ...typescriptTestFilePatterns].map(
fileSuffix => `**/${fileSuffix}`,
),
languageOptions: {
globals: {
...eslintPluginJest.configs.recommended.env,
},
},
plugins: {
jest: eslintPluginJest,
},
languageOptions: {
globals: {
...eslintPluginJest.configs.recommended.env
}
},
rules: {
...eslintPluginJest.configs.recommended.rules,
'jest/consistent-test-it': [
Expand All @@ -35,13 +40,13 @@ export default [
},
},
{
plugins: {
'@typescript-eslint': eslintPluginTypescript,
},
files: typescriptTestFilePatterns.map(fileSuffix => `**/${fileSuffix}`),
languageOptions: {
parser: eslintParserTypescript,
},
files: typescriptTestFilePatterns,
plugins: {
'@typescript-eslint': eslintPluginTypescript,
},
rules: {
'@typescript-eslint/ban-ts-comment': [
'error',
Expand All @@ -53,5 +58,5 @@ export default [
},
],
},
}
]
},
];
Loading

0 comments on commit 1c5e4e6

Please sign in to comment.