From cf36b3e42a16295bac5cef6c21ef1b6683a429ef Mon Sep 17 00:00:00 2001 From: Evan You Date: Mon, 13 Mar 2023 15:43:37 +0800 Subject: [PATCH] fix: avoid resolving to 2.7 compiler-sfc This can happen in monorepos where Vue 2.7 is in a package's deps while Vue 3 is only a transitive dep, e.g. from VitePress. Even with pnpm this can happen because `pnpm run` emulates npm behavior by injecting NODE_PATH. ref: https://github.com/vuejs/vitepress/issues/1507 --- packages/plugin-vue/src/compiler.ts | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/packages/plugin-vue/src/compiler.ts b/packages/plugin-vue/src/compiler.ts index 1051eba0..1449fea9 100644 --- a/packages/plugin-vue/src/compiler.ts +++ b/packages/plugin-vue/src/compiler.ts @@ -10,9 +10,7 @@ import type * as _compiler from 'vue/compiler-sfc' export function resolveCompiler(root: string): typeof _compiler { // resolve from project root first, then fallback to peer dep (if any) - const compiler = - tryRequire('vue/compiler-sfc', root) || tryRequire('vue/compiler-sfc') - + const compiler = tryResolveCompiler(root) || tryResolveCompiler() if (!compiler) { throw new Error( `Failed to resolve vue/compiler-sfc.\n` + @@ -24,6 +22,14 @@ export function resolveCompiler(root: string): typeof _compiler { return compiler } +function tryResolveCompiler(root?: string) { + const vueMeta = tryRequire('vue/package.json', root) + // make sure to check the version is 3+ since 2.7 now also has vue/compiler-sfc + if (vueMeta && vueMeta.version.split('.')[0] >= 3) { + return tryRequire('vue/compiler-sfc', root) + } +} + const _require = createRequire(import.meta.url) function tryRequire(id: string, from?: string) { try {