@huangjunsen/eslint-config 1.0.0 → 1.0.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 (56) hide show
  1. package/.editorconfig +17 -17
  2. package/.eslintignore +17 -17
  3. package/.eslintrc.js +5 -5
  4. package/CHANGELOG.md +7 -0
  5. package/README.md +0 -286
  6. package/__tests__/fixtures/es5.js +4 -4
  7. package/__tests__/fixtures/index.js +3 -3
  8. package/__tests__/fixtures/node.js +23 -23
  9. package/__tests__/fixtures/react-display-name.js +7 -7
  10. package/__tests__/fixtures/react.jsx +132 -132
  11. package/__tests__/fixtures/ts-import-a.ts +3 -3
  12. package/__tests__/fixtures/ts-import-b.ts +3 -3
  13. package/__tests__/fixtures/ts-node.ts +19 -19
  14. package/__tests__/fixtures/ts-react.tsx +27 -27
  15. package/__tests__/fixtures/ts-vue.vue +36 -36
  16. package/__tests__/fixtures/ts.ts +17 -17
  17. package/__tests__/fixtures/vue.vue +16 -16
  18. package/__tests__/validate-js-configs.test.js +259 -259
  19. package/es5.js +10 -10
  20. package/essential/es5.js +12 -12
  21. package/essential/index.js +12 -12
  22. package/essential/react.js +76 -76
  23. package/essential/rules/blacklist.js +48 -48
  24. package/essential/rules/es6-blacklist.js +62 -62
  25. package/essential/rules/set-style-to-warn.js +30 -30
  26. package/essential/rules/ts-blacklist.js +15 -15
  27. package/essential/typescript/index.js +7 -7
  28. package/essential/typescript/react.js +7 -7
  29. package/essential/typescript/vue.js +9 -9
  30. package/essential/vue.js +8 -8
  31. package/flat/index.js +32 -0
  32. package/flat/react.js +19 -0
  33. package/flat/typescript.js +15 -0
  34. package/flat/vue.js +12 -0
  35. package/index.js +23 -23
  36. package/jsx-a11y.js +5 -5
  37. package/node.js +6 -6
  38. package/package.json +28 -10
  39. package/react.js +11 -11
  40. package/rules/base/best-practices.js +284 -284
  41. package/rules/base/es6.js +168 -168
  42. package/rules/base/possible-errors.js +126 -126
  43. package/rules/base/strict.js +6 -6
  44. package/rules/base/style.js +445 -445
  45. package/rules/base/variables.js +48 -48
  46. package/rules/es5.js +11 -11
  47. package/rules/imports.js +167 -167
  48. package/rules/jsx-a11y.js +23 -23
  49. package/rules/node.js +11 -11
  50. package/rules/react.js +354 -354
  51. package/rules/vue.js +96 -96
  52. package/typescript/node.js +6 -6
  53. package/typescript/react.js +6 -6
  54. package/typescript/vue.js +10 -10
  55. package/vue.js +10 -10
  56. package/LICENSE +0 -21
