Module: Angular::ClientScript

Defined in:
lib/angular/client_script.rb

Constant Summary collapse

FN_waitForAngular =

*/

"function(selector, callback) {\n  var el = document.querySelector(selector);\n  return el;\n  try {\n    if (angular.getTestability) {\n      angular.getTestability(el).whenStable(callback);\n    } else {\n      angular.element(el).injector().get('$browser').\n          notifyWhenNoOutstandingRequests(callback);\n    }\n  } catch (e) {\n    callback(e);\n  }\n};\n"
FN_findBindings =

/**

* Find a list of elements in the page by their angular binding.
*
* @param {string} binding The binding, e.g. {{cat.name}}.
* @param {boolean} exactMatch Whether the binding needs to be matched exactly
* @param {Element} using The scope of the search.
* @param {string} rootSelector The selector to use for the root app element.
*
* @return {Array.<Element>} The elements containing the binding.
*/
"function(binding, exactMatch, using, rootSelector) {\n  rootSelector = rootSelector || 'body';\n  using = using || document.querySelector(rootSelector);\n\n  if (angular.getTestability) {\n    return angular.getTestability(using).\n        findBindings(using, binding, exactMatch);\n  }\n\n  var bindings = using.getElementsByClassName('ng-binding');\n  var matches = [];\n  for (var i = 0; i < bindings.length; ++i) {\n    var dataBinding = angular.element(bindings[i]).data('$binding');\n    if(dataBinding) {\n      var bindingName = dataBinding.exp || dataBinding[0].exp || dataBinding;\n      if (exactMatch) {\n        var matcher = new RegExp('({|\\\\\\\\s|$|\\\\\\\\|)' + binding + '(}|\\\\\\\\s|^|\\\\\\\\|)');\n        if (matcher.test(bindingName)) {\n          matches.push(bindings[i]);\n        }\n      } else {\n        if (bindingName.indexOf(binding) != -1) {\n          matches.push(bindings[i]);\n        }\n      }\n\n    }\n  }\n  return matches; /* Return the whole array for webdriver.findElements. */\n};\n"
FN_findBindingsIds =

/**

* Find a list of element Ids in the page by their angular binding.
*
* @param {string} binding The binding, e.g. {{cat.name}}.
* @param {boolean} exactMatch Whether the binding needs to be matched exactly
* @param {Element} using The scope of the search.
* @param {string} rootSelector The selector to use for the root app element.
*
* @return {Array.<Element>} The elements containing the binding.
*/
"function(binding, exactMatch, using, rootSelector) {\n  var elements = findBindings(binding, exactMatch, using, rootSelector);\n  return createCapybaraNgMatches(elements);\n};\n"
FN_findRepeaterRows =

/**

* Find an array of elements matching a row within an ng-repeat.
* Always returns an array of only one element for plain old ng-repeat.
* Returns an array of all the elements in one segment for ng-repeat-start.
*
* @param {string} repeater The text of the repeater, e.g. 'cat in cats'.
* @param {number} index The row index.
* @param {Element} using The scope of the search.
* @param {string} rootSelector The selector to use for the root app element.
*
* @return {Array.<Element>} The row of the repeater, or an array of elements
*     in the first row in the case of ng-repeat-start.
*/
"function(repeater, index, using, rootSelector) {\n  rootSelector = rootSelector || 'body';\n  using = using || document.querySelector(rootSelector);\n\n  var prefixes = ['ng-', 'ng_', 'data-ng-', 'x-ng-', 'ng\\\\\\\\:'];\n  var rows = [];\n  for (var p = 0; p < prefixes.length; ++p) {\n    var attr = prefixes[p] + 'repeat';\n    var repeatElems = using.querySelectorAll('[' + attr + ']');\n    attr = attr.replace(/\\\\\\\\/g, '');\n    for (var i = 0; i < repeatElems.length; ++i) {\n      if (repeatElems[i].getAttribute(attr).indexOf(repeater) != -1) {\n        rows.push(repeatElems[i]);\n      }\n    }\n  }\n  /* multiRows is an array of arrays, where each inner array contains\n     one row of elements. */\n  var multiRows = [];\n  for (var p = 0; p < prefixes.length; ++p) {\n    var attr = prefixes[p] + 'repeat-start';\n    var repeatElems = using.querySelectorAll('[' + attr + ']');\n    attr = attr.replace(/\\\\\\\\/g, '');\n    for (var i = 0; i < repeatElems.length; ++i) {\n      if (repeatElems[i].getAttribute(attr).indexOf(repeater) != -1) {\n        var elem = repeatElems[i];\n        var row = [];\n        while (elem.nodeType != 8 ||\n            elem.nodeValue.indexOf(repeater) == -1) {\n          if (elem.nodeType == 1) {\n            row.push(elem);\n          }\n          elem = elem.nextSibling;\n        }\n        multiRows.push(row);\n      }\n    }\n  }\n  return [rows[index]].concat(multiRows[index]);\n};\n"
FN_findRepeaterRowsIds =

/**

* Find an array of element ids matching a row within an ng-repeat.
* Always returns an array of only one element for plain old ng-repeat.
* Returns an array of all the elements in one segment for ng-repeat-start.
*
* @param {string} repeater The text of the repeater, e.g. 'cat in cats'.
* @param {number} index The row index.
* @param {Element} using The scope of the search.
* @param {string} rootSelector The selector to use for the root app element.
*
* @return {Array.<Element>} The row of the repeater, or an array of elements
*     in the first row in the case of ng-repeat-start.
*/
"function(repeater, index, using, rootSelector) {\n  var elements = findRepeaterRows(repeater, index, using, rootSelector);\n  return createCapybaraNgMatches(elements);\n};\n"
FN_findAllRepeaterRows =

/**

  • Find all rows of an ng-repeat.

*

  • @param string repeater The text of the repeater, e.g. ‘cat in cats’.

  • @param Element using The scope of the search.

  • @param string rootSelector The selector to use for the root app element.

*

  • @return Array.<Element> All rows of the repeater.

*/

"function(repeater, using, rootSelector) {\n  rootSelector = rootSelector || 'body';\n  using = using || document.querySelector(rootSelector);\n\n  var rows = [];\n  var prefixes = ['ng-', 'ng_', 'data-ng-', 'x-ng-', 'ng\\\\\\\\:'];\n  for (var p = 0; p < prefixes.length; ++p) {\n    var attr = prefixes[p] + 'repeat';\n    var repeatElems = using.querySelectorAll('[' + attr + ']');\n    attr = attr.replace(/\\\\\\\\/g, '');\n    for (var i = 0; i < repeatElems.length; ++i) {\n      if (repeatElems[i].getAttribute(attr).indexOf(repeater) != -1) {\n        rows.push(repeatElems[i]);\n      }\n    }\n  }\n  for (var p = 0; p < prefixes.length; ++p) {\n    var attr = prefixes[p] + 'repeat-start';\n    var repeatElems = using.querySelectorAll('[' + attr + ']');\n    attr = attr.replace(/\\\\\\\\/g, '');\n    for (var i = 0; i < repeatElems.length; ++i) {\n      if (repeatElems[i].getAttribute(attr).indexOf(repeater) != -1) {\n        var elem = repeatElems[i];\n        while (elem.nodeType != 8 ||\n            elem.nodeValue.indexOf(repeater) == -1) {\n          if (elem.nodeType == 1) {\n            rows.push(elem);\n          }\n          elem = elem.nextSibling;\n        }\n      }\n    }\n  }\n  return rows;\n};\n"
FN_findAllRepeaterRowsIds =

/**

  • Find all rows ids of an ng-repeat.

*

  • @param string repeater The text of the repeater, e.g. ‘cat in cats’.

  • @param Element using The scope of the search.

  • @param string rootSelector The selector to use for the root app element.

*

  • @return Array.<Element> All rows of the repeater.

*/

"function(repeater, using, rootSelector) {\n  var elements = findAllRepeaterRows(repeater, using, rootSelector);\n  return createCapybaraNgMatches(elements);\n};\n"
FN_findRepeaterElement =

/**

* Find an element within an ng-repeat by its row and column.
*
* @param {string} repeater The text of the repeater, e.g. 'cat in cats'.
* @param {number} index The row index.
* @param {string} binding The column binding, e.g. '{{cat.name}}'.
* @param {Element} using The scope of the search.
* @param {string} rootSelector The selector to use for the root app element.
*
* @return {Array.<Element>} The element in an array.
*/
"function(repeater, index, binding, using, rootSelector) {\n  var matches = [];\n  rootSelector = rootSelector || 'body';\n  using = using || document.querySelector(rootSelector);\n\n  var rows = [];\n  var prefixes = ['ng-', 'ng_', 'data-ng-', 'x-ng-', 'ng\\\\\\\\:'];\n  for (var p = 0; p < prefixes.length; ++p) {\n    var attr = prefixes[p] + 'repeat';\n    var repeatElems = using.querySelectorAll('[' + attr + ']');\n    attr = attr.replace(/\\\\\\\\/g, '');\n    for (var i = 0; i < repeatElems.length; ++i) {\n      if (repeatElems[i].getAttribute(attr).indexOf(repeater) != -1) {\n        rows.push(repeatElems[i]);\n      }\n    }\n  }\n  /* multiRows is an array of arrays, where each inner array contains\n     one row of elements. */\n  var multiRows = [];\n  for (var p = 0; p < prefixes.length; ++p) {\n    var attr = prefixes[p] + 'repeat-start';\n    var repeatElems = using.querySelectorAll('[' + attr + ']');\n    attr = attr.replace(/\\\\\\\\/g, '');\n    for (var i = 0; i < repeatElems.length; ++i) {\n      if (repeatElems[i].getAttribute(attr).indexOf(repeater) != -1) {\n        var elem = repeatElems[i];\n        var row = [];\n        while (elem.nodeType != 8 ||\n            (elem.nodeValue && elem.nodeValue.indexOf(repeater) == -1)) {\n          if (elem.nodeType == 1) {\n            row.push(elem);\n          }\n          elem = elem.nextSibling;\n        }\n        multiRows.push(row);\n      }\n    }\n  }\n  var row = rows[index];\n  var multiRow = multiRows[index];\n  var bindings = [];\n  if (row) {\n    if (angular.getTestability) {\n      matches.push.apply(\n          matches,\n          angular.getTestability(using).findBindings(row, binding));\n    } else {\n      if (row.className.indexOf('ng-binding') != -1) {\n        bindings.push(row);\n      }\n      var childBindings = row.getElementsByClassName('ng-binding');\n      for (var i = 0; i < childBindings.length; ++i) {\n        bindings.push(childBindings[i]);\n      }\n    }\n  }\n  if (multiRow) {\n    for (var i = 0; i < multiRow.length; ++i) {\n      var rowElem = multiRow[i];\n      if (angular.getTestability) {\n        matches.push.apply(\n            matches,\n            angular.getTestability(using).findBindings(rowElem, binding));\n      } else {\n        if (rowElem.className.indexOf('ng-binding') != -1) {\n          bindings.push(rowElem);\n        }\n        var childBindings = rowElem.getElementsByClassName('ng-binding');\n        for (var j = 0; j < childBindings.length; ++j) {\n          bindings.push(childBindings[j]);\n        }\n      }\n    }\n  }\n  for (var i = 0; i < bindings.length; ++i) {\n    var dataBinding = angular.element(bindings[i]).data('$binding');\n    if(dataBinding) {\n      var bindingName = dataBinding.exp || dataBinding[0].exp || dataBinding;\n      if (bindingName.indexOf(binding) != -1) {\n        matches.push(bindings[i]);\n      }\n    }\n  }\n  return matches;\n};\n"
FN_findRepeaterElementIds =

/**

* Find an element ids within an ng-repeat by its row and column.
*
* @param {string} repeater The text of the repeater, e.g. 'cat in cats'.
* @param {number} index The row index.
* @param {string} binding The column binding, e.g. '{{cat.name}}'.
* @param {Element} using The scope of the search.
* @param {string} rootSelector The selector to use for the root app element.
*
* @return {Array.<Element>} The element in an array.
*/
"function(repeater, index, binding, using, rootSelector) {\n  var elements = findRepeaterElement(repeater, index, binding, using, rootSelector);\n  return createCapybaraNgMatches(elements);\n};\n"
FN_findRepeaterColumn =

