tsc-path-fix
Version:
Zero-runtime TypeScript path resolver - converts aliases to relative paths at compile time. Fast, lightweight, with native watch mode.
98 lines • 4.42 kB
JavaScript
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
return new (P || (P = Promise))(function (resolve, reject) {
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
step((generator = generator.apply(thisArg, _arguments || [])).next());
});
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.streamProcessFile = streamProcessFile;
exports.fileContainsPattern = fileContainsPattern;
const fs = require("fs");
const fs_1 = require("fs");
const util_1 = require("util");
const stream_1 = require("stream");
const string_decoder_1 = require("string_decoder");
const pipeline = (0, util_1.promisify)(stream_1.pipeline);
const stat = (0, util_1.promisify)(fs.stat);
function streamProcessFile(filePath, transformFn) {
return __awaiter(this, void 0, void 0, function* () {
const stats = yield stat(filePath);
if (stats.size < 1024 * 1024) {
const content = yield fs.promises.readFile(filePath, 'utf8');
const transformed = transformFn(content);
if (content !== transformed) {
yield fs.promises.writeFile(filePath, transformed, 'utf8');
}
return;
}
const tempFilePath = `${filePath}.temp`;
const readStream = (0, fs_1.createReadStream)(filePath, { encoding: 'utf8' });
const writeStream = (0, fs_1.createWriteStream)(tempFilePath, { encoding: 'utf8' });
const decoder = new string_decoder_1.StringDecoder('utf8');
let pendingChunk = '';
try {
yield new Promise((resolve, reject) => {
readStream.on('data', (chunk) => {
try {
const chunkStr = pendingChunk + decoder.write(chunk);
const splitAt = Math.max(0, chunkStr.length - 4);
const processChunk = chunkStr.substring(0, splitAt);
pendingChunk = chunkStr.substring(splitAt);
const transformedChunk = transformFn(processChunk);
writeStream.write(transformedChunk);
}
catch (err) {
reject(err);
}
});
readStream.on('end', () => {
if (pendingChunk) {
const finalChunk = pendingChunk + decoder.end();
const transformedFinal = transformFn(finalChunk);
writeStream.write(transformedFinal);
}
writeStream.end();
resolve();
});
readStream.on('error', reject);
writeStream.on('error', reject);
});
yield fs.promises.rename(tempFilePath, filePath);
}
catch (error) {
if (fs.existsSync(tempFilePath)) {
yield fs.promises.unlink(tempFilePath).catch(() => { });
}
throw error;
}
});
}
function fileContainsPattern(filePath, pattern) {
return __awaiter(this, void 0, void 0, function* () {
const readStream = (0, fs_1.createReadStream)(filePath, { encoding: 'utf8' });
const decoder = new string_decoder_1.StringDecoder('utf8');
let buffer = '';
return new Promise((resolve, reject) => {
readStream.on('data', (chunk) => {
buffer += decoder.write(chunk);
if (pattern.test(buffer)) {
readStream.destroy();
resolve(true);
}
if (buffer.length > 8192) {
buffer = buffer.substring(buffer.length - 4096);
}
});
readStream.on('end', () => {
buffer += decoder.end();
resolve(pattern.test(buffer));
});
readStream.on('error', reject);
});
});
}
//# sourceMappingURL=stream-utils.js.map
;