init
This commit is contained in:
parent
896b7369bf
commit
1dc7b64e3e
|
@ -0,0 +1,52 @@
|
|||
#!/usr/bin/env node
|
||||
|
||||
'use strict'
|
||||
|
||||
const checker = require('../lib/checkSystem.js')
|
||||
const colors = require('colors')
|
||||
|
||||
// set color theme
|
||||
colors.setTheme({
|
||||
success: 'green',
|
||||
info: 'grey',
|
||||
warn: 'yellow',
|
||||
error: 'red',
|
||||
boldWarn: ['bold', 'yellow'],
|
||||
boldUnderlineSuccess: ['bold', 'underline', 'green'],
|
||||
boldUnderlineError: ['bold', 'underline', 'red']
|
||||
})
|
||||
|
||||
console.log('Checking versions...'.info, '\n')
|
||||
|
||||
checker(process.argv[2]).then((result) => {
|
||||
// check if the process should exit prematurely
|
||||
if (result.status != 0) {
|
||||
console.log(colors[result.message.type](result.message.text))
|
||||
process.exit(result.status)
|
||||
}
|
||||
|
||||
// print out results for each package
|
||||
result.packages.forEach((p) => {
|
||||
if (p.type === 'success') {
|
||||
console.log(('✔ ' + colors.bold(p.name) + ' was validated with ' + p.expectedVersion + '.').success)
|
||||
} else if (p.type === 'warn') {
|
||||
console.log((colors.bold(p.name) + ' was expected, but no validator found!').warn)
|
||||
} else if (p.type === 'error' && p.commandError) {
|
||||
console.log(('✘ Error validating ' + colors.bold(p.name) + ': ' + p.commandError).error)
|
||||
} else if (p.type === 'error' && !p.commandError) {
|
||||
console.log((
|
||||
'✘ ' + colors.bold(p.name) +
|
||||
' version is incorrect! Expected ' +
|
||||
p.expectedVersion + ' but was ' + p.foundVersion + '.'
|
||||
).error)
|
||||
}
|
||||
})
|
||||
|
||||
// print out a summary message
|
||||
if (result.message.type === 'success') {
|
||||
console.log('\n', result.message.text.boldUnderlineSuccess)
|
||||
} else {
|
||||
console.log('\n', result.message.text.boldUnderlineError)
|
||||
process.exit(1)
|
||||
}
|
||||
})
|
|
@ -0,0 +1,122 @@
|
|||
'use strict'
|
||||
|
||||
const check = function(pathToPackage) {
|
||||
const path = require('path')
|
||||
const Promise = require('bluebird')
|
||||
const exec = Promise.promisify(require('child_process').exec)
|
||||
const _ = require('lodash')
|
||||
const fs = require('fs')
|
||||
const jsonfile = require('jsonfile')
|
||||
const validaterRules = require('./validatorRules')
|
||||
const promiseHelpers = require('./promiseHelpers')
|
||||
|
||||
let engines
|
||||
|
||||
const checkerResult = {
|
||||
status: 0,
|
||||
message: '',
|
||||
packages: []
|
||||
}
|
||||
|
||||
const packageJsonPath = pathToPackage || path.join(process.cwd(), 'package.json')
|
||||
try {
|
||||
fs.accessSync(packageJsonPath)
|
||||
engines = jsonfile.readFileSync(packageJsonPath).engines
|
||||
} catch (ex) {
|
||||
checkerResult.message = {
|
||||
text: '✘ No package.json found in the current directory so I can\'t validate what you need!',
|
||||
type: 'error'
|
||||
}
|
||||
checkerResult.status = -1
|
||||
|
||||
return Promise.resolve(checkerResult)
|
||||
}
|
||||
|
||||
if (!engines) {
|
||||
checkerResult.message = {
|
||||
text: '✘ No engines found in package.json so I can\'t validate what you need!',
|
||||
type: 'error'
|
||||
}
|
||||
checkerResult.status = -1
|
||||
|
||||
return Promise.resolve(checkerResult)
|
||||
}
|
||||
|
||||
const thingsToCheck = Object.getOwnPropertyNames(engines)
|
||||
const validatorPromises = thingsToCheck.map(validate) // run the function over all items.
|
||||
|
||||
return promiseHelpers.allSettled(validatorPromises)
|
||||
.then((inspections) => {
|
||||
const environmentIsValid = _.every(inspections,
|
||||
(inspection) => inspection.isFulfilled() && inspection.value())
|
||||
|
||||
if (environmentIsValid) {
|
||||
checkerResult.message = {
|
||||
text: 'Environment looks good!',
|
||||
type: 'success'
|
||||
}
|
||||
} else {
|
||||
checkerResult.message = {
|
||||
text: 'Environment is invalid!',
|
||||
type: 'error'
|
||||
}
|
||||
}
|
||||
return checkerResult
|
||||
})
|
||||
|
||||
function validate(name) {
|
||||
// find it in the validators
|
||||
const validator = validaterRules[name]
|
||||
|
||||
if (validator === undefined) {
|
||||
checkerResult.packages.push({
|
||||
name: name,
|
||||
validatorFound: false,
|
||||
type: 'warn'
|
||||
})
|
||||
return Promise.resolve(false)
|
||||
}
|
||||
|
||||
// call the validator and pass in the version we expect
|
||||
return execAndCheck(validator, engines[name]).then((results) => {
|
||||
if (results.result) {
|
||||
checkerResult.packages.push({
|
||||
name: name,
|
||||
validatorFound: true,
|
||||
expectedVersion: engines[name],
|
||||
foundVersion: engines[name],
|
||||
type: 'success'
|
||||
})
|
||||
} else {
|
||||
checkerResult.packages.push({
|
||||
name: name,
|
||||
validatorFound: true,
|
||||
expectedVersion: engines[name],
|
||||
foundVersion: results.reason.trim() || 'missing',
|
||||
type: 'error'
|
||||
})
|
||||
}
|
||||
|
||||
return Promise.resolve(results.result)
|
||||
}).catch((error) => {
|
||||
checkerResult.packages.push({
|
||||
name: name,
|
||||
validatorFound: true,
|
||||
expectedVersion: engines[name],
|
||||
commandError: error,
|
||||
type: 'error'
|
||||
})
|
||||
return Promise.reject()
|
||||
})
|
||||
}
|
||||
|
||||
function execAndCheck(validator, expectedVersion) {
|
||||
return exec(validator.versionCheck).then((result) => {
|
||||
return {
|
||||
result: validator.versionValidate(result, expectedVersion),
|
||||
reason: result
|
||||
}
|
||||
}).catch((e) => { throw e })
|
||||
}
|
||||
}
|
||||
module.exports = check
|
|
@ -0,0 +1,24 @@
|
|||
const Promise = require('bluebird')
|
||||
|
||||
/**
|
||||
* Creates a promise that is resolved when all input promises have been
|
||||
* settled. The returned Promise is resolved with an array of
|
||||
* Promise.Inspection objects.
|
||||
*
|
||||
* This is the commonly accepted way of implementing allSettled() in Bluebird.
|
||||
* See: http://bluebirdjs.com/docs/api/reflect.html
|
||||
*
|
||||
* @param promises - The array of input promises.
|
||||
* @returns {Promise<Promise.Inspection[]>} A promise that will be resolved once
|
||||
* all input Promises have settled. The returned Promise will be resolved with a
|
||||
* corresponding array of Promise.Inspection objects.
|
||||
*/
|
||||
function allSettled(promises) {
|
||||
'use strict'
|
||||
const wrappedPromises = promises.map((curPromise) => curPromise.reflect())
|
||||
return Promise.all(wrappedPromises)
|
||||
}
|
||||
|
||||
module.exports = {
|
||||
allSettled: allSettled
|
||||
}
|
|
@ -0,0 +1,141 @@
|
|||
'use strict'
|
||||
|
||||
const semver = require('semver')
|
||||
|
||||
module.exports = {
|
||||
osx: {
|
||||
versionCheck: 'sw_vers -productVersion',
|
||||
versionValidate:
|
||||
(detectedVersion, expectedVersion) => expectedVersion === detectedVersion.trim()
|
||||
},
|
||||
node: {
|
||||
versionCheck: 'node -v',
|
||||
versionValidate:
|
||||
(detectedVersion, expectedVersion) => semver.satisfies(detectedVersion, expectedVersion)
|
||||
},
|
||||
npm: {
|
||||
versionCheck: 'npm -v',
|
||||
versionValidate:
|
||||
(detectedVersion, expectedVersion) => semver.satisfies(detectedVersion, expectedVersion)
|
||||
},
|
||||
jx: {
|
||||
versionCheck: 'jx -jxv',
|
||||
versionValidate:
|
||||
(result, version) => 'v' + version === result.trim()
|
||||
},
|
||||
cordova: {
|
||||
versionCheck: 'cordova -v',
|
||||
versionValidate:
|
||||
(result, version) => version === result.trim()
|
||||
},
|
||||
appium: {
|
||||
versionCheck: 'appium -v',
|
||||
versionValidate:
|
||||
(result, version) => version === result.trim()
|
||||
},
|
||||
'ios-deploy': {
|
||||
versionCheck: 'ios-deploy -V',
|
||||
versionValidate:
|
||||
(result, version) => version === result.trim()
|
||||
},
|
||||
'ios-sim': {
|
||||
versionCheck: 'ios-sim --version',
|
||||
versionValidate:
|
||||
(result, version) => version === result.trim()
|
||||
},
|
||||
bower: {
|
||||
versionCheck: 'bower -v',
|
||||
versionValidate:
|
||||
(result, version) => semver.satisfies(result, version)
|
||||
},
|
||||
'ios-webkit-debug-proxy': {
|
||||
versionCheck: 'brew list ios-webkit-debug-proxy --versions',
|
||||
versionValidate:
|
||||
(result, version) => result.includes(version)
|
||||
|
||||
},
|
||||
'ideviceinstaller': {
|
||||
versionCheck: 'brew list ideviceinstaller --versions',
|
||||
versionValidate:
|
||||
(result, version) => result.includes(version)
|
||||
},
|
||||
java: {
|
||||
versionCheck: 'javac -version 2>&1',
|
||||
versionValidate:
|
||||
(result, version) => result.includes(version)
|
||||
},
|
||||
ant: {
|
||||
versionCheck: 'ant -version',
|
||||
versionValidate:
|
||||
(result, version) => result.includes(version)
|
||||
},
|
||||
adb: {
|
||||
versionCheck: 'adb version',
|
||||
versionValidate:
|
||||
(result, version) => result.includes(version)
|
||||
},
|
||||
git: {
|
||||
versionCheck: 'git --version',
|
||||
versionValidate:
|
||||
(result, version) => {
|
||||
// http://stackoverflow.com/questions/82064/a-regex-for-version-number-parsing
|
||||
const found = result.match(/(\d+\.)?(\d+\.)?(\d+)/i)
|
||||
return found[0] === version
|
||||
}
|
||||
},
|
||||
windows: {
|
||||
versionCheck: 'ver',
|
||||
versionValidate:
|
||||
(result, version) => result.includes(version)
|
||||
},
|
||||
'gulp-cli': {
|
||||
versionCheck: 'npm list --depth=0 -g |grep gulp-cli',
|
||||
versionValidate:
|
||||
(result, version) => result.includes(version)
|
||||
},
|
||||
cocoapods: {
|
||||
versionCheck: 'pod --version',
|
||||
versionValidate:
|
||||
(result, version) => version === result.trim()
|
||||
},
|
||||
xcodebuild: {
|
||||
versionCheck: 'xcodebuild -version',
|
||||
versionValidate:
|
||||
(result, version) => result.includes(version)
|
||||
},
|
||||
carthage: {
|
||||
versionCheck: 'carthage version',
|
||||
versionValidate:
|
||||
(result, version) => version === result.trim()
|
||||
},
|
||||
xcpretty: {
|
||||
versionCheck: 'xcpretty -v',
|
||||
versionValidate:
|
||||
(result, version) => version === result.trim()
|
||||
},
|
||||
libimobiledevice: {
|
||||
versionCheck: 'brew list --versions |grep libimobiledevice',
|
||||
versionValidate:
|
||||
(result, version) => result.includes(version)
|
||||
},
|
||||
'deviceconsole': {
|
||||
versionCheck: 'npm list --depth=0 -g |grep deviceconsole',
|
||||
versionValidate:
|
||||
(result, version) => result.includes(version)
|
||||
},
|
||||
'check-engine': {
|
||||
versionCheck: 'npm list --depth=0 -g |grep check-engine',
|
||||
versionValidate:
|
||||
(result, version) => result.includes(version)
|
||||
},
|
||||
yarn: {
|
||||
versionCheck: 'yarn -v',
|
||||
versionValidate:
|
||||
(result, version) => semver.satisfies(result, version)
|
||||
},
|
||||
nsp: {
|
||||
versionCheck: 'nsp --version',
|
||||
versionValidate:
|
||||
(result, version) => version === result.trim()
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue