From d52a8cf6c86b6cffe8e8998b9a429ce1aec0e82d Mon Sep 17 00:00:00 2001 From: merceyz Date: Sat, 15 Aug 2020 13:24:24 +0200 Subject: [PATCH 1/8] fix: resolve plugins relative to pkgContext --- packages/@vue/cli-service/lib/Service.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/@vue/cli-service/lib/Service.js b/packages/@vue/cli-service/lib/Service.js index 4fb59cd8a5..e97ed415c1 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') @@ -178,14 +178,14 @@ module.exports = class Service { ) { let apply = () => {} try { - apply = require(id) + apply = require(resolveModule(id, this.pkgContext)) } catch (e) { warn(`Optional dependency ${id} is not installed.`) } return { id, apply } } else { - return idToPlugin(id) + return idToPlugin(resolveModule(id, this.pkgContext)) } }) plugins = builtInPlugins.concat(projectPlugins) From 540d91cd256ccb062761b628a1c05ac0c1543e9c Mon Sep 17 00:00:00 2001 From: merceyz Date: Sun, 16 Aug 2020 14:51:18 +0200 Subject: [PATCH 2/8] fix: require.resolve eslint parser --- packages/@vue/cli-plugin-eslint/eslintOptions.js | 3 ++- packages/@vue/cli-plugin-eslint/generator/index.js | 2 +- packages/@vue/cli/lib/Generator.js | 5 +++++ 3 files changed, 8 insertions(+), 2 deletions(-) diff --git a/packages/@vue/cli-plugin-eslint/eslintOptions.js b/packages/@vue/cli-plugin-eslint/eslintOptions.js index c469b50f6c..35b8aa2307 100644 --- a/packages/@vue/cli-plugin-eslint/eslintOptions.js +++ b/packages/@vue/cli-plugin-eslint/eslintOptions.js @@ -14,7 +14,7 @@ exports.config = (api, preset, rootOptions = {}) => { if (api.hasPlugin('babel') && !api.hasPlugin('typescript')) { config.parserOptions = { - parser: '@babel/eslint-parser' + parser: makeJSOnlyValue(`require.resolve('@babel/eslint-parser')`) } } @@ -59,6 +59,7 @@ function makeJSOnlyValue (str) { fn.__expression = str return fn } +exports.makeJSOnlyValue = makeJSOnlyValue const baseExtensions = ['.js', '.jsx', '.vue'] exports.extensions = api => api.hasPlugin('typescript') diff --git a/packages/@vue/cli-plugin-eslint/generator/index.js b/packages/@vue/cli-plugin-eslint/generator/index.js index a3975e6047..43dc1e170f 100644 --- a/packages/@vue/cli-plugin-eslint/generator/index.js +++ b/packages/@vue/cli-plugin-eslint/generator/index.js @@ -97,7 +97,7 @@ module.exports.applyTS = api => { eslintConfig: { extends: ['@vue/typescript'], parserOptions: { - parser: '@typescript-eslint/parser' + parser: require('../eslintOptions').makeJSOnlyValue(`require.resolve('@typescript-eslint/parser')`) } }, devDependencies: require('../eslintDeps').DEPS_MAP.typescript diff --git a/packages/@vue/cli/lib/Generator.js b/packages/@vue/cli/lib/Generator.js index ed60ff84d2..b83bb440ae 100644 --- a/packages/@vue/cli/lib/Generator.js +++ b/packages/@vue/cli/lib/Generator.js @@ -241,6 +241,11 @@ module.exports = class Generator { // project-wide configuration even to dependencies. // TODO: this can be removed when Babel supports root: true in package.json extract('babel') + + // Always extract .eslintrc.js as the parser needs to be require.resolve'ed + // since ESLint doesn't resolve things from where it's declared + // TODO: this can be removed when ESLint starts resolving things correctly + extract('eslint') } } From 2687ca784e678b7f79d07454624cef505cd68aa0 Mon Sep 17 00:00:00 2001 From: merceyz Date: Wed, 4 Nov 2020 22:49:27 +0100 Subject: [PATCH 3/8] test: fix service tests --- packages/@vue/cli-shared-utils/lib/module.js | 7 +++++++ 1 file changed, 7 insertions(+) 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 { From c4731545f3da862ba0ebd6a7950b0cdd70f10d9d Mon Sep 17 00:00:00 2001 From: merceyz Date: Wed, 4 Nov 2020 22:57:21 +0100 Subject: [PATCH 4/8] Revert "fix: require.resolve eslint parser" This reverts commit 3a0caa684868b92c7a2d1dc9bcce75f9b54afcef. --- packages/@vue/cli-plugin-eslint/eslintOptions.js | 3 +-- packages/@vue/cli-plugin-eslint/generator/index.js | 2 +- packages/@vue/cli/lib/Generator.js | 5 ----- 3 files changed, 2 insertions(+), 8 deletions(-) diff --git a/packages/@vue/cli-plugin-eslint/eslintOptions.js b/packages/@vue/cli-plugin-eslint/eslintOptions.js index 35b8aa2307..c469b50f6c 100644 --- a/packages/@vue/cli-plugin-eslint/eslintOptions.js +++ b/packages/@vue/cli-plugin-eslint/eslintOptions.js @@ -14,7 +14,7 @@ exports.config = (api, preset, rootOptions = {}) => { if (api.hasPlugin('babel') && !api.hasPlugin('typescript')) { config.parserOptions = { - parser: makeJSOnlyValue(`require.resolve('@babel/eslint-parser')`) + parser: '@babel/eslint-parser' } } @@ -59,7 +59,6 @@ function makeJSOnlyValue (str) { fn.__expression = str return fn } -exports.makeJSOnlyValue = makeJSOnlyValue const baseExtensions = ['.js', '.jsx', '.vue'] exports.extensions = api => api.hasPlugin('typescript') diff --git a/packages/@vue/cli-plugin-eslint/generator/index.js b/packages/@vue/cli-plugin-eslint/generator/index.js index 43dc1e170f..a3975e6047 100644 --- a/packages/@vue/cli-plugin-eslint/generator/index.js +++ b/packages/@vue/cli-plugin-eslint/generator/index.js @@ -97,7 +97,7 @@ module.exports.applyTS = api => { eslintConfig: { extends: ['@vue/typescript'], parserOptions: { - parser: require('../eslintOptions').makeJSOnlyValue(`require.resolve('@typescript-eslint/parser')`) + parser: '@typescript-eslint/parser' } }, devDependencies: require('../eslintDeps').DEPS_MAP.typescript diff --git a/packages/@vue/cli/lib/Generator.js b/packages/@vue/cli/lib/Generator.js index b83bb440ae..ed60ff84d2 100644 --- a/packages/@vue/cli/lib/Generator.js +++ b/packages/@vue/cli/lib/Generator.js @@ -241,11 +241,6 @@ module.exports = class Generator { // project-wide configuration even to dependencies. // TODO: this can be removed when Babel supports root: true in package.json extract('babel') - - // Always extract .eslintrc.js as the parser needs to be require.resolve'ed - // since ESLint doesn't resolve things from where it's declared - // TODO: this can be removed when ESLint starts resolving things correctly - extract('eslint') } } From 4ca2f97a27fdc07c5bd18884ce957f6334cf5338 Mon Sep 17 00:00:00 2001 From: merceyz Date: Fri, 6 Nov 2020 17:06:44 +0100 Subject: [PATCH 5/8] fix: preserve plugin id --- packages/@vue/cli-service/lib/Service.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/@vue/cli-service/lib/Service.js b/packages/@vue/cli-service/lib/Service.js index e97ed415c1..db15eb580b 100644 --- a/packages/@vue/cli-service/lib/Service.js +++ b/packages/@vue/cli-service/lib/Service.js @@ -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 @@ -185,7 +185,7 @@ module.exports = class Service { return { id, apply } } else { - return idToPlugin(resolveModule(id, this.pkgContext)) + return idToPlugin(id, resolveModule(id, this.pkgContext)) } }) plugins = builtInPlugins.concat(projectPlugins) From 9bd3ecceed25899970cf90731c47d00818760b69 Mon Sep 17 00:00:00 2001 From: merceyz Date: Fri, 6 Nov 2020 17:41:28 +0100 Subject: [PATCH 6/8] fix: avoid passing index as path --- packages/@vue/cli-service/lib/Service.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/@vue/cli-service/lib/Service.js b/packages/@vue/cli-service/lib/Service.js index db15eb580b..d405f09c82 100644 --- a/packages/@vue/cli-service/lib/Service.js +++ b/packages/@vue/cli-service/lib/Service.js @@ -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 From c5bdb2b7e532d4cfb990181816b26da744f42f8c Mon Sep 17 00:00:00 2001 From: merceyz Date: Fri, 11 Dec 2020 12:21:29 +0100 Subject: [PATCH 7/8] refactor: use loadModule directly --- packages/@vue/cli-service/lib/Service.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/@vue/cli-service/lib/Service.js b/packages/@vue/cli-service/lib/Service.js index d405f09c82..39311a14cf 100644 --- a/packages/@vue/cli-service/lib/Service.js +++ b/packages/@vue/cli-service/lib/Service.js @@ -178,7 +178,7 @@ module.exports = class Service { ) { let apply = () => {} try { - apply = require(resolveModule(id, this.pkgContext)) + apply = loadModule(id, this.pkgContext) } catch (e) { warn(`Optional dependency ${id} is not installed.`) } From a6655b93f44bdf8aee6f6530f52a6be650f74cf5 Mon Sep 17 00:00:00 2001 From: Haoqun Jiang Date: Fri, 22 Jan 2021 15:17:16 +0800 Subject: [PATCH 8/8] fix: loadModule don't throw for non-existent modules --- packages/@vue/cli-service/lib/Service.js | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/packages/@vue/cli-service/lib/Service.js b/packages/@vue/cli-service/lib/Service.js index 39311a14cf..a477177a07 100644 --- a/packages/@vue/cli-service/lib/Service.js +++ b/packages/@vue/cli-service/lib/Service.js @@ -176,11 +176,10 @@ module.exports = class Service { this.pkg.optionalDependencies && id in this.pkg.optionalDependencies ) { - let apply = () => {} - try { - apply = loadModule(id, this.pkgContext) - } catch (e) { + let apply = loadModule(id, this.pkgContext) + if (!apply) { warn(`Optional dependency ${id} is not installed.`) + apply = () => {} } return { id, apply }