/**

* Find the elements in a column of an ng-repeat.
*
* @param {string} repeater The text of the repeater, e.g. 'cat in cats'.
* @param {string} binding The column binding, e.g. '{{cat.name}}'.
* @param {Element} using The scope of the search.
* @param {string} rootSelector The selector to use for the root app element.
*
* @return {Array.<Element>} The elements in the column.
*/
"function(repeater, binding, using, rootSelector) {\n  var matches = [];\n  rootSelector = rootSelector || 'body';\n  using = using || document.querySelector(rootSelector);\n\n  var rows = [];\n  var prefixes = ['ng-', 'ng_', 'data-ng-', 'x-ng-', 'ng\\\\\\\\:'];\n  for (var p = 0; p < prefixes.length; ++p) {\n    var attr = prefixes[p] + 'repeat';\n    var repeatElems = using.querySelectorAll('[' + attr + ']');\n    attr = attr.replace(/\\\\\\\\/g, '');\n    for (var i = 0; i < repeatElems.length; ++i) {\n      if (repeatElems[i].getAttribute(attr).indexOf(repeater) != -1) {\n        rows.push(repeatElems[i]);\n      }\n    }\n  }\n  /* multiRows is an array of arrays, where each inner array contains\n     one row of elements. */\n  var multiRows = [];\n  for (var p = 0; p < prefixes.length; ++p) {\n    var attr = prefixes[p] + 'repeat-start';\n    var repeatElems = using.querySelectorAll('[' + attr + ']');\n    attr = attr.replace(/\\\\\\\\/g, '');\n    for (var i = 0; i < repeatElems.length; ++i) {\n      if (repeatElems[i].getAttribute(attr).indexOf(repeater) != -1) {\n        var elem = repeatElems[i];\n        var row = [];\n        while (elem.nodeType != 8 ||\n            (elem.nodeValue && elem.nodeValue.indexOf(repeater) == -1)) {\n          if (elem.nodeType == 1) {\n            row.push(elem);\n          }\n          elem = elem.nextSibling;\n        }\n        multiRows.push(row);\n      }\n    }\n  }\n  var bindings = [];\n  for (var i = 0; i < rows.length; ++i) {\n    if (angular.getTestability) {\n      matches.push.apply(\n          matches,\n          angular.getTestability(using).findBindings(rows[i], binding));\n    } else {\n      if (rows[i].className.indexOf('ng-binding') != -1) {\n        bindings.push(rows[i]);\n      }\n      var childBindings = rows[i].getElementsByClassName('ng-binding');\n      for (var k = 0; k < childBindings.length; ++k) {\n        bindings.push(childBindings[k]);\n      }\n    }\n  }\n  for (var i = 0; i < multiRows.length; ++i) {\n    for (var j = 0; j < multiRows[i].length; ++j) {\n      if (angular.getTestability) {\n        matches.push.apply(\n            matches,\n            angular.getTestability(using).findBindings(multiRows[i][j], binding));\n      } else {\n        var elem = multiRows[i][j];\n        if (elem.className.indexOf('ng-binding') != -1) {\n          bindings.push(elem);\n        }\n        var childBindings = elem.getElementsByClassName('ng-binding');\n        for (var k = 0; k < childBindings.length; ++k) {\n          bindings.push(childBindings[k]);\n        }\n      }\n    }\n  }\n  for (var j = 0; j < bindings.length; ++j) {\n    var dataBinding = angular.element(bindings[j]).data('$binding');\n    if (dataBinding) {\n      var bindingName = dataBinding.exp || dataBinding[0].exp || dataBinding;\n      if (bindingName.indexOf(binding) != -1) {\n        matches.push(bindings[j]);\n      }\n    }\n  }\n  return matches;\n};\n"
FN_findRepeaterColumnIds =

/**

* Find the elements in a column of an ng-repeat.
*
* @param {string} repeater The text of the repeater, e.g. 'cat in cats'.
* @param {string} binding The column binding, e.g. '{{cat.name}}'.
* @param {Element} using The scope of the search.
* @param {string} rootSelector The selector to use for the root app element.
*
* @return {Array.<Element>} The elements in the column.
*/
"function(repeater, binding, using, rootSelector) {\n  var elements = findRepeaterColumn(repeater, binding, using, rootSelector);\n  return createCapybaraNgMatches(elements);\n};\n"
FN_findByModel =

/**

* Find elements by model name.
*
* @param {string} model The model name.
* @param {Element} using The scope of the search.
* @param {string} rootSelector The selector to use for the root app element.
*
* @return {Array.<Element>} The matching elements.
*/
"function(model, using, rootSelector) {\n  rootSelector = rootSelector || 'body';\n  using = using || document.querySelector(rootSelector);\n\n  if (angular.getTestability) {\n    return angular.getTestability(using).\n        findModels(using, model, true);\n  }\n\n  var prefixes = ['ng-', 'ng_', 'data-ng-', 'x-ng-', 'ng\\\\\\\\:'];\n  for (var p = 0; p < prefixes.length; ++p) {\n    var selector = '[' + prefixes[p] + 'model=\"' + model + '\"]';\n    var elements = using.querySelectorAll(selector);\n    if (elements.length) {\n      return elements;\n    }\n  }\n};\n"
FN_findByModelIds =

