@atlaskit/eslint-plugin-design-system 8.32.0 → 8.32.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (22) hide show
  1. package/CHANGELOG.md +12 -0
  2. package/constellation/no-styled-tagged-template-expression/usage.mdx +42 -0
  3. package/dist/cjs/rules/consistent-css-prop-usage/index.js +375 -334
  4. package/dist/cjs/rules/no-styled-tagged-template-expression/index.js +2 -2
  5. package/dist/cjs/rules/utils/create-no-tagged-template-expression-rule/index.js +10 -3
  6. package/dist/cjs/rules/utils/is-supported-import.js +64 -10
  7. package/dist/es2019/rules/consistent-css-prop-usage/index.js +283 -267
  8. package/dist/es2019/rules/no-styled-tagged-template-expression/index.js +1 -1
  9. package/dist/es2019/rules/utils/create-no-tagged-template-expression-rule/index.js +26 -1
  10. package/dist/es2019/rules/utils/is-supported-import.js +60 -10
  11. package/dist/esm/rules/consistent-css-prop-usage/index.js +375 -334
  12. package/dist/esm/rules/no-styled-tagged-template-expression/index.js +1 -1
  13. package/dist/esm/rules/utils/create-no-tagged-template-expression-rule/index.js +11 -4
  14. package/dist/esm/rules/utils/is-supported-import.js +63 -9
  15. package/dist/types/rules/utils/is-supported-import.d.ts +11 -0
  16. package/dist/types-ts4.5/rules/utils/is-supported-import.d.ts +11 -0
  17. package/package.json +1 -1
  18. package/dist/cjs/rules/no-styled-tagged-template-expression/is-styled.js +0 -53
  19. package/dist/es2019/rules/no-styled-tagged-template-expression/is-styled.js +0 -45
  20. package/dist/esm/rules/no-styled-tagged-template-expression/is-styled.js +0 -47
  21. package/dist/types/rules/no-styled-tagged-template-expression/is-styled.d.ts +0 -7
  22. package/dist/types-ts4.5/rules/no-styled-tagged-template-expression/is-styled.d.ts +0 -7
