@@ -14,57 +14,66 @@ import constants = require("./../../constants");
1414 * and tees a copy to the given path outside the tmp dir.
1515 */
1616export class DestCopy implements IBroccoliPlugin {
17- constructor ( private inputPath : string , private cachePath : string , private outputRoot : string , private projectDir : string ) { }
18-
19- public rebuild ( treeDiff : IDiffResult ) : void {
20- let dependencies = this . getDependencies ( ) ;
21- let devDependencies = this . getDevDependencies ( this . projectDir ) ;
22-
23- treeDiff . changedDirectories . forEach ( changedDirectory => {
24- let changedDirectoryAbsolutePath = path . join ( this . inputPath , constants . NODE_MODULES_FOLDER_NAME , changedDirectory ) ;
25- let packageJsonFiles = [ path . join ( changedDirectoryAbsolutePath , "package.json" ) ] ;
26- let nodeModulesFolderPath = path . join ( changedDirectoryAbsolutePath , "node_modules" ) ;
27- packageJsonFiles = packageJsonFiles . concat ( this . enumeratePackageJsonFilesSync ( nodeModulesFolderPath ) ) ;
28-
29- _ . each ( packageJsonFiles , packageJsonFilePath => {
30- let fileContent = require ( packageJsonFilePath ) ;
31- let isPlugin = fileContent . nativescript ;
17+ private dependencies : IDictionary < any > = null ;
18+ private devDependencies : IDictionary < any > = null ;
3219
33- if ( ! devDependencies [ fileContent . name ] ) { // Don't flatten dev dependencies
34-
35- let currentDependency = {
36- name : fileContent . name ,
37- version : fileContent . version ,
38- directory : path . dirname ( packageJsonFilePath ) ,
39- isPlugin : isPlugin
40- } ;
20+ constructor ( private inputPath : string , private cachePath : string , private outputRoot : string , private projectDir : string ) {
21+ this . dependencies = Object . create ( null ) ;
22+ this . devDependencies = this . getDevDependencies ( projectDir ) ;
23+ }
24+
25+ public rebuildChangedDirectories ( changedDirectories : string [ ] ) : void {
26+ _ . each ( changedDirectories , changedDirectoryAbsolutePath => {
27+ let pathToPackageJson = path . join ( changedDirectoryAbsolutePath , "package.json" ) ;
28+ if ( fs . existsSync ( pathToPackageJson ) ) {
29+ let packageJsonFiles = [ pathToPackageJson ] ;
30+ let nodeModulesFolderPath = path . join ( changedDirectoryAbsolutePath , "node_modules" ) ;
31+ packageJsonFiles = packageJsonFiles . concat ( this . enumeratePackageJsonFilesSync ( nodeModulesFolderPath ) ) ;
4132
42- let addedDependency = dependencies [ currentDependency . name ] ;
43- if ( addedDependency ) {
44- if ( semver . gt ( currentDependency . version , addedDependency . version ) ) {
45- let currentDependencyMajorVersion = semver . major ( currentDependency . version ) ;
46- let addedDependencyMajorVersion = semver . major ( addedDependency . version ) ;
33+ _ . each ( packageJsonFiles , packageJsonFilePath => {
34+ let fileContent = require ( packageJsonFilePath ) ;
35+ let isPlugin = fileContent . nativescript ;
4736
48- 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 } ` ;
49- let logger = $injector . resolve ( "$logger" ) ;
50- currentDependencyMajorVersion === addedDependencyMajorVersion ? logger . out ( message ) : logger . warn ( message ) ;
51-
52- dependencies [ currentDependency . name ] = currentDependency ;
37+ if ( ! this . devDependencies [ fileContent . name ] ) { // Don't flatten dev dependencies
38+
39+ let currentDependency = {
40+ name : fileContent . name ,
41+ version : fileContent . version ,
42+ directory : path . dirname ( packageJsonFilePath ) ,
43+ isPlugin : isPlugin
44+ } ;
45+
46+ let addedDependency = this . dependencies [ currentDependency . name ] ;
47+ if ( addedDependency ) {
48+ if ( semver . gt ( currentDependency . version , addedDependency . version ) ) {
49+ let currentDependencyMajorVersion = semver . major ( currentDependency . version ) ;
50+ let addedDependencyMajorVersion = semver . major ( addedDependency . version ) ;
51+
52+ 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 } ` ;
53+ let logger = $injector . resolve ( "$logger" ) ;
54+ currentDependencyMajorVersion === addedDependencyMajorVersion ? logger . out ( message ) : logger . warn ( message ) ;
55+
56+ this . dependencies [ currentDependency . name ] = currentDependency ;
57+ }
58+ } else {
59+ this . dependencies [ currentDependency . name ] = currentDependency ;
5360 }
54- } else {
55- dependencies [ currentDependency . name ] = currentDependency ;
5661 }
57- }
58- } ) ;
62+ } ) ;
63+ }
5964 } ) ;
6065
61- _ . each ( dependencies , dependency => {
62- shelljs . cp ( "-R " , dependency . directory , this . outputRoot ) ;
66+ _ . each ( this . dependencies , dependency => {
67+ shelljs . cp ( "-Rf " , dependency . directory , this . outputRoot ) ;
6368 shelljs . rm ( "-rf" , path . join ( this . outputRoot , dependency . name , "node_modules" ) ) ;
6469 if ( dependency . isPlugin ) {
6570 shelljs . rm ( "-rf" , path . join ( this . outputRoot , dependency . name , "platforms" ) ) ;
6671 }
6772 } ) ;
73+ }
74+
75+ public rebuild ( treeDiff : IDiffResult ) : void {
76+ this . rebuildChangedDirectories ( treeDiff . changedDirectories ) ;
6877
6978 // Cache input tree
7079 let projectFilePath = path . join ( this . projectDir , constants . PACKAGE_JSON_FILE_NAME ) ;
@@ -73,22 +82,6 @@ export class DestCopy implements IBroccoliPlugin {
7382 fs . writeFileSync ( projectFilePath , JSON . stringify ( projectFileContent , null , "\t" ) , { encoding : "utf8" } ) ;
7483 }
7584
76- private getDependencies ( ) : IDictionary < any > {
77- let result = Object . create ( null ) ;
78- if ( fs . existsSync ( this . outputRoot ) ) {
79- let dirs = fs . readdirSync ( this . outputRoot ) ;
80- _ . each ( dirs , dir => {
81- let filePath = path . join ( dir , constants . PACKAGE_JSON_FILE_NAME ) ;
82- if ( fs . existsSync ( filePath ) ) {
83- let fileContent = require ( filePath ) ;
84- result [ fileContent . name ] = fileContent ;
85- }
86- } ) ;
87- }
88-
89- return result ;
90- }
91-
9285 private getDevDependencies ( projectDir : string ) : IDictionary < any > {
9386 let projectFilePath = path . join ( projectDir , constants . PACKAGE_JSON_FILE_NAME ) ;
9487 let projectFileContent = require ( projectFilePath ) ;
0 commit comments