From 73e7f751b7a355288fb9750c5661eddb4f4968e2 Mon Sep 17 00:00:00 2001 From: Patrik Oldsberg Date: Sun, 5 Apr 2020 11:16:03 +0200 Subject: [PATCH 1/6] package: add test:all and lint:all --- package.json | 2 ++ 1 file changed, 2 insertions(+) diff --git a/package.json b/package.json index a7ad611eea..6b15b4cfc0 100644 --- a/package.json +++ b/package.json @@ -9,7 +9,9 @@ "bundle": "yarn build && yarn workspace example-app bundle", "build": "lerna run build", "test": "yarn build && lerna run test --since origin/master -- --coverage", + "test:all": "yarn build && lerna run test -- --coverage", "lint": "lerna run lint --since origin/master --", + "lint:all": "lerna run lint --", "docker-build": "yarn bundle && docker build . -t spotify/backstage", "create-plugin": "backstage-cli create-plugin", "release": "if [ \"$(git symbolic-ref --short HEAD)\" = master ]; then echo \"don't try to release master\"; exit 1; else lerna version --no-push; fi", From 6a6074bedd7198d4e1e04c8319f0bea9e1ed03d5 Mon Sep 17 00:00:00 2001 From: Patrik Oldsberg Date: Sun, 5 Apr 2020 11:07:24 +0200 Subject: [PATCH 2/6] cli/config/eslint: add import and monorepo lint rules to avoid bad imports and missing deps --- packages/cli/config/eslint.js | 30 +++++++++++++++- packages/cli/package.json | 2 ++ yarn.lock | 66 ++++++++++++++++++++++++++++++++++- 3 files changed, 96 insertions(+), 2 deletions(-) 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" From 2fa455bcd0bd80fc38339a5b54e4050fc8e850e0 Mon Sep 17 00:00:00 2001 From: Patrik Oldsberg Date: Sun, 5 Apr 2020 14:08:43 +0200 Subject: [PATCH 3/6] packages/cli: fix dependencies --- packages/cli/package.json | 6 +++++- yarn.lock | 8 ++++++++ 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/packages/cli/package.json b/packages/cli/package.json index 46a0b0ce50..f1ca54ca1c 100644 --- a/packages/cli/package.json +++ b/packages/cli/package.json @@ -39,7 +39,6 @@ "@types/webpack-dev-server": "^3.10.0", "del": "^5.1.0", "nodemon": "^2.0.2", - "tar": "^6.0.1", "ts-node": "^8.6.2" }, "bin": { @@ -52,6 +51,7 @@ "@rollup/plugin-json": "^4.0.2", "@rollup/plugin-node-resolve": "^7.1.1", "@spotify/web-scripts": "^6.0.0", + "chalk": "^4.0.0", "chokidar": "^3.3.1", "commander": "^4.1.1", "dashify": "^2.0.0", @@ -72,10 +72,14 @@ "rollup-plugin-peer-deps-external": "^2.2.2", "rollup-plugin-postcss": "^2.5.0", "rollup-plugin-typescript2": "^0.26.0", + "tar": "^6.0.1", "ts-loader": "^6.2.1", "webpack": "^4.41.6", "webpack-dev-server": "^3.10.3" }, + "peerDependencies": { + "react": "^16.0.0" + }, "files": [ "templates", "config", diff --git a/yarn.lock b/yarn.lock index 3cf6b85c31..ae5f9823f6 100644 --- a/yarn.lock +++ b/yarn.lock @@ -5830,6 +5830,14 @@ chalk@^3.0.0: ansi-styles "^4.1.0" supports-color "^7.1.0" +chalk@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/chalk/-/chalk-4.0.0.tgz#6e98081ed2d17faab615eb52ac66ec1fe6209e72" + integrity sha512-N9oWFcegS0sFr9oh1oz2d7Npos6vNoWW9HvtCg5N1KRFpUhaAhvTv5Y58g880fZaEYSNm3qDz8SU1UrGvp+n7A== + dependencies: + ansi-styles "^4.1.0" + supports-color "^7.1.0" + change-emitter@^0.1.2: version "0.1.6" resolved "https://registry.npmjs.org/change-emitter/-/change-emitter-0.1.6.tgz#e8b2fe3d7f1ab7d69a32199aff91ea6931409515" From acdea56c7fdd8fe165fecef0b9837ccdd23becd6 Mon Sep 17 00:00:00 2001 From: Patrik Oldsberg Date: Sun, 5 Apr 2020 14:09:34 +0200 Subject: [PATCH 4/6] packages/core: fix dependencies and imports --- packages/core/jest.config.ts | 20 ------------------- packages/core/package.json | 4 +++- .../src/layout/HeaderLabel/HeaderLabel.tsx | 3 +-- .../core/src/layout/InfoCard/BottomLink.tsx | 17 ++++++++++------ .../core/{jest.setup.ts => src/setupTests.ts} | 0 packages/core/src/testUtils/index.js | 2 +- yarn.lock | 4 ++-- 7 files changed, 18 insertions(+), 32 deletions(-) delete mode 100644 packages/core/jest.config.ts rename packages/core/{jest.setup.ts => src/setupTests.ts} (100%) diff --git a/packages/core/jest.config.ts b/packages/core/jest.config.ts deleted file mode 100644 index 2e584f12dc..0000000000 --- a/packages/core/jest.config.ts +++ /dev/null @@ -1,20 +0,0 @@ -/* - * Copyright 2020 Spotify AB - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -module.exports = { - ...require('@spotify/web-scripts/config/jest.config.js'), - setupFilesAfterEnv: ['../jest.setup.ts'], -}; diff --git a/packages/core/package.json b/packages/core/package.json index dbac96cf02..897d828b8e 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -31,6 +31,8 @@ "@types/jest": "^24.0.0", "@types/node": "^12.0.0", "classnames": "^2.2.6", + "clsx": "^1.1.0", + "prop-types": "^15.7.2", "rc-progress": "^2.5.2", "react": "^16.12.0", "react-addons-text-content": "0.0.4", @@ -44,6 +46,6 @@ "@testing-library/jest-dom": "^4.2.4", "@testing-library/react": "^9.3.2", "@testing-library/user-event": "^7.1.2", - "prop-types": "^15.7.2" + "react-router": "^5.1.2" } } diff --git a/packages/core/src/layout/HeaderLabel/HeaderLabel.tsx b/packages/core/src/layout/HeaderLabel/HeaderLabel.tsx index 4349399194..56fcd01152 100644 --- a/packages/core/src/layout/HeaderLabel/HeaderLabel.tsx +++ b/packages/core/src/layout/HeaderLabel/HeaderLabel.tsx @@ -14,9 +14,8 @@ * limitations under the License. */ +import { Link, makeStyles, Typography } from '@material-ui/core'; import React, { FC } from 'react'; -import { Typography, makeStyles } from '@material-ui/core'; -import { Link } from '@material-ui/core'; import { BackstageTheme } from '../../theme/theme'; const useStyles = makeStyles(theme => ({ diff --git a/packages/core/src/layout/InfoCard/BottomLink.tsx b/packages/core/src/layout/InfoCard/BottomLink.tsx index bf82f6cd11..12eabbe753 100644 --- a/packages/core/src/layout/InfoCard/BottomLink.tsx +++ b/packages/core/src/layout/InfoCard/BottomLink.tsx @@ -14,13 +14,18 @@ * limitations under the License. */ -import React, { FC } from 'react'; -import { Link } from '@material-ui/core'; -import { Divider, ListItemText, makeStyles } from '@material-ui/core'; -import { ListItem, ListItemIcon } from '@material-ui/core'; -import ArrowIcon from '@material-ui/icons/ArrowForward'; -import grey from '@material-ui/core/colors/grey'; +import { + Divider, + Link, + ListItem, + ListItemIcon, + ListItemText, + makeStyles, +} from '@material-ui/core'; import Box from '@material-ui/core/Box'; +import grey from '@material-ui/core/colors/grey'; +import ArrowIcon from '@material-ui/icons/ArrowForward'; +import React, { FC } from 'react'; import { BackstageTheme } from '../../theme/theme'; const useStyles = makeStyles(theme => ({ diff --git a/packages/core/jest.setup.ts b/packages/core/src/setupTests.ts similarity index 100% rename from packages/core/jest.setup.ts rename to packages/core/src/setupTests.ts diff --git a/packages/core/src/testUtils/index.js b/packages/core/src/testUtils/index.js index a0eab3e72b..611633dcde 100644 --- a/packages/core/src/testUtils/index.js +++ b/packages/core/src/testUtils/index.js @@ -15,7 +15,7 @@ */ import React from 'react'; -import { ThemeProvider } from '@material-ui/styles'; +import { ThemeProvider } from '@material-ui/core'; import { MemoryRouter } from 'react-router'; import { Route } from 'react-router-dom'; diff --git a/yarn.lock b/yarn.lock index ae5f9823f6..402e134b3c 100644 --- a/yarn.lock +++ b/yarn.lock @@ -6110,7 +6110,7 @@ clone@^1.0.2: resolved "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz#da309cc263df15994c688ca902179ca3c7cd7c7e" integrity sha1-2jCcwmPfFZlMaIypAheco8fNfH4= -clsx@^1.0.2, clsx@^1.0.4: +clsx@^1.0.2, clsx@^1.0.4, clsx@^1.1.0: version "1.1.0" resolved "https://registry.npmjs.org/clsx/-/clsx-1.1.0.tgz#62937c6adfea771247c34b54d320fb99624f5702" integrity sha512-3avwM37fSK5oP6M5rQ9CNe99lwxhXDOeSWVPAOYF6OazUTgZCMb0yWlJpmdD74REy1gkEaFiub2ULv4fq9GUhA== @@ -16293,7 +16293,7 @@ react-router-dom@^5.1.2: tiny-invariant "^1.0.2" tiny-warning "^1.0.0" -react-router@5.1.2: +react-router@5.1.2, react-router@^5.1.2: version "5.1.2" resolved "https://registry.npmjs.org/react-router/-/react-router-5.1.2.tgz#6ea51d789cb36a6be1ba5f7c0d48dd9e817d3418" integrity sha512-yjEuMFy1ONK246B+rsa0cUam5OeAQ8pyclRDgpxuSCrAlJ1qN9uZ5IgyKC7gQg0w8OM50NXHEegPh/ks9YuR2A== From 04f5aa3763d901ce7427855cbe48ac218de37e85 Mon Sep 17 00:00:00 2001 From: Patrik Oldsberg Date: Sun, 5 Apr 2020 14:16:35 +0200 Subject: [PATCH 5/6] packages/app: fix deps and update cypress lint rules --- packages/app/cypress/.eslintrc.json | 9 +++++++++ packages/app/package.json | 1 + 2 files changed, 10 insertions(+) diff --git a/packages/app/cypress/.eslintrc.json b/packages/app/cypress/.eslintrc.json index a467608916..2b3a458b95 100644 --- a/packages/app/cypress/.eslintrc.json +++ b/packages/app/cypress/.eslintrc.json @@ -7,6 +7,15 @@ { "assertFunctionNames": ["expect", "cy.contains"] } + ], + "import/no-extraneous-dependencies": [ + "error", + { + "devDependencies": true, + "optionalDependencies": true, + "peerDependencies": true, + "bundledDependencies": true + } ] } } diff --git a/packages/app/package.json b/packages/app/package.json index d0c8bfb123..0b7db7ae41 100644 --- a/packages/app/package.json +++ b/packages/app/package.json @@ -18,6 +18,7 @@ "@types/react-router-dom": "^5.1.3", "@types/zen-observable": "^0.8.0", "cross-env": "^7.0.0", + "prop-types": "^15.7.2", "react": "^16.12.0", "react-dom": "^16.12.0", "react-router-dom": "^5.1.2", From 48e2dc7dfd0953b33cfcc18116a4f99f817c0acf Mon Sep 17 00:00:00 2001 From: Patrik Oldsberg Date: Sun, 5 Apr 2020 16:00:46 +0200 Subject: [PATCH 6/6] packages/cli: add missing react-use dep to plugin template --- packages/cli/templates/default-plugin/package.json.hbs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/packages/cli/templates/default-plugin/package.json.hbs b/packages/cli/templates/default-plugin/package.json.hbs index f48b37fbc7..dc1500944a 100644 --- a/packages/cli/templates/default-plugin/package.json.hbs +++ b/packages/cli/templates/default-plugin/package.json.hbs @@ -27,6 +27,7 @@ "@material-ui/icons": "^4.9.1", "@material-ui/lab": "4.0.0-alpha.45", "react": "16.13.1", - "react-dom": "16.13.1" + "react-dom": "16.13.1", + "react-use": "^13.0.0" } }