Skip to content

Commit 2df73c5

Browse files
committed
Merge remote-tracking branch 'upstream/master' into refactor/transforms
1 parent 191befa commit 2df73c5

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

68 files changed

+1770
-1865
lines changed

extensions/vscode/index.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -207,7 +207,7 @@ function resolveServerPath() {
207207
if (path.isAbsolute(config.server.path)) {
208208
const entryFile = require.resolve('./index.js', { paths: [config.server.path] });
209209
const tsPluginPath = require.resolve('@vue/typescript-plugin', { paths: [path.dirname(entryFile)] });
210-
fs.writeFileSync(tsPluginPackPath, `module.exports = require("${tsPluginPath}");`);
210+
fs.writeFileSync(tsPluginPackPath, `module.exports = require(${JSON.stringify(tsPluginPath)});`);
211211
return entryFile;
212212
}
213213

@@ -219,7 +219,7 @@ function resolveServerPath() {
219219
const serverPath = path.join(uri.fsPath, config.server.path);
220220
const entryFile = require.resolve('./index.js', { paths: [serverPath] });
221221
const tsPluginPath = require.resolve('@vue/typescript-plugin', { paths: [path.dirname(entryFile)] });
222-
fs.writeFileSync(tsPluginPackPath, `module.exports = require("${tsPluginPath}");`);
222+
fs.writeFileSync(tsPluginPackPath, `module.exports = require(${JSON.stringify(tsPluginPath)});`);
223223
return entryFile;
224224
}
225225
catch {}
Lines changed: 25 additions & 101 deletions
Original file line numberDiff line numberDiff line change
@@ -1,107 +1,37 @@
11
{
22
"comments": {
3-
"blockComment": [
4-
"<!--",
5-
"-->"
6-
]
3+
"blockComment": ["<!--", "-->"]
74
},
85
"brackets": [
9-
[
10-
"<!--",
11-
"-->"
12-
],
13-
[
14-
"<",
15-
">"
16-
],
17-
[
18-
"{",
19-
"}"
20-
],
21-
[
22-
"(",
23-
")"
24-
]
6+
// html
7+
["<!--", "-->"],
8+
["{", "}"],
9+
["(", ")"]
2510
],
2611
"autoClosingPairs": [
2712
// html
28-
{
29-
"open": "{",
30-
"close": "}"
31-
},
32-
{
33-
"open": "[",
34-
"close": "]"
35-
},
36-
{
37-
"open": "(",
38-
"close": ")"
39-
},
40-
{
41-
"open": "'",
42-
"close": "'"
43-
},
44-
{
45-
"open": "\"",
46-
"close": "\""
47-
},
48-
{
49-
"open": "<!--",
50-
"close": "-->",
51-
"notIn": [
52-
"comment",
53-
"string"
54-
]
55-
},
13+
{ "open": "{", "close": "}" },
14+
{ "open": "[", "close": "]" },
15+
{ "open": "(", "close": ")" },
16+
{ "open": "'", "close": "'" },
17+
{ "open": "\"", "close": "\"" },
18+
{ "open": "<!--", "close": "-->", "notIn": ["comment", "string"] },
5619
// javascript
57-
{
58-
"open": "`",
59-
"close": "`",
60-
"notIn": [
61-
"string",
62-
"comment"
63-
]
64-
},
65-
{
66-
"open": "/**",
67-
"close": " */",
68-
"notIn": [
69-
"string"
70-
]
71-
}
20+
{ "open": "`", "close": "`", "notIn": ["string", "comment"] },
21+
{ "open": "/**", "close": " */", "notIn": ["string"] }
7222
],
23+
// #1437
7324
"autoCloseBefore": ";:.,=}])><`'\" \n\t",
7425
"surroundingPairs": [
7526
// html
76-
{
77-
"open": "'",
78-
"close": "'"
79-
},
80-
{
81-
"open": "\"",
82-
"close": "\""
83-
},
84-
{
85-
"open": "{",
86-
"close": "}"
87-
},
88-
{
89-
"open": "[",
90-
"close": "]"
91-
},
92-
{
93-
"open": "(",
94-
"close": ")"
95-
},
96-
{
97-
"open": "<",
98-
"close": ">"
99-
},
27+
{ "open": "'", "close": "'" },
28+
{ "open": "\"", "close": "\"" },
29+
{ "open": "{", "close": "}" },
30+
{ "open": "[", "close": "]" },
31+
{ "open": "(", "close": ")" },
32+
{ "open": "<", "close": ">" },
10033
// javascript
101-
[
102-
"`",
103-
"`"
104-
]
34+
["`", "`"]
10535
],
10636
"colorizedBracketPairs": [],
10737
"folding": {
@@ -114,32 +44,26 @@
11444
"onEnterRules": [
11545
{
11646
"beforeText": {
117-
"pattern": "<(?!(?:area|base|br|col|embed|hr|img|input|keygen|link|menuitem|meta|param|source|track|wbr|script|style))([_:\\w][_:\\w-.\\d]*)(?:(?:[^'\"/>]|\"[^\"]*\"|'[^']*')*?(?!\\/)>)[^<]*$",
118-
"flags": "i"
119-
},
120-
"afterText": {
121-
"pattern": "^<\\/([_:\\w][_:\\w-.\\d]*)\\s*>",
47+
"pattern": "<(?!(?:area|base|br|col|embed|hr|img|input|keygen|link|menuitem|meta|param|source|track|wbr))([_:\\w][_:\\w-.\\d]*)(?:(?:[^'\"/>]|\"[^\"]*\"|'[^']*')*?(?!\\/)>)[^<]*$",
12248
"flags": "i"
12349
},
50+
"afterText": { "pattern": "^<\\/([_:\\w][_:\\w-.\\d]*)\\s*>", "flags": "i" },
12451
"action": {
12552
"indent": "indentOutdent"
12653
}
12754
},
12855
{
12956
"beforeText": {
130-
"pattern": "<(?!(?:area|base|br|col|embed|hr|img|input|keygen|link|menuitem|meta|param|source|track|wbr|script|style))([_:\\w][_:\\w-.\\d]*)(?:(?:[^'\"/>]|\"[^\"]*\"|'[^']*')*?(?!\\/)>)[^<]*$",
57+
"pattern": "<(?!(?:area|base|br|col|embed|hr|img|input|keygen|link|menuitem|meta|param|source|track|wbr))([_:\\w][_:\\w-.\\d]*)(?:(?:[^'\"/>]|\"[^\"]*\"|'[^']*')*?(?!\\/)>)[^<]*$",
13158
"flags": "i"
13259
},
13360
"action": {
13461
"indent": "indent"
13562
}
13663
}
13764
],
138-
// https://github.com/vuejs/language-tools/issues/1762
13965
"indentationRules": {
140-
// "increaseIndentPattern": "<(?!\\?|(?:area|base|br|col|frame|hr|html|img|input|keygen|link|menuitem|meta|param|source|track|wbr|script|style)\\b|[^>]*\\/>)([-_\\.A-Za-z0-9]+)(?=\\s|>)\\b[^>]*>(?!.*<\\/\\1>)|<!--(?!.*-->)|\\{[^}\"']*$",
141-
// add (?!\\s*\\() to fix https://github.com/vuejs/language-tools/issues/1847#issuecomment-1246101071
142-
"increaseIndentPattern": "<(?!\\?|(?:area|base|br|col|frame|hr|html|img|input|keygen|link|menuitem|meta|param|source|track|wbr|script|style)\\b|[^>]*\\/>)([-_\\.A-Za-z0-9]+)(?=\\s|>)\\b[^>]*>(?!\\s*\\()(?!.*<\\/\\1>)|<!--(?!.*-->)|\\{[^}\"']*$",
66+
"increaseIndentPattern": "<(?!\\?|(?:area|base|br|col|frame|hr|html|img|input|keygen|link|menuitem|meta|param|source|track|wbr)\\b|[^>]*\\/>)([-_\\.A-Za-z0-9]+)(?=\\s|>)\\b[^>]*>(?!.*<\\/\\1>)|<!--(?!.*-->)|\\{[^}\"']*$",
14367
"decreaseIndentPattern": "^\\s*(<\\/(?!html)[-_\\.A-Za-z0-9]+\\b[^>]*>|-->|\\})"
14468
}
14569
}

extensions/vscode/lib/interpolationDecorators.ts

Lines changed: 25 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -41,24 +41,37 @@ export function activate(selector: vscode.DocumentSelector) {
4141
}
4242
});
4343

