@atlaskit/eslint-plugin-design-system 8.37.2 → 8.38.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 (74) hide show
  1. package/CHANGELOG.md +12 -0
  2. package/README.md +1 -0
  3. package/constellation/index/usage.mdx +1 -0
  4. package/constellation/use-tokens-space/usage.mdx +30 -0
  5. package/dist/cjs/ast-nodes/object-entry.js +35 -0
  6. package/dist/cjs/ast-nodes/object.js +12 -0
  7. package/dist/cjs/presets/all.codegen.js +2 -1
  8. package/dist/cjs/rules/index.codegen.js +3 -1
  9. package/dist/cjs/rules/use-primitives/utils/validate-styles.js +11 -2
  10. package/dist/cjs/rules/use-tokens-space/index.js +54 -0
  11. package/dist/cjs/rules/use-tokens-space/transformers/index.js +12 -0
  12. package/dist/cjs/rules/use-tokens-space/transformers/style-property/index.js +130 -0
  13. package/dist/cjs/rules/use-tokens-space/transformers/style-property/style-map.js +80 -0
  14. package/dist/cjs/rules/use-tokens-space/transformers/style-property/supported.js +14 -0
  15. package/dist/cjs/rules/use-tokens-space/transformers/style-property/upsert-import-declaration.js +37 -0
  16. package/dist/cjs/rules/use-tokens-space/utils/index.js +12 -0
  17. package/dist/cjs/rules/use-tokens-space/utils/is-string-or-number.js +9 -0
  18. package/dist/es2019/ast-nodes/object-entry.js +37 -3
  19. package/dist/es2019/ast-nodes/object.js +12 -0
  20. package/dist/es2019/presets/all.codegen.js +2 -1
  21. package/dist/es2019/rules/index.codegen.js +3 -1
  22. package/dist/es2019/rules/use-primitives/utils/validate-styles.js +11 -2
  23. package/dist/es2019/rules/use-tokens-space/index.js +38 -0
  24. package/dist/es2019/rules/use-tokens-space/transformers/index.js +1 -0
  25. package/dist/es2019/rules/use-tokens-space/transformers/style-property/index.js +121 -0
  26. package/dist/es2019/rules/use-tokens-space/transformers/style-property/style-map.js +152 -0
  27. package/dist/es2019/rules/use-tokens-space/transformers/style-property/supported.js +8 -0
  28. package/dist/es2019/rules/use-tokens-space/transformers/style-property/upsert-import-declaration.js +30 -0
  29. package/dist/es2019/rules/use-tokens-space/utils/index.js +1 -0
  30. package/dist/es2019/rules/use-tokens-space/utils/is-string-or-number.js +3 -0
  31. package/dist/esm/ast-nodes/object-entry.js +37 -3
  32. package/dist/esm/ast-nodes/object.js +12 -0
  33. package/dist/esm/presets/all.codegen.js +2 -1
  34. package/dist/esm/rules/index.codegen.js +3 -1
  35. package/dist/esm/rules/use-primitives/utils/validate-styles.js +11 -2
  36. package/dist/esm/rules/use-tokens-space/index.js +48 -0
  37. package/dist/esm/rules/use-tokens-space/transformers/index.js +1 -0
  38. package/dist/esm/rules/use-tokens-space/transformers/style-property/index.js +120 -0
  39. package/dist/esm/rules/use-tokens-space/transformers/style-property/style-map.js +73 -0
  40. package/dist/esm/rules/use-tokens-space/transformers/style-property/supported.js +8 -0
  41. package/dist/esm/rules/use-tokens-space/transformers/style-property/upsert-import-declaration.js +29 -0
  42. package/dist/esm/rules/use-tokens-space/utils/index.js +1 -0
  43. package/dist/esm/rules/use-tokens-space/utils/is-string-or-number.js +3 -0
  44. package/dist/types/ast-nodes/object-entry.d.ts +12 -2
  45. package/dist/types/ast-nodes/object.d.ts +1 -0
  46. package/dist/types/index.codegen.d.ts +1 -0
  47. package/dist/types/presets/all.codegen.d.ts +2 -1
  48. package/dist/types/rules/index.codegen.d.ts +5 -4
  49. package/dist/types/rules/use-tokens-space/index.d.ts +3 -0
  50. package/dist/types/rules/use-tokens-space/transformers/index.d.ts +1 -0
  51. package/dist/types/rules/use-tokens-space/transformers/style-property/index.d.ts +26 -0
  52. package/dist/types/rules/use-tokens-space/transformers/style-property/style-map.d.ts +7 -0
  53. package/dist/types/rules/use-tokens-space/transformers/style-property/supported.d.ts +6 -0
  54. package/dist/types/rules/use-tokens-space/transformers/style-property/upsert-import-declaration.d.ts +14 -0
  55. package/dist/types/rules/use-tokens-space/utils/index.d.ts +1 -0
  56. package/dist/types/rules/use-tokens-space/utils/is-string-or-number.d.ts +1 -0
  57. package/dist/types/rules/use-visually-hidden/constants.d.ts +1 -1
  58. package/dist/types/rules/utils/create-rule.d.ts +1 -1
  59. package/dist/types-ts4.5/ast-nodes/object-entry.d.ts +12 -2
  60. package/dist/types-ts4.5/ast-nodes/object.d.ts +1 -0
  61. package/dist/types-ts4.5/index.codegen.d.ts +1 -0
  62. package/dist/types-ts4.5/presets/all.codegen.d.ts +2 -1
  63. package/dist/types-ts4.5/rules/index.codegen.d.ts +5 -4
  64. package/dist/types-ts4.5/rules/use-tokens-space/index.d.ts +3 -0
  65. package/dist/types-ts4.5/rules/use-tokens-space/transformers/index.d.ts +1 -0
  66. package/dist/types-ts4.5/rules/use-tokens-space/transformers/style-property/index.d.ts +26 -0
  67. package/dist/types-ts4.5/rules/use-tokens-space/transformers/style-property/style-map.d.ts +7 -0
  68. package/dist/types-ts4.5/rules/use-tokens-space/transformers/style-property/supported.d.ts +6 -0
  69. package/dist/types-ts4.5/rules/use-tokens-space/transformers/style-property/upsert-import-declaration.d.ts +14 -0
  70. package/dist/types-ts4.5/rules/use-tokens-space/utils/index.d.ts +1 -0
  71. package/dist/types-ts4.5/rules/use-tokens-space/utils/is-string-or-number.d.ts +1 -0
  72. package/dist/types-ts4.5/rules/use-visually-hidden/constants.d.ts +1 -1
  73. package/dist/types-ts4.5/rules/utils/create-rule.d.ts +1 -1
  74. package/package.json +3 -3
