electron-updater
Version:
Cross platform auto-updater for electron applications
81 lines (75 loc) • 2.4 kB
JavaScript
var async = require('async')
semver = require('semver'),
path = require('path'),
file = require('./file.js'),
fs = require('fs'),
directory = require('./directory.js')
function satisfy(desired, current, callback) {
var valid = semver.satisfies(current, desired)
callback(null, valid)
}
function checkDependency(name, callback) {
var desired = this.dependencies[name]
var packagePath = path.join(this.appDir, 'node_modules', name, 'package.json')
file.readJson(packagePath, function (err, pkg) {
if(err) return callback(null, false)
if(!pkg || !pkg.version) return callback(null, false)
var current = (pkg && pkg.version)
satisfy(desired, current, callback)
})
}
function checkPlugin(name, callback) {
var appName = this.name
var appVersion = this.version
var publisher = this.publisher
var plugins = this.plugins
var desired = this.plugins[name]
var appData = directory.appDir(publisher, appName)
var currentPluginsPath = path.join(appData, '.current')
file.readJson(currentPluginsPath, function (err, data) {
var current = data && data[name] ? data[name] : '0.0.0'
async.map(
['link', current],
function (v, callback) {
var packagePath = path.join(appData, 'plugins', name, v, 'package.json')
fs.stat(packagePath, function (err, stat) {
if(err) return callback(null, false)
callback(null, true)
})
},
function (err, results) {
if(err) return callback(err)
if(results[0]) return callback(null, true) // if linked, always true
if(!results[1]) return callback(null, false) // if missing always false
satisfy(desired, current, callback)
})
})
}
function all(items, value) {
for(var i = 0; i < items.length; i++) {
if(items[i] !== value)
return false
}
return true
}
function check(item, callback) {
switch(item.kind) {
case 'dependencies':
async.map(Object.getOwnPropertyNames(item.context.dependencies), checkDependency.bind(item.context), function (err, results) {
if(err) return callback(err)
callback(null, all(results, true))
})
break;
case 'plugins':
async.map(Object.getOwnPropertyNames(item.context.plugins), checkPlugin.bind(item.context), function (err, results) {
if(err) return callback(err)
callback(null, all(results, true))
})
break;
default:
return callback(new Error('invalid dependency kind detected'))
}
}
module.exports = {
check: check
}