|
| 1 | +'use strict' |
| 2 | +const fs = require('fs') |
| 3 | +const path = require('path') |
| 4 | +const logger = require("./logger").winstonLogger; |
| 5 | + |
| 6 | +exports.run = (basePath, comparePath) => { |
| 7 | + if (!basePath || !comparePath) { |
| 8 | + logger.debug('Skipping package difference check.') |
| 9 | + } |
| 10 | + |
| 11 | + const base = readModules(basePath) |
| 12 | + const compare = readModules(comparePath) |
| 13 | + |
| 14 | + let isDiff = false; |
| 15 | + Object.keys(base.deps).forEach(baseKey => { |
| 16 | + if (baseKey in compare.deps) { |
| 17 | + if (base.deps[baseKey] === compare.deps[baseKey]) { |
| 18 | + //ignore this check |
| 19 | + } else { |
| 20 | + isDiff = true; |
| 21 | + return; |
| 22 | + } |
| 23 | + } else { |
| 24 | + isDiff = true; |
| 25 | + return; |
| 26 | + } |
| 27 | + }) |
| 28 | + return isDiff; |
| 29 | +} |
| 30 | +const readModules = (location) => { |
| 31 | + const table = {} |
| 32 | + |
| 33 | + // Resolve package dependencies |
| 34 | + if (location.indexOf('package.json') !== -1) { |
| 35 | + const data = fs.readFileSync(location.replace(':dev', ''), 'utf-8') |
| 36 | + let parsed |
| 37 | + try { parsed = JSON.parse(data) } catch (e) { parsed = false } |
| 38 | + if (!parsed) { return } |
| 39 | + |
| 40 | + const depsKey = location.indexOf(':dev') !== -1 ? 'devDependencies' : 'dependencies' |
| 41 | + const deps = parsed[depsKey] ? parsed[depsKey] : (parsed.dependencies || parsed.devDependencies) |
| 42 | + |
| 43 | + Object.keys(deps).forEach(key => { |
| 44 | + deps[key] = deps[key].replace(/\^|~/g, '') |
| 45 | + }) |
| 46 | + return { |
| 47 | + name: `${location} {${depsKey}}`, |
| 48 | + deps, |
| 49 | + } |
| 50 | + } |
| 51 | + |
| 52 | + fs.readdirSync(location) |
| 53 | + .filter(name => name !== '.bin') |
| 54 | + .map(name => { |
| 55 | + const pkg = path.join(location, name, 'package.json') |
| 56 | + const exists = fs.existsSync(pkg) |
| 57 | + if (!exists) { return } |
| 58 | + |
| 59 | + const data = fs.readFileSync(pkg, 'utf-8') |
| 60 | + let parsed |
| 61 | + |
| 62 | + try { parsed = JSON.parse(data) } catch (e) { parsed = false } |
| 63 | + if (!parsed) { return } |
| 64 | + |
| 65 | + table[name] = parsed.version |
| 66 | + }) |
| 67 | + return { |
| 68 | + name: location, |
| 69 | + deps: table, |
| 70 | +} |
| 71 | +} |
0 commit comments