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 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) and
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: () => fromPromise2(writeFile(join2(process.cwd(), ".oxlintrc.json"), JSON.stringify({ ...oxlint.config, extends: ["adamantite/lint"] }, 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.")),
98
- update: () => safeTry2(async function* () {
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: "tsc",
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 strict TypeScript preset",
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("typescript");
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.name, { args });
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.18.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.18.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",
@@ -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
- // ======================= CORRECTNESS =======================
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
- // ======================= PERFORMANCE =======================
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
- // ======================= RESTRICTION =======================
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
- // ======================= SUSPICIOUS =======================
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
- // ===================== STYLE =======================
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
- // ===================== NURSERY =======================
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
+ }
@@ -2,7 +2,10 @@
2
2
  "$schema": "../../node_modules/oxlint/configuration_schema.json",
3
3
  "plugins": ["node"],
4
4
  "rules": {
5
- // ======================= RESTRICTION =======================
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
- // TODO: Add React rules
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
+ }