| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358 |
- var cp = require('child_process'),
- os = require('os'),
- fs = require('fs'),
- url = require('url'),
- path = require('path'),
- shellwords = require('shellwords'),
- semver = require('semver'),
- clone = require('lodash.clonedeep');
- var escapeQuotes = function (str) {
- if (typeof str === 'string') {
- return str.replace(/(["$`\\])/g, '\\$1');
- } else {
- return str;
- }
- };
- var inArray = function (arr, val) {
- for(var i = 0; i < arr.length; i++) {
- if (arr[i] === val) {
- return true;
- }
- }
- return false;
- };
- var notifySendFlags = {
- "u": "urgency",
- "urgency": "urgency",
- "t": "expire-time",
- "e": "expire-time",
- "expire": "expire-time",
- "expire-time": "expire-time",
- "i": "icon",
- "icon": "icon",
- "c": "category",
- "category": "category",
- "subtitle": "category",
- "h": "hint",
- "hint": "hint"
- };
- module.exports.command = function (notifier, options, cb) {
- notifier = shellwords.escape(notifier);
- return cp.exec(notifier + ' ' + options.join(' '), function (error, stdout, stderr) {
- if (error) return cb(error);
- cb(stderr, stdout);
- });
- };
- module.exports.fileCommand = function (notifier, options, cb) {
- return cp.execFile(notifier, options, function (error, stdout, stderr) {
- if (error) return cb(error, stdout);
- cb(stderr, stdout);
- });
- };
- module.exports.immediateFileCommand = function (notifier, options, cb) {
- notifierExists(notifier, function (exists) {
- if (!exists) return cb(new Error('Notifier (' + notifier + ') not found on system.'));
- cp.execFile(notifier, options);
- cb();
- });
- };
- function notifierExists (notifier, cb) {
- return fs.stat(notifier, function (err, stat) {
- if (!err) return cb(stat.isFile());
- // Check if Windows alias
- if (!!path.extname(notifier)) {
- // Has extentioon, no need to check more
- return cb(false);
- }
- // Check if there is an exe file in the directory
- return fs.stat(notifier + '.exe', function (err, stat) {
- cb(stat.isFile());
- });
- });
- }
- var mapAppIcon = function (options) {
- if (options.appIcon) {
- options.icon = options.appIcon;
- delete options.appIcon;
- }
- return options;
- };
- var mapText = function (options) {
- if (options.text) {
- options.message = options.text;
- delete options.text;
- }
- return options;
- };
- var mapIconShorthand = function (options) {
- if (options.i) {
- options.icon = options.i;
- delete options.i;
- }
- return options;
- };
- module.exports.mapToNotifySend = function (options) {
- options = mapAppIcon(options);
- options = mapText(options);
- for (var key in options) {
- if (key === "message" || key === "title") continue;
- if (options.hasOwnProperty(key) && (notifySendFlags[key] != key)) {
- options[notifySendFlags[key]] = options[key];
- delete options[key];
- }
- }
- return options;
- };
- module.exports.mapToGrowl = function (options) {
- options = mapAppIcon(options);
- options = mapIconShorthand(options);
- options = mapText(options);
- if (options.icon && !Buffer.isBuffer(options.icon)) {
- try {
- options.icon = fs.readFileSync(options.icon);
- }catch(ex){
- }
- }
- return options;
- };
- module.exports.mapToMac = function (options) {
- options = mapIconShorthand(options);
- options = mapText(options);
- if (options.icon) {
- options.appIcon = options.icon;
- delete options.icon;
- }
- if (options.sound === true) {
- options.sound = 'Bottle';
- }
- if (options.sound === false) {
- delete options.sound;
- }
- return options;
- };
- module.exports.actionJackerDecorator = function (emitter, options, fn, mapper) {
- options = clone(options);
- fn = fn || function (err, data) {};
- return function (err, data) {
- var resultantData = data;
- // Sanitize the data
- if(resultantData) {
- resultantData = resultantData.toLowerCase().trim();
- if(resultantData.match(/^activate/)) {
- resultantData = 'activate';
- }
- }
- fn.apply(emitter, [err, resultantData]);
- if (err || !mapper || !resultantData) return;
- var key = mapper(resultantData);
- if (!key) return;
- emitter.emit(key, emitter, options);
- };
- };
- module.exports.constructArgumentList = function (options, extra) {
- var args = [];
- extra = extra || {};
- // Massive ugly setup. Default args
- var initial = extra.initial || [];
- var keyExtra = extra.keyExtra || "";
- var allowedArguments = extra.allowedArguments || [];
- var noEscape = extra.noEscape !== void 0;
- var checkForAllowed = extra.allowedArguments !== void 0;
- var explicitTrue = !!extra.explicitTrue;
- var wrapper = extra.wrapper === void 0 ? '"' : extra.wrapper;
- var escapeFn = function(arg) {
- if (!noEscape) {
- arg = escapeQuotes(arg);
- }
- if(typeof arg === 'string'){
- arg = arg.replace(/\r?\n/g, '\\n');
- }
- return arg;
- }
- initial.forEach(function (val) {
- args.push(wrapper + escapeFn(val) + wrapper);
- });
- for(var key in options) {
- if (options.hasOwnProperty(key) && (!checkForAllowed || inArray(allowedArguments, key))) {
- if (explicitTrue && options[key] === true) args.push('-' + keyExtra + key);
- else if (explicitTrue && options[key] === false) continue;
- else args.push('-' + keyExtra + key, wrapper + escapeFn(options[key]) + wrapper);
- }
- }
- return args;
- };
- module.exports.mapToWin8 = function (options){
- options = mapAppIcon(options);
- options = mapText(options);
- if(options.icon){
- if (/^file:\/+/.test(options.icon)) {
- // should parse file protocol URL to path
- options.p = url.parse(options.icon).pathname.replace(/^\/(\w\:\/)/, "$1").replace(/\//g, "\\");
- } else {
- options.p = options.icon;
- }
- delete options.icon;
- }
- if(options.message){
- // Remove escape char to debug "HRESULT : 0xC00CE508" exception
- options.m = options.message.replace(/\x1b/g, '');
- delete options.message;
- }
- if (options.title) {
- options.t = options.title;
- delete options.title;
- }
- if (options.quiet || options.silent) {
- options.q = options.quiet || options.silent;
- delete options.quiet;
- delete options.silent;
- }
- if (options.q !== false) {
- options.q = true;
- } else {
- delete options.q;
- }
- if (options.sound) {
- delete options.q;
- delete options.sound;
- }
- if (options.wait) {
- options.w = options.wait;
- delete options.wait;
- }
- return options;
- };
- module.exports.mapToNotifu = function (options) {
- options = mapAppIcon(options);
- options = mapText(options);
- if(options.icon){
- options.i = options.icon;
- delete options.icon;
- }
- if(options.message){
- options.m = options.message;
- delete options.message;
- }
- if (options.title) {
- options.p = options.title;
- delete options.title;
- }
- if (options.time) {
- options.d = options.time;
- delete options.time;
- }
- if (options.q !== false) {
- options.q = true;
- } else {
- delete options.q;
- }
- if (options.quiet === false) {
- delete options.q;
- delete options.quiet;
- }
- if (options.sound) {
- delete options.q;
- delete options.sound;
- }
- if (options.t) {
- options.d = options.t;
- delete options.t;
- }
- if (options.type) {
- options.t = sanitizeNotifuTypeArgument(options.type);
- delete options.type;
- }
- return options;
- };
- module.exports.isMac = function() {
- return os.type() === 'Darwin';
- };
- module.exports.isMountainLion = function() {
- return os.type() === 'Darwin' && semver.satisfies(garanteeSemverFormat(os.release()), '>=12.0.0');
- };
- module.exports.isWin8 = function() {
- return os.type() === 'Windows_NT' && semver.satisfies(garanteeSemverFormat(os.release()), '>=6.2.9200');
- };
- module.exports.isLessThanWin8 = function() {
- return os.type() === 'Windows_NT' && semver.satisfies(garanteeSemverFormat(os.release()), '<6.2.9200');
- };
- function garanteeSemverFormat (version) {
- if (version.split('.').length === 2) {
- version += '.0';
- }
- return version;
- }
- function sanitizeNotifuTypeArgument(type) {
- if (typeof type === 'string' || type instanceof String) {
- if (type.toLowerCase() == 'info')
- return 'info';
- if (type.toLowerCase() == 'warn')
- return 'warn';
- if (type.toLowerCase() == 'error')
- return 'error';
- }
- return 'info';
- }
|