@atlaskit/eslint-plugin-design-system 8.13.1 → 8.14.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (53) hide show
  1. package/CHANGELOG.md +6 -0
  2. package/README.md +1 -0
  3. package/constellation/index/usage.mdx +41 -0
  4. package/dist/cjs/presets/all.codegen.js +2 -1
  5. package/dist/cjs/rules/index.codegen.js +3 -1
  6. package/dist/cjs/rules/no-css-tagged-template-expression/create-no-tagged-template-expression-rule/generate.js +142 -0
  7. package/dist/cjs/rules/no-css-tagged-template-expression/create-no-tagged-template-expression-rule/get-tagged-template-expression-offset.js +33 -0
  8. package/dist/cjs/rules/no-css-tagged-template-expression/create-no-tagged-template-expression-rule/index.js +89 -0
  9. package/dist/cjs/rules/no-css-tagged-template-expression/create-no-tagged-template-expression-rule/to-arguments.js +251 -0
  10. package/dist/cjs/rules/no-css-tagged-template-expression/create-no-tagged-template-expression-rule/types.js +5 -0
  11. package/dist/cjs/rules/no-css-tagged-template-expression/index.js +26 -0
  12. package/dist/cjs/rules/no-css-tagged-template-expression/is-supported-import.js +27 -0
  13. package/dist/es2019/presets/all.codegen.js +2 -1
  14. package/dist/es2019/rules/index.codegen.js +3 -1
  15. package/dist/es2019/rules/no-css-tagged-template-expression/create-no-tagged-template-expression-rule/generate.js +106 -0
  16. package/dist/es2019/rules/no-css-tagged-template-expression/create-no-tagged-template-expression-rule/get-tagged-template-expression-offset.js +29 -0
  17. package/dist/es2019/rules/no-css-tagged-template-expression/create-no-tagged-template-expression-rule/index.js +59 -0
  18. package/dist/es2019/rules/no-css-tagged-template-expression/create-no-tagged-template-expression-rule/to-arguments.js +187 -0
  19. package/dist/es2019/rules/no-css-tagged-template-expression/create-no-tagged-template-expression-rule/types.js +1 -0
  20. package/dist/es2019/rules/no-css-tagged-template-expression/index.js +20 -0
  21. package/dist/es2019/rules/no-css-tagged-template-expression/is-supported-import.js +19 -0
  22. package/dist/esm/presets/all.codegen.js +2 -1
  23. package/dist/esm/rules/index.codegen.js +3 -1
  24. package/dist/esm/rules/no-css-tagged-template-expression/create-no-tagged-template-expression-rule/generate.js +135 -0
  25. package/dist/esm/rules/no-css-tagged-template-expression/create-no-tagged-template-expression-rule/get-tagged-template-expression-offset.js +27 -0
  26. package/dist/esm/rules/no-css-tagged-template-expression/create-no-tagged-template-expression-rule/index.js +82 -0
  27. package/dist/esm/rules/no-css-tagged-template-expression/create-no-tagged-template-expression-rule/to-arguments.js +244 -0
  28. package/dist/esm/rules/no-css-tagged-template-expression/create-no-tagged-template-expression-rule/types.js +1 -0
  29. package/dist/esm/rules/no-css-tagged-template-expression/index.js +20 -0
  30. package/dist/esm/rules/no-css-tagged-template-expression/is-supported-import.js +21 -0
  31. package/dist/types/index.codegen.d.ts +1 -0
  32. package/dist/types/presets/all.codegen.d.ts +2 -1
  33. package/dist/types/rules/index.codegen.d.ts +1 -0
  34. package/dist/types/rules/no-css-tagged-template-expression/create-no-tagged-template-expression-rule/generate.d.ts +2 -0
  35. package/dist/types/rules/no-css-tagged-template-expression/create-no-tagged-template-expression-rule/get-tagged-template-expression-offset.d.ts +4 -0
  36. package/dist/types/rules/no-css-tagged-template-expression/create-no-tagged-template-expression-rule/index.d.ts +6 -0
  37. package/dist/types/rules/no-css-tagged-template-expression/create-no-tagged-template-expression-rule/to-arguments.d.ts +4 -0
  38. package/dist/types/rules/no-css-tagged-template-expression/create-no-tagged-template-expression-rule/types.d.ts +25 -0
  39. package/dist/types/rules/no-css-tagged-template-expression/index.d.ts +2 -0
  40. package/dist/types/rules/no-css-tagged-template-expression/is-supported-import.d.ts +12 -0
  41. package/dist/types-ts4.5/index.codegen.d.ts +1 -0
  42. package/dist/types-ts4.5/presets/all.codegen.d.ts +2 -1
  43. package/dist/types-ts4.5/rules/index.codegen.d.ts +1 -0
  44. package/dist/types-ts4.5/rules/no-css-tagged-template-expression/create-no-tagged-template-expression-rule/generate.d.ts +2 -0
  45. package/dist/types-ts4.5/rules/no-css-tagged-template-expression/create-no-tagged-template-expression-rule/get-tagged-template-expression-offset.d.ts +4 -0
  46. package/dist/types-ts4.5/rules/no-css-tagged-template-expression/create-no-tagged-template-expression-rule/index.d.ts +6 -0
  47. package/dist/types-ts4.5/rules/no-css-tagged-template-expression/create-no-tagged-template-expression-rule/to-arguments.d.ts +4 -0
  48. package/dist/types-ts4.5/rules/no-css-tagged-template-expression/create-no-tagged-template-expression-rule/types.d.ts +25 -0
  49. package/dist/types-ts4.5/rules/no-css-tagged-template-expression/index.d.ts +2 -0
  50. package/dist/types-ts4.5/rules/no-css-tagged-template-expression/is-supported-import.d.ts +12 -0
  51. package/package.json +1 -1
  52. package/report.api.md +2 -0
  53. package/tmp/api-report-tmp.d.ts +2 -0