package/CHANGELOG.md CHANGED
@@ -1,5 +1,17 @@
1
1
  # @atlaskit/eslint-plugin-design-system
2
2
 
3
+ ## 8.38.0
4
+
5
+ ### Minor Changes
6
+
7
+ - [#74844](https://stash.atlassian.com/projects/CONFCLOUD/repos/confluence-frontend/pull-requests/74844) [`7c7b8a771792`](https://stash.atlassian.com/projects/CONFCLOUD/repos/confluence-frontend/commits/7c7b8a771792) - Created `use-tokens-space` lint rule to replace `ensure-design-token-usage` rule for space values.
8
+
9
+ ## 8.37.3
10
+
11
+ ### Patch Changes
12
+
13
+ - [#83116](https://stash.atlassian.com/projects/CONFCLOUD/repos/confluence-frontend/pull-requests/83116) [`8d4e99057fe0`](https://stash.atlassian.com/projects/CONFCLOUD/repos/confluence-frontend/commits/8d4e99057fe0) - Upgrade Typescript from `4.9.5` to `5.4.2`
14
+
3
15
  ## 8.37.2
4
16
 
5
17
  ### Patch Changes
package/README.md CHANGED
@@ -78,6 +78,7 @@ module.exports = {
78
78
  | <a href="./src/rules/use-href-in-link-item/README.md">use-href-in-link-item</a> | Inform developers of eventual requirement of `href` prop in `LinkItem` component. Elements with a `link` role require an `href` attribute for users to properly navigate, particularly those using assistive technologies. If no valid `href` is required for your use case, consider using a `ButtonItem` instead. | Yes | Yes | Yes |
79
79
  | <a href="./src/rules/use-primitives/README.md">use-primitives</a> | Encourage the usage of primitives components. | | Yes | Yes |
80
80
  | <a href="./src/rules/use-primitives-text/README.md">use-primitives-text</a> | Encourage the usage of text components. | | Yes | Yes |
81
+ | <a href="./src/rules/use-tokens-space/README.md">use-tokens-space</a> | Enforces usage of space design tokens rather than hard-coded values. | | Yes | Yes |
81
82
  | <a href="./src/rules/use-tokens-typography/README.md">use-tokens-typography</a> | Enforces usage of design tokens for typography properties rather than hard-coded values. | | Yes | Yes |
82
83
  | <a href="./src/rules/use-visually-hidden/README.md">use-visually-hidden</a> | Enforce usage of the visually hidden component. | Yes | Yes | |
83
84
 
@@ -40,6 +40,7 @@ This plugin contains rules that should be used when working with the [Atlassian
40
40
  | <a href="use-href-in-link-item/usage">use-href-in-link-item</a> | Inform developers of eventual requirement of `href` prop in `LinkItem` component. Elements with a `link` role require an `href` attribute for users to properly navigate, particularly those using assistive technologies. If no valid `href` is required for your use case, consider using a `ButtonItem` instead. | Yes | Yes | Yes |
41
41
  | <a href="use-primitives/usage">use-primitives</a> | Encourage the usage of primitives components. | | Yes | Yes |
42
42
  | <a href="use-primitives-text/usage">use-primitives-text</a> | Encourage the usage of text components. | | Yes | Yes |
43
+ | <a href="use-tokens-space/usage">use-tokens-space</a> | Enforces usage of space design tokens rather than hard-coded values. | | Yes | Yes |
43
44
  | <a href="use-tokens-typography/usage">use-tokens-typography</a> | Enforces usage of design tokens for typography properties rather than hard-coded values. | | Yes | Yes |
44
45
  | <a href="use-visually-hidden/usage">use-visually-hidden</a> | Enforce usage of the visually hidden component. | Yes | Yes | |
45
46
 
@@ -0,0 +1,30 @@
1
+ # use-tokens-space
2
+
3
+ ## Examples
4
+
5
+ This rule marks code as violations when a space token should be used. It will auto-fix values that can be mapped 1:1 with an ADS space token. Values that can't be mapped to a token will still be reported, however no auto-fix will happen.
6
+
7
+ ### Incorrect
8
+
9
+ ```jsx
10
+ const someStyles = css({
11
+ padding: '8px';
12
+ ^^^^^
13
+ })
14
+ ```
15
+
16
+ ### Correct
17
+
18
+ ```jsx
19
+ import { token } from '@atlaskit/tokens'
20
+
21
+ const someStyles = css({
22
+ padding: token('space.100');
23
+ })
24
+ ```
25
+
26
+ See the list of available space tokens on the [ADS website](https://atlassian.design/foundations/spacing#space-tokens).
27
+
28
+ For Atlassians:
29
+
30
+ - See the [Token Migration Guide](https://go.atlassian.com/space-token-migration) for instructions on how to migrate to tokens when a suggestion is not provided by the ESLint rule.
@@ -5,7 +5,42 @@ Object.defineProperty(exports, "__esModule", {
5
5
  });
6
6
  exports.ObjectEntry = void 0;
7
7
  var _eslintCodemodUtils = require("eslint-codemod-utils");
8
+ /* eslint-disable @repo/internal/react/require-jsdoc */
9
+
8
10
  var ObjectEntry = exports.ObjectEntry = {
11
+ getProperty: function getProperty(node) {
12
+ if ((0, _eslintCodemodUtils.isNodeOfType)(node.key, 'Identifier')) {
13
+ return {
14
+ type: 'Identifier',
15
+ value: node.key.name
16
+ };
17
+ }
18
+ if ((0, _eslintCodemodUtils.isNodeOfType)(node.key, 'Literal') && node.key.value) {
19
+ return {
20
+ type: 'Literal',
21
+ value: node.key.value.toString()
22
+ };
23
+ }
24
+ return {
25
+ type: undefined,
26
+ value: undefined
27
+ };
28
+ },
29
+ getValue: function getValue(node) {
30
+ // The value is a number, like `-3`
31
+ if ((0, _eslintCodemodUtils.isNodeOfType)(node.value, 'UnaryExpression') && (0, _eslintCodemodUtils.isNodeOfType)(node.value.argument, 'Literal') && node.value.argument.raw) {
32
+ if (node.value.operator === '-') {
33
+ return -1 * Number.parseInt(node.value.argument.raw);
34
+ }
35
+ return Number.parseInt(node.value.argument.raw);
36
+ }
37
+
38
+ // The value is a string, like `'4px'`
39
+ if ((0, _eslintCodemodUtils.isNodeOfType)(node.value, 'Literal') && node.value.value) {
40
+ return node.value.value;
41
+ }
42
+ return undefined;
43
+ },
9
44
  deleteEntry: function deleteEntry(node, context, fixer) {
10
45
  var _lastToken;
11
46
  // context.getSourceCode() is deprecated in favour of context.sourceCode, however this returns undefined for some reason
@@ -105,5 +105,17 @@ var ASTObjectExpression = exports.Object = {
105
105
  key: (0, _eslintCodemodUtils.identifier)(key),
106
106
  value: (0, _eslintCodemodUtils.literal)(value)
107
107
  }).toString(), ", "));
108
+ },
109
+ recurse: function recurse(node, callback) {
110
+ node.properties.forEach(function (entry) {
111
+ // Call the callback first, in case the user wants to do something with SpreadElements
112
+ callback(entry);
113
+ if (!(0, _eslintCodemodUtils.isNodeOfType)(entry, 'Property')) {
114
+ return;
115
+ }
116
+ if ((0, _eslintCodemodUtils.isNodeOfType)(entry.value, 'ObjectExpression')) {
117
+ ASTObjectExpression.recurse(entry.value, callback);
118
+ }
119
+ });
108
120
  }
109
121
  };
@@ -6,7 +6,7 @@ Object.defineProperty(exports, "__esModule", {
6
6
  exports.default = void 0;
7
7
  /**
8
8
  * THIS FILE WAS CREATED VIA CODEGEN DO NOT MODIFY {@see http://go/af-codegen}
9
- * @codegen <<SignedSource::d90c2cf5e100daf98915f9467f2e5663>>
9
+ * @codegen <<SignedSource::d95217b658f807294de3c81123068bf1>>
10
10
  * @codegenCommand yarn workspace @atlaskit/eslint-plugin-design-system codegen
11
11
  */
12
12
  var _default = exports.default = {
@@ -41,6 +41,7 @@ var _default = exports.default = {
41
41
  '@atlaskit/design-system/use-href-in-link-item': 'warn',
42
42
  '@atlaskit/design-system/use-primitives': 'warn',
43
43
  '@atlaskit/design-system/use-primitives-text': 'warn',
44
+ '@atlaskit/design-system/use-tokens-space': 'error',
44
45
  '@atlaskit/design-system/use-tokens-typography': 'warn',
45
46
  '@atlaskit/design-system/use-visually-hidden': 'error'
46
47
  }
@@ -34,11 +34,12 @@ var _useHeadingLevelInSpotlightCard = _interopRequireDefault(require("./use-head
34
34
  var _useHrefInLinkItem = _interopRequireDefault(require("./use-href-in-link-item"));
35
35
  var _usePrimitives = _interopRequireDefault(require("./use-primitives"));
36
36
  var _usePrimitivesText = _interopRequireDefault(require("./use-primitives-text"));
37
+ var _useTokensSpace = _interopRequireDefault(require("./use-tokens-space"));
37
38
  var _useTokensTypography = _interopRequireDefault(require("./use-tokens-typography"));
38
39
  var _useVisuallyHidden = _interopRequireDefault(require("./use-visually-hidden"));
39
40
  /**
40
41
  * THIS FILE WAS CREATED VIA CODEGEN DO NOT MODIFY {@see http://go/af-codegen}
41
- * @codegen <<SignedSource::c283cd7ede5e813a9119cd707d339273>>
42
+ * @codegen <<SignedSource::d1c25758089a050334359276ede0ca3a>>
42
43
  * @codegenCommand yarn workspace @atlaskit/eslint-plugin-design-system codegen
43
44
  */
44
45
  var _default = exports.default = {
@@ -71,6 +72,7 @@ var _default = exports.default = {
71
72
  'use-href-in-link-item': _useHrefInLinkItem.default,
72
73
  'use-primitives': _usePrimitives.default,
73
74
  'use-primitives-text': _usePrimitivesText.default,
75
+ 'use-tokens-space': _useTokensSpace.default,
74
76
  'use-tokens-typography': _useTokensTypography.default,
75
77
  'use-visually-hidden': _useVisuallyHidden.default
76
78
  };
@@ -93,7 +93,6 @@ var isTokenCall = function isTokenCall(node) {
93
93
  return false;
94
94
  }
95
95
  var token = ast.FunctionCall.getArgumentAtPos(node, 0);
96
- var fallback = ast.FunctionCall.getArgumentAtPos(node, 1);
97
96
  if (!token || token.type !== 'Literal') {
98
97
  return false;
99
98
  }
@@ -104,7 +103,17 @@ var isTokenCall = function isTokenCall(node) {
104
103
  }
105
104
 
106
105
  // Not all `token()` calls have a fall back. This is fine, but if there is a fallback, make sure it's the same as the fallback xcss will use
107
- if (fallback && fallback.type === 'Literal') {
106
+ if (node.arguments.length === 2) {
107
+ var fallback = ast.FunctionCall.getArgumentAtPos(node, 1);
108
+
109
+ // `getArgumentAtPos` is only able to understand `Literal` and `ObjectExpression` statements
110
+ // If there are 2 args, but `fallback` is undefined, then the fallback is something wild, like `token('space.100, `${gridSize * rem(3)`})`
111
+ if (!fallback) {
112
+ return false;
113
+ }
114
+ if (fallback.type !== 'Literal') {
115
+ return false;
116
+ }
108
117
  if (_transformers.spaceTokenMap[fallback.value] !== token.value) {
109
118
  return false;
110
119
  }
@@ -0,0 +1,54 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.default = void 0;
7
+ var _createRule = require("../utils/create-rule");
8
+ var _transformers = require("./transformers");
9
+ var rule = (0, _createRule.createLintRule)({
10
+ meta: {
11
+ name: 'use-tokens-space',
12
+ type: 'problem',
13
+ fixable: 'code',
14
+ hasSuggestions: true,
15
+ docs: {
16
+ description: 'Enforces usage of space design tokens rather than hard-coded values.',
17
+ recommended: false,
18
+ severity: 'error'
19
+ },
20
+ messages: {
21
+ noRawSpacingValues: 'The use of spacing primitives or tokens is preferred over the direct application of spacing properties.'
22
+ }
23
+ },
24
+ create: function create(context) {
25
+ return {
26
+ 'CallExpression[callee.name="css"] ObjectExpression Property': function CallExpressionCalleeNameCssObjectExpressionProperty(node) {
27
+ return _transformers.StyleProperty.lint(node, {
28
+ context: context
29
+ });
30
+ },
31
+ 'CallExpression[callee.name="keyframes"] ObjectExpression Property': function CallExpressionCalleeNameKeyframesObjectExpressionProperty(node) {
32
+ return _transformers.StyleProperty.lint(node, {
33
+ context: context
34
+ });
35
+ },
36
+ 'CallExpression[callee.name="cssMap"] ObjectExpression Property': function CallExpressionCalleeNameCssMapObjectExpressionProperty(node) {
37
+ return _transformers.StyleProperty.lint(node, {
38
+ context: context
39
+ });
40
+ },
41
+ 'CallExpression[callee.object.name=styled] ObjectExpression Property': function CallExpressionCalleeObjectNameStyledObjectExpressionProperty(node) {
42
+ return _transformers.StyleProperty.lint(node, {
43
+ context: context
44
+ });
45
+ },
46
+ 'CallExpression[callee.object.name=styled2] ObjectExpression Property': function CallExpressionCalleeObjectNameStyled2ObjectExpressionProperty(node) {
47
+ return _transformers.StyleProperty.lint(node, {
48
+ context: context
49
+ });
50
+ }
51
+ };
52
+ }
53
+ });
54
+ var _default = exports.default = rule;
@@ -0,0 +1,12 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ Object.defineProperty(exports, "StyleProperty", {
7
+ enumerable: true,
8
+ get: function get() {
9
+ return _styleProperty.StyleProperty;
10
+ }
11
+ });
12
+ var _styleProperty = require("./style-property");
@@ -0,0 +1,130 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+ var _typeof = require("@babel/runtime/helpers/typeof");
5
+ Object.defineProperty(exports, "__esModule", {
6
+ value: true
7
+ });
8
+ exports.StyleProperty = void 0;
9
+ var _eslintCodemodUtils = require("eslint-codemod-utils");
10
+ var ast = _interopRequireWildcard(require("../../../../ast-nodes"));
11
+ var _utils = require("../../utils");
12
+ var _styleMap = require("./style-map");
13
+ var _supported = _interopRequireDefault(require("./supported"));
14
+ var _upsertImportDeclaration = require("./upsert-import-declaration");
15
+ function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(e) { return e ? t : r; })(e); }
16
+ function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != _typeof(e) && "function" != typeof e) return { default: e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && Object.prototype.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n.default = e, t && t.set(e, n), n; }
17
+ /* eslint-disable @repo/internal/react/require-jsdoc */
18
+
19
+ var messageId = 'noRawSpacingValues';
20
+ var StyleProperty = exports.StyleProperty = {
21
+ lint: function lint(node, _ref) {
22
+ var context = _ref.context;
23
+ // Check whether all criteria needed to make a transformation are met
24
+ var _StyleProperty$_check = StyleProperty._check(node),
25
+ success = _StyleProperty$_check.success,
26
+ ref = _StyleProperty$_check.ref;
27
+ if (!success) {
28
+ return;
29
+ }
30
+ context.report({
31
+ node: ref.node.value,
32
+ messageId: messageId,
33
+ fix: ref.token ? StyleProperty._fix(ref, context) : undefined
34
+ });
35
+ },
36
+ _check: function _check(node) {
37
+ if (!(0, _eslintCodemodUtils.isNodeOfType)(node, 'Property')) {
38
+ return {
39
+ success: false,
40
+ ref: undefined
41
+ };
42
+ }
43
+
44
+ /**
45
+ * Currently, we support values like:
46
+ * ```
47
+ * {
48
+ * padding: '8px', // value.type is Literal
49
+ * margin: -8, // value.type is UnaryExpression
50
+ * }
51
+ * ```
52
+ */
53
+ if (!((0, _eslintCodemodUtils.isNodeOfType)(node.value, 'Literal') || (0, _eslintCodemodUtils.isNodeOfType)(node.value, 'UnaryExpression'))) {
54
+ return {
55
+ success: false,
56
+ ref: undefined
57
+ };
58
+ }
59
+ var _ast$ObjectEntry$getP = ast.ObjectEntry.getProperty(node),
60
+ property = _ast$ObjectEntry$getP.value;
61
+
62
+ // Bail if the property is not `padding`, `margin`, etc
63
+ if (!property || !_styleMap.styleMap[property]) {
64
+ return {
65
+ success: false,
66
+ ref: undefined
67
+ };
68
+ }
69
+ var value = ast.ObjectEntry.getValue(node);
70
+
71
+ // This is mainly useful as a type guard, so the checks after don't have to have duplicate checks for other types.
72
+ if (!(0, _utils.isStringOrNumber)(value)) {
73
+ return {
74
+ success: false,
75
+ ref: undefined
76
+ };
77
+ }
78
+
79
+ // ignore CSS vars. See: https://stash.atlassian.com/projects/ATLASSIAN/repos/atlassian-frontend-monorepo/pull-requests/74844/overview?commentId=6741571
80
+ if (value.toString().startsWith('var(')) {
81
+ return {
82
+ success: false,
83
+ ref: undefined
84
+ };
85
+ }
86
+
87
+ // There are valid values to ignore, such as `margin: auto`
88
+ if (_supported.default.values.ignore.includes(value)) {
89
+ return {
90
+ success: false,
91
+ ref: undefined
92
+ };
93
+ }
94
+
95
+ // Don't report on stuff like `padding: '8px 16px'`.
96
+ // We may iterate to handle values like this in future.
97
+ if (value.toString().includes(' ')) {
98
+ return {
99
+ success: false,
100
+ ref: undefined
101
+ };
102
+ }
103
+ var ref = {
104
+ node: node,
105
+ token: _styleMap.styleMap[property][value],
106
+ fallback: value
107
+ };
108
+ return {
109
+ success: true,
110
+ ref: ref
111
+ };
112
+ },
113
+ /**
114
+ * All required validation steps have been taken care of before this
115
+ * transformer is called, so it just goes ahead providing all necessary fixes
116
+ */
117
+ _fix: function _fix(ref, context) {
118
+ return function (fixer) {
119
+ var importFix = (0, _upsertImportDeclaration.upsertImportDeclaration)({
120
+ module: '@atlaskit/tokens',
121
+ specifiers: ['token']
122
+ }, context, fixer);
123
+ var tokenCall = ref.fallback ? "token('".concat(ref.token, "', '").concat(ref.fallback, "')") : "token('".concat(ref.token, "')");
124
+ var tokenFix = fixer.replaceText(ref.node.value, tokenCall);
125
+ return [importFix, tokenFix].filter(function (fix) {
126
+ return Boolean(fix);
127
+ }); // Some of the transformers can return arrays with undefined, so filter them out
128
+ };
129
+ }
130
+ };
@@ -0,0 +1,80 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+ Object.defineProperty(exports, "__esModule", {
5
+ value: true
6
+ });
7
+ exports.styleMap = void 0;
8
+ var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
9
+ var _tokenMap;
10
+ // TODO: https://product-fabric.atlassian.net/browse/DSP-16054
11
+ var tokenMap = (_tokenMap = {
12
+ '-2px': 'space.negative.025',
13
+ '-4px': 'space.negative.050',
14
+ '-6px': 'space.negative.075',
15
+ '-8px': 'space.negative.100',
16
+ '-12px': 'space.negative.150',
17
+ '-16px': 'space.negative.200',
18
+ '-20px': 'space.negative.250',
19
+ '-24px': 'space.negative.300',
20
+ '-32px': 'space.negative.400'
21
+ }, (0, _defineProperty2.default)(_tokenMap, -2, 'space.negative.025'), (0, _defineProperty2.default)(_tokenMap, -4, 'space.negative.050'), (0, _defineProperty2.default)(_tokenMap, -6, 'space.negative.075'), (0, _defineProperty2.default)(_tokenMap, -8, 'space.negative.100'), (0, _defineProperty2.default)(_tokenMap, -12, 'space.negative.150'), (0, _defineProperty2.default)(_tokenMap, -16, 'space.negative.200'), (0, _defineProperty2.default)(_tokenMap, -20, 'space.negative.250'), (0, _defineProperty2.default)(_tokenMap, -24, 'space.negative.300'), (0, _defineProperty2.default)(_tokenMap, -32, 'space.negative.400'), (0, _defineProperty2.default)(_tokenMap, '2px', 'space.025'), (0, _defineProperty2.default)(_tokenMap, '4px', 'space.050'), (0, _defineProperty2.default)(_tokenMap, '6px', 'space.075'), (0, _defineProperty2.default)(_tokenMap, '8px', 'space.100'), (0, _defineProperty2.default)(_tokenMap, '12px', 'space.150'), (0, _defineProperty2.default)(_tokenMap, '16px', 'space.200'), (0, _defineProperty2.default)(_tokenMap, '20px', 'space.250'), (0, _defineProperty2.default)(_tokenMap, '24px', 'space.300'), (0, _defineProperty2.default)(_tokenMap, '32px', 'space.400'), (0, _defineProperty2.default)(_tokenMap, '40px', 'space.500'), (0, _defineProperty2.default)(_tokenMap, '48px', 'space.600'), (0, _defineProperty2.default)(_tokenMap, '64px', 'space.800'), (0, _defineProperty2.default)(_tokenMap, '80px', 'space.1000'), (0, _defineProperty2.default)(_tokenMap, 2, 'space.025'), (0, _defineProperty2.default)(_tokenMap, 4, 'space.050'), (0, _defineProperty2.default)(_tokenMap, 6, 'space.075'), (0, _defineProperty2.default)(_tokenMap, 8, 'space.100'), (0, _defineProperty2.default)(_tokenMap, 12, 'space.150'), (0, _defineProperty2.default)(_tokenMap, 16, 'space.200'), (0, _defineProperty2.default)(_tokenMap, 20, 'space.250'), (0, _defineProperty2.default)(_tokenMap, 24, 'space.300'), (0, _defineProperty2.default)(_tokenMap, 32, 'space.400'), (0, _defineProperty2.default)(_tokenMap, 40, 'space.500'), (0, _defineProperty2.default)(_tokenMap, 48, 'space.600'), (0, _defineProperty2.default)(_tokenMap, 64, 'space.800'), (0, _defineProperty2.default)(_tokenMap, 80, 'space.1000'), (0, _defineProperty2.default)(_tokenMap, '-0.125rem', 'space.negative.025'), (0, _defineProperty2.default)(_tokenMap, '-0.25rem', 'space.negative.050'), (0, _defineProperty2.default)(_tokenMap, '-0.375rem', 'space.negative.075'), (0, _defineProperty2.default)(_tokenMap, '-0.5rem', 'space.negative.100'), (0, _defineProperty2.default)(_tokenMap, '-0.75rem', 'space.negative.150'), (0, _defineProperty2.default)(_tokenMap, '-1rem', 'space.negative.200'), (0, _defineProperty2.default)(_tokenMap, '-1.25rem', 'space.negative.250'), (0, _defineProperty2.default)(_tokenMap, '-1.5rem', 'space.negative.300'), (0, _defineProperty2.default)(_tokenMap, '-2rem', 'space.negative.400'), (0, _defineProperty2.default)(_tokenMap, '0.125rem', 'space.025'), (0, _defineProperty2.default)(_tokenMap, '0.25rem', 'space.050'), (0, _defineProperty2.default)(_tokenMap, '0.375rem', 'space.075'), (0, _defineProperty2.default)(_tokenMap, '0.5rem', 'space.100'), (0, _defineProperty2.default)(_tokenMap, '0.75rem', 'space.150'), (0, _defineProperty2.default)(_tokenMap, '1rem', 'space.200'), (0, _defineProperty2.default)(_tokenMap, '1.25rem', 'space.250'), (0, _defineProperty2.default)(_tokenMap, '1.5rem', 'space.300'), (0, _defineProperty2.default)(_tokenMap, '2rem', 'space.400'), (0, _defineProperty2.default)(_tokenMap, '2.5rem', 'space.500'), (0, _defineProperty2.default)(_tokenMap, '3rem', 'space.600'), (0, _defineProperty2.default)(_tokenMap, '4rem', 'space.800'), (0, _defineProperty2.default)(_tokenMap, '5rem', 'space.1000'), (0, _defineProperty2.default)(_tokenMap, '-0.125em', 'space.negative.025'), (0, _defineProperty2.default)(_tokenMap, '-0.25em', 'space.negative.050'), (0, _defineProperty2.default)(_tokenMap, '-0.375em', 'space.negative.075'), (0, _defineProperty2.default)(_tokenMap, '-0.5em', 'space.negative.100'), (0, _defineProperty2.default)(_tokenMap, '-0.75em', 'space.negative.150'), (0, _defineProperty2.default)(_tokenMap, '-1em', 'space.negative.200'), (0, _defineProperty2.default)(_tokenMap, '-1.25em', 'space.negative.250'), (0, _defineProperty2.default)(_tokenMap, '-1.5em', 'space.negative.300'), (0, _defineProperty2.default)(_tokenMap, '-2em', 'space.negative.400'), (0, _defineProperty2.default)(_tokenMap, '0.125em', 'space.025'), (0, _defineProperty2.default)(_tokenMap, '0.25em', 'space.050'), (0, _defineProperty2.default)(_tokenMap, '0.375em', 'space.075'), (0, _defineProperty2.default)(_tokenMap, '0.5em', 'space.100'), (0, _defineProperty2.default)(_tokenMap, '0.75em', 'space.150'), (0, _defineProperty2.default)(_tokenMap, '1em', 'space.200'), (0, _defineProperty2.default)(_tokenMap, '1.25em', 'space.250'), (0, _defineProperty2.default)(_tokenMap, '1.5em', 'space.300'), (0, _defineProperty2.default)(_tokenMap, '2em', 'space.400'), (0, _defineProperty2.default)(_tokenMap, '2.5em', 'space.500'), (0, _defineProperty2.default)(_tokenMap, '3em', 'space.600'), (0, _defineProperty2.default)(_tokenMap, '4em', 'space.800'), (0, _defineProperty2.default)(_tokenMap, '5em', 'space.1000'), _tokenMap);
22
+ var styleMap = exports.styleMap = {
23
+ 'column-gap': tokenMap,
24
+ columnGap: tokenMap,
25
+ gap: tokenMap,
26
+ 'grid-column-gap': tokenMap,
27
+ 'grid-row-gap': tokenMap,
28
+ gridColumnGap: tokenMap,
29
+ gridRowGap: tokenMap,
30
+ 'margin-block-end': tokenMap,
31
+ 'margin-block-start': tokenMap,
32
+ 'margin-block': tokenMap,
33
+ 'margin-bottom': tokenMap,
34
+ 'margin-inline-end': tokenMap,
35
+ 'margin-inline-start': tokenMap,
36
+ 'margin-inline': tokenMap,
37
+ 'margin-left': tokenMap,
38
+ 'margin-right': tokenMap,
39
+ 'margin-top': tokenMap,
40
+ 'outline-offset': tokenMap,
41
+ outlineOffset: tokenMap,
42
+ 'padding-block-end': tokenMap,
43
+ 'padding-block-start': tokenMap,
44
+ 'padding-block': tokenMap,
45
+ 'padding-bottom': tokenMap,
46
+ 'padding-inline-end': tokenMap,
47
+ 'padding-inline-start': tokenMap,
48
+ 'padding-inline': tokenMap,
49
+ 'padding-left': tokenMap,
50
+ 'padding-right': tokenMap,
51
+ 'padding-top': tokenMap,
52
+ 'row-gap': tokenMap,
53
+ rowGap: tokenMap,
54
+ margin: tokenMap,
55
+ marginBlock: tokenMap,
56
+ marginBlockEnd: tokenMap,
57
+ marginBlockStart: tokenMap,
58
+ marginBottom: tokenMap,
59
+ marginInline: tokenMap,
60
+ marginInlineEnd: tokenMap,
61
+ marginInlineStart: tokenMap,
62
+ marginLeft: tokenMap,
63
+ marginRight: tokenMap,
64
+ marginTop: tokenMap,
65
+ padding: tokenMap,
66
+ paddingBlock: tokenMap,
67
+ paddingBlockEnd: tokenMap,
68
+ paddingBlockStart: tokenMap,
69
+ paddingBottom: tokenMap,
70
+ paddingInline: tokenMap,
71
+ paddingInlineEnd: tokenMap,
72
+ paddingInlineStart: tokenMap,
73
+ paddingLeft: tokenMap,
74
+ paddingRight: tokenMap,
75
+ paddingTop: tokenMap
76
+ // bottom: tokenMap,
77
+ // left: tokenMap,
78
+ // right: tokenMap,
79
+ // top: tokenMap,
80
+ };
@@ -0,0 +1,14 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.default = void 0;
7
+ var _default = exports.default = {
8
+ values: {
9
+ ignore: ['auto', 'initial', 'inherit', 'unset', 'revert', 'revert-layer', 'none',
10
+ // outline-offset can be set to none
11
+ // Currently the DST opinion is that 0 is valid. It doesn't need to be converted to `space.0`
12
+ 0, '0', '0px', '0em', '0rem']
13
+ }
14
+ };
@@ -0,0 +1,37 @@
1
+ "use strict";
2
+
3
+ var _typeof = require("@babel/runtime/helpers/typeof");
4
+ Object.defineProperty(exports, "__esModule", {
5
+ value: true
6
+ });
7
+ exports.upsertImportDeclaration = void 0;
8
+ var ast = _interopRequireWildcard(require("../../../../ast-nodes"));
9
+ function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(e) { return e ? t : r; })(e); }
10
+ function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != _typeof(e) && "function" != typeof e) return { default: e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && Object.prototype.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n.default = e, t && t.set(e, n), n; }
11
+ /**
12
+ * Currently this is defined here because it's not very general purpose.
13
+ * If we were to move this to `ast-nodes`, half the implementation would be in `Root`,
14
+ * and the other half would be in `Import`.
15
+ *
16
+ * TODO: Refactor and move to `ast-nodes`
17
+ *
18
+ * Note: It does not handle default imports, namespace imports, or aliased imports.
19
+ */
20
+ var upsertImportDeclaration = exports.upsertImportDeclaration = function upsertImportDeclaration(_ref, context, fixer) {
21
+ var module = _ref.module,
22
+ specifiers = _ref.specifiers;
23
+ // Find any imports that match the packageName
24
+ var root = context.getSourceCode().ast.body;
25
+ var importDeclarations = ast.Root.findImportsByModule(root, module);
26
+
27
+ // The import doesn't exist yet, we can just insert a whole new one
28
+ if (importDeclarations.length === 0) {
29
+ return ast.Root.insertImport(root, {
30
+ module: module,
31
+ specifiers: specifiers
32
+ }, fixer);
33
+ }
34
+
35
+ // The import exists so, modify the existing one
36
+ return ast.Import.insertNamedSpecifiers(importDeclarations[0], specifiers, fixer);
37
+ };
@@ -0,0 +1,12 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ Object.defineProperty(exports, "isStringOrNumber", {
7
+ enumerable: true,
8
+ get: function get() {
9
+ return _isStringOrNumber.isStringOrNumber;
10
+ }
11
+ });
12
+ var _isStringOrNumber = require("./is-string-or-number");
@@ -0,0 +1,9 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.isStringOrNumber = void 0;
7
+ var isStringOrNumber = exports.isStringOrNumber = function isStringOrNumber(value) {
8
+ return typeof value === 'string' || typeof value === 'number';
9
+ };
@@ -1,5 +1,40 @@
1
+ /* eslint-disable @repo/internal/react/require-jsdoc */
2
+
1
3
  import { isNodeOfType } from 'eslint-codemod-utils';
2
- const ObjectEntry = {
4
+ export const ObjectEntry = {
5
+ getProperty(node) {
6
+ if (isNodeOfType(node.key, 'Identifier')) {
7
+ return {
8
+ type: 'Identifier',
9
+ value: node.key.name
10
+ };
11
+ }
12
+ if (isNodeOfType(node.key, 'Literal') && node.key.value) {
13
+ return {
14
+ type: 'Literal',
15
+ value: node.key.value.toString()
16
+ };
17
+ }
18
+ return {
19
+ type: undefined,
20
+ value: undefined
21
+ };
22
+ },
23
+ getValue(node) {
24
+ // The value is a number, like `-3`
25
+ if (isNodeOfType(node.value, 'UnaryExpression') && isNodeOfType(node.value.argument, 'Literal') && node.value.argument.raw) {
26
+ if (node.value.operator === '-') {
27
+ return -1 * Number.parseInt(node.value.argument.raw);
28
+ }
29
+ return Number.parseInt(node.value.argument.raw);
30
+ }
31
+
32
+ // The value is a string, like `'4px'`
33
+ if (isNodeOfType(node.value, 'Literal') && node.value.value) {
34
+ return node.value.value;
35
+ }
36
+ return undefined;
37
+ },
3
38
  deleteEntry(node, context, fixer) {
4
39
  var _lastToken;
5
40
  // context.getSourceCode() is deprecated in favour of context.sourceCode, however this returns undefined for some reason
@@ -31,5 +66,4 @@ const ObjectEntry = {
31
66
  return node.key.name;
32
67
  }
33
68
  }
34
- };
35
- export { ObjectEntry };
69
+ };
@@ -99,6 +99,18 @@ const ASTObjectExpression = {
99
99
  key: identifier(key),
100
100
  value: literal(value)
101
101
  }).toString()}, `);
102
+ },
103
+ recurse(node, callback) {
104
+ node.properties.forEach(entry => {
105
+ // Call the callback first, in case the user wants to do something with SpreadElements
106
+ callback(entry);
107
+ if (!isNodeOfType(entry, 'Property')) {
108
+ return;
109
+ }
110
+ if (isNodeOfType(entry.value, 'ObjectExpression')) {
111
+ ASTObjectExpression.recurse(entry.value, callback);
112
+ }
113
+ });
102
114
  }
103
115
  };
104
116
  export { ASTObjectExpression as Object };
@@ -1,6 +1,6 @@
1
1
  /**
2
2
  * THIS FILE WAS CREATED VIA CODEGEN DO NOT MODIFY {@see http://go/af-codegen}
3
- * @codegen <<SignedSource::d90c2cf5e100daf98915f9467f2e5663>>
3
+ * @codegen <<SignedSource::d95217b658f807294de3c81123068bf1>>
4
4
  * @codegenCommand yarn workspace @atlaskit/eslint-plugin-design-system codegen
5
5
  */
6
6
  export default {
@@ -35,6 +35,7 @@ export default {
35
35
  '@atlaskit/design-system/use-href-in-link-item': 'warn',
36
36
  '@atlaskit/design-system/use-primitives': 'warn',
37
37
  '@atlaskit/design-system/use-primitives-text': 'warn',
38
+ '@atlaskit/design-system/use-tokens-space': 'error',
38
39
  '@atlaskit/design-system/use-tokens-typography': 'warn',
39
40
  '@atlaskit/design-system/use-visually-hidden': 'error'
40
41
  }