60 lines
1.7 KiB
JavaScript
60 lines
1.7 KiB
JavaScript
"use strict";
|
|
|
|
const fs = require("fs");
|
|
const path = require("path");
|
|
|
|
const editorconfig = require("editorconfig");
|
|
const mem = require("mem");
|
|
const editorConfigToPrettier = require("editorconfig-to-prettier");
|
|
const findProjectRoot = require("find-project-root");
|
|
|
|
const maybeParse = (filePath, config, parse) => {
|
|
// findProjectRoot will throw an error if we pass a nonexistent directory to
|
|
// it, which is possible, for example, when the path is given via
|
|
// --stdin-filepath. So, first, traverse up until we find an existing
|
|
// directory.
|
|
let dirPath = path.dirname(path.resolve(filePath));
|
|
const fsRoot = path.parse(dirPath).root;
|
|
while (dirPath !== fsRoot && !fs.existsSync(dirPath)) {
|
|
dirPath = path.dirname(dirPath);
|
|
}
|
|
const root = findProjectRoot(dirPath);
|
|
return filePath && parse(filePath, { root });
|
|
};
|
|
|
|
const editorconfigAsyncNoCache = (filePath, config) => {
|
|
return Promise.resolve(maybeParse(filePath, config, editorconfig.parse)).then(
|
|
editorConfigToPrettier
|
|
);
|
|
};
|
|
const editorconfigAsyncWithCache = mem(editorconfigAsyncNoCache);
|
|
|
|
const editorconfigSyncNoCache = (filePath, config) => {
|
|
return editorConfigToPrettier(
|
|
maybeParse(filePath, config, editorconfig.parseSync)
|
|
);
|
|
};
|
|
const editorconfigSyncWithCache = mem(editorconfigSyncNoCache);
|
|
|
|
function getLoadFunction(opts) {
|
|
if (!opts.editorconfig) {
|
|
return () => null;
|
|
}
|
|
|
|
if (opts.sync) {
|
|
return opts.cache ? editorconfigSyncWithCache : editorconfigSyncNoCache;
|
|
}
|
|
|
|
return opts.cache ? editorconfigAsyncWithCache : editorconfigAsyncNoCache;
|
|
}
|
|
|
|
function clearCache() {
|
|
mem.clear(editorconfigSyncWithCache);
|
|
mem.clear(editorconfigAsyncWithCache);
|
|
}
|
|
|
|
module.exports = {
|
|
getLoadFunction,
|
|
clearCache
|
|
};
|