Skip to content

Commit

Permalink
Merge pull request #14100 from Microsoft/BowerComponentsFix
Browse files Browse the repository at this point in the history
Type acquisition support for bower_components directory
  • Loading branch information
jramsay authored Mar 30, 2017
2 parents e298f75 + 8d1c9d5 commit 2e313ca
Show file tree
Hide file tree
Showing 2 changed files with 64 additions and 10 deletions.
51 changes: 49 additions & 2 deletions src/harness/unittests/typingsInstaller.ts
Original file line number Diff line number Diff line change
Expand Up @@ -692,7 +692,54 @@ namespace ts.projectSystem {
checkProjectActualFiles(p, [app.path, jqueryDTS.path]);
});

it("configured projects discover from bower.josn", () => {
it("configured projects discover from bower_components", () => {
const app = {
path: "/app.js",
content: ""
};
const jsconfig = {
path: "/jsconfig.json",
content: JSON.stringify({})
};
const jquery = {
path: "/bower_components/jquery/index.js",
content: ""
};
const jqueryPackage = {
path: "/bower_components/jquery/package.json",
content: JSON.stringify({ name: "jquery" })
};
const jqueryDTS = {
path: "/tmp/node_modules/@types/jquery/index.d.ts",
content: ""
};
const host = createServerHost([app, jsconfig, jquery, jqueryPackage]);
const installer = new (class extends Installer {
constructor() {
super(host, { globalTypingsCacheLocation: "/tmp", typesRegistry: createTypesRegistry("jquery") });
}
installWorker(_requestId: number, _args: string[], _cwd: string, cb: server.typingsInstaller.RequestCompletedAction) {
const installedTypings = ["@types/jquery"];
const typingFiles = [jqueryDTS];
executeCommand(this, host, installedTypings, typingFiles, cb);
}
})();

const projectService = createProjectService(host, { useSingleInferredProject: true, typingsInstaller: installer });
projectService.openClientFile(app.path);

checkNumberOfProjects(projectService, { configuredProjects: 1 });
const p = projectService.configuredProjects[0];
checkProjectActualFiles(p, [app.path]);
checkWatchedFiles(host, [jsconfig.path, "/bower_components", "/node_modules"]);

installer.installAll(/*expectedCount*/ 1);

checkNumberOfProjects(projectService, { configuredProjects: 1 });
checkProjectActualFiles(p, [app.path, jqueryDTS.path]);
});

it("configured projects discover from bower.json", () => {
const app = {
path: "/app.js",
content: ""
Expand Down Expand Up @@ -975,7 +1022,7 @@ namespace ts.projectSystem {
}
});

it("should use cached locaitons", () => {
it("should use cached locations", () => {
const f = {
path: "/a/b/app.js",
content: ""
Expand Down
23 changes: 15 additions & 8 deletions src/services/jsTyping.ts
Original file line number Diff line number Diff line change
Expand Up @@ -99,8 +99,11 @@ namespace ts.JsTyping {
const bowerJsonPath = combinePaths(searchDir, "bower.json");
getTypingNamesFromJson(bowerJsonPath, filesToWatch);

const bowerComponentsPath = combinePaths(searchDir, "bower_components");
getTypingNamesFromPackagesFolder(bowerComponentsPath);

const nodeModulesPath = combinePaths(searchDir, "node_modules");
getTypingNamesFromNodeModuleFolder(nodeModulesPath);
getTypingNamesFromPackagesFolder(nodeModulesPath);
}
getTypingNamesFromSourceFileNames(fileNames);

Expand Down Expand Up @@ -199,20 +202,24 @@ namespace ts.JsTyping {
}

/**
* Infer typing names from node_module folder
* @param nodeModulesPath is the path to the "node_modules" folder
* Infer typing names from packages folder (ex: node_module, bower_components)
* @param packagesFolderPath is the path to the packages folder
*/
function getTypingNamesFromNodeModuleFolder(nodeModulesPath: string) {
function getTypingNamesFromPackagesFolder(packagesFolderPath: string) {
filesToWatch.push(packagesFolderPath);

// Todo: add support for ModuleResolutionHost too
if (!host.directoryExists(nodeModulesPath)) {
if (!host.directoryExists(packagesFolderPath)) {
return;
}

const typingNames: string[] = [];
const fileNames = host.readDirectory(nodeModulesPath, [".json"], /*excludes*/ undefined, /*includes*/ undefined, /*depth*/ 2);
const fileNames = host.readDirectory(packagesFolderPath, [".json"], /*excludes*/ undefined, /*includes*/ undefined, /*depth*/ 2);
for (const fileName of fileNames) {
const normalizedFileName = normalizePath(fileName);
if (getBaseFileName(normalizedFileName) !== "package.json") {
const baseFileName = getBaseFileName(normalizedFileName);
if (baseFileName !== "package.json" && baseFileName !== "bower.json") {
continue;
}
const result = readConfigFile(normalizedFileName, (path: string) => host.readFile(path));
Expand All @@ -224,7 +231,7 @@ namespace ts.JsTyping {
// npm 3's package.json contains a "_requiredBy" field
// we should include all the top level module names for npm 2, and only module names whose
// "_requiredBy" field starts with "#" or equals "/" for npm 3.
if (packageJson._requiredBy &&
if (baseFileName === "package.json" && packageJson._requiredBy &&
filter(packageJson._requiredBy, (r: string) => r[0] === "#" || r === "/").length === 0) {
continue;
}
Expand Down

0 comments on commit 2e313ca

Please sign in to comment.