@@ -6,7 +6,7 @@ Object.defineProperty(exports, "__esModule", {
6
6
  exports.default = void 0;
7
7
  var _createNoTaggedTemplateExpressionRule = require("../utils/create-no-tagged-template-expression-rule");
8
8
  var _createRule = require("../utils/create-rule");
9
- var _isStyled = require("./is-styled");
9
+ var _isSupportedImport = require("../utils/is-supported-import");
10
10
  var rule = (0, _createRule.createLintRule)({
11
11
  meta: {
12
12
  name: 'no-styled-tagged-template-expression',
@@ -22,6 +22,6 @@ var rule = (0, _createRule.createLintRule)({
22
22
  },
23
23
  schema: _createNoTaggedTemplateExpressionRule.noTaggedTemplateExpressionRuleSchema
24
24
  },
25
- create: (0, _createNoTaggedTemplateExpressionRule.createNoTaggedTemplateExpressionRule)(_isStyled.isStyled, 'unexpectedTaggedTemplate')
25
+ create: (0, _createNoTaggedTemplateExpressionRule.createNoTaggedTemplateExpressionRule)(_isSupportedImport.isStyled, 'unexpectedTaggedTemplate')
26
26
  });
27
27
  var _default = exports.default = rule;
@@ -43,6 +43,7 @@ var createNoTaggedTemplateExpressionRule = exports.createNoTaggedTemplateExpress
43
43
  if (!isUsage(node.tag, references, importSources)) {
44
44
  return;
45
45
  }
46
+ var isSC = (0, _isSupportedImport.isStyledComponents)(node.tag, references, importSources);
46
47
  context.report({
47
48
  messageId: messageId,
48
49
  node: node,
@@ -94,12 +95,18 @@ var createNoTaggedTemplateExpressionRule = exports.createNoTaggedTemplateExpress
94
95
  }
95
96
  return _context.abrupt("return");
96
97
  case 16:
97
- _context.next = 18;
98
- return fixer.insertTextBefore(node, newCode);
98
+ if (!(isSC && /\$\{.*:[\s]*\{/.test(newCode))) {
99
+ _context.next = 18;
100
+ break;
101
+ }
102
+ return _context.abrupt("return");
99
103
  case 18:
100
104
  _context.next = 20;
101
- return fixer.remove(node);
105
+ return fixer.insertTextBefore(node, newCode);
102
106
  case 20:
107
+ _context.next = 22;
108
+ return fixer.remove(node);
109
+ case 22:
103
110
  case "end":
104
111
  return _context.stop();
105
112
  }
@@ -3,7 +3,7 @@
3
3
  Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
- exports.isStyled = exports.isKeyframes = exports.isCxFunction = exports.isCssMap = exports.isCss = exports.getImportSources = exports.DEFAULT_IMPORT_SOURCES = exports.CSS_IN_JS_IMPORTS = void 0;
6
+ exports.isStyledComponents = exports.isStyled = exports.isKeyframes = exports.isImportedFrom = exports.isEmotion = exports.isCxFunction = exports.isCssMap = exports.isCss = exports.isCompiled = exports.getImportSources = exports.DEFAULT_IMPORT_SOURCES = exports.CSS_IN_JS_IMPORTS = void 0;
7
7
  // eslint-disable-next-line import/no-extraneous-dependencies
8
8
 
9
9
  var CSS_IN_JS_IMPORTS = exports.CSS_IN_JS_IMPORTS = {
@@ -23,6 +23,21 @@ var CSS_IN_JS_IMPORTS = exports.CSS_IN_JS_IMPORTS = {
23
23
  * By default all known import sources are checked against.
24
24
  */
25
25
  var DEFAULT_IMPORT_SOURCES = exports.DEFAULT_IMPORT_SOURCES = Object.values(CSS_IN_JS_IMPORTS);
26
+ var getIdentifierNode = function getIdentifierNode(node) {
27
+ var identifierNode = node.type === 'Identifier' ? node : undefined;
28
+ if (!identifierNode) {
29
+ // Handles styled.div`` case
30
+ if (node.type === 'MemberExpression' && node.object.type === 'Identifier') {
31
+ identifierNode = node.object;
32
+ }
33
+
34
+ // Handles styled(Component)`` case
35
+ if (node.type === 'CallExpression' && node.callee.type === 'Identifier') {
36
+ identifierNode = node.callee;
37
+ }
38
+ }
39
+ return identifierNode;
40
+ };
26
41
 
27
42
  /**
28
43
  * Given the ESLint rule context, extract and parse the value of the importSources rule option.
@@ -43,6 +58,7 @@ var getImportSources = exports.getImportSources = function getImportSources(cont
43
58
  return DEFAULT_IMPORT_SOURCES;
44
59
  };
45
60
  var isSupportedImportWrapper = function isSupportedImportWrapper(functionName) {
61
+ var defaultFromImportSources = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : [];
46
62
  var checkDefinitionHasImport = function checkDefinitionHasImport(def, importSources) {
47
63
  if (def.type !== 'ImportBinding') {
48
64
  return false;
@@ -50,12 +66,19 @@ var isSupportedImportWrapper = function isSupportedImportWrapper(functionName) {
50
66
  if (!def.parent || !importSources.includes(def.parent.source.value)) {
51
67
  return false;
52
68
  }
53
- return (
54
- // import { functionName } from 'import-source';
55
- def.node.type === 'ImportSpecifier' && def.node.imported.name === functionName ||
56
- // import functionName from 'import-source';
57
- def.node.type === 'ImportDefaultSpecifier' && def.node.local.name === functionName
58
- );
69
+
70
+ // Matches the imported name from a named import
71
+ // import { functionName, functioName as otherName } from 'import-source';
72
+ var isNamedImport = def.node.type === 'ImportSpecifier' && def.node.imported.name === functionName;
73
+
74
+ // Must explicitly match the local name from a default import
75
+ // import functionName from 'import-source';
76
+ var isDefaultImportMatchingLocal = def.node.type === 'ImportDefaultSpecifier' && def.node.local.name === functionName;
77
+
78
+ // Can match any local name from a default import
79
+ // import anything from 'import-source'
80
+ var isKnownDefaultImport = def.node.type === 'ImportDefaultSpecifier' && defaultFromImportSources.includes(def.parent.source.value);
81
+ return isNamedImport || isDefaultImportMatchingLocal || isKnownDefaultImport;
59
82
  };
60
83
 
61
84
  /**
@@ -75,9 +98,10 @@ var isSupportedImportWrapper = function isSupportedImportWrapper(functionName) {
75
98
  * @returns Whether the above conditions are true.
76
99
  */
77
100
  var isSupportedImport = function isSupportedImport(nodeToCheck, referencesInScope, importSources) {
78
- return nodeToCheck.type === 'Identifier' && referencesInScope.some(function (reference) {
101
+ var identifierNode = getIdentifierNode(nodeToCheck);
102
+ return (identifierNode === null || identifierNode === void 0 ? void 0 : identifierNode.type) === 'Identifier' && referencesInScope.some(function (reference) {
79
103
  var _reference$resolved;
80
- return reference.identifier === nodeToCheck && ((_reference$resolved = reference.resolved) === null || _reference$resolved === void 0 ? void 0 : _reference$resolved.defs.some(function (def) {
104
+ return reference.identifier === identifierNode && ((_reference$resolved = reference.resolved) === null || _reference$resolved === void 0 ? void 0 : _reference$resolved.defs.some(function (def) {
81
105
  return checkDefinitionHasImport(def, importSources);
82
106
  }));
83
107
  });
@@ -92,4 +116,34 @@ var isCss = exports.isCss = isSupportedImportWrapper('css');
92
116
  var isCxFunction = exports.isCxFunction = isSupportedImportWrapper('cx');
93
117
  var isCssMap = exports.isCssMap = isSupportedImportWrapper('cssMap');
94
118
  var isKeyframes = exports.isKeyframes = isSupportedImportWrapper('keyframes');
95
- var isStyled = exports.isStyled = isSupportedImportWrapper('styled');
119
+ // `styled` is also the explicit default of `styled-components` and `@emotion/styled`, so we also match on default imports generally
120
+ var isStyled = exports.isStyled = isSupportedImportWrapper('styled', ['styled-components', '@emotion/styled']);
121
+ var isImportedFrom = exports.isImportedFrom = function isImportedFrom(moduleName) {
122
+ var exactMatch = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;
123
+ return function (nodeToCheck, referencesInScope, importSources) {
124
+ if (!importSources.includes(moduleName)) {
125
+ // Don't go through the trouble of checking the import sources does not include this
126
+ // We'll assume this is skipped elsewhere.
127
+ return false;
128
+ }
129
+ var identifierNode = getIdentifierNode(nodeToCheck);
130
+ return (identifierNode === null || identifierNode === void 0 ? void 0 : identifierNode.type) === 'Identifier' && referencesInScope.some(function (reference) {
131
+ var _reference$resolved2;
132
+ return reference.identifier === identifierNode && ((_reference$resolved2 = reference.resolved) === null || _reference$resolved2 === void 0 ? void 0 : _reference$resolved2.defs.some(function (def) {
133
+ var _def$parent, _String, _def$parent2;
134
+ return def.type === 'ImportBinding' && (((_def$parent = def.parent) === null || _def$parent === void 0 ? void 0 : _def$parent.source.value) === moduleName || !exactMatch && ((_String = String((_def$parent2 = def.parent) === null || _def$parent2 === void 0 ? void 0 : _def$parent2.source.value)) === null || _String === void 0 ? void 0 : _String.startsWith(moduleName)));
135
+ }));
136
+ });
137
+ };
138
+ };
139
+
140
+ /**
141
+ * Determine if this node is specifically from a `'styled-components'` import.
142
+ * This is because `styled-components@3.4` APIs are not consistent with Emotion and Compiled,
143
+ * we need to handle them differently in a few scenarios.
144
+ *
145
+ * This can be cleaned up when `'styled-components'` is no longer a valid ImportSource.
146
+ */
147
+ var isStyledComponents = exports.isStyledComponents = isImportedFrom('styled-components');
148
+ var isCompiled = exports.isCompiled = isImportedFrom('@compiled/', false);
149
+ var isEmotion = exports.isEmotion = isImportedFrom('@emotion/', false);