@howells/lint 0.1.6 → 0.1.8

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/MIGRATIONS.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # Adoption Notes
2
2
 
3
- Use these notes when replacing an existing ESLint, Prettier, or ad hoc Biome setup with `@howells/lint`.
3
+ Use these notes when replacing an existing ESLint, Prettier, Oxc, or ad hoc Biome setup with `@howells/lint`.
4
4
 
5
5
  ## Primary rule
6
6
 
@@ -22,7 +22,24 @@ If none of these fit cleanly, the likely answer is a new shared preset here, not
22
22
  2. Pin Node with `.node-version` set to `22.18.0` and `engines.node` set to `>=22.18.0`.
23
23
  3. Replace `eslint`, `next lint`, `prettier`, or direct `biome` scripts with `howells-lint` and `howells-format`.
24
24
  4. Replace the project `biome.json` or `biome.jsonc` with a minimal file that only extends one shared preset.
25
- 5. Remove direct `eslint`, `eslint-config-*`, `eslint-plugin-*`, `prettier`, `@biomejs/biome`, and `ultracite` dependencies once the project is green.
25
+ 5. Remove direct `eslint`, `eslint-config-*`, `eslint-plugin-*`, `prettier`, `@biomejs/biome`, `oxlint`, `oxfmt`, `oxlint-tsgolint`, and `ultracite` dependencies once the project is green.
26
+
27
+ ## Oxlint/Oxfmt opt-in
28
+
29
+ Biome remains the default migration target. Use Oxlint/Oxfmt only for projects that deliberately choose the Oxc lane.
30
+
31
+ For an Oxlint/Oxfmt project, add `oxlint.config.ts` and `oxfmt.config.ts` using the exports from `@howells/lint`, then use:
32
+
33
+ ```json
34
+ {
35
+ "scripts": {
36
+ "lint": "howells-ox-check .",
37
+ "lint:fix": "howells-ox-fix ."
38
+ }
39
+ }
40
+ ```
41
+
42
+ Do not run Biome and Oxlint/Oxfmt together indefinitely. If both are present during a migration, write down which command is authoritative and remove the other once the migration is green.
26
43
 
27
44
  ## Keep local config thin
28
45
 
package/README.md CHANGED
@@ -1,15 +1,19 @@
1
1
  # `@howells/lint`
2
2
 
3
- Pinned Biome and Ultracite presets for Howells projects.
3
+ Pinned Biome, Oxlint/Oxfmt, and Ultracite presets for Howells projects.
4
4
 
5
5
  The goal is not to invent a second lint philosophy. The goal is to:
6
6
 
7
7
  - pin a single `@biomejs/biome` version
8
+ - pin a single `oxlint` version
9
+ - pin a single `oxfmt` version
8
10
  - pin a single `ultracite` version
9
11
  - pin a single `@manypkg/cli` version for monorepo consistency checks
10
12
  - give every consumer the same small preset matrix
11
13
  - discourage repo-local overrides unless the project has a genuinely unique constraint
12
14
 
15
+ Biome is the default toolchain. Oxlint/Oxfmt is offered as an explicit opt-in lane for JavaScript and TypeScript projects that want the Oxc stack's speed and ESLint-style rule coverage.
16
+
13
17
  ## Agent Setup Checklist
14
18
 
15
19
  When configuring a project, do this in order:
@@ -46,7 +50,7 @@ Install the shared tooling:
46
50
  pnpm add -D @howells/lint
47
51
  ```
48
52
 
49
- Do not add `@biomejs/biome`, `ultracite`, or `@manypkg/cli` directly unless you are developing this package itself. They are pinned transitively here.
53
+ Do not add `@biomejs/biome`, `oxlint`, `oxfmt`, `oxlint-tsgolint`, `ultracite`, or `@manypkg/cli` directly unless you are developing this package itself. They are pinned transitively here.
50
54
 
51
55
  ## Biome Presets
52
56
 
@@ -64,7 +68,7 @@ Node or non-React TypeScript package:
64
68
 
65
69
  ```json
66
70
  {
67
- "$schema": "https://biomejs.dev/schemas/2.4.14/schema.json",
71
+ "$schema": "https://biomejs.dev/schemas/2.4.15/schema.json",
68
72
  "extends": ["@howells/lint/biome/core"],
69
73
  "root": true
70
74
  }
@@ -74,7 +78,7 @@ React package:
74
78
 
