biome-to-oxc 3.5.0 → 3.6.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
@@ -427,9 +427,10 @@ npx oxlint --type-aware --type-check
427
427
  - Oxfmt is in beta; review formatting changes before replacing the existing formatter
428
428
  - Overlapping `overrides` are migrated as-is. Biome and Oxfmt both merge matching overrides field
429
429
  by field with later entries winning, so the two agree; a conformance test pins this
430
- - Type-aware linting is stable as of `oxlint-tsgolint` v7 and requires TypeScript 7; 59 of the 61
431
- targeted typescript-eslint rules are currently implemented
432
- - CSS and JSON formatter overrides are mapped but may need manual review
430
+ - Type-aware linting is stable as of `oxlint-tsgolint` v7 and requires TypeScript 7; 60 of the 62
431
+ targeted typescript-eslint rules are currently implemented, and Oxlint 1.85 does not yet expose
432
+ `no-generated-empty-object-type`, so 59 can be enabled
433
+ - CSS, JSON and GraphQL formatter overrides are mapped but may need manual review
433
434
  - Prettier plugin support is not available in Oxfmt
434
435
  - Assist actions are migrated only when the Biome config names them explicitly; actions enabled
435
436
  through `recommended` or a preset are reported rather than derived
@@ -1,5 +1,5 @@
1
1
  #!/usr/bin/env node
2
- import { i as readJsonFile, n as DefaultReporter, r as findClosestPackageJson, t as migrate } from "../src-Dz7Nl3tJ.mjs";
2
+ import { i as readJsonFile, n as DefaultReporter, r as findClosestPackageJson, t as migrate } from "../src-BN3SXk7r.mjs";
3
3
  import { realpath } from "node:fs/promises";
4
4
  import { dirname } from "node:path";
5
5
  import { fileURLToPath } from "node:url";
@@ -11,6 +11,7 @@ export interface BiomeConfig {
11
11
  javascript?: BiomeJavaScriptConfig;
12
12
  json?: BiomeJsonConfig;
13
13
  css?: BiomeCssConfig;
14
+ graphql?: BiomeGraphqlConfig;
14
15
  html?: Record<string, unknown>;
15
16
  overrides?: BiomeOverride[];
16
17
  }
@@ -164,6 +165,21 @@ export interface BiomeCssConfig {
164
165
  enabled?: boolean;
165
166
  };
166
167
  }
