@atlaskit/eslint-plugin-design-system 9.1.0 → 9.2.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 +13 -0
- package/dist/cjs/rules/ensure-design-token-usage-preview/index.js +13 -7
- package/dist/cjs/rules/prefer-primitives/index.js +12 -82
- package/dist/cjs/rules/utils/create-no-tagged-template-expression-rule/index.js +1 -1
- package/dist/es2019/rules/ensure-design-token-usage-preview/index.js +13 -7
- package/dist/es2019/rules/prefer-primitives/index.js +12 -83
- package/dist/es2019/rules/utils/create-no-tagged-template-expression-rule/index.js +6 -6
- package/dist/esm/rules/ensure-design-token-usage-preview/index.js +13 -7
- package/dist/esm/rules/prefer-primitives/index.js +12 -82
- package/dist/esm/rules/utils/create-no-tagged-template-expression-rule/index.js +1 -1
- package/dist/types/rules/prefer-primitives/index.d.ts +1 -2
- package/dist/types-ts4.5/rules/prefer-primitives/index.d.ts +1 -2
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,18 @@
|
|
|
1
1
|
# @atlaskit/eslint-plugin-design-system
|
|
2
2
|
|
|
3
|
+
## 9.2.1
|
|
4
|
+
|
|
5
|
+
### Patch Changes
|
|
6
|
+
|
|
7
|
+
- [#85899](https://stash.atlassian.com/projects/CONFCLOUD/repos/confluence-frontend/pull-requests/85899) [`4ee3baaad3b7`](https://stash.atlassian.com/projects/CONFCLOUD/repos/confluence-frontend/commits/4ee3baaad3b7) - Loosen our final autofix check to just ignore all interpolated keys or properties in general for all `no-*-tagged-template-expression` rules as they may result in broken code in some edge-cases.
|
|
8
|
+
|
|
9
|
+
## 9.2.0
|
|
10
|
+
|
|
11
|
+
### Minor Changes
|
|
12
|
+
|
|
13
|
+
- [#84330](https://stash.atlassian.com/projects/CONFCLOUD/repos/confluence-frontend/pull-requests/84330) [`391be0d8e414`](https://stash.atlassian.com/projects/CONFCLOUD/repos/confluence-frontend/commits/391be0d8e414) - - `prefer-primitives`: This rule is now deprecated. Please use `use-primitives` instead.
|
|
14
|
+
- `ensure-design-token-usage/preview`: This rule is now deprecated. Please use `use-tokens-space` instead.
|
|
15
|
+
|
|
3
16
|
## 9.1.0
|
|
4
17
|
|
|
5
18
|
### Minor Changes
|
|
@@ -6,25 +6,31 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
6
6
|
});
|
|
7
7
|
exports.default = void 0;
|
|
8
8
|
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
|
|
9
|
-
var _ensureDesignTokenUsage = require("../ensure-design-token-usage");
|
|
10
9
|
var _ruleMeta = _interopRequireDefault(require("../ensure-design-token-usage/rule-meta"));
|
|
11
10
|
var _createRule = require("../utils/create-rule");
|
|
12
11
|
function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
|
|
13
12
|
function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { (0, _defineProperty2.default)(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
|
|
14
|
-
var defaultConfig = {
|
|
15
|
-
domains: ['spacing'],
|
|
16
|
-
applyImport: true,
|
|
17
|
-
shouldEnforceFallbacks: false
|
|
18
|
-
};
|
|
19
13
|
var rule = (0, _createRule.createLintRule)({
|
|
20
14
|
meta: _objectSpread(_objectSpread({}, _ruleMeta.default), {}, {
|
|
21
15
|
name: 'ensure-design-token-usage/preview',
|
|
16
|
+
deprecated: true,
|
|
17
|
+
replacedBy: ['@atlaskit/design-system/use-tokens-space'],
|
|
22
18
|
docs: _objectSpread(_objectSpread({}, _ruleMeta.default.docs), {}, {
|
|
23
19
|
description: 'Enforces usage of pre-release design tokens rather than hard-coded values.',
|
|
24
20
|
recommended: false,
|
|
25
21
|
severity: 'warn'
|
|
26
22
|
})
|
|
27
23
|
}),
|
|
28
|
-
create:
|
|
24
|
+
create: function create() {
|
|
25
|
+
/**
|
|
26
|
+
* We can't just outright delete the ESLint rule, since:
|
|
27
|
+
* ```
|
|
28
|
+
* // eslint-disable @eslint-plugin/design-system/ensure-design-token-usage/preview
|
|
29
|
+
* ```
|
|
30
|
+
* will cause CI to fail if the rule definition doesn't exist. So, instead
|
|
31
|
+
* we can change the implementation of the rule so that it never reports.
|
|
32
|
+
*/
|
|
33
|
+
return {};
|
|
34
|
+
}
|
|
29
35
|
});
|
|
30
36
|
var _default = exports.default = rule;
|
|
@@ -4,17 +4,15 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
4
4
|
value: true
|
|
5
5
|
});
|
|
6
6
|
exports.default = void 0;
|
|
7
|
-
var _eslintCodemodUtils = require("eslint-codemod-utils");
|
|
8
7
|
var _createRule = require("../utils/create-rule");
|
|
9
|
-
var _utils = require("./utils");
|
|
10
|
-
// eslint-disable-next-line import/no-extraneous-dependencies
|
|
11
|
-
|
|
12
8
|
var primitiveDocsUrl = 'https://go.atlassian.com/dst-prefer-primitives';
|
|
13
9
|
var rule = (0, _createRule.createLintRule)({
|
|
14
10
|
meta: {
|
|
15
11
|
name: 'prefer-primitives',
|
|
16
12
|
type: 'suggestion',
|
|
17
13
|
hasSuggestions: false,
|
|
14
|
+
deprecated: true,
|
|
15
|
+
replacedBy: ['@atlaskit/design-system/use-primitives'],
|
|
18
16
|
docs: {
|
|
19
17
|
description: 'Increase awareness of primitive components via code hints. Strictly used for education purposes and discoverability. To enforce usage please refer to the `use-primitives` rule.',
|
|
20
18
|
recommended: false,
|
|
@@ -24,84 +22,16 @@ var rule = (0, _createRule.createLintRule)({
|
|
|
24
22
|
preferPrimitives: "This \"{{element}}\" may be able to be replaced with a primitive component. See ".concat(primitiveDocsUrl, " for guidance.")
|
|
25
23
|
}
|
|
26
24
|
},
|
|
27
|
-
create: function create(
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
}
|
|
38
|
-
var suggest = (0, _utils.shouldSuggest)(node === null || node === void 0 ? void 0 : node.parent);
|
|
39
|
-
if (suggest) {
|
|
40
|
-
context.report({
|
|
41
|
-
node: node,
|
|
42
|
-
messageId: 'preferPrimitives',
|
|
43
|
-
data: {
|
|
44
|
-
element: node.name.name
|
|
45
|
-
}
|
|
46
|
-
});
|
|
47
|
-
}
|
|
48
|
-
},
|
|
49
|
-
// styled.x`` | styled2.x`` | styled.div()
|
|
50
|
-
'MemberExpression[object.name="styled"],MemberExpression[object.name="styled2"]': function MemberExpressionObjectNameStyledMemberExpressionObjectNameStyled2(node) {
|
|
51
|
-
if (!(0, _eslintCodemodUtils.isNodeOfType)(node, 'MemberExpression')) {
|
|
52
|
-
return;
|
|
53
|
-
}
|
|
54
|
-
|
|
55
|
-
// styled.div``
|
|
56
|
-
if ((0, _eslintCodemodUtils.isNodeOfType)(node.property, 'Identifier')) {
|
|
57
|
-
if (_utils.validPrimitiveElements.has(node.property.name)) {
|
|
58
|
-
var styledIdentifier = node.object.name;
|
|
59
|
-
var elementName = node.property.name;
|
|
60
|
-
|
|
61
|
-
// Including the `styled.` portion in the message to help makers understand it's not just the `div` element that should be replaced
|
|
62
|
-
var reportName = "".concat(styledIdentifier, ".").concat(elementName); // styled.div
|
|
63
|
-
|
|
64
|
-
context.report({
|
|
65
|
-
node: node,
|
|
66
|
-
messageId: 'preferPrimitives',
|
|
67
|
-
data: {
|
|
68
|
-
element: reportName
|
|
69
|
-
}
|
|
70
|
-
});
|
|
71
|
-
}
|
|
72
|
-
}
|
|
73
|
-
},
|
|
74
|
-
// styled(X)``
|
|
75
|
-
'CallExpression[callee.name="styled"]': function CallExpressionCalleeNameStyled(node) {
|
|
76
|
-
if (!(0, _eslintCodemodUtils.isNodeOfType)(node, 'CallExpression')) {
|
|
77
|
-
return;
|
|
78
|
-
}
|
|
79
|
-
|
|
80
|
-
// styled('div')`` - We only care about 'div'/'span', ignore extending other components
|
|
81
|
-
if ((0, _eslintCodemodUtils.isNodeOfType)(node.arguments[0], 'Literal')) {
|
|
82
|
-
var argValue = node.arguments[0].raw;
|
|
83
|
-
if (typeof argValue === 'string') {
|
|
84
|
-
var suggest = _utils.validPrimitiveElements.has(argValue.replaceAll("'", '') // argValue will have '' around the element name, strip it out for this test
|
|
85
|
-
);
|
|
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 `div` element that should be replaced
|
|
91
|
-
var reportName = "".concat(styledIdentifier, "(").concat(elementName, ")"); // styled('div')
|
|
92
|
-
|
|
93
|
-
context.report({
|
|
94
|
-
node: node,
|
|
95
|
-
messageId: 'preferPrimitives',
|
|
96
|
-
data: {
|
|
97
|
-
element: reportName
|
|
98
|
-
}
|
|
99
|
-
});
|
|
100
|
-
}
|
|
101
|
-
}
|
|
102
|
-
}
|
|
103
|
-
}
|
|
104
|
-
};
|
|
25
|
+
create: function create() {
|
|
26
|
+
/**
|
|
27
|
+
* We can't just outright delete the ESLint rule, since:
|
|
28
|
+
* ```
|
|
29
|
+
* // eslint-disable @eslint-plugin/design-system/prefer-primitives
|
|
30
|
+
* ```
|
|
31
|
+
* will cause CI to fail if the rule definition doesn't exist. So, instead
|
|
32
|
+
* we can change the implementation of the rule so that it never reports.
|
|
33
|
+
*/
|
|
34
|
+
return {};
|
|
105
35
|
}
|
|
106
36
|
});
|
|
107
37
|
var _default = exports.default = rule;
|
|
@@ -104,7 +104,7 @@ var createNoTaggedTemplateExpressionRule = exports.createNoTaggedTemplateExpress
|
|
|
104
104
|
}
|
|
105
105
|
return _context.abrupt("return");
|
|
106
106
|
case 19:
|
|
107
|
-
if (!/\$\{
|
|
107
|
+
if (!/\$\{.*:/.test(newCode)) {
|
|
108
108
|
_context.next = 21;
|
|
109
109
|
break;
|
|
110
110
|
}
|
|
@@ -1,15 +1,11 @@
|
|
|
1
|
-
import { createWithConfig } from '../ensure-design-token-usage';
|
|
2
1
|
import ruleMeta from '../ensure-design-token-usage/rule-meta';
|
|
3
2
|
import { createLintRule } from '../utils/create-rule';
|
|
4
|
-
const defaultConfig = {
|
|
5
|
-
domains: ['spacing'],
|
|
6
|
-
applyImport: true,
|
|
7
|
-
shouldEnforceFallbacks: false
|
|
8
|
-
};
|
|
9
3
|
const rule = createLintRule({
|
|
10
4
|
meta: {
|
|
11
5
|
...ruleMeta,
|
|
12
6
|
name: 'ensure-design-token-usage/preview',
|
|
7
|
+
deprecated: true,
|
|
8
|
+
replacedBy: ['@atlaskit/design-system/use-tokens-space'],
|
|
13
9
|
docs: {
|
|
14
10
|
...ruleMeta.docs,
|
|
15
11
|
description: 'Enforces usage of pre-release design tokens rather than hard-coded values.',
|
|
@@ -17,6 +13,16 @@ const rule = createLintRule({
|
|
|
17
13
|
severity: 'warn'
|
|
18
14
|
}
|
|
19
15
|
},
|
|
20
|
-
create
|
|
16
|
+
create() {
|
|
17
|
+
/**
|
|
18
|
+
* We can't just outright delete the ESLint rule, since:
|
|
19
|
+
* ```
|
|
20
|
+
* // eslint-disable @eslint-plugin/design-system/ensure-design-token-usage/preview
|
|
21
|
+
* ```
|
|
22
|
+
* will cause CI to fail if the rule definition doesn't exist. So, instead
|
|
23
|
+
* we can change the implementation of the rule so that it never reports.
|
|
24
|
+
*/
|
|
25
|
+
return {};
|
|
26
|
+
}
|
|
21
27
|
});
|
|
22
28
|
export default rule;
|
|
@@ -1,14 +1,12 @@
|
|
|
1
|
-
// eslint-disable-next-line import/no-extraneous-dependencies
|
|
2
|
-
|
|
3
|
-
import { isNodeOfType } from 'eslint-codemod-utils';
|
|
4
1
|
import { createLintRule } from '../utils/create-rule';
|
|
5
|
-
import { shouldSuggest, validPrimitiveElements } from './utils';
|
|
6
2
|
const primitiveDocsUrl = 'https://go.atlassian.com/dst-prefer-primitives';
|
|
7
3
|
const rule = createLintRule({
|
|
8
4
|
meta: {
|
|
9
5
|
name: 'prefer-primitives',
|
|
10
6
|
type: 'suggestion',
|
|
11
7
|
hasSuggestions: false,
|
|
8
|
+
deprecated: true,
|
|
9
|
+
replacedBy: ['@atlaskit/design-system/use-primitives'],
|
|
12
10
|
docs: {
|
|
13
11
|
description: 'Increase awareness of primitive components via code hints. Strictly used for education purposes and discoverability. To enforce usage please refer to the `use-primitives` rule.',
|
|
14
12
|
recommended: false,
|
|
@@ -18,85 +16,16 @@ const rule = createLintRule({
|
|
|
18
16
|
preferPrimitives: `This "{{element}}" may be able to be replaced with a primitive component. See ${primitiveDocsUrl} for guidance.`
|
|
19
17
|
}
|
|
20
18
|
},
|
|
21
|
-
create(
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
return;
|
|
32
|
-
}
|
|
33
|
-
const suggest = shouldSuggest(node === null || node === void 0 ? void 0 : node.parent);
|
|
34
|
-
if (suggest) {
|
|
35
|
-
context.report({
|
|
36
|
-
node: node,
|
|
37
|
-
messageId: 'preferPrimitives',
|
|
38
|
-
data: {
|
|
39
|
-
element: node.name.name
|
|
40
|
-
}
|
|
41
|
-
});
|
|
42
|
-
}
|
|
43
|
-
},
|
|
44
|
-
// styled.x`` | styled2.x`` | styled.div()
|
|
45
|
-
'MemberExpression[object.name="styled"],MemberExpression[object.name="styled2"]': node => {
|
|
46
|
-
if (!isNodeOfType(node, 'MemberExpression')) {
|
|
47
|
-
return;
|
|
48
|
-
}
|
|
49
|
-
|
|
50
|
-
// styled.div``
|
|
51
|
-
if (isNodeOfType(node.property, 'Identifier')) {
|
|
52
|
-
if (validPrimitiveElements.has(node.property.name)) {
|
|
53
|
-
const styledIdentifier = node.object.name;
|
|
54
|
-
const elementName = node.property.name;
|
|
55
|
-
|
|
56
|
-
// Including the `styled.` portion in the message to help makers understand it's not just the `div` element that should be replaced
|
|
57
|
-
const reportName = `${styledIdentifier}.${elementName}`; // styled.div
|
|
58
|
-
|
|
59
|
-
context.report({
|
|
60
|
-
node: node,
|
|
61
|
-
messageId: 'preferPrimitives',
|
|
62
|
-
data: {
|
|
63
|
-
element: reportName
|
|
64
|
-
}
|
|
65
|
-
});
|
|
66
|
-
}
|
|
67
|
-
}
|
|
68
|
-
},
|
|
69
|
-
// styled(X)``
|
|
70
|
-
'CallExpression[callee.name="styled"]': node => {
|
|
71
|
-
if (!isNodeOfType(node, 'CallExpression')) {
|
|
72
|
-
return;
|
|
73
|
-
}
|
|
74
|
-
|
|
75
|
-
// styled('div')`` - We only care about 'div'/'span', ignore extending other components
|
|
76
|
-
if (isNodeOfType(node.arguments[0], 'Literal')) {
|
|
77
|
-
const argValue = node.arguments[0].raw;
|
|
78
|
-
if (typeof argValue === 'string') {
|
|
79
|
-
const suggest = validPrimitiveElements.has(argValue.replaceAll(`'`, '') // argValue will have '' around the element name, strip it out for this test
|
|
80
|
-
);
|
|
81
|
-
if (suggest) {
|
|
82
|
-
const styledIdentifier = node.callee.name;
|
|
83
|
-
const elementName = argValue;
|
|
84
|
-
|
|
85
|
-
// Including the `styled()` portion in the message to help makers understand it's not just the `div` element that should be replaced
|
|
86
|
-
const reportName = `${styledIdentifier}(${elementName})`; // styled('div')
|
|
87
|
-
|
|
88
|
-
context.report({
|
|
89
|
-
node: node,
|
|
90
|
-
messageId: 'preferPrimitives',
|
|
91
|
-
data: {
|
|
92
|
-
element: reportName
|
|
93
|
-
}
|
|
94
|
-
});
|
|
95
|
-
}
|
|
96
|
-
}
|
|
97
|
-
}
|
|
98
|
-
}
|
|
99
|
-
};
|
|
19
|
+
create() {
|
|
20
|
+
/**
|
|
21
|
+
* We can't just outright delete the ESLint rule, since:
|
|
22
|
+
* ```
|
|
23
|
+
* // eslint-disable @eslint-plugin/design-system/prefer-primitives
|
|
24
|
+
* ```
|
|
25
|
+
* will cause CI to fail if the rule definition doesn't exist. So, instead
|
|
26
|
+
* we can change the implementation of the rule so that it never reports.
|
|
27
|
+
*/
|
|
28
|
+
return {};
|
|
100
29
|
}
|
|
101
30
|
});
|
|
102
31
|
export default rule;
|
|
@@ -83,15 +83,14 @@ export const createNoTaggedTemplateExpressionRule = (isUsage, messageId) => cont
|
|
|
83
83
|
if (usesEmotion && !!newCode.match(/!\s*important/gm)) {
|
|
84
84
|
return;
|
|
85
85
|
}
|
|
86
|
-
|
|
87
|
-
// For styled-components, we might also want to similarly disallow or autofix `styled.div({ color: props => props.color })` as it's broken too (both type and functionality). This is tracked in https://product-fabric.atlassian.net/browse/USS-26.
|
|
88
|
-
if (/\$\{.*:[\s]*\{/.test(newCode)) {
|
|
86
|
+
if (/\$\{.*:/.test(newCode)) {
|
|
89
87
|
/**
|
|
90
|
-
* If we find a variable in a
|
|
91
|
-
*
|
|
88
|
+
* If we find a variable in a property at all, we skip it. There are two reasons:
|
|
92
89
|
* - `styled-components@3.x` does not support variables in a selector (see the first example).
|
|
90
|
+
* - We cannot guarantee that the contents of a mixin will ever be valid as a property or selector (which in tagged template expressions don't have to even be called).
|
|
91
|
+
* - It's not uncommon we just get this parsing wrong altogether…
|
|
93
92
|
*
|
|
94
|
-
*
|
|
93
|
+
* // TODO: In this case, we _might_ want to convert this into a suggestion to support manual remediation, some of those code isn't bad, or it can be manually made safe…
|
|
95
94
|
*
|
|
96
95
|
* @examples
|
|
97
96
|
* ```tsx
|
|
@@ -103,6 +102,7 @@ export const createNoTaggedTemplateExpressionRule = (isUsage, messageId) => cont
|
|
|
103
102
|
* ```tsx
|
|
104
103
|
* const Component = styled.div`
|
|
105
104
|
* ${mixin()} button { color: red; }
|
|
105
|
+
* ${mixin} button { color: red; }
|
|
106
106
|
* `;
|
|
107
107
|
* ```
|
|
108
108
|
*
|
|
@@ -1,23 +1,29 @@
|
|
|
1
1
|
import _defineProperty from "@babel/runtime/helpers/defineProperty";
|
|
2
2
|
function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
|
|
3
3
|
function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
|
|
4
|
-
import { createWithConfig } from '../ensure-design-token-usage';
|
|
5
4
|
import ruleMeta from '../ensure-design-token-usage/rule-meta';
|
|
6
5
|
import { createLintRule } from '../utils/create-rule';
|
|
7
|
-
var defaultConfig = {
|
|
8
|
-
domains: ['spacing'],
|
|
9
|
-
applyImport: true,
|
|
10
|
-
shouldEnforceFallbacks: false
|
|
11
|
-
};
|
|
12
6
|
var rule = createLintRule({
|
|
13
7
|
meta: _objectSpread(_objectSpread({}, ruleMeta), {}, {
|
|
14
8
|
name: 'ensure-design-token-usage/preview',
|
|
9
|
+
deprecated: true,
|
|
10
|
+
replacedBy: ['@atlaskit/design-system/use-tokens-space'],
|
|
15
11
|
docs: _objectSpread(_objectSpread({}, ruleMeta.docs), {}, {
|
|
16
12
|
description: 'Enforces usage of pre-release design tokens rather than hard-coded values.',
|
|
17
13
|
recommended: false,
|
|
18
14
|
severity: 'warn'
|
|
19
15
|
})
|
|
20
16
|
}),
|
|
21
|
-
create:
|
|
17
|
+
create: function create() {
|
|
18
|
+
/**
|
|
19
|
+
* We can't just outright delete the ESLint rule, since:
|
|
20
|
+
* ```
|
|
21
|
+
* // eslint-disable @eslint-plugin/design-system/ensure-design-token-usage/preview
|
|
22
|
+
* ```
|
|
23
|
+
* will cause CI to fail if the rule definition doesn't exist. So, instead
|
|
24
|
+
* we can change the implementation of the rule so that it never reports.
|
|
25
|
+
*/
|
|
26
|
+
return {};
|
|
27
|
+
}
|
|
22
28
|
});
|
|
23
29
|
export default rule;
|
|
@@ -1,14 +1,12 @@
|
|
|
1
|
-
// eslint-disable-next-line import/no-extraneous-dependencies
|
|
2
|
-
|
|
3
|
-
import { isNodeOfType } from 'eslint-codemod-utils';
|
|
4
1
|
import { createLintRule } from '../utils/create-rule';
|
|
5
|
-
import { shouldSuggest, validPrimitiveElements } from './utils';
|
|
6
2
|
var primitiveDocsUrl = 'https://go.atlassian.com/dst-prefer-primitives';
|
|
7
3
|
var rule = createLintRule({
|
|
8
4
|
meta: {
|
|
9
5
|
name: 'prefer-primitives',
|
|
10
6
|
type: 'suggestion',
|
|
11
7
|
hasSuggestions: false,
|
|
8
|
+
deprecated: true,
|
|
9
|
+
replacedBy: ['@atlaskit/design-system/use-primitives'],
|
|
12
10
|
docs: {
|
|
13
11
|
description: 'Increase awareness of primitive components via code hints. Strictly used for education purposes and discoverability. To enforce usage please refer to the `use-primitives` rule.',
|
|
14
12
|
recommended: false,
|
|
@@ -18,84 +16,16 @@ var rule = createLintRule({
|
|
|
18
16
|
preferPrimitives: "This \"{{element}}\" may be able to be replaced with a primitive component. See ".concat(primitiveDocsUrl, " for guidance.")
|
|
19
17
|
}
|
|
20
18
|
},
|
|
21
|
-
create: function create(
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
}
|
|
32
|
-
var suggest = shouldSuggest(node === null || node === void 0 ? void 0 : node.parent);
|
|
33
|
-
if (suggest) {
|
|
34
|
-
context.report({
|
|
35
|
-
node: node,
|
|
36
|
-
messageId: 'preferPrimitives',
|
|
37
|
-
data: {
|
|
38
|
-
element: node.name.name
|
|
39
|
-
}
|
|
40
|
-
});
|
|
41
|
-
}
|
|
42
|
-
},
|
|
43
|
-
// styled.x`` | styled2.x`` | styled.div()
|
|
44
|
-
'MemberExpression[object.name="styled"],MemberExpression[object.name="styled2"]': function MemberExpressionObjectNameStyledMemberExpressionObjectNameStyled2(node) {
|
|
45
|
-
if (!isNodeOfType(node, 'MemberExpression')) {
|
|
46
|
-
return;
|
|
47
|
-
}
|
|
48
|
-
|
|
49
|
-
// styled.div``
|
|
50
|
-
if (isNodeOfType(node.property, 'Identifier')) {
|
|
51
|
-
if (validPrimitiveElements.has(node.property.name)) {
|
|
52
|
-
var styledIdentifier = node.object.name;
|
|
53
|
-
var elementName = node.property.name;
|
|
54
|
-
|
|
55
|
-
// Including the `styled.` portion in the message to help makers understand it's not just the `div` element that should be replaced
|
|
56
|
-
var reportName = "".concat(styledIdentifier, ".").concat(elementName); // styled.div
|
|
57
|
-
|
|
58
|
-
context.report({
|
|
59
|
-
node: node,
|
|
60
|
-
messageId: 'preferPrimitives',
|
|
61
|
-
data: {
|
|
62
|
-
element: reportName
|
|
63
|
-
}
|
|
64
|
-
});
|
|
65
|
-
}
|
|
66
|
-
}
|
|
67
|
-
},
|
|
68
|
-
// styled(X)``
|
|
69
|
-
'CallExpression[callee.name="styled"]': function CallExpressionCalleeNameStyled(node) {
|
|
70
|
-
if (!isNodeOfType(node, 'CallExpression')) {
|
|
71
|
-
return;
|
|
72
|
-
}
|
|
73
|
-
|
|
74
|
-
// styled('div')`` - We only care about 'div'/'span', ignore extending other components
|
|
75
|
-
if (isNodeOfType(node.arguments[0], 'Literal')) {
|
|
76
|
-
var argValue = node.arguments[0].raw;
|
|
77
|
-
if (typeof argValue === 'string') {
|
|
78
|
-
var suggest = validPrimitiveElements.has(argValue.replaceAll("'", '') // argValue will have '' around the element name, strip it out for this test
|
|
79
|
-
);
|
|
80
|
-
if (suggest) {
|
|
81
|
-
var styledIdentifier = node.callee.name;
|
|
82
|
-
var elementName = argValue;
|
|
83
|
-
|
|
84
|
-
// Including the `styled()` portion in the message to help makers understand it's not just the `div` element that should be replaced
|
|
85
|
-
var reportName = "".concat(styledIdentifier, "(").concat(elementName, ")"); // styled('div')
|
|
86
|
-
|
|
87
|
-
context.report({
|
|
88
|
-
node: node,
|
|
89
|
-
messageId: 'preferPrimitives',
|
|
90
|
-
data: {
|
|
91
|
-
element: reportName
|
|
92
|
-
}
|
|
93
|
-
});
|
|
94
|
-
}
|
|
95
|
-
}
|
|
96
|
-
}
|
|
97
|
-
}
|
|
98
|
-
};
|
|
19
|
+
create: function create() {
|
|
20
|
+
/**
|
|
21
|
+
* We can't just outright delete the ESLint rule, since:
|
|
22
|
+
* ```
|
|
23
|
+
* // eslint-disable @eslint-plugin/design-system/prefer-primitives
|
|
24
|
+
* ```
|
|
25
|
+
* will cause CI to fail if the rule definition doesn't exist. So, instead
|
|
26
|
+
* we can change the implementation of the rule so that it never reports.
|
|
27
|
+
*/
|
|
28
|
+
return {};
|
|
99
29
|
}
|
|
100
30
|
});
|
|
101
31
|
export default rule;
|
package/package.json
CHANGED