mirror of https://github.com/lukechilds/docs.git
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
124 lines
3.0 KiB
124 lines
3.0 KiB
// Copyright 2013 The Obvious Corporation.
|
|
|
|
/**
|
|
* @fileoverview Helpers made available via require('phantomjs') once package is
|
|
* installed.
|
|
*/
|
|
|
|
var fs = require('fs')
|
|
var path = require('path')
|
|
var spawn = require('child_process').spawn
|
|
var Promise = require('es6-promise').Promise
|
|
|
|
|
|
/**
|
|
* Where the phantom binary can be found.
|
|
* @type {string}
|
|
*/
|
|
try {
|
|
var location = require('./location')
|
|
exports.path = path.resolve(__dirname, location.location)
|
|
exports.platform = location.platform
|
|
exports.arch = location.arch
|
|
} catch(e) {
|
|
// Must be running inside install script.
|
|
exports.path = null
|
|
}
|
|
|
|
|
|
/**
|
|
* The version of phantomjs installed by this package.
|
|
* @type {number}
|
|
*/
|
|
exports.version = '2.1.1'
|
|
|
|
|
|
/**
|
|
* Returns a clean path that helps avoid `which` finding bin files installed
|
|
* by NPM for this repo.
|
|
* @param {string} path
|
|
* @return {string}
|
|
*/
|
|
exports.cleanPath = function (path) {
|
|
return path
|
|
.replace(/:[^:]*node_modules[^:]*/g, '')
|
|
.replace(/(^|:)\.\/bin(\:|$)/g, ':')
|
|
.replace(/^:+/, '')
|
|
.replace(/:+$/, '')
|
|
}
|
|
|
|
|
|
// Make sure the binary is executable. For some reason doing this inside
|
|
// install does not work correctly, likely due to some NPM step.
|
|
if (exports.path) {
|
|
try {
|
|
// avoid touching the binary if it's already got the correct permissions
|
|
var st = fs.statSync(exports.path)
|
|
var mode = st.mode | parseInt('0555', 8)
|
|
if (mode !== st.mode) {
|
|
fs.chmodSync(exports.path, mode)
|
|
}
|
|
} catch (e) {
|
|
// Just ignore error if we don't have permission.
|
|
// We did our best. Likely because phantomjs was already installed.
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Executes a script or just runs PhantomJS
|
|
*/
|
|
exports.exec = function () {
|
|
var args = Array.prototype.slice.call(arguments)
|
|
return spawn(exports.path, args)
|
|
}
|
|
|
|
/**
|
|
* Runs PhantomJS with provided options
|
|
* @example
|
|
* // handy with WebDriver
|
|
* phantomjs.run('--webdriver=4444').then(program => {
|
|
* // do something
|
|
* program.kill()
|
|
* })
|
|
* @returns {Promise} the process of PhantomJS
|
|
*/
|
|
exports.run = function () {
|
|
var args = arguments
|
|
return new Promise(function (resolve, reject) {
|
|
try {
|
|
var program = exports.exec.apply(null, args)
|
|
var isFirst = true
|
|
var stderr = ''
|
|
program.stdout.on('data', function () {
|
|
// This detects PhantomJS instance get ready.
|
|
if (!isFirst) return
|
|
isFirst = false
|
|
resolve(program)
|
|
})
|
|
program.stderr.on('data', function (data) {
|
|
stderr = stderr + data.toString('utf8')
|
|
})
|
|
program.on('error', function (err) {
|
|
if (!isFirst) return
|
|
isFirst = false
|
|
reject(err)
|
|
})
|
|
program.on('exit', function (code) {
|
|
if (!isFirst) return
|
|
isFirst = false
|
|
if (code == 0) {
|
|
// PhantomJS doesn't use exit codes correctly :(
|
|
if (stderr.indexOf('Error:') == 0) {
|
|
reject(new Error(stderr))
|
|
} else {
|
|
resolve(program)
|
|
}
|
|
} else {
|
|
reject(new Error('Exit code: ' + code))
|
|
}
|
|
})
|
|
} catch (err) {
|
|
reject(err)
|
|
}
|
|
})
|
|
}
|
|
|