44-
function updateDecorations(editor: vscode.TextEditor) {
44+
async function updateDecorations(editor: vscode.TextEditor) {
4545
if (!vscode.languages.match(selector, editor.document)) {
4646
return;
4747
}
4848
if (!config.editor.templateInterpolationDecorators) {
4949
editor.setDecorations(decorationType, []);
5050
return;
5151
}
52-
editor.setDecorations(
53-
decorationType,
54-
[...editor.document.getText().matchAll(/{{[\s\S]*?}}/g)].map(match => {
55-
const start = match.index + 2;
56-
const end = match.index + match[0].length - 2;
57-
return new vscode.Range(
58-
editor.document.positionAt(start),
59-
editor.document.positionAt(end),
60-
);
61-
}),
62-
);
52+
try {
53+
const result = await vscode.commands.executeCommand<
54+
{
55+
body?: [number, number][];
56+
} | undefined
57+
>(
58+
'typescript.tsserverRequest',
59+
'_vue:getInterpolationRanges',
60+
[editor.document.uri.fsPath.replace(/\\/g, '/')],
61+
{ isAsync: true, lowPriority: true },
62+
);
63+
editor.setDecorations(
64+
decorationType,
65+
(result?.body ?? []).map(range =>
66+
new vscode.Range(
67+
editor.document.positionAt(range[0]),
68+
editor.document.positionAt(range[1]),
69+
)
70+
),
71+
);
72+
}
73+
catch {
74+
editor.setDecorations(decorationType, []);
75+
}
6376
}
6477
}

