@cherepanov.pavel/shareable-config 1.0.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 (54) hide show
  1. package/.editorconfig +11 -0
  2. package/.editorconfig-get.js +19 -0
  3. package/.get-all.js +29 -0
  4. package/.gitattributes +1 -0
  5. package/.gitattributes-get.js +19 -0
  6. package/.gitignore +15 -0
  7. package/.gitignore-get.js +47 -0
  8. package/.vscode/.code-snippets-get.js +49 -0
  9. package/.vscode/all-files.code-snippets +18 -0
  10. package/.vscode/extensions.json +25 -0
  11. package/.vscode/extensions.json-get.js +43 -0
  12. package/.vscode/settings.json +42 -0
  13. package/.vscode/settings.json-get.js +43 -0
  14. package/.vscode/vue.code-snippets +28 -0
  15. package/README.md +10 -0
  16. package/env.json5.set.js +14 -0
  17. package/jsconfig.json +9 -0
  18. package/package.json +54 -0
  19. package/tools/eslint-config/configs/global.js +26 -0
  20. package/tools/eslint-config/configs/javascript.js +21 -0
  21. package/tools/eslint-config/configs/typescript.js +28 -0
  22. package/tools/eslint-config/configs/vue.js +43 -0
  23. package/tools/eslint-config/index.js +4 -0
  24. package/tools/eslint-config/rules/constants.js +15 -0
  25. package/tools/eslint-config/rules/javascript/index.js +7 -0
  26. package/tools/eslint-config/rules/javascript/possible-problems.js +62 -0
  27. package/tools/eslint-config/rules/javascript/suggestions.js +254 -0
  28. package/tools/eslint-config/rules/severity.js +3 -0
  29. package/tools/eslint-config/rules/stylistic/index.js +2 -0
  30. package/tools/eslint-config/rules/stylistic/jsFormatting.js +172 -0
  31. package/tools/eslint-config/rules/stylistic/tsFormatting.js +9 -0
  32. package/tools/eslint-config/rules/typescript/common.js +130 -0
  33. package/tools/eslint-config/rules/typescript/compatibility.js +24 -0
  34. package/tools/eslint-config/rules/typescript/extension.js +52 -0
  35. package/tools/eslint-config/rules/typescript/index.js +9 -0
  36. package/tools/eslint-config/rules/vue/base.js +6 -0
  37. package/tools/eslint-config/rules/vue/extension.js +58 -0
  38. package/tools/eslint-config/rules/vue/formatting.js +41 -0
  39. package/tools/eslint-config/rules/vue/index.js +13 -0
  40. package/tools/eslint-config/rules/vue/possibleProblems.js +113 -0
  41. package/tools/eslint-config/rules/vue/suggestions.js +83 -0
  42. package/tools/stylelint-config/config.js +29 -0
  43. package/tools/stylelint-config/rules/base.js +26 -0
  44. package/tools/stylelint-config/rules/conflicts.js +7 -0
  45. package/tools/stylelint-config/rules/order.js +42 -0
  46. package/tools/stylelint-config/rules/property-groups.js +404 -0
  47. package/tools/stylelint-config/rules/scss.js +8 -0
  48. package/tools/stylelint-config/rules/stylistic.js +124 -0
  49. package/utils/communication.js +33 -0
  50. package/utils/copy-with-override.js +43 -0
  51. package/utils/env.js +16 -0
  52. package/utils/file-header.js +16 -0
  53. package/utils/file.js +64 -0
  54. package/utils/merge.js +180 -0
