@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.
Files changed (36) hide show
  1. package/CHANGELOG.md +56 -0
  2. package/dist/cjs/index.js +7 -1
  3. package/dist/cjs/rules/ensure-design-token-usage/index.js +7 -115
  4. package/dist/cjs/rules/no-deprecated-design-token-usage/index.js +76 -0
  5. package/dist/cjs/rules/no-unsafe-design-token-usage/index.js +176 -0
  6. package/dist/cjs/rules/{ensure-design-token-usage/utils → utils}/is-color.js +3 -2
  7. package/dist/cjs/rules/{ensure-design-token-usage/utils → utils}/is-elevation.js +0 -0
  8. package/dist/cjs/rules/{ensure-design-token-usage/utils → utils}/is-node.js +1 -1
  9. package/dist/cjs/rules/{ensure-design-token-usage/utils → utils}/is-token.js +0 -0
  10. package/dist/cjs/version.json +1 -1
  11. package/dist/es2019/index.js +4 -0
  12. package/dist/es2019/rules/ensure-design-token-usage/index.js +7 -129
  13. package/dist/es2019/rules/no-deprecated-design-token-usage/index.js +58 -0
  14. package/dist/es2019/rules/no-unsafe-design-token-usage/index.js +173 -0
  15. package/dist/es2019/rules/{ensure-design-token-usage/utils → utils}/is-color.js +2 -1
  16. package/dist/es2019/rules/{ensure-design-token-usage/utils → utils}/is-elevation.js +0 -0
  17. package/dist/es2019/rules/{ensure-design-token-usage/utils → utils}/is-node.js +0 -0
  18. package/dist/es2019/rules/{ensure-design-token-usage/utils → utils}/is-token.js +0 -0
  19. package/dist/es2019/version.json +1 -1
  20. package/dist/esm/index.js +4 -0
  21. package/dist/esm/rules/ensure-design-token-usage/index.js +7 -110
  22. package/dist/esm/rules/no-deprecated-design-token-usage/index.js +66 -0
  23. package/dist/esm/rules/no-unsafe-design-token-usage/index.js +163 -0
  24. package/dist/esm/rules/{ensure-design-token-usage/utils → utils}/is-color.js +2 -1
  25. package/dist/esm/rules/{ensure-design-token-usage/utils → utils}/is-elevation.js +0 -0
  26. package/dist/esm/rules/{ensure-design-token-usage/utils → utils}/is-node.js +0 -0
  27. package/dist/esm/rules/{ensure-design-token-usage/utils → utils}/is-token.js +0 -0
  28. package/dist/esm/version.json +1 -1
  29. package/dist/types/index.d.ts +2 -0
  30. package/dist/types/rules/no-deprecated-design-token-usage/index.d.ts +3 -0
  31. package/dist/types/rules/no-unsafe-design-token-usage/index.d.ts +3 -0
  32. package/dist/types/rules/{ensure-design-token-usage/utils → utils}/is-color.d.ts +0 -0
  33. package/dist/types/rules/{ensure-design-token-usage/utils → utils}/is-elevation.d.ts +0 -0
  34. package/dist/types/rules/{ensure-design-token-usage/utils → utils}/is-node.d.ts +0 -0
  35. package/dist/types/rules/{ensure-design-token-usage/utils → utils}/is-token.d.ts +0 -0
  36. 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.configs = exports.rules = void 0;
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 _renameMapping = _interopRequireDefault(require("@atlaskit/tokens/rename-mapping"));
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 _isNode = require("./utils/is-node");
10
+ var _isElevation = require("../utils/is-elevation");
19
11
 
20
- var _isToken = require("./utils/is-token");
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
- directTokenUsage: "Access the global theme using the token function.\n\n```\nimport { token } from '@atlaskit/tokens';\n\ntoken('{{tokenKey}}');\n```\n",
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.isHardCodedColor = exports.includesHardCodedColor = exports.isLegacyNamedColor = exports.isLegacyColor = void 0;
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('#') && (value.length === 4 || value.length === 7 || value.length === 9)) {
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
 
@@ -3,7 +3,7 @@
3
3
  Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
- exports.isChildOfType = exports.isDecendantOfStyleBlock = exports.isDecendantOfStyleJsxAttribute = exports.isDecendantOfType = exports.isDecendantOfGlobalToken = void 0;
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') {
@@ -1,5 +1,5 @@
1
1
  {
2
2
  "name": "@atlaskit/eslint-plugin-design-system",
3
- "version": "3.2.0",
3
+ "version": "4.1.1",
4
4
  "sideEffects": false
5
5
  }
@@ -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 = {