From: 三咲智子 Kevin Deng Date: Thu, 30 Nov 2023 10:41:21 +0000 (+0800) Subject: fix(compiler-sfc): throw error when failing to load TS during type resolution (#8883) X-Git-Tag: v3.3.10~21 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=4936d2e11a8d0ca3704bfe408548cb26bb3fd5e9;p=thirdparty%2Fvuejs%2Fcore.git fix(compiler-sfc): throw error when failing to load TS during type resolution (#8883) --- diff --git a/packages/compiler-sfc/src/script/resolveType.ts b/packages/compiler-sfc/src/script/resolveType.ts index cf96007bee..d9b4dd1cb8 100644 --- a/packages/compiler-sfc/src/script/resolveType.ts +++ b/packages/compiler-sfc/src/script/resolveType.ts @@ -719,7 +719,25 @@ let loadTS: (() => typeof TS) | undefined * @private */ export function registerTS(_loadTS: () => typeof TS) { - loadTS = _loadTS + loadTS = () => { + try { + return _loadTS() + } catch (err: any) { + if ( + typeof err.message === 'string' && + err.message.includes('Cannot find module') + ) { + throw new Error( + 'Failed to load TypeScript, which is required for resolving imported types. ' + + 'Please make sure "typescript" is installed as a project dependency.' + ) + } else { + throw new Error( + 'Failed to load TypeScript for resolving imported types.' + ) + } + } + } } type FS = NonNullable @@ -768,7 +786,12 @@ function importSourceToScope( scope: TypeScope, source: string ): TypeScope { - const fs = resolveFS(ctx) + let fs: FS | undefined + try { + fs = resolveFS(ctx) + } catch (err: any) { + return ctx.error(err.message, node, scope) + } if (!fs) { return ctx.error( `No fs option provided to \`compileScript\` in non-Node environment. ` + diff --git a/packages/vue/compiler-sfc/register-ts.js b/packages/vue/compiler-sfc/register-ts.js index 7a073b3a3f..36de2a350d 100644 --- a/packages/vue/compiler-sfc/register-ts.js +++ b/packages/vue/compiler-sfc/register-ts.js @@ -1,5 +1,3 @@ if (typeof require !== 'undefined') { - try { - require('@vue/compiler-sfc').registerTS(() => require('typescript')) - } catch (e) {} + require('@vue/compiler-sfc').registerTS(() => require('typescript')) }