@@ -1,76 +1,76 @@
1
- module.exports = {
2
- extends: [
3
- '../react',
4
- './rules/set-style-to-warn',
5
- './rules/blacklist',
6
- './rules/es6-blacklist',
7
- ].map(require.resolve),
8
- rules: {
9
- // 标签的属性有多行时,结束标签需另起一行
10
- // @unessential
11
- 'react/jsx-closing-bracket-location': ['warn', 'line-aligned'],
12
-
13
- // JSX 语法闭合标签的缩进和换行
14
- // @unessential
15
- 'react/jsx-closing-tag-location': 'warn',
16
-
17
- // JSX 行内属性间仅有一个空格
18
- // @unessential
19
- 'react/jsx-props-no-multi-spaces': 'warn',
20
-
21
- // JSX 属性的大括号内部两侧无空格
22
- // @unessential
23
- 'react/jsx-curly-spacing': ['warn', 'never', { allowMultiline: true }],
24
-
25
- // JSX 属性使用 2 个空格缩进
26
- // @unessential
27
- 'react/jsx-indent-props': ['off', 2],
28
-
29
- // 标签属性的换行,如果标签有多个属性,且存在换行,则每个属性都需要换行独占一行
30
- // @unessential
31
- 'react/jsx-max-props-per-line': ['warn', { maximum: 1, when: 'multiline' }],
32
-
33
- // 禁止使用已经废弃的方法
34
- // @unessential
35
- 'react/no-deprecated': 'warn',
36
-
37
- // 多行的 JSX 标签需用小括号包裹
38
- // @unessential
39
- 'react/jsx-wrap-multilines': [
40
- 'warn',
41
- {
42
- declaration: true,
43
- assignment: true,
44
- return: true,
45
- arrow: true,
46
- },
47
- ],
48
-
49
- // 设置第一个属性的位置。multiline-multiprop:如果JSX标签占用多行并且有多个属性,则第一个属性应始终放在新行上
50
- // @unessential
51
- 'react/jsx-first-prop-new-line': ['warn', 'multiline-multiprop'],
52
-
53
- // 不要在 JSX 属性的等号两边加空格
54
- // @unessential
55
- 'react/jsx-equals-spacing': ['warn', 'never'],
56
-
57
- // JSX 使用 2 个空格缩进
58
- // @unessential
59
- 'react/jsx-indent': ['off', 2],
60
-
61
- // 不要使用 findDOMNode,严格模式下已经弃用
62
- // @unessential
63
- 'react/no-find-dom-node': 'warn',
64
-
65
- // 自闭合标签的斜线前有且仅有一个空格
66
- // @unessential
67
- 'react/jsx-tag-spacing': [
68
- 'warn',
69
- {
70
- closingSlash: 'never',
71
- beforeSelfClosing: 'always',
72
- afterOpening: 'never',
73
- },
74
- ],
75
- },
76
- };
1
+ module.exports = {
2
+ extends: [
3
+ '../react',
4
+ './rules/set-style-to-warn',
5
+ './rules/blacklist',
6
+ './rules/es6-blacklist',
7
+ ].map(require.resolve),
8
+ rules: {
9
+ // 标签的属性有多行时,结束标签需另起一行
10
+ // @unessential
11
+ 'react/jsx-closing-bracket-location': ['warn', 'line-aligned'],
12
+
13
+ // JSX 语法闭合标签的缩进和换行
14
+ // @unessential
15
+ 'react/jsx-closing-tag-location': 'warn',
16
+
17
+ // JSX 行内属性间仅有一个空格
18
+ // @unessential
19
+ 'react/jsx-props-no-multi-spaces': 'warn',
20
+
21
+ // JSX 属性的大括号内部两侧无空格
22
+ // @unessential
23
+ 'react/jsx-curly-spacing': ['warn', 'never', { allowMultiline: true }],
24
+
25
+ // JSX 属性使用 2 个空格缩进
26
+ // @unessential
27
+ 'react/jsx-indent-props': ['off', 2],
28
+
29
+ // 标签属性的换行,如果标签有多个属性,且存在换行,则每个属性都需要换行独占一行
30
+ // @unessential
31
+ 'react/jsx-max-props-per-line': ['warn', { maximum: 1, when: 'multiline' }],
32
+
33
+ // 禁止使用已经废弃的方法
34
+ // @unessential
35
+ 'react/no-deprecated': 'warn',
36
+
37
+ // 多行的 JSX 标签需用小括号包裹
38
+ // @unessential
39
+ 'react/jsx-wrap-multilines': [
40
+ 'warn',
41
+ {
42
+ declaration: true,
43
+ assignment: true,
44
+ return: true,
45
+ arrow: true,
46
+ },
47
+ ],
48
+
49
+ // 设置第一个属性的位置。multiline-multiprop:如果JSX标签占用多行并且有多个属性,则第一个属性应始终放在新行上
50
+ // @unessential
51
+ 'react/jsx-first-prop-new-line': ['warn', 'multiline-multiprop'],
52
+
53
+ // 不要在 JSX 属性的等号两边加空格
54
+ // @unessential
55
+ 'react/jsx-equals-spacing': ['warn', 'never'],
56
+
57
+ // JSX 使用 2 个空格缩进
58
+ // @unessential
59
+ 'react/jsx-indent': ['off', 2],
60
+
61
+ // 不要使用 findDOMNode,严格模式下已经弃用
62
+ // @unessential
63
+ 'react/no-find-dom-node': 'warn',
64
+
65
+ // 自闭合标签的斜线前有且仅有一个空格
66
+ // @unessential
67
+ 'react/jsx-tag-spacing': [
68
+ 'warn',
69
+ {
70
+ closingSlash: 'never',
71
+ beforeSelfClosing: 'always',
72
+ afterOpening: 'never',
73
+ },
74
+ ],
75
+ },
76
+ };
@@ -1,48 +1,48 @@
1
- module.exports = {
2
- rules: {
3
- // 统一在点号之前换行
4
- // @unessential
5
- 'dot-location': ['warn', 'property'],
6
-
7
- // 禁止使用 eval
8
- // @unessential 部分场景必须使用 eval
9
- 'no-eval': 'warn',
10
-
11
- // 禁止使用类 eval 的方法,如 setTimeout 传入字符串
12
- // @unessential
13
- 'no-implied-eval': 'warn',
14
-
15
- // 禁止使用 javascript:url,如 location.href = 'javascript:void(0)';
16
- // @unessential
17
- 'no-script-url': 'warn',
18
-
19
- // 禁止变量与外层作用域已存在的变量同名
20
- // @unessential
21
- 'no-shadow': 'warn',
22
-
23
- // 禁止出现多个连续空格
24
- // @unessential
25
- 'no-multi-spaces': [
26
- 'warn',
27
- {
28
- ignoreEOLComments: false,
29
- },
30
- ],
31
-
32
- // 使用 2 个空格缩进
33
- // @unessential
34
- indent: 'off',
35
-
36
- // 使用分号
37
- // @unessential
38
- semi: 'off',
39
-
40
- // 分号必须写在行尾
41
- // @unessential
42
- 'semi-style': 'off',
43
-
44
- // 不要直接在对象上调用 Object.prototypes 上的方法
45
- // @unessential
46
- 'no-prototype-builtins': 'warn',
47
- },
48
- };
1
+ module.exports = {
2
+ rules: {
3
+ // 统一在点号之前换行
4
+ // @unessential
5
+ 'dot-location': ['warn', 'property'],
6
+
7
+ // 禁止使用 eval
8
+ // @unessential 部分场景必须使用 eval
9
+ 'no-eval': 'warn',
10
+
11
+ // 禁止使用类 eval 的方法,如 setTimeout 传入字符串
12
+ // @unessential
13
+ 'no-implied-eval': 'warn',
14
+
15
+ // 禁止使用 javascript:url,如 location.href = 'javascript:void(0)';
16
+ // @unessential
17
+ 'no-script-url': 'warn',
18
+
19
+ // 禁止变量与外层作用域已存在的变量同名
20
+ // @unessential
21
+ 'no-shadow': 'warn',
22
+
23
+ // 禁止出现多个连续空格
24
+ // @unessential
25
+ 'no-multi-spaces': [
26
+ 'warn',
27
+ {
28
+ ignoreEOLComments: false,
29
+ },
30
+ ],
31
+
32
+ // 使用 2 个空格缩进
33
+ // @unessential
34
+ indent: 'off',
35
+
36
+ // 使用分号
37
+ // @unessential
38
+ semi: 'off',
39
+
40
+ // 分号必须写在行尾
41
+ // @unessential
42
+ 'semi-style': 'off',
43
+
44
+ // 不要直接在对象上调用 Object.prototypes 上的方法
45
+ // @unessential
46
+ 'no-prototype-builtins': 'warn',
47
+ },
48
+ };
@@ -1,62 +1,62 @@
1
- module.exports = {
2
- rules: {
3
- // 箭头函数的箭头前后各留一个空格
4
- // @unessential
5
- 'arrow-spacing': ['warn', { before: true, after: true }],
6
-
7
- // generator 函数的 * 号前面无空格,后面有一个空格
8
- // @unessential
9
- 'generator-star-spacing': ['warn', { before: false, after: true }],
10
-
11
- // 避免箭头函数与比较操作符产生混淆
12
- // @unessential
13
- 'no-confusing-arrow': 'warn',
14
-
15
- // 回调函数使用箭头函数而不是匿名函数
16
- // @unessential
17
- 'prefer-arrow-callback': [
18
- 'warn',
19
- {
20
- allowNamedFunctions: false,
21
- allowUnboundThis: true,
22
- },
23
- ],
24
-
25
- // 优先使用 const,只有当变量会被重新赋值时才使用 let
26
- // @unessential
27
- 'prefer-const': [
28
- 'warn',
29
- {
30
- destructuring: 'any',
31
- ignoreReadBeforeAssign: true,
32
- },
33
- ],
34
-
35
- // 模板字符串中的大括号内部两侧无空格
36
- // @unessential
37
- 'template-curly-spacing': 'warn',
38
-
39
- // yield* 表达式的 * 号前面无空格,后面有一个空格
40
- // @unessential
41
- 'yield-star-spacing': ['warn', 'after'],
42
-
43
- // import 语句需要放到模块的最上方
44
- // @unessential
45
- 'import/first': 'warn',
46
-
47
- // 使用对象属性和方法的简写语法
48
- // @unessential
49
- 'object-shorthand': [
50
- 'warn',
51
- 'always',
52
- {
53
- ignoreConstructors: false,
54
- avoidQuotes: true,
55
- },
56
- ],
57
-
58
- // 使用 const 或 let 声明变量,不要使用 var
59
- // @unessential
60
- 'no-var': 'warn',
61
- },
62
- };
1
+ module.exports = {
2
+ rules: {
3
+ // 箭头函数的箭头前后各留一个空格
4
+ // @unessential
5
+ 'arrow-spacing': ['warn', { before: true, after: true }],
6
+
7
+ // generator 函数的 * 号前面无空格,后面有一个空格
8
+ // @unessential
9
+ 'generator-star-spacing': ['warn', { before: false, after: true }],
10
+
11
+ // 避免箭头函数与比较操作符产生混淆
12
+ // @unessential
13
+ 'no-confusing-arrow': 'warn',
14
+
15
+ // 回调函数使用箭头函数而不是匿名函数
16
+ // @unessential
17
+ 'prefer-arrow-callback': [
18
+ 'warn',
19
+ {
20
+ allowNamedFunctions: false,
21
+ allowUnboundThis: true,
22
+ },
23
+ ],
24
+
25
+ // 优先使用 const,只有当变量会被重新赋值时才使用 let
26
+ // @unessential
27
+ 'prefer-const': [
28
+ 'warn',
29
+ {
30
+ destructuring: 'any',
31
+ ignoreReadBeforeAssign: true,
32
+ },
33
+ ],
34
+
35
+ // 模板字符串中的大括号内部两侧无空格
36
+ // @unessential
37
+ 'template-curly-spacing': 'warn',
38
+
39
+ // yield* 表达式的 * 号前面无空格,后面有一个空格
40
+ // @unessential
41
+ 'yield-star-spacing': ['warn', 'after'],
42
+
43
+ // import 语句需要放到模块的最上方
44
+ // @unessential
45
+ 'import/first': 'warn',
46
+
47
+ // 使用对象属性和方法的简写语法
48
+ // @unessential
49
+ 'object-shorthand': [
50
+ 'warn',
51
+ 'always',
52
+ {
53
+ ignoreConstructors: false,
54
+ avoidQuotes: true,
55
+ },
56
+ ],
57
+
58
+ // 使用 const 或 let 声明变量,不要使用 var
59
+ // @unessential
60
+ 'no-var': 'warn',
61
+ },
62
+ };
@@ -1,30 +1,30 @@
1
- /**
2
- * 将 error 级别的 style 规则降级为 warn
3
- */
4
-
5
- // 将传入 config 中 error 级别规则都改为 warn 级别
6
- function setErrorRulesToWarn(configPath) {
7
- const config = require(configPath);
8
- const { rules } = config;
9
-
10
- for (const ruleName in rules) {
11
- if (Object.prototype.hasOwnProperty.call(rules, ruleName)) {
12
- const ruleValue = rules[ruleName];
13
- if (Array.isArray(ruleValue)) {
14
- // 'array-bracket-spacing': [ 'error', 'never' ] 这种规则写法
15
- if (ruleValue[0] === 'error') {
16
- ruleValue[0] = 'warn';
17
- }
18
- } else if (ruleValue === 'error') {
19
- // 'new-parens': 'error' 这种规则写法
20
- rules[ruleName] = 'warn';
21
- }
22
- }
23
- }
24
-
25
- return {
26
- rules,
27
- };
28
- }
29
-
30
- module.exports = setErrorRulesToWarn('../../rules/base/style.js');
1
+ /**
2
+ * 将 error 级别的 style 规则降级为 warn
3
+ */
4
+
5
+ // 将传入 config 中 error 级别规则都改为 warn 级别
6
+ function setErrorRulesToWarn(configPath) {
7
+ const config = require(configPath);
8
+ const { rules } = config;
9
+
10
+ for (const ruleName in rules) {
11
+ if (Object.prototype.hasOwnProperty.call(rules, ruleName)) {
12
+ const ruleValue = rules[ruleName];
13
+ if (Array.isArray(ruleValue)) {
14
+ // 'array-bracket-spacing': [ 'error', 'never' ] 这种规则写法
15
+ if (ruleValue[0] === 'error') {
16
+ ruleValue[0] = 'warn';
17
+ }
18
+ } else if (ruleValue === 'error') {
19
+ // 'new-parens': 'error' 这种规则写法
20
+ rules[ruleName] = 'warn';
21
+ }
22
+ }
23
+ }
24
+
25
+ return {
26
+ rules,
27
+ };
28
+ }
29
+
30
+ module.exports = setErrorRulesToWarn('../../rules/base/style.js');
@@ -1,15 +1,15 @@
1
- module.exports = {
2
- rules: {
3
- // 使用 2 个空格缩进
4
- // @unessential
5
- '@typescript-eslint/indent': 'off',
6
-
7
- // 使用分号
8
- // @unessential
9
- '@typescript-eslint/semi': 'off',
10
-
11
- '@typescript-eslint/adjacent-overload-signatures': 'warn',
12
-
13
- '@typescript-eslint/no-parameter-properties': 'warn',
14
- },
15
- };
1
+ module.exports = {
2
+ rules: {
3
+ // 使用 2 个空格缩进
4
+ // @unessential
5
+ '@typescript-eslint/indent': 'off',
6
+
7
+ // 使用分号
8
+ // @unessential
9
+ '@typescript-eslint/semi': 'off',
10
+
11
+ '@typescript-eslint/adjacent-overload-signatures': 'warn',
12
+
13
+ '@typescript-eslint/no-parameter-properties': 'warn',
14
+ },
15
+ };
@@ -1,7 +1,7 @@
1
- module.exports = {
2
- extends: [
3
- '../index',
4
- '../../rules/typescript',
5
- '../rules/ts-blacklist',
6
- ].map(require.resolve),
7
- };
1
+ module.exports = {
2
+ extends: [
3
+ '../index',
4
+ '../../rules/typescript',
5
+ '../rules/ts-blacklist',
6
+ ].map(require.resolve),
7
+ };
@@ -1,7 +1,7 @@
1
- module.exports = {
2
- extends: [
3
- '../react',
4
- '../../rules/typescript',
5
- '../rules/ts-blacklist',
6
- ].map(require.resolve),
7
- };
1
+ module.exports = {
2
+ extends: [
3
+ '../react',
4
+ '../../rules/typescript',
5
+ '../rules/ts-blacklist',
6
+ ].map(require.resolve),
7
+ };
@@ -1,9 +1,9 @@
1
- module.exports = {
2
- extends: [
3
- './index',
4
- '../../rules/vue', // vue 要置于最后,因为里面用了 vue-parser
5
- ].map(require.resolve),
6
- parserOptions: {
7
- parser: '@typescript-eslint/parser',
8
- },
9
- };
1
+ module.exports = {
2
+ extends: [
3
+ './index',
4
+ '../../rules/vue', // vue 要置于最后,因为里面用了 vue-parser
5
+ ].map(require.resolve),
6
+ parserOptions: {
7
+ parser: '@typescript-eslint/parser',
8
+ },
9
+ };
package/essential/vue.js CHANGED
@@ -1,8 +1,8 @@
1
- module.exports = {
2
- extends: [
3
- '../vue',
4
- './rules/set-style-to-warn',
5
- './rules/blacklist',
6
- './rules/es6-blacklist',
7
- ].map(require.resolve),
8
- };
1
+ module.exports = {
2
+ extends: [
3
+ '../vue',
4
+ './rules/set-style-to-warn',
5
+ './rules/blacklist',
6
+ './rules/es6-blacklist',
7
+ ].map(require.resolve),
8
+ };
package/flat/index.js ADDED
@@ -0,0 +1,32 @@
1
+ const globals = require('globals');
2
+
3
+ /**
4
+ * 基础 JS Flat Config 配置
5
+ */
6
+ module.exports = [
7
+ {
8
+ languageOptions: {
9
+ ecmaVersion: 'latest',
10
+ sourceType: 'module',
11
+ globals: {
12
+ ...globals.browser,
13
+ ...globals.node,
14
+ ...globals.es2021,
15
+ },
16
+ },
17
+ linterOptions: {
18
+ reportUnusedDisableDirectives: 'warn',
19
+ },
20
+ rules: {
21
+ // 常见逻辑防错规则(非纯排版格式)
22
+ 'no-var': 'error',
23
+ 'prefer-const': ['error', { destructuring: 'all' }],
24
+ 'no-unused-vars': ['warn', { argsIgnorePattern: '^_', varsIgnorePattern: '^_' }],
25
+ 'no-constant-condition': 'warn',
26
+ 'no-debugger': process.env.NODE_ENV === 'production' ? 'error' : 'warn',
27
+ 'no-console': process.env.NODE_ENV === 'production' ? 'warn' : 'off',
28
+ 'no-duplicate-imports': 'error',
29
+ eqeqeq: ['warn', 'always', { null: 'ignore' }],
30
+ },
31
+ },
32
+ ];
package/flat/react.js ADDED
@@ -0,0 +1,19 @@
1
+ const base = require('./index');
2
+
3
+ /**
4
+ * React Flat Config 配置
5
+ */
6
+ module.exports = [
7
+ ...base,
8
+ {
9
+ files: ['**/*.jsx', '**/*.tsx'],
10
+ languageOptions: {
11
+ parserOptions: {
12
+ ecmaFeatures: {
13
+ jsx: true,
14
+ },
15
+ },
16
+ },
17
+ rules: {},
18
+ },
19
+ ];
@@ -0,0 +1,15 @@
1
+ const base = require('./index');
2
+
3
+ /**
4
+ * TypeScript Flat Config 配置
5
+ */
6
+ module.exports = [
7
+ ...base,
8
+ {
9
+ files: ['**/*.ts', '**/*.tsx', '**/*.mts', '**/*.cts'],
10
+ rules: {
11
+ 'no-unused-vars': 'off',
12
+ // TS 规范
13
+ },
14
+ },
15
+ ];
package/flat/vue.js ADDED
@@ -0,0 +1,12 @@
1
+ const base = require('./index');
2
+
3
+ /**
4
+ * Vue Flat Config 配置
5
+ */
6
+ module.exports = [
7
+ ...base,
8
+ {
9
+ files: ['**/*.vue'],
10
+ rules: {},
11
+ },
12
+ ];
package/index.js CHANGED
@@ -1,23 +1,23 @@
1
- module.exports = {
2
- extends: [
3
- './rules/base/best-practices',
4
- './rules/base/possible-errors',
5
- './rules/base/style',
6
- './rules/base/variables',
7
- './rules/base/es6',
8
- './rules/base/strict',
9
- './rules/imports',
10
- ].map(require.resolve),
11
- parser: '@babel/eslint-parser',
12
- parserOptions: {
13
- requireConfigFile: false,
14
- ecmaVersion: 2020,
15
- sourceType: 'module',
16
- ecmaFeatures: {
17
- globalReturn: false,
18
- impliedStrict: true,
19
- jsx: true,
20
- },
21
- },
22
- root: true,
23
- };
1
+ module.exports = {
2
+ extends: [
3
+ './rules/base/best-practices',
4
+ './rules/base/possible-errors',
5
+ './rules/base/style',
6
+ './rules/base/variables',
7
+ './rules/base/es6',
8
+ './rules/base/strict',
9
+ './rules/imports',
10
+ ].map(require.resolve),
11
+ parser: '@babel/eslint-parser',
12
+ parserOptions: {
13
+ requireConfigFile: false,
14
+ ecmaVersion: 2020,
15
+ sourceType: 'module',
16
+ ecmaFeatures: {
17
+ globalReturn: false,
18
+ impliedStrict: true,
19
+ jsx: true,
20
+ },
21
+ },
22
+ root: true,
23
+ };