Skip to content

Commit 62b7d1a

Browse files
FatmeFatme
Fatme
authored and
Fatme
committed
Merge pull request #602 from NativeScript/fatme/devDependencies
Doesn't handle the dependencies of devDependencies
2 parents 572acff + fcc8fc6 commit 62b7d1a

File tree

2 files changed

+94
-33
lines changed

2 files changed

+94
-33
lines changed

lib/tools/broccoli/node-modules-dest-copy.ts

+34-32
Original file line numberDiff line numberDiff line change
@@ -30,41 +30,43 @@ export class DestCopy implements IBroccoliPlugin {
3030

3131
public rebuildChangedDirectories(changedDirectories: string[], platform: string): void {
3232
_.each(changedDirectories, changedDirectoryAbsolutePath => {
33-
let pathToPackageJson = path.join(changedDirectoryAbsolutePath, "package.json");
34-
let packageJsonFiles = fs.existsSync(pathToPackageJson) ? [pathToPackageJson] : [];
35-
let nodeModulesFolderPath = path.join(changedDirectoryAbsolutePath, "node_modules");
36-
packageJsonFiles = packageJsonFiles.concat(this.enumeratePackageJsonFilesSync(nodeModulesFolderPath));
37-
38-
_.each(packageJsonFiles, packageJsonFilePath => {
39-
let fileContent = require(packageJsonFilePath);
40-
let isPlugin = fileContent.nativescript;
41-
42-
if(!this.devDependencies[fileContent.name]) { // Don't flatten dev dependencies
43-
44-
let currentDependency = {
45-
name: fileContent.name,
46-
version: fileContent.version,
47-
directory: path.dirname(packageJsonFilePath),
48-
isPlugin: isPlugin
49-
};
33+
if(!this.devDependencies[path.basename(changedDirectoryAbsolutePath)]) {
34+
let pathToPackageJson = path.join(changedDirectoryAbsolutePath, constants.PACKAGE_JSON_FILE_NAME);
35+
let packageJsonFiles = fs.existsSync(pathToPackageJson) ? [pathToPackageJson] : [];
36+
let nodeModulesFolderPath = path.join(changedDirectoryAbsolutePath, constants.NODE_MODULES_FOLDER_NAME);
37+
packageJsonFiles = packageJsonFiles.concat(this.enumeratePackageJsonFilesSync(nodeModulesFolderPath));
5038

51-
let addedDependency = this.dependencies[currentDependency.name];
52-
if (addedDependency) {
53-
if (semver.gt(currentDependency.version, addedDependency.version)) {
54-
let currentDependencyMajorVersion = semver.major(currentDependency.version);
55-
let addedDependencyMajorVersion = semver.major(addedDependency.version);
56-
57-
let message = `The depedency located at ${addedDependency.directory} with version ${addedDependency.version} will be replaced with dependency located at ${currentDependency.directory} with version ${currentDependency.version}`;
58-
let logger = $injector.resolve("$logger");
59-
currentDependencyMajorVersion === addedDependencyMajorVersion ? logger.out(message) : logger.warn(message);
39+
_.each(packageJsonFiles, packageJsonFilePath => {
40+
let fileContent = require(packageJsonFilePath);
6041

42+
if(!this.devDependencies[fileContent.name]) { // Don't flatten dev dependencies
43+
let isPlugin = fileContent.nativescript;
44+
45+
let currentDependency = {
46+
name: fileContent.name,
47+
version: fileContent.version,
48+
directory: path.dirname(packageJsonFilePath),
49+
isPlugin: isPlugin
50+
};
51+
52+
let addedDependency = this.dependencies[currentDependency.name];
53+
if (addedDependency) {
54+
if (semver.gt(currentDependency.version, addedDependency.version)) {
55+
let currentDependencyMajorVersion = semver.major(currentDependency.version);
56+
let addedDependencyMajorVersion = semver.major(addedDependency.version);
57+
58+
let message = `The depedency located at ${addedDependency.directory} with version ${addedDependency.version} will be replaced with dependency located at ${currentDependency.directory} with version ${currentDependency.version}`;
59+
let logger = $injector.resolve("$logger");
60+
currentDependencyMajorVersion === addedDependencyMajorVersion ? logger.out(message) : logger.warn(message);
61+
62+
this.dependencies[currentDependency.name] = currentDependency;
63+
}
64+
} else {
6165
this.dependencies[currentDependency.name] = currentDependency;
6266
}
63-
} else {
64-
this.dependencies[currentDependency.name] = currentDependency;
6567
}
66-
}
67-
});
68+
});
69+
}
6870
});
6971

7072
_.each(this.dependencies, dependency => {
@@ -98,12 +100,12 @@ export class DestCopy implements IBroccoliPlugin {
98100
if(fs.existsSync(nodeModulesDirectoryPath)) {
99101
let contents = fs.readdirSync(nodeModulesDirectoryPath);
100102
for (let i = 0; i < contents.length; ++i) {
101-
let packageJsonFilePath = path.join(nodeModulesDirectoryPath, contents[i], "package.json");
103+
let packageJsonFilePath = path.join(nodeModulesDirectoryPath, contents[i], constants.PACKAGE_JSON_FILE_NAME);
102104
if (fs.existsSync(packageJsonFilePath)) {
103105
foundFiles.push(packageJsonFilePath);
104106
}
105107

106-
var directoryPath = path.join(nodeModulesDirectoryPath, contents[i], "node_modules");
108+
var directoryPath = path.join(nodeModulesDirectoryPath, contents[i], constants.NODE_MODULES_FOLDER_NAME);
107109
if (fs.existsSync(directoryPath)) {
108110
this.enumeratePackageJsonFilesSync(directoryPath, foundFiles);
109111
}

test/npm-support.ts

+60-1
Original file line numberDiff line numberDiff line change
@@ -83,6 +83,7 @@ function createProject(testInjector: IInjector, dependencies?: any): string {
8383
}
8484
};
8585
packageJsonData["dependencies"] = dependencies;
86+
packageJsonData["devDependencies"] = {};
8687

8788
testInjector.resolve("fs").writeJson(path.join(tempFolder, "package.json"), packageJsonData).wait();
8889
return tempFolder;
@@ -131,14 +132,19 @@ function setupProject(): IFuture<any> {
131132
}).future<any>()();
132133
}
133134

134-
function addDependencies(testInjector: IInjector, projectFolder: string, dependencies: any): IFuture<void> {
135+
function addDependencies(testInjector: IInjector, projectFolder: string, dependencies: any, devDependencies?: any): IFuture<void> {
135136
return (() => {
136137
let fs = testInjector.resolve("fs");
137138
let packageJsonPath = path.join(projectFolder, "package.json");
138139
let packageJsonData = fs.readJson(packageJsonPath).wait();
139140

140141
let currentDependencies = packageJsonData.dependencies;
141142
_.extend(currentDependencies, dependencies);
143+
144+
if(devDependencies) {
145+
let currentDevDependencies = packageJsonData.devDependencies;
146+
_.extend(currentDevDependencies, devDependencies);
147+
}
142148
fs.writeJson(packageJsonPath, packageJsonData).wait();
143149
}).future<void>()();
144150
}
@@ -176,4 +182,57 @@ describe("Npm support tests", () => {
176182
assert.isTrue(fs.exists(bplistCreatorFolderPath).wait());
177183
assert.isTrue(fs.exists(bplistParserFolderPath).wait());
178184
});
185+
});
186+
187+
describe("Flatten npm modules tests", () => {
188+
it("Doesn't handle the dependencies of devDependencies", () => {
189+
let projectSetup = setupProject().wait();
190+
let testInjector = projectSetup.testInjector;
191+
let projectFolder = projectSetup.projectFolder;
192+
let appDestinationFolderPath = projectSetup.appDestinationFolderPath;
193+
194+
let devDependencies = {
195+
"gulp": "3.9.0",
196+
"gulp-jscs": "1.6.0",
197+
"gulp-jshint": "1.11.0"
198+
};
199+
200+
addDependencies(testInjector, projectFolder, {}, devDependencies).wait();
201+
202+
preparePlatform(testInjector).wait();
203+
204+
// Assert
205+
let fs = testInjector.resolve("fs");
206+
let tnsModulesFolderPath = path.join(appDestinationFolderPath, "app", "tns_modules");
207+
208+
let lodashFolderPath = path.join(tnsModulesFolderPath, "lodash");
209+
assert.isTrue(fs.exists(lodashFolderPath).wait());
210+
211+
let gulpFolderPath = path.join(tnsModulesFolderPath, "gulp");
212+
assert.isFalse(fs.exists(gulpFolderPath).wait());
213+
214+
let gulpJscsFolderPath = path.join(tnsModulesFolderPath, "gulp-jscs");
215+
assert.isFalse(fs.exists(gulpJscsFolderPath).wait());
216+
217+
let gulpJshint = path.join(tnsModulesFolderPath, "gulp-jshint");
218+
assert.isFalse(fs.exists(gulpJshint).wait());
219+
220+
// Get all gulp dependencies
221+
let gulpDependencies = fs.readDirectory(path.join(projectFolder, "node_modules", "gulp", "node_modules")).wait();
222+
_.each(gulpDependencies, dependency => {
223+
assert.isFalse(fs.exists(path.join(tnsModulesFolderPath, dependency)).wait());
224+
});
225+
226+
// Get all gulp-jscs dependencies
227+
let gulpJscsDependencies = fs.readDirectory(path.join(projectFolder, "node_modules", "gulp-jscs", "node_modules")).wait();
228+
_.each(gulpJscsDependencies, dependency => {
229+
assert.isFalse(fs.exists(path.join(tnsModulesFolderPath, dependency)).wait());
230+
});
231+
232+
// Get all gulp-jshint dependencies
233+
let gulpJshintDependencies = fs.readDirectory(path.join(projectFolder, "node_modules", "gulp-jshint", "node_modules")).wait();
234+
_.each(gulpJshintDependencies, dependency => {
235+
assert.isFalse(fs.exists(path.join(tnsModulesFolderPath, dependency)).wait());
236+
});
237+
});
179238
});

0 commit comments

Comments
 (0)