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.
This commit is contained in:
2022-07-28 00:17:06 +01:00
parent 9d8b8d769d
commit ed8459004d
2 changed files with 51 additions and 0 deletions

View File

@@ -28,6 +28,7 @@ SYMLINKS=(
irbrc
peco
powconfig
prettierrc.js
pryrc
reek.yml
rspec

50
prettierrc.js Normal file
View File

@@ -0,0 +1,50 @@
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`),
};