@@ -0,0 +1,52 @@
1
+ import { OFF } from '../severity.js';
2
+
3
+ import { suggestionRules } from '../javascript/suggestions.js';
4
+ import { possibleProblemRules } from '../javascript/possible-problems.js';
5
+
6
+ export const extensionsRules = {
7
+ 'class-methods-use-this': OFF,
8
+ '@typescript-eslint/class-methods-use-this': suggestionRules['class-methods-use-this'],
9
+ 'default-param-last': OFF,
10
+ '@typescript-eslint/default-param-last': suggestionRules['default-param-last'],
11
+ 'dot-notation': OFF,
12
+ '@typescript-eslint/dot-notation': suggestionRules['dot-notation'],
13
+ 'init-declarations': OFF,
14
+ '@typescript-eslint/init-declarations': suggestionRules['init-declarations'],
15
+ 'no-array-constructor': OFF,
16
+ '@typescript-eslint/no-array-constructor': suggestionRules['no-array-constructor'],
17
+ 'no-empty-function': OFF,
18
+ '@typescript-eslint/no-empty-function': suggestionRules['no-empty-function'],
19
+ 'no-implied-eval': OFF,
20
+ '@typescript-eslint/no-implied-eval': suggestionRules['no-implied-eval'],
21
+ 'no-invalid-this': OFF,
22
+ '@typescript-eslint/no-invalid-this': suggestionRules['no-invalid-this'],
23
+ 'no-loop-func': OFF,
24
+ '@typescript-eslint/no-loop-func': suggestionRules['no-loop-func'],
25
+ 'no-magic-numbers': OFF,
26
+ '@typescript-eslint/no-magic-numbers': suggestionRules['no-magic-numbers'],
27
+ 'no-redeclare': OFF,
28
+ '@typescript-eslint/no-redeclare': suggestionRules['no-redeclare'],
29
+ 'no-restricted-imports': OFF,
30
+ '@typescript-eslint/no-restricted-imports': suggestionRules['no-restricted-imports'],
31
+ 'no-shadow': OFF,
32
+ '@typescript-eslint/no-shadow': suggestionRules['no-shadow'],
33
+ 'no-throw-literal': OFF,
34
+ // '@typescript-eslint/no-throw-literal': suggestionRules['no-throw-literal'],
35
+ 'no-unused-expressions': OFF,
36
+ '@typescript-eslint/no-unused-expressions': suggestionRules['no-unused-expressions'],
37
+ 'no-useless-constructor': OFF,
38
+ '@typescript-eslint/no-useless-constructor': suggestionRules['no-useless-constructor'],
39
+ 'require-await': OFF,
40
+ '@typescript-eslint/require-await': suggestionRules['require-await'],
41
+ 'no-return-await': OFF,
42
+ '@typescript-eslint/return-await': suggestionRules['no-return-await'],
43
+
44
+ 'no-dupe-class-members': OFF,
45
+ '@typescript-eslint/no-dupe-class-members': possibleProblemRules['no-dupe-class-members'],
46
+ 'no-loss-of-precision': OFF,
47
+ '@typescript-eslint/no-loss-of-precision': possibleProblemRules['no-loss-of-precision'],
48
+ 'no-unused-vars': OFF,
49
+ '@typescript-eslint/no-unused-vars': possibleProblemRules['no-unused-vars'],
50
+ 'no-use-before-define': OFF,
51
+ '@typescript-eslint/no-use-before-define': possibleProblemRules['no-use-before-define'],
52
+ };
@@ -0,0 +1,9 @@
1
+ import { compatibilityRules } from './compatibility.js';
2
+ import { commonRules } from './common.js';
3
+ import { extensionsRules } from './extension.js';
4
+
5
+ export const tsRules = {
6
+ ...compatibilityRules,
7
+ ...extensionsRules,
8
+ ...commonRules,
9
+ };
@@ -0,0 +1,6 @@
1
+ import { ERROR, OFF } from '../severity.js';
2
+
3
+ export const baseRules = {
4
+ 'vue/comment-directive': [OFF],
5
+ 'vue/jsx-uses-vars': [ERROR],
6
+ };
@@ -0,0 +1,58 @@
1
+ import { ERROR, OFF } from '../severity.js';
2
+ import { MAX_LEN } from '../constants.js';
3
+
4
+ import { possibleProblemRules } from '../javascript/possible-problems.js';
5
+ import { suggestionRules } from '../javascript/suggestions.js';
6
+
7
+ import { jsFormatting } from '../stylistic/index.js';
8
+
9
+ export const extensionRules = {
10
+ 'vue/no-constant-condition': possibleProblemRules['no-constant-condition'],
11
+ 'vue/no-empty-pattern': possibleProblemRules['no-empty-pattern'],
12
+ 'vue/no-irregular-whitespace': possibleProblemRules['no-irregular-whitespace'],
13
+ 'vue/no-loss-of-precision': possibleProblemRules['no-loss-of-precision'],
14
+ 'vue/no-sparse-arrays': possibleProblemRules['no-sparse-arrays'],
15
+
16
+ 'vue/camelcase': suggestionRules.camelcase,
17
+ 'vue/dot-notation': suggestionRules['dot-notation'],
18
+ 'vue/eqeqeq': suggestionRules.eqeqeq,
19
+ 'vue/no-console': suggestionRules['no-console'],
20
+ 'vue/no-restricted-syntax': suggestionRules['no-restricted-syntax'],
21
+ 'vue/no-useless-concat': suggestionRules['no-useless-concat'],
22
+ 'vue/object-shorthand': suggestionRules['object-shorthand'],
23
+ 'vue/prefer-template': suggestionRules['prefer-template'],
24
+
25
+ 'vue/array-bracket-newline': jsFormatting['@stylistic/array-bracket-newline'],
26
+ 'vue/array-bracket-spacing': jsFormatting['@stylistic/array-bracket-spacing'],
27
+ 'vue/array-element-newline': jsFormatting['@stylistic/array-element-newline'],
28
+ 'vue/arrow-spacing': jsFormatting['@stylistic/arrow-spacing'],
29
+ 'vue/block-spacing': jsFormatting['@stylistic/block-spacing'],
30
+ 'vue/brace-style': jsFormatting['@stylistic/brace-style'],
31
+ 'vue/comma-dangle': jsFormatting['@stylistic/comma-dangle'],
32
+ 'vue/comma-spacing': jsFormatting['@stylistic/comma-spacing'],
33
+ 'vue/comma-style': jsFormatting['@stylistic/comma-style'],
34
+ 'vue/dot-location': jsFormatting['@stylistic/dot-location'],
35
+ 'vue/func-call-spacing': jsFormatting['@stylistic/function-call-spacing'],
36
+ 'vue/key-spacing': jsFormatting['@stylistic/key-spacing'],
37
+ 'vue/keyword-spacing': jsFormatting['@stylistic/keyword-spacing'],
38
+ 'vue/multiline-ternary': jsFormatting['@stylistic/multiline-ternary'],
39
+ 'vue/no-extra-parens': jsFormatting['@stylistic/no-extra-parens'],
40
+ 'vue/object-curly-newline': jsFormatting['@stylistic/object-curly-newline'],
41
+ 'vue/object-curly-spacing': jsFormatting['@stylistic/object-curly-spacing'],
42
+ 'vue/object-property-newline': jsFormatting['@stylistic/object-property-newline'],
43
+ 'vue/operator-linebreak': jsFormatting['@stylistic/operator-linebreak'],
44
+ 'vue/quote-props': jsFormatting['@stylistic/quote-props'],
45
+ 'vue/space-in-parens': jsFormatting['@stylistic/space-in-parens'],
46
+ 'vue/space-infix-ops': jsFormatting['@stylistic/space-infix-ops'],
47
+ 'vue/space-unary-ops': jsFormatting['@stylistic/space-unary-ops'],
48
+ 'vue/template-curly-spacing': jsFormatting['@stylistic/template-curly-spacing'],
49
+
50
+ '@stylistic/max-len': [OFF],
51
+ 'max-len': [OFF],
52
+ 'vue/max-len': [ERROR, {
53
+ ...MAX_LEN,
54
+
55
+ ignoreHTMLAttributeValues: true,
56
+ ignoreHTMLTextContents: true,
57
+ }],
58
+ };
@@ -0,0 +1,41 @@
1
+ import { INDENT_SIZE } from '../constants.js';
2
+ import { ERROR, OFF } from '../severity.js';
3
+
4
+ export const formattingRules = {
5
+ 'vue/block-tag-newline': [ERROR, {
6
+ singleline: 'always',
7
+ multiline: 'always',
8
+ maxEmptyLines: 0,
9
+ }],
10
+ // https://github.com/vuejs/eslint-plugin-vue/issues/2380
11
+ 'vue/define-macros-order': [OFF],
12
+ 'vue/first-attribute-linebreak': [ERROR, {
13
+ singleline: 'below',
14
+ multiline: 'below',
15
+ }],
16
+ 'vue/html-closing-bracket-newline': [ERROR],
17
+ 'vue/html-closing-bracket-spacing': [ERROR],
18
+ 'vue/html-comment-content-newline': [OFF],
19
+ 'vue/html-comment-content-spacing': [ERROR],
20
+ 'vue/html-comment-indent': [OFF],
21
+ 'vue/html-indent': [ERROR, INDENT_SIZE],
22
+ 'vue/html-quotes': [ERROR, 'double'],
23
+ 'vue/html-self-closing': [ERROR],
24
+ 'vue/max-attributes-per-line': [ERROR, {
25
+ singleline: 1,
26
+ multiline: 1,
27
+ }],
28
+ 'vue/multiline-html-element-content-newline': [ERROR, {
29
+ ignores: ['pre'],
30
+ }],
31
+ 'vue/mustache-interpolation-spacing': [ERROR, 'always'],
32
+ 'vue/new-line-between-multi-line-property': [OFF],
33
+ 'vue/no-multi-spaces': [ERROR],
34
+ 'vue/no-spaces-around-equal-signs-in-attribute': [ERROR],
35
+ 'vue/padding-line-between-blocks': [ERROR, 'always'],
36
+ 'vue/padding-line-between-tags': [OFF],
37
+ 'vue/padding-lines-in-component-definition': [OFF],
38
+ 'vue/script-indent': [OFF],
39
+ 'vue/singleline-html-element-content-newline': [OFF],
40
+ 'vue/v-for-delimiter-style': [ERROR, 'in'],
41
+ };
@@ -0,0 +1,13 @@
1
+ import { baseRules } from './base.js';
2
+ import { extensionRules } from './extension.js';
3
+ import { possibleProblemRules } from './possibleProblems.js';
4
+ import { suggestionRules } from './suggestions.js';
5
+ import { formattingRules } from './formatting.js';
6
+
7
+ export const vueRules = {
8
+ ...baseRules,
9
+ ...extensionRules,
10
+ ...possibleProblemRules,
11
+ ...suggestionRules,
12
+ ...formattingRules,
13
+ };
@@ -0,0 +1,113 @@
1
+ import { ERROR, OFF, WARN } from '../severity.js';
2
+
3
+ export const possibleProblemRules = {
4
+ 'vue/attribute-hyphenation': [ERROR, 'never'],
5
+ 'vue/attributes-order': [ERROR],
6
+ 'vue/block-lang': [OFF],
7
+ 'vue/block-order': [ERROR, {
8
+ order: ['template', 'script', 'style'],
9
+ }],
10
+ 'vue/component-api-style': [ERROR, ['script-setup']],
11
+ 'vue/component-definition-name-casing': [ERROR, 'PascalCase'],
12
+ 'vue/component-name-in-template-casing': [ERROR, 'PascalCase', {
13
+ registeredComponentsOnly: false,
14
+ ignores: [],
15
+ }],
16
+ 'vue/component-options-name-casing': [ERROR, 'PascalCase'],
17
+ 'vue/custom-event-name-casing': [ERROR, 'camelCase', { ignores: ['/^[a-z]+(?:-[a-z]+)*:[a-z]+((\\d)|([A-Z0-9][a-z0-9]+))*([A-Z])?$/u'] }],
18
+ 'vue/define-emits-declaration': [ERROR, 'type-based'],
19
+ 'vue/define-props-declaration': [ERROR, 'type-based'],
20
+ 'vue/html-button-has-type': [ERROR],
21
+ 'vue/html-end-tags': [ERROR],
22
+ 'vue/match-component-file-name': [ERROR, {
23
+ extensions: ['vue'],
24
+ shouldMatchCase: true,
25
+ }],
26
+ 'vue/multi-word-component-names': [ERROR],
27
+ 'vue/next-tick-style': [ERROR, 'promise'],
28
+ 'vue/no-bare-strings-in-template': [OFF],
29
+ 'vue/no-boolean-default': [ERROR, 'default-false'],
30
+ 'vue/no-deprecated-scope-attribute': [ERROR],
31
+ 'vue/no-deprecated-slot-attribute': [ERROR],
32
+ 'vue/no-deprecated-slot-scope-attribute': [ERROR],
33
+ 'vue/no-deprecated-v-is': [ERROR],
34
+ 'vue/no-duplicate-attr-inheritance': [ERROR],
35
+ 'vue/no-empty-component-block': [OFF],
36
+ 'vue/no-lifecycle-after-await': [ERROR],
37
+ 'vue/no-multiple-objects-in-class': [ERROR],
38
+ 'vue/no-mutating-props': [ERROR],
39
+ 'vue/no-potential-component-option-typo': [ERROR],
40
+ 'vue/no-ref-as-operand': [ERROR],
41
+ 'vue/no-reserved-component-names': [ERROR, {
42
+ disallowVueBuiltInComponents: true,
43
+ disallowVue3BuiltInComponents: true,
44
+ }],
45
+ 'vue/no-reserved-keys': [ERROR],
46
+ 'vue/no-restricted-block': [OFF],
47
+ 'vue/no-restricted-call-after-await': [OFF],
48
+ 'vue/no-restricted-component-names': [OFF],
49
+ 'vue/no-restricted-component-options': [OFF],
50
+ 'vue/no-restricted-custom-event': [OFF],
51
+ 'vue/no-restricted-html-elements': [OFF],
52
+ 'vue/no-restricted-props': [OFF],
53
+ 'vue/no-restricted-static-attribute': [OFF],
54
+ 'vue/no-restricted-v-bind': [OFF],
55
+ 'vue/no-root-v-if': [ERROR],
56
+ 'vue/no-setup-props-reactivity-loss': [OFF],
57
+ 'vue/no-static-inline-styles': [WARN],
58
+ 'vue/no-template-shadow': [OFF],
59
+ // выключено в общих конфигах, может быть включено в вашем репозитории если есть необходимость.
60
+ 'vue/no-undef-components': [OFF],
61
+ 'vue/no-undef-properties': [ERROR],
62
+ 'vue/no-unsupported-features': [ERROR, {
63
+ version: '^3.4.27',
64
+ ignores: [],
65
+ }],
66
+ 'vue/no-unused-components': [ERROR],
67
+ 'vue/no-unused-emit-declarations': [ERROR],
68
+ 'vue/no-unused-properties': [ERROR, {
69
+ groups: ['props', 'setup'],
70
+ deepData: true,
71
+ ignorePublicMembers: true,
72
+ }],
73
+ 'vue/no-unused-refs': [ERROR],
74
+ 'vue/no-unused-vars': [ERROR],
75
+ 'vue/no-use-v-else-with-v-for': [ERROR],
76
+ 'vue/no-use-v-if-with-v-for': [ERROR],
77
+ 'vue/no-useless-mustaches': [ERROR],
78
+ 'vue/no-useless-v-bind': [ERROR],
79
+ 'vue/no-v-html': [ERROR],
80
+ 'vue/no-v-text': [ERROR],
81
+ 'vue/no-watch-after-await': [ERROR],
82
+ 'vue/one-component-per-file': [ERROR],
83
+ 'vue/order-in-components': [ERROR],
84
+ 'vue/prefer-define-options': [ERROR],
85
+ 'vue/prefer-import-from-vue': [ERROR],
86
+ 'vue/prefer-separate-static-class': [ERROR],
87
+ 'vue/prefer-true-attribute-shorthand': [ERROR, 'always'],
88
+ 'vue/prop-name-casing': [ERROR, 'camelCase'],
89
+ 'vue/require-default-prop': [OFF],
90
+ 'vue/require-direct-export': [ERROR],
91
+ 'vue/require-emit-validator': [ERROR],
92
+ 'vue/require-explicit-emits': [ERROR],
93
+ 'vue/require-expose': [ERROR],
94
+ 'vue/require-macro-variable-name': [ERROR],
95
+ 'vue/require-name-property': [ERROR],
96
+ 'vue/require-prop-comment': [OFF],
97
+ 'vue/require-prop-type-constructor': [ERROR],
98
+ 'vue/require-prop-types': [ERROR],
99
+ 'vue/require-typed-object-prop': [ERROR],
100
+ 'vue/require-typed-ref': [ERROR],
101
+ 'vue/require-valid-default-prop': [ERROR],
102
+ 'vue/sort-keys': [OFF],
103
+ 'vue/static-class-names-order': [OFF],
104
+ 'vue/this-in-template': [ERROR, 'never'],
105
+ 'vue/use-v-on-exact': [ERROR],
106
+ 'vue/v-bind-style': [ERROR, 'shorthand'],
107
+ 'vue/v-on-event-hyphenation': [ERROR, 'never', { autofix: true }],
108
+ // https://github.com/vuejs/eslint-plugin-vue/issues/2571
109
+ 'vue/v-on-handler-style': [OFF],
110
+ 'vue/v-on-style': [ERROR, 'shorthand'],
111
+ 'vue/v-slot-style': [ERROR],
112
+ 'vue/valid-define-options': [ERROR],
113
+ };
@@ -0,0 +1,83 @@
1
+ import { ERROR, OFF } from '../severity.js';
2
+
3
+ export const suggestionRules = {
4
+ 'vue/match-component-import-name': [ERROR],
5
+ // 'vue/max-lines-per-block': [WARN, {
6
+ // template: 120,
7
+ // script: 120,
8
+ // style: 120,
9
+ // skipBlankLines: true,
10
+ // }],
11
+ 'vue/no-arrow-functions-in-watch': [ERROR],
12
+ 'vue/no-async-in-computed-properties': [ERROR],
13
+ 'vue/no-child-content': [ERROR],
14
+ 'vue/no-computed-properties-in-data': [ERROR],
15
+ 'vue/no-deprecated-data-object-declaration': [ERROR],
16
+ 'vue/no-deprecated-destroyed-lifecycle': [ERROR],
17
+ 'vue/no-deprecated-dollar-listeners-api': [ERROR],
18
+ 'vue/no-deprecated-dollar-scopedslots-api': [ERROR],
19
+ 'vue/no-deprecated-events-api': [ERROR],
20
+ 'vue/no-deprecated-filter': [ERROR],
21
+ 'vue/no-deprecated-functional-template': [ERROR],
22
+ 'vue/no-deprecated-html-element-is': [ERROR],
23
+ 'vue/no-deprecated-inline-template': [ERROR],
24
+ 'vue/no-deprecated-model-definition': [ERROR],
25
+ 'vue/no-deprecated-props-default-this': [ERROR],
26
+ 'vue/no-deprecated-router-link-tag-prop': [ERROR, { components: ['RouterLink'] }],
27
+ 'vue/no-deprecated-v-bind-sync': [ERROR],
28
+ 'vue/no-deprecated-v-on-native-modifier': [ERROR],
29
+ 'vue/no-deprecated-v-on-number-modifiers': [ERROR],
30
+ 'vue/no-deprecated-vue-config-keycodes': [ERROR],
31
+ 'vue/no-dupe-keys': [ERROR],
32
+ 'vue/no-dupe-v-else-if': [ERROR],
33
+ 'vue/no-duplicate-attributes': [ERROR],
34
+ 'vue/no-export-in-script-setup': [ERROR],
35
+ 'vue/no-expose-after-await': [ERROR],
36
+ 'vue/no-lone-template': [ERROR],
37
+ 'vue/no-multiple-slot-args': [ERROR],
38
+ 'vue/no-parsing-error': [ERROR],
39
+ 'vue/no-ref-object-reactivity-loss': [ERROR],
40
+ 'vue/no-required-prop-with-default': [ERROR],
41
+ 'vue/no-reserved-props': [ERROR],
42
+ 'vue/no-restricted-class': [OFF],
43
+ 'vue/no-shared-component-data': [ERROR],
44
+ 'vue/no-side-effects-in-computed-properties': [ERROR],
45
+ 'vue/no-template-key': [ERROR],
46
+ 'vue/no-template-target-blank': [ERROR],
47
+ 'vue/no-textarea-mustache': [ERROR],
48
+ 'vue/no-this-in-before-route-enter': [ERROR],
49
+ 'vue/no-use-computed-property-like-method': [ERROR],
50
+ 'vue/no-useless-template-attributes': [ERROR],
51
+ 'vue/no-v-for-template-key-on-child': [ERROR],
52
+ 'vue/no-v-text-v-html-on-component': [ERROR],
53
+ 'vue/prefer-prop-type-boolean-first': [ERROR],
54
+ 'vue/require-component-is': [ERROR],
55
+ 'vue/require-render-return': [ERROR],
56
+ 'vue/require-slots-as-functions': [ERROR],
57
+ 'vue/require-toggle-inside-transition': [ERROR],
58
+ 'vue/require-v-for-key': [ERROR],
59
+ 'vue/return-in-computed-property': [ERROR],
60
+ 'vue/return-in-emits-validator': [ERROR],
61
+ 'vue/v-if-else-key': [OFF],
62
+ 'vue/valid-attribute-name': [ERROR],
63
+ 'vue/valid-define-emits': [ERROR],
64
+ 'vue/valid-define-props': [ERROR],
65
+ 'vue/valid-next-tick': [ERROR],
66
+ 'vue/valid-template-root': [ERROR],
67
+ 'vue/valid-v-bind': [ERROR],
68
+ 'vue/valid-v-cloak': [ERROR],
69
+ 'vue/valid-v-else': [ERROR],
70
+ 'vue/valid-v-else-if': [ERROR],
71
+ 'vue/valid-v-for': [ERROR],
72
+ 'vue/valid-v-html': [ERROR],
73
+ 'vue/valid-v-if': [ERROR],
74
+ 'vue/valid-v-is': [ERROR],
75
+ 'vue/valid-v-memo': [ERROR],
76
+ 'vue/valid-v-model': [ERROR],
77
+ 'vue/valid-v-on': [ERROR],
78
+ 'vue/valid-v-once': [ERROR],
79
+ 'vue/valid-v-pre': [ERROR],
80
+ 'vue/valid-v-show': [ERROR],
81
+ 'vue/valid-v-slot': [ERROR],
82
+ 'vue/valid-v-text': [ERROR],
83
+ };
@@ -0,0 +1,29 @@
1
+ import path, { dirname } from 'node:path';
2
+ import { fileURLToPath } from 'node:url';
3
+
4
+ const currentDir = dirname(fileURLToPath(import.meta.url));
5
+ const concat = (...arrays) => {
6
+ return [].concat(...arrays);
7
+ };
8
+
9
+ export default {
10
+ extends: concat(
11
+ [
12
+ 'stylelint-config-standard',
13
+ 'stylelint-config-standard-scss',
14
+ 'stylelint-config-standard-vue/scss',
15
+ ],
16
+ [
17
+ './rules/base.js',
18
+ './rules/stylistic.js',
19
+ './rules/order.js',
20
+ './rules/conflicts.js',
21
+ './rules/scss.js',
22
+ ].map((string) => {
23
+ return path.resolve(currentDir, string);
24
+ }),
25
+ ),
26
+ plugins: [
27
+ '@stylistic/stylelint-plugin',
28
+ ],
29
+ };
@@ -0,0 +1,26 @@
1
+ export default {
2
+ rules: {
3
+ 'color-hex-alpha': 'never',
4
+ 'color-hex-length': 'long',
5
+ 'color-named': 'never',
6
+ 'declaration-no-important': true,
7
+ 'declaration-property-value-no-unknown': null,
8
+ 'font-family-name-quotes': 'always-unless-keyword',
9
+ 'font-family-no-missing-generic-family-keyword': null,
10
+ 'font-weight-notation': ['numeric', {
11
+ ignore: ['relative'],
12
+ }],
13
+ 'max-nesting-depth': [7, {
14
+ ignore: [
15
+ 'blockless-at-rules',
16
+ 'pseudo-classes',
17
+ ],
18
+ }],
19
+ 'media-feature-name-value-no-unknown': true,
20
+ 'no-descending-specificity': null,
21
+ 'selector-class-pattern': null,
22
+ 'selector-max-compound-selectors': 99,
23
+ 'selector-max-id': 0,
24
+ 'selector-max-universal': 2,
25
+ },
26
+ };
@@ -0,0 +1,7 @@
1
+ export default {
2
+ rules: {
3
+ 'declaration-empty-line-before': null, // order/properties-order [./order.cjs]
4
+ // https://gitlab.kadnk.ru/frontend/configs/-/issues/2
5
+ 'length-zero-no-unit': null,
6
+ },
7
+ };
@@ -0,0 +1,42 @@
1
+ import { propertyGroups } from './property-groups.js';
2
+
3
+ export default {
4
+ plugins: ['stylelint-order'],
5
+ rules: {
6
+ 'order/order': [
7
+ [
8
+ 'dollar-variables',
9
+ 'custom-properties',
10
+ 'declarations',
11
+ {
12
+ type: 'at-rule',
13
+ name: 'supports',
14
+ },
15
+ 'rules',
16
+ {
17
+ type: 'at-rule',
18
+ name: 'container',
19
+ },
20
+ {
21
+ type: 'at-rule',
22
+ name: 'media',
23
+ },
24
+ ],
25
+ { severity: 'error' },
26
+ ],
27
+ 'order/properties-order': [
28
+ propertyGroups.map((group) => {
29
+ return {
30
+ ...group,
31
+ emptyLineBefore: 'always',
32
+ noEmptyLineBetween: true,
33
+ };
34
+ }),
35
+ {
36
+ unspecified: 'bottom',
37
+ emptyLineBeforeUnspecified: 'always',
38
+ severity: 'error',
39
+ },
40
+ ],
41
+ },
42
+ };