Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
90 changes: 64 additions & 26 deletions packages/rstack/src/fmt/runner.ts
Original file line number Diff line number Diff line change
@@ -1,41 +1,79 @@
import type { FmtExitCode, FmtFileResult, FmtRunResult, RunFmtFilesOptions } from './types.ts';
import type {
FmtExitCode,
FmtFileRequest,
FmtFileResult,
FmtRunResult,
RunFmtFilesOptions,
} from './types.ts';
import { formatFileSerial } from './serial.ts';

const runFmtFiles = async ({ files, mode }: RunFmtFilesOptions): Promise<FmtRunResult> => {
/** Formats one file and reports whether its contents differ. */
type FormatFile = (file: FmtFileRequest, shouldWrite: boolean) => Promise<boolean>;

/** Converts a formatter outcome into the shared per-file result. */
const runFmtFile = async (
file: FmtFileRequest,
shouldWrite: boolean,
formatFile: FormatFile,
): Promise<FmtFileResult> => {
const startTime = performance.now();
const shouldWrite = mode === 'write';

try {
const changed = await formatFile(file, shouldWrite);

return {
path: file.path,
status: changed ? (shouldWrite ? 'written' : 'different') : 'unchanged',
durationMs: performance.now() - startTime,
};
} catch (error) {
return {
path: file.path,
status: 'error',
error,
durationMs: performance.now() - startTime,
};
}
};

/** Processes files sequentially while preserving input order. */
const runFmtFilesSerial = async (
files: FmtFileRequest[],
shouldWrite: boolean,
): Promise<FmtFileResult[]> => {
const results: FmtFileResult[] = [];

for (const file of files) {
results.push(await runFmtFile(file, shouldWrite, formatFileSerial));
}

return results;
};

/** Maps file results to the Prettier-compatible CLI exit code. */
const getFmtExitCode = (files: FmtFileResult[]): FmtExitCode => {
let exitCode: FmtExitCode = 0;

for (const file of files) {
const fileStartTime = performance.now();

try {
const changed = await formatFileSerial(file, shouldWrite);

if (changed && !shouldWrite && exitCode === 0) {
exitCode = 1;
}

results.push({
path: file.path,
status: changed ? (shouldWrite ? 'written' : 'different') : 'unchanged',
durationMs: performance.now() - fileStartTime,
});
} catch (error) {
exitCode = 2;
results.push({
path: file.path,
status: 'error',
error,
durationMs: performance.now() - fileStartTime,
});
if (file.status === 'error') {
return 2;
}
if (file.status === 'different') {
exitCode = 1;
}
}

return exitCode;
};

/** Runs resolved files and summarizes their outcomes for the CLI. */
const runFmtFiles = async ({ files, mode }: RunFmtFilesOptions): Promise<FmtRunResult> => {
const startTime = performance.now();
const results = await runFmtFilesSerial(files, mode === 'write');

return {
files: results,
exitCode,
exitCode: getFmtExitCode(results),
durationMs: performance.now() - startTime,
};
};
Comment thread
chenjiahan marked this conversation as resolved.
Expand Down