@atlaskit/eslint-plugin-design-system 4.4.2 → 4.4.5
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.
- package/CHANGELOG.md +18 -0
- package/constellation/index/examples.mdx +5 -0
- package/constellation/index/props.mdx +0 -0
- package/constellation/index/usage.mdx +5 -0
- package/dist/cjs/rules/ensure-design-token-usage/index.js +3 -2
- package/dist/cjs/rules/no-deprecated-apis/index.js +5 -7
- package/dist/cjs/rules/no-deprecated-imports/paths.js +1 -1
- package/dist/cjs/rules/no-unsafe-design-token-usage/index.js +4 -2
- package/dist/cjs/rules/use-visually-hidden/fix-jsx.js +3 -3
- package/dist/cjs/rules/use-visually-hidden/index.js +5 -3
- package/dist/cjs/rules/utils/get-import-node-by-source.js +0 -2
- package/dist/cjs/rules/utils/is-node.js +5 -21
- package/dist/cjs/version.json +1 -1
- package/dist/es2019/rules/ensure-design-token-usage/index.js +2 -2
- package/dist/es2019/rules/no-deprecated-apis/index.js +4 -6
- package/dist/es2019/rules/no-deprecated-imports/paths.js +1 -1
- package/dist/es2019/rules/no-unsafe-design-token-usage/index.js +3 -2
- package/dist/es2019/rules/use-visually-hidden/fix-jsx.js +2 -2
- package/dist/es2019/rules/use-visually-hidden/index.js +5 -4
- package/dist/es2019/rules/utils/get-import-node-by-source.js +0 -2
- package/dist/es2019/rules/utils/is-node.js +2 -16
- package/dist/es2019/version.json +1 -1
- package/dist/esm/rules/ensure-design-token-usage/index.js +2 -2
- package/dist/esm/rules/no-deprecated-apis/index.js +4 -6
- package/dist/esm/rules/no-deprecated-imports/paths.js +1 -1
- package/dist/esm/rules/no-unsafe-design-token-usage/index.js +3 -2
- package/dist/esm/rules/use-visually-hidden/fix-jsx.js +2 -2
- package/dist/esm/rules/use-visually-hidden/index.js +5 -4
- package/dist/esm/rules/utils/get-import-node-by-source.js +0 -2
- package/dist/esm/rules/utils/is-node.js +2 -16
- package/dist/esm/version.json +1 -1
- package/dist/types/rules/use-visually-hidden/utils.d.ts +1 -1
- package/dist/types/rules/utils/get-import-node-by-source.d.ts +1 -1
- package/dist/types/rules/utils/is-node.d.ts +3 -7
- package/package.json +13 -4
- package/dist/cjs/rules/utils/remove-named-import.js +0 -29
- package/dist/es2019/rules/utils/remove-named-import.js +0 -16
- package/dist/esm/rules/utils/remove-named-import.js +0 -20
- package/dist/types/rules/utils/remove-named-import.d.ts +0 -8
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,23 @@
|
|
|
1
1
|
# @atlaskit/eslint-plugin-design-system
|
|
2
2
|
|
|
3
|
+
## 4.4.5
|
|
4
|
+
|
|
5
|
+
### Patch Changes
|
|
6
|
+
|
|
7
|
+
- [`344784eec9e`](https://bitbucket.org/atlassian/atlassian-frontend/commits/344784eec9e) - Fix linting error message for focusRing import
|
|
8
|
+
|
|
9
|
+
## 4.4.4
|
|
10
|
+
|
|
11
|
+
### Patch Changes
|
|
12
|
+
|
|
13
|
+
- [`55a212b8b01`](https://bitbucket.org/atlassian/atlassian-frontend/commits/55a212b8b01) - Adds an additional rule for DS users to opt into to using 'noop' as a common reference rather than rewriting anonymous functions.
|
|
14
|
+
|
|
15
|
+
## 4.4.3
|
|
16
|
+
|
|
17
|
+
### Patch Changes
|
|
18
|
+
|
|
19
|
+
- [`cb2392f6d33`](https://bitbucket.org/atlassian/atlassian-frontend/commits/cb2392f6d33) - Upgrade to TypeScript 4.2.4
|
|
20
|
+
|
|
3
21
|
## 4.4.2
|
|
4
22
|
|
|
5
23
|
### Patch Changes
|
|
File without changes
|
|
@@ -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 _isColor = require("../utils/is-color");
|
|
9
11
|
|
|
10
12
|
var _isElevation = require("../utils/is-elevation");
|
|
@@ -30,8 +32,7 @@ var getTokenSuggestion = function getTokenSuggestion(node, reference, config) {
|
|
|
30
32
|
shouldReturnSuggestion: !(0, _isNode.isDecendantOfGlobalToken)(node) && config.shouldEnforceFallbacks === true,
|
|
31
33
|
desc: "Convert to token with fallback",
|
|
32
34
|
fix: function fix(fixer) {
|
|
33
|
-
return fixer.replaceText(node,
|
|
34
|
-
node.parent.type === 'JSXAttribute' ? "{token('', ".concat(reference, ")}") : "token('', ".concat(reference, ")"));
|
|
35
|
+
return fixer.replaceText(node, (0, _eslintCodemodUtils.isNodeOfType)(node.parent, 'JSXAttribute') ? "{token('', ".concat(reference, ")}") : "token('', ".concat(reference, ")"));
|
|
35
36
|
}
|
|
36
37
|
}].filter(filterSuggestion);
|
|
37
38
|
};
|
|
@@ -5,11 +5,10 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
5
5
|
});
|
|
6
6
|
exports.default = void 0;
|
|
7
7
|
|
|
8
|
-
var
|
|
8
|
+
var _eslintCodemodUtils = require("eslint-codemod-utils");
|
|
9
9
|
|
|
10
|
-
var
|
|
10
|
+
var _getImportNodeBySource = require("../utils/get-import-node-by-source");
|
|
11
11
|
|
|
12
|
-
// eslint-disable-next-line import/no-unresolved
|
|
13
12
|
var unsafeOverridesConfig = {
|
|
14
13
|
cssFn: ['@atlaskit/menu', '@atlaskit/side-navigation'],
|
|
15
14
|
overrides: ['@atlaskit/drawer', '@atlaskit/menu', '@atlaskit/side-navigation']
|
|
@@ -40,7 +39,7 @@ var rule = {
|
|
|
40
39
|
|
|
41
40
|
return JSXAttribute;
|
|
42
41
|
}(function (node) {
|
|
43
|
-
var _node$name
|
|
42
|
+
var _node$name;
|
|
44
43
|
|
|
45
44
|
if (!unsafeOverrides.includes(node === null || node === void 0 ? void 0 : (_node$name = node.name) === null || _node$name === void 0 ? void 0 : _node$name.name)) {
|
|
46
45
|
return;
|
|
@@ -49,9 +48,8 @@ var rule = {
|
|
|
49
48
|
var source = context.getSourceCode();
|
|
50
49
|
var bannedApi = node.name.name; // traverse the tree to the nearest JSX Element and get its name
|
|
51
50
|
|
|
52
|
-
var closesetJSXElement = (0,
|
|
53
|
-
|
|
54
|
-
var jsxElementName = closesetJSXElement === null || closesetJSXElement === void 0 ? void 0 : (_closesetJSXElement$n = closesetJSXElement.name) === null || _closesetJSXElement$n === void 0 ? void 0 : _closesetJSXElement$n.name;
|
|
51
|
+
var closesetJSXElement = (0, _eslintCodemodUtils.closestOfType)(node, 'JSXOpeningElement');
|
|
52
|
+
var jsxElementName = (0, _eslintCodemodUtils.isNodeOfType)(closesetJSXElement === null || closesetJSXElement === void 0 ? void 0 : closesetJSXElement.name, 'JSXIdentifier') && closesetJSXElement.name.name;
|
|
55
53
|
|
|
56
54
|
if (!jsxElementName) {
|
|
57
55
|
return;
|
|
@@ -12,7 +12,7 @@ var namedThemeExports = [{
|
|
|
12
12
|
message: 'The visuallyHidden mixin is deprecated. Please use `@atlaskit/visually-hidden` instead.'
|
|
13
13
|
}, {
|
|
14
14
|
importName: 'focusRing',
|
|
15
|
-
message: 'The focusRing mixin is deprecated. Please use `@atlaskit/
|
|
15
|
+
message: 'The focusRing mixin is deprecated. Please use `@atlaskit/focus-ring` instead.'
|
|
16
16
|
}];
|
|
17
17
|
exports.namedThemeExports = namedThemeExports;
|
|
18
18
|
var restrictedPaths = [{
|
|
@@ -7,6 +7,8 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
7
7
|
});
|
|
8
8
|
exports.default = void 0;
|
|
9
9
|
|
|
10
|
+
var _eslintCodemodUtils = require("eslint-codemod-utils");
|
|
11
|
+
|
|
10
12
|
var _renameMapping = _interopRequireDefault(require("@atlaskit/tokens/rename-mapping"));
|
|
11
13
|
|
|
12
14
|
var _tokenIds = require("@atlaskit/tokens/token-ids");
|
|
@@ -40,7 +42,7 @@ var rule = {
|
|
|
40
42
|
var config = context.options[0] || defaultConfig;
|
|
41
43
|
return {
|
|
42
44
|
'TaggedTemplateExpression[tag.name="css"],TaggedTemplateExpression[tag.object.name="styled"]': function TaggedTemplateExpressionTagNameCssTaggedTemplateExpressionTagObjectNameStyled(node) {
|
|
43
|
-
if (node
|
|
45
|
+
if (!(0, _eslintCodemodUtils.isNodeOfType)(node, 'TaggedTemplateExpression')) {
|
|
44
46
|
return;
|
|
45
47
|
}
|
|
46
48
|
|
|
@@ -91,7 +93,7 @@ var rule = {
|
|
|
91
93
|
}
|
|
92
94
|
},
|
|
93
95
|
'CallExpression[callee.name="token"]': function CallExpressionCalleeNameToken(node) {
|
|
94
|
-
if (node
|
|
96
|
+
if (!(0, _eslintCodemodUtils.isNodeOfType)(node, 'CallExpression')) {
|
|
95
97
|
return;
|
|
96
98
|
}
|
|
97
99
|
|
|
@@ -5,9 +5,9 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
5
5
|
});
|
|
6
6
|
exports.default = void 0;
|
|
7
7
|
|
|
8
|
-
var
|
|
8
|
+
var _eslintCodemodUtils = require("eslint-codemod-utils");
|
|
9
9
|
|
|
10
|
-
var
|
|
10
|
+
var _getImportNodeBySource = require("../utils/get-import-node-by-source");
|
|
11
11
|
|
|
12
12
|
var _constants = require("./constants");
|
|
13
13
|
|
|
@@ -23,7 +23,7 @@ var _default = function _default(source, node) {
|
|
|
23
23
|
return [];
|
|
24
24
|
}
|
|
25
25
|
|
|
26
|
-
var jsxOpeningElement = (0,
|
|
26
|
+
var jsxOpeningElement = (0, _eslintCodemodUtils.closestOfType)(node, 'JSXOpeningElement');
|
|
27
27
|
|
|
28
28
|
if (visuallyHiddenNode) {
|
|
29
29
|
fixes.push(fixer.replaceText(jsxOpeningElement, visuallyHiddenNode.specifiers[0].local.name));
|
|
@@ -9,6 +9,8 @@ exports.default = void 0;
|
|
|
9
9
|
|
|
10
10
|
var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
|
|
11
11
|
|
|
12
|
+
var _eslintCodemodUtils = require("eslint-codemod-utils");
|
|
13
|
+
|
|
12
14
|
var _isNode = require("../utils/is-node");
|
|
13
15
|
|
|
14
16
|
var _fixJsx = _interopRequireDefault(require("./fix-jsx"));
|
|
@@ -37,7 +39,7 @@ var rule = {
|
|
|
37
39
|
var source = context.getSourceCode();
|
|
38
40
|
return {
|
|
39
41
|
ImportDeclaration: function ImportDeclaration(node) {
|
|
40
|
-
var isThemeNode = node
|
|
42
|
+
var isThemeNode = (0, _eslintCodemodUtils.hasImportDeclaration)(node, '@atlaskit/theme') || (0, _eslintCodemodUtils.hasImportDeclaration)(node, '@atlaskit/theme/constants');
|
|
41
43
|
|
|
42
44
|
if (!isThemeNode) {
|
|
43
45
|
return;
|
|
@@ -89,7 +91,7 @@ var rule = {
|
|
|
89
91
|
import: "".concat(node.source.value),
|
|
90
92
|
local: visuallyHiddenOrAssistive.local.name
|
|
91
93
|
},
|
|
92
|
-
fix: (0, _fixVanilla.default)(source, (0,
|
|
94
|
+
fix: (0, _fixVanilla.default)(source, (0, _eslintCodemodUtils.closestOfType)(idNode.parent, 'TaggedTemplateExpression'))
|
|
93
95
|
});
|
|
94
96
|
}
|
|
95
97
|
}
|
|
@@ -155,7 +157,7 @@ var rule = {
|
|
|
155
157
|
}
|
|
156
158
|
},
|
|
157
159
|
'TaggedTemplateExpression[tag.name="css"],TaggedTemplateExpression[tag.object.name="styled"]': function TaggedTemplateExpressionTagNameCssTaggedTemplateExpressionTagObjectNameStyled(node) {
|
|
158
|
-
if (node
|
|
160
|
+
if (!(0, _eslintCodemodUtils.isNodeOfType)(node, 'TaggedTemplateExpression')) {
|
|
159
161
|
return;
|
|
160
162
|
}
|
|
161
163
|
|
|
@@ -3,7 +3,9 @@
|
|
|
3
3
|
Object.defineProperty(exports, "__esModule", {
|
|
4
4
|
value: true
|
|
5
5
|
});
|
|
6
|
-
exports.isStyledTemplateNode = exports.isStyledObjectNode = exports.isDecendantOfType = exports.isDecendantOfStyleJsxAttribute = exports.isDecendantOfStyleBlock = exports.isDecendantOfGlobalToken = exports.isChildOfType =
|
|
6
|
+
exports.isStyledTemplateNode = exports.isStyledObjectNode = exports.isDecendantOfType = exports.isDecendantOfStyleJsxAttribute = exports.isDecendantOfStyleBlock = exports.isDecendantOfGlobalToken = exports.isChildOfType = void 0;
|
|
7
|
+
|
|
8
|
+
var _eslintCodemodUtils = require("eslint-codemod-utils");
|
|
7
9
|
|
|
8
10
|
var isDecendantOfGlobalToken = function isDecendantOfGlobalToken(node) {
|
|
9
11
|
if (node.type === 'CallExpression' && node.callee.type === 'Identifier' && node.callee.name === 'token') {
|
|
@@ -112,25 +114,7 @@ var isDecendantOfStyleBlock = function isDecendantOfStyleBlock(node) {
|
|
|
112
114
|
exports.isDecendantOfStyleBlock = isDecendantOfStyleBlock;
|
|
113
115
|
|
|
114
116
|
var isChildOfType = function isChildOfType(node, type) {
|
|
115
|
-
return node.parent
|
|
116
|
-
};
|
|
117
|
-
/**
|
|
118
|
-
* Given a node, walk up the tree until there is no parent OR a common ancestor of the correct type is found
|
|
119
|
-
*/
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
exports.isChildOfType = isChildOfType;
|
|
123
|
-
|
|
124
|
-
var getClosestNodeOfType = function getClosestNodeOfType(node, type) {
|
|
125
|
-
if (!node) {
|
|
126
|
-
return node;
|
|
127
|
-
}
|
|
128
|
-
|
|
129
|
-
if (node.type === type) {
|
|
130
|
-
return node;
|
|
131
|
-
}
|
|
132
|
-
|
|
133
|
-
return getClosestNodeOfType(node.parent, type);
|
|
117
|
+
return (0, _eslintCodemodUtils.isNodeOfType)(node.parent, type);
|
|
134
118
|
};
|
|
135
119
|
|
|
136
|
-
exports.
|
|
120
|
+
exports.isChildOfType = isChildOfType;
|
package/dist/cjs/version.json
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { isNodeOfType } from 'eslint-codemod-utils';
|
|
1
2
|
import { includesHardCodedColor, isHardCodedColor, isLegacyColor, isLegacyNamedColor } from '../utils/is-color';
|
|
2
3
|
import { isLegacyElevation } from '../utils/is-elevation';
|
|
3
4
|
import { isChildOfType, isDecendantOfGlobalToken, isDecendantOfStyleBlock, isDecendantOfStyleJsxAttribute, isDecendantOfType } from '../utils/is-node';
|
|
@@ -14,8 +15,7 @@ const getTokenSuggestion = (node, reference, config) => [{
|
|
|
14
15
|
}, {
|
|
15
16
|
shouldReturnSuggestion: !isDecendantOfGlobalToken(node) && config.shouldEnforceFallbacks === true,
|
|
16
17
|
desc: `Convert to token with fallback`,
|
|
17
|
-
fix: fixer => fixer.replaceText(node,
|
|
18
|
-
node.parent.type === 'JSXAttribute' ? `{token('', ${reference})}` : `token('', ${reference})`)
|
|
18
|
+
fix: fixer => fixer.replaceText(node, isNodeOfType(node.parent, 'JSXAttribute') ? `{token('', ${reference})}` : `token('', ${reference})`)
|
|
19
19
|
}].filter(filterSuggestion);
|
|
20
20
|
|
|
21
21
|
const filterSuggestion = ({
|
|
@@ -1,6 +1,5 @@
|
|
|
1
|
-
|
|
1
|
+
import { closestOfType, isNodeOfType } from 'eslint-codemod-utils';
|
|
2
2
|
import { getImportedNodeBySource } from '../utils/get-import-node-by-source';
|
|
3
|
-
import { getClosestNodeOfType } from '../utils/is-node';
|
|
4
3
|
const unsafeOverridesConfig = {
|
|
5
4
|
cssFn: ['@atlaskit/menu', '@atlaskit/side-navigation'],
|
|
6
5
|
overrides: ['@atlaskit/drawer', '@atlaskit/menu', '@atlaskit/side-navigation']
|
|
@@ -22,7 +21,7 @@ const rule = {
|
|
|
22
21
|
return {
|
|
23
22
|
// find JSX atribute - find name of attribute - get source and find relevant identifiers.
|
|
24
23
|
JSXAttribute(node) {
|
|
25
|
-
var _node$name
|
|
24
|
+
var _node$name;
|
|
26
25
|
|
|
27
26
|
if (!unsafeOverrides.includes(node === null || node === void 0 ? void 0 : (_node$name = node.name) === null || _node$name === void 0 ? void 0 : _node$name.name)) {
|
|
28
27
|
return;
|
|
@@ -31,9 +30,8 @@ const rule = {
|
|
|
31
30
|
const source = context.getSourceCode();
|
|
32
31
|
const bannedApi = node.name.name; // traverse the tree to the nearest JSX Element and get its name
|
|
33
32
|
|
|
34
|
-
const closesetJSXElement =
|
|
35
|
-
|
|
36
|
-
const jsxElementName = closesetJSXElement === null || closesetJSXElement === void 0 ? void 0 : (_closesetJSXElement$n = closesetJSXElement.name) === null || _closesetJSXElement$n === void 0 ? void 0 : _closesetJSXElement$n.name;
|
|
33
|
+
const closesetJSXElement = closestOfType(node, 'JSXOpeningElement');
|
|
34
|
+
const jsxElementName = isNodeOfType(closesetJSXElement === null || closesetJSXElement === void 0 ? void 0 : closesetJSXElement.name, 'JSXIdentifier') && closesetJSXElement.name.name;
|
|
37
35
|
|
|
38
36
|
if (!jsxElementName) {
|
|
39
37
|
return;
|
|
@@ -6,7 +6,7 @@ export const namedThemeExports = [{
|
|
|
6
6
|
message: 'The visuallyHidden mixin is deprecated. Please use `@atlaskit/visually-hidden` instead.'
|
|
7
7
|
}, {
|
|
8
8
|
importName: 'focusRing',
|
|
9
|
-
message: 'The focusRing mixin is deprecated. Please use `@atlaskit/
|
|
9
|
+
message: 'The focusRing mixin is deprecated. Please use `@atlaskit/focus-ring` instead.'
|
|
10
10
|
}];
|
|
11
11
|
export const restrictedPaths = [{
|
|
12
12
|
path: '@atlaskit/navigation-next',
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { isNodeOfType } from 'eslint-codemod-utils';
|
|
1
2
|
import renameMapping from '@atlaskit/tokens/rename-mapping';
|
|
2
3
|
import { getTokenId } from '@atlaskit/tokens/token-ids';
|
|
3
4
|
import tokens from '@atlaskit/tokens/token-names';
|
|
@@ -49,7 +50,7 @@ token('color.background.blanket');
|
|
|
49
50
|
const config = context.options[0] || defaultConfig;
|
|
50
51
|
return {
|
|
51
52
|
'TaggedTemplateExpression[tag.name="css"],TaggedTemplateExpression[tag.object.name="styled"]': node => {
|
|
52
|
-
if (node
|
|
53
|
+
if (!isNodeOfType(node, 'TaggedTemplateExpression')) {
|
|
53
54
|
return;
|
|
54
55
|
}
|
|
55
56
|
|
|
@@ -96,7 +97,7 @@ token('color.background.blanket');
|
|
|
96
97
|
}
|
|
97
98
|
},
|
|
98
99
|
'CallExpression[callee.name="token"]': node => {
|
|
99
|
-
if (node
|
|
100
|
+
if (!isNodeOfType(node, 'CallExpression')) {
|
|
100
101
|
return;
|
|
101
102
|
}
|
|
102
103
|
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
+
import { closestOfType } from 'eslint-codemod-utils';
|
|
1
2
|
import { getImportedNodeBySource } from '../utils/get-import-node-by-source';
|
|
2
|
-
import { getClosestNodeOfType } from '../utils/is-node';
|
|
3
3
|
import { IMPORT_NAME, VISUALLY_HIDDEN_IMPORT, VISUALLY_HIDDEN_SOURCE } from './constants';
|
|
4
4
|
import { getFirstImport } from './utils';
|
|
5
5
|
export default ((source, node) => fixer => {
|
|
@@ -11,7 +11,7 @@ export default ((source, node) => fixer => {
|
|
|
11
11
|
return [];
|
|
12
12
|
}
|
|
13
13
|
|
|
14
|
-
const jsxOpeningElement =
|
|
14
|
+
const jsxOpeningElement = closestOfType(node, 'JSXOpeningElement');
|
|
15
15
|
|
|
16
16
|
if (visuallyHiddenNode) {
|
|
17
17
|
fixes.push(fixer.replaceText(jsxOpeningElement, visuallyHiddenNode.specifiers[0].local.name));
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
/* eslint-disable @atlaskit/design-system/use-visually-hidden */
|
|
2
|
-
import {
|
|
2
|
+
import { closestOfType, hasImportDeclaration, isNodeOfType } from 'eslint-codemod-utils';
|
|
3
|
+
import { isStyledObjectNode, isStyledTemplateNode } from '../utils/is-node';
|
|
3
4
|
import fixJsx from './fix-jsx';
|
|
4
5
|
import fixVanilla from './fix-vanilla';
|
|
5
6
|
import { countMatchingKeyValues, getObjectLikeness, makeTemplateLiteralIntoEntries } from './utils';
|
|
@@ -23,7 +24,7 @@ const rule = {
|
|
|
23
24
|
const source = context.getSourceCode();
|
|
24
25
|
return {
|
|
25
26
|
ImportDeclaration(node) {
|
|
26
|
-
const isThemeNode = node
|
|
27
|
+
const isThemeNode = hasImportDeclaration(node, '@atlaskit/theme') || hasImportDeclaration(node, '@atlaskit/theme/constants');
|
|
27
28
|
|
|
28
29
|
if (!isThemeNode) {
|
|
29
30
|
return;
|
|
@@ -69,7 +70,7 @@ const rule = {
|
|
|
69
70
|
import: `${node.source.value}`,
|
|
70
71
|
local: visuallyHiddenOrAssistive.local.name
|
|
71
72
|
},
|
|
72
|
-
fix: fixVanilla(source,
|
|
73
|
+
fix: fixVanilla(source, closestOfType(idNode.parent, 'TaggedTemplateExpression'))
|
|
73
74
|
});
|
|
74
75
|
}
|
|
75
76
|
}
|
|
@@ -138,7 +139,7 @@ const rule = {
|
|
|
138
139
|
},
|
|
139
140
|
|
|
140
141
|
'TaggedTemplateExpression[tag.name="css"],TaggedTemplateExpression[tag.object.name="styled"]': node => {
|
|
141
|
-
if (node
|
|
142
|
+
if (!isNodeOfType(node, 'TaggedTemplateExpression')) {
|
|
142
143
|
return;
|
|
143
144
|
}
|
|
144
145
|
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { isNodeOfType } from 'eslint-codemod-utils';
|
|
1
2
|
export const isDecendantOfGlobalToken = node => {
|
|
2
3
|
if (node.type === 'CallExpression' && node.callee.type === 'Identifier' && node.callee.name === 'token') {
|
|
3
4
|
return true;
|
|
@@ -76,19 +77,4 @@ export const isDecendantOfStyleBlock = node => {
|
|
|
76
77
|
|
|
77
78
|
return false;
|
|
78
79
|
};
|
|
79
|
-
export const isChildOfType = (node, type) => node.parent
|
|
80
|
-
/**
|
|
81
|
-
* Given a node, walk up the tree until there is no parent OR a common ancestor of the correct type is found
|
|
82
|
-
*/
|
|
83
|
-
|
|
84
|
-
export const getClosestNodeOfType = (node, type) => {
|
|
85
|
-
if (!node) {
|
|
86
|
-
return node;
|
|
87
|
-
}
|
|
88
|
-
|
|
89
|
-
if (node.type === type) {
|
|
90
|
-
return node;
|
|
91
|
-
}
|
|
92
|
-
|
|
93
|
-
return getClosestNodeOfType(node.parent, type);
|
|
94
|
-
};
|
|
80
|
+
export const isChildOfType = (node, type) => isNodeOfType(node.parent, type);
|
package/dist/es2019/version.json
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { isNodeOfType } from 'eslint-codemod-utils';
|
|
1
2
|
import { includesHardCodedColor, isHardCodedColor, isLegacyColor, isLegacyNamedColor } from '../utils/is-color';
|
|
2
3
|
import { isLegacyElevation } from '../utils/is-elevation';
|
|
3
4
|
import { isChildOfType, isDecendantOfGlobalToken, isDecendantOfStyleBlock, isDecendantOfStyleJsxAttribute, isDecendantOfType } from '../utils/is-node';
|
|
@@ -20,8 +21,7 @@ var getTokenSuggestion = function getTokenSuggestion(node, reference, config) {
|
|
|
20
21
|
shouldReturnSuggestion: !isDecendantOfGlobalToken(node) && config.shouldEnforceFallbacks === true,
|
|
21
22
|
desc: "Convert to token with fallback",
|
|
22
23
|
fix: function fix(fixer) {
|
|
23
|
-
return fixer.replaceText(node,
|
|
24
|
-
node.parent.type === 'JSXAttribute' ? "{token('', ".concat(reference, ")}") : "token('', ".concat(reference, ")"));
|
|
24
|
+
return fixer.replaceText(node, isNodeOfType(node.parent, 'JSXAttribute') ? "{token('', ".concat(reference, ")}") : "token('', ".concat(reference, ")"));
|
|
25
25
|
}
|
|
26
26
|
}].filter(filterSuggestion);
|
|
27
27
|
};
|
|
@@ -1,6 +1,5 @@
|
|
|
1
|
-
|
|
1
|
+
import { closestOfType, isNodeOfType } from 'eslint-codemod-utils';
|
|
2
2
|
import { getImportedNodeBySource } from '../utils/get-import-node-by-source';
|
|
3
|
-
import { getClosestNodeOfType } from '../utils/is-node';
|
|
4
3
|
var unsafeOverridesConfig = {
|
|
5
4
|
cssFn: ['@atlaskit/menu', '@atlaskit/side-navigation'],
|
|
6
5
|
overrides: ['@atlaskit/drawer', '@atlaskit/menu', '@atlaskit/side-navigation']
|
|
@@ -31,7 +30,7 @@ var rule = {
|
|
|
31
30
|
|
|
32
31
|
return JSXAttribute;
|
|
33
32
|
}(function (node) {
|
|
34
|
-
var _node$name
|
|
33
|
+
var _node$name;
|
|
35
34
|
|
|
36
35
|
if (!unsafeOverrides.includes(node === null || node === void 0 ? void 0 : (_node$name = node.name) === null || _node$name === void 0 ? void 0 : _node$name.name)) {
|
|
37
36
|
return;
|
|
@@ -40,9 +39,8 @@ var rule = {
|
|
|
40
39
|
var source = context.getSourceCode();
|
|
41
40
|
var bannedApi = node.name.name; // traverse the tree to the nearest JSX Element and get its name
|
|
42
41
|
|
|
43
|
-
var closesetJSXElement =
|
|
44
|
-
|
|
45
|
-
var jsxElementName = closesetJSXElement === null || closesetJSXElement === void 0 ? void 0 : (_closesetJSXElement$n = closesetJSXElement.name) === null || _closesetJSXElement$n === void 0 ? void 0 : _closesetJSXElement$n.name;
|
|
42
|
+
var closesetJSXElement = closestOfType(node, 'JSXOpeningElement');
|
|
43
|
+
var jsxElementName = isNodeOfType(closesetJSXElement === null || closesetJSXElement === void 0 ? void 0 : closesetJSXElement.name, 'JSXIdentifier') && closesetJSXElement.name.name;
|
|
46
44
|
|
|
47
45
|
if (!jsxElementName) {
|
|
48
46
|
return;
|
|
@@ -6,7 +6,7 @@ export var namedThemeExports = [{
|
|
|
6
6
|
message: 'The visuallyHidden mixin is deprecated. Please use `@atlaskit/visually-hidden` instead.'
|
|
7
7
|
}, {
|
|
8
8
|
importName: 'focusRing',
|
|
9
|
-
message: 'The focusRing mixin is deprecated. Please use `@atlaskit/
|
|
9
|
+
message: 'The focusRing mixin is deprecated. Please use `@atlaskit/focus-ring` instead.'
|
|
10
10
|
}];
|
|
11
11
|
export var restrictedPaths = [{
|
|
12
12
|
path: '@atlaskit/navigation-next',
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { isNodeOfType } from 'eslint-codemod-utils';
|
|
1
2
|
import renameMapping from '@atlaskit/tokens/rename-mapping';
|
|
2
3
|
import { getTokenId } from '@atlaskit/tokens/token-ids';
|
|
3
4
|
import tokens from '@atlaskit/tokens/token-names';
|
|
@@ -26,7 +27,7 @@ var rule = {
|
|
|
26
27
|
var config = context.options[0] || defaultConfig;
|
|
27
28
|
return {
|
|
28
29
|
'TaggedTemplateExpression[tag.name="css"],TaggedTemplateExpression[tag.object.name="styled"]': function TaggedTemplateExpressionTagNameCssTaggedTemplateExpressionTagObjectNameStyled(node) {
|
|
29
|
-
if (node
|
|
30
|
+
if (!isNodeOfType(node, 'TaggedTemplateExpression')) {
|
|
30
31
|
return;
|
|
31
32
|
}
|
|
32
33
|
|
|
@@ -77,7 +78,7 @@ var rule = {
|
|
|
77
78
|
}
|
|
78
79
|
},
|
|
79
80
|
'CallExpression[callee.name="token"]': function CallExpressionCalleeNameToken(node) {
|
|
80
|
-
if (node
|
|
81
|
+
if (!isNodeOfType(node, 'CallExpression')) {
|
|
81
82
|
return;
|
|
82
83
|
}
|
|
83
84
|
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
+
import { closestOfType } from 'eslint-codemod-utils';
|
|
1
2
|
import { getImportedNodeBySource } from '../utils/get-import-node-by-source';
|
|
2
|
-
import { getClosestNodeOfType } from '../utils/is-node';
|
|
3
3
|
import { IMPORT_NAME, VISUALLY_HIDDEN_IMPORT, VISUALLY_HIDDEN_SOURCE } from './constants';
|
|
4
4
|
import { getFirstImport } from './utils';
|
|
5
5
|
export default (function (source, node) {
|
|
@@ -12,7 +12,7 @@ export default (function (source, node) {
|
|
|
12
12
|
return [];
|
|
13
13
|
}
|
|
14
14
|
|
|
15
|
-
var jsxOpeningElement =
|
|
15
|
+
var jsxOpeningElement = closestOfType(node, 'JSXOpeningElement');
|
|
16
16
|
|
|
17
17
|
if (visuallyHiddenNode) {
|
|
18
18
|
fixes.push(fixer.replaceText(jsxOpeningElement, visuallyHiddenNode.specifiers[0].local.name));
|
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
import _slicedToArray from "@babel/runtime/helpers/slicedToArray";
|
|
2
2
|
|
|
3
3
|
/* eslint-disable @atlaskit/design-system/use-visually-hidden */
|
|
4
|
-
import {
|
|
4
|
+
import { closestOfType, hasImportDeclaration, isNodeOfType } from 'eslint-codemod-utils';
|
|
5
|
+
import { isStyledObjectNode, isStyledTemplateNode } from '../utils/is-node';
|
|
5
6
|
import fixJsx from './fix-jsx';
|
|
6
7
|
import fixVanilla from './fix-vanilla';
|
|
7
8
|
import { countMatchingKeyValues, getObjectLikeness, makeTemplateLiteralIntoEntries } from './utils';
|
|
@@ -24,7 +25,7 @@ var rule = {
|
|
|
24
25
|
var source = context.getSourceCode();
|
|
25
26
|
return {
|
|
26
27
|
ImportDeclaration: function ImportDeclaration(node) {
|
|
27
|
-
var isThemeNode = node
|
|
28
|
+
var isThemeNode = hasImportDeclaration(node, '@atlaskit/theme') || hasImportDeclaration(node, '@atlaskit/theme/constants');
|
|
28
29
|
|
|
29
30
|
if (!isThemeNode) {
|
|
30
31
|
return;
|
|
@@ -76,7 +77,7 @@ var rule = {
|
|
|
76
77
|
import: "".concat(node.source.value),
|
|
77
78
|
local: visuallyHiddenOrAssistive.local.name
|
|
78
79
|
},
|
|
79
|
-
fix: fixVanilla(source,
|
|
80
|
+
fix: fixVanilla(source, closestOfType(idNode.parent, 'TaggedTemplateExpression'))
|
|
80
81
|
});
|
|
81
82
|
}
|
|
82
83
|
}
|
|
@@ -142,7 +143,7 @@ var rule = {
|
|
|
142
143
|
}
|
|
143
144
|
},
|
|
144
145
|
'TaggedTemplateExpression[tag.name="css"],TaggedTemplateExpression[tag.object.name="styled"]': function TaggedTemplateExpressionTagNameCssTaggedTemplateExpressionTagObjectNameStyled(node) {
|
|
145
|
-
if (node
|
|
146
|
+
if (!isNodeOfType(node, 'TaggedTemplateExpression')) {
|
|
146
147
|
return;
|
|
147
148
|
}
|
|
148
149
|
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { isNodeOfType } from 'eslint-codemod-utils';
|
|
1
2
|
export var isDecendantOfGlobalToken = function isDecendantOfGlobalToken(node) {
|
|
2
3
|
if (node.type === 'CallExpression' && node.callee.type === 'Identifier' && node.callee.name === 'token') {
|
|
3
4
|
return true;
|
|
@@ -87,20 +88,5 @@ export var isDecendantOfStyleBlock = function isDecendantOfStyleBlock(node) {
|
|
|
87
88
|
return false;
|
|
88
89
|
};
|
|
89
90
|
export var isChildOfType = function isChildOfType(node, type) {
|
|
90
|
-
return node.parent
|
|
91
|
-
};
|
|
92
|
-
/**
|
|
93
|
-
* Given a node, walk up the tree until there is no parent OR a common ancestor of the correct type is found
|
|
94
|
-
*/
|
|
95
|
-
|
|
96
|
-
export var getClosestNodeOfType = function getClosestNodeOfType(node, type) {
|
|
97
|
-
if (!node) {
|
|
98
|
-
return node;
|
|
99
|
-
}
|
|
100
|
-
|
|
101
|
-
if (node.type === type) {
|
|
102
|
-
return node;
|
|
103
|
-
}
|
|
104
|
-
|
|
105
|
-
return getClosestNodeOfType(node.parent, type);
|
|
91
|
+
return isNodeOfType(node.parent, type);
|
|
106
92
|
};
|
package/dist/esm/version.json
CHANGED
|
@@ -18,7 +18,7 @@ export declare type ReferenceObject = typeof referenceObject;
|
|
|
18
18
|
/**
|
|
19
19
|
* Returns the first import in the esprima AST.
|
|
20
20
|
*/
|
|
21
|
-
export declare const getFirstImport: (source: SourceCode) => import("estree").
|
|
21
|
+
export declare const getFirstImport: (source: SourceCode) => import("estree").Statement | import("estree").ModuleDeclaration | import("estree").Directive | undefined;
|
|
22
22
|
/**
|
|
23
23
|
* Takes a template literal and returns [key, value] array of the css properties
|
|
24
24
|
*/
|
|
@@ -1,13 +1,9 @@
|
|
|
1
1
|
import type { Rule } from 'eslint';
|
|
2
|
-
import
|
|
2
|
+
import { CallExpression, Expression, TaggedTemplateExpression } from 'eslint-codemod-utils';
|
|
3
3
|
export declare const isDecendantOfGlobalToken: (node: Rule.Node) => boolean;
|
|
4
4
|
export declare const isDecendantOfType: (node: Rule.Node, type: Rule.Node['type'], skipNode?: boolean) => boolean;
|
|
5
5
|
export declare const isDecendantOfStyleJsxAttribute: (node: Rule.Node) => boolean;
|
|
6
|
-
export declare const isStyledTemplateNode: (node?:
|
|
7
|
-
export declare const isStyledObjectNode: (node?:
|
|
6
|
+
export declare const isStyledTemplateNode: (node?: Expression | null | undefined) => node is TaggedTemplateExpression;
|
|
7
|
+
export declare const isStyledObjectNode: (node?: Expression | null | undefined) => node is CallExpression;
|
|
8
8
|
export declare const isDecendantOfStyleBlock: (node: Rule.Node) => boolean;
|
|
9
9
|
export declare const isChildOfType: (node: Rule.Node, type: Rule.Node['type']) => boolean;
|
|
10
|
-
/**
|
|
11
|
-
* Given a node, walk up the tree until there is no parent OR a common ancestor of the correct type is found
|
|
12
|
-
*/
|
|
13
|
-
export declare const getClosestNodeOfType: (node: Rule.Node, type: Rule.NodeTypes) => Rule.Node;
|
package/package.json
CHANGED
|
@@ -1,13 +1,19 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@atlaskit/eslint-plugin-design-system",
|
|
3
|
-
"
|
|
3
|
+
"description": "The essential plugin for use with the Atlassian Design System.",
|
|
4
|
+
"version": "4.4.5",
|
|
4
5
|
"author": "Atlassian Pty Ltd",
|
|
5
6
|
"publishConfig": {
|
|
6
7
|
"registry": "https://registry.npmjs.org/"
|
|
7
8
|
},
|
|
8
9
|
"atlassian": {
|
|
9
10
|
"team": "Design System Team",
|
|
10
|
-
"releaseModel": "scheduled"
|
|
11
|
+
"releaseModel": "scheduled",
|
|
12
|
+
"website": {
|
|
13
|
+
"name": "ESLint plugin",
|
|
14
|
+
"category": "Tooling",
|
|
15
|
+
"draft": true
|
|
16
|
+
}
|
|
11
17
|
},
|
|
12
18
|
"repository": "https://bitbucket.org/atlassian/atlassian-frontend",
|
|
13
19
|
"main": "dist/cjs/index.js",
|
|
@@ -21,9 +27,11 @@
|
|
|
21
27
|
},
|
|
22
28
|
"dependencies": {
|
|
23
29
|
"@atlaskit/tokens": "^0.9.0",
|
|
24
|
-
"@babel/runtime": "^7.0.0"
|
|
30
|
+
"@babel/runtime": "^7.0.0",
|
|
31
|
+
"eslint-codemod-utils": "^1.3.2"
|
|
25
32
|
},
|
|
26
33
|
"devDependencies": {
|
|
34
|
+
"@atlaskit/ds-lib": "^1.4.1",
|
|
27
35
|
"@atlaskit/theme": "^12.0.2",
|
|
28
36
|
"@atlassian/atlassian-frontend-prettier-config-1.0.1": "npm:@atlassian/atlassian-frontend-prettier-config@1.0.1",
|
|
29
37
|
"@emotion/core": "^10.0.9",
|
|
@@ -32,7 +40,7 @@
|
|
|
32
40
|
"react": "^16.8.0",
|
|
33
41
|
"ts-node": "^10.0.0",
|
|
34
42
|
"tsconfig-paths": "^3.9.0",
|
|
35
|
-
"typescript": "
|
|
43
|
+
"typescript": "4.2.4"
|
|
36
44
|
},
|
|
37
45
|
"techstack": {
|
|
38
46
|
"@atlassian/frontend": {
|
|
@@ -48,5 +56,6 @@
|
|
|
48
56
|
]
|
|
49
57
|
}
|
|
50
58
|
},
|
|
59
|
+
"homepage": "https://atlassian.design/components/eslint-plugin-design-system",
|
|
51
60
|
"prettier": "@atlassian/atlassian-frontend-prettier-config-1.0.1"
|
|
52
61
|
}
|
|
@@ -1,29 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
|
|
3
|
-
Object.defineProperty(exports, "__esModule", {
|
|
4
|
-
value: true
|
|
5
|
-
});
|
|
6
|
-
exports.removeNamedImport = void 0;
|
|
7
|
-
|
|
8
|
-
/* eslint-disable import/no-unresolved */
|
|
9
|
-
|
|
10
|
-
/**
|
|
11
|
-
* @param {SourceCode} source The eslint source
|
|
12
|
-
* @param {string} path The path specified to find
|
|
13
|
-
* @returns FixerObject
|
|
14
|
-
*/
|
|
15
|
-
var removeNamedImport = function removeNamedImport(fixer, importNode, name) {
|
|
16
|
-
var filteredSpecifers = importNode.specifiers.filter(function (node) {
|
|
17
|
-
return node.type === 'ImportSpecifier' && node.imported.name !== name;
|
|
18
|
-
});
|
|
19
|
-
|
|
20
|
-
if (filteredSpecifers.length) {
|
|
21
|
-
return fixer.remove(importNode.specifiers.find(function (node) {
|
|
22
|
-
return node.type === 'ImportSpecifier' && node.imported.name === name;
|
|
23
|
-
}));
|
|
24
|
-
}
|
|
25
|
-
|
|
26
|
-
return fixer.remove(importNode);
|
|
27
|
-
};
|
|
28
|
-
|
|
29
|
-
exports.removeNamedImport = removeNamedImport;
|
|
@@ -1,16 +0,0 @@
|
|
|
1
|
-
/* eslint-disable import/no-unresolved */
|
|
2
|
-
|
|
3
|
-
/**
|
|
4
|
-
* @param {SourceCode} source The eslint source
|
|
5
|
-
* @param {string} path The path specified to find
|
|
6
|
-
* @returns FixerObject
|
|
7
|
-
*/
|
|
8
|
-
export const removeNamedImport = (fixer, importNode, name) => {
|
|
9
|
-
const filteredSpecifers = importNode.specifiers.filter(node => node.type === 'ImportSpecifier' && node.imported.name !== name);
|
|
10
|
-
|
|
11
|
-
if (filteredSpecifers.length) {
|
|
12
|
-
return fixer.remove(importNode.specifiers.find(node => node.type === 'ImportSpecifier' && node.imported.name === name));
|
|
13
|
-
}
|
|
14
|
-
|
|
15
|
-
return fixer.remove(importNode);
|
|
16
|
-
};
|
|
@@ -1,20 +0,0 @@
|
|
|
1
|
-
/* eslint-disable import/no-unresolved */
|
|
2
|
-
|
|
3
|
-
/**
|
|
4
|
-
* @param {SourceCode} source The eslint source
|
|
5
|
-
* @param {string} path The path specified to find
|
|
6
|
-
* @returns FixerObject
|
|
7
|
-
*/
|
|
8
|
-
export var removeNamedImport = function removeNamedImport(fixer, importNode, name) {
|
|
9
|
-
var filteredSpecifers = importNode.specifiers.filter(function (node) {
|
|
10
|
-
return node.type === 'ImportSpecifier' && node.imported.name !== name;
|
|
11
|
-
});
|
|
12
|
-
|
|
13
|
-
if (filteredSpecifers.length) {
|
|
14
|
-
return fixer.remove(importNode.specifiers.find(function (node) {
|
|
15
|
-
return node.type === 'ImportSpecifier' && node.imported.name === name;
|
|
16
|
-
}));
|
|
17
|
-
}
|
|
18
|
-
|
|
19
|
-
return fixer.remove(importNode);
|
|
20
|
-
};
|
|
@@ -1,8 +0,0 @@
|
|
|
1
|
-
import type { Rule } from 'eslint';
|
|
2
|
-
import type { ImportDeclaration } from 'estree';
|
|
3
|
-
/**
|
|
4
|
-
* @param {SourceCode} source The eslint source
|
|
5
|
-
* @param {string} path The path specified to find
|
|
6
|
-
* @returns FixerObject
|
|
7
|
-
*/
|
|
8
|
-
export declare const removeNamedImport: (fixer: Rule.RuleFixer, importNode: ImportDeclaration, name: string) => Rule.Fix;
|