extensions/vscode/reactivityAnalysis/plugin.ts renamed to extensions/vscode/lib/reactivityAnalysisPlugin.ts

Lines changed: 54 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import { createProxyLanguageService, decorateLanguageServiceHost } from '@volar/typescript';
2-
import type { Language } from '@vue/language-core';
2+
import { forEachEmbeddedCode, type Language } from '@vue/language-core';
33
import { createAnalyzer } from 'laplacenoma';
44
// @ts-expect-error
55
import rulesVue from 'laplacenoma/rules/vue';
@@ -22,6 +22,13 @@ const plugin: ts.server.PluginModuleFactory = ({ typescript: ts }) => {
2222
responseRequired: true,
2323
};
2424
});
25+
info.session.addProtocolHandler('_vue:getInterpolationRanges', request => {
26+
const [fileName]: [string] = request.arguments;
27+
return {
28+
response: getInterpolationRanges(info.session!, fileName),
29+
responseRequired: true,
30+
};
31+
});
2532
}
2633

2734
return info.languageService;
@@ -98,3 +105,49 @@ function getReactivityAnalysis(
98105
toSourceRange,
99106
});
100107
}
108+
109+
function getInterpolationRanges(
110+
session: ts.server.Session,
111+
fileName: string,
112+
) {
113+
const { project } = session['getFileAndProject']({
114+
file: fileName,
115+
projectFileName: undefined,
116+
}) as {
117+
file: ts.server.NormalizedPath;
118+
project: ts.server.Project;
119+
};
120+
121+
const language: Language<string> | undefined = (project as any).__vue__?.language;
122+
if (!language) {
123+
return;
124+
}
125+
126+
const sourceScript = language.scripts.get(fileName);
127+
if (!sourceScript?.generated) {
128+
return;
129+
}
130+
131+
const ranges: [number, number][] = [];
132+
for (const code of forEachEmbeddedCode(sourceScript.generated.root)) {
133+
const codeText = code.snapshot.getText(0, code.snapshot.getLength());
134+
if (
135+
(
136+
code.id.startsWith('template_inline_ts_')
137+
&& codeText.startsWith('0 +')
138+
&& codeText.endsWith('+ 0;')
139+
)
140+
|| (code.id.startsWith('style_') && code.id.endsWith('_inline_ts'))
141+
) {
142+
for (const mapping of code.mappings) {
143+
for (let i = 0; i < mapping.sourceOffsets.length; i++) {
144+
ranges.push([
145+
mapping.sourceOffsets[i]!,
146+
mapping.sourceOffsets[i]! + mapping.lengths[i]!,
147+
]);
148+
}
149+
}
150+
}
151+
}
152+
return ranges;
153+
}

extensions/vscode/package.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -461,8 +461,8 @@
461461
"@types/node": "^22.10.4",
462462
"@types/semver": "^7.5.3",
463463
"@types/vscode": "1.88.0",
464-
"@volar/typescript": "2.4.23",
465-
"@volar/vscode": "2.4.23",
464+
"@volar/typescript": "2.4.26",
465+
"@volar/vscode": "2.4.26",
466466
"@vscode/vsce": "^3.2.1",
467467
"@vue/compiler-sfc": "^3.5.24",
468468
"@vue/language-core": "3.1.5",

extensions/vscode/rolldown.config.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ const resolve = (...paths: string[]) => path.resolve(__dirname, ...paths);
88
const config: RolldownOptions = {
99
input: {
1010
'extension': './index.ts',
11-
'reactivity-analysis': './reactivityAnalysis/plugin.ts',
11+
'reactivity-analysis-plugin': './lib/reactivityAnalysisPlugin.ts',
1212
},
1313
output: {
1414
format: 'cjs',
@@ -37,7 +37,7 @@ const config: RolldownOptions = {
3737
fs.mkdirSync(resolve('./node_modules/vue-reactivity-analysis-plugin-pack'), { recursive: true });
3838
fs.writeFileSync(
3939
resolve('./node_modules/vue-reactivity-analysis-plugin-pack/index.js'),
40-
`module.exports = require('../../dist/reactivity-analysis.js');`,
40+
`module.exports = require('../../dist/reactivity-analysis-plugin.js');`,
4141
);
4242

4343
if (isDev) {

packages/component-meta/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313
"directory": "packages/component-meta"
1414
},
1515
"dependencies": {
16-
"@volar/typescript": "2.4.23",
16+
"@volar/typescript": "2.4.26",
1717
"@vue/language-core": "3.1.5",
1818
"path-browserify": "^1.0.1",
1919
"vue-component-type-helpers": "3.1.5"

packages/language-core/index.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ export * from './lib/utils/collectBindings';
1010
export * from './lib/utils/forEachTemplateNode';
1111
export * from './lib/utils/parseSfc';
1212
export * from './lib/utils/shared';
13-
export * from './lib/virtualFile/vueFile';
13+
export * from './lib/virtualCode';
1414

1515
export { tsCodegen } from './lib/plugins/vue-tsx';
1616

0 commit comments

Comments
 (0)