package/CHANGELOG.md CHANGED
@@ -1,5 +1,11 @@
1
1
  # @atlaskit/eslint-plugin-design-system
2
2
 
3
+ ## 8.14.0
4
+
5
+ ### Minor Changes
6
+
7
+ - [#41884](https://bitbucket.org/atlassian/atlassian-frontend/pull-requests/41884) [`862be3ee13b`](https://bitbucket.org/atlassian/atlassian-frontend/commits/862be3ee13b) - Adds `no-css-tagged-template-expression` rule that disallows any `css` tagged template expressions that originate from `@emotion/react` and automatically converts them to the preferred call expression syntax.
8
+
3
9
  ## 8.13.1
4
10
 
5
11
  ### Patch Changes
package/README.md CHANGED
@@ -54,6 +54,7 @@ module.exports = {
54
54
  | <a href="./src/rules/ensure-design-token-usage-preview/README.md">ensure-design-token-usage/preview</a> | Enforces usage of pre-release design tokens rather than hard-coded values. | | Yes | Yes |
55
55
  | <a href="./src/rules/icon-label/README.md">icon-label</a> | Enforces accessible usage of icon labels when composed with Atlassian Design System components. | Yes | Yes | |
56
56
  | <a href="./src/rules/no-banned-imports/README.md">no-banned-imports</a> | Disallow importing banned modules. | Yes | | |
57
+ | <a href="./src/rules/no-css-tagged-template-expression/README.md">no-css-tagged-template-expression</a> | Disallows any `css` tagged template expressions that originate from Emotion, Styled Components or Compiled | | Yes | |
57
58
  | <a href="./src/rules/no-deprecated-apis/README.md">no-deprecated-apis</a> | Disallow using deprecated APIs. | Yes | | |
58
59
  | <a href="./src/rules/no-deprecated-design-token-usage/README.md">no-deprecated-design-token-usage</a> | Disallow using deprecated design tokens. | Yes | Yes | |
59
60
  | <a href="./src/rules/no-deprecated-imports/README.md">no-deprecated-imports</a> | Disallow importing deprecated modules. | Yes | | |
@@ -18,6 +18,7 @@ This plugin contains rules that should be used when working with the [Atlassian
18
18
  | <a href="#ensure-design-token-usage-preview">ensure-design-token-usage/preview</a> | Enforces usage of pre-release design tokens rather than hard-coded values. | | Yes | Yes |
19
19
  | <a href="#icon-label">icon-label</a> | Enforces accessible usage of icon labels when composed with Atlassian Design System components. | Yes | Yes | |
20
20
  | <a href="#no-banned-imports">no-banned-imports</a> | Disallow importing banned modules. | Yes | | |
21
+ | <a href="#no-css-tagged-template-expression">no-css-tagged-template-expression</a> | Disallows any `css` tagged template expressions that originate from Emotion, Styled Components or Compiled | | Yes | |
21
22
  | <a href="#no-deprecated-apis">no-deprecated-apis</a> | Disallow using deprecated APIs. | Yes | | |
22
23
  | <a href="#no-deprecated-design-token-usage">no-deprecated-design-token-usage</a> | Disallow using deprecated design tokens. | Yes | Yes | |
23
24
  | <a href="#no-deprecated-imports">no-deprecated-imports</a> | Disallow importing deprecated modules. | Yes | | |
@@ -283,6 +284,46 @@ import { Text } from '@atlaskit/ds-explorations';
283
284
  ^^^^^^^^^^^^^^^^^^^^^^^^^
284
285
  ```
285
286
 
287
+ ## no-css-tagged-template-expression
288
+
289
+ Disallows any `css` tagged template expressions that originate from `@emotion/react`, `@emotion/core`, `compiled/react` or `styled-components`.
290
+
291
+ Tagged template expressions cannot be type safe and are difficult to parse correctly. Will auto fix ` css`` ` to the preferred `css({})` call expression syntax.
292
+
293
+ Thank you to the [Compiled team for their rule](https://github.com/atlassian-labs/compiled/tree/master/packages/eslint-plugin/src/rules/no-css-tagged-template-expression) from which this was ported.
294
+
295
+ <h3>Incorrect</h3>
296
+
297
+ ```js
298
+ import { css } from '@emotion/react';
299
+
300
+ css`
301
+ color: blue;
302
+ `;
303
+
304
+ const styles = css`
305
+ color: blue;
306
+ font-weight: 500;
307
+ `;
308
+ ```
309
+
310
+ <h3>Correct</h3>
311
+
312
+ ```js
313
+ import { css } from '@emotion/react';
314
+
315
+ css({ color: 'blue' });
316
+
317
+ const styles = css({
318
+ color: 'blue',
319
+ fontWeight: 500,
320
+ });
321
+ ```
322
+
323
+ <h3>Limitations</h3>
324
+
325
+ - Comments are not auto-fixable. You will need to manually convert usages containing functions.
326
+
286
327
  ## no-deprecated-apis
287
328
 
288
329
  Props across the Atlassian Design System can be deprecated when they are deemed no-longer fit for purporse or dangerous and risk effective use at scale.
@@ -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::a4007a35edc1c661f543508c2b005014>>
9
+ * @codegen <<SignedSource::594898d8c5dc8b9a5610d62e7f300a53>>
10
10
  * @codegenCommand yarn workspace @atlaskit/eslint-plugin-design-system codegen
11
11
  */
12
12
  var _default = exports.default = {
@@ -17,6 +17,7 @@ var _default = exports.default = {
17
17
  '@atlaskit/design-system/ensure-design-token-usage/preview': 'warn',
18
18
  '@atlaskit/design-system/icon-label': 'warn',
19
19
  '@atlaskit/design-system/no-banned-imports': 'error',
20
+ '@atlaskit/design-system/no-css-tagged-template-expression': 'error',
20
21
  '@atlaskit/design-system/no-deprecated-apis': 'error',
21
22
  '@atlaskit/design-system/no-deprecated-design-token-usage': 'warn',
22
23
  '@atlaskit/design-system/no-deprecated-imports': 'error',
@@ -10,6 +10,7 @@ var _ensureDesignTokenUsage = _interopRequireDefault(require("./ensure-design-to
10
10
  var _ensureDesignTokenUsagePreview = _interopRequireDefault(require("./ensure-design-token-usage-preview"));
11
11
  var _iconLabel = _interopRequireDefault(require("./icon-label"));
12
12
  var _noBannedImports = _interopRequireDefault(require("./no-banned-imports"));
13
+ var _noCssTaggedTemplateExpression = _interopRequireDefault(require("./no-css-tagged-template-expression"));
13
14
  var _noDeprecatedApis = _interopRequireDefault(require("./no-deprecated-apis"));
14
15
  var _noDeprecatedDesignTokenUsage = _interopRequireDefault(require("./no-deprecated-design-token-usage"));
15
16
  var _noDeprecatedImports = _interopRequireDefault(require("./no-deprecated-imports"));
@@ -25,7 +26,7 @@ var _usePrimitives = _interopRequireDefault(require("./use-primitives"));
25
26
  var _useVisuallyHidden = _interopRequireDefault(require("./use-visually-hidden"));
26
27
  /**
27
28
  * THIS FILE WAS CREATED VIA CODEGEN DO NOT MODIFY {@see http://go/af-codegen}
28
- * @codegen <<SignedSource::c5844c54692156b8d604fd5994082abe>>
29
+ * @codegen <<SignedSource::8927e5adaec5639c9712dbfb26968de4>>
29
30
  * @codegenCommand yarn workspace @atlaskit/eslint-plugin-design-system codegen
30
31
  */
31
32
  var _default = exports.default = {
@@ -34,6 +35,7 @@ var _default = exports.default = {
34
35
  'ensure-design-token-usage/preview': _ensureDesignTokenUsagePreview.default,
35
36
  'icon-label': _iconLabel.default,
36
37
  'no-banned-imports': _noBannedImports.default,
38
+ 'no-css-tagged-template-expression': _noCssTaggedTemplateExpression.default,
37
39
  'no-deprecated-apis': _noDeprecatedApis.default,
38
40
  'no-deprecated-design-token-usage': _noDeprecatedDesignTokenUsage.default,
39
41
  'no-deprecated-imports': _noDeprecatedImports.default,
@@ -0,0 +1,142 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+ Object.defineProperty(exports, "__esModule", {
5
+ value: true
6
+ });
7
+ exports.generate = void 0;
8
+ var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
9
+ 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; } } }; }
10
+ 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); }
11
+ 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; }
12
+ // Original source from Compiled https://github.com/atlassian-labs/compiled/blob/master/packages/eslint-plugin/src/utils/create-no-tagged-template-expression-rule/generate.ts
13
+
14
+ var createKey = function createKey(key) {
15
+ if (/^\w+$/g.test(key)) {
16
+ return key;
17
+ }
18
+
19
+ // Wrap the key in square brackets if the key includes a binding. i.e.`.foo ${BINDING_NAME} .bar`
20
+ if (key.charAt(0) === '`' && key.charAt(key.length - 1) === '`') {
21
+ return "[".concat(key, "]");
22
+ }
23
+
24
+ // Wrap the key in quotes if it uses unsafe characters
25
+ if (!key.includes('"')) {
26
+ return "\"".concat(key, "\"");
27
+ }
28
+ return "[`".concat(key, "`]");
29
+ };
30
+ var addQuotes = function addQuotes(literal) {
31
+ return literal[0] === "\"" ? "'".concat(literal, "'") : "\"".concat(literal, "\"");
32
+ };
33
+ var createValue = function createValue(value) {
34
+ var type = value.type;
35
+ if (type === 'expression') {
36
+ return value.expression.trim();
37
+ }
38
+ var literal = value.value;
39
+ return typeof literal === 'string' && literal[0] !== '`' ? addQuotes(literal) : literal;
40
+ };
41
+ var indent = function indent(offset, level) {
42
+ return ' '.repeat(offset + level * 2);
43
+ };
44
+ var generateBlock = function generateBlock(blocks, offset, level) {
45
+ var chars = '{' + '\n';
46
+ var _iterator = _createForOfIteratorHelper(blocks.entries()),
47
+ _step;
48
+ try {
49
+ for (_iterator.s(); !(_step = _iterator.n()).done;) {
50
+ var _step$value = (0, _slicedToArray2.default)(_step.value, 2),
51
+ i = _step$value[0],
52
+ block = _step$value[1];
53
+ chars += indent(offset, level + 1);
54
+ switch (block.type) {
55
+ case 'declaration':
56
+ {
57
+ chars += createKey(block.property) + ': ' + createValue(block.value);
58
+ break;
59
+ }
60
+ case 'rule':
61
+ {
62
+ chars += createKey(block.selector) + ': ' + generateArguments(block.declarations, offset, level + 1).trim();
63
+ break;
64
+ }
65
+ default:
66
+ break;
67
+ }
68
+ if (blocks.length > 1 && i < blocks.length - 1) {
69
+ chars += ',';
70
+ chars += '\n';
71
+ }
72
+ }
73
+ } catch (err) {
74
+ _iterator.e(err);
75
+ } finally {
76
+ _iterator.f();
77
+ }
78
+ chars += '\n' + indent(offset, level) + '}';
79
+ return chars;
80
+ };
81
+ var generateArguments = function generateArguments(args, offset, level) {
82
+ var chars = '';
83
+ if (level > 1 && args.length > 1) {
84
+ chars += '[';
85
+ }
86
+ var _iterator2 = _createForOfIteratorHelper(args.entries()),
87
+ _step2;
88
+ try {
89
+ for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) {
90
+ var _step2$value = (0, _slicedToArray2.default)(_step2.value, 2),
91
+ i = _step2$value[0],
92
+ arg = _step2$value[1];
93
+ switch (arg.type) {
94
+ case 'block':
95
+ {
96
+ if (args.length === 1) {
97
+ chars += generateBlock(arg.blocks, offset, level).trim();
98
+ } else {
99
+ chars += '\n';
100
+ chars += indent(offset, level + 1);
101
+ chars += generateBlock(arg.blocks, offset, level + 1).trim();
102
+ }
103
+ break;
104
+ }
105
+ case 'expression':
106
+ {
107
+ chars += '\n';
108
+ chars += indent(offset, level + 1);
109
+ chars += arg.expression;
110
+ break;
111
+ }
112
+ default:
113
+ break;
114
+ }
115
+ if (args.length > 1 && i < args.length - 1) {
116
+ chars += ',';
117
+ }
118
+ }
119
+ } catch (err) {
120
+ _iterator2.e(err);
121
+ } finally {
122
+ _iterator2.f();
123
+ }
124
+ if (level > 1 && args.length > 1) {
125
+ chars += '\n';
126
+ chars += indent(offset, level);
127
+ chars += ']';
128
+ }
129
+ return chars;
130
+ };
131
+ var generate = exports.generate = function generate(args, offset) {
132
+ var level = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 0;
133
+ var chars = '';
134
+ chars += '(';
135
+ chars += generateArguments(args, offset, level);
136
+ if (args.length > 1) {
137
+ chars += '\n';
138
+ chars += indent(offset, level);
139
+ }
140
+ chars += ')';
141
+ return chars;
142
+ };
@@ -0,0 +1,33 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.getTaggedTemplateExpressionOffset = void 0;
7
+ // Original source from Compiled https://github.com/atlassian-labs/compiled/blob/master/packages/eslint-plugin/src/utils/create-no-tagged-template-expression-rule/get-tagged-template-expression-offset.ts
8
+
9
+ var getTaggedTemplateExpressionOffset = exports.getTaggedTemplateExpressionOffset = function getTaggedTemplateExpressionOffset(node) {
10
+ var parent = node.parent;
11
+ switch (parent.type || '') {
12
+ case 'ExportDefaultDeclaration':
13
+ {
14
+ return parent.loc.start.column;
15
+ }
16
+ case 'VariableDeclarator':
17
+ {
18
+ var maybeVariableDeclaration = parent.parent;
19
+ if (maybeVariableDeclaration.type === 'VariableDeclaration') {
20
+ var maybeExportNamedDeclaration = maybeVariableDeclaration.parent;
21
+ if (maybeExportNamedDeclaration.type === 'ExportNamedDeclaration') {
22
+ return maybeExportNamedDeclaration.loc.start.column;
23
+ } else {
24
+ return maybeVariableDeclaration.loc.start.column;
25
+ }
26
+ }
27
+ break;
28
+ }
29
+ default:
30
+ break;
31
+ }
32
+ return node.loc.start.column;
33
+ };
@@ -0,0 +1,89 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+ Object.defineProperty(exports, "__esModule", {
5
+ value: true
6
+ });
7
+ exports.createNoTaggedTemplateExpressionRule = void 0;
8
+ var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator"));
9
+ var _generate = require("./generate");
10
+ var _getTaggedTemplateExpressionOffset = require("./get-tagged-template-expression-offset");
11
+ var _toArguments = require("./to-arguments");
12
+ // Original source from Compiled https://github.com/atlassian-labs/compiled/blob/master/packages/eslint-plugin/src/utils/create-no-tagged-template-expression-rule/index.ts
13
+
14
+ var createNoTaggedTemplateExpressionRule = exports.createNoTaggedTemplateExpressionRule = function createNoTaggedTemplateExpressionRule(isUsage, messageId) {
15
+ return function (context) {
16
+ return {
17
+ TaggedTemplateExpression: function TaggedTemplateExpression(node) {
18
+ var _context$getScope = context.getScope(),
19
+ references = _context$getScope.references;
20
+ if (!isUsage(node.tag, references)) {
21
+ return;
22
+ }
23
+ context.report({
24
+ messageId: messageId,
25
+ node: node,
26
+ fix: /*#__PURE__*/_regenerator.default.mark(function fix(fixer) {
27
+ var quasi, source, args, oldCode, withoutQuasi, newCode;
28
+ return _regenerator.default.wrap(function fix$(_context) {
29
+ while (1) switch (_context.prev = _context.next) {
30
+ case 0:
31
+ quasi = node.quasi;
32
+ source = context.getSourceCode(); // TODO Eventually handle comments instead of skipping them
33
+ // Skip auto-fixing comments
34
+ if (!quasi.quasis.map(function (q) {
35
+ return q.value.raw;
36
+ }).join('').match(/\/\*[\s\S]*\*\//g)) {
37
+ _context.next = 4;
38
+ break;
39
+ }
40
+ return _context.abrupt("return");
41
+ case 4:
42
+ if (!(!quasi.expressions.length && quasi.quasis.length === 1 && !quasi.quasis[0].value.raw.trim())) {
43
+ _context.next = 8;
44
+ break;
45
+ }
46
+ _context.next = 7;
47
+ return fixer.replaceText(quasi, '({})');
48
+ case 7:
49
+ return _context.abrupt("return");
50
+ case 8:
51
+ args = (0, _toArguments.toArguments)(source, quasi); // Skip invalid CSS
52
+ if (!(args.length < 1)) {
53
+ _context.next = 11;
54
+ break;
55
+ }
56
+ return _context.abrupt("return");
57
+ case 11:
58
+ oldCode = source.getText(node); // Remove quasi:
59
+ // styled.div<Props>`
60
+ // color: red;
61
+ // `
62
+ // becomes
63
+ // styled.div<Props>
64
+ withoutQuasi = oldCode.replace(source.getText(quasi), '');
65
+ newCode = withoutQuasi +
66
+ // Indent the arguments after the tagged template expression range
67
+ (0, _generate.generate)(args, (0, _getTaggedTemplateExpressionOffset.getTaggedTemplateExpressionOffset)(node));
68
+ if (!(oldCode === newCode)) {
69
+ _context.next = 16;
70
+ break;
71
+ }
72
+ return _context.abrupt("return");
73
+ case 16:
74
+ _context.next = 18;
75
+ return fixer.insertTextBefore(node, newCode);
76
+ case 18:
77
+ _context.next = 20;
78
+ return fixer.remove(node);
79
+ case 20:
80
+ case "end":
81
+ return _context.stop();
82
+ }
83
+ }, fix);
84
+ })
85
+ });
86
+ }
87
+ };
88
+ };
89
+ };
@@ -0,0 +1,251 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+ Object.defineProperty(exports, "__esModule", {
5
+ value: true
6
+ });
7
+ exports.toArguments = void 0;
8
+ var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
9
+ var _toArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toArray"));
10
+ 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; } } }; }
11
+ 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); }
12
+ 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; }
13
+ // Original source from Compiled https://github.com/atlassian-labs/compiled/blob/master/packages/eslint-plugin/src/utils/create-no-tagged-template-expression-rule/to-arguments.ts
14
+
15
+ var getArguments = function getArguments(chars) {
16
+ var expressions = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : [];
17
+ if (!chars.trim().length && expressions) {
18
+ return expressions.map(function (_ref) {
19
+ var expression = _ref.expression;
20
+ return {
21
+ type: 'expression',
22
+ expression: expression
23
+ };
24
+ });
25
+ }
26
+ var args = [];
27
+ if (!chars.includes(':')) {
28
+ return args;
29
+ }
30
+
31
+ // Split the property and value
32
+ // e.g. `color: red` becomes ['color', 'red']
33
+ // also consider `background: url("https://some-url-b")`, which has a colon in the value.
34
+ var _chars$split = chars.split(':'),
35
+ _chars$split2 = (0, _toArray2.default)(_chars$split),
36
+ property = _chars$split2[0],
37
+ v = _chars$split2.slice(1);
38
+ var value = v.join(':');
39
+
40
+ // Extract any expressions listed before the property that were not delimited by a ;
41
+ if (expressions.length) {
42
+ var lastPropertyRe = /[\w-]+(?![\s\S]*[\w-]+)/g;
43
+ var prop = lastPropertyRe.exec(property);
44
+ if (prop) {
45
+ var i = 0;
46
+ while (expressions[i] && expressions[i].pos < prop.index) {
47
+ args.push({
48
+ type: 'expression',
49
+ expression: expressions[i].expression
50
+ });
51
+ i++;
52
+ }
53
+ // Remove any expressions that have been added as an arg as they are not part of the declaration
54
+ expressions = expressions.slice(i);
55
+ }
56
+ }
57
+ var getValue = function getValue() {
58
+ if (!value.trim().length && expressions.length) {
59
+ return {
60
+ type: 'expression',
61
+ expression: expressions.map(function (e) {
62
+ return e.expression;
63
+ }).join('')
64
+ };
65
+ }
66
+ if (expressions.length) {
67
+ // When there are expressions in the value, insert the expressions and wrap the value in a template literal
68
+ var val = chars;
69
+ var offset = 1;
70
+ var _iterator = _createForOfIteratorHelper(expressions),
71
+ _step;
72
+ try {
73
+ for (_iterator.s(); !(_step = _iterator.n()).done;) {
74
+ var _step$value = _step.value,
75
+ expression = _step$value.expression,
76
+ pos = _step$value.pos;
77
+ var interpolation = '${' + expression + '}';
78
+ val = val.substring(0, pos + offset) + interpolation + val.substring(pos + offset);
79
+ offset += interpolation.length;
80
+ }
81
+ } catch (err) {
82
+ _iterator.e(err);
83
+ } finally {
84
+ _iterator.f();
85
+ }
86
+ return {
87
+ type: 'literal',
88
+ value: '`' + val.replace(property + ':', '').trim() + '`'
89
+ };
90
+ }
91
+ return {
92
+ type: 'literal',
93
+ value: isNaN(Number(value)) ? value.trim() : parseFloat(value)
94
+ };
95
+ };
96
+ args.push({
97
+ type: 'declaration',
98
+ // Make the property camelCase
99
+ property: property.trim().replace(/-[a-z]/g, function (match) {
100
+ return match[1].toUpperCase();
101
+ }),
102
+ value: getValue()
103
+ });
104
+ return args;
105
+ };
106
+ var getSelectorValue = function getSelectorValue(chars, expressions) {
107
+ // If no variable, returns chars immediately.
108
+ // i.e. `.foo { color: red }` returns '.foo'
109
+ if (expressions.length === 0) {
110
+ return chars.trim();
111
+ }
112
+ var val = chars;
113
+ var offset = 1;
114
+ var _iterator2 = _createForOfIteratorHelper(expressions),
115
+ _step2;
116
+ try {
117
+ for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) {
118
+ var _step2$value = _step2.value,
119
+ expression = _step2$value.expression,
120
+ pos = _step2$value.pos;
121
+ var interpolation = '${' + expression + '}';
122
+ val = val.substring(0, pos + offset) + interpolation + val.substring(pos + offset);
123
+ offset += interpolation.length;
124
+ }
125
+
126
+ // For simplicity, use template literals even if the whole selector is a variable
127
+ // i.e. the output of `${VAR} { color: red }` is { [`${VAR}`]: { color: "red" } }
128
+ } catch (err) {
129
+ _iterator2.e(err);
130
+ } finally {
131
+ _iterator2.f();
132
+ }
133
+ return '`' + val.trim() + '`';
134
+ };
135
+ var toArguments = exports.toArguments = function toArguments(source, template) {
136
+ var args = [];
137
+ var state = {
138
+ chars: '',
139
+ current: {
140
+ parent: undefined,
141
+ args: args
142
+ },
143
+ expressions: []
144
+ };
145
+ var addArgument = function addArgument(argument) {
146
+ var args = state.current.args;
147
+ if (argument.type === 'expression') {
148
+ if (argument.expression.length) {
149
+ args.push(argument);
150
+ }
151
+ return;
152
+ }
153
+ var lastArg = args[state.current.args.length - 1];
154
+ if ((lastArg === null || lastArg === void 0 ? void 0 : lastArg.type) === 'block') {
155
+ lastArg.blocks.push(argument);
156
+ } else {
157
+ args.push({
158
+ type: 'block',
159
+ blocks: [argument]
160
+ });
161
+ }
162
+ };
163
+ var addArguments = function addArguments() {
164
+ var args = getArguments(state.chars, state.expressions);
165
+ var _iterator3 = _createForOfIteratorHelper(args),
166
+ _step3;
167
+ try {
168
+ for (_iterator3.s(); !(_step3 = _iterator3.n()).done;) {
169
+ var arg = _step3.value;
170
+ addArgument(arg);
171
+ }
172
+ } catch (err) {
173
+ _iterator3.e(err);
174
+ } finally {
175
+ _iterator3.f();
176
+ }
177
+ };
178
+ var _iterator4 = _createForOfIteratorHelper(template.quasis.entries()),
179
+ _step4;
180
+ try {
181
+ for (_iterator4.s(); !(_step4 = _iterator4.n()).done;) {
182
+ var _step4$value = (0, _slicedToArray2.default)(_step4.value, 2),
183
+ i = _step4$value[0],
184
+ quasi = _step4$value[1];
185
+ // Deal with selectors across multiple lines
186
+ var styleTemplateElement = quasi.value.raw.replace(/(\r\n|\n|\r)/gm, ' ').replace(/\s+/g, ' ');
187
+ var _iterator5 = _createForOfIteratorHelper(styleTemplateElement),
188
+ _step5;
189
+ try {
190
+ for (_iterator5.s(); !(_step5 = _iterator5.n()).done;) {
191
+ var char = _step5.value;
192
+ switch (char) {
193
+ case '{':
194
+ {
195
+ var declarations = [];
196
+ addArgument({
197
+ type: 'rule',
198
+ selector: getSelectorValue(state.chars, state.expressions),
199
+ declarations: declarations
200
+ });
201
+ state.chars = '';
202
+ state.current = {
203
+ parent: state.current,
204
+ args: declarations
205
+ };
206
+ state.expressions = [];
207
+ break;
208
+ }
209
+ case '}':
210
+ {
211
+ // Add any leftover arguments that were not delimited
212
+ addArguments();
213
+ state.chars = '';
214
+ state.current = state.current.parent;
215
+ state.expressions = [];
216
+ break;
217
+ }
218
+ case ';':
219
+ {
220
+ addArguments();
221
+ state.chars = '';
222
+ state.expressions = [];
223
+ break;
224
+ }
225
+ default:
226
+ state.chars += char;
227
+ break;
228
+ }
229
+ }
230
+ } catch (err) {
231
+ _iterator5.e(err);
232
+ } finally {
233
+ _iterator5.f();
234
+ }
235
+ if (i < template.expressions.length) {
236
+ state.expressions.push({
237
+ pos: state.chars.length - 1,
238
+ expression: source.getText(template.expressions[i])
239
+ });
240
+ }
241
+ }
242
+
243
+ // Add any leftover arguments that were not delimited
244
+ } catch (err) {
245
+ _iterator4.e(err);
246
+ } finally {
247
+ _iterator4.f();
248
+ }
249
+ addArguments();
250
+ return args;
251
+ };
@@ -0,0 +1,5 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });