@@ -14,57 +14,66 @@ import constants = require("./../../constants");
14
14
* and tees a copy to the given path outside the tmp dir.
15
15
*/
16
16
export 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 ;
32
19
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 ) ) ;
41
32
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 ;
47
36
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 ;
53
60
}
54
- } else {
55
- dependencies [ currentDependency . name ] = currentDependency ;
56
61
}
57
- }
58
- } ) ;
62
+ } ) ;
63
+ }
59
64
} ) ;
60
65
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 ) ;
63
68
shelljs . rm ( "-rf" , path . join ( this . outputRoot , dependency . name , "node_modules" ) ) ;
64
69
if ( dependency . isPlugin ) {
65
70
shelljs . rm ( "-rf" , path . join ( this . outputRoot , dependency . name , "platforms" ) ) ;
66
71
}
67
72
} ) ;
73
+ }
74
+
75
+ public rebuild ( treeDiff : IDiffResult ) : void {
76
+ this . rebuildChangedDirectories ( treeDiff . changedDirectories ) ;
68
77
69
78
// Cache input tree
70
79
let projectFilePath = path . join ( this . projectDir , constants . PACKAGE_JSON_FILE_NAME ) ;
@@ -73,22 +82,6 @@ export class DestCopy implements IBroccoliPlugin {
73
82
fs . writeFileSync ( projectFilePath , JSON . stringify ( projectFileContent , null , "\t" ) , { encoding : "utf8" } ) ;
74
83
}
75
84
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
-
92
85
private getDevDependencies ( projectDir : string ) : IDictionary < any > {
93
86
let projectFilePath = path . join ( projectDir , constants . PACKAGE_JSON_FILE_NAME ) ;
94
87
let projectFileContent = require ( projectFilePath ) ;
0 commit comments