eslint-plugin-th-rules 1.19.1 → 1.19.3
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 +14 -0
- package/README.md +0 -1
- package/package.json +1 -1
- package/src/index.js +0 -1
- package/src/rules/no-destructuring.js +80 -58
- package/docs/rules/styles-in-styles-file.md +0 -141
- package/src/rules/styles-in-styles-file.js +0 -143
package/CHANGELOG.md
CHANGED
|
@@ -1,3 +1,17 @@
|
|
|
1
|
+
## [1.19.3](https://github.com/tomerh2001/eslint-plugin-th-rules/compare/v1.19.2...v1.19.3) (2026-01-06)
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
### Bug Fixes
|
|
5
|
+
|
|
6
|
+
* remove styles-in-styles-file rule and update configs ([e6779c2](https://github.com/tomerh2001/eslint-plugin-th-rules/commit/e6779c2d6bf367fc9474c0ded5977b0a03ad159f))
|
|
7
|
+
|
|
8
|
+
## [1.19.2](https://github.com/tomerh2001/eslint-plugin-th-rules/compare/v1.19.1...v1.19.2) (2026-01-05)
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
### Bug Fixes
|
|
12
|
+
|
|
13
|
+
* clean up JSDoc comments and improve code readability in no-destructuring rule ([f7c2547](https://github.com/tomerh2001/eslint-plugin-th-rules/commit/f7c2547e71d41d19c874b1713c62bed25018803c))
|
|
14
|
+
|
|
1
15
|
## [1.19.1](https://github.com/tomerh2001/eslint-plugin-th-rules/compare/v1.19.0...v1.19.1) (2026-01-05)
|
|
2
16
|
|
|
3
17
|
|
package/README.md
CHANGED
|
@@ -22,7 +22,6 @@ This repository contains custom ESLint rules to enhance code quality and consist
|
|
|
22
22
|
| [no-default-export](docs/rules/no-default-export.md) | Convert unnamed default exports to named default exports based on the file name. | ✅ ⚛️ 🟦 | 🔧 |
|
|
23
23
|
| [no-destructuring](docs/rules/no-destructuring.md) | Disallow destructuring that does not meet certain conditions | ✅ ⚛️ 🟦 | |
|
|
24
24
|
| [schemas-in-schemas-file](docs/rules/schemas-in-schemas-file.md) | Require Zod schema declarations to be placed in a .schemas.ts file | ✅ ⚛️ 🟦 | |
|
|
25
|
-
| [styles-in-styles-file](docs/rules/styles-in-styles-file.md) | Require React-Native StyleSheet.create(...) to be placed in a .styles.ts file | ✅ ⚛️ 🟦 | |
|
|
26
25
|
| [top-level-functions](docs/rules/top-level-functions.md) | Require all top-level functions to be named/regular functions. | ✅ ⚛️ 🟦 | 🔧 |
|
|
27
26
|
| [types-in-dts](docs/rules/types-in-dts.md) | Require TypeScript type declarations (type/interface/enum) to be placed in .d.ts files | ✅ ⚛️ 🟦 | |
|
|
28
27
|
|
package/package.json
CHANGED
package/src/index.js
CHANGED
|
@@ -19,7 +19,6 @@ const configs = {
|
|
|
19
19
|
'th-rules/no-default-export': 'error',
|
|
20
20
|
'th-rules/no-comments': 'error',
|
|
21
21
|
'th-rules/top-level-functions': 'error',
|
|
22
|
-
'th-rules/styles-in-styles-file': 'error',
|
|
23
22
|
'th-rules/schemas-in-schemas-file': 'error',
|
|
24
23
|
'th-rules/types-in-dts': 'error',
|
|
25
24
|
'unicorn/prefer-module': 'warn',
|
|
@@ -1,19 +1,5 @@
|
|
|
1
1
|
const MAX_TAB_COUNT = 3;
|
|
2
2
|
|
|
3
|
-
/**
|
|
4
|
-
* Represents the metadata for the "no-destructuring" ESLint rule.
|
|
5
|
-
*
|
|
6
|
-
* @type {Object}
|
|
7
|
-
* @property {string} type - The type of the rule.
|
|
8
|
-
* @property {Object} docs - The documentation for the rule.
|
|
9
|
-
* @property {string} docs.description - The description of the rule.
|
|
10
|
-
* @property {string} docs.category - The category of the rule.
|
|
11
|
-
* @property {boolean} docs.recommended - Indicates if the rule is recommended.
|
|
12
|
-
* @property {Object[]} schema - The schema for the rule options.
|
|
13
|
-
* @property {Object} schema[].properties - The properties of the rule options.
|
|
14
|
-
* @property {number} schema[].properties.maximumDestructuredVariables - The maximum number of destructured variables allowed.
|
|
15
|
-
* @property {number} schema[].properties.maximumLineLength - The maximum line length allowed.
|
|
16
|
-
*/
|
|
17
3
|
const meta = {
|
|
18
4
|
type: 'problem',
|
|
19
5
|
docs: {
|
|
@@ -26,67 +12,103 @@ const meta = {
|
|
|
26
12
|
{
|
|
27
13
|
type: 'object',
|
|
28
14
|
properties: {
|
|
29
|
-
maximumDestructuredVariables: {
|
|
30
|
-
|
|
31
|
-
minimum: 0,
|
|
32
|
-
},
|
|
33
|
-
maximumLineLength: {
|
|
34
|
-
type: 'integer',
|
|
35
|
-
minimum: 0,
|
|
36
|
-
},
|
|
15
|
+
maximumDestructuredVariables: {type: 'integer', minimum: 0},
|
|
16
|
+
maximumLineLength: {type: 'integer', minimum: 0},
|
|
37
17
|
},
|
|
38
18
|
additionalProperties: false,
|
|
39
19
|
},
|
|
40
20
|
],
|
|
41
21
|
};
|
|
42
22
|
|
|
43
|
-
/**
|
|
44
|
-
* Creates an ESLint rule that checks for excessive destructuring in variable declarations.
|
|
45
|
-
* @param {Object} context - The ESLint rule context.
|
|
46
|
-
* @returns {Object} - The ESLint rule object.
|
|
47
|
-
*/
|
|
48
23
|
function create(context) {
|
|
49
|
-
const MAX_VARIABLES = context?.options[0]?.maximumDestructuredVariables
|
|
50
|
-
const MAX_LINE_LENGTH = context?.options[0]?.maximumLineLength
|
|
24
|
+
const MAX_VARIABLES = context?.options?.[0]?.maximumDestructuredVariables ?? 2;
|
|
25
|
+
const MAX_LINE_LENGTH = context?.options?.[0]?.maximumLineLength ?? 100;
|
|
51
26
|
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
27
|
+
const sourceCode = context.getSourceCode();
|
|
28
|
+
|
|
29
|
+
function reportIfNeeded(patternNode, reportNode = patternNode) {
|
|
30
|
+
if (!patternNode || patternNode.type !== 'ObjectPattern' || !patternNode.loc) {
|
|
31
|
+
return;
|
|
32
|
+
}
|
|
58
33
|
|
|
59
|
-
|
|
60
|
-
|
|
34
|
+
const lineText = sourceCode.lines[patternNode.loc.start.line - 1] ?? '';
|
|
35
|
+
const indentCount = lineText.search(/\S|$/);
|
|
36
|
+
|
|
37
|
+
const propertyCount = patternNode.properties?.length ?? 0;
|
|
38
|
+
|
|
39
|
+
const startLine = patternNode.loc.start.line;
|
|
40
|
+
const endLine = patternNode.loc.end.line;
|
|
41
|
+
let maxSpannedLineLength = 0;
|
|
42
|
+
for (let i = startLine; i <= endLine; i++) {
|
|
43
|
+
const t = sourceCode.lines[i - 1] ?? '';
|
|
44
|
+
if (t.length > maxSpannedLineLength) {
|
|
45
|
+
maxSpannedLineLength = t.length;
|
|
61
46
|
}
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
if (indentCount > MAX_TAB_COUNT) {
|
|
50
|
+
context.report({
|
|
51
|
+
node: reportNode,
|
|
52
|
+
message: `destructuring at a nesting level above ${MAX_TAB_COUNT} is not allowed, instead saw ${indentCount} levels of nesting`,
|
|
53
|
+
});
|
|
54
|
+
}
|
|
62
55
|
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
56
|
+
if (propertyCount > MAX_VARIABLES) {
|
|
57
|
+
context.report({
|
|
58
|
+
node: reportNode,
|
|
59
|
+
message: `destructuring of more than ${MAX_VARIABLES} variables is not allowed`,
|
|
60
|
+
});
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
if (maxSpannedLineLength > MAX_LINE_LENGTH) {
|
|
64
|
+
context.report({
|
|
65
|
+
node: reportNode,
|
|
66
|
+
message: `destructuring on a line exceeding ${MAX_LINE_LENGTH} characters is not allowed`,
|
|
67
|
+
});
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
function checkParameters(parameters) {
|
|
72
|
+
for (const p of parameters || []) {
|
|
73
|
+
if (!p) {
|
|
74
|
+
continue;
|
|
68
75
|
}
|
|
69
76
|
|
|
70
|
-
if (
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
message: `destructuring of more than ${MAX_VARIABLES} variables is not allowed`,
|
|
74
|
-
});
|
|
77
|
+
if (p.type === 'AssignmentPattern') {
|
|
78
|
+
reportIfNeeded(p.left, p);
|
|
79
|
+
continue;
|
|
75
80
|
}
|
|
76
81
|
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
+
reportIfNeeded(p, p);
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
return {
|
|
87
|
+
|
|
88
|
+
VariableDeclarator(node) {
|
|
89
|
+
reportIfNeeded(node?.id, node);
|
|
90
|
+
},
|
|
91
|
+
|
|
92
|
+
FunctionDeclaration(node) {
|
|
93
|
+
checkParameters(node.params);
|
|
94
|
+
},
|
|
95
|
+
FunctionExpression(node) {
|
|
96
|
+
checkParameters(node.params);
|
|
97
|
+
},
|
|
98
|
+
ArrowFunctionExpression(node) {
|
|
99
|
+
checkParameters(node.params);
|
|
100
|
+
},
|
|
101
|
+
|
|
102
|
+
MethodDefinition(node) {
|
|
103
|
+
if (node?.value?.params) {
|
|
104
|
+
checkParameters(node.value.params);
|
|
82
105
|
}
|
|
83
106
|
},
|
|
107
|
+
|
|
108
|
+
TSDeclareFunction(node) {
|
|
109
|
+
checkParameters(node.params);
|
|
110
|
+
},
|
|
84
111
|
};
|
|
85
112
|
}
|
|
86
113
|
|
|
87
|
-
|
|
88
|
-
meta,
|
|
89
|
-
create,
|
|
90
|
-
};
|
|
91
|
-
|
|
92
|
-
module.exports = rule;
|
|
114
|
+
module.exports = {meta, create};
|
|
@@ -1,141 +0,0 @@
|
|
|
1
|
-
# th-rules/styles-in-styles-file
|
|
2
|
-
|
|
3
|
-
📝 Require React-Native StyleSheet.create(...) to be placed in a .styles.ts file.
|
|
4
|
-
|
|
5
|
-
💼 This rule is enabled in the following configs: ✅ `recommended`, ⚛️ `recommended-react`, 🟦 `recommended-typescript`.
|
|
6
|
-
|
|
7
|
-
<!-- end auto-generated rule header -->
|
|
8
|
-
|
|
9
|
-
This rule enforces that React-Native stylesheet declarations created via `StyleSheet.create(...)` live in a dedicated styles file, typically ending with `.styles.ts`.
|
|
10
|
-
|
|
11
|
-
In practice, this prevents implementation/component files from containing large style objects, and encourages consistent separation of concerns.
|
|
12
|
-
|
|
13
|
-
## Rationale
|
|
14
|
-
|
|
15
|
-
Keeping styles in dedicated files:
|
|
16
|
-
- improves readability of component files by reducing visual noise,
|
|
17
|
-
- encourages reuse and consistency across components,
|
|
18
|
-
- makes style changes easier to review (diffs focus only on styles),
|
|
19
|
-
- standardizes project structure and naming conventions.
|
|
20
|
-
|
|
21
|
-
## What the rule reports
|
|
22
|
-
|
|
23
|
-
The rule reports any `StyleSheet.create(...)` call in files whose names do **not** match one of the allowed suffixes (by default, `.styles.ts`).
|
|
24
|
-
|
|
25
|
-
Optionally, it can also report `StyleSheet.compose(...)` calls.
|
|
26
|
-
|
|
27
|
-
## Examples
|
|
28
|
-
|
|
29
|
-
### ❌ Incorrect
|
|
30
|
-
|
|
31
|
-
```ts
|
|
32
|
-
// ArticleCard.tsx
|
|
33
|
-
import {StyleSheet} from 'react-native';
|
|
34
|
-
|
|
35
|
-
const styles = StyleSheet.create({
|
|
36
|
-
container: {padding: 12},
|
|
37
|
-
});
|
|
38
|
-
```
|
|
39
|
-
|
|
40
|
-
```ts
|
|
41
|
-
// AnyOtherFile.ts
|
|
42
|
-
import {StyleSheet} from 'react-native';
|
|
43
|
-
|
|
44
|
-
export default StyleSheet.create({
|
|
45
|
-
row: {flexDirection: 'row'},
|
|
46
|
-
});
|
|
47
|
-
```
|
|
48
|
-
|
|
49
|
-
### ✅ Correct
|
|
50
|
-
|
|
51
|
-
```ts
|
|
52
|
-
// ArticleCard.styles.ts
|
|
53
|
-
import {StyleSheet} from 'react-native';
|
|
54
|
-
|
|
55
|
-
export const styles = StyleSheet.create({
|
|
56
|
-
container: {padding: 12},
|
|
57
|
-
});
|
|
58
|
-
```
|
|
59
|
-
|
|
60
|
-
```ts
|
|
61
|
-
// ArticleCard.tsx
|
|
62
|
-
import React from 'react';
|
|
63
|
-
import {View} from 'react-native';
|
|
64
|
-
import {styles} from './ArticleCard.styles';
|
|
65
|
-
|
|
66
|
-
export function ArticleCard() {
|
|
67
|
-
return <View style={styles.container} />;
|
|
68
|
-
}
|
|
69
|
-
```
|
|
70
|
-
|
|
71
|
-
### `includeCompose` example
|
|
72
|
-
|
|
73
|
-
When `includeCompose: true`, the following becomes invalid outside a `.styles.ts(x)` file:
|
|
74
|
-
|
|
75
|
-
```ts
|
|
76
|
-
// ArticleCard.tsx
|
|
77
|
-
import {StyleSheet} from 'react-native';
|
|
78
|
-
|
|
79
|
-
const combined = StyleSheet.compose(
|
|
80
|
-
{padding: 12},
|
|
81
|
-
{margin: 8},
|
|
82
|
-
);
|
|
83
|
-
```
|
|
84
|
-
|
|
85
|
-
With the same code moved to `ArticleCard.styles.ts`, it becomes valid.
|
|
86
|
-
|
|
87
|
-
## Options
|
|
88
|
-
|
|
89
|
-
<!-- begin auto-generated rule options list -->
|
|
90
|
-
|
|
91
|
-
| Name | Type |
|
|
92
|
-
| :---------------- | :------- |
|
|
93
|
-
| `allowedSuffixes` | String[] |
|
|
94
|
-
| `includeCompose` | Boolean |
|
|
95
|
-
|
|
96
|
-
<!-- end auto-generated rule options list -->
|
|
97
|
-
|
|
98
|
-
### `allowedSuffixes`
|
|
99
|
-
|
|
100
|
-
An array of filename suffixes that are allowed to contain `StyleSheet.create(...)`.
|
|
101
|
-
|
|
102
|
-
Default:
|
|
103
|
-
- `.styles.ts`
|
|
104
|
-
|
|
105
|
-
Example:
|
|
106
|
-
|
|
107
|
-
```json
|
|
108
|
-
{
|
|
109
|
-
"rules": {
|
|
110
|
-
"th-rules/styles-in-styles-file": ["error", {
|
|
111
|
-
"allowedSuffixes": [".styles.ts", ".native-styles.ts"]
|
|
112
|
-
}]
|
|
113
|
-
}
|
|
114
|
-
}
|
|
115
|
-
```
|
|
116
|
-
|
|
117
|
-
### `includeCompose`
|
|
118
|
-
|
|
119
|
-
When set to `true`, the rule also enforces the file restriction for `StyleSheet.compose(...)`.
|
|
120
|
-
|
|
121
|
-
Default: `false`
|
|
122
|
-
|
|
123
|
-
Example:
|
|
124
|
-
|
|
125
|
-
```json
|
|
126
|
-
{
|
|
127
|
-
"rules": {
|
|
128
|
-
"th-rules/styles-in-styles-file": ["error", {
|
|
129
|
-
"includeCompose": true
|
|
130
|
-
}]
|
|
131
|
-
}
|
|
132
|
-
}
|
|
133
|
-
```
|
|
134
|
-
|
|
135
|
-
## Notes
|
|
136
|
-
|
|
137
|
-
- This rule only targets `StyleSheet.create(...)` (and optionally `StyleSheet.compose(...)`). It does not restrict:
|
|
138
|
-
- plain object styles (e.g., `const styles = { ... }`),
|
|
139
|
-
- other styling systems (e.g., styled-components, Tamagui, Emotion),
|
|
140
|
-
- calls to other `StyleSheet.*` helpers (e.g., `flatten`, `hairlineWidth`).
|
|
141
|
-
- The rule is filename-based. If ESLint is invoked with `<input>` (stdin), the rule will treat it as not being an allowed styles file.
|
|
@@ -1,143 +0,0 @@
|
|
|
1
|
-
const meta = {
|
|
2
|
-
type: 'problem',
|
|
3
|
-
docs: {
|
|
4
|
-
description: 'Require React-Native StyleSheet.create(...) to be placed in a .styles.ts file',
|
|
5
|
-
category: 'Stylistic Issues',
|
|
6
|
-
recommended: false,
|
|
7
|
-
url: 'https://github.com/tomerh2001/eslint-plugin-th-rules/blob/main/docs/rules/styles-in-styles-file.md',
|
|
8
|
-
},
|
|
9
|
-
schema: [
|
|
10
|
-
{
|
|
11
|
-
type: 'object',
|
|
12
|
-
properties: {
|
|
13
|
-
allowedSuffixes: {
|
|
14
|
-
type: 'array',
|
|
15
|
-
items: {type: 'string', minLength: 1},
|
|
16
|
-
minItems: 1,
|
|
17
|
-
},
|
|
18
|
-
includeCompose: {type: 'boolean'},
|
|
19
|
-
},
|
|
20
|
-
additionalProperties: false,
|
|
21
|
-
},
|
|
22
|
-
],
|
|
23
|
-
messages: {
|
|
24
|
-
moveStyles:
|
|
25
|
-
'React-Native styles must be defined in a dedicated styles file ({{suffixes}}).',
|
|
26
|
-
},
|
|
27
|
-
};
|
|
28
|
-
|
|
29
|
-
function create(context) {
|
|
30
|
-
const options = context.options?.[0] ?? {};
|
|
31
|
-
const allowedSuffixes = options.allowedSuffixes ?? ['.styles.ts'];
|
|
32
|
-
const includeCompose = Boolean(options.includeCompose);
|
|
33
|
-
|
|
34
|
-
function isAllowedStyleFile(filename) {
|
|
35
|
-
if (!filename || filename === '<input>') {
|
|
36
|
-
return false;
|
|
37
|
-
}
|
|
38
|
-
|
|
39
|
-
return allowedSuffixes.some(suffix => filename.endsWith(suffix));
|
|
40
|
-
}
|
|
41
|
-
|
|
42
|
-
function isStyleSheetMemberCall(node, memberName) {
|
|
43
|
-
const callee = node?.callee;
|
|
44
|
-
if (!callee || callee.type !== 'MemberExpression') {
|
|
45
|
-
return false;
|
|
46
|
-
}
|
|
47
|
-
|
|
48
|
-
const object = callee.object;
|
|
49
|
-
const property = callee.property;
|
|
50
|
-
|
|
51
|
-
return (
|
|
52
|
-
object?.type === 'Identifier'
|
|
53
|
-
&& object.name === 'StyleSheet'
|
|
54
|
-
&& !callee.computed
|
|
55
|
-
&& property?.type === 'Identifier'
|
|
56
|
-
&& property.name === memberName
|
|
57
|
-
);
|
|
58
|
-
}
|
|
59
|
-
|
|
60
|
-
/**
|
|
61
|
-
* Try to infer the “name” of the style object, e.g.:
|
|
62
|
-
* const styles = StyleSheet.create(...) -> "styles"
|
|
63
|
-
* styles = StyleSheet.create(...) -> "styles"
|
|
64
|
-
* exports.styles = StyleSheet.create(...) -> "exports.styles"
|
|
65
|
-
*/
|
|
66
|
-
function getAssignmentTargetName(callNode) {
|
|
67
|
-
const p = callNode.parent;
|
|
68
|
-
|
|
69
|
-
if (p?.type === 'VariableDeclarator') {
|
|
70
|
-
const id = p.id;
|
|
71
|
-
if (id?.type === 'Identifier') {
|
|
72
|
-
return id.name;
|
|
73
|
-
}
|
|
74
|
-
|
|
75
|
-
return null;
|
|
76
|
-
}
|
|
77
|
-
|
|
78
|
-
if (p?.type === 'AssignmentExpression') {
|
|
79
|
-
const left = p.left;
|
|
80
|
-
|
|
81
|
-
if (left?.type === 'Identifier') {
|
|
82
|
-
return left.name;
|
|
83
|
-
}
|
|
84
|
-
|
|
85
|
-
if (left?.type === 'MemberExpression' && !left.computed) {
|
|
86
|
-
const object = left.object;
|
|
87
|
-
const property = left.property;
|
|
88
|
-
|
|
89
|
-
const objectName
|
|
90
|
-
= object?.type === 'Identifier'
|
|
91
|
-
? object.name
|
|
92
|
-
: (object?.type === 'ThisExpression'
|
|
93
|
-
? 'this'
|
|
94
|
-
: null);
|
|
95
|
-
|
|
96
|
-
const propertyName = property?.type === 'Identifier' ? property.name : null;
|
|
97
|
-
|
|
98
|
-
if (objectName && propertyName) {
|
|
99
|
-
return `${objectName}.${propertyName}`;
|
|
100
|
-
}
|
|
101
|
-
}
|
|
102
|
-
|
|
103
|
-
return null;
|
|
104
|
-
}
|
|
105
|
-
|
|
106
|
-
return null;
|
|
107
|
-
}
|
|
108
|
-
|
|
109
|
-
function report(node) {
|
|
110
|
-
const filename = context.getFilename();
|
|
111
|
-
if (isAllowedStyleFile(filename)) {
|
|
112
|
-
return;
|
|
113
|
-
}
|
|
114
|
-
|
|
115
|
-
const targetName = getAssignmentTargetName(node);
|
|
116
|
-
const target = targetName ? ` "${targetName}"` : '';
|
|
117
|
-
|
|
118
|
-
context.report({
|
|
119
|
-
node,
|
|
120
|
-
messageId: 'moveStyles',
|
|
121
|
-
data: {
|
|
122
|
-
filename,
|
|
123
|
-
suffixes: allowedSuffixes.join(' or '),
|
|
124
|
-
target,
|
|
125
|
-
},
|
|
126
|
-
});
|
|
127
|
-
}
|
|
128
|
-
|
|
129
|
-
return {
|
|
130
|
-
CallExpression(node) {
|
|
131
|
-
if (isStyleSheetMemberCall(node, 'create')) {
|
|
132
|
-
report(node);
|
|
133
|
-
return;
|
|
134
|
-
}
|
|
135
|
-
|
|
136
|
-
if (includeCompose && isStyleSheetMemberCall(node, 'compose')) {
|
|
137
|
-
report(node);
|
|
138
|
-
}
|
|
139
|
-
},
|
|
140
|
-
};
|
|
141
|
-
}
|
|
142
|
-
|
|
143
|
-
module.exports = {meta, create};
|