168
+ export interface BiomeGraphqlConfig {
169
+ formatter?: {
170
+ enabled?: boolean;
171
+ bracketSpacing?: boolean;
172
+ indentStyle?: 'tab' | 'space';
173
+ indentWidth?: number;
174
+ lineEnding?: 'lf' | 'crlf' | 'cr' | 'auto';
175
+ lineWidth?: number;
176
+ quoteStyle?: 'single' | 'double';
177
+ trailingNewline?: boolean;
178
+ };
179
+ linter?: {
180
+ enabled?: boolean;
181
+ };
182
+ }
167
183
  export interface BiomeOverride {
168
184
  include?: string[];
169
185
  includes?: string[];
@@ -176,6 +192,7 @@ export interface BiomeOverride {
176
192
  javascript?: BiomeJavaScriptConfig;
177
193
  json?: BiomeJsonConfig;
178
194
  css?: BiomeCssConfig;
195
+ graphql?: BiomeGraphqlConfig;
179
196
  }
180
197
  export type FixStrategy = 'safe' | 'suggestions' | 'dangerous';
181
198
  export type TypeAwareProfile = 'standard' | 'strict';
@@ -1,2 +1,2 @@
1
- import { t as migrate } from "../src-Dz7Nl3tJ.mjs";
1
+ import { t as migrate } from "../src-BN3SXk7r.mjs";
2
2
  export { migrate };
@@ -147,8 +147,8 @@ function generateFeatureSpecificSuggestions(features) {
147
147
  if (features.hasGraphQL) {
148
148
  suggestions.push("");
149
149
  suggestions.push("GraphQL detected:");
150
- suggestions.push(" - Consider using graphql-prettier for GraphQL formatting");
151
- suggestions.push(" - Oxfmt may support GraphQL in future releases");
150
+ suggestions.push(" - Oxfmt formats .graphql and .gql files natively");
151
+ suggestions.push(" - Biome graphql.formatter settings are migrated to an Oxfmt override");
152
152
  }
153
153
  if (features.hasMonorepo) {
154
154
  suggestions.push("");
@@ -310,6 +310,7 @@ const SUPPORTED_TOP_LEVEL_FIELDS = /* @__PURE__ */ new Set([
310
310
  "javascript",
311
311
  "json",
312
312
  "css",
313
+ "graphql",
313
314
  "html",
314
315
  "overrides"
315
316
  ]);
@@ -467,6 +468,24 @@ const BiomeCssConfigSchema = z.object({
467
468
  }).passthrough().optional(),
468
469
  linter: z.object({ enabled: z.boolean().optional() }).passthrough().optional()
469
470
  }).passthrough();
471
+ const BiomeGraphqlConfigSchema = z.object({
472
+ formatter: z.object({
473
+ enabled: z.boolean().optional(),
474
+ bracketSpacing: z.boolean().optional(),
475
+ indentStyle: z.enum(["tab", "space"]).optional(),
476
+ indentWidth: z.number().int().optional(),
477
+ lineEnding: z.enum([
478
+ "lf",
479
+ "crlf",
480
+ "cr",
481
+ "auto"
482
+ ]).optional(),
483
+ lineWidth: z.number().int().optional(),
484
+ quoteStyle: z.enum(["single", "double"]).optional(),
485
+ trailingNewline: z.boolean().optional()
486
+ }).passthrough().optional(),
487
+ linter: z.object({ enabled: z.boolean().optional() }).passthrough().optional()
488
+ }).passthrough();
470
489
  const BiomeLinterConfigSchema = IncludeFieldsSchema.extend({
471
490
  enabled: z.boolean().optional(),
472
491
  ignore: z.array(z.string()).optional(),
@@ -500,7 +519,8 @@ const BiomeOverrideSchema = z.object({
500
519
  assist: BiomeAssistConfigSchema.optional(),
501
520
  javascript: BiomeJavaScriptConfigSchema.optional(),
502
521
  json: BiomeJsonConfigSchema.optional(),
503
- css: BiomeCssConfigSchema.optional()
522
+ css: BiomeCssConfigSchema.optional(),
523
+ graphql: BiomeGraphqlConfigSchema.optional()
504
524
  }).passthrough();
505
525
  const BiomeConfigSchema = z.object({
506
526
  $schema: z.string().optional(),
@@ -526,6 +546,7 @@ const BiomeConfigSchema = z.object({
526
546
  javascript: BiomeJavaScriptConfigSchema.optional(),
527
547
  json: BiomeJsonConfigSchema.optional(),
528
548
  css: BiomeCssConfigSchema.optional(),
549
+ graphql: BiomeGraphqlConfigSchema.optional(),
529
550
  html: z.record(z.string(), z.unknown()).optional(),
530
551
  overrides: z.array(BiomeOverrideSchema).optional()
531
552
  }).passthrough();
@@ -773,6 +794,7 @@ const CSS_EXTENSIONS = [
773
794
  "sass",
774
795
  "less"
775
796
  ];
797
+ const GRAPHQL_EXTENSIONS = ["graphql", "gql"];
776
798
  const JSON_FORMATTER_KEYS = /* @__PURE__ */ new Set([
777
799
  "enabled",
778
800
  "expand",
@@ -796,6 +818,18 @@ const CSS_FORMATTER_KEYS = /* @__PURE__ */ new Set([
796
818
  ...EXPLICIT_OXFMT_OPTION_KEYS$1,
797
819
  ...Object.keys(LEGACY_EXPLICIT_OXFMT_OPTION_ALIASES$1)
798
820
  ]);
821
+ const GRAPHQL_FORMATTER_KEYS = /* @__PURE__ */ new Set([
822
+ "enabled",
823
+ "bracketSpacing",
824
+ "indentStyle",
825
+ "indentWidth",
826
+ "lineEnding",
827
+ "lineWidth",
828
+ "quoteStyle",
829
+ "trailingNewline",
830
+ ...EXPLICIT_OXFMT_OPTION_KEYS$1,
831
+ ...Object.keys(LEGACY_EXPLICIT_OXFMT_OPTION_ALIASES$1)
832
+ ]);
799
833
  /**
800
834
  * Biome's `expand` and Oxfmt's `objectWrap` agree on two of three modes: Biome's `auto`
801
835
  * (expand when the literal already has a newline after `{`) is Oxfmt's `preserve`, and
@@ -824,6 +858,7 @@ function generateOxfmtOverrides(biomeOverrides, reporter) {
824
858
  pushScopedOverride(oxfmtOverrides, files, excludeFiles, mapJavaScriptFormatterOptions(override.javascript?.formatter, reporter), reporter, "javascript.formatter", JAVASCRIPT_EXTENSIONS);
825
859
  pushScopedOverride(oxfmtOverrides, files, excludeFiles, mapJsonFormatterOptions(override.json?.formatter, reporter), reporter, "json.formatter", JSON_EXTENSIONS);
826
860
  pushScopedOverride(oxfmtOverrides, files, excludeFiles, mapCssFormatterOptions(override.css?.formatter, reporter), reporter, "css.formatter", CSS_EXTENSIONS);
861
+ pushScopedOverride(oxfmtOverrides, files, excludeFiles, mapGraphqlFormatterOptions(override.graphql?.formatter, reporter), reporter, "graphql.formatter", GRAPHQL_EXTENSIONS);
827
862
  }
828
863
  return oxfmtOverrides;
829
864
  }
@@ -916,6 +951,19 @@ function mapCssFormatterOptions(cssFormatter, reporter) {
916
951
  applyExplicitFormatterOptionPassThrough$1([cssFormatter], options, reporter);
917
952
  return options;
918
953
  }
954
+ function mapGraphqlFormatterOptions(graphqlFormatter, reporter) {
955
+ const options = {};
956
+ if (!graphqlFormatter) return options;
957
+ warnAboutUnsupportedKeys(graphqlFormatter, GRAPHQL_FORMATTER_KEYS, "graphql.formatter", reporter);
958
+ if (graphqlFormatter.lineWidth !== void 0) options.printWidth = graphqlFormatter.lineWidth;
959
+ if (graphqlFormatter.indentStyle !== void 0) options.useTabs = graphqlFormatter.indentStyle === "tab";
960
+ if (graphqlFormatter.indentWidth !== void 0) options.tabWidth = graphqlFormatter.indentWidth;
961
+ if (graphqlFormatter.lineEnding !== void 0) options.endOfLine = graphqlFormatter.lineEnding;
962
+ if (graphqlFormatter.bracketSpacing !== void 0) options.bracketSpacing = graphqlFormatter.bracketSpacing;
963
+ if (graphqlFormatter.trailingNewline !== void 0) options.insertFinalNewline = graphqlFormatter.trailingNewline;
964
+ applyExplicitFormatterOptionPassThrough$1([graphqlFormatter], options, reporter);
965
+ return options;
966
+ }
919
967
  function warnAboutUnsupportedKeys(formatter, supportedKeys, label, reporter) {
920
968
  for (const [key, value] of Object.entries(formatter)) {
921
969
  if (value === void 0) continue;
@@ -1033,7 +1081,7 @@ function generateOxfmtConfig(biomeConfig, reporter, options = {}) {
1033
1081
  warnAboutUnsupportedFormatterKeys(formatter, GLOBAL_FORMATTER_KEYS, "formatter", reporter);
1034
1082
  warnAboutUnsupportedFormatterKeys(jsFormatter, JAVASCRIPT_FORMATTER_KEYS, "javascript.formatter", reporter);
1035
1083
  if (formatter?.enabled === false) {
1036
- if (!(jsFormatter?.enabled === true || biomeConfig.json?.formatter?.enabled === true || biomeConfig.css?.formatter?.enabled === true)) oxfmtConfig.ignorePatterns = ["**/*"];
1084
+ if (!(jsFormatter?.enabled === true || biomeConfig.json?.formatter?.enabled === true || biomeConfig.css?.formatter?.enabled === true || biomeConfig.graphql?.formatter?.enabled === true)) oxfmtConfig.ignorePatterns = ["**/*"];
1037
1085
  else reporter.loss("Biome global formatting is disabled with a language formatter re-enabled; Oxfmt cannot represent that enable-only selection, so more files will be formatted than Biome formatted.");
1038
1086
  }
1039
1087
  const positiveSelectors = [...biomeConfig.files?.include ?? [], ...formatter?.include ?? []];
@@ -1056,6 +1104,10 @@ function generateOxfmtConfig(biomeConfig, reporter, options = {}) {
1056
1104
  {
1057
1105
  include: ["**/*.{css,scss,sass,less}"],
1058
1106
  css: biomeConfig.css
1107
+ },
1108
+ {
1109
+ include: ["**/*.{graphql,gql}"],
1110
+ graphql: biomeConfig.graphql
1059
1111
  }
1060
1112
  ], reporter);
1061
1113
  if (languageOverrides.length > 0) oxfmtConfig.overrides = languageOverrides;
@@ -1078,6 +1130,7 @@ function mapDisabledLanguageFormatters(biomeConfig, oxfmtConfig) {
1078
1130
  if (biomeConfig.javascript?.formatter?.enabled === false) disabledPatterns.push("**/*.{js,jsx,ts,tsx,mjs,mts,cjs,cts}");
1079
1131
  if (biomeConfig.json?.formatter?.enabled === false) disabledPatterns.push("**/*.{json,jsonc,json5}");
1080
1132
  if (biomeConfig.css?.formatter?.enabled === false) disabledPatterns.push("**/*.{css,scss,sass,less}");
1133
+ if (biomeConfig.graphql?.formatter?.enabled === false) disabledPatterns.push("**/*.{graphql,gql}");
1081
1134
  if (disabledPatterns.length > 0) oxfmtConfig.ignorePatterns = [.../* @__PURE__ */ new Set([...oxfmtConfig.ignorePatterns ?? [], ...disabledPatterns])];
1082
1135
  }
1083
1136
  function warnAboutUnsupportedFormatterKeys(formatter, supportedKeys, label, reporter) {
@@ -1284,8 +1337,7 @@ const UNSUPPORTED_BIOME_RULE_GUIDANCE = {
1284
1337
  noRedundantUseStrict: {
1285
1338
  nativeAlternatives: ["unicorn/prefer-module"],
1286
1339
  notes: "No native Oxlint equivalent for redundant `\"use strict\"` directives. For ESM, strict mode is already implicit."
1287
- },
1288
- useSingleVarDeclarator: { notes: "No native Oxlint equivalent for enforcing single declarators (ESLint `one-var`). Consider custom JS plugin policy if this is mandatory." }
1340
+ }
1289
1341
  };
1290
1342
  function collectUnsupportedBiomeRules(warnings) {
1291
1343
  const unsupported = /* @__PURE__ */ new Set();
@@ -1489,7 +1541,10 @@ const REACT_COMPILER_RULES = [
1489
1541
  */
1490
1542
  const PARTIAL_RULE_MAPPING_NOTES = {
1491
1543
  noComponentHookFactories: "Biome rule noComponentHookFactories was mapped to react/no-unstable-nested-components, which reports nested component definitions but not nested custom hook definitions.",
1544
+ noInlineStyles: "Biome rule noInlineStyles was mapped to react/forbid-dom-props, which reports the `style` prop on JSX DOM elements but not `style` passed through React.createElement() or written in HTML, Vue, Svelte or Astro templates.",
1492
1545
  noReactPropAssignments: "Biome rule noReactPropAssignments was mapped to the React Compiler rule react/immutability, which reports prop mutation alongside other mutations of values React treats as immutable.",
1546
+ noUnresolvedImports: "Biome rule noUnresolvedImports was mapped to import/named, which reports named imports a JavaScript module does not export but skips TypeScript files entirely and does not report import paths that cannot be resolved.",
1547
+ noUnsafeIframeSandbox: "Biome rule noUnsafeIframeSandbox was mapped to react/iframe-missing-sandbox, which reports `allow-scripts` combined with `allow-same-origin` only when the sandbox value is a plain string attribute, not a `{\"...\"}` or template-literal expression; it also reports iframes with no or an invalid sandbox attribute, which Biome leaves to useIframeSandbox.",
1493
1548
  useExplicitType: "Biome rule useExplicitType was mapped to typescript/explicit-function-return-type, which requires return types on functions and methods but not types on variables or parameters.",
1494
1549
  useStaticResponseMethods: "Biome rule useStaticResponseMethods was mapped to unicorn/prefer-response-static-json, which reports `new Response(JSON.stringify(...))` but not the `new Response(null, { status, headers: { Location } })` form Biome rewrites to Response.redirect()."
1495
1550
  };
@@ -1608,6 +1663,7 @@ const BIOME_TO_OXLINT_RULE_MAP = {
1608
1663
  noImportCycles: "import/no-cycle",
1609
1664
  noImplicitCoercions: "no-implicit-coercion",
1610
1665
  noInnerDeclarations: "no-inner-declarations",
1666
+ noInlineStyles: "react/forbid-dom-props",
1611
1667
  noImplicitBoolean: "no-implicit-coercion",
1612
1668
  noImpliedEval: "no-implied-eval",
1613
1669
  noIncrementDecrement: "no-plusplus",
@@ -1674,6 +1730,7 @@ const BIOME_TO_OXLINT_RULE_MAP = {
1674
1730
  noRestrictedImports: "no-restricted-imports",
1675
1731
  noRestrictedTypes: "typescript/no-restricted-types",
1676
1732
  noReturnAssign: "no-return-assign",
1733
+ noReturnInFinally: "promise/no-return-in-finally",
1677
1734
  noScriptUrl: "no-script-url",
1678
1735
  noSelfCompare: "no-self-compare",
1679
1736
  noSelfAssign: "no-self-assign",
@@ -1698,13 +1755,16 @@ const BIOME_TO_OXLINT_RULE_MAP = {
1698
1755
  noUnusedFunctionParameters: "no-unused-vars",
1699
1756
  noUnusedImports: "no-unused-vars",
1700
1757
  noUnnecessaryContinue: "no-continue",
1758
+ noUnmodifiedLoopCondition: "no-unmodified-loop-condition",
1701
1759
  noUnnecessaryConditions: "typescript/no-unnecessary-condition",
1702
1760
  noUnnecessaryTemplateExpression: "typescript/no-unnecessary-template-expression",
1703
1761
  noUnreachable: "no-unreachable",
1704
1762
  noUnreachableSuper: "constructor-super",
1763
+ noUnresolvedImports: "import/named",
1705
1764
  noUnsafeDeclarationMerging: "typescript/no-unsafe-declaration-merging",
1706
1765
  noUnsafeTypeAssertion: "typescript/no-unsafe-type-assertion",
1707
1766
  noUnsafeFinally: "no-unsafe-finally",
1767
+ noUnsafeIframeSandbox: "react/iframe-missing-sandbox",
1708
1768
  noUnsafeNegation: "no-unsafe-negation",
1709
1769
  noUnsafeOptionalChaining: "no-unsafe-optional-chaining",
1710
1770
  noUnsafePlusOperands: "typescript/restrict-plus-operands",
@@ -1772,6 +1832,7 @@ const BIOME_TO_OXLINT_RULE_MAP = {
1772
1832
  useConsistentBuiltinInstantiation: "no-new-wrappers",
1773
1833
  useConsistentCurlyBraces: "curly",
1774
1834
  useConsistentEnumValueType: "typescript/no-mixed-enums",
1835
+ useConsistentFunctionStyle: "func-style",
1775
1836
  useConsistentMethodSignatures: "typescript/method-signature-style",
1776
1837
  useConsistentTypeDefinitions: "typescript/consistent-type-definitions",
1777
1838
  useConsistentMemberAccessibility: "typescript/explicit-member-accessibility",
@@ -1832,6 +1893,7 @@ const BIOME_TO_OXLINT_RULE_MAP = {
1832
1893
  useMathMinMax: "unicorn/prefer-math-min-max",
1833
1894
  useMaxParams: "max-params",
1834
1895
  useMediaCaption: "jsx-a11y/media-has-caption",
1896
+ useModernMathApis: "unicorn/prefer-modern-math-apis",
1835
1897
  useNamedCaptureGroup: "prefer-named-capture-group",
1836
1898
  useNamespaceKeyword: "typescript/prefer-namespace-keyword",
1837
1899
  useNodejsImportProtocol: "unicorn/prefer-node-protocol",
@@ -1878,8 +1940,10 @@ const BIOME_TO_OXLINT_RULE_MAP = {
1878
1940
  useValidAutocomplete: "jsx-a11y/autocomplete-valid",
1879
1941
  useValidForDirection: "for-direction",
1880
1942
  useValidLang: "jsx-a11y/lang",
1943
+ useValidTestTitle: ["jest/valid-title", "vitest/valid-title"],
1881
1944
  useValidTypeof: "valid-typeof",
1882
1945
  useVarsOnTop: "vars-on-top",
1946
+ useVueBaseImport: "vue/prefer-import-from-vue",
1883
1947
  useVueConsistentDefinePropsDeclaration: "vue/define-props-declaration",
1884
1948
  useVueNextTickPromise: "vue/next-tick-style",
1885
1949
  useYield: "require-yield"
@@ -1920,6 +1984,7 @@ function mapBiomeRuleOptionsToOxlintSeverity(biomeName, severity, biomeSeverity,
1920
1984
  IIFEs: options?.skipIifes !== true
1921
1985
  }];
1922
1986
  if (biomeName === "useSingleVarDeclarator") return [severity, "never"];
1987
+ if (biomeName === "noInlineStyles") return [severity, { forbid: ["style"] }];
1923
1988
  if (biomeName === "useImportExtensions") {
1924
1989
  if (options?.extensionMappings !== void 0 || options?.forceJsExtensions !== void 0) reporter.loss("Biome rule useImportExtensions options \"extensionMappings\" and \"forceJsExtensions\" are not supported by Oxlint import/extensions; the rule requires an extension without rewriting it.");
1925
1990
  return [severity, "ignorePackages"];
@@ -2000,6 +2065,17 @@ function mapBiomeRuleOptionsToOxlintSeverity(biomeName, severity, biomeSeverity,
2000
2065
  if (Array.isArray(options.allowedNames) && options.allowedNames.every((value) => typeof value === "string")) oxlintOptions.allowedNames = options.allowedNames;
2001
2066
  return Object.keys(oxlintOptions).length > 0 ? [severity, oxlintOptions] : severity;
2002
2067
  }
2068
+ if (biomeName === "useConsistentFunctionStyle") {
2069
+ if (options.style !== "declaration") return severity;
2070
+ return [
2071
+ severity,
2072
+ "declaration",
2073
+ {
2074
+ allowArrowFunctions: options.allowArrowFunctions === true,
2075
+ allowTypeAnnotation: true
2076
+ }
2077
+ ];
2078
+ }
2003
2079
  if (biomeName === "useConsistentMethodSignatures") {
2004
2080
  const { style } = options;
2005
2081
  return style === "method" || style === "property" ? [severity, style] : severity;
@@ -2025,6 +2101,12 @@ function mapBiomeRuleOptionsToOxlintSeverity(biomeName, severity, biomeSeverity,
2025
2101
  const namedComponents = options.namedComponents === "functionDeclaration" ? "function-declaration" : options.namedComponents === "functionExpression" ? "function-expression" : options.namedComponents === "arrowFunction" ? "arrow-function" : null;
2026
2102
  return namedComponents ? [severity, { namedComponents }] : severity;
2027
2103
  }
2104
+ if (biomeName === "useValidTestTitle") {
2105
+ const { disallowedWords } = options;
2106
+ if (!Array.isArray(disallowedWords) || disallowedWords.length === 0 || !disallowedWords.every((value) => typeof value === "string")) return severity;
2107
+ reporter.loss("Biome rule useValidTestTitle option \"disallowedWords\" was migrated, but Oxlint valid-title stops reporting titles with leading or trailing whitespace once disallowedWords is set.");
2108
+ return [severity, { disallowedWords }];
2109
+ }
2028
2110
  if (biomeName === "useThisInClassMethods") {
2029
2111
  const oxlintOptions = {};
2030
2112
  if (options.ignoreClassesWithImplements === "all" || options.ignoreClassesWithImplements === "public-fields") oxlintOptions.ignoreClassesWithImplements = options.ignoreClassesWithImplements;
@@ -3287,7 +3369,7 @@ async function buildSuggestions({ biomeIgnorePatterns, detectedIntegrations, opt
3287
3369
  suggestions.push(" pnpm add -D oxlint-tsgolint@latest");
3288
3370
  suggestions.push(` ${typeAwareCommand}`);
3289
3371
  suggestions.push("Type-aware mode uses the tsgolint backend.");
3290
- suggestions.push("Type-aware linting is stable as of tsgolint v7; it covers 59 of typescript-eslint’s 61 type-aware rules, so check the remaining two if you relied on them.");
3372
+ suggestions.push("Type-aware linting is stable as of tsgolint v7; it implements 60 of typescript-eslint’s 62 type-aware rules, and Oxlint does not yet expose no-generated-empty-object-type, so check those three if you relied on them.");
3291
3373
  suggestions.push("TypeScript compatibility caveat: migrate deprecated tsconfig options if needed (typescript-go / TS7+ behavior).");
3292
3374
  suggestions.push(`Resolved type-aware profile: ${typeAwareProfile}`);
3293
3375
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "biome-to-oxc",
3
- "version": "3.5.0",
3
+ "version": "3.6.0",
4
4
  "description": "Migrate from Biome to Oxc ecosystem (oxlint + oxfmt + oxlint-tsgolint)",
5
5
  "keywords": [
6
6
  "biome",
@@ -54,20 +54,20 @@
54
54
  "commander": "15.0.0",
55
55
  "jsonc-parser": "next",
56
56
  "picocolors": "^1.1.1",
57
- "zod": "^4.5.4"
57
+ "zod": "^4.6.5"
58
58
  },
59
59
  "devDependencies": {
60
60
  "@arethetypeswrong/core": "^0.18.5",
61
- "@biomejs/biome": "^2.5.11",
62
- "@types/node": "^26.4.1",
63
- "@vitest/coverage-v8": "^4.1.11",
64
- "oxfmt": "^0.66.0",
65
- "oxlint": "^1.81.0",
66
- "oxlint-tsgolint": "^7.0.2001",
61
+ "@biomejs/biome": "^2.5.14",
62
+ "@types/node": "^26.6.3",
63
+ "@vitest/coverage-v8": "^5.0.2",
64
+ "oxfmt": "^0.70.0",
65
+ "oxlint": "^1.85.0",
66
+ "oxlint-tsgolint": "^7.0.2003",
67
67
  "publint": "^0.3.24",
68
68
  "tsdown": "rc",
69
69
  "typescript": "next",
70
- "vitest": "^4.1.11"
70
+ "vitest": "^5.0.2"
71
71
  },
72
72
  "engines": {
73
73
  "node": ">=24.19.0",