75
79
  ```json
76
80
  {
77
- "$schema": "https://biomejs.dev/schemas/2.4.14/schema.json",
81
+ "$schema": "https://biomejs.dev/schemas/2.4.15/schema.json",
78
82
  "extends": ["@howells/lint/biome/core", "@howells/lint/biome/react"],
79
83
  "root": true
80
84
  }
@@ -84,7 +88,7 @@ Next.js app:
84
88
 
85
89
  ```json
86
90
  {
87
- "$schema": "https://biomejs.dev/schemas/2.4.14/schema.json",
91
+ "$schema": "https://biomejs.dev/schemas/2.4.15/schema.json",
88
92
  "extends": [
89
93
  "@howells/lint/biome/core",
90
94
  "@howells/lint/biome/react",
@@ -94,6 +98,56 @@ Next.js app:
94
98
  }
95
99
  ```
96
100
 
101
+ ## Oxlint/Oxfmt Presets
102
+
103
+ Use this lane only when a project deliberately wants Oxlint and Oxfmt instead of Biome for day-to-day linting and formatting. The default `howells-lint` and `howells-format` commands stay on Biome.
104
+
105
+ Create an `oxlint.config.ts`:
106
+
107
+ ```ts
108
+ import { defineConfig } from "oxlint";
109
+ import core from "@howells/lint/oxlint/core";
110
+
111
+ export default defineConfig({
112
+ extends: [core],
113
+ });
114
+ ```
115
+
116
+ For React or Next.js projects, add the matching presets:
117
+
118
+ ```ts
119
+ import { defineConfig } from "oxlint";
120
+ import core from "@howells/lint/oxlint/core";
121
+ import react from "@howells/lint/oxlint/react";
122
+ import next from "@howells/lint/oxlint/next";
123
+
124
+ export default defineConfig({
125
+ extends: [core, react, next],
126
+ });
127
+ ```
128
+
129
+ Create an `oxfmt.config.ts`:
130
+
131
+ ```ts
132
+ import { defineConfig } from "oxfmt";
133
+ import howells from "@howells/lint/oxfmt";
134
+
135
+ export default defineConfig({
136
+ extends: [howells],
137
+ });
138
+ ```
139
+
140
+ Oxlint type-aware rules are available through the pinned `oxlint-tsgolint` dependency. Enable them in the root Oxlint config when the project is ready for TypeScript 7 / `typescript-go` constraints:
141
+
142
+ ```ts
143
+ export default defineConfig({
144
+ extends: [core],
145
+ options: {
146
+ typeAware: true,
147
+ },
148
+ });
149
+ ```
150
+
97
151
  ## Package Scripts
98
152
 
99
153
  Every package or single-package app should use this shape:
@@ -121,6 +175,19 @@ Prefer `howells-lint .` over raw `biome check` or long target lists. Use explici
121
175
  }
122
176
  ```
123
177
 
178
+ For an Oxlint/Oxfmt project, keep the command names explicit:
179
+
180
+ ```json
181
+ {
182
+ "scripts": {
183
+ "lint": "howells-ox-check .",
184
+ "lint:fix": "howells-ox-fix ."
185
+ }
186
+ }
187
+ ```
188
+
189
+ Use `howells-ox-fix --unsafe .` only when you deliberately want Oxlint's dangerous fixes.
190
+
124
191
  ## Monorepo Roots
125
192
 
126
193
  Use workspace checks only at the monorepo root. Do not add `howells-workspace-check` to individual packages, and do not add it to single-package apps.
@@ -140,7 +207,7 @@ A monorepo root should have:
140
207
  "check": "pnpm lint && pnpm typecheck && pnpm test"
141
208
  },
142
209
  "devDependencies": {
143
- "@howells/lint": "^0.1.6"
210
+ "@howells/lint": "^0.1.7"
144
211
  }
145
212
  }
