@atlaskit/eslint-plugin-design-system 8.33.0 → 8.36.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 (124) hide show
  1. package/CHANGELOG.md +28 -0
  2. package/README.md +1 -0
  3. package/constellation/ensure-design-token-usage/usage.mdx +2 -2
  4. package/constellation/index/usage.mdx +1 -0
  5. package/constellation/use-primitives-text/usage.mdx +13 -3
  6. package/constellation/use-tokens-typography/usage.mdx +42 -0
  7. package/dist/cjs/ast-nodes/index.js +7 -0
  8. package/dist/cjs/ast-nodes/object-entry.js +27 -0
  9. package/dist/cjs/ast-nodes/object.js +1 -1
  10. package/dist/cjs/presets/all.codegen.js +2 -1
  11. package/dist/cjs/rules/ensure-design-token-usage/index.js +5 -4
  12. package/dist/cjs/rules/ensure-design-token-usage/rule-meta.js +1 -1
  13. package/dist/cjs/rules/ensure-design-token-usage/spacing.js +5 -1
  14. package/dist/cjs/rules/ensure-design-token-usage/utils.js +52 -42
  15. package/dist/cjs/rules/index.codegen.js +3 -1
  16. package/dist/cjs/rules/use-primitives/transformers/compiled-styled/find-valid-jsx-usage-to-transform.js +24 -1
  17. package/dist/cjs/rules/use-primitives/transformers/compiled-styled/index.js +2 -1
  18. package/dist/cjs/rules/use-primitives-text/config/index.js +2 -1
  19. package/dist/cjs/rules/use-primitives-text/transformers/common.js +10 -1
  20. package/dist/cjs/rules/use-primitives-text/transformers/emphasis-elements.js +6 -3
  21. package/dist/cjs/rules/use-primitives-text/transformers/paragraph-elements.js +19 -4
  22. package/dist/cjs/rules/use-primitives-text/transformers/span-elements.js +6 -4
  23. package/dist/cjs/rules/use-primitives-text/transformers/strong-elements.js +6 -3
  24. package/dist/cjs/rules/use-tokens-typography/config/index.js +26 -0
  25. package/dist/cjs/rules/use-tokens-typography/error-boundary.js +24 -0
  26. package/dist/cjs/rules/use-tokens-typography/index.js +44 -0
  27. package/dist/cjs/rules/use-tokens-typography/transformers/style-object.js +212 -0
  28. package/dist/cjs/rules/use-tokens-typography/utils.js +146 -0
  29. package/dist/es2019/ast-nodes/index.js +1 -0
  30. package/dist/es2019/ast-nodes/object-entry.js +22 -0
  31. package/dist/es2019/ast-nodes/object.js +1 -1
  32. package/dist/es2019/presets/all.codegen.js +2 -1
  33. package/dist/es2019/rules/ensure-design-token-usage/index.js +6 -5
  34. package/dist/es2019/rules/ensure-design-token-usage/rule-meta.js +1 -1
  35. package/dist/es2019/rules/ensure-design-token-usage/spacing.js +5 -1
  36. package/dist/es2019/rules/ensure-design-token-usage/utils.js +42 -38
  37. package/dist/es2019/rules/index.codegen.js +3 -1
  38. package/dist/es2019/rules/use-primitives/transformers/compiled-styled/find-valid-jsx-usage-to-transform.js +17 -3
  39. package/dist/es2019/rules/use-primitives/transformers/compiled-styled/index.js +2 -1
  40. package/dist/es2019/rules/use-primitives-text/config/index.js +2 -1
  41. package/dist/es2019/rules/use-primitives-text/transformers/common.js +9 -2
  42. package/dist/es2019/rules/use-primitives-text/transformers/emphasis-elements.js +7 -4
  43. package/dist/es2019/rules/use-primitives-text/transformers/paragraph-elements.js +20 -5
  44. package/dist/es2019/rules/use-primitives-text/transformers/span-elements.js +7 -5
  45. package/dist/es2019/rules/use-primitives-text/transformers/strong-elements.js +7 -4
  46. package/dist/es2019/rules/use-tokens-typography/config/index.js +20 -0
  47. package/dist/es2019/rules/use-tokens-typography/error-boundary.js +19 -0
  48. package/dist/es2019/rules/use-tokens-typography/index.js +36 -0
  49. package/dist/es2019/rules/use-tokens-typography/transformers/style-object.js +209 -0
  50. package/dist/es2019/rules/use-tokens-typography/utils.js +99 -0
  51. package/dist/esm/ast-nodes/index.js +1 -0
  52. package/dist/esm/ast-nodes/object-entry.js +22 -0
  53. package/dist/esm/ast-nodes/object.js +1 -1
  54. package/dist/esm/presets/all.codegen.js +2 -1
  55. package/dist/esm/rules/ensure-design-token-usage/index.js +6 -5
  56. package/dist/esm/rules/ensure-design-token-usage/rule-meta.js +1 -1
  57. package/dist/esm/rules/ensure-design-token-usage/spacing.js +5 -1
  58. package/dist/esm/rules/ensure-design-token-usage/utils.js +46 -38
  59. package/dist/esm/rules/index.codegen.js +3 -1
  60. package/dist/esm/rules/use-primitives/transformers/compiled-styled/find-valid-jsx-usage-to-transform.js +23 -2
  61. package/dist/esm/rules/use-primitives/transformers/compiled-styled/index.js +2 -1
  62. package/dist/esm/rules/use-primitives-text/config/index.js +2 -1
  63. package/dist/esm/rules/use-primitives-text/transformers/common.js +9 -2
  64. package/dist/esm/rules/use-primitives-text/transformers/emphasis-elements.js +7 -4
  65. package/dist/esm/rules/use-primitives-text/transformers/paragraph-elements.js +20 -5
  66. package/dist/esm/rules/use-primitives-text/transformers/span-elements.js +7 -5
  67. package/dist/esm/rules/use-primitives-text/transformers/strong-elements.js +7 -4
  68. package/dist/esm/rules/use-tokens-typography/config/index.js +20 -0
  69. package/dist/esm/rules/use-tokens-typography/error-boundary.js +18 -0
  70. package/dist/esm/rules/use-tokens-typography/index.js +38 -0
  71. package/dist/esm/rules/use-tokens-typography/transformers/style-object.js +206 -0
  72. package/dist/esm/rules/use-tokens-typography/utils.js +129 -0
  73. package/dist/types/ast-nodes/index.d.ts +1 -0
  74. package/dist/types/ast-nodes/object-entry.d.ts +6 -0
  75. package/dist/types/ast-nodes/object.d.ts +1 -1
  76. package/dist/types/index.codegen.d.ts +1 -0
  77. package/dist/types/presets/all.codegen.d.ts +2 -1
  78. package/dist/types/rules/ensure-design-token-usage/types.d.ts +1 -1
  79. package/dist/types/rules/ensure-design-token-usage/utils.d.ts +22 -22
  80. package/dist/types/rules/index.codegen.d.ts +1 -0
  81. package/dist/types/rules/use-primitives/config/index.d.ts +1 -1
  82. package/dist/types/rules/use-primitives/transformers/compiled-styled/find-valid-jsx-usage-to-transform.d.ts +3 -1
  83. package/dist/types/rules/use-primitives/transformers/compiled-styled/index.d.ts +1 -1
  84. package/dist/types/rules/use-primitives/transformers/emotion-css/index.d.ts +1 -2
  85. package/dist/types/rules/use-primitives-text/config/index.d.ts +1 -0
  86. package/dist/types/rules/use-primitives-text/transformers/common.d.ts +6 -0
  87. package/dist/types/rules/use-primitives-text/transformers/emphasis-elements.d.ts +2 -10
  88. package/dist/types/rules/use-primitives-text/transformers/paragraph-elements.d.ts +4 -12
  89. package/dist/types/rules/use-primitives-text/transformers/span-elements.d.ts +2 -10
  90. package/dist/types/rules/use-primitives-text/transformers/strong-elements.d.ts +2 -10
  91. package/dist/types/rules/use-tokens-typography/config/index.d.ts +6 -0
  92. package/dist/types/rules/use-tokens-typography/error-boundary.d.ts +11 -0
  93. package/dist/types/rules/use-tokens-typography/index.d.ts +3 -0
  94. package/dist/types/rules/use-tokens-typography/transformers/style-object.d.ts +31 -0
  95. package/dist/types/rules/use-tokens-typography/utils.d.ts +194 -0
  96. package/dist/types-ts4.5/ast-nodes/index.d.ts +1 -0
  97. package/dist/types-ts4.5/ast-nodes/object-entry.d.ts +6 -0
  98. package/dist/types-ts4.5/ast-nodes/object.d.ts +1 -1
  99. package/dist/types-ts4.5/index.codegen.d.ts +1 -0
  100. package/dist/types-ts4.5/presets/all.codegen.d.ts +2 -1
  101. package/dist/types-ts4.5/rules/ensure-design-token-usage/types.d.ts +1 -1
  102. package/dist/types-ts4.5/rules/ensure-design-token-usage/utils.d.ts +22 -22
  103. package/dist/types-ts4.5/rules/index.codegen.d.ts +1 -0
  104. package/dist/types-ts4.5/rules/use-primitives/config/index.d.ts +1 -1
  105. package/dist/types-ts4.5/rules/use-primitives/transformers/compiled-styled/find-valid-jsx-usage-to-transform.d.ts +3 -1
  106. package/dist/types-ts4.5/rules/use-primitives/transformers/compiled-styled/index.d.ts +1 -1
  107. package/dist/types-ts4.5/rules/use-primitives/transformers/emotion-css/index.d.ts +1 -2
  108. package/dist/types-ts4.5/rules/use-primitives-text/config/index.d.ts +1 -0
  109. package/dist/types-ts4.5/rules/use-primitives-text/transformers/common.d.ts +6 -0
  110. package/dist/types-ts4.5/rules/use-primitives-text/transformers/emphasis-elements.d.ts +2 -10
  111. package/dist/types-ts4.5/rules/use-primitives-text/transformers/paragraph-elements.d.ts +4 -12
  112. package/dist/types-ts4.5/rules/use-primitives-text/transformers/span-elements.d.ts +2 -10
  113. package/dist/types-ts4.5/rules/use-primitives-text/transformers/strong-elements.d.ts +2 -10
  114. package/dist/types-ts4.5/rules/use-tokens-typography/config/index.d.ts +6 -0
  115. package/dist/types-ts4.5/rules/use-tokens-typography/error-boundary.d.ts +11 -0
  116. package/dist/types-ts4.5/rules/use-tokens-typography/index.d.ts +3 -0
  117. package/dist/types-ts4.5/rules/use-tokens-typography/transformers/style-object.d.ts +31 -0
  118. package/dist/types-ts4.5/rules/use-tokens-typography/utils.d.ts +194 -0
  119. package/package.json +1 -1
  120. package/dist/cjs/rules/ensure-design-token-usage/typography.js +0 -39
  121. package/dist/es2019/rules/ensure-design-token-usage/typography.js +0 -19
  122. package/dist/esm/rules/ensure-design-token-usage/typography.js +0 -33
  123. package/dist/types/rules/ensure-design-token-usage/typography.d.ts +0 -9
  124. package/dist/types-ts4.5/rules/ensure-design-token-usage/typography.d.ts +0 -9