/**

* Find element ids by model name.
*
* @param {string} model The model name.
* @param {Element} using The scope of the search.
* @param {string} rootSelector The selector to use for the root app element.
*
* @return {Array.<Element>} The matching elements.
*/
"function(model, using, rootSelector) {\n  var elements = findByModel(model, using, rootSelector);\n  return createCapybaraNgMatches(elements);\n};\n"
FN_findByOptions =

/**

* Find elements by options.
*
* @param {string} optionsDescriptor The descriptor for the option
*     (i.e. fruit for fruit in fruits).
* @param {Element} using The scope of the search.
* @param {string} rootSelector The selector to use for the root app element.
*
* @return {Array.<Element>} The matching elements.
*/
"function(optionsDescriptor, using, rootSelector) {\n  rootSelector = rootSelector || 'body';\n  using = using || document.querySelector(rootSelector);\n\n  var prefixes = ['ng-', 'ng_', 'data-ng-', 'x-ng-', 'ng\\\\\\\\:'];\n  for (var p = 0; p < prefixes.length; ++p) {\n    var selector = '[' + prefixes[p] + 'options=\"' + optionsDescriptor + '\"] option';\n    var elements = using.querySelectorAll(selector);\n    if (elements.length) {\n      return elements;\n    }\n  }\n};\n"
FN_findByOptionsIds =

/**

* Find elements by options.
*
* @param {string} optionsDescriptor The descriptor for the option
*     (i.e. fruit for fruit in fruits).
* @param {Element} using The scope of the search.
* @param {string} rootSelector The selector to use for the root app element.
*
* @return {Array.<Element>} The matching elements.
*/
"function(optionsDescriptor, using, rootSelector) {\n  var elements = findByOptions(optionsDescriptor, using, rootSelector);\n  return createCapybaraNgMatches(elements);\n};\n"
FN_findByButtonText =

/**

* Find buttons by textual content.
*
* @param {string} searchText The exact text to match.
* @param {Element} using The scope of the search.
* @param {string} rootSelector The selector to use for the root app element.
*
* @return {Array.<Element>} The matching elements.
*/
"function(searchText, using, rootSelector) {\n  rootSelector = rootSelector || 'body';\n  using = using || document.querySelector(rootSelector);\n\n  var elements = using.querySelectorAll('button, input[type=\"button\"], input[type=\"submit\"]');\n  var matches = [];\n  for (var i = 0; i < elements.length; ++i) {\n    var element = elements[i];\n    var elementText;\n    if (element.tagName.toLowerCase() == 'button') {\n      elementText = element.innerText || element.textContent;\n    } else {\n      elementText = element.value;\n    }\n    if (elementText.trim() === searchText) {\n      matches.push(element);\n    }\n  }\n\n  return matches;\n};\n"
FN_findByPartialButtonText =

/**

* Find buttons by textual content.
*
* @param {string} searchText The exact text to match.
* @param {Element} using The scope of the search.
* @param {string} rootSelector The selector to use for the root app element.
*
* @return {Array.<Element>} The matching elements.
*/
"function(searchText, using, rootSelector) {\n  rootSelector = rootSelector || 'body';\n  using = using || document.querySelector(rootSelector);\n\n  var elements = using.querySelectorAll('button, input[type=\"button\"], input[type=\"submit\"]');\n  var matches = [];\n  for (var i = 0; i < elements.length; ++i) {\n    var element = elements[i];\n    var elementText;\n    if (element.tagName.toLowerCase() == 'button') {\n      elementText = element.innerText || element.textContent;\n    } else {\n      elementText = element.value;\n    }\n    if (elementText.indexOf(searchText) > -1) {\n      matches.push(element);\n    }\n  }\n\n  return matches;\n};\n"
FN_findByCssContainingText =

/**

* Find elements by css selector and textual content.
*
* @param {string} cssSelector The css selector to match.
* @param {string} searchText The exact text to match.
* @param {Element} using The scope of the search.
* @param {string} rootSelector The selector to use for the root app element.
*
* @return {Array.<Element>} An array of matching elements.
*/
"function(cssSelector, searchText, using, rootSelector) {\n  rootSelector = rootSelector || 'body';\n  using = using || document.querySelector(rootSelector);\n\n  var elements = using.querySelectorAll(cssSelector);\n  var matches = [];\n  for (var i = 0; i < elements.length; ++i) {\n    var element = elements[i];\n    var elementText = element.innerText || element.textContent;\n    if (elementText.indexOf(searchText) > -1) {\n      matches.push(element);\n    }\n  }\n  return matches;\n};\n"
FN_testForAngular =

