@ethang/eslint-config 19.4.6 → 19.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 (52) hide show
  1. package/README.md +2 -1
  2. package/build/create-config-file.ts +51 -0
  3. package/build/{create-config.js → create-config.ts} +13 -3
  4. package/build/{get-react-version.js → get-react-version.ts} +1 -1
  5. package/build/{list-utils.mjs → list-utils.ts} +21 -26
  6. package/build/{rule-list.mjs → rule-list.ts} +97 -87
  7. package/build/{update-readme.js → update-readme.ts} +29 -13
  8. package/build/{update-rules.js → update-rules.ts} +29 -20
  9. package/build.mjs +2 -2
  10. package/config.solid.js +0 -1
  11. package/eslint.config.js +3 -47
  12. package/package.json +7 -1
  13. package/setup/a11y.ts +13 -0
  14. package/setup/astro.ts +13 -0
  15. package/setup/barrel.ts +13 -0
  16. package/setup/compat.ts +12 -0
  17. package/setup/cspell.ts +8 -0
  18. package/setup/depend.ts +13 -0
  19. package/setup/{deprecated.js → deprecated.ts} +2 -2
  20. package/setup/eslint.ts +233 -0
  21. package/setup/{ethang.js → ethang.ts} +2 -1
  22. package/setup/gen-rules.ts +60 -0
  23. package/setup/json.ts +15 -0
  24. package/setup/lodash.ts +50 -0
  25. package/setup/markdown.ts +12 -0
  26. package/setup/n.ts +85 -0
  27. package/setup/{perfectionist.js → perfectionist.ts} +4 -2
  28. package/setup/react.ts +63 -0
  29. package/setup/solid.ts +15 -0
  30. package/setup/{sonar.js → sonar.ts} +2 -20
  31. package/setup/{stylistic.js → stylistic.ts} +3 -3
  32. package/setup/{tailwind.js → tailwind.ts} +2 -2
  33. package/setup/tanstack-query.ts +7 -0
  34. package/setup/{typescript-eslint.js → typescript-eslint.ts} +6 -26
  35. package/setup/unicorn.ts +37 -0
  36. package/tsconfig.json +5 -1
  37. package/build/create-config-file.js +0 -45
  38. package/setup/a11y.js +0 -25
  39. package/setup/astro.js +0 -7
  40. package/setup/barrel.js +0 -9
  41. package/setup/compat.js +0 -10
  42. package/setup/depend.js +0 -11
  43. package/setup/eslint.js +0 -71
  44. package/setup/gen-rules.js +0 -39
  45. package/setup/json.js +0 -7
  46. package/setup/lodash.js +0 -19
  47. package/setup/markdown.js +0 -7
  48. package/setup/n.js +0 -31
  49. package/setup/react.js +0 -35
  50. package/setup/solid.js +0 -10
  51. package/setup/tanstack-query.js +0 -7
  52. package/setup/unicorn.js +0 -32
@@ -1,8 +1,12 @@
1
1
  import tseslint from "typescript-eslint";
2
2
 
3
- import { genRules } from "./gen-rules.js";
3
+ import { EsLintRules, genRules, getNonDeprecatedRules } from "./gen-rules.ts";
4
4
 