@@ -0,0 +1,206 @@
1
+ /* eslint-disable @repo/internal/react/require-jsdoc */
2
+
3
+ import { isNodeOfType } from 'eslint-codemod-utils';
4
+ import { Object as ASTObject, ObjectEntry, Root } from '../../../ast-nodes';
5
+ import { getValueForPropertyNode, insertTokensImport, normaliseValue } from '../../ensure-design-token-usage/utils';
6
+ import { isDecendantOfGlobalToken, isDecendantOfStyleBlock, isDecendantOfType } from '../../utils/is-node';
7
+ import { convertPropertyNodeToStringableNode, defaultFontWeight, findFontFamilyValueForToken, findFontWeightTokenForValue, findTypographyTokenForValues, fontWeightMap, getLiteralProperty, getTokenProperty, isValidPropertyNode, notUndefined } from '../utils';
8
+ export var StyleObject = {
9
+ lint: function lint(node, _ref) {
10
+ var context = _ref.context;
11
+ // To force the correct node type
12
+ if (!isNodeOfType(node, 'ObjectExpression')) {
13
+ return {
14
+ success: false
15
+ };
16
+ }
17
+
18
+ // Check whether all criteria needed to make a transformation are met
19
+ var _StyleObject$_check = StyleObject._check(node, {
20
+ context: context
21
+ }),
22
+ success = _StyleObject$_check.success,
23
+ refs = _StyleObject$_check.refs;
24
+ if (!success || !refs) {
25
+ return;
26
+ }
27
+ var fontSizeNode = refs.fontSizeNode,
28
+ fontSizeRaw = refs.fontSizeRaw,
29
+ tokensImportNode = refs.tokensImportNode;
30
+ var fontSizeValue = normaliseValue('fontSize', fontSizeRaw);
31
+
32
+ // -- Font weight --
33
+ var fontWeightNode = ASTObject.getEntryByPropertyName(node, 'fontWeight');
34
+ var fontWeightRaw = fontWeightNode && getValueForPropertyNode(fontWeightNode, context);
35
+
36
+ // If no fontWeight value exists, default to 400 to avoid matching with a bolder token resulting in a visual change
37
+ var fontWeightValue = fontWeightRaw && normaliseValue('fontWeight', fontWeightRaw) || defaultFontWeight;
38
+ fontWeightValue = fontWeightValue.length === 3 ? fontWeightValue : fontWeightMap[fontWeightValue] || defaultFontWeight;
39
+
40
+ // -- Line height --
41
+ var lineHeightNode = ASTObject.getEntryByPropertyName(node, 'lineHeight');
42
+ var lineHeightRaw = lineHeightNode && getValueForPropertyNode(lineHeightNode, context);
43
+ var shouldAddFontWeight = false;
44
+ var lineHeightValue = lineHeightRaw && normaliseValue('lineHeight', lineHeightRaw) || undefined;
45
+ if (lineHeightValue === fontSizeValue) {
46
+ lineHeightValue = '1';
47
+ }
48
+
49
+ // -- Match tokens --
50
+ var matchingTokens = findTypographyTokenForValues(fontSizeValue, lineHeightValue);
51
+ if (matchingTokens.length) {
52
+ // If we have multiple matching tokens, try matching fontWeight
53
+ var matchingTokensWithWeight = matchingTokens.filter(function (token) {
54
+ return fontWeightValue ? token.values.fontWeight === fontWeightValue : token;
55
+ });
56
+ if (matchingTokensWithWeight.length) {
57
+ // Possibly narrowed down tokens
58
+ matchingTokens = matchingTokensWithWeight;
59
+ } else {
60
+ // Ended up with 0 matches by matching fontWeight
61
+ // return body token and add fontWeight manually
62
+ matchingTokens = matchingTokens.filter(function (token) {
63
+ return token.tokenName.includes('.body');
64
+ });
65
+ shouldAddFontWeight = true;
66
+ }
67
+ }
68
+
69
+ // Get other font-* nodes that we can replace/remove.
70
+ // These aren't needed for token matching.
71
+
72
+ // -- Font family --
73
+ var fontFamilyNode = ASTObject.getEntryByPropertyName(node, 'fontFamily');
74
+ var fontFamilyRaw = fontFamilyNode && getValueForPropertyNode(fontFamilyNode, context);
75
+ var fontFamilyValue = fontFamilyRaw && normaliseValue('fontFamily', fontFamilyRaw) || undefined;
76
+ var fontFamilyToAdd;
77
+ // If font family uses the Charlie font we can't replace; exit
78
+ if (fontFamilyValue) {
79
+ if (fontFamilyValue.toLowerCase().includes('charlie display')) {
80
+ fontFamilyToAdd = 'heading';
81
+ } else if (fontFamilyValue.toLowerCase().includes('charlie text')) {
82
+ fontFamilyToAdd = 'body';
83
+ }
84
+ } else {
85
+ // Font family node exists but we can't resolve its value
86
+ // Will need to re-add it below the font property to ensure it still applies
87
+ fontFamilyToAdd = fontFamilyNode ? 'original' : undefined;
88
+ }
89
+
90
+ // -- Font style --
91
+ var fontStyleNode = ASTObject.getEntryByPropertyName(node, 'fontStyle');
92
+ var fontStyleRaw = fontStyleNode && getValueForPropertyNode(fontStyleNode, context);
93
+ var fontStyleValue = fontStyleRaw && normaliseValue('fontStyle', fontStyleRaw) || undefined;
94
+ var fontStyleToAdd;
95
+ if (fontStyleValue === 'italic') {
96
+ fontStyleToAdd = 'italic';
97
+ }
98
+
99
+ // -- Letter spacing --
100
+ var letterSpacingNode = ASTObject.getEntryByPropertyName(node, 'letterSpacing');
101
+
102
+ // A single matching token
103
+ // TOOD: Maybe suggest options if > 1 matching token
104
+ if (matchingTokens.length === 1) {
105
+ var matchingToken = matchingTokens[0];
106
+
107
+ // fontSize node is always first
108
+ var nodesToReplace = [fontSizeNode, fontWeightNode, lineHeightNode, fontFamilyNode, fontStyleNode, letterSpacingNode].filter(notUndefined);
109
+ var fontFamilyTokenName = fontFamilyToAdd ? "font.family.brand.".concat(fontFamilyToAdd) : '';
110
+ var fontWeightReplacementToken = shouldAddFontWeight ? findFontWeightTokenForValue(fontWeightValue) : undefined;
111
+ var fontWeightReplacement = fontWeightReplacementToken && getTokenProperty('fontWeight', fontWeightReplacementToken.tokenName, fontWeightValue);
112
+ var fontFamilyReplacement = fontFamilyToAdd && (fontFamilyToAdd === 'original' ? convertPropertyNodeToStringableNode(
113
+ // This will always exist if fontFamilyToAdd === 'original', TS can't figure that out.
114
+ fontFamilyNode) : getTokenProperty('fontFamily', fontFamilyTokenName, findFontFamilyValueForToken(fontFamilyTokenName)));
115
+ var fontStyleReplacement = fontStyleToAdd && getLiteralProperty('fontStyle', fontStyleToAdd);
116
+ var fixerRefs = {
117
+ matchingToken: matchingToken,
118
+ nodesToReplace: nodesToReplace,
119
+ tokensImportNode: tokensImportNode,
120
+ fontWeightReplacement: fontWeightReplacement,
121
+ fontFamilyReplacement: fontFamilyReplacement,
122
+ fontStyleReplacement: fontStyleReplacement
123
+ };
124
+ context.report({
125
+ node: fontSizeNode,
126
+ messageId: 'noRawTypographyValues',
127
+ data: {
128
+ payload: "fontSize:".concat(fontSizeRaw)
129
+ },
130
+ fix: StyleObject._fix(fixerRefs, context)
131
+ });
132
+ } else if (!matchingTokens.length) {
133
+ context.report({
134
+ node: fontSizeNode,
135
+ messageId: 'noRawTypographyValues',
136
+ data: {
137
+ payload: "fontSize:".concat(fontSizeRaw)
138
+ }
139
+ });
140
+ }
141
+ return;
142
+ },
143
+ _check: function _check(node, _ref2) {
144
+ var context = _ref2.context;
145
+ if (!isDecendantOfStyleBlock(node) && !isDecendantOfType(node, 'JSXExpressionContainer')) {
146
+ return {
147
+ success: false
148
+ };
149
+ }
150
+
151
+ // -- Font size --
152
+ var fontSizeNode = ASTObject.getEntryByPropertyName(node, 'fontSize');
153
+ if (!fontSizeNode || !isValidPropertyNode(fontSizeNode) || isDecendantOfGlobalToken(fontSizeNode.value)) {
154
+ return {
155
+ success: false
156
+ };
157
+ }
158
+ var fontSizeRaw = getValueForPropertyNode(fontSizeNode, context);
159
+
160
+ // Without a valid fontSize value we can't be certain what token should be used; exit
161
+ if (!fontSizeRaw) {
162
+ return {
163
+ success: false
164
+ };
165
+ }
166
+ var importDeclaration = Root.findImportsByModule(context.getSourceCode().ast.body, '@atlaskit/tokens');
167
+
168
+ // If there is more than one `@atlaskit/tokens` import, then it becomes difficult to determine which import to transform
169
+ if (importDeclaration.length > 1) {
170
+ return {
171
+ success: false
172
+ };
173
+ }
174
+ return {
175
+ success: true,
176
+ refs: {
177
+ fontSizeNode: fontSizeNode,
178
+ fontSizeRaw: fontSizeRaw,
179
+ tokensImportNode: importDeclaration[0]
180
+ }
181
+ };
182
+ },
183
+ _fix: function _fix(refs, context) {
184
+ return function (fixer) {
185
+ var matchingToken = refs.matchingToken,
186
+ nodesToReplace = refs.nodesToReplace,
187
+ tokensImportNode = refs.tokensImportNode,
188
+ fontWeightReplacement = refs.fontWeightReplacement,
189
+ fontFamilyReplacement = refs.fontFamilyReplacement,
190
+ fontStyleReplacement = refs.fontStyleReplacement;
191
+ var fontSizeNode = nodesToReplace[0];
192
+ return (!tokensImportNode ? [insertTokensImport(fixer)] : []).concat(nodesToReplace.map(function (node, index) {
193
+ // Replace first node with token, delete remaining nodes. Guaranteed to be fontSize
194
+ if (index === 0) {
195
+ return fixer.replaceText(node, "".concat(getTokenProperty('font', matchingToken.tokenName, matchingToken.tokenValue)));
196
+ }
197
+
198
+ // We don't replace fontWeight/fontFamily/fontStyle here in case it occurs before the font property.
199
+ // Instead delete the original property and add below
200
+ return ObjectEntry.deleteEntry(node, context, fixer);
201
+ }),
202
+ // Make sure font weight/family/style properties are added AFTER font property to ensure they override corectly
203
+ fontWeightReplacement ? [fixer.insertTextAfter(fontSizeNode, ",\n".concat(fontWeightReplacement))] : [], fontFamilyReplacement ? [fixer.insertTextAfter(fontSizeNode, ",\n".concat(fontFamilyReplacement))] : [], fontStyleReplacement ? [fixer.insertTextAfter(fontSizeNode, ",\n".concat(fontStyleReplacement))] : []);
204
+ };
205
+ }
206
+ };
@@ -0,0 +1,129 @@
1
+ import { callExpression, identifier, isNodeOfType, literal, property } from 'eslint-codemod-utils';
2
+ import { typographyPalette } from '@atlaskit/tokens/palettes-raw';
3
+ import { typographyAdg3 as typographyTokens } from '@atlaskit/tokens/tokens-raw';
4
+ export var typographyProperties = ['fontSize', 'fontWeight', 'fontFamily', 'lineHeight'];
5
+ export var isTypographyProperty = function isTypographyProperty(propertyName) {
6
+ return typographyProperties.includes(propertyName);
7
+ };
8
+ export var isFontSize = function isFontSize(node) {
9
+ return isNodeOfType(node, 'CallExpression') && isNodeOfType(node.callee, 'Identifier') && (node.callee.name === 'fontSize' || node.callee.name === 'getFontSize');
10
+ };
11
+ export var isFontSizeSmall = function isFontSizeSmall(node) {
12
+ return isNodeOfType(node, 'CallExpression') && isNodeOfType(node.callee, 'Identifier') && node.callee.name === 'fontSizeSmall';
13
+ };
14
+ export var isFontFamily = function isFontFamily(node) {
15
+ return isNodeOfType(node, 'CallExpression') && isNodeOfType(node.callee, 'Identifier') && (node.callee.name === 'fontFamily' || node.callee.name === 'getFontFamily');
16
+ };
17
+ export var isCodeFontFamily = function isCodeFontFamily(node) {
18
+ return isNodeOfType(node, 'CallExpression') && isNodeOfType(node.callee, 'Identifier') && (node.callee.name === 'codeFontFamily' || node.callee.name === 'getCodeFontFamily');
19
+ };
20
+ export var typographyValueToToken = typographyTokens
21
+ // we're filtering here to remove the `font` tokens.
22
+ .filter(function (t) {
23
+ return t.attributes.group === 'typography';
24
+ }).filter(function (t) {
25
+ return t.cleanName.includes('font.heading') || t.cleanName.includes('font.body');
26
+ }).map(function (currentToken) {
27
+ var _typographyPalette$fi, _typographyPalette$fi2, _typographyPalette$fi3;
28
+ var individualValues = {
29
+ fontSize: (_typographyPalette$fi = typographyPalette.find(function (baseToken) {
30
+ return baseToken.path.slice(-1)[0] ===
31
+ // @ts-expect-error token.original.value can be a string, due to the typographyTokens export including deprecated tokens
32
+ currentToken.original.value.fontSize;
33
+ })) === null || _typographyPalette$fi === void 0 ? void 0 : _typographyPalette$fi.value,
34
+ fontWeight: (_typographyPalette$fi2 = typographyPalette.find(function (baseToken) {
35
+ return baseToken.path.slice(-1)[0] ===
36
+ // @ts-expect-error token.original.value can be a string, due to the typographyTokens export including deprecated tokens
37
+ currentToken.original.value.fontWeight;
38
+ })) === null || _typographyPalette$fi2 === void 0 ? void 0 : _typographyPalette$fi2.value,
39
+ lineHeight: (_typographyPalette$fi3 = typographyPalette.find(function (baseToken) {
40
+ return baseToken.path.slice(-1)[0] ===
41
+ // @ts-expect-error token.original.value can be a string, due to the typographyTokens export including deprecated tokens
42
+ currentToken.original.value.lineHeight;
43
+ })) === null || _typographyPalette$fi3 === void 0 ? void 0 : _typographyPalette$fi3.value
44
+ };
45
+ return {
46
+ tokenName: currentToken.cleanName,
47
+ tokenValue: currentToken.value,
48
+ values: individualValues
49
+ };
50
+ });
51
+ export function findTypographyTokenForValues(fontSize, lineHeight) {
52
+ var matchingTokens = typographyValueToToken.filter(function (token) {
53
+ return token.values.fontSize === fontSize;
54
+ })
55
+ // If lineHeight == 1, we don't match to a token
56
+ .filter(function () {
57
+ return lineHeight === '1' ? false : true;
58
+ });
59
+ return matchingTokens;
60
+ }
61
+ export var fontWeightTokens = typographyTokens.filter(function (token) {
62
+ return token.attributes.group === 'fontWeight';
63
+ }).map(function (token) {
64
+ return {
65
+ tokenName: token.cleanName,
66
+ tokenValue: token.value,
67
+ values: {}
68
+ };
69
+ });
70
+ export function findFontWeightTokenForValue(fontWeight) {
71
+ return fontWeightTokens.find(function (token) {
72
+ return token.tokenValue === fontWeight;
73
+ });
74
+ }
75
+ export var fontWeightMap = {
76
+ regular: '400',
77
+ medium: '500',
78
+ semibold: '600',
79
+ bold: '700'
80
+ };
81
+ export var defaultFontWeight = fontWeightMap.regular;
82
+ export var fontFamilyTokens = typographyTokens.filter(function (token) {
83
+ return token.attributes.group === 'fontFamily';
84
+ });
85
+ export function findFontFamilyValueForToken(tokenName) {
86
+ var _fontFamilyTokens$fin;
87
+ // Note this will only ever be undefined if the tokens get renamed, and should never happen.
88
+ return ((_fontFamilyTokens$fin = fontFamilyTokens.find(function (token) {
89
+ return token.cleanName === tokenName;
90
+ })) === null || _fontFamilyTokens$fin === void 0 ? void 0 : _fontFamilyTokens$fin.value) || '';
91
+ }
92
+ export function notUndefined(value) {
93
+ return value !== undefined;
94
+ }
95
+ export function isValidPropertyNode(node) {
96
+ if (!isNodeOfType(node.key, 'Identifier') && !isNodeOfType(node.key, 'Literal')) {
97
+ return false;
98
+ }
99
+ return true;
100
+ }
101
+ function getTokenNode(tokenName, tokenValue) {
102
+ return callExpression({
103
+ callee: identifier({
104
+ name: 'token'
105
+ }),
106
+ arguments: [literal({
107
+ value: "'".concat(tokenName, "'")
108
+ }), literal(tokenValue)],
109
+ optional: false
110
+ });
111
+ }
112
+ export function getTokenProperty(propertyName, tokenName, tokenFallback) {
113
+ return property({
114
+ key: identifier(propertyName),
115
+ value: getTokenNode(tokenName, tokenFallback)
116
+ });
117
+ }
118
+ export function getLiteralProperty(propertyName, propertyValue) {
119
+ return property({
120
+ key: identifier(propertyName),
121
+ value: literal(propertyValue)
122
+ });
123
+ }
124
+ export function convertPropertyNodeToStringableNode(node) {
125
+ return property({
126
+ key: node.key,
127
+ value: node.value
128
+ });
129
+ }
@@ -3,4 +3,5 @@ export { Import } from './import';
3
3
  export { JSXAttribute } from './jsx-attribute';