146
213
  ```
@@ -158,6 +225,10 @@ Installers only need `@howells/lint` as a direct dependency. Use these package b
158
225
  - `howells-lint` defaults to `biome check .`
159
226
  - `howells-lint-strict` runs high-signal Biome security, correctness, and suspicious lint rules
160
227
  - `howells-format` defaults to `biome check . --write`
228
+ - `howells-oxlint` proxies to the pinned Oxlint binary
229
+ - `howells-oxfmt` proxies to the pinned Oxfmt binary
230
+ - `howells-ox-check` runs `oxfmt --check`, then `oxlint`
231
+ - `howells-ox-fix` runs `oxfmt --write`, then `oxlint --fix`
161
232
  - `howells-workspace-check` validates root workspace hygiene, then runs `manypkg check`
162
233
  - `howells-workspace-fix` runs `manypkg fix`
163
234
 
@@ -165,6 +236,7 @@ Installers only need `@howells/lint` as a direct dependency. Use these package b
165
236
 
166
237
  - Do not add local overrides just to preserve old ESLint behavior.
167
238
  - Do not create local `base`, `shared`, or `custom` Biome wrappers.
239
+ - Do not mix Biome and Oxlint/Oxfmt scripts in the same package unless the project has a deliberate migration plan.
168
240
  - If multiple repos need the same exception, add or adjust a preset here.
169
241
  - If a repo needs framework-specific linting, choose the matching preset instead of layering rules manually.
170
242
  - Prefer inline `biome-ignore` comments for truly isolated exceptions over broad config overrides.
@@ -208,4 +280,6 @@ Add this to `.claude/settings.json` so files are formatted on edit and linted on
208
280
  This package wraps:
209
281
 
210
282
  - [Biome configuration docs](https://biomejs.dev/reference/configuration/)
283
+ - [Oxlint configuration docs](https://oxc.rs/docs/guide/usage/linter/config-file-reference.html)
284
+ - [Oxfmt configuration docs](https://oxc.rs/docs/guide/usage/formatter/config-file-reference)
211
285
  - [Ultracite configuration docs](https://www.ultracite.ai/configuration)
@@ -4,8 +4,8 @@ import { runPackageBin } from "./run-package-bin.mjs";
4
4
 
5
5
  const targets = process.argv.slice(2);
6
6
  const args =
7
- targets.length > 0
8
- ? ["check", "--write", ...targets]
9
- : ["check", "--write", "."];
7
+ targets.length > 0
8
+ ? ["check", "--write", ...targets]
9
+ : ["check", "--write", "."];
10
10
 
11
11
  runPackageBin("@biomejs/biome", "biome", args);
@@ -4,33 +4,33 @@ import { runPackageBin } from "./run-package-bin.mjs";
4
4
 
5
5
  const args = process.argv.slice(2);
6
6
  const biomeCommands = new Set([
7
- "version",
8
- "rage",
9
- "start",
10
- "stop",
11
- "check",
12
- "lint",
13
- "format",
14
- "ci",
15
- "init",
16
- "migrate",
17
- "search",
18
- "explain",
19
- "clean",
20
- "daemon",
21
- "lsp-proxy"
7
+ "version",
8
+ "rage",
9
+ "start",
10
+ "stop",
11
+ "check",
12
+ "lint",
13
+ "format",
14
+ "ci",
15
+ "init",
16
+ "migrate",
17
+ "search",
18
+ "explain",
19
+ "clean",
20
+ "daemon",
21
+ "lsp-proxy",
22
22
  ]);
23
23
  const passthroughOptions = new Set(["--help", "-h", "--version", "-V"]);
24
24
 
25
25
  const resolvedArgs =
26
- args.length === 0
27
- ? ["check", "."]
28
- : biomeCommands.has(args[0])
29
- ? args
30
- : passthroughOptions.has(args[0])
31
- ? args
32
- : args[0].startsWith("-")
33
- ? ["check", ".", ...args]
34
- : ["check", ...args];
26
+ args.length === 0
27
+ ? ["check", "."]
28
+ : biomeCommands.has(args[0])
29
+ ? args
30
+ : passthroughOptions.has(args[0])
31
+ ? args
32
+ : args[0].startsWith("-")
33
+ ? ["check", ".", ...args]
34
+ : ["check", ...args];
35
35
 
36
36
  runPackageBin("@biomejs/biome", "biome", resolvedArgs);
@@ -0,0 +1,28 @@
1
+ #!/usr/bin/env node
2
+
3
+ import { spawnSync } from "node:child_process";
4
+ import { resolvePackageBin } from "./run-package-bin.mjs";
5
+
6
+ const args = process.argv.slice(2);
7
+ const targets = args.filter((arg) => !arg.startsWith("-"));
8
+ const oxlintOptions = args.filter((arg) => arg.startsWith("-"));
9
+ const resolvedTargets = targets.length > 0 ? targets : ["."];
10
+
11
+ function run(packageName, binName, commandArgs) {
12
+ const binPath = resolvePackageBin(packageName, binName);
13
+ const result = spawnSync(binPath, commandArgs, {
14
+ stdio: "inherit",
15
+ env: process.env,
16
+ });
17
+
18
+ if (result.error) {
19
+ throw result.error;
20
+ }
21
+
22
+ if ((result.status ?? 1) !== 0) {
23
+ process.exit(result.status ?? 1);
24
+ }
25
+ }
26
+
27
+ run("oxfmt", "oxfmt", ["--check", ...resolvedTargets]);
28
+ run("oxlint", "oxlint", [...oxlintOptions, ...resolvedTargets]);
@@ -0,0 +1,34 @@
1
+ #!/usr/bin/env node
2
+
3
+ import { spawnSync } from "node:child_process";
4
+ import { resolvePackageBin } from "./run-package-bin.mjs";
5
+
6
+ const args = process.argv.slice(2);
7
+ const useDangerousFixes = args.includes("--unsafe");
8
+ const filteredArgs = args.filter((arg) => arg !== "--unsafe");
9
+ const targets = filteredArgs.filter((arg) => !arg.startsWith("-"));
10
+ const oxlintOptions = filteredArgs.filter((arg) => arg.startsWith("-"));
11
+ const resolvedTargets = targets.length > 0 ? targets : ["."];
12
+
13
+ function run(packageName, binName, commandArgs) {
14
+ const binPath = resolvePackageBin(packageName, binName);
15
+ const result = spawnSync(binPath, commandArgs, {
16
+ stdio: "inherit",
17
+ env: process.env,
18
+ });
19
+
20
+ if (result.error) {
21
+ throw result.error;
22
+ }
23
+
24
+ if ((result.status ?? 1) !== 0) {
25
+ process.exit(result.status ?? 1);
26
+ }
27
+ }
28
+
29
+ run("oxfmt", "oxfmt", ["--write", ...resolvedTargets]);
30
+ run("oxlint", "oxlint", [
31
+ useDangerousFixes ? "--fix-dangerously" : "--fix",
32
+ ...oxlintOptions,
33
+ ...resolvedTargets,
34
+ ]);
@@ -0,0 +1,5 @@
1
+ #!/usr/bin/env node
2
+
3
+ import { runPackageBin } from "./run-package-bin.mjs";
4
+
5
+ runPackageBin("oxfmt", "oxfmt", process.argv.slice(2));
@@ -0,0 +1,5 @@
1
+ #!/usr/bin/env node
2
+
3
+ import { runPackageBin } from "./run-package-bin.mjs";
4
+
5
+ runPackageBin("oxlint", "oxlint", process.argv.slice(2));
File without changes
@@ -2,67 +2,77 @@
2
2
 
3
3
  import { spawnSync } from "node:child_process";
4
4
  import { existsSync, readFileSync } from "node:fs";
5
- import { dirname, join } from "node:path";
6
5
  import { createRequire } from "node:module";
6
+ import { dirname, join } from "node:path";
7
7
  import { fileURLToPath } from "node:url";
8
8
 
9
9
  const require = createRequire(import.meta.url);
10
10
  const currentDir = dirname(fileURLToPath(import.meta.url));
11
11
 
12
12
  function resolvePackageJsonPath(packageName) {
13
- try {
14
- return require.resolve(`${packageName}/package.json`);
15
- } catch {
16
- const packageSegments = packageName.split("/");
17
- let searchDir = currentDir;
18
-
19
- while (true) {
20
- const candidate = join(searchDir, "..", "node_modules", ...packageSegments, "package.json");
21
-
22
- if (existsSync(candidate)) {
23
- return candidate;
24
- }
25
-
26
- const parentDir = dirname(searchDir);
27
-
28
- if (parentDir === searchDir) {
29
- break;
30
- }
31
-
32
- searchDir = parentDir;
33
- }
34
- }
35
-
36
- throw new Error(`Could not resolve package.json for package '${packageName}'.`);
13
+ try {
14
+ return require.resolve(`${packageName}/package.json`);
15
+ } catch {
16
+ const packageSegments = packageName.split("/");
17
+ let searchDir = currentDir;
18
+
19
+ while (true) {
20
+ const candidate = join(
21
+ searchDir,
22
+ "..",
23
+ "node_modules",
24
+ ...packageSegments,
25
+ "package.json",
26
+ );
27
+
28
+ if (existsSync(candidate)) {
29
+ return candidate;
30
+ }
31
+
32
+ const parentDir = dirname(searchDir);
33
+
34
+ if (parentDir === searchDir) {
35
+ break;
36
+ }
37
+
38
+ searchDir = parentDir;
39
+ }
40
+ }
41
+
42
+ throw new Error(
43
+ `Could not resolve package.json for package '${packageName}'.`,
44
+ );
37
45
  }
38
46
 
39
- function resolvePackageBin(packageName, binName) {
40
- const packageJsonPath = resolvePackageJsonPath(packageName);
41
- const packageJson = JSON.parse(readFileSync(packageJsonPath, "utf8"));
42
- const packageDir = dirname(packageJsonPath);
43
- const binField = packageJson.bin;
47
+ export function resolvePackageBin(packageName, binName) {
48
+ const packageJsonPath = resolvePackageJsonPath(packageName);
49
+ const packageJson = JSON.parse(readFileSync(packageJsonPath, "utf8"));
50
+ const packageDir = dirname(packageJsonPath);
51
+ const binField = packageJson.bin;
44
52
 
45
- if (typeof binField === "string") {
46
- return join(packageDir, binField);
47
- }
53
+ if (typeof binField === "string") {
54
+ return join(packageDir, binField);
55
+ }
48
56
 
49
- if (binField && typeof binField === "object" && binField[binName]) {
50
- return join(packageDir, binField[binName]);
51
- }
57
+ if (binField && typeof binField === "object" && binField[binName]) {
58
+ return join(packageDir, binField[binName]);
59
+ }
52
60
 
53
- throw new Error(`Could not resolve bin '${binName}' for package '${packageName}'.`);
61
+ throw new Error(
62
+ `Could not resolve bin '${binName}' for package '${packageName}'.`,
63
+ );
54
64
  }
55
65
 
56
66
  export function runPackageBin(packageName, binName, args) {
57
- const binPath = resolvePackageBin(packageName, binName);
58
- const result = spawnSync(binPath, args, {
59
- stdio: "inherit",
60
- env: process.env
61
- });
67
+ const binPath = resolvePackageBin(packageName, binName);
68
+ const result = spawnSync(binPath, args, {
69
+ stdio: "inherit",
70
+ env: process.env,
71
+ });
62
72
 
63
- if (result.error) {
64
- throw result.error;
65
- }
73
+ if (result.error) {
74
+ throw result.error;
75
+ }
66
76
 
67
- process.exit(result.status ?? 1);
77
+ process.exit(result.status ?? 1);
68
78
  }
package/biome/core.json CHANGED
@@ -1,5 +1,5 @@
1
1
  {
2
- "$schema": "https://biomejs.dev/schemas/2.4.14/schema.json",
2
+ "$schema": "https://biomejs.dev/schemas/2.4.15/schema.json",
3
3
  "extends": ["ultracite/biome/core"],
4
4
  "formatter": {
5
5
  "indentStyle": "space",
package/biome/next.json CHANGED
@@ -1,5 +1,5 @@
1
1
  {
2
- "$schema": "https://biomejs.dev/schemas/2.4.14/schema.json",
2
+ "$schema": "https://biomejs.dev/schemas/2.4.15/schema.json",
3
3
  "extends": ["./react.json", "ultracite/biome/next"],
4
4
  "files": {
5
5
  "ignoreUnknown": true,
package/biome/react.json CHANGED
@@ -1,5 +1,5 @@
1
1
  {
2
- "$schema": "https://biomejs.dev/schemas/2.4.14/schema.json",
2
+ "$schema": "https://biomejs.dev/schemas/2.4.15/schema.json",
3
3
  "extends": ["./core.json", "ultracite/biome/react"],
4
4
  "files": {
5
5
  "ignoreUnknown": true,
@@ -0,0 +1,4 @@
1
+ import type { OxfmtConfig } from "oxfmt";
2
+
3
+ declare const config: OxfmtConfig;
4
+ export default config;
@@ -0,0 +1 @@
1
+ export { default } from "ultracite/oxfmt";
@@ -0,0 +1,4 @@
1
+ import type { OxlintConfig } from "oxlint";
2
+
3
+ declare const config: OxlintConfig;
4
+ export default config;
@@ -0,0 +1 @@
1
+ export { default } from "ultracite/oxlint/core";
@@ -0,0 +1,4 @@
1
+ import type { OxlintConfig } from "oxlint";
2
+
3
+ declare const config: OxlintConfig;
4
+ export default config;
@@ -0,0 +1 @@
1
+ export { default } from "ultracite/oxlint/next";
@@ -0,0 +1,4 @@
1
+ import type { OxlintConfig } from "oxlint";
2
+
3
+ declare const config: OxlintConfig;
4
+ export default config;
@@ -0,0 +1 @@
1
+ export { default } from "ultracite/oxlint/react";
package/package.json CHANGED
@@ -1,36 +1,62 @@
1
1
  {
2
- "name": "@howells/lint",
3
- "version": "0.1.6",
4
- "description": "Pinned Biome and Ultracite presets for Howells projects.",
5
- "license": "MIT",
6
- "packageManager": "pnpm@10.23.0",
7
- "engines": {
8
- "node": ">=22.18.0"
9
- },
10
- "files": [
11
- "biome/*.json",
12
- "bin/*.mjs",
13
- "README.md",
14
- "MIGRATIONS.md"
15
- ],
16
- "bin": {
17
- "howells-biome": "bin/howells-biome.mjs",
18
- "howells-lint": "bin/howells-lint.mjs",
19
- "howells-lint-strict": "bin/howells-lint-strict.mjs",
20
- "howells-format": "bin/howells-format.mjs",
21
- "howells-ultracite": "bin/howells-ultracite.mjs",
22
- "howells-workspace-check": "bin/howells-workspace-check.mjs",
23
- "howells-workspace-fix": "bin/howells-workspace-fix.mjs"
24
- },
25
- "dependencies": {
26
- "@biomejs/biome": "2.4.14",
27
- "@manypkg/cli": "^0.25.1",
28
- "ultracite": "7.6.2"
29
- },
30
- "exports": {
31
- "./package.json": "./package.json",
32
- "./biome/core": "./biome/core.json",
33
- "./biome/react": "./biome/react.json",
34
- "./biome/next": "./biome/next.json"
35
- }
36
- }
2
+ "name": "@howells/lint",
3
+ "version": "0.1.8",
4
+ "description": "Pinned Biome, Oxlint/Oxfmt, and Ultracite presets for Howells projects.",
5
+ "license": "MIT",
6
+ "engines": {
7
+ "node": ">=22.18.0"
8
+ },
9
+ "files": [
10
+ "biome/*.json",
11
+ "oxfmt/*.d.mts",
12
+ "oxfmt/*.mjs",
13
+ "oxlint/*.d.mts",
14
+ "oxlint/*.mjs",
15
+ "bin/*.mjs",
16
+ "README.md",
17
+ "MIGRATIONS.md"
18
+ ],
19
+ "bin": {
20
+ "howells-biome": "bin/howells-biome.mjs",
21
+ "howells-lint": "bin/howells-lint.mjs",
22
+ "howells-lint-strict": "bin/howells-lint-strict.mjs",
23
+ "howells-format": "bin/howells-format.mjs",
24
+ "howells-ox-check": "bin/howells-ox-check.mjs",
25
+ "howells-ox-fix": "bin/howells-ox-fix.mjs",
26
+ "howells-oxfmt": "bin/howells-oxfmt.mjs",
27
+ "howells-oxlint": "bin/howells-oxlint.mjs",
28
+ "howells-ultracite": "bin/howells-ultracite.mjs",
29
+ "howells-workspace-check": "bin/howells-workspace-check.mjs",
30
+ "howells-workspace-fix": "bin/howells-workspace-fix.mjs"
31
+ },
32
+ "dependencies": {
33
+ "@biomejs/biome": "2.4.15",
34
+ "@manypkg/cli": "^0.25.1",
35
+ "oxfmt": "0.51.0",
36
+ "oxlint": "1.66.0",
37
+ "oxlint-tsgolint": "0.23.0",
38
+ "ultracite": "7.7.0"
39
+ },
40
+ "exports": {
41
+ "./package.json": "./package.json",
42
+ "./biome/core": "./biome/core.json",
43
+ "./biome/react": "./biome/react.json",
44
+ "./biome/next": "./biome/next.json",
45
+ "./oxfmt": {
46
+ "types": "./oxfmt/index.d.mts",
47
+ "default": "./oxfmt/index.mjs"
48
+ },
49
+ "./oxlint/core": {
50
+ "types": "./oxlint/core.d.mts",
51
+ "default": "./oxlint/core.mjs"
52
+ },
53
+ "./oxlint/react": {
54
+ "types": "./oxlint/react.d.mts",
55
+ "default": "./oxlint/react.mjs"
56
+ },
57
+ "./oxlint/next": {
58
+ "types": "./oxlint/next.d.mts",
59
+ "default": "./oxlint/next.mjs"
60
+ }
61
+ }
62
+ }