Skip to content

Commit 1d3e9d4

Browse files
committed
Merge branch 'master' into pr/4642
2 parents c712727 + 8592f9e commit 1d3e9d4

File tree

21 files changed

+751
-336
lines changed

21 files changed

+751
-336
lines changed

.github/workflows/pkg.pr.new.yml

+24
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
name: Publish Any Commit
2+
on: [push, pull_request]
3+
4+
jobs:
5+
build:
6+
runs-on: ubuntu-latest
7+
8+
steps:
9+
- name: Checkout code
10+
uses: actions/checkout@v4
11+
12+
- run: corepack enable
13+
- uses: actions/setup-node@v4
14+
with:
15+
node-version: 20
16+
cache: "pnpm"
17+
18+
- name: Install dependencies
19+
run: pnpm install
20+
21+
- name: Build
22+
run: pnpm build
23+
24+
- run: pnpx pkg-pr-new publish './packages/*'

extensions/vscode/package.json

+4-4
Original file line numberDiff line numberDiff line change
@@ -255,7 +255,7 @@
255255
"description": "Traces the communication between VS Code and the language server."
256256
},
257257
"vue.server.hybridMode": {
258-
"type": "boolean",
258+
"type": ["boolean", "string"],
259259
"default": "auto",
260260
"enum": [
261261
"auto",
@@ -548,14 +548,14 @@
548548
"devDependencies": {
549549
"@types/semver": "^7.5.3",
550550
"@types/vscode": "^1.82.0",
551-
"@volar/vscode": "~2.4.0-alpha.18",
551+
"@volar/vscode": "~2.4.0",
552+
"@vscode/vsce": "latest",
552553
"@vue/language-core": "2.0.28",
553554
"@vue/language-server": "2.0.28",
554555
"@vue/typescript-plugin": "2.0.28",
555556
"esbuild": "~0.21.0",
556557
"esbuild-plugin-copy": "latest",
557558
"esbuild-visualizer": "latest",
558-
"semver": "^7.5.4",
559-
"vsce": "latest"
559+
"semver": "^7.5.4"
560560
}
561561
}

extensions/vscode/src/common.ts

-1
Original file line numberDiff line numberDiff line change
@@ -234,7 +234,6 @@ async function doActivate(context: vscode.ExtensionContext, createLc: CreateLang
234234
lsp.activateAutoInsertion(selectors, client);
235235
lsp.activateDocumentDropEdit(selectors, client);
236236
lsp.activateWriteVirtualFiles('vue.action.writeVirtualFiles', client);
237-
lsp.activateServerSys(client);
238237

239238
if (!enabledHybridMode) {
240239
lsp.activateTsConfigStatusItem(selectors, 'vue.tsconfig', client);

package.json

+1-1
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@
2424
"@lerna-lite/publish": "latest",
2525
"@tsslint/cli": "latest",
2626
"@tsslint/config": "latest",
27-
"@volar/language-service": "~2.4.0-alpha.18",
27+
"@volar/language-service": "~2.4.0",
2828
"typescript": "latest",
2929
"vite": "latest",
3030
"vitest": "latest"

packages/component-meta/lib/base.ts

+59-78
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ export function createCheckerByJsonConfigBase(
2727
checkerOptions: MetaCheckerOptions = {}
2828
) {
2929
rootDir = rootDir.replace(windowsPathReg, '/');
30-
return createCheckerWorker(
30+
return baseCreate(
3131
ts,
3232
() => vue.createParsedCommandLineByJson(ts, ts.sys, rootDir, json),
3333
checkerOptions,
@@ -42,7 +42,7 @@ export function createCheckerBase(
4242
checkerOptions: MetaCheckerOptions = {}
4343
) {
4444
tsconfig = tsconfig.replace(windowsPathReg, '/');
45-
return createCheckerWorker(
45+
return baseCreate(
4646
ts,
4747
() => vue.createParsedCommandLine(ts, ts.sys, tsconfig),
4848
checkerOptions,
@@ -51,75 +51,28 @@ export function createCheckerBase(
5151
);
5252
}
5353

54-
function createCheckerWorker(
54+
export function baseCreate(
5555
ts: typeof import('typescript'),
56-
loadParsedCommandLine: () => vue.ParsedCommandLine,
56+
getCommandLine: () => vue.ParsedCommandLine,
5757
checkerOptions: MetaCheckerOptions,
5858
rootPath: string,
5959
globalComponentName: string
6060
) {
61-
62-
/**
63-
* Original Host
64-
*/
65-
66-
let parsedCommandLine = loadParsedCommandLine();
67-
let fileNames = parsedCommandLine.fileNames.map(path => path.replace(windowsPathReg, '/'));
61+
let commandLine = getCommandLine();
62+
let fileNames = commandLine.fileNames.map(path => path.replace(windowsPathReg, '/'));
6863
let projectVersion = 0;
6964

70-
const scriptSnapshots = new Map<string, ts.IScriptSnapshot>();
7165
const projectHost: TypeScriptProjectHost = {
7266
getCurrentDirectory: () => rootPath,
7367
getProjectVersion: () => projectVersion.toString(),
74-
getCompilationSettings: () => parsedCommandLine.options,
68+
getCompilationSettings: () => commandLine.options,
7569
getScriptFileNames: () => fileNames,
76-
getProjectReferences: () => parsedCommandLine.projectReferences,
77-
getScriptSnapshot: fileName => {
78-
if (!scriptSnapshots.has(fileName)) {
79-
const fileText = ts.sys.readFile(fileName);
80-
if (fileText !== undefined) {
81-
scriptSnapshots.set(fileName, ts.ScriptSnapshot.fromString(fileText));
82-
}
83-
}
84-
return scriptSnapshots.get(fileName);
85-
},
70+
getProjectReferences: () => commandLine.projectReferences,
8671
};
87-
88-
return {
89-
...baseCreate(ts, projectHost, parsedCommandLine.vueOptions, checkerOptions, globalComponentName),
90-
updateFile(fileName: string, text: string) {
91-
fileName = fileName.replace(windowsPathReg, '/');
92-
scriptSnapshots.set(fileName, ts.ScriptSnapshot.fromString(text));
93-
projectVersion++;
94-
},
95-
deleteFile(fileName: string) {
96-
fileName = fileName.replace(windowsPathReg, '/');
97-
fileNames = fileNames.filter(f => f !== fileName);
98-
projectVersion++;
99-
},
100-
reload() {
101-
parsedCommandLine = loadParsedCommandLine();
102-
fileNames = parsedCommandLine.fileNames.map(path => path.replace(windowsPathReg, '/'));
103-
this.clearCache();
104-
},
105-
clearCache() {
106-
scriptSnapshots.clear();
107-
projectVersion++;
108-
},
109-
};
110-
}
111-
112-
export function baseCreate(
113-
ts: typeof import('typescript'),
114-
projectHost: TypeScriptProjectHost,
115-
vueCompilerOptions: vue.VueCompilerOptions,
116-
checkerOptions: MetaCheckerOptions,
117-
globalComponentName: string
118-
) {
11972
const globalComponentSnapshot = ts.ScriptSnapshot.fromString('<script setup lang="ts"></script>');
120-
const metaSnapshots: Record<string, ts.IScriptSnapshot> = {};
73+
const scriptSnapshots = new Map<string, ts.IScriptSnapshot | undefined>();
74+
const metaSnapshots = new Map<string, ts.IScriptSnapshot>();
12175
const getScriptFileNames = projectHost.getScriptFileNames;
122-
const getScriptSnapshot = projectHost.getScriptSnapshot;
12376
projectHost.getScriptFileNames = () => {
12477
const names = getScriptFileNames();
12578
return [
@@ -129,20 +82,6 @@ export function baseCreate(
12982
getMetaFileName(globalComponentName),
13083
];
13184
};
132-
projectHost.getScriptSnapshot = fileName => {
133-
if (isMetaFileName(fileName)) {
134-
if (!metaSnapshots[fileName]) {
135-
metaSnapshots[fileName] = ts.ScriptSnapshot.fromString(getMetaScriptContent(fileName));
136-
}
137-
return metaSnapshots[fileName];
138-
}
139-
else if (fileName === globalComponentName) {
140-
return globalComponentSnapshot;
141-
}
142-
else {
143-
return getScriptSnapshot(fileName);
144-
}
145-
};
14685

14786
const vueLanguagePlugin = vue.createVueLanguagePlugin2<string>(
14887
ts,
@@ -153,7 +92,7 @@ export function baseCreate(
15392
ts.sys.useCaseSensitiveFileNames
15493
),
15594
projectHost.getCompilationSettings(),
156-
vueCompilerOptions
95+
commandLine.vueOptions
15796
);
15897
const language = vue.createLanguage(
15998
[
@@ -166,7 +105,30 @@ export function baseCreate(
166105
],
167106
new vue.FileMap(ts.sys.useCaseSensitiveFileNames),
168107
fileName => {
169-
const snapshot = projectHost.getScriptSnapshot(fileName);
108+
let snapshot = scriptSnapshots.get(fileName);
109+
110+
if (fileName === globalComponentName) {
111+
snapshot = globalComponentSnapshot;
112+
}
113+
else if (isMetaFileName(fileName)) {
114+
if (!metaSnapshots.has(fileName)) {
115+
metaSnapshots.set(fileName, ts.ScriptSnapshot.fromString(getMetaScriptContent(fileName)));
116+
}
117+
snapshot = metaSnapshots.get(fileName);
118+
}
119+
else {
120+
if (!scriptSnapshots.has(fileName)) {
121+
const fileText = ts.sys.readFile(fileName);
122+
if (fileText !== undefined) {
123+
scriptSnapshots.set(fileName, ts.ScriptSnapshot.fromString(fileText));
124+
}
125+
else {
126+
scriptSnapshots.set(fileName, undefined);
127+
}
128+
}
129+
snapshot = scriptSnapshots.get(fileName);
130+
}
131+
170132
if (snapshot) {
171133
language.scripts.set(fileName, snapshot);
172134
}
@@ -182,7 +144,7 @@ export function baseCreate(
182144
const getScriptKind = languageServiceHost.getScriptKind?.bind(languageServiceHost);
183145
languageServiceHost.getScriptKind = fileName => {
184146
const scriptKind = getScriptKind!(fileName);
185-
if (vueCompilerOptions.extensions.some(ext => fileName.endsWith(ext))) {
147+
if (commandLine.vueOptions.extensions.some(ext => fileName.endsWith(ext))) {
186148
if (scriptKind === ts.ScriptKind.JS) {
187149
return ts.ScriptKind.TS;
188150
}
@@ -199,6 +161,25 @@ export function baseCreate(
199161
return {
200162
getExportNames,
201163
getComponentMeta,
164+
updateFile(fileName: string, text: string) {
165+
fileName = fileName.replace(windowsPathReg, '/');
166+
scriptSnapshots.set(fileName, ts.ScriptSnapshot.fromString(text));
167+
projectVersion++;
168+
},
169+
deleteFile(fileName: string) {
170+
fileName = fileName.replace(windowsPathReg, '/');
171+
fileNames = fileNames.filter(f => f !== fileName);
172+
projectVersion++;
173+
},
174+
reload() {
175+
commandLine = getCommandLine();
176+
fileNames = commandLine.fileNames.map(path => path.replace(windowsPathReg, '/'));
177+
this.clearCache();
178+
},
179+
clearCache() {
180+
scriptSnapshots.clear();
181+
projectVersion++;
182+
},
202183
__internal__: {
203184
tsLs,
204185
},
@@ -210,7 +191,7 @@ export function baseCreate(
210191

211192
function getMetaFileName(fileName: string) {
212193
return (
213-
vueCompilerOptions.extensions.some(ext => fileName.endsWith(ext))
194+
commandLine.vueOptions.extensions.some(ext => fileName.endsWith(ext))
214195
? fileName
215196
: fileName.substring(0, fileName.lastIndexOf('.'))
216197
) + '.meta.ts';
@@ -229,7 +210,7 @@ interface ComponentMeta<T> {
229210
exposed: ComponentExposed<T>;
230211
};
231212
232-
${vueCompilerOptions.target < 3 ? vue2TypeHelpersCode : typeHelpersCode}
213+
${commandLine.vueOptions.target < 3 ? vue2TypeHelpersCode : typeHelpersCode}
233214
`.trim();
234215
return code;
235216
}
@@ -321,11 +302,11 @@ ${vueCompilerOptions.target < 3 ? vue2TypeHelpersCode : typeHelpersCode}
321302

322303
// fill defaults
323304
const printer = ts.createPrinter(checkerOptions.printer);
324-
const snapshot = projectHost.getScriptSnapshot(componentPath)!;
305+
const snapshot = language.scripts.get(componentPath)?.snapshot!;
325306

326307
const vueFile = language.scripts.get(componentPath)?.generated?.root;
327308
const vueDefaults = vueFile && exportName === 'default'
328-
? (vueFile instanceof vue.VueVirtualCode ? readVueComponentDefaultProps(vueFile, printer, ts, vueCompilerOptions) : {})
309+
? (vueFile instanceof vue.VueVirtualCode ? readVueComponentDefaultProps(vueFile, printer, ts, commandLine.vueOptions) : {})
329310
: {};
330311
const tsDefaults = !vueFile ? readTsComponentDefaultProps(
331312
componentPath.substring(componentPath.lastIndexOf('.') + 1), // ts | js | tsx | jsx

packages/component-meta/package.json

+1-1
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212
"directory": "packages/component-meta"
1313
},
1414
"dependencies": {
15-
"@volar/typescript": "~2.4.0-alpha.18",
15+
"@volar/typescript": "~2.4.0",
1616
"@vue/language-core": "2.0.28",
1717
"path-browserify": "^1.0.1",
1818
"vue-component-type-helpers": "2.0.28"

packages/language-core/lib/codegen/template/element.ts

+2-2
Original file line numberDiff line numberDiff line change
@@ -177,7 +177,7 @@ export function* generateComponent(
177177
resolveRenameNewName: node.tag !== expectName ? camelizeComponentName : undefined,
178178
resolveRenameEditText: getTagRenameApply(node.tag),
179179
},
180-
} as VueCodeInformation
180+
}
181181
);
182182
yield `;`;
183183
}
@@ -195,7 +195,7 @@ export function* generateComponent(
195195
isAdditional: true,
196196
onlyImport: true,
197197
},
198-
} as VueCodeInformation
198+
}
199199
);
200200
yield `,`;
201201
}

packages/language-core/package.json

+2-2
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212
"directory": "packages/language-core"
1313
},
1414
"dependencies": {
15-
"@volar/language-core": "~2.4.0-alpha.18",
15+
"@volar/language-core": "~2.4.0",
1616
"@vue/compiler-dom": "^3.4.0",
1717
"@vue/shared": "^3.4.0",
1818
"computeds": "^0.0.1",
@@ -25,7 +25,7 @@
2525
"@types/minimatch": "^5.1.2",
2626
"@types/node": "latest",
2727
"@types/path-browserify": "^1.0.1",
28-
"@volar/typescript": "~2.4.0-alpha.18",
28+
"@volar/typescript": "~2.4.0",
2929
"@vue/compiler-sfc": "^3.4.0"
3030
},
3131
"peerDependencies": {

packages/language-plugin-pug/package.json

+2-2
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@
1616
"@vue/language-core": "2.0.28"
1717
},
1818
"dependencies": {
19-
"@volar/source-map": "~2.4.0-alpha.18",
20-
"volar-service-pug": "0.0.59"
19+
"@volar/source-map": "~2.4.0",
20+
"volar-service-pug": "0.0.61"
2121
}
2222
}

packages/language-server/lib/hybridModeProject.ts

+5-7
Original file line numberDiff line numberDiff line change
@@ -25,15 +25,14 @@ export function createHybridModeProject(
2525
setup(_server) {
2626
server = _server;
2727
onSomePipeReadyCallbacks.push(() => {
28-
server.refresh(project);
28+
server.languageFeatures.requestRefresh(false);
2929
});
30-
server.onDidChangeWatchedFiles(({ changes }) => {
30+
server.fileWatcher.onDidChangeWatchedFiles(({ changes }) => {
3131
for (const change of changes) {
3232
const changeUri = URI.parse(change.uri);
3333
if (tsconfigProjects.has(changeUri)) {
3434
tsconfigProjects.get(changeUri)?.then(project => project.dispose());
3535
tsconfigProjects.delete(changeUri);
36-
server.clearPushDiagnostics();
3736
}
3837
}
3938
});
@@ -91,11 +90,10 @@ export function createHybridModeProject(
9190
asFileName,
9291
});
9392
const language = createLanguage([
94-
{ getLanguageId: uri => server.documents.get(server.getSyncedDocumentKey(uri) ?? uri.toString())?.languageId },
93+
{ getLanguageId: uri => server.documents.get(uri)?.languageId },
9594
...languagePlugins,
9695
], createUriMap(), uri => {
97-
const documentKey = server.getSyncedDocumentKey(uri);
98-
const document = documentKey ? server.documents.get(documentKey) : undefined;
96+
const document = server.documents.get(uri);
9997
if (document) {
10098
language.scripts.set(uri, document.getSnapshot(), document.languageId);
10199
}
@@ -108,7 +106,7 @@ export function createHybridModeProject(
108106
return createLanguageService(
109107
language,
110108
server.languageServicePlugins,
111-
createLanguageServiceEnvironment(server, [...server.workspaceFolders.keys()]),
109+
createLanguageServiceEnvironment(server, [...server.workspaceFolders.all]),
112110
project
113111
);
114112
}

0 commit comments

Comments
 (0)