4
4
  export { JSXElement } from './jsx-element';
5
5
  export { Object } from './object';
6
+ export { ObjectEntry } from './object-entry';
6
7
  export { Root } from './root';
@@ -0,0 +1,6 @@
1
+ import type { Rule } from 'eslint';
2
+ import type { Property, SpreadElement } from 'eslint-codemod-utils';
3
+ declare const ObjectEntry: {
4
+ deleteEntry(node: Property | SpreadElement, context: Rule.RuleContext, fixer: Rule.RuleFixer): Rule.Fix;
5
+ };
6
+ export { ObjectEntry };
@@ -14,7 +14,7 @@ declare const ASTObjectExpression: {
14
14
  */
15
15
  isFlat(node: ObjectExpression): boolean;
16
16
  /**
17
- * Returns a key-value pair like: `padding: '8px'` from: `{ padding: '8px' }`.
17
+ * Returns the first Property node from an Object that matches the provided name.
18
18
  */
19
19
  getEntryByPropertyName(node: ObjectExpression, name: string): Property | undefined;
20
20
  deleteEntry(node: ObjectExpression, name: string, fixer: Rule.RuleFixer): Rule.Fix[];
@@ -32,6 +32,7 @@ export declare const configs: {
32
32
  '@atlaskit/design-system/use-href-in-link-item': string;
33
33
  '@atlaskit/design-system/use-primitives': string;
34
34
  '@atlaskit/design-system/use-primitives-text': string;
35
+ '@atlaskit/design-system/use-tokens-typography': string;
35
36
  '@atlaskit/design-system/use-visually-hidden': string;
36
37
  };
37
38
  };
