@atlaskit/eslint-plugin-design-system 8.13.1 → 8.14.1
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 +12 -0
- package/README.md +1 -0
- package/constellation/index/usage.mdx +41 -0
- package/dist/cjs/presets/all.codegen.js +2 -1
- package/dist/cjs/rules/index.codegen.js +3 -1
- package/dist/cjs/rules/no-css-tagged-template-expression/create-no-tagged-template-expression-rule/generate.js +142 -0
- package/dist/cjs/rules/no-css-tagged-template-expression/create-no-tagged-template-expression-rule/get-tagged-template-expression-offset.js +33 -0
- package/dist/cjs/rules/no-css-tagged-template-expression/create-no-tagged-template-expression-rule/index.js +89 -0
- package/dist/cjs/rules/no-css-tagged-template-expression/create-no-tagged-template-expression-rule/to-arguments.js +251 -0
- package/dist/cjs/rules/no-css-tagged-template-expression/create-no-tagged-template-expression-rule/types.js +5 -0
- package/dist/cjs/rules/no-css-tagged-template-expression/index.js +26 -0
- package/dist/cjs/rules/no-css-tagged-template-expression/is-supported-import.js +27 -0
- package/dist/cjs/rules/use-href-in-link-item/utils.js +8 -4
- package/dist/es2019/presets/all.codegen.js +2 -1
- package/dist/es2019/rules/index.codegen.js +3 -1
- package/dist/es2019/rules/no-css-tagged-template-expression/create-no-tagged-template-expression-rule/generate.js +106 -0
- package/dist/es2019/rules/no-css-tagged-template-expression/create-no-tagged-template-expression-rule/get-tagged-template-expression-offset.js +29 -0
- package/dist/es2019/rules/no-css-tagged-template-expression/create-no-tagged-template-expression-rule/index.js +59 -0
- package/dist/es2019/rules/no-css-tagged-template-expression/create-no-tagged-template-expression-rule/to-arguments.js +187 -0
- package/dist/es2019/rules/no-css-tagged-template-expression/create-no-tagged-template-expression-rule/types.js +1 -0
- package/dist/es2019/rules/no-css-tagged-template-expression/index.js +20 -0
- package/dist/es2019/rules/no-css-tagged-template-expression/is-supported-import.js +19 -0
- package/dist/es2019/rules/use-href-in-link-item/utils.js +8 -4
- package/dist/esm/presets/all.codegen.js +2 -1
- package/dist/esm/rules/index.codegen.js +3 -1
- package/dist/esm/rules/no-css-tagged-template-expression/create-no-tagged-template-expression-rule/generate.js +135 -0
- package/dist/esm/rules/no-css-tagged-template-expression/create-no-tagged-template-expression-rule/get-tagged-template-expression-offset.js +27 -0
- package/dist/esm/rules/no-css-tagged-template-expression/create-no-tagged-template-expression-rule/index.js +82 -0
- package/dist/esm/rules/no-css-tagged-template-expression/create-no-tagged-template-expression-rule/to-arguments.js +244 -0
- package/dist/esm/rules/no-css-tagged-template-expression/create-no-tagged-template-expression-rule/types.js +1 -0
- package/dist/esm/rules/no-css-tagged-template-expression/index.js +20 -0
- package/dist/esm/rules/no-css-tagged-template-expression/is-supported-import.js +21 -0
- package/dist/esm/rules/use-href-in-link-item/utils.js +8 -4
- package/dist/types/index.codegen.d.ts +1 -0
- package/dist/types/presets/all.codegen.d.ts +2 -1
- package/dist/types/rules/index.codegen.d.ts +1 -0
- package/dist/types/rules/no-css-tagged-template-expression/create-no-tagged-template-expression-rule/generate.d.ts +2 -0
- package/dist/types/rules/no-css-tagged-template-expression/create-no-tagged-template-expression-rule/get-tagged-template-expression-offset.d.ts +4 -0
- package/dist/types/rules/no-css-tagged-template-expression/create-no-tagged-template-expression-rule/index.d.ts +6 -0
- package/dist/types/rules/no-css-tagged-template-expression/create-no-tagged-template-expression-rule/to-arguments.d.ts +4 -0
- package/dist/types/rules/no-css-tagged-template-expression/create-no-tagged-template-expression-rule/types.d.ts +25 -0
- package/dist/types/rules/no-css-tagged-template-expression/index.d.ts +2 -0
- package/dist/types/rules/no-css-tagged-template-expression/is-supported-import.d.ts +12 -0
- package/dist/types-ts4.5/index.codegen.d.ts +1 -0
- package/dist/types-ts4.5/presets/all.codegen.d.ts +2 -1
- package/dist/types-ts4.5/rules/index.codegen.d.ts +1 -0
- package/dist/types-ts4.5/rules/no-css-tagged-template-expression/create-no-tagged-template-expression-rule/generate.d.ts +2 -0
- 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
- package/dist/types-ts4.5/rules/no-css-tagged-template-expression/create-no-tagged-template-expression-rule/index.d.ts +6 -0
- package/dist/types-ts4.5/rules/no-css-tagged-template-expression/create-no-tagged-template-expression-rule/to-arguments.d.ts +4 -0
- package/dist/types-ts4.5/rules/no-css-tagged-template-expression/create-no-tagged-template-expression-rule/types.d.ts +25 -0
- package/dist/types-ts4.5/rules/no-css-tagged-template-expression/index.d.ts +2 -0
- package/dist/types-ts4.5/rules/no-css-tagged-template-expression/is-supported-import.d.ts +12 -0
- package/package.json +1 -1
- package/report.api.md +2 -0
- package/tmp/api-report-tmp.d.ts +2 -0
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,17 @@
|
|
|
1
1
|
# @atlaskit/eslint-plugin-design-system
|
|
2
2
|
|
|
3
|
+
## 8.14.1
|
|
4
|
+
|
|
5
|
+
### Patch Changes
|
|
6
|
+
|
|
7
|
+
- [#42240](https://bitbucket.org/atlassian/atlassian-frontend/pull-requests/42240) [`ec474733d38`](https://bitbucket.org/atlassian/atlassian-frontend/commits/ec474733d38) - Handle destructured variables in link item rule.
|
|
8
|
+
|
|
9
|
+
## 8.14.0
|
|
10
|
+
|
|
11
|
+
### Minor Changes
|
|
12
|
+
|
|
13
|
+
- [#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.
|
|
14
|
+
|
|
3
15
|
## 8.13.1
|
|
4
16
|
|
|
5
17
|
### 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::
|
|
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::
|
|
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
|
+
};
|