diff --git a/packages/cli/config/eslint.js b/packages/cli/config/eslint.js index 32d1e220f7..81941b6fad 100644 --- a/packages/cli/config/eslint.js +++ b/packages/cli/config/eslint.js @@ -23,9 +23,10 @@ module.exports = { 'prettier/react', 'prettier/@typescript-eslint', 'plugin:jest/recommended', + 'plugin:monorepo/recommended', ], parser: '@typescript-eslint/parser', - plugins: ['notice'], + plugins: ['notice', 'import'], env: { jest: true, }, @@ -39,6 +40,18 @@ module.exports = { }, }, ignorePatterns: ['**/dist/**', '**/build/**'], + rules: { + 'import/no-duplicates': 'warn', + 'import/no-extraneous-dependencies': [ + 'error', + { + devDependencies: false, + optionalDependencies: true, + peerDependencies: true, + bundledDependencies: true, + }, + ], + }, overrides: [ { files: ['**/*.ts?(x)'], @@ -47,5 +60,20 @@ module.exports = { 'react/prop-types': 0, }, }, + { + files: ['**/*.test.*', '**/src/setupTests.*', '**/src/testUtils/**'], + rules: { + // Tests are allowed to import dev dependencies + 'import/no-extraneous-dependencies': [ + 'error', + { + devDependencies: true, + optionalDependencies: true, + peerDependencies: true, + bundledDependencies: true, + }, + ], + }, + }, ], }; diff --git a/packages/cli/package.json b/packages/cli/package.json index 718867266f..46a0b0ce50 100644 --- a/packages/cli/package.json +++ b/packages/cli/package.json @@ -55,6 +55,8 @@ "chokidar": "^3.3.1", "commander": "^4.1.1", "dashify": "^2.0.0", + "eslint-plugin-import": "^2.20.2", + "eslint-plugin-monorepo": "^0.2.1", "fork-ts-checker-webpack-plugin": "^4.0.5", "fs-extra": "^8.1.0", "handlebars": "^4.7.3", diff --git a/yarn.lock b/yarn.lock index 77f3d84299..3cf6b85c31 100644 --- a/yarn.lock +++ b/yarn.lock @@ -7433,7 +7433,7 @@ dir-glob@2.0.0: arrify "^1.0.1" path-type "^3.0.0" -dir-glob@^2.2.2: +dir-glob@^2.0.0, dir-glob@^2.2.2: version "2.2.2" resolved "https://registry.npmjs.org/dir-glob/-/dir-glob-2.2.2.tgz#fa09f0694153c8918b18ba0deafae94769fc50c4" integrity sha512-f9LBi5QWzIW3I6e//uxZoLBlUt9kcp66qo0sSCxL6YZKc75R1c4MFCoe/LaZiBGmgujvQdxc5Bn3QhfyvK5Hsw== @@ -7978,6 +7978,14 @@ eslint-loader@3.0.3: object-hash "^2.0.1" schema-utils "^2.6.1" +eslint-module-utils@^2.1.1: + version "2.6.0" + resolved "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.6.0.tgz#579ebd094f56af7797d19c9866c9c9486629bfa6" + integrity sha512-6j9xxegbqe8/kZY8cYpcp0xhbK0EgJlg3g9mib3/miLaExuuwc3n5UEfSnU6hWMbT0FAYVvDbL9RrRgpUeQIvA== + dependencies: + debug "^2.6.9" + pkg-dir "^2.0.0" + eslint-module-utils@^2.4.1: version "2.5.2" resolved "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.5.2.tgz#7878f7504824e1b857dd2505b59a8e5eda26a708" @@ -8018,6 +8026,24 @@ eslint-plugin-import@2.20.1: read-pkg-up "^2.0.0" resolve "^1.12.0" +eslint-plugin-import@^2.20.2: + version "2.20.2" + resolved "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.20.2.tgz#91fc3807ce08be4837141272c8b99073906e588d" + integrity sha512-FObidqpXrR8OnCh4iNsxy+WACztJLXAHBO5hK79T1Hc77PgQZkyDGA5Ag9xAvRpglvLNxhH/zSmZ70/pZ31dHg== + dependencies: + array-includes "^3.0.3" + array.prototype.flat "^1.2.1" + contains-path "^0.1.0" + debug "^2.6.9" + doctrine "1.5.0" + eslint-import-resolver-node "^0.3.2" + eslint-module-utils "^2.4.1" + has "^1.0.3" + minimatch "^3.0.4" + object.values "^1.1.0" + read-pkg-up "^2.0.0" + resolve "^1.12.0" + eslint-plugin-jest@^23.6.0: version "23.8.2" resolved "https://registry.npmjs.org/eslint-plugin-jest/-/eslint-plugin-jest-23.8.2.tgz#6f28b41c67ef635f803ebd9e168f6b73858eb8d4" @@ -8040,6 +8066,19 @@ eslint-plugin-jsx-a11y@6.2.3, eslint-plugin-jsx-a11y@^6.2.1: has "^1.0.3" jsx-ast-utils "^2.2.1" +eslint-plugin-monorepo@^0.2.1: + version "0.2.1" + resolved "https://registry.npmjs.org/eslint-plugin-monorepo/-/eslint-plugin-monorepo-0.2.1.tgz#96cfc4af241077675f40d7017377897fb8ea537b" + integrity sha512-82JaAjuajVAsDT+pMvdt275H6F55H3MEofaMZbJurGqfXpPDT4eayTgYyyjfd1XR8VD1S+ORbuHCULnSqNyD9g== + dependencies: + eslint-module-utils "^2.1.1" + get-monorepo-packages "^1.1.0" + globby "^7.1.1" + load-json-file "^4.0.0" + minimatch "^3.0.4" + parse-package-name "^0.1.0" + path-is-inside "^1.0.2" + eslint-plugin-notice@^0.8.9: version "0.8.9" resolved "https://registry.npmjs.org/eslint-plugin-notice/-/eslint-plugin-notice-0.8.9.tgz#b3b55ba218b36a01fd4de998f68c66a8bf238a82" @@ -9122,6 +9161,14 @@ get-caller-file@^2.0.1: resolved "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== +get-monorepo-packages@^1.1.0: + version "1.2.0" + resolved "https://registry.npmjs.org/get-monorepo-packages/-/get-monorepo-packages-1.2.0.tgz#3eee88d30b11a5f65955dec6ae331958b2a168e4" + integrity sha512-aDP6tH+eM3EuVSp3YyCutOcFS4Y9AhRRH9FAd+cjtR/g63Hx+DCXdKoP1ViRPUJz5wm+BOEXB4FhoffGHxJ7jQ== + dependencies: + globby "^7.1.1" + load-json-file "^4.0.0" + get-own-enumerable-property-symbols@^3.0.0: version "3.0.2" resolved "https://registry.npmjs.org/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-3.0.2.tgz#b5fde77f22cbe35f390b4e089922c50bce6ef664" @@ -9447,6 +9494,18 @@ globby@^6.1.0: pify "^2.0.0" pinkie-promise "^2.0.0" +globby@^7.1.1: + version "7.1.1" + resolved "https://registry.npmjs.org/globby/-/globby-7.1.1.tgz#fb2ccff9401f8600945dfada97440cca972b8680" + integrity sha1-+yzP+UAfhgCUXfral0QMypcrhoA= + dependencies: + array-union "^1.0.1" + dir-glob "^2.0.0" + glob "^7.1.2" + ignore "^3.3.5" + pify "^3.0.0" + slash "^1.0.0" + globby@^9.2.0: version "9.2.0" resolved "https://registry.npmjs.org/globby/-/globby-9.2.0.tgz#fd029a706c703d29bdd170f4b6db3a3f7a7cb63d" @@ -14547,6 +14606,11 @@ parse-json@^5.0.0: json-parse-better-errors "^1.0.1" lines-and-columns "^1.1.6" +parse-package-name@^0.1.0: + version "0.1.0" + resolved "https://registry.npmjs.org/parse-package-name/-/parse-package-name-0.1.0.tgz#3f44dd838feb4c2be4bf318bae4477d7706bade4" + integrity sha1-P0Tdg4/rTCvkvzGLrkR313BrreQ= + parse-passwd@^1.0.0: version "1.0.0" resolved "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz#6d5b934a456993b23d37f40a382d6f1666a8e5c6"