@shayanthenerd/eslint-config 0.4.5 → 0.5.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 (66) hide show
  1. package/README.md +0 -1
  2. package/dist/configs/base.js +43 -0
  3. package/dist/configs/css.js +28 -0
  4. package/dist/configs/cypress.js +22 -0
  5. package/dist/configs/html.js +22 -0
  6. package/dist/configs/importX.js +24 -0
  7. package/dist/configs/nuxtMultiRootTemplate.js +14 -0
  8. package/dist/configs/oxlintOverrides.js +47 -0
  9. package/dist/configs/perfectionist.js +23 -0
  10. package/dist/configs/playwright.js +22 -0
  11. package/dist/configs/restrictedExports.js +19 -0
  12. package/dist/configs/storybook.js +23 -0
  13. package/dist/configs/stylistic.js +22 -0
  14. package/dist/configs/tailwind.js +42 -0
  15. package/dist/configs/typescript.js +30 -0
  16. package/dist/configs/vitest.js +22 -0
  17. package/dist/configs/vue.js +34 -0
  18. package/dist/configs/vueComponentNames.js +19 -0
  19. package/dist/index.d.ts +16 -0
  20. package/dist/index.js +54 -0
  21. package/dist/oxlint.config.jsonc +185 -0
  22. package/dist/prettier.config.d.ts +6 -0
  23. package/dist/prettier.config.js +38 -0
  24. package/dist/rules/css.js +65 -0
  25. package/dist/rules/cypress.js +15 -0
  26. package/dist/rules/html.js +53 -0
  27. package/dist/rules/importX.js +45 -0
  28. package/dist/rules/javascript.js +163 -0
  29. package/dist/rules/perfectionist.js +73 -0
  30. package/dist/rules/playwright.js +27 -0
  31. package/dist/rules/storybook.js +15 -0
  32. package/dist/rules/stylistic.js +160 -0
  33. package/dist/rules/tailwind.js +35 -0
  34. package/dist/rules/typescript.js +63 -0
  35. package/dist/rules/vitest.js +46 -0
  36. package/dist/rules/vue.js +174 -0
  37. package/dist/rules/vueAccessibility.js +23 -0
  38. package/dist/types/configOptions/base.d.ts +55 -0
  39. package/dist/types/configOptions/css.d.ts +27 -0
  40. package/dist/types/configOptions/html.d.ts +27 -0
  41. package/dist/types/configOptions/importX.d.ts +15 -0
  42. package/dist/types/configOptions/nuxt.d.ts +42 -0
  43. package/dist/types/configOptions/perfectionist.d.ts +16 -0
  44. package/dist/types/configOptions/stylistic.d.ts +145 -0
  45. package/dist/types/configOptions/tailwind.d.ts +46 -0
  46. package/dist/types/configOptions/test.d.ts +55 -0
  47. package/dist/types/configOptions/typescript.d.ts +36 -0
  48. package/dist/types/configOptions/vue.d.ts +214 -0
  49. package/dist/types/configOptions/vueAccessibility.d.ts +34 -0
  50. package/dist/types/eslint-schema.d.ts +13281 -0
  51. package/dist/types/eslintRules.d.ts +12 -0
  52. package/dist/types/helpers.d.ts +5 -0
  53. package/dist/types/index.d.ts +360 -0
  54. package/dist/utils/globs.js +29 -0
  55. package/dist/utils/ignores/defaultIgnorePatterns.js +57 -0
  56. package/dist/utils/ignores/getIgnorePatterns.js +16 -0
  57. package/dist/utils/ignores/resolveGitignorePatterns.js +26 -0
  58. package/dist/utils/isEmptyString.js +7 -0
  59. package/dist/utils/isEnabled.js +7 -0
  60. package/dist/utils/isPackageDetected.js +20 -0
  61. package/dist/utils/options/defaultOptions.js +166 -0
  62. package/dist/utils/options/enableDetectedConfigs.js +40 -0
  63. package/dist/utils/options/mergeWithDefaults.js +21 -0
  64. package/dist/utils/vue/getRestrictedVueElements.js +27 -0
  65. package/dist/utils/vue/getRestrictedVueInputs.js +23 -0
  66. package/package.json +6 -6
