Skip to content

Commit f82a8dd

Browse files
committed
fix(@vue/language-service): reload on script lang change
1 parent 3a7a5f8 commit f82a8dd

File tree

2 files changed

+20
-1
lines changed

2 files changed

+20
-1
lines changed

src/store.ts

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import { version, reactive, watchEffect, watch } from 'vue'
22
import * as defaultCompiler from 'vue/compiler-sfc'
33
import { compileFile } from './transform'
4-
import { utoa, atou } from './utils'
4+
import { utoa, atou, isSciptLangChanged } from './utils'
55
import {
66
SFCScriptCompileOptions,
77
SFCAsyncStyleCompileOptions,
@@ -193,6 +193,17 @@ export class ReplStore implements Store {
193193
)
194194
)
195195

196+
// Temporary workaround for https://github.com/vuejs/repl/issues/321
197+
// which is related to https://github.com/microsoft/TypeScript/issues/57631
198+
// TODO: remove this when the issue is fixed
199+
watch(
200+
() => this.state.activeFile.code,
201+
(newCode, oldCode) => {
202+
if (this.state.activeFile.language !== 'vue') return
203+
if (isSciptLangChanged(newCode, oldCode)) this.reloadLanguageTools?.()
204+
}
205+
)
206+
196207
watch(
197208
() => [
198209
this.state.files[tsconfigFile]?.code,

src/utils.ts

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,3 +31,11 @@ export function atou(base64: string): string {
3131
// https://base64.guru/developers/javascript/examples/unicode-strings
3232
return decodeURIComponent(escape(binary))
3333
}
34+
35+
// This function compares the `lang` attribute of the `<script>` tag in .vue files
36+
export function isSciptLangChanged(newCode: string, oldCode: string) {
37+
const newLang = newCode.match(/<script[^>]*lang="([^"]+)"[^>]*>/)?.[1]
38+
const oldLang = oldCode.match(/<script[^>]*lang="([^"]+)"[^>]*>/)?.[1]
39+
40+
return newLang !== oldLang
41+
}

0 commit comments

Comments
 (0)