Chore: skip file writing stream

This commit is contained in:
SukkaW
2026-08-01 13:22:58 +08:00
parent b3bcec6de6
commit 76bb899102

View File

@@ -1,4 +1,3 @@
import { asyncWriteToStream } from 'foxts/async-write-to-stream';
import { fastStringArrayJoin } from 'foxts/fast-string-array-join'; import { fastStringArrayJoin } from 'foxts/fast-string-array-join';
import fs from 'node:fs'; import fs from 'node:fs';
import picocolors from 'picocolors'; import picocolors from 'picocolors';
@@ -6,7 +5,6 @@ import type { Span } from '../trace';
import { readFileByLine } from './fetch-text-by-line'; import { readFileByLine } from './fetch-text-by-line';
import { writeFile } from './misc'; import { writeFile } from './misc';
import { createCompareSource, fileEqualWithCommentComparator } from 'foxts/compare-source'; import { createCompareSource, fileEqualWithCommentComparator } from 'foxts/compare-source';
import { promisify } from 'node:util';
import { extractContentHashFromFile } from './content-hash'; import { extractContentHashFromFile } from './content-hash';
const fileEqual = createCompareSource(fileEqualWithCommentComparator); const fileEqual = createCompareSource(fileEqualWithCommentComparator);
@@ -49,26 +47,12 @@ export async function compareAndWriteFile(span: Span, linesA: string[], filePath
return; return;
} }
return span.traceChildAsync<void>(`writing ${filePath}`, async () => { return writeFileLines(span, linesA, filePath);
const linesALen = linesA.length;
// The default highwater mark is normally 16384,
// So we make sure direct write to file if the content is
// most likely less than 250 lines
if (linesALen < 250) {
return writeFile(filePath, fastStringArrayJoin(linesA, '\n'));
} }
const writeStream = fs.createWriteStream(filePath); export function writeFileLines(span: Span, linesA: string[], filePath: string): Promise<void> {
for (let i = 0; i < linesALen; i++) { return span.traceChildAsync<void>(
const p = asyncWriteToStream(writeStream, linesA[i] + '\n'); `writing ${filePath}`,
// eslint-disable-next-line no-await-in-loop -- stream high water mark () => writeFile(filePath, fastStringArrayJoin(linesA, '\n') + '\n')
if (p) await p; );
}
await new Promise<void>(resolve => {
// Since we previously poped the last empty line for comparison, we need to add it back here to ensure final EOF line
writeStream.end(resolve);
});
await promisify(writeStream.close.bind(writeStream))();
});
} }