@atlaskit/eslint-plugin-design-system 8.18.1 → 8.19.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.
- package/CHANGELOG.md +6 -0
- package/README.md +1 -0
- package/constellation/index/usage.mdx +51 -0
- package/dist/cjs/presets/all.codegen.js +2 -1
- package/dist/cjs/presets/recommended.codegen.js +2 -1
- package/dist/cjs/rules/index.codegen.js +3 -1
- package/dist/cjs/rules/no-unsafe-style-overrides/index.js +74 -0
- package/dist/cjs/rules/utils/get-import-node-by-source.js +49 -1
- package/dist/cjs/rules/utils/jsx.js +17 -0
- package/dist/es2019/presets/all.codegen.js +2 -1
- package/dist/es2019/presets/recommended.codegen.js +2 -1
- package/dist/es2019/rules/index.codegen.js +3 -1
- package/dist/es2019/rules/no-unsafe-style-overrides/index.js +68 -0
- package/dist/es2019/rules/utils/get-import-node-by-source.js +27 -0
- package/dist/es2019/rules/utils/jsx.js +16 -0
- package/dist/esm/presets/all.codegen.js +2 -1
- package/dist/esm/presets/recommended.codegen.js +2 -1
- package/dist/esm/rules/index.codegen.js +3 -1
- package/dist/esm/rules/no-unsafe-style-overrides/index.js +68 -0
- package/dist/esm/rules/utils/get-import-node-by-source.js +48 -0
- package/dist/esm/rules/utils/jsx.js +16 -0
- package/dist/types/index.codegen.d.ts +2 -0
- package/dist/types/presets/all.codegen.d.ts +2 -1
- package/dist/types/presets/recommended.codegen.d.ts +2 -1
- package/dist/types/rules/index.codegen.d.ts +1 -0
- package/dist/types/rules/no-unsafe-style-overrides/index.d.ts +2 -0
- package/dist/types/rules/utils/get-import-node-by-source.d.ts +9 -0
- package/dist/types/rules/utils/jsx.d.ts +2 -1
- package/dist/types-ts4.5/index.codegen.d.ts +2 -0
- package/dist/types-ts4.5/presets/all.codegen.d.ts +2 -1
- package/dist/types-ts4.5/presets/recommended.codegen.d.ts +2 -1
- package/dist/types-ts4.5/rules/index.codegen.d.ts +1 -0
- package/dist/types-ts4.5/rules/no-unsafe-style-overrides/index.d.ts +2 -0
- package/dist/types-ts4.5/rules/utils/get-import-node-by-source.d.ts +9 -0
- package/dist/types-ts4.5/rules/utils/jsx.d.ts +2 -1
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,11 @@
|
|
|
1
1
|
# @atlaskit/eslint-plugin-design-system
|
|
2
2
|
|
|
3
|
+
## 8.19.0
|
|
4
|
+
|
|
5
|
+
### Minor Changes
|
|
6
|
+
|
|
7
|
+
- [#64899](https://stash.atlassian.com/projects/CONFCLOUD/repos/confluence-frontend/pull-requests/64899) [`442878c001f9`](https://stash.atlassian.com/projects/CONFCLOUD/repos/confluence-frontend/commits/442878c001f9) - Add `no-unsafe-style-overrides`. This rule marks any usage of unsafe style overrides as violations, such as usage of `css`, `theme`, and `cssFn` props.
|
|
8
|
+
|
|
3
9
|
## 8.18.1
|
|
4
10
|
|
|
5
11
|
### Patch Changes
|
package/README.md
CHANGED
|
@@ -62,6 +62,7 @@ module.exports = {
|
|
|
62
62
|
| <a href="./src/rules/no-nested-styles/README.md">no-nested-styles</a> | Disallows use of nested styles in `css` functions. | Yes | | |
|
|
63
63
|
| <a href="./src/rules/no-physical-properties/README.md">no-physical-properties</a> | Disallow physical properties and values in `css` function calls. | | Yes | |
|
|
64
64
|
| <a href="./src/rules/no-unsafe-design-token-usage/README.md">no-unsafe-design-token-usage</a> | Enforces design token usage is statically and locally analyzable. | Yes | Yes | |
|
|
65
|
+
| <a href="./src/rules/no-unsafe-style-overrides/README.md">no-unsafe-style-overrides</a> | Discourage usage of unsafe style overrides used against the Atlassian Design System. | Yes | | |
|
|
65
66
|
| <a href="./src/rules/no-unsupported-drag-and-drop-libraries/README.md">no-unsupported-drag-and-drop-libraries</a> | Disallow importing unsupported drag and drop modules. | Yes | | |
|
|
66
67
|
| <a href="./src/rules/prefer-primitives/README.md">prefer-primitives</a> | Increase awareness of primitive components via code hints. Strictly used for education purposes and discoverability. To enforce usage please refer to the `use-primitives` rule. | | | |
|
|
67
68
|
| <a href="./src/rules/use-drawer-label/README.md">use-drawer-label</a> | Encourages to provide accessible name for Atlassian Design System Drawer component. | Yes | | Yes |
|
|
@@ -26,6 +26,7 @@ This plugin contains rules that should be used when working with the [Atlassian
|
|
|
26
26
|
| <a href="#no-nested-styles">no-nested-styles</a> | Disallows use of nested styles in `css` functions. | Yes | | |
|
|
27
27
|
| <a href="#no-physical-properties">no-physical-properties</a> | Disallow physical properties and values in `css` function calls. | | Yes | |
|
|
28
28
|
| <a href="#no-unsafe-design-token-usage">no-unsafe-design-token-usage</a> | Enforces design token usage is statically and locally analyzable. | Yes | Yes | |
|
|
29
|
+
| <a href="#no-unsafe-style-overrides">no-unsafe-style-overrides</a> | Discourage usage of unsafe style overrides used against the Atlassian Design System. | Yes | | |
|
|
29
30
|
| <a href="#no-unsupported-drag-and-drop-libraries">no-unsupported-drag-and-drop-libraries</a> | Disallow importing unsupported drag and drop modules. | Yes | | |
|
|
30
31
|
| <a href="#prefer-primitives">prefer-primitives</a> | Increase awareness of primitive components via code hints. Strictly used for education purposes and discoverability. To enforce usage please refer to the `use-primitives` rule. | | | |
|
|
31
32
|
| <a href="#use-drawer-label">use-drawer-label</a> | Encourages to provide accessible name for Atlassian Design System Drawer component. | Yes | | Yes |
|
|
@@ -666,6 +667,56 @@ This rule comes with options to aid in migrating to design tokens.
|
|
|
666
667
|
When `true` the rule will mark token function usage as violations when fallbacks aren't defined.
|
|
667
668
|
When `false` the rule will mark token function usage as violations when fallbacks are defined.
|
|
668
669
|
|
|
670
|
+
## no-unsafe-style-overrides
|
|
671
|
+
|
|
672
|
+
Unsafe style overrides cause friction and incidents when internals of the component you're overriding change. They're inherently unbounded and everything is API that can change at a moments notice.
|
|
673
|
+
|
|
674
|
+
Instead, lean on composition, primitive components, and safe style overrides via the `xcss` prop where component authors declare what styles they want to support.
|
|
675
|
+
|
|
676
|
+
<h3>Examples</h3>
|
|
677
|
+
|
|
678
|
+
#### Incorrect
|
|
679
|
+
|
|
680
|
+
```tsx
|
|
681
|
+
import Button from '@atlaskit/button';
|
|
682
|
+
|
|
683
|
+
<Button css={{ fontWeight: 500 }}>foo</Button>;
|
|
684
|
+
^^^
|
|
685
|
+
```
|
|
686
|
+
|
|
687
|
+
```tsx
|
|
688
|
+
import { LinkItem } from '@atlaskit/menu';
|
|
689
|
+
|
|
690
|
+
<LinkItem cssFn={() => ({ '> div > div': { padding: 2 } })} />;
|
|
691
|
+
^^^^^
|
|
692
|
+
```
|
|
693
|
+
|
|
694
|
+
```tsx
|
|
695
|
+
import { ButtonItem } from '@atlaskit/side-navigation';
|
|
696
|
+
|
|
697
|
+
<ButtonItem className="text-neutral-400" />;
|
|
698
|
+
^^^^^^^^^
|
|
699
|
+
```
|
|
700
|
+
|
|
701
|
+
#### Correct
|
|
702
|
+
|
|
703
|
+
```tsx
|
|
704
|
+
<Button>
|
|
705
|
+
<strong>foo</strong>
|
|
706
|
+
</Button>
|
|
707
|
+
```
|
|
708
|
+
|
|
709
|
+
```tsx
|
|
710
|
+
const styles = css({ padding: 'var(--ds-space-100)' });
|
|
711
|
+
|
|
712
|
+
<Box as="a" xcss={styles}>
|
|
713
|
+
<Stack>
|
|
714
|
+
<Inline />
|
|
715
|
+
<Inline />
|
|
716
|
+
</Stack>
|
|
717
|
+
</Box>;
|
|
718
|
+
```
|
|
719
|
+
|
|
669
720
|
## no-unsupported-drag-and-drop-libraries
|
|
670
721
|
|
|
671
722
|
We encourage the use of Pragmatic drag and drop to power all drag and drop experiences - from table to external files. Pragmatic drag and drop is a performance optimised drag and drop framework that has been designed to power any drag and drop experience on any tech stack. Please avoid using alternative drag and drop libraries as it will lead to poorer performance, increased maintenance costs, (likely) worse accessibility and fragmented user experiences. See https://staging.atlassian.design/components/pragmatic-drag-and-drop/
|
|
@@ -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::
|
|
9
|
+
* @codegen <<SignedSource::6efa1e48692b3e287d6dfcd500a5f0ab>>
|
|
10
10
|
* @codegenCommand yarn workspace @atlaskit/eslint-plugin-design-system codegen
|
|
11
11
|
*/
|
|
12
12
|
var _default = exports.default = {
|
|
@@ -25,6 +25,7 @@ var _default = exports.default = {
|
|
|
25
25
|
'@atlaskit/design-system/no-nested-styles': 'error',
|
|
26
26
|
'@atlaskit/design-system/no-physical-properties': 'error',
|
|
27
27
|
'@atlaskit/design-system/no-unsafe-design-token-usage': 'error',
|
|
28
|
+
'@atlaskit/design-system/no-unsafe-style-overrides': 'warn',
|
|
28
29
|
'@atlaskit/design-system/no-unsupported-drag-and-drop-libraries': 'error',
|
|
29
30
|
'@atlaskit/design-system/prefer-primitives': 'warn',
|
|
30
31
|
'@atlaskit/design-system/use-drawer-label': 'warn',
|
|
@@ -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::
|
|
9
|
+
* @codegen <<SignedSource::be810d87ec2d253e3b053dc06ff1b99a>>
|
|
10
10
|
* @codegenCommand yarn workspace @atlaskit/eslint-plugin-design-system codegen
|
|
11
11
|
*/
|
|
12
12
|
var _default = exports.default = {
|
|
@@ -21,6 +21,7 @@ var _default = exports.default = {
|
|
|
21
21
|
'@atlaskit/design-system/no-deprecated-imports': 'error',
|
|
22
22
|
'@atlaskit/design-system/no-nested-styles': 'error',
|
|
23
23
|
'@atlaskit/design-system/no-unsafe-design-token-usage': 'error',
|
|
24
|
+
'@atlaskit/design-system/no-unsafe-style-overrides': 'warn',
|
|
24
25
|
'@atlaskit/design-system/no-unsupported-drag-and-drop-libraries': 'error',
|
|
25
26
|
'@atlaskit/design-system/use-drawer-label': 'warn',
|
|
26
27
|
'@atlaskit/design-system/use-heading-level-in-spotlight-card': 'warn',
|
|
@@ -18,6 +18,7 @@ var _noMargin = _interopRequireDefault(require("./no-margin"));
|
|
|
18
18
|
var _noNestedStyles = _interopRequireDefault(require("./no-nested-styles"));
|
|
19
19
|
var _noPhysicalProperties = _interopRequireDefault(require("./no-physical-properties"));
|
|
20
20
|
var _noUnsafeDesignTokenUsage = _interopRequireDefault(require("./no-unsafe-design-token-usage"));
|
|
21
|
+
var _noUnsafeStyleOverrides = _interopRequireDefault(require("./no-unsafe-style-overrides"));
|
|
21
22
|
var _noUnsupportedDragAndDropLibraries = _interopRequireDefault(require("./no-unsupported-drag-and-drop-libraries"));
|
|
22
23
|
var _preferPrimitives = _interopRequireDefault(require("./prefer-primitives"));
|
|
23
24
|
var _useDrawerLabel = _interopRequireDefault(require("./use-drawer-label"));
|
|
@@ -27,7 +28,7 @@ var _usePrimitives = _interopRequireDefault(require("./use-primitives"));
|
|
|
27
28
|
var _useVisuallyHidden = _interopRequireDefault(require("./use-visually-hidden"));
|
|
28
29
|
/**
|
|
29
30
|
* THIS FILE WAS CREATED VIA CODEGEN DO NOT MODIFY {@see http://go/af-codegen}
|
|
30
|
-
* @codegen <<SignedSource::
|
|
31
|
+
* @codegen <<SignedSource::ab1f5b129d07027c228dbd79da5f3572>>
|
|
31
32
|
* @codegenCommand yarn workspace @atlaskit/eslint-plugin-design-system codegen
|
|
32
33
|
*/
|
|
33
34
|
var _default = exports.default = {
|
|
@@ -44,6 +45,7 @@ var _default = exports.default = {
|
|
|
44
45
|
'no-nested-styles': _noNestedStyles.default,
|
|
45
46
|
'no-physical-properties': _noPhysicalProperties.default,
|
|
46
47
|
'no-unsafe-design-token-usage': _noUnsafeDesignTokenUsage.default,
|
|
48
|
+
'no-unsafe-style-overrides': _noUnsafeStyleOverrides.default,
|
|
47
49
|
'no-unsupported-drag-and-drop-libraries': _noUnsupportedDragAndDropLibraries.default,
|
|
48
50
|
'prefer-primitives': _preferPrimitives.default,
|
|
49
51
|
'use-drawer-label': _useDrawerLabel.default,
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.default = void 0;
|
|
7
|
+
var _eslintCodemodUtils = require("eslint-codemod-utils");
|
|
8
|
+
var _createRule = require("../utils/create-rule");
|
|
9
|
+
var _getImportNodeBySource = require("../utils/get-import-node-by-source");
|
|
10
|
+
var _jsx = require("../utils/jsx");
|
|
11
|
+
var unsafeOverrides = ['css', 'className', 'theme', 'cssFn', 'styles'];
|
|
12
|
+
var rule = (0, _createRule.createLintRule)({
|
|
13
|
+
meta: {
|
|
14
|
+
docs: {
|
|
15
|
+
recommended: true,
|
|
16
|
+
// This should be an error but for now we're rolling it out as warn so we can actually get it into codebases.
|
|
17
|
+
severity: 'warn',
|
|
18
|
+
description: 'Discourage usage of unsafe style overrides used against the Atlassian Design System.'
|
|
19
|
+
},
|
|
20
|
+
name: 'no-unsafe-style-overrides',
|
|
21
|
+
messages: {
|
|
22
|
+
noUnsafeStyledOverride: 'Wrapping {{componentName}} in a styled component encourages unsafe style overrides which cause friction and incidents when its internals change.',
|
|
23
|
+
noUnsafeOverrides: 'The {{propName}} prop encourages unsafe style overrides which cause friction and incidents when {{componentName}} internals change.'
|
|
24
|
+
}
|
|
25
|
+
},
|
|
26
|
+
create: function create(context) {
|
|
27
|
+
return {
|
|
28
|
+
CallExpression: function CallExpression(node) {
|
|
29
|
+
if (node.callee.type !== 'Identifier' || !node.callee.name.toLowerCase().includes('styled')) {
|
|
30
|
+
// Ignore functions that don't look like styled().
|
|
31
|
+
return;
|
|
32
|
+
}
|
|
33
|
+
var firstArgument = node.arguments[0];
|
|
34
|
+
if (!firstArgument || firstArgument.type !== 'Identifier') {
|
|
35
|
+
return;
|
|
36
|
+
}
|
|
37
|
+
var moduleName = (0, _getImportNodeBySource.getModuleOfIdentifier)(context.getSourceCode(), firstArgument.name);
|
|
38
|
+
if (!moduleName || !moduleName.moduleName.startsWith('@atlaskit')) {
|
|
39
|
+
// Ignore styled calls with non-atlaskit components.
|
|
40
|
+
return;
|
|
41
|
+
}
|
|
42
|
+
context.report({
|
|
43
|
+
node: firstArgument,
|
|
44
|
+
messageId: 'noUnsafeStyledOverride',
|
|
45
|
+
data: {
|
|
46
|
+
componentName: moduleName.importName
|
|
47
|
+
}
|
|
48
|
+
});
|
|
49
|
+
},
|
|
50
|
+
JSXAttribute: function JSXAttribute(node) {
|
|
51
|
+
if (!(0, _eslintCodemodUtils.isNodeOfType)(node, 'JSXAttribute') || !(node.parent && (0, _eslintCodemodUtils.isNodeOfType)(node.parent, 'JSXOpeningElement'))) {
|
|
52
|
+
return;
|
|
53
|
+
}
|
|
54
|
+
var elementName = (0, _jsx.getJSXElementName)(node.parent);
|
|
55
|
+
var moduleName = (0, _getImportNodeBySource.getModuleOfIdentifier)(context.getSourceCode(), elementName);
|
|
56
|
+
if (!moduleName || !moduleName.moduleName.startsWith('@atlaskit')) {
|
|
57
|
+
return;
|
|
58
|
+
}
|
|
59
|
+
var propName = typeof node.name.name === 'string' ? node.name.name : node.name.name.name;
|
|
60
|
+
if (unsafeOverrides.includes(propName)) {
|
|
61
|
+
context.report({
|
|
62
|
+
node: node,
|
|
63
|
+
messageId: 'noUnsafeOverrides',
|
|
64
|
+
data: {
|
|
65
|
+
propName: propName,
|
|
66
|
+
componentName: moduleName.importName
|
|
67
|
+
}
|
|
68
|
+
});
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
};
|
|
72
|
+
}
|
|
73
|
+
});
|
|
74
|
+
var _default = exports.default = rule;
|
|
@@ -3,7 +3,10 @@
|
|
|
3
3
|
Object.defineProperty(exports, "__esModule", {
|
|
4
4
|
value: true
|
|
5
5
|
});
|
|
6
|
-
exports.getImportedNodeBySource = void 0;
|
|
6
|
+
exports.getModuleOfIdentifier = exports.getImportedNodeBySource = void 0;
|
|
7
|
+
function _createForOfIteratorHelper(o, allowArrayLike) { var it = typeof Symbol !== "undefined" && o[Symbol.iterator] || o["@@iterator"]; if (!it) { if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { if (it) o = it; var i = 0; var F = function F() {}; return { s: F, n: function n() { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function e(_e) { throw _e; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var normalCompletion = true, didErr = false, err; return { s: function s() { it = it.call(o); }, n: function n() { var step = it.next(); normalCompletion = step.done; return step; }, e: function e(_e2) { didErr = true; err = _e2; }, f: function f() { try { if (!normalCompletion && it.return != null) it.return(); } finally { if (didErr) throw err; } } }; }
|
|
8
|
+
function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
|
|
9
|
+
function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i]; return arr2; }
|
|
7
10
|
// eslint-disable-next-line import/no-extraneous-dependencies
|
|
8
11
|
|
|
9
12
|
/**
|
|
@@ -17,4 +20,49 @@ var getImportedNodeBySource = exports.getImportedNodeBySource = function getImpo
|
|
|
17
20
|
}).find(function (node) {
|
|
18
21
|
return node.source.value === path;
|
|
19
22
|
});
|
|
23
|
+
};
|
|
24
|
+
|
|
25
|
+
/**
|
|
26
|
+
* Returns the module name of an identifier, if one exists.
|
|
27
|
+
*
|
|
28
|
+
* getModuleOfIdentifier(source, 'Button'); // "@atlaskit/button"
|
|
29
|
+
*/
|
|
30
|
+
var getModuleOfIdentifier = exports.getModuleOfIdentifier = function getModuleOfIdentifier(source, identifierName) {
|
|
31
|
+
var _iterator = _createForOfIteratorHelper(source.ast.body),
|
|
32
|
+
_step;
|
|
33
|
+
try {
|
|
34
|
+
for (_iterator.s(); !(_step = _iterator.n()).done;) {
|
|
35
|
+
var node = _step.value;
|
|
36
|
+
if (node.type === 'ImportDeclaration') {
|
|
37
|
+
var _iterator2 = _createForOfIteratorHelper(node.specifiers),
|
|
38
|
+
_step2;
|
|
39
|
+
try {
|
|
40
|
+
for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) {
|
|
41
|
+
var spec = _step2.value;
|
|
42
|
+
if (spec.type === 'ImportDefaultSpecifier' && spec.local.name === identifierName) {
|
|
43
|
+
return {
|
|
44
|
+
moduleName: node.source.value + '',
|
|
45
|
+
importName: identifierName
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
if (spec.type === 'ImportSpecifier' && spec.local.name === identifierName) {
|
|
49
|
+
return {
|
|
50
|
+
moduleName: node.source.value + '',
|
|
51
|
+
importName: spec.imported.name
|
|
52
|
+
};
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
} catch (err) {
|
|
56
|
+
_iterator2.e(err);
|
|
57
|
+
} finally {
|
|
58
|
+
_iterator2.f();
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
} catch (err) {
|
|
63
|
+
_iterator.e(err);
|
|
64
|
+
} finally {
|
|
65
|
+
_iterator.f();
|
|
66
|
+
}
|
|
67
|
+
return undefined;
|
|
20
68
|
};
|
|
@@ -4,9 +4,26 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
4
4
|
value: true
|
|
5
5
|
});
|
|
6
6
|
exports.findProp = findProp;
|
|
7
|
+
exports.getJSXElementName = getJSXElementName;
|
|
7
8
|
function findProp(jsx, propName) {
|
|
8
9
|
var labelProp = jsx.openingElement.attributes.find(function (attr) {
|
|
9
10
|
return attr.type === 'JSXAttribute' && attr.name.name === propName;
|
|
10
11
|
});
|
|
11
12
|
return labelProp;
|
|
13
|
+
}
|
|
14
|
+
function unrollMemberExpression(exp) {
|
|
15
|
+
if (exp.type === 'JSXIdentifier') {
|
|
16
|
+
return exp.name;
|
|
17
|
+
}
|
|
18
|
+
return unrollMemberExpression(exp.object);
|
|
19
|
+
}
|
|
20
|
+
function getJSXElementName(jsx) {
|
|
21
|
+
switch (jsx.name.type) {
|
|
22
|
+
case 'JSXIdentifier':
|
|
23
|
+
return jsx.name.name;
|
|
24
|
+
case 'JSXMemberExpression':
|
|
25
|
+
return unrollMemberExpression(jsx.name.object);
|
|
26
|
+
case 'JSXNamespacedName':
|
|
27
|
+
return jsx.name.namespace.name;
|
|
28
|
+
}
|
|
12
29
|
}
|
|
@@ -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::
|
|
3
|
+
* @codegen <<SignedSource::6efa1e48692b3e287d6dfcd500a5f0ab>>
|
|
4
4
|
* @codegenCommand yarn workspace @atlaskit/eslint-plugin-design-system codegen
|
|
5
5
|
*/
|
|
6
6
|
export default {
|
|
@@ -19,6 +19,7 @@ export default {
|
|
|
19
19
|
'@atlaskit/design-system/no-nested-styles': 'error',
|
|
20
20
|
'@atlaskit/design-system/no-physical-properties': 'error',
|
|
21
21
|
'@atlaskit/design-system/no-unsafe-design-token-usage': 'error',
|
|
22
|
+
'@atlaskit/design-system/no-unsafe-style-overrides': 'warn',
|
|
22
23
|
'@atlaskit/design-system/no-unsupported-drag-and-drop-libraries': 'error',
|
|
23
24
|
'@atlaskit/design-system/prefer-primitives': 'warn',
|
|
24
25
|
'@atlaskit/design-system/use-drawer-label': 'warn',
|
|
@@ -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::
|
|
3
|
+
* @codegen <<SignedSource::be810d87ec2d253e3b053dc06ff1b99a>>
|
|
4
4
|
* @codegenCommand yarn workspace @atlaskit/eslint-plugin-design-system codegen
|
|
5
5
|
*/
|
|
6
6
|
export default {
|
|
@@ -15,6 +15,7 @@ export default {
|
|
|
15
15
|
'@atlaskit/design-system/no-deprecated-imports': 'error',
|
|
16
16
|
'@atlaskit/design-system/no-nested-styles': 'error',
|
|
17
17
|
'@atlaskit/design-system/no-unsafe-design-token-usage': 'error',
|
|
18
|
+
'@atlaskit/design-system/no-unsafe-style-overrides': 'warn',
|
|
18
19
|
'@atlaskit/design-system/no-unsupported-drag-and-drop-libraries': 'error',
|
|
19
20
|
'@atlaskit/design-system/use-drawer-label': 'warn',
|
|
20
21
|
'@atlaskit/design-system/use-heading-level-in-spotlight-card': 'warn',
|
|
@@ -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::
|
|
3
|
+
* @codegen <<SignedSource::ab1f5b129d07027c228dbd79da5f3572>>
|
|
4
4
|
* @codegenCommand yarn workspace @atlaskit/eslint-plugin-design-system codegen
|
|
5
5
|
*/
|
|
6
6
|
import consistentCssPropUsage from './consistent-css-prop-usage';
|
|
@@ -16,6 +16,7 @@ import noMargin from './no-margin';
|
|
|
16
16
|
import noNestedStyles from './no-nested-styles';
|
|
17
17
|
import noPhysicalProperties from './no-physical-properties';
|
|
18
18
|
import noUnsafeDesignTokenUsage from './no-unsafe-design-token-usage';
|
|
19
|
+
import noUnsafeStyleOverrides from './no-unsafe-style-overrides';
|
|
19
20
|
import noUnsupportedDragAndDropLibraries from './no-unsupported-drag-and-drop-libraries';
|
|
20
21
|
import preferPrimitives from './prefer-primitives';
|
|
21
22
|
import useDrawerLabel from './use-drawer-label';
|
|
@@ -37,6 +38,7 @@ export default {
|
|
|
37
38
|
'no-nested-styles': noNestedStyles,
|
|
38
39
|
'no-physical-properties': noPhysicalProperties,
|
|
39
40
|
'no-unsafe-design-token-usage': noUnsafeDesignTokenUsage,
|
|
41
|
+
'no-unsafe-style-overrides': noUnsafeStyleOverrides,
|
|
40
42
|
'no-unsupported-drag-and-drop-libraries': noUnsupportedDragAndDropLibraries,
|
|
41
43
|
'prefer-primitives': preferPrimitives,
|
|
42
44
|
'use-drawer-label': useDrawerLabel,
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
import { isNodeOfType } from 'eslint-codemod-utils';
|
|
2
|
+
import { createLintRule } from '../utils/create-rule';
|
|
3
|
+
import { getModuleOfIdentifier } from '../utils/get-import-node-by-source';
|
|
4
|
+
import { getJSXElementName } from '../utils/jsx';
|
|
5
|
+
const unsafeOverrides = ['css', 'className', 'theme', 'cssFn', 'styles'];
|
|
6
|
+
const rule = createLintRule({
|
|
7
|
+
meta: {
|
|
8
|
+
docs: {
|
|
9
|
+
recommended: true,
|
|
10
|
+
// This should be an error but for now we're rolling it out as warn so we can actually get it into codebases.
|
|
11
|
+
severity: 'warn',
|
|
12
|
+
description: 'Discourage usage of unsafe style overrides used against the Atlassian Design System.'
|
|
13
|
+
},
|
|
14
|
+
name: 'no-unsafe-style-overrides',
|
|
15
|
+
messages: {
|
|
16
|
+
noUnsafeStyledOverride: 'Wrapping {{componentName}} in a styled component encourages unsafe style overrides which cause friction and incidents when its internals change.',
|
|
17
|
+
noUnsafeOverrides: 'The {{propName}} prop encourages unsafe style overrides which cause friction and incidents when {{componentName}} internals change.'
|
|
18
|
+
}
|
|
19
|
+
},
|
|
20
|
+
create(context) {
|
|
21
|
+
return {
|
|
22
|
+
CallExpression(node) {
|
|
23
|
+
if (node.callee.type !== 'Identifier' || !node.callee.name.toLowerCase().includes('styled')) {
|
|
24
|
+
// Ignore functions that don't look like styled().
|
|
25
|
+
return;
|
|
26
|
+
}
|
|
27
|
+
const firstArgument = node.arguments[0];
|
|
28
|
+
if (!firstArgument || firstArgument.type !== 'Identifier') {
|
|
29
|
+
return;
|
|
30
|
+
}
|
|
31
|
+
const moduleName = getModuleOfIdentifier(context.getSourceCode(), firstArgument.name);
|
|
32
|
+
if (!moduleName || !moduleName.moduleName.startsWith('@atlaskit')) {
|
|
33
|
+
// Ignore styled calls with non-atlaskit components.
|
|
34
|
+
return;
|
|
35
|
+
}
|
|
36
|
+
context.report({
|
|
37
|
+
node: firstArgument,
|
|
38
|
+
messageId: 'noUnsafeStyledOverride',
|
|
39
|
+
data: {
|
|
40
|
+
componentName: moduleName.importName
|
|
41
|
+
}
|
|
42
|
+
});
|
|
43
|
+
},
|
|
44
|
+
JSXAttribute(node) {
|
|
45
|
+
if (!isNodeOfType(node, 'JSXAttribute') || !(node.parent && isNodeOfType(node.parent, 'JSXOpeningElement'))) {
|
|
46
|
+
return;
|
|
47
|
+
}
|
|
48
|
+
const elementName = getJSXElementName(node.parent);
|
|
49
|
+
const moduleName = getModuleOfIdentifier(context.getSourceCode(), elementName);
|
|
50
|
+
if (!moduleName || !moduleName.moduleName.startsWith('@atlaskit')) {
|
|
51
|
+
return;
|
|
52
|
+
}
|
|
53
|
+
const propName = typeof node.name.name === 'string' ? node.name.name : node.name.name.name;
|
|
54
|
+
if (unsafeOverrides.includes(propName)) {
|
|
55
|
+
context.report({
|
|
56
|
+
node,
|
|
57
|
+
messageId: 'noUnsafeOverrides',
|
|
58
|
+
data: {
|
|
59
|
+
propName,
|
|
60
|
+
componentName: moduleName.importName
|
|
61
|
+
}
|
|
62
|
+
});
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
};
|
|
66
|
+
}
|
|
67
|
+
});
|
|
68
|
+
export default rule;
|
|
@@ -7,4 +7,31 @@
|
|
|
7
7
|
*/
|
|
8
8
|
export const getImportedNodeBySource = (source, path) => {
|
|
9
9
|
return source.ast.body.filter(node => node.type === 'ImportDeclaration').find(node => node.source.value === path);
|
|
10
|
+
};
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
* Returns the module name of an identifier, if one exists.
|
|
14
|
+
*
|
|
15
|
+
* getModuleOfIdentifier(source, 'Button'); // "@atlaskit/button"
|
|
16
|
+
*/
|
|
17
|
+
export const getModuleOfIdentifier = (source, identifierName) => {
|
|
18
|
+
for (const node of source.ast.body) {
|
|
19
|
+
if (node.type === 'ImportDeclaration') {
|
|
20
|
+
for (const spec of node.specifiers) {
|
|
21
|
+
if (spec.type === 'ImportDefaultSpecifier' && spec.local.name === identifierName) {
|
|
22
|
+
return {
|
|
23
|
+
moduleName: node.source.value + '',
|
|
24
|
+
importName: identifierName
|
|
25
|
+
};
|
|
26
|
+
}
|
|
27
|
+
if (spec.type === 'ImportSpecifier' && spec.local.name === identifierName) {
|
|
28
|
+
return {
|
|
29
|
+
moduleName: node.source.value + '',
|
|
30
|
+
importName: spec.imported.name
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
return undefined;
|
|
10
37
|
};
|
|
@@ -1,4 +1,20 @@
|
|
|
1
1
|
export function findProp(jsx, propName) {
|
|
2
2
|
const labelProp = jsx.openingElement.attributes.find(attr => attr.type === 'JSXAttribute' && attr.name.name === propName);
|
|
3
3
|
return labelProp;
|
|
4
|
+
}
|
|
5
|
+
function unrollMemberExpression(exp) {
|
|
6
|
+
if (exp.type === 'JSXIdentifier') {
|
|
7
|
+
return exp.name;
|
|
8
|
+
}
|
|
9
|
+
return unrollMemberExpression(exp.object);
|
|
10
|
+
}
|
|
11
|
+
export function getJSXElementName(jsx) {
|
|
12
|
+
switch (jsx.name.type) {
|
|
13
|
+
case 'JSXIdentifier':
|
|
14
|
+
return jsx.name.name;
|
|
15
|
+
case 'JSXMemberExpression':
|
|
16
|
+
return unrollMemberExpression(jsx.name.object);
|
|
17
|
+
case 'JSXNamespacedName':
|
|
18
|
+
return jsx.name.namespace.name;
|
|
19
|
+
}
|
|
4
20
|
}
|
|
@@ -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::
|
|
3
|
+
* @codegen <<SignedSource::6efa1e48692b3e287d6dfcd500a5f0ab>>
|
|
4
4
|
* @codegenCommand yarn workspace @atlaskit/eslint-plugin-design-system codegen
|
|
5
5
|
*/
|
|
6
6
|
export default {
|
|
@@ -19,6 +19,7 @@ export default {
|
|
|
19
19
|
'@atlaskit/design-system/no-nested-styles': 'error',
|
|
20
20
|
'@atlaskit/design-system/no-physical-properties': 'error',
|
|
21
21
|
'@atlaskit/design-system/no-unsafe-design-token-usage': 'error',
|
|
22
|
+
'@atlaskit/design-system/no-unsafe-style-overrides': 'warn',
|
|
22
23
|
'@atlaskit/design-system/no-unsupported-drag-and-drop-libraries': 'error',
|
|
23
24
|
'@atlaskit/design-system/prefer-primitives': 'warn',
|
|
24
25
|
'@atlaskit/design-system/use-drawer-label': 'warn',
|
|
@@ -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::
|
|
3
|
+
* @codegen <<SignedSource::be810d87ec2d253e3b053dc06ff1b99a>>
|
|
4
4
|
* @codegenCommand yarn workspace @atlaskit/eslint-plugin-design-system codegen
|
|
5
5
|
*/
|
|
6
6
|
export default {
|
|
@@ -15,6 +15,7 @@ export default {
|
|
|
15
15
|
'@atlaskit/design-system/no-deprecated-imports': 'error',
|
|
16
16
|
'@atlaskit/design-system/no-nested-styles': 'error',
|
|
17
17
|
'@atlaskit/design-system/no-unsafe-design-token-usage': 'error',
|
|
18
|
+
'@atlaskit/design-system/no-unsafe-style-overrides': 'warn',
|
|
18
19
|
'@atlaskit/design-system/no-unsupported-drag-and-drop-libraries': 'error',
|
|
19
20
|
'@atlaskit/design-system/use-drawer-label': 'warn',
|
|
20
21
|
'@atlaskit/design-system/use-heading-level-in-spotlight-card': 'warn',
|
|
@@ -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::
|
|
3
|
+
* @codegen <<SignedSource::ab1f5b129d07027c228dbd79da5f3572>>
|
|
4
4
|
* @codegenCommand yarn workspace @atlaskit/eslint-plugin-design-system codegen
|
|
5
5
|
*/
|
|
6
6
|
import consistentCssPropUsage from './consistent-css-prop-usage';
|
|
@@ -16,6 +16,7 @@ import noMargin from './no-margin';
|
|
|
16
16
|
import noNestedStyles from './no-nested-styles';
|
|
17
17
|
import noPhysicalProperties from './no-physical-properties';
|
|
18
18
|
import noUnsafeDesignTokenUsage from './no-unsafe-design-token-usage';
|
|
19
|
+
import noUnsafeStyleOverrides from './no-unsafe-style-overrides';
|
|
19
20
|
import noUnsupportedDragAndDropLibraries from './no-unsupported-drag-and-drop-libraries';
|
|
20
21
|
import preferPrimitives from './prefer-primitives';
|
|
21
22
|
import useDrawerLabel from './use-drawer-label';
|
|
@@ -37,6 +38,7 @@ export default {
|
|
|
37
38
|
'no-nested-styles': noNestedStyles,
|
|
38
39
|
'no-physical-properties': noPhysicalProperties,
|
|
39
40
|
'no-unsafe-design-token-usage': noUnsafeDesignTokenUsage,
|
|
41
|
+
'no-unsafe-style-overrides': noUnsafeStyleOverrides,
|
|
40
42
|
'no-unsupported-drag-and-drop-libraries': noUnsupportedDragAndDropLibraries,
|
|
41
43
|
'prefer-primitives': preferPrimitives,
|
|
42
44
|
'use-drawer-label': useDrawerLabel,
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
import { isNodeOfType } from 'eslint-codemod-utils';
|
|
2
|
+
import { createLintRule } from '../utils/create-rule';
|
|
3
|
+
import { getModuleOfIdentifier } from '../utils/get-import-node-by-source';
|
|
4
|
+
import { getJSXElementName } from '../utils/jsx';
|
|
5
|
+
var unsafeOverrides = ['css', 'className', 'theme', 'cssFn', 'styles'];
|
|
6
|
+
var rule = createLintRule({
|
|
7
|
+
meta: {
|
|
8
|
+
docs: {
|
|
9
|
+
recommended: true,
|
|
10
|
+
// This should be an error but for now we're rolling it out as warn so we can actually get it into codebases.
|
|
11
|
+
severity: 'warn',
|
|
12
|
+
description: 'Discourage usage of unsafe style overrides used against the Atlassian Design System.'
|
|
13
|
+
},
|
|
14
|
+
name: 'no-unsafe-style-overrides',
|
|
15
|
+
messages: {
|
|
16
|
+
noUnsafeStyledOverride: 'Wrapping {{componentName}} in a styled component encourages unsafe style overrides which cause friction and incidents when its internals change.',
|
|
17
|
+
noUnsafeOverrides: 'The {{propName}} prop encourages unsafe style overrides which cause friction and incidents when {{componentName}} internals change.'
|
|
18
|
+
}
|
|
19
|
+
},
|
|
20
|
+
create: function create(context) {
|
|
21
|
+
return {
|
|
22
|
+
CallExpression: function CallExpression(node) {
|
|
23
|
+
if (node.callee.type !== 'Identifier' || !node.callee.name.toLowerCase().includes('styled')) {
|
|
24
|
+
// Ignore functions that don't look like styled().
|
|
25
|
+
return;
|
|
26
|
+
}
|
|
27
|
+
var firstArgument = node.arguments[0];
|
|
28
|
+
if (!firstArgument || firstArgument.type !== 'Identifier') {
|
|
29
|
+
return;
|
|
30
|
+
}
|
|
31
|
+
var moduleName = getModuleOfIdentifier(context.getSourceCode(), firstArgument.name);
|
|
32
|
+
if (!moduleName || !moduleName.moduleName.startsWith('@atlaskit')) {
|
|
33
|
+
// Ignore styled calls with non-atlaskit components.
|
|
34
|
+
return;
|
|
35
|
+
}
|
|
36
|
+
context.report({
|
|
37
|
+
node: firstArgument,
|
|
38
|
+
messageId: 'noUnsafeStyledOverride',
|
|
39
|
+
data: {
|
|
40
|
+
componentName: moduleName.importName
|
|
41
|
+
}
|
|
42
|
+
});
|
|
43
|
+
},
|
|
44
|
+
JSXAttribute: function JSXAttribute(node) {
|
|
45
|
+
if (!isNodeOfType(node, 'JSXAttribute') || !(node.parent && isNodeOfType(node.parent, 'JSXOpeningElement'))) {
|
|
46
|
+
return;
|
|
47
|
+
}
|
|
48
|
+
var elementName = getJSXElementName(node.parent);
|
|
49
|
+
var moduleName = getModuleOfIdentifier(context.getSourceCode(), elementName);
|
|
50
|
+
if (!moduleName || !moduleName.moduleName.startsWith('@atlaskit')) {
|
|
51
|
+
return;
|
|
52
|
+
}
|
|
53
|
+
var propName = typeof node.name.name === 'string' ? node.name.name : node.name.name.name;
|
|
54
|
+
if (unsafeOverrides.includes(propName)) {
|
|
55
|
+
context.report({
|
|
56
|
+
node: node,
|
|
57
|
+
messageId: 'noUnsafeOverrides',
|
|
58
|
+
data: {
|
|
59
|
+
propName: propName,
|
|
60
|
+
componentName: moduleName.importName
|
|
61
|
+
}
|
|
62
|
+
});
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
};
|
|
66
|
+
}
|
|
67
|
+
});
|
|
68
|
+
export default rule;
|
|
@@ -1,3 +1,6 @@
|
|
|
1
|
+
function _createForOfIteratorHelper(o, allowArrayLike) { var it = typeof Symbol !== "undefined" && o[Symbol.iterator] || o["@@iterator"]; if (!it) { if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { if (it) o = it; var i = 0; var F = function F() {}; return { s: F, n: function n() { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function e(_e) { throw _e; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var normalCompletion = true, didErr = false, err; return { s: function s() { it = it.call(o); }, n: function n() { var step = it.next(); normalCompletion = step.done; return step; }, e: function e(_e2) { didErr = true; err = _e2; }, f: function f() { try { if (!normalCompletion && it.return != null) it.return(); } finally { if (didErr) throw err; } } }; }
|
|
2
|
+
function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
|
|
3
|
+
function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i]; return arr2; }
|
|
1
4
|
// eslint-disable-next-line import/no-extraneous-dependencies
|
|
2
5
|
|
|
3
6
|
/**
|
|
@@ -11,4 +14,49 @@ export var getImportedNodeBySource = function getImportedNodeBySource(source, pa
|
|
|
11
14
|
}).find(function (node) {
|
|
12
15
|
return node.source.value === path;
|
|
13
16
|
});
|
|
17
|
+
};
|
|
18
|
+
|
|
19
|
+
/**
|
|
20
|
+
* Returns the module name of an identifier, if one exists.
|
|
21
|
+
*
|
|
22
|
+
* getModuleOfIdentifier(source, 'Button'); // "@atlaskit/button"
|
|
23
|
+
*/
|
|
24
|
+
export var getModuleOfIdentifier = function getModuleOfIdentifier(source, identifierName) {
|
|
25
|
+
var _iterator = _createForOfIteratorHelper(source.ast.body),
|
|
26
|
+
_step;
|
|
27
|
+
try {
|
|
28
|
+
for (_iterator.s(); !(_step = _iterator.n()).done;) {
|
|
29
|
+
var node = _step.value;
|
|
30
|
+
if (node.type === 'ImportDeclaration') {
|
|
31
|
+
var _iterator2 = _createForOfIteratorHelper(node.specifiers),
|
|
32
|
+
_step2;
|
|
33
|
+
try {
|
|
34
|
+
for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) {
|
|
35
|
+
var spec = _step2.value;
|
|
36
|
+
if (spec.type === 'ImportDefaultSpecifier' && spec.local.name === identifierName) {
|
|
37
|
+
return {
|
|
38
|
+
moduleName: node.source.value + '',
|
|
39
|
+
importName: identifierName
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
if (spec.type === 'ImportSpecifier' && spec.local.name === identifierName) {
|
|
43
|
+
return {
|
|
44
|
+
moduleName: node.source.value + '',
|
|
45
|
+
importName: spec.imported.name
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
} catch (err) {
|
|
50
|
+
_iterator2.e(err);
|
|
51
|
+
} finally {
|
|
52
|
+
_iterator2.f();
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
} catch (err) {
|
|
57
|
+
_iterator.e(err);
|
|
58
|
+
} finally {
|
|
59
|
+
_iterator.f();
|
|
60
|
+
}
|
|
61
|
+
return undefined;
|
|
14
62
|
};
|
|
@@ -3,4 +3,20 @@ export function findProp(jsx, propName) {
|
|
|
3
3
|
return attr.type === 'JSXAttribute' && attr.name.name === propName;
|
|
4
4
|
});
|
|
5
5
|
return labelProp;
|
|
6
|
+
}
|
|
7
|
+
function unrollMemberExpression(exp) {
|
|
8
|
+
if (exp.type === 'JSXIdentifier') {
|
|
9
|
+
return exp.name;
|
|
10
|
+
}
|
|
11
|
+
return unrollMemberExpression(exp.object);
|
|
12
|
+
}
|
|
13
|
+
export function getJSXElementName(jsx) {
|
|
14
|
+
switch (jsx.name.type) {
|
|
15
|
+
case 'JSXIdentifier':
|
|
16
|
+
return jsx.name.name;
|
|
17
|
+
case 'JSXMemberExpression':
|
|
18
|
+
return unrollMemberExpression(jsx.name.object);
|
|
19
|
+
case 'JSXNamespacedName':
|
|
20
|
+
return jsx.name.namespace.name;
|
|
21
|
+
}
|
|
6
22
|
}
|
|
@@ -16,6 +16,7 @@ export declare const configs: {
|
|
|
16
16
|
'@atlaskit/design-system/no-nested-styles': string;
|
|
17
17
|
'@atlaskit/design-system/no-physical-properties': string;
|
|
18
18
|
'@atlaskit/design-system/no-unsafe-design-token-usage': string;
|
|
19
|
+
'@atlaskit/design-system/no-unsafe-style-overrides': string;
|
|
19
20
|
'@atlaskit/design-system/no-unsupported-drag-and-drop-libraries': string;
|
|
20
21
|
'@atlaskit/design-system/prefer-primitives': string;
|
|
21
22
|
'@atlaskit/design-system/use-drawer-label': string;
|
|
@@ -37,6 +38,7 @@ export declare const configs: {
|
|
|
37
38
|
'@atlaskit/design-system/no-deprecated-imports': string;
|
|
38
39
|
'@atlaskit/design-system/no-nested-styles': string;
|
|
39
40
|
'@atlaskit/design-system/no-unsafe-design-token-usage': string;
|
|
41
|
+
'@atlaskit/design-system/no-unsafe-style-overrides': string;
|
|
40
42
|
'@atlaskit/design-system/no-unsupported-drag-and-drop-libraries': string;
|
|
41
43
|
'@atlaskit/design-system/use-drawer-label': string;
|
|
42
44
|
'@atlaskit/design-system/use-heading-level-in-spotlight-card': string;
|
|
@@ -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::
|
|
3
|
+
* @codegen <<SignedSource::6efa1e48692b3e287d6dfcd500a5f0ab>>
|
|
4
4
|
* @codegenCommand yarn workspace @atlaskit/eslint-plugin-design-system codegen
|
|
5
5
|
*/
|
|
6
6
|
declare const _default: {
|
|
@@ -19,6 +19,7 @@ declare const _default: {
|
|
|
19
19
|
'@atlaskit/design-system/no-nested-styles': string;
|
|
20
20
|
'@atlaskit/design-system/no-physical-properties': string;
|
|
21
21
|
'@atlaskit/design-system/no-unsafe-design-token-usage': string;
|
|
22
|
+
'@atlaskit/design-system/no-unsafe-style-overrides': string;
|
|
22
23
|
'@atlaskit/design-system/no-unsupported-drag-and-drop-libraries': string;
|
|
23
24
|
'@atlaskit/design-system/prefer-primitives': string;
|
|
24
25
|
'@atlaskit/design-system/use-drawer-label': string;
|
|
@@ -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::
|
|
3
|
+
* @codegen <<SignedSource::be810d87ec2d253e3b053dc06ff1b99a>>
|
|
4
4
|
* @codegenCommand yarn workspace @atlaskit/eslint-plugin-design-system codegen
|
|
5
5
|
*/
|
|
6
6
|
declare const _default: {
|
|
@@ -15,6 +15,7 @@ declare const _default: {
|
|
|
15
15
|
'@atlaskit/design-system/no-deprecated-imports': string;
|
|
16
16
|
'@atlaskit/design-system/no-nested-styles': string;
|
|
17
17
|
'@atlaskit/design-system/no-unsafe-design-token-usage': string;
|
|
18
|
+
'@atlaskit/design-system/no-unsafe-style-overrides': string;
|
|
18
19
|
'@atlaskit/design-system/no-unsupported-drag-and-drop-libraries': string;
|
|
19
20
|
'@atlaskit/design-system/use-drawer-label': string;
|
|
20
21
|
'@atlaskit/design-system/use-heading-level-in-spotlight-card': string;
|
|
@@ -16,6 +16,7 @@ declare const _default: {
|
|
|
16
16
|
'no-nested-styles': import("eslint").Rule.RuleModule;
|
|
17
17
|
'no-physical-properties': import("eslint").Rule.RuleModule;
|
|
18
18
|
'no-unsafe-design-token-usage': import("eslint").Rule.RuleModule;
|
|
19
|
+
'no-unsafe-style-overrides': import("eslint").Rule.RuleModule;
|
|
19
20
|
'no-unsupported-drag-and-drop-libraries': import("eslint").Rule.RuleModule;
|
|
20
21
|
'prefer-primitives': import("eslint").Rule.RuleModule;
|
|
21
22
|
'use-drawer-label': import("eslint").Rule.RuleModule;
|
|
@@ -6,3 +6,12 @@ import type { ImportDeclaration } from 'eslint-codemod-utils';
|
|
|
6
6
|
* @returns {ImportDeclaration}
|
|
7
7
|
*/
|
|
8
8
|
export declare const getImportedNodeBySource: (source: SourceCode, path: string) => ImportDeclaration | undefined;
|
|
9
|
+
/**
|
|
10
|
+
* Returns the module name of an identifier, if one exists.
|
|
11
|
+
*
|
|
12
|
+
* getModuleOfIdentifier(source, 'Button'); // "@atlaskit/button"
|
|
13
|
+
*/
|
|
14
|
+
export declare const getModuleOfIdentifier: (source: SourceCode, identifierName: string) => {
|
|
15
|
+
moduleName: string;
|
|
16
|
+
importName: string;
|
|
17
|
+
} | undefined;
|
|
@@ -1,2 +1,3 @@
|
|
|
1
|
-
import type { JSXAttribute, JSXElement } from 'eslint-codemod-utils';
|
|
1
|
+
import type { JSXAttribute, JSXElement, JSXOpeningElement } from 'eslint-codemod-utils';
|
|
2
2
|
export declare function findProp(jsx: JSXElement, propName: string): JSXAttribute | undefined;
|
|
3
|
+
export declare function getJSXElementName(jsx: JSXOpeningElement): string;
|
|
@@ -16,6 +16,7 @@ export declare const configs: {
|
|
|
16
16
|
'@atlaskit/design-system/no-nested-styles': string;
|
|
17
17
|
'@atlaskit/design-system/no-physical-properties': string;
|
|
18
18
|
'@atlaskit/design-system/no-unsafe-design-token-usage': string;
|
|
19
|
+
'@atlaskit/design-system/no-unsafe-style-overrides': string;
|
|
19
20
|
'@atlaskit/design-system/no-unsupported-drag-and-drop-libraries': string;
|
|
20
21
|
'@atlaskit/design-system/prefer-primitives': string;
|
|
21
22
|
'@atlaskit/design-system/use-drawer-label': string;
|
|
@@ -37,6 +38,7 @@ export declare const configs: {
|
|
|
37
38
|
'@atlaskit/design-system/no-deprecated-imports': string;
|
|
38
39
|
'@atlaskit/design-system/no-nested-styles': string;
|
|
39
40
|
'@atlaskit/design-system/no-unsafe-design-token-usage': string;
|
|
41
|
+
'@atlaskit/design-system/no-unsafe-style-overrides': string;
|
|
40
42
|
'@atlaskit/design-system/no-unsupported-drag-and-drop-libraries': string;
|
|
41
43
|
'@atlaskit/design-system/use-drawer-label': string;
|
|
42
44
|
'@atlaskit/design-system/use-heading-level-in-spotlight-card': string;
|
|
@@ -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::
|
|
3
|
+
* @codegen <<SignedSource::6efa1e48692b3e287d6dfcd500a5f0ab>>
|
|
4
4
|
* @codegenCommand yarn workspace @atlaskit/eslint-plugin-design-system codegen
|
|
5
5
|
*/
|
|
6
6
|
declare const _default: {
|
|
@@ -19,6 +19,7 @@ declare const _default: {
|
|
|
19
19
|
'@atlaskit/design-system/no-nested-styles': string;
|
|
20
20
|
'@atlaskit/design-system/no-physical-properties': string;
|
|
21
21
|
'@atlaskit/design-system/no-unsafe-design-token-usage': string;
|
|
22
|
+
'@atlaskit/design-system/no-unsafe-style-overrides': string;
|
|
22
23
|
'@atlaskit/design-system/no-unsupported-drag-and-drop-libraries': string;
|
|
23
24
|
'@atlaskit/design-system/prefer-primitives': string;
|
|
24
25
|
'@atlaskit/design-system/use-drawer-label': string;
|
|
@@ -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::
|
|
3
|
+
* @codegen <<SignedSource::be810d87ec2d253e3b053dc06ff1b99a>>
|
|
4
4
|
* @codegenCommand yarn workspace @atlaskit/eslint-plugin-design-system codegen
|
|
5
5
|
*/
|
|
6
6
|
declare const _default: {
|
|
@@ -15,6 +15,7 @@ declare const _default: {
|
|
|
15
15
|
'@atlaskit/design-system/no-deprecated-imports': string;
|
|
16
16
|
'@atlaskit/design-system/no-nested-styles': string;
|
|
17
17
|
'@atlaskit/design-system/no-unsafe-design-token-usage': string;
|
|
18
|
+
'@atlaskit/design-system/no-unsafe-style-overrides': string;
|
|
18
19
|
'@atlaskit/design-system/no-unsupported-drag-and-drop-libraries': string;
|
|
19
20
|
'@atlaskit/design-system/use-drawer-label': string;
|
|
20
21
|
'@atlaskit/design-system/use-heading-level-in-spotlight-card': string;
|
|
@@ -20,6 +20,7 @@ declare const _default: {
|
|
|
20
20
|
'no-nested-styles': import("eslint").Rule.RuleModule;
|
|
21
21
|
'no-physical-properties': import("eslint").Rule.RuleModule;
|
|
22
22
|
'no-unsafe-design-token-usage': import("eslint").Rule.RuleModule;
|
|
23
|
+
'no-unsafe-style-overrides': import("eslint").Rule.RuleModule;
|
|
23
24
|
'no-unsupported-drag-and-drop-libraries': import("eslint").Rule.RuleModule;
|
|
24
25
|
'prefer-primitives': import("eslint").Rule.RuleModule;
|
|
25
26
|
'use-drawer-label': import("eslint").Rule.RuleModule;
|
|
@@ -6,3 +6,12 @@ import type { ImportDeclaration } from 'eslint-codemod-utils';
|
|
|
6
6
|
* @returns {ImportDeclaration}
|
|
7
7
|
*/
|
|
8
8
|
export declare const getImportedNodeBySource: (source: SourceCode, path: string) => ImportDeclaration | undefined;
|
|
9
|
+
/**
|
|
10
|
+
* Returns the module name of an identifier, if one exists.
|
|
11
|
+
*
|
|
12
|
+
* getModuleOfIdentifier(source, 'Button'); // "@atlaskit/button"
|
|
13
|
+
*/
|
|
14
|
+
export declare const getModuleOfIdentifier: (source: SourceCode, identifierName: string) => {
|
|
15
|
+
moduleName: string;
|
|
16
|
+
importName: string;
|
|
17
|
+
} | undefined;
|
|
@@ -1,2 +1,3 @@
|
|
|
1
|
-
import type { JSXAttribute, JSXElement } from 'eslint-codemod-utils';
|
|
1
|
+
import type { JSXAttribute, JSXElement, JSXOpeningElement } from 'eslint-codemod-utils';
|
|
2
2
|
export declare function findProp(jsx: JSXElement, propName: string): JSXAttribute | undefined;
|
|
3
|
+
export declare function getJSXElementName(jsx: JSXOpeningElement): string;
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
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": "8.
|
|
4
|
+
"version": "8.19.0",
|
|
5
5
|
"author": "Atlassian Pty Ltd",
|
|
6
6
|
"publishConfig": {
|
|
7
7
|
"registry": "https://registry.npmjs.org/"
|