1
- import * as fs from "fs" ;
2
1
import * as path from "path" ;
3
- import * as semver from "semver" ;
4
2
import * as shelljs from "shelljs" ;
5
3
import * as constants from "../../constants" ;
6
4
import * as minimatch from "minimatch" ;
@@ -10,96 +8,17 @@ export interface ILocalDependencyData extends IDependencyData {
10
8
directory : string ;
11
9
}
12
10
13
- export class NpmDependencyResolver {
14
- constructor (
15
- private projectDir : string
16
- ) {
17
- }
18
-
19
- private getDevDependencies ( projectDir : string ) : IDictionary < any > {
20
- let projectFilePath = path . join ( projectDir , constants . PACKAGE_JSON_FILE_NAME ) ;
21
- let projectFileContent = require ( projectFilePath ) ;
22
- return projectFileContent . devDependencies || { } ;
23
- }
24
-
25
- public resolveDependencies ( changedDirectories : string [ ] , platform : string ) : IDictionary < ILocalDependencyData > {
26
- const devDependencies = this . getDevDependencies ( this . projectDir ) ;
27
- const dependencies : IDictionary < ILocalDependencyData > = Object . create ( null ) ;
28
-
29
- _ . each ( changedDirectories , changedDirectoryAbsolutePath => {
30
- if ( ! devDependencies [ path . basename ( changedDirectoryAbsolutePath ) ] ) {
31
- let pathToPackageJson = path . join ( changedDirectoryAbsolutePath , constants . PACKAGE_JSON_FILE_NAME ) ;
32
- let packageJsonFiles = fs . existsSync ( pathToPackageJson ) ? [ pathToPackageJson ] : [ ] ;
33
- let nodeModulesFolderPath = path . join ( changedDirectoryAbsolutePath , constants . NODE_MODULES_FOLDER_NAME ) ;
34
- packageJsonFiles = packageJsonFiles . concat ( this . enumeratePackageJsonFilesSync ( nodeModulesFolderPath ) ) ;
35
-
36
- _ . each ( packageJsonFiles , packageJsonFilePath => {
37
- let fileContent = require ( packageJsonFilePath ) ;
38
-
39
- if ( ! devDependencies [ fileContent . name ] && fileContent . name && fileContent . version ) { // Don't flatten dev dependencies and flatten only dependencies with valid package.json
40
- let currentDependency : ILocalDependencyData = {
41
- name : fileContent . name ,
42
- version : fileContent . version ,
43
- directory : path . dirname ( packageJsonFilePath ) ,
44
- nativescript : fileContent . nativescript
45
- } ;
46
-
47
- let addedDependency = dependencies [ currentDependency . name ] ;
48
- if ( addedDependency ) {
49
- if ( semver . gt ( currentDependency . version , addedDependency . version ) ) {
50
- let currentDependencyMajorVersion = semver . major ( currentDependency . version ) ;
51
- let addedDependencyMajorVersion = semver . major ( addedDependency . version ) ;
52
-
53
- let message = `The dependency located at ${ addedDependency . directory } with version ${ addedDependency . version } will be replaced with dependency located at ${ currentDependency . directory } with version ${ currentDependency . version } ` ;
54
- let logger = $injector . resolve ( "$logger" ) ;
55
- currentDependencyMajorVersion === addedDependencyMajorVersion ? logger . out ( message ) : logger . warn ( message ) ;
56
-
57
- dependencies [ currentDependency . name ] = currentDependency ;
58
- }
59
- } else {
60
- dependencies [ currentDependency . name ] = currentDependency ;
61
- }
62
- }
63
- } ) ;
64
- }
65
- } ) ;
66
- return dependencies ;
67
- }
68
-
69
- private enumeratePackageJsonFilesSync ( nodeModulesDirectoryPath : string , foundFiles ?: string [ ] ) : string [ ] {
70
- foundFiles = foundFiles || [ ] ;
71
- if ( fs . existsSync ( nodeModulesDirectoryPath ) ) {
72
- let contents = fs . readdirSync ( nodeModulesDirectoryPath ) ;
73
- for ( let i = 0 ; i < contents . length ; ++ i ) {
74
- let moduleName = contents [ i ] ;
75
- let moduleDirectoryInNodeModules = path . join ( nodeModulesDirectoryPath , moduleName ) ;
76
- let packageJsonFilePath = path . join ( moduleDirectoryInNodeModules , constants . PACKAGE_JSON_FILE_NAME ) ;
77
- if ( fs . existsSync ( packageJsonFilePath ) ) {
78
- foundFiles . push ( packageJsonFilePath ) ;
79
- }
80
-
81
- let directoryPath = path . join ( moduleDirectoryInNodeModules , constants . NODE_MODULES_FOLDER_NAME ) ;
82
- if ( fs . existsSync ( directoryPath ) ) {
83
- this . enumeratePackageJsonFilesSync ( directoryPath , foundFiles ) ;
84
- } else if ( fs . statSync ( moduleDirectoryInNodeModules ) . isDirectory ( ) ) {
85
- // Scoped modules (e.g. @angular) are grouped in a subfolder and we need to enumerate them too.
86
- this . enumeratePackageJsonFilesSync ( moduleDirectoryInNodeModules , foundFiles ) ;
87
- }
88
- }
89
- }
90
- return foundFiles ;
91
- }
92
- }
93
-
94
11
export class TnsModulesCopy {
95
12
constructor (
96
13
private outputRoot : string ,
97
14
private $fs : IFileSystem
98
15
) {
99
16
}
100
17
101
- public copyModules ( dependencies : IDictionary < ILocalDependencyData > , platform : string ) : void {
102
- _ . each ( dependencies , dependency => {
18
+ public copyModules ( dependencies : any [ ] , platform : string ) : void {
19
+ for ( let entry in dependencies ) {
20
+ let dependency = dependencies [ entry ] ;
21
+
103
22
this . copyDependencyDir ( dependency ) ;
104
23
105
24
if ( dependency . name === constants . TNS_CORE_MODULES_NAME ) {
@@ -110,22 +29,23 @@ export class TnsModulesCopy {
110
29
let deleteFilesFutures = allFiles . filter ( file => minimatch ( file , "**/*.ts" , { nocase : true } ) ) . map ( file => this . $fs . deleteFile ( file ) ) ;
111
30
Future . wait ( deleteFilesFutures ) ;
112
31
113
- shelljs . cp ( "-Rf" , path . join ( tnsCoreModulesResourcePath , "*" ) , this . outputRoot ) ;
114
- this . $fs . deleteDirectory ( tnsCoreModulesResourcePath ) . wait ( ) ;
32
+ shelljs . rm ( "-rf" , path . join ( tnsCoreModulesResourcePath , "node_modules" ) ) ;
115
33
}
116
- } ) ;
34
+ }
117
35
}
118
36
119
37
private copyDependencyDir ( dependency : any ) : void {
120
- let dependencyDir = path . dirname ( dependency . name || "" ) ;
121
- let insideNpmScope = / ^ @ / . test ( dependencyDir ) ;
122
- let targetDir = this . outputRoot ;
123
- if ( insideNpmScope ) {
124
- targetDir = path . join ( this . outputRoot , dependencyDir ) ;
38
+ if ( dependency . depth === 0 ) {
39
+ let isScoped = dependency . name . indexOf ( "@" ) === 0 ;
40
+ let targetDir = this . outputRoot ;
41
+
42
+ if ( isScoped ) {
43
+ targetDir = path . join ( this . outputRoot , dependency . name . substring ( 0 , dependency . name . indexOf ( "/" ) ) ) ;
44
+ }
45
+
46
+ shelljs . mkdir ( "-p" , targetDir ) ;
47
+ shelljs . cp ( "-Rf" , dependency . directory , targetDir ) ;
125
48
}
126
- shelljs . mkdir ( "-p" , targetDir ) ;
127
- shelljs . cp ( "-Rf" , dependency . directory , targetDir ) ;
128
- shelljs . rm ( "-rf" , path . join ( targetDir , dependency . name , "node_modules" ) ) ;
129
49
}
130
50
}
131
51
0 commit comments