Skip to content

Commit 1eeb8be

Browse files
committed
fix: unable to load ivy native plugin
In typescript 4.1.4, ts allows only package names as plugin names, so `@angular/language-service/bundles/ivy` is disabled by ts. This PR will resolve `@angular/language-service` to path `./bundles/ivy.js` when the user enables the Ivy-native language service. fixed #1109
1 parent 18291b8 commit 1eeb8be

File tree

5 files changed

+16
-11
lines changed

5 files changed

+16
-11
lines changed

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -153,7 +153,7 @@
153153
},
154154
"dependencies": {
155155
"@angular/language-service": "11.2.0",
156-
"typescript": "~4.1.0",
156+
"typescript": "4.1.5",
157157
"vscode-jsonrpc": "6.0.0",
158158
"vscode-languageclient": "7.0.0",
159159
"vscode-languageserver": "7.0.0",

server/src/server.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ import {generateHelpMessage, parseCommandLine} from './cmdline_utils';
1010
import {createLogger} from './logger';
1111
import {ServerHost} from './server_host';
1212
import {Session} from './session';
13-
import {resolveNgLangSvc, resolveTsServer} from './version_provider';
13+
import {nglangsvc, resolveNgLangSvc, resolveTsServer} from './version_provider';
1414

1515
// Parse command line arguments
1616
const options = parseCommandLine(process.argv);
@@ -30,13 +30,13 @@ const ts = resolveTsServer(options.tsProbeLocations);
3030
const ng = resolveNgLangSvc(options.ngProbeLocations, options.ivy);
3131

3232
// ServerHost provides native OS functionality
33-
const host = new ServerHost();
33+
const host = new ServerHost(options.ivy);
3434

3535
// Establish a new server session that encapsulates lsp connection.
3636
const session = new Session({
3737
host,
3838
logger,
39-
ngPlugin: ng.name,
39+
ngPlugin: nglangsvc, // TypeScript allows only package names as plugin names.
4040
resolvedNgLsPath: ng.resolvedPath,
4141
ivy: options.ivy,
4242
logToConsole: options.logToConsole,

server/src/server_host.ts

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
*/
88

99
import * as ts from 'typescript/lib/tsserverlibrary';
10+
import {nglangsvc} from './version_provider';
1011

1112
/**
1213
* `ServerHost` is a wrapper around `ts.sys` for the Node system. In Node, all
@@ -19,7 +20,7 @@ export class ServerHost implements ts.server.ServerHost {
1920
readonly newLine: string;
2021
readonly useCaseSensitiveFileNames: boolean;
2122

22-
constructor() {
23+
constructor(private ivy: boolean) {
2324
this.args = ts.sys.args;
2425
this.newLine = ts.sys.newLine;
2526
this.useCaseSensitiveFileNames = ts.sys.useCaseSensitiveFileNames;
@@ -163,9 +164,13 @@ export class ServerHost implements ts.server.ServerHost {
163164

164165
require(initialPath: string, moduleName: string) {
165166
try {
166-
const modulePath = require.resolve(moduleName, {
167+
let modulePath = require.resolve(moduleName, {
167168
paths: [initialPath],
168169
});
170+
// TypeScript allows only package names as plugin names.
171+
if (this.ivy && moduleName === nglangsvc) {
172+
modulePath = this.resolvePath(modulePath + '/../ivy.js');
173+
}
169174
return {
170175
module: require(modulePath),
171176
error: undefined,

server/src/version_provider.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import * as fs from 'fs';
1010

1111
const MIN_TS_VERSION = '4.1';
1212
const MIN_NG_VERSION = '11.2';
13+
export const nglangsvc = '@angular/language-service';
1314

1415
/**
1516
* Represents a valid node module that has been successfully resolved.
@@ -84,7 +85,6 @@ export function resolveTsServer(probeLocations: string[]): NodeModule {
8485
* @param ivy true if Ivy language service is requested
8586
*/
8687
export function resolveNgLangSvc(probeLocations: string[], ivy: boolean): NodeModule {
87-
const nglangsvc = '@angular/language-service';
8888
const packageName = ivy ? `${nglangsvc}/bundles/ivy` : nglangsvc;
8989
return resolveWithMinVersion(packageName, MIN_NG_VERSION, probeLocations, nglangsvc);
9090
}

yarn.lock

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -907,10 +907,10 @@ [email protected]:
907907
tunnel "0.0.4"
908908
underscore "1.8.3"
909909

910-
typescript@~4.1.0:
911-
version "4.1.3"
912-
resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.1.3.tgz#519d582bd94cba0cf8934c7d8e8467e473f53bb7"
913-
integrity sha512-B3ZIOf1IKeH2ixgHhj6la6xdwR9QrLC5d1VKeCSY4tvkqhF2eqd9O7txNlS0PO3GrBAFIdr3L1ndNwteUbZLYg==
910+
911+
version "4.1.5"
912+
resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.1.5.tgz#123a3b214aaff3be32926f0d8f1f6e704eb89a72"
913+
integrity sha512-6OSu9PTIzmn9TCDiovULTnET6BgXtDYL4Gg4szY+cGsc3JP1dQL8qvE8kShTRx1NIw4Q9IBHlwODjkjWEtMUyA==
914914

915915
uc.micro@^1.0.1, uc.micro@^1.0.5:
916916
version "1.0.6"

0 commit comments

Comments
 (0)