@@ -0,0 +1,15 @@
1
+ import path from "node:path";
2
+
3
+ //#region src/rules/storybook.ts
4
+ function getStorybookRules(options) {
5
+ const storybookRules = {
6
+ "storybook/csf-component": "error",
7
+ "storybook/no-stories-of": "error",
8
+ "storybook/meta-satisfies-type": "warn",
9
+ "storybook/no-uninstalled-addons": ["error", { packageJsonLocation: path.resolve(options.packageDir, "package.json") }]
10
+ };
11
+ return storybookRules;
12
+ }
13
+
14
+ //#endregion
15
+ export { getStorybookRules };
@@ -0,0 +1,160 @@
1
+ import { isEnabled } from "../utils/isEnabled.js";
2
+ import { defaultOptions } from "../utils/options/defaultOptions.js";
3
+
4
+ //#region src/rules/stylistic.ts
5
+ function getStylisticRules(options) {
6
+ const { stylistic } = options.configs;
7
+ const { semi, quotes, indent, useTabs, jsxQuotes, arrowParens, trailingComma, maxLineLength, memberDelimiterStyle, maxConsecutiveEmptyLines } = isEnabled(stylistic) ? stylistic : defaultOptions.configs.stylistic;
8
+ const stylisticRules = {
9
+ "@stylistic/wrap-regex": "warn",
10
+ "@stylistic/semi-style": "warn",
11
+ "@stylistic/semi": ["warn", semi],
12
+ "@stylistic/spaced-comment": "off",
13
+ "@stylistic/no-extra-semi": "warn",
14
+ "@stylistic/linebreak-style": "warn",
15
+ "@stylistic/quotes": ["warn", quotes],
16
+ "@stylistic/no-confusing-arrow": "warn",
17
+ "@stylistic/switch-colon-spacing": "warn",
18
+ "@stylistic/jsx-quotes": ["warn", jsxQuotes],
19
+ "@stylistic/type-annotation-spacing": "warn",
20
+ "@stylistic/no-tabs": useTabs ? "off" : "warn",
21
+ "@stylistic/lines-between-class-members": "off",
22
+ "@stylistic/arrow-parens": ["warn", arrowParens],
23
+ "@stylistic/comma-dangle": ["warn", trailingComma],
24
+ "@stylistic/object-curly-spacing": ["warn", "always"],
25
+ "@stylistic/nonblock-statement-body-position": "error",
26
+ "@stylistic/generator-star-spacing": ["warn", "after"],
27
+ "@stylistic/implicit-arrow-linebreak": ["error", "beside"],
28
+ "@stylistic/array-bracket-newline": ["warn", "consistent"],
29
+ "@stylistic/no-mixed-spaces-and-tabs": ["warn", "smart-tabs"],
30
+ "@stylistic/indent-binary-ops": ["warn", useTabs ? "tab" : indent],
31
+ "@stylistic/function-call-argument-newline": ["warn", "consistent"],
32
+ "@stylistic/brace-style": [
33
+ "warn",
34
+ "1tbs",
35
+ { allowSingleLine: true }
36
+ ],
37
+ "@stylistic/padded-blocks": [
38
+ "error",
39
+ "never",
40
+ { allowSingleLineBlocks: true }
41
+ ],
42
+ "@stylistic/object-property-newline": ["warn", { allowAllPropertiesOnSameLine: true }],
43
+ "@stylistic/indent": [
44
+ "warn",
45
+ useTabs ? "tab" : indent,
46
+ { tabLength: indent }
47
+ ],
48
+ "@stylistic/max-len": ["warn", {
49
+ tabWidth: indent,
50
+ code: maxLineLength,
51
+ ignoreUrls: true,
52
+ ignoreStrings: true,
53
+ ignoreComments: true,
54
+ ignoreRegExpLiterals: true,
55
+ ignoreTrailingComments: true,
56
+ ignoreTemplateLiterals: true
57
+ }],
58
+ "@stylistic/object-curly-newline": ["warn", {
59
+ multiline: true,
60
+ consistent: true
61
+ }],
62
+ "@stylistic/lines-around-comment": ["warn", {
63
+ allowTypeStart: true,
64
+ allowEnumStart: true,
65
+ allowClassStart: true,
66
+ allowBlockStart: true,
67
+ allowArrayStart: true,
68
+ allowModuleStart: true,
69
+ allowObjectStart: true,
70
+ allowInterfaceStart: true
71
+ }],
72
+ "@stylistic/no-multiple-empty-lines": ["warn", {
73
+ maxBOF: 0,
74
+ maxEOF: 0,
75
+ max: maxConsecutiveEmptyLines
76
+ }],
77
+ "@stylistic/member-delimiter-style": ["error", {
78
+ singleline: { delimiter: memberDelimiterStyle },
79
+ multiline: {
80
+ delimiter: memberDelimiterStyle,
81
+ requireLast: trailingComma !== "never"
82
+ }
83
+ }],
84
+ "@stylistic/operator-linebreak": [
85
+ "error",
86
+ "none",
87
+ { overrides: {
88
+ "=": "after",
89
+ "?": "before",
90
+ ":": "before",
91
+ "|": "before",
92
+ "&": "before"
93
+ } }
94
+ ],
95
+ "@stylistic/padding-line-between-statements": [
96
+ "warn",
97
+ {
98
+ prev: "*",
99
+ next: [
100
+ "do",
101
+ "try",
102
+ "for",
103
+ "iife",
104
+ "with",
105
+ "class",
106
+ "block",
107
+ "while",
108
+ "throw",
109
+ "return",
110
+ "switch",
111
+ "export",
112
+ "function",
113
+ "directive",
114
+ "block-like",
115
+ "cjs-export",
116
+ "multiline-block-like"
117
+ ],
118
+ blankLine: "always"
119
+ },
120
+ {
121
+ prev: "import",
122
+ next: "*",
123
+ blankLine: "always"
124
+ },
125
+ {
126
+ prev: "import",
127
+ next: "import",
128
+ blankLine: "any"
129
+ },
130
+ {
131
+ prev: "export",
132
+ next: "export",
133
+ blankLine: "any"
134
+ },
135
+ {
136
+ prev: "function-overload",
137
+ next: "function",
138
+ blankLine: "never"
139
+ },
140
+ {
141
+ prev: [
142
+ "const",
143
+ "let",
144
+ "var"
145
+ ],
146
+ next: "block-like",
147
+ blankLine: "any"
148
+ },
149
+ {
150
+ prev: "block-like",
151
+ next: "*",
152
+ blankLine: "always"
153
+ }
154
+ ]
155
+ };
156
+ return stylisticRules;
157
+ }
158
+
159
+ //#endregion
160
+ export { getStylisticRules };
@@ -0,0 +1,35 @@
1
+ import { isEnabled } from "../utils/isEnabled.js";
2
+ import { defaultOptions } from "../utils/options/defaultOptions.js";
3
+
4
+ //#region src/rules/tailwind.ts
5
+ function getTailwindRules(options) {
6
+ const { tailwind, stylistic } = options.configs;
7
+ const { multilineSort, ignoredUnregisteredClasses: userIgnoredUnregisteredClasses } = isEnabled(tailwind) ? tailwind : defaultOptions.configs.tailwind;
8
+ const { indent, useTabs, maxLineLength } = isEnabled(stylistic) ? stylistic : defaultOptions.configs.stylistic;
9
+ const isTailwindV4 = isEnabled(tailwind) && tailwind.entryPoint;
10
+ const tailwindRules = {
11
+ "@stylistic/max-len": "off",
12
+ "css/no-duplicate-imports": "off",
13
+ "better-tailwindcss/no-duplicate-classes": "error",
14
+ "better-tailwindcss/no-deprecated-classes": "error",
15
+ "better-tailwindcss/no-conflicting-classes": "error",
16
+ "better-tailwindcss/enforce-shorthand-classes": "warn",
17
+ "better-tailwindcss/no-unnecessary-whitespace": "warn",
18
+ "better-tailwindcss/enforce-consistent-class-order": "warn",
19
+ "better-tailwindcss/enforce-consistent-variable-syntax": "warn",
20
+ "better-tailwindcss/enforce-consistent-important-position": "warn",
21
+ "better-tailwindcss/no-unregistered-classes": [isTailwindV4 ? "warn" : "off", {
22
+ detectComponentClasses: true,
23
+ ignore: userIgnoredUnregisteredClasses
24
+ }],
25
+ "better-tailwindcss/enforce-consistent-line-wrapping": [multilineSort ? "warn" : "off", {
26
+ preferSingleLine: true,
27
+ printWidth: maxLineLength,
28
+ indent: useTabs ? "tab" : indent
29
+ }]
30
+ };
31
+ return tailwindRules;
32
+ }
33
+
34
+ //#endregion
35
+ export { getTailwindRules };
@@ -0,0 +1,63 @@
1
+ import { isEnabled } from "../utils/isEnabled.js";
2
+ import { defaultOptions } from "../utils/options/defaultOptions.js";
3
+
4
+ //#region src/rules/typescript.ts
5
+ function getTypeScriptRules(options) {
6
+ const { typescript } = options.configs;
7
+ const { typeDefinitionStyle, methodSignatureStyle } = isEnabled(typescript) ? typescript : defaultOptions.configs.typescript;
8
+ const tsRules = {
9
+ "no-loop-func": "off",
10
+ "no-unused-vars": "off",
11
+ "default-param-last": "off",
12
+ "prefer-destructuring": "off",
13
+ "@typescript-eslint/no-loop-func": "error",
14
+ "@typescript-eslint/default-param-last": "warn",
15
+ "@typescript-eslint/no-unsafe-assignment": "warn",
16
+ "@typescript-eslint/prefer-destructuring": "warn",
17
+ "@typescript-eslint/promise-function-async": "error",
18
+ "@typescript-eslint/no-unsafe-member-access": "warn",
19
+ "@typescript-eslint/consistent-type-imports": "warn",
20
+ "@typescript-eslint/no-useless-empty-export": "error",
21
+ "@typescript-eslint/no-unsafe-type-assertion": "warn",
22
+ "@typescript-eslint/prefer-enum-initializers": "error",
23
+ "@typescript-eslint/no-unnecessary-qualifier": "error",
24
+ "@typescript-eslint/switch-exhaustiveness-check": "warn",
25
+ "@typescript-eslint/explicit-module-boundary-types": "warn",
26
+ "@typescript-eslint/no-unnecessary-parameter-property-assignment": "warn",
27
+ "@typescript-eslint/method-signature-style": ["error", methodSignatureStyle],
28
+ "@typescript-eslint/consistent-type-definitions": ["warn", typeDefinitionStyle],
29
+ "@typescript-eslint/naming-convention": [
30
+ "warn",
31
+ {
32
+ selector: "variable",
33
+ format: [
34
+ "camelCase",
35
+ "PascalCase",
36
+ "UPPER_CASE"
37
+ ]
38
+ },
39
+ {
40
+ selector: "memberLike",
41
+ modifiers: ["private"],
42
+ format: ["camelCase"],
43
+ leadingUnderscore: "require"
44
+ },
45
+ {
46
+ selector: "enumMember",
47
+ format: ["PascalCase"]
48
+ },
49
+ {
50
+ selector: "typeLike",
51
+ format: ["PascalCase"],
52
+ custom: {
53
+ regex: "^(I|T(?!S))[A-Z]",
54
+ match: false
55
+ }
56
+ }
57
+ ]
58
+ };
59
+ return tsRules;
60
+ }
61
+
62
+ //#endregion
63
+ export { getTypeScriptRules };
@@ -0,0 +1,46 @@
1
+ //#region src/rules/vitest.ts
2
+ function getVitestRules(options) {
3
+ const { testFunction, maxNestedDescribe } = options.configs.test;
4
+ const vitestRules = {
5
+ "vitest/prefer-todo": "warn",
6
+ "vitest/prefer-to-be": "warn",
7
+ "vitest/require-hook": "error",
8
+ "vitest/prefer-spy-on": "warn",
9
+ "vitest/no-mocks-import": "error",
10
+ "vitest/no-test-prefixes": "error",
11
+ "vitest/no-alias-methods": "error",
12
+ "vitest/no-focused-tests": "error",
13
+ "vitest/prefer-to-contain": "warn",
14
+ "vitest/no-disabled-tests": "error",
15
+ "vitest/prefer-called-with": "warn",
16
+ "vitest/prefer-to-be-falsy": "warn",
17
+ "vitest/no-duplicate-hooks": "error",
18
+ "vitest/prefer-strict-equal": "warn",
19
+ "vitest/prefer-to-be-truthy": "warn",
20
+ "vitest/prefer-to-be-object": "warn",
21
+ "vitest/no-conditional-tests": "error",
22
+ "vitest/no-standalone-expect": "error",
23
+ "vitest/prefer-to-have-length": "warn",
24
+ "vitest/prefer-hooks-in-order": "warn",
25
+ "vitest/no-conditional-expect": "error",
26
+ "vitest/prefer-lowercase-title": "warn",
27
+ "vitest/no-conditional-in-test": "error",
28
+ "vitest/prefer-equality-matcher": "warn",
29
+ "vitest/consistent-test-filename": "warn",
30
+ "vitest/no-test-return-statement": "error",
31
+ "vitest/require-to-throw-message": "error",
32
+ "vitest/prefer-comparison-matcher": "warn",
33
+ "vitest/prefer-mock-promise-shorthand": "warn",
34
+ "vitest/no-interpolation-in-snapshots": "error",
35
+ "vitest/prefer-snapshot-hint": ["warn", "always"],
36
+ "vitest/max-nested-describe": ["warn", { max: maxNestedDescribe }],
37
+ "vitest/consistent-test-it": ["warn", {
38
+ fn: testFunction,
39
+ withinDescribe: testFunction
40
+ }]
41
+ };
42
+ return vitestRules;
43
+ }
44
+
45
+ //#endregion
46
+ export { getVitestRules };
@@ -0,0 +1,174 @@
1
+ import { isEnabled } from "../utils/isEnabled.js";
2
+ import { defaultOptions } from "../utils/options/defaultOptions.js";
3
+ import { getRestrictedVueInputs } from "../utils/vue/getRestrictedVueInputs.js";
4
+ import { getRestrictedVueElements } from "../utils/vue/getRestrictedVueElements.js";
5
+
6
+ //#region src/rules/vue.ts
7
+ function getVueRules(options) {
8
+ const { typescript, stylistic, tailwind, vue, nuxt } = options.configs;
9
+ const { indent, useTabs, trailingComma, maxLineLength, maxAttributesPerLine, maxConsecutiveEmptyLines, selfCloseVoidHTMLElements } = isEnabled(stylistic) ? stylistic : defaultOptions.configs.stylistic;
10
+ const { blockLang, blocksOrder, macrosOrder, attributesOrder, destructureProps, vForDelimiterStyle, attributeHyphenation, allowedStyleAttributes, preferVBindTrueShorthand, componentNameCaseInTemplate, preferVBindSameNameShorthand, restrictedElements: userRestrictedElements, ignoredUndefinedComponents: userIgnoredUndefinedComponents, restrictedStaticAttributes: userRestrictedStaticAttributes } = isEnabled(vue) ? vue : defaultOptions.configs.vue;
11
+ const nuxtImage = isEnabled(nuxt) ? nuxt.image : void 0;
12
+ const nuxtUI = isEnabled(nuxt) ? nuxt.ui : void 0;
13
+ const nuxtUIPrefix = isEnabled(nuxt) && isEnabled(nuxt.ui) ? nuxt.ui.prefix : void 0;
14
+ const isScriptLangTS = blockLang.script === "ts";
15
+ const isStyleLangImplicit = blockLang.style === "implicit";
16
+ const vueRules = {
17
+ "no-undef": "off",
18
+ "no-useless-assignment": "off",
19
+ "import-x/default": "off",
20
+ "import-x/no-unresolved": "off",
21
+ "vue/comment-directive": ["error", { reportUnusedDisableDirectives: true }],
22
+ "vue/html-closing-bracket-newline": "warn",
23
+ "vue/singleline-html-element-content-newline": "off",
24
+ "vue/html-indent": ["warn", useTabs ? "tab" : indent],
25
+ "vue/v-slot-style": ["warn", { atComponent: "shorthand" }],
26
+ "vue/attribute-hyphenation": ["warn", attributeHyphenation],
27
+ "vue/first-attribute-linebreak": ["warn", { singleline: "beside" }],
28
+ "vue/v-on-event-hyphenation": [
29
+ "warn",
30
+ attributeHyphenation,
31
+ { autofix: true }
32
+ ],
33
+ "vue/v-bind-style": [
34
+ "warn",
35
+ "shorthand",
36
+ { sameNameShorthand: preferVBindSameNameShorthand }
37
+ ],
38
+ "vue/html-self-closing": ["error", { html: {
39
+ normal: "never",
40
+ void: selfCloseVoidHTMLElements
41
+ } }],
42
+ "vue/max-attributes-per-line": ["warn", { singleline: { max: maxAttributesPerLine } }],
43
+ "vue/attributes-order": ["warn", { order: attributesOrder }],
44
+ "vue/camelcase": "warn",
45
+ "vue/no-root-v-if": "warn",
46
+ "vue/require-expose": "error",
47
+ "vue/no-unused-refs": "error",
48
+ "vue/prop-name-casing": "warn",
49
+ "vue/slot-name-casing": "warn",
50
+ "vue/no-useless-v-bind": "error",
51
+ "vue/component-api-style": "error",
52
+ "vue/html-button-has-type": "error",
53
+ "vue/valid-define-options": "error",
54
+ "vue/prefer-define-options": "warn",
55
+ "vue/require-emit-validator": "error",
56
+ "vue/require-default-export": "error",
57
+ "vue/custom-event-name-casing": "warn",
58
+ "vue/no-use-v-else-with-v-for": "error",
59
+ "vue/no-empty-component-block": "error",
60
+ "vue/no-import-compiler-macros": "error",
61
+ "vue/require-typed-object-prop": "error",
62
+ "vue/require-macro-variable-name": "warn",
63
+ "vue/padding-line-between-blocks": "warn",
64
+ "vue/match-component-import-name": "error",
65
+ "vue/html-comment-content-newline": "warn",
66
+ "vue/no-multiple-objects-in-class": "warn",
67
+ "vue/prefer-separate-static-class": "warn",
68
+ "vue/html-comment-content-spacing": "warn",
69
+ "vue/comma-dangle": ["warn", trailingComma],
70
+ "vue/component-options-name-casing": "warn",
71
+ "vue/no-ref-object-reactivity-loss": "error",
72
+ "vue/no-duplicate-attr-inheritance": "error",
73
+ "vue/no-this-in-before-route-enter": "error",
74
+ "vue/prefer-prop-type-boolean-first": "warn",
75
+ "vue/no-setup-props-reactivity-loss": "error",
76
+ "vue/block-order": ["warn", { order: blocksOrder }],
77
+ "vue/v-for-delimiter-style": ["warn", vForDelimiterStyle],
78
+ "vue/require-typed-ref": isScriptLangTS ? "error" : "off",
79
+ "vue/define-macros-order": ["warn", { order: macrosOrder }],
80
+ "vue/html-comment-indent": ["warn", useTabs ? "tab" : indent],
81
+ "vue/no-static-inline-styles": ["warn", { allowBinding: true }],
82
+ "vue/no-required-prop-with-default": ["error", { autofix: true }],
83
+ "vue/prefer-true-attribute-shorthand": ["warn", preferVBindTrueShorthand],
84
+ "vue/no-deprecated-model-definition": ["error", { allowVue3Compat: true }],
85
+ "vue/enforce-style-attribute": ["error", { allow: allowedStyleAttributes }],
86
+ "vue/define-props-destructuring": ["warn", { destructure: destructureProps }],
87
+ "vue/define-emits-declaration": ["warn", isScriptLangTS ? "type-based" : "runtime"],
88
+ "vue/define-props-declaration": ["error", isScriptLangTS ? "type-based" : "runtime"],
89
+ "vue/max-len": [tailwind ? "off" : "warn", {
90
+ tabWidth: indent,
91
+ code: maxLineLength,
92
+ template: Infinity,
93
+ ignoreUrls: true,
94
+ ignoreStrings: true,
95
+ ignoreComments: true,
96
+ ignoreRegExpLiterals: true,
97
+ ignoreTrailingComments: true,
98
+ ignoreTemplateLiterals: true,
99
+ ignoreHTMLTextContents: true,
100
+ ignoreHTMLAttributeValues: true
101
+ }],
102
+ "vue/block-lang": ["error", {
103
+ script: { lang: blockLang.script },
104
+ style: {
105
+ lang: isStyleLangImplicit ? void 0 : blockLang.style,
106
+ allowNoLang: isStyleLangImplicit
107
+ }
108
+ }],
109
+ "vue/block-tag-newline": ["warn", {
110
+ singleline: "always",
111
+ maxEmptyLines: maxConsecutiveEmptyLines ? maxConsecutiveEmptyLines - 1 : 0
112
+ }],
113
+ "vue/no-restricted-html-elements": [
114
+ "error",
115
+ {
116
+ element: nuxt ? "time" : "",
117
+ message: "Use `<NuxtTime>`."
118
+ },
119
+ {
120
+ element: nuxtImage ? "img" : "",
121
+ message: "Use `<NuxtImg>`."
122
+ },
123
+ {
124
+ element: nuxtImage ? "picture" : "",
125
+ message: "Use `<NuxtPicture>`."
126
+ },
127
+ {
128
+ element: nuxtUI ? [
129
+ "a",
130
+ "RouterLink",
131
+ "NuxtLink"
132
+ ] : "",
133
+ message: nuxtUI && nuxtUIPrefix ? `Use <${nuxtUIPrefix}Link>.` : void 0
134
+ },
135
+ {
136
+ element: ["a", nuxt ? "RouterLink" : ""],
137
+ message: `Use <${nuxt ? "NuxtLink" : "RouterLink"}>.`
138
+ },
139
+ ...nuxtUI && nuxtUIPrefix ? getRestrictedVueElements(nuxtUIPrefix) : [],
140
+ ...userRestrictedElements
141
+ ],
142
+ "vue/no-restricted-static-attribute": [
143
+ "error",
144
+ ...nuxtUI && nuxtUIPrefix ? getRestrictedVueInputs(nuxtUIPrefix) : [],
145
+ ...userRestrictedStaticAttributes
146
+ ],
147
+ "vue/no-undef-components": ["error", { ignorePatterns: [
148
+ "^(Nuxt|U)",
149
+ "^(Icon|Html|Head|Title|Base|Meta|Link|Style|Body|NoScript)$",
150
+ ...userIgnoredUndefinedComponents
151
+ ] }],
152
+ "vue/match-component-file-name": ["error", {
153
+ shouldMatchCase: true,
154
+ extensions: [
155
+ "vue",
156
+ "js",
157
+ "jsx",
158
+ ...typescript ? ["ts", "tsx"] : []
159
+ ]
160
+ }],
161
+ "vue/component-name-in-template-casing": [
162
+ "warn",
163
+ componentNameCaseInTemplate,
164
+ {
165
+ ignores: ["*.*"],
166
+ registeredComponentsOnly: false
167
+ }
168
+ ]
169
+ };
170
+ return vueRules;
171
+ }
172
+
173
+ //#endregion
174
+ export { getVueRules };
@@ -0,0 +1,23 @@
1
+ import { isEnabled } from "../utils/isEnabled.js";
2
+ import { defaultOptions } from "../utils/options/defaultOptions.js";
3
+
4
+ //#region src/rules/vueAccessibility.ts
5
+ function getVueAccessibilityRules(options) {
6
+ const { vue } = options.configs;
7
+ const { imageComponents: userImageComponents, anchorComponents: userAnchorComponents, accessibleChildComponents: userAccessibleChildComponents } = isEnabled(vue) && isEnabled(vue.accessibility) ? vue.accessibility : defaultOptions.configs.vue.accessibility;
8
+ const vueA11yRules = {
9
+ "vuejs-accessibility/click-events-have-key-events": "off",
10
+ "vuejs-accessibility/mouse-events-have-key-events": "off",
11
+ "vuejs-accessibility/no-aria-hidden-on-focusable": "error",
12
+ "vuejs-accessibility/no-role-presentation-on-focusable": "error",
13
+ "vuejs-accessibility/alt-text": ["error", { img: userImageComponents }],
14
+ "vuejs-accessibility/anchor-has-content": ["error", {
15
+ components: userAnchorComponents,
16
+ accessibleChildren: userAccessibleChildComponents
17
+ }]
18
+ };
19
+ return vueA11yRules;
20
+ }
21
+
22
+ //#endregion
23
+ export { getVueAccessibilityRules };
@@ -0,0 +1,55 @@
1
+ import { RuleOptions } from "../eslintRules.js";
2
+ import { ConfigWithOverrides } from "../index.js";
3
+
4
+ //#region src/types/configOptions/base.d.ts
5
+ type MaxDepthOptions = RuleOptions<'max-depth'>;
6
+ type MaxNestedCallbacksOptions = RuleOptions<'max-nested-callbacks'>;
7
+ interface BaseOptions extends ConfigWithOverrides {
8
+ /**
9
+ * Enforce the consistent use of either function declarations or function expressions.
10
+ *
11
+ * Even when set to `'declaration'`, function expressions are still allowed, with or without a type annotation.
12
+ *
13
+ * @default 'declaration'
14
+ *
15
+ * @see [func-style](https://eslint.org/docs/latest/rules/func-style)
16
+ */
17
+ functionStyle?: RuleOptions<'func-style'>;
18
+
19
+ /**
20
+ * Enforce named exports in the following directories:
21
+ * - 'shared'
22
+ * - 'dto', 'dtos'
23
+ * - 'model', 'models'
24
+ * - 'helper', 'helpers'
25
+ * - 'module', 'modules'
26
+ * - 'util', 'utils', 'utilities'
27
+ * - 'composable', 'composables'
28
+ * - 'repo', 'repos', 'repository', 'repositories'
29
+ *
30
+ * @default true
31
+ *
32
+ * @see [no-restricted-exports: `restrictDefaultExports` option](https://eslint.org/docs/latest/rules/no-restricted-exports#options)
33
+ */
34
+ preferNamedExports?: boolean;
35
+
36
+ /**
37
+ * Enforce a maximum depth that blocks can be nested to reduce code complexity.
38
+ *
39
+ * @default 3
40
+ *
41
+ * @see [max-depth](https://eslint.org/docs/latest/rules/max-depth)
42
+ */
43
+ maxDepth?: Exclude<MaxDepthOptions, Record<string, unknown>>;
44
+
45
+ /**
46
+ * Enforce a maximum depth that callbacks can be nested to increase code clarity.
47
+ *
48
+ * @default 3
49
+ *
50
+ * @see [max-nested-callbacks](https://eslint.org/docs/latest/rules/max-nested-callbacks)
51
+ */
52
+ maxNestedCallbacks?: Exclude<MaxNestedCallbacksOptions, Record<string, unknown>>;
53
+ }
54
+ //#endregion
55
+ export { type BaseOptions };
@@ -0,0 +1,27 @@
1
+ import { RuleOptions } from "../eslintRules.js";
2
+ import { ConfigWithOverrides } from "../index.js";
3
+
4
+ //#region src/types/configOptions/css.d.ts
5
+ interface CSSOptions extends ConfigWithOverrides {
6
+ /**
7
+ * Enforce the use of baseline features.
8
+ *
9
+ * Aside from `'widely'` and `'newly'`, it can also be set to a numeric baseline year, such as `2025`, to allow features that became baseline newly available that year or earlier.
10
+ *
11
+ * @default false
12
+ *
13
+ * @see [css/use-baseline](https://github.com/eslint/css/blob/main/docs/rules/use-baseline.md)
14
+ */
15
+ useBaseline?: false | RuleOptions<'css/use-baseline'>['available'];
16
+
17
+ /**
18
+ * An array of relative font units that are allowed to be used.
19
+ *
20
+ * @default ['rem', 'em']
21
+ *
22
+ * @see [css/relative-font-units: `allowUnits` option](https://github.com/eslint/css/blob/main/docs/rules/relative-font-units.md#options)
23
+ */
24
+ allowedRelativeFontUnits?: RuleOptions<'css/relative-font-units'>['allowUnits'];
25
+ }
26
+ //#endregion
27
+ export { type CSSOptions };
@@ -0,0 +1,27 @@
1
+ import { RuleOptions } from "../eslintRules.js";
2
+ import { ConfigWithOverrides } from "../index.js";
3
+
4
+ //#region src/types/configOptions/html.d.ts
5
+ interface HTMLOptions extends ConfigWithOverrides {
6
+ /**
7
+ * Enforce the use of baseline features.
8
+ *
9
+ * Aside from `'widely'` and `'newly'`, it can also be set to a numeric baseline year, such as `2025` (minimum is `2000`), to allow features that became baseline newly available that year or earlier.
10
+ *
11
+ * @default false
12
+ *
13
+ * @see [@html-eslint/use-baseline](https://html-eslint.org/docs/rules/use-baseline)
14
+ */
15
+ useBaseline?: false | RuleOptions<'@html-eslint/use-baseline'>['available'];
16
+
17
+ /**
18
+ * Enforce consistent naming convention for `id` attribute values.
19
+ *
20
+ * @default 'snake_case'
21
+ *
22
+ * @see [@html-eslint/id-naming-convention](https://html-eslint.org/docs/rules/id-naming-convention)
23
+ */
24
+ idNamingConvention?: Exclude<RuleOptions<'@html-eslint/id-naming-convention'>, 'regex'>;
25
+ }
26
+ //#endregion
27
+ export { type HTMLOptions };
@@ -0,0 +1,15 @@
1
+ import { ConfigWithOverrides } from "../index.js";
2
+
3
+ //#region src/types/configOptions/importX.d.ts
4
+ interface ImportXOptions extends ConfigWithOverrides {
5
+ /**
6
+ * Automatically remove unused imports.
7
+ *
8
+ * @default true
9
+ *
10
+ * @see [unused-imports/no-unused-imports](https://github.com/sweepline/eslint-plugin-unused-imports/blob/master/docs/rules/no-unused-imports.md)
11
+ */
12
+ removeUnusedImports?: boolean;
13
+ }
14
+ //#endregion
15
+ export { type ImportXOptions };