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.
		
		
		
		
			
				
					101 lines
				
				2.4 KiB
			
		
		
			
		
	
	
					101 lines
				
				2.4 KiB
			| 
								 
											4 years ago
										 
									 | 
							
								/**
							 | 
						||
| 
								 | 
							
								 * A Node.js wrapper for terminal-notify (with fallback).
							 | 
						||
| 
								 | 
							
								 */
							 | 
						||
| 
								 | 
							
								var utils = require('../lib/utils');
							 | 
						||
| 
								 | 
							
								var Growl = require('./growl');
							 | 
						||
| 
								 | 
							
								var path = require('path');
							 | 
						||
| 
								 | 
							
								var notifier = path.join(
							 | 
						||
| 
								 | 
							
								  __dirname,
							 | 
						||
| 
								 | 
							
								  '../vendor/mac.noindex/terminal-notifier.app/Contents/MacOS/terminal-notifier'
							 | 
						||
| 
								 | 
							
								);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								var EventEmitter = require('events').EventEmitter;
							 | 
						||
| 
								 | 
							
								var util = require('util');
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								var errorMessageOsX =
							 | 
						||
| 
								 | 
							
								  'You need Mac OS X 10.8 or above to use NotificationCenter,' +
							 | 
						||
| 
								 | 
							
								  ' or use Growl fallback with constructor option {withFallback: true}.';
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								module.exports = NotificationCenter;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								function NotificationCenter(options) {
							 | 
						||
| 
								 | 
							
								  options = utils.clone(options || {});
							 | 
						||
| 
								 | 
							
								  if (!(this instanceof NotificationCenter)) {
							 | 
						||
| 
								 | 
							
								    return new NotificationCenter(options);
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								  this.options = options;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  EventEmitter.call(this);
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								util.inherits(NotificationCenter, EventEmitter);
							 | 
						||
| 
								 | 
							
								var activeId = null;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								function noop() {}
							 | 
						||
| 
								 | 
							
								NotificationCenter.prototype.notify = function(options, callback) {
							 | 
						||
| 
								 | 
							
								  var fallbackNotifier;
							 | 
						||
| 
								 | 
							
								  var id = identificator();
							 | 
						||
| 
								 | 
							
								  options = utils.clone(options || {});
							 | 
						||
| 
								 | 
							
								  activeId = id;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  if (typeof options === 'string') {
							 | 
						||
| 
								 | 
							
								    options = { title: 'node-notifier', message: options };
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								  callback = callback || noop;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  if (typeof callback !== 'function') {
							 | 
						||
| 
								 | 
							
								    throw new TypeError(
							 | 
						||
| 
								 | 
							
								      'The second argument must be a function callback. You have passed ' +
							 | 
						||
| 
								 | 
							
								        typeof fn
							 | 
						||
| 
								 | 
							
								    );
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  var actionJackedCallback = utils.actionJackerDecorator(
							 | 
						||
| 
								 | 
							
								    this,
							 | 
						||
| 
								 | 
							
								    options,
							 | 
						||
| 
								 | 
							
								    callback,
							 | 
						||
| 
								 | 
							
								    function(data) {
							 | 
						||
| 
								 | 
							
								      if (activeId !== id) return false;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								      if (data === 'activate') {
							 | 
						||
| 
								 | 
							
								        return 'click';
							 | 
						||
| 
								 | 
							
								      }
							 | 
						||
| 
								 | 
							
								      if (data === 'timeout') {
							 | 
						||
| 
								 | 
							
								        return 'timeout';
							 | 
						||
| 
								 | 
							
								      }
							 | 
						||
| 
								 | 
							
								      if (data === 'replied') {
							 | 
						||
| 
								 | 
							
								        return 'replied';
							 | 
						||
| 
								 | 
							
								      }
							 | 
						||
| 
								 | 
							
								      return false;
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								  );
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  options = utils.mapToMac(options);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  if (!options.message && !options.group && !options.list && !options.remove) {
							 | 
						||
| 
								 | 
							
								    callback(new Error('Message, group, remove or list property is required.'));
							 | 
						||
| 
								 | 
							
								    return this;
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  var argsList = utils.constructArgumentList(options);
							 | 
						||
| 
								 | 
							
								  if (utils.isMountainLion()) {
							 | 
						||
| 
								 | 
							
								    utils.fileCommandJson(
							 | 
						||
| 
								 | 
							
								      this.options.customPath || notifier,
							 | 
						||
| 
								 | 
							
								      argsList,
							 | 
						||
| 
								 | 
							
								      actionJackedCallback
							 | 
						||
| 
								 | 
							
								    );
							 | 
						||
| 
								 | 
							
								    return this;
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  if (fallbackNotifier || !!this.options.withFallback) {
							 | 
						||
| 
								 | 
							
								    fallbackNotifier = fallbackNotifier || new Growl(this.options);
							 | 
						||
| 
								 | 
							
								    return fallbackNotifier.notify(options, callback);
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  callback(new Error(errorMessageOsX));
							 | 
						||
| 
								 | 
							
								  return this;
							 | 
						||
| 
								 | 
							
								};
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								function identificator() {
							 | 
						||
| 
								 | 
							
								  return { _ref: 'val' };
							 | 
						||
| 
								 | 
							
								}
							 |