@atlaskit/eslint-plugin-design-system 3.2.0 → 4.1.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 +56 -0
- package/dist/cjs/index.js +7 -1
- package/dist/cjs/rules/ensure-design-token-usage/index.js +7 -115
- package/dist/cjs/rules/no-deprecated-design-token-usage/index.js +76 -0
- package/dist/cjs/rules/no-unsafe-design-token-usage/index.js +176 -0
- package/dist/cjs/rules/{ensure-design-token-usage/utils → utils}/is-color.js +3 -2
- package/dist/cjs/rules/{ensure-design-token-usage/utils → utils}/is-elevation.js +0 -0
- package/dist/cjs/rules/{ensure-design-token-usage/utils → utils}/is-node.js +1 -1
- package/dist/cjs/rules/{ensure-design-token-usage/utils → utils}/is-token.js +0 -0
- package/dist/cjs/version.json +1 -1
- package/dist/es2019/index.js +4 -0
- package/dist/es2019/rules/ensure-design-token-usage/index.js +7 -129
- package/dist/es2019/rules/no-deprecated-design-token-usage/index.js +58 -0
- package/dist/es2019/rules/no-unsafe-design-token-usage/index.js +173 -0
- package/dist/es2019/rules/{ensure-design-token-usage/utils → utils}/is-color.js +2 -1
- package/dist/es2019/rules/{ensure-design-token-usage/utils → utils}/is-elevation.js +0 -0
- package/dist/es2019/rules/{ensure-design-token-usage/utils → utils}/is-node.js +0 -0
- package/dist/es2019/rules/{ensure-design-token-usage/utils → utils}/is-token.js +0 -0
- package/dist/es2019/version.json +1 -1
- package/dist/esm/index.js +4 -0
- package/dist/esm/rules/ensure-design-token-usage/index.js +7 -110
- package/dist/esm/rules/no-deprecated-design-token-usage/index.js +66 -0
- package/dist/esm/rules/no-unsafe-design-token-usage/index.js +163 -0
- package/dist/esm/rules/{ensure-design-token-usage/utils → utils}/is-color.js +2 -1
- package/dist/esm/rules/{ensure-design-token-usage/utils → utils}/is-elevation.js +0 -0
- package/dist/esm/rules/{ensure-design-token-usage/utils → utils}/is-node.js +0 -0
- package/dist/esm/rules/{ensure-design-token-usage/utils → utils}/is-token.js +0 -0
- package/dist/esm/version.json +1 -1
- package/dist/types/index.d.ts +2 -0
- package/dist/types/rules/no-deprecated-design-token-usage/index.d.ts +3 -0
- package/dist/types/rules/no-unsafe-design-token-usage/index.d.ts +3 -0
- package/dist/types/rules/{ensure-design-token-usage/utils → utils}/is-color.d.ts +0 -0
- package/dist/types/rules/{ensure-design-token-usage/utils → utils}/is-elevation.d.ts +0 -0
- package/dist/types/rules/{ensure-design-token-usage/utils → utils}/is-node.d.ts +0 -0
- package/dist/types/rules/{ensure-design-token-usage/utils → utils}/is-token.d.ts +0 -0
- package/package.json +6 -6
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,61 @@
|
|
|
1
1
|
# @atlaskit/eslint-plugin-design-system
|
|
2
2
|
|
|
3
|
+
## 4.1.1
|
|
4
|
+
|
|
5
|
+
### Patch Changes
|
|
6
|
+
|
|
7
|
+
- [`19d72473dfb`](https://bitbucket.org/atlassian/atlassian-frontend/commits/19d72473dfb) - The no-unsafe-design-token-usage eslint rule now respects the new token naming conventions when auto-fixing by correctly formatting token ids.
|
|
8
|
+
- Updated dependencies
|
|
9
|
+
|
|
10
|
+
## 4.1.0
|
|
11
|
+
|
|
12
|
+
### Minor Changes
|
|
13
|
+
|
|
14
|
+
- [`52fbe80eeb5`](https://bitbucket.org/atlassian/atlassian-frontend/commits/52fbe80eeb5) - Moved logic for detecting deprecated tokens out of no-unsafe-design-token-usage and moves it into a new rule: no-deprecated-token-usage. This rule is solely reponsible for catching usage of deprecated tokens. In most cases this allows consumers to set this rule to "warn", allowing iterative migration to new token names rather than in a big bang.
|
|
15
|
+
|
|
16
|
+
### Patch Changes
|
|
17
|
+
|
|
18
|
+
- Updated dependencies
|
|
19
|
+
|
|
20
|
+
## 4.0.1
|
|
21
|
+
|
|
22
|
+
### Patch Changes
|
|
23
|
+
|
|
24
|
+
- [`7da1a30902a`](https://bitbucket.org/atlassian/atlassian-frontend/commits/7da1a30902a) - Adds missing meta to `ensure-design-token-usage` rule.
|
|
25
|
+
|
|
26
|
+
## 4.0.0
|
|
27
|
+
|
|
28
|
+
### Major Changes
|
|
29
|
+
|
|
30
|
+
- [`a2f953f3814`](https://bitbucket.org/atlassian/atlassian-frontend/commits/a2f953f3814) - Previously the `ensure-design-token-usage` eslint rule contained all checks relating to token use. This has now been split up into two separate rules:
|
|
31
|
+
|
|
32
|
+
`ensure-design-token-usage` now covers:
|
|
33
|
+
|
|
34
|
+
- `legacyElevation` — warns about old usages of the elevation mixins or styles, which instead should use the `card` or `overlay` tokens.
|
|
35
|
+
- `hardCodedColor` — warns about use of hard-coded colors such as `color: colors.B100`, which instead should be wrapped in a `token()` call. This covers the majority of cases in existing codebases when first adopting tokens.
|
|
36
|
+
|
|
37
|
+
`no-unsafe-design-token-usage` (new) covers the remaining rules:
|
|
38
|
+
|
|
39
|
+
- `directTokenUsage` — warns against using the CSS Custom Property name that is output in the browser by the `token()` call.
|
|
40
|
+
Eg. directly using `var(--ds-accent-subtleBlue)` is bad.
|
|
41
|
+
- `staticToken` — warns when tokens aren't used inline. Inlining the token usages helps with static analysis, which unlocks future improvements.
|
|
42
|
+
Eg. pulling the token out into a const like `css={ color: token(primaryButtonText) }` is bad.
|
|
43
|
+
- `invalidToken` — warns when using a token that doesn't exist (not one that's been renamed, see the next point).
|
|
44
|
+
- `tokenRenamed` — warns when using a token that's been renamed in a subsequent release.
|
|
45
|
+
- `tokenFallbackEnforced` — warns if a fallback for the token call is not provided.
|
|
46
|
+
Eg. call with the fallback like this `token('color.background.disabled', N10)` instead of `token('color.background.disabled')`.
|
|
47
|
+
- `tokenFallbackRestricted` — the opposite of `tokenFallbackEnforced`.
|
|
48
|
+
Eg. do not pass in a fallback like this `token('color.background.disabled', N10)` and instead only include the token `token('color.background.disabled')`.
|
|
49
|
+
|
|
50
|
+
Upgrading — some instances of `\\eslint-disable` may need to be changed to the new rule. If you have failing lint rules after only bumping this package then switch those ignores to use `no-unsafe-design-token-usage` instead.
|
|
51
|
+
|
|
52
|
+
### Patch Changes
|
|
53
|
+
|
|
54
|
+
- [`f460cc7c411`](https://bitbucket.org/atlassian/atlassian-frontend/commits/f460cc7c411) - Builds for this package now pass through a tokens babel plugin, removing runtime invocations of the tokens() function and improving bundle size.
|
|
55
|
+
- [`26719f5b7b0`](https://bitbucket.org/atlassian/atlassian-frontend/commits/26719f5b7b0) - Update @atlaskit tokens dependency from a devDependency to a regular dependency
|
|
56
|
+
- [`a66711cd58c`](https://bitbucket.org/atlassian/atlassian-frontend/commits/a66711cd58c) - Remove `@atlaskit/tokens` from peer dependency.
|
|
57
|
+
- Updated dependencies
|
|
58
|
+
|
|
3
59
|
## 3.2.0
|
|
4
60
|
|
|
5
61
|
### Minor Changes
|
package/dist/cjs/index.js
CHANGED
|
@@ -5,14 +5,20 @@ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefau
|
|
|
5
5
|
Object.defineProperty(exports, "__esModule", {
|
|
6
6
|
value: true
|
|
7
7
|
});
|
|
8
|
-
exports.
|
|
8
|
+
exports.rules = exports.configs = void 0;
|
|
9
9
|
|
|
10
10
|
var _ensureDesignTokenUsage = _interopRequireDefault(require("./rules/ensure-design-token-usage"));
|
|
11
11
|
|
|
12
|
+
var _noDeprecatedDesignTokenUsage = _interopRequireDefault(require("./rules/no-deprecated-design-token-usage"));
|
|
13
|
+
|
|
12
14
|
var _noDeprecatedImports = _interopRequireDefault(require("./rules/no-deprecated-imports"));
|
|
13
15
|
|
|
16
|
+
var _noUnsafeDesignTokenUsage = _interopRequireDefault(require("./rules/no-unsafe-design-token-usage"));
|
|
17
|
+
|
|
14
18
|
var rules = {
|
|
15
19
|
'ensure-design-token-usage': _ensureDesignTokenUsage.default,
|
|
20
|
+
'no-unsafe-design-token-usage': _noUnsafeDesignTokenUsage.default,
|
|
21
|
+
'no-deprecated-design-token-usage': _noDeprecatedDesignTokenUsage.default,
|
|
16
22
|
'no-deprecated-imports': _noDeprecatedImports.default
|
|
17
23
|
};
|
|
18
24
|
exports.rules = rules;
|
|
@@ -1,23 +1,15 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
|
|
3
|
-
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
4
|
-
|
|
5
3
|
Object.defineProperty(exports, "__esModule", {
|
|
6
4
|
value: true
|
|
7
5
|
});
|
|
8
6
|
exports.default = void 0;
|
|
9
7
|
|
|
10
|
-
var
|
|
11
|
-
|
|
12
|
-
var _tokenNames = _interopRequireDefault(require("@atlaskit/tokens/token-names"));
|
|
13
|
-
|
|
14
|
-
var _isColor = require("./utils/is-color");
|
|
15
|
-
|
|
16
|
-
var _isElevation = require("./utils/is-elevation");
|
|
8
|
+
var _isColor = require("../utils/is-color");
|
|
17
9
|
|
|
18
|
-
var
|
|
10
|
+
var _isElevation = require("../utils/is-elevation");
|
|
19
11
|
|
|
20
|
-
var
|
|
12
|
+
var _isNode = require("../utils/is-node");
|
|
21
13
|
|
|
22
14
|
var defaultConfig = {
|
|
23
15
|
shouldEnforceFallbacks: false
|
|
@@ -51,6 +43,9 @@ var filterSuggestion = function filterSuggestion(_ref) {
|
|
|
51
43
|
|
|
52
44
|
var rule = {
|
|
53
45
|
meta: {
|
|
46
|
+
// We need to upgrade the version of ESLint.
|
|
47
|
+
// @ts-expect-error
|
|
48
|
+
hasSuggestions: true,
|
|
54
49
|
docs: {
|
|
55
50
|
recommended: true
|
|
56
51
|
},
|
|
@@ -58,13 +53,7 @@ var rule = {
|
|
|
58
53
|
type: 'problem',
|
|
59
54
|
messages: {
|
|
60
55
|
legacyElevation: "Elevations can be sourced from the global theme using the token function made of both a background and shadow. Use \"card\" for card elevations, and \"overlay\" for anything else that should appear elevated.\n\n{{example}}\n",
|
|
61
|
-
|
|
62
|
-
hardCodedColor: "Colors can be sourced from the global theme using the token function.\n\n```\nimport { token } from '@atlaskit/tokens';\n\ntoken('color.background.blanket');\n```\n",
|
|
63
|
-
staticToken: "Token string should be inlined directly into the function call.\n\n```\ntoken('color.background.blanket');\n```\n",
|
|
64
|
-
invalidToken: 'The token "{{name}}" does not exist.',
|
|
65
|
-
tokenRenamed: 'The token "{{name}}" has been renamed.',
|
|
66
|
-
tokenFallbackEnforced: "Token function requires a fallback, preferably something that best matches the light/default theme in case tokens aren't present.\n\n```\ntoken('color.background.blanket', N500A);\n```\n ",
|
|
67
|
-
tokenFallbackRestricted: "Token function must not use a fallback.\n\n```\ntoken('color.background.blanket');\n```\n "
|
|
56
|
+
hardCodedColor: "Colors can be sourced from the global theme using the token function.\n\n```\nimport { token } from '@atlaskit/tokens';\n\ntoken('color.background.blanket');\n```\n"
|
|
68
57
|
}
|
|
69
58
|
},
|
|
70
59
|
create: function create(context) {
|
|
@@ -134,25 +123,12 @@ var rule = {
|
|
|
134
123
|
var value = node.quasi.quasis.map(function (q) {
|
|
135
124
|
return q.value.raw;
|
|
136
125
|
}).join('');
|
|
137
|
-
var tokenKey = (0, _isToken.isToken)(value, _tokenNames.default);
|
|
138
|
-
|
|
139
|
-
if (tokenKey) {
|
|
140
|
-
context.report({
|
|
141
|
-
messageId: 'directTokenUsage',
|
|
142
|
-
node: node,
|
|
143
|
-
data: {
|
|
144
|
-
tokenKey: tokenKey
|
|
145
|
-
}
|
|
146
|
-
});
|
|
147
|
-
return;
|
|
148
|
-
}
|
|
149
126
|
/**
|
|
150
127
|
* Attempts to remove all non-essential words & characters from a style block.
|
|
151
128
|
* Including selectors, queries and property names, leaving only values
|
|
152
129
|
* This is necessary to avoid cases where a property might have a color in its name ie. "white-space"
|
|
153
130
|
*/
|
|
154
131
|
|
|
155
|
-
|
|
156
132
|
var cssProperties = value.replace(/\n/g, '').split(/;|{|}/).filter(function (el) {
|
|
157
133
|
return !el.match(/\.|\@|\(|\)/);
|
|
158
134
|
}).map(function (el) {
|
|
@@ -181,23 +157,6 @@ var rule = {
|
|
|
181
157
|
return;
|
|
182
158
|
}
|
|
183
159
|
|
|
184
|
-
var tokenKey = (0, _isToken.isToken)(node.value, _tokenNames.default);
|
|
185
|
-
var isCSSVar = node.value.startsWith('var(');
|
|
186
|
-
|
|
187
|
-
if (tokenKey) {
|
|
188
|
-
context.report({
|
|
189
|
-
messageId: 'directTokenUsage',
|
|
190
|
-
node: node,
|
|
191
|
-
data: {
|
|
192
|
-
tokenKey: tokenKey
|
|
193
|
-
},
|
|
194
|
-
fix: function fix(fixer) {
|
|
195
|
-
return isCSSVar ? fixer.replaceText(node, "token('".concat(tokenKey, "')")) : null;
|
|
196
|
-
}
|
|
197
|
-
});
|
|
198
|
-
return;
|
|
199
|
-
}
|
|
200
|
-
|
|
201
160
|
if ((0, _isColor.isHardCodedColor)(node.value) || (0, _isColor.includesHardCodedColor)(node.value)) {
|
|
202
161
|
context.report({
|
|
203
162
|
messageId: 'hardCodedColor',
|
|
@@ -226,73 +185,6 @@ var rule = {
|
|
|
226
185
|
suggest: getTokenSuggestion(node, "".concat(node.callee.name, "()"), config)
|
|
227
186
|
});
|
|
228
187
|
},
|
|
229
|
-
'CallExpression[callee.name="token"]': function CallExpressionCalleeNameToken(node) {
|
|
230
|
-
if (node.type !== 'CallExpression') {
|
|
231
|
-
return;
|
|
232
|
-
}
|
|
233
|
-
|
|
234
|
-
if (node.arguments.length < 2 && config.shouldEnforceFallbacks === true) {
|
|
235
|
-
context.report({
|
|
236
|
-
messageId: 'tokenFallbackEnforced',
|
|
237
|
-
node: node
|
|
238
|
-
});
|
|
239
|
-
} else if (node.arguments.length > 1 && config.shouldEnforceFallbacks === false) {
|
|
240
|
-
if (node.arguments[0].type === 'Literal') {
|
|
241
|
-
var value = node.arguments[0].value;
|
|
242
|
-
context.report({
|
|
243
|
-
messageId: 'tokenFallbackRestricted',
|
|
244
|
-
node: node.arguments[1],
|
|
245
|
-
fix: function fix(fixer) {
|
|
246
|
-
return fixer.replaceText(node, "token('".concat(value, "')"));
|
|
247
|
-
}
|
|
248
|
-
});
|
|
249
|
-
} else {
|
|
250
|
-
context.report({
|
|
251
|
-
messageId: 'tokenFallbackRestricted',
|
|
252
|
-
node: node.arguments[1]
|
|
253
|
-
});
|
|
254
|
-
}
|
|
255
|
-
}
|
|
256
|
-
|
|
257
|
-
if (node.arguments[0] && node.arguments[0].type !== 'Literal') {
|
|
258
|
-
context.report({
|
|
259
|
-
messageId: 'staticToken',
|
|
260
|
-
node: node
|
|
261
|
-
});
|
|
262
|
-
return;
|
|
263
|
-
}
|
|
264
|
-
|
|
265
|
-
var tokenKey = node.arguments[0].value;
|
|
266
|
-
|
|
267
|
-
if (!tokenKey) {
|
|
268
|
-
return;
|
|
269
|
-
}
|
|
270
|
-
|
|
271
|
-
if (typeof tokenKey === 'string' && tokenKey in _renameMapping.default) {
|
|
272
|
-
context.report({
|
|
273
|
-
messageId: 'tokenRenamed',
|
|
274
|
-
node: node,
|
|
275
|
-
data: {
|
|
276
|
-
name: tokenKey
|
|
277
|
-
},
|
|
278
|
-
fix: function fix(fixer) {
|
|
279
|
-
return fixer.replaceText(node.arguments[0], "'".concat(_renameMapping.default[tokenKey], "'"));
|
|
280
|
-
}
|
|
281
|
-
});
|
|
282
|
-
return;
|
|
283
|
-
}
|
|
284
|
-
|
|
285
|
-
if (typeof tokenKey !== 'string' || typeof tokenKey === 'string' && !_tokenNames.default[tokenKey]) {
|
|
286
|
-
context.report({
|
|
287
|
-
messageId: 'invalidToken',
|
|
288
|
-
node: node,
|
|
289
|
-
data: {
|
|
290
|
-
name: tokenKey.toString()
|
|
291
|
-
}
|
|
292
|
-
});
|
|
293
|
-
return;
|
|
294
|
-
}
|
|
295
|
-
},
|
|
296
188
|
JSXAttribute: function JSXAttribute(node) {
|
|
297
189
|
if (!node.value) {
|
|
298
190
|
return;
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
4
|
+
|
|
5
|
+
Object.defineProperty(exports, "__esModule", {
|
|
6
|
+
value: true
|
|
7
|
+
});
|
|
8
|
+
exports.default = void 0;
|
|
9
|
+
|
|
10
|
+
var _renameMapping = _interopRequireDefault(require("@atlaskit/tokens/rename-mapping"));
|
|
11
|
+
|
|
12
|
+
var getCleanPathId = function getCleanPathId(path) {
|
|
13
|
+
return path.split('.').filter(function (el) {
|
|
14
|
+
return el !== '[default]';
|
|
15
|
+
}).join('.');
|
|
16
|
+
};
|
|
17
|
+
|
|
18
|
+
var rule = {
|
|
19
|
+
meta: {
|
|
20
|
+
docs: {
|
|
21
|
+
recommended: true
|
|
22
|
+
},
|
|
23
|
+
fixable: 'code',
|
|
24
|
+
type: 'problem',
|
|
25
|
+
messages: {
|
|
26
|
+
tokenRenamed: 'The token "{{name}}" is deprecated in favour of "{{replacement}}".'
|
|
27
|
+
}
|
|
28
|
+
},
|
|
29
|
+
create: function create(context) {
|
|
30
|
+
return {
|
|
31
|
+
'CallExpression[callee.name="token"]': function CallExpressionCalleeNameToken(node) {
|
|
32
|
+
if (node.type !== 'CallExpression') {
|
|
33
|
+
return;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
if (node.arguments[0].type !== 'Literal') {
|
|
37
|
+
return;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
var tokenKey = node.arguments[0].value;
|
|
41
|
+
|
|
42
|
+
if (!tokenKey) {
|
|
43
|
+
return;
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
if (typeof tokenKey !== 'string') {
|
|
47
|
+
return;
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
var migrationMeta = _renameMapping.default.filter(function (t) {
|
|
51
|
+
return t.state === 'deprecated';
|
|
52
|
+
}).find(function (t) {
|
|
53
|
+
return t.path === tokenKey;
|
|
54
|
+
});
|
|
55
|
+
|
|
56
|
+
if (migrationMeta) {
|
|
57
|
+
var cleanTokenKey = getCleanPathId(migrationMeta.replacement);
|
|
58
|
+
context.report({
|
|
59
|
+
messageId: 'tokenRenamed',
|
|
60
|
+
node: node,
|
|
61
|
+
data: {
|
|
62
|
+
name: tokenKey,
|
|
63
|
+
replacement: cleanTokenKey
|
|
64
|
+
},
|
|
65
|
+
fix: function fix(fixer) {
|
|
66
|
+
return fixer.replaceText(node.arguments[0], "'".concat(cleanTokenKey, "'"));
|
|
67
|
+
}
|
|
68
|
+
});
|
|
69
|
+
return;
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
};
|
|
73
|
+
}
|
|
74
|
+
};
|
|
75
|
+
var _default = rule;
|
|
76
|
+
exports.default = _default;
|
|
@@ -0,0 +1,176 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
4
|
+
|
|
5
|
+
Object.defineProperty(exports, "__esModule", {
|
|
6
|
+
value: true
|
|
7
|
+
});
|
|
8
|
+
exports.default = void 0;
|
|
9
|
+
|
|
10
|
+
var _renameMapping = _interopRequireDefault(require("@atlaskit/tokens/rename-mapping"));
|
|
11
|
+
|
|
12
|
+
var _tokenNames = _interopRequireDefault(require("@atlaskit/tokens/token-names"));
|
|
13
|
+
|
|
14
|
+
var _isNode = require("../utils/is-node");
|
|
15
|
+
|
|
16
|
+
var _isToken = require("../utils/is-token");
|
|
17
|
+
|
|
18
|
+
var getCleanPathId = function getCleanPathId(path) {
|
|
19
|
+
return path.split('.').filter(function (el) {
|
|
20
|
+
return el !== '[default]';
|
|
21
|
+
}).join('.');
|
|
22
|
+
};
|
|
23
|
+
|
|
24
|
+
var defaultConfig = {
|
|
25
|
+
shouldEnforceFallbacks: false
|
|
26
|
+
};
|
|
27
|
+
var rule = {
|
|
28
|
+
meta: {
|
|
29
|
+
docs: {
|
|
30
|
+
recommended: true
|
|
31
|
+
},
|
|
32
|
+
fixable: 'code',
|
|
33
|
+
type: 'problem',
|
|
34
|
+
messages: {
|
|
35
|
+
directTokenUsage: "Access the global theme using the token function.\n\n```\nimport { token } from '@atlaskit/tokens';\n\ntoken('{{tokenKey}}');\n```\n",
|
|
36
|
+
staticToken: "Token string should be inlined directly into the function call.\n\n```\ntoken('color.background.blanket');\n```\n",
|
|
37
|
+
invalidToken: 'The token "{{name}}" does not exist.',
|
|
38
|
+
tokenRemoved: 'The token "{{name}}" is removed in favour of "{{replacement}}".',
|
|
39
|
+
tokenFallbackEnforced: "Token function requires a fallback, preferably something that best matches the light/default theme in case tokens aren't present.\n\n```\ntoken('color.background.blanket', N500A);\n```\n ",
|
|
40
|
+
tokenFallbackRestricted: "Token function must not use a fallback.\n\n```\ntoken('color.background.blanket');\n```\n "
|
|
41
|
+
}
|
|
42
|
+
},
|
|
43
|
+
create: function create(context) {
|
|
44
|
+
var config = context.options[0] || defaultConfig;
|
|
45
|
+
return {
|
|
46
|
+
'TaggedTemplateExpression[tag.name="css"],TaggedTemplateExpression[tag.object.name="styled"]': function TaggedTemplateExpressionTagNameCssTaggedTemplateExpressionTagObjectNameStyled(node) {
|
|
47
|
+
if (node.type !== 'TaggedTemplateExpression') {
|
|
48
|
+
return;
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
var value = node.quasi.quasis.map(function (q) {
|
|
52
|
+
return q.value.raw;
|
|
53
|
+
}).join('');
|
|
54
|
+
var tokenKey = (0, _isToken.isToken)(value, _tokenNames.default);
|
|
55
|
+
|
|
56
|
+
if (tokenKey) {
|
|
57
|
+
context.report({
|
|
58
|
+
messageId: 'directTokenUsage',
|
|
59
|
+
node: node,
|
|
60
|
+
data: {
|
|
61
|
+
tokenKey: tokenKey
|
|
62
|
+
}
|
|
63
|
+
});
|
|
64
|
+
return;
|
|
65
|
+
}
|
|
66
|
+
},
|
|
67
|
+
'ObjectExpression > Property > Literal': function ObjectExpressionPropertyLiteral(node) {
|
|
68
|
+
if (node.type !== 'Literal') {
|
|
69
|
+
return;
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
if (typeof node.value !== 'string') {
|
|
73
|
+
return;
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
if (!(0, _isNode.isDecendantOfStyleBlock)(node) && !(0, _isNode.isDecendantOfStyleJsxAttribute)(node)) {
|
|
77
|
+
return;
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
var tokenKey = (0, _isToken.isToken)(node.value, _tokenNames.default);
|
|
81
|
+
var isCSSVar = node.value.startsWith('var(');
|
|
82
|
+
|
|
83
|
+
if (tokenKey) {
|
|
84
|
+
context.report({
|
|
85
|
+
messageId: 'directTokenUsage',
|
|
86
|
+
node: node,
|
|
87
|
+
data: {
|
|
88
|
+
tokenKey: tokenKey
|
|
89
|
+
},
|
|
90
|
+
fix: function fix(fixer) {
|
|
91
|
+
return isCSSVar ? fixer.replaceText(node, "token('".concat(tokenKey, "')")) : null;
|
|
92
|
+
}
|
|
93
|
+
});
|
|
94
|
+
return;
|
|
95
|
+
}
|
|
96
|
+
},
|
|
97
|
+
'CallExpression[callee.name="token"]': function CallExpressionCalleeNameToken(node) {
|
|
98
|
+
if (node.type !== 'CallExpression') {
|
|
99
|
+
return;
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
if (node.arguments.length < 2 && config.shouldEnforceFallbacks === true) {
|
|
103
|
+
context.report({
|
|
104
|
+
messageId: 'tokenFallbackEnforced',
|
|
105
|
+
node: node
|
|
106
|
+
});
|
|
107
|
+
} else if (node.arguments.length > 1 && config.shouldEnforceFallbacks === false) {
|
|
108
|
+
if (node.arguments[0].type === 'Literal') {
|
|
109
|
+
var value = node.arguments[0].value;
|
|
110
|
+
context.report({
|
|
111
|
+
messageId: 'tokenFallbackRestricted',
|
|
112
|
+
node: node.arguments[1],
|
|
113
|
+
fix: function fix(fixer) {
|
|
114
|
+
return fixer.replaceText(node, "token('".concat(value, "')"));
|
|
115
|
+
}
|
|
116
|
+
});
|
|
117
|
+
} else {
|
|
118
|
+
context.report({
|
|
119
|
+
messageId: 'tokenFallbackRestricted',
|
|
120
|
+
node: node.arguments[1]
|
|
121
|
+
});
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
if (node.arguments[0] && node.arguments[0].type !== 'Literal') {
|
|
126
|
+
context.report({
|
|
127
|
+
messageId: 'staticToken',
|
|
128
|
+
node: node
|
|
129
|
+
});
|
|
130
|
+
return;
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
var tokenKey = node.arguments[0].value;
|
|
134
|
+
|
|
135
|
+
if (!tokenKey) {
|
|
136
|
+
return;
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
var migrationMeta = _renameMapping.default.filter(function (t) {
|
|
140
|
+
return t.state === 'deleted';
|
|
141
|
+
}).find(function (t) {
|
|
142
|
+
return t.path === tokenKey;
|
|
143
|
+
});
|
|
144
|
+
|
|
145
|
+
if (typeof tokenKey === 'string' && migrationMeta) {
|
|
146
|
+
var cleanTokenKey = getCleanPathId(migrationMeta.replacement);
|
|
147
|
+
context.report({
|
|
148
|
+
messageId: 'tokenRemoved',
|
|
149
|
+
node: node,
|
|
150
|
+
data: {
|
|
151
|
+
name: tokenKey,
|
|
152
|
+
replacement: cleanTokenKey
|
|
153
|
+
},
|
|
154
|
+
fix: function fix(fixer) {
|
|
155
|
+
return fixer.replaceText(node.arguments[0], "'".concat(cleanTokenKey, "'"));
|
|
156
|
+
}
|
|
157
|
+
});
|
|
158
|
+
return;
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
if (typeof tokenKey !== 'string' || typeof tokenKey === 'string' && !_tokenNames.default[tokenKey]) {
|
|
162
|
+
context.report({
|
|
163
|
+
messageId: 'invalidToken',
|
|
164
|
+
node: node,
|
|
165
|
+
data: {
|
|
166
|
+
name: tokenKey.toString()
|
|
167
|
+
}
|
|
168
|
+
});
|
|
169
|
+
return;
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
};
|
|
173
|
+
}
|
|
174
|
+
};
|
|
175
|
+
var _default = rule;
|
|
176
|
+
exports.default = _default;
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
Object.defineProperty(exports, "__esModule", {
|
|
4
4
|
value: true
|
|
5
5
|
});
|
|
6
|
-
exports.
|
|
6
|
+
exports.isLegacyNamedColor = exports.isLegacyColor = exports.isHardCodedColor = exports.includesHardCodedColor = void 0;
|
|
7
7
|
var namedColors = ['black', 'silver', 'gray', 'white', 'maroon', 'red', 'purple', 'fuchsia', 'green', 'lime', 'olive', 'yellow', 'navy', 'blue', 'teal', 'aqua', 'orange', 'aliceblue', 'antiquewhite', 'aquamarine', 'azure', 'beige', 'bisque', 'blanchedalmond', 'blueviolet', 'brown', 'burlywood', 'cadetblue', 'chartreuse', 'chocolate', 'coral', 'cornflowerblue', 'cornsilk', 'crimson', 'cyan', 'darkblue', 'darkcyan', 'darkgoldenrod', 'darkgray', 'darkgreen', 'darkgrey', 'darkkhaki', 'darkmagenta', 'darkolivegreen', 'darkorange', 'darkorchid', 'darkred', 'darksalmon', 'darkseagreen', 'darkslateblue', 'darkslategray', 'darkslategrey', 'darkturquoise', 'darkviolet', 'deeppink', 'deepskyblue', 'dimgray', 'dimgrey', 'dodgerblue', 'firebrick', 'floralwhite', 'forestgreen', 'gainsboro', 'ghostwhite', 'gold', 'goldenrod', 'greenyellow', 'grey', 'honeydew', 'hotpink', 'indianred', 'indigo', 'ivory', 'khaki', 'lavender', 'lavenderblush', 'lawngreen', 'lemonchiffon', 'lightblue', 'lightcoral', 'lightcyan', 'lightgoldenrodyellow', 'lightgray', 'lightgreen', 'lightgrey', 'lightpink', 'lightsalmon', 'lightseagreen', 'lightskyblue', 'lightslategray', 'lightslategrey', 'lightsteelblue', 'lightyellow', 'limegreen', 'linen', 'magenta', 'mediumaquamarine', 'mediumblue', 'mediumorchid', 'mediumpurple', 'mediumseagreen', 'mediumslateblue', 'mediumspringgreen', 'mediumturquoise', 'mediumvioletred', 'midnightblue', 'mintcream', 'mistyrose', 'moccasin', 'navajowhite', 'oldlace', 'olivedrab', 'orangered', 'orchid', 'palegoldenrod', 'palegreen', 'paleturquoise', 'palevioletred', 'papayawhip', 'peachpuff', 'peru', 'pink', 'plum', 'powderblue', 'rosybrown', 'royalblue', 'saddlebrown', 'salmon', 'sandybrown', 'seagreen', 'seashell', 'sienna', 'skyblue', 'slateblue', 'slategray', 'slategrey', 'snow', 'springgreen', 'steelblue', 'tan', 'thistle', 'tomato', 'turquoise', 'violet', 'wheat', 'whitesmoke', 'yellowgreen', 'rebeccapurple'];
|
|
8
8
|
var legacyColors = ['R50', 'R75', 'R100', 'R200', 'R300', 'R400', 'R500', 'Y50', 'Y75', 'Y100', 'Y200', 'Y300', 'Y400', 'Y500', 'G50', 'G75', 'G100', 'G200', 'G300', 'G400', 'G500', 'B50', 'B75', 'B100', 'B200', 'B300', 'B400', 'B500', 'P50', 'P75', 'P100', 'P200', 'P300', 'P400', 'P500', 'T50', 'T75', 'T100', 'T200', 'T300', 'T400', 'T500', 'N0', 'N10', 'N20', 'N30', 'N40', 'N50', 'N60', 'N70', 'N80', 'N90', 'N100', 'N200', 'N300', 'N400', 'N500', 'N600', 'N700', 'N800', 'N900', 'N10A', 'N20A', 'N30A', 'N40A', 'N50A', 'N60A', 'N70A', 'N80A', 'N90A', 'N100A', 'N200A', 'N300A', 'N400A', 'N500A', 'N600A', 'N700A', 'N800A', 'DN900', 'DN800', 'DN700', 'DN600', 'DN500', 'DN400', 'DN300', 'DN200', 'DN100', 'DN90', 'DN80', 'DN70', 'DN60', 'DN50', 'DN40', 'DN30', 'DN20', 'DN10', 'DN0', 'DN800A', 'DN700A', 'DN600A', 'DN500A', 'DN400A', 'DN300A', 'DN200A', 'DN100A', 'DN90A', 'DN80A', 'DN70A', 'DN60A', 'DN50A', 'DN40A', 'DN30A', 'DN20A', 'DN10A'];
|
|
9
9
|
var legacyColorMixins = ['background', 'backgroundActive', 'backgroundHover', 'backgroundOnLayer', 'text', 'textHover', 'textActive', 'subtleText', 'placeholderText', 'heading', 'subtleHeading', 'codeBlock', 'link', 'linkHover', 'linkActive', 'linkOutline', 'primary', 'blue', 'teal', 'purple', 'red', 'yellow', 'green', 'skeleton'];
|
|
@@ -56,7 +56,8 @@ var isHardCodedColor = function isHardCodedColor(value) {
|
|
|
56
56
|
return true;
|
|
57
57
|
}
|
|
58
58
|
|
|
59
|
-
if (value.startsWith('#') && (
|
|
59
|
+
if (value.startsWith('#') && ( // short hex, hex, or hex with alpha
|
|
60
|
+
value.length === 4 || value.length === 7 || value.length === 9)) {
|
|
60
61
|
return true;
|
|
61
62
|
}
|
|
62
63
|
|
|
File without changes
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
Object.defineProperty(exports, "__esModule", {
|
|
4
4
|
value: true
|
|
5
5
|
});
|
|
6
|
-
exports.
|
|
6
|
+
exports.isDecendantOfType = exports.isDecendantOfStyleJsxAttribute = exports.isDecendantOfStyleBlock = exports.isDecendantOfGlobalToken = exports.isChildOfType = void 0;
|
|
7
7
|
|
|
8
8
|
var isDecendantOfGlobalToken = function isDecendantOfGlobalToken(node) {
|
|
9
9
|
if (node.type === 'CallExpression' && node.callee.type === 'Identifier' && node.callee.name === 'token') {
|
|
File without changes
|
package/dist/cjs/version.json
CHANGED
package/dist/es2019/index.js
CHANGED
|
@@ -1,7 +1,11 @@
|
|
|
1
1
|
import ensureTokenUsage from './rules/ensure-design-token-usage';
|
|
2
|
+
import noDeprecatedUsage from './rules/no-deprecated-design-token-usage';
|
|
2
3
|
import noDeprecatedImports from './rules/no-deprecated-imports';
|
|
4
|
+
import noUnsafeUsage from './rules/no-unsafe-design-token-usage';
|
|
3
5
|
export const rules = {
|
|
4
6
|
'ensure-design-token-usage': ensureTokenUsage,
|
|
7
|
+
'no-unsafe-design-token-usage': noUnsafeUsage,
|
|
8
|
+
'no-deprecated-design-token-usage': noDeprecatedUsage,
|
|
5
9
|
'no-deprecated-imports': noDeprecatedImports
|
|
6
10
|
};
|
|
7
11
|
export const configs = {
|