diff --git a/editors/vscode/fixtures/nested_mixed_config/.oxlintrc.json b/editors/vscode/fixtures/nested_mixed_config/.oxlintrc.json new file mode 100644 index 0000000000000..e363f06caf696 --- /dev/null +++ b/editors/vscode/fixtures/nested_mixed_config/.oxlintrc.json @@ -0,0 +1,8 @@ +{ + "categories": { + "correctness": "off" + }, + "rules": { + "no-debugger": "warn" + } +} diff --git a/editors/vscode/fixtures/nested_mixed_config/folder/index.ts b/editors/vscode/fixtures/nested_mixed_config/folder/index.ts new file mode 100644 index 0000000000000..eab74692130a6 --- /dev/null +++ b/editors/vscode/fixtures/nested_mixed_config/folder/index.ts @@ -0,0 +1 @@ +debugger; diff --git a/editors/vscode/fixtures/nested_mixed_config/folder/oxlint.config.ts b/editors/vscode/fixtures/nested_mixed_config/folder/oxlint.config.ts new file mode 100644 index 0000000000000..9d2ed36fc0b84 --- /dev/null +++ b/editors/vscode/fixtures/nested_mixed_config/folder/oxlint.config.ts @@ -0,0 +1,8 @@ +export default { + categories: { + correctness: "off", + }, + rules: { + "no-debugger": "error", + }, +}; diff --git a/editors/vscode/fixtures/nested_mixed_config/index.ts b/editors/vscode/fixtures/nested_mixed_config/index.ts new file mode 100644 index 0000000000000..eab74692130a6 --- /dev/null +++ b/editors/vscode/fixtures/nested_mixed_config/index.ts @@ -0,0 +1 @@ +debugger; diff --git a/editors/vscode/fixtures/nested_ts_config/folder/index.ts b/editors/vscode/fixtures/nested_ts_config/folder/index.ts new file mode 100644 index 0000000000000..eab74692130a6 --- /dev/null +++ b/editors/vscode/fixtures/nested_ts_config/folder/index.ts @@ -0,0 +1 @@ +debugger; diff --git a/editors/vscode/fixtures/nested_ts_config/folder/oxlint.config.ts b/editors/vscode/fixtures/nested_ts_config/folder/oxlint.config.ts new file mode 100644 index 0000000000000..9d2ed36fc0b84 --- /dev/null +++ b/editors/vscode/fixtures/nested_ts_config/folder/oxlint.config.ts @@ -0,0 +1,8 @@ +export default { + categories: { + correctness: "off", + }, + rules: { + "no-debugger": "error", + }, +}; diff --git a/editors/vscode/fixtures/nested_ts_config/index.ts b/editors/vscode/fixtures/nested_ts_config/index.ts new file mode 100644 index 0000000000000..eab74692130a6 --- /dev/null +++ b/editors/vscode/fixtures/nested_ts_config/index.ts @@ -0,0 +1 @@ +debugger; diff --git a/editors/vscode/fixtures/nested_ts_config/oxlint.config.ts b/editors/vscode/fixtures/nested_ts_config/oxlint.config.ts new file mode 100644 index 0000000000000..1dd008e335baf --- /dev/null +++ b/editors/vscode/fixtures/nested_ts_config/oxlint.config.ts @@ -0,0 +1,8 @@ +export default { + categories: { + correctness: "off", + }, + rules: { + "no-debugger": "warn", + }, +}; diff --git a/editors/vscode/fixtures/ts_config/debugger.js b/editors/vscode/fixtures/ts_config/debugger.js new file mode 100644 index 0000000000000..d360b2d7a29fa --- /dev/null +++ b/editors/vscode/fixtures/ts_config/debugger.js @@ -0,0 +1 @@ +/* 😊 */debugger; diff --git a/editors/vscode/fixtures/ts_config/oxlint.config.ts b/editors/vscode/fixtures/ts_config/oxlint.config.ts new file mode 100644 index 0000000000000..9d2ed36fc0b84 --- /dev/null +++ b/editors/vscode/fixtures/ts_config/oxlint.config.ts @@ -0,0 +1,8 @@ +export default { + categories: { + correctness: "off", + }, + rules: { + "no-debugger": "error", + }, +}; diff --git a/editors/vscode/tests/integration/e2e_server_linter.spec.ts b/editors/vscode/tests/integration/e2e_server_linter.spec.ts index 2abe22fc8c7e3..85cb1994ea059 100644 --- a/editors/vscode/tests/integration/e2e_server_linter.spec.ts +++ b/editors/vscode/tests/integration/e2e_server_linter.spec.ts @@ -236,6 +236,60 @@ suite("E2E Server Linter", () => { strictEqual(nestedDiagnostics[0].severity, DiagnosticSeverity.Error); }); + test("oxlint.config.ts TypeScript configuration", async () => { + await loadFixture("ts_config"); + await sleep(500); + const diagnostics = await getDiagnostics("debugger.js", undefined, 500); + + strictEqual(diagnostics.length, 1); + assert(typeof diagnostics[0].code == "object"); + strictEqual(diagnostics[0].code.target.authority, "oxc.rs"); + strictEqual( + diagnostics[0].message, + "`debugger` statement is not allowed\nhelp: Remove the debugger statement", + ); + strictEqual(diagnostics[0].severity, DiagnosticSeverity.Error); + strictEqual(diagnostics[0].range.start.line, 0); + strictEqual(diagnostics[0].range.start.character, 8); + strictEqual(diagnostics[0].range.end.line, 0); + strictEqual(diagnostics[0].range.end.character, 17); + }); + + test("nested oxlint.config.ts configs severity", async () => { + await loadFixture("nested_ts_config"); + await sleep(500); + const rootDiagnostics = await getDiagnostics("index.ts", undefined, 500); + const nestedDiagnostics = await getDiagnostics("folder/index.ts", undefined, 500); + + strictEqual(rootDiagnostics.length, 1); + assert(typeof rootDiagnostics[0].code == "object"); + strictEqual(rootDiagnostics[0].code.target.authority, "oxc.rs"); + strictEqual(rootDiagnostics[0].severity, DiagnosticSeverity.Warning); + + strictEqual(nestedDiagnostics.length, 1); + assert(typeof nestedDiagnostics[0].code == "object"); + strictEqual(nestedDiagnostics[0].code.target.authority, "oxc.rs"); + strictEqual(nestedDiagnostics[0].severity, DiagnosticSeverity.Error); + }); + + test("nested mixed JSON and TypeScript configs severity", async () => { + await loadFixture("nested_mixed_config"); + const rootDiagnostics = await getDiagnostics("index.ts", undefined, 500); + const nestedDiagnostics = await getDiagnostics("folder/index.ts", undefined, 500); + + // Root uses .oxlintrc.json with warn + strictEqual(rootDiagnostics.length, 1); + assert(typeof rootDiagnostics[0].code == "object"); + strictEqual(rootDiagnostics[0].code.target.authority, "oxc.rs"); + strictEqual(rootDiagnostics[0].severity, DiagnosticSeverity.Warning); + + // Nested folder uses oxlint.config.ts with error + strictEqual(nestedDiagnostics.length, 1); + assert(typeof nestedDiagnostics[0].code == "object"); + strictEqual(nestedDiagnostics[0].code.target.authority, "oxc.rs"); + strictEqual(nestedDiagnostics[0].severity, DiagnosticSeverity.Error); + }); + testMultiFolderMode("different diagnostic severity", async () => { await loadFixture("debugger", WORKSPACE_DIR); await loadFixture("debugger_error", WORKSPACE_SECOND_DIR);