Skip to content

Commit 7bc7173

Browse files
committed
Allow only package names as plugin names
1 parent b512d91 commit 7bc7173

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
@@ -1569,6 +1569,10 @@ namespace ts.server {
15691569

15701570
protected enablePlugin(pluginConfigEntry: PluginImport, searchPaths: string[], pluginConfigOverrides: Map<any> | undefined) {
15711571
this.projectService.logger.info(`Enabling plugin ${pluginConfigEntry.name} from candidate paths: ${searchPaths.join(",")}`);
1572+
if (parsePackageName(pluginConfigEntry.name).rest) {
1573+
this.projectService.logger.info(`kipped loading plugin ${pluginConfigEntry.name} because only package name is allowed plugin name`);
1574+
return;
1575+
}
15721576

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

src/testRunner/tsconfig.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -180,6 +180,7 @@
180180
"unittests/tsserver/openFile.ts",
181181
"unittests/tsserver/packageJsonInfo.ts",
182182
"unittests/tsserver/partialSemanticServer.ts",
183+
"unittests/tsserver/plugins.ts",
183184
"unittests/tsserver/projectErrors.ts",
184185
"unittests/tsserver/projectReferenceCompileOnSave.ts",
185186
"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)