@atlaskit/eslint-plugin-design-system 4.0.0 → 4.2.0

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 (65) hide show
  1. package/CHANGELOG.md +31 -0
  2. package/dist/cjs/index.js +14 -3
  3. package/dist/cjs/rules/ensure-design-token-usage/index.js +3 -0
  4. package/dist/cjs/rules/no-deprecated-apis/index.js +91 -0
  5. package/dist/cjs/rules/no-deprecated-design-token-usage/index.js +76 -0
  6. package/dist/cjs/rules/no-deprecated-imports/index.js +45 -33
  7. package/dist/cjs/rules/no-deprecated-imports/paths.js +43 -15
  8. package/dist/cjs/rules/no-unsafe-design-token-usage/index.js +19 -5
  9. package/dist/cjs/rules/use-visually-hidden/constants.js +12 -0
  10. package/dist/cjs/rules/use-visually-hidden/fix-jsx.js +39 -0
  11. package/dist/cjs/rules/use-visually-hidden/fix-vanilla.js +35 -0
  12. package/dist/cjs/rules/use-visually-hidden/index.js +194 -0
  13. package/dist/cjs/rules/use-visually-hidden/utils.js +91 -0
  14. package/dist/cjs/rules/utils/get-import-node-by-source.js +23 -0
  15. package/dist/cjs/rules/utils/is-color.js +3 -2
  16. package/dist/cjs/rules/utils/is-node.js +33 -3
  17. package/dist/cjs/rules/utils/remove-named-import.js +29 -0
  18. package/dist/cjs/version.json +1 -1
  19. package/dist/es2019/index.js +10 -2
  20. package/dist/es2019/rules/ensure-design-token-usage/index.js +3 -0
  21. package/dist/es2019/rules/no-deprecated-apis/index.js +72 -0
  22. package/dist/es2019/rules/no-deprecated-design-token-usage/index.js +58 -0
  23. package/dist/es2019/rules/no-deprecated-imports/index.js +45 -32
  24. package/dist/es2019/rules/no-deprecated-imports/paths.js +41 -14
  25. package/dist/es2019/rules/no-unsafe-design-token-usage/index.js +12 -5
  26. package/dist/es2019/rules/use-visually-hidden/constants.js +3 -0
  27. package/dist/es2019/rules/use-visually-hidden/fix-jsx.js +24 -0
  28. package/dist/es2019/rules/use-visually-hidden/fix-vanilla.js +21 -0
  29. package/dist/es2019/rules/use-visually-hidden/index.js +169 -0
  30. package/dist/es2019/rules/use-visually-hidden/utils.js +62 -0
  31. package/dist/es2019/rules/utils/get-import-node-by-source.js +10 -0
  32. package/dist/es2019/rules/utils/is-color.js +2 -1
  33. package/dist/es2019/rules/utils/is-node.js +19 -2
  34. package/dist/es2019/rules/utils/remove-named-import.js +16 -0
  35. package/dist/es2019/version.json +1 -1
  36. package/dist/esm/index.js +10 -2
  37. package/dist/esm/rules/ensure-design-token-usage/index.js +3 -0
  38. package/dist/esm/rules/no-deprecated-apis/index.js +81 -0
  39. package/dist/esm/rules/no-deprecated-design-token-usage/index.js +66 -0
  40. package/dist/esm/rules/no-deprecated-imports/index.js +45 -32
  41. package/dist/esm/rules/no-deprecated-imports/paths.js +41 -14
  42. package/dist/esm/rules/no-unsafe-design-token-usage/index.js +20 -5
  43. package/dist/esm/rules/use-visually-hidden/constants.js +3 -0
  44. package/dist/esm/rules/use-visually-hidden/fix-jsx.js +26 -0
  45. package/dist/esm/rules/use-visually-hidden/fix-vanilla.js +23 -0
  46. package/dist/esm/rules/use-visually-hidden/index.js +180 -0
  47. package/dist/esm/rules/use-visually-hidden/utils.js +74 -0
  48. package/dist/esm/rules/utils/get-import-node-by-source.js +14 -0
  49. package/dist/esm/rules/utils/is-color.js +2 -1
  50. package/dist/esm/rules/utils/is-node.js +22 -1
  51. package/dist/esm/rules/utils/remove-named-import.js +20 -0
  52. package/dist/esm/version.json +1 -1
  53. package/dist/types/index.d.ts +5 -0
  54. package/dist/types/rules/no-deprecated-apis/index.d.ts +3 -0
  55. package/dist/types/rules/no-deprecated-design-token-usage/index.d.ts +3 -0
  56. package/dist/types/rules/no-deprecated-imports/paths.d.ts +33 -14
  57. package/dist/types/rules/use-visually-hidden/constants.d.ts +3 -0
  58. package/dist/types/rules/use-visually-hidden/fix-jsx.d.ts +3 -0
  59. package/dist/types/rules/use-visually-hidden/fix-vanilla.d.ts +3 -0
  60. package/dist/types/rules/use-visually-hidden/index.d.ts +3 -0
  61. package/dist/types/rules/use-visually-hidden/utils.d.ts +35 -0
  62. package/dist/types/rules/utils/get-import-node-by-source.d.ts +8 -0
  63. package/dist/types/rules/utils/is-node.d.ts +7 -0
  64. package/dist/types/rules/utils/remove-named-import.d.ts +8 -0
  65. package/package.json +6 -2
