marionettejs/backbone.radio

View on GitHub
build/backbone.radio.min.js.map

Summary

Maintainability
Test Coverage
{"version":3,"sources":["backbone.radio.min.js"],"names":["global","factory","exports","module","require","define","amd","Backbone","Radio","_","this","removeHandler","store","name","callback","context","event","_callback","removeHandlers","names","keys","matched","i","length","_partial","channelName","_logs","bind","log","makeCallback","isFunction","_typeof","Symbol","iterator","obj","constructor","previousRadio","VERSION","noConflict","DEBUG","_debugText","warning","eventName","debugLog","console","warn","eventSplitter","_eventsApi","action","rest","results","key","result","apply","concat","test","extend","split","l","_callHandler","args","a1","a2","a3","call","toArray","arguments","slice","tuneIn","channel","_tunedIn","on","tuneOut","off","Requests","request","requests","_requests","handler","reply","replyOnce","self","once","stopReplying","_channels","Error","Channel","prototype","Events","reset","stopListening","systems","each","system","method","methodName","channels"],"mappings":"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","file":"backbone.radio.min.js","sourcesContent":["// Backbone.Radio v2.0.0\n\n(function (global, factory) {\n  typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory(require('underscore'), require('backbone')) :\n  typeof define === 'function' && define.amd ? define(['underscore', 'backbone'], factory) :\n  (global.Backbone = global.Backbone || {}, global.Backbone.Radio = factory(global._,global.Backbone));\n}(this, function (_,Backbone) { 'use strict';\n\n  _ = 'default' in _ ? _['default'] : _;\n  Backbone = 'default' in Backbone ? Backbone['default'] : Backbone;\n\n  var _typeof = typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\" ? function (obj) {\n    return typeof obj;\n  } : function (obj) {\n    return obj && typeof Symbol === \"function\" && obj.constructor === Symbol ? \"symbol\" : typeof obj;\n  };\n\n  var previousRadio = Backbone.Radio;\n\n  var Radio = Backbone.Radio = {};\n\n  Radio.VERSION = '2.0.0';\n\n  // This allows you to run multiple instances of Radio on the same\n  // webapp. After loading the new version, call `noConflict()` to\n  // get a reference to it. At the same time the old version will be\n  // returned to Backbone.Radio.\n  Radio.noConflict = function () {\n    Backbone.Radio = previousRadio;\n    return this;\n  };\n\n  // Whether or not we're in DEBUG mode or not. DEBUG mode helps you\n  // get around the issues of lack of warnings when events are mis-typed.\n  Radio.DEBUG = false;\n\n  // Format debug text.\n  Radio._debugText = function (warning, eventName, channelName) {\n    return warning + (channelName ? ' on the ' + channelName + ' channel' : '') + ': \"' + eventName + '\"';\n  };\n\n  // This is the method that's called when an unregistered event was called.\n  // By default, it logs warning to the console. By overriding this you could\n  // make it throw an Error, for instance. This would make firing a nonexistent event\n  // have the same consequence as firing a nonexistent method on an Object.\n  Radio.debugLog = function (warning, eventName, channelName) {\n    if (Radio.DEBUG && console && console.warn) {\n      console.warn(Radio._debugText(warning, eventName, channelName));\n    }\n  };\n\n  var eventSplitter = /\\s+/;\n\n  // An internal method used to handle Radio's method overloading for Requests.\n  // It's borrowed from Backbone.Events. It differs from Backbone's overload\n  // API (which is used in Backbone.Events) in that it doesn't support space-separated\n  // event names.\n  Radio._eventsApi = function (obj, action, name, rest) {\n    if (!name) {\n      return false;\n    }\n\n    var results = {};\n\n    // Handle event maps.\n    if ((typeof name === 'undefined' ? 'undefined' : _typeof(name)) === 'object') {\n      for (var key in name) {\n        var result = obj[action].apply(obj, [key, name[key]].concat(rest));\n        eventSplitter.test(key) ? _.extend(results, result) : results[key] = result;\n      }\n      return results;\n    }\n\n    // Handle space separated event names.\n    if (eventSplitter.test(name)) {\n      var names = name.split(eventSplitter);\n      for (var i = 0, l = names.length; i < l; i++) {\n        results[names[i]] = obj[action].apply(obj, [names[i]].concat(rest));\n      }\n      return results;\n    }\n\n    return false;\n  };\n\n  // An optimized way to execute callbacks.\n  Radio._callHandler = function (callback, context, args) {\n    var a1 = args[0],\n        a2 = args[1],\n        a3 = args[2];\n    switch (args.length) {\n      case 0:\n        return callback.call(context);\n      case 1:\n        return callback.call(context, a1);\n      case 2:\n        return callback.call(context, a1, a2);\n      case 3:\n        return callback.call(context, a1, a2, a3);\n      default:\n        return callback.apply(context, args);\n    }\n  };\n\n  // A helper used by `off` methods to the handler from the store\n  function removeHandler(store, name, callback, context) {\n    var event = store[name];\n    if ((!callback || callback === event.callback || callback === event.callback._callback) && (!context || context === event.context)) {\n      delete store[name];\n      return true;\n    }\n  }\n\n  function removeHandlers(store, name, callback, context) {\n    store || (store = {});\n    var names = name ? [name] : _.keys(store);\n    var matched = false;\n\n    for (var i = 0, length = names.length; i < length; i++) {\n      name = names[i];\n\n      // If there's no event by this name, log it and continue\n      // with the loop\n      if (!store[name]) {\n        continue;\n      }\n\n      if (removeHandler(store, name, callback, context)) {\n        matched = true;\n      }\n    }\n\n    return matched;\n  }\n\n  /*\n   * tune-in\n   * -------\n   * Get console logs of a channel's activity\n   *\n   */\n\n  var _logs = {};\n\n  // This is to produce an identical function in both tuneIn and tuneOut,\n  // so that Backbone.Events unregisters it.\n  function _partial(channelName) {\n    return _logs[channelName] || (_logs[channelName] = _.bind(Radio.log, Radio, channelName));\n  }\n\n  _.extend(Radio, {\n\n    // Log information about the channel and event\n    log: function log(channelName, eventName) {\n      if (typeof console === 'undefined') {\n        return;\n      }\n      var args = _.toArray(arguments).slice(2);\n      console.log('[' + channelName + '] \"' + eventName + '\"', args);\n    },\n\n    // Logs all events on this channel to the console. It sets an\n    // internal value on the channel telling it we're listening,\n    // then sets a listener on the Backbone.Events\n    tuneIn: function tuneIn(channelName) {\n      var channel = Radio.channel(channelName);\n      channel._tunedIn = true;\n      channel.on('all', _partial(channelName));\n      return this;\n    },\n\n    // Stop logging all of the activities on this channel to the console\n    tuneOut: function tuneOut(channelName) {\n      var channel = Radio.channel(channelName);\n      channel._tunedIn = false;\n      channel.off('all', _partial(channelName));\n      delete _logs[channelName];\n      return this;\n    }\n  });\n\n  /*\n   * Backbone.Radio.Requests\n   * -----------------------\n   * A messaging system for requesting data.\n   *\n   */\n\n  function makeCallback(callback) {\n    return _.isFunction(callback) ? callback : function () {\n      return callback;\n    };\n  }\n\n  Radio.Requests = {\n\n    // Make a request\n    request: function request(name) {\n      var args = _.toArray(arguments).slice(1);\n      var results = Radio._eventsApi(this, 'request', name, args);\n      if (results) {\n        return results;\n      }\n      var channelName = this.channelName;\n      var requests = this._requests;\n\n      // Check if we should log the request, and if so, do it\n      if (channelName && this._tunedIn) {\n        Radio.log.apply(this, [channelName, name].concat(args));\n      }\n\n      // If the request isn't handled, log it in DEBUG mode and exit\n      if (requests && (requests[name] || requests['default'])) {\n        var handler = requests[name] || requests['default'];\n        args = requests[name] ? args : arguments;\n        return Radio._callHandler(handler.callback, handler.context, args);\n      } else {\n        Radio.debugLog('An unhandled request was fired', name, channelName);\n      }\n    },\n\n    // Set up a handler for a request\n    reply: function reply(name, callback, context) {\n      if (Radio._eventsApi(this, 'reply', name, [callback, context])) {\n        return this;\n      }\n\n      this._requests || (this._requests = {});\n\n      if (this._requests[name]) {\n        Radio.debugLog('A request was overwritten', name, this.channelName);\n      }\n\n      this._requests[name] = {\n        callback: makeCallback(callback),\n        context: context || this\n      };\n\n      return this;\n    },\n\n    // Set up a handler that can only be requested once\n    replyOnce: function replyOnce(name, callback, context) {\n      if (Radio._eventsApi(this, 'replyOnce', name, [callback, context])) {\n        return this;\n      }\n\n      var self = this;\n\n      var once = _.once(function () {\n        self.stopReplying(name);\n        return makeCallback(callback).apply(this, arguments);\n      });\n\n      return this.reply(name, once, context);\n    },\n\n    // Remove handler(s)\n    stopReplying: function stopReplying(name, callback, context) {\n      if (Radio._eventsApi(this, 'stopReplying', name)) {\n        return this;\n      }\n\n      // Remove everything if there are no arguments passed\n      if (!name && !callback && !context) {\n        delete this._requests;\n      } else if (!removeHandlers(this._requests, name, callback, context)) {\n        Radio.debugLog('Attempted to remove the unregistered request', name, this.channelName);\n      }\n\n      return this;\n    }\n  };\n\n  /*\n   * Backbone.Radio.channel\n   * ----------------------\n   * Get a reference to a channel by name.\n   *\n   */\n\n  Radio._channels = {};\n\n  Radio.channel = function (channelName) {\n    if (!channelName) {\n      throw new Error('You must provide a name for the channel.');\n    }\n\n    if (Radio._channels[channelName]) {\n      return Radio._channels[channelName];\n    } else {\n      return Radio._channels[channelName] = new Radio.Channel(channelName);\n    }\n  };\n\n  /*\n   * Backbone.Radio.Channel\n   * ----------------------\n   * A Channel is an object that extends from Backbone.Events,\n   * and Radio.Requests.\n   *\n   */\n\n  Radio.Channel = function (channelName) {\n    this.channelName = channelName;\n  };\n\n  _.extend(Radio.Channel.prototype, Backbone.Events, Radio.Requests, {\n\n    // Remove all handlers from the messaging systems of this channel\n    reset: function reset() {\n      this.off();\n      this.stopListening();\n      this.stopReplying();\n      return this;\n    }\n  });\n\n  /*\n   * Top-level API\n   * -------------\n   * Supplies the 'top-level API' for working with Channels directly\n   * from Backbone.Radio.\n   *\n   */\n\n  var channel;\n  var args;\n  var systems = [Backbone.Events, Radio.Requests];\n  _.each(systems, function (system) {\n    _.each(system, function (method, methodName) {\n      Radio[methodName] = function (channelName) {\n        args = _.toArray(arguments).slice(1);\n        channel = this.channel(channelName);\n        return channel[methodName].apply(channel, args);\n      };\n    });\n  });\n\n  Radio.reset = function (channelName) {\n    var channels = !channelName ? this._channels : [this._channels[channelName]];\n    _.each(channels, function (channel) {\n      channel.reset();\n    });\n  };\n\n  return Radio;\n\n}));\n//# sourceMappingURL=./backbone.radio.js.map"],"sourceRoot":"/source/"}