diff --git a/.eslintignore b/.eslintignore deleted file mode 100644 index 902163d7..00000000 --- a/.eslintignore +++ /dev/null @@ -1,5 +0,0 @@ -dist -package -static -theme/static -.eslintrc.js diff --git a/.eslintrc.js b/.eslintrc.js deleted file mode 100644 index 83959ae7..00000000 --- a/.eslintrc.js +++ /dev/null @@ -1,89 +0,0 @@ -module.exports = { - env: { - 'browser': true, - 'commonjs': true, - 'es2017': true, - 'node': true - }, - extends: [ - 'eslint:recommended' - ], - parserOptions: { - sourceType: 'module' - }, - rules: { - // Require `let` or `const` instead of `var` - // https://eslint.org/docs/rules/no-var - 'no-var': 'error', - - // Require `const` declarations for variables that are never reassigned after declared - // https://eslint.org/docs/rules/prefer-const - 'prefer-const': 'error', - - // This option sets a specific tab width for your code - // https://eslint.org/docs/rules/indent - 'indent': ['error', 4], - - // Disallow mixed 'LF' and 'CRLF' as linebreaks - // https://eslint.org/docs/rules/linebreak-style - 'linebreak-style': ['error', 'unix'], - - // Specify whether double or single quotes should be used - 'quotes': ['error', 'single'], - - // Require or disallow use of semicolons instead of ASI - 'semi': ['error', 'always'], - - // Enforce location of semicolons - // https://eslint.org/docs/rules/semi-style - 'semi-style': ['error', 'last'], - - // Require camel case names - // https://eslint.org/docs/rules/camelcase - 'camelcase': ['error', { 'properties': 'always' }], - - // Use type-safe equality operators - // https://eslint.org/docs/rules/eqeqeq - 'eqeqeq': ['error', 'always'], - - // Require newlines around variable declarations - // https://eslint.org/docs/rules/one-var-declaration-per-line - 'one-var-declaration-per-line': ['error', 'always'], - - // Require constructor names to begin with a capital letter - // https://eslint.org/docs/rules/new-cap - 'new-cap': 'error', - - // Disallow Use of alert, confirm, prompt - // https://eslint.org/docs/rules/no-alert - 'no-alert': 'error', - - // Disallow eval() - // https://eslint.org/docs/rules/no-eval - 'no-eval': 'error', - - // Disallow empty functions - // https://eslint.org/docs/rules/no-empty-function - 'no-empty-function': 'error', - - // Require radix parameter - // https://eslint.org/docs/rules/radix - 'radix': 'error', - - // Disallow the use of `console` - // https://eslint.org/docs/rules/no-console - 'no-console': 'error' - }, - overrides: [ - { - // JS Jasmine test files. - files: ['tests/unit/**/*.js'], - env: { - jasmine: true - }, - globals: { - sinon: 'writable' - } - } - ] -}; diff --git a/CHANGELOG.md b/CHANGELOG.md index e1a4575e..47737d5c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,7 @@ # HEAD +* **js:** Migrate ESLint to use flat config file (#906) + ## Features * **component:** Add Firefox Klar wordmark for the Wordmark component diff --git a/eslint.config.js b/eslint.config.js new file mode 100644 index 00000000..d766f988 --- /dev/null +++ b/eslint.config.js @@ -0,0 +1,136 @@ +const js = require('@eslint/js'); +const globals = require('globals'); + +const rules = { + // Require `let` or `const` instead of `var` + // https://eslint.org/docs/rules/no-var + 'no-var': 'error', + + // Require `const` declarations for variables that are never reassigned after declared + // https://eslint.org/docs/rules/prefer-const + 'prefer-const': 'error', + + // This option sets a specific tab width for your code + // https://eslint.org/docs/rules/indent + 'indent': ['error', 4], + + // Disallow mixed 'LF' and 'CRLF' as linebreaks + // https://eslint.org/docs/rules/linebreak-style + 'linebreak-style': ['error', 'unix'], + + // Specify whether double or single quotes should be used + 'quotes': ['error', 'single'], + + // Require or disallow use of semicolons instead of ASI + 'semi': ['error', 'always'], + + // Enforce location of semicolons + // https://eslint.org/docs/rules/semi-style + 'semi-style': ['error', 'last'], + + // Require camel case names + // https://eslint.org/docs/rules/camelcase + 'camelcase': ['error', { 'properties': 'always' }], + + // Use type-safe equality operators + // https://eslint.org/docs/rules/eqeqeq + 'eqeqeq': ['error', 'always'], + + // Require newlines around variable declarations + // https://eslint.org/docs/rules/one-var-declaration-per-line + 'one-var-declaration-per-line': ['error', 'always'], + + // Require constructor names to begin with a capital letter + // https://eslint.org/docs/rules/new-cap + 'new-cap': 'error', + + // Disallow Use of alert, confirm, prompt + // https://eslint.org/docs/rules/no-alert + 'no-alert': 'error', + + // Disallow eval() + // https://eslint.org/docs/rules/no-eval + 'no-eval': 'error', + + // Disallow empty functions + // https://eslint.org/docs/rules/no-empty-function + 'no-empty-function': 'error', + + // Require radix parameter + // https://eslint.org/docs/rules/radix + 'radix': 'error', + + // Disallow the use of `console` + // https://eslint.org/docs/rules/no-console + 'no-console': 'error' +}; + +const testingGlobals = { + sinon: true +}; + +module.exports = [ + js.configs.recommended, + { + ignores: ['dist/**/*.js', 'package/**/*.js', 'static/**/*.js', 'theme/static/**/*.js'] + }, + { + files: ['assets/js/**/*.js'], + languageOptions: { + ecmaVersion: 2017, + globals: { + Mozilla: true, + ...globals.browser, + ...globals.commonjs + } + }, + rules: rules + }, + { + files: ['theme/**/*.js'], + languageOptions: { + ecmaVersion: 2017, + globals: { + Mozilla: true, + ...globals.browser, + ...globals.commonjs, + ...globals.node + } + }, + rules: rules + }, + { + files: ['tests/**/*.js'], + languageOptions: { + ecmaVersion: 'latest', + sourceType: 'module', + globals: { + Mozilla: true, + ...globals.browser, + ...globals.jasmine, + ...globals.commonjs, + ...testingGlobals + } + }, + rules: rules + }, + { + files: [ + 'eslint.config.js', + 'fractal.config.js', + 'webpack.docs.build.config.js', + 'webpack.docs.static.config.js', + 'webpack.entrypoints.js', + 'webpack.package.build.config.js', + 'webpack.package.static.config.js' + ], + languageOptions: { + ecmaVersion: 'latest', + globals: { + ...globals.node, + ...globals.commonjs + } + }, + rules: rules + } +]; diff --git a/package.json b/package.json index 957765d8..f836d267 100644 --- a/package.json +++ b/package.json @@ -17,11 +17,11 @@ "build-docs": "npm ci && npm run lint && webpack --config webpack.docs.static.config.js --mode production && webpack --config webpack.docs.build.config.js --mode production && fractal build", "build-package": "npm ci && npm run lint && webpack --config webpack.package.static.config.js --mode production && webpack --config webpack.package.build.config.js --mode production", "lint": "npm run lint-js && npm run lint-css", - "lint-css": "./node_modules/.bin/stylelint \"**/*.scss\"", - "lint-js": "./node_modules/.bin/eslint .", + "lint-css": "npx stylelint \"**/*.scss\"", + "lint-js": "npx eslint .", "prepublishOnly": "npm run build-package", "start": "ENV=development fractal start --sync", - "test": "npm run lint && ./node_modules/.bin/karma start ./tests/karma.conf.js", + "test": "npm run lint && npx karma start ./tests/karma.conf.js", "webpack": "npm run lint && webpack --config webpack.docs.static.config.js --mode development && webpack --config webpack.docs.build.config.js --watch --mode development" }, "dependencies": {