-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathpretest.js
executable file
·99 lines (78 loc) · 2.96 KB
/
pretest.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
const fs = require('fs')
const path = require('path')
const semver = require('semver')
const debug = require('debug')('compatibility:pretest')
var install = require('npm-install-package')
// polyfill!
if (!Object.entries) {
Object.entries = function( obj ){
var ownProps = Object.keys( obj ),
i = ownProps.length,
resArray = new Array(i); // preallocate the Array
while (i--)
resArray[i] = [ownProps[i], obj[ownProps[i]]];
return resArray;
};
}
debug.enabled = true
module.exports = function (dir, cb) {
const fullPath = path.join(dir, 'package.json')
debug('getting dependencies from %s', fullPath)
const parentPackage = JSON.parse(fs.readFileSync(fullPath))
// get dependencies from ssb-server
const root_module = parentPackage.name
const plugins = parentPackage.compatibility || []
const parent = {}
if(plugins.length == 0)
throw new Error('compatibility: please specify an array of dependencies to be tested in package.json')
Object.entries(parentPackage.dependencies || {}).forEach(e => parent[e[0]] = e[1])
Object.entries(parentPackage.devDependencies || {}).forEach(e => parent[e[0]] = e[1])
// initialize empty array for new deps needed
const needDeps = []
// get dependencies from plugin directories
plugins.forEach(plugin => {
const fullPath = path.join(dir, 'node_modules', plugin, 'package.json')
debug('getting dependencies from %s', fullPath)
const childPackage = JSON.parse(fs.readFileSync(fullPath))
const pluginDeps = {}
Object.entries(childPackage.devDependencies || {}).forEach(e => pluginDeps[e[0]] = e[1])
Object.entries(pluginDeps).forEach(e => {
const [ k, v ] = e
if (Object.keys(parent).includes(k) === false || semver.intersects(parent[k], v) === false) {
if (k !== root_module ) {
if (needDeps[k] == null) {
debug('new dependency from %s: %o', plugin, { name: k, range: v })
needDeps[k] = v
} else {
const pairs = [
[needDeps[k], v],
[parent[k], v]
]
pairs.forEach(pair => {
if (pair[0] && semver.intersects(pair[0], pair[1]) === false) {
throw new Error('plugins have incompatible devDependencies, for:'+k+' '+pair.join(' '))
}
})
}
}
}
})
})
const devDeps = Object.entries(needDeps).map(e => [e[0], e[1]].join('@'))
if (devDeps.length > 0) {
debug('installing: %O', devDeps)
var opts = { saveDev: true, cache: true }
debug.enabled = true
debug('installing new plugin devDependencies')
install(devDeps, opts, function (err) {
if (err) throw err
// avoid tests passing via Travis CI if dependencies are out-of-date
debug('done! please re-run tests with these new dependencies')
//process.exit(1)
cb(new Error('compatibility:updated devdeps'))
})
} else {
debug('plugin devDeps look great!')
cb()
}
}