Files
dotfiles/prettierrc.js
Jim Myhrberg ed8459004d fix(node/prettier): dirty hack to allow prettier to find plugins installed with volta
Volta installs all global packages into their own separate sandbox, with
no other packages installed in the same node_modules directory.

This hack abuses the fact that prettier can be configured with a *.js
file, and effectively scans the volta installation directory for
sandboxes for prettier plugins, and sets anything it finds as the
"pluginSearchDirs" list.
2022-07-28 00:17:06 +01:00

51 lines
1.1 KiB
JavaScript

const homedir = require('os').homedir();
const fs = require("fs");
function voltaPrettierSearchDirs(voltaDir) {
const packagesDir = `${voltaDir}/tools/image/packages`;
let paths = []
let parents = [];
fs.readdirSync(packagesDir).forEach((item) => {
if (/^prettier-plugin-[^/]+$/.test(item)) {
paths.push(`${packagesDir}/${item}/lib`);
}
if (item == '@prettier') {
paths = paths.concat(
findDirs(`${packagesDir}/@prettier`, /^plugin-[^/]+$/, "lib")
);
} else if (/^@[^/]+$/.test(item)) {
parents.push(`${packagesDir}/${item}`);
}
return [];
})
parents.forEach((parent) => {
paths = paths.concat(findDirs(parent, /^prettier-plugin-[^/]+$/, "lib"));
})
return paths;
}
function findDirs(parent, pattern, suffix) {
return fs.readdirSync(parent).flatMap((item) => {
const fp = `${parent}/${item}`;
if (pattern.test(item) && fs.statSync(fp).isDirectory()) {
if (suffix) {
return `${fp}/${suffix}`;
}
return fp;
}
return [];
});
}
module.exports = {
pluginSearchDirs: voltaPrettierSearchDirs(`${homedir}/.volta`),
};