adamantite 0.18.0 → 0.19.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.
- package/README.md +14 -2
- package/dist/index.js +46 -12
- package/package.json +3 -1
- package/presets/oxlint/core.json +7 -7
- package/presets/oxlint/jest.json +65 -0
- package/presets/oxlint/nextjs.json +28 -0
- package/presets/oxlint/node.json +5 -2
- package/presets/oxlint/react.json +82 -1
- package/presets/oxlint/vitest.json +16 -0
- package/presets/oxlint/vue.json +27 -0
package/README.md
CHANGED
|
@@ -19,7 +19,8 @@
|
|
|
19
19
|
|
|
20
20
|
Adamantite is a collection of presets for
|
|
21
21
|
[oxlint](https://oxc.rs/docs/guide/usage/linter.html),
|
|
22
|
-
[oxfmt](https://oxc.rs/docs/guide/usage/formatter.html)
|
|
22
|
+
[oxfmt](https://oxc.rs/docs/guide/usage/formatter.html),
|
|
23
|
+
[tsgo](https://github.com/microsoft/typescript-go) and
|
|
23
24
|
[sherif](https://github.com/QuiiBz/sherif) that are designed to help humans and agents write
|
|
24
25
|
maintainable and scalable type-safe code, both for individual projects and monorepos.
|
|
25
26
|
|
|
@@ -144,7 +145,7 @@ Automatically detects and fixes:
|
|
|
144
145
|
|
|
145
146
|
### `adamantite typecheck`
|
|
146
147
|
|
|
147
|
-
Run TypeScript type checking using the strict preset:
|
|
148
|
+
Run TypeScript type checking using tsgo (TypeScript Go) and the strict preset:
|
|
148
149
|
|
|
149
150
|
```shell
|
|
150
151
|
# Type check all files
|
|
@@ -181,6 +182,17 @@ Extensive ruleset covering:
|
|
|
181
182
|
- **Style**: Consistent code formatting and naming conventions
|
|
182
183
|
- **Nursery**: Experimental rules under active development
|
|
183
184
|
|
|
185
|
+
#### Framework Presets
|
|
186
|
+
|
|
187
|
+
Framework-specific presets are available for:
|
|
188
|
+
|
|
189
|
+
- **React** ([react.json](./presets/oxlint/react.json)) - React, React-perf, and JSX-a11y rules
|
|
190
|
+
- **Next.js** ([nextjs.json](./presets/oxlint/nextjs.json)) - Next.js-specific rules
|
|
191
|
+
- **Vue** ([vue.json](./presets/oxlint/vue.json)) - Vue.js rules
|
|
192
|
+
- **Node.js** ([node.json](./presets/oxlint/node.json)) - Node.js-specific rules
|
|
193
|
+
- **Jest** ([jest.json](./presets/oxlint/jest.json)) - Jest testing rules
|
|
194
|
+
- **Vitest** ([vitest.json](./presets/oxlint/vitest.json)) - Vitest testing rules
|
|
195
|
+
|
|
184
196
|
### Formatting ([presets/oxfmt.json](./presets/oxfmt.json))
|
|
185
197
|
|
|
186
198
|
Opinionated code formatting with oxfmt, configured for consistency and readability. Includes automatic import sorting and organization.
|
package/dist/index.js
CHANGED
|
@@ -94,8 +94,14 @@ var oxlint = {
|
|
|
94
94
|
}
|
|
95
95
|
return { path: null };
|
|
96
96
|
},
|
|
97
|
-
create: (
|
|
98
|
-
|
|
97
|
+
create: (presets = []) => {
|
|
98
|
+
const extendsArray = ["adamantite/lint"];
|
|
99
|
+
for (const preset of presets) {
|
|
100
|
+
extendsArray.push(`adamantite/lint/${preset}`);
|
|
101
|
+
}
|
|
102
|
+
return fromPromise2(writeFile(join2(process.cwd(), ".oxlintrc.json"), JSON.stringify({ ...oxlint.config, extends: extendsArray }, null, 2)), (error) => Fault2.wrap(error).withTag("FAILED_TO_WRITE_FILE").withDescription("Failed to write oxlint configuration", "We're unable to write the oxlint configuration to the current directory."));
|
|
103
|
+
},
|
|
104
|
+
update: (presets = []) => safeTry2(async function* () {
|
|
99
105
|
const exists = await oxlint.exists();
|
|
100
106
|
if (!exists.path) {
|
|
101
107
|
return err2(Fault2.create("FILE_NOT_FOUND").withDescription("No `.oxlintrc.json` found", "We're unable to find an oxlint configuration in the current directory."));
|
|
@@ -111,6 +117,12 @@ var oxlint = {
|
|
|
111
117
|
if (!hasAdamantite) {
|
|
112
118
|
extendsArray.push("adamantite/lint");
|
|
113
119
|
}
|
|
120
|
+
for (const preset of presets) {
|
|
121
|
+
const presetPath = `adamantite/lint/${preset}`;
|
|
122
|
+
if (!extendsArray.includes(presetPath)) {
|
|
123
|
+
extendsArray.push(presetPath);
|
|
124
|
+
}
|
|
125
|
+
}
|
|
114
126
|
newConfig.extends = extendsArray;
|
|
115
127
|
const mergedConfig = yield* mergeConfig(newConfig, oxlint.config);
|
|
116
128
|
mergedConfig.$schema = oxlint.config.$schema;
|
|
@@ -538,7 +550,9 @@ import { join as join6 } from "node:path";
|
|
|
538
550
|
import { Fault as Fault9 } from "faultier";
|
|
539
551
|
import { err as err5, fromPromise as fromPromise6, ok as ok9, safeTry as safeTry9 } from "neverthrow";
|
|
540
552
|
var typescript = {
|
|
541
|
-
name: "
|
|
553
|
+
name: "@typescript/native-preview",
|
|
554
|
+
version: "7.0.0-dev.20251227.1",
|
|
555
|
+
command: "tsgo",
|
|
542
556
|
config: { extends: "adamantite/typescript" },
|
|
543
557
|
exists: () => checkIfExists(join6(process.cwd(), "tsconfig.json")),
|
|
544
558
|
create: () => fromPromise6(writeFile5(join6(process.cwd(), "tsconfig.json"), JSON.stringify(typescript.config, null, 2)), (error) => Fault9.wrap(error).withTag("FAILED_TO_WRITE_FILE").withDescription("Failed to write tsconfig.json", "We're unable to write the tsconfig.json file in the current directory.")),
|
|
@@ -560,22 +574,23 @@ var installDependencies = (packages) => safeTry10(async function* () {
|
|
|
560
574
|
s.start("Installing dependencies...");
|
|
561
575
|
const isMonorepo = yield* checkIsMonorepo();
|
|
562
576
|
for (const pkg of packages) {
|
|
577
|
+
s.message(`Installing dependency: ${pkg}...`);
|
|
563
578
|
yield* fromPromise7(addDevDependency(pkg, { silent: true, workspace: isMonorepo }), (error) => Fault10.wrap(error).withTag("FAILED_TO_INSTALL_DEPENDENCY").withMessage(`Failed to install ${pkg}`));
|
|
564
579
|
}
|
|
565
580
|
s.stop("Dependencies installed.");
|
|
566
581
|
return ok10();
|
|
567
582
|
});
|
|
568
|
-
var setupOxlintConfig = () => safeTry10(async function* () {
|
|
583
|
+
var setupOxlintConfig = (presets) => safeTry10(async function* () {
|
|
569
584
|
const spinner2 = p.spinner();
|
|
570
585
|
spinner2.start("Setting up oxlint config...");
|
|
571
586
|
const oxlintPath = await oxlint.exists();
|
|
572
587
|
if (oxlintPath.path) {
|
|
573
588
|
spinner2.message(`Found \`${oxlintPath.path}\`, updating...`);
|
|
574
|
-
yield* oxlint.update();
|
|
589
|
+
yield* oxlint.update(presets);
|
|
575
590
|
spinner2.stop("oxlint config updated successfully.");
|
|
576
591
|
} else {
|
|
577
592
|
spinner2.message("`.oxlintrc.json` not found, creating...");
|
|
578
|
-
yield* oxlint.create();
|
|
593
|
+
yield* oxlint.create(presets);
|
|
579
594
|
spinner2.stop("oxlint config created successfully.");
|
|
580
595
|
}
|
|
581
596
|
return ok10();
|
|
@@ -706,7 +721,7 @@ var init_default = defineCommand({
|
|
|
706
721
|
hint: "recommended"
|
|
707
722
|
},
|
|
708
723
|
{
|
|
709
|
-
label: "typecheck - type-check your code using
|
|
724
|
+
label: "typecheck - type-check your code using tsgo",
|
|
710
725
|
value: "typecheck",
|
|
711
726
|
hint: "extends the `adamantite/typescript` preset in your `tsconfig.json`"
|
|
712
727
|
},
|
|
@@ -727,6 +742,26 @@ var init_default = defineCommand({
|
|
|
727
742
|
if (p.isCancel(scripts)) {
|
|
728
743
|
return err6(Fault10.create("OPERATION_CANCELLED"));
|
|
729
744
|
}
|
|
745
|
+
const hasOxlint = scripts.includes("check") || scripts.includes("fix");
|
|
746
|
+
let presets = [];
|
|
747
|
+
if (hasOxlint) {
|
|
748
|
+
const presetsResponse = yield* fromSafePromise(p.multiselect({
|
|
749
|
+
message: "Which presets do you want to install? (core is always included)",
|
|
750
|
+
options: [
|
|
751
|
+
{ label: "React", value: "react" },
|
|
752
|
+
{ label: "Next.js", value: "nextjs" },
|
|
753
|
+
{ label: "Vue", value: "vue" },
|
|
754
|
+
{ label: "Jest", value: "jest" },
|
|
755
|
+
{ label: "Vitest", value: "vitest" },
|
|
756
|
+
{ label: "Node", value: "node" }
|
|
757
|
+
],
|
|
758
|
+
required: false
|
|
759
|
+
}));
|
|
760
|
+
if (p.isCancel(presetsResponse)) {
|
|
761
|
+
return err6(Fault10.create("OPERATION_CANCELLED"));
|
|
762
|
+
}
|
|
763
|
+
presets = presetsResponse;
|
|
764
|
+
}
|
|
730
765
|
const editors = yield* fromSafePromise(p.multiselect({
|
|
731
766
|
message: "Which editors do you want to configure? (optional)",
|
|
732
767
|
options: [
|
|
@@ -750,7 +785,6 @@ var init_default = defineCommand({
|
|
|
750
785
|
}
|
|
751
786
|
enableGitHubActions = response;
|
|
752
787
|
}
|
|
753
|
-
const hasOxlint = scripts.includes("check") || scripts.includes("fix");
|
|
754
788
|
const hasOxfmt = scripts.includes("format");
|
|
755
789
|
const hasSherif = scripts.includes("check:monorepo") || scripts.includes("fix:monorepo");
|
|
756
790
|
const hasTypecheck = scripts.includes("typecheck");
|
|
@@ -766,14 +800,14 @@ var init_default = defineCommand({
|
|
|
766
800
|
dependencies.push(`${sherif.name}@${sherif.version}`);
|
|
767
801
|
}
|
|
768
802
|
if (hasTypecheck) {
|
|
769
|
-
dependencies.push(
|
|
803
|
+
dependencies.push(`${typescript.name}@${typescript.version}`);
|
|
770
804
|
}
|
|
771
805
|
yield* installDependencies(dependencies);
|
|
772
806
|
if (hasOxfmt) {
|
|
773
807
|
yield* setupOxfmtConfig();
|
|
774
808
|
}
|
|
775
809
|
if (hasOxlint) {
|
|
776
|
-
yield* setupOxlintConfig();
|
|
810
|
+
yield* setupOxlintConfig(presets);
|
|
777
811
|
}
|
|
778
812
|
yield* addScripts(scripts);
|
|
779
813
|
if (hasTypecheck) {
|
|
@@ -862,7 +896,7 @@ var typecheck_default = defineCommand({
|
|
|
862
896
|
if (argv.watch) {
|
|
863
897
|
args.push("--watch");
|
|
864
898
|
}
|
|
865
|
-
const command = dlxCommand5(packageManager, typescript.
|
|
899
|
+
const command = dlxCommand5(packageManager, typescript.command, { args });
|
|
866
900
|
const result = yield* runCommand(command);
|
|
867
901
|
return ok12(result);
|
|
868
902
|
}).match(() => {
|
|
@@ -952,5 +986,5 @@ var update_default = defineCommand({
|
|
|
952
986
|
});
|
|
953
987
|
|
|
954
988
|
// src/index.ts
|
|
955
|
-
var version = await "0.
|
|
989
|
+
var version = await "0.19.0";
|
|
956
990
|
yargs(hideBin(process.argv)).scriptName("adamantite").version(version).command(check_default).command(fix_default).command(format_default).command(init_default).command(monorepo_default).command(typecheck_default).command(update_default).demandCommand(1).strict().help().parse();
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "adamantite",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.19.0",
|
|
4
4
|
"description": "An strict and opinionated set of presets for modern TypeScript applications",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"adamantite",
|
|
@@ -9,6 +9,7 @@
|
|
|
9
9
|
"oxfmt",
|
|
10
10
|
"oxlint",
|
|
11
11
|
"preset",
|
|
12
|
+
"tsgo",
|
|
12
13
|
"typescript"
|
|
13
14
|
],
|
|
14
15
|
"homepage": "https://github.com/adelrodriguez/adamantite",
|
|
@@ -70,6 +71,7 @@
|
|
|
70
71
|
"@changesets/cli": "2.29.8",
|
|
71
72
|
"@types/bun": "1.3.5",
|
|
72
73
|
"@types/yargs": "17.0.35",
|
|
74
|
+
"@typescript/native-preview": "7.0.0-dev.20251227.1",
|
|
73
75
|
"bunup": "0.16.11",
|
|
74
76
|
"oxfmt": "0.20.0",
|
|
75
77
|
"oxlint": "1.35.0",
|
package/presets/oxlint/core.json
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
"$schema": "../../node_modules/oxlint/configuration_schema.json",
|
|
3
3
|
"plugins": ["eslint", "typescript", "unicorn", "oxc", "import", "jsdoc", "promise"],
|
|
4
4
|
"rules": {
|
|
5
|
-
//
|
|
5
|
+
// ==================== CORRECTNESS ====================
|
|
6
6
|
"constructor-super": "error",
|
|
7
7
|
"for-direction": "error",
|
|
8
8
|
"no-async-promise-executor": "error",
|
|
@@ -128,7 +128,7 @@
|
|
|
128
128
|
"unicorn/prefer-set-size": "error",
|
|
129
129
|
"unicorn/prefer-string-starts-ends-with": "error",
|
|
130
130
|
|
|
131
|
-
//
|
|
131
|
+
// ==================== PERFORMANCE ====================
|
|
132
132
|
"no-await-in-loop": "error",
|
|
133
133
|
"no-useless-call": "error",
|
|
134
134
|
|
|
@@ -139,7 +139,7 @@
|
|
|
139
139
|
"unicorn/prefer-array-flat-map": "error",
|
|
140
140
|
"unicorn/prefer-set-has": "error",
|
|
141
141
|
|
|
142
|
-
//
|
|
142
|
+
// ==================== RESTRICTION ====================
|
|
143
143
|
"class-methods-use-this": "warn",
|
|
144
144
|
"default-case": "error",
|
|
145
145
|
"no-console": ["warn", { "allow": ["info"] }],
|
|
@@ -191,7 +191,7 @@
|
|
|
191
191
|
"unicorn/prefer-node-protocol": "error",
|
|
192
192
|
"unicorn/prefer-number-properties": "error",
|
|
193
193
|
|
|
194
|
-
//
|
|
194
|
+
// ==================== SUSPICIOUS =====================
|
|
195
195
|
"block-scoped-var": "error",
|
|
196
196
|
"no-extend-native": "error",
|
|
197
197
|
"no-extra-bind": "error",
|
|
@@ -234,7 +234,7 @@
|
|
|
234
234
|
"unicorn/require-module-specifiers": "error",
|
|
235
235
|
"unicorn/require-post-message-target-origin": "error",
|
|
236
236
|
|
|
237
|
-
// ===================== PEDANTIC
|
|
237
|
+
// ===================== PEDANTIC ======================
|
|
238
238
|
"accessor-pairs": "error",
|
|
239
239
|
"array-callback-return": "error",
|
|
240
240
|
"eqeqeq": "error",
|
|
@@ -331,7 +331,7 @@
|
|
|
331
331
|
"unicorn/prefer-string-slice": "error",
|
|
332
332
|
"unicorn/require-number-to-fixed-digits-argument": "error",
|
|
333
333
|
|
|
334
|
-
//
|
|
334
|
+
// ======================= STYLE =======================
|
|
335
335
|
"arrow-body-style": ["error", "as-needed"],
|
|
336
336
|
"capitalized-comments": [
|
|
337
337
|
"error",
|
|
@@ -425,7 +425,7 @@
|
|
|
425
425
|
"unicorn/text-encoding-identifier-case": "error",
|
|
426
426
|
"unicorn/throw-new-error": "error",
|
|
427
427
|
|
|
428
|
-
//
|
|
428
|
+
// ====================== NURSERY ======================
|
|
429
429
|
"getter-return": "error",
|
|
430
430
|
|
|
431
431
|
"import/export": "error",
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "../../node_modules/oxlint/configuration_schema.json",
|
|
3
|
+
"plugins": ["jest"],
|
|
4
|
+
"rules": {
|
|
5
|
+
// ==================== CORRECTNESS ====================
|
|
6
|
+
"jest/expect-expect": "error",
|
|
7
|
+
"jest/no-conditional-expect": "error",
|
|
8
|
+
"jest/no-disabled-tests": "error",
|
|
9
|
+
"jest/no-export": "error",
|
|
10
|
+
"jest/no-focused-tests": "error",
|
|
11
|
+
"jest/no-standalone-expect": "error",
|
|
12
|
+
"jest/require-to-throw-message": "error",
|
|
13
|
+
"jest/valid-describe-callback": "error",
|
|
14
|
+
"jest/valid-expect": "error",
|
|
15
|
+
"jest/valid-title": "error",
|
|
16
|
+
|
|
17
|
+
// ==================== SUSPICIOUS =====================
|
|
18
|
+
"jest/no-commented-out-tests": "error",
|
|
19
|
+
|
|
20
|
+
// ===================== PEDANTIC ======================
|
|
21
|
+
"jest/no-conditional-in-test": "error",
|
|
22
|
+
|
|
23
|
+
// ======================= STYLE =======================
|
|
24
|
+
"jest/consistent-test-it": "error",
|
|
25
|
+
"jest/max-expects": "error",
|
|
26
|
+
"jest/max-nested-describe": "error",
|
|
27
|
+
"jest/no-alias-methods": "error",
|
|
28
|
+
"jest/no-confusing-set-timeout": "error",
|
|
29
|
+
"jest/no-deprecated-functions": "error",
|
|
30
|
+
"jest/no-done-callback": "error",
|
|
31
|
+
"jest/no-duplicate-hooks": "error",
|
|
32
|
+
"jest/no-hooks": "error",
|
|
33
|
+
"jest/no-identical-title": "error",
|
|
34
|
+
"jest/no-interpolation-in-snapshots": "error",
|
|
35
|
+
"jest/no-jasmine-globals": "error",
|
|
36
|
+
"jest/no-large-snapshots": "error",
|
|
37
|
+
"jest/no-mocks-import": "error",
|
|
38
|
+
"jest/no-restricted-jest-methods": "error",
|
|
39
|
+
"jest/no-restricted-matchers": "error",
|
|
40
|
+
"jest/no-test-prefixes": "error",
|
|
41
|
+
"jest/no-test-return-statement": "error",
|
|
42
|
+
"jest/no-untyped-mock-factory": "error",
|
|
43
|
+
"jest/padding-around-test-blocks": "error",
|
|
44
|
+
"jest/prefer-called-with": "error",
|
|
45
|
+
"jest/prefer-comparison-matcher": "error",
|
|
46
|
+
"jest/prefer-each": "error",
|
|
47
|
+
"jest/prefer-equality-matcher": "error",
|
|
48
|
+
"jest/prefer-expect-resolves": "error",
|
|
49
|
+
"jest/prefer-hooks-in-order": "error",
|
|
50
|
+
"jest/prefer-hooks-on-top": "error",
|
|
51
|
+
"jest/prefer-jest-mocked": "error",
|
|
52
|
+
"jest/prefer-lowercase-title": "error",
|
|
53
|
+
"jest/prefer-mock-promise-shorthand": "error",
|
|
54
|
+
"jest/prefer-spy-on": "error",
|
|
55
|
+
"jest/prefer-strict-equal": "error",
|
|
56
|
+
"jest/prefer-to-be": "error",
|
|
57
|
+
"jest/prefer-to-contain": "error",
|
|
58
|
+
"jest/prefer-to-have-been-called": "error",
|
|
59
|
+
"jest/prefer-to-have-been-called-times": "error",
|
|
60
|
+
"jest/prefer-to-have-length": "error",
|
|
61
|
+
"jest/prefer-todo": "error",
|
|
62
|
+
"jest/require-hook": "error",
|
|
63
|
+
"jest/require-top-level-describe": "error"
|
|
64
|
+
}
|
|
65
|
+
}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "../../node_modules/oxlint/configuration_schema.json",
|
|
3
|
+
"plugins": ["nextjs"],
|
|
4
|
+
"rules": {
|
|
5
|
+
// ==================== CORRECTNESS ====================
|
|
6
|
+
"nextjs/google-font-display": "error",
|
|
7
|
+
"nextjs/google-font-preconnect": "error",
|
|
8
|
+
"nextjs/inline-script-id": "error",
|
|
9
|
+
"nextjs/next-script-for-ga": "error",
|
|
10
|
+
"nextjs/no-assign-module-variable": "error",
|
|
11
|
+
"nextjs/no-async-client-component": "error",
|
|
12
|
+
"nextjs/no-before-interactive-script-outside-document": "error",
|
|
13
|
+
"nextjs/no-css-tags": "error",
|
|
14
|
+
"nextjs/no-document-import-in-page": "error",
|
|
15
|
+
"nextjs/no-duplicate-head": "error",
|
|
16
|
+
"nextjs/no-head-element": "error",
|
|
17
|
+
"nextjs/no-head-import-in-document": "error",
|
|
18
|
+
"nextjs/no-html-link-for-pages": "error",
|
|
19
|
+
"nextjs/no-img-element": "error",
|
|
20
|
+
"nextjs/no-page-custom-font": "error",
|
|
21
|
+
"nextjs/no-script-component-in-head": "error",
|
|
22
|
+
"nextjs/no-styled-jsx-in-document": "error",
|
|
23
|
+
"nextjs/no-sync-scripts": "error",
|
|
24
|
+
"nextjs/no-title-in-document-head": "error",
|
|
25
|
+
"nextjs/no-typos": "error",
|
|
26
|
+
"nextjs/no-unwanted-polyfillio": "error"
|
|
27
|
+
}
|
|
28
|
+
}
|
package/presets/oxlint/node.json
CHANGED
|
@@ -2,7 +2,10 @@
|
|
|
2
2
|
"$schema": "../../node_modules/oxlint/configuration_schema.json",
|
|
3
3
|
"plugins": ["node"],
|
|
4
4
|
"rules": {
|
|
5
|
-
//
|
|
6
|
-
"node/no-new-require": "error"
|
|
5
|
+
// ==================== RESTRICTION ====================
|
|
6
|
+
"node/no-new-require": "error",
|
|
7
|
+
|
|
8
|
+
// ======================= STYLE =======================
|
|
9
|
+
"node/no-exports-assign": "error"
|
|
7
10
|
}
|
|
8
11
|
}
|
|
@@ -2,6 +2,87 @@
|
|
|
2
2
|
"$schema": "../../node_modules/oxlint/configuration_schema.json",
|
|
3
3
|
"plugins": ["react", "react-perf", "jsx-a11y"],
|
|
4
4
|
"rules": {
|
|
5
|
-
//
|
|
5
|
+
// ==================== CORRECTNESS ====================
|
|
6
|
+
"react/exhaustive-deps": "error",
|
|
7
|
+
"react/jsx-key": "error",
|
|
8
|
+
"react/jsx-no-duplicate-props": "error",
|
|
9
|
+
"react/jsx-no-undef": "error",
|
|
10
|
+
"react/jsx-props-no-spread-multi": "error",
|
|
11
|
+
"react/no-children-prop": "error",
|
|
12
|
+
"react/no-danger-with-children": "error",
|
|
13
|
+
"react/no-direct-mutation-state": "error",
|
|
14
|
+
"react/no-find-dom-node": "error",
|
|
15
|
+
"react/no-is-mounted": "error",
|
|
16
|
+
"react/no-render-return-value": "error",
|
|
17
|
+
"react/no-string-refs": "error",
|
|
18
|
+
"react/no-unsafe": "error",
|
|
19
|
+
"react/void-dom-elements-no-children": "error",
|
|
20
|
+
"jsx-a11y/alt-text": "error",
|
|
21
|
+
"jsx-a11y/anchor-has-content": "error",
|
|
22
|
+
"jsx-a11y/anchor-is-valid": "error",
|
|
23
|
+
"jsx-a11y/aria-activedescendant-has-tabindex": "error",
|
|
24
|
+
"jsx-a11y/aria-props": "error",
|
|
25
|
+
"jsx-a11y/aria-role": "error",
|
|
26
|
+
"jsx-a11y/aria-unsupported-elements": "error",
|
|
27
|
+
"jsx-a11y/autocomplete-valid": "error",
|
|
28
|
+
"jsx-a11y/click-events-have-key-events": "error",
|
|
29
|
+
"jsx-a11y/heading-has-content": "error",
|
|
30
|
+
"jsx-a11y/html-has-lang": "error",
|
|
31
|
+
"jsx-a11y/iframe-has-title": "error",
|
|
32
|
+
"jsx-a11y/img-redundant-alt": "error",
|
|
33
|
+
"jsx-a11y/label-has-associated-control": "error",
|
|
34
|
+
"jsx-a11y/lang": "error",
|
|
35
|
+
"jsx-a11y/media-has-caption": "error",
|
|
36
|
+
"jsx-a11y/mouse-events-have-key-events": "error",
|
|
37
|
+
"jsx-a11y/no-access-key": "error",
|
|
38
|
+
"jsx-a11y/no-aria-hidden-on-focusable": "error",
|
|
39
|
+
"jsx-a11y/no-autofocus": "error",
|
|
40
|
+
"jsx-a11y/no-distracting-elements": "error",
|
|
41
|
+
"jsx-a11y/no-noninteractive-tabindex": "error",
|
|
42
|
+
"jsx-a11y/no-redundant-roles": "error",
|
|
43
|
+
"jsx-a11y/prefer-tag-over-role": "error",
|
|
44
|
+
"jsx-a11y/role-has-required-aria-props": "error",
|
|
45
|
+
"jsx-a11y/role-supports-aria-props": "error",
|
|
46
|
+
"jsx-a11y/scope": "error",
|
|
47
|
+
"jsx-a11y/tabindex-no-positive": "error",
|
|
48
|
+
|
|
49
|
+
// ==================== PERFORMANCE ====================
|
|
50
|
+
"react/no-array-index-key": "error",
|
|
51
|
+
"react-perf/jsx-no-jsx-as-prop": "error",
|
|
52
|
+
"react-perf/jsx-no-new-array-as-prop": "error",
|
|
53
|
+
"react-perf/jsx-no-new-function-as-prop": "error",
|
|
54
|
+
"react-perf/jsx-no-new-object-as-prop": "error",
|
|
55
|
+
|
|
56
|
+
// ==================== RESTRICTION ====================
|
|
57
|
+
"jsx-a11y/no-ambiguous-text": "error",
|
|
58
|
+
"react/no-danger": "error",
|
|
59
|
+
"react/no-unknown-property": "error",
|
|
60
|
+
|
|
61
|
+
// ==================== SUSPICIOUS =====================
|
|
62
|
+
"react/iframe-missing-sandbox": "error",
|
|
63
|
+
"react/jsx-no-comment-textnodes": "error",
|
|
64
|
+
"react/jsx-no-script-url": "error",
|
|
65
|
+
"react/no-namespace": "error",
|
|
66
|
+
"react/react-in-jsx-scope": "error",
|
|
67
|
+
"react/style-prop-object": "error",
|
|
68
|
+
|
|
69
|
+
// ===================== PEDANTIC ======================
|
|
70
|
+
"react/checked-requires-onchange-or-readonly": "error",
|
|
71
|
+
"react/jsx-no-target-blank": "error",
|
|
72
|
+
"react/jsx-no-useless-fragment": "error",
|
|
73
|
+
"react/no-unescaped-entities": "error",
|
|
74
|
+
"react/rules-of-hooks": "error",
|
|
75
|
+
|
|
76
|
+
// ======================= STYLE =======================
|
|
77
|
+
"react/jsx-boolean-value": "error",
|
|
78
|
+
"react/jsx-curly-brace-presence": ["error", { "props": "never", "children": "never" }],
|
|
79
|
+
"react/jsx-fragments": ["error", "syntax"],
|
|
80
|
+
"react/jsx-handler-names": "error",
|
|
81
|
+
"react/jsx-pascal-case": "error",
|
|
82
|
+
"react/no-redundant-should-component-update": "error",
|
|
83
|
+
"react/no-set-state": "error",
|
|
84
|
+
"react/prefer-es6-class": ["error", "always"],
|
|
85
|
+
"react/self-closing-comp": "error",
|
|
86
|
+
"react/state-in-constructor": ["error", "never"]
|
|
6
87
|
}
|
|
7
88
|
}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "../../node_modules/oxlint/configuration_schema.json",
|
|
3
|
+
"plugins": ["vitest"],
|
|
4
|
+
"rules": {
|
|
5
|
+
// ==================== CORRECTNESS ====================
|
|
6
|
+
"vitest/no-conditional-tests": "error",
|
|
7
|
+
"vitest/require-local-test-context-for-concurrent-snapshots": "error",
|
|
8
|
+
|
|
9
|
+
// ======================= STYLE =======================
|
|
10
|
+
"vitest/no-import-node-test": "error",
|
|
11
|
+
"vitest/prefer-called-times": "error",
|
|
12
|
+
"vitest/prefer-to-be-falsy": "error",
|
|
13
|
+
"vitest/prefer-to-be-object": "error",
|
|
14
|
+
"vitest/prefer-to-be-truthy": "error"
|
|
15
|
+
}
|
|
16
|
+
}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "../../node_modules/oxlint/configuration_schema.json",
|
|
3
|
+
"plugins": ["vue"],
|
|
4
|
+
"rules": {
|
|
5
|
+
// ==================== CORRECTNESS ====================
|
|
6
|
+
"vue/no-deprecated-destroyed-lifecycle": "error",
|
|
7
|
+
"vue/no-export-in-script-setup": "error",
|
|
8
|
+
"vue/prefer-import-from-vue": "error",
|
|
9
|
+
"vue/valid-define-emits": "error",
|
|
10
|
+
"vue/valid-define-props": "error",
|
|
11
|
+
|
|
12
|
+
// ==================== RESTRICTION ====================
|
|
13
|
+
"vue/max-props": "error",
|
|
14
|
+
"vue/no-import-compiler-macros": "error",
|
|
15
|
+
"vue/no-multiple-slot-args": "error",
|
|
16
|
+
|
|
17
|
+
// ==================== SUSPICIOUS =====================
|
|
18
|
+
"vue/no-required-prop-with-default": "error",
|
|
19
|
+
"vue/require-default-export": "error",
|
|
20
|
+
|
|
21
|
+
// ======================= STYLE =======================
|
|
22
|
+
"vue/define-emits-declaration": "error",
|
|
23
|
+
"vue/define-props-declaration": "error",
|
|
24
|
+
"vue/define-props-destructuring": "error",
|
|
25
|
+
"vue/require-typed-ref": "error"
|
|
26
|
+
}
|
|
27
|
+
}
|