@tb-dev/eslint-config 1.3.9 → 1.3.10

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/dist/index.cjs CHANGED
@@ -1 +1,891 @@
1
- "use strict";const eslintConfigPrettier=require("eslint-config-prettier"),globals=require("globals"),process=require("node:process");var Glob,GlobIgnore;async function interopDefault(r){const e=await r;return e.default??e}function getIgnores(){return Object.values(GlobIgnore)}function javascript(r){const{overrides:e}=r,o=[Glob.ALL];return r.vue&&o.push(Glob.VUE),{files:o,languageOptions:{ecmaVersion:"latest",sourceType:"module",globals:{...globals.browser,...globals.es2021,...globals.node,document:"readonly",window:"readonly"}},rules:{"accessor-pairs":["error",{enforceForClassMembers:!0,setWithoutGet:!0}],"array-callback-return":["error",{checkForEach:!0,allowVoid:!0}],"block-scoped-var":"error","consistent-this":["error","self"],"default-case-last":"error",eqeqeq:["error","always"],"for-direction":"error","func-style":["error","declaration",{allowArrowFunctions:!0}],"grouped-accessor-pairs":["error","getBeforeSet"],"guard-for-in":"error","init-declarations":"off","logical-assignment-operators":["error","always",{enforceForIfStatements:!0}],"max-params":"off","new-cap":["error",{newIsCap:!0,capIsNew:!1,properties:!0}],"no-alert":"error","no-async-promise-executor":"error","no-caller":"error","no-case-declarations":"error","no-class-assign":"error","no-compare-neg-zero":"error","no-cond-assign":["error","always"],"no-constant-binary-expression":"error","no-constant-condition":"error","no-constructor-return":"error","no-control-regex":"error","no-debugger":"error","no-delete-var":"error","no-dupe-else-if":"error","no-duplicate-case":"error","no-duplicate-imports":["error",{includeExports:!0}],"no-else-return":"error","no-empty":["error",{allowEmptyCatch:!0}],"no-empty-character-class":"error","no-empty-pattern":"error","no-empty-static-block":"error","no-eval":"error","no-ex-assign":"error","no-extend-native":"error","no-extra-bind":"error","no-extra-boolean-cast":"error","no-fallthrough":["error",{allowEmptyCase:!0}],"no-global-assign":"error","no-implicit-coercion":["error",{disallowTemplateShorthand:!0}],"no-import-assign":"error","no-inner-declarations":["error","both"],"no-invalid-regexp":"error","no-irregular-whitespace":"error","no-iterator":"error","no-labels":["error",{allowLoop:!1,allowSwitch:!1}],"no-lone-blocks":"error","no-lonely-if":"error","no-misleading-character-class":"error","no-multi-assign":"error","no-multi-str":"error","no-new":"error","no-new-func":"error","no-new-native-nonconstructor":"error","no-new-wrappers":"error","no-nonoctal-decimal-escape":"error","no-object-constructor":"error","no-octal":"error","no-octal-escape":"error","no-promise-executor-return":["error",{allowVoid:!0}],"no-proto":"error","no-prototype-builtins":"error","no-regex-spaces":"error","no-script-url":"error","no-self-assign":"error","no-self-compare":"error","no-sequences":"error","no-shadow-restricted-names":"error","no-sparse-arrays":"error","no-template-curly-in-string":"error","no-undef-init":"error","no-undefined":"error","no-unexpected-multiline":"error","no-unmodified-loop-condition":"error","no-unneeded-ternary":["error",{defaultAssignment:!1}],"no-unreachable-loop":"error","no-unsafe-finally":"error","no-unsafe-optional-chaining":["error",{disallowArithmeticOperators:!0}],"no-unused-vars":"off","no-useless-backreference":"error","no-useless-call":"error","no-useless-catch":"error","no-useless-computed-key":"error","no-useless-concat":"error","no-useless-rename":"error","no-useless-return":"error","no-var":"error","no-with":"error","object-shorthand":["error","always"],"operator-assignment":["error","always"],"prefer-arrow-callback":"error","prefer-const":["error",{destructuring:"all",ignoreReadBeforeAssign:!0}],"prefer-destructuring":"off","prefer-exponentiation-operator":"error","prefer-object-has-own":"error","prefer-object-spread":"error","prefer-promise-reject-errors":"error","prefer-regex-literals":["error",{disallowRedundantWrapping:!0}],"prefer-rest-params":"error","prefer-spread":"error","prefer-template":"error","require-atomic-updates":"error","sort-imports":["error",{allowSeparatedGroups:!1,ignoreCase:!1,ignoreDeclarationSort:!0,ignoreMemberSort:!1,memberSyntaxSortOrder:["none","all","multiple","single"]}],"symbol-description":"error","use-isnan":"error","valid-typeof":"error",yoda:["error","never"],...e?.javascript}}}async function perfectionist(r){const{overrides:e,perfectionist:o=!0}=r;if(!o)return{};return{plugins:{perfectionist:await interopDefault(import("eslint-plugin-perfectionist"))},rules:{"perfectionist/sort-classes":["error",{type:"natural",order:"asc",groups:["index-signature","property","private-property","constructor","method","private-method",["get-method","set-method"],"static-property","static-method","static-private-method","unknown"]}],"perfectionist/sort-enums":["error",{type:"natural",order:"asc"}],"perfectionist/sort-exports":["error",{type:"line-length",order:"asc"}],"perfectionist/sort-imports":["error",{type:"line-length",order:"asc","newlines-between":"never",groups:[["style","side-effect"],["builtin","builtin-type"],["external","external-type"],["internal","internal-type"],"unknown"]}],"perfectionist/sort-interfaces":["error",{type:"natural",order:"asc","partition-by-new-line":!0}],"perfectionist/sort-maps":["error",{type:"natural",order:"asc"}],"perfectionist/sort-named-exports":["error",{type:"natural",order:"asc"}],"sort-imports":"off","perfectionist/sort-named-imports":["error",{type:"natural",order:"asc"}],"@typescript-eslint/adjacent-overload-signatures":"off","perfectionist/sort-object-types":["error",{type:"natural",order:"asc","partition-by-new-line":!0}],...e?.perfectionist}}}async function typescript(r){const{project:e,overrides:o}=r,[t,n]=await Promise.all([await interopDefault(import("@typescript-eslint/parser")),await interopDefault(import("@typescript-eslint/eslint-plugin"))]),s=[Glob.TYPESCRIPT];r.vue&&s.push(Glob.VUE);const i={"@typescript-eslint/adjacent-overload-signatures":"error","no-array-constructor":"off","@typescript-eslint/no-array-constructor":"error","@typescript-eslint/array-type":["error",{default:"array"}],"@typescript-eslint/ban-ts-comment":["error",{"ts-expect-error":"allow-with-description","ts-ignore":!0,"ts-nocheck":!0,"ts-check":!1,minimumDescriptionLength:3}],"@typescript-eslint/class-literal-property-style":["error","fields"],"class-methods-use-this":"off","@typescript-eslint/class-methods-use-this":["error",{ignoreOverrideMethods:!0,ignoreClassesThatImplementAnInterface:"public-fields"}],"@typescript-eslint/consistent-generic-constructors":["error","constructor"],"@typescript-eslint/consistent-indexed-object-style":["error","record"],"@typescript-eslint/consistent-type-assertions":["error",{assertionStyle:"as",objectLiteralTypeAssertions:"allow-as-parameter"}],"@typescript-eslint/consistent-type-definitions":["error","interface"],"dot-notation":"off","@typescript-eslint/dot-notation":["error",{allowKeywords:!0}],"@typescript-eslint/explicit-function-return-type":"off","@typescript-eslint/explicit-member-accessibility":["error",{accessibility:"explicit",overrides:{accessors:"no-public",constructors:"no-public",methods:"explicit",properties:"explicit",parameterProperties:"explicit"}}],"@typescript-eslint/explicit-module-boundary-types":"off","@typescript-eslint/method-signature-style":["error","property"],"@typescript-eslint/no-base-to-string":"error","@typescript-eslint/no-confusing-non-null-assertion":"error","@typescript-eslint/no-confusing-void-expression":["error",{ignoreArrowShorthand:!0,ignoreVoidOperator:!0}],"@typescript-eslint/no-duplicate-enum-values":"error","@typescript-eslint/no-duplicate-type-constituents":"error","@typescript-eslint/no-dynamic-delete":"error","no-empty-function":"off","@typescript-eslint/no-empty-function":"error","@typescript-eslint/no-empty-interface":"error","@typescript-eslint/no-explicit-any":["error",{fixToUnknown:!0}],"@typescript-eslint/no-extra-non-null-assertion":"error","@typescript-eslint/no-extraneous-class":"error","@typescript-eslint/no-floating-promises":["error",{ignoreVoid:!0}],"@typescript-eslint/no-for-in-array":"error","no-implied-eval":"off","@typescript-eslint/no-implied-eval":"error","@typescript-eslint/no-import-type-side-effects":"error","@typescript-eslint/no-inferrable-types":"error","@typescript-eslint/no-invalid-void-type":["error",{allowInGenericTypeArguments:!0,allowAsThisParameter:!0}],"no-loop-func":"off","@typescript-eslint/no-loop-func":"error","no-loss-of-precision":"off","@typescript-eslint/no-loss-of-precision":"error","@typescript-eslint/no-meaningless-void-operator":"error","@typescript-eslint/no-misused-new":"error","@typescript-eslint/no-misused-promises":["error",{checksConditionals:!0,checksSpreads:!0,checksVoidReturn:{arguments:!0,attributes:!0,properties:!0,returns:!0,variables:!0}}],"@typescript-eslint/no-mixed-enums":"error","@typescript-eslint/no-namespace":"error","@typescript-eslint/no-non-null-asserted-nullish-coalescing":"error","@typescript-eslint/no-non-null-asserted-optional-chain":"error","@typescript-eslint/no-non-null-assertion":"error","@typescript-eslint/no-redundant-type-constituents":"error","@typescript-eslint/no-require-imports":"error","no-shadow":"off","@typescript-eslint/no-shadow":"error","@typescript-eslint/no-this-alias":"error","no-throw-literal":"off","@typescript-eslint/no-throw-literal":"error","@typescript-eslint/no-unnecessary-boolean-literal-compare":["error",{allowComparingNullableBooleansToTrue:!1,allowComparingNullableBooleansToFalse:!0}],"@typescript-eslint/no-unnecessary-condition":"error","@typescript-eslint/no-unnecessary-qualifier":"error","@typescript-eslint/no-unnecessary-type-arguments":"error","@typescript-eslint/no-unnecessary-type-assertion":"error","@typescript-eslint/no-unnecessary-type-constraint":"error","@typescript-eslint/no-unsafe-argument":"error","@typescript-eslint/no-unsafe-assignment":"error","@typescript-eslint/no-unsafe-call":"error","@typescript-eslint/no-unsafe-declaration-merging":"error","@typescript-eslint/no-unsafe-enum-comparison":"off","@typescript-eslint/no-unsafe-member-access":"error","@typescript-eslint/no-unsafe-return":"error","@typescript-eslint/no-unsafe-unary-minus":"error","no-unused-expressions":"off","@typescript-eslint/no-unused-expressions":["error",{allowTaggedTemplates:!0}],"no-use-before-define":"off","@typescript-eslint/no-use-before-define":["error",{functions:!1,enums:!0,typedefs:!1}],"no-useless-constructor":"off","@typescript-eslint/no-useless-constructor":"error","@typescript-eslint/no-useless-empty-export":"error","@typescript-eslint/non-nullable-type-assertion-style":"error","@typescript-eslint/prefer-as-const":"error","@typescript-eslint/prefer-enum-initializers":"error","@typescript-eslint/prefer-for-of":"error","@typescript-eslint/prefer-function-type":"error","@typescript-eslint/prefer-includes":"error","@typescript-eslint/prefer-literal-enum-member":"error","@typescript-eslint/prefer-nullish-coalescing":["error",{ignoreTernaryTests:!1,ignoreConditionalTests:!1,ignoreMixedLogicalExpressions:!1,ignorePrimitives:{bigint:!1,boolean:!1,number:!1,string:!1}}],"@typescript-eslint/prefer-optional-chain":"error","@typescript-eslint/prefer-readonly":"error","@typescript-eslint/prefer-readonly-parameter-types":"off","@typescript-eslint/prefer-reduce-type-parameter":"error","@typescript-eslint/prefer-regexp-exec":"error","@typescript-eslint/prefer-return-this-type":"error","@typescript-eslint/prefer-string-starts-ends-with":"error","@typescript-eslint/prefer-ts-expect-error":"error","@typescript-eslint/promise-function-async":"off","@typescript-eslint/require-array-sort-compare":"error","require-await":"off","@typescript-eslint/require-await":"error","@typescript-eslint/restrict-plus-operands":"error","@typescript-eslint/restrict-template-expressions":"error","@typescript-eslint/strict-boolean-expressions":"off","@typescript-eslint/switch-exhaustiveness-check":["error",{requireDefaultForNonUnion:!0}],"@typescript-eslint/unbound-method":"error","@typescript-eslint/unified-signatures":["error",{ignoreDifferentlyNamedParameters:!0}],...o?.typescript};return{files:s,languageOptions:{ecmaVersion:"latest",sourceType:"module",parser:t,parserOptions:{project:e,tsconfigRootDir:process.cwd(),extraFileExtensions:r.vue?[".vue"]:[]}},plugins:{"@typescript-eslint":n},rules:i}}async function unicorn(r){const{overrides:e,unicorn:o=!0}=r;if(!o)return{};return{plugins:{unicorn:await interopDefault(import("eslint-plugin-unicorn"))},rules:{"unicorn/catch-error-name":["error",{name:"err"}],"unicorn/consistent-function-scoping":["error",{checkArrowFunctions:!0}],"unicorn/custom-error-definition":"error","unicorn/error-message":"error","unicorn/no-array-for-each":"error","unicorn/no-array-method-this-argument":"error","unicorn/no-array-push-push":"error","unicorn/no-await-expression-member":"error","unicorn/no-invalid-remove-event-listener":"error","unicorn/no-thenable":"error","unicorn/no-typeof-undefined":"error","unicorn/no-useless-fallback-in-spread":"error","unicorn/no-useless-length-check":"error","unicorn/no-useless-promise-resolve-reject":"error","unicorn/prefer-at":"error","unicorn/prefer-date-now":"error","unicorn/prefer-dom-node-append":"error","unicorn/prefer-dom-node-dataset":"error","unicorn/prefer-dom-node-remove":"error","unicorn/prefer-dom-node-text-content":"error","unicorn/prefer-modern-dom-apis":"error","unicorn/prefer-node-protocol":"error","unicorn/prefer-number-properties":"error","unicorn/prefer-object-from-entries":"error","unicorn/prefer-prototype-methods":"error","unicorn/prefer-query-selector":"error","unicorn/prefer-reflect-apply":"error","unicorn/prefer-regexp-test":"error","unicorn/prefer-string-slice":"error","unicorn/prefer-type-error":"error","unicorn/relative-url-style":["error","never"],...e?.unicorn}}}async function vue(r){const{overrides:e,vue:o}=r;if(!o)return[];const[t,n,s]=await Promise.all([await interopDefault(import("eslint-plugin-vue")),await interopDefault(import("vue-eslint-parser")),await interopDefault(import("@typescript-eslint/parser"))]),i={...t.configs.base.rules,"vue/attribute-hyphenation":["error","always"],"vue/attributes-order":"error","vue/block-lang":["error",{script:{lang:"ts"},style:{lang:"scss",allowNoLang:!0}}],"vue/block-order":["error",{order:[["script","template"],"style:not([scoped])","style[scoped]"]}],"vue/block-tag-newline":["error",{singleline:"always",multiline:"always",maxEmptyLines:0}],"vue/component-api-style":["error",["script-setup"]],"vue/component-definition-name-casing":["error","PascalCase"],"vue/component-name-in-template-casing":["error","PascalCase"],"vue/custom-event-name-casing":["error","camelCase"],"vue/define-emits-declaration":["error","type-based"],"vue/define-macros-order":["error",{order:["defineProps","defineEmits"]}],"vue/define-props-declaration":["error","type-based"],"vue/first-attribute-linebreak":"off","vue/html-button-has-type":["error",{button:!0,submit:!0,reset:!0}],"vue/html-closing-bracket-newline":["error",{singleline:"never",multiline:"always"}],"vue/html-closing-bracket-spacing":["error",{startTag:"never",endTag:"never",selfClosingTag:"always"}],"vue/html-self-closing":["error",{html:{void:"never",normal:"always",component:"always"},svg:"always",math:"always"}],"vue/match-component-file-name":["error",{extensions:["tsx","vue"],shouldMatchCase:!1}],"vue/match-component-import-name":"error","vue/multi-word-component-names":"off","vue/mustache-interpolation-spacing":["error","always"],"vue/no-arrow-functions-in-watch":"off","vue/no-async-in-computed-properties":"error","vue/no-boolean-default":["error","no-default"],"vue/no-computed-properties-in-data":"error","vue/no-dupe-keys":"error","vue/no-dupe-v-else-if":"error","vue/no-duplicate-attributes":["error",{allowCoexistClass:!0,allowCoexistStyle:!0}],"vue/no-export-in-script-setup":"error","vue/no-expose-after-await":"error","vue/no-lifecycle-after-await":"error","vue/no-lone-template":"error","vue/no-multi-spaces":"error","vue/no-multiple-objects-in-class":"error","vue/no-mutating-props":"error","vue/no-parsing-error":"error","vue/no-ref-as-operand":"error","vue/no-ref-object-reactivity-loss":"error","vue/no-reserved-component-names":"error","vue/no-reserved-keys":"error","vue/no-reserved-props":"error","vue/no-required-prop-with-default":["error",{autofix:!0}],"vue/no-root-v-if":"error","vue/no-setup-props-reactivity-loss":"error","vue/no-shared-component-data":"error","vue/no-side-effects-in-computed-properties":"error","vue/no-spaces-around-equal-signs-in-attribute":"error","vue/no-static-inline-styles":["error",{allowBinding:!1}],"vue/no-template-key":"error","vue/no-template-shadow":"error","vue/no-template-target-blank":"error","vue/no-textarea-mustache":"error","vue/no-unused-components":"error","vue/no-unused-properties":"error","vue/no-unused-refs":"error","vue/no-unused-vars":["error",{ignorePattern:"^_"}],"vue/no-use-computed-property-like-method":"error","vue/no-use-v-else-with-v-for":"error","vue/no-use-v-if-with-v-for":"error","vue/no-useless-mustaches":["error",{ignoreIncludesComment:!1,ignoreStringEscape:!1}],"vue/no-useless-template-attributes":"error","vue/no-useless-v-bind":"error","vue/no-v-for-template-key-on-child":"error","vue/no-v-text-v-html-on-component":"error","vue/no-v-html":"off","vue/no-watch-after-await":"error","vue/order-in-components":"error","vue/padding-line-between-blocks":["error","always"],"vue/prefer-define-options":"error","vue/prefer-import-from-vue":"error","vue/prefer-separate-static-class":"error","vue/prefer-true-attribute-shorthand":"error","vue/prop-name-casing":["error","camelCase"],"vue/require-component-is":"error","vue/require-default-prop":"error","vue/require-explicit-emits":["error",{allowProps:!1}],"vue/require-macro-variable-name":["error",{defineProps:"props",defineEmits:"emit",defineSlots:"slots",useSlots:"slots",useAttrs:"attrs"}],"vue/require-prop-types":"error","vue/require-render-return":"error","vue/require-slots-as-functions":"error","vue/require-toggle-inside-transition":"error","vue/require-typed-ref":"error","vue/require-v-for-key":"error","vue/require-valid-default-prop":"error","vue/return-in-computed-property":"error","vue/return-in-emits-validator":"error","vue/this-in-template":["error","never"],"vue/use-v-on-exact":"error","vue/v-bind-style":["error","shorthand"],"vue/v-for-delimiter-style":["error","of"],"vue/v-on-handler-style":["error",["method","inline-function"],{ignoreIncludesComment:!1}],"vue/v-on-style":["error","shorthand"],"vue/v-slot-style":["error",{atComponent:"shorthand",default:"shorthand",named:"shorthand"}],"vue/v-on-event-hyphenation":["error","always"],"vue/valid-attribute-name":"error","vue/valid-define-emits":"error","vue/valid-define-options":"error","vue/valid-define-props":"error","vue/valid-next-tick":"error","vue/valid-template-root":"error","vue/valid-v-bind":"error","vue/valid-v-cloak":"error","vue/valid-v-else-if":"error","vue/valid-v-else":"error","vue/valid-v-for":"error","vue/valid-v-html":"error","vue/valid-v-if":"error","vue/valid-v-memo":"error","vue/valid-v-model":"error","vue/valid-v-on":"error","vue/valid-v-once":"error","vue/valid-v-pre":"error","vue/valid-v-show":"error","vue/valid-v-slot":"error","vue/valid-v-text":"error",...e?.vue};return[{plugins:{vue:t}},{files:[Glob.VUE],languageOptions:{parser:n,parserOptions:{parser:s,project:r.project,tsconfigRootDir:process.cwd(),extraFileExtensions:[".vue"],sourceType:"module",ecmaVersion:"latest"}}},{processor:t.processors[".vue"],rules:i}]}async function config(r){const{prettier:e=!0}=r;return await Promise.all([javascript(r),typescript(r),...await vue(r),perfectionist(r),unicorn(r),e?eslintConfigPrettier:{},{ignores:[...getIgnores(),...r.ignores??[]]}])}!function(r){r.ALL="**/*.?([cm])[jt]s?(x)",r.JAVASCRIPT="**/*.?([cm])js?(x)",r.TYPESCRIPT="**/*.?([cm])ts?(x)",r.VUE="**/*.vue"}(Glob||(Glob={})),function(r){r.CACHE="**/cache",r.DIST="**/dist",r.LOG="**/log?(s)",r.NODE_MODULES="**/node_modules",r.OUT="**/out",r.TEMP="**/?(.)temp"}(GlobIgnore||(GlobIgnore={})),module.exports=config;
1
+ 'use strict';
2
+
3
+ const eslintConfigPrettier = require('eslint-config-prettier');
4
+ const globals = require('globals');
5
+ const process = require('node:process');
6
+
7
+ var Glob;
8
+ (function (Glob) {
9
+ Glob["ALL"] = "**/*.?([cm])[jt]s?(x)";
10
+ Glob["JAVASCRIPT"] = "**/*.?([cm])js?(x)";
11
+ Glob["TYPESCRIPT"] = "**/*.?([cm])ts?(x)";
12
+ Glob["VUE"] = "**/*.vue";
13
+ })(Glob || (Glob = {}));
14
+ var GlobIgnore;
15
+ (function (GlobIgnore) {
16
+ GlobIgnore["CACHE"] = "**/cache";
17
+ GlobIgnore["DIST"] = "**/dist";
18
+ GlobIgnore["LOG"] = "**/log?(s)";
19
+ GlobIgnore["NODE_MODULES"] = "**/node_modules";
20
+ GlobIgnore["OUT"] = "**/out";
21
+ GlobIgnore["TEMP"] = "**/?(.)temp";
22
+ })(GlobIgnore || (GlobIgnore = {}));
23
+
24
+ /* eslint-disable @typescript-eslint/no-unsafe-return */
25
+ /* eslint-disable @typescript-eslint/no-unsafe-member-access */
26
+ /* eslint-disable @typescript-eslint/no-explicit-any */
27
+ async function interopDefault(promise) {
28
+ const result = await promise;
29
+ return result.default ?? result;
30
+ }
31
+ function getIgnores() {
32
+ return Object.values(GlobIgnore);
33
+ }
34
+
35
+ /**
36
+ * @see https://eslint.org/docs/latest/rules/
37
+ */
38
+ function javascript(options) {
39
+ const { overrides } = options;
40
+ const files = [Glob.ALL];
41
+ if (options.vue)
42
+ files.push(Glob.VUE);
43
+ return {
44
+ files,
45
+ languageOptions: {
46
+ ecmaVersion: 'latest',
47
+ sourceType: 'module',
48
+ globals: {
49
+ ...globals.browser,
50
+ ...globals.es2021,
51
+ ...globals.node,
52
+ document: 'readonly',
53
+ window: 'readonly'
54
+ }
55
+ },
56
+ rules: {
57
+ 'accessor-pairs': ['error', { enforceForClassMembers: true, setWithoutGet: true }],
58
+ 'array-callback-return': [
59
+ 'error',
60
+ {
61
+ checkForEach: true,
62
+ allowVoid: true
63
+ }
64
+ ],
65
+ 'block-scoped-var': 'error',
66
+ 'consistent-this': ['error', 'self'],
67
+ 'default-case-last': 'error',
68
+ eqeqeq: ['error', 'always'],
69
+ 'for-direction': 'error',
70
+ 'func-style': ['error', 'declaration', { allowArrowFunctions: true }],
71
+ 'grouped-accessor-pairs': ['error', 'getBeforeSet'],
72
+ 'guard-for-in': 'error',
73
+ 'init-declarations': 'off',
74
+ 'logical-assignment-operators': ['error', 'always', { enforceForIfStatements: true }],
75
+ 'max-params': 'off',
76
+ 'new-cap': ['error', { newIsCap: true, capIsNew: false, properties: true }],
77
+ 'no-alert': 'error',
78
+ 'no-async-promise-executor': 'error',
79
+ 'no-caller': 'error',
80
+ 'no-case-declarations': 'error',
81
+ 'no-class-assign': 'error',
82
+ 'no-compare-neg-zero': 'error',
83
+ 'no-cond-assign': ['error', 'always'],
84
+ 'no-constant-binary-expression': 'error',
85
+ 'no-constant-condition': 'error',
86
+ 'no-constructor-return': 'error',
87
+ 'no-control-regex': 'error',
88
+ 'no-debugger': 'error',
89
+ 'no-delete-var': 'error',
90
+ 'no-dupe-else-if': 'error',
91
+ 'no-duplicate-case': 'error',
92
+ 'no-duplicate-imports': ['error', { includeExports: true }],
93
+ 'no-else-return': 'error',
94
+ 'no-empty': ['error', { allowEmptyCatch: true }],
95
+ 'no-empty-character-class': 'error',
96
+ 'no-empty-pattern': 'error',
97
+ 'no-empty-static-block': 'error',
98
+ 'no-eval': 'error',
99
+ 'no-ex-assign': 'error',
100
+ 'no-extend-native': 'error',
101
+ 'no-extra-bind': 'error',
102
+ 'no-extra-boolean-cast': 'error',
103
+ 'no-fallthrough': ['error', { allowEmptyCase: true }],
104
+ 'no-global-assign': 'error',
105
+ 'no-implicit-coercion': ['error', { disallowTemplateShorthand: true }],
106
+ 'no-import-assign': 'error',
107
+ 'no-inner-declarations': ['error', 'both'],
108
+ 'no-invalid-regexp': 'error',
109
+ 'no-irregular-whitespace': 'error',
110
+ 'no-iterator': 'error',
111
+ 'no-labels': ['error', { allowLoop: false, allowSwitch: false }],
112
+ 'no-lone-blocks': 'error',
113
+ 'no-lonely-if': 'error',
114
+ 'no-misleading-character-class': 'error',
115
+ 'no-multi-assign': 'error',
116
+ 'no-multi-str': 'error',
117
+ 'no-new': 'error',
118
+ 'no-new-func': 'error',
119
+ 'no-new-native-nonconstructor': 'error',
120
+ 'no-new-wrappers': 'error',
121
+ 'no-nonoctal-decimal-escape': 'error',
122
+ 'no-object-constructor': 'error',
123
+ 'no-octal': 'error',
124
+ 'no-octal-escape': 'error',
125
+ 'no-promise-executor-return': ['error', { allowVoid: true }],
126
+ 'no-proto': 'error',
127
+ 'no-prototype-builtins': 'error',
128
+ 'no-regex-spaces': 'error',
129
+ 'no-script-url': 'error',
130
+ 'no-self-assign': 'error',
131
+ 'no-self-compare': 'error',
132
+ 'no-sequences': 'error',
133
+ 'no-shadow-restricted-names': 'error',
134
+ 'no-sparse-arrays': 'error',
135
+ 'no-template-curly-in-string': 'error',
136
+ 'no-undef-init': 'error',
137
+ 'no-undefined': 'error',
138
+ 'no-unexpected-multiline': 'error',
139
+ 'no-unmodified-loop-condition': 'error',
140
+ 'no-unneeded-ternary': ['error', { defaultAssignment: false }],
141
+ 'no-unreachable-loop': 'error',
142
+ 'no-unsafe-finally': 'error',
143
+ 'no-unsafe-optional-chaining': ['error', { disallowArithmeticOperators: true }],
144
+ 'no-unused-vars': 'off',
145
+ 'no-useless-backreference': 'error',
146
+ 'no-useless-call': 'error',
147
+ 'no-useless-catch': 'error',
148
+ 'no-useless-computed-key': 'error',
149
+ 'no-useless-concat': 'error',
150
+ 'no-useless-rename': 'error',
151
+ 'no-useless-return': 'error',
152
+ 'no-var': 'error',
153
+ 'no-with': 'error',
154
+ 'object-shorthand': ['error', 'always'],
155
+ 'operator-assignment': ['error', 'always'],
156
+ 'prefer-arrow-callback': 'error',
157
+ 'prefer-const': [
158
+ 'error',
159
+ {
160
+ destructuring: 'all',
161
+ ignoreReadBeforeAssign: true
162
+ }
163
+ ],
164
+ 'prefer-destructuring': 'off',
165
+ 'prefer-exponentiation-operator': 'error',
166
+ 'prefer-object-has-own': 'error',
167
+ 'prefer-object-spread': 'error',
168
+ 'prefer-promise-reject-errors': 'error',
169
+ 'prefer-regex-literals': ['error', { disallowRedundantWrapping: true }],
170
+ 'prefer-rest-params': 'error',
171
+ 'prefer-spread': 'error',
172
+ 'prefer-template': 'error',
173
+ 'require-atomic-updates': 'error',
174
+ 'sort-imports': [
175
+ 'error',
176
+ {
177
+ allowSeparatedGroups: false,
178
+ ignoreCase: false,
179
+ ignoreDeclarationSort: true,
180
+ ignoreMemberSort: false,
181
+ memberSyntaxSortOrder: ['none', 'all', 'multiple', 'single']
182
+ }
183
+ ],
184
+ 'symbol-description': 'error',
185
+ 'use-isnan': 'error',
186
+ 'valid-typeof': 'error',
187
+ yoda: ['error', 'never'],
188
+ ...overrides?.javascript
189
+ }
190
+ };
191
+ }
192
+
193
+ /**
194
+ * @see https://eslint-plugin-perfectionist.azat.io/rules/
195
+ */
196
+ async function perfectionist(options) {
197
+ const { overrides, perfectionist: enabled = true } = options;
198
+ if (!enabled)
199
+ return {};
200
+ const plugin = await interopDefault(import('eslint-plugin-perfectionist'));
201
+ return {
202
+ plugins: {
203
+ perfectionist: plugin
204
+ },
205
+ rules: {
206
+ 'perfectionist/sort-classes': [
207
+ 'error',
208
+ {
209
+ type: 'natural',
210
+ order: 'asc',
211
+ groups: [
212
+ 'index-signature',
213
+ 'property',
214
+ 'private-property',
215
+ 'constructor',
216
+ 'method',
217
+ 'private-method',
218
+ ['get-method', 'set-method'],
219
+ 'static-property',
220
+ 'static-method',
221
+ 'static-private-method',
222
+ 'unknown'
223
+ ]
224
+ }
225
+ ],
226
+ 'perfectionist/sort-enums': [
227
+ 'error',
228
+ {
229
+ type: 'natural',
230
+ order: 'asc'
231
+ }
232
+ ],
233
+ 'perfectionist/sort-exports': [
234
+ 'error',
235
+ {
236
+ type: 'line-length',
237
+ order: 'asc'
238
+ }
239
+ ],
240
+ 'perfectionist/sort-imports': [
241
+ 'error',
242
+ {
243
+ type: 'line-length',
244
+ order: 'asc',
245
+ 'newlines-between': 'never',
246
+ groups: [
247
+ ['style', 'side-effect'],
248
+ ['builtin', 'builtin-type'],
249
+ ['external', 'external-type'],
250
+ ['internal', 'internal-type'],
251
+ 'unknown'
252
+ ]
253
+ }
254
+ ],
255
+ 'perfectionist/sort-interfaces': [
256
+ 'error',
257
+ {
258
+ type: 'natural',
259
+ order: 'asc',
260
+ 'partition-by-new-line': true
261
+ }
262
+ ],
263
+ 'perfectionist/sort-maps': [
264
+ 'error',
265
+ {
266
+ type: 'natural',
267
+ order: 'asc'
268
+ }
269
+ ],
270
+ 'perfectionist/sort-named-exports': [
271
+ 'error',
272
+ {
273
+ type: 'natural',
274
+ order: 'asc'
275
+ }
276
+ ],
277
+ 'sort-imports': 'off',
278
+ 'perfectionist/sort-named-imports': [
279
+ 'error',
280
+ {
281
+ type: 'natural',
282
+ order: 'asc'
283
+ }
284
+ ],
285
+ '@typescript-eslint/adjacent-overload-signatures': 'off',
286
+ 'perfectionist/sort-object-types': [
287
+ 'error',
288
+ {
289
+ type: 'natural',
290
+ order: 'asc',
291
+ 'partition-by-new-line': true
292
+ }
293
+ ],
294
+ ...overrides?.perfectionist
295
+ }
296
+ };
297
+ }
298
+
299
+ /**
300
+ * @see https://typescript-eslint.io/rules/
301
+ */
302
+ async function typescript(options) {
303
+ const { project, overrides } = options;
304
+ const [tsParser, tsPlugin] = await Promise.all([
305
+ await interopDefault(import('@typescript-eslint/parser')),
306
+ await interopDefault(import('@typescript-eslint/eslint-plugin'))
307
+ ]);
308
+ const files = [Glob.TYPESCRIPT];
309
+ if (options.vue)
310
+ files.push(Glob.VUE);
311
+ const rules = {
312
+ '@typescript-eslint/adjacent-overload-signatures': 'error',
313
+ 'no-array-constructor': 'off',
314
+ '@typescript-eslint/no-array-constructor': 'error',
315
+ '@typescript-eslint/array-type': ['error', { default: 'array' }],
316
+ '@typescript-eslint/ban-ts-comment': [
317
+ 'error',
318
+ {
319
+ 'ts-expect-error': 'allow-with-description',
320
+ 'ts-ignore': true,
321
+ 'ts-nocheck': true,
322
+ 'ts-check': false,
323
+ minimumDescriptionLength: 3
324
+ }
325
+ ],
326
+ '@typescript-eslint/class-literal-property-style': ['error', 'fields'],
327
+ 'class-methods-use-this': 'off',
328
+ '@typescript-eslint/class-methods-use-this': [
329
+ 'error',
330
+ {
331
+ ignoreOverrideMethods: true,
332
+ ignoreClassesThatImplementAnInterface: 'public-fields'
333
+ }
334
+ ],
335
+ '@typescript-eslint/consistent-generic-constructors': ['error', 'constructor'],
336
+ '@typescript-eslint/consistent-indexed-object-style': ['error', 'record'],
337
+ '@typescript-eslint/consistent-type-assertions': [
338
+ 'error',
339
+ { assertionStyle: 'as', objectLiteralTypeAssertions: 'allow-as-parameter' }
340
+ ],
341
+ '@typescript-eslint/consistent-type-definitions': ['error', 'interface'],
342
+ 'dot-notation': 'off',
343
+ '@typescript-eslint/dot-notation': ['error', { allowKeywords: true }],
344
+ '@typescript-eslint/explicit-function-return-type': 'off',
345
+ '@typescript-eslint/explicit-member-accessibility': [
346
+ 'error',
347
+ {
348
+ accessibility: 'explicit',
349
+ overrides: {
350
+ accessors: 'no-public',
351
+ constructors: 'no-public',
352
+ methods: 'explicit',
353
+ properties: 'explicit',
354
+ parameterProperties: 'explicit'
355
+ }
356
+ }
357
+ ],
358
+ '@typescript-eslint/explicit-module-boundary-types': 'off',
359
+ '@typescript-eslint/method-signature-style': ['error', 'property'],
360
+ '@typescript-eslint/no-base-to-string': 'error',
361
+ '@typescript-eslint/no-confusing-non-null-assertion': 'error',
362
+ '@typescript-eslint/no-confusing-void-expression': [
363
+ 'error',
364
+ {
365
+ ignoreArrowShorthand: true,
366
+ ignoreVoidOperator: true
367
+ }
368
+ ],
369
+ '@typescript-eslint/no-duplicate-enum-values': 'error',
370
+ '@typescript-eslint/no-duplicate-type-constituents': 'error',
371
+ '@typescript-eslint/no-dynamic-delete': 'error',
372
+ 'no-empty-function': 'off',
373
+ '@typescript-eslint/no-empty-function': 'error',
374
+ '@typescript-eslint/no-empty-interface': 'error',
375
+ '@typescript-eslint/no-explicit-any': ['error', { fixToUnknown: true }],
376
+ '@typescript-eslint/no-extra-non-null-assertion': 'error',
377
+ '@typescript-eslint/no-extraneous-class': 'error',
378
+ '@typescript-eslint/no-floating-promises': ['error', { ignoreVoid: true }],
379
+ '@typescript-eslint/no-for-in-array': 'error',
380
+ 'no-implied-eval': 'off',
381
+ '@typescript-eslint/no-implied-eval': 'error',
382
+ '@typescript-eslint/no-import-type-side-effects': 'error',
383
+ '@typescript-eslint/no-inferrable-types': 'error',
384
+ '@typescript-eslint/no-invalid-void-type': [
385
+ 'error',
386
+ {
387
+ allowInGenericTypeArguments: true,
388
+ allowAsThisParameter: true
389
+ }
390
+ ],
391
+ 'no-loop-func': 'off',
392
+ '@typescript-eslint/no-loop-func': 'error',
393
+ 'no-loss-of-precision': 'off',
394
+ '@typescript-eslint/no-loss-of-precision': 'error',
395
+ '@typescript-eslint/no-meaningless-void-operator': 'error',
396
+ '@typescript-eslint/no-misused-new': 'error',
397
+ '@typescript-eslint/no-misused-promises': [
398
+ 'error',
399
+ {
400
+ checksConditionals: true,
401
+ checksSpreads: true,
402
+ checksVoidReturn: {
403
+ arguments: true,
404
+ attributes: true,
405
+ properties: true,
406
+ returns: true,
407
+ variables: true
408
+ }
409
+ }
410
+ ],
411
+ '@typescript-eslint/no-mixed-enums': 'error',
412
+ '@typescript-eslint/no-namespace': 'error',
413
+ '@typescript-eslint/no-non-null-asserted-nullish-coalescing': 'error',
414
+ '@typescript-eslint/no-non-null-asserted-optional-chain': 'error',
415
+ '@typescript-eslint/no-non-null-assertion': 'error',
416
+ '@typescript-eslint/no-redundant-type-constituents': 'error',
417
+ '@typescript-eslint/no-require-imports': 'error',
418
+ 'no-shadow': 'off',
419
+ '@typescript-eslint/no-shadow': 'error',
420
+ '@typescript-eslint/no-this-alias': 'error',
421
+ 'no-throw-literal': 'off',
422
+ '@typescript-eslint/no-throw-literal': 'error',
423
+ '@typescript-eslint/no-unnecessary-boolean-literal-compare': [
424
+ 'error',
425
+ {
426
+ allowComparingNullableBooleansToTrue: false,
427
+ allowComparingNullableBooleansToFalse: true
428
+ }
429
+ ],
430
+ '@typescript-eslint/no-unnecessary-condition': 'error',
431
+ '@typescript-eslint/no-unnecessary-qualifier': 'error',
432
+ '@typescript-eslint/no-unnecessary-type-arguments': 'error',
433
+ '@typescript-eslint/no-unnecessary-type-assertion': 'error',
434
+ '@typescript-eslint/no-unnecessary-type-constraint': 'error',
435
+ '@typescript-eslint/no-unsafe-argument': 'error',
436
+ '@typescript-eslint/no-unsafe-assignment': 'error',
437
+ '@typescript-eslint/no-unsafe-call': 'error',
438
+ '@typescript-eslint/no-unsafe-declaration-merging': 'error',
439
+ '@typescript-eslint/no-unsafe-enum-comparison': 'off',
440
+ '@typescript-eslint/no-unsafe-member-access': 'error',
441
+ '@typescript-eslint/no-unsafe-return': 'error',
442
+ '@typescript-eslint/no-unsafe-unary-minus': 'error',
443
+ 'no-unused-expressions': 'off',
444
+ '@typescript-eslint/no-unused-expressions': [
445
+ 'error',
446
+ {
447
+ allowTaggedTemplates: true
448
+ }
449
+ ],
450
+ 'no-use-before-define': 'off',
451
+ '@typescript-eslint/no-use-before-define': [
452
+ 'error',
453
+ {
454
+ functions: false,
455
+ enums: true,
456
+ typedefs: false
457
+ }
458
+ ],
459
+ 'no-useless-constructor': 'off',
460
+ '@typescript-eslint/no-useless-constructor': 'error',
461
+ '@typescript-eslint/no-useless-empty-export': 'error',
462
+ '@typescript-eslint/non-nullable-type-assertion-style': 'error',
463
+ '@typescript-eslint/prefer-as-const': 'error',
464
+ '@typescript-eslint/prefer-enum-initializers': 'error',
465
+ '@typescript-eslint/prefer-for-of': 'error',
466
+ '@typescript-eslint/prefer-function-type': 'error',
467
+ '@typescript-eslint/prefer-includes': 'error',
468
+ '@typescript-eslint/prefer-literal-enum-member': 'error',
469
+ '@typescript-eslint/prefer-nullish-coalescing': [
470
+ 'error',
471
+ {
472
+ ignoreTernaryTests: false,
473
+ ignoreConditionalTests: false,
474
+ ignoreMixedLogicalExpressions: false,
475
+ ignorePrimitives: {
476
+ bigint: false,
477
+ boolean: false,
478
+ number: false,
479
+ string: false
480
+ }
481
+ }
482
+ ],
483
+ '@typescript-eslint/prefer-optional-chain': 'error',
484
+ '@typescript-eslint/prefer-readonly': 'error',
485
+ '@typescript-eslint/prefer-readonly-parameter-types': 'off',
486
+ '@typescript-eslint/prefer-reduce-type-parameter': 'error',
487
+ '@typescript-eslint/prefer-regexp-exec': 'error',
488
+ '@typescript-eslint/prefer-return-this-type': 'error',
489
+ '@typescript-eslint/prefer-string-starts-ends-with': 'error',
490
+ '@typescript-eslint/prefer-ts-expect-error': 'error',
491
+ '@typescript-eslint/promise-function-async': 'off',
492
+ '@typescript-eslint/require-array-sort-compare': 'error',
493
+ 'require-await': 'off',
494
+ '@typescript-eslint/require-await': 'error',
495
+ '@typescript-eslint/restrict-plus-operands': 'error',
496
+ '@typescript-eslint/restrict-template-expressions': 'error',
497
+ '@typescript-eslint/strict-boolean-expressions': 'off',
498
+ '@typescript-eslint/switch-exhaustiveness-check': [
499
+ 'error',
500
+ {
501
+ requireDefaultForNonUnion: true
502
+ }
503
+ ],
504
+ '@typescript-eslint/unbound-method': 'error',
505
+ '@typescript-eslint/unified-signatures': [
506
+ 'error',
507
+ {
508
+ ignoreDifferentlyNamedParameters: true
509
+ }
510
+ ],
511
+ ...overrides?.typescript
512
+ };
513
+ return {
514
+ files,
515
+ languageOptions: {
516
+ ecmaVersion: 'latest',
517
+ sourceType: 'module',
518
+ parser: tsParser,
519
+ parserOptions: {
520
+ project,
521
+ tsconfigRootDir: process.cwd(),
522
+ extraFileExtensions: options.vue ? ['.vue'] : []
523
+ }
524
+ },
525
+ plugins: {
526
+ '@typescript-eslint': tsPlugin
527
+ },
528
+ rules
529
+ };
530
+ }
531
+
532
+ /**
533
+ * @see https://github.com/sindresorhus/eslint-plugin-unicorn#rules
534
+ */
535
+ async function unicorn(options) {
536
+ const { overrides, unicorn: enabled = true } = options;
537
+ if (!enabled)
538
+ return {};
539
+ const plugin = await interopDefault(import('eslint-plugin-unicorn'));
540
+ return {
541
+ plugins: {
542
+ unicorn: plugin
543
+ },
544
+ rules: {
545
+ 'unicorn/catch-error-name': [
546
+ 'error',
547
+ {
548
+ name: 'err'
549
+ }
550
+ ],
551
+ 'unicorn/consistent-function-scoping': [
552
+ 'error',
553
+ {
554
+ checkArrowFunctions: true
555
+ }
556
+ ],
557
+ 'unicorn/custom-error-definition': 'error',
558
+ 'unicorn/error-message': 'error',
559
+ 'unicorn/no-array-for-each': 'error',
560
+ 'unicorn/no-array-method-this-argument': 'error',
561
+ 'unicorn/no-array-push-push': 'error',
562
+ 'unicorn/no-await-expression-member': 'error',
563
+ 'unicorn/no-invalid-remove-event-listener': 'error',
564
+ 'unicorn/no-thenable': 'error',
565
+ 'unicorn/no-typeof-undefined': 'error',
566
+ 'unicorn/no-useless-fallback-in-spread': 'error',
567
+ 'unicorn/no-useless-length-check': 'error',
568
+ 'unicorn/no-useless-promise-resolve-reject': 'error',
569
+ 'unicorn/prefer-at': 'error',
570
+ 'unicorn/prefer-date-now': 'error',
571
+ 'unicorn/prefer-dom-node-append': 'error',
572
+ 'unicorn/prefer-dom-node-dataset': 'error',
573
+ 'unicorn/prefer-dom-node-remove': 'error',
574
+ 'unicorn/prefer-dom-node-text-content': 'error',
575
+ 'unicorn/prefer-modern-dom-apis': 'error',
576
+ 'unicorn/prefer-node-protocol': 'error',
577
+ 'unicorn/prefer-number-properties': 'error',
578
+ 'unicorn/prefer-object-from-entries': 'error',
579
+ 'unicorn/prefer-prototype-methods': 'error',
580
+ 'unicorn/prefer-query-selector': 'error',
581
+ 'unicorn/prefer-reflect-apply': 'error',
582
+ 'unicorn/prefer-regexp-test': 'error',
583
+ 'unicorn/prefer-string-slice': 'error',
584
+ 'unicorn/prefer-type-error': 'error',
585
+ 'unicorn/relative-url-style': ['error', 'never'],
586
+ ...overrides?.unicorn
587
+ }
588
+ };
589
+ }
590
+
591
+ /* eslint-disable @typescript-eslint/no-explicit-any */
592
+ /* eslint-disable @typescript-eslint/no-unsafe-assignment */
593
+ /* eslint-disable @typescript-eslint/no-unsafe-member-access */
594
+ /**
595
+ * @see https://eslint.vuejs.org/rules/
596
+ */
597
+ async function vue(options) {
598
+ const { overrides, vue: enabled } = options;
599
+ if (!enabled)
600
+ return [];
601
+ const [vuePlugin, vueParser, tsParser] = await Promise.all([
602
+ // @ts-expect-error no types
603
+ await interopDefault(import('eslint-plugin-vue')),
604
+ await interopDefault(import('vue-eslint-parser')),
605
+ await interopDefault(import('@typescript-eslint/parser'))
606
+ ]);
607
+ const rules = {
608
+ ...vuePlugin.configs.base.rules,
609
+ 'vue/attribute-hyphenation': ['error', 'always'],
610
+ 'vue/attributes-order': 'error',
611
+ 'vue/block-lang': [
612
+ 'error',
613
+ {
614
+ script: {
615
+ lang: 'ts'
616
+ },
617
+ style: {
618
+ lang: 'scss',
619
+ allowNoLang: true
620
+ }
621
+ }
622
+ ],
623
+ 'vue/block-order': [
624
+ 'error',
625
+ {
626
+ order: [['script', 'template'], 'style:not([scoped])', 'style[scoped]']
627
+ }
628
+ ],
629
+ 'vue/block-tag-newline': [
630
+ 'error',
631
+ {
632
+ singleline: 'always',
633
+ multiline: 'always',
634
+ maxEmptyLines: 0
635
+ }
636
+ ],
637
+ 'vue/component-api-style': ['error', ['script-setup']],
638
+ 'vue/component-definition-name-casing': ['error', 'PascalCase'],
639
+ 'vue/component-name-in-template-casing': ['error', 'PascalCase'],
640
+ 'vue/custom-event-name-casing': ['error', 'camelCase'],
641
+ 'vue/define-emits-declaration': ['error', 'type-based'],
642
+ 'vue/define-macros-order': [
643
+ 'error',
644
+ {
645
+ order: ['defineProps', 'defineEmits']
646
+ }
647
+ ],
648
+ 'vue/define-props-declaration': ['error', 'type-based'],
649
+ 'vue/first-attribute-linebreak': 'off',
650
+ 'vue/html-button-has-type': [
651
+ 'error',
652
+ {
653
+ button: true,
654
+ submit: true,
655
+ reset: true
656
+ }
657
+ ],
658
+ 'vue/html-closing-bracket-newline': [
659
+ 'error',
660
+ {
661
+ singleline: 'never',
662
+ multiline: 'always'
663
+ }
664
+ ],
665
+ 'vue/html-closing-bracket-spacing': [
666
+ 'error',
667
+ {
668
+ startTag: 'never',
669
+ endTag: 'never',
670
+ selfClosingTag: 'always'
671
+ }
672
+ ],
673
+ 'vue/html-self-closing': [
674
+ 'error',
675
+ {
676
+ html: {
677
+ void: 'never',
678
+ normal: 'always',
679
+ component: 'always'
680
+ },
681
+ svg: 'always',
682
+ math: 'always'
683
+ }
684
+ ],
685
+ 'vue/match-component-file-name': [
686
+ 'error',
687
+ {
688
+ extensions: ['tsx', 'vue'],
689
+ shouldMatchCase: false
690
+ }
691
+ ],
692
+ 'vue/match-component-import-name': 'error',
693
+ 'vue/multi-word-component-names': 'off',
694
+ 'vue/mustache-interpolation-spacing': ['error', 'always'],
695
+ 'vue/no-arrow-functions-in-watch': 'off',
696
+ 'vue/no-async-in-computed-properties': 'error',
697
+ 'vue/no-boolean-default': ['error', 'no-default'],
698
+ 'vue/no-computed-properties-in-data': 'error',
699
+ 'vue/no-dupe-keys': 'error',
700
+ 'vue/no-dupe-v-else-if': 'error',
701
+ 'vue/no-duplicate-attributes': [
702
+ 'error',
703
+ {
704
+ allowCoexistClass: true,
705
+ allowCoexistStyle: true
706
+ }
707
+ ],
708
+ 'vue/no-export-in-script-setup': 'error',
709
+ 'vue/no-expose-after-await': 'error',
710
+ 'vue/no-lifecycle-after-await': 'error',
711
+ 'vue/no-lone-template': 'error',
712
+ 'vue/no-multi-spaces': 'error',
713
+ 'vue/no-multiple-objects-in-class': 'error',
714
+ 'vue/no-mutating-props': 'error',
715
+ 'vue/no-parsing-error': 'error',
716
+ 'vue/no-ref-as-operand': 'error',
717
+ 'vue/no-ref-object-reactivity-loss': 'error',
718
+ 'vue/no-reserved-component-names': 'error',
719
+ 'vue/no-reserved-keys': 'error',
720
+ 'vue/no-reserved-props': 'error',
721
+ 'vue/no-required-prop-with-default': [
722
+ 'error',
723
+ {
724
+ autofix: true
725
+ }
726
+ ],
727
+ 'vue/no-root-v-if': 'error',
728
+ 'vue/no-setup-props-reactivity-loss': 'error',
729
+ 'vue/no-shared-component-data': 'error',
730
+ 'vue/no-side-effects-in-computed-properties': 'error',
731
+ 'vue/no-spaces-around-equal-signs-in-attribute': 'error',
732
+ 'vue/no-static-inline-styles': [
733
+ 'error',
734
+ {
735
+ allowBinding: false
736
+ }
737
+ ],
738
+ 'vue/no-template-key': 'error',
739
+ 'vue/no-template-shadow': 'error',
740
+ 'vue/no-template-target-blank': 'error',
741
+ 'vue/no-textarea-mustache': 'error',
742
+ 'vue/no-unused-components': 'error',
743
+ 'vue/no-unused-properties': 'error',
744
+ 'vue/no-unused-refs': 'error',
745
+ 'vue/no-unused-vars': [
746
+ 'error',
747
+ {
748
+ ignorePattern: '^_'
749
+ }
750
+ ],
751
+ 'vue/no-use-computed-property-like-method': 'error',
752
+ 'vue/no-use-v-else-with-v-for': 'error',
753
+ 'vue/no-use-v-if-with-v-for': 'error',
754
+ 'vue/no-useless-mustaches': [
755
+ 'error',
756
+ {
757
+ ignoreIncludesComment: false,
758
+ ignoreStringEscape: false
759
+ }
760
+ ],
761
+ 'vue/no-useless-template-attributes': 'error',
762
+ 'vue/no-useless-v-bind': 'error',
763
+ 'vue/no-v-for-template-key-on-child': 'error',
764
+ 'vue/no-v-text-v-html-on-component': 'error',
765
+ 'vue/no-v-html': 'off',
766
+ 'vue/no-watch-after-await': 'error',
767
+ 'vue/order-in-components': 'error',
768
+ 'vue/padding-line-between-blocks': ['error', 'always'],
769
+ 'vue/prefer-define-options': 'error',
770
+ 'vue/prefer-import-from-vue': 'error',
771
+ 'vue/prefer-separate-static-class': 'error',
772
+ 'vue/prefer-true-attribute-shorthand': 'error',
773
+ 'vue/prop-name-casing': ['error', 'camelCase'],
774
+ 'vue/require-component-is': 'error',
775
+ 'vue/require-default-prop': 'error',
776
+ 'vue/require-explicit-emits': [
777
+ 'error',
778
+ {
779
+ allowProps: false
780
+ }
781
+ ],
782
+ 'vue/require-macro-variable-name': [
783
+ 'error',
784
+ {
785
+ defineProps: 'props',
786
+ defineEmits: 'emit',
787
+ defineSlots: 'slots',
788
+ useSlots: 'slots',
789
+ useAttrs: 'attrs'
790
+ }
791
+ ],
792
+ 'vue/require-prop-types': 'error',
793
+ 'vue/require-render-return': 'error',
794
+ 'vue/require-slots-as-functions': 'error',
795
+ 'vue/require-toggle-inside-transition': 'error',
796
+ 'vue/require-typed-ref': 'error',
797
+ 'vue/require-v-for-key': 'error',
798
+ 'vue/require-valid-default-prop': 'error',
799
+ 'vue/return-in-computed-property': 'error',
800
+ 'vue/return-in-emits-validator': 'error',
801
+ 'vue/this-in-template': ['error', 'never'],
802
+ 'vue/use-v-on-exact': 'error',
803
+ 'vue/v-bind-style': ['error', 'shorthand'],
804
+ 'vue/v-for-delimiter-style': ['error', 'of'],
805
+ 'vue/v-on-handler-style': [
806
+ 'error',
807
+ ['method', 'inline-function'],
808
+ {
809
+ ignoreIncludesComment: false
810
+ }
811
+ ],
812
+ 'vue/v-on-style': ['error', 'shorthand'],
813
+ 'vue/v-slot-style': [
814
+ 'error',
815
+ {
816
+ atComponent: 'shorthand',
817
+ default: 'shorthand',
818
+ named: 'shorthand'
819
+ }
820
+ ],
821
+ 'vue/v-on-event-hyphenation': ['error', 'always'],
822
+ 'vue/valid-attribute-name': 'error',
823
+ 'vue/valid-define-emits': 'error',
824
+ 'vue/valid-define-options': 'error',
825
+ 'vue/valid-define-props': 'error',
826
+ 'vue/valid-next-tick': 'error',
827
+ 'vue/valid-template-root': 'error',
828
+ 'vue/valid-v-bind': 'error',
829
+ 'vue/valid-v-cloak': 'error',
830
+ 'vue/valid-v-else-if': 'error',
831
+ 'vue/valid-v-else': 'error',
832
+ 'vue/valid-v-for': 'error',
833
+ 'vue/valid-v-html': 'error',
834
+ 'vue/valid-v-if': 'error',
835
+ 'vue/valid-v-memo': 'error',
836
+ 'vue/valid-v-model': 'error',
837
+ 'vue/valid-v-on': 'error',
838
+ 'vue/valid-v-once': 'error',
839
+ 'vue/valid-v-pre': 'error',
840
+ 'vue/valid-v-show': 'error',
841
+ 'vue/valid-v-slot': 'error',
842
+ 'vue/valid-v-text': 'error',
843
+ ...overrides?.vue
844
+ };
845
+ return [
846
+ {
847
+ plugins: {
848
+ vue: vuePlugin
849
+ }
850
+ },
851
+ {
852
+ files: [Glob.VUE],
853
+ languageOptions: {
854
+ parser: vueParser,
855
+ parserOptions: {
856
+ parser: tsParser,
857
+ project: options.project,
858
+ tsconfigRootDir: process.cwd(),
859
+ extraFileExtensions: ['.vue'],
860
+ sourceType: 'module',
861
+ ecmaVersion: 'latest'
862
+ }
863
+ }
864
+ },
865
+ {
866
+ // @ts-expect-error no types
867
+ processor: vuePlugin.processors['.vue'],
868
+ rules
869
+ }
870
+ ];
871
+ }
872
+
873
+ /* eslint-disable @typescript-eslint/no-explicit-any */
874
+ /* eslint-disable @typescript-eslint/no-unsafe-return */
875
+ async function config(options) {
876
+ const { prettier = true } = options;
877
+ const objs = await Promise.all([
878
+ javascript(options),
879
+ typescript(options),
880
+ ...(await vue(options)),
881
+ perfectionist(options),
882
+ unicorn(options),
883
+ prettier ? eslintConfigPrettier : {},
884
+ {
885
+ ignores: [...getIgnores(), ...(options.ignores ?? [])]
886
+ }
887
+ ]);
888
+ return objs;
889
+ }
890
+
891
+ module.exports = config;