@@ -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::bcb633b9d5c2def00d43b11139433c5c>>
3
+ * @codegen <<SignedSource::d90c2cf5e100daf98915f9467f2e5663>>
4
4
  * @codegenCommand yarn workspace @atlaskit/eslint-plugin-design-system codegen
5
5
  */
6
6
  declare const _default: {
@@ -35,6 +35,7 @@ declare const _default: {
35
35
  '@atlaskit/design-system/use-href-in-link-item': string;
36
36
  '@atlaskit/design-system/use-primitives': string;
37
37
  '@atlaskit/design-system/use-primitives-text': string;
38
+ '@atlaskit/design-system/use-tokens-typography': string;
38
39
  '@atlaskit/design-system/use-visually-hidden': string;
39
40
  };
40
41
  };
@@ -1,4 +1,4 @@
1
- export type Domains = ('color' | 'spacing' | 'typography' | 'shape')[];
1
+ export type Domains = ('color' | 'spacing' | 'shape')[];
2
2
  export type RuleConfig = {
3
3
  domains: Domains;
4
4
  applyImport?: boolean;
@@ -1,5 +1,5 @@
1
1
  import type { Rule } from 'eslint';
2
- import { EslintNode, ObjectExpression, TaggedTemplateExpression } from 'eslint-codemod-utils';
2
+ import { EslintNode, ObjectExpression, Property, SpreadElement, TaggedTemplateExpression } from 'eslint-codemod-utils';
3
3
  import { Domains } from './types';
4
4
  export type ProcessedCSSLines = [string, string][];
5
5
  export declare function insertTokensImport(fixer: Rule.RuleFixer): Rule.Fix;
@@ -16,8 +16,8 @@ export declare const isSpacingProperty: (propertyName: string) => boolean;
16
16
  * For input `-${gridSize / 2}px ${token(...)} 18px -> [`-${gridSize / 2}px`, `${token(...)}`, `18px`]
17
17
  */
18
18
  export declare const splitShorthandValues: (str: string) => string[];
19
- export declare const getValueFromShorthand: (str: unknown) => any[];
20
- export declare const getValue: (node: EslintNode, context: Rule.RuleContext) => string | number | any[] | null | undefined;
19
+ export declare const getValueFromShorthand: (str: unknown) => (string | number)[];
20
+ export declare const getValue: (node: EslintNode, context: Rule.RuleContext) => string | number | (string | number)[] | null | undefined;
21
21
  export declare const getRawExpression: (node: EslintNode, context: Rule.RuleContext) => string | null;
22
22
  /**
23
23
  * @example
@@ -43,34 +43,33 @@ export declare const isAuto: (value: string | number | boolean | RegExp | null |
43
43
  export declare const convertHyphenatedNameToCamelCase: (prop: string) => string;
44
44
  /**
45
45
  * @param node
46
- * @returns The furthest parent node that is on the same line as the input node
46
+ * @returns The furthest parent node that is on the same line as the input node.
47
47
  */
48
48
  export declare const findParentNodeForLine: (node: Rule.Node) => Rule.Node;
49
49
  /**
50
- * Returns an array of domains that are relevant to the provided property based on the rule options
50
+ * Returns an array of domains that are relevant to the provided property based on the rule options.
51
51
  * @param propertyName camelCase CSS property
52
- * @param targetOptions Array containing the types of properties that should be included in the rule
52
+ * @param targetOptions Array containing the types of properties that should be included in the rule.
53
53
  * @example
54
54
  * ```
55
55
  * propertyName: padding, targetOptions: ['spacing'] -> returns ['spacing']
56
- * propertyName: fontWeight, targetOptions: ['spacing', 'typography'] -> returns ['typography']
57
- * propertyName: backgroundColor, targetOptions: ['spacing', 'typography'] -> returns []
56
+ * propertyName: backgroundColor, targetOptions: ['spacing'] -> returns []
58
57
  * propertyName: backgroundColor, targetOptions: ['color', 'spacing'] -> returns ['color']
59
58
  * ```
60
59
  */
61
60
  export declare function getDomainsForProperty(propertyName: string, targetOptions: Domains): Domains;
62
61
  /**
63
62
  * Function that removes JS comments from a string of code,
64
- * sometimes makers will have single or multiline comments in their tagged template literals styles, this can mess with our parsing logic
63
+ * sometimes makers will have single or multiline comments in their tagged template literals styles, this can mess with our parsing logic.
65
64
  */
66
65
  export declare function cleanComments(str: string): string;
67
66
  /**
68
67
  * Returns an array of tuples representing a processed css within `TaggedTemplateExpression` node.
69
- * each element of the array is a tuple `[string, string]`,
68
+ * Each element of the array is a tuple `[string, string]`,
70
69
  * where the first element is the processed css line with computed values
71
- * and the second element of the tuple is the original css line from source
72
- * @param node TaggedTemplateExpression node
73
- * @param context Rule.RuleContext
70
+ * and the second element of the tuple is the original css line from source.
71
+ * @param node TaggedTemplateExpression node.
72
+ * @param context Rule.RuleContext.
74
73
  * @example
75
74
  * ```
76
75
  * `[['padding: 8', 'padding: ${gridSize()}'], ['margin: 6', 'margin: 6px' ]]`
@@ -91,13 +90,13 @@ export declare function getTokenNodeForValue(propertyName: string, value: string
91
90
  export declare function getFontSizeValueInScope(cssProperties: ProcessedCSSLines): number | undefined;
92
91
  /**
93
92
  * Attempts to remove all non-essential words & characters from a style block.
94
- * Including selectors and queries
93
+ * Including selectors and queries.
95
94
  * @param styleString string of css properties
96
95
  */
97
96
  export declare function splitCssProperties(styleString: string): string[];
98
97
  /**
99
- * returns whether the current string is a token value
100
- * @param originalVaue string representing a css property value e.g 1em, 12px
98
+ * Returns whether the current string is a token value.
99
+ * @param originalVaue string representing a css property value e.g 1em, 12px.
101
100
  */
102
101
  export declare function isTokenValueString(originalValue: string): boolean;
103
102
  export declare function includesTokenString(originalValue: string): boolean;
@@ -106,17 +105,18 @@ export declare function includesTokenString(originalValue: string): boolean;
106
105
  *
107
106
  * -> for pixels this '8px'
108
107
  * -> for weights '400'
109
- * -> for family 'Arial'
108
+ * -> for family 'Arial'.
110
109
  *
111
110
  * @internal
112
111
  */
113
- export declare function normaliseValue(propertyName: string, value: string): string;
112
+ export declare function normaliseValue(propertyName: string, value: string | number): string;
114
113
  export declare function findTokenNameByPropertyValue(propertyName: string, value: string): string | undefined;
115
114
  /**
116
115
  * Returns a stringifiable node with the token expression corresponding to its matching token.
117
- * if no token found for the pair the function returns undefined
118
- * @param propertyName string camelCased css property
119
- * @param value the computed value e.g '8px' -> '8'
116
+ * If no token found for the pair the function returns undefined.
117
+ * @param propertyName string camelCased css property.
118
+ * @param value The computed value e.g '8px' -> '8'.
120
119
  */
121
120
  export declare function getTokenReplacement(propertyName: string, value: string): import("eslint-codemod-utils").StringableASTNode<import("estree").SimpleCallExpression> | undefined;
122
- export declare function getFontSizeFromNode(parentNode: ObjectExpression & Rule.NodeParentExtension, context: Rule.RuleContext): any;
121
+ export declare function getPropertyNodeFromParent(property: string, parentNode: ObjectExpression & Rule.NodeParentExtension): Property | SpreadElement | undefined;
122
+ export declare function getValueForPropertyNode(propertyNode: Property | SpreadElement, context: Rule.RuleContext): string | number | null | undefined;
@@ -32,6 +32,7 @@ declare const _default: {
32
32
  'use-href-in-link-item': import("eslint").Rule.RuleModule;
33
33
  'use-primitives': import("eslint").Rule.RuleModule;
34
34
  'use-primitives-text': import("eslint").Rule.RuleModule;
35
+ 'use-tokens-typography': import("eslint").Rule.RuleModule;
35
36
  'use-visually-hidden': import("eslint").Rule.RuleModule;
36
37
  };
37
38
  export default _default;
@@ -1,4 +1,4 @@
1
- type Pattern = 'compiled-css-function' | 'compiled-styled-object' | 'css-template-literal' | 'css-property-with-tokens' | 'css-property-multiple-values' | 'multiple-properties' | 'dimension-properties';
1
+ type Pattern = 'compiled-css-function' | 'compiled-styled-object' | 'css-template-literal' | 'css-property-with-tokens' | 'css-property-multiple-values' | 'multiple-properties' | 'dimension-properties' | 'jsx-order-fix';
2
2
  export interface RuleConfig {
3
3
  patterns: Pattern[];
4
4
  }
@@ -3,5 +3,7 @@ import { JSXOpeningElement } from 'eslint-codemod-utils';
3
3
  /**
4
4
  * Given a component name finds its JSX usages and performs some
5
5
  * additional validations to ensure transformation can be done correctly
6
+ *
7
+ * anyOrder: if true, the order of the references doesn't matter (JSX or style declaration)
6
8
  */
7
- export declare const findValidJsxUsageToTransform: (componentName: string, scope: Scope.Scope) => (JSXOpeningElement & Rule.NodeParentExtension) | undefined;
9
+ export declare const findValidJsxUsageToTransform: (componentName: string, scope: Scope.Scope, anyOrder?: boolean) => (JSXOpeningElement & Rule.NodeParentExtension) | undefined;
@@ -20,6 +20,6 @@ export declare const CompiledStyled: {
20
20
  * All required validation steps have been taken care of before this
21
21
  * transformer is called, so it just goes ahead providing all necessary fixes
22
22
  */
23
- _fix(refs: Refs, context: Rule.RuleContext): (fixer: Rule.RuleFixer) => Rule.Fix[];
23
+ _fix(refs: Refs, context: Rule.RuleContext): Rule.ReportFixer;
24
24
  };
25
25
  export {};
@@ -5,12 +5,11 @@ interface MetaData {
5
5
  context: Rule.RuleContext;
6
6
  config: RuleConfig;
7
7
  }
8
- type FixFunction = (fixer: Rule.RuleFixer) => Rule.Fix[];
9
8
  export declare const EmotionCSS: {
10
9
  lint(node: Rule.Node, { context, config }: MetaData): void;
11
10
  _check(node: Rule.Node, { context, config }: MetaData): boolean;
12
11
  _fix(node: JSXElement, { context }: {
13
12
  context: Rule.RuleContext;
14
- }): FixFunction;
13
+ }): Rule.ReportFixer;
15
14
  };
