diff --git a/packages/blockly/eslint.config.mjs b/eslint.config.mjs similarity index 72% rename from packages/blockly/eslint.config.mjs rename to eslint.config.mjs index 104e1b7d006..abc2a9e8d5f 100644 --- a/packages/blockly/eslint.config.mjs +++ b/eslint.config.mjs @@ -1,8 +1,10 @@ import eslint from '@eslint/js'; import googleStyle from 'eslint-config-google'; import jsdoc from 'eslint-plugin-jsdoc'; +import * as mdx from 'eslint-plugin-mdx'; import mochaPlugin from 'eslint-plugin-mocha'; import eslintPluginPrettierRecommended from 'eslint-plugin-prettier/recommended'; +import {defineConfig} from 'eslint/config'; import globals from 'globals'; import tseslint from 'typescript-eslint'; @@ -133,41 +135,64 @@ function buildTSOverride({files, tsconfig}) { }; } -export default [ +export default defineConfig( { // Note: there should be no other properties in this object ignores: [ // Build artifacts - 'msg/*', - 'build/*', - 'dist/*', - 'typings/*', - 'docs/*', + 'packages/blockly/msg/*', + 'packages/blockly/build/*', + 'packages/blockly/dist/*', + 'packages/blockly/typings/*', + 'packages/blockly/docs/*', // Tests other than mocha unit tests - 'tests/blocks/*', - 'tests/themes/*', - 'tests/compile/*', - 'tests/jsunit/*', - 'tests/generators/*', - 'tests/mocha/webdriver.js', - 'tests/screenshot/*', - 'tests/test_runner.js', - 'tests/workspace_svg/*', + 'packages/blockly/tests/blocks/*', + 'packages/blockly/tests/themes/*', + 'packages/blockly/tests/compile/*', + 'packages/blockly/tests/jsunit/*', + 'packages/blockly/tests/generators/*', + 'packages/blockly/tests/mocha/webdriver.js', + 'packages/blockly/tests/screenshot/*', + 'packages/blockly/tests/test_runner.js', + 'packages/blockly/tests/workspace_svg/*', // Demos, scripts, misc - 'node_modules/*', - 'generators/*', - 'demos/*', - 'appengine/*', - 'externs/*', - 'closure/*', - 'scripts/gulpfiles/*', - 'CHANGELOG.md', - 'PULL_REQUEST_TEMPLATE.md', + 'packages/blockly/node_modules/*', + 'packages/blockly/generators/*', + 'packages/blockly/demos/*', + 'packages/blockly/appengine/*', + 'packages/blockly/externs/*', + 'packages/blockly/closure/*', + 'packages/blockly/scripts/gulpfiles/*', + 'packages/blockly/CHANGELOG.md', + 'packages/blockly/PULL_REQUEST_TEMPLATE.md', + // Docs + 'packages/docs/docs/reference/**', + 'packages/docs/build/**', + 'packages/docs/.docusaurus/**', + 'packages/docs/node_modules/**', ], }, - eslint.configs.recommended, jsdoc.configs['flat/recommended'], - googleStyle, + { + files: ['packages/blockly/**/*.ts', 'packages/blockly/**/*.tsx', 'packages/blockly/**/*.js'], + extends: [eslint.configs.recommended, googleStyle], + languageOptions: { + ecmaVersion: 2020, + sourceType: 'module', + }, + settings: { + // Allowlist some JSDoc tag aliases we use. + 'jsdoc': { + 'tagNamePreference': { + 'return': 'return', + 'fileoverview': 'fileoverview', + 'extends': 'extends', + 'constructor': 'constructor', + }, + }, + }, + rules, + }, { languageOptions: { ecmaVersion: 2020, @@ -188,14 +213,14 @@ export default [ }, { files: [ - 'eslint.config.mjs', - '.prettierrc.js', - 'gulpfile.mjs', - 'scripts/helpers.js', - 'tests/mocha/.mocharc.js', - 'tests/migration/validate-renamings.mjs', - 'tests/scripts/magic_symlink.js', - 'tests/scripts/webdriver_helpers.js', + 'packages/blockly/eslint.config.mjs', + 'packages/blockly/.prettierrc.js', + 'packages/blockly/gulpfile.mjs', + 'packages/blockly/scripts/helpers.js', + 'packages/blockly/tests/mocha/.mocharc.js', + 'packages/blockly/tests/migration/validate-renamings.mjs', + 'packages/blockly/tests/scripts/magic_symlink.js', + 'packages/blockly/tests/scripts/webdriver_helpers.js', ], languageOptions: { globals: { @@ -207,7 +232,7 @@ export default [ }, }, { - files: ['tests/**'], + files: ['packages/blockly/tests/**'], plugins: { mocha: mochaPlugin, }, @@ -237,7 +262,7 @@ export default [ }, }, { - files: ['tests/browser/**'], + files: ['packages/blockly/tests/browser/**'], languageOptions: { sourceType: 'module', globals: { @@ -257,7 +282,7 @@ export default [ }, }, { - files: ['tests/mocha/**'], + files: ['packages/blockly/tests/mocha/**'], languageOptions: { sourceType: 'module', globals: { @@ -276,7 +301,7 @@ export default [ }, }, { - files: ['tests/node/**'], + files: ['packages/blockly/tests/node/**'], languageOptions: { globals: { 'console': true, @@ -287,7 +312,7 @@ export default [ }, }, { - files: ['tests/playgrounds/**', 'tests/scripts/**'], + files: ['packages/blockly/tests/playgrounds/**', 'packages/blockly/tests/scripts/**'], languageOptions: { globals: { ...globals.browser, @@ -295,7 +320,7 @@ export default [ }, }, { - files: ['scripts/**'], + files: ['packages/blockly/scripts/**'], languageOptions: { globals: { ...globals.browser, @@ -307,17 +332,35 @@ export default [ 'jsdoc/tag-lines': ['off'], }, }, + { + ...mdx.flat, + files: ['packages/docs/**/*.mdx'], + rules: { + ...mdx.flat.rules, + 'mdx/remark': 'off', + }, + }, + { + ...mdx.flat, + files: ['packages/docs/**/*.md'], + ...mdx.flatCodeBlocks, + rules: { + ...mdx.flat.rules, + ...mdx.flatCodeBlocks.rules, + 'mdx/remark': 'off', + }, + }, ...tseslint.config( buildTSOverride({ - files: ['**/*.ts', '**/*.tsx'], + files: ['packages/blockly/**/*.ts', 'packages/blockly/**/*.tsx'], tsconfig: './tsconfig.json', }), buildTSOverride({ - files: ['tests/typescript/**/*.ts', 'tests/typescript/**/*.tsx'], + files: ['packages/blockly/tests/typescript/**/*.ts', 'packages/blockly/tests/typescript/**/*.tsx'], tsconfig: './tests/typescript/tsconfig.json', }), ), // Per the docs, this should be at the end because it disables rules that // conflict with Prettier. eslintPluginPrettierRecommended, -]; +); diff --git a/package-lock.json b/package-lock.json index da287c8c57a..1120dfbb2df 100644 --- a/package-lock.json +++ b/package-lock.json @@ -14,7 +14,15 @@ ], "devDependencies": { "@commitlint/cli": "^21.2.0", - "@commitlint/config-conventional": "^21.0.2" + "@commitlint/config-conventional": "^21.0.2", + "@eslint/js": "^10.0.1", + "eslint": "10.5.0", + "eslint-config-google": "^0.14.0", + "eslint-config-prettier": "^10.1.8", + "eslint-plugin-jsdoc": "^63.0.11", + "eslint-plugin-mdx": "^3.7.0", + "eslint-plugin-mocha": "^11.3.0", + "eslint-plugin-prettier": "^5.5.5" } }, "node_modules/@algolia/abtesting": { @@ -6779,6 +6787,27 @@ "node": "^20.19.0 || ^22.13.0 || >=24" } }, + "node_modules/@eslint/js": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-10.0.1.tgz", + "integrity": "sha512-zeR9k5pd4gxjZ0abRoIaxdc7I3nDktoXZk2qOv9gCNWx3mVwEn32VRhyLaRsDiJjTs0xq/T8mfPtyuXu7GWBcA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + }, + "funding": { + "url": "https://eslint.org/donate" + }, + "peerDependencies": { + "eslint": "^10.0.0" + }, + "peerDependenciesMeta": { + "eslint": { + "optional": true + } + } + }, "node_modules/@eslint/object-schema": { "version": "3.0.5", "dev": true, @@ -14527,6 +14556,37 @@ } } }, + "node_modules/eslint-mdx/node_modules/eslint-visitor-keys": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", + "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-mdx/node_modules/espree": { + "version": "10.4.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-10.4.0.tgz", + "integrity": "sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "acorn": "^8.15.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^4.2.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, "node_modules/eslint-plugin-jsdoc": { "version": "63.0.11", "resolved": "https://registry.npmjs.org/eslint-plugin-jsdoc/-/eslint-plugin-jsdoc-63.0.11.tgz", @@ -29277,7 +29337,6 @@ "@blockly/block-test": "^7.0.6", "@blockly/dev-tools": "^9.0.9", "@blockly/theme-modern": "^7.0.5", - "@eslint/js": "^10.0.1", "@hyperjump/browser": "^1.3.1", "@hyperjump/json-schema": "^1.17.6", "@microsoft/api-documenter": "7.30.7", @@ -29288,12 +29347,6 @@ "concurrently": "^10.0.3", "conventional-changelog-conventionalcommits": "^9.3.1", "conventional-recommended-bump": "^12.0.0", - "eslint": "10.5.0", - "eslint-config-google": "^0.14.0", - "eslint-config-prettier": "^10.1.8", - "eslint-plugin-jsdoc": "^63.0.11", - "eslint-plugin-mocha": "^11.3.0", - "eslint-plugin-prettier": "^5.5.5", "glob": "^13.0.6", "globals": "^17.7.0", "google-closure-compiler": "^20260520.0.0", @@ -29328,25 +29381,6 @@ "jsdom": "^27.4.0" } }, - "packages/blockly/node_modules/@eslint/js": { - "version": "10.0.1", - "dev": true, - "license": "MIT", - "engines": { - "node": "^20.19.0 || ^22.13.0 || >=24" - }, - "funding": { - "url": "https://eslint.org/donate" - }, - "peerDependencies": { - "eslint": "^10.0.0" - }, - "peerDependenciesMeta": { - "eslint": { - "optional": true - } - } - }, "packages/blockly/node_modules/chalk": { "version": "5.6.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.6.2.tgz", @@ -29428,8 +29462,6 @@ "@docusaurus/faster": "^3.10.1", "@docusaurus/module-type-aliases": "^3.10.1", "@docusaurus/types": "^3.10.1", - "eslint": "10.5.0", - "eslint-plugin-mdx": "^3.7.0", "prettier": "3.8.4" }, "engines": { diff --git a/package.json b/package.json index 0b4f452c24b..2cdab694393 100644 --- a/package.json +++ b/package.json @@ -21,7 +21,15 @@ ], "devDependencies": { "@commitlint/cli": "^21.2.0", - "@commitlint/config-conventional": "^21.0.2" + "@commitlint/config-conventional": "^21.0.2", + "@eslint/js": "^10.0.1", + "eslint": "10.5.0", + "eslint-config-google": "^0.14.0", + "eslint-config-prettier": "^10.1.8", + "eslint-plugin-jsdoc": "^63.0.11", + "eslint-plugin-mdx": "^3.7.0", + "eslint-plugin-mocha": "^11.3.0", + "eslint-plugin-prettier": "^5.5.5" }, "scripts": { "test": "npm run test --ws --if-present", diff --git a/packages/blockly/package.json b/packages/blockly/package.json index d33b4461cc7..2ea7d2f99b1 100644 --- a/packages/blockly/package.json +++ b/packages/blockly/package.json @@ -104,7 +104,6 @@ "@blockly/block-test": "^7.0.6", "@blockly/dev-tools": "^9.0.9", "@blockly/theme-modern": "^7.0.5", - "@eslint/js": "^10.0.1", "@hyperjump/browser": "^1.3.1", "@hyperjump/json-schema": "^1.17.6", "@microsoft/api-documenter": "7.30.7", @@ -115,12 +114,6 @@ "concurrently": "^10.0.3", "conventional-changelog-conventionalcommits": "^9.3.1", "conventional-recommended-bump": "^12.0.0", - "eslint": "10.5.0", - "eslint-config-google": "^0.14.0", - "eslint-config-prettier": "^10.1.8", - "eslint-plugin-jsdoc": "^63.0.11", - "eslint-plugin-mocha": "^11.3.0", - "eslint-plugin-prettier": "^5.5.5", "glob": "^13.0.6", "globals": "^17.7.0", "google-closure-compiler": "^20260520.0.0", diff --git a/packages/docs/eslint.config.mjs b/packages/docs/eslint.config.mjs deleted file mode 100644 index 33fee652aac..00000000000 --- a/packages/docs/eslint.config.mjs +++ /dev/null @@ -1,30 +0,0 @@ -import * as mdx from 'eslint-plugin-mdx'; - -export default [ - { - ...mdx.flat, - files: ['**/*.mdx'], - rules: { - ...mdx.flat.rules, - 'mdx/remark': 'off', - }, - }, - { - ...mdx.flat, - files: ['**/*.md'], - ...mdx.flatCodeBlocks, - rules: { - ...mdx.flat.rules, - ...mdx.flatCodeBlocks.rules, - 'mdx/remark': 'off', - }, - }, - { - ignores: [ - 'docs/reference/**', - 'build/**', - '.docusaurus/**', - 'node_modules/**', - ], - }, -]; diff --git a/packages/docs/package.json b/packages/docs/package.json index 2fa9d9d3673..5b9de74f46b 100644 --- a/packages/docs/package.json +++ b/packages/docs/package.json @@ -35,8 +35,6 @@ "@docusaurus/faster": "^3.10.1", "@docusaurus/module-type-aliases": "^3.10.1", "@docusaurus/types": "^3.10.1", - "eslint": "10.5.0", - "eslint-plugin-mdx": "^3.7.0", "prettier": "3.8.4" }, "browserslist": {