@atlaskit/eslint-plugin-design-system 4.6.0 → 4.7.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.
Files changed (39) hide show
  1. package/CHANGELOG.md +20 -0
  2. package/dist/cjs/index.js +21 -2
  3. package/dist/cjs/rules/ensure-design-token-usage/index.js +0 -1
  4. package/dist/cjs/rules/icon-label/index.js +7 -1
  5. package/dist/cjs/rules/no-banned-imports/index.js +56 -0
  6. package/dist/cjs/rules/no-banned-imports/paths.js +14 -0
  7. package/dist/cjs/rules/no-deprecated-apis/index.js +10 -14
  8. package/dist/cjs/rules/no-raw-spacing-values/index.js +135 -0
  9. package/dist/cjs/rules/no-raw-spacing-values/utils.js +223 -0
  10. package/dist/cjs/rules/use-visually-hidden/utils.js +8 -5
  11. package/dist/cjs/version.json +1 -1
  12. package/dist/es2019/index.js +19 -2
  13. package/dist/es2019/rules/ensure-design-token-usage/index.js +0 -1
  14. package/dist/es2019/rules/icon-label/index.js +6 -1
  15. package/dist/es2019/rules/no-banned-imports/index.js +49 -0
  16. package/dist/es2019/rules/no-banned-imports/paths.js +7 -0
  17. package/dist/es2019/rules/no-deprecated-apis/index.js +8 -2
  18. package/dist/es2019/rules/no-raw-spacing-values/index.js +118 -0
  19. package/dist/es2019/rules/no-raw-spacing-values/utils.js +193 -0
  20. package/dist/es2019/rules/use-visually-hidden/utils.js +4 -5
  21. package/dist/es2019/version.json +1 -1
  22. package/dist/esm/index.js +19 -2
  23. package/dist/esm/rules/ensure-design-token-usage/index.js +0 -1
  24. package/dist/esm/rules/icon-label/index.js +6 -1
  25. package/dist/esm/rules/no-banned-imports/index.js +46 -0
  26. package/dist/esm/rules/no-banned-imports/paths.js +7 -0
  27. package/dist/esm/rules/no-deprecated-apis/index.js +10 -14
  28. package/dist/esm/rules/no-raw-spacing-values/index.js +122 -0
  29. package/dist/esm/rules/no-raw-spacing-values/utils.js +198 -0
  30. package/dist/esm/rules/use-visually-hidden/utils.js +7 -6
  31. package/dist/esm/version.json +1 -1
  32. package/dist/types/index.d.ts +15 -0
  33. package/dist/types/rules/no-banned-imports/index.d.ts +3 -0
  34. package/dist/types/rules/no-banned-imports/paths.d.ts +4 -0
  35. package/dist/types/rules/no-raw-spacing-values/index.d.ts +3 -0
  36. package/dist/types/rules/no-raw-spacing-values/utils.d.ts +11 -0
  37. package/dist/types/rules/use-visually-hidden/utils.d.ts +2 -2
  38. package/package.json +3 -2
  39. package/report.api.md +31 -0
package/CHANGELOG.md CHANGED
@@ -1,5 +1,25 @@
1
1
  # @atlaskit/eslint-plugin-design-system
2
2
 
