Skip to content

Commit 2be3fd8

Browse files
sheetalkamatminestarks
authored andcommitted
Allow only package names as plugin names
1 parent 2ae8d9f commit 2be3fd8

File tree

3 files changed

+55
-0
lines changed

3 files changed

+55
-0
lines changed

src/server/project.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1383,6 +1383,10 @@ namespace ts.server {
13831383

13841384
protected enablePlugin(pluginConfigEntry: PluginImport, searchPaths: string[], pluginConfigOverrides: Map<any> | undefined) {
13851385
this.projectService.logger.info(`Enabling plugin ${pluginConfigEntry.name} from candidate paths: ${searchPaths.join(",")}`);
1386+
if (parsePackageName(pluginConfigEntry.name).rest) {
1387+
this.projectService.logger.info(`kipped loading plugin ${pluginConfigEntry.name} because only package name is allowed plugin name`);
1388+
return;
1389+
}
13861390

13871391
const log = (message: string) => this.projectService.logger.info(message);
13881392
let errorLogs: string[] | undefined;

src/testRunner/tsconfig.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -155,6 +155,7 @@
155155
"unittests/tsserver/occurences.ts",
156156
"unittests/tsserver/openFile.ts",
157157
"unittests/tsserver/packageJsonInfo.ts",
158+
"unittests/tsserver/plugins.ts",
158159
"unittests/tsserver/projectErrors.ts",
159160
"unittests/tsserver/projectReferenceCompileOnSave.ts",
160161
"unittests/tsserver/projectReferenceErrors.ts",
Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
namespace ts.projectSystem {
2+
describe("unittests:: tsserver:: plugins loading", () => {
3+
function createHostWithPlugin(files: readonly File[]) {
4+
const host = createServerHost(files);
5+
const pluginsLoaded: string[] = [];
6+
host.require = (_initialPath, moduleName) => {
7+
pluginsLoaded.push(moduleName);
8+
return {
9+
module: () => ({
10+
create(info: server.PluginCreateInfo) {
11+
return Harness.LanguageService.makeDefaultProxy(info);
12+
}
13+
}),
14+
error: undefined
15+
};
16+
};
17+
return { host, pluginsLoaded };
18+
}
19+
20+
it("With local plugins", () => {
21+
const expectedToLoad = ["@myscoped/plugin", "unscopedPlugin"];
22+
const notToLoad = ["../myPlugin", "myPlugin/../malicious"];
23+
const aTs: File = { path: "/a.ts", content: `class c { prop = "hello"; foo() { return this.prop; } }` };
24+
const tsconfig: File = {
25+
path: "/tsconfig.json",
26+
content: JSON.stringify({
27+
compilerOptions: { plugins: [...expectedToLoad, ...notToLoad].map(name => ({ name })) }
28+
})
29+
};
30+
const { host, pluginsLoaded } = createHostWithPlugin([aTs, tsconfig, libFile]);
31+
const service = createProjectService(host);
32+
service.openClientFile(aTs.path);
33+
assert.deepEqual(pluginsLoaded, expectedToLoad);
34+
});
35+
36+
it("With global plugins", () => {
37+
const expectedToLoad = ["@myscoped/plugin", "unscopedPlugin"];
38+
const notToLoad = ["../myPlugin", "myPlugin/../malicious"];
39+
const aTs: File = { path: "/a.ts", content: `class c { prop = "hello"; foo() { return this.prop; } }` };
40+
const tsconfig: File = {
41+
path: "/tsconfig.json",
42+
content: "{}"
43+
};
44+
const { host, pluginsLoaded } = createHostWithPlugin([aTs, tsconfig, libFile]);
45+
const service = createProjectService(host, /*parameters*/ undefined, { globalPlugins: [...expectedToLoad, ...notToLoad] });
46+
service.openClientFile(aTs.path);
47+
assert.deepEqual(pluginsLoaded, expectedToLoad);
48+
});
49+
});
50+
}

0 commit comments

Comments
 (0)