2017-12-26 04:23:50 +03:00
|
|
|
"use strict";
|
|
|
|
|
2018-05-09 14:17:12 +03:00
|
|
|
const uniqBy = require("lodash.uniqby");
|
|
|
|
const fs = require("fs");
|
|
|
|
const globby = require("globby");
|
|
|
|
const path = require("path");
|
2017-12-26 04:23:50 +03:00
|
|
|
const resolve = require("resolve");
|
2018-05-09 14:17:12 +03:00
|
|
|
const thirdParty = require("./third-party");
|
2018-05-24 21:30:45 +03:00
|
|
|
const internalPlugins = require("./internal-plugins");
|
2019-01-18 17:40:18 +03:00
|
|
|
const partition = require("../utils/partition");
|
2017-12-26 04:23:50 +03:00
|
|
|
|
2018-05-09 14:17:12 +03:00
|
|
|
function loadPlugins(plugins, pluginSearchDirs) {
|
|
|
|
if (!plugins) {
|
|
|
|
plugins = [];
|
|
|
|
}
|
|
|
|
|
|
|
|
if (!pluginSearchDirs) {
|
|
|
|
pluginSearchDirs = [];
|
|
|
|
}
|
|
|
|
// unless pluginSearchDirs are provided, auto-load plugins from node_modules that are parent to Prettier
|
|
|
|
if (!pluginSearchDirs.length) {
|
2018-06-18 19:29:54 +03:00
|
|
|
const autoLoadDir = thirdParty.findParentDir(__dirname, "node_modules");
|
2018-05-09 14:17:12 +03:00
|
|
|
if (autoLoadDir) {
|
|
|
|
pluginSearchDirs = [autoLoadDir];
|
|
|
|
}
|
|
|
|
}
|
2017-12-26 04:23:50 +03:00
|
|
|
|
2019-01-18 17:40:18 +03:00
|
|
|
const [externalPluginNames, externalPluginInstances] = partition(
|
|
|
|
plugins,
|
|
|
|
plugin => typeof plugin === "string"
|
|
|
|
);
|
|
|
|
|
|
|
|
const externalManualLoadPluginInfos = externalPluginNames.map(pluginName => {
|
2018-05-10 03:27:41 +03:00
|
|
|
let requirePath;
|
|
|
|
try {
|
|
|
|
// try local files
|
|
|
|
requirePath = resolve.sync(path.resolve(process.cwd(), pluginName));
|
|
|
|
} catch (e) {
|
|
|
|
// try node modules
|
|
|
|
requirePath = resolve.sync(pluginName, { basedir: process.cwd() });
|
|
|
|
}
|
|
|
|
return {
|
|
|
|
name: pluginName,
|
|
|
|
requirePath
|
|
|
|
};
|
|
|
|
});
|
2018-05-09 14:17:12 +03:00
|
|
|
|
|
|
|
const externalAutoLoadPluginInfos = pluginSearchDirs
|
|
|
|
.map(pluginSearchDir => {
|
|
|
|
const resolvedPluginSearchDir = path.resolve(
|
|
|
|
process.cwd(),
|
|
|
|
pluginSearchDir
|
|
|
|
);
|
|
|
|
|
2018-05-10 03:27:41 +03:00
|
|
|
if (!isDirectory(resolvedPluginSearchDir)) {
|
2018-05-09 14:17:12 +03:00
|
|
|
throw new Error(
|
|
|
|
`${pluginSearchDir} does not exist or is not a directory`
|
|
|
|
);
|
2018-01-05 13:09:51 +03:00
|
|
|
}
|
|
|
|
|
2018-05-09 14:17:12 +03:00
|
|
|
const nodeModulesDir = path.resolve(
|
|
|
|
resolvedPluginSearchDir,
|
|
|
|
"node_modules"
|
|
|
|
);
|
2018-01-05 13:09:51 +03:00
|
|
|
|
2018-05-09 14:17:12 +03:00
|
|
|
return findPluginsInNodeModules(nodeModulesDir).map(pluginName => ({
|
|
|
|
name: pluginName,
|
|
|
|
requirePath: resolve.sync(pluginName, {
|
|
|
|
basedir: resolvedPluginSearchDir
|
|
|
|
})
|
|
|
|
}));
|
|
|
|
})
|
|
|
|
.reduce((a, b) => a.concat(b), []);
|
|
|
|
|
|
|
|
const externalPlugins = uniqBy(
|
|
|
|
externalManualLoadPluginInfos.concat(externalAutoLoadPluginInfos),
|
|
|
|
"requirePath"
|
2019-01-18 17:40:18 +03:00
|
|
|
)
|
|
|
|
.map(externalPluginInfo =>
|
|
|
|
Object.assign(
|
|
|
|
{ name: externalPluginInfo.name },
|
|
|
|
eval("require")(externalPluginInfo.requirePath)
|
|
|
|
)
|
2018-05-09 14:17:12 +03:00
|
|
|
)
|
2019-01-18 17:40:18 +03:00
|
|
|
.concat(externalPluginInstances);
|
2018-05-09 14:17:12 +03:00
|
|
|
|
|
|
|
return internalPlugins.concat(externalPlugins);
|
2018-01-05 13:09:51 +03:00
|
|
|
}
|
2017-12-26 16:04:09 +03:00
|
|
|
|
2018-05-09 14:17:12 +03:00
|
|
|
function findPluginsInNodeModules(nodeModulesDir) {
|
|
|
|
const pluginPackageJsonPaths = globby.sync(
|
|
|
|
["prettier-plugin-*/package.json", "@prettier/plugin-*/package.json"],
|
|
|
|
{ cwd: nodeModulesDir }
|
2018-01-05 13:09:51 +03:00
|
|
|
);
|
2018-05-09 14:17:12 +03:00
|
|
|
return pluginPackageJsonPaths.map(path.dirname);
|
2018-01-05 13:09:51 +03:00
|
|
|
}
|
2017-12-26 04:23:50 +03:00
|
|
|
|
2018-05-09 14:17:12 +03:00
|
|
|
function isDirectory(dir) {
|
|
|
|
try {
|
|
|
|
return fs.statSync(dir).isDirectory();
|
|
|
|
} catch (e) {
|
|
|
|
return false;
|
2018-01-05 13:09:51 +03:00
|
|
|
}
|
2017-12-26 04:23:50 +03:00
|
|
|
}
|
|
|
|
module.exports = loadPlugins;
|