Testing grunt angular builder with ui-router

http://angularjs.org/

by fergal_doyle

HTML

<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.24/angular.js"></script>
<div ng-app="myApp">
    <div ui-view></div>
    
<script type="text/ng-template" id="1.html">
  View 1
    <a href="#/about">To about</a>
</script>
<script type="text/ng-template" id="2.html">
 View 2
    <a href="#/home">To home</a>
</script>
    
</div>

CSS

body {
    font-family: arial;    
}

h1 {
    font-size: 1.5em;    
}

JavaScript

// create the module
angular.module("myApp", ["ui.router"])
/*
.config(function($stateProvider, $urlRouterProvider) {
    
    $urlRouterProvider.otherwise('/home');
    
    $stateProvider
        
        .state('home', {
            url: '/home',
            templateUrl: '1.html'
        })
        
        .state('about', {
            url: '/about',
            templateUrl: '2.html'      
        });
        
});
*/
;(function (module) {

  /*jshint globalstrict:true*/
  /*global angular:false*/
  'use strict';

  var isDefined = angular.isDefined,
      isFunction = angular.isFunction,
      isString = angular.isString,
      isObject = angular.isObject,
      isArray = angular.isArray,
      forEach = angular.forEach,
      extend = angular.extend,
      copy = angular.copy;

  function inherit(parent, extra) {
    return extend(new (extend(function() {}, { prototype: parent }))(), extra);
  }

  function merge(dst) {
    forEach(arguments, function(obj) {
      if (obj !== dst) {
        forEach(obj, function(value, key) {
          if (!dst.hasOwnProperty(key)) dst[key] = value;
        });
      }
    });
    return dst;
  }

  /**
   * Finds the common ancestor path between two states.
   *
   * @param {Object} first The first state.
   * @param {Object} second The second state.
   * @return {Array} Returns an array of state names in descending order, not including the root.
   */
  function ancestors(first, second) {
    var path = [];

    for (var n in first.path) {
      if (first.path[n] !== second.path[n]) break;
      path.push(first.path[n]);
    }
    return path;
  }

  /**
   * IE8-safe wrapper for `Object.keys()`.
   *
   * @param {Object} object A JavaScript object.
   * @return {Array} Returns the keys of the object as an array.
   */
  function objectKeys(object) {
    if (Object.keys) {
      return Object.keys(object);
    }
    var result = [];

    angular.forEach(object, function(val, key) {
      result.push(key);
    });
   ...