16
15
  export {};
@@ -1,6 +1,7 @@
1
1
  type Pattern = 'paragraph-elements' | 'span-elements' | 'strong-elements' | 'emphasis-elements';
2
2
  export interface RuleConfig {
3
3
  patterns: Pattern[];
4
+ inheritColor: boolean;
4
5
  }
5
6
  export declare const getConfig: (overrides: Partial<RuleConfig>) => Required<RuleConfig>;
6
7
  export {};
@@ -1,5 +1,11 @@
1
1
  import type { Rule } from 'eslint';
2
2
  import { JSXElement } from 'eslint-codemod-utils';
3
+ import { RuleConfig } from '../config';
4
+ export type MetaData = {
5
+ context: Rule.RuleContext;
6
+ config: RuleConfig;
7
+ };
3
8
  export declare function updateTestIdAttributeFix(node: JSXElement, fixer: Rule.RuleFixer): Rule.Fix | undefined;
9
+ export declare function addColorInheritAttributeFix(node: JSXElement, config: RuleConfig, fixer: Rule.RuleFixer): Rule.Fix | undefined;
4
10
  export declare const allowedAttrs: string[];
5
11
  export declare function hasTextChildrenOnly(node: JSXElement): boolean;
@@ -1,16 +1,8 @@
1
1
  import type { Rule } from 'eslint';
