@micro-app/plugin-vuepress
Version:
[Plugin] adapter vuepress plugin.
100 lines (86 loc) • 3.88 kB
JavaScript
;
module.exports = function createConfig(api, args, opts) {
const { _, smartMerge } = require('@micro-app/shared-utils');
const path = require('path');
const vuepressConfig = api.vuepressConfig;
const sourceDir = args._ && args._[1] || vuepressConfig.sourceDir || '.';
const root = vuepressConfig.root;
vuepressConfig.sourceDir = path.resolve(root, sourceDir);
const loadConfig = require('@vuepress/core/lib/node/loadConfig');
// const vuepressDir = api.resolveWorkspace('.vuepress'); // 不能使用,vuepress内部代码太乱
const vuepressDir = path.resolve(vuepressConfig.sourceDir, '.vuepress');
const siteConfig = loadConfig(vuepressDir) || {};
const customConfig = require('../config');
const config = smartMerge({}, customConfig, siteConfig, vuepressConfig, opts, _.pick(args, [ 'base' ]));
config.root = root;
// reset vuepressDir
config.vuepressDir = vuepressDir;
config.cacheDir = path.resolve(api.tempDir, '.cache');
// reset dest
config.dest = path.resolve(vuepressConfig.sourceDir, config.dest);
const options = api.config || {};
const resolveAlias = options.resolveAlias || {};
const resolveShared = options.resolveShared || {};
const nodeModulesPaths = options.nodeModulesPaths || [];
api.logger.debug('resolveAlias: ', JSON.stringify(resolveAlias, false, 4));
api.logger.debug('resolveShared: ', JSON.stringify(resolveShared, false, 4));
if (config.chainWebpack && _.isFunction(config.chainWebpack)) {
const orginalChainWebpack = config.chainWebpack;
config.chainWebpack = function(_config, isServer) {
if (isServer) {
orginalChainWebpack(injectWebpackAlias(_config, resolveShared, nodeModulesPaths), isServer);
} else {
orginalChainWebpack(injectWebpackAlias(_config, resolveAlias, nodeModulesPaths), isServer);
}
// if (api.hasKey('resolveWebpackChain')) {
// api.resolveWebpackChain(_config, isServer);
// }
};
} else {
config.chainWebpack = function(_config, isServer) {
if (isServer) {
injectWebpackAlias(_config, resolveShared, nodeModulesPaths);
} else {
injectWebpackAlias(_config, resolveAlias, nodeModulesPaths);
}
// if (api.hasKey('resolveWebpackChain')) {
// api.resolveWebpackChain(_config, isServer);
// }
};
}
if (config.configureWebpack && _.isFunction(config.configureWebpack)) {
const orginalConfigWebpack = config.configureWebpack;
config.configureWebpack = function(config, isServer) {
if (api.hasKey('resolveWebpackConfig')) {
api.resolveWebpackConfig(config, isServer);
}
return orginalConfigWebpack(config, isServer);
};
} else {
config.chainWebpack = function(config, isServer) {
if (api.hasKey('resolveWebpackConfig')) {
return api.resolveWebpackConfig(config, isServer);
}
return config;
};
}
// watcher
config.extraWatchFiles = (config.extraWatchFiles || []).concat(
require('../constants').FILENAMES.map(filename => path.resolve(api.root, filename))
);
// blog
const blogConfig = config.themeConfig && config.themeConfig.blogConfig || {};
const postsDir = blogConfig.postsDir || 'posts';
config.extraWatchFiles.push(postsDir); // add watcher files
api.logger.debug('vuepressConfig: ', JSON.stringify(config, false, 4));
return config;
};
function injectWebpackAlias(config, alias, nodeModulesPaths) {
config.resolve
.modules
.merge(nodeModulesPaths)
.end()
.alias
.merge(alias);
return config;
}