Skip to content

Commit

Permalink
Allow only package names as plugin names
Browse files Browse the repository at this point in the history
  • Loading branch information
sheetalkamat committed Dec 8, 2020
1 parent 524480f commit fa2403f
Show file tree
Hide file tree
Showing 3 changed files with 55 additions and 0 deletions.
4 changes: 4 additions & 0 deletions src/server/project.ts
Expand Up @@ -1550,6 +1550,10 @@ namespace ts.server {

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

const log = (message: string) => this.projectService.logger.info(message);
let errorLogs: string[] | undefined;
Expand Down
1 change: 1 addition & 0 deletions src/testRunner/tsconfig.json
Expand Up @@ -177,6 +177,7 @@
"unittests/tsserver/openFile.ts",
"unittests/tsserver/packageJsonInfo.ts",
"unittests/tsserver/partialSemanticServer.ts",
"unittests/tsserver/plugins.ts",
"unittests/tsserver/projectErrors.ts",
"unittests/tsserver/projectReferenceCompileOnSave.ts",
"unittests/tsserver/projectReferenceErrors.ts",
Expand Down
50 changes: 50 additions & 0 deletions src/testRunner/unittests/tsserver/plugins.ts
@@ -0,0 +1,50 @@
namespace ts.projectSystem {
describe("unittests:: tsserver:: plugins loading", () => {
function createHostWithPlugin(files: readonly File[]) {
const host = createServerHost(files);
const pluginsLoaded: string[] = [];
host.require = (_initialPath, moduleName) => {
pluginsLoaded.push(moduleName);
return {
module: () => ({
create(info: server.PluginCreateInfo) {
return Harness.LanguageService.makeDefaultProxy(info);
}
}),
error: undefined
};
};
return { host, pluginsLoaded };
}

it("With local plugins", () => {
const expectedToLoad = ["@myscoped/plugin", "unscopedPlugin"];
const notToLoad = ["../myPlugin", "myPlugin/../malicious"];
const aTs: File = { path: "/a.ts", content: `class c { prop = "hello"; foo() { return this.prop; } }` };
const tsconfig: File = {
path: "/tsconfig.json",
content: JSON.stringify({
compilerOptions: { plugins: [...expectedToLoad, ...notToLoad].map(name => ({ name })) }
})
};
const { host, pluginsLoaded } = createHostWithPlugin([aTs, tsconfig, libFile]);
const service = createProjectService(host);
service.openClientFile(aTs.path);
assert.deepEqual(pluginsLoaded, expectedToLoad);
});

it("With global plugins", () => {
const expectedToLoad = ["@myscoped/plugin", "unscopedPlugin"];
const notToLoad = ["../myPlugin", "myPlugin/../malicious"];
const aTs: File = { path: "/a.ts", content: `class c { prop = "hello"; foo() { return this.prop; } }` };
const tsconfig: File = {
path: "/tsconfig.json",
content: "{}"
};
const { host, pluginsLoaded } = createHostWithPlugin([aTs, tsconfig, libFile]);
const service = createProjectService(host, /*parameters*/ undefined, { globalPlugins: [...expectedToLoad, ...notToLoad] });
service.openClientFile(aTs.path);
assert.deepEqual(pluginsLoaded, expectedToLoad);
});
});
}

0 comments on commit fa2403f

Please sign in to comment.