8
8
const fs = require ( 'fs-extra' )
9
9
const glob = require ( 'it-glob' )
10
10
11
- const findHttpClientPkg = ( targetDir ) => {
12
- const location = require . resolve ( 'ipfs-http-client' , {
13
- paths : [
14
- targetDir
15
- ]
16
- } )
17
-
18
- return require ( location . replace ( 'src/index.js' , 'package.json' ) )
19
- }
20
-
21
11
const isDep = ( name , pkg ) => {
22
12
return Object . keys ( pkg . dependencies || { } ) . filter ( dep => dep === name ) . pop ( )
23
13
}
@@ -47,6 +37,16 @@ const hasYarnLock = (targetDir) => {
47
37
return fs . existsSync ( path . join ( targetDir , 'yarn.lock' ) )
48
38
}
49
39
40
+ const printFailureMessage = ( message ) => {
41
+ console . info ( '-------------------------------------------------------------------' ) // eslint-disable-line no-console
42
+ console . info ( '' ) // eslint-disable-line no-console
43
+ console . info ( message ) // eslint-disable-line no-console
44
+ console . info ( '' ) // eslint-disable-line no-console
45
+ console . info ( 'Dependant project has not been tested with updated dependencies' ) // eslint-disable-line no-console
46
+ console . info ( '' ) // eslint-disable-line no-console
47
+ console . info ( '-------------------------------------------------------------------' ) // eslint-disable-line no-console
48
+ }
49
+
50
50
const installDependencies = async ( targetDir ) => {
51
51
console . info ( 'Installing dependencies' ) // eslint-disable-line no-console
52
52
if ( hasYarnLock ( targetDir ) ) {
@@ -64,46 +64,56 @@ const installDependencies = async (targetDir) => {
64
64
}
65
65
}
66
66
67
- const linkIPFSInDir = async ( targetDir , ipfsDir , ipfsPkg , httpClientPkg ) => {
67
+ const upgradeDependenciesInDir = async ( targetDir , deps ) => {
68
68
const modulePkgPath = path . join ( targetDir , 'package.json' )
69
69
const modulePkg = require ( modulePkgPath )
70
70
71
- // if the project also depends on the http client, upgrade it to the same version we are using
72
- if ( dependsOn ( 'ipfs-http-client' , modulePkg ) ) {
73
- console . info ( 'Upgrading ipfs-http-client dependency to' , httpClientPkg . version ) // eslint-disable-line no-console
74
- await exec ( 'npm' , [ 'install' , `ipfs-http-client@${ httpClientPkg . version } ` ] , {
75
- cwd : targetDir
76
- } )
71
+ modulePkg . dependencies = modulePkg . dependencies || { }
72
+ modulePkg . peerDependencies = modulePkg . peerDependencies || { }
73
+ modulePkg . optionalDependencies = modulePkg . optionalDependencies || { }
74
+ modulePkg . devDependencies = modulePkg . devDependencies || { }
75
+
76
+ console . info ( 'Upgrading deps' ) // eslint-disable-line no-console
77
+
78
+ for ( const dep of Object . keys ( deps ) ) {
79
+ const existingVersion = modulePkg . dependencies [ dep ] || modulePkg . peerDependencies [ dep ] || modulePkg . optionalDependencies [ dep ] || modulePkg . devDependencies [ dep ]
80
+ console . info ( 'Upgrading' , dep , 'from version' , existingVersion , 'to' , deps [ dep ] ) // eslint-disable-line no-console
81
+
82
+ if ( modulePkg . dependencies [ dep ] || modulePkg . peerDependencies [ dep ] || modulePkg . optionalDependencies [ dep ] ) {
83
+ modulePkg . dependencies [ dep ] = deps [ dep ]
84
+ } else if ( modulePkg . devDependencies [ dep ] ) {
85
+ modulePkg . devDependencies [ dep ] = deps [ dep ]
86
+ }
77
87
}
78
88
79
- console . info ( `Linking ipfs@${ ipfsPkg . version } in dir ${ targetDir } ` ) // eslint-disable-line no-console
80
- await exec ( 'npx' , [ 'connect-deps' , 'link' , path . relative ( await fs . realpath ( targetDir ) , await fs . realpath ( ipfsDir ) ) ] , {
81
- cwd : targetDir
82
- } )
83
- await exec ( 'npx' , [ 'connect-deps' , 'connect' ] , {
89
+ await fs . writeFile ( modulePkgPath , JSON . stringify ( modulePkg , null , 2 ) )
90
+
91
+ await exec ( 'npm' , [ 'install' ] , {
84
92
cwd : targetDir
85
93
} )
86
94
}
87
95
88
- const testModule = async ( targetDir , ipfsDir , ipfsPkg , httpClientPkg ) => {
96
+ const testModule = async ( targetDir , deps ) => {
89
97
const pkgPath = path . join ( targetDir , 'package.json' )
90
98
91
99
if ( ! fs . existsSync ( pkgPath ) ) {
92
- console . info ( `No package.json found at ${ pkgPath } ` ) // eslint-disable-line no-console
100
+ printFailureMessage ( `No package.json found at ${ pkgPath } ` )
93
101
94
102
return
95
103
}
96
104
97
105
const modulePkg = require ( pkgPath )
98
106
99
- if ( ! dependsOn ( 'ipfs' , modulePkg ) && ! dependsOn ( 'ipfs-http-client' , modulePkg ) ) {
100
- console . info ( `Module ${ modulePkg . name } does not depend on IPFS or the IPFS HTTP Client` ) // eslint-disable-line no-console
107
+ for ( const dep of Object . keys ( deps ) ) {
108
+ if ( ! dependsOn ( dep , modulePkg ) ) {
109
+ printFailureMessage ( `Module ${ modulePkg . name } does not depend on ${ dep } ` )
101
110
102
- return
111
+ return
112
+ }
103
113
}
104
114
105
115
if ( ! modulePkg . scripts || ! modulePkg . scripts . test ) {
106
- console . info ( `Module ${ modulePkg . name } has no tests` ) // eslint-disable-line no-console
116
+ printFailureMessage ( `Module ${ modulePkg . name } has no tests` )
107
117
108
118
return
109
119
}
@@ -114,26 +124,26 @@ const testModule = async (targetDir, ipfsDir, ipfsPkg, httpClientPkg) => {
114
124
cwd : targetDir
115
125
} )
116
126
} catch ( err ) {
117
- console . info ( `Failed to run the tests of ${ modulePkg . name } , aborting` , err . message ) // eslint-disable-line no-console
127
+ printFailureMessage ( `Failed to run the tests of ${ modulePkg . name } , aborting` , err . message )
118
128
119
129
return
120
130
}
121
131
122
- // upgrade IPFS to the rc
123
- await linkIPFSInDir ( targetDir , ipfsDir , ipfsPkg , httpClientPkg )
132
+ // upgrade passed dependencies
133
+ await upgradeDependenciesInDir ( targetDir , deps )
124
134
125
- // run the tests with the new IPFS/IPFSHTTPClient
135
+ // run the tests with the new deps
126
136
await exec ( 'npm' , [ 'test' ] , {
127
137
cwd : targetDir
128
138
} )
129
139
}
130
140
131
- const testRepo = async ( targetDir , ipfsDir , ipfsPkg , httpClientPkg ) => {
141
+ const testRepo = async ( targetDir , deps ) => {
132
142
await installDependencies ( targetDir )
133
- await testModule ( targetDir , ipfsDir , ipfsPkg , httpClientPkg )
143
+ await testModule ( targetDir , deps )
134
144
}
135
145
136
- const testMonoRepo = async ( targetDir , ipfsDir , ipfsPkg , httpClientPkg ) => {
146
+ const testMonoRepo = async ( targetDir , deps ) => {
137
147
await installDependencies ( targetDir )
138
148
139
149
let lerna = path . join ( 'node_modules' , '.bin' , 'lerna' )
@@ -163,17 +173,13 @@ const testMonoRepo = async (targetDir, ipfsDir, ipfsPkg, httpClientPkg) => {
163
173
// test each package that depends on ipfs/http client
164
174
for ( const pattern of packages ) {
165
175
for await ( const match of glob ( targetDir , pattern ) ) {
166
- await testModule ( path . join ( targetDir , match ) , ipfsDir , ipfsPkg , httpClientPkg )
176
+ await testModule ( path . join ( targetDir , match ) , deps )
167
177
}
168
178
}
169
179
}
170
180
171
- async function testExternal ( opts ) {
172
- // work out our versions
173
- const ipfsDir = process . cwd ( )
174
- const ipfsPkg = require ( path . join ( ipfsDir , 'package.json' ) )
175
- const httpClientPkg = findHttpClientPkg ( ipfsDir )
176
- const targetDir = path . join ( os . tmpdir ( ) , `${ opts . name } -${ Date . now ( ) } ` )
181
+ async function testDependant ( opts ) {
182
+ const targetDir = path . join ( os . tmpdir ( ) , `test-dependant-${ Date . now ( ) } ` )
177
183
178
184
console . info ( `Cloning ${ opts . repo } into ${ targetDir } ` ) // eslint-disable-line no-console
179
185
await exec ( 'git' , [ 'clone' , opts . repo , targetDir ] , {
@@ -187,13 +193,13 @@ async function testExternal (opts) {
187
193
}
188
194
189
195
if ( isMonoRepo ( targetDir ) ) {
190
- await testMonoRepo ( targetDir , ipfsDir , ipfsPkg , httpClientPkg )
196
+ await testMonoRepo ( targetDir , opts . deps )
191
197
} else {
192
- await testRepo ( targetDir , ipfsDir , ipfsPkg , httpClientPkg )
198
+ await testRepo ( targetDir , opts . deps )
193
199
}
194
200
195
201
console . info ( `Removing ${ targetDir } ` ) // eslint-disable-line no-console
196
202
await fs . remove ( targetDir )
197
203
}
198
204
199
- module . exports = testExternal
205
+ module . exports = testDependant
0 commit comments