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;
|
|
431
|
-
targeted typescript-eslint rules are currently implemented
|
|
432
|
-
-
|
|
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-
|
|
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";
|
package/dist/src/index.d.mts
CHANGED
|
@@ -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';
|
package/dist/src/index.mjs
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import { t as migrate } from "../src-
|
|
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(" -
|
|
151
|
-
suggestions.push(" -
|
|
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
|
|
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.
|
|
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
|
|
57
|
+
"zod": "^4.6.5"
|
|
58
58
|
},
|
|
59
59
|
"devDependencies": {
|
|
60
60
|
"@arethetypeswrong/core": "^0.18.5",
|
|
61
|
-
"@biomejs/biome": "^2.5.
|
|
62
|
-
"@types/node": "^26.
|
|
63
|
-
"@vitest/coverage-v8": "^
|
|
64
|
-
"oxfmt": "^0.
|
|
65
|
-
"oxlint": "^1.
|
|
66
|
-
"oxlint-tsgolint": "^7.0.
|
|
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": "^
|
|
70
|
+
"vitest": "^5.0.2"
|
|
71
71
|
},
|
|
72
72
|
"engines": {
|
|
73
73
|
"node": ">=24.19.0",
|