/**

* Tests whether the angular global variable is present on a page. Retries
* in case the page is just loading slowly.
*
* Asynchronous.
*
* @param {number} attempts Number of times to retry.
* @param {function} asyncCallback callback
*/
"function(attempts, asyncCallback) {\n  var callback = function(args) {\n    setTimeout(function() {\n      asyncCallback(args);\n    }, 0);\n  };\n  var check = function(n) {\n    try {\n      if (window.angular && window.angular.resumeBootstrap) {\n        callback([true, null]);\n      } else if (n < 1) {\n        if (window.angular) {\n          callback([false, 'angular never provided resumeBootstrap']);\n        } else {\n          callback([false, 'retries looking for angular exceeded']);\n        }\n      } else {\n        window.setTimeout(function() {check(n - 1);}, 1000);\n      }\n    } catch (e) {\n      callback([false, e]);\n    }\n  };\n  check(attempts);\n};\n"
FN_evaluate =

/**

* Evalute an Angular expression in the context of a given element.
*
* @param {Element} element The element in whose scope to evaluate.
* @param {string} expression The expression to evaluate.
*
* @return {?Object} The result of the evaluation.
*/
"function(element, expression) {\n  return angular.element(element).scope().$eval(expression);\n};\n"
FN_allowAnimations =
"function(element, value) {\n  var ngElement = angular.element(element);\n  if (ngElement.allowAnimations) {\n    // AngularDart: $testability API.\n    return ngElement.allowAnimations(value);\n  } else {\n    // AngularJS\n    var enabledFn = ngElement.injector().get('$animate').enabled;\n    return (value == null) ? enabledFn() : enabledFn(value);\n  }\n};\n"
FN_getLocationAbsUrl =

/**

* Return the current url using $location.absUrl().
*
* @param {string} selector The selector housing an ng-app
*/
"function(selector) {\n  var el = document.querySelector(selector);\n  if (angular.getTestability) {\n    return angular.getTestability(el).\n        getLocation();\n  }\n  return angular.element(el).injector().get('$location').absUrl();\n};\n"
FN_getLocation =

/**

* Get current location
*
* @param {string} selector The selector housing an ng-app
* @param {string} url In page URL using the same syntax as $location.url(),
*     /path?search=a&b=c#hash
*/
"function(selector) {\n  var el = document.querySelector(selector);\n  var $injector = angular.element(el).injector();\n  var $location = $injector.get('$location');\n  return $location.url();\n};\n"
FN_setLocation =

/**

* Browse to another page using in-page navigation.
*
* @param {string} selector The selector housing an ng-app
* @param {string} url In page URL using the same syntax as $location.url(),
*     /path?search=a&b=c#hash
*/
"function(selector, url) {\n  var el = document.querySelector(selector);\n  if (angular.getTestability) {\n    return angular.getTestability(el).\n        setLocation(url);\n  }\n  var $injector = angular.element(el).injector();\n  var $location = $injector.get('$location');\n  var $rootScope = $injector.get('$rootScope');\n\n  if (url !== $location.url()) {\n    $location.url(url);\n    $rootScope.$digest();\n  }\n  return $location.url();\n};\n"

Class Method Summary collapse

Class Method Details

.format_script(name, fn) ⇒ Object



774
775
776
777
# File 'lib/angular/client_script.rb', line 774

def self.format_script(name, fn)
  "try { return (#{fn}).apply(this, arguments); }\n" +
  "catch(e) { throw (e instanceof Error) ? e : new Error(e); }"
end

.format_scriptsObject



779
780
781
782
783
784
785
# File 'lib/angular/client_script.rb', line 779

def self.format_scripts
  Hash[
    functions.map do |name, fn|
      [name, format_script(name,fn)]
    end
  ]
end

.functionsObject



766
767
768
769
770
771
772
# File 'lib/angular/client_script.rb', line 766

def self.functions
  Hash[
    self.constants.map do |cn|
      [cn[3, cn.size].to_sym, self.const_get(cn)]
    end
  ]
end

.window_scriptsObject



787
788
789
790
# File 'lib/angular/client_script.rb', line 787

def self.window_scripts
  functions
    .map { |name, fn| "window.#{name} = #{fn};" }
end