@atlaskit/eslint-plugin-design-system 4.15.0 → 4.15.2
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/index.js +0 -11
- package/dist/cjs/rules/ensure-design-token-usage/index.js +1 -29
- package/dist/cjs/rules/ensure-design-token-usage-spacing/index.js +31 -75
- package/dist/cjs/rules/ensure-design-token-usage-spacing/utils.js +17 -87
- package/dist/cjs/rules/icon-label/index.js +0 -20
- package/dist/cjs/rules/no-banned-imports/index.js +1 -7
- package/dist/cjs/rules/no-deprecated-apis/index.js +8 -16
- package/dist/cjs/rules/no-deprecated-design-token-usage/index.js +0 -10
- package/dist/cjs/rules/no-deprecated-imports/index.js +8 -24
- package/dist/cjs/rules/no-deprecated-imports/paths.js +4 -5
- package/dist/cjs/rules/no-unsafe-design-token-usage/index.js +0 -24
- package/dist/cjs/rules/use-visually-hidden/fix-jsx.js +0 -10
- package/dist/cjs/rules/use-visually-hidden/fix-vanilla.js +0 -8
- package/dist/cjs/rules/use-visually-hidden/index.js +7 -32
- package/dist/cjs/rules/use-visually-hidden/utils.js +3 -17
- package/dist/cjs/rules/utils/get-import-node-by-source.js +0 -2
- package/dist/cjs/rules/utils/get-is-exception.js +0 -15
- package/dist/cjs/rules/utils/is-color.js +4 -17
- package/dist/cjs/rules/utils/is-elevation.js +10 -13
- package/dist/cjs/rules/utils/is-node.js +8 -40
- package/dist/cjs/rules/utils/is-token.js +2 -8
- package/dist/cjs/rules/utils/jsx.js +0 -1
- package/dist/cjs/version.json +1 -1
- package/dist/es2019/rules/ensure-design-token-usage/index.js +1 -30
- package/dist/es2019/rules/ensure-design-token-usage-spacing/index.js +29 -59
- package/dist/es2019/rules/ensure-design-token-usage-spacing/utils.js +14 -64
- package/dist/es2019/rules/icon-label/index.js +0 -19
- package/dist/es2019/rules/no-banned-imports/index.js +0 -5
- package/dist/es2019/rules/no-deprecated-apis/index.js +8 -16
- package/dist/es2019/rules/no-deprecated-design-token-usage/index.js +0 -8
- package/dist/es2019/rules/no-deprecated-imports/index.js +8 -20
- package/dist/es2019/rules/no-deprecated-imports/paths.js +4 -3
- package/dist/es2019/rules/no-unsafe-design-token-usage/index.js +0 -17
- package/dist/es2019/rules/use-visually-hidden/fix-jsx.js +0 -4
- package/dist/es2019/rules/use-visually-hidden/fix-vanilla.js +0 -3
- package/dist/es2019/rules/use-visually-hidden/index.js +5 -26
- package/dist/es2019/rules/use-visually-hidden/utils.js +4 -7
- package/dist/es2019/rules/utils/get-is-exception.js +0 -13
- package/dist/es2019/rules/utils/is-color.js +4 -10
- package/dist/es2019/rules/utils/is-elevation.js +10 -11
- package/dist/es2019/rules/utils/is-node.js +8 -20
- package/dist/es2019/rules/utils/is-token.js +0 -2
- package/dist/es2019/version.json +1 -1
- package/dist/esm/rules/ensure-design-token-usage/index.js +1 -23
- package/dist/esm/rules/ensure-design-token-usage-spacing/index.js +32 -68
- package/dist/esm/rules/ensure-design-token-usage-spacing/utils.js +17 -67
- package/dist/esm/rules/icon-label/index.js +0 -17
- package/dist/esm/rules/no-banned-imports/index.js +1 -4
- package/dist/esm/rules/no-deprecated-apis/index.js +8 -13
- package/dist/esm/rules/no-deprecated-design-token-usage/index.js +0 -6
- package/dist/esm/rules/no-deprecated-imports/index.js +9 -21
- package/dist/esm/rules/no-deprecated-imports/paths.js +4 -3
- package/dist/esm/rules/no-unsafe-design-token-usage/index.js +0 -15
- package/dist/esm/rules/use-visually-hidden/fix-jsx.js +0 -4
- package/dist/esm/rules/use-visually-hidden/fix-vanilla.js +0 -3
- package/dist/esm/rules/use-visually-hidden/index.js +7 -25
- package/dist/esm/rules/use-visually-hidden/utils.js +5 -9
- package/dist/esm/rules/utils/get-is-exception.js +0 -13
- package/dist/esm/rules/utils/is-color.js +4 -10
- package/dist/esm/rules/utils/is-elevation.js +10 -11
- package/dist/esm/rules/utils/is-node.js +8 -21
- package/dist/esm/rules/utils/is-token.js +2 -4
- package/dist/esm/version.json +1 -1
- package/package.json +2 -2
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,18 @@
|
|
|
1
1
|
# @atlaskit/eslint-plugin-design-system
|
|
2
2
|
|
|
3
|
+
## 4.15.2
|
|
4
|
+
|
|
5
|
+
### Patch Changes
|
|
6
|
+
|
|
7
|
+
- [`cf16d8f8bcc`](https://bitbucket.org/atlassian/atlassian-frontend/commits/cf16d8f8bcc) - Removes usage of tokens which have been removed from the codebase
|
|
8
|
+
- Updated dependencies
|
|
9
|
+
|
|
10
|
+
## 4.15.1
|
|
11
|
+
|
|
12
|
+
### Patch Changes
|
|
13
|
+
|
|
14
|
+
- [`18aeca8c199`](https://bitbucket.org/atlassian/atlassian-frontend/commits/18aeca8c199) - Internal change to update token references. There is no expected behaviour or visual change.
|
|
15
|
+
|
|
3
16
|
## 4.15.0
|
|
4
17
|
|
|
5
18
|
### Minor Changes
|
package/dist/cjs/index.js
CHANGED
|
@@ -1,30 +1,19 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
|
|
3
3
|
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
4
|
-
|
|
5
4
|
Object.defineProperty(exports, "__esModule", {
|
|
6
5
|
value: true
|
|
7
6
|
});
|
|
8
7
|
exports.rules = exports.configs = void 0;
|
|
9
|
-
|
|
10
8
|
var _ensureDesignTokenUsage = _interopRequireDefault(require("./rules/ensure-design-token-usage"));
|
|
11
|
-
|
|
12
9
|
var _ensureDesignTokenUsageSpacing = _interopRequireDefault(require("./rules/ensure-design-token-usage-spacing"));
|
|
13
|
-
|
|
14
10
|
var _iconLabel = _interopRequireDefault(require("./rules/icon-label"));
|
|
15
|
-
|
|
16
11
|
var _noBannedImports = _interopRequireDefault(require("./rules/no-banned-imports"));
|
|
17
|
-
|
|
18
12
|
var _noDeprecatedApis = _interopRequireDefault(require("./rules/no-deprecated-apis"));
|
|
19
|
-
|
|
20
13
|
var _noDeprecatedDesignTokenUsage = _interopRequireDefault(require("./rules/no-deprecated-design-token-usage"));
|
|
21
|
-
|
|
22
14
|
var _noDeprecatedImports = _interopRequireDefault(require("./rules/no-deprecated-imports"));
|
|
23
|
-
|
|
24
15
|
var _noUnsafeDesignTokenUsage = _interopRequireDefault(require("./rules/no-unsafe-design-token-usage"));
|
|
25
|
-
|
|
26
16
|
var _useVisuallyHidden = _interopRequireDefault(require("./rules/use-visually-hidden"));
|
|
27
|
-
|
|
28
17
|
var rules = {
|
|
29
18
|
'ensure-design-token-usage': _ensureDesignTokenUsage.default,
|
|
30
19
|
'icon-label': _iconLabel.default,
|
|
@@ -4,25 +4,17 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
4
4
|
value: true
|
|
5
5
|
});
|
|
6
6
|
exports.default = void 0;
|
|
7
|
-
|
|
8
7
|
var _eslintCodemodUtils = require("eslint-codemod-utils");
|
|
9
|
-
|
|
10
8
|
var _getIsException = require("../utils/get-is-exception");
|
|
11
|
-
|
|
12
9
|
var _isColor = require("../utils/is-color");
|
|
13
|
-
|
|
14
10
|
var _isElevation = require("../utils/is-elevation");
|
|
15
|
-
|
|
16
11
|
var _isNode = require("../utils/is-node");
|
|
17
|
-
|
|
18
12
|
var defaultConfig = {
|
|
19
13
|
shouldEnforceFallbacks: false
|
|
20
14
|
};
|
|
21
|
-
|
|
22
15
|
var getNodeColumn = function getNodeColumn(node) {
|
|
23
16
|
return node.loc ? node.loc.start.column : 0;
|
|
24
17
|
};
|
|
25
|
-
|
|
26
18
|
var getTokenSuggestion = function getTokenSuggestion(node, reference, config) {
|
|
27
19
|
return [{
|
|
28
20
|
shouldReturnSuggestion: !(0, _isNode.isDecendantOfGlobalToken)(node) && config.shouldEnforceFallbacks === false,
|
|
@@ -38,12 +30,10 @@ var getTokenSuggestion = function getTokenSuggestion(node, reference, config) {
|
|
|
38
30
|
}
|
|
39
31
|
}].filter(filterSuggestion);
|
|
40
32
|
};
|
|
41
|
-
|
|
42
33
|
var filterSuggestion = function filterSuggestion(_ref) {
|
|
43
34
|
var shouldReturnSuggestion = _ref.shouldReturnSuggestion;
|
|
44
35
|
return shouldReturnSuggestion;
|
|
45
36
|
};
|
|
46
|
-
|
|
47
37
|
var rule = {
|
|
48
38
|
meta: {
|
|
49
39
|
// We need to upgrade the version of ESLint.
|
|
@@ -66,7 +56,6 @@ var rule = {
|
|
|
66
56
|
if (!(0, _isNode.isDecendantOfStyleBlock)(node)) {
|
|
67
57
|
return;
|
|
68
58
|
}
|
|
69
|
-
|
|
70
59
|
if (node.type === 'Identifier' && (0, _isColor.isLegacyNamedColor)(node.name) && !isException(node)) {
|
|
71
60
|
context.report({
|
|
72
61
|
messageId: 'hardCodedColor',
|
|
@@ -80,9 +69,7 @@ var rule = {
|
|
|
80
69
|
if (isException(node) || (0, _isNode.isDecendantOfGlobalToken)(node) || (0, _isNode.isDecendantOfType)(node, 'ImportDeclaration') || (0, _isNode.isPropertyKey)(node) || (0, _isNode.isVariableName)(node)) {
|
|
81
70
|
return;
|
|
82
71
|
}
|
|
83
|
-
|
|
84
72
|
var isNodeLegacyColor = (0, _isColor.isLegacyColor)(node.name);
|
|
85
|
-
|
|
86
73
|
if (isNodeLegacyColor || (0, _isColor.isHardCodedColor)(node.name)) {
|
|
87
74
|
if (node.parent.type === 'MemberExpression') {
|
|
88
75
|
if (node.parent.object.type === 'Identifier') {
|
|
@@ -96,10 +83,8 @@ var rule = {
|
|
|
96
83
|
});
|
|
97
84
|
}
|
|
98
85
|
}
|
|
99
|
-
|
|
100
86
|
return;
|
|
101
87
|
}
|
|
102
|
-
|
|
103
88
|
context.report({
|
|
104
89
|
messageId: 'hardCodedColor',
|
|
105
90
|
node: node,
|
|
@@ -107,9 +92,7 @@ var rule = {
|
|
|
107
92
|
});
|
|
108
93
|
return;
|
|
109
94
|
}
|
|
110
|
-
|
|
111
95
|
var elevation = (0, _isElevation.isLegacyElevation)(node.name);
|
|
112
|
-
|
|
113
96
|
if (elevation) {
|
|
114
97
|
context.report({
|
|
115
98
|
messageId: 'legacyElevation',
|
|
@@ -121,7 +104,6 @@ var rule = {
|
|
|
121
104
|
if ((0, _isNode.isChildOfType)(node, 'TemplateLiteral') && node.range) {
|
|
122
105
|
return fixer.replaceTextRange([node.range[0] - 2, node.range[1] + 1], "background-color: ${token('".concat(elevation.background, "')};\n").concat(' '.repeat(getNodeColumn(node) - 2), "box-shadow: ${token('").concat(elevation.shadow, "')}"));
|
|
123
106
|
}
|
|
124
|
-
|
|
125
107
|
return null;
|
|
126
108
|
}
|
|
127
109
|
});
|
|
@@ -131,16 +113,15 @@ var rule = {
|
|
|
131
113
|
if (node.type !== 'TaggedTemplateExpression') {
|
|
132
114
|
return;
|
|
133
115
|
}
|
|
134
|
-
|
|
135
116
|
var value = node.quasi.quasis.map(function (q) {
|
|
136
117
|
return q.value.raw;
|
|
137
118
|
}).join('');
|
|
119
|
+
|
|
138
120
|
/**
|
|
139
121
|
* Attempts to remove all non-essential words & characters from a style block.
|
|
140
122
|
* Including selectors, queries and property names, leaving only values
|
|
141
123
|
* This is necessary to avoid cases where a property might have a color in its name ie. "white-space"
|
|
142
124
|
*/
|
|
143
|
-
|
|
144
125
|
var cssProperties = value.replace(/\n/g, '').split(/;|{|}/).map(function (el) {
|
|
145
126
|
return el.trim().split(':').pop() || '';
|
|
146
127
|
});
|
|
@@ -158,11 +139,9 @@ var rule = {
|
|
|
158
139
|
if (node.type !== 'Literal' || typeof node.value !== 'string') {
|
|
159
140
|
return;
|
|
160
141
|
}
|
|
161
|
-
|
|
162
142
|
if (!(0, _isNode.isDecendantOfStyleBlock)(node) && !(0, _isNode.isDecendantOfStyleJsxAttribute)(node)) {
|
|
163
143
|
return;
|
|
164
144
|
}
|
|
165
|
-
|
|
166
145
|
if (((0, _isColor.isHardCodedColor)(node.value) || (0, _isColor.includesHardCodedColor)(node.value)) && !isException(node)) {
|
|
167
146
|
context.report({
|
|
168
147
|
messageId: 'hardCodedColor',
|
|
@@ -176,15 +155,12 @@ var rule = {
|
|
|
176
155
|
if (node.type !== 'CallExpression' || node.callee.type !== 'Identifier') {
|
|
177
156
|
return;
|
|
178
157
|
}
|
|
179
|
-
|
|
180
158
|
if (!(0, _isNode.isDecendantOfStyleBlock)(node) && !(0, _isNode.isDecendantOfStyleJsxAttribute)(node)) {
|
|
181
159
|
return;
|
|
182
160
|
}
|
|
183
|
-
|
|
184
161
|
if (!(0, _isColor.isLegacyNamedColor)(node.callee.name) || (0, _isNode.isDecendantOfGlobalToken)(node) || isException(node)) {
|
|
185
162
|
return;
|
|
186
163
|
}
|
|
187
|
-
|
|
188
164
|
context.report({
|
|
189
165
|
messageId: 'hardCodedColor',
|
|
190
166
|
node: node,
|
|
@@ -195,18 +171,14 @@ var rule = {
|
|
|
195
171
|
if (!node.value) {
|
|
196
172
|
return;
|
|
197
173
|
}
|
|
198
|
-
|
|
199
174
|
if (['alt', 'src', 'label'].includes(node.name.name)) {
|
|
200
175
|
return;
|
|
201
176
|
}
|
|
202
|
-
|
|
203
177
|
if (node.value.type === 'Literal') {
|
|
204
178
|
if (isException(node)) {
|
|
205
179
|
return;
|
|
206
180
|
}
|
|
207
|
-
|
|
208
181
|
var literalValue = node.value.value;
|
|
209
|
-
|
|
210
182
|
if ((0, _isColor.isHardCodedColor)(literalValue) || (0, _isColor.includesHardCodedColor)(literalValue)) {
|
|
211
183
|
context.report({
|
|
212
184
|
messageId: 'hardCodedColor',
|
|
@@ -1,28 +1,18 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
|
|
3
3
|
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
4
|
-
|
|
5
4
|
Object.defineProperty(exports, "__esModule", {
|
|
6
5
|
value: true
|
|
7
6
|
});
|
|
8
7
|
exports.default = void 0;
|
|
9
|
-
|
|
10
8
|
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
|
|
11
|
-
|
|
12
9
|
var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
|
|
13
|
-
|
|
14
10
|
var _eslintCodemodUtils = require("eslint-codemod-utils");
|
|
15
|
-
|
|
16
11
|
var _tokensRaw = require("@atlaskit/tokens/tokens-raw");
|
|
17
|
-
|
|
18
12
|
var _isNode = require("../utils/is-node");
|
|
19
|
-
|
|
20
13
|
var _utils = require("./utils");
|
|
21
|
-
|
|
22
14
|
function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
|
|
23
|
-
|
|
24
15
|
function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { (0, _defineProperty2.default)(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
|
|
25
|
-
|
|
26
16
|
/**
|
|
27
17
|
* Currently we have a wide range of experimental spacing tokens that we are testing.
|
|
28
18
|
* We only want transforms to apply to the stable scale values, not the rest.
|
|
@@ -31,7 +21,6 @@ function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { va
|
|
|
31
21
|
var onlyScaleTokens = _tokensRaw.spacing.filter(function (token) {
|
|
32
22
|
return token.name.startsWith('space.');
|
|
33
23
|
});
|
|
34
|
-
|
|
35
24
|
var spacingValueToToken = Object.fromEntries(onlyScaleTokens.map(function (token) {
|
|
36
25
|
return [token.attributes['pixelValue'], token.name];
|
|
37
26
|
}));
|
|
@@ -46,17 +35,17 @@ var typographyValueToToken = Object.fromEntries(_tokensRaw.typography.map(functi
|
|
|
46
35
|
return token.length;
|
|
47
36
|
}))];
|
|
48
37
|
}));
|
|
38
|
+
|
|
49
39
|
/**
|
|
50
40
|
* Returns a token node for a given value including fallbacks.
|
|
51
41
|
* @param propertyName camelCase CSS property
|
|
52
42
|
* @param value string representing pixel value, or font family, or number representing font weight
|
|
53
43
|
* @example
|
|
54
44
|
* ```
|
|
55
|
-
* propertyName: padding, value: '8px' => token('
|
|
45
|
+
* propertyName: padding, value: '8px' => token('space.100', '8px')
|
|
56
46
|
* propertyName: fontWeight, value: 400 => token('font.weight.regular', '400')
|
|
57
47
|
* ```
|
|
58
48
|
*/
|
|
59
|
-
|
|
60
49
|
function getTokenNodeForValue(propertyName, value) {
|
|
61
50
|
var token = (0, _utils.isTypographyProperty)(propertyName) ? typographyValueToToken[propertyName][value] : spacingValueToToken[value];
|
|
62
51
|
var fallbackValue = propertyName === 'fontFamily' ? "\"".concat(value, "\"") : "'".concat(value, "'");
|
|
@@ -70,6 +59,7 @@ function getTokenNodeForValue(propertyName, value) {
|
|
|
70
59
|
optional: false
|
|
71
60
|
});
|
|
72
61
|
}
|
|
62
|
+
|
|
73
63
|
/**
|
|
74
64
|
* Returns a boolean that signals wether the current property is revelant under the current configuration
|
|
75
65
|
* @param propertyName camelCase CSS property
|
|
@@ -80,20 +70,15 @@ function getTokenNodeForValue(propertyName, value) {
|
|
|
80
70
|
* propertyName: fontWeight, targetOptions: ['spacing', 'typography']
|
|
81
71
|
* ```
|
|
82
72
|
*/
|
|
83
|
-
|
|
84
|
-
|
|
85
73
|
function shouldAnalyzeProperty(propertyName, targetOptions) {
|
|
86
74
|
if ((0, _utils.isSpacingProperty)(propertyName) && targetOptions.includes('spacing')) {
|
|
87
75
|
return true;
|
|
88
76
|
}
|
|
89
|
-
|
|
90
77
|
if ((0, _utils.isTypographyProperty)(propertyName) && targetOptions.includes('typography')) {
|
|
91
78
|
return true;
|
|
92
79
|
}
|
|
93
|
-
|
|
94
80
|
return false;
|
|
95
81
|
}
|
|
96
|
-
|
|
97
82
|
var rule = {
|
|
98
83
|
meta: {
|
|
99
84
|
type: 'problem',
|
|
@@ -109,14 +94,11 @@ var rule = {
|
|
|
109
94
|
},
|
|
110
95
|
create: function create(context) {
|
|
111
96
|
var _context$options$;
|
|
112
|
-
|
|
113
97
|
var targetCategories = ['spacing'];
|
|
114
98
|
var configCategories = (_context$options$ = context.options[0]) === null || _context$options$ === void 0 ? void 0 : _context$options$.addons;
|
|
115
|
-
|
|
116
99
|
if (Array.isArray(configCategories) && configCategories.includes('typography')) {
|
|
117
100
|
targetCategories.push('typography');
|
|
118
101
|
}
|
|
119
|
-
|
|
120
102
|
return {
|
|
121
103
|
// CSSObjectExpression
|
|
122
104
|
// const styles = css({ color: 'red', margin: '4px' })
|
|
@@ -124,51 +106,42 @@ var rule = {
|
|
|
124
106
|
if (!(0, _eslintCodemodUtils.isNodeOfType)(parentNode, 'ObjectExpression')) {
|
|
125
107
|
return;
|
|
126
108
|
}
|
|
109
|
+
|
|
127
110
|
/**
|
|
128
111
|
* We do this in case the fontSize for a style object is declared alongside the `em` or `lineHeight` declaration
|
|
129
112
|
*/
|
|
130
|
-
|
|
131
|
-
|
|
132
113
|
var fontSizeNode = parentNode.properties.find(function (node) {
|
|
133
114
|
if (!(0, _eslintCodemodUtils.isNodeOfType)(node, 'Property')) {
|
|
134
115
|
return;
|
|
135
116
|
}
|
|
136
|
-
|
|
137
117
|
if (!(0, _eslintCodemodUtils.isNodeOfType)(node.key, 'Identifier')) {
|
|
138
118
|
return;
|
|
139
119
|
}
|
|
140
|
-
|
|
141
120
|
return node.key.name === 'fontSize';
|
|
142
121
|
});
|
|
143
|
-
var fontSizeValue = (0, _utils.getValue)(
|
|
122
|
+
var fontSizeValue = (0, _utils.getValue)(
|
|
123
|
+
// @ts-expect-error
|
|
144
124
|
(0, _eslintCodemodUtils.isNodeOfType)(fontSizeNode, 'Property') && fontSizeNode.value, context);
|
|
145
125
|
var fontSize = Array.isArray(fontSizeValue) ? fontSizeValue[0] : fontSizeValue;
|
|
146
|
-
|
|
147
126
|
function findObjectStyles(node) {
|
|
148
127
|
if (!(0, _eslintCodemodUtils.isNodeOfType)(node, 'Property')) {
|
|
149
128
|
return;
|
|
150
129
|
}
|
|
151
|
-
|
|
152
130
|
if ((0, _eslintCodemodUtils.isNodeOfType)(node.value, 'ObjectExpression')) {
|
|
153
131
|
return node.value.properties.forEach(findObjectStyles);
|
|
154
132
|
}
|
|
155
|
-
|
|
156
133
|
if (!(0, _eslintCodemodUtils.isNodeOfType)(node.key, 'Identifier')) {
|
|
157
134
|
return;
|
|
158
135
|
}
|
|
159
|
-
|
|
160
136
|
if (!shouldAnalyzeProperty(node.key.name, targetCategories)) {
|
|
161
137
|
return;
|
|
162
138
|
}
|
|
163
|
-
|
|
164
139
|
if ((0, _isNode.isDecendantOfGlobalToken)(node.value)) {
|
|
165
140
|
return;
|
|
166
141
|
}
|
|
167
|
-
|
|
168
142
|
if ((0, _eslintCodemodUtils.isNodeOfType)(node.value, 'TemplateLiteral') && node.value.expressions.some(_isNode.isDecendantOfGlobalToken)) {
|
|
169
143
|
return;
|
|
170
144
|
}
|
|
171
|
-
|
|
172
145
|
if (node.value.type === 'Literal' && !(0, _utils.isValidSpacingValue)(node.value.value, fontSize)) {
|
|
173
146
|
context.report({
|
|
174
147
|
node: node,
|
|
@@ -179,11 +152,11 @@ var rule = {
|
|
|
179
152
|
});
|
|
180
153
|
return;
|
|
181
154
|
}
|
|
182
|
-
|
|
183
155
|
var propertyName = node.key.name;
|
|
184
156
|
var isFontFamily = /fontFamily/.test(propertyName);
|
|
185
|
-
var value = (0, _utils.getValue)(node.value, context);
|
|
157
|
+
var value = (0, _utils.getValue)(node.value, context);
|
|
186
158
|
|
|
159
|
+
// value is either NaN or it can't be resolved eg, em, 100% etc...
|
|
187
160
|
if (!(value && (0, _utils.isValidSpacingValue)(value, fontSize))) {
|
|
188
161
|
return context.report({
|
|
189
162
|
node: node,
|
|
@@ -193,14 +166,13 @@ var rule = {
|
|
|
193
166
|
}
|
|
194
167
|
});
|
|
195
168
|
}
|
|
169
|
+
var values = Array.isArray(value) ? value : [value];
|
|
196
170
|
|
|
197
|
-
|
|
171
|
+
// value is a single value so we can apply a more robust approach to our fix
|
|
198
172
|
// treat fontFamily as having one value
|
|
199
|
-
|
|
200
173
|
if (values.length === 1 || isFontFamily) {
|
|
201
174
|
var _values = (0, _slicedToArray2.default)(values, 1),
|
|
202
|
-
|
|
203
|
-
|
|
175
|
+
_value = _values[0];
|
|
204
176
|
var pixelValue = isFontFamily ? _value : (0, _utils.emToPixels)(_value, fontSize);
|
|
205
177
|
return context.report({
|
|
206
178
|
node: node,
|
|
@@ -210,19 +182,15 @@ var rule = {
|
|
|
210
182
|
},
|
|
211
183
|
fix: function fix(fixer) {
|
|
212
184
|
var _node$loc;
|
|
213
|
-
|
|
214
185
|
if (!shouldAnalyzeProperty(propertyName, targetCategories)) {
|
|
215
186
|
return null;
|
|
216
187
|
}
|
|
217
|
-
|
|
218
188
|
var pixelValueString = "".concat(pixelValue, "px");
|
|
219
189
|
var lookupValue = /fontWeight|fontFamily/.test(propertyName) ? pixelValue : pixelValueString;
|
|
220
190
|
var tokenName = (0, _utils.isTypographyProperty)(propertyName) ? typographyValueToToken[propertyName][lookupValue] : spacingValueToToken[lookupValue];
|
|
221
|
-
|
|
222
191
|
if (!tokenName) {
|
|
223
192
|
return null;
|
|
224
193
|
}
|
|
225
|
-
|
|
226
194
|
var replacementValue = getTokenNodeForValue(propertyName, lookupValue);
|
|
227
195
|
return [fixer.insertTextBefore(node, "// TODO Delete this comment after verifying spacing token -> previous value `".concat((0, _eslintCodemodUtils.node)(node.value), "`\n").concat(' '.padStart(((_node$loc = node.loc) === null || _node$loc === void 0 ? void 0 : _node$loc.start.column) || 0))), fixer.replaceText(node, (0, _eslintCodemodUtils.property)(_objectSpread(_objectSpread({}, node), {}, {
|
|
228
196
|
value: replacementValue
|
|
@@ -230,6 +198,7 @@ var rule = {
|
|
|
230
198
|
}
|
|
231
199
|
});
|
|
232
200
|
}
|
|
201
|
+
|
|
233
202
|
/**
|
|
234
203
|
* Compound values are hard to deal with / replace because we need to find/replace strings inside an
|
|
235
204
|
* estree node.
|
|
@@ -237,8 +206,6 @@ var rule = {
|
|
|
237
206
|
* @example
|
|
238
207
|
* { padding: '8px 0px' } // two values we don't try and apply the fixer
|
|
239
208
|
*/
|
|
240
|
-
|
|
241
|
-
|
|
242
209
|
values.forEach(function (val, index) {
|
|
243
210
|
var pixelValue = (0, _utils.emToPixels)(val, fontSize);
|
|
244
211
|
context.report({
|
|
@@ -251,11 +218,9 @@ var rule = {
|
|
|
251
218
|
var allResolvableValues = values.every(function (value) {
|
|
252
219
|
return !Number.isNaN((0, _utils.emToPixels)(value, fontSize));
|
|
253
220
|
});
|
|
254
|
-
|
|
255
221
|
if (!allResolvableValues) {
|
|
256
222
|
return null;
|
|
257
223
|
}
|
|
258
|
-
|
|
259
224
|
return fixer.replaceText(node.value, "`".concat(values.map(function (value) {
|
|
260
225
|
var pixelValue = (0, _utils.emToPixels)(value, fontSize);
|
|
261
226
|
var pixelValueString = "".concat(pixelValue, "px");
|
|
@@ -265,7 +230,6 @@ var rule = {
|
|
|
265
230
|
});
|
|
266
231
|
});
|
|
267
232
|
}
|
|
268
|
-
|
|
269
233
|
parentNode.properties.forEach(findObjectStyles);
|
|
270
234
|
},
|
|
271
235
|
// CSSTemplateLiteral and StyledTemplateLiteral
|
|
@@ -275,46 +239,43 @@ var rule = {
|
|
|
275
239
|
if (node.type !== 'TaggedTemplateExpression') {
|
|
276
240
|
return;
|
|
277
241
|
}
|
|
278
|
-
|
|
279
242
|
var parentNode = (0, _utils.findParentNodeForLine)(node);
|
|
280
243
|
var combinedString = node.quasi.quasis.map(function (q, i) {
|
|
281
244
|
return "".concat(q.value.raw).concat(node.quasi.expressions[i] ? (0, _utils.getValue)(node.quasi.expressions[i], context) : '');
|
|
282
245
|
}).join('');
|
|
246
|
+
|
|
283
247
|
/**
|
|
284
248
|
* Attempts to remove all non-essential words & characters from a style block.
|
|
285
249
|
* Including selectors and queries
|
|
286
250
|
* Adapted from ensure-design-token-usage
|
|
287
251
|
*/
|
|
288
|
-
|
|
289
252
|
var cssProperties = combinedString.split('\n').filter(function (line) {
|
|
290
253
|
return !line.trim().startsWith('@');
|
|
291
254
|
}).join('\n').replace(/\n/g, '').split(/;|(?<!\$){|(?<!\${.+?)}/) // don't split on template literal expressions i.e. `${...}`
|
|
292
255
|
.map(function (el) {
|
|
293
256
|
return el.trim() || '';
|
|
294
|
-
}).filter(Boolean);
|
|
257
|
+
}).filter(Boolean);
|
|
295
258
|
|
|
259
|
+
// Get font size
|
|
296
260
|
var fontSizeNode = cssProperties.find(function (style) {
|
|
297
261
|
var _style$split = style.split(':'),
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
262
|
+
_style$split2 = (0, _slicedToArray2.default)(_style$split, 2),
|
|
263
|
+
rawProperty = _style$split2[0],
|
|
264
|
+
value = _style$split2[1];
|
|
302
265
|
return /font-size/.test(rawProperty) ? value : null;
|
|
303
266
|
});
|
|
304
267
|
var fontSize = (0, _utils.getValueFromShorthand)(fontSizeNode)[0];
|
|
305
268
|
cssProperties.forEach(function (style) {
|
|
306
269
|
var _style$split3 = style.split(':'),
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
270
|
+
_style$split4 = (0, _slicedToArray2.default)(_style$split3, 2),
|
|
271
|
+
rawProperty = _style$split4[0],
|
|
272
|
+
value = _style$split4[1];
|
|
311
273
|
var propertyName = (0, _utils.convertHyphenatedNameToCamelCase)(rawProperty);
|
|
312
|
-
|
|
313
274
|
if (!shouldAnalyzeProperty(propertyName, targetCategories)) {
|
|
314
275
|
return;
|
|
315
|
-
}
|
|
316
|
-
|
|
276
|
+
}
|
|
317
277
|
|
|
278
|
+
// value is either NaN or it can't be resolved eg, em, 100% etc...
|
|
318
279
|
if (!(0, _utils.isValidSpacingValue)(value, fontSize)) {
|
|
319
280
|
return context.report({
|
|
320
281
|
node: node,
|
|
@@ -324,13 +285,11 @@ var rule = {
|
|
|
324
285
|
}
|
|
325
286
|
});
|
|
326
287
|
}
|
|
327
|
-
|
|
328
288
|
var values = (0, _utils.getValueFromShorthand)(value);
|
|
329
289
|
values.forEach(function (val, index) {
|
|
330
290
|
if (!val && val !== 0 || !shouldAnalyzeProperty(propertyName, targetCategories)) {
|
|
331
291
|
return;
|
|
332
292
|
}
|
|
333
|
-
|
|
334
293
|
var isFontFamily = /fontFamily/.test(propertyName);
|
|
335
294
|
var pixelValue = isFontFamily ? val : (0, _utils.emToPixels)(val, fontSize);
|
|
336
295
|
context.report({
|
|
@@ -343,39 +302,36 @@ var rule = {
|
|
|
343
302
|
var allResolvableValues = values.every(function (value) {
|
|
344
303
|
return !Number.isNaN((0, _utils.emToPixels)(value, fontSize));
|
|
345
304
|
});
|
|
346
|
-
|
|
347
305
|
if (!allResolvableValues) {
|
|
348
306
|
return null;
|
|
349
307
|
}
|
|
350
|
-
|
|
351
308
|
var replacementValue = values.map(function (value) {
|
|
352
309
|
var propertyValue = typeof value === 'string' ? value.trim() : value;
|
|
353
310
|
var pixelValue = isFontFamily ? propertyValue : (0, _utils.emToPixels)(propertyValue, fontSize);
|
|
354
311
|
var pixelValueString = "".concat(pixelValue, "px");
|
|
355
312
|
var lookupValue = /fontWeight|fontFamily/.test(propertyName) ? pixelValue : pixelValueString;
|
|
356
313
|
var tokenName = (0, _utils.isTypographyProperty)(propertyName) ? typographyValueToToken[propertyName][lookupValue] : spacingValueToToken[lookupValue];
|
|
357
|
-
|
|
358
314
|
if (!tokenName) {
|
|
359
315
|
return pixelValueString;
|
|
360
316
|
}
|
|
317
|
+
var replacementTokenValue = getTokenNodeForValue(propertyName, lookupValue);
|
|
361
318
|
|
|
362
|
-
|
|
363
|
-
|
|
319
|
+
// ${token('...', '...')}
|
|
364
320
|
var replacementSubValue = '${' + replacementTokenValue.toString() + '}';
|
|
365
321
|
return replacementSubValue;
|
|
366
|
-
}).join(' ');
|
|
367
|
-
|
|
368
|
-
var textForSource = context.getSourceCode().getText(node.quasi); // find `<property>: ...;` in original
|
|
322
|
+
}).join(' ');
|
|
369
323
|
|
|
370
|
-
|
|
324
|
+
// get original source
|
|
325
|
+
var textForSource = context.getSourceCode().getText(node.quasi);
|
|
371
326
|
|
|
327
|
+
// find `<property>: ...;` in original
|
|
328
|
+
var searchRegExp = new RegExp(style, 'g');
|
|
329
|
+
// replace property:val with new property:val
|
|
372
330
|
var replacement = textForSource.replace(searchRegExp, // padding: ${gridSize()}px;
|
|
373
331
|
"".concat(rawProperty, ": ").concat(replacementValue));
|
|
374
|
-
|
|
375
332
|
if (!replacement) {
|
|
376
333
|
return [];
|
|
377
334
|
}
|
|
378
|
-
|
|
379
335
|
return [fixer.insertTextBefore(parentNode, "// TODO Delete this comment after verifying spacing token -> previous value `".concat(value.trim(), "`\n")), fixer.replaceText(node.quasi, replacement)];
|
|
380
336
|
} : undefined
|
|
381
337
|
});
|