Skip to content

Commit ea2f68b

Browse files
sheetalkamatminestarks
authored andcommitted
Allow only package names as plugin names
1 parent 9294e96 commit ea2f68b

File tree

3 files changed

+55
-0
lines changed

3 files changed

+55
-0
lines changed

src/server/project.ts

+4
Original file line numberDiff line numberDiff line change
@@ -1474,6 +1474,10 @@ namespace ts.server {
14741474

14751475
protected enablePlugin(pluginConfigEntry: PluginImport, searchPaths: string[], pluginConfigOverrides: Map<any> | undefined) {
14761476
this.projectService.logger.info(`Enabling plugin ${pluginConfigEntry.name} from candidate paths: ${searchPaths.join(",")}`);
1477+
if (parsePackageName(pluginConfigEntry.name).rest) {
1478+
this.projectService.logger.info(`kipped loading plugin ${pluginConfigEntry.name} because only package name is allowed plugin name`);
1479+
return;
1480+
}
14771481

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

src/testRunner/tsconfig.json

+1
Original file line numberDiff line numberDiff line change
@@ -172,6 +172,7 @@
172172
"unittests/tsserver/occurences.ts",
173173
"unittests/tsserver/openFile.ts",
174174
"unittests/tsserver/packageJsonInfo.ts",
175+
"unittests/tsserver/plugins.ts",
175176
"unittests/tsserver/projectErrors.ts",
176177
"unittests/tsserver/projectReferenceCompileOnSave.ts",
177178
"unittests/tsserver/projectReferenceErrors.ts",
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)