2
2
  import { JSXElement } from 'eslint-codemod-utils';
3
- import { RuleConfig } from '../config';
4
- interface MetaData {
5
- context: Rule.RuleContext;
6
- config: RuleConfig;
7
- }
8
- type FixFunction = (fixer: Rule.RuleFixer) => Rule.Fix[];
3
+ import { type MetaData } from './common';
9
4
  export declare const EmphasisElements: {
10
5
  lint(node: Rule.Node, { context, config }: MetaData): void;
11
6
  _check(node: JSXElement, { context, config }: MetaData): boolean;
12
- _fix(node: JSXElement, { context }: {
13
- context: Rule.RuleContext;
14
- }): FixFunction;
7
+ _fix(node: JSXElement, { context, config }: MetaData): Rule.ReportFixer;
15
8
  };
16
- export {};
@@ -1,17 +1,12 @@
1
1
  import type { Rule } from 'eslint';
2
2
  import { JSXElement } from 'eslint-codemod-utils';
3
- import { RuleConfig } from '../config';
4
- type MetaData = {
5
- context: Rule.RuleContext;
6
- config: RuleConfig;
7
- };
3
+ import { type MetaData } from './common';
8
4
  type CheckResult = {
9
5
  success: boolean;
10
6
  refs: {
11
7
  siblings: JSXElement['children'];
12
8
  };
13
9
  };
