diff --git a/packages/@vue/cli-service/lib/Service.js b/packages/@vue/cli-service/lib/Service.js index 4fb59cd8a5..a477177a07 100644 --- a/packages/@vue/cli-service/lib/Service.js +++ b/packages/@vue/cli-service/lib/Service.js @@ -7,7 +7,7 @@ const PluginAPI = require('./PluginAPI') const dotenv = require('dotenv') const dotenvExpand = require('dotenv-expand') const defaultsDeep = require('lodash.defaultsdeep') -const { chalk, warn, error, isPlugin, resolvePluginId, loadModule, resolvePkg } = require('@vue/cli-shared-utils') +const { chalk, warn, error, isPlugin, resolvePluginId, loadModule, resolvePkg, resolveModule } = require('@vue/cli-shared-utils') const { defaults, validate } = require('./options') const checkWebpack = require('@vue/cli-service/lib/util/checkWebpack') @@ -143,9 +143,9 @@ module.exports = class Service { } resolvePlugins (inlinePlugins, useBuiltIn) { - const idToPlugin = id => ({ + const idToPlugin = (id, absolutePath) => ({ id: id.replace(/^.\//, 'built-in:'), - apply: require(id) + apply: require(absolutePath || id) }) let plugins @@ -161,7 +161,7 @@ module.exports = class Service { './config/css', './config/prod', './config/app' - ].map(idToPlugin) + ].map((id) => idToPlugin(id)) if (inlinePlugins) { plugins = useBuiltIn !== false @@ -176,16 +176,15 @@ module.exports = class Service { this.pkg.optionalDependencies && id in this.pkg.optionalDependencies ) { - let apply = () => {} - try { - apply = require(id) - } catch (e) { + let apply = loadModule(id, this.pkgContext) + if (!apply) { warn(`Optional dependency ${id} is not installed.`) + apply = () => {} } return { id, apply } } else { - return idToPlugin(id) + return idToPlugin(id, resolveModule(id, this.pkgContext)) } }) plugins = builtInPlugins.concat(projectPlugins) diff --git a/packages/@vue/cli-shared-utils/lib/module.js b/packages/@vue/cli-shared-utils/lib/module.js index b6da0c4298..0af7e406f3 100644 --- a/packages/@vue/cli-shared-utils/lib/module.js +++ b/packages/@vue/cli-shared-utils/lib/module.js @@ -50,6 +50,13 @@ const resolve = semver.satisfies(process.version, '>=10.0.0') : resolveFallback exports.resolveModule = function (request, context) { + // createRequire doesn't work with jest mock modules + // (which we used in migrator for inquirer, and in tests for cli-service) + // TODO: it's supported in Jest 25 + if (process.env.VUE_CLI_TEST && (request.endsWith('migrator') || context === '/')) { + return request + } + let resolvedPath try { try {