5
- const ruleNames = Object.keys(tseslint.plugin.rules);
5
+ const ruleNames = Object.keys(
6
+ getNonDeprecatedRules(
7
+ (tseslint.plugin.rules ?? {}) as unknown as EsLintRules,
8
+ ),
9
+ );
6
10
  const customRules = [
7
11
  {
8
12
  name: "adjacent-overload-signatures",
@@ -48,18 +52,10 @@ const customRules = [
48
52
  name: "no-dupe-class-members",
49
53
  rule: "off",
50
54
  },
51
- {
52
- name: "no-empty-interface",
53
- rule: "off",
54
- },
55
55
  {
56
56
  name: "no-invalid-this",
57
57
  rule: "off",
58
58
  },
59
- {
60
- name: "no-loss-of-precision",
61
- rule: "off",
62
- },
63
59
  {
64
60
  name: "no-magic-numbers",
65
61
  rule: "off",
@@ -68,18 +64,10 @@ const customRules = [
68
64
  name: "no-redeclare",
69
65
  rule: "off",
70
66
  },
71
- {
72
- name: "no-type-alias",
73
- rule: "off",
74
- },
75
67
  {
76
68
  name: "no-use-before-define",
77
69
  rule: "off",
78
70
  },
79
- {
80
- name: "no-var-requires",
81
- rule: "off",
82
- },
83
71
  {
84
72
  name: "parameter-properties",
85
73
  rule: "off",
@@ -88,14 +76,6 @@ const customRules = [
88
76
  name: "prefer-readonly-parameter-types",
89
77
  rule: "off",
90
78
  },
91
- {
92
- name: "prefer-ts-expect-error",
93
- rule: "off",
94
- },
95
- {
96
- name: "sort-type-constituents",
97
- rule: "off",
98
- },
99
79
  {
100
80
  name: "typedef",
101
81
  rule: "off",
@@ -0,0 +1,37 @@
1
+ import unicorn from "eslint-plugin-unicorn";
2
+
3
+ import { genRules, getNonDeprecatedRules } from "./gen-rules.ts";
4
+
5
+ const ruleNames = Object.keys(getNonDeprecatedRules(unicorn.rules ?? {}));
6
+ const customRules = [
7
+ {
8
+ name: "empty-brace-spaces",
9
+ rule: "off",
10
+ },
11
+ {
12
+ name: "explicit-length-check",
13
+ rule: "off",
14
+ },
15
+ {
16
+ name: "no-keyword-prefix",
17
+ rule: "off",
18
+ },
19
+ {
20
+ name: "no-nested-ternary",
21
+ rule: "off",
22
+ },
23
+ {
24
+ name: "no-null",
25
+ rule: "off",
26
+ },
27
+ {
28
+ name: "number-literal-case",
29
+ rule: "off",
30
+ },
31
+ {
32
+ name: "template-indent",
33
+ rule: "off",
34
+ },
35
+ ];
36
+
37
+ export const unicornRules = genRules(ruleNames, customRules, "unicorn");
package/tsconfig.json CHANGED
@@ -2,5 +2,9 @@
2
2
  "extends": [
3
3
  "@tsconfig/node-lts/tsconfig.json",
4
4
  "@tsconfig/strictest/tsconfig.json"
5
- ]
5
+ ],
6
+ "compilerOptions": {
7
+ "allowImportingTsExtensions": true,
8
+ "lib": ["dom"]
9
+ }
6
10
  }
@@ -1,45 +0,0 @@
1
- import { getTypeImportStrings } from "./list-utils.mjs";
2
- import { createConfig } from "./create-config.js";
3
- import { writeFileSync } from "node:fs";
4
- import { join } from "node:path";
5
-
6
- export const createConfigFile = async (listConfigs, fileName) => {
7
- let configFile = "";
8
-
9
- const imports = listConfigs
10
- .map((list) => {
11
- const importStrings = getTypeImportStrings(list.name);
12
-
13
- if (list.options?.extraImports?.length > 0) {
14
- importStrings.push(...list.options.extraImports);
15
- }
16
-
17
- return importStrings;
18
- })
19
- .flat();
20
-
21
- const importList = [
22
- 'import { ignores, languageOptions } from "./constants.js";',
23
- ...imports,
24
- ].sort((a, b) => a.localeCompare(b));
25
-
26
- importList.forEach((item) => {
27
- configFile += `${item}\n`;
28
- });
29
-
30
- const configs = await Promise.all(
31
- listConfigs.map((list) => {
32
- return createConfig(list.name, list.options);
33
- }),
34
- );
35
-
36
- configFile += `\nexport default tseslint.config(
37
- ${configs.join("\n")}
38
- );\n`;
39
-
40
- writeFileSync(
41
- join(import.meta.dirname, `../${fileName}`),
42
- configFile,
43
- "utf8",
44
- );
45
- };
package/setup/a11y.js DELETED
@@ -1,25 +0,0 @@
1
- import a11y from "eslint-plugin-jsx-a11y";
2
-
3
- import { genRules } from "./gen-rules.js";
4
-
5
- const ruleNames = Object.keys(a11y.rules);
6
- const customRules = [
7
- {
8
- name: "accessible-emoji",
9
- rule: "off",
10
- },
11
- {
12
- name: "label-has-for",
13
- rule: "off",
14
- },
15
- {
16
- name: "media-has-caption",
17
- rule: "off",
18
- },
19
- {
20
- name: "no-onchange",
21
- rule: "off",
22
- },
23
- ];
24
-
25
- export const a11yRules = genRules(ruleNames, customRules, "a11y");
package/setup/astro.js DELETED
@@ -1,7 +0,0 @@
1
- import astro from "eslint-plugin-astro";
2
- import { genRules } from "./gen-rules.js";
3
-
4
- const ruleNames = Object.keys(astro.rules);
5
- const customRules = [{ name: "no-set-html-directive", rule: 'off"' }];
6
-
7
- export const astroRules = genRules(ruleNames, customRules, "astro");
package/setup/barrel.js DELETED
@@ -1,9 +0,0 @@
1
- /* eslint-disable unicorn/no-abusive-eslint-disable */
2
- /* eslint-disable */
3
- import barrel from "eslint-plugin-barrel-files";
4
- import { genRules } from "./gen-rules.js";
5
-
6
- const ruleNames = Object.keys(barrel.rules);
7
- const customRules = [];
8
-
9
- export const barrelRules = genRules(ruleNames, customRules, "barrel");
package/setup/compat.js DELETED
@@ -1,10 +0,0 @@
1
- /* eslint-disable unicorn/no-abusive-eslint-disable */
2
- /* eslint-disable */
3
- import compat from "eslint-plugin-compat";
4
-
5
- import { genRules } from "./gen-rules.js";
6
-
7
- const ruleNames = Object.keys(compat.rules);
8
- const changedRules = [];
9
-
10
- export const compatRules = genRules(ruleNames, changedRules, "compat");
package/setup/depend.js DELETED
@@ -1,11 +0,0 @@
1
- /* eslint-disable unicorn/no-abusive-eslint-disable */
2
- /* eslint-disable */
3
- import depend from "eslint-plugin-depend";
4
- import { genRules } from "./gen-rules.js";
5
-
6
- const ruleNames = Object.keys(depend.rules);
7
- const changedRules = [
8
- { name: "ban-dependencies", rule: ["error", { allowed: ["lodash"] }] },
9
- ];
10
-
11
- export const dependRules = genRules(ruleNames, changedRules, "depend");
package/setup/eslint.js DELETED
@@ -1,71 +0,0 @@
1
- /* eslint-disable */
2
- import eslint from "@eslint/js";
3
- import { genRules } from "./gen-rules.js";
4
-
5
- const ruleNames = Object.keys(eslint.configs.all.rules);
6
- const changedRules = [
7
- { name: "arrow-body-style", rule: ["error", "always"] },
8
- { name: "camelcase", rule: "off" },
9
- { name: "capitalized-comments", rule: "off" },
10
- { name: "class-methods-use-this", rule: "off" },
11
- { name: "complexity", rule: "off" },
12
- { name: "consistent-return", rule: "off" },
13
- { name: "consistent-this", rule: "off" },
14
- { name: "curly", rule: "off" },
15
- { name: "default-case", rule: "off" },
16
- { name: "default-case-last", rule: "off" },
17
- { name: "default-param-last", rule: "off" },
18
- { name: "dot-notation", rule: "off" },
19
- { name: "func-names", rule: "off" },
20
- {
21
- name: "func-style",
22
- rule: ["error", "declaration", { allowArrowFunctions: true }],
23
- },
24
- { name: "id-denylist", rule: "off" },
25
- { name: "id-length", rule: "off" },
26
- { name: "id-match", rule: "off" },
27
- { name: "init-declarations", rule: "off" },
28
- { name: "max-lines", rule: "off" },
29
- { name: "max-lines-per-function", rule: "off" },
30
- { name: "max-params", rule: "off" },
31
- { name: "new-cap", rule: "off" },
32
- { name: "no-array-constructor", rule: "off" },
33
- { name: "no-empty-function", rule: "off" },
34
- { name: "no-implicit-globals", rule: "off" },
35
- { name: "no-implied-eval", rule: "off" },
36
- { name: "no-inline-comments", rule: "off" },
37
- { name: "no-magic-numbers", rule: "off" },
38
- { name: "no-redeclare", rule: "off" },
39
- { name: "no-restricted-exports", rule: "off" },
40
- { name: "no-restricted-globals", rule: "off" },
41
- { name: "no-restricted-imports", rule: "off" },
42
- { name: "no-restricted-properties", rule: "off" },
43
- { name: "no-restricted-syntax", rule: "off" },
44
- { name: "no-shadow", rule: "off" },
45
- { name: "no-template-curly-in-string", rule: "off" },
46
- { name: "no-ternary", rule: "off" },
47
- { name: "no-throw-literal", rule: "off" },
48
- { name: "no-undef", rule: "off" },
49
- { name: "no-undefined", rule: "off" },
50
- { name: "no-underscore-dangle", rule: "off" },
51
- { name: "no-unexpected-multiline", rule: "off" },
52
- {
53
- name: "no-unsafe-optional-chaining",
54
- rule: ["error", { disallowArithmeticOperators: true }],
55
- },
56
- { name: "no-unused-expressions", rule: "off" },
57
- { name: "no-unused-vars", rule: "off" },
58
- { name: "no-use-before-define", rule: "off" },
59
- { name: "no-useless-assignment", rule: "off" },
60
- { name: "no-useless-constructor", rule: "off" },
61
- { name: "no-warning-comments", rule: "off" },
62
- { name: "one-var", rule: "off" },
63
- { name: "prefer-destructuring", rule: "off" },
64
- { name: "prefer-promise-reject-errors", rule: "off" },
65
- { name: "require-await", rule: "off" },
66
- { name: "sort-imports", rule: "off" },
67
- { name: "sort-keys", rule: "off" },
68
- { name: "yoda", rule: ["error", "always"] },
69
- ];
70
-
71
- export const eslintRules = genRules(ruleNames, changedRules);
@@ -1,39 +0,0 @@
1
- /**
2
- * @param {Array<String>} ruleNames
3
- * @param {Array<{name: string, rule: unknown}>} customRules
4
- * @param {string?} prefix
5
- * @param {string?} defaultOverride
6
- * @return {Object}
7
- */
8
- export const genRules = (ruleNames, customRules, prefix, defaultOverride) => {
9
- const rules = {};
10
-
11
- for (const rule of ruleNames) {
12
- if (prefix === undefined) {
13
- rules[rule] = defaultOverride ?? "error";
14
- } else {
15
- rules[`${prefix}/${rule}`] = defaultOverride ?? "error";
16
- }
17
- }
18
-
19
- if (customRules) {
20
- for (const rule of customRules) {
21
- if (ruleNames.includes(rule.name)) {
22
- if (prefix === undefined) {
23
- rules[rule.name] = rule.rule;
24
- } else {
25
- rules[`${prefix}/${rule.name}`] = rule.rule;
26
- }
27
- } else {
28
- // eslint-disable-next-line no-console
29
- console.error(`${rule.name} does not exist.`);
30
- }
31
- }
32
- }
33
-
34
- return Object.fromEntries(
35
- Object.entries(rules).sort(([a], [b]) => {
36
- a.localeCompare(b);
37
- }),
38
- );
39
- };
package/setup/json.js DELETED
@@ -1,7 +0,0 @@
1
- import json from "@eslint/json";
2
- import { genRules } from "./gen-rules.js";
3
-
4
- const ruleNames = Object.keys(json.rules);
5
- const customRules = [];
6
-
7
- export const jsonRules = genRules(ruleNames, customRules, "json");
package/setup/lodash.js DELETED
@@ -1,19 +0,0 @@
1
- /* eslint-disable */
2
- import lodash from "eslint-plugin-lodash";
3
- import { genRules } from "./gen-rules.js";
4
-
5
- const ruleNames = Object.keys(lodash.rules);
6
- const customRules = [
7
- { name: "chain-style", rule: ["error", "as-needed"] },
8
- { name: "consistent-compose", rule: ["error", "flow"] },
9
- { name: "identity-shorthand", rule: ["error", "always"] },
10
- { name: "import-scope", rule: ["error", "method"] },
11
- { name: "matches-prop-shorthand", rule: ["error", "always"] },
12
- { name: "matches-shorthand", rule: ["error", "always", 3] },
13
- { name: "path-style", rule: ["error", "array"] },
14
- { name: "prefer-includes", rule: ["error", { includeNative: true }] },
15
- { name: "prefer-some", rule: ["error", { includeNative: true }] },
16
- { name: "prop-shorthand", rule: ["error", "always"] },
17
- ];
18
-
19
- export const lodashRules = genRules(ruleNames, customRules, "lodash");
package/setup/markdown.js DELETED
@@ -1,7 +0,0 @@
1
- import markdown from "@eslint/markdown";
2
- import { genRules } from "./gen-rules.js";
3
-
4
- const ruleNames = Object.keys(markdown.rules);
5
- const customRules = [];
6
-
7
- export const markdownRules = genRules(ruleNames, customRules, "markdown");
package/setup/n.js DELETED
@@ -1,31 +0,0 @@
1
- /* eslint-disable unicorn/no-abusive-eslint-disable */
2
- /* eslint-disable */
3
- import n from "eslint-plugin-n";
4
- import { genRules } from "./gen-rules.js";
5
-
6
- const ruleNames = Object.keys(n.rules);
7
- const changedRules = [
8
- { name: "callback-return", rule: "off" },
9
- { name: "exports-style", rule: ["error", "exports"] },
10
- { name: "file-extension-in-import", rule: "off" },
11
- { name: "global-require", rule: "off" },
12
- { name: "no-callback-literal", rule: "off" },
13
- { name: "no-missing-import", rule: "off" },
14
- { name: "no-mixed-requires", rule: "off" },
15
- { name: "no-new-require", rule: "off" },
16
- { name: "no-process-env", rule: "off" },
17
- { name: "no-process-exit", rule: "off" },
18
- { name: "no-restricted-import", rule: "off" },
19
- { name: "no-restricted-require", rule: "off" },
20
- { name: "no-sync", rule: "off" },
21
- { name: "no-unpublished-import", rule: "off" },
22
- { name: "no-unpublished-require", rule: "off" },
23
- { name: "prefer-promises/dns", rule: "off" },
24
- { name: "prefer-promises/fs", rule: "off" },
25
- { name: "process-exit-as-throw", rule: "off" },
26
- { name: "hashbang", rule: "off" },
27
- { name: "no-hide-core-modules", rule: "off" },
28
- { name: "shebang", rule: "off" },
29
- ];
30
-
31
- export const nRules = genRules(ruleNames, changedRules, "n");
package/setup/react.js DELETED
@@ -1,35 +0,0 @@
1
- import react from "@eslint-react/eslint-plugin";
2
- import reactHooks from "eslint-plugin-react-hooks";
3
- import { genRules } from "./gen-rules.js";
4
- import { fixupPluginRules } from "@eslint/compat";
5
-
6
- const reactRuleNames = Object.keys(react.rules);
7
- const customReactRules = [
8
- { name: "avoid-shorthand-boolean", rule: "off" },
9
- { name: "avoid-shorthand-fragment", rule: "off" },
10
- { name: "debug/class-component", rule: "off" },
11
- { name: "debug/function-component", rule: "off" },
12
- { name: "debug/hook", rule: "off" },
13
- { name: "debug/is-from-react", rule: "off" },
14
- { name: "debug/react-hooks", rule: "off" },
15
- {
16
- name: "naming-convention/filename",
17
- rule: ["error", { rule: "kebab-case" }],
18
- },
19
- ];
20
- const reactGen = genRules(reactRuleNames, customReactRules, "react");
21
-
22
- const reactHookRuleNames = Object.keys(reactHooks.rules);
23
- const customHookRules = [
24
- { name: "exhaustive-deps", rule: "error" },
25
- { name: "rules-of-hooks", rule: "error" },
26
- ];
27
- const hookGen = genRules(reactHookRuleNames, customHookRules, "react-hooks");
28
-
29
- export const reactRules = {
30
- ...reactGen,
31
- };
32
-
33
- export const reactHookRules = {
34
- ...hookGen,
35
- };
package/setup/solid.js DELETED
@@ -1,10 +0,0 @@
1
- import solid from "eslint-plugin-solid";
2
- import { genRules } from "./gen-rules.js";
3
-
4
- const ruleNames = Object.keys(solid.rules);
5
- const customRules = [
6
- { name: "no-proxy-apis", rule: "off" },
7
- { name: "prefer-classlist", rule: "off" },
8
- ];
9
-
10
- export const solidRules = genRules(ruleNames, customRules, "solid");
@@ -1,7 +0,0 @@
1
- /* eslint-disable */
2
- import tanstack from "@tanstack/eslint-plugin-query";
3
- import { genRules } from "./gen-rules.js";
4
-
5
- const ruleNames = Object.keys(tanstack.rules);
6
-
7
- export const tanstackQueryRules = genRules(ruleNames, [], "@tanstack/query");
package/setup/unicorn.js DELETED
@@ -1,32 +0,0 @@
1
- import unicorn from "eslint-plugin-unicorn";
2
- import { genRules } from "./gen-rules.js";
3
-
4
- const ruleNames = Object.keys(unicorn.rules);
5
- const customRules = [
6
- { name: "empty-brace-spaces", rule: "off" },
7
- { name: "explicit-length-check", rule: "off" },
8
- { name: "no-keyword-prefix", rule: "off" },
9
- { name: "no-nested-ternary", rule: "off" },
10
- { name: "no-null", rule: "off" },
11
- { name: "number-literal-case", rule: "off" },
12
- { name: "template-indent", rule: "off" },
13
- { name: "import-index", rule: "off" },
14
- { name: "no-array-instanceof", rule: "off" },
15
- { name: "no-fn-reference-in-iterator", rule: "off" },
16
- { name: "no-reduce", rule: "off" },
17
- { name: "no-unsafe-regex", rule: "off" },
18
- { name: "prefer-dataset", rule: "off" },
19
- { name: "prefer-event-key", rule: "off" },
20
- { name: "prefer-exponentiation-operator", rule: "off" },
21
- { name: "prefer-flat-map", rule: "off" },
22
- { name: "prefer-node-append", rule: "off" },
23
- { name: "prefer-node-remove", rule: "off" },
24
- { name: "prefer-object-has-own", rule: "off" },
25
- { name: "prefer-replace-all", rule: "off" },
26
- { name: "prefer-starts-ends-with", rule: "off" },
27
- { name: "prefer-text-content", rule: "off" },
28
- { name: "prefer-trim-start-end", rule: "off" },
29
- { name: "regex-shorthand", rule: "off" },
30
- ];
31
-
32
- export const unicornRules = genRules(ruleNames, customRules, "unicorn");