package/CHANGELOG.md CHANGED
@@ -1,5 +1,36 @@
1
1
  # @atlaskit/eslint-plugin-design-system
2
2
 
3
+ ## 4.2.0
4
+
5
+ ### Minor Changes
6
+
7
+ - [`afc248d2ded`](https://bitbucket.org/atlassian/atlassian-frontend/commits/afc248d2ded) - Adds a new rule, `use-visually-hidden` to complement the `@atlaskit/visually-hidden` component.
8
+ - [`0c0a8b5dff4`](https://bitbucket.org/atlassian/atlassian-frontend/commits/0c0a8b5dff4) - Adds an additional rule 'no-deprecated-api-usage'. This rule targets APIs/props in the Design System that we intend to remove completely. This rule should be used by all product repos as it will provide an early warning of expected deprecations.
9
+ - [`93d6f8856f2`](https://bitbucket.org/atlassian/atlassian-frontend/commits/93d6f8856f2) - @atlaskit/icon-priority has been deprecated due to low usage. It will be deleted after 21 April 2022. If you rely on these icons, @atlaskit/icon-priority will still be available as a deprecated package on NPM, but we recommend self-hosting and managing.
10
+
11
+ ## 4.1.1
12
+
13
+ ### Patch Changes
14
+
15
+ - [`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.
16
+ - Updated dependencies
17
+
18
+ ## 4.1.0
19
+
20
+ ### Minor Changes
21
+
22
+ - [`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.
23
+
24
+ ### Patch Changes
25
+
26
+ - Updated dependencies
27
+
28
+ ## 4.0.1
29
+
30
+ ### Patch Changes
31
+
32
+ - [`7da1a30902a`](https://bitbucket.org/atlassian/atlassian-frontend/commits/7da1a30902a) - Adds missing meta to `ensure-design-token-usage` rule.
33
+
3
34
  ## 4.0.0
4
35
 
5
36
  ### Major Changes
package/dist/cjs/index.js CHANGED
@@ -5,25 +5,36 @@ 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 _noDeprecatedApis = _interopRequireDefault(require("./rules/no-deprecated-apis"));
13
+
14
+ var _noDeprecatedDesignTokenUsage = _interopRequireDefault(require("./rules/no-deprecated-design-token-usage"));
15
+
12
16
  var _noDeprecatedImports = _interopRequireDefault(require("./rules/no-deprecated-imports"));
13
17
 
14
18
  var _noUnsafeDesignTokenUsage = _interopRequireDefault(require("./rules/no-unsafe-design-token-usage"));
15
19
 
20
+ var _useVisuallyHidden = _interopRequireDefault(require("./rules/use-visually-hidden"));
21
+
16
22
  var rules = {
17
23
  'ensure-design-token-usage': _ensureDesignTokenUsage.default,
18
24
  'no-unsafe-design-token-usage': _noUnsafeDesignTokenUsage.default,
19
- 'no-deprecated-imports': _noDeprecatedImports.default
25
+ 'no-deprecated-design-token-usage': _noDeprecatedDesignTokenUsage.default,
26
+ 'no-deprecated-imports': _noDeprecatedImports.default,
27
+ 'no-deprecated-apis': _noDeprecatedApis.default,
28
+ 'use-visually-hidden': _useVisuallyHidden.default
20
29
  };
21
30
  exports.rules = rules;
22
31
  var configs = {
23
32
  recommended: {
24
33
  plugins: ['@atlaskit/design-system'],
25
34
  rules: {
26
- '@atlaskit/design-system/no-deprecated-imports': 'error'
35
+ '@atlaskit/design-system/no-deprecated-imports': 'error',
36
+ '@atlaskit/design-system/use-visually-hidden': 'error',
37
+ '@atlaskit/design-system/no-deprecated-apis': 'warn'
27
38
  }
28
39
  }
29
40
  };
@@ -43,6 +43,9 @@ var filterSuggestion = function filterSuggestion(_ref) {
43
43
 
44
44
  var rule = {
45
45
  meta: {
46
+ // We need to upgrade the version of ESLint.
47
+ // @ts-expect-error
48
+ hasSuggestions: true,
46
49
  docs: {
47
50
  recommended: true
48
51
  },
@@ -0,0 +1,91 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.default = void 0;
7
+
8
+ var _getImportNodeBySource = require("../utils/get-import-node-by-source");
9
+
10
+ var _isNode = require("../utils/is-node");
11
+
12
+ // eslint-disable-next-line import/no-unresolved
13
+ var unsafeOverridesConfig = {
14
+ cssFn: ['@atlaskit/menu', '@atlaskit/side-navigation'],
15
+ overrides: ['@atlaskit/drawer', '@atlaskit/menu', '@atlaskit/side-navigation']
16
+ };
17
+ var unsafeOverrides = ['cssFn', 'overrides'];
18
+ var rule = {
19
+ meta: {
20
+ type: 'suggestion',
21
+ docs: {
22
+ description: 'Disallow specified APIs that have been marked as deprecated and/or discouraged.',
23
+ recommended: true
24
+ },
25
+ messages: {
26
+ noDeprecatedApis: "The prop \"{{propName}}\" has been deprecated. It will be removed in the next major release."
27
+ }
28
+ },
29
+ create: function create(context) {
30
+ return {
31
+ // find JSX atribute - find name of attribute - get source and find relevant identifiers.
32
+ JSXAttribute: function (_JSXAttribute) {
33
+ function JSXAttribute(_x) {
34
+ return _JSXAttribute.apply(this, arguments);
35
+ }
36
+
37
+ JSXAttribute.toString = function () {
38
+ return _JSXAttribute.toString();
39
+ };
40
+
41
+ return JSXAttribute;
42
+ }(function (node) {
43
+ var _node$name, _closesetJSXElement$n;
44
+
45
+ if (!unsafeOverrides.includes(node === null || node === void 0 ? void 0 : (_node$name = node.name) === null || _node$name === void 0 ? void 0 : _node$name.name)) {
46
+ return;
47
+ }
48
+
49
+ var source = context.getSourceCode();
50
+ var bannedApi = node.name.name; // traverse the tree to the nearest JSX Element and get its name
51
+
52
+ var closesetJSXElement = (0, _isNode.getClosestNodeOfType)(node, 'JSXOpeningElement'); // @ts-ignore
53
+
54
+ var jsxElementName = closesetJSXElement === null || closesetJSXElement === void 0 ? void 0 : (_closesetJSXElement$n = closesetJSXElement.name) === null || _closesetJSXElement$n === void 0 ? void 0 : _closesetJSXElement$n.name;
55
+
56
+ if (!jsxElementName) {
57
+ return;
58
+ } // find an import for the path of the banned api
59
+
60
+
61
+ unsafeOverridesConfig[bannedApi].forEach(function (path) {
62
+ var importNode = (0, _getImportNodeBySource.getImportedNodeBySource)(source, path);
63
+
64
+ if (!importNode) {
65
+ return;
66
+ } // find an import that matches our JSX element
67
+
68
+
69
+ var hasTargetNode = importNode.specifiers.some(function (node) {
70
+ return node.local.name === jsxElementName;
71
+ });
72
+
73
+ if (!hasTargetNode) {
74
+ return;
75
+ } // if we're here the import exists and there is a valid lint error.
76
+
77
+
78
+ context.report({
79
+ node: node,
80
+ messageId: 'noDeprecatedApis',
81
+ data: {
82
+ propName: bannedApi
83
+ }
84
+ });
85
+ });
86
+ })
87
+ };
88
+ }
89
+ };
90
+ var _default = rule;
91
+ exports.default = _default;
@@ -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;
@@ -31,18 +31,24 @@ var rule = {
31
31
  }
32
32
  },
33
33
  create: function create(context) {
34
- var sourceCode = context.getSourceCode();
35
-
36
34
  var restrictedPathMessages = _paths.restrictedPaths.reduce(function (memo, importSource) {
37
35
  if (typeof importSource === 'string') {
38
36
  memo[importSource] = {
39
37
  message: ''
40
38
  };
41
39
  } else {
42
- memo[importSource.name] = {
43
- message: importSource.message // importNames: importSource.importNames
40
+ if ('message' in importSource) {
41
+ memo[importSource.path] = {
42
+ message: importSource.message
43
+ };
44
+ }
44
45
 
45
- };
46
+ if ('imports' in importSource) {
47
+ memo[importSource.path] = {
48
+ // @ts-ignore
49
+ imports: importSource.imports
50
+ };
51
+ }
46
52
  }
47
53
 
48
54
  return memo;
@@ -50,27 +56,46 @@ var rule = {
50
56
  /**
51
57
  * Report a restricted path.
52
58
  * @param {string} importSource path of the import
53
- * @param {Map<string,Object[]>} importNames Map of import names that are being imported
54
59
  * @param {node} node representing the restricted path reference
60
+ * @param {Map<string,Rule.Node>} importNames Map of import names that are being imported
55
61
  * @returns {void}
56
62
  * @private
57
63
  */
58
64
 
59
65
 
60
- function checkRestrictedPathAndReport(importSource, importNames, node) {
66
+ function checkRestrictedPathAndReport(importSource, node, importNames) {
61
67
  if (!Object.prototype.hasOwnProperty.call(restrictedPathMessages, importSource)) {
62
68
  return;
63
69
  }
64
70
 
65
- var customMessage = restrictedPathMessages[importSource].message;
66
- context.report({
67
- node: node,
68
- messageId: customMessage ? 'pathWithCustomMessage' : 'path',
69
- data: {
70
- importSource: importSource,
71
- customMessage: customMessage
72
- }
73
- });
71
+ var config = restrictedPathMessages[importSource]; // The message will only exist if the import is completely banned,
72
+ // eg a deprecated package
73
+
74
+ if ('message' in config) {
75
+ context.report({
76
+ node: node,
77
+ messageId: config.message ? 'pathWithCustomMessage' : 'path',
78
+ data: {
79
+ importSource: importSource,
80
+ customMessage: config.message
81
+ }
82
+ });
83
+ } // if there are specific named exports that are banned,
84
+ // iterate through and check if they're being imported
85
+
86
+
87
+ if ('imports' in config) {
88
+ var _config$imports;
89
+
90
+ (_config$imports = config.imports) === null || _config$imports === void 0 ? void 0 : _config$imports.forEach(function (restrictedImport) {
91
+ if (importNames.has(restrictedImport.importName)) {
92
+ context.report({
93
+ node: importNames.get(restrictedImport.importName),
94
+ message: restrictedImport.message
95
+ });
96
+ }
97
+ });
98
+ }
74
99
  }
75
100
  /**
76
101
  * Checks a node to see if any problems should be reported.
@@ -84,12 +109,7 @@ var rule = {
84
109
  var importSource = node.source.value.trim();
85
110
  var importNames = new Map();
86
111
 
87
- if (node.type === 'ExportAllDeclaration') {
88
- var starToken = sourceCode.getFirstToken(node, 1);
89
- importNames.set('*', [{
90
- loc: starToken === null || starToken === void 0 ? void 0 : starToken.loc
91
- }]);
92
- } else if ('specifiers' in node) {
112
+ if ('specifiers' in node) {
93
113
  // @ts-ignore
94
114
  var _iterator = _createForOfIteratorHelper(node.specifiers),
95
115
  _step;
@@ -98,9 +118,6 @@ var rule = {
98
118
  for (_iterator.s(); !(_step = _iterator.n()).done;) {
99
119
  var specifier = _step.value;
100
120
  var name = void 0;
101
- var specifierData = {
102
- loc: specifier.loc
103
- };
104
121
 
105
122
  if (specifier.type === 'ImportDefaultSpecifier') {
106
123
  name = 'default';
@@ -113,11 +130,7 @@ var rule = {
113
130
  }
114
131
 
115
132
  if (name) {
116
- if (importNames.has(name)) {
117
- importNames.get(name).push(specifierData);
118
- } else {
119
- importNames.set(name, [specifierData]);
120
- }
133
+ importNames.set(name, specifier);
121
134
  }
122
135
  }
123
136
  } catch (err) {
@@ -127,7 +140,7 @@ var rule = {
127
140
  }
128
141
  }
129
142
 
130
- checkRestrictedPathAndReport(importSource, importNames, node);
143
+ checkRestrictedPathAndReport(importSource, node, importNames);
131
144
  };
132
145
 
133
146
  return {
@@ -136,8 +149,7 @@ var rule = {
136
149
  if (node.source) {
137
150
  checkNode(node);
138
151
  }
139
- },
140
- ExportAllDeclaration: checkNode
152
+ }
141
153
  };
142
154
  }
143
155
  };
@@ -3,48 +3,76 @@
3
3
  Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
- exports.restrictedPaths = void 0;
6
+ exports.restrictedPaths = exports.namedThemeExports = void 0;
7
+ var namedThemeExports = [{
8
+ importName: 'assistive',
9
+ message: 'The assistive mixin is deprecated. Please use `@atlaskit/visually-hidden` instead.'
10
+ }, {
11
+ importName: 'visuallyHidden',
12
+ message: 'The visuallyHidden mixin is deprecated. Please use `@atlaskit/visually-hidden` instead.'
13
+ }, {
14
+ importName: 'focusRing',
15
+ message: 'The focusRing mixin is deprecated. Please use `@atlaskit/visually-hidden` instead.'
16
+ }];
17
+ exports.namedThemeExports = namedThemeExports;
7
18
  var restrictedPaths = [{
8
- name: '@atlaskit/navigation-next',
19
+ path: '@atlaskit/navigation-next',
9
20
  message: "navigation-next is deprecated. Please use '@atlaskit/atlassian-navigation' instead."
10
21
  }, {
11
- name: '@atlaskit/field-base',
22
+ path: '@atlaskit/field-base',
12
23
  message: "field-base is deprecated. Please use the '@atlaskit/form' package instead."
13
24
  }, {
14
- name: '@atlaskit/field-radio-group',
25
+ path: '@atlaskit/field-radio-group',
15
26
  message: "field-radio-group is deprecated. Please use '@atlaskit/radio' instead, and check the migration guide."
16
27
  }, {
17
- name: '@atlaskit/field-range',
28
+ path: '@atlaskit/field-range',
18
29
  message: "field-range is deprecated. Please use '@atlaskit/range' instead."
19
30
  }, {
20
- name: '@atlaskit/field-text',
31
+ path: '@atlaskit/field-text',
21
32
  message: "field-text is deprecated. Please use '@atlaskit/textfield' instead."
22
33
  }, {
23
- name: '@atlaskit/field-text-area',
34
+ path: '@atlaskit/field-text-area',
24
35
  message: "field-text-area is deprecated. Please use '@atlaskit/textarea' instead."
25
36
  }, {
26
- name: '@atlaskit/navigation',
37
+ path: '@atlaskit/navigation',
27
38
  message: "navigation is deprecated. Please use '@atlaskit/atlassian-navigation' instead."
28
39
  }, {
29
- name: '@atlaskit/global-navigation',
40
+ path: '@atlaskit/global-navigation',
30
41
  message: "global-navigation is deprecated. Please use '@atlaskit/atlassian-navigation' for the horizontal nav bar, '@atlaskit/side-navigation' for the side nav, and '@atlaskit/page-layout' to layout your application."
31
42
  }, {
32
- name: '@atlaskit/input',
43
+ path: '@atlaskit/input',
33
44
  message: 'input is deprecated. This was an internal component and should not be used directly.'
34
45
  }, {
35
- name: '@atlaskit/layer',
46
+ path: '@atlaskit/layer',
36
47
  message: 'layer is deprecated. This was an internal component and should not be used directly.'
37
48
  }, {
38
- name: '@atlaskit/single-select',
49
+ path: '@atlaskit/single-select',
39
50
  message: "single-select is deprecated. Please use '@atlaskit/select' instead."
40
51
  }, {
41
- name: '@atlaskit/multi-select',
52
+ path: '@atlaskit/multi-select',
42
53
  message: "multi-select is deprecated. Please use '@atlaskit/select' instead."
43
54
  }, {
44
- name: '@atlaskit/droplist',
55
+ path: '@atlaskit/droplist',
45
56
  message: "droplist is deprecated. For the pop-up behaviour please use '@atlaskit/popup' and for common menu components please use '@atlaskit/menu'."
46
57
  }, {
47
- name: '@atlaskit/item',
58
+ path: '@atlaskit/item',
48
59
  message: "item is deprecated. Please use '@atlaskit/menu' instead."
60
+ }, // TODO uncomment me when we formally deprecate typography
61
+ // {
62
+ // path: '@atlaskit/theme/typography',
63
+ // message: 'The typography mixins are deprecated. Please use `@atlaskit/heading` instead.',
64
+ // },
65
+ {
66
+ path: '@atlaskit/theme/constants',
67
+ imports: namedThemeExports
68
+ }, {
69
+ path: '@atlaskit/theme',
70
+ imports: namedThemeExports // .concat(
71
+ // { importName: 'typography', message: 'The typography mixins are deprecated. Please use `@atlaskit/heading` instead.',}
72
+ // )
73
+
74
+ }, {
75
+ path: '@atlaskit/icon-priority',
76
+ message: "icon-priority is deprecated due to limited usage in Cloud products. It will be deleted after 21 April 2022."
49
77
  }];
50
78
  exports.restrictedPaths = restrictedPaths;
@@ -15,6 +15,12 @@ var _isNode = require("../utils/is-node");
15
15
 
16
16
  var _isToken = require("../utils/is-token");
17
17
 
18
+ var getCleanPathId = function getCleanPathId(path) {
19
+ return path.split('.').filter(function (el) {
20
+ return el !== '[default]';
21
+ }).join('.');
22
+ };
23
+
18
24
  var defaultConfig = {
19
25
  shouldEnforceFallbacks: false
20
26
  };
@@ -29,7 +35,7 @@ var rule = {
29
35
  directTokenUsage: "Access the global theme using the token function.\n\n```\nimport { token } from '@atlaskit/tokens';\n\ntoken('{{tokenKey}}');\n```\n",
30
36
  staticToken: "Token string should be inlined directly into the function call.\n\n```\ntoken('color.background.blanket');\n```\n",
31
37
  invalidToken: 'The token "{{name}}" does not exist.',
32
- tokenRenamed: 'The token "{{name}}" has been renamed.',
38
+ tokenRemoved: 'The token "{{name}}" is removed in favour of "{{replacement}}".',
33
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 ",
34
40
  tokenFallbackRestricted: "Token function must not use a fallback.\n\n```\ntoken('color.background.blanket');\n```\n "
35
41
  }
@@ -130,15 +136,23 @@ var rule = {
130
136
  return;
131
137
  }
132
138
 
133
- if (typeof tokenKey === 'string' && tokenKey in _renameMapping.default) {
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);
134
147
  context.report({
135
- messageId: 'tokenRenamed',
148
+ messageId: 'tokenRemoved',
136
149
  node: node,
137
150
  data: {
138
- name: tokenKey
151
+ name: tokenKey,
152
+ replacement: cleanTokenKey
139
153
  },
140
154
  fix: function fix(fixer) {
141
- return fixer.replaceText(node.arguments[0], "'".concat(_renameMapping.default[tokenKey], "'"));
155
+ return fixer.replaceText(node.arguments[0], "'".concat(cleanTokenKey, "'"));
142
156
  }
143
157
  });
144
158
  return;
@@ -0,0 +1,12 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.VISUALLY_HIDDEN_SOURCE = exports.VISUALLY_HIDDEN_IMPORT = exports.IMPORT_NAME = void 0;
7
+ var IMPORT_NAME = 'AKVisuallyHidden';
8
+ exports.IMPORT_NAME = IMPORT_NAME;
9
+ var VISUALLY_HIDDEN_SOURCE = '@atlaskit/visually-hidden';
10
+ exports.VISUALLY_HIDDEN_SOURCE = VISUALLY_HIDDEN_SOURCE;
11
+ var VISUALLY_HIDDEN_IMPORT = "import ".concat(IMPORT_NAME, " from '").concat(VISUALLY_HIDDEN_SOURCE, "';\n");
12
+ exports.VISUALLY_HIDDEN_IMPORT = VISUALLY_HIDDEN_IMPORT;
@@ -0,0 +1,39 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.default = void 0;
7
+
8
+ var _getImportNodeBySource = require("../utils/get-import-node-by-source");
9
+
10
+ var _isNode = require("../utils/is-node");
11
+
12
+ var _constants = require("./constants");
13
+
14
+ var _utils = require("./utils");
15
+
16
+ var _default = function _default(source, node) {
17
+ return function (fixer) {
18
+ var fixes = [];
19
+ var importedNode = (0, _utils.getFirstImport)(source);
20
+ var visuallyHiddenNode = (0, _getImportNodeBySource.getImportedNodeBySource)(source, _constants.VISUALLY_HIDDEN_SOURCE);
21
+
22
+ if (!importedNode) {
23
+ return [];
24
+ }
25
+
26
+ var jsxOpeningElement = (0, _isNode.getClosestNodeOfType)(node, 'JSXOpeningElement');
27
+
28
+ if (visuallyHiddenNode) {
29
+ fixes.push(fixer.replaceText(jsxOpeningElement, visuallyHiddenNode.specifiers[0].local.name));
30
+ } else {
31
+ fixes.push(fixer.insertTextBefore(importedNode, _constants.VISUALLY_HIDDEN_IMPORT));
32
+ fixes.push(fixer.replaceText(jsxOpeningElement, "<".concat(_constants.IMPORT_NAME, " />")));
33
+ }
34
+
35
+ return fixes;
36
+ };
37
+ };
38
+
39
+ exports.default = _default;
@@ -0,0 +1,35 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.default = void 0;
7
+
8
+ var _getImportNodeBySource = require("../utils/get-import-node-by-source");
9
+
10
+ var _constants = require("./constants");
11
+
12
+ var _utils = require("./utils");
13
+
14
+ var _default = function _default(source, node) {
15
+ return function (fixer) {
16
+ var fixes = [];
17
+ var importedNode = (0, _utils.getFirstImport)(source);
18
+ var visuallyHiddenNode = (0, _getImportNodeBySource.getImportedNodeBySource)(source, _constants.VISUALLY_HIDDEN_SOURCE);
19
+
20
+ if (!importedNode) {
21
+ return [];
22
+ }
23
+
24
+ if (visuallyHiddenNode) {
25
+ fixes.push(fixer.replaceText(node, visuallyHiddenNode.specifiers[0].local.name));
26
+ } else {
27
+ fixes.push(fixer.insertTextBefore(importedNode, _constants.VISUALLY_HIDDEN_IMPORT));
28
+ fixes.push(fixer.replaceText(node, _constants.IMPORT_NAME));
29
+ }
30
+
31
+ return fixes;
32
+ };
33
+ };
34
+
35
+ exports.default = _default;