Skip to content

Commit aab5233

Browse files
committed
feat: add terraform-fmt and ruff fixers
terraform-fmt: formats .tf files, falls back to tofu if terraform is not available. ruff: runs both ruff check --fix and ruff format.
1 parent e43f889 commit aab5233

File tree

4 files changed

+166
-1
lines changed

4 files changed

+166
-1
lines changed

dist/index.js

Lines changed: 70 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30232,6 +30232,73 @@ var prettierFixer = {
3023230232
}
3023330233
};
3023430234

30235+
// src/fixers/ruff.ts
30236+
import { exec as exec9 } from "node:child_process";
30237+
import { promisify as promisify9 } from "node:util";
30238+
var run9 = promisify9(exec9);
30239+
var DETECT_PATTERNS8 = [
30240+
/ruff check/i,
30241+
/ruff format/i,
30242+
/Found \d+ errors?.*\[.*fixable/i,
30243+
/would reformat/i,
30244+
/\d+ files? would be reformatted/i
30245+
];
30246+
var ruffFixer = {
30247+
name: "ruff",
30248+
detect(log) {
30249+
return DETECT_PATTERNS8.some((p) => p.test(log));
30250+
},
30251+
async fix(cwd) {
30252+
try {
30253+
await run9("ruff check --fix .", { cwd });
30254+
} catch {}
30255+
try {
30256+
await run9("ruff format .", { cwd });
30257+
} catch {}
30258+
const { stdout: status } = await run9("git diff --name-only", { cwd });
30259+
const files = status.trim().split(`
30260+
`).filter(Boolean);
30261+
return {
30262+
summary: files.length > 0 ? `Auto-fixed ruff issues in ${files.length} file(s)` : "ruff ran but produced no changes",
30263+
filesChanged: files.length
30264+
};
30265+
}
30266+
};
30267+
30268+
// src/fixers/terraform-fmt.ts
30269+
import { exec as exec10 } from "node:child_process";
30270+
import { promisify as promisify10 } from "node:util";
30271+
var run10 = promisify10(exec10);
30272+
var DETECT_PATTERNS9 = [
30273+
/terraform fmt/i,
30274+
/tofu fmt/i,
30275+
/\.tf.*incorrect/i,
30276+
/files need formatting/i,
30277+
/Run terraform fmt/i
30278+
];
30279+
var terraformFmtFixer = {
30280+
name: "terraform-fmt",
30281+
detect(log) {
30282+
return DETECT_PATTERNS9.some((p) => p.test(log));
30283+
},
30284+
async fix(cwd) {
30285+
try {
30286+
await run10("terraform fmt -recursive", { cwd });
30287+
} catch {
30288+
try {
30289+
await run10("tofu fmt -recursive", { cwd });
30290+
} catch {}
30291+
}
30292+
const { stdout: status } = await run10("git diff --name-only", { cwd });
30293+
const files = status.trim().split(`
30294+
`).filter(Boolean);
30295+
return {
30296+
summary: files.length > 0 ? `Formatted ${files.length} file(s) with terraform fmt` : "terraform fmt ran but all files were already formatted",
30297+
filesChanged: files.length
30298+
};
30299+
}
30300+
};
30301+
3023530302
// src/fixers/index.ts
3023630303
var builtinFixers = [
3023730304
cargoFmtFixer,
@@ -30240,7 +30307,9 @@ var builtinFixers = [
3024030307
lockfileFixer,
3024130308
oxfmtFixer,
3024230309
oxlintFixer,
30243-
prettierFixer
30310+
prettierFixer,
30311+
ruffFixer,
30312+
terraformFmtFixer
3024430313
];
3024530314

3024630315
// src/index.ts

src/fixers/index.ts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,8 @@ import { lockfileFixer } from "./lockfile.js";
66
import { oxfmtFixer } from "./oxfmt.js";
77
import { oxlintFixer } from "./oxlint.js";
88
import { prettierFixer } from "./prettier.js";
9+
import { ruffFixer } from "./ruff.js";
10+
import { terraformFmtFixer } from "./terraform-fmt.js";
911

1012
export const builtinFixers: Fixer[] = [
1113
cargoFmtFixer,
@@ -15,6 +17,8 @@ export const builtinFixers: Fixer[] = [
1517
oxfmtFixer,
1618
oxlintFixer,
1719
prettierFixer,
20+
ruffFixer,
21+
terraformFmtFixer,
1822
];
1923

2024
export {
@@ -25,4 +29,6 @@ export {
2529
oxfmtFixer,
2630
oxlintFixer,
2731
prettierFixer,
32+
ruffFixer,
33+
terraformFmtFixer,
2834
};

src/fixers/ruff.ts

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
import { exec } from "node:child_process";
2+
import { promisify } from "node:util";
3+
import type { Fixer, FixResult } from "../core/types.js";
4+
5+
const run = promisify(exec);
6+
7+
const DETECT_PATTERNS = [
8+
/ruff check/i,
9+
/ruff format/i,
10+
/Found \d+ errors?.*\[.*fixable/i,
11+
/would reformat/i,
12+
/\d+ files? would be reformatted/i,
13+
];
14+
15+
export const ruffFixer: Fixer = {
16+
name: "ruff",
17+
18+
detect(log: string): boolean {
19+
return DETECT_PATTERNS.some((p) => p.test(log));
20+
},
21+
22+
async fix(cwd: string): Promise<FixResult> {
23+
try {
24+
await run("ruff check --fix .", { cwd });
25+
} catch {
26+
// ruff check --fix exits non-zero if unfixable errors remain
27+
}
28+
29+
try {
30+
await run("ruff format .", { cwd });
31+
} catch {
32+
// ruff format can fail if not installed
33+
}
34+
35+
const { stdout: status } = await run("git diff --name-only", { cwd });
36+
const files = status.trim().split("\n").filter(Boolean);
37+
38+
return {
39+
summary:
40+
files.length > 0
41+
? `Auto-fixed ruff issues in ${files.length} file(s)`
42+
: "ruff ran but produced no changes",
43+
filesChanged: files.length,
44+
};
45+
},
46+
};

src/fixers/terraform-fmt.ts

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
import { exec } from "node:child_process";
2+
import { promisify } from "node:util";
3+
import type { Fixer, FixResult } from "../core/types.js";
4+
5+
const run = promisify(exec);
6+
7+
const DETECT_PATTERNS = [
8+
/terraform fmt/i,
9+
/tofu fmt/i,
10+
/\.tf.*incorrect/i,
11+
/files need formatting/i,
12+
/Run terraform fmt/i,
13+
];
14+
15+
export const terraformFmtFixer: Fixer = {
16+
name: "terraform-fmt",
17+
18+
detect(log: string): boolean {
19+
return DETECT_PATTERNS.some((p) => p.test(log));
20+
},
21+
22+
async fix(cwd: string): Promise<FixResult> {
23+
try {
24+
await run("terraform fmt -recursive", { cwd });
25+
} catch {
26+
try {
27+
await run("tofu fmt -recursive", { cwd });
28+
} catch {
29+
// neither terraform nor tofu available
30+
}
31+
}
32+
33+
const { stdout: status } = await run("git diff --name-only", { cwd });
34+
const files = status.trim().split("\n").filter(Boolean);
35+
36+
return {
37+
summary:
38+
files.length > 0
39+
? `Formatted ${files.length} file(s) with terraform fmt`
40+
: "terraform fmt ran but all files were already formatted",
41+
filesChanged: files.length,
42+
};
43+
},
44+
};

0 commit comments

Comments
 (0)