@riddance/env
Version:
88 lines • 15.2 kB
JavaScript
import { ESLint } from 'eslint';
import { readFile, rename, unlink, writeFile } from 'node:fs/promises';
import { basename, dirname, extname, join, relative } from 'node:path';
export function makeCache(path) {
return new ESLint({ cwd: path, globInputPaths: false });
}
export async function lint(reporter, path, files, cache) {
const results = await cache.lintFiles(files);
if (reporter) {
for (const result of results) {
for (const msg of result.messages) {
reporter.error(msg.message, relative(path, result.filePath), msg.line, msg.column);
}
}
const deprecations = results
.flatMap(r => r.usedDeprecatedRules)
.map(r => r.replacedBy.length === 0
? `${r.ruleId} deprecated`
: `${r.ruleId} deprecated, replaced by ${r.replacedBy.join(',')}`);
if (deprecations.length !== 0) {
for (const message of new Set(deprecations)) {
reporter.error(message);
}
}
}
return !results.some(r => {
return r.fatalErrorCount + r.errorCount + r.warningCount;
});
}
export async function fixLints(path, files) {
const cache = new ESLint({ cwd: path, fix: true });
const results = await cache.lintFiles(files);
const fixables = results.filter(r => r.output);
if (fixables.length === 0) {
return [];
}
await ESLint.outputFixes(results);
const [changed, mapping] = await kebabCaseFiles(path, results.map(r => relative(path, r.filePath)));
return [...changed, ...fixables.map(r => relative(path, r.filePath))].map(f => mapping.reduce((pv, [, camel, kebab]) => pv.replace(camel, kebab), f));
}
async function kebabCaseFiles(path, files) {
const ext = '.ts';
const sourceFiles = files.filter(f => extname(f) === ext);
const renamed = sourceFiles
.map(f => [dirname(f), basename(f, ext)])
.map(([dir, base]) => {
const kebab = base.replaceAll(/[A-Z]+(?![a-z])|[A-Z]/gu, ($, ofs) => (ofs ? '-' : '') + $.toLowerCase());
return kebab === base ? undefined : [dir, base, kebab];
})
.filter(r => !!r);
if (renamed.length === 0) {
return [[], renamed];
}
const changed = await Promise.all(sourceFiles.map(f => updateImports(path, f, renamed)));
await Promise.all([
...renamed.map(([p, camel, kebab]) => rename(join(path, p, camel + ext), join(path, p, kebab + ext))),
...renamed.flatMap(([p, camel]) => ['.d.ts', '.js'].map(e => ensureUnlinked(join(path, p, camel + e)))),
]);
return [changed.filter(c => c !== undefined), renamed];
}
async function updateImports(path, file, renamed) {
const fp = join(path, file);
const text = await readFile(fp, 'utf-8');
let updated = text;
for (const [, camel, kebab] of renamed) {
updated = updated.replaceAll(new RegExp(`import (.+) from '\\.(.*)/${camel}.js'`, 'gu'), (_, i, p) => `import ${i} from '.${p}/${kebab}.js'`);
}
if (updated !== text) {
await writeFile(fp, updated, 'utf-8');
return file;
}
return undefined;
}
async function ensureUnlinked(path) {
try {
await unlink(path);
}
catch (e) {
if (isFileNotFound(e)) {
return;
}
throw e;
}
}
function isFileNotFound(e) {
return e?.code === 'ENOENT';
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGludGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsibGludGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxRQUFRLENBQUE7QUFDL0IsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBRSxNQUFNLGtCQUFrQixDQUFBO0FBQ3RFLE9BQU8sRUFBRSxRQUFRLEVBQUUsT0FBTyxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLE1BQU0sV0FBVyxDQUFBO0FBR3RFLE1BQU0sVUFBVSxTQUFTLENBQUMsSUFBWTtJQUNsQyxPQUFPLElBQUksTUFBTSxDQUFDLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxjQUFjLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQTtBQUMzRCxDQUFDO0FBRUQsTUFBTSxDQUFDLEtBQUssVUFBVSxJQUFJLENBQ3RCLFFBQThCLEVBQzlCLElBQVksRUFDWixLQUFlLEVBQ2YsS0FBYTtJQUViLE1BQU0sT0FBTyxHQUFHLE1BQU0sS0FBSyxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQTtJQUM1QyxJQUFJLFFBQVEsRUFBRSxDQUFDO1FBQ1gsS0FBSyxNQUFNLE1BQU0sSUFBSSxPQUFPLEVBQUUsQ0FBQztZQUMzQixLQUFLLE1BQU0sR0FBRyxJQUFJLE1BQU0sQ0FBQyxRQUFRLEVBQUUsQ0FBQztnQkFDaEMsUUFBUSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsT0FBTyxFQUFFLFFBQVEsQ0FBQyxJQUFJLEVBQUUsTUFBTSxDQUFDLFFBQVEsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxJQUFJLEVBQUUsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFBO1lBQ3RGLENBQUM7UUFDTCxDQUFDO1FBQ0QsTUFBTSxZQUFZLEdBQUcsT0FBTzthQUN2QixPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsbUJBQW1CLENB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LElBQVk7SUFDdEMsSUFBSSxDQUFDO1FBQ0QsTUFBTSxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUE7SUFDdEIsQ0FBQztJQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7UUFDVCxJQUFJLGNBQWMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1lBQ3BCLE9BQU07UUFDVixDQUFDO1FBQ0QsTUFBTSxDQUFDLENBQUE7SUFDWCxDQUFDO0FBQ0wsQ0FBQztBQUVELFNBQVMsY0FBYyxDQUFDLENBQVU7SUFDOUIsT0FBUSxDQUFvQyxFQUFFLElBQUksS0FBSyxRQUFRLENBQUE7QUFDbkUsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEVTTGludCB9IGZyb20gJ2VzbGludCdcbmltcG9ydCB7IHJlYWRGaWxlLCByZW5hbWUsIHVubGluaywgd3JpdGVGaWxlIH0gZnJvbSAnbm9kZTpmcy9wcm9taXNlcydcbmltcG9ydCB7IGJhc2VuYW1lLCBkaXJuYW1lLCBleHRuYW1lLCBqb2luLCByZWxhdGl2ZSB9IGZyb20gJ25vZGU6cGF0aCdcbmltcG9ydCB7IFJlcG9ydGVyIH0gZnJvbSAnLi9yZXBvcnRlci5qcydcblxuZXhwb3J0IGZ1bmN0aW9uIG1ha2VDYWNoZShwYXRoOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gbmV3IEVTTGludCh7IGN3ZDogcGF0aCwgZ2xvYklucHV0UGF0aHM6IGZhbHNlIH0pXG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBsaW50KFxuICAgIHJlcG9ydGVyOiBSZXBvcnRlciB8IHVuZGVmaW5lZCxcbiAgICBwYXRoOiBzdHJpbmcsXG4gICAgZmlsZXM6IHN0cmluZ1tdLFxuICAgIGNhY2hlOiBFU0xpbnQsXG4pIHtcbiAgICBjb25zdCByZXN1bHRzID0gYXdhaXQgY2FjaGUubGludEZpbGVzKGZpbGVzKVxuICAgIGlmIChyZXBvcnRlcikge1xuICAgICAgICBmb3IgKGNvbnN0IHJlc3VsdCBvZiByZXN1bHRzKSB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IG1zZyBvZiByZXN1bHQubWVzc2FnZXMpIHtcbiAgICAgICAgICAgICAgICByZXBvcnRlci5lcnJvcihtc2cubWVzc2FnZSwgcmVsYXRpdmUocGF0aCwgcmVzdWx0LmZpbGVQYXRoKSwgbXNnLmxpbmUsIG1zZy5jb2x1bW4pXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZGVwcmVjYXRpb25zID0gcmVzdWx0c1xuICAgICAgICAgICAgLmZsYXRNYXAociA9PiByLnVzZWREZXByZWNhdGVkUnVsZXMpXG4gICAgICAgICAgICAubWFwKHIgPT5cbiAgICAgICAgICAgICAgICByLnJlcGxhY2VkQnkubGVuZ3RoID09PSAwXG4gICAgICAgICAgICAgICAgICAgID8gYCR7ci5ydWxlSWR9IGRlcHJlY2F0ZWRgXG4gICAgICAgICAgICAgICAgICAgIDogYCR7ci5ydWxlSWR9IGRlcHJlY2F0ZWQsIHJlcGxhY2VkIGJ5ICR7ci5yZXBsYWNlZEJ5LmpvaW4oJywnKX1gLFxuICAgICAgICAgICAgKVxuICAgICAgICBpZiAoZGVwcmVjYXRpb25zLmxlbmd0aCAhPT0gMCkge1xuICAgICAgICAgICAgZm9yIChjb25zdCBtZXNzYWdlIG9mIG5ldyBTZXQoZGVwcmVjYXRpb25zKSkge1xuICAgICAgICAgICAgICAgIHJlcG9ydGVyLmVycm9yKG1lc3NhZ2UpXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuICFyZXN1bHRzLnNvbWUociA9PiB7XG4gICAgICAgIHJldHVybiByLmZhdGFsRXJyb3JDb3VudCArIHIuZXJyb3JDb3VudCArIHIud2FybmluZ0NvdW50XG4gICAgfSlcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGZpeExpbnRzKHBhdGg6IHN0cmluZywgZmlsZXM6IHN0cmluZ1tdKSB7XG4gICAgY29uc3QgY2FjaGUgPSBuZXcgRVNMaW50KHsgY3dkOiBwYXRoLCBmaXg6IHRydWUgfSlcbiAgICBjb25zdCByZXN1bHRzID0gYXdhaXQgY2FjaGUubGludEZpbGVzKGZpbGVzKVxuICAgIGNvbnN0IGZpeGFibGVzID0gcmVzdWx0cy5maWx0ZXIociA9PiByLm91dHB1dClcbiAgICBpZiAoZml4YWJsZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHJldHVybiBbXVxuICAgIH1cbiAgICBhd2FpdCBFU0xpbnQub3V0cHV0Rml4ZXMocmVzdWx0cylcbiAgICBjb25zdCBbY2hhbmdlZCwgbWFwcGluZ10gPSBhd2FpdCBrZWJhYkNhc2VGaWxlcyhcbiAgICAgICAgcGF0aCxcbiAgICAgICAgcmVzdWx0cy5tYXAociA9PiByZWxhdGl2ZShwYXRoLCByLmZpbGVQYXRoKSksXG4gICAgKVxuICAgIHJldHVybiBbLi4uY2hhbmdlZCwgLi4uZml4YWJsZXMubWFwKHIgPT4gcmVsYXRpdmUocGF0aCwgci5maWxlUGF0aCkpXS5tYXAoZiA9PlxuICAgICAgICBtYXBwaW5nLnJlZHVjZSgocHYsIFssIGNhbWVsLCBrZWJhYl0pID0+IHB2LnJlcGxhY2UoY2FtZWwsIGtlYmFiKSwgZiksXG4gICAgKVxufVxuXG5hc3luYyBmdW5jdGlvbiBrZWJhYkNhc2VGaWxlcyhwYXRoOiBzdHJpbmcsIGZpbGVzOiBzdHJpbmdbXSkge1xuICAgIGNvbnN0IGV4dCA9ICcudHMnXG4gICAgY29uc3Qgc291cmNlRmlsZXMgPSBmaWxlcy5maWx0ZXIoZiA9PiBleHRuYW1lKGYpID09PSBleHQpXG4gICAgY29uc3QgcmVuYW1lZCA9IHNvdXJjZUZpbGVzXG4gICAgICAgIC5tYXAoZiA9PiBbZGlybmFtZShmKSwgYmFzZW5hbWUoZiwgZXh0KV0gYXMgY29uc3QpXG4gICAgICAgIC5tYXAoKFtkaXIsIGJhc2VdKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBrZWJhYiA9IGJhc2UucmVwbGFjZUFsbChcbiAgICAgICAgICAgICAgICAvW0EtWl0rKD8hW2Etel0pfFtBLVpdL2d1LFxuICAgICAgICAgICAgICAgICgkLCBvZnMpID0+IChvZnMgPyAnLScgOiAnJykgKyAkLnRvTG93ZXJDYXNlKCksXG4gICAgICAgICAgICApXG4gICAgICAgICAgICByZXR1cm4ga2ViYWIgPT09IGJhc2UgPyB1bmRlZmluZWQgOiAoW2RpciwgYmFzZSwga2ViYWJdIGFzIGNvbnN0KVxuICAgICAgICB9KVxuICAgICAgICAuZmlsdGVyKHIgPT4gISFyKVxuICAgIGlmIChyZW5hbWVkLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICByZXR1cm4gW1tdIGFzIHN0cmluZ1tdLCByZW5hbWVkXSBhcyBjb25zdFxuICAgIH1cbiAgICBjb25zdCBjaGFuZ2VkID0gYXdhaXQgUHJvbWlzZS5hbGwoc291cmNlRmlsZXMubWFwKGYgPT4gdXBkYXRlSW1wb3J0cyhwYXRoLCBmLCByZW5hbWVkKSkpXG4gICAgYXdhaXQgUHJvbWlzZS5hbGwoW1xuICAgICAgICAuLi5yZW5hbWVkLm1hcCgoW3AsIGNhbWVsLCBrZWJhYl0pID0+XG4gICAgICAgICAgICByZW5hbWUoam9pbihwYXRoLCBwLCBjYW1lbCArIGV4dCksIGpvaW4ocGF0aCwgcCwga2ViYWIgKyBleHQpKSxcbiAgICAgICAgKSxcbiAgICAgICAgLi4ucmVuYW1lZC5mbGF0TWFwKChbcCwgY2FtZWxdKSA9PlxuICAgICAgICAgICAgWycuZC50cycsICcuanMnXS5tYXAoZSA9PiBlbnN1cmVVbmxpbmtlZChqb2luKHBhdGgsIHAsIGNhbWVsICsgZSkpKSxcbiAgICAgICAgKSxcbiAgICBdKVxuICAgIHJldHVybiBbY2hhbmdlZC5maWx0ZXIoYyA9PiBjICE9PSB1bmRlZmluZWQpLCByZW5hbWVkXSBhcyBjb25zdFxufVxuXG5hc3luYyBmdW5jdGlvbiB1cGRhdGVJbXBvcnRzKFxuICAgIHBhdGg6IHN0cmluZyxcbiAgICBmaWxlOiBzdHJpbmcsXG4gICAgcmVuYW1lZDogKHJlYWRvbmx5IFtzdHJpbmcsIHN0cmluZywgc3RyaW5nXSlbXSxcbikge1xuICAgIGNvbnN0IGZwID0gam9pbihwYXRoLCBmaWxlKVxuICAgIGNvbnN0IHRleHQgPSBhd2FpdCByZWFkRmlsZShmcCwgJ3V0Zi04JylcbiAgICBsZXQgdXBkYXRlZCA9IHRleHRcbiAgICBmb3IgKGNvbnN0IFssIGNhbWVsLCBrZWJhYl0gb2YgcmVuYW1lZCkge1xuICAgICAgICB1cGRhdGVkID0gdXBkYXRlZC5yZXBsYWNlQWxsKFxuICAgICAgICAgICAgbmV3IFJlZ0V4cChgaW1wb3J0ICguKykgZnJvbSAnXFxcXC4oLiopLyR7Y2FtZWx9LmpzJ2AsICdndScpLFxuICAgICAgICAgICAgKF8sIGk6IHN0cmluZywgcDogc3RyaW5nKSA9PiBgaW1wb3J0ICR7aX0gZnJvbSAnLiR7cH0vJHtrZWJhYn0uanMnYCxcbiAgICAgICAgKVxuICAgIH1cbiAgICBpZiAodXBkYXRlZCAhPT0gdGV4dCkge1xuICAgICAgICBhd2FpdCB3cml0ZUZpbGUoZnAsIHVwZGF0ZWQsICd1dGYtOCcpXG4gICAgICAgIHJldHVybiBmaWxlXG4gICAgfVxuICAgIHJldHVybiB1bmRlZmluZWRcbn1cblxuYXN5bmMgZnVuY3Rpb24gZW5zdXJlVW5saW5rZWQocGF0aDogc3RyaW5nKSB7XG4gICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgdW5saW5rKHBhdGgpXG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBpZiAoaXNGaWxlTm90Rm91bmQoZSkpIHtcbiAgICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG4gICAgICAgIHRocm93IGVcbiAgICB9XG59XG5cbmZ1bmN0aW9uIGlzRmlsZU5vdEZvdW5kKGU6IHVua25vd24pIHtcbiAgICByZXR1cm4gKGUgYXMgeyBjb2RlPzogdW5rbm93biB9IHwgdW5kZWZpbmVkKT8uY29kZSA9PT0gJ0VOT0VOVCdcbn1cbiJdfQ==