3
+ ## 4.7.2
4
+
5
+ ### Patch Changes
6
+
7
+ - [`9f64ab9d5ea`](https://bitbucket.org/atlassian/atlassian-frontend/commits/9f64ab9d5ea) - Improvements / added robustness to edge cases previously unhandled.
8
+ - [`8e848e3a4a6`](https://bitbucket.org/atlassian/atlassian-frontend/commits/8e848e3a4a6) - Internal updates to a number of rules. Introduced a custom formatter for the rule 'no-raw-spacing-values'.
9
+ - [`31494c13aaa`](https://bitbucket.org/atlassian/atlassian-frontend/commits/31494c13aaa) - Type fixes to the internals of a number of rules.
10
+
11
+ ## 4.7.1
12
+
13
+ ### Patch Changes
14
+
15
+ - [`37ac5652977`](https://bitbucket.org/atlassian/atlassian-frontend/commits/37ac5652977) - Mark `isOpen` and `innerRef` props on @atlaskit/banner as deprecated.
16
+
17
+ ## 4.7.0
18
+
19
+ ### Minor Changes
20
+
21
+ - [`740057653f9`](https://bitbucket.org/atlassian/atlassian-frontend/commits/740057653f9) - Adds additional rule to restrict usage of banned imports from the design system.
22
+
3
23
  ## 4.6.0
4
24
 
5
25
  ### Minor Changes
package/dist/cjs/index.js CHANGED
@@ -11,12 +11,16 @@ var _ensureDesignTokenUsage = _interopRequireDefault(require("./rules/ensure-des
11
11
 
12
12
  var _iconLabel = _interopRequireDefault(require("./rules/icon-label"));
13
13
 
14
+ var _noBannedImports = _interopRequireDefault(require("./rules/no-banned-imports"));
15
+
14
16
  var _noDeprecatedApis = _interopRequireDefault(require("./rules/no-deprecated-apis"));
15
17
 
16
18
  var _noDeprecatedDesignTokenUsage = _interopRequireDefault(require("./rules/no-deprecated-design-token-usage"));
17
19
 
18
20
  var _noDeprecatedImports = _interopRequireDefault(require("./rules/no-deprecated-imports"));
19
21
 
22
+ var _noRawSpacingValues = _interopRequireDefault(require("./rules/no-raw-spacing-values"));
23
+
20
24
  var _noUnsafeDesignTokenUsage = _interopRequireDefault(require("./rules/no-unsafe-design-token-usage"));
21
25
 
22
26
  var _useVisuallyHidden = _interopRequireDefault(require("./rules/use-visually-hidden"));
@@ -27,8 +31,10 @@ var rules = {
27
31
  'no-deprecated-apis': _noDeprecatedApis.default,
28
32
  'no-deprecated-design-token-usage': _noDeprecatedDesignTokenUsage.default,
29
33
  'no-deprecated-imports': _noDeprecatedImports.default,
34
+ 'no-banned-imports': _noBannedImports.default,
30
35
  'no-unsafe-design-token-usage': _noUnsafeDesignTokenUsage.default,
31
- 'use-visually-hidden': _useVisuallyHidden.default
36
+ 'use-visually-hidden': _useVisuallyHidden.default,
37
+ 'no-raw-spacing-values': _noRawSpacingValues.default
32
38
  };
33
39
  exports.rules = rules;
34
40
  var configs = {
@@ -38,7 +44,20 @@ var configs = {
38
44
  '@atlaskit/design-system/icon-label': 'warn',
39
45
  '@atlaskit/design-system/no-deprecated-apis': 'warn',
40
46
  '@atlaskit/design-system/no-deprecated-imports': 'error',
41
- '@atlaskit/design-system/use-visually-hidden': 'error'
47
+ '@atlaskit/design-system/use-visually-hidden': 'error',
48
+ '@atlaskit/design-system/no-banned-imports': 'error'
49
+ }
50
+ },
51
+ all: {
52
+ plugins: ['@atlaskit/design-system'],
53
+ rules: {
54
+ '@atlaskit/design-system/icon-label': 'error',
55
+ '@atlaskit/design-system/no-deprecated-apis': 'error',
56
+ '@atlaskit/design-system/no-deprecated-imports': 'error',
57
+ '@atlaskit/design-system/use-visually-hidden': 'error',
58
+ '@atlaskit/design-system/ensure-design-token-usage': 'error',
59
+ '@atlaskit/design-system/no-banned-imports': 'error',
60
+ '@atlaskit/design-system/no-raw-spacing-values': 'error'
42
61
  }
43
62
  }
44
63
  };
@@ -45,7 +45,6 @@ var filterSuggestion = function filterSuggestion(_ref) {
45
45
  var rule = {
46
46
  meta: {
47
47
  // We need to upgrade the version of ESLint.
48
- // @ts-expect-error
49
48
  hasSuggestions: true,
50
49
  docs: {
51
50
  recommended: true
@@ -5,6 +5,8 @@ Object.defineProperty(exports, "__esModule", {
5
5
  });
6
6
  exports.default = void 0;
7
7
 
8
+ var _eslintCodemodUtils = require("eslint-codemod-utils");
9
+
8
10
  var _jsx = require("../utils/jsx");
9
11
 
10
12
  var elements = ['AkButton', 'AKButton', 'Button', 'MenuItem', 'ButtonItem', 'CustomItem', 'CustomThemeButton', 'LoadingButton', 'BreadcrumbsItem'];
@@ -59,7 +61,11 @@ var rule = {
59
61
 
60
62
  return JSXElement;
61
63
  }(function (node) {
62
- if (node.openingElement.name.type !== 'JSXIdentifier') {
64
+ if (!(0, _eslintCodemodUtils.isNodeOfType)(node, 'JSXElement')) {
65
+ return;
66
+ }
67
+
68
+ if (!(0, _eslintCodemodUtils.isNodeOfType)(node.openingElement.name, 'JSXIdentifier')) {
63
69
  return;
64
70
  }
65
71
 
@@ -0,0 +1,56 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.default = void 0;
7
+
8
+ var _eslintCodemodUtils = require("eslint-codemod-utils");
9
+
10
+ var _paths = require("./paths");
11
+
12
+ var rule = {
13
+ meta: {
14
+ type: 'problem',
15
+ docs: {
16
+ description: 'Disallow specified modules when loaded by `import`',
17
+ recommended: true
18
+ },
19
+ messages: {
20
+ path: "The '{{importSource}}' import is restricted from being used. {{customMessage}}"
21
+ }
22
+ },
23
+ create: function create(context) {
24
+ function checkNode(node) {
25
+ if ((0, _eslintCodemodUtils.isNodeOfType)(node, 'ExportAllDeclaration') || (0, _eslintCodemodUtils.isNodeOfType)(node, 'ExportNamedDeclaration') || (0, _eslintCodemodUtils.isNodeOfType)(node, 'ImportDeclaration')) {
26
+ _paths.restrictedPaths.find(function (_ref) {
27
+ var _node$source, _node$source$value;
28
+
29
+ var path = _ref.path,
30
+ message = _ref.message;
31
+ var source = (_node$source = node.source) === null || _node$source === void 0 ? void 0 : (_node$source$value = _node$source.value) === null || _node$source$value === void 0 ? void 0 : _node$source$value.toString();
32
+
33
+ if (source && (source === path || source.startsWith(path))) {
34
+ context.report({
35
+ node: node,
36
+ messageId: 'path',
37
+ data: {
38
+ importSource: source,
39
+ customMessage: message
40
+ }
41
+ });
42
+ }
43
+ });
44
+ }
45
+ }
46
+
47
+ return {
48
+ ImportDeclaration: checkNode,
49
+ ExportAllDeclaration: checkNode,
50
+ ExportNamedDeclaration: checkNode,
51
+ ExportDefaultDeclaration: checkNode
52
+ };
53
+ }
54
+ };
55
+ var _default = rule;
56
+ exports.default = _default;
@@ -0,0 +1,14 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.restrictedPaths = void 0;
7
+ var restrictedPaths = [{
8
+ path: '@atlaskit/ds-lib',
9
+ message: "The '@atlaskit/ds-lib' library has been designed as a utility library for internal usage. It should not be consumed directly."
10
+ }, {
11
+ path: '@atlaskit/ds-explorations',
12
+ message: "The @atlaskit/ds-explorations package is currently in an experimental state and should not be consumed directly."
13
+ }];
14
+ exports.restrictedPaths = restrictedPaths;
@@ -11,9 +11,11 @@ var _getImportNodeBySource = require("../utils/get-import-node-by-source");
11
11
 
12
12
  var unsafeOverridesConfig = {
13
13
  cssFn: ['@atlaskit/menu', '@atlaskit/side-navigation'],
14
- overrides: ['@atlaskit/drawer', '@atlaskit/menu', '@atlaskit/side-navigation']
14
+ overrides: ['@atlaskit/drawer', '@atlaskit/menu', '@atlaskit/side-navigation'],
15
+ innerRef: ['@atlaskit/banner'],
16
+ isOpen: ['@atlaskit/banner']
15
17
  };
16
- var unsafeOverrides = ['cssFn', 'overrides'];
18
+ var unsafeOverrides = ['cssFn', 'overrides', 'innerRef', 'isOpen'];
17
19
  var rule = {
18
20
  meta: {
19
21
  type: 'suggestion',
@@ -28,19 +30,13 @@ var rule = {
28
30
  create: function create(context) {
29
31
  return {
30
32
  // find JSX atribute - find name of attribute - get source and find relevant identifiers.
31
- JSXAttribute: function (_JSXAttribute) {
32
- function JSXAttribute(_x) {
33
- return _JSXAttribute.apply(this, arguments);
34
- }
35
-
36
- JSXAttribute.toString = function () {
37
- return _JSXAttribute.toString();
38
- };
39
-
40
- return JSXAttribute;
41
- }(function (node) {
33
+ JSXAttribute: function JSXAttribute(node) {
42
34
  var _node$name;
43
35
 
36
+ if (!(0, _eslintCodemodUtils.isNodeOfType)(node, 'JSXAttribute')) {
37
+ return;
38
+ }
39
+
44
40
  if (!unsafeOverrides.includes(node === null || node === void 0 ? void 0 : (_node$name = node.name) === null || _node$name === void 0 ? void 0 : _node$name.name)) {
45
41
  return;
46
42
  }
@@ -81,7 +77,7 @@ var rule = {
81
77
  }
82
78
  });
83
79
  });
84
- })
80
+ }
85
81
  };
86
82
  }
87
83
  };
@@ -0,0 +1,135 @@
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 _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
11
+
12
+ var _eslintCodemodUtils = require("eslint-codemod-utils");
13
+
14
+ var _utils = require("./utils");
15
+
16
+ var rule = {
17
+ meta: {
18
+ type: 'problem',
19
+ docs: {
20
+ description: 'No raw spacing values',
21
+ recommended: true
22
+ },
23
+ messages: {
24
+ noRawSpacingValues: 'Prefer the use of spacing primitives over the direct application of spacing properties.\n\n@meta <<{{payload}}>>'
25
+ }
26
+ },
27
+ create: function create(context) {
28
+ return {
29
+ // CSSObjectExpression
30
+ // const styles = css({ color: 'red', margin: '4px' })
31
+ 'CallExpression[callee.name=css] > ObjectExpression': function CallExpressionCalleeNameCssObjectExpression(parentNode) {
32
+ if (!(0, _eslintCodemodUtils.isNodeOfType)(parentNode, 'ObjectExpression')) {
33
+ return;
34
+ }
35
+ /**
36
+ * We do this in case we the fontSize for a style object is declared alongside the `em` or `lineHeight` declaration
37
+ */
38
+
39
+
40
+ var fontSizeNode = parentNode.properties.find(function (node) {
41
+ if (!(0, _eslintCodemodUtils.isNodeOfType)(node, 'Property')) {
42
+ return;
43
+ }
44
+
45
+ if (!(0, _eslintCodemodUtils.isNodeOfType)(node.key, 'Identifier')) {
46
+ return;
47
+ }
48
+
49
+ return node.key.name === 'fontSize';
50
+ });
51
+ var fontSizeValue = (0, _utils.getValue)( // @ts-ignore
52
+ (fontSizeNode === null || fontSizeNode === void 0 ? void 0 : fontSizeNode.type) === 'Property' && fontSizeNode.value, context);
53
+ var fontSize = Array.isArray(fontSizeValue) ? fontSizeValue[0] : fontSizeValue;
54
+ parentNode.properties.forEach(function (node) {
55
+ if (!(0, _eslintCodemodUtils.isNodeOfType)(node, 'Property')) {
56
+ return;
57
+ }
58
+
59
+ if (!(0, _eslintCodemodUtils.isNodeOfType)(node.key, 'Identifier')) {
60
+ return;
61
+ }
62
+
63
+ if (!(0, _utils.isSpacingProperty)(node.key.name)) {
64
+ return;
65
+ }
66
+
67
+ var value = (0, _utils.getValue)(node.value, context);
68
+
69
+ if (value) {
70
+ var values = typeof value === 'number' || typeof value === 'string' ? [value] : value;
71
+ values.forEach(function (value) {
72
+ context.report({
73
+ node: node,
74
+ messageId: 'noRawSpacingValues',
75
+ data: {
76
+ payload: "".concat(node.key.name, ":").concat((0, _utils.emToPixels)(value, fontSize))
77
+ }
78
+ });
79
+ });
80
+ return;
81
+ } else {
82
+ context.report({
83
+ node: node,
84
+ messageId: 'noRawSpacingValues',
85
+ data: {
86
+ payload: "".concat(node.key.name, ":NaN")
87
+ }
88
+ });
89
+ }
90
+ });
91
+ },
92
+ // CSSTemplateLiteral and StyledTemplateLiteral
93
+ // const cssTemplateLiteral = css`color: red; padding: 12px`;
94
+ // const styledTemplateLiteral = styled.p`color: red; padding: 8px`;
95
+ 'TaggedTemplateExpression[tag.name="css"],TaggedTemplateExpression[tag.object.name="styled"]': function TaggedTemplateExpressionTagNameCssTaggedTemplateExpressionTagObjectNameStyled(node) {
96
+ if (node.type !== 'TaggedTemplateExpression') {
97
+ return;
98
+ }
99
+
100
+ var combinedString = node.quasi.quasis.map(function (q, i) {
101
+ return "".concat(q.value.raw).concat(node.quasi.expressions[i] ? (0, _utils.getValue)(node.quasi.expressions[i], context) : '');
102
+ }).join('');
103
+ /**
104
+ * Attempts to remove all non-essential words & characters from a style block.
105
+ * Including selectors and queries
106
+ * Adapted from ensure-design-token-usage
107
+ */
108
+
109
+ var cssProperties = combinedString.replace(/\n/g, '').split(/;|{|}/).map(function (el) {
110
+ return el.trim() || '';
111
+ });
112
+ cssProperties.map(function (style) {
113
+ var _style$split = style.split(':'),
114
+ _style$split2 = (0, _slicedToArray2.default)(_style$split, 2),
115
+ property = _style$split2[0],
116
+ value = _style$split2[1];
117
+
118
+ if ((0, _utils.isSpacingProperty)(property)) {
119
+ context.report({
120
+ node: node,
121
+ messageId: 'noRawSpacingValues',
122
+ data: {
123
+ payload: "".concat(property, ":").concat((0, _utils.removePixelSuffix)(value.trim()))
124
+ }
125
+ });
126
+ }
127
+
128
+ return;
129
+ });
130
+ }
131
+ };
132
+ }
133
+ };
134
+ var _default = rule;
135
+ exports.default = _default;
@@ -0,0 +1,223 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.emToPixels = void 0;
7
+ exports.findIdentifierInParentScope = findIdentifierInParentScope;
8
+ exports.removePixelSuffix = exports.isSpacingProperty = exports.getValueFromShorthand = exports.getValue = void 0;
9
+
10
+ var _eslintCodemodUtils = require("eslint-codemod-utils");
11
+
12
+ var properties = ['padding', 'paddingLeft', 'paddingTop', 'paddingRight', 'paddingBottom', 'marginLeft', 'marginTop', 'marginRight', 'marginBottom', 'margin', 'gap', 'fontSize', 'lineHeight', 'width', 'height'];
13
+
14
+ function findIdentifierInParentScope(_ref) {
15
+ var scope = _ref.scope,
16
+ identifierName = _ref.identifierName;
17
+ var traversingScope = scope;
18
+
19
+ while (traversingScope && traversingScope.type !== 'global') {
20
+ var matchedVariable = traversingScope.variables.find(function (variable) {
21
+ return variable.name === identifierName;
22
+ });
23
+
24
+ if (matchedVariable) {
25
+ return matchedVariable;
26
+ }
27
+
28
+ traversingScope = traversingScope.upper;
29
+ }
30
+
31
+ return null;
32
+ }
33
+
34
+ var isSpacingProperty = function isSpacingProperty(prop) {
35
+ return properties.includes(prop);
36
+ };
37
+
38
+ exports.isSpacingProperty = isSpacingProperty;
39
+
40
+ var getValueFromShorthand = function getValueFromShorthand(str) {
41
+ // If we want to filter out NaN just add .filter(Boolean)
42
+ return String(str).trim().split(' ').map(removePixelSuffix);
43
+ };
44
+
45
+ exports.getValueFromShorthand = getValueFromShorthand;
46
+
47
+ var isGridSize = function isGridSize(node) {
48
+ return (0, _eslintCodemodUtils.isNodeOfType)(node, 'CallExpression') && (0, _eslintCodemodUtils.isNodeOfType)(node.callee, 'Identifier') && (node.callee.name === 'gridSize' || node.callee.name === 'getGridSize');
49
+ };
50
+
51
+ var isFontSize = function isFontSize(node) {
52
+ return (0, _eslintCodemodUtils.isNodeOfType)(node, 'CallExpression') && (0, _eslintCodemodUtils.isNodeOfType)(node.callee, 'Identifier') && (node.callee.name === 'fontSize' || node.callee.name === 'getFontSize');
53
+ };
54
+
55
+ var isFontSizeSmall = function isFontSizeSmall(node) {
56
+ return (0, _eslintCodemodUtils.isNodeOfType)(node, 'CallExpression') && (0, _eslintCodemodUtils.isNodeOfType)(node.callee, 'Identifier') && node.callee.name === 'fontSizeSmall';
57
+ };
58
+
59
+ var getValueFromCallExpression = function getValueFromCallExpression(node, context) {
60
+ if (!(0, _eslintCodemodUtils.isNodeOfType)(node, 'CallExpression')) {
61
+ return null;
62
+ }
63
+
64
+ if (isGridSize(node)) {
65
+ return 8;
66
+ }
67
+
68
+ if (isFontSize(node)) {
69
+ return 14;
70
+ }
71
+
72
+ if (isFontSizeSmall(node)) {
73
+ return 11;
74
+ }
75
+
76
+ return null;
77
+ };
78
+
79
+ var getValue = function getValue(node, context) {
80
+ if ((0, _eslintCodemodUtils.isNodeOfType)(node, 'Literal')) {
81
+ return getValueFromShorthand(node.value);
82
+ }
83
+
84
+ if ((0, _eslintCodemodUtils.isNodeOfType)(node, 'BinaryExpression')) {
85
+ return getValueFromBinaryExpression(node, context);
86
+ }
87
+
88
+ if ((0, _eslintCodemodUtils.isNodeOfType)(node, 'UnaryExpression')) {
89
+ return getValueFromUnaryExpression(node, context);
90
+ }
91
+
92
+ if ((0, _eslintCodemodUtils.isNodeOfType)(node, 'CallExpression')) {
93
+ return getValueFromCallExpression(node, context);
94
+ }
95
+
96
+ if ((0, _eslintCodemodUtils.isNodeOfType)(node, 'Identifier')) {
97
+ return getValueFromIdentifier(node, context);
98
+ }
99
+
100
+ if ((0, _eslintCodemodUtils.isNodeOfType)(node, 'TemplateLiteral')) {
101
+ return getValueFromTemplateLiteral(node, context);
102
+ }
103
+
104
+ return null;
105
+ };
106
+
107
+ exports.getValue = getValue;
108
+
109
+ var getValueFromIdentifier = function getValueFromIdentifier(node, context) {
110
+ if (!(0, _eslintCodemodUtils.isNodeOfType)(node, 'Identifier')) {
111
+ return null;
112
+ }
113
+
114
+ var scope = context.getScope();
115
+ var variable = findIdentifierInParentScope({
116
+ scope: scope,
117
+ identifierName: node.name
118
+ });
119
+
120
+ if (!variable) {
121
+ return null;
122
+ }
123
+
124
+ var definition = variable.defs[0];
125
+
126
+ if (!(0, _eslintCodemodUtils.isNodeOfType)(definition.node, 'VariableDeclarator')) {
127
+ return null;
128
+ }
129
+
130
+ if (!definition.node.init) {
131
+ return null;
132
+ }
133
+
134
+ return getValue(definition.node.init, context);
135
+ };
136
+
137
+ var getValueFromUnaryExpression = function getValueFromUnaryExpression(node, context) {
138
+ if (!(0, _eslintCodemodUtils.isNodeOfType)(node, 'UnaryExpression')) {
139
+ return null;
140
+ }
141
+
142
+ var value = getValue(node.argument, context);
143
+
144
+ if (!value) {
145
+ return null;
146
+ } // eslint-disable-next-line no-eval
147
+
148
+
149
+ return eval("".concat(node.operator).concat(value));
150
+ };
151
+ /**
152
+ * @example
153
+ * ```js
154
+ * `2 ${variable} 0`
155
+ *
156
+ * // results in [2, NaN, 0]
157
+ * ```
158
+ * ```js
159
+ * const variable = 4;
160
+ * `2 ${variable} 0`
161
+ *
162
+ * // results in [2, 4, 0]
163
+ * ```
164
+ */
165
+
166
+
167
+ var getValueFromTemplateLiteral = function getValueFromTemplateLiteral(node, context) {
168
+ if (!(0, _eslintCodemodUtils.isNodeOfType)(node, "TemplateLiteral")) {
169
+ return null;
170
+ }
171
+
172
+ var combinedString = node.quasis.map(function (q, i) {
173
+ return "".concat(q.value.raw).concat(node.expressions[i] ? getValue(node.expressions[i], context) : '');
174
+ }).join('').trim().split(' ');
175
+ return combinedString.map(removePixelSuffix);
176
+ };
177
+
178
+ var getValueFromBinaryExpression = function getValueFromBinaryExpression(node, context) {
179
+ if (!(0, _eslintCodemodUtils.isNodeOfType)(node, 'BinaryExpression')) {
180
+ return null;
181
+ }
182
+
183
+ var left = node.left,
184
+ right = node.right,
185
+ operator = node.operator;
186
+ var leftValue = getValue(left, context);
187
+ var rightValue = getValue(right, context);
188
+ var final = rightValue && leftValue ? // eslint-disable-next-line no-eval
189
+ eval("".concat(leftValue).concat(operator).concat(rightValue)) : null;
190
+ return final;
191
+ };
192
+
193
+ var emRegex = /(.*\d+)em$/;
194
+
195
+ var emToPixels = function emToPixels(value, fontSize) {
196
+ if (typeof value === 'string') {
197
+ var match = value.match(emRegex);
198
+
199
+ if (match && typeof fontSize === 'number') {
200
+ return Number(match[1]) * fontSize;
201
+ }
202
+
203
+ return 'NaN';
204
+ }
205
+
206
+ return value;
207
+ };
208
+
209
+ exports.emToPixels = emToPixels;
210
+ var percentageOrEm = /(%$)|(\d+em$)/;
211
+
212
+ var removePixelSuffix = function removePixelSuffix(value) {
213
+ var isString = typeof value === 'string'; // @ts-ignore This shouldn't be a type error but CI is complaining
214
+
215
+ if (isString && percentageOrEm.test(value)) {
216
+ return value;
217
+ } // @ts-ignore This shouldn't be a type error but CI is complaining
218
+
219
+
220
+ return Number(isString ? value.replace('px', '') : value);
221
+ };
222
+
223
+ exports.removePixelSuffix = removePixelSuffix;
@@ -4,7 +4,9 @@ Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
6
  exports.makeTemplateLiteralIntoEntries = exports.getObjectLikeness = exports.getFirstImport = exports.countMatchingKeyValues = void 0;
7
- // eslint-disable-next-line import/no-unresolved
7
+
8
+ var _eslintCodemodUtils = require("eslint-codemod-utils");
9
+
8
10
  // eslint-disable-next-line @atlaskit/design-system/use-visually-hidden
9
11
  var referenceObject = {
10
12
  width: '1px',
@@ -53,12 +55,13 @@ var makeTemplateLiteralIntoEntries = function makeTemplateLiteralIntoEntries(tem
53
55
  exports.makeTemplateLiteralIntoEntries = makeTemplateLiteralIntoEntries;
54
56
 
55
57
  var getObjectLikeness = function getObjectLikeness(node) {
56
- var styleEntries = node.properties.map(function (_ref) {
57
- var type = _ref.type,
58
- key = _ref.key,
58
+ var styleEntries = node.properties.filter(function (node) {
59
+ return (0, _eslintCodemodUtils.isNodeOfType)(node, 'Property');
60
+ }).map(function (_ref) {
61
+ var key = _ref.key,
59
62
  value = _ref.value;
60
63
 
61
- if (type === 'Property' && key.type === 'Identifier') {
64
+ if (key.type === 'Identifier') {
62
65
  return {
63
66
  key: key.name,
64
67
  value: value.type === 'Literal' && value.value
@@ -1,5 +1,5 @@
1
1
  {
2
2
  "name": "@atlaskit/eslint-plugin-design-system",
3
- "version": "4.6.0",
3
+ "version": "4.7.2",
4
4
  "sideEffects": false
5
5
  }
@@ -1,8 +1,10 @@
1
1
  import ensureTokenUsage from './rules/ensure-design-token-usage';
2
2
  import iconLabel from './rules/icon-label';
3
+ import noBannedImports from './rules/no-banned-imports';
3
4
  import noDeprecatedAPIs from './rules/no-deprecated-apis';
4
5
  import noDeprecatedUsage from './rules/no-deprecated-design-token-usage';
5
6
  import noDeprecatedImports from './rules/no-deprecated-imports';
7
+ import noRawSpacingValues from './rules/no-raw-spacing-values';
6
8
  import noUnsafeUsage from './rules/no-unsafe-design-token-usage';
7
9
  import useVisuallyHidden from './rules/use-visually-hidden';
8
10
  export const rules = {
@@ -11,8 +13,10 @@ export const rules = {
11
13
  'no-deprecated-apis': noDeprecatedAPIs,
12
14
  'no-deprecated-design-token-usage': noDeprecatedUsage,
13
15
  'no-deprecated-imports': noDeprecatedImports,
16
+ 'no-banned-imports': noBannedImports,
14
17
  'no-unsafe-design-token-usage': noUnsafeUsage,
15
- 'use-visually-hidden': useVisuallyHidden
18
+ 'use-visually-hidden': useVisuallyHidden,
19
+ 'no-raw-spacing-values': noRawSpacingValues
16
20
  };
17
21
  export const configs = {
18
22
  recommended: {
@@ -21,7 +25,20 @@ export const configs = {
21
25
  '@atlaskit/design-system/icon-label': 'warn',
22
26
  '@atlaskit/design-system/no-deprecated-apis': 'warn',
23
27
  '@atlaskit/design-system/no-deprecated-imports': 'error',
24
- '@atlaskit/design-system/use-visually-hidden': 'error'
28
+ '@atlaskit/design-system/use-visually-hidden': 'error',
29
+ '@atlaskit/design-system/no-banned-imports': 'error'
30
+ }
31
+ },
32
+ all: {
33
+ plugins: ['@atlaskit/design-system'],
34
+ rules: {
35
+ '@atlaskit/design-system/icon-label': 'error',
36
+ '@atlaskit/design-system/no-deprecated-apis': 'error',
37
+ '@atlaskit/design-system/no-deprecated-imports': 'error',
38
+ '@atlaskit/design-system/use-visually-hidden': 'error',
39
+ '@atlaskit/design-system/ensure-design-token-usage': 'error',
40
+ '@atlaskit/design-system/no-banned-imports': 'error',
41
+ '@atlaskit/design-system/no-raw-spacing-values': 'error'
25
42
  }
26
43
  }
27
44
  };
@@ -25,7 +25,6 @@ const filterSuggestion = ({
25
25
  const rule = {
26
26
  meta: {
27
27
  // We need to upgrade the version of ESLint.
28
- // @ts-expect-error
29
28
  hasSuggestions: true,
30
29
  docs: {
31
30
  recommended: true