@volar/typescript 2.2.0-alpha.1 → 2.2.0-alpha.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/node/decorateLanguageServiceHost.d.ts +2 -2
- package/lib/node/decorateLanguageServiceHost.js +2 -3
- package/lib/node/proxyCreateProgram.d.ts +1 -1
- package/lib/node/proxyCreateProgram.js +8 -4
- package/lib/node/transform.d.ts +1 -0
- package/lib/node/transform.js +13 -1
- package/lib/quickstart/createAsyncLanguageServicePlugin.d.ts +1 -1
- package/lib/quickstart/createAsyncLanguageServicePlugin.js +3 -3
- package/lib/quickstart/createLanguageServicePlugin.d.ts +1 -1
- package/lib/quickstart/createLanguageServicePlugin.js +3 -3
- package/lib/quickstart/runTsc.d.ts +2 -1
- package/lib/quickstart/runTsc.js +11 -6
- package/package.json +4 -4
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import type { Language } from '@volar/language-core';
|
|
2
2
|
import type * as ts from 'typescript';
|
|
3
|
-
export declare function decorateLanguageServiceHost(language: Language, languageServiceHost: ts.LanguageServiceHost,
|
|
3
|
+
export declare function decorateLanguageServiceHost(ts: typeof import('typescript'), language: Language, languageServiceHost: ts.LanguageServiceHost, getLanguageId: (fileName: string) => string): void;
|
|
4
4
|
export declare function searchExternalFiles(ts: typeof import('typescript'), project: ts.server.Project, exts: string[]): string[];
|
|
@@ -1,9 +1,8 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.searchExternalFiles = exports.decorateLanguageServiceHost = void 0;
|
|
4
|
-
const language_core_1 = require("@volar/language-core");
|
|
5
4
|
const resolveModuleName_1 = require("../resolveModuleName");
|
|
6
|
-
function decorateLanguageServiceHost(language, languageServiceHost,
|
|
5
|
+
function decorateLanguageServiceHost(ts, language, languageServiceHost, getLanguageId) {
|
|
7
6
|
let extraProjectVersion = 0;
|
|
8
7
|
const exts = language.plugins
|
|
9
8
|
.map(plugin => plugin.typescript?.extraFileExtensions.map(ext => '.' + ext.extension) ?? [])
|
|
@@ -81,7 +80,7 @@ function decorateLanguageServiceHost(language, languageServiceHost, ts) {
|
|
|
81
80
|
const snapshot = getScriptSnapshot(fileName);
|
|
82
81
|
if (snapshot) {
|
|
83
82
|
extraProjectVersion++;
|
|
84
|
-
const sourceScript = language.scripts.set(fileName, (
|
|
83
|
+
const sourceScript = language.scripts.set(fileName, getLanguageId(fileName), snapshot);
|
|
85
84
|
if (sourceScript.generated) {
|
|
86
85
|
const text = snapshot.getText(0, snapshot.getLength());
|
|
87
86
|
let patchedText = text.split('\n').map(line => ' '.repeat(line.length)).join('\n');
|
|
@@ -1,3 +1,3 @@
|
|
|
1
1
|
import type * as ts from 'typescript';
|
|
2
2
|
import { LanguagePlugin } from '@volar/language-core';
|
|
3
|
-
export declare function proxyCreateProgram(ts: typeof import('typescript'), original: typeof ts['createProgram'],
|
|
3
|
+
export declare function proxyCreateProgram(ts: typeof import('typescript'), original: typeof ts['createProgram'], getLanguagePlugins: (ts: typeof import('typescript'), options: ts.CreateProgramOptions) => LanguagePlugin[], getLanguageId: (fileName: string) => string): typeof import("typescript").createProgram;
|
|
@@ -3,13 +3,17 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.proxyCreateProgram = void 0;
|
|
4
4
|
const decorateProgram_1 = require("./decorateProgram");
|
|
5
5
|
const language_core_1 = require("@volar/language-core");
|
|
6
|
-
function proxyCreateProgram(ts, original,
|
|
6
|
+
function proxyCreateProgram(ts, original, getLanguagePlugins, getLanguageId) {
|
|
7
7
|
return new Proxy(original, {
|
|
8
8
|
apply: (target, thisArg, args) => {
|
|
9
9
|
const options = args[0];
|
|
10
10
|
assert(!!options.host, '!!options.host');
|
|
11
|
+
const languagePlugins = getLanguagePlugins(ts, options);
|
|
12
|
+
const extensions = languagePlugins
|
|
13
|
+
.map(plugin => plugin.typescript?.extraFileExtensions.map(({ extension }) => `.${extension}`) ?? [])
|
|
14
|
+
.flat();
|
|
11
15
|
const sourceFileToSnapshotMap = new WeakMap();
|
|
12
|
-
const language = (0, language_core_1.createLanguage)(
|
|
16
|
+
const language = (0, language_core_1.createLanguage)(languagePlugins, ts.sys.useCaseSensitiveFileNames, fileName => {
|
|
13
17
|
let snapshot;
|
|
14
18
|
assert(originalSourceFiles.has(fileName), `originalSourceFiles.has(${fileName})`);
|
|
15
19
|
const sourceFile = originalSourceFiles.get(fileName);
|
|
@@ -31,7 +35,7 @@ function proxyCreateProgram(ts, original, extensions, getLanguagePlugins) {
|
|
|
31
35
|
}
|
|
32
36
|
}
|
|
33
37
|
if (snapshot) {
|
|
34
|
-
language.scripts.set(fileName, (
|
|
38
|
+
language.scripts.set(fileName, getLanguageId(fileName), snapshot);
|
|
35
39
|
}
|
|
36
40
|
else {
|
|
37
41
|
language.scripts.delete(fileName);
|
|
@@ -97,7 +101,7 @@ function proxyCreateProgram(ts, original, extensions, getLanguagePlugins) {
|
|
|
97
101
|
const program = Reflect.apply(target, thisArg, [options]);
|
|
98
102
|
(0, decorateProgram_1.decorateProgram)(language, program);
|
|
99
103
|
// TODO: #128
|
|
100
|
-
program.__volar__ = {
|
|
104
|
+
program.__volar__ = { language };
|
|
101
105
|
return program;
|
|
102
106
|
function resolveModuleName(name, containingFile, options, redirectedReference) {
|
|
103
107
|
const resolved = ts.resolveModuleName(name, containingFile, options, moduleResolutionHost, originalHost.getModuleResolutionCache?.(), redirectedReference);
|
package/lib/node/transform.d.ts
CHANGED
|
@@ -2,6 +2,7 @@ import { Language, CodeInformation, SourceMap, SourceScript } from '@volar/langu
|
|
|
2
2
|
import type * as ts from 'typescript';
|
|
3
3
|
export declare function transformCallHierarchyItem(language: Language, item: ts.CallHierarchyItem, filter: (data: CodeInformation) => boolean): ts.CallHierarchyItem;
|
|
4
4
|
export declare function transformDiagnostic<T extends ts.Diagnostic>(language: Language, diagnostic: T): T | undefined;
|
|
5
|
+
export declare function transformSourceFile(sourceFile: ts.SourceFile, sourceText: string): ts.SourceFile;
|
|
5
6
|
export declare function transformFileTextChanges(language: Language, changes: ts.FileTextChanges, filter: (data: CodeInformation) => boolean): ts.FileTextChanges | undefined;
|
|
6
7
|
export declare function transformDocumentSpan<T extends ts.DocumentSpan>(language: Language, documentSpan: T, filter: (data: CodeInformation) => boolean, shouldFallback?: boolean): T | undefined;
|
|
7
8
|
export declare function transformSpan(language: Language, fileName: string | undefined, textSpan: ts.TextSpan | undefined, filter: (data: CodeInformation) => boolean): {
|
package/lib/node/transform.js
CHANGED
|
@@ -1,9 +1,10 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.toGeneratedOffset = exports.toSourceOffset = exports.transformTextSpan = exports.transformTextChange = exports.transformSpan = exports.transformDocumentSpan = exports.transformFileTextChanges = exports.transformDiagnostic = exports.transformCallHierarchyItem = void 0;
|
|
3
|
+
exports.toGeneratedOffset = exports.toSourceOffset = exports.transformTextSpan = exports.transformTextChange = exports.transformSpan = exports.transformDocumentSpan = exports.transformFileTextChanges = exports.transformSourceFile = exports.transformDiagnostic = exports.transformCallHierarchyItem = void 0;
|
|
4
4
|
const language_core_1 = require("@volar/language-core");
|
|
5
5
|
const utils_1 = require("./utils");
|
|
6
6
|
const transformedDiagnostics = new WeakMap();
|
|
7
|
+
const transformedSourceFiles = new WeakMap();
|
|
7
8
|
function transformCallHierarchyItem(language, item, filter) {
|
|
8
9
|
const span = transformSpan(language, item.file, item.span, filter);
|
|
9
10
|
const selectionSpan = transformSpan(language, item.file, item.selectionSpan, filter);
|
|
@@ -34,6 +35,7 @@ function transformDiagnostic(language, diagnostic) {
|
|
|
34
35
|
...diagnostic,
|
|
35
36
|
start: sourceSpan.start,
|
|
36
37
|
length: sourceSpan.length,
|
|
38
|
+
file: transformSourceFile(diagnostic.file, sourceScript.snapshot.getText(0, sourceScript.snapshot.getLength())),
|
|
37
39
|
});
|
|
38
40
|
}
|
|
39
41
|
}
|
|
@@ -48,6 +50,16 @@ function transformDiagnostic(language, diagnostic) {
|
|
|
48
50
|
return transformedDiagnostics.get(diagnostic);
|
|
49
51
|
}
|
|
50
52
|
exports.transformDiagnostic = transformDiagnostic;
|
|
53
|
+
function transformSourceFile(sourceFile, sourceText) {
|
|
54
|
+
if (!transformedSourceFiles.has(sourceFile)) {
|
|
55
|
+
transformedSourceFiles.set(sourceFile, {
|
|
56
|
+
...sourceFile,
|
|
57
|
+
text: sourceText,
|
|
58
|
+
});
|
|
59
|
+
}
|
|
60
|
+
return transformedSourceFiles.get(sourceFile);
|
|
61
|
+
}
|
|
62
|
+
exports.transformSourceFile = transformSourceFile;
|
|
51
63
|
function transformFileTextChanges(language, changes, filter) {
|
|
52
64
|
const [_, source] = (0, utils_1.getServiceScript)(language, changes.fileName);
|
|
53
65
|
if (source) {
|
|
@@ -1,3 +1,3 @@
|
|
|
1
1
|
import type * as ts from 'typescript';
|
|
2
2
|
import { LanguagePlugin } from '@volar/language-core';
|
|
3
|
-
export declare function createAsyncLanguageServicePlugin(extensions: string[], scriptKind: ts.ScriptKind, loadLanguagePlugins: (ts: typeof import('typescript'), info: ts.server.PluginCreateInfo) => Promise<LanguagePlugin[]
|
|
3
|
+
export declare function createAsyncLanguageServicePlugin(extensions: string[], scriptKind: ts.ScriptKind, loadLanguagePlugins: (ts: typeof import('typescript'), info: ts.server.PluginCreateInfo) => Promise<LanguagePlugin[]>, getLanguageId: (fileName: string) => string): ts.server.PluginModuleFactory;
|
|
@@ -8,7 +8,7 @@ const createLanguageServicePlugin_1 = require("./createLanguageServicePlugin");
|
|
|
8
8
|
const externalFiles = new WeakMap();
|
|
9
9
|
const decoratedLanguageServices = new WeakSet();
|
|
10
10
|
const decoratedLanguageServiceHosts = new WeakSet();
|
|
11
|
-
function createAsyncLanguageServicePlugin(extensions, scriptKind, loadLanguagePlugins) {
|
|
11
|
+
function createAsyncLanguageServicePlugin(extensions, scriptKind, loadLanguagePlugins, getLanguageId) {
|
|
12
12
|
return modules => {
|
|
13
13
|
const { typescript: ts } = modules;
|
|
14
14
|
const pluginModule = {
|
|
@@ -55,14 +55,14 @@ function createAsyncLanguageServicePlugin(extensions, scriptKind, loadLanguagePl
|
|
|
55
55
|
const language = (0, language_core_1.createLanguage)(languagePlugins, ts.sys.useCaseSensitiveFileNames, fileName => {
|
|
56
56
|
const snapshot = getScriptSnapshot(fileName);
|
|
57
57
|
if (snapshot) {
|
|
58
|
-
language.scripts.set(fileName, (
|
|
58
|
+
language.scripts.set(fileName, getLanguageId(fileName), snapshot);
|
|
59
59
|
}
|
|
60
60
|
else {
|
|
61
61
|
language.scripts.delete(fileName);
|
|
62
62
|
}
|
|
63
63
|
});
|
|
64
64
|
(0, decorateLanguageService_1.decorateLanguageService)(language, info.languageService);
|
|
65
|
-
(0, decorateLanguageServiceHost_1.decorateLanguageServiceHost)(language, info.languageServiceHost,
|
|
65
|
+
(0, decorateLanguageServiceHost_1.decorateLanguageServiceHost)(ts, language, info.languageServiceHost, getLanguageId);
|
|
66
66
|
info.project.markAsDirty();
|
|
67
67
|
initialized = true;
|
|
68
68
|
});
|
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
import type * as ts from 'typescript';
|
|
2
2
|
import { LanguagePlugin } from '@volar/language-core';
|
|
3
|
-
export declare function createLanguageServicePlugin(loadLanguagePlugins: (ts: typeof import('typescript'), info: ts.server.PluginCreateInfo) => LanguagePlugin[]): ts.server.PluginModuleFactory;
|
|
3
|
+
export declare function createLanguageServicePlugin(loadLanguagePlugins: (ts: typeof import('typescript'), info: ts.server.PluginCreateInfo) => LanguagePlugin[], getLanguageId: (fileName: string) => string): ts.server.PluginModuleFactory;
|
|
4
4
|
export declare function arrayItemsEqual(a: string[], b: string[]): boolean;
|
|
@@ -8,7 +8,7 @@ const externalFiles = new WeakMap();
|
|
|
8
8
|
const projectExternalFileExtensions = new WeakMap();
|
|
9
9
|
const decoratedLanguageServices = new WeakSet();
|
|
10
10
|
const decoratedLanguageServiceHosts = new WeakSet();
|
|
11
|
-
function createLanguageServicePlugin(loadLanguagePlugins) {
|
|
11
|
+
function createLanguageServicePlugin(loadLanguagePlugins, getLanguageId) {
|
|
12
12
|
return modules => {
|
|
13
13
|
const { typescript: ts } = modules;
|
|
14
14
|
const pluginModule = {
|
|
@@ -26,14 +26,14 @@ function createLanguageServicePlugin(loadLanguagePlugins) {
|
|
|
26
26
|
const language = (0, language_core_1.createLanguage)(languagePlugins, ts.sys.useCaseSensitiveFileNames, fileName => {
|
|
27
27
|
const snapshot = getScriptSnapshot(fileName);
|
|
28
28
|
if (snapshot) {
|
|
29
|
-
language.scripts.set(fileName, (
|
|
29
|
+
language.scripts.set(fileName, getLanguageId(fileName), snapshot);
|
|
30
30
|
}
|
|
31
31
|
else {
|
|
32
32
|
language.scripts.delete(fileName);
|
|
33
33
|
}
|
|
34
34
|
});
|
|
35
35
|
(0, decorateLanguageService_1.decorateLanguageService)(language, info.languageService);
|
|
36
|
-
(0, decorateLanguageServiceHost_1.decorateLanguageServiceHost)(language, info.languageServiceHost,
|
|
36
|
+
(0, decorateLanguageServiceHost_1.decorateLanguageServiceHost)(ts, language, info.languageServiceHost, getLanguageId);
|
|
37
37
|
}
|
|
38
38
|
return info.languageService;
|
|
39
39
|
},
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import type * as ts from 'typescript';
|
|
2
2
|
import type { LanguagePlugin } from '@volar/language-core';
|
|
3
3
|
export declare let getLanguagePlugins: (ts: typeof import('typescript'), options: ts.CreateProgramOptions) => LanguagePlugin[];
|
|
4
|
-
export declare
|
|
4
|
+
export declare let getLanguageId: (fileName: string) => string;
|
|
5
|
+
export declare function runTsc(tscPath: string, extensions: string[], _getLanguagePlugins: typeof getLanguagePlugins, _getLanguageId: typeof getLanguageId): void;
|
package/lib/quickstart/runTsc.js
CHANGED
|
@@ -1,11 +1,14 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.runTsc = exports.getLanguagePlugins = void 0;
|
|
3
|
+
exports.runTsc = exports.getLanguageId = exports.getLanguagePlugins = void 0;
|
|
4
4
|
const fs = require("fs");
|
|
5
5
|
let getLanguagePlugins = () => [];
|
|
6
6
|
exports.getLanguagePlugins = getLanguagePlugins;
|
|
7
|
-
|
|
7
|
+
let getLanguageId = () => 'ts';
|
|
8
|
+
exports.getLanguageId = getLanguageId;
|
|
9
|
+
function runTsc(tscPath, extensions, _getLanguagePlugins, _getLanguageId) {
|
|
8
10
|
exports.getLanguagePlugins = _getLanguagePlugins;
|
|
11
|
+
exports.getLanguageId = _getLanguageId;
|
|
9
12
|
const proxyApiPath = require.resolve('../node/proxyCreateProgram');
|
|
10
13
|
const readFileSync = fs.readFileSync;
|
|
11
14
|
fs.readFileSync = (...args) => {
|
|
@@ -18,10 +21,12 @@ function runTsc(tscPath, extensions, _getLanguagePlugins) {
|
|
|
18
21
|
tsc = replace(tsc, /allSupportedExtensions = .*(?=;)/, s => s + `.concat([[${extsText}]])`);
|
|
19
22
|
// proxy createProgram
|
|
20
23
|
tsc = replace(tsc, /function createProgram\(.+\) {/, s => `var createProgram = require(${JSON.stringify(proxyApiPath)}).proxyCreateProgram(`
|
|
21
|
-
+
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
24
|
+
+ [
|
|
25
|
+
`new Proxy({}, { get(_target, p, _receiver) { return eval(p); } } )`,
|
|
26
|
+
`_createProgram`,
|
|
27
|
+
`require(${JSON.stringify(__filename)}).getLanguagePlugins`,
|
|
28
|
+
`require(${JSON.stringify(__filename)}).getLanguageId`,
|
|
29
|
+
].join(', ')
|
|
25
30
|
+ `);\n`
|
|
26
31
|
+ s.replace('createProgram', '_createProgram'));
|
|
27
32
|
return tsc;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@volar/typescript",
|
|
3
|
-
"version": "2.2.0-alpha.
|
|
3
|
+
"version": "2.2.0-alpha.2",
|
|
4
4
|
"license": "MIT",
|
|
5
5
|
"files": [
|
|
6
6
|
"**/*.js",
|
|
@@ -12,13 +12,13 @@
|
|
|
12
12
|
"directory": "packages/typescript"
|
|
13
13
|
},
|
|
14
14
|
"dependencies": {
|
|
15
|
-
"@volar/language-core": "2.2.0-alpha.
|
|
15
|
+
"@volar/language-core": "2.2.0-alpha.2",
|
|
16
16
|
"path-browserify": "^1.0.1"
|
|
17
17
|
},
|
|
18
18
|
"devDependencies": {
|
|
19
19
|
"@types/node": "latest",
|
|
20
20
|
"@types/path-browserify": "latest",
|
|
21
|
-
"@volar/language-service": "2.2.0-alpha.
|
|
21
|
+
"@volar/language-service": "2.2.0-alpha.2"
|
|
22
22
|
},
|
|
23
|
-
"gitHead": "
|
|
23
|
+
"gitHead": "c6a538c915cc8b32ad9a7ca1092a29a326d49161"
|
|
24
24
|
}
|