@atlaskit/eslint-plugin-design-system 8.31.0 → 8.32.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +12 -0
- package/README.md +1 -0
- package/constellation/consistent-css-prop-usage/usage.mdx +1 -1
- package/constellation/index/usage.mdx +1 -0
- package/constellation/no-css-tagged-template-expression/usage.mdx +1 -1
- package/constellation/no-empty-styled-expression/usage.mdx +1 -1
- package/constellation/no-exported-css/usage.mdx +2 -2
- package/constellation/no-exported-keyframes/usage.mdx +2 -2
- package/constellation/no-html-button-element/usage.mdx +26 -0
- package/constellation/no-keyframes-tagged-template-expression/usage.mdx +1 -3
- package/constellation/no-styled-tagged-template-expression/usage.mdx +2 -4
- package/dist/cjs/presets/all.codegen.js +2 -1
- package/dist/cjs/rules/consistent-css-prop-usage/index.js +375 -334
- package/dist/cjs/rules/index.codegen.js +3 -1
- package/dist/cjs/rules/no-html-button-element/index.js +107 -0
- package/dist/cjs/rules/no-html-button-element/utils.js +18 -0
- package/dist/cjs/rules/prefer-primitives/utils.js +1 -1
- package/dist/es2019/presets/all.codegen.js +2 -1
- package/dist/es2019/rules/consistent-css-prop-usage/index.js +283 -267
- package/dist/es2019/rules/index.codegen.js +3 -1
- package/dist/es2019/rules/no-html-button-element/index.js +101 -0
- package/dist/es2019/rules/no-html-button-element/utils.js +12 -0
- package/dist/es2019/rules/prefer-primitives/utils.js +1 -1
- package/dist/esm/presets/all.codegen.js +2 -1
- package/dist/esm/rules/consistent-css-prop-usage/index.js +375 -334
- package/dist/esm/rules/index.codegen.js +3 -1
- package/dist/esm/rules/no-html-button-element/index.js +101 -0
- package/dist/esm/rules/no-html-button-element/utils.js +12 -0
- package/dist/esm/rules/prefer-primitives/utils.js +1 -1
- package/dist/types/index.codegen.d.ts +1 -0
- package/dist/types/presets/all.codegen.d.ts +2 -1
- package/dist/types/rules/index.codegen.d.ts +1 -0
- package/dist/types/rules/no-html-button-element/index.d.ts +3 -0
- package/dist/types/rules/no-html-button-element/utils.d.ts +2 -0
- package/dist/types-ts4.5/index.codegen.d.ts +1 -0
- package/dist/types-ts4.5/presets/all.codegen.d.ts +2 -1
- package/dist/types-ts4.5/rules/index.codegen.d.ts +1 -0
- package/dist/types-ts4.5/rules/no-html-button-element/index.d.ts +3 -0
- package/dist/types-ts4.5/rules/no-html-button-element/utils.d.ts +2 -0
- package/package.json +1 -1
|
@@ -17,6 +17,7 @@ var _noDeprecatedImports = _interopRequireDefault(require("./no-deprecated-impor
|
|
|
17
17
|
var _noEmptyStyledExpression = _interopRequireDefault(require("./no-empty-styled-expression"));
|
|
18
18
|
var _noExportedCss = _interopRequireDefault(require("./no-exported-css"));
|
|
19
19
|
var _noExportedKeyframes = _interopRequireDefault(require("./no-exported-keyframes"));
|
|
20
|
+
var _noHtmlButtonElement = _interopRequireDefault(require("./no-html-button-element"));
|
|
20
21
|
var _noInvalidCssMap = _interopRequireDefault(require("./no-invalid-css-map"));
|
|
21
22
|
var _noKeyframesTaggedTemplateExpression = _interopRequireDefault(require("./no-keyframes-tagged-template-expression"));
|
|
22
23
|
var _noMargin = _interopRequireDefault(require("./no-margin"));
|
|
@@ -36,7 +37,7 @@ var _usePrimitivesText = _interopRequireDefault(require("./use-primitives-text")
|
|
|
36
37
|
var _useVisuallyHidden = _interopRequireDefault(require("./use-visually-hidden"));
|
|
37
38
|
/**
|
|
38
39
|
* THIS FILE WAS CREATED VIA CODEGEN DO NOT MODIFY {@see http://go/af-codegen}
|
|
39
|
-
* @codegen <<SignedSource::
|
|
40
|
+
* @codegen <<SignedSource::23062a8759ba919facf30a402e5546bd>>
|
|
40
41
|
* @codegenCommand yarn workspace @atlaskit/eslint-plugin-design-system codegen
|
|
41
42
|
*/
|
|
42
43
|
var _default = exports.default = {
|
|
@@ -52,6 +53,7 @@ var _default = exports.default = {
|
|
|
52
53
|
'no-empty-styled-expression': _noEmptyStyledExpression.default,
|
|
53
54
|
'no-exported-css': _noExportedCss.default,
|
|
54
55
|
'no-exported-keyframes': _noExportedKeyframes.default,
|
|
56
|
+
'no-html-button-element': _noHtmlButtonElement.default,
|
|
55
57
|
'no-invalid-css-map': _noInvalidCssMap.default,
|
|
56
58
|
'no-keyframes-tagged-template-expression': _noKeyframesTaggedTemplateExpression.default,
|
|
57
59
|
'no-margin': _noMargin.default,
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.default = void 0;
|
|
7
|
+
var _eslintCodemodUtils = require("eslint-codemod-utils");
|
|
8
|
+
var _createRule = require("../utils/create-rule");
|
|
9
|
+
var _utils = require("./utils");
|
|
10
|
+
// eslint-disable-next-line import/no-extraneous-dependencies
|
|
11
|
+
|
|
12
|
+
var buttonDocsUrl = 'https://atlassian.design/components/button';
|
|
13
|
+
var pressableDocsUrl = 'https://atlassian.design/components/primitives/pressable/';
|
|
14
|
+
var rule = (0, _createRule.createLintRule)({
|
|
15
|
+
meta: {
|
|
16
|
+
name: 'no-html-button-element',
|
|
17
|
+
type: 'suggestion',
|
|
18
|
+
hasSuggestions: false,
|
|
19
|
+
docs: {
|
|
20
|
+
description: 'Prevent direct usage of HTML button elements and enforce usage of Button and Pressable.',
|
|
21
|
+
recommended: false,
|
|
22
|
+
severity: 'warn'
|
|
23
|
+
},
|
|
24
|
+
messages: {
|
|
25
|
+
noHtmlButtonElement: "This \"{{element}}\" should be replaced with a Button component. If beyond the capabilities of the Button component, use the Pressable primitive. See ".concat(buttonDocsUrl, " and ").concat(pressableDocsUrl, " for guidance.")
|
|
26
|
+
}
|
|
27
|
+
},
|
|
28
|
+
create: function create(context) {
|
|
29
|
+
return {
|
|
30
|
+
// Look for <button> HTML elements
|
|
31
|
+
// Look for styled calls/templates - styled.button(...)
|
|
32
|
+
JSXOpeningElement: function JSXOpeningElement(node) {
|
|
33
|
+
if (!(0, _eslintCodemodUtils.isNodeOfType)(node, 'JSXOpeningElement')) {
|
|
34
|
+
return;
|
|
35
|
+
}
|
|
36
|
+
if (!(0, _eslintCodemodUtils.isNodeOfType)(node.name, 'JSXIdentifier')) {
|
|
37
|
+
return;
|
|
38
|
+
}
|
|
39
|
+
var suggest = (0, _utils.shouldSuggest)(node === null || node === void 0 ? void 0 : node.parent);
|
|
40
|
+
if (suggest) {
|
|
41
|
+
context.report({
|
|
42
|
+
node: node,
|
|
43
|
+
messageId: 'noHtmlButtonElement',
|
|
44
|
+
data: {
|
|
45
|
+
element: node.name.name
|
|
46
|
+
}
|
|
47
|
+
});
|
|
48
|
+
}
|
|
49
|
+
},
|
|
50
|
+
// styled.button`` | styled2.button`` | styled.button()
|
|
51
|
+
'MemberExpression[object.name="styled"],MemberExpression[object.name="styled2"]': function MemberExpressionObjectNameStyledMemberExpressionObjectNameStyled2(node) {
|
|
52
|
+
if (!(0, _eslintCodemodUtils.isNodeOfType)(node, 'MemberExpression')) {
|
|
53
|
+
return;
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
// styled.button``
|
|
57
|
+
if ((0, _eslintCodemodUtils.isNodeOfType)(node.property, 'Identifier')) {
|
|
58
|
+
if (node.property.name === 'button') {
|
|
59
|
+
var styledIdentifier = node.object.name;
|
|
60
|
+
var elementName = node.property.name;
|
|
61
|
+
|
|
62
|
+
// Including the `styled.` portion in the message to help makers understand it's not just the `button` element that should be replaced
|
|
63
|
+
var reportName = "".concat(styledIdentifier, ".").concat(elementName); // styled.button
|
|
64
|
+
|
|
65
|
+
context.report({
|
|
66
|
+
node: node,
|
|
67
|
+
messageId: 'noHtmlButtonElement',
|
|
68
|
+
data: {
|
|
69
|
+
element: reportName
|
|
70
|
+
}
|
|
71
|
+
});
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
},
|
|
75
|
+
// styled(X)``
|
|
76
|
+
'CallExpression[callee.name="styled"]': function CallExpressionCalleeNameStyled(node) {
|
|
77
|
+
if (!(0, _eslintCodemodUtils.isNodeOfType)(node, 'CallExpression')) {
|
|
78
|
+
return;
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
// styled('button')`` - We only care about 'button', ignore extending other components
|
|
82
|
+
if ((0, _eslintCodemodUtils.isNodeOfType)(node.arguments[0], 'Literal')) {
|
|
83
|
+
var argValue = node.arguments[0].raw;
|
|
84
|
+
if (typeof argValue === 'string') {
|
|
85
|
+
var suggest = argValue.replaceAll("'", '') === 'button';
|
|
86
|
+
if (suggest) {
|
|
87
|
+
var styledIdentifier = node.callee.name;
|
|
88
|
+
var elementName = argValue;
|
|
89
|
+
|
|
90
|
+
// Including the `styled()` portion in the message to help makers understand it's not just the `button` element that should be replaced
|
|
91
|
+
var reportName = "".concat(styledIdentifier, "(").concat(elementName, ")"); // styled('button')
|
|
92
|
+
|
|
93
|
+
context.report({
|
|
94
|
+
node: node,
|
|
95
|
+
messageId: 'noHtmlButtonElement',
|
|
96
|
+
data: {
|
|
97
|
+
element: reportName
|
|
98
|
+
}
|
|
99
|
+
});
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
};
|
|
105
|
+
}
|
|
106
|
+
});
|
|
107
|
+
var _default = exports.default = rule;
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.shouldSuggest = void 0;
|
|
7
|
+
var isButtonHtmlElement = function isButtonHtmlElement(node) {
|
|
8
|
+
return node.openingElement.name.name === 'button';
|
|
9
|
+
};
|
|
10
|
+
var shouldSuggest = exports.shouldSuggest = function shouldSuggest(node) {
|
|
11
|
+
if (!node) {
|
|
12
|
+
return false;
|
|
13
|
+
}
|
|
14
|
+
if (!isButtonHtmlElement(node)) {
|
|
15
|
+
return false;
|
|
16
|
+
}
|
|
17
|
+
return true;
|
|
18
|
+
};
|
|
@@ -5,7 +5,7 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
5
5
|
});
|
|
6
6
|
exports.validPrimitiveElements = exports.shouldSuggest = void 0;
|
|
7
7
|
var _eslintCodemodUtils = require("eslint-codemod-utils");
|
|
8
|
-
var validPrimitiveElements = exports.validPrimitiveElements = new Set(['div', 'span', 'article', 'aside', 'dialog', 'footer', 'header', 'li', 'main', 'nav', 'ol', 'section', 'ul']);
|
|
8
|
+
var validPrimitiveElements = exports.validPrimitiveElements = new Set(['div', 'span', 'article', 'aside', 'dialog', 'footer', 'header', 'li', 'main', 'nav', 'ol', 'section', 'ul', 'button']);
|
|
9
9
|
var getChildrenByType = function getChildrenByType(node, types) {
|
|
10
10
|
return node.children.filter(function (child) {
|
|
11
11
|
return types.find(function (type) {
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* THIS FILE WAS CREATED VIA CODEGEN DO NOT MODIFY {@see http://go/af-codegen}
|
|
3
|
-
* @codegen <<SignedSource::
|
|
3
|
+
* @codegen <<SignedSource::bcb633b9d5c2def00d43b11139433c5c>>
|
|
4
4
|
* @codegenCommand yarn workspace @atlaskit/eslint-plugin-design-system codegen
|
|
5
5
|
*/
|
|
6
6
|
export default {
|
|
@@ -18,6 +18,7 @@ export default {
|
|
|
18
18
|
'@atlaskit/design-system/no-empty-styled-expression': 'warn',
|
|
19
19
|
'@atlaskit/design-system/no-exported-css': 'warn',
|
|
20
20
|
'@atlaskit/design-system/no-exported-keyframes': 'warn',
|
|
21
|
+
'@atlaskit/design-system/no-html-button-element': 'warn',
|
|
21
22
|
'@atlaskit/design-system/no-invalid-css-map': 'error',
|
|
22
23
|
'@atlaskit/design-system/no-keyframes-tagged-template-expression': 'error',
|
|
23
24
|
'@atlaskit/design-system/no-margin': 'warn',
|