From af4935f4408094df1d6d3621982b45619242e342 Mon Sep 17 00:00:00 2001 From: Jonathan Fuchs Date: Tue, 28 Sep 2021 16:36:39 -0700 Subject: [PATCH 01/12] Adds a no-system-props rule --- const styledSystemAttributes = ['width',.js | 24 ++++ docs/rules/no-system-props.md | 0 package-lock.json | 137 +++++++++++++++++++- package.json | 4 +- src/configs/recommended.js | 3 +- src/index.js | 3 +- src/rules/__tests__/no-system-props.test.js | 104 +++++++++++++++ src/rules/no-deprecated-colors.js | 36 +---- src/rules/no-system-props.js | 83 ++++++++++++ src/utils/getVariableDeclaration.js | 17 +++ src/utils/isImportedFrom.js | 12 ++ src/utils/isPrimerComponent.js | 6 + 12 files changed, 393 insertions(+), 36 deletions(-) create mode 100644 const styledSystemAttributes = ['width',.js create mode 100644 docs/rules/no-system-props.md create mode 100644 src/rules/__tests__/no-system-props.test.js create mode 100644 src/rules/no-system-props.js create mode 100644 src/utils/getVariableDeclaration.js create mode 100644 src/utils/isImportedFrom.js create mode 100644 src/utils/isPrimerComponent.js diff --git a/const styledSystemAttributes = ['width',.js b/const styledSystemAttributes = ['width',.js new file mode 100644 index 00000000..66dd6c30 --- /dev/null +++ b/const styledSystemAttributes = ['width',.js @@ -0,0 +1,24 @@ +const styledSystemAttributes = ['width', 'height'] + +export default function(context) { + return { + JSXOpeningElement(node) { + console.log(node.attributes) + + const systemAttributeNodes = node.attributes.filter(attribute => { + return styledSystemAttributes.indexOf(attribute.name) !== -1 + }) + + if (systemAttributeNodes.length !== 0) { + context.report({ + node, + message: `Styled-system attributes are deprecated (${attributes.map(a => a.name)})`, + }) + + // fix(fixer) { + + // } + } + } + }; +}; diff --git a/docs/rules/no-system-props.md b/docs/rules/no-system-props.md new file mode 100644 index 00000000..e69de29b diff --git a/package-lock.json b/package-lock.json index c7e5ecd3..da6c4092 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "eslint-plugin-primer-react", - "version": "0.4.1", + "version": "0.5.0", "lockfileVersion": 1, "requires": true, "dependencies": { @@ -1309,6 +1309,116 @@ "@sinonjs/commons": "^1.7.0" } }, + "@styled-system/background": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/@styled-system/background/-/background-5.1.2.tgz", + "integrity": "sha512-jtwH2C/U6ssuGSvwTN3ri/IyjdHb8W9X/g8Y0JLcrH02G+BW3OS8kZdHphF1/YyRklnrKrBT2ngwGUK6aqqV3A==", + "requires": { + "@styled-system/core": "^5.1.2" + } + }, + "@styled-system/border": { + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/@styled-system/border/-/border-5.1.5.tgz", + "integrity": "sha512-JvddhNrnhGigtzWRCVuAHepniyVi6hBlimxWDVAdcTuk7aRn9BYJUwfHslURtwYFsF5FoEs8Zmr1oZq2M1AP0A==", + "requires": { + "@styled-system/core": "^5.1.2" + } + }, + "@styled-system/color": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/@styled-system/color/-/color-5.1.2.tgz", + "integrity": "sha512-1kCkeKDZkt4GYkuFNKc7vJQMcOmTl3bJY3YBUs7fCNM6mMYJeT1pViQ2LwBSBJytj3AB0o4IdLBoepgSgGl5MA==", + "requires": { + "@styled-system/core": "^5.1.2" + } + }, + "@styled-system/core": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/@styled-system/core/-/core-5.1.2.tgz", + "integrity": "sha512-XclBDdNIy7OPOsN4HBsawG2eiWfCcuFt6gxKn1x4QfMIgeO6TOlA2pZZ5GWZtIhCUqEPTgIBta6JXsGyCkLBYw==", + "requires": { + "object-assign": "^4.1.1" + } + }, + "@styled-system/css": { + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/@styled-system/css/-/css-5.1.5.tgz", + "integrity": "sha512-XkORZdS5kypzcBotAMPBoeckDs9aSZVkvrAlq5K3xP8IMAUek+x2O4NtwoSgkYkWWzVBu6DGdFZLR790QWGG+A==" + }, + "@styled-system/flexbox": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/@styled-system/flexbox/-/flexbox-5.1.2.tgz", + "integrity": "sha512-6hHV52+eUk654Y1J2v77B8iLeBNtc+SA3R4necsu2VVinSD7+XY5PCCEzBFaWs42dtOEDIa2lMrgL0YBC01mDQ==", + "requires": { + "@styled-system/core": "^5.1.2" + } + }, + "@styled-system/grid": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/@styled-system/grid/-/grid-5.1.2.tgz", + "integrity": "sha512-K3YiV1KyHHzgdNuNlaw8oW2ktMuGga99o1e/NAfTEi5Zsa7JXxzwEnVSDSBdJC+z6R8WYTCYRQC6bkVFcvdTeg==", + "requires": { + "@styled-system/core": "^5.1.2" + } + }, + "@styled-system/layout": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/@styled-system/layout/-/layout-5.1.2.tgz", + "integrity": "sha512-wUhkMBqSeacPFhoE9S6UF3fsMEKFv91gF4AdDWp0Aym1yeMPpqz9l9qS/6vjSsDPF7zOb5cOKC3tcKKOMuDCPw==", + "requires": { + "@styled-system/core": "^5.1.2" + } + }, + "@styled-system/position": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/@styled-system/position/-/position-5.1.2.tgz", + "integrity": "sha512-60IZfMXEOOZe3l1mCu6sj/2NAyUmES2kR9Kzp7s2D3P4qKsZWxD1Se1+wJvevb+1TP+ZMkGPEYYXRyU8M1aF5A==", + "requires": { + "@styled-system/core": "^5.1.2" + } + }, + "@styled-system/props": { + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/@styled-system/props/-/props-5.1.5.tgz", + "integrity": "sha512-FXhbzq2KueZpGaHxaDm8dowIEWqIMcgsKs6tBl6Y6S0njG9vC8dBMI6WSLDnzMoSqIX3nSKHmOmpzpoihdDewg==", + "requires": { + "styled-system": "^5.1.5" + } + }, + "@styled-system/shadow": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/@styled-system/shadow/-/shadow-5.1.2.tgz", + "integrity": "sha512-wqniqYb7XuZM7K7C0d1Euxc4eGtqEe/lvM0WjuAFsQVImiq6KGT7s7is+0bNI8O4Dwg27jyu4Lfqo/oIQXNzAg==", + "requires": { + "@styled-system/core": "^5.1.2" + } + }, + "@styled-system/space": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/@styled-system/space/-/space-5.1.2.tgz", + "integrity": "sha512-+zzYpR8uvfhcAbaPXhH8QgDAV//flxqxSjHiS9cDFQQUSznXMQmxJegbhcdEF7/eNnJgHeIXv1jmny78kipgBA==", + "requires": { + "@styled-system/core": "^5.1.2" + } + }, + "@styled-system/typography": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/@styled-system/typography/-/typography-5.1.2.tgz", + "integrity": "sha512-BxbVUnN8N7hJ4aaPOd7wEsudeT7CxarR+2hns8XCX1zp0DFfbWw4xYa/olA0oQaqx7F1hzDg+eRaGzAJbF+jOg==", + "requires": { + "@styled-system/core": "^5.1.2" + } + }, + "@styled-system/variant": { + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/@styled-system/variant/-/variant-5.1.5.tgz", + "integrity": "sha512-Yn8hXAFoWIro8+Q5J8YJd/mP85Teiut3fsGVR9CAxwgNfIAiqlYxsk5iHU7VHJks/0KjL4ATSjmbtCDC/4l1qw==", + "requires": { + "@styled-system/core": "^5.1.2", + "@styled-system/css": "^5.1.5" + } + }, "@tootallnate/once": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz", @@ -4129,6 +4239,11 @@ "integrity": "sha512-h2AatdwYH+JHiZpv7pt/gSX1XoRGb7L/qSIeuqA6GwYoF9w1vP1cw42TO0aI2pNyshRK5893hNSl+1//vHK7hQ==", "dev": true }, + "object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" + }, "once": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", @@ -4949,6 +5064,26 @@ "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", "dev": true }, + "styled-system": { + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/styled-system/-/styled-system-5.1.5.tgz", + "integrity": "sha512-7VoD0o2R3RKzOzPK0jYrVnS8iJdfkKsQJNiLRDjikOpQVqQHns/DXWaPZOH4tIKkhAT7I6wIsy9FWTWh2X3q+A==", + "requires": { + "@styled-system/background": "^5.1.2", + "@styled-system/border": "^5.1.5", + "@styled-system/color": "^5.1.2", + "@styled-system/core": "^5.1.2", + "@styled-system/flexbox": "^5.1.2", + "@styled-system/grid": "^5.1.2", + "@styled-system/layout": "^5.1.2", + "@styled-system/position": "^5.1.2", + "@styled-system/shadow": "^5.1.2", + "@styled-system/space": "^5.1.2", + "@styled-system/typography": "^5.1.2", + "@styled-system/variant": "^5.1.5", + "object-assign": "^4.1.1" + } + }, "supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", diff --git a/package.json b/package.json index bd1ce8aa..16fa591a 100644 --- a/package.json +++ b/package.json @@ -34,6 +34,8 @@ }, "prettier": "@github/prettier-config", "dependencies": { - "eslint-traverse": "^1.0.0" + "@styled-system/props": "^5.1.5", + "eslint-traverse": "^1.0.0", + "styled-system": "^5.1.5" } } diff --git a/src/configs/recommended.js b/src/configs/recommended.js index 81cf6e25..312652f1 100644 --- a/src/configs/recommended.js +++ b/src/configs/recommended.js @@ -7,6 +7,7 @@ module.exports = { }, plugins: ['primer-react'], rules: { - 'primer-react/no-deprecated-colors': 'warn' + 'primer-react/no-deprecated-colors': 'warn', + 'primer-react/no-system-props': 'warn' } } diff --git a/src/index.js b/src/index.js index 23ded67a..b3714491 100644 --- a/src/index.js +++ b/src/index.js @@ -1,6 +1,7 @@ module.exports = { rules: { - 'no-deprecated-colors': require('./rules/no-deprecated-colors') + 'no-deprecated-colors': require('./rules/no-deprecated-colors'), + 'no-system-props': require('./rules/no-system-props') }, configs: { recommended: require('./configs/recommended') diff --git a/src/rules/__tests__/no-system-props.test.js b/src/rules/__tests__/no-system-props.test.js new file mode 100644 index 00000000..0494eeb4 --- /dev/null +++ b/src/rules/__tests__/no-system-props.test.js @@ -0,0 +1,104 @@ +const rule = require('../no-system-props') +const {RuleTester} = require('eslint') + +const ruleTester = new RuleTester({ + parserOptions: { + ecmaVersion: 'latest', + sourceType: 'module', + ecmaFeatures: { + jsx: true + } + } +}) + +ruleTester.run('no-system-props', rule, { + valid: [ + `import {Button} from '@primer/components';