From: Alex Snezhko Date: Tue, 2 Sep 2025 09:39:29 +0000 (-0700) Subject: fix(compiler-sfc): check lang before attempt to compile script (#13508) X-Git-Tag: v3.5.21~2 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=55922ff3168a1397ad72f18946eb1c4051cdab3b;p=thirdparty%2Fvuejs%2Fcore.git fix(compiler-sfc): check lang before attempt to compile script (#13508) close #8368 --- diff --git a/packages/compiler-sfc/__tests__/compileScript.spec.ts b/packages/compiler-sfc/__tests__/compileScript.spec.ts index f28ed5433..b69bbca2e 100644 --- a/packages/compiler-sfc/__tests__/compileScript.spec.ts +++ b/packages/compiler-sfc/__tests__/compileScript.spec.ts @@ -1550,4 +1550,19 @@ describe('compileScript', () => { ) assertCode(content) }) + + test('should not compile unrecognized language', () => { + const { content, lang, scriptAst } = compile( + ``, + ) + expect(content).toMatch(`export default + data: -> + myVal: 0`) + expect(lang).toBe('coffee') + expect(scriptAst).not.toBeDefined() + }) }) diff --git a/packages/compiler-sfc/src/compileScript.ts b/packages/compiler-sfc/src/compileScript.ts index fa81da423..cbd4abdf7 100644 --- a/packages/compiler-sfc/src/compileScript.ts +++ b/packages/compiler-sfc/src/compileScript.ts @@ -56,7 +56,13 @@ import { DEFINE_EXPOSE, processDefineExpose } from './script/defineExpose' import { DEFINE_OPTIONS, processDefineOptions } from './script/defineOptions' import { DEFINE_SLOTS, processDefineSlots } from './script/defineSlots' import { DEFINE_MODEL, processDefineModel } from './script/defineModel' -import { getImportedName, isCallOf, isLiteralNode } from './script/utils' +import { + getImportedName, + isCallOf, + isJS, + isLiteralNode, + isTS, +} from './script/utils' import { analyzeScriptBindings } from './script/analyzeScriptBindings' import { isImportUsed } from './script/importUsageCheck' import { processAwait } from './script/topLevelAwait' @@ -173,6 +179,8 @@ export function compileScript( const scopeId = options.id ? options.id.replace(/^data-v-/, '') : '' const scriptLang = script && script.lang const scriptSetupLang = scriptSetup && scriptSetup.lang + const isJSOrTS = + isJS(scriptLang, scriptSetupLang) || isTS(scriptLang, scriptSetupLang) if (script && scriptSetup && scriptLang !== scriptSetupLang) { throw new Error( @@ -181,21 +189,28 @@ export function compileScript( ) } - const ctx = new ScriptCompileContext(sfc, options) - if (!scriptSetup) { if (!script) { throw new Error(`[@vue/compiler-sfc] SFC contains no