14
- type FixFunction = (fixer: Rule.RuleFixer) => Rule.Fix[];
15
10
  export declare const ParagraphElements: {
16
11
  lint(node: Rule.Node, { context, config }: MetaData): void;
17
12
  _check(node: JSXElement & {
@@ -19,14 +14,11 @@ export declare const ParagraphElements: {
19
14
  }, { context, config }: MetaData): CheckResult;
20
15
  _fixSingle(node: JSXElement & {
21
16
  parent: Rule.Node;
22
- }, { context }: {
23
- context: Rule.RuleContext;
24
- }): FixFunction;
17
+ }, { context, config }: MetaData): Rule.ReportFixer;
25
18
  _fixMultiple(node: JSXElement & {
26
19
  parent: Rule.Node;
27
- }, { context, refs }: {
28
- context: Rule.RuleContext;
20
+ }, { context, config, refs }: MetaData & {
29
21
  refs: CheckResult['refs'];
30
- }): FixFunction;
22
+ }): Rule.ReportFixer;
31
23
  };
32
24
  export {};
@@ -1,16 +1,8 @@
1
1
  import type { Rule } from 'eslint';
2
2
  import { JSXElement } from 'eslint-codemod-utils';
3
- import { RuleConfig } from '../config';
4
- interface MetaData {
5
- context: Rule.RuleContext;
6
- config: RuleConfig;
7
- }
8
- type FixFunction = (fixer: Rule.RuleFixer) => Rule.Fix[];
3
+ import { type MetaData } from './common';
9
4
  export declare const SpanElements: {
10
5
  lint(node: Rule.Node, { context, config }: MetaData): void;
11
6
  _check(node: JSXElement, { context, config }: MetaData): boolean;
12
- _fix(node: JSXElement, { context }: {
13
- context: Rule.RuleContext;
14
- }): FixFunction;
7
+ _fix(node: JSXElement, { context, config }: MetaData): Rule.ReportFixer;
15
8
  };
16
- export {};