From c434bde109b8e131f569808f8b7451013d5b3698 Mon Sep 17 00:00:00 2001 From: Martin Staffa Date: Thu, 23 Jun 2016 12:00:54 +0200 Subject: [PATCH 0001/1173] docs(ngReadonly): note input type restrictions Closes #14816 --- src/ng/directive/attrs.js | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/ng/directive/attrs.js b/src/ng/directive/attrs.js index 96a339a00d78..4a88da3e623c 100644 --- a/src/ng/directive/attrs.js +++ b/src/ng/directive/attrs.js @@ -230,9 +230,11 @@ * * @description * - * Sets the `readOnly` attribute on the element, if the expression inside `ngReadonly` is truthy. + * Sets the `readonly` attribute on the element, if the expression inside `ngReadonly` is truthy. + * Note that `readonly` applies only to `input` elements with specific types. [See the input docs on + * MDN](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input#attr-readonly) for more information. * - * A special directive is necessary because we cannot use interpolation inside the `readOnly` + * A special directive is necessary because we cannot use interpolation inside the `readonly` * attribute. See the {@link guide/interpolation interpolation guide} for more info. * * @example From fb3bbc9a00585361d01faddab6c4e65788cdab2c Mon Sep 17 00:00:00 2001 From: GARCIA Guillaume Date: Thu, 23 Jun 2016 17:16:04 +0200 Subject: [PATCH 0002/1173] docs(*): correct bower version separator (@ --> #) Closes #14819 --- docs/config/templates/api/module.template.html | 2 +- src/ngMock/angular-mocks.js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/config/templates/api/module.template.html b/docs/config/templates/api/module.template.html index 8cc719fa602f..6233e2672b83 100644 --- a/docs/config/templates/api/module.template.html +++ b/docs/config/templates/api/module.template.html @@ -22,7 +22,7 @@

Installation

  • Bower e.g. - {% code %}bower install {$ doc.packageName $}@X.Y.Z{% endcode %} + {% code %}bower install {$ doc.packageName $}#X.Y.Z{% endcode %}
  • code.angularjs.org diff --git a/src/ngMock/angular-mocks.js b/src/ngMock/angular-mocks.js index 3e0f63333606..a25633eafb3d 100644 --- a/src/ngMock/angular-mocks.js +++ b/src/ngMock/angular-mocks.js @@ -2305,7 +2305,7 @@ angular.mock.$ComponentControllerProvider = ['$compileProvider', function($compi * * [Google CDN](https://developers.google.com/speed/libraries/devguide#angularjs) e.g. * `"//ajax.googleapis.com/ajax/libs/angularjs/X.Y.Z/angular-mocks.js"` * * [NPM](https://www.npmjs.com/) e.g. `npm install angular-mocks@X.Y.Z` - * * [Bower](http://bower.io) e.g. `bower install angular-mocks@X.Y.Z` + * * [Bower](http://bower.io) e.g. `bower install angular-mocks#X.Y.Z` * * [code.angularjs.org](https://code.angularjs.org/) (discouraged for production use) e.g. * `"//code.angularjs.org/X.Y.Z/angular-mocks.js"` * From 2e0e77ee80236a841085a599c800bd2c9695475e Mon Sep 17 00:00:00 2001 From: Deplay <1150696014@qq.com> Date: Fri, 24 Jun 2016 09:55:08 +0800 Subject: [PATCH 0003/1173] refactor(jqLite): remove unused code in `jqLiteBuildFragment()` Closes #14822 --- src/jqLite.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/jqLite.js b/src/jqLite.js index d37fe1a63733..fe3ad25e84ae 100644 --- a/src/jqLite.js +++ b/src/jqLite.js @@ -207,7 +207,7 @@ function jqLiteBuildFragment(html, context) { nodes.push(context.createTextNode(html)); } else { // Convert html into DOM nodes - tmp = tmp || fragment.appendChild(context.createElement("div")); + tmp = fragment.appendChild(context.createElement("div")); tag = (TAG_NAME_REGEXP.exec(html) || ["", ""])[1].toLowerCase(); wrap = wrapMap[tag] || wrapMap._default; tmp.innerHTML = wrap[1] + html.replace(XHTML_TAG_REGEXP, "<$1>") + wrap[2]; From 56a9eab84915d7d5f5422cabf409ce8f83a02bc0 Mon Sep 17 00:00:00 2001 From: Liran Tal Date: Sun, 26 Jun 2016 15:19:13 +0300 Subject: [PATCH 0004/1173] docs(guide/filter): add link to list of built-in filters Closes #14828 --- docs/content/guide/filter.ngdoc | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/docs/content/guide/filter.ngdoc b/docs/content/guide/filter.ngdoc index 29b2fd5d571c..8e9db3bcc864 100644 --- a/docs/content/guide/filter.ngdoc +++ b/docs/content/guide/filter.ngdoc @@ -5,10 +5,11 @@ # Filters -A filter formats the value of an expression for display to the user. They can be used in view templates, -controllers or services and it is easy to define your own filter. +Filters format the value of an expression for display to the user. They can be used in view +templates, controllers or services. Angular comes with a collection of +[built-in filters](api/ng/filter), but it is easy to define your own as well. -The underlying API is the {@link ng.$filterProvider `filterProvider`}. +The underlying API is the {@link ng.$filterProvider}. ## Using filters in view templates From 6050f0be30679ff927bc2b87fd64815d8af3dc4f Mon Sep 17 00:00:00 2001 From: Georgios Kalpakas Date: Sun, 26 Jun 2016 21:07:58 +0300 Subject: [PATCH 0005/1173] fix($animate): do not get affected by custom, enumerable properties on `Object.prototype` Fixes #14804 Closes #14830 --- src/ngAnimate/animateQueue.js | 2 +- test/ngAnimate/animateSpec.js | 11 +++++++++++ 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/src/ngAnimate/animateQueue.js b/src/ngAnimate/animateQueue.js index 344f2b5d278b..385de478a920 100644 --- a/src/ngAnimate/animateQueue.js +++ b/src/ngAnimate/animateQueue.js @@ -158,7 +158,7 @@ var $$AnimateQueueProvider = ['$animateProvider', function($animateProvider) { } ); - var callbackRegistry = {}; + var callbackRegistry = Object.create(null); // remember that the classNameFilter is set during the provider/config // stage therefore we can optimize here and setup a helper function diff --git a/test/ngAnimate/animateSpec.js b/test/ngAnimate/animateSpec.js index c1de17ebbdd0..844bfdb02a0c 100644 --- a/test/ngAnimate/animateSpec.js +++ b/test/ngAnimate/animateSpec.js @@ -1989,6 +1989,17 @@ describe("animations", function() { expect(count).toBe(5); })); + it('should not get affected by custom, enumerable properties on `Object.prototype`', + inject(function($animate) { + Object.prototype.foo = 'ENUMARABLE_AND_NOT_AN_ARRAY'; + + element = jqLite('
    '); + expect(function() { $animate.off(element); }).not.toThrow(); + + delete Object.prototype.foo; + }) + ); + it('should fire a `start` callback when the animation starts with the matching element', inject(function($animate, $rootScope, $rootElement, $document) { From f6c3b357451a2125550811946084fc25ae4eb0ce Mon Sep 17 00:00:00 2001 From: Georgios Kalpakas Date: Thu, 23 Jun 2016 23:16:06 +0300 Subject: [PATCH 0006/1173] test($resource): make test for function as param more explicit Related to aa8d783. Closes #14820 --- src/ngResource/resource.js | 4 ++-- test/ngResource/resourceSpec.js | 9 ++++++--- 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/src/ngResource/resource.js b/src/ngResource/resource.js index bdbfb778f771..bd1bea78cef9 100644 --- a/src/ngResource/resource.js +++ b/src/ngResource/resource.js @@ -116,7 +116,7 @@ function shallowClearAndCopy(src, dst) { * @param {Object=} paramDefaults Default values for `url` parameters. These can be overridden in * `actions` methods. If a parameter value is a function, it will be called every time * a param value needs to be obtained for a request (unless the param was overridden). The function - * will be passed the current data value as a argument. + * will be passed the current data value as an argument. * * Each key value in the parameter object is first bound to url template if present and then any * excess keys are appended to the url search query after the `?`. @@ -149,7 +149,7 @@ function shallowClearAndCopy(src, dst) { * - **`params`** – {Object=} – Optional set of pre-bound parameters for this action. If any of * the parameter value is a function, it will be called every time when a param value needs to * be obtained for a request (unless the param was overridden). The function will be passed the - * current data value as a argument. + * current data value as an argument. * - **`url`** – {string} – action specific `url` override. The url templating is supported just * like for the resource-level urls. * - **`isArray`** – {boolean=} – If true then the returned object for this action is an array, diff --git a/test/ngResource/resourceSpec.js b/test/ngResource/resourceSpec.js index c28ecf097861..1c10bebee701 100644 --- a/test/ngResource/resourceSpec.js +++ b/test/ngResource/resourceSpec.js @@ -667,11 +667,14 @@ describe("basic usage", function() { expect(fedor).toEqualData({id: 'fedor', email: 'f@f.com', count: 1}); - $httpBackend.expect('POST', '/Person/fedor').respond( - {id: 'fedor', email: 'f@f.com', count: 2}); + $httpBackend.expect('POST', '/Person/fedor2').respond( + {id: 'fedor2', email: 'f2@f.com', count: 2}); + + fedor.id = 'fedor2'; fedor.$save(); $httpBackend.flush(); - expect(fedor).toEqualData({id: 'fedor', email: 'f@f.com', count: 2}); + + expect(fedor).toEqualData({id: 'fedor2', email: 'f2@f.com', count: 2}); }); From c855c3fb9f998a13fbb9f21f6bb76a1a6c4c32e4 Mon Sep 17 00:00:00 2001 From: Georgios Kalpakas Date: Thu, 28 Apr 2016 15:11:15 +0300 Subject: [PATCH 0007/1173] fix($injector): fix class detection RegExp Mentioned in https://github.com/angular/angular.js/pull/14531#discussion_r61410683. Closes #14533 --- src/auto/injector.js | 6 +++--- test/auto/injectorSpec.js | 20 ++++++++++++++++++++ 2 files changed, 23 insertions(+), 3 deletions(-) diff --git a/src/auto/injector.js b/src/auto/injector.js index 4883c176d345..7eda310abc07 100644 --- a/src/auto/injector.js +++ b/src/auto/injector.js @@ -855,9 +855,9 @@ function createInjector(modulesToLoad, strictDi) { } var result = func.$$ngIsClass; if (!isBoolean(result)) { - // Workaround for MS Edge. - // Check https://connect.microsoft.com/IE/Feedback/Details/2211653 - result = func.$$ngIsClass = /^(?:class\s|constructor\()/.test(stringifyFn(func)); + // Support: Edge 12-13 only + // See: https://developer.microsoft.com/en-us/microsoft-edge/platform/issues/6156135/ + result = func.$$ngIsClass = /^(?:class\b|constructor\()/.test(stringifyFn(func)); } return result; } diff --git a/test/auto/injectorSpec.js b/test/auto/injectorSpec.js index 85b80874ba11..b295c3510a9e 100644 --- a/test/auto/injectorSpec.js +++ b/test/auto/injectorSpec.js @@ -302,6 +302,26 @@ describe('injector', function() { expect(instance.aVal()).toEqual('a-value'); }); + if (/chrome/.test(navigator.userAgent)) { + they('should detect ES6 classes regardless of whitespace/comments ($prop)', [ + 'class Test {}', + 'class Test{}', + 'class //<--ES6 stuff\nTest {}', + 'class//<--ES6 stuff\nTest {}', + 'class {}', + 'class{}', + 'class //<--ES6 stuff\n {}', + 'class//<--ES6 stuff\n {}', + 'class/* Test */{}', + 'class /* Test */ {}' + ], function(classDefinition) { + var Clazz = eval('(' + classDefinition + ')'); + var instance = injector.invoke(Clazz); + + expect(instance).toEqual(jasmine.any(Clazz)); + }); + } + // Support: Chrome 50-51 only // TODO (gkalpak): Remove when Chrome v52 is relased. // it('should be able to invoke classes', function() { From 7a191eb400c0e0f69fe957fd7bd7ca26cca0f9fc Mon Sep 17 00:00:00 2001 From: Georgios Kalpakas Date: Sat, 25 Jun 2016 15:50:03 +0300 Subject: [PATCH 0008/1173] fix($jsonpCallbacks): do not overwrite callbacks added by other apps Closes #14824 --- src/AngularPublic.js | 2 +- src/ng/jsonpCallbacks.js | 9 ++++----- src/ngMock/angular-mocks.js | 2 +- test/ng/jsonpCallbacksSpec.js | 19 ++++++++++++++----- 4 files changed, 20 insertions(+), 12 deletions(-) diff --git a/src/AngularPublic.js b/src/AngularPublic.js index 777943a80260..1c5cf8a2b55d 100644 --- a/src/AngularPublic.js +++ b/src/AngularPublic.js @@ -150,7 +150,7 @@ function publishExternalAPI(angular) { 'isDate': isDate, 'lowercase': lowercase, 'uppercase': uppercase, - 'callbacks': {counter: 0}, + 'callbacks': {$$counter: 0}, 'getTestability': getTestability, '$$minErr': minErr, '$$csp': csp, diff --git a/src/ng/jsonpCallbacks.js b/src/ng/jsonpCallbacks.js index 180990516308..654b2c327331 100644 --- a/src/ng/jsonpCallbacks.js +++ b/src/ng/jsonpCallbacks.js @@ -11,8 +11,7 @@ */ var $jsonpCallbacksProvider = function() { this.$get = ['$window', function($window) { - var counter = 0; - $window.angular.callbacks = {}; + var callbacks = $window.angular.callbacks; var callbackMap = {}; function createCallback(callbackId) { @@ -35,10 +34,10 @@ var $jsonpCallbacksProvider = function() { * to pass to the server, which will be used to call the callback with its payload in the JSONP response. */ createCallback: function(url) { - var callbackId = '_' + (counter++).toString(36); + var callbackId = '_' + (callbacks.$$counter++).toString(36); var callbackPath = 'angular.callbacks.' + callbackId; var callback = createCallback(callbackId); - callbackMap[callbackPath] = $window.angular.callbacks[callbackId] = callback; + callbackMap[callbackPath] = callbacks[callbackId] = callback; return callbackPath; }, /** @@ -75,7 +74,7 @@ var $jsonpCallbacksProvider = function() { */ removeCallback: function(callbackPath) { var callback = callbackMap[callbackPath]; - delete $window.angular.callbacks[callback.id]; + delete callbacks[callback.id]; delete callbackMap[callbackPath]; } }; diff --git a/src/ngMock/angular-mocks.js b/src/ngMock/angular-mocks.js index a25633eafb3d..af47d4b3e7e2 100644 --- a/src/ngMock/angular-mocks.js +++ b/src/ngMock/angular-mocks.js @@ -2954,7 +2954,7 @@ angular.mock.$RootScopeDecorator = ['$delegate', function($delegate) { angular.forEach(angular.callbacks, function(val, key) { delete angular.callbacks[key]; }); - angular.callbacks.counter = 0; + angular.callbacks.$$counter = 0; }; (window.beforeEach || window.setup)(module.$$beforeEach); diff --git a/test/ng/jsonpCallbacksSpec.js b/test/ng/jsonpCallbacksSpec.js index 75d421857552..9e77703743c0 100644 --- a/test/ng/jsonpCallbacksSpec.js +++ b/test/ng/jsonpCallbacksSpec.js @@ -2,11 +2,6 @@ describe('$jsonpCallbacks', function() { - beforeEach(module(function($provide) { - // mock out the $window object - $provide.value('$window', { angular: {} }); - })); - describe('createCallback(url)', function() { it('should return a new unique path to a callback function on each call', inject(function($jsonpCallbacks) { @@ -36,6 +31,19 @@ describe('$jsonpCallbacks', function() { $jsonpCallbacks.createCallback('http://some.dummy.com/jsonp/request'); expect($window.angular.callbacks._3).toEqual(jasmine.any(Function)); })); + + it('should produce unique callback paths across multiple instances', function() { + var $jsonpCallbacks1 = angular.injector(['ng', 'ngMock']).get('$jsonpCallbacks'); + var $jsonpCallbacks2 = angular.injector(['ng', 'ngMock']).get('$jsonpCallbacks'); + + var path1 = $jsonpCallbacks1.createCallback('http://some.dummy.com/jsonp/request'); + var path2 = $jsonpCallbacks2.createCallback('http://some.dummy.com/jsonp/request'); + + expect(path1).toBe('angular.callbacks._0'); + expect(path2).toBe('angular.callbacks._1'); + expect(angular.callbacks._0).toBeDefined(); + expect(angular.callbacks._1).toBeDefined(); + }); }); @@ -62,6 +70,7 @@ describe('$jsonpCallbacks', function() { })); }); + describe('removeCallback(calbackPath)', function() { it('should remove the callback', inject(function($window, $jsonpCallbacks) { From 2456ab63a613902d21c151445f9c697a76ab43b3 Mon Sep 17 00:00:00 2001 From: Nicholas Serra Date: Wed, 23 Mar 2016 13:37:57 -0400 Subject: [PATCH 0009/1173] fix($resource): add semicolon to whitelist of delimiters to unencode in URL params The unencoding happens in methods `encodeUriQuery`/`encodeUriSegment`. Both core and `ngResource` used to have identical implementations of these methods. Due to this duplication, the implementations got out-of-sync. Specifically, the semicolon has been added to the whitelist of unencoded characters in core since `v1.3.0-beta.18`. See 3625803 for more info. This commit fixes the problem and the underlying cause by reusing core's methods in `ngResource`. (The methods are exposed as private helpers on `window.angular`.) Closes #14309 --- src/Angular.js | 2 +- src/AngularPublic.js | 4 ++- src/ngResource/resource.js | 49 ++++----------------------------- test/ngResource/resourceSpec.js | 4 +++ 4 files changed, 14 insertions(+), 45 deletions(-) diff --git a/src/Angular.js b/src/Angular.js index ddbe72f5600d..0b7bd75ea3ba 100644 --- a/src/Angular.js +++ b/src/Angular.js @@ -1394,7 +1394,7 @@ function encodeUriSegment(val) { * This method is intended for encoding *key* or *value* parts of query component. We need a custom * method because encodeURIComponent is too aggressive and encodes stuff that doesn't have to be * encoded per http://tools.ietf.org/html/rfc3986: - * query = *( pchar / "/" / "?" ) + * query = *( pchar / "/" / "?" ) * pchar = unreserved / pct-encoded / sub-delims / ":" / "@" * unreserved = ALPHA / DIGIT / "-" / "." / "_" / "~" * pct-encoded = "%" HEXDIG HEXDIG diff --git a/src/AngularPublic.js b/src/AngularPublic.js index 1c5cf8a2b55d..8404ac091ab5 100644 --- a/src/AngularPublic.js +++ b/src/AngularPublic.js @@ -152,9 +152,11 @@ function publishExternalAPI(angular) { 'uppercase': uppercase, 'callbacks': {$$counter: 0}, 'getTestability': getTestability, + 'reloadWithDebugInfo': reloadWithDebugInfo, '$$minErr': minErr, '$$csp': csp, - 'reloadWithDebugInfo': reloadWithDebugInfo + '$$encodeUriSegment': encodeUriSegment, + '$$encodeUriQuery': encodeUriQuery }); angularModule = setupModuleLoader(window); diff --git a/src/ngResource/resource.js b/src/ngResource/resource.js index bd1bea78cef9..31a594421e50 100644 --- a/src/ngResource/resource.js +++ b/src/ngResource/resource.js @@ -514,49 +514,12 @@ angular.module('ngResource', ['ng']). this.$get = ['$http', '$log', '$q', '$timeout', function($http, $log, $q, $timeout) { var noop = angular.noop, - forEach = angular.forEach, - extend = angular.extend, - copy = angular.copy, - isFunction = angular.isFunction; - - /** - * We need our custom method because encodeURIComponent is too aggressive and doesn't follow - * http://www.ietf.org/rfc/rfc3986.txt with regards to the character set - * (pchar) allowed in path segments: - * segment = *pchar - * pchar = unreserved / pct-encoded / sub-delims / ":" / "@" - * pct-encoded = "%" HEXDIG HEXDIG - * unreserved = ALPHA / DIGIT / "-" / "." / "_" / "~" - * sub-delims = "!" / "$" / "&" / "'" / "(" / ")" - * / "*" / "+" / "," / ";" / "=" - */ - function encodeUriSegment(val) { - return encodeUriQuery(val, true). - replace(/%26/gi, '&'). - replace(/%3D/gi, '='). - replace(/%2B/gi, '+'); - } - - - /** - * This method is intended for encoding *key* or *value* parts of query component. We need a - * custom method because encodeURIComponent is too aggressive and encodes stuff that doesn't - * have to be encoded per http://tools.ietf.org/html/rfc3986: - * query = *( pchar / "/" / "?" ) - * pchar = unreserved / pct-encoded / sub-delims / ":" / "@" - * unreserved = ALPHA / DIGIT / "-" / "." / "_" / "~" - * pct-encoded = "%" HEXDIG HEXDIG - * sub-delims = "!" / "$" / "&" / "'" / "(" / ")" - * / "*" / "+" / "," / ";" / "=" - */ - function encodeUriQuery(val, pctEncodeSpaces) { - return encodeURIComponent(val). - replace(/%40/gi, '@'). - replace(/%3A/gi, ':'). - replace(/%24/g, '$'). - replace(/%2C/gi, ','). - replace(/%20/g, (pctEncodeSpaces ? '%20' : '+')); - } + forEach = angular.forEach, + extend = angular.extend, + copy = angular.copy, + isFunction = angular.isFunction, + encodeUriQuery = angular.$$encodeUriQuery, + encodeUriSegment = angular.$$encodeUriSegment; function Route(template, defaults) { this.template = template; diff --git a/test/ngResource/resourceSpec.js b/test/ngResource/resourceSpec.js index 1c10bebee701..a848f06d1244 100644 --- a/test/ngResource/resourceSpec.js +++ b/test/ngResource/resourceSpec.js @@ -254,10 +254,14 @@ describe("basic usage", function() { $httpBackend.expect('GET', '/Path/foo%231').respond('{}'); $httpBackend.expect('GET', '/Path/doh!@foo?bar=baz%231').respond('{}'); $httpBackend.expect('GET', '/Path/herp$').respond('{}'); + $httpBackend.expect('GET', '/Path/foo;bar').respond('{}'); + $httpBackend.expect('GET', '/Path/foo?bar=baz;qux').respond('{}'); R.get({a: 'foo#1'}); R.get({a: 'doh!@foo', bar: 'baz#1'}); R.get({a: 'herp$'}); + R.get({a: 'foo;bar'}); + R.get({a: 'foo', bar: 'baz;qux'}); }); it('should not encode @ in url params', function() { From 3cda8972839be92d6e730c184bb35e931a9da600 Mon Sep 17 00:00:00 2001 From: atenhar Date: Mon, 27 Jun 2016 16:53:05 -0500 Subject: [PATCH 0010/1173] docs(tutorial/step_03): fix grammar and typos Closes #14834 --- docs/content/tutorial/step_03.ngdoc | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/docs/content/tutorial/step_03.ngdoc b/docs/content/tutorial/step_03.ngdoc index 1d255d51bb35..047a5e3649bd 100644 --- a/docs/content/tutorial/step_03.ngdoc +++ b/docs/content/tutorial/step_03.ngdoc @@ -199,16 +199,16 @@ Voilà! The resulting output should look the same, but let's see what we have ga # Testing Although we have combined our controller with a template into a component, we still can (and should) -unit test the controller separately, since this is where are application logic and data reside. +unit test the controller separately, since this is where our application logic and data reside. In order to retrieve and instantiate a component's controller, Angular provides the {@link ngMock.$componentController $componentController} service.
    - The `$controller` service that we used in the previous step, can only instantiate controllers that - where registered by name, using the `.controller()` method. We could have registered our component - controller this way too, if we wanted to. Instead, we chose to define it inline — inside the - CDO — to keep things localized, but either way works equally well. + The `$controller` service that we used in the previous step can only instantiate controllers that + were registered by name, using the `.controller()` method. We could have registered our component + controller this way, too, if we wanted to. Instead, we chose to define it inline — inside + the CDO — to keep things localized, but either way works equally well.

    @@ -268,7 +268,7 @@ Same as before, execute `npm test` to run the tests and then watch the files for # Summary -You have learned how to organize your application and presentation logic into isolated reusable +You have learned how to organize your application and presentation logic into isolated, reusable components. Let's go to {@link step_04 step 4} to learn how to organize our code in directories and files, so it remains easy to locate as our application grows. From a5fd2e4c0376676fa317e09a8d8be4966b82cbfe Mon Sep 17 00:00:00 2001 From: Martin Staffa Date: Wed, 22 Jun 2016 15:25:37 +0200 Subject: [PATCH 0011/1173] feat($interpolate): use custom toString() function if present Except on Numbers, Dates and Arrays. Thanks to @danielkrainas for the initial implementation of this feature. This behavior is consistent with implementations found in other languages such as Ruby, Python, and CoffeeScript. http://rubymonk.com/learning/books/1-ruby-primer/chapters/5-strings/lessons/31-string-basics https://docs.python.org/2/library/stdtypes.html#string-formatting-operations http://coffeescriptcookbook.com/chapters/strings/interpolation The commit also exposes a private $$stringify method on the angular global, so that ngMessageFormat can use the same logic without duplicating it. Fixes #7317 Closes #8350 Fixes #11406 BREAKING CHANGE: When converting values to strings, interpolation now uses a custom toString() function on objects that are not Number, Array or Date (custom means that the `toString` function is not the same as `Object.prototype.toString`). Otherwise, interpolation uses JSON.stringify() as usual. Should you have a custom toString() function but still want the output of JSON.stringify(), migrate as shown in the following examples: Before: ```html {{myObject}} ``` After - use the `json` filter to stringify the object: ```html {{myObject | json}} ``` --- docs/content/guide/interpolation.ngdoc | 9 ++++++++ src/.jshintrc | 1 + src/Angular.js | 22 +++++++++++++++++++ src/AngularPublic.js | 3 ++- src/ng/interpolate.js | 17 --------------- src/ngMessageFormat/messageFormatCommon.js | 10 +-------- src/ngMessageFormat/messageFormatService.js | 5 +++-- test/ng/interpolateSpec.js | 23 ++++++++++++++++++++ test/ngMessageFormat/messageFormatSpec.js | 24 +++++++++++++++++++++ 9 files changed, 85 insertions(+), 29 deletions(-) diff --git a/docs/content/guide/interpolation.ngdoc b/docs/content/guide/interpolation.ngdoc index f1d07df1ca69..6aa1d66b316c 100644 --- a/docs/content/guide/interpolation.ngdoc +++ b/docs/content/guide/interpolation.ngdoc @@ -26,6 +26,15 @@ normal {@link ng.$rootScope.Scope#$digest digest} cycle. Note that the interpolateDirective has a priority of 100 and sets up the watch in the preLink function. +### How the string representation is computed + +If the interpolated value is not a `String`, it is computed as follows: +- `undefined` and `null` are converted to `''` +- if the value is an object that is not a `Number`, `Date` or `Array`, $interpolate looks for +a custom `toString()` function on the object, and uses that. Custom means that +`myObject.toString !== `Object.prototype.toString`. +- if the above doesn't apply, `JSON.stringify` is used. + ### Binding to boolean attributes Attributes such as `disabled` are called `boolean` attributes, because their presence means `true` and diff --git a/src/.jshintrc b/src/.jshintrc index 8c32819a6fa9..b77462c5b0d9 100644 --- a/src/.jshintrc +++ b/src/.jshintrc @@ -96,6 +96,7 @@ "createMap": false, "VALIDITY_STATE_PROPERTY": false, "reloadWithDebugInfo": false, + "stringify": false, "NODE_TYPE_ELEMENT": false, "NODE_TYPE_ATTRIBUTE": false, diff --git a/src/Angular.js b/src/Angular.js index 0b7bd75ea3ba..a5180712dfa1 100644 --- a/src/Angular.js +++ b/src/Angular.js @@ -86,6 +86,7 @@ getBlockNodes: true, hasOwnProperty: true, createMap: true, + stringify: true, NODE_TYPE_ELEMENT: true, NODE_TYPE_ATTRIBUTE: true, @@ -1903,6 +1904,27 @@ function createMap() { return Object.create(null); } +function stringify(value) { + if (value == null) { // null || undefined + return ''; + } + switch (typeof value) { + case 'string': + break; + case 'number': + value = '' + value; + break; + default: + if (hasCustomToString(value) && !isArray(value) && !isDate(value)) { + value = value.toString(); + } else { + value = toJson(value); + } + } + + return value; +} + var NODE_TYPE_ELEMENT = 1; var NODE_TYPE_ATTRIBUTE = 2; var NODE_TYPE_TEXT = 3; diff --git a/src/AngularPublic.js b/src/AngularPublic.js index 8404ac091ab5..89b9afd29a9a 100644 --- a/src/AngularPublic.js +++ b/src/AngularPublic.js @@ -156,7 +156,8 @@ function publishExternalAPI(angular) { '$$minErr': minErr, '$$csp': csp, '$$encodeUriSegment': encodeUriSegment, - '$$encodeUriQuery': encodeUriQuery + '$$encodeUriQuery': encodeUriQuery, + '$$stringify': stringify }); angularModule = setupModuleLoader(window); diff --git a/src/ng/interpolate.js b/src/ng/interpolate.js index a8c93319761c..7edf0af277e8 100644 --- a/src/ng/interpolate.js +++ b/src/ng/interpolate.js @@ -111,23 +111,6 @@ function $InterpolateProvider() { replace(escapedEndRegexp, endSymbol); } - function stringify(value) { - if (value == null) { // null || undefined - return ''; - } - switch (typeof value) { - case 'string': - break; - case 'number': - value = '' + value; - break; - default: - value = toJson(value); - } - - return value; - } - //TODO: this is the same as the constantWatchDelegate in parse.js function constantWatchDelegate(scope, listener, objectEquality, constantInterp) { var unwatch; diff --git a/src/ngMessageFormat/messageFormatCommon.js b/src/ngMessageFormat/messageFormatCommon.js index 3082bef30978..3991fac368e8 100644 --- a/src/ngMessageFormat/messageFormatCommon.js +++ b/src/ngMessageFormat/messageFormatCommon.js @@ -8,15 +8,7 @@ /* global isFunction: false */ /* global noop: false */ /* global toJson: false */ - -function stringify(value) { - if (value == null /* null/undefined */) { return ''; } - switch (typeof value) { - case 'string': return value; - case 'number': return '' + value; - default: return toJson(value); - } -} +/* global $$stringify: false */ // Convert an index into the string into line/column for use in error messages // As such, this doesn't have to be efficient. diff --git a/src/ngMessageFormat/messageFormatService.js b/src/ngMessageFormat/messageFormatService.js index b6b7999c44e2..e7df48401600 100644 --- a/src/ngMessageFormat/messageFormatService.js +++ b/src/ngMessageFormat/messageFormatService.js @@ -10,7 +10,6 @@ /* global noop: true */ /* global toJson: true */ /* global MessageFormatParser: false */ -/* global stringify: false */ /** * @ngdoc module @@ -180,7 +179,7 @@ var $$MessageFormatFactory = ['$parse', '$locale', '$sce', '$exceptionHandler', return function stringifier(value) { try { value = trustedContext ? $sce['getTrusted'](trustedContext, value) : $sce['valueOf'](value); - return allOrNothing && (value === void 0) ? value : stringify(value); + return allOrNothing && (value === void 0) ? value : $$stringify(value); } catch (err) { $exceptionHandler($interpolateMinErr['interr'](text, err)); } @@ -214,6 +213,7 @@ var $interpolateMinErr; var isFunction; var noop; var toJson; +var $$stringify; var module = window['angular']['module']('ngMessageFormat', ['ng']); module['factory']('$$messageFormat', $$MessageFormatFactory); @@ -222,6 +222,7 @@ module['config'](['$provide', function($provide) { isFunction = window['angular']['isFunction']; noop = window['angular']['noop']; toJson = window['angular']['toJson']; + $$stringify = window['angular']['$$stringify']; $provide['decorator']('$interpolate', $$interpolateDecorator); }]); diff --git a/test/ng/interpolateSpec.js b/test/ng/interpolateSpec.js index 1605866ed907..2aae67b34fa1 100644 --- a/test/ng/interpolateSpec.js +++ b/test/ng/interpolateSpec.js @@ -35,6 +35,29 @@ describe('$interpolate', function() { expect($interpolate('{{ false }}')({})).toEqual('false'); })); + it('should use custom toString when present', inject(function($interpolate, $rootScope) { + var context = { + a: { + toString: function() { + return 'foo'; + } + } + }; + + expect($interpolate('{{ a }}')(context)).toEqual('foo'); + })); + + it('should NOT use toString on array objects', inject(function($interpolate) { + expect($interpolate('{{a}}')({ a: [] })).toEqual('[]'); + })); + + + it('should NOT use toString on Date objects', inject(function($interpolate) { + var date = new Date(2014, 10, 10); + expect($interpolate('{{a}}')({ a: date })).toBe(JSON.stringify(date)); + expect($interpolate('{{a}}')({ a: date })).not.toEqual(date.toString()); + })); + it('should return interpolation function', inject(function($interpolate, $rootScope) { var interpolateFn = $interpolate('Hello {{name}}!'); diff --git a/test/ngMessageFormat/messageFormatSpec.js b/test/ngMessageFormat/messageFormatSpec.js index e65d5a16401a..41958180d19f 100644 --- a/test/ngMessageFormat/messageFormatSpec.js +++ b/test/ngMessageFormat/messageFormatSpec.js @@ -311,6 +311,30 @@ describe('$$ngMessageFormat', function() { })); + it('should use custom toString when present', inject(function($interpolate, $rootScope) { + var context = { + a: { + toString: function() { + return 'foo'; + } + } + }; + + expect($interpolate('{{ a }}')(context)).toEqual('foo'); + })); + + it('should NOT use toString on array objects', inject(function($interpolate) { + expect($interpolate('{{a}}')({ a: [] })).toEqual('[]'); + })); + + + it('should NOT use toString on Date objects', inject(function($interpolate) { + var date = new Date(2014, 10, 10); + expect($interpolate('{{a}}')({ a: date })).toBe(JSON.stringify(date)); + expect($interpolate('{{a}}')({ a: date })).not.toEqual(date.toString()); + })); + + it('should return interpolation function', inject(function($interpolate, $rootScope) { var interpolateFn = $interpolate('Hello {{name}}!'); From fa80a61a05a3b49a2c770d5544cb8480907a18d3 Mon Sep 17 00:00:00 2001 From: Martin Staffa Date: Sun, 5 Jun 2016 14:52:18 +0200 Subject: [PATCH 0012/1173] fix(ngBind): use same string representation as $interpolate Fixes #11716 BREAKING CHANGE: `ngBind` now uses the same logic as $interpolate (i.e. {{myString}}) when binding, which means values other than strings are now transformed as following: - null / undefined become empty string - with an object's custom toString() function, except if the object is a Date, Array, or Number - otherwise with JSON.stringify Previously, ngBind would use always use toString(). The following examples show the different output: ```js $scope.myPlainObject = {a: 1, b: 2}; $scope.myCustomObject = {a: 1, b: 2, toString: function() {return 'a+b';}}; ``` Plain Object: ```html [object Object] {"a":1,"b":2} ``` Object with custom toString(): ```html [object Object] a+b ``` If you want the output of `toString()`, you can use it directly on the value in ngBind: ```html [object Object] ``` --- src/ng/directive/ngBind.js | 2 +- test/ng/directive/ngBindSpec.js | 37 +++++++++++++++++++++++++++++++++ 2 files changed, 38 insertions(+), 1 deletion(-) diff --git a/src/ng/directive/ngBind.js b/src/ng/directive/ngBind.js index 807f6ab7b3c5..0444227e1d7b 100644 --- a/src/ng/directive/ngBind.js +++ b/src/ng/directive/ngBind.js @@ -60,7 +60,7 @@ var ngBindDirective = ['$compile', function($compile) { $compile.$$addBindingInfo(element, attr.ngBind); element = element[0]; scope.$watch(attr.ngBind, function ngBindWatchAction(value) { - element.textContent = isUndefined(value) ? '' : value; + element.textContent = stringify(value); }); }; } diff --git a/test/ng/directive/ngBindSpec.js b/test/ng/directive/ngBindSpec.js index 39a35c15723a..424d5cd758fb 100644 --- a/test/ng/directive/ngBindSpec.js +++ b/test/ng/directive/ngBindSpec.js @@ -46,6 +46,43 @@ describe('ngBind*', function() { expect(element.text()).toEqual('-0false'); })); + they('should jsonify $prop', [[{a: 1}, '{"a":1}'], [true, 'true'], [false, 'false']], function(prop) { + inject(function($rootScope, $compile) { + $rootScope.value = prop[0]; + element = $compile('
    ')($rootScope); + $rootScope.$digest(); + expect(element.text()).toEqual(prop[1]); + }); + }); + + it('should use custom toString when present', inject(function($rootScope, $compile) { + $rootScope.value = { + toString: function() { + return 'foo'; + } + }; + element = $compile('
    ')($rootScope); + $rootScope.$digest(); + expect(element.text()).toEqual('foo'); + })); + + it('should NOT use toString on array objects', inject(function($rootScope, $compile) { + $rootScope.value = []; + element = $compile('
    ')($rootScope); + $rootScope.$digest(); + expect(element.text()).toEqual('[]'); + })); + + + it('should NOT use toString on Date objects', inject(function($rootScope, $compile) { + $rootScope.value = new Date(2014, 10, 10, 0, 0, 0); + element = $compile('
    ')($rootScope); + $rootScope.$digest(); + expect(element.text()).toBe(JSON.stringify($rootScope.value)); + expect(element.text()).not.toEqual($rootScope.value.toString()); + })); + + it('should one-time bind if the expression starts with two colons', inject(function($rootScope, $compile) { element = $compile('
    ')($rootScope); $rootScope.a = 'lucas'; From 7ce7e09c51819814af796b41a456312acb5d9332 Mon Sep 17 00:00:00 2001 From: Martin Staffa Date: Wed, 22 Jun 2016 14:49:39 +0200 Subject: [PATCH 0013/1173] test(input): ensure Date objects work for min/max in date input types Tests that - interpolated Date objects work for min/max - Date objects work for ng-min/ng-max --- test/ng/directive/inputSpec.js | 58 ++++++++++++++++++++++++++++++++++ 1 file changed, 58 insertions(+) diff --git a/test/ng/directive/inputSpec.js b/test/ng/directive/inputSpec.js index 8ac6cf257a20..6b80cce7c1b3 100644 --- a/test/ng/directive/inputSpec.js +++ b/test/ng/directive/inputSpec.js @@ -1857,6 +1857,16 @@ describe('input', function() { it('should parse ISO-based date strings as a valid min date value', function() { var inputElm = helper.compileInput(''); + $rootScope.value = new Date(2010, 1, 1, 0, 0, 0); + $rootScope.min = new Date(2014, 10, 10, 0, 0, 0).toISOString(); + $rootScope.$digest(); + + expect($rootScope.form.myControl.$error.min).toBeTruthy(); + }); + + it('should parse interpolated Date objects as a valid min date value', function() { + var inputElm = helper.compileInput(''); + $rootScope.value = new Date(2010, 1, 1, 0, 0, 0); $rootScope.min = new Date(2014, 10, 10, 0, 0, 0); $rootScope.$digest(); @@ -1896,6 +1906,16 @@ describe('input', function() { it('should parse ISO-based date strings as a valid max date value', function() { var inputElm = helper.compileInput(''); + $rootScope.value = new Date(2020, 1, 1, 0, 0, 0); + $rootScope.max = new Date(2014, 10, 10, 0, 0, 0).toISOString(); + $rootScope.$digest(); + + expect($rootScope.form.myControl.$error.max).toBeTruthy(); + }); + + it('should parse interpolated Date objects as a valid max date value', function() { + var inputElm = helper.compileInput(''); + $rootScope.value = new Date(2020, 1, 1, 0, 0, 0); $rootScope.max = new Date(2014, 10, 10, 0, 0, 0); $rootScope.$digest(); @@ -1990,6 +2010,44 @@ describe('input', function() { expect(inputElm).toBeValid(); }); + + it('should allow Date objects as valid ng-max values', function() { + $rootScope.max = new Date(2012, 1, 1, 1, 2, 0); + var inputElm = helper.compileInput(''); + + helper.changeInputValueTo('2014-01-01T12:34:00'); + expect(inputElm).toBeInvalid(); + + $rootScope.max = new Date(2013, 1, 1, 1, 2, 0); + $rootScope.$digest(); + + expect(inputElm).toBeInvalid(); + + $rootScope.max = new Date(2014, 1, 1, 1, 2, 0); + $rootScope.$digest(); + + expect(inputElm).toBeValid(); + }); + + + it('should allow Date objects as valid ng-min values', function() { + $rootScope.min = new Date(2013, 1, 1, 1, 2, 0); + var inputElm = helper.compileInput(''); + + helper.changeInputValueTo('2010-01-01T12:34:00'); + expect(inputElm).toBeInvalid(); + + $rootScope.min = new Date(2014, 1, 1, 1, 2, 0); + $rootScope.$digest(); + + expect(inputElm).toBeInvalid(); + + $rootScope.min = new Date(2009, 1, 1, 1, 2, 0); + $rootScope.$digest(); + + expect(inputElm).toBeValid(); + }); + describe('ISO_DATE_REGEXP', function() { var dates = [ // Validate date From f7405e3b98388e8941a9169ac4794dd7f72bcde3 Mon Sep 17 00:00:00 2001 From: Jeff Andrews Date: Wed, 30 Mar 2016 22:57:04 +1300 Subject: [PATCH 0014/1173] fix(ngMocks): allow `ErrorAddingDeclarationLocationStack` to be recognized as an `Error` Change `ErrorAddingDeclarationLocationStack`'s prototype so test frameworks (such as Jasmine 2.x) are able to recognize it as `Error`. Fixes #13821 Closes #14344 --- src/ngMock/angular-mocks.js | 2 +- test/ngMock/angular-mocksSpec.js | 21 +++++++++++++++++++-- 2 files changed, 20 insertions(+), 3 deletions(-) diff --git a/src/ngMock/angular-mocks.js b/src/ngMock/angular-mocks.js index af47d4b3e7e2..3ad263ce81b8 100644 --- a/src/ngMock/angular-mocks.js +++ b/src/ngMock/angular-mocks.js @@ -3057,7 +3057,7 @@ angular.mock.$RootScopeDecorator = ['$delegate', function($delegate) { this.stack = e.stack + '\n' + errorForStack.stack; if (e.stackArray) this.stackArray = e.stackArray; }; - ErrorAddingDeclarationLocationStack.prototype.toString = Error.prototype.toString; + ErrorAddingDeclarationLocationStack.prototype = Error.prototype; window.inject = angular.mock.inject = function() { var blockFns = Array.prototype.slice.call(arguments, 0); diff --git a/test/ngMock/angular-mocksSpec.js b/test/ngMock/angular-mocksSpec.js index 04d5493f2659..d1e3b87298b9 100644 --- a/test/ngMock/angular-mocksSpec.js +++ b/test/ngMock/angular-mocksSpec.js @@ -631,7 +631,6 @@ describe('ngMock', function() { inject(); // Trigger the tests in `module` }); - }); @@ -985,6 +984,22 @@ describe('ngMock', function() { }); } }); + + describe('ErrorAddingDeclarationLocationStack', function() { + it('should be caught by Jasmine\'s `toThrowError()`', function() { + function throwErrorAddingDeclarationStack() { + module(function($provide) { + $provide.factory('badFactory', function() { + throw new Error('BadFactoryError'); + }); + }); + + inject(function(badFactory) {}); + } + + expect(throwErrorAddingDeclarationStack).toThrowError(/BadFactoryError/); + }); + }); }); }); @@ -2616,8 +2631,10 @@ describe('make sure that we can create an injector outside of tests', function() angular.injector([function($injector) {}]); }); + describe('`afterEach` clean-up', function() { describe('`$rootElement`', function() { + describe('undecorated', function() { var prevRootElement; var prevCleanDataSpy; @@ -2780,6 +2797,7 @@ describe('`afterEach` clean-up', function() { }); }); + describe('sharedInjector', function() { // this is of a bit tricky feature to test as we hit angular's own testing // mechanisms (e.g around jQuery cache checking), as ngMock augments the very @@ -3037,5 +3055,4 @@ describe('sharedInjector', function() { if (typeof fn !== "function") throw Error("not fn", fn); sdescribe.current.afterEach.push(fn); } - }); From 708e3d97f36bc9bd376ff65d46ef18c629784c3e Mon Sep 17 00:00:00 2001 From: Martin Staffa Date: Fri, 9 Oct 2015 12:55:51 +0200 Subject: [PATCH 0015/1173] docs(guide): create new page for external resources The official and external resources have been split into two different guide sections. Official stays at the index, external gets its own page. The external resources have also been reorganized and updated, but I haven't checked if all material is still relevant. --- docs/content/api/index.ngdoc | 2 + docs/content/guide/external.ngdoc | 146 ++++++++++++++++++++++++++++++ docs/content/guide/index.ngdoc | 126 +++++--------------------- 3 files changed, 171 insertions(+), 103 deletions(-) create mode 100644 docs/content/guide/external.ngdoc diff --git a/docs/content/api/index.ngdoc b/docs/content/api/index.ngdoc index d2a91e06830d..cc25d2231962 100644 --- a/docs/content/api/index.ngdoc +++ b/docs/content/api/index.ngdoc @@ -8,6 +8,8 @@ Welcome to the AngularJS API docs page. These pages contain the AngularJS refere The documentation is organized into **{@link guide/module modules}** which contain various components of an AngularJS application. These components are {@link guide/directive directives}, {@link guide/services services}, {@link guide/filter filters}, {@link guide/providers providers}, {@link guide/templates templates}, global APIs, and testing mocks. +There is also a {@link guide/index} with articles on various topics, and a list of external resources. +
    **Angular Prefixes `$` and `$$`**: diff --git a/docs/content/guide/external.ngdoc b/docs/content/guide/external.ngdoc new file mode 100644 index 000000000000..cab4a65e86d2 --- /dev/null +++ b/docs/content/guide/external.ngdoc @@ -0,0 +1,146 @@ +@ngdoc overview +@name External Resources +@sortOrder 560 +@description + +This is a collection of external, 3rd party resources for learning and developing Angular. + +## Articles, Videos, and Projects + +### Introductory Material + +* [10 Reasons Why You Should Use AngularJS](http://www.sitepoint.com/10-reasons-use-angularjs/) +* [10 Reasons Why Developers Should Learn AngularJS](http://wintellect.com/blogs/jlikness/10-reasons-web-developers-should-learn-angularjs) +* [Design Principles of AngularJS (video)](https://www.youtube.com/watch?v=HCR7i5F5L8c) +* [Fundamentals in 60 Minutes (video)](http://www.youtube.com/watch?v=i9MHigUZKEM) +* [For folks with a jQuery background](http://stackoverflow.com/questions/14994391/how-do-i-think-in-angularjs-if-i-have-a-jquery-background) + +### Specific Topics + +#### Application Structure & Style Guides + +* [Architecture, file structure, components, one-way dataflow and best practices](https://github.com/toddmotto/angular-styleguide) +* [Angular Styleguide](https://github.com/johnpapa/angular-styleguide) +* [When to use directives, controllers or services](http://kirkbushell.me/when-to-use-directives-controllers-or-services-in-angular/) +* [Service vs Factory](http://blog.thoughtram.io/angular/2015/07/07/service-vs-factory-once-and-for-all.html) + +#### Testing + +* **Unit testing:** [Karma](http://karma-runner.github.io), [Using Karma (video)](http://www.youtube.com/watch?v=YG5DEzaQBIc), {@link guide/unit-testing Unit testing}, {@link guide/services#unit-testing Testing services}, [Karma in Webstorm](http://blog.jetbrains.com/webstorm/2013/10/running-javascript-tests-with-karma-in-webstorm-7/) +* **End-to-End Testing:** [Protractor](https://github.com/angular/protractor) + +#### Mobile + +* [Angular on Mobile Guide](http://www.ng-newsletter.com/posts/angular-on-mobile.html) +* [Angular and Cordova](http://devgirl.org/2013/06/10/quick-start-guide-phonegap-and-angularjs/) +* [Ionic Framework](http://ionicframework.com/) + +#### Deployment + +##### General + +* **Javascript minification: **[Background](http://thegreenpizza.github.io/2013/05/25/building-minification-safe-angular.js-applications/), [ng-annotate automation tool](https://github.com/olov/ng-annotate) +* **Analytics and Logging:** [Angularyitcs (Google Analytics)](http://ngmodules.org/modules/angularytics), [Angulartics (Analytics)](https://github.com/luisfarzati/angulartics), [Logging Client-Side Errors](http://www.bennadel.com/blog/2542-Logging-Client-Side-Errors-With-AngularJS-And-Stacktrace-js.htm) +* **SEO:** [By hand](http://www.yearofmoo.com/2012/11/angularjs-and-seo.html), [prerender.io](http://prerender.io/), [Brombone](http://www.brombone.com/), [SEO.js](http://getseojs.com/), [SEO4Ajax](http://www.seo4ajax.com/) + +##### Server-Specific + +* **Django:** [Tutorial](http://blog.mourafiq.com/post/55034504632/end-to-end-web-app-with-django-rest-framework), [Integrating AngularJS with Django](http://django-angular.readthedocs.org/en/latest/integration.html), [Getting Started with Django Rest Framework and AngularJS](http://blog.kevinastone.com/getting-started-with-django-rest-framework-and-angularjs.html) +* **FireBase:** [AngularFire](http://angularfire.com/), [Firebase Foundations for AngularJS](http://blog.watchandcode.com/firebase-foundations/), [Realtime Apps with AngularJS and FireBase (video)](http://www.youtube.com/watch?v=C7ZI7z7qnHU) +* **Google Cloud Platform: **[with Cloud Endpoints](https://cloud.google.com/developers/articles/angularjs-cloud-endpoints-recipe-for-building-modern-web-applications/), [with Go](https://github.com/GoogleCloudPlatform/appengine-angular-gotodos) +* **Hood.ie:** [60 Minutes to Awesome](http://www.roberthorvick.com/2013/06/30/todomvc-angularjs-hood-ie-60-minutes-to-awesome/) +* **MEAN Stack: **[Blog post](http://blog.mongodb.org/post/49262866911/the-mean-stack-mongodb-expressjs-angularjs-and), [Setup](http://thecodebarbarian.wordpress.com/2013/07/22/introduction-to-the-mean-stack-part-one-setting-up-your-tools/), [GDL Video](https://developers.google.com/live/shows/913996610) +* **Rails: **[Tutorial](http://coderberry.me/blog/2013/04/22/angularjs-on-rails-4-part-1/), [AngularJS with Rails4](https://shellycloud.com/blog/2013/10/how-to-integrate-angularjs-with-rails-4), [angularjs-rails](https://github.com/hiravgandhi/angularjs-rails) +* **PHP: **[Building a RESTful web service](http://blog.brunoscopelliti.com/building-a-restful-web-service-with-angularjs-and-php-more-power-with-resource), [End to End with Laravel 4 (video)](http://www.youtube.com/watch?v=hqAyiqUs93c) +* **Meteor: **[angular-meteor package](https://github.com/Urigo/angular-meteor) + +### Other Languages +* [ES6, Webpack, and JSPM Starter Project](https://github.com/AngularClass/NG6-starter) +* [ES6/Typescript Best Practices](https://codepen.io/martinmcwhorter/post/angularjs-1-x-with-typescript-or-es6-best-practices) +* [Dart](https://github.com/angular/angular.dart.tutorial/wiki) +* [CoffeeScript Tutorial](http://www.coffeescriptlove.com/2013/08/angularjs-and-coffeescript-tutorials.html) + +### More Topics + +* **Security:** [video](https://www.youtube.com/watch?v=18ifoT-Id54) +* **Internationalization and Localization:** [Creating multilingual support](http://www.novanet.no/blog/hallstein-brotan/dates/2013/10/creating-multilingual-support-using-angularjs/) +* **Authentication/Login: **[Google example](https://developers.google.com/+/photohunt/python), [AngularJS Facebook library](https://github.com/pc035860/angular-easyfb), [Facebook example](http://blog.brunoscopelliti.com/facebook-authentication-in-your-angularjs-web-app), [authentication strategy](http://blog.brunoscopelliti.com/deal-with-users-authentication-in-an-angularjs-web-app), [unix-style authorization](http://frederiknakstad.com/authentication-in-single-page-applications-with-angular-js/) +* **Visualization:** [SVG](http://gaslight.co/blog/angular-backed-svgs), [D3.js](http://www.ng-newsletter.com/posts/d3-on-angular.html) +* **Realtime Communication: **[Socket.io](http://www.creativebloq.com/javascript/angularjs-collaboration-board-socketio-2132885), [OmniBinder](https://github.com/jeffbcross/omnibinder) + + +## Tools + +* **Getting Started:** [Comparison of the options for starting a new project](http://www.dancancro.com/comparison-of-angularjs-application-starters/) +* **Debugging:** [Batarang](https://chrome.google.com/webstore/detail/angularjs-batarang/ighdmehidhipcmcojjgiloacoafjmpfk?hl=en) +* **Editor support:** [Webstorm](http://plugins.jetbrains.com/plugin/6971) (and [video](http://www.youtube.com/watch?v=LJOyrSh1kDU)), [Sublime Text](https://github.com/angular-ui/AngularJS-sublime-package), [Visual Studio](http://madskristensen.net/post/angularjs-intellisense-in-visual-studio-2012) +* **Workflow:** [Yeoman.io](https://github.com/yeoman/generator-angular) and [Angular Yeoman Tutorial](http://www.sitepoint.com/kickstart-your-angularjs-development-with-yeoman-grunt-and-bower/) + +## Complementary Libraries + +This is a list of libraries that enhance Angular, add common UI components or integrate with other libraries. +You can find a full list of Angular external libraries at [ngmodules.org](http://ngmodules.org/). + +* **Advanced Routing:** [UI-Router](https://github.com/angular-ui/ui-router) +* **Authentication:** [Http Auth Interceptor](https://github.com/witoldsz/angular-http-auth) +* **Internationalization:** + - [angular-translate](http://angular-translate.github.io) + - [angular-gettext](http://angular-gettext.rocketeer.be/) + - [angular-localization](http://doshprompt.github.io/angular-localization/) +* **RESTful services:** [Restangular](https://github.com/mgonto/restangular) +* **SQL and NoSQL backends:** + - [BreezeJS](http://www.breezejs.com/) + - [AngularFire](http://angularfire.com/) +* **Data Handling** + - Local Storage and session: [ngStorage](https://github.com/gsklee/ngStorage) + - [angular-cache](https://github.com/jmdobry/angular-cache) + - Data Modeling [JS-Data-Angular](https://github.com/js-data/js-data-angular) +* **Fileupload:** + - [ng-file-upload](https://github.com/danialfarid/ng-file-upload) + - [blueimp-fileupload for Angular](https://blueimp.github.io/jQuery-File-Upload/angularjs.html) +* **Specific UI Elements:** + - [ngInfiniteScroll](https://sroze.github.io/ngInfiniteScroll/) + - [ngTable](https://github.com/esvit/ng-table) + - [Angular UI Grid](http://angular-ui.github.io/grid) + - [Toaster Notifications](https://github.com/jirikavi/AngularJS-Toaster) + - [textAngular Rich Text Editor / contenteditable](http://textangular.com/) (Rich Text Editor / + binding to contenteditable) + - [Angular UI Map (Google Maps)](https://github.com/angular-ui/ui-map) +* **General UI Libraries:** + - [AngularStrap for Bootstrap 3](http://mgcrea.github.io/angular-strap/) + - [Angular Material](https://material.angularjs.org/latest/) + - [Angular UI Bootstrap](http://angular-ui.github.io/) + - [KendoUI](http://kendo-labs.github.io/angular-kendo/#/) + - [Wijmo](http://wijmo.com/tag/angularjs-2/) + +## General Learning Resources + +### Books +* [AngularJS: Up and Running](http://www.amazon.com/AngularJS-Running-Enhanced-Productivity-Structured/dp/1491901942) by Brad Green and Shyam Seshadri +* [Mastering Web App Development](http://www.amazon.com/Mastering-Web-Application-Development-AngularJS/dp/1782161821) by Pawel Kozlowski and Pete Bacon Darwin +* [AngularJS Directives](http://www.amazon.com/AngularJS-Directives-Alex-Vanston/dp/1783280336) by Alex Vanston +* [Recipes With AngularJS](http://www.amazon.co.uk/Recipes-Angular-js-Frederik-Dietz-ebook/dp/B00DK95V48) by Frederik Dietz +* [Developing an AngularJS Edge](http://www.amazon.com/Developing-AngularJS-Edge-Christopher-Hiller-ebook/dp/B00CJLFF8K) by Christopher Hiller +* [ng-book: The Complete Book on AngularJS](http://ng-book.com/) by Ari Lerner +* [AngularJS : Novice to Ninja](http://www.amazon.in/AngularJS-Novice-Ninja-Sandeep-Panda/dp/0992279453) by Sandeep Panda +* [AngularJS UI Development](http://www.amazon.com/AngularJS-UI-Development-Amit-Ghart-ebook/dp/B00OXVAK7A) by Amit Gharat and Matthias Nehlsen +* [Responsive Web Design with AngularJS](http://www.amazon.com/Responsive-Design-AngularJS-Sandeep-Kumar/dp/178439842X) by Sandeep Kumar Patel +* [Professional AngularJS](http://www.amazon.com/Professional-AngularJS-Valeri-Karpov/dp/1118832078/) + +### Videos: +* [egghead.io](http://egghead.io/) + +### Courses +* **Free online:** + [thinkster.io](http://thinkster.io), + [CodeAcademy](http://www.codecademy.com/courses/javascript-advanced-en-2hJ3J/0/1), + [CodeSchool](https://www.codeschool.com/courses/shaping-up-with-angular-js) +* **Paid online:** + [The Angular Course (115 videos that show you how to build a full app)](http://watchandcode.com/courses/angular-course/), + [Pluralsite (3 courses)](http://www.pluralsight.com/training/Courses/Find?highlight=true&searchTerm=angularjs), + [Tuts+](https://tutsplus.com/course/easier-js-apps-with-angular/), + [lynda.com](http://www.lynda.com/AngularJS-tutorials/Up-Running-AngularJS/133318-2.html), + [WintellectNOW (4 lessons)](http://www.wintellectnow.com/Course/Detail/mastering-angularjs) +* **Paid onsite:** + [angularbootcamp.com](http://angularbootcamp.com/) + diff --git a/docs/content/guide/index.ngdoc b/docs/content/guide/index.ngdoc index 9701773eb898..6274bcbe5d21 100644 --- a/docs/content/guide/index.ngdoc +++ b/docs/content/guide/index.ngdoc @@ -4,133 +4,56 @@ # Guide to AngularJS Documentation -Everything you need to know about AngularJS +On this page, you will find a list of official Angular resources on various topics. +We have also set up a guide page for {@link guide/external external resources} where you +can find lots of additional information and material on these topics, a list of complimentary +libraries, and much more. -* {@link guide/introduction What is AngularJS?} -* {@link guide/concepts Conceptual Overview} - -## Tutorials +## Tutorial * {@link tutorial/index Official AngularJS Tutorial} -* [10 Reasons Why You Should Use AngularJS](http://www.sitepoint.com/10-reasons-use-angularjs/) -* [10 Reasons Why Developers Should Learn AngularJS](http://wintellect.com/blogs/jlikness/10-reasons-web-developers-should-learn-angularjs) -* [Design Principles of AngularJS (video)](https://www.youtube.com/watch?v=HCR7i5F5L8c) -* [Fundamentals in 60 Minutes (video)](http://www.youtube.com/watch?v=i9MHigUZKEM) -* [For folks with a jQuery background](http://stackoverflow.com/questions/14994391/how-do-i-think-in-angularjs-if-i-have-a-jquery-background) ## Core Concepts +* {@link guide/introduction What is AngularJS?} +* {@link guide/concepts Conceptual Overview} + ### Templates In Angular applications, you move the job of filling page templates with data from the server to the client. The result is a system better structured for dynamic page updates. Below are the core features you'll use. * {@link guide/databinding Data binding} * {@link guide/expression Expressions} +* {@link guide/interpolation Interpolation} * {@link guide/directive Directives} * {@link ngRoute.$route Views and routes (see the example)} * {@link guide/filter Filters} -* {@link guide/forms Forms} and [Concepts of AngularJS Forms](http://mrbool.com/the-concepts-of-angularjs-forms/29117) +* {@link guide/compiler HTML compiler} +* {@link guide/forms Forms} ### Application Structure -* **Blog post: **[When to use directives, controllers or services](http://kirkbushell.me/when-to-use-directives-controllers-or-services-in-angular/) * **App wiring:** {@link guide/di Dependency injection} * **Exposing model to templates:** {@link guide/scope Scopes} +* **Bootstrap:** {@link guide/bootstrap Bootstrapping an app} * **Communicating with servers:** {@link ng.$http $http}, {@link ngResource.$resource $resource} ### Other AngularJS Features -* **Animation:** {@link guide/animations Core concepts}, {@link ngAnimate ngAnimate API}, and [Animation in AngularJS 1.2](http://www.yearofmoo.com/2013/08/remastered-animation-in-angularjs-1-2.html) +* **Animation:** {@link guide/animations Core concepts}, {@link ngAnimate ngAnimate API} * **Security:** {@link guide/security Security Docs}, {@link ng.$sce Strict Contextual Escaping}, {@link ng.directive:ngCsp Content Security Policy}, {@link ngSanitize.$sanitize $sanitize}, [video](https://www.youtube.com/watch?v=18ifoT-Id54) * **Internationalization and Localization:** {@link guide/i18n Angular Guide to i18n and l10n}, {@link ng.filter:date date filter}, {@link ng.filter:currency currency filter}, [Creating multilingual support](http://www.novanet.no/blog/hallstein-brotan/dates/2013/10/creating-multilingual-support-using-angularjs/) -* **Mobile:** {@link ngTouch Touch events} +* **Touch events:** {@link ngTouch Touch events} * **Accessibility:** {@link guide/accessibility ngAria} ### Testing -* **Unit testing:** [Using Karma (video)](http://www.youtube.com/watch?v=YG5DEzaQBIc), {@link guide/unit-testing Unit testing}, {@link guide/services#unit-testing Testing services}, [Karma in Webstorm](http://blog.jetbrains.com/webstorm/2013/10/running-javascript-tests-with-karma-in-webstorm-7/) -* **Scenario testing:** [Protractor](https://github.com/angular/protractor) - -## Specific Topics - -* **Login: **[Google example](https://developers.google.com/+/photohunt/python), [AngularJS Facebook library](https://github.com/pc035860/angular-easyfb), [Facebook example](http://blog.brunoscopelliti.com/facebook-authentication-in-your-angularjs-web-app), [authentication strategy](http://blog.brunoscopelliti.com/deal-with-users-authentication-in-an-angularjs-web-app), [unix-style authorization](http://frederiknakstad.com/authentication-in-single-page-applications-with-angular-js/) -* **Mobile:** [Angular on Mobile Guide](http://www.ng-newsletter.com/posts/angular-on-mobile.html), [PhoneGap](http://devgirl.org/2013/06/10/quick-start-guide-phonegap-and-angularjs/) -* **Other Languages:** [CoffeeScript](http://www.coffeescriptlove.com/2013/08/angularjs-and-coffeescript-tutorials.html), [Dart](https://github.com/angular/angular.dart.tutorial/wiki) -* **Realtime: **[Socket.io](http://www.creativebloq.com/javascript/angularjs-collaboration-board-socketio-2132885), [OmniBinder](https://github.com/jeffbcross/omnibinder) -* **Visualization:** [SVG](http://gaslight.co/blog/angular-backed-svgs), [D3.js](http://www.ng-newsletter.com/posts/d3-on-angular.html) -* **Local Storage and session:** [ngStorage](https://github.com/gsklee/ngStorage) - -## Tools - -* **Getting Started:** [Comparison of the options for starting a new project](http://www.dancancro.com/comparison-of-angularjs-application-starters/) -* **Debugging:** [Batarang](https://chrome.google.com/webstore/detail/angularjs-batarang/ighdmehidhipcmcojjgiloacoafjmpfk?hl=en) -* **Testing:** [Karma](http://karma-runner.github.io), [Protractor](https://github.com/angular/protractor) -* **Editor support:** [Webstorm](http://plugins.jetbrains.com/plugin/6971) (and [video](http://www.youtube.com/watch?v=LJOyrSh1kDU)), [Sublime Text](https://github.com/angular-ui/AngularJS-sublime-package), [Visual Studio](http://madskristensen.net/post/angularjs-intellisense-in-visual-studio-2012) -* **Workflow:** [Yeoman.io](https://github.com/yeoman/generator-angular) and [Angular Yeoman Tutorial](http://www.sitepoint.com/kickstart-your-angularjs-development-with-yeoman-grunt-and-bower/) - -## Complementary Libraries - -This is a short list of libraries with specific support and documentation for working with Angular. You can find a full list of all known Angular external libraries at [ngmodules.org](http://ngmodules.org/). - -* **Internationalization:** [angular-translate](http://angular-translate.github.io), [angular-gettext](http://angular-gettext.rocketeer.be/), [angular-localization](http://doshprompt.github.io/angular-localization/) -* **RESTful services:** [Restangular](https://github.com/mgonto/restangular) -* **SQL and NoSQL backends:** [BreezeJS](http://www.breezejs.com/), [AngularFire](http://angularfire.com/) -* **UI Widgets: **[KendoUI](http://kendo-labs.github.io/angular-kendo/#/), [UI Bootstrap](http://angular-ui.github.io/bootstrap/), [Wijmo](http://wijmo.com/tag/angularjs-2/), [ngTagsInput](https://github.com/mbenford/ngTagsInput) -* **Advanced Routing:** [UI-Router](https://github.com/angular-ui/ui-router) -* **Maps:** [UI-Map (Google Maps)](https://github.com/angular-ui/ui-map) - -## Deployment - -### General - -* **Docs Page:** {@link guide/production Running an AngularJS App in Production} -* **Javascript minification: **[Background](http://thegreenpizza.github.io/2013/05/25/building-minification-safe-angular.js-applications/), [ng-annotate automation tool](https://github.com/olov/ng-annotate) -* **Analytics and Logging:** [Angularyitcs (Google Analytics)](http://ngmodules.org/modules/angularytics), [Angulartics (Analytics)](https://github.com/luisfarzati/angulartics), [Logging Client-Side Errors](http://www.bennadel.com/blog/2542-Logging-Client-Side-Errors-With-AngularJS-And-Stacktrace-js.htm) -* **SEO:** [By hand](http://www.yearofmoo.com/2012/11/angularjs-and-seo.html), [prerender.io](http://prerender.io/), [Brombone](http://www.brombone.com/), [SEO.js](http://getseojs.com/), [SEO4Ajax](http://www.seo4ajax.com/) - -### Server-Specific - -* **Django:** [Tutorial](http://blog.mourafiq.com/post/55034504632/end-to-end-web-app-with-django-rest-framework), [Integrating AngularJS with Django](http://django-angular.readthedocs.org/en/latest/integration.html), [Getting Started with Django Rest Framework and AngularJS](http://blog.kevinastone.com/getting-started-with-django-rest-framework-and-angularjs.html) -* **FireBase:** [AngularFire](http://angularfire.com/), [Firebase Foundations for AngularJS](http://blog.watchandcode.com/firebase-foundations/), [Realtime Apps with AngularJS and FireBase (video)](http://www.youtube.com/watch?v=C7ZI7z7qnHU) -* **Google Cloud Platform: **[with Cloud Endpoints](https://cloud.google.com/developers/articles/angularjs-cloud-endpoints-recipe-for-building-modern-web-applications/), [with Go](https://github.com/GoogleCloudPlatform/appengine-angular-gotodos) -* **Hood.ie:** [60 Minutes to Awesome](http://www.roberthorvick.com/2013/06/30/todomvc-angularjs-hood-ie-60-minutes-to-awesome/) -* **MEAN Stack: **[Blog post](http://blog.mongodb.org/post/49262866911/the-mean-stack-mongodb-expressjs-angularjs-and), [Setup](http://thecodebarbarian.wordpress.com/2013/07/22/introduction-to-the-mean-stack-part-one-setting-up-your-tools/), [GDL Video](https://developers.google.com/live/shows/913996610) -* **Rails: **[Tutorial](http://coderberry.me/blog/2013/04/22/angularjs-on-rails-4-part-1/), [AngularJS with Rails4](https://shellycloud.com/blog/2013/10/how-to-integrate-angularjs-with-rails-4), [angularjs-rails](https://github.com/hiravgandhi/angularjs-rails) -* **PHP: **[Building a RESTful web service](http://blog.brunoscopelliti.com/building-a-restful-web-service-with-angularjs-and-php-more-power-with-resource), [End to End with Laravel 4 (video)](http://www.youtube.com/watch?v=hqAyiqUs93c) -* **Meteor: **[angular-meteor package](https://github.com/Urigo/angular-meteor) - -## Learning Resources - -### Books -* [AngularJS: Up and Running](http://www.amazon.com/AngularJS-Running-Enhanced-Productivity-Structured/dp/1491901942) by Brad Green and Shyam Seshadri -* [Mastering Web App Development](http://www.amazon.com/Mastering-Web-Application-Development-AngularJS/dp/1782161821) by Pawel Kozlowski and Pete Bacon Darwin -* [AngularJS Directives](http://www.amazon.com/AngularJS-Directives-Alex-Vanston/dp/1783280336) by Alex Vanston -* [Recipes With AngularJS](http://www.amazon.co.uk/Recipes-Angular-js-Frederik-Dietz-ebook/dp/B00DK95V48) by Frederik Dietz -* [Developing an AngularJS Edge](http://www.amazon.com/Developing-AngularJS-Edge-Christopher-Hiller-ebook/dp/B00CJLFF8K) by Christopher Hiller -* [ng-book: The Complete Book on AngularJS](http://ng-book.com/) by Ari Lerner -* [AngularJS : Novice to Ninja](http://www.amazon.in/AngularJS-Novice-Ninja-Sandeep-Panda/dp/0992279453) by Sandeep Panda -* [AngularJS UI Development](http://www.amazon.com/AngularJS-UI-Development-Amit-Ghart-ebook/dp/B00OXVAK7A) by Amit Gharat and Matthias Nehlsen -* [Responsive Web Design with AngularJS](http://www.amazon.com/Responsive-Design-AngularJS-Sandeep-Kumar/dp/178439842X) by Sandeep Kumar Patel -* [Professional AngularJS](http://www.amazon.com/Professional-AngularJS-Valeri-Karpov/dp/1118832078/) - -### Videos: -* [egghead.io](http://egghead.io/) -* [Angular on YouTube](http://youtube.com/angularjs) -* [Firebase Foundations for AngularJS](http://blog.watchandcode.com/firebase-foundations/) - -### Courses -* **Free online:** - [thinkster.io](http://thinkster.io), - [CodeAcademy](http://www.codecademy.com/courses/javascript-advanced-en-2hJ3J/0/1), - [CodeSchool](https://www.codeschool.com/courses/shaping-up-with-angular-js) -* **Paid online:** - [The Angular Course (115 videos that show you how to build a full app)](http://watchandcode.com/courses/angular-course/), - [Pluralsite (3 courses)](http://www.pluralsight.com/training/Courses/Find?highlight=true&searchTerm=angularjs), - [Tuts+](https://tutsplus.com/course/easier-js-apps-with-angular/), - [lynda.com](http://www.lynda.com/AngularJS-tutorials/Up-Running-AngularJS/133318-2.html), - [WintellectNOW (4 lessons)](http://www.wintellectnow.com/Course/Detail/mastering-angularjs) -* **Paid onsite:** - [angularbootcamp.com](http://angularbootcamp.com/) +* **Unit testing:** {@link guide/unit-testing Unit testing}, {@link guide/services#unit-testing Testing services}, +* **Scenario / e2e testing:** {@link guide/e2e-testing e2e testing guide} + +## Starter project template + +* (https://github.com/angular/angular-seed)[Angular Seed] ## Getting Help @@ -140,12 +63,9 @@ The recipe for getting help on your unique issue is to create an example that co * [AngularJS mailing list](https://groups.google.com/forum/#!forum/angular) * [AngularJS IRC channel](http://webchat.freenode.net/?channels=angularjs&uio=d4) -## Social Channels +## Official Channels -* **Daily updates:** [Google+](https://plus.google.com/u/0/+AngularJS) or [Twitter](https://twitter.com/angularjs) -* **Weekly newsletter:** [ng-newsletter](http://www.ng-newsletter.com/) -* **Meetups: **[meetup.com](http://www.meetup.com/find/?keywords=angularJS&radius=Infinity&userFreeform=San+Francisco%2C+CA&mcId=z94108&mcName=San+Francisco%2C+CA&sort=member_count&eventFilter=mysugg) -* **Official news and releases: **[AngularJS Blog](http://blog.angularjs.org/) +* **Official news and releases:** [AngularJS Blog](http://blog.angularjs.org/), [Google+](https://plus.google.com/u/0/+AngularJS), [Twitter](https://twitter.com/angularjs), [Angular on YouTube](http://youtube.com/angularjs) ## Contributing to AngularJS @@ -153,7 +73,7 @@ Though we have a core group of core contributors at Google, Angular is an open s ## Final Bits -Didn't find what you're looking for here? Check out [AngularJS-Learning](https://github.com/jmcunningham/AngularJS-Learning) for an even more comprehensive list of links to videos, tutorials, and blog posts. +Didn't find what you're looking for here? We have set up a special page for all external If you have awesome AngularJS resources that belong on this page, please tell us about them on [Google+](https://plus.google.com/u/0/+AngularJS) or [Twitter](https://twitter.com/angularjs). From 20051e5c5943cc801f9a9fd4d39ec806eb5013c1 Mon Sep 17 00:00:00 2001 From: Peter Bacon Darwin Date: Fri, 1 Jul 2016 11:00:13 +0100 Subject: [PATCH 0016/1173] docs(guide): tweaks to the index and external resources guides Closes #14843 --- docs/content/api/index.ngdoc | 2 +- ...xternal.ngdoc => external-resources.ngdoc} | 23 ++++---- docs/content/guide/index.ngdoc | 57 ++++++++++++------- 3 files changed, 48 insertions(+), 34 deletions(-) rename docs/content/guide/{external.ngdoc => external-resources.ngdoc} (95%) diff --git a/docs/content/api/index.ngdoc b/docs/content/api/index.ngdoc index cc25d2231962..f824f6a4ef73 100644 --- a/docs/content/api/index.ngdoc +++ b/docs/content/api/index.ngdoc @@ -8,7 +8,7 @@ Welcome to the AngularJS API docs page. These pages contain the AngularJS refere The documentation is organized into **{@link guide/module modules}** which contain various components of an AngularJS application. These components are {@link guide/directive directives}, {@link guide/services services}, {@link guide/filter filters}, {@link guide/providers providers}, {@link guide/templates templates}, global APIs, and testing mocks. -There is also a {@link guide/index} with articles on various topics, and a list of external resources. +There is also a {@link guide/index guide} with articles on various topics, and a list of external resources.
    **Angular Prefixes `$` and `$$`**: diff --git a/docs/content/guide/external.ngdoc b/docs/content/guide/external-resources.ngdoc similarity index 95% rename from docs/content/guide/external.ngdoc rename to docs/content/guide/external-resources.ngdoc index cab4a65e86d2..bed690de6d0b 100644 --- a/docs/content/guide/external.ngdoc +++ b/docs/content/guide/external-resources.ngdoc @@ -1,8 +1,10 @@ @ngdoc overview @name External Resources -@sortOrder 560 +@sortOrder 205 @description +# External Angular 1 Resources + This is a collection of external, 3rd party resources for learning and developing Angular. ## Articles, Videos, and Projects @@ -19,15 +21,14 @@ This is a collection of external, 3rd party resources for learning and developin #### Application Structure & Style Guides +* [Angular Styleguide](https://github.com/johnpapa/angular-styleguide/blob/master/a1/README.md) * [Architecture, file structure, components, one-way dataflow and best practices](https://github.com/toddmotto/angular-styleguide) -* [Angular Styleguide](https://github.com/johnpapa/angular-styleguide) * [When to use directives, controllers or services](http://kirkbushell.me/when-to-use-directives-controllers-or-services-in-angular/) * [Service vs Factory](http://blog.thoughtram.io/angular/2015/07/07/service-vs-factory-once-and-for-all.html) #### Testing -* **Unit testing:** [Karma](http://karma-runner.github.io), [Using Karma (video)](http://www.youtube.com/watch?v=YG5DEzaQBIc), {@link guide/unit-testing Unit testing}, {@link guide/services#unit-testing Testing services}, [Karma in Webstorm](http://blog.jetbrains.com/webstorm/2013/10/running-javascript-tests-with-karma-in-webstorm-7/) -* **End-to-End Testing:** [Protractor](https://github.com/angular/protractor) +* **Unit testing:** [Using Karma (video)](http://www.youtube.com/watch?v=YG5DEzaQBIc), [Karma in Webstorm](http://blog.jetbrains.com/webstorm/2013/10/running-javascript-tests-with-karma-in-webstorm-7/) #### Mobile @@ -79,7 +80,7 @@ This is a collection of external, 3rd party resources for learning and developin ## Complementary Libraries This is a list of libraries that enhance Angular, add common UI components or integrate with other libraries. -You can find a full list of Angular external libraries at [ngmodules.org](http://ngmodules.org/). +You can find a larger list of Angular external libraries at [ngmodules.org](http://ngmodules.org/). * **Advanced Routing:** [UI-Router](https://github.com/angular-ui/ui-router) * **Authentication:** [Http Auth Interceptor](https://github.com/witoldsz/angular-http-auth) @@ -98,6 +99,12 @@ You can find a full list of Angular external libraries at [ngmodules.org](http:/ * **Fileupload:** - [ng-file-upload](https://github.com/danialfarid/ng-file-upload) - [blueimp-fileupload for Angular](https://blueimp.github.io/jQuery-File-Upload/angularjs.html) +* **General UI Libraries:** + - [Angular Material](https://material.angularjs.org/latest/) + - [Angular UI Bootstrap](http://angular-ui.github.io/) + - [AngularStrap for Bootstrap 3](http://mgcrea.github.io/angular-strap/) + - [KendoUI](http://kendo-labs.github.io/angular-kendo/#/) + - [Wijmo](http://wijmo.com/tag/angularjs-2/) * **Specific UI Elements:** - [ngInfiniteScroll](https://sroze.github.io/ngInfiniteScroll/) - [ngTable](https://github.com/esvit/ng-table) @@ -106,12 +113,6 @@ You can find a full list of Angular external libraries at [ngmodules.org](http:/ - [textAngular Rich Text Editor / contenteditable](http://textangular.com/) (Rich Text Editor / binding to contenteditable) - [Angular UI Map (Google Maps)](https://github.com/angular-ui/ui-map) -* **General UI Libraries:** - - [AngularStrap for Bootstrap 3](http://mgcrea.github.io/angular-strap/) - - [Angular Material](https://material.angularjs.org/latest/) - - [Angular UI Bootstrap](http://angular-ui.github.io/) - - [KendoUI](http://kendo-labs.github.io/angular-kendo/#/) - - [Wijmo](http://wijmo.com/tag/angularjs-2/) ## General Learning Resources diff --git a/docs/content/guide/index.ngdoc b/docs/content/guide/index.ngdoc index 6274bcbe5d21..0edf4056aca8 100644 --- a/docs/content/guide/index.ngdoc +++ b/docs/content/guide/index.ngdoc @@ -2,22 +2,23 @@ @name Developer Guide @description -# Guide to AngularJS Documentation +# Guide to Angular 1 Documentation On this page, you will find a list of official Angular resources on various topics. -We have also set up a guide page for {@link guide/external external resources} where you -can find lots of additional information and material on these topics, a list of complimentary -libraries, and much more. -## Tutorial +Just starting out with Angular 1? Try working through our step by step tutorial or try +building on our seed project. -* {@link tutorial/index Official AngularJS Tutorial} +* {@link tutorial/index Official Angular 1 Tutorial} +* [Angular Seed](https://github.com/angular/angular-seed) -## Core Concepts +Ready to find out more about Angular 1? -* {@link guide/introduction What is AngularJS?} +* {@link guide/introduction What is Angular 1?} * {@link guide/concepts Conceptual Overview} +## Core Concepts + ### Templates In Angular applications, you move the job of filling page templates with data from the server to the client. The result is a system better structured for dynamic page updates. Below are the core features you'll use. @@ -38,7 +39,7 @@ In Angular applications, you move the job of filling page templates with data fr * **Bootstrap:** {@link guide/bootstrap Bootstrapping an app} * **Communicating with servers:** {@link ng.$http $http}, {@link ngResource.$resource $resource} -### Other AngularJS Features +### Other Features * **Animation:** {@link guide/animations Core concepts}, {@link ngAnimate ngAnimate API} * **Security:** {@link guide/security Security Docs}, {@link ng.$sce Strict Contextual Escaping}, {@link ng.directive:ngCsp Content Security Policy}, {@link ngSanitize.$sanitize $sanitize}, [video](https://www.youtube.com/watch?v=18ifoT-Id54) @@ -48,32 +49,44 @@ In Angular applications, you move the job of filling page templates with data fr ### Testing -* **Unit testing:** {@link guide/unit-testing Unit testing}, {@link guide/services#unit-testing Testing services}, -* **Scenario / e2e testing:** {@link guide/e2e-testing e2e testing guide} +* **Unit testing:** [Karma](http://karma-runner.github.io), {@link guide/unit-testing Unit testing}, {@link guide/services#unit-testing Testing services}, +* **End-to-End Testing:** [Protractor](https://github.com/angular/protractor), {@link guide/e2e-testing e2e testing guide} + -## Starter project template +## Community Resources + +We have set up a guide to many resources provided by the community, where you can find lots +of additional information and material on these topics, a list of complimentary libraries, and much more. + +* {@link guide/external-resources External Angular 1 resources} -* (https://github.com/angular/angular-seed)[Angular Seed] ## Getting Help The recipe for getting help on your unique issue is to create an example that could work (even if it doesn't) in a shareable example on [Plunker](http://plnkr.co/), [JSFiddle](http://jsfiddle.net/), or similar site and then post to one of the following: * [Stackoverflow.com](http://stackoverflow.com/search?q=angularjs) -* [AngularJS mailing list](https://groups.google.com/forum/#!forum/angular) -* [AngularJS IRC channel](http://webchat.freenode.net/?channels=angularjs&uio=d4) +* [Angular 1 mailing list](https://groups.google.com/forum/#!forum/angular) +* [Angular 1 IRC channel](http://webchat.freenode.net/?channels=angularjs&uio=d4) + +## Official Communications -## Official Channels +Official announcements, news and releases are posted to our blog, G+ and Twitter: -* **Official news and releases:** [AngularJS Blog](http://blog.angularjs.org/), [Google+](https://plus.google.com/u/0/+AngularJS), [Twitter](https://twitter.com/angularjs), [Angular on YouTube](http://youtube.com/angularjs) +* [Angular Blog](http://blog.angularjs.org/) +* [Google+](https://plus.google.com/u/0/+AngularJS) +* [Twitter](https://twitter.com/angularjs) +* [Angular on YouTube](http://youtube.com/angularjs) -## Contributing to AngularJS +## Contributing to Angular 1 -Though we have a core group of core contributors at Google, Angular is an open source project with hundreds of contributors. We'd love you to be one of them. When you're ready, please read the {@link misc/contribute Guide for contributing to AngularJS}. +Though we have a core group of core contributors at Google, Angular is an open source project with hundreds of contributors. +We'd love you to be one of them. When you're ready, please read the {@link misc/contribute Guide for contributing to Angular}. -## Final Bits +## Something Missing? -Didn't find what you're looking for here? We have set up a special page for all external +Didn't find what you're looking for here? Check out the {@link guide/external-resources External Angular 1 resources guide}. -If you have awesome AngularJS resources that belong on this page, please tell us about them on [Google+](https://plus.google.com/u/0/+AngularJS) or [Twitter](https://twitter.com/angularjs). +If you have awesome Angular 1 resources that belong on that page, please tell us about them on +[Google+](https://plus.google.com/u/0/+AngularJS) or [Twitter](https://twitter.com/angularjs). From 47fbbabe0b4a3a0bd1d4937d00185f47dd56b5ba Mon Sep 17 00:00:00 2001 From: mmuppa Date: Tue, 28 Jun 2016 11:54:36 -0700 Subject: [PATCH 0017/1173] docs(misc/Develop): using `https://` works more widely than `git@` Closes #14838 --- docs/content/misc/contribute.ngdoc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/content/misc/contribute.ngdoc b/docs/content/misc/contribute.ngdoc index 409359348e72..c26657526243 100644 --- a/docs/content/misc/contribute.ngdoc +++ b/docs/content/misc/contribute.ngdoc @@ -53,7 +53,7 @@ minified AngularJS files: ```shell # Clone your Github repository: -git clone "git@github.com:/angular.js.git" +git clone https://github.com//angular.js.git # Go to the AngularJS directory: cd angular.js From f02b707b5e4a5ffd1e1a20d910754cfabfc19622 Mon Sep 17 00:00:00 2001 From: Martin Staffa Date: Sat, 6 Feb 2016 02:08:28 +0100 Subject: [PATCH 0018/1173] feat(select): support values of any type added with ngValue select elements with ngModel will now set ngModel to option values added by ngValue. This allows setting values of any type (not only strings) without the use of ngOptions. Interpolations inside attributes can only be strings, but the ngValue directive uses attrs.$set, which does not have any type restriction. Any $observe on the value attribute will therefore receive the original value (result of ngValue expression). However, when a user selects an option, the browser sets the select value to the actual option's value attribute, which is still always a string. For that reason, when options are added by ngValue, we set the hashed value of the original value in the value attribute and store the actual value in an extra map. When the select value changes, we read access the actual value via the hashed select value. Since we only use a hashed value for ngValue, we will have extra checks for the hashed values: - when options are read, for both single and multiple select - when options are written, for multiple select I don't expect this to have a performance impact, but it should be kept in mind. Closes #9842 Closes #6297 BREAKING CHANGE: `
    + * ngOptions} to achieve a similar result. However, `ngOptions` provides some benefits: + * - more flexibility in how the ` + * * *
    - * repeatSelect = {{data.repeatSelect}}
    + * model = {{data.model}}
    *
    * * * angular.module('ngrepeatSelect', []) * .controller('ExampleController', ['$scope', function($scope) { * $scope.data = { - * repeatSelect: null, + * model: null, * availableOptions: [ * {id: '1', name: 'Option A'}, * {id: '2', name: 'Option B'}, @@ -269,6 +336,37 @@ var SelectController = * * * + * ### Using `ngValue` to bind the model to an array of objects + * + * + *
    + *
    + * + * + *
    + *
    + *
    model = {{data.model | json}}

    + *
    + *
    + * + * angular.module('ngvalueSelect', []) + * .controller('ExampleController', ['$scope', function($scope) { + * $scope.data = { + * model: null, + * availableOptions: [ + {value: 'myString', name: 'string'}, + {value: 1, name: 'integer'}, + {value: true, name: 'boolean'}, + {value: null, name: 'null'}, + {value: {prop: 'value'}, name: 'object'}, + {value: ['a'], name: 'array'} + * ] + * }; + * }]); + * + *
    * * ### Using `select` with `ngOptions` and setting a default value * See the {@link ngOptions ngOptions documentation} for more `ngOptions` usage examples. @@ -368,6 +466,7 @@ var selectDirective = function() { // to the `readValue` method, which can be changed if the select can have multiple // selected values or if the options are being generated by `ngOptions` element.on('change', function() { + selectCtrl.removeUnknownOption(); scope.$apply(function() { ngModelCtrl.$setViewValue(selectCtrl.readValue()); }); @@ -384,7 +483,8 @@ var selectDirective = function() { var array = []; forEach(element.find('option'), function(option) { if (option.selected) { - array.push(option.value); + var val = option.value; + array.push(val in selectCtrl.selectValueMap ? selectCtrl.selectValueMap[val] : val); } }); return array; @@ -394,7 +494,7 @@ var selectDirective = function() { selectCtrl.writeValue = function writeMultipleValue(value) { var items = new HashMap(value); forEach(element.find('option'), function(option) { - option.selected = isDefined(items.get(option.value)); + option.selected = isDefined(items.get(option.value)) || isDefined(items.get(selectCtrl.selectValueMap[option.value])); }); }; @@ -445,13 +545,18 @@ var optionDirective = ['$interpolate', function($interpolate) { restrict: 'E', priority: 100, compile: function(element, attr) { - if (isDefined(attr.value)) { + var interpolateValueFn, interpolateTextFn; + + if (isDefined(attr.ngValue)) { + // jshint noempty: false + // Will be handled by registerOption + } else if (isDefined(attr.value)) { // If the value attribute is defined, check if it contains an interpolation - var interpolateValueFn = $interpolate(attr.value, true); + interpolateValueFn = $interpolate(attr.value, true); } else { // If the value attribute is not defined then we fall back to the // text content of the option element, which may be interpolated - var interpolateTextFn = $interpolate(element.text(), true); + interpolateTextFn = $interpolate(element.text(), true); if (!interpolateTextFn) { attr.$set('value', element.text()); } diff --git a/test/ng/directive/selectSpec.js b/test/ng/directive/selectSpec.js index 980906c60f1d..70d3b2d53f15 100644 --- a/test/ng/directive/selectSpec.js +++ b/test/ng/directive/selectSpec.js @@ -1,7 +1,7 @@ 'use strict'; describe('select', function() { - var scope, formElement, element, $compile, ngModelCtrl, selectCtrl, renderSpy; + var scope, formElement, element, $compile, ngModelCtrl, selectCtrl, renderSpy, optionAttributesList = []; function compile(html) { formElement = jqLite('
    ' + html + '
    '); @@ -55,6 +55,18 @@ describe('select', function() { '' }; }); + + $compileProvider.directive('exposeAttributes', function() { + return { + require: '^^select', + link: { + pre: function(scope, element, attrs, ctrl) { + optionAttributesList.push(attrs); + } + } + }; + }); + })); beforeEach(inject(function($rootScope, _$compile_) { @@ -297,7 +309,7 @@ describe('select', function() { expect(selectCtrl.writeValue).not.toHaveBeenCalled(); scope.$digest(); - expect(selectCtrl.writeValue).toHaveBeenCalledOnce(); + expect(selectCtrl.writeValue).toHaveBeenCalled(); dealoc(select); }); @@ -1224,5 +1236,224 @@ describe('select', function() { }).toThrowMinErr('ng','badname', 'hasOwnProperty is not a valid "option value" name'); }); + describe('with ngValue (and non-primitive values)', function() { + + they('should set the option attribute and select it for value $prop', [ + 'string', + undefined, + 1, + true, + null, + {prop: 'value'}, + ['a'], + NaN + ], function(prop) { + scope.option1 = prop; + scope.selected = 'NOMATCH'; + + compile(''); + + scope.$digest(); + expect(element.find('option').eq(0).val()).toBe('? string:NOMATCH ?'); + + scope.selected = prop; + scope.$digest(); + + expect(element.find('option').eq(0).val()).toBe(hashKey(prop)); + + // Reset + scope.selected = false; + scope.$digest(); + + expect(element.find('option').eq(0).val()).toBe('? boolean:false ?'); + + browserTrigger(element.find('option').eq(0)); + if (typeof prop === 'number' && isNaN(prop)) { + expect(scope.selected).toBeNaN(); + } else { + expect(scope.selected).toBe(prop); + } + }); + + + they('should update the option attribute and select it for value $prop', [ + 'string', + undefined, + 1, + true, + null, + {prop: 'value'}, + ['a'], + NaN + ], function(prop) { + scope.option = prop; + scope.selected = 'NOMATCH'; + + compile(''); + + var selectController = element.controller('select'); + spyOn(selectController, 'removeOption').and.callThrough(); + + scope.$digest(); + expect(selectController.removeOption).not.toHaveBeenCalled(); + expect(element.find('option').eq(0).val()).toBe('? string:NOMATCH ?'); + + scope.selected = prop; + scope.$digest(); + + expect(element.find('option').eq(0).val()).toBe(hashKey(prop)); + expect(element[0].selectedIndex).toBe(0); + + scope.option = 'UPDATEDVALUE'; + scope.$digest(); + + expect(selectController.removeOption.calls.count()).toBe(1); + + // Updating the option value currently does not update the select model + if (typeof prop === 'number' && isNaN(prop)) { + expect(selectController.removeOption.calls.argsFor(0)[0]).toBeNaN(); + } else { + expect(selectController.removeOption.calls.argsFor(0)[0]).toBe(prop); + } + + expect(scope.selected).toBe(null); + expect(element[0].selectedIndex).toBe(0); + expect(element.find('option').length).toBe(2); + expect(element.find('option').eq(0).prop('selected')).toBe(true); + expect(element.find('option').eq(0).val()).toBe(unknownValue(prop)); + expect(element.find('option').eq(1).prop('selected')).toBe(false); + expect(element.find('option').eq(1).val()).toBe('string:UPDATEDVALUE'); + + scope.selected = 'UPDATEDVALUE'; + scope.$digest(); + + expect(element[0].selectedIndex).toBe(0); + expect(element.find('option').eq(0).val()).toBe('string:UPDATEDVALUE'); + }); + + it('should interact with custom attribute $observe and $set calls', function() { + var log = [], optionAttr; + + compile(''); + + optionAttr = optionAttributesList[0]; + optionAttr.$observe('value', function(newVal) { + log.push(newVal); + }); + + scope.option = 'init'; + scope.$digest(); + + expect(log[0]).toBe('init'); + expect(element.find('option').eq(1).val()).toBe('string:init'); + + optionAttr.$set('value', 'update'); + expect(log[1]).toBe('update'); + expect(element.find('option').eq(1).val()).toBe('string:update'); + + }); + + it('should ignore the option text / value attribute if the ngValue attribute exists', function() { + scope.ngvalue = 'abc'; + scope.value = 'def'; + scope.textvalue = 'ghi'; + + compile(''); + expect(element).toEqualSelect([unknownValue(undefined)], 'string:abc'); + }); + + it('should ignore option text with multiple interpolations if the ngValue attribute exists', function() { + scope.ngvalue = 'abc'; + scope.textvalue = 'def'; + scope.textvalue2 = 'ghi'; + + compile(''); + expect(element).toEqualSelect([unknownValue(undefined)], 'string:abc'); + }); + + describe('and select[multiple]', function() { + + it('should allow multiple selection', function() { + scope.options = { + a: 'string', + b: undefined, + c: 1, + d: true, + e: null, + f: {prop: 'value'}, + g: ['a'], + h: NaN + }; + scope.selected = []; + + compile(''); + + scope.$digest(); + expect(element).toEqualSelect( + 'string:string', + 'undefined:undefined', + 'number:1', + 'boolean:true', + 'object:null', + 'object:4', + 'object:5', + 'number:NaN' + ); + + scope.selected = ['string', 1]; + scope.$digest(); + + expect(element.find('option').eq(0).prop('selected')).toBe(true); + expect(element.find('option').eq(2).prop('selected')).toBe(true); + + browserTrigger(element.find('option').eq(1)); + expect(scope.selected).toEqual([undefined]); + + //reset + scope.selected = []; + scope.$digest(); + + forEach(element.find('option'), function(option) { + // browserTrigger can't produce click + ctrl, so set selection manually + jqLite(option).prop('selected', true); + }); + + browserTrigger(element, 'change'); + + var arrayVal = ['a']; + arrayVal.$$hashKey = 'object:5'; + + expect(scope.selected).toEqual([ + 'string', + undefined, + 1, + true, + null, + {prop: 'value', $$hashKey: 'object:4'}, + arrayVal, + NaN + ]); + }); + + }); + + + }); + }); }); From 47c15fbcc10f118170813021e8e605ffd263ad84 Mon Sep 17 00:00:00 2001 From: Martin Staffa Date: Sat, 21 May 2016 13:47:24 +0200 Subject: [PATCH 0019/1173] fix(select): handle model updates when options are manipulated These rules follow ngOptions behavior: - when an option that is currently selected, is removed or its value changes, the model is set to null. - when an an option is added or its value changes to match the currently selected model, this option is selected. - when an option is disabled, the model is set to null. - when the model value changes to a value that matches a disabled option, this option is selected (analogue to ngOptions) --- src/ng/directive/select.js | 64 ++- test/ng/directive/selectSpec.js | 748 +++++++++++++++++++++++++++++++- 2 files changed, 804 insertions(+), 8 deletions(-) diff --git a/src/ng/directive/select.js b/src/ng/directive/select.js index 92617667c506..c99b6fc428c2 100644 --- a/src/ng/directive/select.js +++ b/src/ng/directive/select.js @@ -20,6 +20,7 @@ var SelectController = // If the ngModel doesn't get provided then provide a dummy noop version to prevent errors self.ngModelCtrl = noopNgModelController; + self.multiple = false; // The "unknown" option is one that is prepended to the list if the viewValue // does not match any of the options. When it is rendered the value of the unknown @@ -91,7 +92,9 @@ var SelectController = } var count = optionsMap.get(value) || 0; optionsMap.put(value, count + 1); - self.ngModelCtrl.$render(); + // Only render at the end of a digest. This improves render performance when many options + // are added during a digest and ensures all relevant options are correctly marked as selected + scheduleRender(); }; // Tell the select control that an option, with the given value, has been removed @@ -115,6 +118,15 @@ var SelectController = }; + var renderScheduled = false; + function scheduleRender() { + if (renderScheduled) return; + renderScheduled = true; + $scope.$$postDigest(function() { + renderScheduled = false; + self.ngModelCtrl.$render(); + }); + } var updateScheduled = false; function scheduleViewValueUpdate(renderAfter) { @@ -163,29 +175,74 @@ var SelectController = } else if (interpolateValueFn) { // The value attribute is interpolated optionAttrs.$observe('value', function valueAttributeObserveAction(newVal) { + var currentVal = self.readValue(); + var removal; + var previouslySelected = optionElement.prop('selected'); + var removedVal; + if (isDefined(oldVal)) { self.removeOption(oldVal); + removal = true; + removedVal = oldVal; } oldVal = newVal; self.addOption(newVal, optionElement); + + if (removal && previouslySelected) { + scheduleViewValueUpdate(); + } }); } else if (interpolateTextFn) { // The text content is interpolated optionScope.$watch(interpolateTextFn, function interpolateWatchAction(newVal, oldVal) { optionAttrs.$set('value', newVal); + var previouslySelected = optionElement.prop('selected'); if (oldVal !== newVal) { self.removeOption(oldVal); } self.addOption(newVal, optionElement); + + if (oldVal && previouslySelected) { + scheduleViewValueUpdate(); + } }); } else { // The value attribute is static self.addOption(optionAttrs.value, optionElement); } + + var oldDisabled; + optionAttrs.$observe('disabled', function(newVal) { + + // Since model updates will also select disabled options (like ngOptions), + // we only have to handle options becoming disabled, not enabled + + if (newVal === 'true' || newVal && optionElement.prop('selected')) { + if (self.multiple) { + scheduleViewValueUpdate(true); + } else { + self.ngModelCtrl.$setViewValue(null); + self.ngModelCtrl.$render(); + } + oldDisabled = newVal; + } + }); + optionElement.on('$destroy', function() { - self.removeOption(optionAttrs.value); + var currentValue = self.readValue(); + var removeValue = optionAttrs.value; + + self.removeOption(removeValue); self.ngModelCtrl.$render(); + + if (self.multiple && currentValue && currentValue.indexOf(removeValue) !== -1 || + currentValue === removeValue + ) { + // When multiple (selected) options are destroyed at the same time, we don't want + // to run a model update for each of them. Instead, run a single update in the $$postDigest + scheduleViewValueUpdate(true); + } }); }; }]; @@ -477,12 +534,13 @@ var selectDirective = function() { // we have to add an extra watch since ngModel doesn't work well with arrays - it // doesn't trigger rendering if only an item in the array changes. if (attr.multiple) { + selectCtrl.multiple = true; // Read value now needs to check each option to see if it is selected selectCtrl.readValue = function readMultipleValue() { var array = []; forEach(element.find('option'), function(option) { - if (option.selected) { + if (option.selected && !option.disabled) { var val = option.value; array.push(val in selectCtrl.selectValueMap ? selectCtrl.selectValueMap[val] : val); } diff --git a/test/ng/directive/selectSpec.js b/test/ng/directive/selectSpec.js index 70d3b2d53f15..9027aa657326 100644 --- a/test/ng/directive/selectSpec.js +++ b/test/ng/directive/selectSpec.js @@ -629,20 +629,27 @@ describe('select', function() { scope.$apply(function() { scope.robots.pop(); }); - expect(element).toEqualSelect([unknownValue('r2d2')], 'c3p0'); - expect(scope.robot).toBe('r2d2'); + expect(element).toEqualSelect([unknownValue(null)], 'c3p0'); + expect(scope.robot).toBe(null); scope.$apply(function() { scope.robots.unshift('r2d2'); }); + expect(element).toEqualSelect([unknownValue(null)], 'r2d2', 'c3p0'); + expect(scope.robot).toBe(null); + + scope.$apply(function() { + scope.robot = 'r2d2'; + }); + expect(element).toEqualSelect(['r2d2'], 'c3p0'); - expect(scope.robot).toBe('r2d2'); scope.$apply(function() { delete scope.robots; }); - expect(element).toEqualSelect([unknownValue('r2d2')]); - expect(scope.robot).toBe('r2d2'); + + expect(element).toEqualSelect([unknownValue(null)]); + expect(scope.robot).toBe(null); }); }); @@ -1452,8 +1459,739 @@ describe('select', function() { }); + }); + + describe('updating the model and selection when option elements are manipulated', function() { + + they('should set the model to null when the currently selected option with $prop is removed', + ['ngValue', 'interpolatedValue', 'interpolatedText'], function(prop) { + + var A = { name: 'A'}, B = { name: 'B'}, C = { name: 'C'}; + + scope.options = [A, B, C]; + scope.obj = {}; + + var optionString = ''; + + switch (prop) { + case 'ngValue': + optionString = ''; + break; + case 'interpolatedValue': + optionString = ''; + break; + case 'interpolatedText': + optionString = ''; + break; + } + + compile( + '' + ); + + var optionElements = element.find('option'); + expect(optionElements.length).toEqual(4); + browserTrigger(optionElements.eq(0)); + + optionElements = element.find('option'); + expect(optionElements.length).toEqual(3); + expect(scope.obj.value).toBe(prop === 'ngValue' ? A : 'A'); + + scope.options.shift(); + scope.$digest(); + + optionElements = element.find('option'); + expect(optionElements.length).toEqual(3); + expect(scope.obj.value).toBe(null); + expect(element.val()).toBe('? object:null ?'); + }); + + + they('should set the model to null when the currently selected option with $prop changes its value', + [ + 'ngValue', + 'interpolatedValue', + 'interpolatedText' + ], function(prop) { + + var A = { name: 'A'}, B = { name: 'B'}, C = { name: 'C'}; + + scope.options = [A, B, C]; + scope.obj = {}; + + var optionString = ''; + + switch (prop) { + case 'ngValue': + optionString = ''; + break; + case 'interpolatedValue': + optionString = ''; + break; + case 'interpolatedText': + optionString = ''; + break; + } + + compile( + '' + ); + + var optionElements = element.find('option'); + expect(optionElements.length).toEqual(4); + browserTrigger(optionElements.eq(0)); + + optionElements = element.find('option'); + expect(optionElements.length).toEqual(3); + expect(scope.obj.value).toBe('A'); + + A.name = 'X'; + scope.$digest(); + + optionElements = element.find('option'); + expect(optionElements.length).toEqual(4); + expect(scope.obj.value).toBe(null); + expect(element.val()).toBe('? string:A ?'); + }); + + + they('should set the model to null when the currently selected option with $prop is disabled', + [ + 'ngValue', + 'interpolatedValue', + 'interpolatedText' + ], function(prop) { + + var A = { name: 'A'}, B = { name: 'B'}, C = { name: 'C'}; + + scope.options = [A, B, C]; + scope.obj = {}; + + var optionString = ''; + + switch (prop) { + case 'ngValue': + optionString = ''; + break; + case 'interpolatedValue': + optionString = ''; + break; + case 'interpolatedText': + optionString = ''; + break; + } + + compile( + '' + ); + + var optionElements = element.find('option'); + expect(optionElements.length).toEqual(4); + browserTrigger(optionElements.eq(0)); + + optionElements = element.find('option'); + expect(optionElements.length).toEqual(3); + expect(scope.obj.value).toBe('A'); + + A.disabled = true; + scope.$digest(); + + optionElements = element.find('option'); + expect(optionElements.length).toEqual(4); + expect(scope.obj.value).toBe(null); + expect(element.val()).toBe('? object:null ?'); + }); + + + they('should select a disabled option with $prop when the model is set to the matching value', + [ + 'ngValue', + 'interpolatedValue', + 'interpolatedText' + ], function(prop) { + + var A = { name: 'A'}, B = { name: 'B'}, C = { name: 'C'}; + + scope.options = [A, B, C]; + scope.obj = {}; + + var optionString = ''; + + switch (prop) { + case 'ngValue': + optionString = ''; + break; + case 'interpolatedValue': + optionString = ''; + break; + case 'interpolatedText': + optionString = ''; + break; + } + + compile( + '' + ); + + var optionElements = element.find('option'); + expect(optionElements.length).toEqual(4); + expect(optionElements[0].value).toEqual(unknownValue(undefined)); + + B.disabled = true; + scope.$digest(); + + optionElements = element.find('option'); + expect(optionElements.length).toEqual(4); + expect(optionElements[0].value).toEqual(unknownValue(undefined)); + + scope.obj.value = 'B'; + scope.$digest(); + + optionElements = element.find('option'); + expect(optionElements.length).toEqual(3); + expect(scope.obj.value).toBe('B'); + // jQuery returns null for val() when the option is disabled, see + // https://bugs.jquery.com/ticket/13097 + expect(element[0].value).toBe(prop === 'ngValue' ? 'string:B' : 'B'); + expect(optionElements.eq(1).prop('selected')).toBe(true); + }); + + + they('should ignore an option with $prop that becomes enabled and does not match the model', + [ + 'ngValue', + 'interpolatedValue', + 'interpolatedText' + ], function(prop) { + + var A = { name: 'A'}, B = { name: 'B'}, C = { name: 'C'}; + + scope.options = [A, B, C]; + scope.obj = {}; + + var optionString = ''; + + switch (prop) { + case 'ngValue': + optionString = ''; + break; + case 'interpolatedValue': + optionString = ''; + break; + case 'interpolatedText': + optionString = ''; + break; + } + + compile( + '' + ); + + var optionElements = element.find('option'); + expect(optionElements.length).toEqual(4); + browserTrigger(optionElements.eq(0)); + + optionElements = element.find('option'); + expect(optionElements.length).toEqual(3); + expect(scope.obj.value).toBe('A'); + + A.disabled = true; + scope.$digest(); + + optionElements = element.find('option'); + expect(optionElements.length).toEqual(4); + expect(scope.obj.value).toBe(null); + expect(element.val()).toBe('? object:null ?'); + + A.disabled = false; + scope.$digest(); + + optionElements = element.find('option'); + expect(optionElements.length).toEqual(4); + expect(scope.obj.value).toBe(null); + expect(element.val()).toBe('? object:null ?'); + }); + + + they('should select a newly added option with $prop when it matches the current model', + [ + 'ngValue', + 'interpolatedValue', + 'interpolatedText' + ], function(prop) { + + var A = { name: 'A'}, B = { name: 'B'}, C = { name: 'C'}; + + scope.options = [A, B]; + scope.obj = { + value: prop === 'ngValue' ? C : 'C' + }; + + var optionString = ''; + + switch (prop) { + case 'ngValue': + optionString = ''; + break; + case 'interpolatedValue': + optionString = ''; + break; + case 'interpolatedText': + optionString = ''; + break; + } + + compile( + '' + ); + + var optionElements = element.find('option'); + expect(optionElements.length).toEqual(3); + + scope.options.push(C); + scope.$digest(); + + optionElements = element.find('option'); + expect(element.val()).toBe(prop === 'ngValue' ? 'object:4' : 'C'); + expect(optionElements.length).toEqual(3); + expect(optionElements[2].selected).toBe(true); + expect(scope.obj.value).toEqual(prop === 'ngValue' ? {name: 'C', $$hashKey: 'object:4'} : 'C'); + }); + + + they('should keep selection and model when repeated options with track by are replaced with equal options', + [ + 'ngValue', + 'interpolatedValue', + 'interpolatedText' + ], function(prop) { + + var A = { name: 'A'}, B = { name: 'B'}, C = { name: 'C'}; + + scope.options = [A, B, C]; + scope.obj = { + value: 'C' + }; + + var optionString = ''; + + switch (prop) { + case 'ngValue': + optionString = ''; + break; + case 'interpolatedValue': + optionString = ''; + break; + case 'interpolatedText': + optionString = ''; + break; + } + + compile( + '' + ); + + var optionElements = element.find('option'); + expect(optionElements.length).toEqual(3); + + scope.obj.value = 'C'; + scope.$digest(); + + optionElements = element.find('option'); + expect(element.val()).toBe(prop === 'ngValue' ? 'string:C' : 'C'); + expect(optionElements.length).toEqual(3); + expect(optionElements[2].selected).toBe(true); + expect(scope.obj.value).toBe('C'); + + scope.options = [ + {name: 'A'}, + {name: 'B'}, + {name: 'C'} + ]; + scope.$digest(); + + optionElements = element.find('option'); + expect(element.val()).toBe(prop === 'ngValue' ? 'string:C' : 'C'); + expect(optionElements.length).toEqual(3); + expect(optionElements[2].selected).toBe(true); + expect(scope.obj.value).toBe('C'); + }); + + describe('when multiple', function() { + + they('should set the model to null when the currently selected option with $prop is removed', + [ + 'ngValue', + 'interpolatedValue', + 'interpolatedText' + ], function(prop) { + + var A = { name: 'A'}, B = { name: 'B'}, C = { name: 'C'}; + + scope.options = [A, B, C]; + scope.obj = {}; + + var optionString = ''; + + switch (prop) { + case 'ngValue': + optionString = ''; + break; + case 'interpolatedValue': + optionString = ''; + break; + case 'interpolatedText': + optionString = ''; + break; + } + + compile( + '' + ); + + var ngModelCtrl = element.controller('ngModel'); + var ngModelCtrlSpy = spyOn(ngModelCtrl, '$setViewValue').and.callThrough(); + + var optionElements = element.find('option'); + expect(optionElements.length).toEqual(3); + + optionElements.eq(0).prop('selected', true); + optionElements.eq(2).prop('selected', true); + browserTrigger(element); + + optionElements = element.find('option'); + expect(optionElements.length).toEqual(3); + expect(scope.obj.value).toEqual(prop === 'ngValue' ? [A, C] : ['A', 'C']); + + + ngModelCtrlSpy.calls.reset(); + scope.options.shift(); + scope.options.pop(); + scope.$digest(); + + optionElements = element.find('option'); + expect(optionElements.length).toEqual(1); + expect(scope.obj.value).toEqual([]); + expect(element.val()).toBe(null); + expect(ngModelCtrlSpy).toHaveBeenCalledTimes(1); + }); + + they('should set the model to null when the currently selected option with $prop changes its value', + [ + 'ngValue', + 'interpolatedValue', + 'interpolatedText' + ], function(prop) { + + var A = { name: 'A'}, B = { name: 'B'}, C = { name: 'C'}; + + scope.options = [A, B, C]; + scope.obj = {}; + + var optionString = ''; + + switch (prop) { + case 'ngValue': + optionString = ''; + break; + case 'interpolatedValue': + optionString = ''; + break; + case 'interpolatedText': + optionString = ''; + break; + } + + compile( + '' + ); + + var ngModelCtrl = element.controller('ngModel'); + var ngModelCtrlSpy = spyOn(ngModelCtrl, '$setViewValue').and.callThrough(); + + var optionElements = element.find('option'); + expect(optionElements.length).toEqual(3); + + optionElements.eq(0).prop('selected', true); + optionElements.eq(2).prop('selected', true); + browserTrigger(element); + + optionElements = element.find('option'); + expect(optionElements.length).toEqual(3); + expect(scope.obj.value).toEqual(['A', 'C']); + + ngModelCtrlSpy.calls.reset(); + A.name = 'X'; + C.name = 'Z'; + scope.$digest(); + + optionElements = element.find('option'); + expect(optionElements.length).toEqual(3); + expect(scope.obj.value).toEqual([]); + expect(element.val()).toBe(null); + expect(ngModelCtrlSpy).toHaveBeenCalledTimes(1); + + }); + + they('should set the model to null when the currently selected option with $prop becomes disabled', + [ + 'ngValue', + 'interpolatedValue', + 'interpolatedText' + ], function(prop) { + + var A = { name: 'A'}, B = { name: 'B'}, C = { name: 'C'}, D = { name: 'D'}; + + scope.options = [A, B, C, D]; + scope.obj = {}; + + var optionString = ''; + + switch (prop) { + case 'ngValue': + optionString = ''; + break; + case 'interpolatedValue': + optionString = ''; + break; + case 'interpolatedText': + optionString = ''; + break; + } + + compile( + '' + ); + + var ngModelCtrl = element.controller('ngModel'); + var ngModelCtrlSpy = spyOn(ngModelCtrl, '$setViewValue').and.callThrough(); + + var optionElements = element.find('option'); + expect(optionElements.length).toEqual(4); + + optionElements.eq(0).prop('selected', true); + optionElements.eq(2).prop('selected', true); + optionElements.eq(3).prop('selected', true); + browserTrigger(element); + + optionElements = element.find('option'); + expect(optionElements.length).toEqual(4); + expect(scope.obj.value).toEqual(['A', 'C', 'D']); + + ngModelCtrlSpy.calls.reset(); + A.disabled = true; + C.disabled = true; + scope.$digest(); + + optionElements = element.find('option'); + expect(optionElements.length).toEqual(4); + expect(scope.obj.value).toEqual(['D']); + expect(element.val()).toEqual(prop === 'ngValue' ? ['string:D'] : ['D']); + expect(ngModelCtrlSpy).toHaveBeenCalledTimes(1); + }); + + + they('should select disabled options with $prop when the model is set to matching values', + [ + 'ngValue', + 'interpolatedValue', + 'interpolatedText' + ], function(prop) { + + var A = { name: 'A'}, B = { name: 'B'}, C = { name: 'C'}, D = {name: 'D'}; + + scope.options = [A, B, C, D]; + scope.obj = {}; + + var optionString = ''; + + switch (prop) { + case 'ngValue': + optionString = ''; + break; + case 'interpolatedValue': + optionString = ''; + break; + case 'interpolatedText': + optionString = ''; + break; + } + + compile( + '' + ); + + var optionElements = element.find('option'); + expect(optionElements.length).toEqual(4); + expect(element[0].value).toBe(''); + + A.disabled = true; + D.disabled = true; + scope.$digest(); + + optionElements = element.find('option'); + expect(optionElements.length).toEqual(4); + expect(element[0].value).toBe(''); + + scope.obj.value = prop === 'ngValue' ? [A, C, D] : ['A', 'C', 'D']; + scope.$digest(); + + optionElements = element.find('option'); + expect(optionElements.length).toEqual(4); + expect(scope.obj.value).toEqual(prop === 'ngValue' ? + [ + {name: 'A', $$hashKey: 'object:4', disabled: true}, + {name: 'C', $$hashKey: 'object:6'}, + {name: 'D', $$hashKey: 'object:7', disabled: true} + ] : + ['A', 'C', 'D'] + ); + + expect(optionElements.eq(0).prop('selected')).toBe(true); + expect(optionElements.eq(2).prop('selected')).toBe(true); + expect(optionElements.eq(3).prop('selected')).toBe(true); + }); + + they('should select a newly added option with $prop when it matches the current model', + [ + 'ngValue', + 'interpolatedValue', + 'interpolatedText' + ], function(prop) { + + var A = { name: 'A'}, B = { name: 'B'}, C = { name: 'C'}; + + scope.options = [A, B]; + scope.obj = { + value: prop === 'ngValue' ? [B, C] : ['B', 'C'] + }; + + var optionString = ''; + + switch (prop) { + case 'ngValue': + optionString = ''; + break; + case 'interpolatedValue': + optionString = ''; + break; + case 'interpolatedText': + optionString = ''; + break; + } + + compile( + '' + ); + + var optionElements = element.find('option'); + expect(optionElements.length).toEqual(2); + expect(optionElements.eq(1).prop('selected')).toBe(true); + + scope.options.push(C); + scope.$digest(); + + optionElements = element.find('option'); + expect(element.val()).toEqual(prop === 'ngValue' ? ['object:4', 'object:5'] : ['B', 'C']); + expect(optionElements.length).toEqual(3); + expect(optionElements[1].selected).toBe(true); + expect(optionElements[2].selected).toBe(true); + expect(scope.obj.value).toEqual(prop === 'ngValue' ? + [{ name: 'B', $$hashKey: 'object:4'}, + {name: 'C', $$hashKey: 'object:5'}] : + ['B', 'C']); + }); + + they('should keep selection and model when a repeated options with track by are replaced with equal options', + [ + 'ngValue', + 'interpolatedValue', + 'interpolatedText' + ], function(prop) { + + var A = { name: 'A'}, B = { name: 'B'}, C = { name: 'C'}; + + scope.options = [A, B, C]; + scope.obj = { + value: 'C' + }; + + var optionString = ''; + + switch (prop) { + case 'ngValue': + optionString = ''; + break; + case 'interpolatedValue': + optionString = ''; + break; + case 'interpolatedText': + optionString = ''; + break; + } + + compile( + '' + ); + + var optionElements = element.find('option'); + expect(optionElements.length).toEqual(3); + + scope.obj.value = ['B', 'C']; + scope.$digest(); + + optionElements = element.find('option'); + expect(element.val()).toEqual(prop === 'ngValue' ? ['string:B', 'string:C'] : ['B', 'C']); + expect(optionElements.length).toEqual(3); + expect(optionElements[1].selected).toBe(true); + expect(optionElements[2].selected).toBe(true); + expect(scope.obj.value).toEqual(['B', 'C']); + + scope.options = [ + {name: 'A'}, + {name: 'B'}, + {name: 'C'} + ]; + scope.$digest(); + + optionElements = element.find('option'); + expect(element.val()).toEqual(prop === 'ngValue' ? ['string:B', 'string:C'] : ['B', 'C']); + expect(optionElements.length).toEqual(3); + expect(optionElements[1].selected).toBe(true); + expect(optionElements[2].selected).toBe(true); + expect(scope.obj.value).toEqual(['B', 'C']); + }); + + }); }); + }); }); From ba36bde6736f0810ca670e10952a8e1c021de531 Mon Sep 17 00:00:00 2001 From: Martin Staffa Date: Wed, 1 Jun 2016 15:26:27 +0200 Subject: [PATCH 0020/1173] perf(select): don't prepend unknown option if already prepended --- src/ng/directive/select.js | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/ng/directive/select.js b/src/ng/directive/select.js index c99b6fc428c2..b583546d653f 100644 --- a/src/ng/directive/select.js +++ b/src/ng/directive/select.js @@ -36,6 +36,12 @@ var SelectController = $element.val(unknownVal); }; + self.updateUnknownOption = function(val) { + var unknownVal = '? ' + hashKey(val) + ' ?'; + self.unknownOption.val(unknownVal); + $element.val(unknownVal); + }; + $scope.$on('$destroy', function() { // disable unknown option so that we don't do work when the whole select is being destroyed self.renderUnknownOption = noop; @@ -74,6 +80,8 @@ var SelectController = if (value == null && self.emptyOption) { self.removeUnknownOption(); $element.val(''); + } else if (self.unknownOption.parent().length) { + self.updateUnknownOption(value); } else { self.renderUnknownOption(value); } From 7b50f498eb06f7249c83987fcca87f5297347c10 Mon Sep 17 00:00:00 2001 From: Peter Bacon Darwin Date: Mon, 30 May 2016 16:47:53 +0100 Subject: [PATCH 0021/1173] chore(benchpress): add benchmarks for select with ngValue --- benchmarks/select-ng-value-bp/app.js | 104 +++++++++++++++++++++++ benchmarks/select-ng-value-bp/bp.conf.js | 11 +++ benchmarks/select-ng-value-bp/main.html | 15 ++++ 3 files changed, 130 insertions(+) create mode 100755 benchmarks/select-ng-value-bp/app.js create mode 100755 benchmarks/select-ng-value-bp/bp.conf.js create mode 100755 benchmarks/select-ng-value-bp/main.html diff --git a/benchmarks/select-ng-value-bp/app.js b/benchmarks/select-ng-value-bp/app.js new file mode 100755 index 000000000000..033f55c23a27 --- /dev/null +++ b/benchmarks/select-ng-value-bp/app.js @@ -0,0 +1,104 @@ +"use strict"; + +/* globals angular, benchmarkSteps */ + +var app = angular.module('selectBenchmark', []); + +app.config(function($compileProvider) { + if ($compileProvider.debugInfoEnabled) { + $compileProvider.debugInfoEnabled(false); + } +}); + + + +app.controller('DataController', function($scope, $element) { + $scope.groups = []; + $scope.count = 10000; + + function changeOptions() { + $scope.groups = []; + var i = 0; + var group; + while(i < $scope.count) { + if (i % 100 === 0) { + group = { + name: 'group-' + $scope.groups.length, + items: [] + }; + $scope.groups.push(group); + } + group.items.push({ + id: i, + label: 'item-' + i + }); + i++; + } + } + + var selectElement = $element.find('select'); + console.log(selectElement); + + + benchmarkSteps.push({ + name: 'add-options', + fn: function() { + $scope.$apply(function() { + $scope.count = 10000; + changeOptions(); + }); + } + }); + + benchmarkSteps.push({ + name: 'set-model-1', + fn: function() { + $scope.$apply(function() { + $scope.x = $scope.groups[10].items[0]; + }); + } + }); + + benchmarkSteps.push({ + name: 'set-model-2', + fn: function() { + $scope.$apply(function() { + $scope.x = $scope.groups[0].items[10]; + }); + } + }); + + benchmarkSteps.push({ + name: 'remove-options', + fn: function() { + $scope.count = 100; + changeOptions(); + } + }); + + benchmarkSteps.push({ + name: 'add-options', + fn: function() { + $scope.$apply(function() { + $scope.count = 10000; + changeOptions(); + }); + } + }); + + benchmarkSteps.push({ + name: 'set-view-1', + fn: function() { + selectElement.val('2000'); + selectElement.triggerHandler('change'); + } + }); + + benchmarkSteps.push({ + name: 'set-view-2', + fn: function() { + selectElement.val('1000'); + selectElement.triggerHandler('change'); + } + }); +}); diff --git a/benchmarks/select-ng-value-bp/bp.conf.js b/benchmarks/select-ng-value-bp/bp.conf.js new file mode 100755 index 000000000000..bf543bb2cef7 --- /dev/null +++ b/benchmarks/select-ng-value-bp/bp.conf.js @@ -0,0 +1,11 @@ +module.exports = function(config) { + config.set({ + scripts: [ { + id: 'angular', + src: '/build/angular.js' + }, + { + src: 'app.js', + }] + }); +}; diff --git a/benchmarks/select-ng-value-bp/main.html b/benchmarks/select-ng-value-bp/main.html new file mode 100755 index 000000000000..273027615288 --- /dev/null +++ b/benchmarks/select-ng-value-bp/main.html @@ -0,0 +1,15 @@ +
    +
    +
    +

    + Tests the execution of a select with ngRepeat'ed options with ngValue for rendering during model + and option updates. +

    + +
    +
    +
    From dcf8aab85d37d7723cadfce35e8537c632094146 Mon Sep 17 00:00:00 2001 From: jfisher446 Date: Sun, 3 Jul 2016 21:08:07 -0500 Subject: [PATCH 0022/1173] docs(tutorial/step_04): fix syntactic error (add missing 'a') Closes #14860 --- docs/content/tutorial/step_04.ngdoc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/content/tutorial/step_04.ngdoc b/docs/content/tutorial/step_04.ngdoc index 75989a2cafd8..a108ce8b2d77 100644 --- a/docs/content/tutorial/step_04.ngdoc +++ b/docs/content/tutorial/step_04.ngdoc @@ -119,8 +119,8 @@ Yeah, you guessed it: There is a better way! Each feature/section, will declare its own module and have all related entities registered there. The main module (`phonecatApp`) will declare a dependency on each feature/section module. Now, -all it takes to reuse the same code on new project is copying the feature directory over and adding -the feature module as a dependency in the new project's main module. +all it takes to reuse the same code on a new project is copying the feature directory over and +adding the feature module as a dependency in the new project's main module. Here is what our `phoneList` feature will look like after this change: From 3aedb1a70d9f925cf866ed7ba07f59c7eb13baa3 Mon Sep 17 00:00:00 2001 From: David Rodenas Pico Date: Thu, 30 Jun 2016 09:52:04 +0200 Subject: [PATCH 0023/1173] perf($compile): wrap try/catch of collect comment directives into a function to avoid V8 deopt Closes #14848 --- src/ng/compile.js | 32 +++++++++++++++++++------------- 1 file changed, 19 insertions(+), 13 deletions(-) diff --git a/src/ng/compile.js b/src/ng/compile.js index 68e49f2bcaf1..9355630dca69 100644 --- a/src/ng/compile.js +++ b/src/ng/compile.js @@ -2052,19 +2052,7 @@ function $CompileProvider($provide, $$sanitizeUriProvider) { addTextInterpolateDirective(directives, node.nodeValue); break; case NODE_TYPE_COMMENT: /* Comment */ - try { - match = COMMENT_DIRECTIVE_REGEXP.exec(node.nodeValue); - if (match) { - nName = directiveNormalize(match[1]); - if (addDirective(directives, nName, 'M', maxPriority, ignoreDirective)) { - attrs[nName] = trim(match[2]); - } - } - } catch (e) { - // turns out that under some circumstances IE9 throws errors when one attempts to read - // comment's node value. - // Just ignore it and continue. (Can't seem to reproduce in test case.) - } + collectCommentDirectives(node, directives, attrs, maxPriority, ignoreDirective); break; } @@ -2072,6 +2060,24 @@ function $CompileProvider($provide, $$sanitizeUriProvider) { return directives; } + function collectCommentDirectives(node, directives, attrs, maxPriority, ignoreDirective) { + // function created because of performance, try/catch disables + // the optimization of the whole function #14848 + try { + var match = COMMENT_DIRECTIVE_REGEXP.exec(node.nodeValue); + if (match) { + var nName = directiveNormalize(match[1]); + if (addDirective(directives, nName, 'M', maxPriority, ignoreDirective)) { + attrs[nName] = trim(match[2]); + } + } + } catch (e) { + // turns out that under some circumstances IE9 throws errors when one attempts to read + // comment's node value. + // Just ignore it and continue. (Can't seem to reproduce in test case.) + } + } + /** * Given a node with an directive-start it collects all of the siblings until it finds * directive-end. From 14519f84f54b0100fcadb334220c711cfa8242b1 Mon Sep 17 00:00:00 2001 From: Georgios Kalpakas Date: Mon, 4 Jul 2016 10:08:44 +0300 Subject: [PATCH 0024/1173] docs(copy): mention ignoring non-enumerable properties This also improves the example a bit: - better code formatting - initialization of `form` to an empty object - avoid using `email`, which doesn't get coppied when invalid (and might confuse users) Fixes #14853 --- src/Angular.js | 75 +++++++++++++++++++++++++++----------------------- 1 file changed, 41 insertions(+), 34 deletions(-) diff --git a/src/Angular.js b/src/Angular.js index a5180712dfa1..43d726c6dd38 100644 --- a/src/Angular.js +++ b/src/Angular.js @@ -751,7 +751,13 @@ function arrayRemove(array, value) { * * If a destination is provided, all of its elements (for arrays) or properties (for objects) * are deleted and then all elements/properties from the source are copied to it. * * If `source` is not an object or array (inc. `null` and `undefined`), `source` is returned. - * * If `source` is identical to 'destination' an exception will be thrown. + * * If `source` is identical to `destination` an exception will be thrown. + * + *
    + *
    + * Only enumerable properties are taken into account. Non-enumerable properties (both on `source` + * and on `destination`) will be ignored. + *
    * * @param {*} source The source that will be used to make a copy. * Can be any type, including primitives, `null`, and `undefined`. @@ -760,41 +766,42 @@ function arrayRemove(array, value) { * @returns {*} The copy or updated `destination`, if `destination` was specified. * * @example - - -
    -
    - Name:
    - E-mail:
    - Gender: male - female
    - - -
    -
    form = {{user | json}}
    -
    master = {{master | json}}
    -
    - - -
    -
    + $scope.reset(); + }]); + + */ function copy(source, destination) { var stackSource = []; From 6a219ad8db9dc6632b8f7a352a419e6251dcf806 Mon Sep 17 00:00:00 2001 From: franciscovelez Date: Mon, 4 Jul 2016 15:36:41 +0200 Subject: [PATCH 0025/1173] docs(guide/Expressions): link to English MDN It is better to link to the English version of MDN rather than German version PR (#14863) --- docs/content/guide/expression.ngdoc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/content/guide/expression.ngdoc b/docs/content/guide/expression.ngdoc index 58d6af0d8fe6..a418f17dd7fa 100644 --- a/docs/content/guide/expression.ngdoc +++ b/docs/content/guide/expression.ngdoc @@ -42,7 +42,7 @@ Angular expressions are like JavaScript expressions with the following differenc * **No Object Creation With New Operator:** You cannot use `new` operator in an Angular expression. * **No Bitwise, Comma, And Void Operators:** You cannot use - [Bitwise](https://developer.mozilla.org/de/docs/Web/JavaScript/Reference/Operators/Bitwise_Operators), + [Bitwise](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Bitwise_Operators), `,` or `void` operators in an Angular expression. From 6280ec89e3884e91da5c30faf8b4a55218bcac8b Mon Sep 17 00:00:00 2001 From: Igor Zhukov Date: Thu, 30 Jun 2016 00:46:43 +0300 Subject: [PATCH 0026/1173] fix(copy): fix handling of typed subarrays Previously, it would return a copy of the whole original typed array, not its slice. Now, the `byteOffset` and `length` are also preserved. Fixes #14842 Closes #14845 --- src/Angular.js | 2 +- test/AngularSpec.js | 14 ++++++++++++++ 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/src/Angular.js b/src/Angular.js index 43d726c6dd38..092189e785ad 100644 --- a/src/Angular.js +++ b/src/Angular.js @@ -908,7 +908,7 @@ function copy(source, destination) { case '[object Uint8ClampedArray]': case '[object Uint16Array]': case '[object Uint32Array]': - return new source.constructor(copyElement(source.buffer)); + return new source.constructor(copyElement(source.buffer), source.byteOffset, source.length); case '[object ArrayBuffer]': //Support: IE10 diff --git a/test/AngularSpec.js b/test/AngularSpec.js index ec334690019d..b7e4d821d743 100644 --- a/test/AngularSpec.js +++ b/test/AngularSpec.js @@ -240,6 +240,20 @@ describe('angular', function() { } }); + it("should handle Uint16Array subarray", function() { + if (typeof Uint16Array !== 'undefined') { + var arr = new Uint16Array(4); + arr[1] = 1; + var src = arr.subarray(1, 2); + var dst = copy(src); + expect(dst instanceof Uint16Array).toBeTruthy(); + expect(dst.length).toEqual(1); + expect(dst[0]).toEqual(1); + expect(dst).not.toBe(src); + expect(dst.buffer).not.toBe(src.buffer); + } + }); + it("should throw an exception if a Uint8Array is the destination", function() { if (typeof Uint8Array !== 'undefined') { var src = new Uint8Array(); From 951acb128762b376159b0b2ec872a3e290446926 Mon Sep 17 00:00:00 2001 From: Peter Bacon Darwin Date: Mon, 4 Jul 2016 20:57:35 +0100 Subject: [PATCH 0027/1173] chore(package.json): update dgeni-packages dependency to 0.14.0 --- npm-shrinkwrap.clean.json | 336 +-- npm-shrinkwrap.json | 5041 ++++++++++++++++++------------------- package.json | 2 +- 3 files changed, 2613 insertions(+), 2766 deletions(-) diff --git a/npm-shrinkwrap.clean.json b/npm-shrinkwrap.clean.json index 10ee24460db1..9bc84a265a67 100644 --- a/npm-shrinkwrap.clean.json +++ b/npm-shrinkwrap.clean.json @@ -2930,7 +2930,7 @@ } }, "dgeni-packages": { - "version": "0.13.0", + "version": "0.14.0", "dependencies": { "catharsis": { "version": "0.8.8", @@ -2946,16 +2946,19 @@ } }, "change-case": { - "version": "2.3.1", + "version": "3.0.0", "dependencies": { "camel-case": { - "version": "1.2.2" + "version": "3.0.0" }, "constant-case": { - "version": "1.1.2" + "version": "2.0.0" }, "dot-case": { - "version": "1.1.2" + "version": "2.1.0" + }, + "header-case": { + "version": "1.0.0" }, "is-lower-case": { "version": "1.1.3" @@ -2969,26 +2972,29 @@ "lower-case-first": { "version": "1.0.2" }, + "no-case": { + "version": "2.3.0" + }, "param-case": { - "version": "1.1.2" + "version": "2.1.0" }, "pascal-case": { - "version": "1.1.2" + "version": "2.0.0" }, "path-case": { - "version": "1.1.2" + "version": "2.1.0" }, "sentence-case": { - "version": "1.1.3" + "version": "2.1.0" }, "snake-case": { - "version": "1.1.2" + "version": "2.1.0" }, "swap-case": { "version": "1.1.2" }, "title-case": { - "version": "1.1.2" + "version": "2.1.0" }, "upper-case": { "version": "1.1.3" @@ -3005,15 +3011,37 @@ "version": "4.2.0" }, "glob": { - "version": "3.2.11", + "version": "7.0.5", "dependencies": { + "fs.realpath": { + "version": "1.0.0" + }, + "inflight": { + "version": "1.0.5", + "dependencies": { + "wrappy": { + "version": "1.0.2" + } + } + }, "inherits": { "version": "2.0.1" + }, + "once": { + "version": "1.3.3", + "dependencies": { + "wrappy": { + "version": "1.0.2" + } + } + }, + "path-is-absolute": { + "version": "1.0.0" } } }, "htmlparser2": { - "version": "3.9.0", + "version": "3.9.1", "dependencies": { "domelementtype": { "version": "1.3.0" @@ -3037,15 +3065,18 @@ "entities": { "version": "1.1.1" }, + "inherits": { + "version": "2.0.1" + }, "readable-stream": { - "version": "2.1.2", + "version": "2.1.4", "dependencies": { + "buffer-shims": { + "version": "1.0.0" + }, "core-util-is": { "version": "1.0.2" }, - "inherits": { - "version": "2.0.1" - }, "isarray": { "version": "1.0.0" }, @@ -3062,14 +3093,22 @@ } } }, + "lodash": { + "version": "4.13.1" + }, "minimatch": { - "version": "0.3.0", + "version": "3.0.2", "dependencies": { - "lru-cache": { - "version": "2.7.3" - }, - "sigmund": { - "version": "1.0.1" + "brace-expansion": { + "version": "1.1.5", + "dependencies": { + "balanced-match": { + "version": "0.4.1" + }, + "concat-map": { + "version": "0.0.1" + } + } } } }, @@ -3133,7 +3172,7 @@ "version": "0.3.8", "dependencies": { "nan": { - "version": "2.3.3" + "version": "2.3.5" } } } @@ -3141,130 +3180,33 @@ } } }, - "q-io": { - "version": "1.10.9", + "q": { + "version": "1.4.1" + }, + "semver": { + "version": "5.2.0" + }, + "shelljs": { + "version": "0.7.0", "dependencies": { - "q": { - "version": "0.9.7" - }, - "qs": { - "version": "0.1.0" - }, - "url2": { - "version": "0.0.0" - }, - "mime": { - "version": "1.2.11" - }, - "mimeparse": { - "version": "0.1.4" + "interpret": { + "version": "1.0.1" }, - "collections": { - "version": "0.2.2", + "rechoir": { + "version": "0.6.2", "dependencies": { - "weak-map": { - "version": "1.0.0" + "resolve": { + "version": "1.1.7" } } } } }, - "semver": { - "version": "4.3.6" - }, - "shelljs": { - "version": "0.5.3" - }, "spdx-license-list": { "version": "2.1.0" }, "typescript": { "version": "1.8.10" - }, - "winston": { - "version": "0.7.3", - "dependencies": { - "async": { - "version": "0.2.10" - }, - "colors": { - "version": "0.6.2" - }, - "cycle": { - "version": "1.0.3" - }, - "eyes": { - "version": "0.1.8" - }, - "pkginfo": { - "version": "0.3.1" - }, - "request": { - "version": "2.16.6", - "dependencies": { - "form-data": { - "version": "0.0.10", - "dependencies": { - "combined-stream": { - "version": "0.0.7", - "dependencies": { - "delayed-stream": { - "version": "0.0.5" - } - } - } - } - }, - "mime": { - "version": "1.2.11" - }, - "hawk": { - "version": "0.10.2", - "dependencies": { - "hoek": { - "version": "0.7.6" - }, - "boom": { - "version": "0.3.8" - }, - "cryptiles": { - "version": "0.1.3" - }, - "sntp": { - "version": "0.1.4" - } - } - }, - "node-uuid": { - "version": "1.4.7" - }, - "cookie-jar": { - "version": "0.2.0" - }, - "aws-sign": { - "version": "0.2.0" - }, - "oauth-sign": { - "version": "0.2.0" - }, - "forever-agent": { - "version": "0.2.0" - }, - "tunnel-agent": { - "version": "0.2.0" - }, - "json-stringify-safe": { - "version": "3.0.0" - }, - "qs": { - "version": "0.5.6" - } - } - }, - "stack-trace": { - "version": "0.0.9" - } - } } } }, @@ -6939,6 +6881,9 @@ } } }, + "ansi-regex": { + "version": "2.0.0" + }, "ansi": { "version": "0.3.1" }, @@ -6948,12 +6893,6 @@ "are-we-there-yet": { "version": "1.1.2" }, - "ansi-regex": { - "version": "2.0.0" - }, - "asn1": { - "version": "0.2.3" - }, "assert-plus": { "version": "0.2.0" }, @@ -6969,6 +6908,9 @@ "block-stream": { "version": "0.0.8" }, + "asn1": { + "version": "0.2.3" + }, "boom": { "version": "2.10.1" }, @@ -6978,9 +6920,6 @@ "combined-stream": { "version": "1.0.5" }, - "commander": { - "version": "2.9.0" - }, "chalk": { "version": "1.1.3" }, @@ -6990,21 +6929,24 @@ "cryptiles": { "version": "2.0.5" }, + "commander": { + "version": "2.9.0" + }, "debug": { "version": "2.2.0" }, - "deep-extend": { - "version": "0.4.1" - }, - "delegates": { - "version": "1.0.0" - }, "delayed-stream": { "version": "1.0.0" }, + "deep-extend": { + "version": "0.4.1" + }, "ecc-jsbn": { "version": "0.1.1" }, + "delegates": { + "version": "1.0.0" + }, "escape-string-regexp": { "version": "1.0.5" }, @@ -7017,69 +6959,69 @@ "forever-agent": { "version": "0.6.1" }, - "fstream": { - "version": "1.0.8" - }, "form-data": { "version": "1.0.0-rc4" }, + "fstream": { + "version": "1.0.8" + }, "gauge": { "version": "1.2.7" }, - "generate-object-property": { - "version": "1.2.0" - }, "generate-function": { "version": "2.0.0" }, - "graceful-fs": { - "version": "4.1.3" + "generate-object-property": { + "version": "1.2.0" }, "graceful-readlink": { "version": "1.0.1" }, + "graceful-fs": { + "version": "4.1.3" + }, "har-validator": { "version": "2.0.6" }, "has-ansi": { "version": "2.0.0" }, - "has-unicode": { - "version": "2.0.0" - }, "hawk": { "version": "3.1.3" }, + "has-unicode": { + "version": "2.0.0" + }, "hoek": { "version": "2.16.3" }, - "http-signature": { - "version": "1.1.1" + "inherits": { + "version": "2.0.1" }, "ini": { "version": "1.3.4" }, - "inherits": { - "version": "2.0.1" + "http-signature": { + "version": "1.1.1" }, "is-my-json-valid": { "version": "2.13.1" }, - "is-property": { - "version": "1.0.2" - }, - "is-typedarray": { - "version": "1.0.0" - }, "isarray": { "version": "1.0.0" }, "isstream": { "version": "0.1.2" }, + "is-property": { + "version": "1.0.2" + }, "jsbn": { "version": "0.1.0" }, + "is-typedarray": { + "version": "1.0.0" + }, "jodid25519": { "version": "1.0.2" }, @@ -7089,19 +7031,19 @@ "json-stringify-safe": { "version": "5.0.1" }, + "lodash.pad": { + "version": "4.1.0" + }, "jsonpointer": { "version": "2.0.0" }, "jsprim": { "version": "1.2.2" }, - "lodash.pad": { - "version": "4.1.0" - }, - "lodash.padstart": { + "lodash.padend": { "version": "4.2.0" }, - "lodash.padend": { + "lodash.padstart": { "version": "4.2.0" }, "lodash.repeat": { @@ -7113,6 +7055,9 @@ "mime-db": { "version": "1.22.0" }, + "minimist": { + "version": "0.0.8" + }, "mime-types": { "version": "2.1.10" }, @@ -7122,15 +7067,12 @@ "ms": { "version": "0.7.1" }, - "minimist": { - "version": "0.0.8" + "node-uuid": { + "version": "1.4.7" }, "npmlog": { "version": "2.0.3" }, - "node-uuid": { - "version": "1.4.7" - }, "oauth-sign": { "version": "0.8.1" }, @@ -7149,27 +7091,27 @@ "qs": { "version": "6.0.2" }, - "readable-stream": { - "version": "2.0.6" - }, "request": { "version": "2.69.0" }, - "semver": { - "version": "5.1.0" + "readable-stream": { + "version": "2.0.6" }, "sntp": { "version": "1.0.9" }, + "semver": { + "version": "5.1.0" + }, "sshpk": { "version": "1.7.4" }, - "stringstream": { - "version": "0.0.5" - }, "string_decoder": { "version": "0.10.31" }, + "stringstream": { + "version": "0.0.5" + }, "strip-ansi": { "version": "3.0.1" }, @@ -7179,17 +7121,20 @@ "strip-json-comments": { "version": "1.0.4" }, + "tar-pack": { + "version": "3.1.3" + }, "tar": { "version": "2.2.1" }, + "tunnel-agent": { + "version": "0.4.2" + }, "tough-cookie": { "version": "2.2.2" }, - "tar-pack": { - "version": "3.1.3" - }, - "tunnel-agent": { - "version": "0.4.2" + "uid-number": { + "version": "0.0.6" }, "tweetnacl": { "version": "0.14.3" @@ -7200,9 +7145,6 @@ "verror": { "version": "1.3.6" }, - "uid-number": { - "version": "0.0.6" - }, "wrappy": { "version": "1.0.1" }, diff --git a/npm-shrinkwrap.json b/npm-shrinkwrap.json index 27a62d6f8c91..a31a981f2543 100644 --- a/npm-shrinkwrap.json +++ b/npm-shrinkwrap.json @@ -3,233 +3,233 @@ "dependencies": { "angular-benchpress": { "version": "0.2.2", - "from": "angular-benchpress@>=0.0.0 <1.0.0", + "from": "https://registry.npmjs.org/angular-benchpress/-/angular-benchpress-0.2.2.tgz", "resolved": "https://registry.npmjs.org/angular-benchpress/-/angular-benchpress-0.2.2.tgz", "dependencies": { "bootstrap": { "version": "3.3.6", - "from": "bootstrap@>=3.2.0 <4.0.0", + "from": "https://registry.npmjs.org/bootstrap/-/bootstrap-3.3.6.tgz", "resolved": "https://registry.npmjs.org/bootstrap/-/bootstrap-3.3.6.tgz" }, "express": { "version": "4.13.4", - "from": "express@>=4.8.6 <5.0.0", + "from": "https://registry.npmjs.org/express/-/express-4.13.4.tgz", "resolved": "https://registry.npmjs.org/express/-/express-4.13.4.tgz", "dependencies": { "accepts": { "version": "1.2.13", - "from": "accepts@>=1.2.12 <1.3.0", + "from": "https://registry.npmjs.org/accepts/-/accepts-1.2.13.tgz", "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.2.13.tgz", "dependencies": { "mime-types": { "version": "2.1.11", - "from": "mime-types@>=2.1.6 <2.2.0", + "from": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.11.tgz", "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.11.tgz", "dependencies": { "mime-db": { "version": "1.23.0", - "from": "mime-db@>=1.23.0 <1.24.0", + "from": "https://registry.npmjs.org/mime-db/-/mime-db-1.23.0.tgz", "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.23.0.tgz" } } }, "negotiator": { "version": "0.5.3", - "from": "negotiator@0.5.3", + "from": "https://registry.npmjs.org/negotiator/-/negotiator-0.5.3.tgz", "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.5.3.tgz" } } }, "array-flatten": { "version": "1.1.1", - "from": "array-flatten@1.1.1", + "from": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz" }, "content-disposition": { "version": "0.5.1", - "from": "content-disposition@0.5.1", + "from": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.1.tgz", "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.1.tgz" }, "content-type": { "version": "1.0.2", - "from": "content-type@>=1.0.1 <1.1.0", + "from": "https://registry.npmjs.org/content-type/-/content-type-1.0.2.tgz", "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.2.tgz" }, "cookie": { "version": "0.1.5", - "from": "cookie@0.1.5", + "from": "https://registry.npmjs.org/cookie/-/cookie-0.1.5.tgz", "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.1.5.tgz" }, "cookie-signature": { "version": "1.0.6", - "from": "cookie-signature@1.0.6", + "from": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz" }, "debug": { "version": "2.2.0", - "from": "debug@>=2.2.0 <2.3.0", + "from": "https://registry.npmjs.org/debug/-/debug-2.2.0.tgz", "resolved": "https://registry.npmjs.org/debug/-/debug-2.2.0.tgz", "dependencies": { "ms": { "version": "0.7.1", - "from": "ms@0.7.1", + "from": "https://registry.npmjs.org/ms/-/ms-0.7.1.tgz", "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.1.tgz" } } }, "depd": { "version": "1.1.0", - "from": "depd@>=1.1.0 <1.2.0", + "from": "https://registry.npmjs.org/depd/-/depd-1.1.0.tgz", "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.0.tgz" }, "escape-html": { "version": "1.0.3", - "from": "escape-html@>=1.0.3 <1.1.0", + "from": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz" }, "etag": { "version": "1.7.0", - "from": "etag@>=1.7.0 <1.8.0", + "from": "https://registry.npmjs.org/etag/-/etag-1.7.0.tgz", "resolved": "https://registry.npmjs.org/etag/-/etag-1.7.0.tgz" }, "finalhandler": { "version": "0.4.1", - "from": "finalhandler@0.4.1", + "from": "https://registry.npmjs.org/finalhandler/-/finalhandler-0.4.1.tgz", "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-0.4.1.tgz", "dependencies": { "unpipe": { "version": "1.0.0", - "from": "unpipe@>=1.0.0 <1.1.0", + "from": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz" } } }, "fresh": { "version": "0.3.0", - "from": "fresh@0.3.0", + "from": "https://registry.npmjs.org/fresh/-/fresh-0.3.0.tgz", "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.3.0.tgz" }, "merge-descriptors": { "version": "1.0.1", - "from": "merge-descriptors@1.0.1", + "from": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz" }, "methods": { "version": "1.1.2", - "from": "methods@>=1.1.2 <1.2.0", + "from": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz" }, "on-finished": { "version": "2.3.0", - "from": "on-finished@>=2.3.0 <2.4.0", + "from": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", "dependencies": { "ee-first": { "version": "1.1.1", - "from": "ee-first@1.1.1", + "from": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz" } } }, "parseurl": { "version": "1.3.1", - "from": "parseurl@>=1.3.1 <1.4.0", + "from": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.1.tgz", "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.1.tgz" }, "path-to-regexp": { "version": "0.1.7", - "from": "path-to-regexp@0.1.7", + "from": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz" }, "proxy-addr": { "version": "1.0.10", - "from": "proxy-addr@>=1.0.10 <1.1.0", + "from": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-1.0.10.tgz", "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-1.0.10.tgz", "dependencies": { "forwarded": { "version": "0.1.0", - "from": "forwarded@>=0.1.0 <0.2.0", + "from": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.0.tgz", "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.0.tgz" }, "ipaddr.js": { "version": "1.0.5", - "from": "ipaddr.js@1.0.5", + "from": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.0.5.tgz", "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.0.5.tgz" } } }, "qs": { "version": "4.0.0", - "from": "qs@4.0.0", + "from": "https://registry.npmjs.org/qs/-/qs-4.0.0.tgz", "resolved": "https://registry.npmjs.org/qs/-/qs-4.0.0.tgz" }, "range-parser": { "version": "1.0.3", - "from": "range-parser@>=1.0.3 <1.1.0", + "from": "https://registry.npmjs.org/range-parser/-/range-parser-1.0.3.tgz", "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.0.3.tgz" }, "send": { "version": "0.13.1", - "from": "send@0.13.1", + "from": "https://registry.npmjs.org/send/-/send-0.13.1.tgz", "resolved": "https://registry.npmjs.org/send/-/send-0.13.1.tgz", "dependencies": { "destroy": { "version": "1.0.4", - "from": "destroy@>=1.0.4 <1.1.0", + "from": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz" }, "http-errors": { "version": "1.3.1", - "from": "http-errors@>=1.3.1 <1.4.0", + "from": "https://registry.npmjs.org/http-errors/-/http-errors-1.3.1.tgz", "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.3.1.tgz", "dependencies": { "inherits": { "version": "2.0.1", - "from": "inherits@>=2.0.1 <2.1.0", + "from": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz" } } }, "mime": { "version": "1.3.4", - "from": "mime@1.3.4", + "from": "https://registry.npmjs.org/mime/-/mime-1.3.4.tgz", "resolved": "https://registry.npmjs.org/mime/-/mime-1.3.4.tgz" }, "ms": { "version": "0.7.1", - "from": "ms@0.7.1", + "from": "https://registry.npmjs.org/ms/-/ms-0.7.1.tgz", "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.1.tgz" }, "statuses": { "version": "1.2.1", - "from": "statuses@>=1.2.1 <1.3.0", + "from": "https://registry.npmjs.org/statuses/-/statuses-1.2.1.tgz", "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.2.1.tgz" } } }, "serve-static": { "version": "1.10.2", - "from": "serve-static@>=1.10.2 <1.11.0", + "from": "https://registry.npmjs.org/serve-static/-/serve-static-1.10.2.tgz", "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.10.2.tgz" }, "type-is": { "version": "1.6.12", - "from": "type-is@>=1.6.6 <1.7.0", + "from": "https://registry.npmjs.org/type-is/-/type-is-1.6.12.tgz", "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.12.tgz", "dependencies": { "media-typer": { "version": "0.3.0", - "from": "media-typer@0.3.0", + "from": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz" }, "mime-types": { "version": "2.1.11", - "from": "mime-types@>=2.1.6 <2.2.0", + "from": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.11.tgz", "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.11.tgz", "dependencies": { "mime-db": { "version": "1.23.0", - "from": "mime-db@>=1.23.0 <1.24.0", + "from": "https://registry.npmjs.org/mime-db/-/mime-db-1.23.0.tgz", "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.23.0.tgz" } } @@ -238,78 +238,78 @@ }, "utils-merge": { "version": "1.0.0", - "from": "utils-merge@1.0.0", + "from": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.0.tgz", "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.0.tgz" }, "vary": { "version": "1.0.1", - "from": "vary@>=1.0.1 <1.1.0", + "from": "https://registry.npmjs.org/vary/-/vary-1.0.1.tgz", "resolved": "https://registry.npmjs.org/vary/-/vary-1.0.1.tgz" } } }, "minimist": { "version": "1.2.0", - "from": "minimist@>=1.1.0 <2.0.0", + "from": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz" }, "mkdirp": { "version": "0.5.1", - "from": "mkdirp@>=0.5.0 <0.6.0", + "from": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", "dependencies": { "minimist": { "version": "0.0.8", - "from": "minimist@0.0.8", + "from": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz" } } }, "rimraf": { "version": "2.5.2", - "from": "rimraf@>=2.2.8 <3.0.0", + "from": "https://registry.npmjs.org/rimraf/-/rimraf-2.5.2.tgz", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.5.2.tgz", "dependencies": { "glob": { "version": "7.0.3", - "from": "glob@>=7.0.0 <8.0.0", + "from": "https://registry.npmjs.org/glob/-/glob-7.0.3.tgz", "resolved": "https://registry.npmjs.org/glob/-/glob-7.0.3.tgz", "dependencies": { "inflight": { "version": "1.0.4", - "from": "inflight@>=1.0.4 <2.0.0", + "from": "https://registry.npmjs.org/inflight/-/inflight-1.0.4.tgz", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.4.tgz", "dependencies": { "wrappy": { "version": "1.0.1", - "from": "wrappy@>=1.0.0 <2.0.0", + "from": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.1.tgz", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.1.tgz" } } }, "inherits": { "version": "2.0.1", - "from": "inherits@>=2.0.0 <3.0.0", + "from": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz" }, "minimatch": { "version": "3.0.0", - "from": "minimatch@>=2.0.0 <3.0.0||>=3.0.0 <4.0.0", + "from": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.0.tgz", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.0.tgz", "dependencies": { "brace-expansion": { "version": "1.1.4", - "from": "brace-expansion@>=1.0.0 <2.0.0", + "from": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.4.tgz", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.4.tgz", "dependencies": { "balanced-match": { "version": "0.4.1", - "from": "balanced-match@>=0.4.1 <0.5.0", + "from": "https://registry.npmjs.org/balanced-match/-/balanced-match-0.4.1.tgz", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-0.4.1.tgz" }, "concat-map": { "version": "0.0.1", - "from": "concat-map@0.0.1", + "from": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz" } } @@ -318,19 +318,19 @@ }, "once": { "version": "1.3.3", - "from": "once@>=1.3.0 <2.0.0", + "from": "https://registry.npmjs.org/once/-/once-1.3.3.tgz", "resolved": "https://registry.npmjs.org/once/-/once-1.3.3.tgz", "dependencies": { "wrappy": { "version": "1.0.1", - "from": "wrappy@>=1.0.0 <2.0.0", + "from": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.1.tgz", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.1.tgz" } } }, "path-is-absolute": { "version": "1.0.0", - "from": "path-is-absolute@>=1.0.0 <2.0.0", + "from": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.0.tgz", "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.0.tgz" } } @@ -339,69 +339,69 @@ }, "underscore": { "version": "1.8.3", - "from": "underscore@>=1.6.0 <2.0.0", + "from": "https://registry.npmjs.org/underscore/-/underscore-1.8.3.tgz", "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.8.3.tgz" }, "di": { "version": "2.0.0-pre-9", - "from": "di@>=2.0.0-pre-9 <2.1.0", + "from": "https://registry.npmjs.org/di/-/di-2.0.0-pre-9.tgz", "resolved": "https://registry.npmjs.org/di/-/di-2.0.0-pre-9.tgz", "dependencies": { "traceur": { "version": "0.0.33", - "from": "vojtajina/traceur-compiler#add-es6-pure-transformer-dist", + "from": "git://github.com/vojtajina/traceur-compiler.git#d90b1e34c799bf61cd1aafdc33db0a554fa9e617", "resolved": "git://github.com/vojtajina/traceur-compiler.git#d90b1e34c799bf61cd1aafdc33db0a554fa9e617", "dependencies": { "commander": { "version": "2.9.0", - "from": "commander@>=1.1.0", + "from": "https://registry.npmjs.org/commander/-/commander-2.9.0.tgz", "resolved": "https://registry.npmjs.org/commander/-/commander-2.9.0.tgz", "dependencies": { "graceful-readlink": { "version": "1.0.1", - "from": "graceful-readlink@>=1.0.0", + "from": "https://registry.npmjs.org/graceful-readlink/-/graceful-readlink-1.0.1.tgz", "resolved": "https://registry.npmjs.org/graceful-readlink/-/graceful-readlink-1.0.1.tgz" } } }, "q-io": { "version": "1.10.9", - "from": "q-io@>=1.10.6 <1.11.0", + "from": "https://registry.npmjs.org/q-io/-/q-io-1.10.9.tgz", "resolved": "https://registry.npmjs.org/q-io/-/q-io-1.10.9.tgz", "dependencies": { "q": { "version": "0.9.7", - "from": "q@>=0.9.7 <0.10.0", + "from": "https://registry.npmjs.org/q/-/q-0.9.7.tgz", "resolved": "https://registry.npmjs.org/q/-/q-0.9.7.tgz" }, "qs": { "version": "0.1.0", - "from": "qs@>=0.1.0 <0.2.0", + "from": "https://registry.npmjs.org/qs/-/qs-0.1.0.tgz", "resolved": "https://registry.npmjs.org/qs/-/qs-0.1.0.tgz" }, "url2": { "version": "0.0.0", - "from": "url2@>=0.0.0 <0.1.0", + "from": "https://registry.npmjs.org/url2/-/url2-0.0.0.tgz", "resolved": "https://registry.npmjs.org/url2/-/url2-0.0.0.tgz" }, "mime": { "version": "1.2.11", - "from": "mime@>=1.2.11 <1.3.0", + "from": "https://registry.npmjs.org/mime/-/mime-1.2.11.tgz", "resolved": "https://registry.npmjs.org/mime/-/mime-1.2.11.tgz" }, "mimeparse": { "version": "0.1.4", - "from": "mimeparse@>=0.1.4 <0.2.0", + "from": "https://registry.npmjs.org/mimeparse/-/mimeparse-0.1.4.tgz", "resolved": "https://registry.npmjs.org/mimeparse/-/mimeparse-0.1.4.tgz" }, "collections": { "version": "0.2.2", - "from": "collections@>=0.2.0 <0.3.0", + "from": "https://registry.npmjs.org/collections/-/collections-0.2.2.tgz", "resolved": "https://registry.npmjs.org/collections/-/collections-0.2.2.tgz", "dependencies": { "weak-map": { "version": "1.0.0", - "from": "weak-map@1.0.0", + "from": "https://registry.npmjs.org/weak-map/-/weak-map-1.0.0.tgz", "resolved": "https://registry.npmjs.org/weak-map/-/weak-map-1.0.0.tgz" } } @@ -412,66 +412,66 @@ }, "es6-shim": { "version": "0.9.3", - "from": "es6-shim@>=0.9.2 <0.10.0", + "from": "https://registry.npmjs.org/es6-shim/-/es6-shim-0.9.3.tgz", "resolved": "https://registry.npmjs.org/es6-shim/-/es6-shim-0.9.3.tgz" } } }, "rx": { "version": "2.3.25", - "from": "rx@>=2.3.20 <2.4.0", + "from": "https://registry.npmjs.org/rx/-/rx-2.3.25.tgz", "resolved": "https://registry.npmjs.org/rx/-/rx-2.3.25.tgz" }, "browserify": { "version": "7.0.3", - "from": "browserify@>=7.0.0 <7.1.0", + "from": "https://registry.npmjs.org/browserify/-/browserify-7.0.3.tgz", "resolved": "https://registry.npmjs.org/browserify/-/browserify-7.0.3.tgz", "dependencies": { "JSONStream": { "version": "0.8.4", - "from": "JSONStream@>=0.8.3 <0.9.0", + "from": "https://registry.npmjs.org/JSONStream/-/JSONStream-0.8.4.tgz", "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-0.8.4.tgz", "dependencies": { "jsonparse": { "version": "0.0.5", - "from": "jsonparse@0.0.5", + "from": "https://registry.npmjs.org/jsonparse/-/jsonparse-0.0.5.tgz", "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-0.0.5.tgz" }, "through": { "version": "2.3.8", - "from": "through@>=2.2.7 <3.0.0", + "from": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz" } } }, "assert": { "version": "1.1.2", - "from": "assert@>=1.1.0 <1.2.0", + "from": "https://registry.npmjs.org/assert/-/assert-1.1.2.tgz", "resolved": "https://registry.npmjs.org/assert/-/assert-1.1.2.tgz" }, "browser-pack": { "version": "3.2.0", - "from": "browser-pack@>=3.2.0 <4.0.0", + "from": "https://registry.npmjs.org/browser-pack/-/browser-pack-3.2.0.tgz", "resolved": "https://registry.npmjs.org/browser-pack/-/browser-pack-3.2.0.tgz", "dependencies": { "combine-source-map": { "version": "0.3.0", - "from": "combine-source-map@>=0.3.0 <0.4.0", + "from": "https://registry.npmjs.org/combine-source-map/-/combine-source-map-0.3.0.tgz", "resolved": "https://registry.npmjs.org/combine-source-map/-/combine-source-map-0.3.0.tgz", "dependencies": { "inline-source-map": { "version": "0.3.1", - "from": "inline-source-map@>=0.3.0 <0.4.0", + "from": "https://registry.npmjs.org/inline-source-map/-/inline-source-map-0.3.1.tgz", "resolved": "https://registry.npmjs.org/inline-source-map/-/inline-source-map-0.3.1.tgz", "dependencies": { "source-map": { "version": "0.3.0", - "from": "source-map@>=0.3.0 <0.4.0", + "from": "https://registry.npmjs.org/source-map/-/source-map-0.3.0.tgz", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.3.0.tgz", "dependencies": { "amdefine": { "version": "1.0.0", - "from": "amdefine@>=0.0.4", + "from": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.0.tgz", "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.0.tgz" } } @@ -480,17 +480,17 @@ }, "convert-source-map": { "version": "0.3.5", - "from": "convert-source-map@>=0.3.0 <0.4.0", + "from": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-0.3.5.tgz", "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-0.3.5.tgz" }, "source-map": { "version": "0.1.43", - "from": "source-map@>=0.1.31 <0.2.0", + "from": "https://registry.npmjs.org/source-map/-/source-map-0.1.43.tgz", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.1.43.tgz", "dependencies": { "amdefine": { "version": "1.0.0", - "from": "amdefine@>=0.0.4", + "from": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.0.tgz", "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.0.tgz" } } @@ -499,17 +499,17 @@ }, "through2": { "version": "0.5.1", - "from": "through2@>=0.5.1 <0.6.0", + "from": "https://registry.npmjs.org/through2/-/through2-0.5.1.tgz", "resolved": "https://registry.npmjs.org/through2/-/through2-0.5.1.tgz", "dependencies": { "readable-stream": { "version": "1.0.34", - "from": "readable-stream@>=1.0.17 <1.1.0", + "from": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", "dependencies": { "core-util-is": { "version": "1.0.2", - "from": "core-util-is@>=1.0.0 <1.1.0", + "from": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz" } } @@ -520,134 +520,134 @@ }, "browser-resolve": { "version": "1.11.1", - "from": "browser-resolve@>=1.3.0 <2.0.0", + "from": "https://registry.npmjs.org/browser-resolve/-/browser-resolve-1.11.1.tgz", "resolved": "https://registry.npmjs.org/browser-resolve/-/browser-resolve-1.11.1.tgz", "dependencies": { "resolve": { "version": "1.1.7", - "from": "resolve@1.1.7", + "from": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz" } } }, "browserify-zlib": { "version": "0.1.4", - "from": "browserify-zlib@>=0.1.2 <0.2.0", + "from": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.1.4.tgz", "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.1.4.tgz", "dependencies": { "pako": { "version": "0.2.8", - "from": "pako@>=0.2.0 <0.3.0", + "from": "https://registry.npmjs.org/pako/-/pako-0.2.8.tgz", "resolved": "https://registry.npmjs.org/pako/-/pako-0.2.8.tgz" } } }, "buffer": { "version": "2.8.2", - "from": "buffer@>=2.3.0 <3.0.0", + "from": "https://registry.npmjs.org/buffer/-/buffer-2.8.2.tgz", "resolved": "https://registry.npmjs.org/buffer/-/buffer-2.8.2.tgz", "dependencies": { "base64-js": { "version": "0.0.7", - "from": "base64-js@0.0.7", + "from": "https://registry.npmjs.org/base64-js/-/base64-js-0.0.7.tgz", "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-0.0.7.tgz" }, "ieee754": { "version": "1.1.6", - "from": "ieee754@>=1.1.4 <2.0.0", + "from": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.6.tgz", "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.6.tgz" }, "is-array": { "version": "1.0.1", - "from": "is-array@>=1.0.1 <2.0.0", + "from": "https://registry.npmjs.org/is-array/-/is-array-1.0.1.tgz", "resolved": "https://registry.npmjs.org/is-array/-/is-array-1.0.1.tgz" } } }, "builtins": { "version": "0.0.7", - "from": "builtins@>=0.0.3 <0.1.0", + "from": "https://registry.npmjs.org/builtins/-/builtins-0.0.7.tgz", "resolved": "https://registry.npmjs.org/builtins/-/builtins-0.0.7.tgz" }, "commondir": { "version": "0.0.1", - "from": "commondir@0.0.1", + "from": "https://registry.npmjs.org/commondir/-/commondir-0.0.1.tgz", "resolved": "https://registry.npmjs.org/commondir/-/commondir-0.0.1.tgz" }, "concat-stream": { "version": "1.4.10", - "from": "concat-stream@>=1.4.1 <1.5.0", + "from": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.4.10.tgz", "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.4.10.tgz", "dependencies": { "typedarray": { "version": "0.0.6", - "from": "typedarray@>=0.0.5 <0.1.0", + "from": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz" } } }, "console-browserify": { "version": "1.1.0", - "from": "console-browserify@>=1.1.0 <2.0.0", + "from": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.1.0.tgz", "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.1.0.tgz", "dependencies": { "date-now": { "version": "0.1.4", - "from": "date-now@>=0.1.4 <0.2.0", + "from": "https://registry.npmjs.org/date-now/-/date-now-0.1.4.tgz", "resolved": "https://registry.npmjs.org/date-now/-/date-now-0.1.4.tgz" } } }, "constants-browserify": { "version": "0.0.1", - "from": "constants-browserify@>=0.0.1 <0.1.0", + "from": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-0.0.1.tgz", "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-0.0.1.tgz" }, "crypto-browserify": { "version": "3.11.0", - "from": "crypto-browserify@>=3.0.0 <4.0.0", + "from": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.11.0.tgz", "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.11.0.tgz", "dependencies": { "browserify-cipher": { "version": "1.0.0", - "from": "browserify-cipher@>=1.0.0 <2.0.0", + "from": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.0.tgz", "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.0.tgz", "dependencies": { "browserify-aes": { "version": "1.0.6", - "from": "browserify-aes@>=1.0.4 <2.0.0", + "from": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.0.6.tgz", "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.0.6.tgz", "dependencies": { "buffer-xor": { "version": "1.0.3", - "from": "buffer-xor@>=1.0.2 <2.0.0", + "from": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz" }, "cipher-base": { "version": "1.0.2", - "from": "cipher-base@>=1.0.0 <2.0.0", + "from": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.2.tgz", "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.2.tgz" } } }, "browserify-des": { "version": "1.0.0", - "from": "browserify-des@>=1.0.0 <2.0.0", + "from": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.0.tgz", "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.0.tgz", "dependencies": { "cipher-base": { "version": "1.0.2", - "from": "cipher-base@>=1.0.1 <2.0.0", + "from": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.2.tgz", "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.2.tgz" }, "des.js": { "version": "1.0.0", - "from": "des.js@>=1.0.0 <2.0.0", + "from": "https://registry.npmjs.org/des.js/-/des.js-1.0.0.tgz", "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.0.tgz", "dependencies": { "minimalistic-assert": { "version": "1.0.0", - "from": "minimalistic-assert@>=1.0.0 <2.0.0", + "from": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.0.tgz", "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.0.tgz" } } @@ -656,80 +656,80 @@ }, "evp_bytestokey": { "version": "1.0.0", - "from": "evp_bytestokey@>=1.0.0 <2.0.0", + "from": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.0.tgz", "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.0.tgz" } } }, "browserify-sign": { "version": "4.0.0", - "from": "browserify-sign@>=4.0.0 <5.0.0", + "from": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.0.0.tgz", "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.0.0.tgz", "dependencies": { "bn.js": { "version": "4.11.3", - "from": "bn.js@>=4.1.1 <5.0.0", + "from": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.3.tgz", "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.3.tgz" }, "browserify-rsa": { "version": "4.0.1", - "from": "browserify-rsa@>=4.0.0 <5.0.0", + "from": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.0.1.tgz", "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.0.1.tgz" }, "elliptic": { "version": "6.2.3", - "from": "elliptic@>=6.0.0 <7.0.0", + "from": "https://registry.npmjs.org/elliptic/-/elliptic-6.2.3.tgz", "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.2.3.tgz", "dependencies": { "brorand": { "version": "1.0.5", - "from": "brorand@>=1.0.1 <2.0.0", + "from": "https://registry.npmjs.org/brorand/-/brorand-1.0.5.tgz", "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.0.5.tgz" }, "hash.js": { "version": "1.0.3", - "from": "hash.js@>=1.0.0 <2.0.0", + "from": "https://registry.npmjs.org/hash.js/-/hash.js-1.0.3.tgz", "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.0.3.tgz" } } }, "parse-asn1": { "version": "5.0.0", - "from": "parse-asn1@>=5.0.0 <6.0.0", + "from": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.0.0.tgz", "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.0.0.tgz", "dependencies": { "asn1.js": { "version": "4.6.0", - "from": "asn1.js@>=4.0.0 <5.0.0", + "from": "https://registry.npmjs.org/asn1.js/-/asn1.js-4.6.0.tgz", "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-4.6.0.tgz", "dependencies": { "minimalistic-assert": { "version": "1.0.0", - "from": "minimalistic-assert@>=1.0.0 <2.0.0", + "from": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.0.tgz", "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.0.tgz" } } }, "browserify-aes": { "version": "1.0.6", - "from": "browserify-aes@>=1.0.0 <2.0.0", + "from": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.0.6.tgz", "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.0.6.tgz", "dependencies": { "buffer-xor": { "version": "1.0.3", - "from": "buffer-xor@>=1.0.2 <2.0.0", + "from": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz" }, "cipher-base": { "version": "1.0.2", - "from": "cipher-base@>=1.0.0 <2.0.0", + "from": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.2.tgz", "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.2.tgz" } } }, "evp_bytestokey": { "version": "1.0.0", - "from": "evp_bytestokey@>=1.0.0 <2.0.0", + "from": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.0.tgz", "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.0.tgz" } } @@ -738,27 +738,27 @@ }, "create-ecdh": { "version": "4.0.0", - "from": "create-ecdh@>=4.0.0 <5.0.0", + "from": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.0.tgz", "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.0.tgz", "dependencies": { "bn.js": { "version": "4.11.3", - "from": "bn.js@>=4.1.0 <5.0.0", + "from": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.3.tgz", "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.3.tgz" }, "elliptic": { "version": "6.2.3", - "from": "elliptic@>=6.0.0 <7.0.0", + "from": "https://registry.npmjs.org/elliptic/-/elliptic-6.2.3.tgz", "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.2.3.tgz", "dependencies": { "brorand": { "version": "1.0.5", - "from": "brorand@>=1.0.1 <2.0.0", + "from": "https://registry.npmjs.org/brorand/-/brorand-1.0.5.tgz", "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.0.5.tgz" }, "hash.js": { "version": "1.0.3", - "from": "hash.js@>=1.0.0 <2.0.0", + "from": "https://registry.npmjs.org/hash.js/-/hash.js-1.0.3.tgz", "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.0.3.tgz" } } @@ -767,49 +767,49 @@ }, "create-hash": { "version": "1.1.2", - "from": "create-hash@>=1.1.0 <2.0.0", + "from": "https://registry.npmjs.org/create-hash/-/create-hash-1.1.2.tgz", "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.1.2.tgz", "dependencies": { "cipher-base": { "version": "1.0.2", - "from": "cipher-base@>=1.0.1 <2.0.0", + "from": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.2.tgz", "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.2.tgz" }, "ripemd160": { "version": "1.0.1", - "from": "ripemd160@>=1.0.0 <2.0.0", + "from": "https://registry.npmjs.org/ripemd160/-/ripemd160-1.0.1.tgz", "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-1.0.1.tgz" }, "sha.js": { "version": "2.4.5", - "from": "sha.js@>=2.3.6 <3.0.0", + "from": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.5.tgz", "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.5.tgz" } } }, "create-hmac": { "version": "1.1.4", - "from": "create-hmac@>=1.1.0 <2.0.0", + "from": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.4.tgz", "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.4.tgz" }, "diffie-hellman": { "version": "5.0.2", - "from": "diffie-hellman@>=5.0.0 <6.0.0", + "from": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.2.tgz", "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.2.tgz", "dependencies": { "bn.js": { "version": "4.11.3", - "from": "bn.js@>=4.1.0 <5.0.0", + "from": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.3.tgz", "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.3.tgz" }, "miller-rabin": { "version": "4.0.0", - "from": "miller-rabin@>=4.0.0 <5.0.0", + "from": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.0.tgz", "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.0.tgz", "dependencies": { "brorand": { "version": "1.0.5", - "from": "brorand@>=1.0.1 <2.0.0", + "from": "https://registry.npmjs.org/brorand/-/brorand-1.0.5.tgz", "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.0.5.tgz" } } @@ -818,61 +818,61 @@ }, "pbkdf2": { "version": "3.0.4", - "from": "pbkdf2@>=3.0.3 <4.0.0", + "from": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.0.4.tgz", "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.0.4.tgz" }, "public-encrypt": { "version": "4.0.0", - "from": "public-encrypt@>=4.0.0 <5.0.0", + "from": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.0.tgz", "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.0.tgz", "dependencies": { "bn.js": { "version": "4.11.3", - "from": "bn.js@>=4.1.0 <5.0.0", + "from": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.3.tgz", "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.3.tgz" }, "browserify-rsa": { "version": "4.0.1", - "from": "browserify-rsa@>=4.0.0 <5.0.0", + "from": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.0.1.tgz", "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.0.1.tgz" }, "parse-asn1": { "version": "5.0.0", - "from": "parse-asn1@>=5.0.0 <6.0.0", + "from": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.0.0.tgz", "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.0.0.tgz", "dependencies": { "asn1.js": { "version": "4.6.0", - "from": "asn1.js@>=4.0.0 <5.0.0", + "from": "https://registry.npmjs.org/asn1.js/-/asn1.js-4.6.0.tgz", "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-4.6.0.tgz", "dependencies": { "minimalistic-assert": { "version": "1.0.0", - "from": "minimalistic-assert@>=1.0.0 <2.0.0", + "from": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.0.tgz", "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.0.tgz" } } }, "browserify-aes": { "version": "1.0.6", - "from": "browserify-aes@>=1.0.0 <2.0.0", + "from": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.0.6.tgz", "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.0.6.tgz", "dependencies": { "buffer-xor": { "version": "1.0.3", - "from": "buffer-xor@>=1.0.2 <2.0.0", + "from": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz" }, "cipher-base": { "version": "1.0.2", - "from": "cipher-base@>=1.0.0 <2.0.0", + "from": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.2.tgz", "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.2.tgz" } } }, "evp_bytestokey": { "version": "1.0.0", - "from": "evp_bytestokey@>=1.0.0 <2.0.0", + "from": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.0.tgz", "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.0.tgz" } } @@ -881,39 +881,39 @@ }, "randombytes": { "version": "2.0.3", - "from": "randombytes@>=2.0.0 <3.0.0", + "from": "https://registry.npmjs.org/randombytes/-/randombytes-2.0.3.tgz", "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.0.3.tgz" } } }, "deep-equal": { "version": "0.2.2", - "from": "deep-equal@>=0.2.1 <0.3.0", + "from": "https://registry.npmjs.org/deep-equal/-/deep-equal-0.2.2.tgz", "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-0.2.2.tgz" }, "defined": { "version": "0.0.0", - "from": "defined@>=0.0.0 <0.1.0", + "from": "https://registry.npmjs.org/defined/-/defined-0.0.0.tgz", "resolved": "https://registry.npmjs.org/defined/-/defined-0.0.0.tgz" }, "deps-sort": { "version": "1.3.9", - "from": "deps-sort@>=1.3.5 <2.0.0", + "from": "https://registry.npmjs.org/deps-sort/-/deps-sort-1.3.9.tgz", "resolved": "https://registry.npmjs.org/deps-sort/-/deps-sort-1.3.9.tgz", "dependencies": { "JSONStream": { "version": "1.1.1", - "from": "JSONStream@>=1.0.3 <2.0.0", + "from": "https://registry.npmjs.org/JSONStream/-/JSONStream-1.1.1.tgz", "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-1.1.1.tgz", "dependencies": { "jsonparse": { "version": "1.2.0", - "from": "jsonparse@>=1.1.0 <2.0.0", + "from": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.2.0.tgz", "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.2.0.tgz" }, "through": { "version": "2.3.8", - "from": "through@>=2.2.7 <3.0.0", + "from": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz" } } @@ -922,54 +922,54 @@ }, "domain-browser": { "version": "1.1.7", - "from": "domain-browser@>=1.1.0 <1.2.0", + "from": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.1.7.tgz", "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.1.7.tgz" }, "duplexer2": { "version": "0.0.2", - "from": "duplexer2@>=0.0.2 <0.1.0", + "from": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.0.2.tgz", "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.0.2.tgz" }, "events": { "version": "1.0.2", - "from": "events@>=1.0.0 <1.1.0", + "from": "https://registry.npmjs.org/events/-/events-1.0.2.tgz", "resolved": "https://registry.npmjs.org/events/-/events-1.0.2.tgz" }, "glob": { "version": "4.5.3", - "from": "glob@>=4.0.5 <5.0.0", + "from": "https://registry.npmjs.org/glob/-/glob-4.5.3.tgz", "resolved": "https://registry.npmjs.org/glob/-/glob-4.5.3.tgz", "dependencies": { "inflight": { "version": "1.0.4", - "from": "inflight@>=1.0.4 <2.0.0", + "from": "https://registry.npmjs.org/inflight/-/inflight-1.0.4.tgz", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.4.tgz", "dependencies": { "wrappy": { "version": "1.0.1", - "from": "wrappy@>=1.0.0 <2.0.0", + "from": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.1.tgz", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.1.tgz" } } }, "minimatch": { "version": "2.0.10", - "from": "minimatch@>=2.0.1 <3.0.0", + "from": "https://registry.npmjs.org/minimatch/-/minimatch-2.0.10.tgz", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-2.0.10.tgz", "dependencies": { "brace-expansion": { "version": "1.1.4", - "from": "brace-expansion@>=1.0.0 <2.0.0", + "from": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.4.tgz", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.4.tgz", "dependencies": { "balanced-match": { "version": "0.4.1", - "from": "balanced-match@>=0.4.1 <0.5.0", + "from": "https://registry.npmjs.org/balanced-match/-/balanced-match-0.4.1.tgz", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-0.4.1.tgz" }, "concat-map": { "version": "0.0.1", - "from": "concat-map@0.0.1", + "from": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz" } } @@ -978,12 +978,12 @@ }, "once": { "version": "1.3.3", - "from": "once@>=1.3.0 <2.0.0", + "from": "https://registry.npmjs.org/once/-/once-1.3.3.tgz", "resolved": "https://registry.npmjs.org/once/-/once-1.3.3.tgz", "dependencies": { "wrappy": { "version": "1.0.1", - "from": "wrappy@>=1.0.0 <2.0.0", + "from": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.1.tgz", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.1.tgz" } } @@ -992,76 +992,76 @@ }, "http-browserify": { "version": "1.7.0", - "from": "http-browserify@>=1.4.0 <2.0.0", + "from": "https://registry.npmjs.org/http-browserify/-/http-browserify-1.7.0.tgz", "resolved": "https://registry.npmjs.org/http-browserify/-/http-browserify-1.7.0.tgz", "dependencies": { "Base64": { "version": "0.2.1", - "from": "Base64@>=0.2.0 <0.3.0", + "from": "https://registry.npmjs.org/Base64/-/Base64-0.2.1.tgz", "resolved": "https://registry.npmjs.org/Base64/-/Base64-0.2.1.tgz" } } }, "https-browserify": { "version": "0.0.1", - "from": "https-browserify@>=0.0.0 <0.1.0", + "from": "https://registry.npmjs.org/https-browserify/-/https-browserify-0.0.1.tgz", "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-0.0.1.tgz" }, "inherits": { "version": "2.0.1", - "from": "inherits@>=2.0.1 <2.1.0", + "from": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz" }, "insert-module-globals": { "version": "6.6.3", - "from": "insert-module-globals@>=6.1.0 <7.0.0", + "from": "https://registry.npmjs.org/insert-module-globals/-/insert-module-globals-6.6.3.tgz", "resolved": "https://registry.npmjs.org/insert-module-globals/-/insert-module-globals-6.6.3.tgz", "dependencies": { "JSONStream": { "version": "1.1.1", - "from": "JSONStream@>=1.0.3 <2.0.0", + "from": "https://registry.npmjs.org/JSONStream/-/JSONStream-1.1.1.tgz", "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-1.1.1.tgz", "dependencies": { "jsonparse": { "version": "1.2.0", - "from": "jsonparse@>=1.1.0 <2.0.0", + "from": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.2.0.tgz", "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.2.0.tgz" }, "through": { "version": "2.3.8", - "from": "through@>=2.2.7 <3.0.0", + "from": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz" } } }, "combine-source-map": { "version": "0.6.1", - "from": "combine-source-map@>=0.6.1 <0.7.0", + "from": "https://registry.npmjs.org/combine-source-map/-/combine-source-map-0.6.1.tgz", "resolved": "https://registry.npmjs.org/combine-source-map/-/combine-source-map-0.6.1.tgz", "dependencies": { "convert-source-map": { "version": "1.1.3", - "from": "convert-source-map@>=1.1.0 <1.2.0", + "from": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.1.3.tgz", "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.1.3.tgz" }, "inline-source-map": { "version": "0.5.0", - "from": "inline-source-map@>=0.5.0 <0.6.0", + "from": "https://registry.npmjs.org/inline-source-map/-/inline-source-map-0.5.0.tgz", "resolved": "https://registry.npmjs.org/inline-source-map/-/inline-source-map-0.5.0.tgz" }, "lodash.memoize": { "version": "3.0.4", - "from": "lodash.memoize@>=3.0.3 <3.1.0", + "from": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-3.0.4.tgz", "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-3.0.4.tgz" }, "source-map": { "version": "0.4.4", - "from": "source-map@>=0.4.2 <0.5.0", + "from": "https://registry.npmjs.org/source-map/-/source-map-0.4.4.tgz", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.4.4.tgz", "dependencies": { "amdefine": { "version": "1.0.0", - "from": "amdefine@>=0.0.4", + "from": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.0.tgz", "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.0.tgz" } } @@ -1070,22 +1070,22 @@ }, "is-buffer": { "version": "1.1.3", - "from": "is-buffer@>=1.1.0 <2.0.0", + "from": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.3.tgz", "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.3.tgz" }, "lexical-scope": { "version": "1.2.0", - "from": "lexical-scope@>=1.2.0 <2.0.0", + "from": "https://registry.npmjs.org/lexical-scope/-/lexical-scope-1.2.0.tgz", "resolved": "https://registry.npmjs.org/lexical-scope/-/lexical-scope-1.2.0.tgz", "dependencies": { "astw": { "version": "2.0.0", - "from": "astw@>=2.0.0 <3.0.0", + "from": "https://registry.npmjs.org/astw/-/astw-2.0.0.tgz", "resolved": "https://registry.npmjs.org/astw/-/astw-2.0.0.tgz", "dependencies": { "acorn": { "version": "1.2.2", - "from": "acorn@>=1.0.3 <2.0.0", + "from": "https://registry.npmjs.org/acorn/-/acorn-1.2.2.tgz", "resolved": "https://registry.npmjs.org/acorn/-/acorn-1.2.2.tgz" } } @@ -1094,39 +1094,39 @@ }, "process": { "version": "0.11.3", - "from": "process@>=0.11.0 <0.12.0", + "from": "https://registry.npmjs.org/process/-/process-0.11.3.tgz", "resolved": "https://registry.npmjs.org/process/-/process-0.11.3.tgz" }, "xtend": { "version": "4.0.1", - "from": "xtend@>=4.0.0 <5.0.0", + "from": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz" } } }, "isarray": { "version": "0.0.1", - "from": "isarray@0.0.1", + "from": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz" }, "labeled-stream-splicer": { "version": "1.0.2", - "from": "labeled-stream-splicer@>=1.0.0 <2.0.0", + "from": "https://registry.npmjs.org/labeled-stream-splicer/-/labeled-stream-splicer-1.0.2.tgz", "resolved": "https://registry.npmjs.org/labeled-stream-splicer/-/labeled-stream-splicer-1.0.2.tgz", "dependencies": { "stream-splicer": { "version": "1.3.2", - "from": "stream-splicer@>=1.1.0 <2.0.0", + "from": "https://registry.npmjs.org/stream-splicer/-/stream-splicer-1.3.2.tgz", "resolved": "https://registry.npmjs.org/stream-splicer/-/stream-splicer-1.3.2.tgz", "dependencies": { "readable-wrap": { "version": "1.0.0", - "from": "readable-wrap@>=1.0.0 <2.0.0", + "from": "https://registry.npmjs.org/readable-wrap/-/readable-wrap-1.0.0.tgz", "resolved": "https://registry.npmjs.org/readable-wrap/-/readable-wrap-1.0.0.tgz" }, "indexof": { "version": "0.0.1", - "from": "indexof@0.0.1", + "from": "https://registry.npmjs.org/indexof/-/indexof-0.0.1.tgz", "resolved": "https://registry.npmjs.org/indexof/-/indexof-0.0.1.tgz" } } @@ -1135,85 +1135,85 @@ }, "module-deps": { "version": "3.9.1", - "from": "module-deps@>=3.6.3 <4.0.0", + "from": "https://registry.npmjs.org/module-deps/-/module-deps-3.9.1.tgz", "resolved": "https://registry.npmjs.org/module-deps/-/module-deps-3.9.1.tgz", "dependencies": { "JSONStream": { "version": "1.1.1", - "from": "JSONStream@>=1.0.3 <2.0.0", + "from": "https://registry.npmjs.org/JSONStream/-/JSONStream-1.1.1.tgz", "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-1.1.1.tgz", "dependencies": { "jsonparse": { "version": "1.2.0", - "from": "jsonparse@>=1.1.0 <2.0.0", + "from": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.2.0.tgz", "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.2.0.tgz" }, "through": { "version": "2.3.8", - "from": "through@>=2.2.7 <3.0.0", + "from": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz" } } }, "defined": { "version": "1.0.0", - "from": "defined@>=1.0.0 <2.0.0", + "from": "https://registry.npmjs.org/defined/-/defined-1.0.0.tgz", "resolved": "https://registry.npmjs.org/defined/-/defined-1.0.0.tgz" }, "detective": { "version": "4.3.1", - "from": "detective@>=4.0.0 <5.0.0", + "from": "https://registry.npmjs.org/detective/-/detective-4.3.1.tgz", "resolved": "https://registry.npmjs.org/detective/-/detective-4.3.1.tgz", "dependencies": { "acorn": { "version": "1.2.2", - "from": "acorn@>=1.0.3 <2.0.0", + "from": "https://registry.npmjs.org/acorn/-/acorn-1.2.2.tgz", "resolved": "https://registry.npmjs.org/acorn/-/acorn-1.2.2.tgz" } } }, "parents": { "version": "1.0.1", - "from": "parents@>=1.0.0 <2.0.0", + "from": "https://registry.npmjs.org/parents/-/parents-1.0.1.tgz", "resolved": "https://registry.npmjs.org/parents/-/parents-1.0.1.tgz", "dependencies": { "path-platform": { "version": "0.11.15", - "from": "path-platform@>=0.11.15 <0.12.0", + "from": "https://registry.npmjs.org/path-platform/-/path-platform-0.11.15.tgz", "resolved": "https://registry.npmjs.org/path-platform/-/path-platform-0.11.15.tgz" } } }, "resolve": { "version": "1.1.7", - "from": "resolve@>=1.1.3 <2.0.0", + "from": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz" }, "stream-combiner2": { "version": "1.0.2", - "from": "stream-combiner2@>=1.0.0 <1.1.0", + "from": "https://registry.npmjs.org/stream-combiner2/-/stream-combiner2-1.0.2.tgz", "resolved": "https://registry.npmjs.org/stream-combiner2/-/stream-combiner2-1.0.2.tgz", "dependencies": { "through2": { "version": "0.5.1", - "from": "through2@>=0.5.1 <0.6.0", + "from": "https://registry.npmjs.org/through2/-/through2-0.5.1.tgz", "resolved": "https://registry.npmjs.org/through2/-/through2-0.5.1.tgz", "dependencies": { "readable-stream": { "version": "1.0.34", - "from": "readable-stream@>=1.0.17 <1.1.0", + "from": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", "dependencies": { "core-util-is": { "version": "1.0.2", - "from": "core-util-is@>=1.0.0 <1.1.0", + "from": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz" } } }, "xtend": { "version": "3.0.0", - "from": "xtend@>=3.0.0 <3.1.0", + "from": "https://registry.npmjs.org/xtend/-/xtend-3.0.0.tgz", "resolved": "https://registry.npmjs.org/xtend/-/xtend-3.0.0.tgz" } } @@ -1222,207 +1222,207 @@ }, "xtend": { "version": "4.0.1", - "from": "xtend@>=4.0.0 <5.0.0", + "from": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz" } } }, "os-browserify": { "version": "0.1.2", - "from": "os-browserify@>=0.1.1 <0.2.0", + "from": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.1.2.tgz", "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.1.2.tgz" }, "parents": { "version": "0.0.3", - "from": "parents@>=0.0.1 <0.1.0", + "from": "https://registry.npmjs.org/parents/-/parents-0.0.3.tgz", "resolved": "https://registry.npmjs.org/parents/-/parents-0.0.3.tgz", "dependencies": { "path-platform": { "version": "0.0.1", - "from": "path-platform@>=0.0.1 <0.0.2", + "from": "https://registry.npmjs.org/path-platform/-/path-platform-0.0.1.tgz", "resolved": "https://registry.npmjs.org/path-platform/-/path-platform-0.0.1.tgz" } } }, "path-browserify": { "version": "0.0.0", - "from": "path-browserify@>=0.0.0 <0.1.0", + "from": "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.0.tgz", "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.0.tgz" }, "process": { "version": "0.8.0", - "from": "process@>=0.8.0 <0.9.0", + "from": "https://registry.npmjs.org/process/-/process-0.8.0.tgz", "resolved": "https://registry.npmjs.org/process/-/process-0.8.0.tgz" }, "punycode": { "version": "1.2.4", - "from": "punycode@>=1.2.3 <1.3.0", + "from": "https://registry.npmjs.org/punycode/-/punycode-1.2.4.tgz", "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.2.4.tgz" }, "querystring-es3": { "version": "0.2.1", - "from": "querystring-es3@>=0.2.0 <0.3.0", + "from": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz", "resolved": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz" }, "readable-stream": { "version": "1.1.14", - "from": "readable-stream@>=1.0.33-1 <2.0.0", + "from": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", "dependencies": { "core-util-is": { "version": "1.0.2", - "from": "core-util-is@>=1.0.0 <1.1.0", + "from": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz" } } }, "resolve": { "version": "0.7.4", - "from": "resolve@>=0.7.1 <0.8.0", + "from": "https://registry.npmjs.org/resolve/-/resolve-0.7.4.tgz", "resolved": "https://registry.npmjs.org/resolve/-/resolve-0.7.4.tgz" }, "shallow-copy": { "version": "0.0.1", - "from": "shallow-copy@0.0.1", + "from": "https://registry.npmjs.org/shallow-copy/-/shallow-copy-0.0.1.tgz", "resolved": "https://registry.npmjs.org/shallow-copy/-/shallow-copy-0.0.1.tgz" }, "shasum": { "version": "1.0.2", - "from": "shasum@>=1.0.0 <2.0.0", + "from": "https://registry.npmjs.org/shasum/-/shasum-1.0.2.tgz", "resolved": "https://registry.npmjs.org/shasum/-/shasum-1.0.2.tgz", "dependencies": { "json-stable-stringify": { "version": "0.0.1", - "from": "json-stable-stringify@>=0.0.0 <0.1.0", + "from": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-0.0.1.tgz", "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-0.0.1.tgz", "dependencies": { "jsonify": { "version": "0.0.0", - "from": "jsonify@>=0.0.0 <0.1.0", + "from": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz", "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz" } } }, "sha.js": { "version": "2.4.5", - "from": "sha.js@>=2.4.4 <2.5.0", + "from": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.5.tgz", "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.5.tgz" } } }, "shell-quote": { "version": "0.0.1", - "from": "shell-quote@>=0.0.1 <0.1.0", + "from": "https://registry.npmjs.org/shell-quote/-/shell-quote-0.0.1.tgz", "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-0.0.1.tgz" }, "stream-browserify": { "version": "1.0.0", - "from": "stream-browserify@>=1.0.0 <2.0.0", + "from": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-1.0.0.tgz", "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-1.0.0.tgz" }, "string_decoder": { "version": "0.10.31", - "from": "string_decoder@>=0.10.0 <0.11.0", + "from": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz" }, "subarg": { "version": "1.0.0", - "from": "subarg@>=1.0.0 <2.0.0", + "from": "https://registry.npmjs.org/subarg/-/subarg-1.0.0.tgz", "resolved": "https://registry.npmjs.org/subarg/-/subarg-1.0.0.tgz" }, "syntax-error": { "version": "1.1.6", - "from": "syntax-error@>=1.1.1 <2.0.0", + "from": "https://registry.npmjs.org/syntax-error/-/syntax-error-1.1.6.tgz", "resolved": "https://registry.npmjs.org/syntax-error/-/syntax-error-1.1.6.tgz", "dependencies": { "acorn": { "version": "2.7.0", - "from": "acorn@>=2.7.0 <3.0.0", + "from": "https://registry.npmjs.org/acorn/-/acorn-2.7.0.tgz", "resolved": "https://registry.npmjs.org/acorn/-/acorn-2.7.0.tgz" } } }, "through2": { "version": "1.1.1", - "from": "through2@>=1.0.0 <2.0.0", + "from": "https://registry.npmjs.org/through2/-/through2-1.1.1.tgz", "resolved": "https://registry.npmjs.org/through2/-/through2-1.1.1.tgz", "dependencies": { "xtend": { "version": "4.0.1", - "from": "xtend@>=4.0.0 <4.1.0-0", + "from": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz" } } }, "timers-browserify": { "version": "1.4.2", - "from": "timers-browserify@>=1.0.1 <2.0.0", + "from": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-1.4.2.tgz", "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-1.4.2.tgz", "dependencies": { "process": { "version": "0.11.3", - "from": "process@>=0.11.0 <0.12.0", + "from": "https://registry.npmjs.org/process/-/process-0.11.3.tgz", "resolved": "https://registry.npmjs.org/process/-/process-0.11.3.tgz" } } }, "tty-browserify": { "version": "0.0.0", - "from": "tty-browserify@>=0.0.0 <0.1.0", + "from": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.0.tgz", "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.0.tgz" }, "umd": { "version": "2.1.0", - "from": "umd@>=2.1.0 <2.2.0", + "from": "https://registry.npmjs.org/umd/-/umd-2.1.0.tgz", "resolved": "https://registry.npmjs.org/umd/-/umd-2.1.0.tgz", "dependencies": { "rfile": { "version": "1.0.0", - "from": "rfile@>=1.0.0 <1.1.0", + "from": "https://registry.npmjs.org/rfile/-/rfile-1.0.0.tgz", "resolved": "https://registry.npmjs.org/rfile/-/rfile-1.0.0.tgz", "dependencies": { "callsite": { "version": "1.0.0", - "from": "callsite@>=1.0.0 <1.1.0", + "from": "https://registry.npmjs.org/callsite/-/callsite-1.0.0.tgz", "resolved": "https://registry.npmjs.org/callsite/-/callsite-1.0.0.tgz" }, "resolve": { "version": "0.3.1", - "from": "resolve@>=0.3.0 <0.4.0", + "from": "https://registry.npmjs.org/resolve/-/resolve-0.3.1.tgz", "resolved": "https://registry.npmjs.org/resolve/-/resolve-0.3.1.tgz" } } }, "ruglify": { "version": "1.0.0", - "from": "ruglify@>=1.0.0 <1.1.0", + "from": "https://registry.npmjs.org/ruglify/-/ruglify-1.0.0.tgz", "resolved": "https://registry.npmjs.org/ruglify/-/ruglify-1.0.0.tgz", "dependencies": { "uglify-js": { "version": "2.2.5", - "from": "uglify-js@>=2.2.0 <2.3.0", + "from": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.2.5.tgz", "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.2.5.tgz", "dependencies": { "source-map": { "version": "0.1.43", - "from": "source-map@>=0.1.7 <0.2.0", + "from": "https://registry.npmjs.org/source-map/-/source-map-0.1.43.tgz", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.1.43.tgz", "dependencies": { "amdefine": { "version": "1.0.0", - "from": "amdefine@>=0.0.4", + "from": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.0.tgz", "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.0.tgz" } } }, "optimist": { "version": "0.3.7", - "from": "optimist@>=0.3.5 <0.4.0", + "from": "https://registry.npmjs.org/optimist/-/optimist-0.3.7.tgz", "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.3.7.tgz", "dependencies": { "wordwrap": { "version": "0.0.3", - "from": "wordwrap@>=0.0.2 <0.1.0", + "from": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz", "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz" } } @@ -1433,59 +1433,59 @@ }, "through": { "version": "2.3.8", - "from": "through@>=2.3.4 <2.4.0", + "from": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz" }, "uglify-js": { "version": "2.4.24", - "from": "uglify-js@>=2.4.0 <2.5.0", + "from": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.4.24.tgz", "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.4.24.tgz", "dependencies": { "async": { "version": "0.2.10", - "from": "async@>=0.2.6 <0.3.0", + "from": "https://registry.npmjs.org/async/-/async-0.2.10.tgz", "resolved": "https://registry.npmjs.org/async/-/async-0.2.10.tgz" }, "source-map": { "version": "0.1.34", - "from": "source-map@0.1.34", + "from": "https://registry.npmjs.org/source-map/-/source-map-0.1.34.tgz", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.1.34.tgz", "dependencies": { "amdefine": { "version": "1.0.0", - "from": "amdefine@>=0.0.4", + "from": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.0.tgz", "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.0.tgz" } } }, "uglify-to-browserify": { "version": "1.0.2", - "from": "uglify-to-browserify@>=1.0.0 <1.1.0", + "from": "https://registry.npmjs.org/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz", "resolved": "https://registry.npmjs.org/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz" }, "yargs": { "version": "3.5.4", - "from": "yargs@>=3.5.4 <3.6.0", + "from": "https://registry.npmjs.org/yargs/-/yargs-3.5.4.tgz", "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.5.4.tgz", "dependencies": { "camelcase": { "version": "1.2.1", - "from": "camelcase@>=1.0.2 <2.0.0", + "from": "https://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz", "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz" }, "decamelize": { "version": "1.2.0", - "from": "decamelize@>=1.0.0 <2.0.0", + "from": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz" }, "window-size": { "version": "0.1.0", - "from": "window-size@0.1.0", + "from": "https://registry.npmjs.org/window-size/-/window-size-0.1.0.tgz", "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.1.0.tgz" }, "wordwrap": { "version": "0.0.2", - "from": "wordwrap@0.0.2", + "from": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz", "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz" } } @@ -1496,41 +1496,41 @@ }, "url": { "version": "0.10.3", - "from": "url@>=0.10.1 <0.11.0", + "from": "https://registry.npmjs.org/url/-/url-0.10.3.tgz", "resolved": "https://registry.npmjs.org/url/-/url-0.10.3.tgz", "dependencies": { "punycode": { "version": "1.3.2", - "from": "punycode@1.3.2", + "from": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz" }, "querystring": { "version": "0.2.0", - "from": "querystring@0.2.0", + "from": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz" } } }, "util": { "version": "0.10.3", - "from": "util@>=0.10.1 <0.11.0", + "from": "https://registry.npmjs.org/util/-/util-0.10.3.tgz", "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz" }, "vm-browserify": { "version": "0.0.4", - "from": "vm-browserify@>=0.0.1 <0.1.0", + "from": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-0.0.4.tgz", "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-0.0.4.tgz", "dependencies": { "indexof": { "version": "0.0.1", - "from": "indexof@0.0.1", + "from": "https://registry.npmjs.org/indexof/-/indexof-0.0.1.tgz", "resolved": "https://registry.npmjs.org/indexof/-/indexof-0.0.1.tgz" } } }, "xtend": { "version": "3.0.0", - "from": "xtend@>=3.0.0 <4.0.0", + "from": "https://registry.npmjs.org/xtend/-/xtend-3.0.0.tgz", "resolved": "https://registry.npmjs.org/xtend/-/xtend-3.0.0.tgz" } } @@ -1539,143 +1539,143 @@ }, "benchmark": { "version": "1.0.0", - "from": "benchmark@>=1.0.0 <2.0.0", + "from": "https://registry.npmjs.org/benchmark/-/benchmark-1.0.0.tgz", "resolved": "https://registry.npmjs.org/benchmark/-/benchmark-1.0.0.tgz" }, "bower": { "version": "1.3.12", - "from": "bower@>=1.3.9 <1.4.0", + "from": "https://registry.npmjs.org/bower/-/bower-1.3.12.tgz", "resolved": "https://registry.npmjs.org/bower/-/bower-1.3.12.tgz", "dependencies": { "abbrev": { "version": "1.0.7", - "from": "abbrev@>=1.0.4 <1.1.0", + "from": "https://registry.npmjs.org/abbrev/-/abbrev-1.0.7.tgz", "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.0.7.tgz" }, "archy": { "version": "0.0.2", - "from": "archy@0.0.2", + "from": "https://registry.npmjs.org/archy/-/archy-0.0.2.tgz", "resolved": "https://registry.npmjs.org/archy/-/archy-0.0.2.tgz" }, "bower-config": { "version": "0.5.2", - "from": "bower-config@>=0.5.2 <0.6.0", + "from": "https://registry.npmjs.org/bower-config/-/bower-config-0.5.2.tgz", "resolved": "https://registry.npmjs.org/bower-config/-/bower-config-0.5.2.tgz", "dependencies": { "graceful-fs": { "version": "2.0.3", - "from": "graceful-fs@>=2.0.0 <2.1.0", + "from": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-2.0.3.tgz", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-2.0.3.tgz" }, "optimist": { "version": "0.6.1", - "from": "optimist@>=0.6.0 <0.7.0", + "from": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz", "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz", "dependencies": { "wordwrap": { "version": "0.0.3", - "from": "wordwrap@>=0.0.2 <0.1.0", + "from": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz", "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz" }, "minimist": { "version": "0.0.10", - "from": "minimist@>=0.0.1 <0.1.0", + "from": "https://registry.npmjs.org/minimist/-/minimist-0.0.10.tgz", "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.10.tgz" } } }, "osenv": { "version": "0.0.3", - "from": "osenv@0.0.3", + "from": "https://registry.npmjs.org/osenv/-/osenv-0.0.3.tgz", "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.0.3.tgz" } } }, "bower-endpoint-parser": { "version": "0.2.2", - "from": "bower-endpoint-parser@>=0.2.2 <0.3.0", + "from": "https://registry.npmjs.org/bower-endpoint-parser/-/bower-endpoint-parser-0.2.2.tgz", "resolved": "https://registry.npmjs.org/bower-endpoint-parser/-/bower-endpoint-parser-0.2.2.tgz" }, "bower-json": { "version": "0.4.0", - "from": "bower-json@>=0.4.0 <0.5.0", + "from": "https://registry.npmjs.org/bower-json/-/bower-json-0.4.0.tgz", "resolved": "https://registry.npmjs.org/bower-json/-/bower-json-0.4.0.tgz", "dependencies": { "deep-extend": { "version": "0.2.11", - "from": "deep-extend@>=0.2.5 <0.3.0", + "from": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.2.11.tgz", "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.2.11.tgz" }, "graceful-fs": { "version": "2.0.3", - "from": "graceful-fs@>=2.0.0 <2.1.0", + "from": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-2.0.3.tgz", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-2.0.3.tgz" }, "intersect": { "version": "0.0.3", - "from": "intersect@>=0.0.3 <0.1.0", + "from": "https://registry.npmjs.org/intersect/-/intersect-0.0.3.tgz", "resolved": "https://registry.npmjs.org/intersect/-/intersect-0.0.3.tgz" } } }, "bower-logger": { "version": "0.2.2", - "from": "bower-logger@>=0.2.2 <0.3.0", + "from": "https://registry.npmjs.org/bower-logger/-/bower-logger-0.2.2.tgz", "resolved": "https://registry.npmjs.org/bower-logger/-/bower-logger-0.2.2.tgz" }, "bower-registry-client": { "version": "0.2.4", - "from": "bower-registry-client@>=0.2.0 <0.3.0", + "from": "https://registry.npmjs.org/bower-registry-client/-/bower-registry-client-0.2.4.tgz", "resolved": "https://registry.npmjs.org/bower-registry-client/-/bower-registry-client-0.2.4.tgz", "dependencies": { "async": { "version": "0.2.10", - "from": "async@>=0.2.8 <0.3.0", + "from": "https://registry.npmjs.org/async/-/async-0.2.10.tgz", "resolved": "https://registry.npmjs.org/async/-/async-0.2.10.tgz" }, "graceful-fs": { "version": "2.0.3", - "from": "graceful-fs@>=2.0.0 <2.1.0", + "from": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-2.0.3.tgz", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-2.0.3.tgz" }, "lru-cache": { "version": "2.3.1", - "from": "lru-cache@>=2.3.0 <2.4.0", + "from": "https://registry.npmjs.org/lru-cache/-/lru-cache-2.3.1.tgz", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-2.3.1.tgz" }, "request": { "version": "2.51.0", - "from": "request@>=2.51.0 <2.52.0", + "from": "https://registry.npmjs.org/request/-/request-2.51.0.tgz", "resolved": "https://registry.npmjs.org/request/-/request-2.51.0.tgz", "dependencies": { "bl": { "version": "0.9.5", - "from": "bl@>=0.9.0 <0.10.0", + "from": "https://registry.npmjs.org/bl/-/bl-0.9.5.tgz", "resolved": "https://registry.npmjs.org/bl/-/bl-0.9.5.tgz", "dependencies": { "readable-stream": { "version": "1.0.34", - "from": "readable-stream@>=1.0.26 <1.1.0", + "from": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", "dependencies": { "core-util-is": { "version": "1.0.2", - "from": "core-util-is@>=1.0.0 <1.1.0", + "from": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz" }, "isarray": { "version": "0.0.1", - "from": "isarray@0.0.1", + "from": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz" }, "string_decoder": { "version": "0.10.31", - "from": "string_decoder@>=0.10.0 <0.11.0", + "from": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz" }, "inherits": { "version": "2.0.1", - "from": "inherits@>=2.0.1 <2.1.0", + "from": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz" } } @@ -1684,32 +1684,32 @@ }, "caseless": { "version": "0.8.0", - "from": "caseless@>=0.8.0 <0.9.0", + "from": "https://registry.npmjs.org/caseless/-/caseless-0.8.0.tgz", "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.8.0.tgz" }, "forever-agent": { "version": "0.5.2", - "from": "forever-agent@>=0.5.0 <0.6.0", + "from": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.5.2.tgz", "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.5.2.tgz" }, "form-data": { "version": "0.2.0", - "from": "form-data@>=0.2.0 <0.3.0", + "from": "https://registry.npmjs.org/form-data/-/form-data-0.2.0.tgz", "resolved": "https://registry.npmjs.org/form-data/-/form-data-0.2.0.tgz", "dependencies": { "async": { "version": "0.9.2", - "from": "async@>=0.9.0 <0.10.0", + "from": "https://registry.npmjs.org/async/-/async-0.9.2.tgz", "resolved": "https://registry.npmjs.org/async/-/async-0.9.2.tgz" }, "mime-types": { "version": "2.0.14", - "from": "mime-types@>=2.0.3 <2.1.0", + "from": "https://registry.npmjs.org/mime-types/-/mime-types-2.0.14.tgz", "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.0.14.tgz", "dependencies": { "mime-db": { "version": "1.12.0", - "from": "mime-db@>=1.12.0 <1.13.0", + "from": "https://registry.npmjs.org/mime-db/-/mime-db-1.12.0.tgz", "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.12.0.tgz" } } @@ -1718,106 +1718,106 @@ }, "json-stringify-safe": { "version": "5.0.1", - "from": "json-stringify-safe@>=5.0.0 <5.1.0", + "from": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz" }, "mime-types": { "version": "1.0.2", - "from": "mime-types@>=1.0.1 <1.1.0", + "from": "https://registry.npmjs.org/mime-types/-/mime-types-1.0.2.tgz", "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-1.0.2.tgz" }, "node-uuid": { "version": "1.4.7", - "from": "node-uuid@>=1.4.0 <1.5.0", + "from": "https://registry.npmjs.org/node-uuid/-/node-uuid-1.4.7.tgz", "resolved": "https://registry.npmjs.org/node-uuid/-/node-uuid-1.4.7.tgz" }, "qs": { "version": "2.3.3", - "from": "qs@>=2.3.1 <2.4.0", + "from": "https://registry.npmjs.org/qs/-/qs-2.3.3.tgz", "resolved": "https://registry.npmjs.org/qs/-/qs-2.3.3.tgz" }, "tunnel-agent": { "version": "0.4.3", - "from": "tunnel-agent@>=0.4.0 <0.5.0", + "from": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.4.3.tgz", "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.4.3.tgz" }, "tough-cookie": { "version": "2.2.2", - "from": "tough-cookie@>=0.12.0", + "from": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.2.2.tgz", "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.2.2.tgz" }, "http-signature": { "version": "0.10.1", - "from": "http-signature@>=0.10.0 <0.11.0", + "from": "https://registry.npmjs.org/http-signature/-/http-signature-0.10.1.tgz", "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-0.10.1.tgz", "dependencies": { "assert-plus": { "version": "0.1.5", - "from": "assert-plus@>=0.1.5 <0.2.0", + "from": "https://registry.npmjs.org/assert-plus/-/assert-plus-0.1.5.tgz", "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-0.1.5.tgz" }, "asn1": { "version": "0.1.11", - "from": "asn1@0.1.11", + "from": "https://registry.npmjs.org/asn1/-/asn1-0.1.11.tgz", "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.1.11.tgz" }, "ctype": { "version": "0.5.3", - "from": "ctype@0.5.3", + "from": "https://registry.npmjs.org/ctype/-/ctype-0.5.3.tgz", "resolved": "https://registry.npmjs.org/ctype/-/ctype-0.5.3.tgz" } } }, "oauth-sign": { "version": "0.5.0", - "from": "oauth-sign@>=0.5.0 <0.6.0", + "from": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.5.0.tgz", "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.5.0.tgz" }, "hawk": { "version": "1.1.1", - "from": "hawk@1.1.1", + "from": "https://registry.npmjs.org/hawk/-/hawk-1.1.1.tgz", "resolved": "https://registry.npmjs.org/hawk/-/hawk-1.1.1.tgz", "dependencies": { "hoek": { "version": "0.9.1", - "from": "hoek@>=0.9.0 <0.10.0", + "from": "https://registry.npmjs.org/hoek/-/hoek-0.9.1.tgz", "resolved": "https://registry.npmjs.org/hoek/-/hoek-0.9.1.tgz" }, "boom": { "version": "0.4.2", - "from": "boom@>=0.4.0 <0.5.0", + "from": "https://registry.npmjs.org/boom/-/boom-0.4.2.tgz", "resolved": "https://registry.npmjs.org/boom/-/boom-0.4.2.tgz" }, "cryptiles": { "version": "0.2.2", - "from": "cryptiles@>=0.2.0 <0.3.0", + "from": "https://registry.npmjs.org/cryptiles/-/cryptiles-0.2.2.tgz", "resolved": "https://registry.npmjs.org/cryptiles/-/cryptiles-0.2.2.tgz" }, "sntp": { "version": "0.2.4", - "from": "sntp@>=0.2.0 <0.3.0", + "from": "https://registry.npmjs.org/sntp/-/sntp-0.2.4.tgz", "resolved": "https://registry.npmjs.org/sntp/-/sntp-0.2.4.tgz" } } }, "aws-sign2": { "version": "0.5.0", - "from": "aws-sign2@>=0.5.0 <0.6.0", + "from": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.5.0.tgz", "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.5.0.tgz" }, "stringstream": { "version": "0.0.5", - "from": "stringstream@>=0.0.4 <0.1.0", + "from": "https://registry.npmjs.org/stringstream/-/stringstream-0.0.5.tgz", "resolved": "https://registry.npmjs.org/stringstream/-/stringstream-0.0.5.tgz" }, "combined-stream": { "version": "0.0.7", - "from": "combined-stream@>=0.0.5 <0.1.0", + "from": "https://registry.npmjs.org/combined-stream/-/combined-stream-0.0.7.tgz", "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-0.0.7.tgz", "dependencies": { "delayed-stream": { "version": "0.0.5", - "from": "delayed-stream@0.0.5", + "from": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-0.0.5.tgz", "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-0.0.5.tgz" } } @@ -1826,29 +1826,29 @@ }, "request-replay": { "version": "0.2.0", - "from": "request-replay@>=0.2.0 <0.3.0", + "from": "https://registry.npmjs.org/request-replay/-/request-replay-0.2.0.tgz", "resolved": "https://registry.npmjs.org/request-replay/-/request-replay-0.2.0.tgz" }, "mkdirp": { "version": "0.3.5", - "from": "mkdirp@>=0.3.5 <0.4.0", + "from": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.3.5.tgz", "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.3.5.tgz" } } }, "cardinal": { "version": "0.4.0", - "from": "cardinal@0.4.0", + "from": "https://registry.npmjs.org/cardinal/-/cardinal-0.4.0.tgz", "resolved": "https://registry.npmjs.org/cardinal/-/cardinal-0.4.0.tgz", "dependencies": { "redeyed": { "version": "0.4.4", - "from": "redeyed@>=0.4.0 <0.5.0", + "from": "https://registry.npmjs.org/redeyed/-/redeyed-0.4.4.tgz", "resolved": "https://registry.npmjs.org/redeyed/-/redeyed-0.4.4.tgz", "dependencies": { "esprima": { "version": "1.0.4", - "from": "esprima@>=1.0.4 <1.1.0", + "from": "https://registry.npmjs.org/esprima/-/esprima-1.0.4.tgz", "resolved": "https://registry.npmjs.org/esprima/-/esprima-1.0.4.tgz" } } @@ -1857,180 +1857,180 @@ }, "chalk": { "version": "0.5.0", - "from": "chalk@0.5.0", + "from": "https://registry.npmjs.org/chalk/-/chalk-0.5.0.tgz", "resolved": "https://registry.npmjs.org/chalk/-/chalk-0.5.0.tgz", "dependencies": { "ansi-styles": { "version": "1.1.0", - "from": "ansi-styles@>=1.1.0 <2.0.0", + "from": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-1.1.0.tgz", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-1.1.0.tgz" }, "escape-string-regexp": { "version": "1.0.5", - "from": "escape-string-regexp@>=1.0.0 <2.0.0", + "from": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz" }, "has-ansi": { "version": "0.1.0", - "from": "has-ansi@>=0.1.0 <0.2.0", + "from": "https://registry.npmjs.org/has-ansi/-/has-ansi-0.1.0.tgz", "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-0.1.0.tgz", "dependencies": { "ansi-regex": { "version": "0.2.1", - "from": "ansi-regex@>=0.2.1 <0.3.0", + "from": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-0.2.1.tgz", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-0.2.1.tgz" } } }, "strip-ansi": { "version": "0.3.0", - "from": "strip-ansi@>=0.3.0 <0.4.0", + "from": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-0.3.0.tgz", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-0.3.0.tgz", "dependencies": { "ansi-regex": { "version": "0.2.1", - "from": "ansi-regex@>=0.2.1 <0.3.0", + "from": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-0.2.1.tgz", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-0.2.1.tgz" } } }, "supports-color": { "version": "0.2.0", - "from": "supports-color@>=0.2.0 <0.3.0", + "from": "https://registry.npmjs.org/supports-color/-/supports-color-0.2.0.tgz", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-0.2.0.tgz" } } }, "chmodr": { "version": "0.1.0", - "from": "chmodr@0.1.0", + "from": "https://registry.npmjs.org/chmodr/-/chmodr-0.1.0.tgz", "resolved": "https://registry.npmjs.org/chmodr/-/chmodr-0.1.0.tgz" }, "decompress-zip": { "version": "0.0.8", - "from": "decompress-zip@0.0.8", + "from": "https://registry.npmjs.org/decompress-zip/-/decompress-zip-0.0.8.tgz", "resolved": "https://registry.npmjs.org/decompress-zip/-/decompress-zip-0.0.8.tgz", "dependencies": { "mkpath": { "version": "0.1.0", - "from": "mkpath@>=0.1.0 <0.2.0", + "from": "https://registry.npmjs.org/mkpath/-/mkpath-0.1.0.tgz", "resolved": "https://registry.npmjs.org/mkpath/-/mkpath-0.1.0.tgz" }, "binary": { "version": "0.3.0", - "from": "binary@>=0.3.0 <0.4.0", + "from": "https://registry.npmjs.org/binary/-/binary-0.3.0.tgz", "resolved": "https://registry.npmjs.org/binary/-/binary-0.3.0.tgz", "dependencies": { "chainsaw": { "version": "0.1.0", - "from": "chainsaw@>=0.1.0 <0.2.0", + "from": "https://registry.npmjs.org/chainsaw/-/chainsaw-0.1.0.tgz", "resolved": "https://registry.npmjs.org/chainsaw/-/chainsaw-0.1.0.tgz", "dependencies": { "traverse": { "version": "0.3.9", - "from": "traverse@>=0.3.0 <0.4.0", + "from": "https://registry.npmjs.org/traverse/-/traverse-0.3.9.tgz", "resolved": "https://registry.npmjs.org/traverse/-/traverse-0.3.9.tgz" } } }, "buffers": { "version": "0.1.1", - "from": "buffers@>=0.1.1 <0.2.0", + "from": "https://registry.npmjs.org/buffers/-/buffers-0.1.1.tgz", "resolved": "https://registry.npmjs.org/buffers/-/buffers-0.1.1.tgz" } } }, "touch": { "version": "0.0.2", - "from": "touch@0.0.2", + "from": "https://registry.npmjs.org/touch/-/touch-0.0.2.tgz", "resolved": "https://registry.npmjs.org/touch/-/touch-0.0.2.tgz", "dependencies": { "nopt": { "version": "1.0.10", - "from": "nopt@>=1.0.10 <1.1.0", + "from": "https://registry.npmjs.org/nopt/-/nopt-1.0.10.tgz", "resolved": "https://registry.npmjs.org/nopt/-/nopt-1.0.10.tgz" } } }, "readable-stream": { "version": "1.1.14", - "from": "readable-stream@>=1.1.8 <1.2.0", + "from": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", "dependencies": { "core-util-is": { "version": "1.0.2", - "from": "core-util-is@>=1.0.0 <1.1.0", + "from": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz" }, "isarray": { "version": "0.0.1", - "from": "isarray@0.0.1", + "from": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz" }, "string_decoder": { "version": "0.10.31", - "from": "string_decoder@>=0.10.0 <0.11.0", + "from": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz" }, "inherits": { "version": "2.0.1", - "from": "inherits@>=2.0.1 <2.1.0", + "from": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz" } } }, "nopt": { "version": "2.2.1", - "from": "nopt@>=2.2.0 <2.3.0", + "from": "https://registry.npmjs.org/nopt/-/nopt-2.2.1.tgz", "resolved": "https://registry.npmjs.org/nopt/-/nopt-2.2.1.tgz" } } }, "fstream": { "version": "1.0.8", - "from": "fstream@>=1.0.2 <1.1.0", + "from": "https://registry.npmjs.org/fstream/-/fstream-1.0.8.tgz", "resolved": "https://registry.npmjs.org/fstream/-/fstream-1.0.8.tgz", "dependencies": { "graceful-fs": { "version": "4.1.4", - "from": "graceful-fs@>=4.1.2 <5.0.0", + "from": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.4.tgz", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.4.tgz" }, "inherits": { "version": "2.0.1", - "from": "inherits@>=2.0.0 <2.1.0", + "from": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz" } } }, "fstream-ignore": { "version": "1.0.4", - "from": "fstream-ignore@>=1.0.1 <1.1.0", + "from": "https://registry.npmjs.org/fstream-ignore/-/fstream-ignore-1.0.4.tgz", "resolved": "https://registry.npmjs.org/fstream-ignore/-/fstream-ignore-1.0.4.tgz", "dependencies": { "inherits": { "version": "2.0.1", - "from": "inherits@>=2.0.0 <3.0.0", + "from": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz" }, "minimatch": { "version": "3.0.0", - "from": "minimatch@>=2.0.0 <3.0.0||>=3.0.0 <4.0.0", + "from": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.0.tgz", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.0.tgz", "dependencies": { "brace-expansion": { "version": "1.1.4", - "from": "brace-expansion@>=1.0.0 <2.0.0", + "from": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.4.tgz", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.4.tgz", "dependencies": { "balanced-match": { "version": "0.4.1", - "from": "balanced-match@>=0.4.1 <0.5.0", + "from": "https://registry.npmjs.org/balanced-match/-/balanced-match-0.4.1.tgz", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-0.4.1.tgz" }, "concat-map": { "version": "0.0.1", - "from": "concat-map@0.0.1", + "from": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz" } } @@ -2041,34 +2041,34 @@ }, "glob": { "version": "4.0.6", - "from": "glob@>=4.0.2 <4.1.0", + "from": "https://registry.npmjs.org/glob/-/glob-4.0.6.tgz", "resolved": "https://registry.npmjs.org/glob/-/glob-4.0.6.tgz", "dependencies": { "inherits": { "version": "2.0.1", - "from": "inherits@>=2.0.0 <3.0.0", + "from": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz" }, "minimatch": { "version": "1.0.0", - "from": "minimatch@>=1.0.0 <2.0.0", + "from": "https://registry.npmjs.org/minimatch/-/minimatch-1.0.0.tgz", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-1.0.0.tgz", "dependencies": { "sigmund": { "version": "1.0.1", - "from": "sigmund@>=1.0.0 <1.1.0", + "from": "https://registry.npmjs.org/sigmund/-/sigmund-1.0.1.tgz", "resolved": "https://registry.npmjs.org/sigmund/-/sigmund-1.0.1.tgz" } } }, "once": { "version": "1.3.3", - "from": "once@>=1.3.0 <2.0.0", + "from": "https://registry.npmjs.org/once/-/once-1.3.3.tgz", "resolved": "https://registry.npmjs.org/once/-/once-1.3.3.tgz", "dependencies": { "wrappy": { "version": "1.0.1", - "from": "wrappy@>=1.0.0 <2.0.0", + "from": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.1.tgz", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.1.tgz" } } @@ -2077,44 +2077,44 @@ }, "graceful-fs": { "version": "3.0.8", - "from": "graceful-fs@>=3.0.1 <3.1.0", + "from": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-3.0.8.tgz", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-3.0.8.tgz" }, "handlebars": { "version": "2.0.0", - "from": "handlebars@>=2.0.0 <2.1.0", + "from": "https://registry.npmjs.org/handlebars/-/handlebars-2.0.0.tgz", "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-2.0.0.tgz", "dependencies": { "optimist": { "version": "0.3.7", - "from": "optimist@>=0.3.0 <0.4.0", + "from": "https://registry.npmjs.org/optimist/-/optimist-0.3.7.tgz", "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.3.7.tgz", "dependencies": { "wordwrap": { "version": "0.0.3", - "from": "wordwrap@>=0.0.2 <0.1.0", + "from": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz", "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz" } } }, "uglify-js": { "version": "2.3.6", - "from": "uglify-js@>=2.3.0 <2.4.0", + "from": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.3.6.tgz", "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.3.6.tgz", "dependencies": { "async": { "version": "0.2.10", - "from": "async@>=0.2.6 <0.3.0", + "from": "https://registry.npmjs.org/async/-/async-0.2.10.tgz", "resolved": "https://registry.npmjs.org/async/-/async-0.2.10.tgz" }, "source-map": { "version": "0.1.43", - "from": "source-map@>=0.1.7 <0.2.0", + "from": "https://registry.npmjs.org/source-map/-/source-map-0.1.43.tgz", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.1.43.tgz", "dependencies": { "amdefine": { "version": "1.0.0", - "from": "amdefine@>=0.0.4", + "from": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.0.tgz", "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.0.tgz" } } @@ -2125,83 +2125,83 @@ }, "inquirer": { "version": "0.7.1", - "from": "inquirer@0.7.1", + "from": "https://registry.npmjs.org/inquirer/-/inquirer-0.7.1.tgz", "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-0.7.1.tgz", "dependencies": { "cli-color": { "version": "0.3.3", - "from": "cli-color@>=0.3.2 <0.4.0", + "from": "https://registry.npmjs.org/cli-color/-/cli-color-0.3.3.tgz", "resolved": "https://registry.npmjs.org/cli-color/-/cli-color-0.3.3.tgz", "dependencies": { "d": { "version": "0.1.1", - "from": "d@>=0.1.1 <0.2.0", + "from": "https://registry.npmjs.org/d/-/d-0.1.1.tgz", "resolved": "https://registry.npmjs.org/d/-/d-0.1.1.tgz" }, "es5-ext": { "version": "0.10.11", - "from": "es5-ext@>=0.10.6 <0.11.0", + "from": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.11.tgz", "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.11.tgz", "dependencies": { "es6-iterator": { "version": "2.0.0", - "from": "es6-iterator@>=2.0.0 <3.0.0", + "from": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.0.tgz", "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.0.tgz" }, "es6-symbol": { "version": "3.0.2", - "from": "es6-symbol@>=3.0.2 <3.1.0", + "from": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.0.2.tgz", "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.0.2.tgz" } } }, "memoizee": { "version": "0.3.10", - "from": "memoizee@>=0.3.8 <0.4.0", + "from": "https://registry.npmjs.org/memoizee/-/memoizee-0.3.10.tgz", "resolved": "https://registry.npmjs.org/memoizee/-/memoizee-0.3.10.tgz", "dependencies": { "es6-weak-map": { "version": "0.1.4", - "from": "es6-weak-map@>=0.1.4 <0.2.0", + "from": "https://registry.npmjs.org/es6-weak-map/-/es6-weak-map-0.1.4.tgz", "resolved": "https://registry.npmjs.org/es6-weak-map/-/es6-weak-map-0.1.4.tgz", "dependencies": { "es6-iterator": { "version": "0.1.3", - "from": "es6-iterator@>=0.1.3 <0.2.0", + "from": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-0.1.3.tgz", "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-0.1.3.tgz" }, "es6-symbol": { "version": "2.0.1", - "from": "es6-symbol@>=2.0.1 <2.1.0", + "from": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-2.0.1.tgz", "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-2.0.1.tgz" } } }, "event-emitter": { "version": "0.3.4", - "from": "event-emitter@>=0.3.4 <0.4.0", + "from": "https://registry.npmjs.org/event-emitter/-/event-emitter-0.3.4.tgz", "resolved": "https://registry.npmjs.org/event-emitter/-/event-emitter-0.3.4.tgz" }, "lru-queue": { "version": "0.1.0", - "from": "lru-queue@>=0.1.0 <0.2.0", + "from": "https://registry.npmjs.org/lru-queue/-/lru-queue-0.1.0.tgz", "resolved": "https://registry.npmjs.org/lru-queue/-/lru-queue-0.1.0.tgz" }, "next-tick": { "version": "0.2.2", - "from": "next-tick@>=0.2.2 <0.3.0", + "from": "https://registry.npmjs.org/next-tick/-/next-tick-0.2.2.tgz", "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-0.2.2.tgz" } } }, "timers-ext": { "version": "0.1.0", - "from": "timers-ext@>=0.1.0 <0.2.0", + "from": "https://registry.npmjs.org/timers-ext/-/timers-ext-0.1.0.tgz", "resolved": "https://registry.npmjs.org/timers-ext/-/timers-ext-0.1.0.tgz", "dependencies": { "next-tick": { "version": "0.2.2", - "from": "next-tick@>=0.2.2 <0.3.0", + "from": "https://registry.npmjs.org/next-tick/-/next-tick-0.2.2.tgz", "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-0.2.2.tgz" } } @@ -2210,27 +2210,27 @@ }, "figures": { "version": "1.6.0", - "from": "figures@>=1.3.2 <2.0.0", + "from": "https://registry.npmjs.org/figures/-/figures-1.6.0.tgz", "resolved": "https://registry.npmjs.org/figures/-/figures-1.6.0.tgz" }, "mute-stream": { "version": "0.0.4", - "from": "mute-stream@0.0.4", + "from": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.4.tgz", "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.4.tgz" }, "readline2": { "version": "0.1.1", - "from": "readline2@>=0.1.0 <0.2.0", + "from": "https://registry.npmjs.org/readline2/-/readline2-0.1.1.tgz", "resolved": "https://registry.npmjs.org/readline2/-/readline2-0.1.1.tgz", "dependencies": { "strip-ansi": { "version": "2.0.1", - "from": "strip-ansi@>=2.0.1 <3.0.0", + "from": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-2.0.1.tgz", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-2.0.1.tgz", "dependencies": { "ansi-regex": { "version": "1.1.1", - "from": "ansi-regex@>=1.0.0 <2.0.0", + "from": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-1.1.1.tgz", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-1.1.1.tgz" } } @@ -2239,202 +2239,202 @@ }, "rx": { "version": "2.5.3", - "from": "rx@>=2.2.27 <3.0.0", + "from": "https://registry.npmjs.org/rx/-/rx-2.5.3.tgz", "resolved": "https://registry.npmjs.org/rx/-/rx-2.5.3.tgz" }, "through": { "version": "2.3.8", - "from": "through@>=2.3.4 <2.4.0", + "from": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz" } } }, "insight": { "version": "0.4.3", - "from": "insight@0.4.3", + "from": "https://registry.npmjs.org/insight/-/insight-0.4.3.tgz", "resolved": "https://registry.npmjs.org/insight/-/insight-0.4.3.tgz", "dependencies": { "async": { "version": "0.9.2", - "from": "async@>=0.9.0 <0.10.0", + "from": "https://registry.npmjs.org/async/-/async-0.9.2.tgz", "resolved": "https://registry.npmjs.org/async/-/async-0.9.2.tgz" }, "chalk": { "version": "0.5.1", - "from": "chalk@>=0.5.1 <0.6.0", + "from": "https://registry.npmjs.org/chalk/-/chalk-0.5.1.tgz", "resolved": "https://registry.npmjs.org/chalk/-/chalk-0.5.1.tgz", "dependencies": { "ansi-styles": { "version": "1.1.0", - "from": "ansi-styles@>=1.1.0 <2.0.0", + "from": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-1.1.0.tgz", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-1.1.0.tgz" }, "escape-string-regexp": { "version": "1.0.5", - "from": "escape-string-regexp@>=1.0.0 <2.0.0", + "from": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz" }, "has-ansi": { "version": "0.1.0", - "from": "has-ansi@>=0.1.0 <0.2.0", + "from": "https://registry.npmjs.org/has-ansi/-/has-ansi-0.1.0.tgz", "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-0.1.0.tgz", "dependencies": { "ansi-regex": { "version": "0.2.1", - "from": "ansi-regex@>=0.2.1 <0.3.0", + "from": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-0.2.1.tgz", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-0.2.1.tgz" } } }, "strip-ansi": { "version": "0.3.0", - "from": "strip-ansi@>=0.3.0 <0.4.0", + "from": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-0.3.0.tgz", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-0.3.0.tgz", "dependencies": { "ansi-regex": { "version": "0.2.1", - "from": "ansi-regex@>=0.2.1 <0.3.0", + "from": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-0.2.1.tgz", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-0.2.1.tgz" } } }, "supports-color": { "version": "0.2.0", - "from": "supports-color@>=0.2.0 <0.3.0", + "from": "https://registry.npmjs.org/supports-color/-/supports-color-0.2.0.tgz", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-0.2.0.tgz" } } }, "configstore": { "version": "0.3.2", - "from": "configstore@>=0.3.1 <0.4.0", + "from": "https://registry.npmjs.org/configstore/-/configstore-0.3.2.tgz", "resolved": "https://registry.npmjs.org/configstore/-/configstore-0.3.2.tgz", "dependencies": { "js-yaml": { "version": "3.6.1", - "from": "js-yaml@>=3.1.0 <4.0.0", + "from": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.6.1.tgz", "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.6.1.tgz", "dependencies": { "argparse": { "version": "1.0.7", - "from": "argparse@>=1.0.7 <2.0.0", + "from": "https://registry.npmjs.org/argparse/-/argparse-1.0.7.tgz", "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.7.tgz", "dependencies": { "sprintf-js": { "version": "1.0.3", - "from": "sprintf-js@>=1.0.2 <1.1.0", + "from": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz" } } }, "esprima": { "version": "2.7.2", - "from": "esprima@>=2.6.0 <3.0.0", + "from": "https://registry.npmjs.org/esprima/-/esprima-2.7.2.tgz", "resolved": "https://registry.npmjs.org/esprima/-/esprima-2.7.2.tgz" } } }, "object-assign": { "version": "2.1.1", - "from": "object-assign@>=2.0.0 <3.0.0", + "from": "https://registry.npmjs.org/object-assign/-/object-assign-2.1.1.tgz", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-2.1.1.tgz" }, "user-home": { "version": "1.1.1", - "from": "user-home@>=1.0.0 <2.0.0", + "from": "https://registry.npmjs.org/user-home/-/user-home-1.1.1.tgz", "resolved": "https://registry.npmjs.org/user-home/-/user-home-1.1.1.tgz" }, "uuid": { "version": "2.0.2", - "from": "uuid@>=2.0.1 <3.0.0", + "from": "https://registry.npmjs.org/uuid/-/uuid-2.0.2.tgz", "resolved": "https://registry.npmjs.org/uuid/-/uuid-2.0.2.tgz" }, "xdg-basedir": { "version": "1.0.1", - "from": "xdg-basedir@>=1.0.0 <2.0.0", + "from": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-1.0.1.tgz", "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-1.0.1.tgz" } } }, "inquirer": { "version": "0.6.0", - "from": "inquirer@>=0.6.0 <0.7.0", + "from": "https://registry.npmjs.org/inquirer/-/inquirer-0.6.0.tgz", "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-0.6.0.tgz", "dependencies": { "cli-color": { "version": "0.3.3", - "from": "cli-color@>=0.3.2 <0.4.0", + "from": "https://registry.npmjs.org/cli-color/-/cli-color-0.3.3.tgz", "resolved": "https://registry.npmjs.org/cli-color/-/cli-color-0.3.3.tgz", "dependencies": { "d": { "version": "0.1.1", - "from": "d@>=0.1.1 <0.2.0", + "from": "https://registry.npmjs.org/d/-/d-0.1.1.tgz", "resolved": "https://registry.npmjs.org/d/-/d-0.1.1.tgz" }, "es5-ext": { "version": "0.10.11", - "from": "es5-ext@>=0.10.6 <0.11.0", + "from": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.11.tgz", "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.11.tgz", "dependencies": { "es6-iterator": { "version": "2.0.0", - "from": "es6-iterator@>=2.0.0 <3.0.0", + "from": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.0.tgz", "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.0.tgz" }, "es6-symbol": { "version": "3.0.2", - "from": "es6-symbol@>=3.0.2 <3.1.0", + "from": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.0.2.tgz", "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.0.2.tgz" } } }, "memoizee": { "version": "0.3.10", - "from": "memoizee@>=0.3.8 <0.4.0", + "from": "https://registry.npmjs.org/memoizee/-/memoizee-0.3.10.tgz", "resolved": "https://registry.npmjs.org/memoizee/-/memoizee-0.3.10.tgz", "dependencies": { "es6-weak-map": { "version": "0.1.4", - "from": "es6-weak-map@>=0.1.4 <0.2.0", + "from": "https://registry.npmjs.org/es6-weak-map/-/es6-weak-map-0.1.4.tgz", "resolved": "https://registry.npmjs.org/es6-weak-map/-/es6-weak-map-0.1.4.tgz", "dependencies": { "es6-iterator": { "version": "0.1.3", - "from": "es6-iterator@>=0.1.3 <0.2.0", + "from": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-0.1.3.tgz", "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-0.1.3.tgz" }, "es6-symbol": { "version": "2.0.1", - "from": "es6-symbol@>=2.0.1 <2.1.0", + "from": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-2.0.1.tgz", "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-2.0.1.tgz" } } }, "event-emitter": { "version": "0.3.4", - "from": "event-emitter@>=0.3.4 <0.4.0", + "from": "https://registry.npmjs.org/event-emitter/-/event-emitter-0.3.4.tgz", "resolved": "https://registry.npmjs.org/event-emitter/-/event-emitter-0.3.4.tgz" }, "lru-queue": { "version": "0.1.0", - "from": "lru-queue@>=0.1.0 <0.2.0", + "from": "https://registry.npmjs.org/lru-queue/-/lru-queue-0.1.0.tgz", "resolved": "https://registry.npmjs.org/lru-queue/-/lru-queue-0.1.0.tgz" }, "next-tick": { "version": "0.2.2", - "from": "next-tick@>=0.2.2 <0.3.0", + "from": "https://registry.npmjs.org/next-tick/-/next-tick-0.2.2.tgz", "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-0.2.2.tgz" } } }, "timers-ext": { "version": "0.1.0", - "from": "timers-ext@>=0.1.0 <0.2.0", + "from": "https://registry.npmjs.org/timers-ext/-/timers-ext-0.1.0.tgz", "resolved": "https://registry.npmjs.org/timers-ext/-/timers-ext-0.1.0.tgz", "dependencies": { "next-tick": { "version": "0.2.2", - "from": "next-tick@>=0.2.2 <0.3.0", + "from": "https://registry.npmjs.org/next-tick/-/next-tick-0.2.2.tgz", "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-0.2.2.tgz" } } @@ -2443,22 +2443,22 @@ }, "mute-stream": { "version": "0.0.4", - "from": "mute-stream@0.0.4", + "from": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.4.tgz", "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.4.tgz" }, "readline2": { "version": "0.1.1", - "from": "readline2@>=0.1.0 <0.2.0", + "from": "https://registry.npmjs.org/readline2/-/readline2-0.1.1.tgz", "resolved": "https://registry.npmjs.org/readline2/-/readline2-0.1.1.tgz", "dependencies": { "strip-ansi": { "version": "2.0.1", - "from": "strip-ansi@>=2.0.1 <3.0.0", + "from": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-2.0.1.tgz", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-2.0.1.tgz", "dependencies": { "ansi-regex": { "version": "1.1.1", - "from": "ansi-regex@>=1.0.0 <2.0.0", + "from": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-1.1.1.tgz", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-1.1.1.tgz" } } @@ -2467,46 +2467,46 @@ }, "rx": { "version": "2.5.3", - "from": "rx@>=2.2.27 <3.0.0", + "from": "https://registry.npmjs.org/rx/-/rx-2.5.3.tgz", "resolved": "https://registry.npmjs.org/rx/-/rx-2.5.3.tgz" }, "through": { "version": "2.3.8", - "from": "through@>=2.3.4 <2.4.0", + "from": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz" } } }, "lodash.debounce": { "version": "2.4.1", - "from": "lodash.debounce@>=2.4.1 <3.0.0", + "from": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-2.4.1.tgz", "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-2.4.1.tgz", "dependencies": { "lodash.isfunction": { "version": "2.4.1", - "from": "lodash.isfunction@>=2.4.1 <2.5.0", + "from": "https://registry.npmjs.org/lodash.isfunction/-/lodash.isfunction-2.4.1.tgz", "resolved": "https://registry.npmjs.org/lodash.isfunction/-/lodash.isfunction-2.4.1.tgz" }, "lodash.isobject": { "version": "2.4.1", - "from": "lodash.isobject@>=2.4.1 <2.5.0", + "from": "https://registry.npmjs.org/lodash.isobject/-/lodash.isobject-2.4.1.tgz", "resolved": "https://registry.npmjs.org/lodash.isobject/-/lodash.isobject-2.4.1.tgz", "dependencies": { "lodash._objecttypes": { "version": "2.4.1", - "from": "lodash._objecttypes@>=2.4.1 <2.5.0", + "from": "https://registry.npmjs.org/lodash._objecttypes/-/lodash._objecttypes-2.4.1.tgz", "resolved": "https://registry.npmjs.org/lodash._objecttypes/-/lodash._objecttypes-2.4.1.tgz" } } }, "lodash.now": { "version": "2.4.1", - "from": "lodash.now@>=2.4.1 <2.5.0", + "from": "https://registry.npmjs.org/lodash.now/-/lodash.now-2.4.1.tgz", "resolved": "https://registry.npmjs.org/lodash.now/-/lodash.now-2.4.1.tgz", "dependencies": { "lodash._isnative": { "version": "2.4.1", - "from": "lodash._isnative@>=2.4.1 <2.5.0", + "from": "https://registry.npmjs.org/lodash._isnative/-/lodash._isnative-2.4.1.tgz", "resolved": "https://registry.npmjs.org/lodash._isnative/-/lodash._isnative-2.4.1.tgz" } } @@ -2515,34 +2515,34 @@ }, "object-assign": { "version": "1.0.0", - "from": "object-assign@>=1.0.0 <2.0.0", + "from": "https://registry.npmjs.org/object-assign/-/object-assign-1.0.0.tgz", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-1.0.0.tgz" }, "os-name": { "version": "1.0.3", - "from": "os-name@>=1.0.0 <2.0.0", + "from": "https://registry.npmjs.org/os-name/-/os-name-1.0.3.tgz", "resolved": "https://registry.npmjs.org/os-name/-/os-name-1.0.3.tgz", "dependencies": { "osx-release": { "version": "1.1.0", - "from": "osx-release@>=1.0.0 <2.0.0", + "from": "https://registry.npmjs.org/osx-release/-/osx-release-1.1.0.tgz", "resolved": "https://registry.npmjs.org/osx-release/-/osx-release-1.1.0.tgz", "dependencies": { "minimist": { "version": "1.2.0", - "from": "minimist@>=1.1.0 <2.0.0", + "from": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz" } } }, "win-release": { "version": "1.1.1", - "from": "win-release@>=1.0.0 <2.0.0", + "from": "https://registry.npmjs.org/win-release/-/win-release-1.1.1.tgz", "resolved": "https://registry.npmjs.org/win-release/-/win-release-1.1.1.tgz", "dependencies": { "semver": { "version": "5.1.0", - "from": "semver@>=5.0.1 <6.0.0", + "from": "https://registry.npmjs.org/semver/-/semver-5.1.0.tgz", "resolved": "https://registry.npmjs.org/semver/-/semver-5.1.0.tgz" } } @@ -2551,12 +2551,12 @@ }, "tough-cookie": { "version": "0.12.1", - "from": "tough-cookie@>=0.12.1 <0.13.0", + "from": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-0.12.1.tgz", "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-0.12.1.tgz", "dependencies": { "punycode": { "version": "1.4.1", - "from": "punycode@>=0.2.0", + "from": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz" } } @@ -2565,81 +2565,81 @@ }, "is-root": { "version": "1.0.0", - "from": "is-root@>=1.0.0 <1.1.0", + "from": "https://registry.npmjs.org/is-root/-/is-root-1.0.0.tgz", "resolved": "https://registry.npmjs.org/is-root/-/is-root-1.0.0.tgz" }, "junk": { "version": "1.0.2", - "from": "junk@>=1.0.0 <1.1.0", + "from": "https://registry.npmjs.org/junk/-/junk-1.0.2.tgz", "resolved": "https://registry.npmjs.org/junk/-/junk-1.0.2.tgz" }, "lockfile": { "version": "1.0.1", - "from": "lockfile@>=1.0.0 <1.1.0", + "from": "https://registry.npmjs.org/lockfile/-/lockfile-1.0.1.tgz", "resolved": "https://registry.npmjs.org/lockfile/-/lockfile-1.0.1.tgz" }, "lru-cache": { "version": "2.5.2", - "from": "lru-cache@>=2.5.0 <2.6.0", + "from": "https://registry.npmjs.org/lru-cache/-/lru-cache-2.5.2.tgz", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-2.5.2.tgz" }, "mkdirp": { "version": "0.5.0", - "from": "mkdirp@0.5.0", + "from": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.0.tgz", "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.0.tgz", "dependencies": { "minimist": { "version": "0.0.8", - "from": "minimist@0.0.8", + "from": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz" } } }, "mout": { "version": "0.9.1", - "from": "mout@>=0.9.0 <0.10.0", + "from": "https://registry.npmjs.org/mout/-/mout-0.9.1.tgz", "resolved": "https://registry.npmjs.org/mout/-/mout-0.9.1.tgz" }, "nopt": { "version": "3.0.6", - "from": "nopt@>=3.0.0 <3.1.0", + "from": "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz", "resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz" }, "opn": { "version": "1.0.2", - "from": "opn@>=1.0.0 <1.1.0", + "from": "https://registry.npmjs.org/opn/-/opn-1.0.2.tgz", "resolved": "https://registry.npmjs.org/opn/-/opn-1.0.2.tgz" }, "osenv": { "version": "0.1.0", - "from": "osenv@0.1.0", + "from": "https://registry.npmjs.org/osenv/-/osenv-0.1.0.tgz", "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.0.tgz" }, "p-throttler": { "version": "0.1.0", - "from": "p-throttler@0.1.0", + "from": "https://registry.npmjs.org/p-throttler/-/p-throttler-0.1.0.tgz", "resolved": "https://registry.npmjs.org/p-throttler/-/p-throttler-0.1.0.tgz", "dependencies": { "q": { "version": "0.9.7", - "from": "q@>=0.9.2 <0.10.0", + "from": "https://registry.npmjs.org/q/-/q-0.9.7.tgz", "resolved": "https://registry.npmjs.org/q/-/q-0.9.7.tgz" } } }, "promptly": { "version": "0.2.0", - "from": "promptly@0.2.0", + "from": "https://registry.npmjs.org/promptly/-/promptly-0.2.0.tgz", "resolved": "https://registry.npmjs.org/promptly/-/promptly-0.2.0.tgz", "dependencies": { "read": { "version": "1.0.7", - "from": "read@>=1.0.4 <1.1.0", + "from": "https://registry.npmjs.org/read/-/read-1.0.7.tgz", "resolved": "https://registry.npmjs.org/read/-/read-1.0.7.tgz", "dependencies": { "mute-stream": { "version": "0.0.6", - "from": "mute-stream@>=0.0.4 <0.1.0", + "from": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.6.tgz", "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.6.tgz" } } @@ -2648,37 +2648,37 @@ }, "request": { "version": "2.42.0", - "from": "request@>=2.42.0 <2.43.0", + "from": "https://registry.npmjs.org/request/-/request-2.42.0.tgz", "resolved": "https://registry.npmjs.org/request/-/request-2.42.0.tgz", "dependencies": { "bl": { "version": "0.9.5", - "from": "bl@>=0.9.0 <0.10.0", + "from": "https://registry.npmjs.org/bl/-/bl-0.9.5.tgz", "resolved": "https://registry.npmjs.org/bl/-/bl-0.9.5.tgz", "dependencies": { "readable-stream": { "version": "1.0.34", - "from": "readable-stream@>=1.0.26 <1.1.0", + "from": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", "dependencies": { "core-util-is": { "version": "1.0.2", - "from": "core-util-is@>=1.0.0 <1.1.0", + "from": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz" }, "isarray": { "version": "0.0.1", - "from": "isarray@0.0.1", + "from": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz" }, "string_decoder": { "version": "0.10.31", - "from": "string_decoder@>=0.10.0 <0.11.0", + "from": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz" }, "inherits": { "version": "2.0.1", - "from": "inherits@>=2.0.1 <2.1.0", + "from": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz" } } @@ -2687,226 +2687,226 @@ }, "caseless": { "version": "0.6.0", - "from": "caseless@>=0.6.0 <0.7.0", + "from": "https://registry.npmjs.org/caseless/-/caseless-0.6.0.tgz", "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.6.0.tgz" }, "forever-agent": { "version": "0.5.2", - "from": "forever-agent@>=0.5.0 <0.6.0", + "from": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.5.2.tgz", "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.5.2.tgz" }, "qs": { "version": "1.2.2", - "from": "qs@>=1.2.0 <1.3.0", + "from": "https://registry.npmjs.org/qs/-/qs-1.2.2.tgz", "resolved": "https://registry.npmjs.org/qs/-/qs-1.2.2.tgz" }, "json-stringify-safe": { "version": "5.0.1", - "from": "json-stringify-safe@>=5.0.0 <5.1.0", + "from": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz" }, "mime-types": { "version": "1.0.2", - "from": "mime-types@>=1.0.1 <1.1.0", + "from": "https://registry.npmjs.org/mime-types/-/mime-types-1.0.2.tgz", "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-1.0.2.tgz" }, "node-uuid": { "version": "1.4.7", - "from": "node-uuid@>=1.4.0 <1.5.0", + "from": "https://registry.npmjs.org/node-uuid/-/node-uuid-1.4.7.tgz", "resolved": "https://registry.npmjs.org/node-uuid/-/node-uuid-1.4.7.tgz" }, "tunnel-agent": { "version": "0.4.3", - "from": "tunnel-agent@>=0.4.0 <0.5.0", + "from": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.4.3.tgz", "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.4.3.tgz" }, "tough-cookie": { "version": "2.2.2", - "from": "tough-cookie@>=0.12.0", + "from": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.2.2.tgz", "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.2.2.tgz" }, "form-data": { "version": "0.1.4", - "from": "form-data@>=0.1.0 <0.2.0", + "from": "https://registry.npmjs.org/form-data/-/form-data-0.1.4.tgz", "resolved": "https://registry.npmjs.org/form-data/-/form-data-0.1.4.tgz", "dependencies": { "combined-stream": { "version": "0.0.7", - "from": "combined-stream@>=0.0.4 <0.1.0", + "from": "https://registry.npmjs.org/combined-stream/-/combined-stream-0.0.7.tgz", "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-0.0.7.tgz", "dependencies": { "delayed-stream": { "version": "0.0.5", - "from": "delayed-stream@0.0.5", + "from": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-0.0.5.tgz", "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-0.0.5.tgz" } } }, "mime": { "version": "1.2.11", - "from": "mime@>=1.2.11 <1.3.0", + "from": "https://registry.npmjs.org/mime/-/mime-1.2.11.tgz", "resolved": "https://registry.npmjs.org/mime/-/mime-1.2.11.tgz" }, "async": { "version": "0.9.2", - "from": "async@>=0.9.0 <0.10.0", + "from": "https://registry.npmjs.org/async/-/async-0.9.2.tgz", "resolved": "https://registry.npmjs.org/async/-/async-0.9.2.tgz" } } }, "http-signature": { "version": "0.10.1", - "from": "http-signature@>=0.10.0 <0.11.0", + "from": "https://registry.npmjs.org/http-signature/-/http-signature-0.10.1.tgz", "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-0.10.1.tgz", "dependencies": { "assert-plus": { "version": "0.1.5", - "from": "assert-plus@>=0.1.5 <0.2.0", + "from": "https://registry.npmjs.org/assert-plus/-/assert-plus-0.1.5.tgz", "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-0.1.5.tgz" }, "asn1": { "version": "0.1.11", - "from": "asn1@0.1.11", + "from": "https://registry.npmjs.org/asn1/-/asn1-0.1.11.tgz", "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.1.11.tgz" }, "ctype": { "version": "0.5.3", - "from": "ctype@0.5.3", + "from": "https://registry.npmjs.org/ctype/-/ctype-0.5.3.tgz", "resolved": "https://registry.npmjs.org/ctype/-/ctype-0.5.3.tgz" } } }, "oauth-sign": { "version": "0.4.0", - "from": "oauth-sign@>=0.4.0 <0.5.0", + "from": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.4.0.tgz", "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.4.0.tgz" }, "hawk": { "version": "1.1.1", - "from": "hawk@1.1.1", + "from": "https://registry.npmjs.org/hawk/-/hawk-1.1.1.tgz", "resolved": "https://registry.npmjs.org/hawk/-/hawk-1.1.1.tgz", "dependencies": { "hoek": { "version": "0.9.1", - "from": "hoek@>=0.9.0 <0.10.0", + "from": "https://registry.npmjs.org/hoek/-/hoek-0.9.1.tgz", "resolved": "https://registry.npmjs.org/hoek/-/hoek-0.9.1.tgz" }, "boom": { "version": "0.4.2", - "from": "boom@>=0.4.0 <0.5.0", + "from": "https://registry.npmjs.org/boom/-/boom-0.4.2.tgz", "resolved": "https://registry.npmjs.org/boom/-/boom-0.4.2.tgz" }, "cryptiles": { "version": "0.2.2", - "from": "cryptiles@>=0.2.0 <0.3.0", + "from": "https://registry.npmjs.org/cryptiles/-/cryptiles-0.2.2.tgz", "resolved": "https://registry.npmjs.org/cryptiles/-/cryptiles-0.2.2.tgz" }, "sntp": { "version": "0.2.4", - "from": "sntp@>=0.2.0 <0.3.0", + "from": "https://registry.npmjs.org/sntp/-/sntp-0.2.4.tgz", "resolved": "https://registry.npmjs.org/sntp/-/sntp-0.2.4.tgz" } } }, "aws-sign2": { "version": "0.5.0", - "from": "aws-sign2@>=0.5.0 <0.6.0", + "from": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.5.0.tgz", "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.5.0.tgz" }, "stringstream": { "version": "0.0.5", - "from": "stringstream@>=0.0.4 <0.1.0", + "from": "https://registry.npmjs.org/stringstream/-/stringstream-0.0.5.tgz", "resolved": "https://registry.npmjs.org/stringstream/-/stringstream-0.0.5.tgz" } } }, "request-progress": { "version": "0.3.0", - "from": "request-progress@0.3.0", + "from": "https://registry.npmjs.org/request-progress/-/request-progress-0.3.0.tgz", "resolved": "https://registry.npmjs.org/request-progress/-/request-progress-0.3.0.tgz", "dependencies": { "throttleit": { "version": "0.0.2", - "from": "throttleit@>=0.0.2 <0.1.0", + "from": "https://registry.npmjs.org/throttleit/-/throttleit-0.0.2.tgz", "resolved": "https://registry.npmjs.org/throttleit/-/throttleit-0.0.2.tgz" } } }, "retry": { "version": "0.6.0", - "from": "retry@0.6.0", + "from": "https://registry.npmjs.org/retry/-/retry-0.6.0.tgz", "resolved": "https://registry.npmjs.org/retry/-/retry-0.6.0.tgz" }, "rimraf": { "version": "2.2.8", - "from": "rimraf@>=2.2.0 <2.3.0", + "from": "https://registry.npmjs.org/rimraf/-/rimraf-2.2.8.tgz", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.2.8.tgz" }, "semver": { "version": "2.3.2", - "from": "semver@>=2.3.0 <2.4.0", + "from": "https://registry.npmjs.org/semver/-/semver-2.3.2.tgz", "resolved": "https://registry.npmjs.org/semver/-/semver-2.3.2.tgz" }, "shell-quote": { "version": "1.4.3", - "from": "shell-quote@>=1.4.1 <1.5.0", + "from": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.4.3.tgz", "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.4.3.tgz", "dependencies": { "jsonify": { "version": "0.0.0", - "from": "jsonify@>=0.0.0 <0.1.0", + "from": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz", "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz" }, "array-filter": { "version": "0.0.1", - "from": "array-filter@>=0.0.0 <0.1.0", + "from": "https://registry.npmjs.org/array-filter/-/array-filter-0.0.1.tgz", "resolved": "https://registry.npmjs.org/array-filter/-/array-filter-0.0.1.tgz" }, "array-reduce": { "version": "0.0.0", - "from": "array-reduce@>=0.0.0 <0.1.0", + "from": "https://registry.npmjs.org/array-reduce/-/array-reduce-0.0.0.tgz", "resolved": "https://registry.npmjs.org/array-reduce/-/array-reduce-0.0.0.tgz" }, "array-map": { "version": "0.0.0", - "from": "array-map@>=0.0.0 <0.1.0", + "from": "https://registry.npmjs.org/array-map/-/array-map-0.0.0.tgz", "resolved": "https://registry.npmjs.org/array-map/-/array-map-0.0.0.tgz" } } }, "stringify-object": { "version": "1.0.1", - "from": "stringify-object@>=1.0.0 <1.1.0", + "from": "https://registry.npmjs.org/stringify-object/-/stringify-object-1.0.1.tgz", "resolved": "https://registry.npmjs.org/stringify-object/-/stringify-object-1.0.1.tgz" }, "tar-fs": { "version": "0.5.2", - "from": "tar-fs@0.5.2", + "from": "https://registry.npmjs.org/tar-fs/-/tar-fs-0.5.2.tgz", "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-0.5.2.tgz", "dependencies": { "pump": { "version": "0.3.5", - "from": "pump@>=0.3.5 <0.4.0", + "from": "https://registry.npmjs.org/pump/-/pump-0.3.5.tgz", "resolved": "https://registry.npmjs.org/pump/-/pump-0.3.5.tgz", "dependencies": { "once": { "version": "1.2.0", - "from": "once@>=1.2.0 <1.3.0", + "from": "https://registry.npmjs.org/once/-/once-1.2.0.tgz", "resolved": "https://registry.npmjs.org/once/-/once-1.2.0.tgz" }, "end-of-stream": { "version": "1.0.0", - "from": "end-of-stream@>=1.0.0 <1.1.0", + "from": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.0.0.tgz", "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.0.0.tgz", "dependencies": { "once": { "version": "1.3.3", - "from": "once@>=1.3.0 <1.4.0", + "from": "https://registry.npmjs.org/once/-/once-1.3.3.tgz", "resolved": "https://registry.npmjs.org/once/-/once-1.3.3.tgz", "dependencies": { "wrappy": { "version": "1.0.1", - "from": "wrappy@>=1.0.0 <2.0.0", + "from": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.1.tgz", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.1.tgz" } } @@ -2917,37 +2917,37 @@ }, "tar-stream": { "version": "0.4.7", - "from": "tar-stream@>=0.4.6 <0.5.0", + "from": "https://registry.npmjs.org/tar-stream/-/tar-stream-0.4.7.tgz", "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-0.4.7.tgz", "dependencies": { "bl": { "version": "0.9.5", - "from": "bl@>=0.9.0 <0.10.0", + "from": "https://registry.npmjs.org/bl/-/bl-0.9.5.tgz", "resolved": "https://registry.npmjs.org/bl/-/bl-0.9.5.tgz", "dependencies": { "readable-stream": { "version": "1.0.34", - "from": "readable-stream@>=1.0.26 <1.1.0", + "from": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", "dependencies": { "core-util-is": { "version": "1.0.2", - "from": "core-util-is@>=1.0.0 <1.1.0", + "from": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz" }, "isarray": { "version": "0.0.1", - "from": "isarray@0.0.1", + "from": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz" }, "string_decoder": { "version": "0.10.31", - "from": "string_decoder@>=0.10.0 <0.11.0", + "from": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz" }, "inherits": { "version": "2.0.1", - "from": "inherits@>=2.0.1 <2.1.0", + "from": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz" } } @@ -2956,17 +2956,17 @@ }, "end-of-stream": { "version": "1.1.0", - "from": "end-of-stream@>=1.0.0 <2.0.0", + "from": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.1.0.tgz", "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.1.0.tgz", "dependencies": { "once": { "version": "1.3.3", - "from": "once@>=1.3.0 <1.4.0", + "from": "https://registry.npmjs.org/once/-/once-1.3.3.tgz", "resolved": "https://registry.npmjs.org/once/-/once-1.3.3.tgz", "dependencies": { "wrappy": { "version": "1.0.1", - "from": "wrappy@>=1.0.0 <2.0.0", + "from": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.1.tgz", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.1.tgz" } } @@ -2975,34 +2975,34 @@ }, "readable-stream": { "version": "1.1.14", - "from": "readable-stream@>=1.0.27-1 <2.0.0", + "from": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", "dependencies": { "core-util-is": { "version": "1.0.2", - "from": "core-util-is@>=1.0.0 <1.1.0", + "from": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz" }, "isarray": { "version": "0.0.1", - "from": "isarray@0.0.1", + "from": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz" }, "string_decoder": { "version": "0.10.31", - "from": "string_decoder@>=0.10.0 <0.11.0", + "from": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz" }, "inherits": { "version": "2.0.1", - "from": "inherits@>=2.0.1 <2.1.0", + "from": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz" } } }, "xtend": { "version": "4.0.1", - "from": "xtend@>=4.0.0 <5.0.0", + "from": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz" } } @@ -3011,134 +3011,134 @@ }, "tmp": { "version": "0.0.23", - "from": "tmp@0.0.23", + "from": "https://registry.npmjs.org/tmp/-/tmp-0.0.23.tgz", "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.23.tgz" }, "update-notifier": { "version": "0.2.0", - "from": "update-notifier@0.2.0", + "from": "https://registry.npmjs.org/update-notifier/-/update-notifier-0.2.0.tgz", "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-0.2.0.tgz", "dependencies": { "configstore": { "version": "0.3.2", - "from": "configstore@>=0.3.1 <0.4.0", + "from": "https://registry.npmjs.org/configstore/-/configstore-0.3.2.tgz", "resolved": "https://registry.npmjs.org/configstore/-/configstore-0.3.2.tgz", "dependencies": { "js-yaml": { "version": "3.6.1", - "from": "js-yaml@>=3.1.0 <4.0.0", + "from": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.6.1.tgz", "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.6.1.tgz", "dependencies": { "argparse": { "version": "1.0.7", - "from": "argparse@>=1.0.7 <2.0.0", + "from": "https://registry.npmjs.org/argparse/-/argparse-1.0.7.tgz", "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.7.tgz", "dependencies": { "sprintf-js": { "version": "1.0.3", - "from": "sprintf-js@>=1.0.2 <1.1.0", + "from": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz" } } }, "esprima": { "version": "2.7.2", - "from": "esprima@>=2.6.0 <3.0.0", + "from": "https://registry.npmjs.org/esprima/-/esprima-2.7.2.tgz", "resolved": "https://registry.npmjs.org/esprima/-/esprima-2.7.2.tgz" } } }, "object-assign": { "version": "2.1.1", - "from": "object-assign@>=2.0.0 <3.0.0", + "from": "https://registry.npmjs.org/object-assign/-/object-assign-2.1.1.tgz", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-2.1.1.tgz" }, "user-home": { "version": "1.1.1", - "from": "user-home@>=1.0.0 <2.0.0", + "from": "https://registry.npmjs.org/user-home/-/user-home-1.1.1.tgz", "resolved": "https://registry.npmjs.org/user-home/-/user-home-1.1.1.tgz" }, "uuid": { "version": "2.0.2", - "from": "uuid@>=2.0.1 <3.0.0", + "from": "https://registry.npmjs.org/uuid/-/uuid-2.0.2.tgz", "resolved": "https://registry.npmjs.org/uuid/-/uuid-2.0.2.tgz" }, "xdg-basedir": { "version": "1.0.1", - "from": "xdg-basedir@>=1.0.0 <2.0.0", + "from": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-1.0.1.tgz", "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-1.0.1.tgz" } } }, "latest-version": { "version": "0.2.0", - "from": "latest-version@>=0.2.0 <0.3.0", + "from": "https://registry.npmjs.org/latest-version/-/latest-version-0.2.0.tgz", "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-0.2.0.tgz", "dependencies": { "package-json": { "version": "0.2.0", - "from": "package-json@>=0.2.0 <0.3.0", + "from": "https://registry.npmjs.org/package-json/-/package-json-0.2.0.tgz", "resolved": "https://registry.npmjs.org/package-json/-/package-json-0.2.0.tgz", "dependencies": { "got": { "version": "0.3.0", - "from": "got@>=0.3.0 <0.4.0", + "from": "https://registry.npmjs.org/got/-/got-0.3.0.tgz", "resolved": "https://registry.npmjs.org/got/-/got-0.3.0.tgz", "dependencies": { "object-assign": { "version": "0.3.1", - "from": "object-assign@>=0.3.0 <0.4.0", + "from": "https://registry.npmjs.org/object-assign/-/object-assign-0.3.1.tgz", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-0.3.1.tgz" } } }, "registry-url": { "version": "0.1.1", - "from": "registry-url@>=0.1.0 <0.2.0", + "from": "https://registry.npmjs.org/registry-url/-/registry-url-0.1.1.tgz", "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-0.1.1.tgz", "dependencies": { "npmconf": { "version": "2.1.2", - "from": "npmconf@>=2.0.1 <3.0.0", + "from": "https://registry.npmjs.org/npmconf/-/npmconf-2.1.2.tgz", "resolved": "https://registry.npmjs.org/npmconf/-/npmconf-2.1.2.tgz", "dependencies": { "config-chain": { "version": "1.1.10", - "from": "config-chain@>=1.1.8 <1.2.0", + "from": "https://registry.npmjs.org/config-chain/-/config-chain-1.1.10.tgz", "resolved": "https://registry.npmjs.org/config-chain/-/config-chain-1.1.10.tgz", "dependencies": { "proto-list": { "version": "1.2.4", - "from": "proto-list@>=1.2.1 <1.3.0", + "from": "https://registry.npmjs.org/proto-list/-/proto-list-1.2.4.tgz", "resolved": "https://registry.npmjs.org/proto-list/-/proto-list-1.2.4.tgz" } } }, "inherits": { "version": "2.0.1", - "from": "inherits@>=2.0.0 <2.1.0", + "from": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz" }, "ini": { "version": "1.3.4", - "from": "ini@>=1.2.0 <2.0.0", + "from": "https://registry.npmjs.org/ini/-/ini-1.3.4.tgz", "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.4.tgz" }, "once": { "version": "1.3.3", - "from": "once@>=1.3.0 <1.4.0", + "from": "https://registry.npmjs.org/once/-/once-1.3.3.tgz", "resolved": "https://registry.npmjs.org/once/-/once-1.3.3.tgz", "dependencies": { "wrappy": { "version": "1.0.1", - "from": "wrappy@>=1.0.0 <2.0.0", + "from": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.1.tgz", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.1.tgz" } } }, "uid-number": { "version": "0.0.5", - "from": "uid-number@0.0.5", + "from": "https://registry.npmjs.org/uid-number/-/uid-number-0.0.5.tgz", "resolved": "https://registry.npmjs.org/uid-number/-/uid-number-0.0.5.tgz" } } @@ -3151,22 +3151,22 @@ }, "semver-diff": { "version": "0.1.0", - "from": "semver-diff@>=0.1.0 <0.2.0", + "from": "https://registry.npmjs.org/semver-diff/-/semver-diff-0.1.0.tgz", "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-0.1.0.tgz" }, "string-length": { "version": "0.1.2", - "from": "string-length@>=0.1.2 <0.2.0", + "from": "https://registry.npmjs.org/string-length/-/string-length-0.1.2.tgz", "resolved": "https://registry.npmjs.org/string-length/-/string-length-0.1.2.tgz", "dependencies": { "strip-ansi": { "version": "0.2.2", - "from": "strip-ansi@>=0.2.1 <0.3.0", + "from": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-0.2.2.tgz", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-0.2.2.tgz", "dependencies": { "ansi-regex": { "version": "0.1.0", - "from": "ansi-regex@>=0.1.0 <0.2.0", + "from": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-0.1.0.tgz", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-0.1.0.tgz" } } @@ -3177,88 +3177,88 @@ }, "which": { "version": "1.0.9", - "from": "which@>=1.0.5 <1.1.0", + "from": "https://registry.npmjs.org/which/-/which-1.0.9.tgz", "resolved": "https://registry.npmjs.org/which/-/which-1.0.9.tgz" } } }, "browserstacktunnel-wrapper": { "version": "1.3.1", - "from": "browserstacktunnel-wrapper@>=1.3.1 <1.4.0", + "from": "https://registry.npmjs.org/browserstacktunnel-wrapper/-/browserstacktunnel-wrapper-1.3.1.tgz", "resolved": "https://registry.npmjs.org/browserstacktunnel-wrapper/-/browserstacktunnel-wrapper-1.3.1.tgz", "dependencies": { "unzip": { "version": "0.1.11", - "from": "unzip@>=0.1.9 <0.2.0", + "from": "https://registry.npmjs.org/unzip/-/unzip-0.1.11.tgz", "resolved": "https://registry.npmjs.org/unzip/-/unzip-0.1.11.tgz", "dependencies": { "fstream": { "version": "0.1.31", - "from": "fstream@>=0.1.30 <1.0.0", + "from": "https://registry.npmjs.org/fstream/-/fstream-0.1.31.tgz", "resolved": "https://registry.npmjs.org/fstream/-/fstream-0.1.31.tgz", "dependencies": { "graceful-fs": { "version": "3.0.8", - "from": "graceful-fs@>=3.0.2 <3.1.0", + "from": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-3.0.8.tgz", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-3.0.8.tgz" }, "inherits": { "version": "2.0.1", - "from": "inherits@>=2.0.0 <2.1.0", + "from": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz" }, "mkdirp": { "version": "0.5.1", - "from": "mkdirp@>=0.5.0 <0.6.0", + "from": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", "dependencies": { "minimist": { "version": "0.0.8", - "from": "minimist@0.0.8", + "from": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz" } } }, "rimraf": { "version": "2.5.2", - "from": "rimraf@>=2.0.0 <3.0.0", + "from": "https://registry.npmjs.org/rimraf/-/rimraf-2.5.2.tgz", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.5.2.tgz", "dependencies": { "glob": { "version": "7.0.3", - "from": "glob@>=7.0.0 <8.0.0", + "from": "https://registry.npmjs.org/glob/-/glob-7.0.3.tgz", "resolved": "https://registry.npmjs.org/glob/-/glob-7.0.3.tgz", "dependencies": { "inflight": { "version": "1.0.4", - "from": "inflight@>=1.0.4 <2.0.0", + "from": "https://registry.npmjs.org/inflight/-/inflight-1.0.4.tgz", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.4.tgz", "dependencies": { "wrappy": { "version": "1.0.1", - "from": "wrappy@>=1.0.0 <2.0.0", + "from": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.1.tgz", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.1.tgz" } } }, "minimatch": { "version": "3.0.0", - "from": "minimatch@>=2.0.0 <3.0.0||>=3.0.0 <4.0.0", + "from": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.0.tgz", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.0.tgz", "dependencies": { "brace-expansion": { "version": "1.1.4", - "from": "brace-expansion@>=1.0.0 <2.0.0", + "from": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.4.tgz", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.4.tgz", "dependencies": { "balanced-match": { "version": "0.4.1", - "from": "balanced-match@>=0.4.1 <0.5.0", + "from": "https://registry.npmjs.org/balanced-match/-/balanced-match-0.4.1.tgz", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-0.4.1.tgz" }, "concat-map": { "version": "0.0.1", - "from": "concat-map@0.0.1", + "from": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz" } } @@ -3267,19 +3267,19 @@ }, "once": { "version": "1.3.3", - "from": "once@>=1.3.0 <2.0.0", + "from": "https://registry.npmjs.org/once/-/once-1.3.3.tgz", "resolved": "https://registry.npmjs.org/once/-/once-1.3.3.tgz", "dependencies": { "wrappy": { "version": "1.0.1", - "from": "wrappy@>=1.0.0 <2.0.0", + "from": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.1.tgz", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.1.tgz" } } }, "path-is-absolute": { "version": "1.0.0", - "from": "path-is-absolute@>=1.0.0 <2.0.0", + "from": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.0.tgz", "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.0.tgz" } } @@ -3290,85 +3290,85 @@ }, "pullstream": { "version": "0.4.1", - "from": "pullstream@>=0.4.1 <1.0.0", + "from": "https://registry.npmjs.org/pullstream/-/pullstream-0.4.1.tgz", "resolved": "https://registry.npmjs.org/pullstream/-/pullstream-0.4.1.tgz", "dependencies": { "over": { "version": "0.0.5", - "from": "over@>=0.0.5 <1.0.0", + "from": "https://registry.npmjs.org/over/-/over-0.0.5.tgz", "resolved": "https://registry.npmjs.org/over/-/over-0.0.5.tgz" }, "slice-stream": { "version": "1.0.0", - "from": "slice-stream@>=1.0.0 <2.0.0", + "from": "https://registry.npmjs.org/slice-stream/-/slice-stream-1.0.0.tgz", "resolved": "https://registry.npmjs.org/slice-stream/-/slice-stream-1.0.0.tgz" } } }, "binary": { "version": "0.3.0", - "from": "binary@>=0.3.0 <1.0.0", + "from": "https://registry.npmjs.org/binary/-/binary-0.3.0.tgz", "resolved": "https://registry.npmjs.org/binary/-/binary-0.3.0.tgz", "dependencies": { "chainsaw": { "version": "0.1.0", - "from": "chainsaw@>=0.1.0 <0.2.0", + "from": "https://registry.npmjs.org/chainsaw/-/chainsaw-0.1.0.tgz", "resolved": "https://registry.npmjs.org/chainsaw/-/chainsaw-0.1.0.tgz", "dependencies": { "traverse": { "version": "0.3.9", - "from": "traverse@>=0.3.0 <0.4.0", + "from": "https://registry.npmjs.org/traverse/-/traverse-0.3.9.tgz", "resolved": "https://registry.npmjs.org/traverse/-/traverse-0.3.9.tgz" } } }, "buffers": { "version": "0.1.1", - "from": "buffers@>=0.1.1 <0.2.0", + "from": "https://registry.npmjs.org/buffers/-/buffers-0.1.1.tgz", "resolved": "https://registry.npmjs.org/buffers/-/buffers-0.1.1.tgz" } } }, "readable-stream": { "version": "1.0.34", - "from": "readable-stream@>=1.0.31 <1.1.0", + "from": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", "dependencies": { "core-util-is": { "version": "1.0.2", - "from": "core-util-is@>=1.0.0 <1.1.0", + "from": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz" }, "isarray": { "version": "0.0.1", - "from": "isarray@0.0.1", + "from": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz" }, "string_decoder": { "version": "0.10.31", - "from": "string_decoder@>=0.10.0 <0.11.0", + "from": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz" }, "inherits": { "version": "2.0.1", - "from": "inherits@>=2.0.1 <2.1.0", + "from": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz" } } }, "setimmediate": { "version": "1.0.4", - "from": "setimmediate@>=1.0.1 <2.0.0", + "from": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.4.tgz", "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.4.tgz" }, "match-stream": { "version": "0.0.2", - "from": "match-stream@>=0.0.2 <1.0.0", + "from": "https://registry.npmjs.org/match-stream/-/match-stream-0.0.2.tgz", "resolved": "https://registry.npmjs.org/match-stream/-/match-stream-0.0.2.tgz", "dependencies": { "buffers": { "version": "0.1.1", - "from": "buffers@>=0.1.1 <0.2.0", + "from": "https://registry.npmjs.org/buffers/-/buffers-0.1.1.tgz", "resolved": "https://registry.npmjs.org/buffers/-/buffers-0.1.1.tgz" } } @@ -3379,32 +3379,32 @@ }, "canonical-path": { "version": "0.0.2", - "from": "canonical-path@0.0.2", + "from": "https://registry.npmjs.org/canonical-path/-/canonical-path-0.0.2.tgz", "resolved": "https://registry.npmjs.org/canonical-path/-/canonical-path-0.0.2.tgz" }, "cheerio": { "version": "0.17.0", - "from": "cheerio@>=0.17.0 <0.18.0", + "from": "https://registry.npmjs.org/cheerio/-/cheerio-0.17.0.tgz", "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-0.17.0.tgz", "dependencies": { "CSSselect": { "version": "0.4.1", - "from": "CSSselect@>=0.4.0 <0.5.0", + "from": "https://registry.npmjs.org/CSSselect/-/CSSselect-0.4.1.tgz", "resolved": "https://registry.npmjs.org/CSSselect/-/CSSselect-0.4.1.tgz", "dependencies": { "CSSwhat": { "version": "0.4.7", - "from": "CSSwhat@>=0.4.0 <0.5.0", + "from": "https://registry.npmjs.org/CSSwhat/-/CSSwhat-0.4.7.tgz", "resolved": "https://registry.npmjs.org/CSSwhat/-/CSSwhat-0.4.7.tgz" }, "domutils": { "version": "1.4.3", - "from": "domutils@>=1.4.0 <1.5.0", + "from": "https://registry.npmjs.org/domutils/-/domutils-1.4.3.tgz", "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.4.3.tgz", "dependencies": { "domelementtype": { "version": "1.3.0", - "from": "domelementtype@>=1.0.0 <2.0.0", + "from": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.0.tgz", "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.0.tgz" } } @@ -3413,71 +3413,71 @@ }, "entities": { "version": "1.1.1", - "from": "entities@>=1.1.1 <1.2.0", + "from": "https://registry.npmjs.org/entities/-/entities-1.1.1.tgz", "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.1.tgz" }, "htmlparser2": { "version": "3.7.3", - "from": "htmlparser2@>=3.7.2 <3.8.0", + "from": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.7.3.tgz", "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.7.3.tgz", "dependencies": { "domhandler": { "version": "2.2.1", - "from": "domhandler@>=2.2.0 <2.3.0", + "from": "https://registry.npmjs.org/domhandler/-/domhandler-2.2.1.tgz", "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.2.1.tgz" }, "domutils": { "version": "1.5.1", - "from": "domutils@>=1.5.0 <1.6.0", + "from": "https://registry.npmjs.org/domutils/-/domutils-1.5.1.tgz", "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.5.1.tgz" }, "domelementtype": { "version": "1.3.0", - "from": "domelementtype@>=1.0.0 <2.0.0", + "from": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.0.tgz", "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.0.tgz" }, "readable-stream": { "version": "1.1.14", - "from": "readable-stream@>=1.1.0 <1.2.0", + "from": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", "dependencies": { "core-util-is": { "version": "1.0.2", - "from": "core-util-is@>=1.0.0 <1.1.0", + "from": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz" }, "isarray": { "version": "0.0.1", - "from": "isarray@0.0.1", + "from": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz" }, "string_decoder": { "version": "0.10.31", - "from": "string_decoder@>=0.10.0 <0.11.0", + "from": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz" }, "inherits": { "version": "2.0.1", - "from": "inherits@>=2.0.1 <2.1.0", + "from": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz" } } }, "entities": { "version": "1.0.0", - "from": "entities@>=1.0.0 <1.1.0", + "from": "https://registry.npmjs.org/entities/-/entities-1.0.0.tgz", "resolved": "https://registry.npmjs.org/entities/-/entities-1.0.0.tgz" } } }, "dom-serializer": { "version": "0.0.1", - "from": "dom-serializer@>=0.0.0 <0.1.0", + "from": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.0.1.tgz", "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.0.1.tgz", "dependencies": { "domelementtype": { "version": "1.1.3", - "from": "domelementtype@>=1.1.1 <1.2.0", + "from": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.1.3.tgz", "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.1.3.tgz" } } @@ -3486,90 +3486,90 @@ }, "commitizen": { "version": "2.8.1", - "from": "commitizen@>=2.3.0 <3.0.0", + "from": "https://registry.npmjs.org/commitizen/-/commitizen-2.8.1.tgz", "resolved": "https://registry.npmjs.org/commitizen/-/commitizen-2.8.1.tgz", "dependencies": { "chalk": { "version": "1.1.3", - "from": "chalk@1.1.3", + "from": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", "dependencies": { "ansi-styles": { "version": "2.2.1", - "from": "ansi-styles@>=2.2.1 <3.0.0", + "from": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz" }, "escape-string-regexp": { "version": "1.0.5", - "from": "escape-string-regexp@>=1.0.2 <2.0.0", + "from": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz" }, "has-ansi": { "version": "2.0.0", - "from": "has-ansi@>=2.0.0 <3.0.0", + "from": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", "dependencies": { "ansi-regex": { "version": "2.0.0", - "from": "ansi-regex@>=2.0.0 <3.0.0", + "from": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.0.0.tgz", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.0.0.tgz" } } }, "strip-ansi": { "version": "3.0.1", - "from": "strip-ansi@>=3.0.0 <4.0.0", + "from": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", "dependencies": { "ansi-regex": { "version": "2.0.0", - "from": "ansi-regex@>=2.0.0 <3.0.0", + "from": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.0.0.tgz", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.0.0.tgz" } } }, "supports-color": { "version": "2.0.0", - "from": "supports-color@>=2.0.0 <3.0.0", + "from": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz" } } }, "cz-conventional-changelog": { "version": "1.1.6", - "from": "cz-conventional-changelog@1.1.6", + "from": "https://registry.npmjs.org/cz-conventional-changelog/-/cz-conventional-changelog-1.1.6.tgz", "resolved": "https://registry.npmjs.org/cz-conventional-changelog/-/cz-conventional-changelog-1.1.6.tgz", "dependencies": { "word-wrap": { "version": "1.1.0", - "from": "word-wrap@>=1.0.3 <2.0.0", + "from": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.1.0.tgz", "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.1.0.tgz" } } }, "dedent": { "version": "0.6.0", - "from": "dedent@0.6.0", + "from": "https://registry.npmjs.org/dedent/-/dedent-0.6.0.tgz", "resolved": "https://registry.npmjs.org/dedent/-/dedent-0.6.0.tgz" }, "detect-indent": { "version": "4.0.0", - "from": "detect-indent@4.0.0", + "from": "https://registry.npmjs.org/detect-indent/-/detect-indent-4.0.0.tgz", "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-4.0.0.tgz", "dependencies": { "repeating": { "version": "2.0.1", - "from": "repeating@>=2.0.0 <3.0.0", + "from": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz", "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz", "dependencies": { "is-finite": { "version": "1.0.1", - "from": "is-finite@>=1.0.0 <2.0.0", + "from": "https://registry.npmjs.org/is-finite/-/is-finite-1.0.1.tgz", "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.0.1.tgz", "dependencies": { "number-is-nan": { "version": "1.0.0", - "from": "number-is-nan@>=1.0.0 <2.0.0", + "from": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.0.tgz", "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.0.tgz" } } @@ -3580,54 +3580,54 @@ }, "find-node-modules": { "version": "1.0.1", - "from": "find-node-modules@1.0.1", + "from": "https://registry.npmjs.org/find-node-modules/-/find-node-modules-1.0.1.tgz", "resolved": "https://registry.npmjs.org/find-node-modules/-/find-node-modules-1.0.1.tgz", "dependencies": { "findup-sync": { "version": "0.2.1", - "from": "findup-sync@>=0.2.1 <0.3.0", + "from": "https://registry.npmjs.org/findup-sync/-/findup-sync-0.2.1.tgz", "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-0.2.1.tgz", "dependencies": { "glob": { "version": "4.3.5", - "from": "glob@>=4.3.0 <4.4.0", + "from": "https://registry.npmjs.org/glob/-/glob-4.3.5.tgz", "resolved": "https://registry.npmjs.org/glob/-/glob-4.3.5.tgz", "dependencies": { "inflight": { "version": "1.0.4", - "from": "inflight@>=1.0.4 <2.0.0", + "from": "https://registry.npmjs.org/inflight/-/inflight-1.0.4.tgz", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.4.tgz", "dependencies": { "wrappy": { "version": "1.0.1", - "from": "wrappy@>=1.0.0 <2.0.0", + "from": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.1.tgz", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.1.tgz" } } }, "inherits": { "version": "2.0.1", - "from": "inherits@>=2.0.0 <3.0.0", + "from": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz" }, "minimatch": { "version": "2.0.10", - "from": "minimatch@>=2.0.1 <3.0.0", + "from": "https://registry.npmjs.org/minimatch/-/minimatch-2.0.10.tgz", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-2.0.10.tgz", "dependencies": { "brace-expansion": { "version": "1.1.4", - "from": "brace-expansion@>=1.0.0 <2.0.0", + "from": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.4.tgz", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.4.tgz", "dependencies": { "balanced-match": { "version": "0.4.1", - "from": "balanced-match@>=0.4.1 <0.5.0", + "from": "https://registry.npmjs.org/balanced-match/-/balanced-match-0.4.1.tgz", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-0.4.1.tgz" }, "concat-map": { "version": "0.0.1", - "from": "concat-map@0.0.1", + "from": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz" } } @@ -3636,12 +3636,12 @@ }, "once": { "version": "1.3.3", - "from": "once@>=1.3.0 <2.0.0", + "from": "https://registry.npmjs.org/once/-/once-1.3.3.tgz", "resolved": "https://registry.npmjs.org/once/-/once-1.3.3.tgz", "dependencies": { "wrappy": { "version": "1.0.1", - "from": "wrappy@>=1.0.0 <2.0.0", + "from": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.1.tgz", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.1.tgz" } } @@ -3652,56 +3652,56 @@ }, "merge": { "version": "1.2.0", - "from": "merge@>=1.2.0 <2.0.0", + "from": "https://registry.npmjs.org/merge/-/merge-1.2.0.tgz", "resolved": "https://registry.npmjs.org/merge/-/merge-1.2.0.tgz" } } }, "find-root": { "version": "1.0.0", - "from": "find-root@>=1.0.0 <2.0.0", + "from": "https://registry.npmjs.org/find-root/-/find-root-1.0.0.tgz", "resolved": "https://registry.npmjs.org/find-root/-/find-root-1.0.0.tgz" }, "glob": { "version": "7.0.3", - "from": "glob@7.0.3", + "from": "https://registry.npmjs.org/glob/-/glob-7.0.3.tgz", "resolved": "https://registry.npmjs.org/glob/-/glob-7.0.3.tgz", "dependencies": { "inflight": { "version": "1.0.4", - "from": "inflight@>=1.0.4 <2.0.0", + "from": "https://registry.npmjs.org/inflight/-/inflight-1.0.4.tgz", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.4.tgz", "dependencies": { "wrappy": { "version": "1.0.1", - "from": "wrappy@>=1.0.0 <2.0.0", + "from": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.1.tgz", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.1.tgz" } } }, "inherits": { "version": "2.0.1", - "from": "inherits@>=2.0.0 <3.0.0", + "from": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz" }, "minimatch": { "version": "3.0.0", - "from": "minimatch@>=2.0.0 <3.0.0||>=3.0.0 <4.0.0", + "from": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.0.tgz", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.0.tgz", "dependencies": { "brace-expansion": { "version": "1.1.4", - "from": "brace-expansion@>=1.0.0 <2.0.0", + "from": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.4.tgz", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.4.tgz", "dependencies": { "balanced-match": { "version": "0.4.1", - "from": "balanced-match@>=0.4.1 <0.5.0", + "from": "https://registry.npmjs.org/balanced-match/-/balanced-match-0.4.1.tgz", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-0.4.1.tgz" }, "concat-map": { "version": "0.0.1", - "from": "concat-map@0.0.1", + "from": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz" } } @@ -3710,98 +3710,98 @@ }, "once": { "version": "1.3.3", - "from": "once@>=1.3.0 <2.0.0", + "from": "https://registry.npmjs.org/once/-/once-1.3.3.tgz", "resolved": "https://registry.npmjs.org/once/-/once-1.3.3.tgz", "dependencies": { "wrappy": { "version": "1.0.1", - "from": "wrappy@>=1.0.0 <2.0.0", + "from": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.1.tgz", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.1.tgz" } } }, "path-is-absolute": { "version": "1.0.0", - "from": "path-is-absolute@>=1.0.0 <2.0.0", + "from": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.0.tgz", "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.0.tgz" } } }, "gulp": { "version": "3.9.1", - "from": "gulp@3.9.1", + "from": "https://registry.npmjs.org/gulp/-/gulp-3.9.1.tgz", "resolved": "https://registry.npmjs.org/gulp/-/gulp-3.9.1.tgz", "dependencies": { "archy": { "version": "1.0.0", - "from": "archy@>=1.0.0 <2.0.0", + "from": "https://registry.npmjs.org/archy/-/archy-1.0.0.tgz", "resolved": "https://registry.npmjs.org/archy/-/archy-1.0.0.tgz" }, "deprecated": { "version": "0.0.1", - "from": "deprecated@>=0.0.1 <0.0.2", + "from": "https://registry.npmjs.org/deprecated/-/deprecated-0.0.1.tgz", "resolved": "https://registry.npmjs.org/deprecated/-/deprecated-0.0.1.tgz" }, "interpret": { "version": "1.0.1", - "from": "interpret@>=1.0.0 <2.0.0", + "from": "https://registry.npmjs.org/interpret/-/interpret-1.0.1.tgz", "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.0.1.tgz" }, "liftoff": { "version": "2.2.1", - "from": "liftoff@>=2.1.0 <3.0.0", + "from": "https://registry.npmjs.org/liftoff/-/liftoff-2.2.1.tgz", "resolved": "https://registry.npmjs.org/liftoff/-/liftoff-2.2.1.tgz", "dependencies": { "extend": { "version": "2.0.1", - "from": "extend@>=2.0.1 <3.0.0", + "from": "https://registry.npmjs.org/extend/-/extend-2.0.1.tgz", "resolved": "https://registry.npmjs.org/extend/-/extend-2.0.1.tgz" }, "findup-sync": { "version": "0.3.0", - "from": "findup-sync@>=0.3.0 <0.4.0", + "from": "https://registry.npmjs.org/findup-sync/-/findup-sync-0.3.0.tgz", "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-0.3.0.tgz", "dependencies": { "glob": { "version": "5.0.15", - "from": "glob@>=5.0.0 <5.1.0", + "from": "https://registry.npmjs.org/glob/-/glob-5.0.15.tgz", "resolved": "https://registry.npmjs.org/glob/-/glob-5.0.15.tgz", "dependencies": { "inflight": { "version": "1.0.4", - "from": "inflight@>=1.0.4 <2.0.0", + "from": "https://registry.npmjs.org/inflight/-/inflight-1.0.4.tgz", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.4.tgz", "dependencies": { "wrappy": { "version": "1.0.1", - "from": "wrappy@>=1.0.0 <2.0.0", + "from": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.1.tgz", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.1.tgz" } } }, "inherits": { "version": "2.0.1", - "from": "inherits@>=2.0.0 <3.0.0", + "from": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz" }, "minimatch": { "version": "3.0.0", - "from": "minimatch@>=2.0.0 <3.0.0||>=3.0.0 <4.0.0", + "from": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.0.tgz", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.0.tgz", "dependencies": { "brace-expansion": { "version": "1.1.4", - "from": "brace-expansion@>=1.0.0 <2.0.0", + "from": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.4.tgz", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.4.tgz", "dependencies": { "balanced-match": { "version": "0.4.1", - "from": "balanced-match@>=0.4.1 <0.5.0", + "from": "https://registry.npmjs.org/balanced-match/-/balanced-match-0.4.1.tgz", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-0.4.1.tgz" }, "concat-map": { "version": "0.0.1", - "from": "concat-map@0.0.1", + "from": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz" } } @@ -3810,19 +3810,19 @@ }, "once": { "version": "1.3.3", - "from": "once@>=1.3.0 <2.0.0", + "from": "https://registry.npmjs.org/once/-/once-1.3.3.tgz", "resolved": "https://registry.npmjs.org/once/-/once-1.3.3.tgz", "dependencies": { "wrappy": { "version": "1.0.1", - "from": "wrappy@>=1.0.0 <2.0.0", + "from": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.1.tgz", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.1.tgz" } } }, "path-is-absolute": { "version": "1.0.0", - "from": "path-is-absolute@>=1.0.0 <2.0.0", + "from": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.0.tgz", "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.0.tgz" } } @@ -3831,39 +3831,39 @@ }, "flagged-respawn": { "version": "0.3.2", - "from": "flagged-respawn@>=0.3.2 <0.4.0", + "from": "https://registry.npmjs.org/flagged-respawn/-/flagged-respawn-0.3.2.tgz", "resolved": "https://registry.npmjs.org/flagged-respawn/-/flagged-respawn-0.3.2.tgz" }, "rechoir": { "version": "0.6.2", - "from": "rechoir@>=0.6.0 <0.7.0", + "from": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz" }, "resolve": { "version": "1.1.7", - "from": "resolve@>=1.1.6 <2.0.0", + "from": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz" } } }, "orchestrator": { "version": "0.3.7", - "from": "orchestrator@>=0.3.0 <0.4.0", + "from": "https://registry.npmjs.org/orchestrator/-/orchestrator-0.3.7.tgz", "resolved": "https://registry.npmjs.org/orchestrator/-/orchestrator-0.3.7.tgz", "dependencies": { "end-of-stream": { "version": "0.1.5", - "from": "end-of-stream@>=0.1.5 <0.2.0", + "from": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-0.1.5.tgz", "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-0.1.5.tgz", "dependencies": { "once": { "version": "1.3.3", - "from": "once@>=1.3.0 <1.4.0", + "from": "https://registry.npmjs.org/once/-/once-1.3.3.tgz", "resolved": "https://registry.npmjs.org/once/-/once-1.3.3.tgz", "dependencies": { "wrappy": { "version": "1.0.1", - "from": "wrappy@>=1.0.0 <2.0.0", + "from": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.1.tgz", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.1.tgz" } } @@ -3872,102 +3872,102 @@ }, "sequencify": { "version": "0.0.7", - "from": "sequencify@>=0.0.7 <0.1.0", + "from": "https://registry.npmjs.org/sequencify/-/sequencify-0.0.7.tgz", "resolved": "https://registry.npmjs.org/sequencify/-/sequencify-0.0.7.tgz" }, "stream-consume": { "version": "0.1.0", - "from": "stream-consume@>=0.1.0 <0.2.0", + "from": "https://registry.npmjs.org/stream-consume/-/stream-consume-0.1.0.tgz", "resolved": "https://registry.npmjs.org/stream-consume/-/stream-consume-0.1.0.tgz" } } }, "pretty-hrtime": { "version": "1.0.2", - "from": "pretty-hrtime@>=1.0.0 <2.0.0", + "from": "https://registry.npmjs.org/pretty-hrtime/-/pretty-hrtime-1.0.2.tgz", "resolved": "https://registry.npmjs.org/pretty-hrtime/-/pretty-hrtime-1.0.2.tgz" }, "semver": { "version": "4.3.6", - "from": "semver@>=4.1.0 <5.0.0", + "from": "https://registry.npmjs.org/semver/-/semver-4.3.6.tgz", "resolved": "https://registry.npmjs.org/semver/-/semver-4.3.6.tgz" }, "tildify": { "version": "1.2.0", - "from": "tildify@>=1.0.0 <2.0.0", + "from": "https://registry.npmjs.org/tildify/-/tildify-1.2.0.tgz", "resolved": "https://registry.npmjs.org/tildify/-/tildify-1.2.0.tgz", "dependencies": { "os-homedir": { "version": "1.0.1", - "from": "os-homedir@>=1.0.0 <2.0.0", + "from": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.1.tgz", "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.1.tgz" } } }, "v8flags": { "version": "2.0.11", - "from": "v8flags@>=2.0.2 <3.0.0", + "from": "https://registry.npmjs.org/v8flags/-/v8flags-2.0.11.tgz", "resolved": "https://registry.npmjs.org/v8flags/-/v8flags-2.0.11.tgz", "dependencies": { "user-home": { "version": "1.1.1", - "from": "user-home@>=1.1.1 <2.0.0", + "from": "https://registry.npmjs.org/user-home/-/user-home-1.1.1.tgz", "resolved": "https://registry.npmjs.org/user-home/-/user-home-1.1.1.tgz" } } }, "vinyl-fs": { "version": "0.3.14", - "from": "vinyl-fs@>=0.3.0 <0.4.0", + "from": "https://registry.npmjs.org/vinyl-fs/-/vinyl-fs-0.3.14.tgz", "resolved": "https://registry.npmjs.org/vinyl-fs/-/vinyl-fs-0.3.14.tgz", "dependencies": { "defaults": { "version": "1.0.3", - "from": "defaults@>=1.0.0 <2.0.0", + "from": "https://registry.npmjs.org/defaults/-/defaults-1.0.3.tgz", "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.3.tgz", "dependencies": { "clone": { "version": "1.0.2", - "from": "clone@>=1.0.2 <2.0.0", + "from": "https://registry.npmjs.org/clone/-/clone-1.0.2.tgz", "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.2.tgz" } } }, "glob-stream": { "version": "3.1.18", - "from": "glob-stream@>=3.1.5 <4.0.0", + "from": "https://registry.npmjs.org/glob-stream/-/glob-stream-3.1.18.tgz", "resolved": "https://registry.npmjs.org/glob-stream/-/glob-stream-3.1.18.tgz", "dependencies": { "glob": { "version": "4.5.3", - "from": "glob@>=4.3.1 <5.0.0", + "from": "https://registry.npmjs.org/glob/-/glob-4.5.3.tgz", "resolved": "https://registry.npmjs.org/glob/-/glob-4.5.3.tgz", "dependencies": { "inflight": { "version": "1.0.4", - "from": "inflight@>=1.0.4 <2.0.0", + "from": "https://registry.npmjs.org/inflight/-/inflight-1.0.4.tgz", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.4.tgz", "dependencies": { "wrappy": { "version": "1.0.1", - "from": "wrappy@>=1.0.0 <2.0.0", + "from": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.1.tgz", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.1.tgz" } } }, "inherits": { "version": "2.0.1", - "from": "inherits@>=2.0.0 <3.0.0", + "from": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz" }, "once": { "version": "1.3.3", - "from": "once@>=1.3.0 <2.0.0", + "from": "https://registry.npmjs.org/once/-/once-1.3.3.tgz", "resolved": "https://registry.npmjs.org/once/-/once-1.3.3.tgz", "dependencies": { "wrappy": { "version": "1.0.1", - "from": "wrappy@>=1.0.0 <2.0.0", + "from": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.1.tgz", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.1.tgz" } } @@ -3976,22 +3976,22 @@ }, "minimatch": { "version": "2.0.10", - "from": "minimatch@>=2.0.1 <3.0.0", + "from": "https://registry.npmjs.org/minimatch/-/minimatch-2.0.10.tgz", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-2.0.10.tgz", "dependencies": { "brace-expansion": { "version": "1.1.4", - "from": "brace-expansion@>=1.0.0 <2.0.0", + "from": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.4.tgz", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.4.tgz", "dependencies": { "balanced-match": { "version": "0.4.1", - "from": "balanced-match@>=0.4.1 <0.5.0", + "from": "https://registry.npmjs.org/balanced-match/-/balanced-match-0.4.1.tgz", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-0.4.1.tgz" }, "concat-map": { "version": "0.0.1", - "from": "concat-map@0.0.1", + "from": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz" } } @@ -4000,78 +4000,78 @@ }, "ordered-read-streams": { "version": "0.1.0", - "from": "ordered-read-streams@>=0.1.0 <0.2.0", + "from": "https://registry.npmjs.org/ordered-read-streams/-/ordered-read-streams-0.1.0.tgz", "resolved": "https://registry.npmjs.org/ordered-read-streams/-/ordered-read-streams-0.1.0.tgz" }, "glob2base": { "version": "0.0.12", - "from": "glob2base@>=0.0.12 <0.0.13", + "from": "https://registry.npmjs.org/glob2base/-/glob2base-0.0.12.tgz", "resolved": "https://registry.npmjs.org/glob2base/-/glob2base-0.0.12.tgz", "dependencies": { "find-index": { "version": "0.1.1", - "from": "find-index@>=0.1.1 <0.2.0", + "from": "https://registry.npmjs.org/find-index/-/find-index-0.1.1.tgz", "resolved": "https://registry.npmjs.org/find-index/-/find-index-0.1.1.tgz" } } }, "unique-stream": { "version": "1.0.0", - "from": "unique-stream@>=1.0.0 <2.0.0", + "from": "https://registry.npmjs.org/unique-stream/-/unique-stream-1.0.0.tgz", "resolved": "https://registry.npmjs.org/unique-stream/-/unique-stream-1.0.0.tgz" } } }, "glob-watcher": { "version": "0.0.6", - "from": "glob-watcher@>=0.0.6 <0.0.7", + "from": "https://registry.npmjs.org/glob-watcher/-/glob-watcher-0.0.6.tgz", "resolved": "https://registry.npmjs.org/glob-watcher/-/glob-watcher-0.0.6.tgz", "dependencies": { "gaze": { "version": "0.5.2", - "from": "gaze@>=0.5.1 <0.6.0", + "from": "https://registry.npmjs.org/gaze/-/gaze-0.5.2.tgz", "resolved": "https://registry.npmjs.org/gaze/-/gaze-0.5.2.tgz", "dependencies": { "globule": { "version": "0.1.0", - "from": "globule@>=0.1.0 <0.2.0", + "from": "https://registry.npmjs.org/globule/-/globule-0.1.0.tgz", "resolved": "https://registry.npmjs.org/globule/-/globule-0.1.0.tgz", "dependencies": { "lodash": { "version": "1.0.2", - "from": "lodash@>=1.0.1 <1.1.0", + "from": "https://registry.npmjs.org/lodash/-/lodash-1.0.2.tgz", "resolved": "https://registry.npmjs.org/lodash/-/lodash-1.0.2.tgz" }, "glob": { "version": "3.1.21", - "from": "glob@>=3.1.21 <3.2.0", + "from": "https://registry.npmjs.org/glob/-/glob-3.1.21.tgz", "resolved": "https://registry.npmjs.org/glob/-/glob-3.1.21.tgz", "dependencies": { "graceful-fs": { "version": "1.2.3", - "from": "graceful-fs@>=1.2.0 <1.3.0", + "from": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-1.2.3.tgz", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-1.2.3.tgz" }, "inherits": { "version": "1.0.2", - "from": "inherits@>=1.0.0 <2.0.0", + "from": "https://registry.npmjs.org/inherits/-/inherits-1.0.2.tgz", "resolved": "https://registry.npmjs.org/inherits/-/inherits-1.0.2.tgz" } } }, "minimatch": { "version": "0.2.14", - "from": "minimatch@>=0.2.11 <0.3.0", + "from": "https://registry.npmjs.org/minimatch/-/minimatch-0.2.14.tgz", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-0.2.14.tgz", "dependencies": { "lru-cache": { "version": "2.7.3", - "from": "lru-cache@>=2.0.0 <3.0.0", + "from": "https://registry.npmjs.org/lru-cache/-/lru-cache-2.7.3.tgz", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-2.7.3.tgz" }, "sigmund": { "version": "1.0.1", - "from": "sigmund@>=1.0.0 <1.1.0", + "from": "https://registry.npmjs.org/sigmund/-/sigmund-1.0.1.tgz", "resolved": "https://registry.npmjs.org/sigmund/-/sigmund-1.0.1.tgz" } } @@ -4084,90 +4084,90 @@ }, "graceful-fs": { "version": "3.0.8", - "from": "graceful-fs@>=3.0.0 <4.0.0", + "from": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-3.0.8.tgz", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-3.0.8.tgz" }, "mkdirp": { "version": "0.5.1", - "from": "mkdirp@>=0.5.0 <0.6.0", + "from": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", "dependencies": { "minimist": { "version": "0.0.8", - "from": "minimist@0.0.8", + "from": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz" } } }, "strip-bom": { "version": "1.0.0", - "from": "strip-bom@>=1.0.0 <2.0.0", + "from": "https://registry.npmjs.org/strip-bom/-/strip-bom-1.0.0.tgz", "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-1.0.0.tgz", "dependencies": { "first-chunk-stream": { "version": "1.0.0", - "from": "first-chunk-stream@>=1.0.0 <2.0.0", + "from": "https://registry.npmjs.org/first-chunk-stream/-/first-chunk-stream-1.0.0.tgz", "resolved": "https://registry.npmjs.org/first-chunk-stream/-/first-chunk-stream-1.0.0.tgz" }, "is-utf8": { "version": "0.2.1", - "from": "is-utf8@>=0.2.0 <0.3.0", + "from": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz" } } }, "through2": { "version": "0.6.5", - "from": "through2@>=0.6.1 <0.7.0", + "from": "https://registry.npmjs.org/through2/-/through2-0.6.5.tgz", "resolved": "https://registry.npmjs.org/through2/-/through2-0.6.5.tgz", "dependencies": { "readable-stream": { "version": "1.0.34", - "from": "readable-stream@>=1.0.33-1 <1.1.0-0", + "from": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", "dependencies": { "core-util-is": { "version": "1.0.2", - "from": "core-util-is@>=1.0.0 <1.1.0", + "from": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz" }, "isarray": { "version": "0.0.1", - "from": "isarray@0.0.1", + "from": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz" }, "string_decoder": { "version": "0.10.31", - "from": "string_decoder@>=0.10.0 <0.11.0", + "from": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz" }, "inherits": { "version": "2.0.1", - "from": "inherits@>=2.0.1 <2.1.0", + "from": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz" } } }, "xtend": { "version": "4.0.1", - "from": "xtend@>=4.0.0 <4.1.0-0", + "from": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz" } } }, "vinyl": { "version": "0.4.6", - "from": "vinyl@>=0.4.0 <0.5.0", + "from": "https://registry.npmjs.org/vinyl/-/vinyl-0.4.6.tgz", "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-0.4.6.tgz", "dependencies": { "clone": { "version": "0.2.0", - "from": "clone@>=0.2.0 <0.3.0", + "from": "https://registry.npmjs.org/clone/-/clone-0.2.0.tgz", "resolved": "https://registry.npmjs.org/clone/-/clone-0.2.0.tgz" }, "clone-stats": { "version": "0.0.1", - "from": "clone-stats@>=0.0.1 <0.0.2", + "from": "https://registry.npmjs.org/clone-stats/-/clone-stats-0.0.1.tgz", "resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-0.0.1.tgz" } } @@ -4178,54 +4178,54 @@ }, "gulp-git": { "version": "1.7.1", - "from": "gulp-git@1.7.1", + "from": "https://registry.npmjs.org/gulp-git/-/gulp-git-1.7.1.tgz", "resolved": "https://registry.npmjs.org/gulp-git/-/gulp-git-1.7.1.tgz", "dependencies": { "any-shell-escape": { "version": "0.1.1", - "from": "any-shell-escape@>=0.1.1 <0.2.0", + "from": "https://registry.npmjs.org/any-shell-escape/-/any-shell-escape-0.1.1.tgz", "resolved": "https://registry.npmjs.org/any-shell-escape/-/any-shell-escape-0.1.1.tgz" }, "require-dir": { "version": "0.1.0", - "from": "require-dir@>=0.1.0 <0.2.0", + "from": "https://registry.npmjs.org/require-dir/-/require-dir-0.1.0.tgz", "resolved": "https://registry.npmjs.org/require-dir/-/require-dir-0.1.0.tgz" }, "through2": { "version": "0.6.5", - "from": "through2@>=0.6.5 <0.7.0", + "from": "https://registry.npmjs.org/through2/-/through2-0.6.5.tgz", "resolved": "https://registry.npmjs.org/through2/-/through2-0.6.5.tgz", "dependencies": { "readable-stream": { "version": "1.0.34", - "from": "readable-stream@>=1.0.33-1 <1.1.0-0", + "from": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", "dependencies": { "core-util-is": { "version": "1.0.2", - "from": "core-util-is@>=1.0.0 <1.1.0", + "from": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz" }, "isarray": { "version": "0.0.1", - "from": "isarray@0.0.1", + "from": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz" }, "string_decoder": { "version": "0.10.31", - "from": "string_decoder@>=0.10.0 <0.11.0", + "from": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz" }, "inherits": { "version": "2.0.1", - "from": "inherits@>=2.0.1 <2.1.0", + "from": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz" } } }, "xtend": { "version": "4.0.1", - "from": "xtend@>=4.0.0 <4.1.0-0", + "from": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz" } } @@ -4234,49 +4234,49 @@ }, "home-or-tmp": { "version": "2.0.0", - "from": "home-or-tmp@2.0.0", + "from": "https://registry.npmjs.org/home-or-tmp/-/home-or-tmp-2.0.0.tgz", "resolved": "https://registry.npmjs.org/home-or-tmp/-/home-or-tmp-2.0.0.tgz", "dependencies": { "os-homedir": { "version": "1.0.1", - "from": "os-homedir@>=1.0.0 <2.0.0", + "from": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.1.tgz", "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.1.tgz" }, "os-tmpdir": { "version": "1.0.1", - "from": "os-tmpdir@>=1.0.1 <2.0.0", + "from": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.1.tgz", "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.1.tgz" } } }, "inquirer": { "version": "1.0.2", - "from": "inquirer@1.0.2", + "from": "https://registry.npmjs.org/inquirer/-/inquirer-1.0.2.tgz", "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-1.0.2.tgz", "dependencies": { "ansi-escapes": { "version": "1.4.0", - "from": "ansi-escapes@>=1.1.0 <2.0.0", + "from": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-1.4.0.tgz", "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-1.4.0.tgz" }, "cli-cursor": { "version": "1.0.2", - "from": "cli-cursor@>=1.0.1 <2.0.0", + "from": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-1.0.2.tgz", "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-1.0.2.tgz", "dependencies": { "restore-cursor": { "version": "1.0.1", - "from": "restore-cursor@>=1.0.1 <2.0.0", + "from": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-1.0.1.tgz", "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-1.0.1.tgz", "dependencies": { "exit-hook": { "version": "1.1.1", - "from": "exit-hook@>=1.0.0 <2.0.0", + "from": "https://registry.npmjs.org/exit-hook/-/exit-hook-1.1.1.tgz", "resolved": "https://registry.npmjs.org/exit-hook/-/exit-hook-1.1.1.tgz" }, "onetime": { "version": "1.1.0", - "from": "onetime@>=1.0.0 <2.0.0", + "from": "https://registry.npmjs.org/onetime/-/onetime-1.1.0.tgz", "resolved": "https://registry.npmjs.org/onetime/-/onetime-1.1.0.tgz" } } @@ -4285,73 +4285,73 @@ }, "cli-width": { "version": "2.1.0", - "from": "cli-width@>=2.0.0 <3.0.0", + "from": "https://registry.npmjs.org/cli-width/-/cli-width-2.1.0.tgz", "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.1.0.tgz" }, "figures": { "version": "1.6.0", - "from": "figures@>=1.3.5 <2.0.0", + "from": "https://registry.npmjs.org/figures/-/figures-1.6.0.tgz", "resolved": "https://registry.npmjs.org/figures/-/figures-1.6.0.tgz" }, "mute-stream": { "version": "0.0.6", - "from": "mute-stream@0.0.6", + "from": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.6.tgz", "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.6.tgz" }, "pinkie-promise": { "version": "2.0.1", - "from": "pinkie-promise@>=2.0.0 <3.0.0", + "from": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", "dependencies": { "pinkie": { "version": "2.0.4", - "from": "pinkie@>=2.0.0 <3.0.0", + "from": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz" } } }, "run-async": { "version": "2.2.0", - "from": "run-async@>=2.2.0 <3.0.0", + "from": "https://registry.npmjs.org/run-async/-/run-async-2.2.0.tgz", "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.2.0.tgz", "dependencies": { "is-promise": { "version": "2.1.0", - "from": "is-promise@>=2.1.0 <3.0.0", + "from": "https://registry.npmjs.org/is-promise/-/is-promise-2.1.0.tgz", "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.1.0.tgz" } } }, "rx": { "version": "4.1.0", - "from": "rx@>=4.1.0 <5.0.0", + "from": "https://registry.npmjs.org/rx/-/rx-4.1.0.tgz", "resolved": "https://registry.npmjs.org/rx/-/rx-4.1.0.tgz" }, "string-width": { "version": "1.0.1", - "from": "string-width@>=1.0.1 <2.0.0", + "from": "https://registry.npmjs.org/string-width/-/string-width-1.0.1.tgz", "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.1.tgz", "dependencies": { "code-point-at": { "version": "1.0.0", - "from": "code-point-at@>=1.0.0 <2.0.0", + "from": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.0.0.tgz", "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.0.0.tgz", "dependencies": { "number-is-nan": { "version": "1.0.0", - "from": "number-is-nan@>=1.0.0 <2.0.0", + "from": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.0.tgz", "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.0.tgz" } } }, "is-fullwidth-code-point": { "version": "1.0.0", - "from": "is-fullwidth-code-point@>=1.0.0 <2.0.0", + "from": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", "dependencies": { "number-is-nan": { "version": "1.0.0", - "from": "number-is-nan@>=1.0.0 <2.0.0", + "from": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.0.tgz", "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.0.tgz" } } @@ -4360,137 +4360,137 @@ }, "strip-ansi": { "version": "3.0.1", - "from": "strip-ansi@>=3.0.0 <4.0.0", + "from": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", "dependencies": { "ansi-regex": { "version": "2.0.0", - "from": "ansi-regex@>=2.0.0 <3.0.0", + "from": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.0.0.tgz", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.0.0.tgz" } } }, "through": { "version": "2.3.8", - "from": "through@>=2.3.6 <3.0.0", + "from": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz" } } }, "lodash": { "version": "4.11.1", - "from": "lodash@4.11.1", + "from": "https://registry.npmjs.org/lodash/-/lodash-4.11.1.tgz", "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.11.1.tgz" }, "minimist": { "version": "1.2.0", - "from": "minimist@1.2.0", + "from": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz" }, "shelljs": { "version": "0.5.3", - "from": "shelljs@0.5.3", + "from": "https://registry.npmjs.org/shelljs/-/shelljs-0.5.3.tgz", "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.5.3.tgz" } } }, "cz-conventional-changelog": { "version": "1.1.4", - "from": "cz-conventional-changelog@1.1.4", + "from": "https://registry.npmjs.org/cz-conventional-changelog/-/cz-conventional-changelog-1.1.4.tgz", "resolved": "https://registry.npmjs.org/cz-conventional-changelog/-/cz-conventional-changelog-1.1.4.tgz", "dependencies": { "word-wrap": { "version": "1.1.0", - "from": "word-wrap@>=1.0.3 <2.0.0", + "from": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.1.0.tgz", "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.1.0.tgz" } } }, "dgeni": { "version": "0.4.2", - "from": "dgeni@>=0.4.0 <0.5.0", + "from": "https://registry.npmjs.org/dgeni/-/dgeni-0.4.2.tgz", "resolved": "https://registry.npmjs.org/dgeni/-/dgeni-0.4.2.tgz", "dependencies": { "dependency-graph": { "version": "0.4.1", - "from": "dependency-graph@>=0.4.1 <0.5.0", + "from": "https://registry.npmjs.org/dependency-graph/-/dependency-graph-0.4.1.tgz", "resolved": "https://registry.npmjs.org/dependency-graph/-/dependency-graph-0.4.1.tgz" }, "di": { "version": "0.0.1", - "from": "di@0.0.1", + "from": "https://registry.npmjs.org/di/-/di-0.0.1.tgz", "resolved": "https://registry.npmjs.org/di/-/di-0.0.1.tgz" }, "lodash": { "version": "3.10.1", - "from": "lodash@>=3.10.1 <4.0.0", + "from": "https://registry.npmjs.org/lodash/-/lodash-3.10.1.tgz", "resolved": "https://registry.npmjs.org/lodash/-/lodash-3.10.1.tgz" }, "optimist": { "version": "0.6.1", - "from": "optimist@>=0.6.1 <0.7.0", + "from": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz", "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz", "dependencies": { "wordwrap": { "version": "0.0.3", - "from": "wordwrap@>=0.0.2 <0.1.0", + "from": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz", "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz" }, "minimist": { "version": "0.0.10", - "from": "minimist@>=0.0.1 <0.1.0", + "from": "https://registry.npmjs.org/minimist/-/minimist-0.0.10.tgz", "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.10.tgz" } } }, "q": { "version": "1.4.1", - "from": "q@>=1.4.1 <1.5.0", + "from": "https://registry.npmjs.org/q/-/q-1.4.1.tgz", "resolved": "https://registry.npmjs.org/q/-/q-1.4.1.tgz" }, "validate.js": { "version": "0.9.0", - "from": "validate.js@>=0.9.0 <0.10.0", + "from": "https://registry.npmjs.org/validate.js/-/validate.js-0.9.0.tgz", "resolved": "https://registry.npmjs.org/validate.js/-/validate.js-0.9.0.tgz" }, "winston": { "version": "2.2.0", - "from": "winston@>=2.1.1 <3.0.0", + "from": "https://registry.npmjs.org/winston/-/winston-2.2.0.tgz", "resolved": "https://registry.npmjs.org/winston/-/winston-2.2.0.tgz", "dependencies": { "async": { "version": "1.0.0", - "from": "async@>=1.0.0 <1.1.0", + "from": "https://registry.npmjs.org/async/-/async-1.0.0.tgz", "resolved": "https://registry.npmjs.org/async/-/async-1.0.0.tgz" }, "colors": { "version": "1.0.3", - "from": "colors@>=1.0.0 <1.1.0", + "from": "https://registry.npmjs.org/colors/-/colors-1.0.3.tgz", "resolved": "https://registry.npmjs.org/colors/-/colors-1.0.3.tgz" }, "cycle": { "version": "1.0.3", - "from": "cycle@>=1.0.0 <1.1.0", + "from": "https://registry.npmjs.org/cycle/-/cycle-1.0.3.tgz", "resolved": "https://registry.npmjs.org/cycle/-/cycle-1.0.3.tgz" }, "eyes": { "version": "0.1.8", - "from": "eyes@>=0.1.0 <0.2.0", + "from": "https://registry.npmjs.org/eyes/-/eyes-0.1.8.tgz", "resolved": "https://registry.npmjs.org/eyes/-/eyes-0.1.8.tgz" }, "isstream": { "version": "0.1.2", - "from": "isstream@>=0.1.0 <0.2.0", + "from": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz" }, "pkginfo": { "version": "0.3.1", - "from": "pkginfo@>=0.3.0 <0.4.0", + "from": "https://registry.npmjs.org/pkginfo/-/pkginfo-0.3.1.tgz", "resolved": "https://registry.npmjs.org/pkginfo/-/pkginfo-0.3.1.tgz" }, "stack-trace": { "version": "0.0.9", - "from": "stack-trace@>=0.0.0 <0.1.0", + "from": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.9.tgz", "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.9.tgz" } } @@ -4498,9 +4498,8 @@ } }, "dgeni-packages": { - "version": "0.13.0", - "from": "dgeni-packages@>=0.13.0 <0.14.0", - "resolved": "https://registry.npmjs.org/dgeni-packages/-/dgeni-packages-0.13.0.tgz", + "version": "0.14.0", + "from": "dgeni-packages@0.14.0", "dependencies": { "catharsis": { "version": "0.8.8", @@ -4522,24 +4521,29 @@ } }, "change-case": { - "version": "2.3.1", - "from": "change-case@>=2.1.0 <3.0.0", - "resolved": "https://registry.npmjs.org/change-case/-/change-case-2.3.1.tgz", + "version": "3.0.0", + "from": "change-case@3.0.0", + "resolved": "https://registry.npmjs.org/change-case/-/change-case-3.0.0.tgz", "dependencies": { "camel-case": { - "version": "1.2.2", - "from": "camel-case@>=1.1.1 <2.0.0", - "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-1.2.2.tgz" + "version": "3.0.0", + "from": "camel-case@>=3.0.0 <4.0.0", + "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-3.0.0.tgz" }, "constant-case": { - "version": "1.1.2", - "from": "constant-case@>=1.1.0 <2.0.0", - "resolved": "https://registry.npmjs.org/constant-case/-/constant-case-1.1.2.tgz" + "version": "2.0.0", + "from": "constant-case@>=2.0.0 <3.0.0", + "resolved": "https://registry.npmjs.org/constant-case/-/constant-case-2.0.0.tgz" }, "dot-case": { - "version": "1.1.2", - "from": "dot-case@>=1.1.0 <2.0.0", - "resolved": "https://registry.npmjs.org/dot-case/-/dot-case-1.1.2.tgz" + "version": "2.1.0", + "from": "dot-case@>=2.1.0 <3.0.0", + "resolved": "https://registry.npmjs.org/dot-case/-/dot-case-2.1.0.tgz" + }, + "header-case": { + "version": "1.0.0", + "from": "header-case@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/header-case/-/header-case-1.0.0.tgz" }, "is-lower-case": { "version": "1.1.3", @@ -4561,30 +4565,35 @@ "from": "lower-case-first@>=1.0.0 <2.0.0", "resolved": "https://registry.npmjs.org/lower-case-first/-/lower-case-first-1.0.2.tgz" }, + "no-case": { + "version": "2.3.0", + "from": "no-case@>=2.2.0 <3.0.0", + "resolved": "https://registry.npmjs.org/no-case/-/no-case-2.3.0.tgz" + }, "param-case": { - "version": "1.1.2", - "from": "param-case@>=1.1.0 <2.0.0", - "resolved": "https://registry.npmjs.org/param-case/-/param-case-1.1.2.tgz" + "version": "2.1.0", + "from": "param-case@>=2.1.0 <3.0.0", + "resolved": "https://registry.npmjs.org/param-case/-/param-case-2.1.0.tgz" }, "pascal-case": { - "version": "1.1.2", - "from": "pascal-case@>=1.1.0 <2.0.0", - "resolved": "https://registry.npmjs.org/pascal-case/-/pascal-case-1.1.2.tgz" + "version": "2.0.0", + "from": "pascal-case@>=2.0.0 <3.0.0", + "resolved": "https://registry.npmjs.org/pascal-case/-/pascal-case-2.0.0.tgz" }, "path-case": { - "version": "1.1.2", - "from": "path-case@>=1.1.0 <2.0.0", - "resolved": "https://registry.npmjs.org/path-case/-/path-case-1.1.2.tgz" + "version": "2.1.0", + "from": "path-case@>=2.1.0 <3.0.0", + "resolved": "https://registry.npmjs.org/path-case/-/path-case-2.1.0.tgz" }, "sentence-case": { - "version": "1.1.3", - "from": "sentence-case@>=1.1.1 <2.0.0", - "resolved": "https://registry.npmjs.org/sentence-case/-/sentence-case-1.1.3.tgz" + "version": "2.1.0", + "from": "sentence-case@>=2.1.0 <3.0.0", + "resolved": "https://registry.npmjs.org/sentence-case/-/sentence-case-2.1.0.tgz" }, "snake-case": { - "version": "1.1.2", - "from": "snake-case@>=1.1.0 <2.0.0", - "resolved": "https://registry.npmjs.org/snake-case/-/snake-case-1.1.2.tgz" + "version": "2.1.0", + "from": "snake-case@>=2.1.0 <3.0.0", + "resolved": "https://registry.npmjs.org/snake-case/-/snake-case-2.1.0.tgz" }, "swap-case": { "version": "1.1.2", @@ -4592,9 +4601,9 @@ "resolved": "https://registry.npmjs.org/swap-case/-/swap-case-1.1.2.tgz" }, "title-case": { - "version": "1.1.2", - "from": "title-case@>=1.1.0 <2.0.0", - "resolved": "https://registry.npmjs.org/title-case/-/title-case-1.1.2.tgz" + "version": "2.1.0", + "from": "title-case@>=2.1.0 <3.0.0", + "resolved": "https://registry.npmjs.org/title-case/-/title-case-2.1.0.tgz" }, "upper-case": { "version": "1.1.3", @@ -4619,21 +4628,55 @@ "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz" }, "glob": { - "version": "3.2.11", - "from": "glob@>=3.2.8 <3.3.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-3.2.11.tgz", + "version": "7.0.5", + "from": "glob@>=7.0.5 <8.0.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.0.5.tgz", "dependencies": { + "fs.realpath": { + "version": "1.0.0", + "from": "fs.realpath@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz" + }, + "inflight": { + "version": "1.0.5", + "from": "inflight@>=1.0.4 <2.0.0", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.5.tgz", + "dependencies": { + "wrappy": { + "version": "1.0.2", + "from": "wrappy@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz" + } + } + }, "inherits": { "version": "2.0.1", - "from": "inherits@>=2.0.1 <2.1.0", + "from": "inherits@>=2.0.0 <3.0.0", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz" + }, + "once": { + "version": "1.3.3", + "from": "once@>=1.3.0 <2.0.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.3.3.tgz", + "dependencies": { + "wrappy": { + "version": "1.0.2", + "from": "wrappy@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz" + } + } + }, + "path-is-absolute": { + "version": "1.0.0", + "from": "path-is-absolute@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.0.tgz" } } }, "htmlparser2": { - "version": "3.9.0", + "version": "3.9.1", "from": "htmlparser2@>=3.7.3 <4.0.0", - "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.9.0.tgz", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.9.1.tgz", "dependencies": { "domelementtype": { "version": "1.3.0", @@ -4669,21 +4712,26 @@ "from": "entities@>=1.1.1 <2.0.0", "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.1.tgz" }, + "inherits": { + "version": "2.0.1", + "from": "inherits@>=2.0.0 <3.0.0", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz" + }, "readable-stream": { - "version": "2.1.2", + "version": "2.1.4", "from": "readable-stream@>=2.0.2 <3.0.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.1.2.tgz", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.1.4.tgz", "dependencies": { + "buffer-shims": { + "version": "1.0.0", + "from": "buffer-shims@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/buffer-shims/-/buffer-shims-1.0.0.tgz" + }, "core-util-is": { "version": "1.0.2", "from": "core-util-is@>=1.0.0 <1.1.0", "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz" }, - "inherits": { - "version": "2.0.1", - "from": "inherits@>=2.0.1 <2.1.0", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz" - }, "isarray": { "version": "1.0.0", "from": "isarray@>=1.0.0 <1.1.0", @@ -4708,20 +4756,32 @@ } } }, + "lodash": { + "version": "4.13.1", + "from": "lodash@>=4.13.1 <5.0.0", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.13.1.tgz" + }, "minimatch": { - "version": "0.3.0", - "from": "minimatch@>=0.3.0 <0.4.0", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-0.3.0.tgz", + "version": "3.0.2", + "from": "minimatch@>=3.0.2 <4.0.0", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.2.tgz", "dependencies": { - "lru-cache": { - "version": "2.7.3", - "from": "lru-cache@>=2.0.0 <3.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-2.7.3.tgz" - }, - "sigmund": { - "version": "1.0.1", - "from": "sigmund@>=1.0.0 <1.1.0", - "resolved": "https://registry.npmjs.org/sigmund/-/sigmund-1.0.1.tgz" + "brace-expansion": { + "version": "1.1.5", + "from": "brace-expansion@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.5.tgz", + "dependencies": { + "balanced-match": { + "version": "0.4.1", + "from": "balanced-match@>=0.4.1 <0.5.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-0.4.1.tgz" + }, + "concat-map": { + "version": "0.0.1", + "from": "concat-map@0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz" + } + } } } }, @@ -4819,9 +4879,9 @@ "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-0.3.8.tgz", "dependencies": { "nan": { - "version": "2.3.3", + "version": "2.3.5", "from": "nan@>=2.0.2 <3.0.0", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.3.3.tgz" + "resolved": "https://registry.npmjs.org/nan/-/nan-2.3.5.tgz" } } } @@ -4829,60 +4889,40 @@ } } }, - "q-io": { - "version": "1.10.9", - "from": "q-io@>=1.10.9 <1.11.0", - "resolved": "https://registry.npmjs.org/q-io/-/q-io-1.10.9.tgz", + "q": { + "version": "1.4.1", + "from": "q@>=1.4.1 <1.5.0", + "resolved": "https://registry.npmjs.org/q/-/q-1.4.1.tgz" + }, + "semver": { + "version": "5.2.0", + "from": "semver@>=5.2.0 <6.0.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.2.0.tgz" + }, + "shelljs": { + "version": "0.7.0", + "from": "shelljs@>=0.7.0 <0.8.0", + "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.7.0.tgz", "dependencies": { - "q": { - "version": "0.9.7", - "from": "q@>=0.9.7 <0.10.0", - "resolved": "https://registry.npmjs.org/q/-/q-0.9.7.tgz" - }, - "qs": { - "version": "0.1.0", - "from": "qs@>=0.1.0 <0.2.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-0.1.0.tgz" - }, - "url2": { - "version": "0.0.0", - "from": "url2@>=0.0.0 <0.1.0", - "resolved": "https://registry.npmjs.org/url2/-/url2-0.0.0.tgz" - }, - "mime": { - "version": "1.2.11", - "from": "mime@>=1.2.11 <1.3.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.2.11.tgz" - }, - "mimeparse": { - "version": "0.1.4", - "from": "mimeparse@>=0.1.4 <0.2.0", - "resolved": "https://registry.npmjs.org/mimeparse/-/mimeparse-0.1.4.tgz" + "interpret": { + "version": "1.0.1", + "from": "interpret@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.0.1.tgz" }, - "collections": { - "version": "0.2.2", - "from": "collections@>=0.2.0 <0.3.0", - "resolved": "https://registry.npmjs.org/collections/-/collections-0.2.2.tgz", + "rechoir": { + "version": "0.6.2", + "from": "rechoir@>=0.6.2 <0.7.0", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", "dependencies": { - "weak-map": { - "version": "1.0.0", - "from": "weak-map@1.0.0", - "resolved": "https://registry.npmjs.org/weak-map/-/weak-map-1.0.0.tgz" + "resolve": { + "version": "1.1.7", + "from": "resolve@>=1.1.6 <2.0.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz" } } } } }, - "semver": { - "version": "4.3.6", - "from": "semver@>=4.3.4 <5.0.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-4.3.6.tgz" - }, - "shelljs": { - "version": "0.5.3", - "from": "shelljs@>=0.5.0 <0.6.0", - "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.5.3.tgz" - }, "spdx-license-list": { "version": "2.1.0", "from": "spdx-license-list@>=2.1.0 <3.0.0", @@ -4892,226 +4932,91 @@ "version": "1.8.10", "from": "typescript@>=1.7.5 <2.0.0", "resolved": "https://registry.npmjs.org/typescript/-/typescript-1.8.10.tgz" - }, - "winston": { - "version": "0.7.3", - "from": "winston@>=0.7.2 <0.8.0", - "resolved": "https://registry.npmjs.org/winston/-/winston-0.7.3.tgz", - "dependencies": { - "async": { - "version": "0.2.10", - "from": "async@>=0.2.0 <0.3.0", - "resolved": "https://registry.npmjs.org/async/-/async-0.2.10.tgz" - }, - "colors": { - "version": "0.6.2", - "from": "colors@>=0.6.0 <0.7.0", - "resolved": "https://registry.npmjs.org/colors/-/colors-0.6.2.tgz" - }, - "cycle": { - "version": "1.0.3", - "from": "cycle@>=1.0.0 <1.1.0", - "resolved": "https://registry.npmjs.org/cycle/-/cycle-1.0.3.tgz" - }, - "eyes": { - "version": "0.1.8", - "from": "eyes@>=0.1.0 <0.2.0", - "resolved": "https://registry.npmjs.org/eyes/-/eyes-0.1.8.tgz" - }, - "pkginfo": { - "version": "0.3.1", - "from": "pkginfo@>=0.3.0 <0.4.0", - "resolved": "https://registry.npmjs.org/pkginfo/-/pkginfo-0.3.1.tgz" - }, - "request": { - "version": "2.16.6", - "from": "request@>=2.16.0 <2.17.0", - "resolved": "https://registry.npmjs.org/request/-/request-2.16.6.tgz", - "dependencies": { - "form-data": { - "version": "0.0.10", - "from": "form-data@>=0.0.3 <0.1.0", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-0.0.10.tgz", - "dependencies": { - "combined-stream": { - "version": "0.0.7", - "from": "combined-stream@>=0.0.4 <0.1.0", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-0.0.7.tgz", - "dependencies": { - "delayed-stream": { - "version": "0.0.5", - "from": "delayed-stream@0.0.5", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-0.0.5.tgz" - } - } - } - } - }, - "mime": { - "version": "1.2.11", - "from": "mime@>=1.2.7 <1.3.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.2.11.tgz" - }, - "hawk": { - "version": "0.10.2", - "from": "hawk@>=0.10.2 <0.11.0", - "resolved": "https://registry.npmjs.org/hawk/-/hawk-0.10.2.tgz", - "dependencies": { - "hoek": { - "version": "0.7.6", - "from": "hoek@>=0.7.0 <0.8.0", - "resolved": "https://registry.npmjs.org/hoek/-/hoek-0.7.6.tgz" - }, - "boom": { - "version": "0.3.8", - "from": "boom@>=0.3.0 <0.4.0", - "resolved": "https://registry.npmjs.org/boom/-/boom-0.3.8.tgz" - }, - "cryptiles": { - "version": "0.1.3", - "from": "cryptiles@>=0.1.0 <0.2.0", - "resolved": "https://registry.npmjs.org/cryptiles/-/cryptiles-0.1.3.tgz" - }, - "sntp": { - "version": "0.1.4", - "from": "sntp@>=0.1.0 <0.2.0", - "resolved": "https://registry.npmjs.org/sntp/-/sntp-0.1.4.tgz" - } - } - }, - "node-uuid": { - "version": "1.4.7", - "from": "node-uuid@>=1.4.0 <1.5.0", - "resolved": "https://registry.npmjs.org/node-uuid/-/node-uuid-1.4.7.tgz" - }, - "cookie-jar": { - "version": "0.2.0", - "from": "cookie-jar@>=0.2.0 <0.3.0", - "resolved": "https://registry.npmjs.org/cookie-jar/-/cookie-jar-0.2.0.tgz" - }, - "aws-sign": { - "version": "0.2.0", - "from": "aws-sign@>=0.2.0 <0.3.0", - "resolved": "https://registry.npmjs.org/aws-sign/-/aws-sign-0.2.0.tgz" - }, - "oauth-sign": { - "version": "0.2.0", - "from": "oauth-sign@>=0.2.0 <0.3.0", - "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.2.0.tgz" - }, - "forever-agent": { - "version": "0.2.0", - "from": "forever-agent@>=0.2.0 <0.3.0", - "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.2.0.tgz" - }, - "tunnel-agent": { - "version": "0.2.0", - "from": "tunnel-agent@>=0.2.0 <0.3.0", - "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.2.0.tgz" - }, - "json-stringify-safe": { - "version": "3.0.0", - "from": "json-stringify-safe@>=3.0.0 <3.1.0", - "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-3.0.0.tgz" - }, - "qs": { - "version": "0.5.6", - "from": "qs@>=0.5.4 <0.6.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-0.5.6.tgz" - } - } - }, - "stack-trace": { - "version": "0.0.9", - "from": "stack-trace@>=0.0.0 <0.1.0", - "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.9.tgz" - } - } } } }, "event-stream": { "version": "3.1.7", - "from": "event-stream@>=3.1.0 <3.2.0", + "from": "https://registry.npmjs.org/event-stream/-/event-stream-3.1.7.tgz", "resolved": "https://registry.npmjs.org/event-stream/-/event-stream-3.1.7.tgz", "dependencies": { "through": { "version": "2.3.8", - "from": "through@>=2.3.1 <2.4.0", + "from": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz" }, "duplexer": { "version": "0.1.1", - "from": "duplexer@>=0.1.1 <0.2.0", + "from": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.1.tgz", "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.1.tgz" }, "from": { "version": "0.1.3", - "from": "from@>=0.0.0 <1.0.0", + "from": "https://registry.npmjs.org/from/-/from-0.1.3.tgz", "resolved": "https://registry.npmjs.org/from/-/from-0.1.3.tgz" }, "map-stream": { "version": "0.1.0", - "from": "map-stream@>=0.1.0 <0.2.0", + "from": "https://registry.npmjs.org/map-stream/-/map-stream-0.1.0.tgz", "resolved": "https://registry.npmjs.org/map-stream/-/map-stream-0.1.0.tgz" }, "pause-stream": { "version": "0.0.11", - "from": "pause-stream@0.0.11", + "from": "https://registry.npmjs.org/pause-stream/-/pause-stream-0.0.11.tgz", "resolved": "https://registry.npmjs.org/pause-stream/-/pause-stream-0.0.11.tgz" }, "split": { "version": "0.2.10", - "from": "split@>=0.2.0 <0.3.0", + "from": "https://registry.npmjs.org/split/-/split-0.2.10.tgz", "resolved": "https://registry.npmjs.org/split/-/split-0.2.10.tgz" }, "stream-combiner": { "version": "0.0.4", - "from": "stream-combiner@>=0.0.4 <0.1.0", + "from": "https://registry.npmjs.org/stream-combiner/-/stream-combiner-0.0.4.tgz", "resolved": "https://registry.npmjs.org/stream-combiner/-/stream-combiner-0.0.4.tgz" } } }, "glob": { "version": "6.0.4", - "from": "glob@>=6.0.1 <7.0.0", + "from": "https://registry.npmjs.org/glob/-/glob-6.0.4.tgz", "resolved": "https://registry.npmjs.org/glob/-/glob-6.0.4.tgz", "dependencies": { "inflight": { "version": "1.0.4", - "from": "inflight@>=1.0.4 <2.0.0", + "from": "https://registry.npmjs.org/inflight/-/inflight-1.0.4.tgz", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.4.tgz", "dependencies": { "wrappy": { "version": "1.0.1", - "from": "wrappy@>=1.0.0 <2.0.0", + "from": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.1.tgz", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.1.tgz" } } }, "inherits": { "version": "2.0.1", - "from": "inherits@>=2.0.0 <3.0.0", + "from": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz" }, "minimatch": { "version": "3.0.0", - "from": "minimatch@>=2.0.0 <3.0.0||>=3.0.0 <4.0.0", + "from": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.0.tgz", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.0.tgz", "dependencies": { "brace-expansion": { "version": "1.1.4", - "from": "brace-expansion@>=1.0.0 <2.0.0", + "from": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.4.tgz", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.4.tgz", "dependencies": { "balanced-match": { "version": "0.4.1", - "from": "balanced-match@>=0.4.1 <0.5.0", + "from": "https://registry.npmjs.org/balanced-match/-/balanced-match-0.4.1.tgz", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-0.4.1.tgz" }, "concat-map": { "version": "0.0.1", - "from": "concat-map@0.0.1", + "from": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz" } } @@ -5120,81 +5025,81 @@ }, "once": { "version": "1.3.3", - "from": "once@>=1.3.0 <2.0.0", + "from": "https://registry.npmjs.org/once/-/once-1.3.3.tgz", "resolved": "https://registry.npmjs.org/once/-/once-1.3.3.tgz", "dependencies": { "wrappy": { "version": "1.0.1", - "from": "wrappy@>=1.0.0 <2.0.0", + "from": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.1.tgz", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.1.tgz" } } }, "path-is-absolute": { "version": "1.0.0", - "from": "path-is-absolute@>=1.0.0 <2.0.0", + "from": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.0.tgz", "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.0.tgz" } } }, "grunt": { "version": "0.4.5", - "from": "grunt@>=0.4.2 <0.5.0", + "from": "https://registry.npmjs.org/grunt/-/grunt-0.4.5.tgz", "resolved": "https://registry.npmjs.org/grunt/-/grunt-0.4.5.tgz", "dependencies": { "async": { "version": "0.1.22", - "from": "async@>=0.1.22 <0.2.0", + "from": "https://registry.npmjs.org/async/-/async-0.1.22.tgz", "resolved": "https://registry.npmjs.org/async/-/async-0.1.22.tgz" }, "coffee-script": { "version": "1.3.3", - "from": "coffee-script@>=1.3.3 <1.4.0", + "from": "https://registry.npmjs.org/coffee-script/-/coffee-script-1.3.3.tgz", "resolved": "https://registry.npmjs.org/coffee-script/-/coffee-script-1.3.3.tgz" }, "colors": { "version": "0.6.2", - "from": "colors@>=0.6.2 <0.7.0", + "from": "https://registry.npmjs.org/colors/-/colors-0.6.2.tgz", "resolved": "https://registry.npmjs.org/colors/-/colors-0.6.2.tgz" }, "dateformat": { "version": "1.0.2-1.2.3", - "from": "dateformat@1.0.2-1.2.3", + "from": "https://registry.npmjs.org/dateformat/-/dateformat-1.0.2-1.2.3.tgz", "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-1.0.2-1.2.3.tgz" }, "eventemitter2": { "version": "0.4.14", - "from": "eventemitter2@>=0.4.13 <0.5.0", + "from": "https://registry.npmjs.org/eventemitter2/-/eventemitter2-0.4.14.tgz", "resolved": "https://registry.npmjs.org/eventemitter2/-/eventemitter2-0.4.14.tgz" }, "findup-sync": { "version": "0.1.3", - "from": "findup-sync@>=0.1.2 <0.2.0", + "from": "https://registry.npmjs.org/findup-sync/-/findup-sync-0.1.3.tgz", "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-0.1.3.tgz", "dependencies": { "glob": { "version": "3.2.11", - "from": "glob@>=3.2.9 <3.3.0", + "from": "https://registry.npmjs.org/glob/-/glob-3.2.11.tgz", "resolved": "https://registry.npmjs.org/glob/-/glob-3.2.11.tgz", "dependencies": { "inherits": { "version": "2.0.1", - "from": "inherits@>=2.0.0 <3.0.0", + "from": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz" }, "minimatch": { "version": "0.3.0", - "from": "minimatch@>=0.3.0 <0.4.0", + "from": "https://registry.npmjs.org/minimatch/-/minimatch-0.3.0.tgz", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-0.3.0.tgz", "dependencies": { "lru-cache": { "version": "2.7.3", - "from": "lru-cache@>=2.0.0 <3.0.0", + "from": "https://registry.npmjs.org/lru-cache/-/lru-cache-2.7.3.tgz", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-2.7.3.tgz" }, "sigmund": { "version": "1.0.1", - "from": "sigmund@>=1.0.0 <1.1.0", + "from": "https://registry.npmjs.org/sigmund/-/sigmund-1.0.1.tgz", "resolved": "https://registry.npmjs.org/sigmund/-/sigmund-1.0.1.tgz" } } @@ -5203,149 +5108,149 @@ }, "lodash": { "version": "2.4.2", - "from": "lodash@>=2.4.1 <2.5.0", + "from": "https://registry.npmjs.org/lodash/-/lodash-2.4.2.tgz", "resolved": "https://registry.npmjs.org/lodash/-/lodash-2.4.2.tgz" } } }, "glob": { "version": "3.1.21", - "from": "glob@>=3.1.21 <3.2.0", + "from": "https://registry.npmjs.org/glob/-/glob-3.1.21.tgz", "resolved": "https://registry.npmjs.org/glob/-/glob-3.1.21.tgz", "dependencies": { "graceful-fs": { "version": "1.2.3", - "from": "graceful-fs@>=1.2.0 <1.3.0", + "from": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-1.2.3.tgz", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-1.2.3.tgz" }, "inherits": { "version": "1.0.2", - "from": "inherits@>=1.0.0 <2.0.0", + "from": "https://registry.npmjs.org/inherits/-/inherits-1.0.2.tgz", "resolved": "https://registry.npmjs.org/inherits/-/inherits-1.0.2.tgz" } } }, "hooker": { "version": "0.2.3", - "from": "hooker@>=0.2.3 <0.3.0", + "from": "https://registry.npmjs.org/hooker/-/hooker-0.2.3.tgz", "resolved": "https://registry.npmjs.org/hooker/-/hooker-0.2.3.tgz" }, "iconv-lite": { "version": "0.2.11", - "from": "iconv-lite@>=0.2.11 <0.3.0", + "from": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.2.11.tgz", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.2.11.tgz" }, "minimatch": { "version": "0.2.14", - "from": "minimatch@>=0.2.12 <0.3.0", + "from": "https://registry.npmjs.org/minimatch/-/minimatch-0.2.14.tgz", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-0.2.14.tgz", "dependencies": { "lru-cache": { "version": "2.7.3", - "from": "lru-cache@>=2.0.0 <3.0.0", + "from": "https://registry.npmjs.org/lru-cache/-/lru-cache-2.7.3.tgz", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-2.7.3.tgz" }, "sigmund": { "version": "1.0.1", - "from": "sigmund@>=1.0.0 <1.1.0", + "from": "https://registry.npmjs.org/sigmund/-/sigmund-1.0.1.tgz", "resolved": "https://registry.npmjs.org/sigmund/-/sigmund-1.0.1.tgz" } } }, "nopt": { "version": "1.0.10", - "from": "nopt@>=1.0.10 <1.1.0", + "from": "https://registry.npmjs.org/nopt/-/nopt-1.0.10.tgz", "resolved": "https://registry.npmjs.org/nopt/-/nopt-1.0.10.tgz", "dependencies": { "abbrev": { "version": "1.0.7", - "from": "abbrev@>=1.0.0 <2.0.0", + "from": "https://registry.npmjs.org/abbrev/-/abbrev-1.0.7.tgz", "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.0.7.tgz" } } }, "rimraf": { "version": "2.2.8", - "from": "rimraf@>=2.2.8 <2.3.0", + "from": "https://registry.npmjs.org/rimraf/-/rimraf-2.2.8.tgz", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.2.8.tgz" }, "lodash": { "version": "0.9.2", - "from": "lodash@>=0.9.2 <0.10.0", + "from": "https://registry.npmjs.org/lodash/-/lodash-0.9.2.tgz", "resolved": "https://registry.npmjs.org/lodash/-/lodash-0.9.2.tgz" }, "underscore.string": { "version": "2.2.1", - "from": "underscore.string@>=2.2.1 <2.3.0", + "from": "https://registry.npmjs.org/underscore.string/-/underscore.string-2.2.1.tgz", "resolved": "https://registry.npmjs.org/underscore.string/-/underscore.string-2.2.1.tgz" }, "which": { "version": "1.0.9", - "from": "which@>=1.0.5 <1.1.0", + "from": "https://registry.npmjs.org/which/-/which-1.0.9.tgz", "resolved": "https://registry.npmjs.org/which/-/which-1.0.9.tgz" }, "js-yaml": { "version": "2.0.5", - "from": "js-yaml@>=2.0.5 <2.1.0", + "from": "https://registry.npmjs.org/js-yaml/-/js-yaml-2.0.5.tgz", "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-2.0.5.tgz", "dependencies": { "argparse": { "version": "0.1.16", - "from": "argparse@>=0.1.11 <0.2.0", + "from": "https://registry.npmjs.org/argparse/-/argparse-0.1.16.tgz", "resolved": "https://registry.npmjs.org/argparse/-/argparse-0.1.16.tgz", "dependencies": { "underscore": { "version": "1.7.0", - "from": "underscore@>=1.7.0 <1.8.0", + "from": "https://registry.npmjs.org/underscore/-/underscore-1.7.0.tgz", "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.7.0.tgz" }, "underscore.string": { "version": "2.4.0", - "from": "underscore.string@>=2.4.0 <2.5.0", + "from": "https://registry.npmjs.org/underscore.string/-/underscore.string-2.4.0.tgz", "resolved": "https://registry.npmjs.org/underscore.string/-/underscore.string-2.4.0.tgz" } } }, "esprima": { "version": "1.0.4", - "from": "esprima@>=1.0.2 <1.1.0", + "from": "https://registry.npmjs.org/esprima/-/esprima-1.0.4.tgz", "resolved": "https://registry.npmjs.org/esprima/-/esprima-1.0.4.tgz" } } }, "exit": { "version": "0.1.2", - "from": "exit@>=0.1.1 <0.2.0", + "from": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz" }, "getobject": { "version": "0.1.0", - "from": "getobject@>=0.1.0 <0.2.0", + "from": "https://registry.npmjs.org/getobject/-/getobject-0.1.0.tgz", "resolved": "https://registry.npmjs.org/getobject/-/getobject-0.1.0.tgz" }, "grunt-legacy-util": { "version": "0.2.0", - "from": "grunt-legacy-util@>=0.2.0 <0.3.0", + "from": "https://registry.npmjs.org/grunt-legacy-util/-/grunt-legacy-util-0.2.0.tgz", "resolved": "https://registry.npmjs.org/grunt-legacy-util/-/grunt-legacy-util-0.2.0.tgz" }, "grunt-legacy-log": { "version": "0.1.3", - "from": "grunt-legacy-log@>=0.1.0 <0.2.0", + "from": "https://registry.npmjs.org/grunt-legacy-log/-/grunt-legacy-log-0.1.3.tgz", "resolved": "https://registry.npmjs.org/grunt-legacy-log/-/grunt-legacy-log-0.1.3.tgz", "dependencies": { "grunt-legacy-log-utils": { "version": "0.1.1", - "from": "grunt-legacy-log-utils@>=0.1.1 <0.2.0", + "from": "https://registry.npmjs.org/grunt-legacy-log-utils/-/grunt-legacy-log-utils-0.1.1.tgz", "resolved": "https://registry.npmjs.org/grunt-legacy-log-utils/-/grunt-legacy-log-utils-0.1.1.tgz" }, "lodash": { "version": "2.4.2", - "from": "lodash@>=2.4.1 <2.5.0", + "from": "https://registry.npmjs.org/lodash/-/lodash-2.4.2.tgz", "resolved": "https://registry.npmjs.org/lodash/-/lodash-2.4.2.tgz" }, "underscore.string": { "version": "2.3.3", - "from": "underscore.string@>=2.3.3 <2.4.0", + "from": "https://registry.npmjs.org/underscore.string/-/underscore.string-2.3.3.tgz", "resolved": "https://registry.npmjs.org/underscore.string/-/underscore.string-2.3.3.tgz" } } @@ -5354,71 +5259,71 @@ }, "grunt-bump": { "version": "0.0.17", - "from": "grunt-bump@>=0.0.13 <0.1.0", + "from": "https://registry.npmjs.org/grunt-bump/-/grunt-bump-0.0.17.tgz", "resolved": "https://registry.npmjs.org/grunt-bump/-/grunt-bump-0.0.17.tgz", "dependencies": { "semver": { "version": "2.3.2", - "from": "semver@>=2.3.0 <2.4.0", + "from": "https://registry.npmjs.org/semver/-/semver-2.3.2.tgz", "resolved": "https://registry.npmjs.org/semver/-/semver-2.3.2.tgz" } } }, "grunt-contrib-clean": { "version": "0.6.0", - "from": "grunt-contrib-clean@>=0.6.0 <0.7.0", + "from": "https://registry.npmjs.org/grunt-contrib-clean/-/grunt-contrib-clean-0.6.0.tgz", "resolved": "https://registry.npmjs.org/grunt-contrib-clean/-/grunt-contrib-clean-0.6.0.tgz", "dependencies": { "rimraf": { "version": "2.2.8", - "from": "rimraf@>=2.2.1 <2.3.0", + "from": "https://registry.npmjs.org/rimraf/-/rimraf-2.2.8.tgz", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.2.8.tgz" } } }, "grunt-contrib-compress": { "version": "0.12.0", - "from": "grunt-contrib-compress@>=0.12.0 <0.13.0", + "from": "https://registry.npmjs.org/grunt-contrib-compress/-/grunt-contrib-compress-0.12.0.tgz", "resolved": "https://registry.npmjs.org/grunt-contrib-compress/-/grunt-contrib-compress-0.12.0.tgz", "dependencies": { "archiver": { "version": "0.11.0", - "from": "archiver@>=0.11.0 <0.12.0", + "from": "https://registry.npmjs.org/archiver/-/archiver-0.11.0.tgz", "resolved": "https://registry.npmjs.org/archiver/-/archiver-0.11.0.tgz", "dependencies": { "async": { "version": "0.9.2", - "from": "async@>=0.9.0 <0.10.0", + "from": "https://registry.npmjs.org/async/-/async-0.9.2.tgz", "resolved": "https://registry.npmjs.org/async/-/async-0.9.2.tgz" }, "buffer-crc32": { "version": "0.2.5", - "from": "buffer-crc32@>=0.2.1 <0.3.0", + "from": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.5.tgz", "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.5.tgz" }, "glob": { "version": "3.2.11", - "from": "glob@>=3.2.6 <3.3.0", + "from": "https://registry.npmjs.org/glob/-/glob-3.2.11.tgz", "resolved": "https://registry.npmjs.org/glob/-/glob-3.2.11.tgz", "dependencies": { "inherits": { "version": "2.0.1", - "from": "inherits@>=2.0.0 <3.0.0", + "from": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz" }, "minimatch": { "version": "0.3.0", - "from": "minimatch@>=0.3.0 <0.4.0", + "from": "https://registry.npmjs.org/minimatch/-/minimatch-0.3.0.tgz", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-0.3.0.tgz", "dependencies": { "lru-cache": { "version": "2.7.3", - "from": "lru-cache@>=2.0.0 <3.0.0", + "from": "https://registry.npmjs.org/lru-cache/-/lru-cache-2.7.3.tgz", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-2.7.3.tgz" }, "sigmund": { "version": "1.0.1", - "from": "sigmund@>=1.0.0 <1.1.0", + "from": "https://registry.npmjs.org/sigmund/-/sigmund-1.0.1.tgz", "resolved": "https://registry.npmjs.org/sigmund/-/sigmund-1.0.1.tgz" } } @@ -5427,59 +5332,59 @@ }, "lazystream": { "version": "0.1.0", - "from": "lazystream@>=0.1.0 <0.2.0", + "from": "https://registry.npmjs.org/lazystream/-/lazystream-0.1.0.tgz", "resolved": "https://registry.npmjs.org/lazystream/-/lazystream-0.1.0.tgz" }, "readable-stream": { "version": "1.0.34", - "from": "readable-stream@>=1.0.26 <1.1.0", + "from": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", "dependencies": { "core-util-is": { "version": "1.0.2", - "from": "core-util-is@>=1.0.0 <1.1.0", + "from": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz" }, "isarray": { "version": "0.0.1", - "from": "isarray@0.0.1", + "from": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz" }, "string_decoder": { "version": "0.10.31", - "from": "string_decoder@>=0.10.0 <0.11.0", + "from": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz" }, "inherits": { "version": "2.0.1", - "from": "inherits@>=2.0.1 <2.1.0", + "from": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz" } } }, "tar-stream": { "version": "0.4.7", - "from": "tar-stream@>=0.4.0 <0.5.0", + "from": "https://registry.npmjs.org/tar-stream/-/tar-stream-0.4.7.tgz", "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-0.4.7.tgz", "dependencies": { "bl": { "version": "0.9.5", - "from": "bl@>=0.9.0 <0.10.0", + "from": "https://registry.npmjs.org/bl/-/bl-0.9.5.tgz", "resolved": "https://registry.npmjs.org/bl/-/bl-0.9.5.tgz" }, "end-of-stream": { "version": "1.1.0", - "from": "end-of-stream@>=1.0.0 <2.0.0", + "from": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.1.0.tgz", "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.1.0.tgz", "dependencies": { "once": { "version": "1.3.3", - "from": "once@>=1.3.0 <1.4.0", + "from": "https://registry.npmjs.org/once/-/once-1.3.3.tgz", "resolved": "https://registry.npmjs.org/once/-/once-1.3.3.tgz", "dependencies": { "wrappy": { "version": "1.0.1", - "from": "wrappy@>=1.0.0 <2.0.0", + "from": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.1.tgz", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.1.tgz" } } @@ -5488,24 +5393,24 @@ }, "xtend": { "version": "4.0.1", - "from": "xtend@>=4.0.0 <5.0.0", + "from": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz" } } }, "zip-stream": { "version": "0.4.1", - "from": "zip-stream@>=0.4.0 <0.5.0", + "from": "https://registry.npmjs.org/zip-stream/-/zip-stream-0.4.1.tgz", "resolved": "https://registry.npmjs.org/zip-stream/-/zip-stream-0.4.1.tgz", "dependencies": { "compress-commons": { "version": "0.1.6", - "from": "compress-commons@>=0.1.0 <0.2.0", + "from": "https://registry.npmjs.org/compress-commons/-/compress-commons-0.1.6.tgz", "resolved": "https://registry.npmjs.org/compress-commons/-/compress-commons-0.1.6.tgz", "dependencies": { "crc32-stream": { "version": "0.3.4", - "from": "crc32-stream@>=0.3.1 <0.4.0", + "from": "https://registry.npmjs.org/crc32-stream/-/crc32-stream-0.3.4.tgz", "resolved": "https://registry.npmjs.org/crc32-stream/-/crc32-stream-0.3.4.tgz" } } @@ -5516,173 +5421,173 @@ }, "chalk": { "version": "0.5.1", - "from": "chalk@>=0.5.1 <0.6.0", + "from": "https://registry.npmjs.org/chalk/-/chalk-0.5.1.tgz", "resolved": "https://registry.npmjs.org/chalk/-/chalk-0.5.1.tgz", "dependencies": { "ansi-styles": { "version": "1.1.0", - "from": "ansi-styles@>=1.1.0 <2.0.0", + "from": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-1.1.0.tgz", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-1.1.0.tgz" }, "escape-string-regexp": { "version": "1.0.5", - "from": "escape-string-regexp@>=1.0.2 <2.0.0", + "from": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz" }, "has-ansi": { "version": "0.1.0", - "from": "has-ansi@>=0.1.0 <0.2.0", + "from": "https://registry.npmjs.org/has-ansi/-/has-ansi-0.1.0.tgz", "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-0.1.0.tgz", "dependencies": { "ansi-regex": { "version": "0.2.1", - "from": "ansi-regex@>=0.2.0 <0.3.0", + "from": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-0.2.1.tgz", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-0.2.1.tgz" } } }, "strip-ansi": { "version": "0.3.0", - "from": "strip-ansi@>=0.3.0 <0.4.0", + "from": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-0.3.0.tgz", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-0.3.0.tgz", "dependencies": { "ansi-regex": { "version": "0.2.1", - "from": "ansi-regex@>=0.2.0 <0.3.0", + "from": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-0.2.1.tgz", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-0.2.1.tgz" } } }, "supports-color": { "version": "0.2.0", - "from": "supports-color@>=0.2.0 <0.3.0", + "from": "https://registry.npmjs.org/supports-color/-/supports-color-0.2.0.tgz", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-0.2.0.tgz" } } }, "prettysize": { "version": "0.0.3", - "from": "prettysize@>=0.0.2 <0.1.0", + "from": "https://registry.npmjs.org/prettysize/-/prettysize-0.0.3.tgz", "resolved": "https://registry.npmjs.org/prettysize/-/prettysize-0.0.3.tgz" } } }, "grunt-contrib-connect": { "version": "0.8.0", - "from": "grunt-contrib-connect@>=0.8.0 <0.9.0", + "from": "https://registry.npmjs.org/grunt-contrib-connect/-/grunt-contrib-connect-0.8.0.tgz", "resolved": "https://registry.npmjs.org/grunt-contrib-connect/-/grunt-contrib-connect-0.8.0.tgz", "dependencies": { "connect": { "version": "2.19.6", - "from": "connect@>=2.19.5 <2.20.0", + "from": "https://registry.npmjs.org/connect/-/connect-2.19.6.tgz", "resolved": "https://registry.npmjs.org/connect/-/connect-2.19.6.tgz", "dependencies": { "basic-auth-connect": { "version": "1.0.0", - "from": "basic-auth-connect@1.0.0", + "from": "https://registry.npmjs.org/basic-auth-connect/-/basic-auth-connect-1.0.0.tgz", "resolved": "https://registry.npmjs.org/basic-auth-connect/-/basic-auth-connect-1.0.0.tgz" }, "body-parser": { "version": "1.3.1", - "from": "body-parser@1.3.1", + "from": "https://registry.npmjs.org/body-parser/-/body-parser-1.3.1.tgz", "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.3.1.tgz", "dependencies": { "raw-body": { "version": "1.1.6", - "from": "raw-body@1.1.6", + "from": "https://registry.npmjs.org/raw-body/-/raw-body-1.1.6.tgz", "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-1.1.6.tgz" } } }, "bytes": { "version": "1.0.0", - "from": "bytes@1.0.0", + "from": "https://registry.npmjs.org/bytes/-/bytes-1.0.0.tgz", "resolved": "https://registry.npmjs.org/bytes/-/bytes-1.0.0.tgz" }, "cookie": { "version": "0.1.2", - "from": "cookie@0.1.2", + "from": "https://registry.npmjs.org/cookie/-/cookie-0.1.2.tgz", "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.1.2.tgz" }, "cookie-parser": { "version": "1.1.0", - "from": "cookie-parser@1.1.0", + "from": "https://registry.npmjs.org/cookie-parser/-/cookie-parser-1.1.0.tgz", "resolved": "https://registry.npmjs.org/cookie-parser/-/cookie-parser-1.1.0.tgz" }, "cookie-signature": { "version": "1.0.3", - "from": "cookie-signature@1.0.3", + "from": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.3.tgz", "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.3.tgz" }, "compression": { "version": "1.0.7", - "from": "compression@1.0.7", + "from": "https://registry.npmjs.org/compression/-/compression-1.0.7.tgz", "resolved": "https://registry.npmjs.org/compression/-/compression-1.0.7.tgz", "dependencies": { "accepts": { "version": "1.0.3", - "from": "accepts@1.0.3", + "from": "https://registry.npmjs.org/accepts/-/accepts-1.0.3.tgz", "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.0.3.tgz", "dependencies": { "mime": { "version": "1.2.11", - "from": "mime@>=1.2.11 <1.3.0", + "from": "https://registry.npmjs.org/mime/-/mime-1.2.11.tgz", "resolved": "https://registry.npmjs.org/mime/-/mime-1.2.11.tgz" }, "negotiator": { "version": "0.4.6", - "from": "negotiator@0.4.6", + "from": "https://registry.npmjs.org/negotiator/-/negotiator-0.4.6.tgz", "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.4.6.tgz" } } }, "compressible": { "version": "1.1.0", - "from": "compressible@1.1.0", + "from": "https://registry.npmjs.org/compressible/-/compressible-1.1.0.tgz", "resolved": "https://registry.npmjs.org/compressible/-/compressible-1.1.0.tgz" }, "vary": { "version": "0.1.0", - "from": "vary@0.1.0", + "from": "https://registry.npmjs.org/vary/-/vary-0.1.0.tgz", "resolved": "https://registry.npmjs.org/vary/-/vary-0.1.0.tgz" } } }, "connect-timeout": { "version": "1.1.0", - "from": "connect-timeout@1.1.0", + "from": "https://registry.npmjs.org/connect-timeout/-/connect-timeout-1.1.0.tgz", "resolved": "https://registry.npmjs.org/connect-timeout/-/connect-timeout-1.1.0.tgz", "dependencies": { "debug": { "version": "0.8.1", - "from": "debug@0.8.1", + "from": "https://registry.npmjs.org/debug/-/debug-0.8.1.tgz", "resolved": "https://registry.npmjs.org/debug/-/debug-0.8.1.tgz" } } }, "csurf": { "version": "1.2.1", - "from": "csurf@1.2.1", + "from": "https://registry.npmjs.org/csurf/-/csurf-1.2.1.tgz", "resolved": "https://registry.npmjs.org/csurf/-/csurf-1.2.1.tgz", "dependencies": { "csrf-tokens": { "version": "1.0.4", - "from": "csrf-tokens@>=1.0.2 <1.1.0", + "from": "https://registry.npmjs.org/csrf-tokens/-/csrf-tokens-1.0.4.tgz", "resolved": "https://registry.npmjs.org/csrf-tokens/-/csrf-tokens-1.0.4.tgz", "dependencies": { "rndm": { "version": "1.2.0", - "from": "rndm@>=1.0.0 <2.0.0", + "from": "https://registry.npmjs.org/rndm/-/rndm-1.2.0.tgz", "resolved": "https://registry.npmjs.org/rndm/-/rndm-1.2.0.tgz" }, "uid2": { "version": "0.0.3", - "from": "uid2@>=0.0.2 <0.1.0", + "from": "https://registry.npmjs.org/uid2/-/uid2-0.0.3.tgz", "resolved": "https://registry.npmjs.org/uid2/-/uid2-0.0.3.tgz" }, "scmp": { "version": "0.0.3", - "from": "scmp@>=0.0.3 <0.1.0", + "from": "https://registry.npmjs.org/scmp/-/scmp-0.0.3.tgz", "resolved": "https://registry.npmjs.org/scmp/-/scmp-0.0.3.tgz" } } @@ -5691,203 +5596,203 @@ }, "debug": { "version": "1.0.2", - "from": "debug@1.0.2", + "from": "https://registry.npmjs.org/debug/-/debug-1.0.2.tgz", "resolved": "https://registry.npmjs.org/debug/-/debug-1.0.2.tgz", "dependencies": { "ms": { "version": "0.6.2", - "from": "ms@0.6.2", + "from": "https://registry.npmjs.org/ms/-/ms-0.6.2.tgz", "resolved": "https://registry.npmjs.org/ms/-/ms-0.6.2.tgz" } } }, "errorhandler": { "version": "1.0.2", - "from": "errorhandler@1.0.2", + "from": "https://registry.npmjs.org/errorhandler/-/errorhandler-1.0.2.tgz", "resolved": "https://registry.npmjs.org/errorhandler/-/errorhandler-1.0.2.tgz" }, "escape-html": { "version": "1.0.1", - "from": "escape-html@1.0.1", + "from": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.1.tgz", "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.1.tgz" }, "express-session": { "version": "1.2.1", - "from": "express-session@1.2.1", + "from": "https://registry.npmjs.org/express-session/-/express-session-1.2.1.tgz", "resolved": "https://registry.npmjs.org/express-session/-/express-session-1.2.1.tgz", "dependencies": { "utils-merge": { "version": "1.0.0", - "from": "utils-merge@1.0.0", + "from": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.0.tgz", "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.0.tgz" }, "uid2": { "version": "0.0.3", - "from": "uid2@0.0.3", + "from": "https://registry.npmjs.org/uid2/-/uid2-0.0.3.tgz", "resolved": "https://registry.npmjs.org/uid2/-/uid2-0.0.3.tgz" }, "buffer-crc32": { "version": "0.2.1", - "from": "buffer-crc32@0.2.1", + "from": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.1.tgz", "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.1.tgz" }, "debug": { "version": "0.8.1", - "from": "debug@0.8.1", + "from": "https://registry.npmjs.org/debug/-/debug-0.8.1.tgz", "resolved": "https://registry.npmjs.org/debug/-/debug-0.8.1.tgz" } } }, "fresh": { "version": "0.2.2", - "from": "fresh@0.2.2", + "from": "https://registry.npmjs.org/fresh/-/fresh-0.2.2.tgz", "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.2.2.tgz" }, "method-override": { "version": "2.0.2", - "from": "method-override@2.0.2", + "from": "https://registry.npmjs.org/method-override/-/method-override-2.0.2.tgz", "resolved": "https://registry.npmjs.org/method-override/-/method-override-2.0.2.tgz", "dependencies": { "methods": { "version": "1.0.1", - "from": "methods@1.0.1", + "from": "https://registry.npmjs.org/methods/-/methods-1.0.1.tgz", "resolved": "https://registry.npmjs.org/methods/-/methods-1.0.1.tgz" }, "vary": { "version": "0.1.0", - "from": "vary@0.1.0", + "from": "https://registry.npmjs.org/vary/-/vary-0.1.0.tgz", "resolved": "https://registry.npmjs.org/vary/-/vary-0.1.0.tgz" } } }, "morgan": { "version": "1.1.1", - "from": "morgan@1.1.1", + "from": "https://registry.npmjs.org/morgan/-/morgan-1.1.1.tgz", "resolved": "https://registry.npmjs.org/morgan/-/morgan-1.1.1.tgz" }, "multiparty": { "version": "3.2.8", - "from": "multiparty@3.2.8", + "from": "https://registry.npmjs.org/multiparty/-/multiparty-3.2.8.tgz", "resolved": "https://registry.npmjs.org/multiparty/-/multiparty-3.2.8.tgz", "dependencies": { "readable-stream": { "version": "1.1.14", - "from": "readable-stream@>=1.1.0 <1.2.0", + "from": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", "dependencies": { "core-util-is": { "version": "1.0.2", - "from": "core-util-is@>=1.0.0 <1.1.0", + "from": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz" }, "isarray": { "version": "0.0.1", - "from": "isarray@0.0.1", + "from": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz" }, "string_decoder": { "version": "0.10.31", - "from": "string_decoder@>=0.10.0 <0.11.0", + "from": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz" }, "inherits": { "version": "2.0.1", - "from": "inherits@>=2.0.1 <2.1.0", + "from": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz" } } }, "stream-counter": { "version": "0.2.0", - "from": "stream-counter@>=0.2.0 <0.3.0", + "from": "https://registry.npmjs.org/stream-counter/-/stream-counter-0.2.0.tgz", "resolved": "https://registry.npmjs.org/stream-counter/-/stream-counter-0.2.0.tgz" } } }, "on-headers": { "version": "0.0.0", - "from": "on-headers@0.0.0", + "from": "https://registry.npmjs.org/on-headers/-/on-headers-0.0.0.tgz", "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-0.0.0.tgz" }, "parseurl": { "version": "1.0.1", - "from": "parseurl@1.0.1", + "from": "https://registry.npmjs.org/parseurl/-/parseurl-1.0.1.tgz", "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.0.1.tgz" }, "qs": { "version": "0.6.6", - "from": "qs@0.6.6", + "from": "https://registry.npmjs.org/qs/-/qs-0.6.6.tgz", "resolved": "https://registry.npmjs.org/qs/-/qs-0.6.6.tgz" }, "response-time": { "version": "2.0.0", - "from": "response-time@2.0.0", + "from": "https://registry.npmjs.org/response-time/-/response-time-2.0.0.tgz", "resolved": "https://registry.npmjs.org/response-time/-/response-time-2.0.0.tgz" }, "serve-favicon": { "version": "2.0.1", - "from": "serve-favicon@2.0.1", + "from": "https://registry.npmjs.org/serve-favicon/-/serve-favicon-2.0.1.tgz", "resolved": "https://registry.npmjs.org/serve-favicon/-/serve-favicon-2.0.1.tgz" }, "serve-index": { "version": "1.1.1", - "from": "serve-index@1.1.1", + "from": "https://registry.npmjs.org/serve-index/-/serve-index-1.1.1.tgz", "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.1.1.tgz", "dependencies": { "accepts": { "version": "1.0.3", - "from": "accepts@1.0.3", + "from": "https://registry.npmjs.org/accepts/-/accepts-1.0.3.tgz", "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.0.3.tgz", "dependencies": { "mime": { "version": "1.2.11", - "from": "mime@>=1.2.11 <1.3.0", + "from": "https://registry.npmjs.org/mime/-/mime-1.2.11.tgz", "resolved": "https://registry.npmjs.org/mime/-/mime-1.2.11.tgz" }, "negotiator": { "version": "0.4.6", - "from": "negotiator@0.4.6", + "from": "https://registry.npmjs.org/negotiator/-/negotiator-0.4.6.tgz", "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.4.6.tgz" } } }, "batch": { "version": "0.5.0", - "from": "batch@0.5.0", + "from": "https://registry.npmjs.org/batch/-/batch-0.5.0.tgz", "resolved": "https://registry.npmjs.org/batch/-/batch-0.5.0.tgz" } } }, "serve-static": { "version": "1.2.3", - "from": "serve-static@1.2.3", + "from": "https://registry.npmjs.org/serve-static/-/serve-static-1.2.3.tgz", "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.2.3.tgz", "dependencies": { "send": { "version": "0.4.3", - "from": "send@0.4.3", + "from": "https://registry.npmjs.org/send/-/send-0.4.3.tgz", "resolved": "https://registry.npmjs.org/send/-/send-0.4.3.tgz", "dependencies": { "finished": { "version": "1.2.2", - "from": "finished@1.2.2", + "from": "https://registry.npmjs.org/finished/-/finished-1.2.2.tgz", "resolved": "https://registry.npmjs.org/finished/-/finished-1.2.2.tgz", "dependencies": { "ee-first": { "version": "1.0.3", - "from": "ee-first@1.0.3", + "from": "https://registry.npmjs.org/ee-first/-/ee-first-1.0.3.tgz", "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.0.3.tgz" } } }, "mime": { "version": "1.2.11", - "from": "mime@1.2.11", + "from": "https://registry.npmjs.org/mime/-/mime-1.2.11.tgz", "resolved": "https://registry.npmjs.org/mime/-/mime-1.2.11.tgz" }, "range-parser": { "version": "1.0.3", - "from": "range-parser@>=1.0.0 <1.1.0", + "from": "https://registry.npmjs.org/range-parser/-/range-parser-1.0.3.tgz", "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.0.3.tgz" } } @@ -5896,104 +5801,104 @@ }, "type-is": { "version": "1.2.1", - "from": "type-is@1.2.1", + "from": "https://registry.npmjs.org/type-is/-/type-is-1.2.1.tgz", "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.2.1.tgz", "dependencies": { "mime-types": { "version": "1.0.0", - "from": "mime-types@1.0.0", + "from": "https://registry.npmjs.org/mime-types/-/mime-types-1.0.0.tgz", "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-1.0.0.tgz" } } }, "vhost": { "version": "1.0.0", - "from": "vhost@1.0.0", + "from": "https://registry.npmjs.org/vhost/-/vhost-1.0.0.tgz", "resolved": "https://registry.npmjs.org/vhost/-/vhost-1.0.0.tgz" }, "pause": { "version": "0.0.1", - "from": "pause@0.0.1", + "from": "https://registry.npmjs.org/pause/-/pause-0.0.1.tgz", "resolved": "https://registry.npmjs.org/pause/-/pause-0.0.1.tgz" } } }, "connect-livereload": { "version": "0.4.1", - "from": "connect-livereload@>=0.4.0 <0.5.0", + "from": "https://registry.npmjs.org/connect-livereload/-/connect-livereload-0.4.1.tgz", "resolved": "https://registry.npmjs.org/connect-livereload/-/connect-livereload-0.4.1.tgz" }, "open": { "version": "0.0.5", - "from": "open@0.0.5", + "from": "https://registry.npmjs.org/open/-/open-0.0.5.tgz", "resolved": "https://registry.npmjs.org/open/-/open-0.0.5.tgz" }, "portscanner": { "version": "0.2.3", - "from": "portscanner@>=0.2.3 <0.3.0", + "from": "https://registry.npmjs.org/portscanner/-/portscanner-0.2.3.tgz", "resolved": "https://registry.npmjs.org/portscanner/-/portscanner-0.2.3.tgz", "dependencies": { "async": { "version": "0.1.15", - "from": "async@0.1.15", + "from": "https://registry.npmjs.org/async/-/async-0.1.15.tgz", "resolved": "https://registry.npmjs.org/async/-/async-0.1.15.tgz" } } }, "async": { "version": "0.9.2", - "from": "async@>=0.9.0 <0.10.0", + "from": "https://registry.npmjs.org/async/-/async-0.9.2.tgz", "resolved": "https://registry.npmjs.org/async/-/async-0.9.2.tgz" } } }, "grunt-contrib-copy": { "version": "0.6.0", - "from": "grunt-contrib-copy@>=0.6.0 <0.7.0", + "from": "https://registry.npmjs.org/grunt-contrib-copy/-/grunt-contrib-copy-0.6.0.tgz", "resolved": "https://registry.npmjs.org/grunt-contrib-copy/-/grunt-contrib-copy-0.6.0.tgz", "dependencies": { "chalk": { "version": "0.5.1", - "from": "chalk@>=0.5.1 <0.6.0", + "from": "https://registry.npmjs.org/chalk/-/chalk-0.5.1.tgz", "resolved": "https://registry.npmjs.org/chalk/-/chalk-0.5.1.tgz", "dependencies": { "ansi-styles": { "version": "1.1.0", - "from": "ansi-styles@>=1.1.0 <2.0.0", + "from": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-1.1.0.tgz", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-1.1.0.tgz" }, "escape-string-regexp": { "version": "1.0.5", - "from": "escape-string-regexp@>=1.0.0 <2.0.0", + "from": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz" }, "has-ansi": { "version": "0.1.0", - "from": "has-ansi@>=0.1.0 <0.2.0", + "from": "https://registry.npmjs.org/has-ansi/-/has-ansi-0.1.0.tgz", "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-0.1.0.tgz", "dependencies": { "ansi-regex": { "version": "0.2.1", - "from": "ansi-regex@>=0.2.0 <0.3.0", + "from": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-0.2.1.tgz", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-0.2.1.tgz" } } }, "strip-ansi": { "version": "0.3.0", - "from": "strip-ansi@>=0.3.0 <0.4.0", + "from": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-0.3.0.tgz", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-0.3.0.tgz", "dependencies": { "ansi-regex": { "version": "0.2.1", - "from": "ansi-regex@>=0.2.0 <0.3.0", + "from": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-0.2.1.tgz", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-0.2.1.tgz" } } }, "supports-color": { "version": "0.2.0", - "from": "supports-color@>=0.2.0 <0.3.0", + "from": "https://registry.npmjs.org/supports-color/-/supports-color-0.2.0.tgz", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-0.2.0.tgz" } } @@ -6002,280 +5907,280 @@ }, "grunt-contrib-jshint": { "version": "1.0.0", - "from": "grunt-contrib-jshint@>=1.0.0 <2.0.0", + "from": "https://registry.npmjs.org/grunt-contrib-jshint/-/grunt-contrib-jshint-1.0.0.tgz", "resolved": "https://registry.npmjs.org/grunt-contrib-jshint/-/grunt-contrib-jshint-1.0.0.tgz", "dependencies": { "chalk": { "version": "1.1.3", - "from": "chalk@>=1.0.0 <2.0.0", + "from": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", "dependencies": { "ansi-styles": { "version": "2.2.1", - "from": "ansi-styles@>=2.2.1 <3.0.0", + "from": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz" }, "escape-string-regexp": { "version": "1.0.5", - "from": "escape-string-regexp@>=1.0.2 <2.0.0", + "from": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz" }, "has-ansi": { "version": "2.0.0", - "from": "has-ansi@>=2.0.0 <3.0.0", + "from": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", "dependencies": { "ansi-regex": { "version": "2.0.0", - "from": "ansi-regex@>=2.0.0 <3.0.0", + "from": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.0.0.tgz", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.0.0.tgz" } } }, "strip-ansi": { "version": "3.0.1", - "from": "strip-ansi@>=3.0.0 <4.0.0", + "from": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", "dependencies": { "ansi-regex": { "version": "2.0.0", - "from": "ansi-regex@>=2.0.0 <3.0.0", + "from": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.0.0.tgz", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.0.0.tgz" } } }, "supports-color": { "version": "2.0.0", - "from": "supports-color@>=2.0.0 <3.0.0", + "from": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz" } } }, "hooker": { "version": "0.2.3", - "from": "hooker@>=0.2.3 <0.3.0", + "from": "https://registry.npmjs.org/hooker/-/hooker-0.2.3.tgz", "resolved": "https://registry.npmjs.org/hooker/-/hooker-0.2.3.tgz" } } }, "grunt-ddescribe-iit": { "version": "0.0.6", - "from": "grunt-ddescribe-iit@>=0.0.1 <0.1.0", + "from": "https://registry.npmjs.org/grunt-ddescribe-iit/-/grunt-ddescribe-iit-0.0.6.tgz", "resolved": "https://registry.npmjs.org/grunt-ddescribe-iit/-/grunt-ddescribe-iit-0.0.6.tgz", "dependencies": { "bluebird": { "version": "2.10.2", - "from": "bluebird@>=2.9.9 <3.0.0", + "from": "https://registry.npmjs.org/bluebird/-/bluebird-2.10.2.tgz", "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-2.10.2.tgz" }, "win-spawn": { "version": "2.0.0", - "from": "win-spawn@>=2.0.0 <3.0.0", + "from": "https://registry.npmjs.org/win-spawn/-/win-spawn-2.0.0.tgz", "resolved": "https://registry.npmjs.org/win-spawn/-/win-spawn-2.0.0.tgz" } } }, "grunt-jscs": { "version": "2.8.0", - "from": "grunt-jscs@>=2.1.0 <3.0.0", + "from": "https://registry.npmjs.org/grunt-jscs/-/grunt-jscs-2.8.0.tgz", "resolved": "https://registry.npmjs.org/grunt-jscs/-/grunt-jscs-2.8.0.tgz", "dependencies": { "hooker": { "version": "0.2.3", - "from": "hooker@>=0.2.3 <0.3.0", + "from": "https://registry.npmjs.org/hooker/-/hooker-0.2.3.tgz", "resolved": "https://registry.npmjs.org/hooker/-/hooker-0.2.3.tgz" }, "jscs": { "version": "2.11.0", - "from": "jscs@>=2.11.0 <2.12.0", + "from": "https://registry.npmjs.org/jscs/-/jscs-2.11.0.tgz", "resolved": "https://registry.npmjs.org/jscs/-/jscs-2.11.0.tgz", "dependencies": { "babel-jscs": { "version": "2.0.5", - "from": "babel-jscs@>=2.0.0 <3.0.0", + "from": "https://registry.npmjs.org/babel-jscs/-/babel-jscs-2.0.5.tgz", "resolved": "https://registry.npmjs.org/babel-jscs/-/babel-jscs-2.0.5.tgz", "dependencies": { "babel-core": { "version": "5.8.38", - "from": "babel-core@>=5.8.3 <5.9.0", + "from": "https://registry.npmjs.org/babel-core/-/babel-core-5.8.38.tgz", "resolved": "https://registry.npmjs.org/babel-core/-/babel-core-5.8.38.tgz", "dependencies": { "babel-plugin-constant-folding": { "version": "1.0.1", - "from": "babel-plugin-constant-folding@>=1.0.1 <2.0.0", + "from": "https://registry.npmjs.org/babel-plugin-constant-folding/-/babel-plugin-constant-folding-1.0.1.tgz", "resolved": "https://registry.npmjs.org/babel-plugin-constant-folding/-/babel-plugin-constant-folding-1.0.1.tgz" }, "babel-plugin-dead-code-elimination": { "version": "1.0.2", - "from": "babel-plugin-dead-code-elimination@>=1.0.2 <2.0.0", + "from": "https://registry.npmjs.org/babel-plugin-dead-code-elimination/-/babel-plugin-dead-code-elimination-1.0.2.tgz", "resolved": "https://registry.npmjs.org/babel-plugin-dead-code-elimination/-/babel-plugin-dead-code-elimination-1.0.2.tgz" }, "babel-plugin-eval": { "version": "1.0.1", - "from": "babel-plugin-eval@>=1.0.1 <2.0.0", + "from": "https://registry.npmjs.org/babel-plugin-eval/-/babel-plugin-eval-1.0.1.tgz", "resolved": "https://registry.npmjs.org/babel-plugin-eval/-/babel-plugin-eval-1.0.1.tgz" }, "babel-plugin-inline-environment-variables": { "version": "1.0.1", - "from": "babel-plugin-inline-environment-variables@>=1.0.1 <2.0.0", + "from": "https://registry.npmjs.org/babel-plugin-inline-environment-variables/-/babel-plugin-inline-environment-variables-1.0.1.tgz", "resolved": "https://registry.npmjs.org/babel-plugin-inline-environment-variables/-/babel-plugin-inline-environment-variables-1.0.1.tgz" }, "babel-plugin-jscript": { "version": "1.0.4", - "from": "babel-plugin-jscript@>=1.0.4 <2.0.0", + "from": "https://registry.npmjs.org/babel-plugin-jscript/-/babel-plugin-jscript-1.0.4.tgz", "resolved": "https://registry.npmjs.org/babel-plugin-jscript/-/babel-plugin-jscript-1.0.4.tgz" }, "babel-plugin-member-expression-literals": { "version": "1.0.1", - "from": "babel-plugin-member-expression-literals@>=1.0.1 <2.0.0", + "from": "https://registry.npmjs.org/babel-plugin-member-expression-literals/-/babel-plugin-member-expression-literals-1.0.1.tgz", "resolved": "https://registry.npmjs.org/babel-plugin-member-expression-literals/-/babel-plugin-member-expression-literals-1.0.1.tgz" }, "babel-plugin-property-literals": { "version": "1.0.1", - "from": "babel-plugin-property-literals@>=1.0.1 <2.0.0", + "from": "https://registry.npmjs.org/babel-plugin-property-literals/-/babel-plugin-property-literals-1.0.1.tgz", "resolved": "https://registry.npmjs.org/babel-plugin-property-literals/-/babel-plugin-property-literals-1.0.1.tgz" }, "babel-plugin-proto-to-assign": { "version": "1.0.4", - "from": "babel-plugin-proto-to-assign@>=1.0.3 <2.0.0", + "from": "https://registry.npmjs.org/babel-plugin-proto-to-assign/-/babel-plugin-proto-to-assign-1.0.4.tgz", "resolved": "https://registry.npmjs.org/babel-plugin-proto-to-assign/-/babel-plugin-proto-to-assign-1.0.4.tgz" }, "babel-plugin-react-constant-elements": { "version": "1.0.3", - "from": "babel-plugin-react-constant-elements@>=1.0.3 <2.0.0", + "from": "https://registry.npmjs.org/babel-plugin-react-constant-elements/-/babel-plugin-react-constant-elements-1.0.3.tgz", "resolved": "https://registry.npmjs.org/babel-plugin-react-constant-elements/-/babel-plugin-react-constant-elements-1.0.3.tgz" }, "babel-plugin-react-display-name": { "version": "1.0.3", - "from": "babel-plugin-react-display-name@>=1.0.3 <2.0.0", + "from": "https://registry.npmjs.org/babel-plugin-react-display-name/-/babel-plugin-react-display-name-1.0.3.tgz", "resolved": "https://registry.npmjs.org/babel-plugin-react-display-name/-/babel-plugin-react-display-name-1.0.3.tgz" }, "babel-plugin-remove-console": { "version": "1.0.1", - "from": "babel-plugin-remove-console@>=1.0.1 <2.0.0", + "from": "https://registry.npmjs.org/babel-plugin-remove-console/-/babel-plugin-remove-console-1.0.1.tgz", "resolved": "https://registry.npmjs.org/babel-plugin-remove-console/-/babel-plugin-remove-console-1.0.1.tgz" }, "babel-plugin-remove-debugger": { "version": "1.0.1", - "from": "babel-plugin-remove-debugger@>=1.0.1 <2.0.0", + "from": "https://registry.npmjs.org/babel-plugin-remove-debugger/-/babel-plugin-remove-debugger-1.0.1.tgz", "resolved": "https://registry.npmjs.org/babel-plugin-remove-debugger/-/babel-plugin-remove-debugger-1.0.1.tgz" }, "babel-plugin-runtime": { "version": "1.0.7", - "from": "babel-plugin-runtime@>=1.0.7 <2.0.0", + "from": "https://registry.npmjs.org/babel-plugin-runtime/-/babel-plugin-runtime-1.0.7.tgz", "resolved": "https://registry.npmjs.org/babel-plugin-runtime/-/babel-plugin-runtime-1.0.7.tgz" }, "babel-plugin-undeclared-variables-check": { "version": "1.0.2", - "from": "babel-plugin-undeclared-variables-check@>=1.0.2 <2.0.0", + "from": "https://registry.npmjs.org/babel-plugin-undeclared-variables-check/-/babel-plugin-undeclared-variables-check-1.0.2.tgz", "resolved": "https://registry.npmjs.org/babel-plugin-undeclared-variables-check/-/babel-plugin-undeclared-variables-check-1.0.2.tgz", "dependencies": { "leven": { "version": "1.0.2", - "from": "leven@>=1.0.2 <2.0.0", + "from": "https://registry.npmjs.org/leven/-/leven-1.0.2.tgz", "resolved": "https://registry.npmjs.org/leven/-/leven-1.0.2.tgz" } } }, "babel-plugin-undefined-to-void": { "version": "1.1.6", - "from": "babel-plugin-undefined-to-void@>=1.1.6 <2.0.0", + "from": "https://registry.npmjs.org/babel-plugin-undefined-to-void/-/babel-plugin-undefined-to-void-1.1.6.tgz", "resolved": "https://registry.npmjs.org/babel-plugin-undefined-to-void/-/babel-plugin-undefined-to-void-1.1.6.tgz" }, "babylon": { "version": "5.8.38", - "from": "babylon@>=5.8.38 <6.0.0", + "from": "https://registry.npmjs.org/babylon/-/babylon-5.8.38.tgz", "resolved": "https://registry.npmjs.org/babylon/-/babylon-5.8.38.tgz" }, "bluebird": { "version": "2.10.2", - "from": "bluebird@>=2.9.33 <3.0.0", + "from": "https://registry.npmjs.org/bluebird/-/bluebird-2.10.2.tgz", "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-2.10.2.tgz" }, "convert-source-map": { "version": "1.2.0", - "from": "convert-source-map@>=1.1.0 <2.0.0", + "from": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.2.0.tgz", "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.2.0.tgz" }, "core-js": { "version": "1.2.6", - "from": "core-js@>=1.0.0 <2.0.0", + "from": "https://registry.npmjs.org/core-js/-/core-js-1.2.6.tgz", "resolved": "https://registry.npmjs.org/core-js/-/core-js-1.2.6.tgz" }, "debug": { "version": "2.2.0", - "from": "debug@>=2.1.1 <3.0.0", + "from": "https://registry.npmjs.org/debug/-/debug-2.2.0.tgz", "resolved": "https://registry.npmjs.org/debug/-/debug-2.2.0.tgz", "dependencies": { "ms": { "version": "0.7.1", - "from": "ms@0.7.1", + "from": "https://registry.npmjs.org/ms/-/ms-0.7.1.tgz", "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.1.tgz" } } }, "detect-indent": { "version": "3.0.1", - "from": "detect-indent@>=3.0.0 <4.0.0", + "from": "https://registry.npmjs.org/detect-indent/-/detect-indent-3.0.1.tgz", "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-3.0.1.tgz", "dependencies": { "get-stdin": { "version": "4.0.1", - "from": "get-stdin@>=4.0.1 <5.0.0", + "from": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz", "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz" }, "minimist": { "version": "1.2.0", - "from": "minimist@>=1.1.0 <2.0.0", + "from": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz" } } }, "esutils": { "version": "2.0.2", - "from": "esutils@>=2.0.0 <3.0.0", + "from": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz" }, "fs-readdir-recursive": { "version": "0.1.2", - "from": "fs-readdir-recursive@>=0.1.0 <0.2.0", + "from": "https://registry.npmjs.org/fs-readdir-recursive/-/fs-readdir-recursive-0.1.2.tgz", "resolved": "https://registry.npmjs.org/fs-readdir-recursive/-/fs-readdir-recursive-0.1.2.tgz" }, "globals": { "version": "6.4.1", - "from": "globals@>=6.4.0 <7.0.0", + "from": "https://registry.npmjs.org/globals/-/globals-6.4.1.tgz", "resolved": "https://registry.npmjs.org/globals/-/globals-6.4.1.tgz" }, "home-or-tmp": { "version": "1.0.0", - "from": "home-or-tmp@>=1.0.0 <2.0.0", + "from": "https://registry.npmjs.org/home-or-tmp/-/home-or-tmp-1.0.0.tgz", "resolved": "https://registry.npmjs.org/home-or-tmp/-/home-or-tmp-1.0.0.tgz", "dependencies": { "os-tmpdir": { "version": "1.0.1", - "from": "os-tmpdir@>=1.0.1 <2.0.0", + "from": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.1.tgz", "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.1.tgz" }, "user-home": { "version": "1.1.1", - "from": "user-home@>=1.1.1 <2.0.0", + "from": "https://registry.npmjs.org/user-home/-/user-home-1.1.1.tgz", "resolved": "https://registry.npmjs.org/user-home/-/user-home-1.1.1.tgz" } } }, "is-integer": { "version": "1.0.6", - "from": "is-integer@>=1.0.4 <2.0.0", + "from": "https://registry.npmjs.org/is-integer/-/is-integer-1.0.6.tgz", "resolved": "https://registry.npmjs.org/is-integer/-/is-integer-1.0.6.tgz", "dependencies": { "is-finite": { "version": "1.0.1", - "from": "is-finite@>=1.0.0 <2.0.0", + "from": "https://registry.npmjs.org/is-finite/-/is-finite-1.0.1.tgz", "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.0.1.tgz", "dependencies": { "number-is-nan": { "version": "1.0.0", - "from": "number-is-nan@>=1.0.0 <2.0.0", + "from": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.0.tgz", "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.0.tgz" } } @@ -6284,32 +6189,32 @@ }, "js-tokens": { "version": "1.0.1", - "from": "js-tokens@1.0.1", + "from": "https://registry.npmjs.org/js-tokens/-/js-tokens-1.0.1.tgz", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-1.0.1.tgz" }, "json5": { "version": "0.4.0", - "from": "json5@>=0.4.0 <0.5.0", + "from": "https://registry.npmjs.org/json5/-/json5-0.4.0.tgz", "resolved": "https://registry.npmjs.org/json5/-/json5-0.4.0.tgz" }, "minimatch": { "version": "2.0.10", - "from": "minimatch@>=2.0.3 <3.0.0", + "from": "https://registry.npmjs.org/minimatch/-/minimatch-2.0.10.tgz", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-2.0.10.tgz", "dependencies": { "brace-expansion": { "version": "1.1.4", - "from": "brace-expansion@>=1.0.0 <2.0.0", + "from": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.4.tgz", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.4.tgz", "dependencies": { "balanced-match": { "version": "0.4.1", - "from": "balanced-match@>=0.4.1 <0.5.0", + "from": "https://registry.npmjs.org/balanced-match/-/balanced-match-0.4.1.tgz", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-0.4.1.tgz" }, "concat-map": { "version": "0.0.1", - "from": "concat-map@0.0.1", + "from": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz" } } @@ -6318,232 +6223,232 @@ }, "output-file-sync": { "version": "1.1.1", - "from": "output-file-sync@>=1.1.0 <2.0.0", + "from": "https://registry.npmjs.org/output-file-sync/-/output-file-sync-1.1.1.tgz", "resolved": "https://registry.npmjs.org/output-file-sync/-/output-file-sync-1.1.1.tgz", "dependencies": { "mkdirp": { "version": "0.5.1", - "from": "mkdirp@>=0.5.1 <0.6.0", + "from": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", "dependencies": { "minimist": { "version": "0.0.8", - "from": "minimist@0.0.8", + "from": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz" } } }, "xtend": { "version": "4.0.1", - "from": "xtend@>=4.0.0 <5.0.0", + "from": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz" } } }, "path-exists": { "version": "1.0.0", - "from": "path-exists@>=1.0.0 <2.0.0", + "from": "https://registry.npmjs.org/path-exists/-/path-exists-1.0.0.tgz", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-1.0.0.tgz" }, "path-is-absolute": { "version": "1.0.0", - "from": "path-is-absolute@>=1.0.0 <2.0.0", + "from": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.0.tgz", "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.0.tgz" }, "private": { "version": "0.1.6", - "from": "private@>=0.1.6 <0.2.0", + "from": "https://registry.npmjs.org/private/-/private-0.1.6.tgz", "resolved": "https://registry.npmjs.org/private/-/private-0.1.6.tgz" }, "regenerator": { "version": "0.8.40", - "from": "regenerator@0.8.40", + "from": "https://registry.npmjs.org/regenerator/-/regenerator-0.8.40.tgz", "resolved": "https://registry.npmjs.org/regenerator/-/regenerator-0.8.40.tgz", "dependencies": { "commoner": { "version": "0.10.4", - "from": "commoner@>=0.10.3 <0.11.0", + "from": "https://registry.npmjs.org/commoner/-/commoner-0.10.4.tgz", "resolved": "https://registry.npmjs.org/commoner/-/commoner-0.10.4.tgz", "dependencies": { "detective": { "version": "4.3.1", - "from": "detective@>=4.3.1 <5.0.0", + "from": "https://registry.npmjs.org/detective/-/detective-4.3.1.tgz", "resolved": "https://registry.npmjs.org/detective/-/detective-4.3.1.tgz", "dependencies": { "acorn": { "version": "1.2.2", - "from": "acorn@>=1.0.3 <2.0.0", + "from": "https://registry.npmjs.org/acorn/-/acorn-1.2.2.tgz", "resolved": "https://registry.npmjs.org/acorn/-/acorn-1.2.2.tgz" }, "defined": { "version": "1.0.0", - "from": "defined@>=1.0.0 <2.0.0", + "from": "https://registry.npmjs.org/defined/-/defined-1.0.0.tgz", "resolved": "https://registry.npmjs.org/defined/-/defined-1.0.0.tgz" } } }, "graceful-fs": { "version": "4.1.4", - "from": "graceful-fs@>=4.1.2 <5.0.0", + "from": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.4.tgz", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.4.tgz" }, "iconv-lite": { "version": "0.4.13", - "from": "iconv-lite@>=0.4.5 <0.5.0", + "from": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.13.tgz", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.13.tgz" }, "mkdirp": { "version": "0.5.1", - "from": "mkdirp@>=0.5.0 <0.6.0", + "from": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", "dependencies": { "minimist": { "version": "0.0.8", - "from": "minimist@0.0.8", + "from": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz" } } }, "q": { "version": "1.4.1", - "from": "q@>=1.1.2 <2.0.0", + "from": "https://registry.npmjs.org/q/-/q-1.4.1.tgz", "resolved": "https://registry.npmjs.org/q/-/q-1.4.1.tgz" } } }, "defs": { "version": "1.1.1", - "from": "defs@>=1.1.0 <1.2.0", + "from": "https://registry.npmjs.org/defs/-/defs-1.1.1.tgz", "resolved": "https://registry.npmjs.org/defs/-/defs-1.1.1.tgz", "dependencies": { "alter": { "version": "0.2.0", - "from": "alter@>=0.2.0 <0.3.0", + "from": "https://registry.npmjs.org/alter/-/alter-0.2.0.tgz", "resolved": "https://registry.npmjs.org/alter/-/alter-0.2.0.tgz", "dependencies": { "stable": { "version": "0.1.5", - "from": "stable@>=0.1.3 <0.2.0", + "from": "https://registry.npmjs.org/stable/-/stable-0.1.5.tgz", "resolved": "https://registry.npmjs.org/stable/-/stable-0.1.5.tgz" } } }, "ast-traverse": { "version": "0.1.1", - "from": "ast-traverse@>=0.1.1 <0.2.0", + "from": "https://registry.npmjs.org/ast-traverse/-/ast-traverse-0.1.1.tgz", "resolved": "https://registry.npmjs.org/ast-traverse/-/ast-traverse-0.1.1.tgz" }, "breakable": { "version": "1.0.0", - "from": "breakable@>=1.0.0 <1.1.0", + "from": "https://registry.npmjs.org/breakable/-/breakable-1.0.0.tgz", "resolved": "https://registry.npmjs.org/breakable/-/breakable-1.0.0.tgz" }, "simple-fmt": { "version": "0.1.0", - "from": "simple-fmt@>=0.1.0 <0.2.0", + "from": "https://registry.npmjs.org/simple-fmt/-/simple-fmt-0.1.0.tgz", "resolved": "https://registry.npmjs.org/simple-fmt/-/simple-fmt-0.1.0.tgz" }, "simple-is": { "version": "0.2.0", - "from": "simple-is@>=0.2.0 <0.3.0", + "from": "https://registry.npmjs.org/simple-is/-/simple-is-0.2.0.tgz", "resolved": "https://registry.npmjs.org/simple-is/-/simple-is-0.2.0.tgz" }, "stringset": { "version": "0.2.1", - "from": "stringset@>=0.2.1 <0.3.0", + "from": "https://registry.npmjs.org/stringset/-/stringset-0.2.1.tgz", "resolved": "https://registry.npmjs.org/stringset/-/stringset-0.2.1.tgz" }, "tryor": { "version": "0.1.2", - "from": "tryor@>=0.1.2 <0.2.0", + "from": "https://registry.npmjs.org/tryor/-/tryor-0.1.2.tgz", "resolved": "https://registry.npmjs.org/tryor/-/tryor-0.1.2.tgz" }, "yargs": { "version": "3.27.0", - "from": "yargs@>=3.27.0 <3.28.0", + "from": "https://registry.npmjs.org/yargs/-/yargs-3.27.0.tgz", "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.27.0.tgz", "dependencies": { "camelcase": { "version": "1.2.1", - "from": "camelcase@>=1.2.1 <2.0.0", + "from": "https://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz", "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz" }, "cliui": { "version": "2.1.0", - "from": "cliui@>=2.1.0 <3.0.0", + "from": "https://registry.npmjs.org/cliui/-/cliui-2.1.0.tgz", "resolved": "https://registry.npmjs.org/cliui/-/cliui-2.1.0.tgz", "dependencies": { "center-align": { "version": "0.1.3", - "from": "center-align@>=0.1.1 <0.2.0", + "from": "https://registry.npmjs.org/center-align/-/center-align-0.1.3.tgz", "resolved": "https://registry.npmjs.org/center-align/-/center-align-0.1.3.tgz", "dependencies": { "align-text": { "version": "0.1.4", - "from": "align-text@>=0.1.1 <0.2.0", + "from": "https://registry.npmjs.org/align-text/-/align-text-0.1.4.tgz", "resolved": "https://registry.npmjs.org/align-text/-/align-text-0.1.4.tgz", "dependencies": { "kind-of": { "version": "3.0.3", - "from": "kind-of@>=3.0.2 <4.0.0", + "from": "https://registry.npmjs.org/kind-of/-/kind-of-3.0.3.tgz", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.0.3.tgz", "dependencies": { "is-buffer": { "version": "1.1.3", - "from": "is-buffer@>=1.0.2 <2.0.0", + "from": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.3.tgz", "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.3.tgz" } } }, "longest": { "version": "1.0.1", - "from": "longest@>=1.0.1 <2.0.0", + "from": "https://registry.npmjs.org/longest/-/longest-1.0.1.tgz", "resolved": "https://registry.npmjs.org/longest/-/longest-1.0.1.tgz" }, "repeat-string": { "version": "1.5.4", - "from": "repeat-string@>=1.5.2 <2.0.0", + "from": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.5.4.tgz", "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.5.4.tgz" } } }, "lazy-cache": { "version": "1.0.4", - "from": "lazy-cache@>=1.0.3 <2.0.0", + "from": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-1.0.4.tgz", "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-1.0.4.tgz" } } }, "right-align": { "version": "0.1.3", - "from": "right-align@>=0.1.1 <0.2.0", + "from": "https://registry.npmjs.org/right-align/-/right-align-0.1.3.tgz", "resolved": "https://registry.npmjs.org/right-align/-/right-align-0.1.3.tgz", "dependencies": { "align-text": { "version": "0.1.4", - "from": "align-text@>=0.1.1 <0.2.0", + "from": "https://registry.npmjs.org/align-text/-/align-text-0.1.4.tgz", "resolved": "https://registry.npmjs.org/align-text/-/align-text-0.1.4.tgz", "dependencies": { "kind-of": { "version": "3.0.3", - "from": "kind-of@>=3.0.2 <4.0.0", + "from": "https://registry.npmjs.org/kind-of/-/kind-of-3.0.3.tgz", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.0.3.tgz", "dependencies": { "is-buffer": { "version": "1.1.3", - "from": "is-buffer@>=1.0.2 <2.0.0", + "from": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.3.tgz", "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.3.tgz" } } }, "longest": { "version": "1.0.1", - "from": "longest@>=1.0.1 <2.0.0", + "from": "https://registry.npmjs.org/longest/-/longest-1.0.1.tgz", "resolved": "https://registry.npmjs.org/longest/-/longest-1.0.1.tgz" }, "repeat-string": { "version": "1.5.4", - "from": "repeat-string@>=1.5.2 <2.0.0", + "from": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.5.4.tgz", "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.5.4.tgz" } } @@ -6552,29 +6457,29 @@ }, "wordwrap": { "version": "0.0.2", - "from": "wordwrap@0.0.2", + "from": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz", "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz" } } }, "decamelize": { "version": "1.2.0", - "from": "decamelize@>=1.0.0 <2.0.0", + "from": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz" }, "os-locale": { "version": "1.4.0", - "from": "os-locale@>=1.4.0 <2.0.0", + "from": "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz", "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz", "dependencies": { "lcid": { "version": "1.0.0", - "from": "lcid@>=1.0.0 <2.0.0", + "from": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz", "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz", "dependencies": { "invert-kv": { "version": "1.0.0", - "from": "invert-kv@>=1.0.0 <2.0.0", + "from": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz", "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz" } } @@ -6583,12 +6488,12 @@ }, "window-size": { "version": "0.1.4", - "from": "window-size@>=0.1.2 <0.2.0", + "from": "https://registry.npmjs.org/window-size/-/window-size-0.1.4.tgz", "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.1.4.tgz" }, "y18n": { "version": "3.2.1", - "from": "y18n@>=3.2.0 <4.0.0", + "from": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz", "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz" } } @@ -6597,68 +6502,68 @@ }, "esprima-fb": { "version": "15001.1001.0-dev-harmony-fb", - "from": "esprima-fb@>=15001.1001.0-dev-harmony-fb <15001.1002.0", + "from": "https://registry.npmjs.org/esprima-fb/-/esprima-fb-15001.1001.0-dev-harmony-fb.tgz", "resolved": "https://registry.npmjs.org/esprima-fb/-/esprima-fb-15001.1001.0-dev-harmony-fb.tgz" }, "recast": { "version": "0.10.33", - "from": "recast@0.10.33", + "from": "https://registry.npmjs.org/recast/-/recast-0.10.33.tgz", "resolved": "https://registry.npmjs.org/recast/-/recast-0.10.33.tgz", "dependencies": { "ast-types": { "version": "0.8.12", - "from": "ast-types@0.8.12", + "from": "https://registry.npmjs.org/ast-types/-/ast-types-0.8.12.tgz", "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.8.12.tgz" } } }, "through": { "version": "2.3.8", - "from": "through@>=2.3.8 <2.4.0", + "from": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz" } } }, "regexpu": { "version": "1.3.0", - "from": "regexpu@>=1.3.0 <2.0.0", + "from": "https://registry.npmjs.org/regexpu/-/regexpu-1.3.0.tgz", "resolved": "https://registry.npmjs.org/regexpu/-/regexpu-1.3.0.tgz", "dependencies": { "recast": { "version": "0.10.43", - "from": "recast@>=0.10.10 <0.11.0", + "from": "https://registry.npmjs.org/recast/-/recast-0.10.43.tgz", "resolved": "https://registry.npmjs.org/recast/-/recast-0.10.43.tgz", "dependencies": { "esprima-fb": { "version": "15001.1001.0-dev-harmony-fb", - "from": "esprima-fb@>=15001.1001.0-dev-harmony-fb <15001.1002.0", + "from": "https://registry.npmjs.org/esprima-fb/-/esprima-fb-15001.1001.0-dev-harmony-fb.tgz", "resolved": "https://registry.npmjs.org/esprima-fb/-/esprima-fb-15001.1001.0-dev-harmony-fb.tgz" }, "ast-types": { "version": "0.8.15", - "from": "ast-types@0.8.15", + "from": "https://registry.npmjs.org/ast-types/-/ast-types-0.8.15.tgz", "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.8.15.tgz" } } }, "regenerate": { "version": "1.2.1", - "from": "regenerate@>=1.2.1 <2.0.0", + "from": "https://registry.npmjs.org/regenerate/-/regenerate-1.2.1.tgz", "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.2.1.tgz" }, "regjsgen": { "version": "0.2.0", - "from": "regjsgen@>=0.2.0 <0.3.0", + "from": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.2.0.tgz", "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.2.0.tgz" }, "regjsparser": { "version": "0.1.5", - "from": "regjsparser@>=0.1.4 <0.2.0", + "from": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.1.5.tgz", "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.1.5.tgz", "dependencies": { "jsesc": { "version": "0.5.0", - "from": "jsesc@>=0.5.0 <0.6.0", + "from": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz" } } @@ -6667,17 +6572,17 @@ }, "repeating": { "version": "1.1.3", - "from": "repeating@>=1.1.2 <2.0.0", + "from": "https://registry.npmjs.org/repeating/-/repeating-1.1.3.tgz", "resolved": "https://registry.npmjs.org/repeating/-/repeating-1.1.3.tgz", "dependencies": { "is-finite": { "version": "1.0.1", - "from": "is-finite@>=1.0.0 <2.0.0", + "from": "https://registry.npmjs.org/is-finite/-/is-finite-1.0.1.tgz", "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.0.1.tgz", "dependencies": { "number-is-nan": { "version": "1.0.0", - "from": "number-is-nan@>=1.0.0 <2.0.0", + "from": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.0.tgz", "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.0.tgz" } } @@ -6686,32 +6591,32 @@ }, "shebang-regex": { "version": "1.0.0", - "from": "shebang-regex@>=1.0.0 <2.0.0", + "from": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz" }, "slash": { "version": "1.0.0", - "from": "slash@>=1.0.0 <2.0.0", + "from": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz", "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz" }, "source-map": { "version": "0.5.6", - "from": "source-map@>=0.5.0 <0.6.0", + "from": "https://registry.npmjs.org/source-map/-/source-map-0.5.6.tgz", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.6.tgz" }, "source-map-support": { "version": "0.2.10", - "from": "source-map-support@>=0.2.10 <0.3.0", + "from": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.2.10.tgz", "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.2.10.tgz", "dependencies": { "source-map": { "version": "0.1.32", - "from": "source-map@0.1.32", + "from": "https://registry.npmjs.org/source-map/-/source-map-0.1.32.tgz", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.1.32.tgz", "dependencies": { "amdefine": { "version": "1.0.0", - "from": "amdefine@>=0.0.4", + "from": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.0.tgz", "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.0.tgz" } } @@ -6720,78 +6625,78 @@ }, "to-fast-properties": { "version": "1.0.2", - "from": "to-fast-properties@>=1.0.0 <2.0.0", + "from": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.2.tgz", "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.2.tgz" }, "trim-right": { "version": "1.0.1", - "from": "trim-right@>=1.0.0 <2.0.0", + "from": "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz", "resolved": "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz" }, "try-resolve": { "version": "1.0.1", - "from": "try-resolve@>=1.0.0 <2.0.0", + "from": "https://registry.npmjs.org/try-resolve/-/try-resolve-1.0.1.tgz", "resolved": "https://registry.npmjs.org/try-resolve/-/try-resolve-1.0.1.tgz" } } }, "lodash.assign": { "version": "3.2.0", - "from": "lodash.assign@>=3.2.0 <4.0.0", + "from": "https://registry.npmjs.org/lodash.assign/-/lodash.assign-3.2.0.tgz", "resolved": "https://registry.npmjs.org/lodash.assign/-/lodash.assign-3.2.0.tgz", "dependencies": { "lodash._baseassign": { "version": "3.2.0", - "from": "lodash._baseassign@>=3.0.0 <4.0.0", + "from": "https://registry.npmjs.org/lodash._baseassign/-/lodash._baseassign-3.2.0.tgz", "resolved": "https://registry.npmjs.org/lodash._baseassign/-/lodash._baseassign-3.2.0.tgz", "dependencies": { "lodash._basecopy": { "version": "3.0.1", - "from": "lodash._basecopy@>=3.0.0 <4.0.0", + "from": "https://registry.npmjs.org/lodash._basecopy/-/lodash._basecopy-3.0.1.tgz", "resolved": "https://registry.npmjs.org/lodash._basecopy/-/lodash._basecopy-3.0.1.tgz" } } }, "lodash._createassigner": { "version": "3.1.1", - "from": "lodash._createassigner@>=3.0.0 <4.0.0", + "from": "https://registry.npmjs.org/lodash._createassigner/-/lodash._createassigner-3.1.1.tgz", "resolved": "https://registry.npmjs.org/lodash._createassigner/-/lodash._createassigner-3.1.1.tgz", "dependencies": { "lodash._bindcallback": { "version": "3.0.1", - "from": "lodash._bindcallback@>=3.0.0 <4.0.0", + "from": "https://registry.npmjs.org/lodash._bindcallback/-/lodash._bindcallback-3.0.1.tgz", "resolved": "https://registry.npmjs.org/lodash._bindcallback/-/lodash._bindcallback-3.0.1.tgz" }, "lodash._isiterateecall": { "version": "3.0.9", - "from": "lodash._isiterateecall@>=3.0.0 <4.0.0", + "from": "https://registry.npmjs.org/lodash._isiterateecall/-/lodash._isiterateecall-3.0.9.tgz", "resolved": "https://registry.npmjs.org/lodash._isiterateecall/-/lodash._isiterateecall-3.0.9.tgz" }, "lodash.restparam": { "version": "3.6.1", - "from": "lodash.restparam@>=3.0.0 <4.0.0", + "from": "https://registry.npmjs.org/lodash.restparam/-/lodash.restparam-3.6.1.tgz", "resolved": "https://registry.npmjs.org/lodash.restparam/-/lodash.restparam-3.6.1.tgz" } } }, "lodash.keys": { "version": "3.1.2", - "from": "lodash.keys@>=3.0.0 <4.0.0", + "from": "https://registry.npmjs.org/lodash.keys/-/lodash.keys-3.1.2.tgz", "resolved": "https://registry.npmjs.org/lodash.keys/-/lodash.keys-3.1.2.tgz", "dependencies": { "lodash._getnative": { "version": "3.9.1", - "from": "lodash._getnative@>=3.0.0 <4.0.0", + "from": "https://registry.npmjs.org/lodash._getnative/-/lodash._getnative-3.9.1.tgz", "resolved": "https://registry.npmjs.org/lodash._getnative/-/lodash._getnative-3.9.1.tgz" }, "lodash.isarguments": { "version": "3.0.8", - "from": "lodash.isarguments@>=3.0.0 <4.0.0", + "from": "https://registry.npmjs.org/lodash.isarguments/-/lodash.isarguments-3.0.8.tgz", "resolved": "https://registry.npmjs.org/lodash.isarguments/-/lodash.isarguments-3.0.8.tgz" }, "lodash.isarray": { "version": "3.0.4", - "from": "lodash.isarray@>=3.0.0 <4.0.0", + "from": "https://registry.npmjs.org/lodash.isarray/-/lodash.isarray-3.0.4.tgz", "resolved": "https://registry.npmjs.org/lodash.isarray/-/lodash.isarray-3.0.4.tgz" } } @@ -6802,156 +6707,156 @@ }, "chalk": { "version": "1.1.3", - "from": "chalk@>=1.1.0 <1.2.0", + "from": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", "dependencies": { "ansi-styles": { "version": "2.2.1", - "from": "ansi-styles@>=2.2.1 <3.0.0", + "from": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz" }, "escape-string-regexp": { "version": "1.0.5", - "from": "escape-string-regexp@>=1.0.2 <2.0.0", + "from": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz" }, "has-ansi": { "version": "2.0.0", - "from": "has-ansi@>=2.0.0 <3.0.0", + "from": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", "dependencies": { "ansi-regex": { "version": "2.0.0", - "from": "ansi-regex@>=2.0.0 <3.0.0", + "from": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.0.0.tgz", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.0.0.tgz" } } }, "strip-ansi": { "version": "3.0.1", - "from": "strip-ansi@>=3.0.0 <4.0.0", + "from": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", "dependencies": { "ansi-regex": { "version": "2.0.0", - "from": "ansi-regex@>=2.0.0 <3.0.0", + "from": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.0.0.tgz", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.0.0.tgz" } } }, "supports-color": { "version": "2.0.0", - "from": "supports-color@>=2.0.0 <3.0.0", + "from": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz" } } }, "cli-table": { "version": "0.3.1", - "from": "cli-table@>=0.3.1 <0.4.0", + "from": "https://registry.npmjs.org/cli-table/-/cli-table-0.3.1.tgz", "resolved": "https://registry.npmjs.org/cli-table/-/cli-table-0.3.1.tgz", "dependencies": { "colors": { "version": "1.0.3", - "from": "colors@1.0.3", + "from": "https://registry.npmjs.org/colors/-/colors-1.0.3.tgz", "resolved": "https://registry.npmjs.org/colors/-/colors-1.0.3.tgz" } } }, "commander": { "version": "2.9.0", - "from": "commander@>=2.9.0 <2.10.0", + "from": "https://registry.npmjs.org/commander/-/commander-2.9.0.tgz", "resolved": "https://registry.npmjs.org/commander/-/commander-2.9.0.tgz", "dependencies": { "graceful-readlink": { "version": "1.0.1", - "from": "graceful-readlink@>=1.0.0", + "from": "https://registry.npmjs.org/graceful-readlink/-/graceful-readlink-1.0.1.tgz", "resolved": "https://registry.npmjs.org/graceful-readlink/-/graceful-readlink-1.0.1.tgz" } } }, "escope": { "version": "3.6.0", - "from": "escope@>=3.2.0 <4.0.0", + "from": "https://registry.npmjs.org/escope/-/escope-3.6.0.tgz", "resolved": "https://registry.npmjs.org/escope/-/escope-3.6.0.tgz", "dependencies": { "es6-map": { "version": "0.1.3", - "from": "es6-map@>=0.1.3 <0.2.0", + "from": "https://registry.npmjs.org/es6-map/-/es6-map-0.1.3.tgz", "resolved": "https://registry.npmjs.org/es6-map/-/es6-map-0.1.3.tgz", "dependencies": { "d": { "version": "0.1.1", - "from": "d@>=0.1.1 <0.2.0", + "from": "https://registry.npmjs.org/d/-/d-0.1.1.tgz", "resolved": "https://registry.npmjs.org/d/-/d-0.1.1.tgz" }, "es5-ext": { "version": "0.10.11", - "from": "es5-ext@>=0.10.8 <0.11.0", + "from": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.11.tgz", "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.11.tgz" }, "es6-iterator": { "version": "2.0.0", - "from": "es6-iterator@>=2.0.0 <3.0.0", + "from": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.0.tgz", "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.0.tgz" }, "es6-set": { "version": "0.1.4", - "from": "es6-set@>=0.1.3 <0.2.0", + "from": "https://registry.npmjs.org/es6-set/-/es6-set-0.1.4.tgz", "resolved": "https://registry.npmjs.org/es6-set/-/es6-set-0.1.4.tgz" }, "es6-symbol": { "version": "3.0.2", - "from": "es6-symbol@>=3.0.1 <3.1.0", + "from": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.0.2.tgz", "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.0.2.tgz" }, "event-emitter": { "version": "0.3.4", - "from": "event-emitter@>=0.3.4 <0.4.0", + "from": "https://registry.npmjs.org/event-emitter/-/event-emitter-0.3.4.tgz", "resolved": "https://registry.npmjs.org/event-emitter/-/event-emitter-0.3.4.tgz" } } }, "es6-weak-map": { "version": "2.0.1", - "from": "es6-weak-map@>=2.0.1 <3.0.0", + "from": "https://registry.npmjs.org/es6-weak-map/-/es6-weak-map-2.0.1.tgz", "resolved": "https://registry.npmjs.org/es6-weak-map/-/es6-weak-map-2.0.1.tgz", "dependencies": { "d": { "version": "0.1.1", - "from": "d@>=0.1.1 <0.2.0", + "from": "https://registry.npmjs.org/d/-/d-0.1.1.tgz", "resolved": "https://registry.npmjs.org/d/-/d-0.1.1.tgz" }, "es5-ext": { "version": "0.10.11", - "from": "es5-ext@>=0.10.8 <0.11.0", + "from": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.11.tgz", "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.11.tgz" }, "es6-iterator": { "version": "2.0.0", - "from": "es6-iterator@>=2.0.0 <3.0.0", + "from": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.0.tgz", "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.0.tgz" }, "es6-symbol": { "version": "3.0.2", - "from": "es6-symbol@>=3.0.0 <4.0.0", + "from": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.0.2.tgz", "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.0.2.tgz" } } }, "esrecurse": { "version": "4.1.0", - "from": "esrecurse@>=4.1.0 <5.0.0", + "from": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.1.0.tgz", "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.1.0.tgz", "dependencies": { "estraverse": { "version": "4.1.1", - "from": "estraverse@>=4.1.0 <4.2.0", + "from": "https://registry.npmjs.org/estraverse/-/estraverse-4.1.1.tgz", "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.1.1.tgz" }, "object-assign": { "version": "4.1.0", - "from": "object-assign@>=4.0.1 <5.0.0", + "from": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.0.tgz", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.0.tgz" } } @@ -6960,88 +6865,88 @@ }, "esprima": { "version": "2.7.2", - "from": "esprima@>=2.7.0 <2.8.0", + "from": "https://registry.npmjs.org/esprima/-/esprima-2.7.2.tgz", "resolved": "https://registry.npmjs.org/esprima/-/esprima-2.7.2.tgz" }, "estraverse": { "version": "4.2.0", - "from": "estraverse@>=4.1.0 <5.0.0", + "from": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz", "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz" }, "exit": { "version": "0.1.2", - "from": "exit@>=0.1.2 <0.2.0", + "from": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz" }, "glob": { "version": "5.0.15", - "from": "glob@>=5.0.1 <6.0.0", + "from": "https://registry.npmjs.org/glob/-/glob-5.0.15.tgz", "resolved": "https://registry.npmjs.org/glob/-/glob-5.0.15.tgz", "dependencies": { "inflight": { "version": "1.0.4", - "from": "inflight@>=1.0.4 <2.0.0", + "from": "https://registry.npmjs.org/inflight/-/inflight-1.0.4.tgz", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.4.tgz", "dependencies": { "wrappy": { "version": "1.0.1", - "from": "wrappy@>=1.0.0 <2.0.0", + "from": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.1.tgz", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.1.tgz" } } }, "inherits": { "version": "2.0.1", - "from": "inherits@>=2.0.0 <3.0.0", + "from": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz" }, "once": { "version": "1.3.3", - "from": "once@>=1.3.0 <2.0.0", + "from": "https://registry.npmjs.org/once/-/once-1.3.3.tgz", "resolved": "https://registry.npmjs.org/once/-/once-1.3.3.tgz", "dependencies": { "wrappy": { "version": "1.0.1", - "from": "wrappy@>=1.0.0 <2.0.0", + "from": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.1.tgz", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.1.tgz" } } }, "path-is-absolute": { "version": "1.0.0", - "from": "path-is-absolute@>=1.0.0 <2.0.0", + "from": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.0.tgz", "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.0.tgz" } } }, "htmlparser2": { "version": "3.8.3", - "from": "htmlparser2@3.8.3", + "from": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.8.3.tgz", "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.8.3.tgz", "dependencies": { "domhandler": { "version": "2.3.0", - "from": "domhandler@>=2.3.0 <2.4.0", + "from": "https://registry.npmjs.org/domhandler/-/domhandler-2.3.0.tgz", "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.3.0.tgz" }, "domutils": { "version": "1.5.1", - "from": "domutils@>=1.5.0 <1.6.0", + "from": "https://registry.npmjs.org/domutils/-/domutils-1.5.1.tgz", "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.5.1.tgz", "dependencies": { "dom-serializer": { "version": "0.1.0", - "from": "dom-serializer@>=0.0.0 <1.0.0", + "from": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.1.0.tgz", "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.1.0.tgz", "dependencies": { "domelementtype": { "version": "1.1.3", - "from": "domelementtype@>=1.1.1 <1.2.0", + "from": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.1.3.tgz", "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.1.3.tgz" }, "entities": { "version": "1.1.1", - "from": "entities@>=1.1.1 <1.2.0", + "from": "https://registry.npmjs.org/entities/-/entities-1.1.1.tgz", "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.1.tgz" } } @@ -7050,110 +6955,110 @@ }, "domelementtype": { "version": "1.3.0", - "from": "domelementtype@>=1.0.0 <2.0.0", + "from": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.0.tgz", "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.0.tgz" }, "readable-stream": { "version": "1.1.14", - "from": "readable-stream@>=1.1.0 <1.2.0", + "from": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", "dependencies": { "core-util-is": { "version": "1.0.2", - "from": "core-util-is@>=1.0.0 <1.1.0", + "from": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz" }, "isarray": { "version": "0.0.1", - "from": "isarray@0.0.1", + "from": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz" }, "string_decoder": { "version": "0.10.31", - "from": "string_decoder@>=0.10.0 <0.11.0", + "from": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz" }, "inherits": { "version": "2.0.1", - "from": "inherits@>=2.0.1 <2.1.0", + "from": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz" } } }, "entities": { "version": "1.0.0", - "from": "entities@>=1.0.0 <1.1.0", + "from": "https://registry.npmjs.org/entities/-/entities-1.0.0.tgz", "resolved": "https://registry.npmjs.org/entities/-/entities-1.0.0.tgz" } } }, "js-yaml": { "version": "3.4.6", - "from": "js-yaml@>=3.4.0 <3.5.0", + "from": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.4.6.tgz", "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.4.6.tgz", "dependencies": { "argparse": { "version": "1.0.7", - "from": "argparse@>=1.0.2 <2.0.0", + "from": "https://registry.npmjs.org/argparse/-/argparse-1.0.7.tgz", "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.7.tgz", "dependencies": { "sprintf-js": { "version": "1.0.3", - "from": "sprintf-js@>=1.0.2 <1.1.0", + "from": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz" } } }, "inherit": { "version": "2.2.3", - "from": "inherit@>=2.2.2 <3.0.0", + "from": "https://registry.npmjs.org/inherit/-/inherit-2.2.3.tgz", "resolved": "https://registry.npmjs.org/inherit/-/inherit-2.2.3.tgz" } } }, "jscs-jsdoc": { "version": "1.3.2", - "from": "jscs-jsdoc@>=1.3.1 <2.0.0", + "from": "https://registry.npmjs.org/jscs-jsdoc/-/jscs-jsdoc-1.3.2.tgz", "resolved": "https://registry.npmjs.org/jscs-jsdoc/-/jscs-jsdoc-1.3.2.tgz", "dependencies": { "comment-parser": { "version": "0.3.1", - "from": "comment-parser@>=0.3.1 <0.4.0", + "from": "https://registry.npmjs.org/comment-parser/-/comment-parser-0.3.1.tgz", "resolved": "https://registry.npmjs.org/comment-parser/-/comment-parser-0.3.1.tgz", "dependencies": { "readable-stream": { "version": "2.1.2", - "from": "readable-stream@>=2.0.2 <3.0.0", + "from": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.1.2.tgz", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.1.2.tgz", "dependencies": { "core-util-is": { "version": "1.0.2", - "from": "core-util-is@>=1.0.0 <1.1.0", + "from": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz" }, "inherits": { "version": "2.0.1", - "from": "inherits@>=2.0.1 <2.1.0", + "from": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz" }, "isarray": { "version": "1.0.0", - "from": "isarray@>=1.0.0 <1.1.0", + "from": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz" }, "process-nextick-args": { "version": "1.0.7", - "from": "process-nextick-args@>=1.0.6 <1.1.0", + "from": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz", "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz" }, "string_decoder": { "version": "0.10.31", - "from": "string_decoder@>=0.10.0 <0.11.0", + "from": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz" }, "util-deprecate": { "version": "1.0.2", - "from": "util-deprecate@>=1.0.1 <1.1.0", + "from": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz" } } @@ -7162,49 +7067,49 @@ }, "jsdoctypeparser": { "version": "1.2.0", - "from": "jsdoctypeparser@>=1.2.0 <1.3.0", + "from": "https://registry.npmjs.org/jsdoctypeparser/-/jsdoctypeparser-1.2.0.tgz", "resolved": "https://registry.npmjs.org/jsdoctypeparser/-/jsdoctypeparser-1.2.0.tgz" } } }, "jscs-preset-wikimedia": { "version": "1.0.0", - "from": "jscs-preset-wikimedia@>=1.0.0 <1.1.0", + "from": "https://registry.npmjs.org/jscs-preset-wikimedia/-/jscs-preset-wikimedia-1.0.0.tgz", "resolved": "https://registry.npmjs.org/jscs-preset-wikimedia/-/jscs-preset-wikimedia-1.0.0.tgz" }, "jsonlint": { "version": "1.6.2", - "from": "jsonlint@>=1.6.2 <1.7.0", + "from": "https://registry.npmjs.org/jsonlint/-/jsonlint-1.6.2.tgz", "resolved": "https://registry.npmjs.org/jsonlint/-/jsonlint-1.6.2.tgz", "dependencies": { "nomnom": { "version": "1.8.1", - "from": "nomnom@>=1.5.0", + "from": "https://registry.npmjs.org/nomnom/-/nomnom-1.8.1.tgz", "resolved": "https://registry.npmjs.org/nomnom/-/nomnom-1.8.1.tgz", "dependencies": { "underscore": { "version": "1.6.0", - "from": "underscore@>=1.6.0 <1.7.0", + "from": "https://registry.npmjs.org/underscore/-/underscore-1.6.0.tgz", "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.6.0.tgz" }, "chalk": { "version": "0.4.0", - "from": "chalk@>=0.4.0 <0.5.0", + "from": "https://registry.npmjs.org/chalk/-/chalk-0.4.0.tgz", "resolved": "https://registry.npmjs.org/chalk/-/chalk-0.4.0.tgz", "dependencies": { "has-color": { "version": "0.1.7", - "from": "has-color@>=0.1.0 <0.2.0", + "from": "https://registry.npmjs.org/has-color/-/has-color-0.1.7.tgz", "resolved": "https://registry.npmjs.org/has-color/-/has-color-0.1.7.tgz" }, "ansi-styles": { "version": "1.0.0", - "from": "ansi-styles@>=1.0.0 <1.1.0", + "from": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-1.0.0.tgz", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-1.0.0.tgz" }, "strip-ansi": { "version": "0.1.1", - "from": "strip-ansi@>=0.1.0 <0.2.0", + "from": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-0.1.1.tgz", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-0.1.1.tgz" } } @@ -7213,34 +7118,34 @@ }, "JSV": { "version": "4.0.2", - "from": "JSV@>=4.0.0", + "from": "https://registry.npmjs.org/JSV/-/JSV-4.0.2.tgz", "resolved": "https://registry.npmjs.org/JSV/-/JSV-4.0.2.tgz" } } }, "lodash": { "version": "3.10.1", - "from": "lodash@>=3.10.0 <3.11.0", + "from": "https://registry.npmjs.org/lodash/-/lodash-3.10.1.tgz", "resolved": "https://registry.npmjs.org/lodash/-/lodash-3.10.1.tgz" }, "minimatch": { "version": "3.0.0", - "from": "minimatch@>=3.0.0 <3.1.0", + "from": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.0.tgz", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.0.tgz", "dependencies": { "brace-expansion": { "version": "1.1.4", - "from": "brace-expansion@>=1.0.0 <2.0.0", + "from": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.4.tgz", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.4.tgz", "dependencies": { "balanced-match": { "version": "0.4.1", - "from": "balanced-match@>=0.4.1 <0.5.0", + "from": "https://registry.npmjs.org/balanced-match/-/balanced-match-0.4.1.tgz", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-0.4.1.tgz" }, "concat-map": { "version": "0.0.1", - "from": "concat-map@0.0.1", + "from": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz" } } @@ -7249,120 +7154,120 @@ }, "natural-compare": { "version": "1.2.2", - "from": "natural-compare@>=1.2.2 <1.3.0", + "from": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.2.2.tgz", "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.2.2.tgz" }, "pathval": { "version": "0.1.1", - "from": "pathval@>=0.1.1 <0.2.0", + "from": "https://registry.npmjs.org/pathval/-/pathval-0.1.1.tgz", "resolved": "https://registry.npmjs.org/pathval/-/pathval-0.1.1.tgz" }, "prompt": { "version": "0.2.14", - "from": "prompt@>=0.2.14 <0.3.0", + "from": "https://registry.npmjs.org/prompt/-/prompt-0.2.14.tgz", "resolved": "https://registry.npmjs.org/prompt/-/prompt-0.2.14.tgz", "dependencies": { "pkginfo": { "version": "0.4.0", - "from": "pkginfo@>=0.0.0 <1.0.0", + "from": "https://registry.npmjs.org/pkginfo/-/pkginfo-0.4.0.tgz", "resolved": "https://registry.npmjs.org/pkginfo/-/pkginfo-0.4.0.tgz" }, "read": { "version": "1.0.7", - "from": "read@>=1.0.0 <1.1.0", + "from": "https://registry.npmjs.org/read/-/read-1.0.7.tgz", "resolved": "https://registry.npmjs.org/read/-/read-1.0.7.tgz", "dependencies": { "mute-stream": { "version": "0.0.6", - "from": "mute-stream@>=0.0.4 <0.1.0", + "from": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.6.tgz", "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.6.tgz" } } }, "revalidator": { "version": "0.1.8", - "from": "revalidator@>=0.1.0 <0.2.0", + "from": "https://registry.npmjs.org/revalidator/-/revalidator-0.1.8.tgz", "resolved": "https://registry.npmjs.org/revalidator/-/revalidator-0.1.8.tgz" }, "utile": { "version": "0.2.1", - "from": "utile@>=0.2.0 <0.3.0", + "from": "https://registry.npmjs.org/utile/-/utile-0.2.1.tgz", "resolved": "https://registry.npmjs.org/utile/-/utile-0.2.1.tgz", "dependencies": { "async": { "version": "0.2.10", - "from": "async@>=0.2.9 <0.3.0", + "from": "https://registry.npmjs.org/async/-/async-0.2.10.tgz", "resolved": "https://registry.npmjs.org/async/-/async-0.2.10.tgz" }, "deep-equal": { "version": "1.0.1", - "from": "deep-equal@*", + "from": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.0.1.tgz", "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.0.1.tgz" }, "i": { "version": "0.3.5", - "from": "i@>=0.3.0 <0.4.0", + "from": "https://registry.npmjs.org/i/-/i-0.3.5.tgz", "resolved": "https://registry.npmjs.org/i/-/i-0.3.5.tgz" }, "mkdirp": { "version": "0.5.1", - "from": "mkdirp@>=0.0.0 <1.0.0", + "from": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", "dependencies": { "minimist": { "version": "0.0.8", - "from": "minimist@0.0.8", + "from": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz" } } }, "ncp": { "version": "0.4.2", - "from": "ncp@>=0.4.0 <0.5.0", + "from": "https://registry.npmjs.org/ncp/-/ncp-0.4.2.tgz", "resolved": "https://registry.npmjs.org/ncp/-/ncp-0.4.2.tgz" }, "rimraf": { "version": "2.5.2", - "from": "rimraf@>=2.0.0 <3.0.0", + "from": "https://registry.npmjs.org/rimraf/-/rimraf-2.5.2.tgz", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.5.2.tgz", "dependencies": { "glob": { "version": "7.0.3", - "from": "glob@>=7.0.0 <8.0.0", + "from": "https://registry.npmjs.org/glob/-/glob-7.0.3.tgz", "resolved": "https://registry.npmjs.org/glob/-/glob-7.0.3.tgz", "dependencies": { "inflight": { "version": "1.0.4", - "from": "inflight@>=1.0.4 <2.0.0", + "from": "https://registry.npmjs.org/inflight/-/inflight-1.0.4.tgz", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.4.tgz", "dependencies": { "wrappy": { "version": "1.0.1", - "from": "wrappy@>=1.0.0 <2.0.0", + "from": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.1.tgz", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.1.tgz" } } }, "inherits": { "version": "2.0.1", - "from": "inherits@>=2.0.0 <3.0.0", + "from": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz" }, "once": { "version": "1.3.3", - "from": "once@>=1.3.0 <2.0.0", + "from": "https://registry.npmjs.org/once/-/once-1.3.3.tgz", "resolved": "https://registry.npmjs.org/once/-/once-1.3.3.tgz", "dependencies": { "wrappy": { "version": "1.0.1", - "from": "wrappy@>=1.0.0 <2.0.0", + "from": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.1.tgz", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.1.tgz" } } }, "path-is-absolute": { "version": "1.0.0", - "from": "path-is-absolute@>=1.0.0 <2.0.0", + "from": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.0.tgz", "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.0.tgz" } } @@ -7373,42 +7278,42 @@ }, "winston": { "version": "0.8.3", - "from": "winston@>=0.8.0 <0.9.0", + "from": "https://registry.npmjs.org/winston/-/winston-0.8.3.tgz", "resolved": "https://registry.npmjs.org/winston/-/winston-0.8.3.tgz", "dependencies": { "async": { "version": "0.2.10", - "from": "async@>=0.2.0 <0.3.0", + "from": "https://registry.npmjs.org/async/-/async-0.2.10.tgz", "resolved": "https://registry.npmjs.org/async/-/async-0.2.10.tgz" }, "colors": { "version": "0.6.2", - "from": "colors@>=0.6.0 <0.7.0", + "from": "https://registry.npmjs.org/colors/-/colors-0.6.2.tgz", "resolved": "https://registry.npmjs.org/colors/-/colors-0.6.2.tgz" }, "cycle": { "version": "1.0.3", - "from": "cycle@>=1.0.0 <1.1.0", + "from": "https://registry.npmjs.org/cycle/-/cycle-1.0.3.tgz", "resolved": "https://registry.npmjs.org/cycle/-/cycle-1.0.3.tgz" }, "eyes": { "version": "0.1.8", - "from": "eyes@>=0.1.0 <0.2.0", + "from": "https://registry.npmjs.org/eyes/-/eyes-0.1.8.tgz", "resolved": "https://registry.npmjs.org/eyes/-/eyes-0.1.8.tgz" }, "isstream": { "version": "0.1.2", - "from": "isstream@>=0.1.0 <0.2.0", + "from": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz" }, "pkginfo": { "version": "0.3.1", - "from": "pkginfo@>=0.3.0 <0.4.0", + "from": "https://registry.npmjs.org/pkginfo/-/pkginfo-0.3.1.tgz", "resolved": "https://registry.npmjs.org/pkginfo/-/pkginfo-0.3.1.tgz" }, "stack-trace": { "version": "0.0.9", - "from": "stack-trace@>=0.0.0 <0.1.0", + "from": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.9.tgz", "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.9.tgz" } } @@ -7417,96 +7322,96 @@ }, "reserved-words": { "version": "0.1.1", - "from": "reserved-words@>=0.1.1 <0.2.0", + "from": "https://registry.npmjs.org/reserved-words/-/reserved-words-0.1.1.tgz", "resolved": "https://registry.npmjs.org/reserved-words/-/reserved-words-0.1.1.tgz" }, "resolve": { "version": "1.1.7", - "from": "resolve@>=1.1.6 <2.0.0", + "from": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz" }, "strip-bom": { "version": "2.0.0", - "from": "strip-bom@>=2.0.0 <3.0.0", + "from": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", "dependencies": { "is-utf8": { "version": "0.2.1", - "from": "is-utf8@>=0.2.0 <0.3.0", + "from": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz" } } }, "strip-json-comments": { "version": "1.0.4", - "from": "strip-json-comments@>=1.0.2 <1.1.0", + "from": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-1.0.4.tgz", "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-1.0.4.tgz" }, "to-double-quotes": { "version": "2.0.0", - "from": "to-double-quotes@>=2.0.0 <3.0.0", + "from": "https://registry.npmjs.org/to-double-quotes/-/to-double-quotes-2.0.0.tgz", "resolved": "https://registry.npmjs.org/to-double-quotes/-/to-double-quotes-2.0.0.tgz" }, "to-single-quotes": { "version": "2.0.0", - "from": "to-single-quotes@>=2.0.0 <3.0.0", + "from": "https://registry.npmjs.org/to-single-quotes/-/to-single-quotes-2.0.0.tgz", "resolved": "https://registry.npmjs.org/to-single-quotes/-/to-single-quotes-2.0.0.tgz" }, "vow-fs": { "version": "0.3.5", - "from": "vow-fs@>=0.3.4 <0.4.0", + "from": "https://registry.npmjs.org/vow-fs/-/vow-fs-0.3.5.tgz", "resolved": "https://registry.npmjs.org/vow-fs/-/vow-fs-0.3.5.tgz", "dependencies": { "uuid": { "version": "2.0.2", - "from": "uuid@>=2.0.2 <3.0.0", + "from": "https://registry.npmjs.org/uuid/-/uuid-2.0.2.tgz", "resolved": "https://registry.npmjs.org/uuid/-/uuid-2.0.2.tgz" }, "vow-queue": { "version": "0.4.2", - "from": "vow-queue@>=0.4.1 <0.5.0", + "from": "https://registry.npmjs.org/vow-queue/-/vow-queue-0.4.2.tgz", "resolved": "https://registry.npmjs.org/vow-queue/-/vow-queue-0.4.2.tgz" }, "glob": { "version": "4.5.3", - "from": "glob@>=4.3.1 <5.0.0", + "from": "https://registry.npmjs.org/glob/-/glob-4.5.3.tgz", "resolved": "https://registry.npmjs.org/glob/-/glob-4.5.3.tgz", "dependencies": { "inflight": { "version": "1.0.4", - "from": "inflight@>=1.0.4 <2.0.0", + "from": "https://registry.npmjs.org/inflight/-/inflight-1.0.4.tgz", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.4.tgz", "dependencies": { "wrappy": { "version": "1.0.1", - "from": "wrappy@>=1.0.0 <2.0.0", + "from": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.1.tgz", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.1.tgz" } } }, "inherits": { "version": "2.0.1", - "from": "inherits@>=2.0.0 <3.0.0", + "from": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz" }, "minimatch": { "version": "2.0.10", - "from": "minimatch@>=2.0.1 <3.0.0", + "from": "https://registry.npmjs.org/minimatch/-/minimatch-2.0.10.tgz", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-2.0.10.tgz", "dependencies": { "brace-expansion": { "version": "1.1.4", - "from": "brace-expansion@>=1.0.0 <2.0.0", + "from": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.4.tgz", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.4.tgz", "dependencies": { "balanced-match": { "version": "0.4.1", - "from": "balanced-match@>=0.4.1 <0.5.0", + "from": "https://registry.npmjs.org/balanced-match/-/balanced-match-0.4.1.tgz", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-0.4.1.tgz" }, "concat-map": { "version": "0.0.1", - "from": "concat-map@0.0.1", + "from": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz" } } @@ -7515,12 +7420,12 @@ }, "once": { "version": "1.3.3", - "from": "once@>=1.3.0 <2.0.0", + "from": "https://registry.npmjs.org/once/-/once-1.3.3.tgz", "resolved": "https://registry.npmjs.org/once/-/once-1.3.3.tgz", "dependencies": { "wrappy": { "version": "1.0.1", - "from": "wrappy@>=1.0.0 <2.0.0", + "from": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.1.tgz", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.1.tgz" } } @@ -7531,75 +7436,75 @@ }, "xmlbuilder": { "version": "3.1.0", - "from": "xmlbuilder@>=3.1.0 <4.0.0", + "from": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-3.1.0.tgz", "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-3.1.0.tgz" } } }, "lodash": { "version": "4.6.1", - "from": "lodash@>=4.6.1 <4.7.0", + "from": "https://registry.npmjs.org/lodash/-/lodash-4.6.1.tgz", "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.6.1.tgz" }, "vow": { "version": "0.4.12", - "from": "vow@>=0.4.1 <0.5.0", + "from": "https://registry.npmjs.org/vow/-/vow-0.4.12.tgz", "resolved": "https://registry.npmjs.org/vow/-/vow-0.4.12.tgz" } } }, "grunt-merge-conflict": { "version": "0.0.2", - "from": "grunt-merge-conflict@>=0.0.1 <0.1.0", + "from": "https://registry.npmjs.org/grunt-merge-conflict/-/grunt-merge-conflict-0.0.2.tgz", "resolved": "https://registry.npmjs.org/grunt-merge-conflict/-/grunt-merge-conflict-0.0.2.tgz" }, "grunt-shell": { "version": "1.1.2", - "from": "grunt-shell@>=1.1.1 <1.2.0", + "from": "https://registry.npmjs.org/grunt-shell/-/grunt-shell-1.1.2.tgz", "resolved": "https://registry.npmjs.org/grunt-shell/-/grunt-shell-1.1.2.tgz", "dependencies": { "chalk": { "version": "1.1.3", - "from": "chalk@>=1.0.0 <2.0.0", + "from": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", "dependencies": { "ansi-styles": { "version": "2.2.1", - "from": "ansi-styles@>=2.2.1 <3.0.0", + "from": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz" }, "escape-string-regexp": { "version": "1.0.5", - "from": "escape-string-regexp@>=1.0.2 <2.0.0", + "from": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz" }, "has-ansi": { "version": "2.0.0", - "from": "has-ansi@>=2.0.0 <3.0.0", + "from": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", "dependencies": { "ansi-regex": { "version": "2.0.0", - "from": "ansi-regex@>=2.0.0 <3.0.0", + "from": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.0.0.tgz", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.0.0.tgz" } } }, "strip-ansi": { "version": "3.0.1", - "from": "strip-ansi@>=3.0.0 <4.0.0", + "from": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", "dependencies": { "ansi-regex": { "version": "2.0.0", - "from": "ansi-regex@>=2.0.0 <3.0.0", + "from": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.0.0.tgz", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.0.0.tgz" } } }, "supports-color": { "version": "2.0.0", - "from": "supports-color@>=2.0.0 <3.0.0", + "from": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz" } } @@ -7608,125 +7513,125 @@ }, "gulp": { "version": "3.8.11", - "from": "gulp@>=3.8.0 <3.9.0", + "from": "https://registry.npmjs.org/gulp/-/gulp-3.8.11.tgz", "resolved": "https://registry.npmjs.org/gulp/-/gulp-3.8.11.tgz", "dependencies": { "archy": { "version": "1.0.0", - "from": "archy@>=1.0.0 <2.0.0", + "from": "https://registry.npmjs.org/archy/-/archy-1.0.0.tgz", "resolved": "https://registry.npmjs.org/archy/-/archy-1.0.0.tgz" }, "chalk": { "version": "0.5.1", - "from": "chalk@>=0.5.0 <0.6.0", + "from": "https://registry.npmjs.org/chalk/-/chalk-0.5.1.tgz", "resolved": "https://registry.npmjs.org/chalk/-/chalk-0.5.1.tgz", "dependencies": { "ansi-styles": { "version": "1.1.0", - "from": "ansi-styles@>=1.1.0 <2.0.0", + "from": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-1.1.0.tgz", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-1.1.0.tgz" }, "escape-string-regexp": { "version": "1.0.5", - "from": "escape-string-regexp@>=1.0.0 <2.0.0", + "from": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz" }, "has-ansi": { "version": "0.1.0", - "from": "has-ansi@>=0.1.0 <0.2.0", + "from": "https://registry.npmjs.org/has-ansi/-/has-ansi-0.1.0.tgz", "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-0.1.0.tgz", "dependencies": { "ansi-regex": { "version": "0.2.1", - "from": "ansi-regex@>=0.2.1 <0.3.0", + "from": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-0.2.1.tgz", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-0.2.1.tgz" } } }, "strip-ansi": { "version": "0.3.0", - "from": "strip-ansi@>=0.3.0 <0.4.0", + "from": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-0.3.0.tgz", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-0.3.0.tgz", "dependencies": { "ansi-regex": { "version": "0.2.1", - "from": "ansi-regex@>=0.2.1 <0.3.0", + "from": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-0.2.1.tgz", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-0.2.1.tgz" } } }, "supports-color": { "version": "0.2.0", - "from": "supports-color@>=0.2.0 <0.3.0", + "from": "https://registry.npmjs.org/supports-color/-/supports-color-0.2.0.tgz", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-0.2.0.tgz" } } }, "deprecated": { "version": "0.0.1", - "from": "deprecated@>=0.0.1 <0.0.2", + "from": "https://registry.npmjs.org/deprecated/-/deprecated-0.0.1.tgz", "resolved": "https://registry.npmjs.org/deprecated/-/deprecated-0.0.1.tgz" }, "interpret": { "version": "0.3.10", - "from": "interpret@>=0.3.2 <0.4.0", + "from": "https://registry.npmjs.org/interpret/-/interpret-0.3.10.tgz", "resolved": "https://registry.npmjs.org/interpret/-/interpret-0.3.10.tgz" }, "liftoff": { "version": "2.2.1", - "from": "liftoff@>=2.0.1 <3.0.0", + "from": "https://registry.npmjs.org/liftoff/-/liftoff-2.2.1.tgz", "resolved": "https://registry.npmjs.org/liftoff/-/liftoff-2.2.1.tgz", "dependencies": { "extend": { "version": "2.0.1", - "from": "extend@>=2.0.1 <3.0.0", + "from": "https://registry.npmjs.org/extend/-/extend-2.0.1.tgz", "resolved": "https://registry.npmjs.org/extend/-/extend-2.0.1.tgz" }, "findup-sync": { "version": "0.3.0", - "from": "findup-sync@>=0.3.0 <0.4.0", + "from": "https://registry.npmjs.org/findup-sync/-/findup-sync-0.3.0.tgz", "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-0.3.0.tgz", "dependencies": { "glob": { "version": "5.0.15", - "from": "glob@>=5.0.0 <5.1.0", + "from": "https://registry.npmjs.org/glob/-/glob-5.0.15.tgz", "resolved": "https://registry.npmjs.org/glob/-/glob-5.0.15.tgz", "dependencies": { "inflight": { "version": "1.0.4", - "from": "inflight@>=1.0.4 <2.0.0", + "from": "https://registry.npmjs.org/inflight/-/inflight-1.0.4.tgz", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.4.tgz", "dependencies": { "wrappy": { "version": "1.0.1", - "from": "wrappy@>=1.0.0 <2.0.0", + "from": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.1.tgz", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.1.tgz" } } }, "inherits": { "version": "2.0.1", - "from": "inherits@>=2.0.0 <3.0.0", + "from": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz" }, "minimatch": { "version": "3.0.0", - "from": "minimatch@>=2.0.0 <3.0.0||>=3.0.0 <4.0.0", + "from": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.0.tgz", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.0.tgz", "dependencies": { "brace-expansion": { "version": "1.1.4", - "from": "brace-expansion@>=1.0.0 <2.0.0", + "from": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.4.tgz", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.4.tgz", "dependencies": { "balanced-match": { "version": "0.4.1", - "from": "balanced-match@>=0.4.1 <0.5.0", + "from": "https://registry.npmjs.org/balanced-match/-/balanced-match-0.4.1.tgz", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-0.4.1.tgz" }, "concat-map": { "version": "0.0.1", - "from": "concat-map@0.0.1", + "from": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz" } } @@ -7735,19 +7640,19 @@ }, "once": { "version": "1.3.3", - "from": "once@>=1.3.0 <2.0.0", + "from": "https://registry.npmjs.org/once/-/once-1.3.3.tgz", "resolved": "https://registry.npmjs.org/once/-/once-1.3.3.tgz", "dependencies": { "wrappy": { "version": "1.0.1", - "from": "wrappy@>=1.0.0 <2.0.0", + "from": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.1.tgz", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.1.tgz" } } }, "path-is-absolute": { "version": "1.0.0", - "from": "path-is-absolute@>=1.0.0 <2.0.0", + "from": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.0.tgz", "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.0.tgz" } } @@ -7756,44 +7661,44 @@ }, "flagged-respawn": { "version": "0.3.2", - "from": "flagged-respawn@>=0.3.2 <0.4.0", + "from": "https://registry.npmjs.org/flagged-respawn/-/flagged-respawn-0.3.2.tgz", "resolved": "https://registry.npmjs.org/flagged-respawn/-/flagged-respawn-0.3.2.tgz" }, "rechoir": { "version": "0.6.2", - "from": "rechoir@>=0.6.0 <0.7.0", + "from": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz" }, "resolve": { "version": "1.1.7", - "from": "resolve@>=1.1.6 <2.0.0", + "from": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz" } } }, "minimist": { "version": "1.2.0", - "from": "minimist@>=1.1.0 <2.0.0", + "from": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz" }, "orchestrator": { "version": "0.3.7", - "from": "orchestrator@>=0.3.0 <0.4.0", + "from": "https://registry.npmjs.org/orchestrator/-/orchestrator-0.3.7.tgz", "resolved": "https://registry.npmjs.org/orchestrator/-/orchestrator-0.3.7.tgz", "dependencies": { "end-of-stream": { "version": "0.1.5", - "from": "end-of-stream@>=0.1.5 <0.2.0", + "from": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-0.1.5.tgz", "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-0.1.5.tgz", "dependencies": { "once": { "version": "1.3.3", - "from": "once@>=1.3.0 <1.4.0", + "from": "https://registry.npmjs.org/once/-/once-1.3.3.tgz", "resolved": "https://registry.npmjs.org/once/-/once-1.3.3.tgz", "dependencies": { "wrappy": { "version": "1.0.1", - "from": "wrappy@>=1.0.0 <2.0.0", + "from": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.1.tgz", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.1.tgz" } } @@ -7802,102 +7707,102 @@ }, "sequencify": { "version": "0.0.7", - "from": "sequencify@>=0.0.7 <0.1.0", + "from": "https://registry.npmjs.org/sequencify/-/sequencify-0.0.7.tgz", "resolved": "https://registry.npmjs.org/sequencify/-/sequencify-0.0.7.tgz" }, "stream-consume": { "version": "0.1.0", - "from": "stream-consume@>=0.1.0 <0.2.0", + "from": "https://registry.npmjs.org/stream-consume/-/stream-consume-0.1.0.tgz", "resolved": "https://registry.npmjs.org/stream-consume/-/stream-consume-0.1.0.tgz" } } }, "pretty-hrtime": { "version": "0.2.2", - "from": "pretty-hrtime@>=0.2.0 <0.3.0", + "from": "https://registry.npmjs.org/pretty-hrtime/-/pretty-hrtime-0.2.2.tgz", "resolved": "https://registry.npmjs.org/pretty-hrtime/-/pretty-hrtime-0.2.2.tgz" }, "semver": { "version": "4.3.6", - "from": "semver@>=4.1.0 <5.0.0", + "from": "https://registry.npmjs.org/semver/-/semver-4.3.6.tgz", "resolved": "https://registry.npmjs.org/semver/-/semver-4.3.6.tgz" }, "tildify": { "version": "1.2.0", - "from": "tildify@>=1.0.0 <2.0.0", + "from": "https://registry.npmjs.org/tildify/-/tildify-1.2.0.tgz", "resolved": "https://registry.npmjs.org/tildify/-/tildify-1.2.0.tgz", "dependencies": { "os-homedir": { "version": "1.0.1", - "from": "os-homedir@>=1.0.0 <2.0.0", + "from": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.1.tgz", "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.1.tgz" } } }, "v8flags": { "version": "2.0.11", - "from": "v8flags@>=2.0.2 <3.0.0", + "from": "https://registry.npmjs.org/v8flags/-/v8flags-2.0.11.tgz", "resolved": "https://registry.npmjs.org/v8flags/-/v8flags-2.0.11.tgz", "dependencies": { "user-home": { "version": "1.1.1", - "from": "user-home@>=1.1.1 <2.0.0", + "from": "https://registry.npmjs.org/user-home/-/user-home-1.1.1.tgz", "resolved": "https://registry.npmjs.org/user-home/-/user-home-1.1.1.tgz" } } }, "vinyl-fs": { "version": "0.3.14", - "from": "vinyl-fs@>=0.3.0 <0.4.0", + "from": "https://registry.npmjs.org/vinyl-fs/-/vinyl-fs-0.3.14.tgz", "resolved": "https://registry.npmjs.org/vinyl-fs/-/vinyl-fs-0.3.14.tgz", "dependencies": { "defaults": { "version": "1.0.3", - "from": "defaults@>=1.0.0 <2.0.0", + "from": "https://registry.npmjs.org/defaults/-/defaults-1.0.3.tgz", "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.3.tgz", "dependencies": { "clone": { "version": "1.0.2", - "from": "clone@>=1.0.2 <2.0.0", + "from": "https://registry.npmjs.org/clone/-/clone-1.0.2.tgz", "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.2.tgz" } } }, "glob-stream": { "version": "3.1.18", - "from": "glob-stream@>=3.1.5 <4.0.0", + "from": "https://registry.npmjs.org/glob-stream/-/glob-stream-3.1.18.tgz", "resolved": "https://registry.npmjs.org/glob-stream/-/glob-stream-3.1.18.tgz", "dependencies": { "glob": { "version": "4.5.3", - "from": "glob@>=4.3.1 <5.0.0", + "from": "https://registry.npmjs.org/glob/-/glob-4.5.3.tgz", "resolved": "https://registry.npmjs.org/glob/-/glob-4.5.3.tgz", "dependencies": { "inflight": { "version": "1.0.4", - "from": "inflight@>=1.0.4 <2.0.0", + "from": "https://registry.npmjs.org/inflight/-/inflight-1.0.4.tgz", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.4.tgz", "dependencies": { "wrappy": { "version": "1.0.1", - "from": "wrappy@>=1.0.0 <2.0.0", + "from": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.1.tgz", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.1.tgz" } } }, "inherits": { "version": "2.0.1", - "from": "inherits@>=2.0.0 <3.0.0", + "from": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz" }, "once": { "version": "1.3.3", - "from": "once@>=1.3.0 <2.0.0", + "from": "https://registry.npmjs.org/once/-/once-1.3.3.tgz", "resolved": "https://registry.npmjs.org/once/-/once-1.3.3.tgz", "dependencies": { "wrappy": { "version": "1.0.1", - "from": "wrappy@>=1.0.0 <2.0.0", + "from": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.1.tgz", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.1.tgz" } } @@ -7906,22 +7811,22 @@ }, "minimatch": { "version": "2.0.10", - "from": "minimatch@>=2.0.1 <3.0.0", + "from": "https://registry.npmjs.org/minimatch/-/minimatch-2.0.10.tgz", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-2.0.10.tgz", "dependencies": { "brace-expansion": { "version": "1.1.4", - "from": "brace-expansion@>=1.0.0 <2.0.0", + "from": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.4.tgz", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.4.tgz", "dependencies": { "balanced-match": { "version": "0.4.1", - "from": "balanced-match@>=0.4.1 <0.5.0", + "from": "https://registry.npmjs.org/balanced-match/-/balanced-match-0.4.1.tgz", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-0.4.1.tgz" }, "concat-map": { "version": "0.0.1", - "from": "concat-map@0.0.1", + "from": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz" } } @@ -7930,78 +7835,78 @@ }, "ordered-read-streams": { "version": "0.1.0", - "from": "ordered-read-streams@>=0.1.0 <0.2.0", + "from": "https://registry.npmjs.org/ordered-read-streams/-/ordered-read-streams-0.1.0.tgz", "resolved": "https://registry.npmjs.org/ordered-read-streams/-/ordered-read-streams-0.1.0.tgz" }, "glob2base": { "version": "0.0.12", - "from": "glob2base@>=0.0.12 <0.0.13", + "from": "https://registry.npmjs.org/glob2base/-/glob2base-0.0.12.tgz", "resolved": "https://registry.npmjs.org/glob2base/-/glob2base-0.0.12.tgz", "dependencies": { "find-index": { "version": "0.1.1", - "from": "find-index@>=0.1.1 <0.2.0", + "from": "https://registry.npmjs.org/find-index/-/find-index-0.1.1.tgz", "resolved": "https://registry.npmjs.org/find-index/-/find-index-0.1.1.tgz" } } }, "unique-stream": { "version": "1.0.0", - "from": "unique-stream@>=1.0.0 <2.0.0", + "from": "https://registry.npmjs.org/unique-stream/-/unique-stream-1.0.0.tgz", "resolved": "https://registry.npmjs.org/unique-stream/-/unique-stream-1.0.0.tgz" } } }, "glob-watcher": { "version": "0.0.6", - "from": "glob-watcher@>=0.0.6 <0.0.7", + "from": "https://registry.npmjs.org/glob-watcher/-/glob-watcher-0.0.6.tgz", "resolved": "https://registry.npmjs.org/glob-watcher/-/glob-watcher-0.0.6.tgz", "dependencies": { "gaze": { "version": "0.5.2", - "from": "gaze@>=0.5.1 <0.6.0", + "from": "https://registry.npmjs.org/gaze/-/gaze-0.5.2.tgz", "resolved": "https://registry.npmjs.org/gaze/-/gaze-0.5.2.tgz", "dependencies": { "globule": { "version": "0.1.0", - "from": "globule@>=0.1.0 <0.2.0", + "from": "https://registry.npmjs.org/globule/-/globule-0.1.0.tgz", "resolved": "https://registry.npmjs.org/globule/-/globule-0.1.0.tgz", "dependencies": { "lodash": { "version": "1.0.2", - "from": "lodash@>=1.0.1 <1.1.0", + "from": "https://registry.npmjs.org/lodash/-/lodash-1.0.2.tgz", "resolved": "https://registry.npmjs.org/lodash/-/lodash-1.0.2.tgz" }, "glob": { "version": "3.1.21", - "from": "glob@>=3.1.21 <3.2.0", + "from": "https://registry.npmjs.org/glob/-/glob-3.1.21.tgz", "resolved": "https://registry.npmjs.org/glob/-/glob-3.1.21.tgz", "dependencies": { "graceful-fs": { "version": "1.2.3", - "from": "graceful-fs@>=1.2.0 <1.3.0", + "from": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-1.2.3.tgz", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-1.2.3.tgz" }, "inherits": { "version": "1.0.2", - "from": "inherits@>=1.0.0 <2.0.0", + "from": "https://registry.npmjs.org/inherits/-/inherits-1.0.2.tgz", "resolved": "https://registry.npmjs.org/inherits/-/inherits-1.0.2.tgz" } } }, "minimatch": { "version": "0.2.14", - "from": "minimatch@>=0.2.11 <0.3.0", + "from": "https://registry.npmjs.org/minimatch/-/minimatch-0.2.14.tgz", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-0.2.14.tgz", "dependencies": { "lru-cache": { "version": "2.7.3", - "from": "lru-cache@>=2.0.0 <3.0.0", + "from": "https://registry.npmjs.org/lru-cache/-/lru-cache-2.7.3.tgz", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-2.7.3.tgz" }, "sigmund": { "version": "1.0.1", - "from": "sigmund@>=1.0.0 <1.1.0", + "from": "https://registry.npmjs.org/sigmund/-/sigmund-1.0.1.tgz", "resolved": "https://registry.npmjs.org/sigmund/-/sigmund-1.0.1.tgz" } } @@ -8014,90 +7919,90 @@ }, "graceful-fs": { "version": "3.0.8", - "from": "graceful-fs@>=3.0.0 <4.0.0", + "from": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-3.0.8.tgz", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-3.0.8.tgz" }, "mkdirp": { "version": "0.5.1", - "from": "mkdirp@>=0.5.0 <0.6.0", + "from": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", "dependencies": { "minimist": { "version": "0.0.8", - "from": "minimist@0.0.8", + "from": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz" } } }, "strip-bom": { "version": "1.0.0", - "from": "strip-bom@>=1.0.0 <2.0.0", + "from": "https://registry.npmjs.org/strip-bom/-/strip-bom-1.0.0.tgz", "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-1.0.0.tgz", "dependencies": { "first-chunk-stream": { "version": "1.0.0", - "from": "first-chunk-stream@>=1.0.0 <2.0.0", + "from": "https://registry.npmjs.org/first-chunk-stream/-/first-chunk-stream-1.0.0.tgz", "resolved": "https://registry.npmjs.org/first-chunk-stream/-/first-chunk-stream-1.0.0.tgz" }, "is-utf8": { "version": "0.2.1", - "from": "is-utf8@>=0.2.0 <0.3.0", + "from": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz" } } }, "through2": { "version": "0.6.5", - "from": "through2@>=0.6.1 <0.7.0", + "from": "https://registry.npmjs.org/through2/-/through2-0.6.5.tgz", "resolved": "https://registry.npmjs.org/through2/-/through2-0.6.5.tgz", "dependencies": { "readable-stream": { "version": "1.0.34", - "from": "readable-stream@>=1.0.33-1 <1.1.0-0", + "from": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", "dependencies": { "core-util-is": { "version": "1.0.2", - "from": "core-util-is@>=1.0.0 <1.1.0", + "from": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz" }, "isarray": { "version": "0.0.1", - "from": "isarray@0.0.1", + "from": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz" }, "string_decoder": { "version": "0.10.31", - "from": "string_decoder@>=0.10.0 <0.11.0", + "from": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz" }, "inherits": { "version": "2.0.1", - "from": "inherits@>=2.0.1 <2.1.0", + "from": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz" } } }, "xtend": { "version": "4.0.1", - "from": "xtend@>=4.0.0 <4.1.0-0", + "from": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz" } } }, "vinyl": { "version": "0.4.6", - "from": "vinyl@>=0.4.0 <0.5.0", + "from": "https://registry.npmjs.org/vinyl/-/vinyl-0.4.6.tgz", "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-0.4.6.tgz", "dependencies": { "clone": { "version": "0.2.0", - "from": "clone@>=0.2.0 <0.3.0", + "from": "https://registry.npmjs.org/clone/-/clone-0.2.0.tgz", "resolved": "https://registry.npmjs.org/clone/-/clone-0.2.0.tgz" }, "clone-stats": { "version": "0.0.1", - "from": "clone-stats@>=0.0.1 <0.1.0", + "from": "https://registry.npmjs.org/clone-stats/-/clone-stats-0.0.1.tgz", "resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-0.0.1.tgz" } } @@ -8108,56 +8013,56 @@ }, "gulp-concat": { "version": "2.6.0", - "from": "gulp-concat@>=2.4.1 <3.0.0", + "from": "https://registry.npmjs.org/gulp-concat/-/gulp-concat-2.6.0.tgz", "resolved": "https://registry.npmjs.org/gulp-concat/-/gulp-concat-2.6.0.tgz", "dependencies": { "concat-with-sourcemaps": { "version": "1.0.4", - "from": "concat-with-sourcemaps@>=1.0.0 <2.0.0", + "from": "https://registry.npmjs.org/concat-with-sourcemaps/-/concat-with-sourcemaps-1.0.4.tgz", "resolved": "https://registry.npmjs.org/concat-with-sourcemaps/-/concat-with-sourcemaps-1.0.4.tgz", "dependencies": { "source-map": { "version": "0.5.6", - "from": "source-map@>=0.5.1 <0.6.0", + "from": "https://registry.npmjs.org/source-map/-/source-map-0.5.6.tgz", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.6.tgz" } } }, "through2": { "version": "0.6.5", - "from": "through2@>=0.6.3 <0.7.0", + "from": "https://registry.npmjs.org/through2/-/through2-0.6.5.tgz", "resolved": "https://registry.npmjs.org/through2/-/through2-0.6.5.tgz", "dependencies": { "readable-stream": { "version": "1.0.34", - "from": "readable-stream@>=1.0.33-1 <1.1.0-0", + "from": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", "dependencies": { "core-util-is": { "version": "1.0.2", - "from": "core-util-is@>=1.0.0 <1.1.0", + "from": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz" }, "isarray": { "version": "0.0.1", - "from": "isarray@0.0.1", + "from": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz" }, "string_decoder": { "version": "0.10.31", - "from": "string_decoder@>=0.10.0 <0.11.0", + "from": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz" }, "inherits": { "version": "2.0.1", - "from": "inherits@>=2.0.1 <2.1.0", + "from": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz" } } }, "xtend": { "version": "4.0.1", - "from": "xtend@>=4.0.0 <4.1.0", + "from": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz" } } @@ -8166,171 +8071,171 @@ }, "gulp-foreach": { "version": "0.0.1", - "from": "gulp-foreach@0.0.1", + "from": "https://registry.npmjs.org/gulp-foreach/-/gulp-foreach-0.0.1.tgz", "resolved": "https://registry.npmjs.org/gulp-foreach/-/gulp-foreach-0.0.1.tgz", "dependencies": { "gulp-util": { "version": "2.2.20", - "from": "gulp-util@>=2.2.14 <2.3.0", + "from": "https://registry.npmjs.org/gulp-util/-/gulp-util-2.2.20.tgz", "resolved": "https://registry.npmjs.org/gulp-util/-/gulp-util-2.2.20.tgz", "dependencies": { "chalk": { "version": "0.5.1", - "from": "chalk@>=0.5.0 <0.6.0", + "from": "https://registry.npmjs.org/chalk/-/chalk-0.5.1.tgz", "resolved": "https://registry.npmjs.org/chalk/-/chalk-0.5.1.tgz", "dependencies": { "ansi-styles": { "version": "1.1.0", - "from": "ansi-styles@>=1.1.0 <2.0.0", + "from": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-1.1.0.tgz", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-1.1.0.tgz" }, "escape-string-regexp": { "version": "1.0.5", - "from": "escape-string-regexp@>=1.0.0 <2.0.0", + "from": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz" }, "has-ansi": { "version": "0.1.0", - "from": "has-ansi@>=0.1.0 <0.2.0", + "from": "https://registry.npmjs.org/has-ansi/-/has-ansi-0.1.0.tgz", "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-0.1.0.tgz", "dependencies": { "ansi-regex": { "version": "0.2.1", - "from": "ansi-regex@>=0.2.1 <0.3.0", + "from": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-0.2.1.tgz", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-0.2.1.tgz" } } }, "strip-ansi": { "version": "0.3.0", - "from": "strip-ansi@>=0.3.0 <0.4.0", + "from": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-0.3.0.tgz", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-0.3.0.tgz", "dependencies": { "ansi-regex": { "version": "0.2.1", - "from": "ansi-regex@>=0.2.1 <0.3.0", + "from": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-0.2.1.tgz", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-0.2.1.tgz" } } }, "supports-color": { "version": "0.2.0", - "from": "supports-color@>=0.2.0 <0.3.0", + "from": "https://registry.npmjs.org/supports-color/-/supports-color-0.2.0.tgz", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-0.2.0.tgz" } } }, "dateformat": { "version": "1.0.12", - "from": "dateformat@>=1.0.7-1.2.3 <2.0.0", + "from": "https://registry.npmjs.org/dateformat/-/dateformat-1.0.12.tgz", "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-1.0.12.tgz", "dependencies": { "get-stdin": { "version": "4.0.1", - "from": "get-stdin@>=4.0.1 <5.0.0", + "from": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz", "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz" }, "meow": { "version": "3.7.0", - "from": "meow@>=3.3.0 <4.0.0", + "from": "https://registry.npmjs.org/meow/-/meow-3.7.0.tgz", "resolved": "https://registry.npmjs.org/meow/-/meow-3.7.0.tgz", "dependencies": { "camelcase-keys": { "version": "2.1.0", - "from": "camelcase-keys@>=2.0.0 <3.0.0", + "from": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-2.1.0.tgz", "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-2.1.0.tgz", "dependencies": { "camelcase": { "version": "2.1.1", - "from": "camelcase@>=2.0.0 <3.0.0", + "from": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz", "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz" } } }, "decamelize": { "version": "1.2.0", - "from": "decamelize@>=1.1.2 <2.0.0", + "from": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz" }, "loud-rejection": { "version": "1.3.0", - "from": "loud-rejection@>=1.0.0 <2.0.0", + "from": "https://registry.npmjs.org/loud-rejection/-/loud-rejection-1.3.0.tgz", "resolved": "https://registry.npmjs.org/loud-rejection/-/loud-rejection-1.3.0.tgz", "dependencies": { "array-find-index": { "version": "1.0.1", - "from": "array-find-index@>=1.0.0 <2.0.0", + "from": "https://registry.npmjs.org/array-find-index/-/array-find-index-1.0.1.tgz", "resolved": "https://registry.npmjs.org/array-find-index/-/array-find-index-1.0.1.tgz" }, "signal-exit": { "version": "2.1.2", - "from": "signal-exit@>=2.1.2 <3.0.0", + "from": "https://registry.npmjs.org/signal-exit/-/signal-exit-2.1.2.tgz", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-2.1.2.tgz" } } }, "map-obj": { "version": "1.0.1", - "from": "map-obj@>=1.0.1 <2.0.0", + "from": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz" }, "minimist": { "version": "1.2.0", - "from": "minimist@>=1.1.3 <2.0.0", + "from": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz" }, "normalize-package-data": { "version": "2.3.5", - "from": "normalize-package-data@>=2.3.4 <3.0.0", + "from": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.3.5.tgz", "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.3.5.tgz", "dependencies": { "hosted-git-info": { "version": "2.1.4", - "from": "hosted-git-info@>=2.1.4 <3.0.0", + "from": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.1.4.tgz", "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.1.4.tgz" }, "is-builtin-module": { "version": "1.0.0", - "from": "is-builtin-module@>=1.0.0 <2.0.0", + "from": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-1.0.0.tgz", "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-1.0.0.tgz", "dependencies": { "builtin-modules": { "version": "1.1.1", - "from": "builtin-modules@>=1.0.0 <2.0.0", + "from": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz" } } }, "validate-npm-package-license": { "version": "3.0.1", - "from": "validate-npm-package-license@>=3.0.1 <4.0.0", + "from": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.1.tgz", "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.1.tgz", "dependencies": { "spdx-correct": { "version": "1.0.2", - "from": "spdx-correct@>=1.0.0 <1.1.0", + "from": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-1.0.2.tgz", "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-1.0.2.tgz", "dependencies": { "spdx-license-ids": { "version": "1.2.1", - "from": "spdx-license-ids@>=1.0.2 <2.0.0", + "from": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-1.2.1.tgz", "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-1.2.1.tgz" } } }, "spdx-expression-parse": { "version": "1.0.2", - "from": "spdx-expression-parse@>=1.0.0 <1.1.0", + "from": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-1.0.2.tgz", "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-1.0.2.tgz", "dependencies": { "spdx-exceptions": { "version": "1.0.4", - "from": "spdx-exceptions@>=1.0.4 <2.0.0", + "from": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-1.0.4.tgz", "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-1.0.4.tgz" }, "spdx-license-ids": { "version": "1.2.1", - "from": "spdx-license-ids@>=1.0.0 <2.0.0", + "from": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-1.2.1.tgz", "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-1.2.1.tgz" } } @@ -8341,32 +8246,32 @@ }, "object-assign": { "version": "4.1.0", - "from": "object-assign@>=4.0.1 <5.0.0", + "from": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.0.tgz", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.0.tgz" }, "read-pkg-up": { "version": "1.0.1", - "from": "read-pkg-up@>=1.0.1 <2.0.0", + "from": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", "dependencies": { "find-up": { "version": "1.1.2", - "from": "find-up@>=1.0.0 <2.0.0", + "from": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", "dependencies": { "path-exists": { "version": "2.1.0", - "from": "path-exists@>=2.0.0 <3.0.0", + "from": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz" }, "pinkie-promise": { "version": "2.0.1", - "from": "pinkie-promise@>=2.0.0 <3.0.0", + "from": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", "dependencies": { "pinkie": { "version": "2.0.4", - "from": "pinkie@>=2.0.0 <3.0.0", + "from": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz" } } @@ -8375,32 +8280,32 @@ }, "read-pkg": { "version": "1.1.0", - "from": "read-pkg@>=1.0.0 <2.0.0", + "from": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", "dependencies": { "load-json-file": { "version": "1.1.0", - "from": "load-json-file@>=1.0.0 <2.0.0", + "from": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", "dependencies": { "graceful-fs": { "version": "4.1.4", - "from": "graceful-fs@>=4.1.2 <5.0.0", + "from": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.4.tgz", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.4.tgz" }, "parse-json": { "version": "2.2.0", - "from": "parse-json@>=2.2.0 <3.0.0", + "from": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", "dependencies": { "error-ex": { "version": "1.3.0", - "from": "error-ex@>=1.2.0 <2.0.0", + "from": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.0.tgz", "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.0.tgz", "dependencies": { "is-arrayish": { "version": "0.2.1", - "from": "is-arrayish@>=0.2.1 <0.3.0", + "from": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz" } } @@ -8409,29 +8314,29 @@ }, "pify": { "version": "2.3.0", - "from": "pify@>=2.0.0 <3.0.0", + "from": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz" }, "pinkie-promise": { "version": "2.0.1", - "from": "pinkie-promise@>=2.0.0 <3.0.0", + "from": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", "dependencies": { "pinkie": { "version": "2.0.4", - "from": "pinkie@>=2.0.0 <3.0.0", + "from": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz" } } }, "strip-bom": { "version": "2.0.0", - "from": "strip-bom@>=2.0.0 <3.0.0", + "from": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", "dependencies": { "is-utf8": { "version": "0.2.1", - "from": "is-utf8@>=0.2.0 <0.3.0", + "from": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz" } } @@ -8440,27 +8345,27 @@ }, "path-type": { "version": "1.1.0", - "from": "path-type@>=1.0.0 <2.0.0", + "from": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", "dependencies": { "graceful-fs": { "version": "4.1.4", - "from": "graceful-fs@>=4.1.2 <5.0.0", + "from": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.4.tgz", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.4.tgz" }, "pify": { "version": "2.3.0", - "from": "pify@>=2.0.0 <3.0.0", + "from": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz" }, "pinkie-promise": { "version": "2.0.1", - "from": "pinkie-promise@>=2.0.0 <3.0.0", + "from": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", "dependencies": { "pinkie": { "version": "2.0.4", - "from": "pinkie@>=2.0.0 <3.0.0", + "from": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz" } } @@ -8473,27 +8378,27 @@ }, "redent": { "version": "1.0.0", - "from": "redent@>=1.0.0 <2.0.0", + "from": "https://registry.npmjs.org/redent/-/redent-1.0.0.tgz", "resolved": "https://registry.npmjs.org/redent/-/redent-1.0.0.tgz", "dependencies": { "indent-string": { "version": "2.1.0", - "from": "indent-string@>=2.1.0 <3.0.0", + "from": "https://registry.npmjs.org/indent-string/-/indent-string-2.1.0.tgz", "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-2.1.0.tgz", "dependencies": { "repeating": { "version": "2.0.1", - "from": "repeating@>=2.0.0 <3.0.0", + "from": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz", "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz", "dependencies": { "is-finite": { "version": "1.0.1", - "from": "is-finite@>=1.0.0 <2.0.0", + "from": "https://registry.npmjs.org/is-finite/-/is-finite-1.0.1.tgz", "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.0.1.tgz", "dependencies": { "number-is-nan": { "version": "1.0.0", - "from": "number-is-nan@>=1.0.0 <2.0.0", + "from": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.0.tgz", "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.0.tgz" } } @@ -8504,14 +8409,14 @@ }, "strip-indent": { "version": "1.0.1", - "from": "strip-indent@>=1.0.1 <2.0.0", + "from": "https://registry.npmjs.org/strip-indent/-/strip-indent-1.0.1.tgz", "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-1.0.1.tgz" } } }, "trim-newlines": { "version": "1.0.0", - "from": "trim-newlines@>=1.0.0 <2.0.0", + "from": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-1.0.0.tgz", "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-1.0.0.tgz" } } @@ -8520,51 +8425,51 @@ }, "lodash._reinterpolate": { "version": "2.4.1", - "from": "lodash._reinterpolate@>=2.4.1 <3.0.0", + "from": "https://registry.npmjs.org/lodash._reinterpolate/-/lodash._reinterpolate-2.4.1.tgz", "resolved": "https://registry.npmjs.org/lodash._reinterpolate/-/lodash._reinterpolate-2.4.1.tgz" }, "lodash.template": { "version": "2.4.1", - "from": "lodash.template@>=2.4.1 <3.0.0", + "from": "https://registry.npmjs.org/lodash.template/-/lodash.template-2.4.1.tgz", "resolved": "https://registry.npmjs.org/lodash.template/-/lodash.template-2.4.1.tgz", "dependencies": { "lodash.defaults": { "version": "2.4.1", - "from": "lodash.defaults@>=2.4.1 <2.5.0", + "from": "https://registry.npmjs.org/lodash.defaults/-/lodash.defaults-2.4.1.tgz", "resolved": "https://registry.npmjs.org/lodash.defaults/-/lodash.defaults-2.4.1.tgz", "dependencies": { "lodash._objecttypes": { "version": "2.4.1", - "from": "lodash._objecttypes@>=2.4.1 <2.5.0", + "from": "https://registry.npmjs.org/lodash._objecttypes/-/lodash._objecttypes-2.4.1.tgz", "resolved": "https://registry.npmjs.org/lodash._objecttypes/-/lodash._objecttypes-2.4.1.tgz" } } }, "lodash.escape": { "version": "2.4.1", - "from": "lodash.escape@>=2.4.1 <2.5.0", + "from": "https://registry.npmjs.org/lodash.escape/-/lodash.escape-2.4.1.tgz", "resolved": "https://registry.npmjs.org/lodash.escape/-/lodash.escape-2.4.1.tgz", "dependencies": { "lodash._escapehtmlchar": { "version": "2.4.1", - "from": "lodash._escapehtmlchar@>=2.4.1 <2.5.0", + "from": "https://registry.npmjs.org/lodash._escapehtmlchar/-/lodash._escapehtmlchar-2.4.1.tgz", "resolved": "https://registry.npmjs.org/lodash._escapehtmlchar/-/lodash._escapehtmlchar-2.4.1.tgz", "dependencies": { "lodash._htmlescapes": { "version": "2.4.1", - "from": "lodash._htmlescapes@>=2.4.1 <2.5.0", + "from": "https://registry.npmjs.org/lodash._htmlescapes/-/lodash._htmlescapes-2.4.1.tgz", "resolved": "https://registry.npmjs.org/lodash._htmlescapes/-/lodash._htmlescapes-2.4.1.tgz" } } }, "lodash._reunescapedhtml": { "version": "2.4.1", - "from": "lodash._reunescapedhtml@>=2.4.1 <2.5.0", + "from": "https://registry.npmjs.org/lodash._reunescapedhtml/-/lodash._reunescapedhtml-2.4.1.tgz", "resolved": "https://registry.npmjs.org/lodash._reunescapedhtml/-/lodash._reunescapedhtml-2.4.1.tgz", "dependencies": { "lodash._htmlescapes": { "version": "2.4.1", - "from": "lodash._htmlescapes@>=2.4.1 <2.5.0", + "from": "https://registry.npmjs.org/lodash._htmlescapes/-/lodash._htmlescapes-2.4.1.tgz", "resolved": "https://registry.npmjs.org/lodash._htmlescapes/-/lodash._htmlescapes-2.4.1.tgz" } } @@ -8573,39 +8478,39 @@ }, "lodash._escapestringchar": { "version": "2.4.1", - "from": "lodash._escapestringchar@>=2.4.1 <2.5.0", + "from": "https://registry.npmjs.org/lodash._escapestringchar/-/lodash._escapestringchar-2.4.1.tgz", "resolved": "https://registry.npmjs.org/lodash._escapestringchar/-/lodash._escapestringchar-2.4.1.tgz" }, "lodash.keys": { "version": "2.4.1", - "from": "lodash.keys@>=2.4.1 <2.5.0", + "from": "https://registry.npmjs.org/lodash.keys/-/lodash.keys-2.4.1.tgz", "resolved": "https://registry.npmjs.org/lodash.keys/-/lodash.keys-2.4.1.tgz", "dependencies": { "lodash._isnative": { "version": "2.4.1", - "from": "lodash._isnative@>=2.4.1 <2.5.0", + "from": "https://registry.npmjs.org/lodash._isnative/-/lodash._isnative-2.4.1.tgz", "resolved": "https://registry.npmjs.org/lodash._isnative/-/lodash._isnative-2.4.1.tgz" }, "lodash.isobject": { "version": "2.4.1", - "from": "lodash.isobject@>=2.4.1 <2.5.0", + "from": "https://registry.npmjs.org/lodash.isobject/-/lodash.isobject-2.4.1.tgz", "resolved": "https://registry.npmjs.org/lodash.isobject/-/lodash.isobject-2.4.1.tgz", "dependencies": { "lodash._objecttypes": { "version": "2.4.1", - "from": "lodash._objecttypes@>=2.4.1 <2.5.0", + "from": "https://registry.npmjs.org/lodash._objecttypes/-/lodash._objecttypes-2.4.1.tgz", "resolved": "https://registry.npmjs.org/lodash._objecttypes/-/lodash._objecttypes-2.4.1.tgz" } } }, "lodash._shimkeys": { "version": "2.4.1", - "from": "lodash._shimkeys@>=2.4.1 <2.5.0", + "from": "https://registry.npmjs.org/lodash._shimkeys/-/lodash._shimkeys-2.4.1.tgz", "resolved": "https://registry.npmjs.org/lodash._shimkeys/-/lodash._shimkeys-2.4.1.tgz", "dependencies": { "lodash._objecttypes": { "version": "2.4.1", - "from": "lodash._objecttypes@>=2.4.1 <2.5.0", + "from": "https://registry.npmjs.org/lodash._objecttypes/-/lodash._objecttypes-2.4.1.tgz", "resolved": "https://registry.npmjs.org/lodash._objecttypes/-/lodash._objecttypes-2.4.1.tgz" } } @@ -8614,54 +8519,54 @@ }, "lodash.templatesettings": { "version": "2.4.1", - "from": "lodash.templatesettings@>=2.4.1 <2.5.0", + "from": "https://registry.npmjs.org/lodash.templatesettings/-/lodash.templatesettings-2.4.1.tgz", "resolved": "https://registry.npmjs.org/lodash.templatesettings/-/lodash.templatesettings-2.4.1.tgz" }, "lodash.values": { "version": "2.4.1", - "from": "lodash.values@>=2.4.1 <2.5.0", + "from": "https://registry.npmjs.org/lodash.values/-/lodash.values-2.4.1.tgz", "resolved": "https://registry.npmjs.org/lodash.values/-/lodash.values-2.4.1.tgz" } } }, "minimist": { "version": "0.2.0", - "from": "minimist@>=0.2.0 <0.3.0", + "from": "https://registry.npmjs.org/minimist/-/minimist-0.2.0.tgz", "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.2.0.tgz" }, "multipipe": { "version": "0.1.2", - "from": "multipipe@>=0.1.0 <0.2.0", + "from": "https://registry.npmjs.org/multipipe/-/multipipe-0.1.2.tgz", "resolved": "https://registry.npmjs.org/multipipe/-/multipipe-0.1.2.tgz", "dependencies": { "duplexer2": { "version": "0.0.2", - "from": "duplexer2@0.0.2", + "from": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.0.2.tgz", "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.0.2.tgz", "dependencies": { "readable-stream": { "version": "1.1.14", - "from": "readable-stream@>=1.1.9 <1.2.0", + "from": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", "dependencies": { "core-util-is": { "version": "1.0.2", - "from": "core-util-is@>=1.0.0 <1.1.0", + "from": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz" }, "isarray": { "version": "0.0.1", - "from": "isarray@0.0.1", + "from": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz" }, "string_decoder": { "version": "0.10.31", - "from": "string_decoder@>=0.10.0 <0.11.0", + "from": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz" }, "inherits": { "version": "2.0.1", - "from": "inherits@>=2.0.1 <3.0.0", + "from": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz" } } @@ -8672,51 +8577,51 @@ }, "through2": { "version": "0.5.1", - "from": "through2@>=0.5.0 <0.6.0", + "from": "https://registry.npmjs.org/through2/-/through2-0.5.1.tgz", "resolved": "https://registry.npmjs.org/through2/-/through2-0.5.1.tgz", "dependencies": { "readable-stream": { "version": "1.0.34", - "from": "readable-stream@>=1.0.17 <1.1.0", + "from": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", "dependencies": { "core-util-is": { "version": "1.0.2", - "from": "core-util-is@>=1.0.0 <1.1.0", + "from": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz" }, "isarray": { "version": "0.0.1", - "from": "isarray@0.0.1", + "from": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz" }, "string_decoder": { "version": "0.10.31", - "from": "string_decoder@>=0.10.0 <0.11.0", + "from": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz" }, "inherits": { "version": "2.0.1", - "from": "inherits@>=2.0.0 <3.0.0", + "from": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz" } } }, "xtend": { "version": "3.0.0", - "from": "xtend@>=3.0.0 <3.1.0", + "from": "https://registry.npmjs.org/xtend/-/xtend-3.0.0.tgz", "resolved": "https://registry.npmjs.org/xtend/-/xtend-3.0.0.tgz" } } }, "vinyl": { "version": "0.2.3", - "from": "vinyl@>=0.2.1 <0.3.0", + "from": "https://registry.npmjs.org/vinyl/-/vinyl-0.2.3.tgz", "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-0.2.3.tgz", "dependencies": { "clone-stats": { "version": "0.0.1", - "from": "clone-stats@>=0.0.1 <0.1.0", + "from": "https://registry.npmjs.org/clone-stats/-/clone-stats-0.0.1.tgz", "resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-0.0.1.tgz" } } @@ -8725,39 +8630,39 @@ }, "through": { "version": "2.3.8", - "from": "through@>=2.3.4 <2.4.0", + "from": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz" } } }, "gulp-jshint": { "version": "2.0.1", - "from": "gulp-jshint@>=2.0.0 <3.0.0", + "from": "https://registry.npmjs.org/gulp-jshint/-/gulp-jshint-2.0.1.tgz", "resolved": "https://registry.npmjs.org/gulp-jshint/-/gulp-jshint-2.0.1.tgz", "dependencies": { "lodash": { "version": "4.12.0", - "from": "lodash@>=4.12.0 <5.0.0", + "from": "https://registry.npmjs.org/lodash/-/lodash-4.12.0.tgz", "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.12.0.tgz" }, "minimatch": { "version": "2.0.10", - "from": "minimatch@>=2.0.1 <3.0.0", + "from": "https://registry.npmjs.org/minimatch/-/minimatch-2.0.10.tgz", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-2.0.10.tgz", "dependencies": { "brace-expansion": { "version": "1.1.4", - "from": "brace-expansion@>=1.0.0 <2.0.0", + "from": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.4.tgz", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.4.tgz", "dependencies": { "balanced-match": { "version": "0.4.1", - "from": "balanced-match@>=0.4.1 <0.5.0", + "from": "https://registry.npmjs.org/balanced-match/-/balanced-match-0.4.1.tgz", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-0.4.1.tgz" }, "concat-map": { "version": "0.0.1", - "from": "concat-map@0.0.1", + "from": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz" } } @@ -8766,22 +8671,22 @@ }, "rcloader": { "version": "0.1.2", - "from": "rcloader@0.1.2", + "from": "https://registry.npmjs.org/rcloader/-/rcloader-0.1.2.tgz", "resolved": "https://registry.npmjs.org/rcloader/-/rcloader-0.1.2.tgz", "dependencies": { "rcfinder": { "version": "0.1.9", - "from": "rcfinder@>=0.1.6 <0.2.0", + "from": "https://registry.npmjs.org/rcfinder/-/rcfinder-0.1.9.tgz", "resolved": "https://registry.npmjs.org/rcfinder/-/rcfinder-0.1.9.tgz", "dependencies": { "lodash.clonedeep": { "version": "4.3.2", - "from": "lodash.clonedeep@>=4.3.2 <5.0.0", + "from": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.3.2.tgz", "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.3.2.tgz", "dependencies": { "lodash._baseclone": { "version": "4.5.6", - "from": "lodash._baseclone@>=4.5.0 <4.6.0", + "from": "https://registry.npmjs.org/lodash._baseclone/-/lodash._baseclone-4.5.6.tgz", "resolved": "https://registry.npmjs.org/lodash._baseclone/-/lodash._baseclone-4.5.6.tgz" } } @@ -8790,46 +8695,46 @@ }, "lodash": { "version": "2.4.2", - "from": "lodash@>=2.4.1 <2.5.0", + "from": "https://registry.npmjs.org/lodash/-/lodash-2.4.2.tgz", "resolved": "https://registry.npmjs.org/lodash/-/lodash-2.4.2.tgz" } } }, "through2": { "version": "0.6.5", - "from": "through2@>=0.6.1 <0.7.0", + "from": "https://registry.npmjs.org/through2/-/through2-0.6.5.tgz", "resolved": "https://registry.npmjs.org/through2/-/through2-0.6.5.tgz", "dependencies": { "readable-stream": { "version": "1.0.34", - "from": "readable-stream@>=1.0.26 <1.1.0", + "from": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", "dependencies": { "core-util-is": { "version": "1.0.2", - "from": "core-util-is@>=1.0.0 <1.1.0", + "from": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz" }, "isarray": { "version": "0.0.1", - "from": "isarray@0.0.1", + "from": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz" }, "string_decoder": { "version": "0.10.31", - "from": "string_decoder@>=0.10.0 <0.11.0", + "from": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz" }, "inherits": { "version": "2.0.1", - "from": "inherits@>=2.0.1 <2.1.0", + "from": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz" } } }, "xtend": { "version": "4.0.1", - "from": "xtend@>=4.0.0 <4.1.0", + "from": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz" } } @@ -8838,103 +8743,103 @@ }, "gulp-rename": { "version": "1.2.2", - "from": "gulp-rename@>=1.2.0 <2.0.0", + "from": "https://registry.npmjs.org/gulp-rename/-/gulp-rename-1.2.2.tgz", "resolved": "https://registry.npmjs.org/gulp-rename/-/gulp-rename-1.2.2.tgz" }, "gulp-sourcemaps": { "version": "1.6.0", - "from": "gulp-sourcemaps@>=1.2.2 <2.0.0", + "from": "https://registry.npmjs.org/gulp-sourcemaps/-/gulp-sourcemaps-1.6.0.tgz", "resolved": "https://registry.npmjs.org/gulp-sourcemaps/-/gulp-sourcemaps-1.6.0.tgz", "dependencies": { "convert-source-map": { "version": "1.2.0", - "from": "convert-source-map@>=1.1.1 <2.0.0", + "from": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.2.0.tgz", "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.2.0.tgz" }, "graceful-fs": { "version": "4.1.4", - "from": "graceful-fs@>=4.1.2 <5.0.0", + "from": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.4.tgz", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.4.tgz" }, "strip-bom": { "version": "2.0.0", - "from": "strip-bom@>=2.0.0 <3.0.0", + "from": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", "dependencies": { "is-utf8": { "version": "0.2.1", - "from": "is-utf8@>=0.2.0 <0.3.0", + "from": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz" } } }, "through2": { "version": "2.0.1", - "from": "through2@>=2.0.0 <3.0.0", + "from": "https://registry.npmjs.org/through2/-/through2-2.0.1.tgz", "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.1.tgz", "dependencies": { "readable-stream": { "version": "2.0.6", - "from": "readable-stream@>=2.0.0 <2.1.0", + "from": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.0.6.tgz", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.0.6.tgz", "dependencies": { "core-util-is": { "version": "1.0.2", - "from": "core-util-is@>=1.0.0 <1.1.0", + "from": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz" }, "inherits": { "version": "2.0.1", - "from": "inherits@>=2.0.1 <2.1.0", + "from": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz" }, "isarray": { "version": "1.0.0", - "from": "isarray@>=1.0.0 <1.1.0", + "from": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz" }, "process-nextick-args": { "version": "1.0.7", - "from": "process-nextick-args@>=1.0.6 <1.1.0", + "from": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz", "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz" }, "string_decoder": { "version": "0.10.31", - "from": "string_decoder@>=0.10.0 <0.11.0", + "from": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz" }, "util-deprecate": { "version": "1.0.2", - "from": "util-deprecate@>=1.0.1 <1.1.0", + "from": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz" } } }, "xtend": { "version": "4.0.1", - "from": "xtend@>=4.0.0 <4.1.0", + "from": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz" } } }, "vinyl": { "version": "1.1.1", - "from": "vinyl@>=1.0.0 <2.0.0", + "from": "https://registry.npmjs.org/vinyl/-/vinyl-1.1.1.tgz", "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-1.1.1.tgz", "dependencies": { "clone": { "version": "1.0.2", - "from": "clone@>=1.0.0 <2.0.0", + "from": "https://registry.npmjs.org/clone/-/clone-1.0.2.tgz", "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.2.tgz" }, "clone-stats": { "version": "0.0.1", - "from": "clone-stats@>=0.0.1 <0.0.2", + "from": "https://registry.npmjs.org/clone-stats/-/clone-stats-0.0.1.tgz", "resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-0.0.1.tgz" }, "replace-ext": { "version": "0.0.1", - "from": "replace-ext@0.0.1", + "from": "https://registry.npmjs.org/replace-ext/-/replace-ext-0.0.1.tgz", "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-0.0.1.tgz" } } @@ -8943,239 +8848,239 @@ }, "gulp-uglify": { "version": "1.5.3", - "from": "gulp-uglify@>=1.0.1 <2.0.0", + "from": "https://registry.npmjs.org/gulp-uglify/-/gulp-uglify-1.5.3.tgz", "resolved": "https://registry.npmjs.org/gulp-uglify/-/gulp-uglify-1.5.3.tgz", "dependencies": { "deap": { "version": "1.0.0", - "from": "deap@>=1.0.0 <2.0.0", + "from": "https://registry.npmjs.org/deap/-/deap-1.0.0.tgz", "resolved": "https://registry.npmjs.org/deap/-/deap-1.0.0.tgz" }, "fancy-log": { "version": "1.2.0", - "from": "fancy-log@>=1.0.0 <2.0.0", + "from": "https://registry.npmjs.org/fancy-log/-/fancy-log-1.2.0.tgz", "resolved": "https://registry.npmjs.org/fancy-log/-/fancy-log-1.2.0.tgz", "dependencies": { "chalk": { "version": "1.1.3", - "from": "chalk@>=1.1.1 <2.0.0", + "from": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", "dependencies": { "ansi-styles": { "version": "2.2.1", - "from": "ansi-styles@>=2.2.1 <3.0.0", + "from": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz" }, "escape-string-regexp": { "version": "1.0.5", - "from": "escape-string-regexp@>=1.0.2 <2.0.0", + "from": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz" }, "has-ansi": { "version": "2.0.0", - "from": "has-ansi@>=2.0.0 <3.0.0", + "from": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", "dependencies": { "ansi-regex": { "version": "2.0.0", - "from": "ansi-regex@>=2.0.0 <3.0.0", + "from": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.0.0.tgz", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.0.0.tgz" } } }, "strip-ansi": { "version": "3.0.1", - "from": "strip-ansi@>=3.0.0 <4.0.0", + "from": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", "dependencies": { "ansi-regex": { "version": "2.0.0", - "from": "ansi-regex@>=2.0.0 <3.0.0", + "from": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.0.0.tgz", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.0.0.tgz" } } }, "supports-color": { "version": "2.0.0", - "from": "supports-color@>=2.0.0 <3.0.0", + "from": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz" } } }, "time-stamp": { "version": "1.0.1", - "from": "time-stamp@>=1.0.0 <2.0.0", + "from": "https://registry.npmjs.org/time-stamp/-/time-stamp-1.0.1.tgz", "resolved": "https://registry.npmjs.org/time-stamp/-/time-stamp-1.0.1.tgz" } } }, "isobject": { "version": "2.1.0", - "from": "isobject@>=2.0.0 <3.0.0", + "from": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", "dependencies": { "isarray": { "version": "1.0.0", - "from": "isarray@1.0.0", + "from": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz" } } }, "through2": { "version": "2.0.1", - "from": "through2@>=2.0.0 <3.0.0", + "from": "https://registry.npmjs.org/through2/-/through2-2.0.1.tgz", "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.1.tgz", "dependencies": { "readable-stream": { "version": "2.0.6", - "from": "readable-stream@>=2.0.0 <2.1.0", + "from": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.0.6.tgz", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.0.6.tgz", "dependencies": { "core-util-is": { "version": "1.0.2", - "from": "core-util-is@>=1.0.0 <1.1.0", + "from": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz" }, "inherits": { "version": "2.0.1", - "from": "inherits@>=2.0.1 <2.1.0", + "from": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz" }, "isarray": { "version": "1.0.0", - "from": "isarray@>=1.0.0 <1.1.0", + "from": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz" }, "process-nextick-args": { "version": "1.0.7", - "from": "process-nextick-args@>=1.0.6 <1.1.0", + "from": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz", "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz" }, "string_decoder": { "version": "0.10.31", - "from": "string_decoder@>=0.10.0 <0.11.0", + "from": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz" }, "util-deprecate": { "version": "1.0.2", - "from": "util-deprecate@>=1.0.1 <1.1.0", + "from": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz" } } }, "xtend": { "version": "4.0.1", - "from": "xtend@>=4.0.0 <4.1.0", + "from": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz" } } }, "uglify-js": { "version": "2.6.2", - "from": "uglify-js@2.6.2", + "from": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.6.2.tgz", "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.6.2.tgz", "dependencies": { "async": { "version": "0.2.10", - "from": "async@>=0.2.6 <0.3.0", + "from": "https://registry.npmjs.org/async/-/async-0.2.10.tgz", "resolved": "https://registry.npmjs.org/async/-/async-0.2.10.tgz" }, "source-map": { "version": "0.5.6", - "from": "source-map@>=0.5.1 <0.6.0", + "from": "https://registry.npmjs.org/source-map/-/source-map-0.5.6.tgz", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.6.tgz" }, "uglify-to-browserify": { "version": "1.0.2", - "from": "uglify-to-browserify@>=1.0.0 <1.1.0", + "from": "https://registry.npmjs.org/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz", "resolved": "https://registry.npmjs.org/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz" }, "yargs": { "version": "3.10.0", - "from": "yargs@>=3.10.0 <3.11.0", + "from": "https://registry.npmjs.org/yargs/-/yargs-3.10.0.tgz", "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.10.0.tgz", "dependencies": { "camelcase": { "version": "1.2.1", - "from": "camelcase@>=1.0.2 <2.0.0", + "from": "https://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz", "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz" }, "cliui": { "version": "2.1.0", - "from": "cliui@>=2.1.0 <3.0.0", + "from": "https://registry.npmjs.org/cliui/-/cliui-2.1.0.tgz", "resolved": "https://registry.npmjs.org/cliui/-/cliui-2.1.0.tgz", "dependencies": { "center-align": { "version": "0.1.3", - "from": "center-align@>=0.1.1 <0.2.0", + "from": "https://registry.npmjs.org/center-align/-/center-align-0.1.3.tgz", "resolved": "https://registry.npmjs.org/center-align/-/center-align-0.1.3.tgz", "dependencies": { "align-text": { "version": "0.1.4", - "from": "align-text@>=0.1.1 <0.2.0", + "from": "https://registry.npmjs.org/align-text/-/align-text-0.1.4.tgz", "resolved": "https://registry.npmjs.org/align-text/-/align-text-0.1.4.tgz", "dependencies": { "kind-of": { "version": "3.0.3", - "from": "kind-of@>=3.0.2 <4.0.0", + "from": "https://registry.npmjs.org/kind-of/-/kind-of-3.0.3.tgz", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.0.3.tgz", "dependencies": { "is-buffer": { "version": "1.1.3", - "from": "is-buffer@>=1.0.2 <2.0.0", + "from": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.3.tgz", "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.3.tgz" } } }, "longest": { "version": "1.0.1", - "from": "longest@>=1.0.1 <2.0.0", + "from": "https://registry.npmjs.org/longest/-/longest-1.0.1.tgz", "resolved": "https://registry.npmjs.org/longest/-/longest-1.0.1.tgz" }, "repeat-string": { "version": "1.5.4", - "from": "repeat-string@>=1.5.2 <2.0.0", + "from": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.5.4.tgz", "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.5.4.tgz" } } }, "lazy-cache": { "version": "1.0.4", - "from": "lazy-cache@>=1.0.3 <2.0.0", + "from": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-1.0.4.tgz", "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-1.0.4.tgz" } } }, "right-align": { "version": "0.1.3", - "from": "right-align@>=0.1.1 <0.2.0", + "from": "https://registry.npmjs.org/right-align/-/right-align-0.1.3.tgz", "resolved": "https://registry.npmjs.org/right-align/-/right-align-0.1.3.tgz", "dependencies": { "align-text": { "version": "0.1.4", - "from": "align-text@>=0.1.1 <0.2.0", + "from": "https://registry.npmjs.org/align-text/-/align-text-0.1.4.tgz", "resolved": "https://registry.npmjs.org/align-text/-/align-text-0.1.4.tgz", "dependencies": { "kind-of": { "version": "3.0.3", - "from": "kind-of@>=3.0.2 <4.0.0", + "from": "https://registry.npmjs.org/kind-of/-/kind-of-3.0.3.tgz", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.0.3.tgz", "dependencies": { "is-buffer": { "version": "1.1.3", - "from": "is-buffer@>=1.0.2 <2.0.0", + "from": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.3.tgz", "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.3.tgz" } } }, "longest": { "version": "1.0.1", - "from": "longest@>=1.0.1 <2.0.0", + "from": "https://registry.npmjs.org/longest/-/longest-1.0.1.tgz", "resolved": "https://registry.npmjs.org/longest/-/longest-1.0.1.tgz" }, "repeat-string": { "version": "1.5.4", - "from": "repeat-string@>=1.5.2 <2.0.0", + "from": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.5.4.tgz", "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.5.4.tgz" } } @@ -9184,19 +9089,19 @@ }, "wordwrap": { "version": "0.0.2", - "from": "wordwrap@0.0.2", + "from": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz", "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz" } } }, "decamelize": { "version": "1.2.0", - "from": "decamelize@>=1.0.0 <2.0.0", + "from": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz" }, "window-size": { "version": "0.1.0", - "from": "window-size@0.1.0", + "from": "https://registry.npmjs.org/window-size/-/window-size-0.1.0.tgz", "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.1.0.tgz" } } @@ -9205,17 +9110,17 @@ }, "uglify-save-license": { "version": "0.4.1", - "from": "uglify-save-license@>=0.4.1 <0.5.0", + "from": "https://registry.npmjs.org/uglify-save-license/-/uglify-save-license-0.4.1.tgz", "resolved": "https://registry.npmjs.org/uglify-save-license/-/uglify-save-license-0.4.1.tgz" }, "vinyl-sourcemaps-apply": { "version": "0.2.1", - "from": "vinyl-sourcemaps-apply@>=0.2.0 <0.3.0", + "from": "https://registry.npmjs.org/vinyl-sourcemaps-apply/-/vinyl-sourcemaps-apply-0.2.1.tgz", "resolved": "https://registry.npmjs.org/vinyl-sourcemaps-apply/-/vinyl-sourcemaps-apply-0.2.1.tgz", "dependencies": { "source-map": { "version": "0.5.6", - "from": "source-map@>=0.5.1 <0.6.0", + "from": "https://registry.npmjs.org/source-map/-/source-map-0.5.6.tgz", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.6.tgz" } } @@ -9224,176 +9129,176 @@ }, "gulp-util": { "version": "3.0.7", - "from": "gulp-util@>=3.0.1 <4.0.0", + "from": "https://registry.npmjs.org/gulp-util/-/gulp-util-3.0.7.tgz", "resolved": "https://registry.npmjs.org/gulp-util/-/gulp-util-3.0.7.tgz", "dependencies": { "array-differ": { "version": "1.0.0", - "from": "array-differ@>=1.0.0 <2.0.0", + "from": "https://registry.npmjs.org/array-differ/-/array-differ-1.0.0.tgz", "resolved": "https://registry.npmjs.org/array-differ/-/array-differ-1.0.0.tgz" }, "array-uniq": { "version": "1.0.2", - "from": "array-uniq@>=1.0.2 <2.0.0", + "from": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.2.tgz", "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.2.tgz" }, "beeper": { "version": "1.1.0", - "from": "beeper@>=1.0.0 <2.0.0", + "from": "https://registry.npmjs.org/beeper/-/beeper-1.1.0.tgz", "resolved": "https://registry.npmjs.org/beeper/-/beeper-1.1.0.tgz" }, "chalk": { "version": "1.1.3", - "from": "chalk@>=1.0.0 <2.0.0", + "from": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", "dependencies": { "ansi-styles": { "version": "2.2.1", - "from": "ansi-styles@>=2.2.1 <3.0.0", + "from": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz" }, "escape-string-regexp": { "version": "1.0.5", - "from": "escape-string-regexp@>=1.0.2 <2.0.0", + "from": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz" }, "has-ansi": { "version": "2.0.0", - "from": "has-ansi@>=2.0.0 <3.0.0", + "from": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", "dependencies": { "ansi-regex": { "version": "2.0.0", - "from": "ansi-regex@>=2.0.0 <3.0.0", + "from": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.0.0.tgz", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.0.0.tgz" } } }, "strip-ansi": { "version": "3.0.1", - "from": "strip-ansi@>=3.0.0 <4.0.0", + "from": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", "dependencies": { "ansi-regex": { "version": "2.0.0", - "from": "ansi-regex@>=2.0.0 <3.0.0", + "from": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.0.0.tgz", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.0.0.tgz" } } }, "supports-color": { "version": "2.0.0", - "from": "supports-color@>=2.0.0 <3.0.0", + "from": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz" } } }, "dateformat": { "version": "1.0.12", - "from": "dateformat@>=1.0.11 <2.0.0", + "from": "https://registry.npmjs.org/dateformat/-/dateformat-1.0.12.tgz", "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-1.0.12.tgz", "dependencies": { "get-stdin": { "version": "4.0.1", - "from": "get-stdin@>=4.0.1 <5.0.0", + "from": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz", "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz" }, "meow": { "version": "3.7.0", - "from": "meow@>=3.3.0 <4.0.0", + "from": "https://registry.npmjs.org/meow/-/meow-3.7.0.tgz", "resolved": "https://registry.npmjs.org/meow/-/meow-3.7.0.tgz", "dependencies": { "camelcase-keys": { "version": "2.1.0", - "from": "camelcase-keys@>=2.0.0 <3.0.0", + "from": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-2.1.0.tgz", "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-2.1.0.tgz", "dependencies": { "camelcase": { "version": "2.1.1", - "from": "camelcase@>=2.0.0 <3.0.0", + "from": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz", "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz" } } }, "decamelize": { "version": "1.2.0", - "from": "decamelize@>=1.1.2 <2.0.0", + "from": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz" }, "loud-rejection": { "version": "1.3.0", - "from": "loud-rejection@>=1.0.0 <2.0.0", + "from": "https://registry.npmjs.org/loud-rejection/-/loud-rejection-1.3.0.tgz", "resolved": "https://registry.npmjs.org/loud-rejection/-/loud-rejection-1.3.0.tgz", "dependencies": { "array-find-index": { "version": "1.0.1", - "from": "array-find-index@>=1.0.0 <2.0.0", + "from": "https://registry.npmjs.org/array-find-index/-/array-find-index-1.0.1.tgz", "resolved": "https://registry.npmjs.org/array-find-index/-/array-find-index-1.0.1.tgz" }, "signal-exit": { "version": "2.1.2", - "from": "signal-exit@>=2.1.2 <3.0.0", + "from": "https://registry.npmjs.org/signal-exit/-/signal-exit-2.1.2.tgz", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-2.1.2.tgz" } } }, "map-obj": { "version": "1.0.1", - "from": "map-obj@>=1.0.1 <2.0.0", + "from": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz" }, "normalize-package-data": { "version": "2.3.5", - "from": "normalize-package-data@>=2.3.4 <3.0.0", + "from": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.3.5.tgz", "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.3.5.tgz", "dependencies": { "hosted-git-info": { "version": "2.1.4", - "from": "hosted-git-info@>=2.1.4 <3.0.0", + "from": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.1.4.tgz", "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.1.4.tgz" }, "is-builtin-module": { "version": "1.0.0", - "from": "is-builtin-module@>=1.0.0 <2.0.0", + "from": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-1.0.0.tgz", "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-1.0.0.tgz", "dependencies": { "builtin-modules": { "version": "1.1.1", - "from": "builtin-modules@>=1.0.0 <2.0.0", + "from": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz" } } }, "validate-npm-package-license": { "version": "3.0.1", - "from": "validate-npm-package-license@>=3.0.1 <4.0.0", + "from": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.1.tgz", "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.1.tgz", "dependencies": { "spdx-correct": { "version": "1.0.2", - "from": "spdx-correct@>=1.0.0 <1.1.0", + "from": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-1.0.2.tgz", "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-1.0.2.tgz", "dependencies": { "spdx-license-ids": { "version": "1.2.1", - "from": "spdx-license-ids@>=1.0.0 <2.0.0", + "from": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-1.2.1.tgz", "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-1.2.1.tgz" } } }, "spdx-expression-parse": { "version": "1.0.2", - "from": "spdx-expression-parse@>=1.0.0 <1.1.0", + "from": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-1.0.2.tgz", "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-1.0.2.tgz", "dependencies": { "spdx-exceptions": { "version": "1.0.4", - "from": "spdx-exceptions@>=1.0.4 <2.0.0", + "from": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-1.0.4.tgz", "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-1.0.4.tgz" }, "spdx-license-ids": { "version": "1.2.1", - "from": "spdx-license-ids@>=1.0.0 <2.0.0", + "from": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-1.2.1.tgz", "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-1.2.1.tgz" } } @@ -9404,32 +9309,32 @@ }, "object-assign": { "version": "4.1.0", - "from": "object-assign@>=4.0.1 <5.0.0", + "from": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.0.tgz", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.0.tgz" }, "read-pkg-up": { "version": "1.0.1", - "from": "read-pkg-up@>=1.0.1 <2.0.0", + "from": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", "dependencies": { "find-up": { "version": "1.1.2", - "from": "find-up@>=1.0.0 <2.0.0", + "from": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", "dependencies": { "path-exists": { "version": "2.1.0", - "from": "path-exists@>=2.0.0 <3.0.0", + "from": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz" }, "pinkie-promise": { "version": "2.0.1", - "from": "pinkie-promise@>=2.0.0 <3.0.0", + "from": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", "dependencies": { "pinkie": { "version": "2.0.4", - "from": "pinkie@>=2.0.0 <3.0.0", + "from": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz" } } @@ -9438,32 +9343,32 @@ }, "read-pkg": { "version": "1.1.0", - "from": "read-pkg@>=1.0.0 <2.0.0", + "from": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", "dependencies": { "load-json-file": { "version": "1.1.0", - "from": "load-json-file@>=1.0.0 <2.0.0", + "from": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", "dependencies": { "graceful-fs": { "version": "4.1.4", - "from": "graceful-fs@>=4.1.2 <5.0.0", + "from": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.4.tgz", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.4.tgz" }, "parse-json": { "version": "2.2.0", - "from": "parse-json@>=2.2.0 <3.0.0", + "from": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", "dependencies": { "error-ex": { "version": "1.3.0", - "from": "error-ex@>=1.2.0 <2.0.0", + "from": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.0.tgz", "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.0.tgz", "dependencies": { "is-arrayish": { "version": "0.2.1", - "from": "is-arrayish@>=0.2.1 <0.3.0", + "from": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz" } } @@ -9472,29 +9377,29 @@ }, "pify": { "version": "2.3.0", - "from": "pify@>=2.0.0 <3.0.0", + "from": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz" }, "pinkie-promise": { "version": "2.0.1", - "from": "pinkie-promise@>=2.0.0 <3.0.0", + "from": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", "dependencies": { "pinkie": { "version": "2.0.4", - "from": "pinkie@>=2.0.0 <3.0.0", + "from": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz" } } }, "strip-bom": { "version": "2.0.0", - "from": "strip-bom@>=2.0.0 <3.0.0", + "from": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", "dependencies": { "is-utf8": { "version": "0.2.1", - "from": "is-utf8@>=0.2.0 <0.3.0", + "from": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz" } } @@ -9503,27 +9408,27 @@ }, "path-type": { "version": "1.1.0", - "from": "path-type@>=1.0.0 <2.0.0", + "from": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", "dependencies": { "graceful-fs": { "version": "4.1.4", - "from": "graceful-fs@>=4.1.2 <5.0.0", + "from": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.4.tgz", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.4.tgz" }, "pify": { "version": "2.3.0", - "from": "pify@>=2.0.0 <3.0.0", + "from": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz" }, "pinkie-promise": { "version": "2.0.1", - "from": "pinkie-promise@>=2.0.0 <3.0.0", + "from": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", "dependencies": { "pinkie": { "version": "2.0.4", - "from": "pinkie@>=2.0.0 <3.0.0", + "from": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz" } } @@ -9536,27 +9441,27 @@ }, "redent": { "version": "1.0.0", - "from": "redent@>=1.0.0 <2.0.0", + "from": "https://registry.npmjs.org/redent/-/redent-1.0.0.tgz", "resolved": "https://registry.npmjs.org/redent/-/redent-1.0.0.tgz", "dependencies": { "indent-string": { "version": "2.1.0", - "from": "indent-string@>=2.1.0 <3.0.0", + "from": "https://registry.npmjs.org/indent-string/-/indent-string-2.1.0.tgz", "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-2.1.0.tgz", "dependencies": { "repeating": { "version": "2.0.1", - "from": "repeating@>=2.0.0 <3.0.0", + "from": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz", "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz", "dependencies": { "is-finite": { "version": "1.0.1", - "from": "is-finite@>=1.0.0 <2.0.0", + "from": "https://registry.npmjs.org/is-finite/-/is-finite-1.0.1.tgz", "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.0.1.tgz", "dependencies": { "number-is-nan": { "version": "1.0.0", - "from": "number-is-nan@>=1.0.0 <2.0.0", + "from": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.0.tgz", "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.0.tgz" } } @@ -9567,14 +9472,14 @@ }, "strip-indent": { "version": "1.0.1", - "from": "strip-indent@>=1.0.1 <2.0.0", + "from": "https://registry.npmjs.org/strip-indent/-/strip-indent-1.0.1.tgz", "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-1.0.1.tgz" } } }, "trim-newlines": { "version": "1.0.0", - "from": "trim-newlines@>=1.0.0 <2.0.0", + "from": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-1.0.0.tgz", "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-1.0.0.tgz" } } @@ -9583,29 +9488,29 @@ }, "fancy-log": { "version": "1.2.0", - "from": "fancy-log@>=1.1.0 <2.0.0", + "from": "https://registry.npmjs.org/fancy-log/-/fancy-log-1.2.0.tgz", "resolved": "https://registry.npmjs.org/fancy-log/-/fancy-log-1.2.0.tgz", "dependencies": { "time-stamp": { "version": "1.0.1", - "from": "time-stamp@>=1.0.0 <2.0.0", + "from": "https://registry.npmjs.org/time-stamp/-/time-stamp-1.0.1.tgz", "resolved": "https://registry.npmjs.org/time-stamp/-/time-stamp-1.0.1.tgz" } } }, "gulplog": { "version": "1.0.0", - "from": "gulplog@>=1.0.0 <2.0.0", + "from": "https://registry.npmjs.org/gulplog/-/gulplog-1.0.0.tgz", "resolved": "https://registry.npmjs.org/gulplog/-/gulplog-1.0.0.tgz", "dependencies": { "glogg": { "version": "1.0.0", - "from": "glogg@>=1.0.0 <2.0.0", + "from": "https://registry.npmjs.org/glogg/-/glogg-1.0.0.tgz", "resolved": "https://registry.npmjs.org/glogg/-/glogg-1.0.0.tgz", "dependencies": { "sparkles": { "version": "1.0.0", - "from": "sparkles@>=1.0.0 <2.0.0", + "from": "https://registry.npmjs.org/sparkles/-/sparkles-1.0.0.tgz", "resolved": "https://registry.npmjs.org/sparkles/-/sparkles-1.0.0.tgz" } } @@ -9614,140 +9519,140 @@ }, "has-gulplog": { "version": "0.1.0", - "from": "has-gulplog@>=0.1.0 <0.2.0", + "from": "https://registry.npmjs.org/has-gulplog/-/has-gulplog-0.1.0.tgz", "resolved": "https://registry.npmjs.org/has-gulplog/-/has-gulplog-0.1.0.tgz", "dependencies": { "sparkles": { "version": "1.0.0", - "from": "sparkles@>=1.0.0 <2.0.0", + "from": "https://registry.npmjs.org/sparkles/-/sparkles-1.0.0.tgz", "resolved": "https://registry.npmjs.org/sparkles/-/sparkles-1.0.0.tgz" } } }, "lodash._reescape": { "version": "3.0.0", - "from": "lodash._reescape@>=3.0.0 <4.0.0", + "from": "https://registry.npmjs.org/lodash._reescape/-/lodash._reescape-3.0.0.tgz", "resolved": "https://registry.npmjs.org/lodash._reescape/-/lodash._reescape-3.0.0.tgz" }, "lodash._reevaluate": { "version": "3.0.0", - "from": "lodash._reevaluate@>=3.0.0 <4.0.0", + "from": "https://registry.npmjs.org/lodash._reevaluate/-/lodash._reevaluate-3.0.0.tgz", "resolved": "https://registry.npmjs.org/lodash._reevaluate/-/lodash._reevaluate-3.0.0.tgz" }, "lodash._reinterpolate": { "version": "3.0.0", - "from": "lodash._reinterpolate@>=3.0.0 <4.0.0", + "from": "https://registry.npmjs.org/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz", "resolved": "https://registry.npmjs.org/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz" }, "lodash.template": { "version": "3.6.2", - "from": "lodash.template@>=3.0.0 <4.0.0", + "from": "https://registry.npmjs.org/lodash.template/-/lodash.template-3.6.2.tgz", "resolved": "https://registry.npmjs.org/lodash.template/-/lodash.template-3.6.2.tgz", "dependencies": { "lodash._basecopy": { "version": "3.0.1", - "from": "lodash._basecopy@>=3.0.0 <4.0.0", + "from": "https://registry.npmjs.org/lodash._basecopy/-/lodash._basecopy-3.0.1.tgz", "resolved": "https://registry.npmjs.org/lodash._basecopy/-/lodash._basecopy-3.0.1.tgz" }, "lodash._basetostring": { "version": "3.0.1", - "from": "lodash._basetostring@>=3.0.0 <4.0.0", + "from": "https://registry.npmjs.org/lodash._basetostring/-/lodash._basetostring-3.0.1.tgz", "resolved": "https://registry.npmjs.org/lodash._basetostring/-/lodash._basetostring-3.0.1.tgz" }, "lodash._basevalues": { "version": "3.0.0", - "from": "lodash._basevalues@>=3.0.0 <4.0.0", + "from": "https://registry.npmjs.org/lodash._basevalues/-/lodash._basevalues-3.0.0.tgz", "resolved": "https://registry.npmjs.org/lodash._basevalues/-/lodash._basevalues-3.0.0.tgz" }, "lodash._isiterateecall": { "version": "3.0.9", - "from": "lodash._isiterateecall@>=3.0.0 <4.0.0", + "from": "https://registry.npmjs.org/lodash._isiterateecall/-/lodash._isiterateecall-3.0.9.tgz", "resolved": "https://registry.npmjs.org/lodash._isiterateecall/-/lodash._isiterateecall-3.0.9.tgz" }, "lodash.escape": { "version": "3.2.0", - "from": "lodash.escape@>=3.0.0 <4.0.0", + "from": "https://registry.npmjs.org/lodash.escape/-/lodash.escape-3.2.0.tgz", "resolved": "https://registry.npmjs.org/lodash.escape/-/lodash.escape-3.2.0.tgz", "dependencies": { "lodash._root": { "version": "3.0.1", - "from": "lodash._root@>=3.0.0 <4.0.0", + "from": "https://registry.npmjs.org/lodash._root/-/lodash._root-3.0.1.tgz", "resolved": "https://registry.npmjs.org/lodash._root/-/lodash._root-3.0.1.tgz" } } }, "lodash.keys": { "version": "3.1.2", - "from": "lodash.keys@>=3.0.0 <4.0.0", + "from": "https://registry.npmjs.org/lodash.keys/-/lodash.keys-3.1.2.tgz", "resolved": "https://registry.npmjs.org/lodash.keys/-/lodash.keys-3.1.2.tgz", "dependencies": { "lodash._getnative": { "version": "3.9.1", - "from": "lodash._getnative@>=3.0.0 <4.0.0", + "from": "https://registry.npmjs.org/lodash._getnative/-/lodash._getnative-3.9.1.tgz", "resolved": "https://registry.npmjs.org/lodash._getnative/-/lodash._getnative-3.9.1.tgz" }, "lodash.isarguments": { "version": "3.0.8", - "from": "lodash.isarguments@>=3.0.0 <4.0.0", + "from": "https://registry.npmjs.org/lodash.isarguments/-/lodash.isarguments-3.0.8.tgz", "resolved": "https://registry.npmjs.org/lodash.isarguments/-/lodash.isarguments-3.0.8.tgz" }, "lodash.isarray": { "version": "3.0.4", - "from": "lodash.isarray@>=3.0.0 <4.0.0", + "from": "https://registry.npmjs.org/lodash.isarray/-/lodash.isarray-3.0.4.tgz", "resolved": "https://registry.npmjs.org/lodash.isarray/-/lodash.isarray-3.0.4.tgz" } } }, "lodash.restparam": { "version": "3.6.1", - "from": "lodash.restparam@>=3.0.0 <4.0.0", + "from": "https://registry.npmjs.org/lodash.restparam/-/lodash.restparam-3.6.1.tgz", "resolved": "https://registry.npmjs.org/lodash.restparam/-/lodash.restparam-3.6.1.tgz" }, "lodash.templatesettings": { "version": "3.1.1", - "from": "lodash.templatesettings@>=3.0.0 <4.0.0", + "from": "https://registry.npmjs.org/lodash.templatesettings/-/lodash.templatesettings-3.1.1.tgz", "resolved": "https://registry.npmjs.org/lodash.templatesettings/-/lodash.templatesettings-3.1.1.tgz" } } }, "minimist": { "version": "1.2.0", - "from": "minimist@>=1.1.0 <2.0.0", + "from": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz" }, "multipipe": { "version": "0.1.2", - "from": "multipipe@>=0.1.2 <0.2.0", + "from": "https://registry.npmjs.org/multipipe/-/multipipe-0.1.2.tgz", "resolved": "https://registry.npmjs.org/multipipe/-/multipipe-0.1.2.tgz", "dependencies": { "duplexer2": { "version": "0.0.2", - "from": "duplexer2@0.0.2", + "from": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.0.2.tgz", "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.0.2.tgz", "dependencies": { "readable-stream": { "version": "1.1.14", - "from": "readable-stream@>=1.1.9 <1.2.0", + "from": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", "dependencies": { "core-util-is": { "version": "1.0.2", - "from": "core-util-is@>=1.0.0 <1.1.0", + "from": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz" }, "isarray": { "version": "0.0.1", - "from": "isarray@0.0.1", + "from": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz" }, "string_decoder": { "version": "0.10.31", - "from": "string_decoder@>=0.10.0 <0.11.0", + "from": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz" }, "inherits": { "version": "2.0.1", - "from": "inherits@>=2.0.1 <2.1.0", + "from": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz" } } @@ -9758,76 +9663,76 @@ }, "object-assign": { "version": "3.0.0", - "from": "object-assign@>=3.0.0 <4.0.0", + "from": "https://registry.npmjs.org/object-assign/-/object-assign-3.0.0.tgz", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-3.0.0.tgz" }, "replace-ext": { "version": "0.0.1", - "from": "replace-ext@0.0.1", + "from": "https://registry.npmjs.org/replace-ext/-/replace-ext-0.0.1.tgz", "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-0.0.1.tgz" }, "through2": { "version": "2.0.1", - "from": "through2@>=2.0.0 <3.0.0", + "from": "https://registry.npmjs.org/through2/-/through2-2.0.1.tgz", "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.1.tgz", "dependencies": { "readable-stream": { "version": "2.0.6", - "from": "readable-stream@>=2.0.0 <2.1.0", + "from": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.0.6.tgz", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.0.6.tgz", "dependencies": { "core-util-is": { "version": "1.0.2", - "from": "core-util-is@>=1.0.0 <1.1.0", + "from": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz" }, "inherits": { "version": "2.0.1", - "from": "inherits@>=2.0.1 <2.1.0", + "from": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz" }, "isarray": { "version": "1.0.0", - "from": "isarray@>=1.0.0 <1.1.0", + "from": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz" }, "process-nextick-args": { "version": "1.0.7", - "from": "process-nextick-args@>=1.0.6 <1.1.0", + "from": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz", "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz" }, "string_decoder": { "version": "0.10.31", - "from": "string_decoder@>=0.10.0 <0.11.0", + "from": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz" }, "util-deprecate": { "version": "1.0.2", - "from": "util-deprecate@>=1.0.1 <1.1.0", + "from": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz" } } }, "xtend": { "version": "4.0.1", - "from": "xtend@>=4.0.0 <4.1.0", + "from": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz" } } }, "vinyl": { "version": "0.5.3", - "from": "vinyl@>=0.5.0 <0.6.0", + "from": "https://registry.npmjs.org/vinyl/-/vinyl-0.5.3.tgz", "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-0.5.3.tgz", "dependencies": { "clone": { "version": "1.0.2", - "from": "clone@>=1.0.0 <2.0.0", + "from": "https://registry.npmjs.org/clone/-/clone-1.0.2.tgz", "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.2.tgz" }, "clone-stats": { "version": "0.0.1", - "from": "clone-stats@>=0.0.1 <0.0.2", + "from": "https://registry.npmjs.org/clone-stats/-/clone-stats-0.0.1.tgz", "resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-0.0.1.tgz" } } @@ -9836,74 +9741,74 @@ }, "jasmine-core": { "version": "2.4.1", - "from": "jasmine-core@>=2.4.0 <3.0.0", + "from": "https://registry.npmjs.org/jasmine-core/-/jasmine-core-2.4.1.tgz", "resolved": "https://registry.npmjs.org/jasmine-core/-/jasmine-core-2.4.1.tgz" }, "jasmine-node": { "version": "2.0.0", - "from": "jasmine-node@>=2.0.0 <3.0.0", + "from": "https://registry.npmjs.org/jasmine-node/-/jasmine-node-2.0.0.tgz", "resolved": "https://registry.npmjs.org/jasmine-node/-/jasmine-node-2.0.0.tgz", "dependencies": { "coffee-script": { "version": "1.7.1", - "from": "coffee-script@>=1.7.1 <1.8.0", + "from": "https://registry.npmjs.org/coffee-script/-/coffee-script-1.7.1.tgz", "resolved": "https://registry.npmjs.org/coffee-script/-/coffee-script-1.7.1.tgz" }, "walkdir": { "version": "0.0.11", - "from": "walkdir@>=0.0.7 <0.1.0", + "from": "https://registry.npmjs.org/walkdir/-/walkdir-0.0.11.tgz", "resolved": "https://registry.npmjs.org/walkdir/-/walkdir-0.0.11.tgz" }, "underscore": { "version": "1.6.0", - "from": "underscore@>=1.6.0 <1.7.0", + "from": "https://registry.npmjs.org/underscore/-/underscore-1.6.0.tgz", "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.6.0.tgz" }, "gaze": { "version": "0.5.2", - "from": "gaze@>=0.5.1 <0.6.0", + "from": "https://registry.npmjs.org/gaze/-/gaze-0.5.2.tgz", "resolved": "https://registry.npmjs.org/gaze/-/gaze-0.5.2.tgz", "dependencies": { "globule": { "version": "0.1.0", - "from": "globule@>=0.1.0 <0.2.0", + "from": "https://registry.npmjs.org/globule/-/globule-0.1.0.tgz", "resolved": "https://registry.npmjs.org/globule/-/globule-0.1.0.tgz", "dependencies": { "lodash": { "version": "1.0.2", - "from": "lodash@>=1.0.1 <1.1.0", + "from": "https://registry.npmjs.org/lodash/-/lodash-1.0.2.tgz", "resolved": "https://registry.npmjs.org/lodash/-/lodash-1.0.2.tgz" }, "glob": { "version": "3.1.21", - "from": "glob@>=3.1.21 <3.2.0", + "from": "https://registry.npmjs.org/glob/-/glob-3.1.21.tgz", "resolved": "https://registry.npmjs.org/glob/-/glob-3.1.21.tgz", "dependencies": { "graceful-fs": { "version": "1.2.3", - "from": "graceful-fs@>=1.2.0 <1.3.0", + "from": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-1.2.3.tgz", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-1.2.3.tgz" }, "inherits": { "version": "1.0.2", - "from": "inherits@>=1.0.0 <2.0.0", + "from": "https://registry.npmjs.org/inherits/-/inherits-1.0.2.tgz", "resolved": "https://registry.npmjs.org/inherits/-/inherits-1.0.2.tgz" } } }, "minimatch": { "version": "0.2.14", - "from": "minimatch@>=0.2.11 <0.3.0", + "from": "https://registry.npmjs.org/minimatch/-/minimatch-0.2.14.tgz", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-0.2.14.tgz", "dependencies": { "lru-cache": { "version": "2.7.3", - "from": "lru-cache@>=2.0.0 <3.0.0", + "from": "https://registry.npmjs.org/lru-cache/-/lru-cache-2.7.3.tgz", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-2.7.3.tgz" }, "sigmund": { "version": "1.0.1", - "from": "sigmund@>=1.0.0 <1.1.0", + "from": "https://registry.npmjs.org/sigmund/-/sigmund-1.0.1.tgz", "resolved": "https://registry.npmjs.org/sigmund/-/sigmund-1.0.1.tgz" } } @@ -9914,22 +9819,22 @@ }, "mkdirp": { "version": "0.3.5", - "from": "mkdirp@>=0.3.5 <0.4.0", + "from": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.3.5.tgz", "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.3.5.tgz" }, "minimist": { "version": "0.0.8", - "from": "minimist@0.0.8", + "from": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz" }, "jasmine-growl-reporter": { "version": "0.2.1", - "from": "jasmine-growl-reporter@>=0.2.0 <0.3.0", + "from": "https://registry.npmjs.org/jasmine-growl-reporter/-/jasmine-growl-reporter-0.2.1.tgz", "resolved": "https://registry.npmjs.org/jasmine-growl-reporter/-/jasmine-growl-reporter-0.2.1.tgz", "dependencies": { "growl": { "version": "1.7.0", - "from": "growl@>=1.7.0 <1.8.0", + "from": "https://registry.npmjs.org/growl/-/growl-1.7.0.tgz", "resolved": "https://registry.npmjs.org/growl/-/growl-1.7.0.tgz" } } @@ -9938,49 +9843,49 @@ }, "jasmine-reporters": { "version": "1.0.2", - "from": "jasmine-reporters@>=1.0.1 <1.1.0", + "from": "https://registry.npmjs.org/jasmine-reporters/-/jasmine-reporters-1.0.2.tgz", "resolved": "https://registry.npmjs.org/jasmine-reporters/-/jasmine-reporters-1.0.2.tgz", "dependencies": { "mkdirp": { "version": "0.3.5", - "from": "mkdirp@>=0.3.5 <0.4.0", + "from": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.3.5.tgz", "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.3.5.tgz" } } }, "jshint": { "version": "2.9.2", - "from": "jshint@>=2.9.1 <3.0.0", + "from": "https://registry.npmjs.org/jshint/-/jshint-2.9.2.tgz", "resolved": "https://registry.npmjs.org/jshint/-/jshint-2.9.2.tgz", "dependencies": { "cli": { "version": "0.6.6", - "from": "cli@>=0.6.0 <0.7.0", + "from": "https://registry.npmjs.org/cli/-/cli-0.6.6.tgz", "resolved": "https://registry.npmjs.org/cli/-/cli-0.6.6.tgz", "dependencies": { "glob": { "version": "3.2.11", - "from": "glob@>=3.2.1 <3.3.0", + "from": "https://registry.npmjs.org/glob/-/glob-3.2.11.tgz", "resolved": "https://registry.npmjs.org/glob/-/glob-3.2.11.tgz", "dependencies": { "inherits": { "version": "2.0.1", - "from": "inherits@>=2.0.0 <3.0.0", + "from": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz" }, "minimatch": { "version": "0.3.0", - "from": "minimatch@>=0.3.0 <0.4.0", + "from": "https://registry.npmjs.org/minimatch/-/minimatch-0.3.0.tgz", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-0.3.0.tgz", "dependencies": { "lru-cache": { "version": "2.7.3", - "from": "lru-cache@>=2.0.0 <3.0.0", + "from": "https://registry.npmjs.org/lru-cache/-/lru-cache-2.7.3.tgz", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-2.7.3.tgz" }, "sigmund": { "version": "1.0.1", - "from": "sigmund@>=1.0.0 <1.1.0", + "from": "https://registry.npmjs.org/sigmund/-/sigmund-1.0.1.tgz", "resolved": "https://registry.npmjs.org/sigmund/-/sigmund-1.0.1.tgz" } } @@ -9991,49 +9896,49 @@ }, "console-browserify": { "version": "1.1.0", - "from": "console-browserify@>=1.1.0 <1.2.0", + "from": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.1.0.tgz", "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.1.0.tgz", "dependencies": { "date-now": { "version": "0.1.4", - "from": "date-now@>=0.1.4 <0.2.0", + "from": "https://registry.npmjs.org/date-now/-/date-now-0.1.4.tgz", "resolved": "https://registry.npmjs.org/date-now/-/date-now-0.1.4.tgz" } } }, "exit": { "version": "0.1.2", - "from": "exit@>=0.1.0 <0.2.0", + "from": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz" }, "htmlparser2": { "version": "3.8.3", - "from": "htmlparser2@>=3.8.0 <3.9.0", + "from": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.8.3.tgz", "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.8.3.tgz", "dependencies": { "domhandler": { "version": "2.3.0", - "from": "domhandler@>=2.3.0 <2.4.0", + "from": "https://registry.npmjs.org/domhandler/-/domhandler-2.3.0.tgz", "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.3.0.tgz" }, "domutils": { "version": "1.5.1", - "from": "domutils@>=1.5.0 <1.6.0", + "from": "https://registry.npmjs.org/domutils/-/domutils-1.5.1.tgz", "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.5.1.tgz", "dependencies": { "dom-serializer": { "version": "0.1.0", - "from": "dom-serializer@>=0.0.0 <1.0.0", + "from": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.1.0.tgz", "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.1.0.tgz", "dependencies": { "domelementtype": { "version": "1.1.3", - "from": "domelementtype@>=1.1.1 <1.2.0", + "from": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.1.3.tgz", "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.1.3.tgz" }, "entities": { "version": "1.1.1", - "from": "entities@>=1.1.1 <1.2.0", + "from": "https://registry.npmjs.org/entities/-/entities-1.1.1.tgz", "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.1.tgz" } } @@ -10042,61 +9947,61 @@ }, "domelementtype": { "version": "1.3.0", - "from": "domelementtype@>=1.0.0 <2.0.0", + "from": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.0.tgz", "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.0.tgz" }, "readable-stream": { "version": "1.1.14", - "from": "readable-stream@>=1.1.0 <1.2.0", + "from": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", "dependencies": { "core-util-is": { "version": "1.0.2", - "from": "core-util-is@>=1.0.0 <1.1.0", + "from": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz" }, "isarray": { "version": "0.0.1", - "from": "isarray@0.0.1", + "from": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz" }, "string_decoder": { "version": "0.10.31", - "from": "string_decoder@>=0.10.0 <0.11.0", + "from": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz" }, "inherits": { "version": "2.0.1", - "from": "inherits@>=2.0.1 <2.1.0", + "from": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz" } } }, "entities": { "version": "1.0.0", - "from": "entities@>=1.0.0 <1.1.0", + "from": "https://registry.npmjs.org/entities/-/entities-1.0.0.tgz", "resolved": "https://registry.npmjs.org/entities/-/entities-1.0.0.tgz" } } }, "minimatch": { "version": "2.0.10", - "from": "minimatch@>=2.0.0 <2.1.0", + "from": "https://registry.npmjs.org/minimatch/-/minimatch-2.0.10.tgz", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-2.0.10.tgz", "dependencies": { "brace-expansion": { "version": "1.1.4", - "from": "brace-expansion@>=1.0.0 <2.0.0", + "from": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.4.tgz", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.4.tgz", "dependencies": { "balanced-match": { "version": "0.4.1", - "from": "balanced-match@>=0.4.1 <0.5.0", + "from": "https://registry.npmjs.org/balanced-match/-/balanced-match-0.4.1.tgz", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-0.4.1.tgz" }, "concat-map": { "version": "0.0.1", - "from": "concat-map@0.0.1", + "from": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz" } } @@ -10105,97 +10010,97 @@ }, "strip-json-comments": { "version": "1.0.4", - "from": "strip-json-comments@>=1.0.0 <1.1.0", + "from": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-1.0.4.tgz", "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-1.0.4.tgz" }, "lodash": { "version": "3.7.0", - "from": "lodash@>=3.7.0 <3.8.0", + "from": "https://registry.npmjs.org/lodash/-/lodash-3.7.0.tgz", "resolved": "https://registry.npmjs.org/lodash/-/lodash-3.7.0.tgz" } } }, "jshint-stylish": { "version": "2.2.0", - "from": "jshint-stylish@>=2.1.0 <3.0.0", + "from": "https://registry.npmjs.org/jshint-stylish/-/jshint-stylish-2.2.0.tgz", "resolved": "https://registry.npmjs.org/jshint-stylish/-/jshint-stylish-2.2.0.tgz", "dependencies": { "chalk": { "version": "1.1.3", - "from": "chalk@>=1.0.0 <2.0.0", + "from": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", "dependencies": { "ansi-styles": { "version": "2.2.1", - "from": "ansi-styles@>=2.2.1 <3.0.0", + "from": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz" }, "escape-string-regexp": { "version": "1.0.5", - "from": "escape-string-regexp@>=1.0.2 <2.0.0", + "from": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz" }, "has-ansi": { "version": "2.0.0", - "from": "has-ansi@>=2.0.0 <3.0.0", + "from": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", "dependencies": { "ansi-regex": { "version": "2.0.0", - "from": "ansi-regex@>=2.0.0 <3.0.0", + "from": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.0.0.tgz", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.0.0.tgz" } } }, "strip-ansi": { "version": "3.0.1", - "from": "strip-ansi@>=3.0.0 <4.0.0", + "from": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", "dependencies": { "ansi-regex": { "version": "2.0.0", - "from": "ansi-regex@>=2.0.0 <3.0.0", + "from": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.0.0.tgz", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.0.0.tgz" } } }, "supports-color": { "version": "2.0.0", - "from": "supports-color@>=2.0.0 <3.0.0", + "from": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz" } } }, "log-symbols": { "version": "1.0.2", - "from": "log-symbols@>=1.0.0 <2.0.0", + "from": "https://registry.npmjs.org/log-symbols/-/log-symbols-1.0.2.tgz", "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-1.0.2.tgz" }, "plur": { "version": "2.1.2", - "from": "plur@>=2.1.0 <3.0.0", + "from": "https://registry.npmjs.org/plur/-/plur-2.1.2.tgz", "resolved": "https://registry.npmjs.org/plur/-/plur-2.1.2.tgz", "dependencies": { "irregular-plurals": { "version": "1.1.0", - "from": "irregular-plurals@>=1.0.0 <2.0.0", + "from": "https://registry.npmjs.org/irregular-plurals/-/irregular-plurals-1.1.0.tgz", "resolved": "https://registry.npmjs.org/irregular-plurals/-/irregular-plurals-1.1.0.tgz" } } }, "string-length": { "version": "1.0.1", - "from": "string-length@>=1.0.0 <2.0.0", + "from": "https://registry.npmjs.org/string-length/-/string-length-1.0.1.tgz", "resolved": "https://registry.npmjs.org/string-length/-/string-length-1.0.1.tgz", "dependencies": { "strip-ansi": { "version": "3.0.1", - "from": "strip-ansi@>=3.0.0 <4.0.0", + "from": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", "dependencies": { "ansi-regex": { "version": "2.0.0", - "from": "ansi-regex@>=2.0.0 <3.0.0", + "from": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.0.0.tgz", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.0.0.tgz" } } @@ -10204,132 +10109,132 @@ }, "text-table": { "version": "0.2.0", - "from": "text-table@>=0.2.0 <0.3.0", + "from": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz" }, "beeper": { "version": "1.1.0", - "from": "beeper@>=1.1.0 <2.0.0", + "from": "https://registry.npmjs.org/beeper/-/beeper-1.1.0.tgz", "resolved": "https://registry.npmjs.org/beeper/-/beeper-1.1.0.tgz" } } }, "karma": { "version": "0.13.22", - "from": "karma@>=0.13.19 <0.14.0", + "from": "https://registry.npmjs.org/karma/-/karma-0.13.22.tgz", "resolved": "https://registry.npmjs.org/karma/-/karma-0.13.22.tgz", "dependencies": { "batch": { "version": "0.5.3", - "from": "batch@>=0.5.3 <0.6.0", + "from": "https://registry.npmjs.org/batch/-/batch-0.5.3.tgz", "resolved": "https://registry.npmjs.org/batch/-/batch-0.5.3.tgz" }, "bluebird": { "version": "2.10.2", - "from": "bluebird@>=2.9.27 <3.0.0", + "from": "https://registry.npmjs.org/bluebird/-/bluebird-2.10.2.tgz", "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-2.10.2.tgz" }, "body-parser": { "version": "1.15.1", - "from": "body-parser@>=1.12.4 <2.0.0", + "from": "https://registry.npmjs.org/body-parser/-/body-parser-1.15.1.tgz", "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.15.1.tgz", "dependencies": { "bytes": { "version": "2.3.0", - "from": "bytes@2.3.0", + "from": "https://registry.npmjs.org/bytes/-/bytes-2.3.0.tgz", "resolved": "https://registry.npmjs.org/bytes/-/bytes-2.3.0.tgz" }, "content-type": { "version": "1.0.2", - "from": "content-type@>=1.0.1 <1.1.0", + "from": "https://registry.npmjs.org/content-type/-/content-type-1.0.2.tgz", "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.2.tgz" }, "debug": { "version": "2.2.0", - "from": "debug@>=2.2.0 <2.3.0", + "from": "https://registry.npmjs.org/debug/-/debug-2.2.0.tgz", "resolved": "https://registry.npmjs.org/debug/-/debug-2.2.0.tgz", "dependencies": { "ms": { "version": "0.7.1", - "from": "ms@0.7.1", + "from": "https://registry.npmjs.org/ms/-/ms-0.7.1.tgz", "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.1.tgz" } } }, "depd": { "version": "1.1.0", - "from": "depd@>=1.1.0 <1.2.0", + "from": "https://registry.npmjs.org/depd/-/depd-1.1.0.tgz", "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.0.tgz" }, "http-errors": { "version": "1.4.0", - "from": "http-errors@>=1.4.0 <1.5.0", + "from": "https://registry.npmjs.org/http-errors/-/http-errors-1.4.0.tgz", "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.4.0.tgz", "dependencies": { "inherits": { "version": "2.0.1", - "from": "inherits@2.0.1", + "from": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz" }, "statuses": { "version": "1.2.1", - "from": "statuses@>=1.2.1 <2.0.0", + "from": "https://registry.npmjs.org/statuses/-/statuses-1.2.1.tgz", "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.2.1.tgz" } } }, "iconv-lite": { "version": "0.4.13", - "from": "iconv-lite@0.4.13", + "from": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.13.tgz", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.13.tgz" }, "on-finished": { "version": "2.3.0", - "from": "on-finished@>=2.3.0 <2.4.0", + "from": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", "dependencies": { "ee-first": { "version": "1.1.1", - "from": "ee-first@1.1.1", + "from": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz" } } }, "qs": { "version": "6.1.0", - "from": "qs@6.1.0", + "from": "https://registry.npmjs.org/qs/-/qs-6.1.0.tgz", "resolved": "https://registry.npmjs.org/qs/-/qs-6.1.0.tgz" }, "raw-body": { "version": "2.1.6", - "from": "raw-body@>=2.1.6 <2.2.0", + "from": "https://registry.npmjs.org/raw-body/-/raw-body-2.1.6.tgz", "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.1.6.tgz", "dependencies": { "unpipe": { "version": "1.0.0", - "from": "unpipe@1.0.0", + "from": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz" } } }, "type-is": { "version": "1.6.12", - "from": "type-is@>=1.6.12 <1.7.0", + "from": "https://registry.npmjs.org/type-is/-/type-is-1.6.12.tgz", "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.12.tgz", "dependencies": { "media-typer": { "version": "0.3.0", - "from": "media-typer@0.3.0", + "from": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz" }, "mime-types": { "version": "2.1.11", - "from": "mime-types@>=2.1.10 <2.2.0", + "from": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.11.tgz", "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.11.tgz", "dependencies": { "mime-db": { "version": "1.23.0", - "from": "mime-db@>=1.23.0 <1.24.0", + "from": "https://registry.npmjs.org/mime-db/-/mime-db-1.23.0.tgz", "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.23.0.tgz" } } @@ -10340,81 +10245,81 @@ }, "chokidar": { "version": "1.5.0", - "from": "chokidar@>=1.4.1 <2.0.0", + "from": "https://registry.npmjs.org/chokidar/-/chokidar-1.5.0.tgz", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-1.5.0.tgz", "dependencies": { "anymatch": { "version": "1.3.0", - "from": "anymatch@>=1.3.0 <2.0.0", + "from": "https://registry.npmjs.org/anymatch/-/anymatch-1.3.0.tgz", "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-1.3.0.tgz", "dependencies": { "arrify": { "version": "1.0.1", - "from": "arrify@>=1.0.0 <2.0.0", + "from": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz" }, "micromatch": { "version": "2.3.8", - "from": "micromatch@>=2.1.5 <3.0.0", + "from": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.8.tgz", "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.8.tgz", "dependencies": { "arr-diff": { "version": "2.0.0", - "from": "arr-diff@>=2.0.0 <3.0.0", + "from": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz", "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz", "dependencies": { "arr-flatten": { "version": "1.0.1", - "from": "arr-flatten@>=1.0.1 <2.0.0", + "from": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.0.1.tgz", "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.0.1.tgz" } } }, "array-unique": { "version": "0.2.1", - "from": "array-unique@>=0.2.1 <0.3.0", + "from": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz", "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz" }, "braces": { "version": "1.8.4", - "from": "braces@>=1.8.2 <2.0.0", + "from": "https://registry.npmjs.org/braces/-/braces-1.8.4.tgz", "resolved": "https://registry.npmjs.org/braces/-/braces-1.8.4.tgz", "dependencies": { "expand-range": { "version": "1.8.2", - "from": "expand-range@>=1.8.1 <2.0.0", + "from": "https://registry.npmjs.org/expand-range/-/expand-range-1.8.2.tgz", "resolved": "https://registry.npmjs.org/expand-range/-/expand-range-1.8.2.tgz", "dependencies": { "fill-range": { "version": "2.2.3", - "from": "fill-range@>=2.1.0 <3.0.0", + "from": "https://registry.npmjs.org/fill-range/-/fill-range-2.2.3.tgz", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-2.2.3.tgz", "dependencies": { "is-number": { "version": "2.1.0", - "from": "is-number@>=2.1.0 <3.0.0", + "from": "https://registry.npmjs.org/is-number/-/is-number-2.1.0.tgz", "resolved": "https://registry.npmjs.org/is-number/-/is-number-2.1.0.tgz" }, "isobject": { "version": "2.1.0", - "from": "isobject@>=2.0.0 <3.0.0", + "from": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", "dependencies": { "isarray": { "version": "1.0.0", - "from": "isarray@1.0.0", + "from": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz" } } }, "randomatic": { "version": "1.1.5", - "from": "randomatic@>=1.1.3 <2.0.0", + "from": "https://registry.npmjs.org/randomatic/-/randomatic-1.1.5.tgz", "resolved": "https://registry.npmjs.org/randomatic/-/randomatic-1.1.5.tgz" }, "repeat-string": { "version": "1.5.4", - "from": "repeat-string@>=1.5.2 <2.0.0", + "from": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.5.4.tgz", "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.5.4.tgz" } } @@ -10423,114 +10328,114 @@ }, "preserve": { "version": "0.2.0", - "from": "preserve@>=0.2.0 <0.3.0", + "from": "https://registry.npmjs.org/preserve/-/preserve-0.2.0.tgz", "resolved": "https://registry.npmjs.org/preserve/-/preserve-0.2.0.tgz" }, "repeat-element": { "version": "1.1.2", - "from": "repeat-element@>=1.1.2 <2.0.0", + "from": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.2.tgz", "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.2.tgz" } } }, "expand-brackets": { "version": "0.1.5", - "from": "expand-brackets@>=0.1.4 <0.2.0", + "from": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz", "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz", "dependencies": { "is-posix-bracket": { "version": "0.1.1", - "from": "is-posix-bracket@>=0.1.0 <0.2.0", + "from": "https://registry.npmjs.org/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz", "resolved": "https://registry.npmjs.org/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz" } } }, "extglob": { "version": "0.3.2", - "from": "extglob@>=0.3.1 <0.4.0", + "from": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz", "resolved": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz" }, "filename-regex": { "version": "2.0.0", - "from": "filename-regex@>=2.0.0 <3.0.0", + "from": "https://registry.npmjs.org/filename-regex/-/filename-regex-2.0.0.tgz", "resolved": "https://registry.npmjs.org/filename-regex/-/filename-regex-2.0.0.tgz" }, "is-extglob": { "version": "1.0.0", - "from": "is-extglob@>=1.0.0 <2.0.0", + "from": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz" }, "kind-of": { "version": "3.0.3", - "from": "kind-of@>=3.0.2 <4.0.0", + "from": "https://registry.npmjs.org/kind-of/-/kind-of-3.0.3.tgz", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.0.3.tgz", "dependencies": { "is-buffer": { "version": "1.1.3", - "from": "is-buffer@>=1.0.2 <2.0.0", + "from": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.3.tgz", "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.3.tgz" } } }, "normalize-path": { "version": "2.0.1", - "from": "normalize-path@>=2.0.1 <3.0.0", + "from": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.0.1.tgz", "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.0.1.tgz" }, "object.omit": { "version": "2.0.0", - "from": "object.omit@>=2.0.0 <3.0.0", + "from": "https://registry.npmjs.org/object.omit/-/object.omit-2.0.0.tgz", "resolved": "https://registry.npmjs.org/object.omit/-/object.omit-2.0.0.tgz", "dependencies": { "for-own": { "version": "0.1.4", - "from": "for-own@>=0.1.3 <0.2.0", + "from": "https://registry.npmjs.org/for-own/-/for-own-0.1.4.tgz", "resolved": "https://registry.npmjs.org/for-own/-/for-own-0.1.4.tgz", "dependencies": { "for-in": { "version": "0.1.5", - "from": "for-in@>=0.1.5 <0.2.0", + "from": "https://registry.npmjs.org/for-in/-/for-in-0.1.5.tgz", "resolved": "https://registry.npmjs.org/for-in/-/for-in-0.1.5.tgz" } } }, "is-extendable": { "version": "0.1.1", - "from": "is-extendable@>=0.1.1 <0.2.0", + "from": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz" } } }, "parse-glob": { "version": "3.0.4", - "from": "parse-glob@>=3.0.4 <4.0.0", + "from": "https://registry.npmjs.org/parse-glob/-/parse-glob-3.0.4.tgz", "resolved": "https://registry.npmjs.org/parse-glob/-/parse-glob-3.0.4.tgz", "dependencies": { "glob-base": { "version": "0.3.0", - "from": "glob-base@>=0.3.0 <0.4.0", + "from": "https://registry.npmjs.org/glob-base/-/glob-base-0.3.0.tgz", "resolved": "https://registry.npmjs.org/glob-base/-/glob-base-0.3.0.tgz" }, "is-dotfile": { "version": "1.0.2", - "from": "is-dotfile@>=1.0.0 <2.0.0", + "from": "https://registry.npmjs.org/is-dotfile/-/is-dotfile-1.0.2.tgz", "resolved": "https://registry.npmjs.org/is-dotfile/-/is-dotfile-1.0.2.tgz" } } }, "regex-cache": { "version": "0.4.3", - "from": "regex-cache@>=0.4.2 <0.5.0", + "from": "https://registry.npmjs.org/regex-cache/-/regex-cache-0.4.3.tgz", "resolved": "https://registry.npmjs.org/regex-cache/-/regex-cache-0.4.3.tgz", "dependencies": { "is-equal-shallow": { "version": "0.1.3", - "from": "is-equal-shallow@>=0.1.3 <0.2.0", + "from": "https://registry.npmjs.org/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz", "resolved": "https://registry.npmjs.org/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz" }, "is-primitive": { "version": "2.0.0", - "from": "is-primitive@>=2.0.0 <3.0.0", + "from": "https://registry.npmjs.org/is-primitive/-/is-primitive-2.0.0.tgz", "resolved": "https://registry.npmjs.org/is-primitive/-/is-primitive-2.0.0.tgz" } } @@ -10541,71 +10446,71 @@ }, "async-each": { "version": "1.0.0", - "from": "async-each@>=1.0.0 <2.0.0", + "from": "https://registry.npmjs.org/async-each/-/async-each-1.0.0.tgz", "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.0.tgz" }, "glob-parent": { "version": "2.0.0", - "from": "glob-parent@>=2.0.0 <3.0.0", + "from": "https://registry.npmjs.org/glob-parent/-/glob-parent-2.0.0.tgz", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-2.0.0.tgz" }, "inherits": { "version": "2.0.1", - "from": "inherits@>=2.0.1 <3.0.0", + "from": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz" }, "is-binary-path": { "version": "1.0.1", - "from": "is-binary-path@>=1.0.0 <2.0.0", + "from": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", "dependencies": { "binary-extensions": { "version": "1.4.0", - "from": "binary-extensions@>=1.0.0 <2.0.0", + "from": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.4.0.tgz", "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.4.0.tgz" } } }, "is-glob": { "version": "2.0.1", - "from": "is-glob@>=2.0.0 <3.0.0", + "from": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", "dependencies": { "is-extglob": { "version": "1.0.0", - "from": "is-extglob@>=1.0.0 <2.0.0", + "from": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz" } } }, "path-is-absolute": { "version": "1.0.0", - "from": "path-is-absolute@>=1.0.0 <2.0.0", + "from": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.0.tgz", "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.0.tgz" }, "readdirp": { "version": "2.0.0", - "from": "readdirp@>=2.0.0 <3.0.0", + "from": "https://registry.npmjs.org/readdirp/-/readdirp-2.0.0.tgz", "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.0.0.tgz", "dependencies": { "minimatch": { "version": "2.0.10", - "from": "minimatch@>=2.0.10 <3.0.0", + "from": "https://registry.npmjs.org/minimatch/-/minimatch-2.0.10.tgz", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-2.0.10.tgz", "dependencies": { "brace-expansion": { "version": "1.1.4", - "from": "brace-expansion@>=1.0.0 <2.0.0", + "from": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.4.tgz", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.4.tgz", "dependencies": { "balanced-match": { "version": "0.4.1", - "from": "balanced-match@>=0.4.1 <0.5.0", + "from": "https://registry.npmjs.org/balanced-match/-/balanced-match-0.4.1.tgz", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-0.4.1.tgz" }, "concat-map": { "version": "0.0.1", - "from": "concat-map@0.0.1", + "from": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz" } } @@ -10614,32 +10519,32 @@ }, "readable-stream": { "version": "2.1.2", - "from": "readable-stream@>=2.0.2 <3.0.0", + "from": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.1.2.tgz", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.1.2.tgz", "dependencies": { "core-util-is": { "version": "1.0.2", - "from": "core-util-is@>=1.0.0 <1.1.0", + "from": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz" }, "isarray": { "version": "1.0.0", - "from": "isarray@>=1.0.0 <1.1.0", + "from": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz" }, "process-nextick-args": { "version": "1.0.7", - "from": "process-nextick-args@>=1.0.6 <1.1.0", + "from": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz", "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz" }, "string_decoder": { "version": "0.10.31", - "from": "string_decoder@>=0.10.0 <0.11.0", + "from": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz" }, "util-deprecate": { "version": "1.0.2", - "from": "util-deprecate@>=1.0.1 <1.1.0", + "from": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz" } } @@ -10648,12 +10553,12 @@ }, "fsevents": { "version": "1.0.12", - "from": "fsevents@>=1.0.0 <2.0.0", + "from": "https://registry.npmjs.org/fsevents/-/fsevents-1.0.12.tgz", "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.0.12.tgz", "dependencies": { "nan": { "version": "2.3.3", - "from": "nan@>=2.3.0 <3.0.0", + "from": "https://registry.npmjs.org/nan/-/nan-2.3.3.tgz", "resolved": "https://registry.npmjs.org/nan/-/nan-2.3.3.tgz" }, "node-pre-gyp": { @@ -10675,6 +10580,11 @@ } } }, + "ansi-regex": { + "version": "2.0.0", + "from": "ansi-regex@^2.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.0.0.tgz" + }, "ansi": { "version": "0.3.1", "from": "ansi@~0.3.1", @@ -10690,16 +10600,6 @@ "from": "are-we-there-yet@~1.1.2", "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.2.tgz" }, - "ansi-regex": { - "version": "2.0.0", - "from": "ansi-regex@^2.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.0.0.tgz" - }, - "asn1": { - "version": "0.2.3", - "from": "asn1@>=0.2.3 <0.3.0", - "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.3.tgz" - }, "assert-plus": { "version": "0.2.0", "from": "assert-plus@^0.2.0", @@ -10725,6 +10625,11 @@ "from": "block-stream@*", "resolved": "https://registry.npmjs.org/block-stream/-/block-stream-0.0.8.tgz" }, + "asn1": { + "version": "0.2.3", + "from": "asn1@>=0.2.3 <0.3.0", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.3.tgz" + }, "boom": { "version": "2.10.1", "from": "boom@2.x.x", @@ -10740,11 +10645,6 @@ "from": "combined-stream@~1.0.5", "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.5.tgz" }, - "commander": { - "version": "2.9.0", - "from": "commander@^2.9.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.9.0.tgz" - }, "chalk": { "version": "1.1.3", "from": "chalk@^1.1.1", @@ -10760,31 +10660,36 @@ "from": "cryptiles@2.x.x", "resolved": "https://registry.npmjs.org/cryptiles/-/cryptiles-2.0.5.tgz" }, + "commander": { + "version": "2.9.0", + "from": "commander@^2.9.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.9.0.tgz" + }, "debug": { "version": "2.2.0", "from": "debug@~2.2.0", "resolved": "https://registry.npmjs.org/debug/-/debug-2.2.0.tgz" }, - "deep-extend": { - "version": "0.4.1", - "from": "deep-extend@~0.4.0", - "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.4.1.tgz" - }, - "delegates": { - "version": "1.0.0", - "from": "delegates@^1.0.0", - "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz" - }, "delayed-stream": { "version": "1.0.0", "from": "delayed-stream@~1.0.0", "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz" }, + "deep-extend": { + "version": "0.4.1", + "from": "deep-extend@~0.4.0", + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.4.1.tgz" + }, "ecc-jsbn": { "version": "0.1.1", "from": "ecc-jsbn@>=0.0.1 <1.0.0", "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz" }, + "delegates": { + "version": "1.0.0", + "from": "delegates@^1.0.0", + "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz" + }, "escape-string-regexp": { "version": "1.0.5", "from": "escape-string-regexp@^1.0.2", @@ -10805,41 +10710,41 @@ "from": "forever-agent@~0.6.1", "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz" }, - "fstream": { - "version": "1.0.8", - "from": "fstream@^1.0.2", - "resolved": "https://registry.npmjs.org/fstream/-/fstream-1.0.8.tgz" - }, "form-data": { "version": "1.0.0-rc4", "from": "form-data@~1.0.0-rc3", "resolved": "https://registry.npmjs.org/form-data/-/form-data-1.0.0-rc4.tgz" }, + "fstream": { + "version": "1.0.8", + "from": "fstream@^1.0.2", + "resolved": "https://registry.npmjs.org/fstream/-/fstream-1.0.8.tgz" + }, "gauge": { "version": "1.2.7", "from": "gauge@~1.2.5", "resolved": "https://registry.npmjs.org/gauge/-/gauge-1.2.7.tgz" }, - "generate-object-property": { - "version": "1.2.0", - "from": "generate-object-property@^1.1.0", - "resolved": "https://registry.npmjs.org/generate-object-property/-/generate-object-property-1.2.0.tgz" - }, "generate-function": { "version": "2.0.0", "from": "generate-function@^2.0.0", "resolved": "https://registry.npmjs.org/generate-function/-/generate-function-2.0.0.tgz" }, - "graceful-fs": { - "version": "4.1.3", - "from": "graceful-fs@^4.1.2", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.3.tgz" + "generate-object-property": { + "version": "1.2.0", + "from": "generate-object-property@^1.1.0", + "resolved": "https://registry.npmjs.org/generate-object-property/-/generate-object-property-1.2.0.tgz" }, "graceful-readlink": { "version": "1.0.1", "from": "graceful-readlink@>= 1.0.0", "resolved": "https://registry.npmjs.org/graceful-readlink/-/graceful-readlink-1.0.1.tgz" }, + "graceful-fs": { + "version": "4.1.3", + "from": "graceful-fs@^4.1.2", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.3.tgz" + }, "har-validator": { "version": "2.0.6", "from": "har-validator@~2.0.6", @@ -10850,51 +10755,41 @@ "from": "has-ansi@^2.0.0", "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz" }, - "has-unicode": { - "version": "2.0.0", - "from": "has-unicode@^2.0.0", - "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.0.tgz" - }, "hawk": { "version": "3.1.3", "from": "hawk@~3.1.0", "resolved": "https://registry.npmjs.org/hawk/-/hawk-3.1.3.tgz" }, + "has-unicode": { + "version": "2.0.0", + "from": "has-unicode@^2.0.0", + "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.0.tgz" + }, "hoek": { "version": "2.16.3", "from": "hoek@2.x.x", "resolved": "https://registry.npmjs.org/hoek/-/hoek-2.16.3.tgz" }, - "http-signature": { - "version": "1.1.1", - "from": "http-signature@~1.1.0", - "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.1.1.tgz" + "inherits": { + "version": "2.0.1", + "from": "inherits@*", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz" }, "ini": { "version": "1.3.4", "from": "ini@~1.3.0", "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.4.tgz" }, - "inherits": { - "version": "2.0.1", - "from": "inherits@*", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz" + "http-signature": { + "version": "1.1.1", + "from": "http-signature@~1.1.0", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.1.1.tgz" }, "is-my-json-valid": { "version": "2.13.1", "from": "is-my-json-valid@^2.12.4", "resolved": "https://registry.npmjs.org/is-my-json-valid/-/is-my-json-valid-2.13.1.tgz" }, - "is-property": { - "version": "1.0.2", - "from": "is-property@^1.0.0", - "resolved": "https://registry.npmjs.org/is-property/-/is-property-1.0.2.tgz" - }, - "is-typedarray": { - "version": "1.0.0", - "from": "is-typedarray@~1.0.0", - "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz" - }, "isarray": { "version": "1.0.0", "from": "isarray@~1.0.0", @@ -10905,11 +10800,21 @@ "from": "isstream@~0.1.2", "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz" }, + "is-property": { + "version": "1.0.2", + "from": "is-property@^1.0.0", + "resolved": "https://registry.npmjs.org/is-property/-/is-property-1.0.2.tgz" + }, "jsbn": { "version": "0.1.0", "from": "jsbn@>=0.1.0 <0.2.0", "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.0.tgz" }, + "is-typedarray": { + "version": "1.0.0", + "from": "is-typedarray@~1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz" + }, "jodid25519": { "version": "1.0.2", "from": "jodid25519@>=1.0.0 <2.0.0", @@ -10925,6 +10830,11 @@ "from": "json-stringify-safe@~5.0.1", "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz" }, + "lodash.pad": { + "version": "4.1.0", + "from": "lodash.pad@^4.1.0", + "resolved": "https://registry.npmjs.org/lodash.pad/-/lodash.pad-4.1.0.tgz" + }, "jsonpointer": { "version": "2.0.0", "from": "jsonpointer@2.0.0", @@ -10935,21 +10845,16 @@ "from": "jsprim@^1.2.2", "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.2.2.tgz" }, - "lodash.pad": { - "version": "4.1.0", - "from": "lodash.pad@^4.1.0", - "resolved": "https://registry.npmjs.org/lodash.pad/-/lodash.pad-4.1.0.tgz" + "lodash.padend": { + "version": "4.2.0", + "from": "lodash.padend@^4.1.0", + "resolved": "https://registry.npmjs.org/lodash.padend/-/lodash.padend-4.2.0.tgz" }, "lodash.padstart": { "version": "4.2.0", "from": "lodash.padstart@^4.1.0", "resolved": "https://registry.npmjs.org/lodash.padstart/-/lodash.padstart-4.2.0.tgz" }, - "lodash.padend": { - "version": "4.2.0", - "from": "lodash.padend@^4.1.0", - "resolved": "https://registry.npmjs.org/lodash.padend/-/lodash.padend-4.2.0.tgz" - }, "lodash.repeat": { "version": "4.0.0", "from": "lodash.repeat@^4.0.0", @@ -10965,6 +10870,11 @@ "from": "mime-db@~1.22.0", "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.22.0.tgz" }, + "minimist": { + "version": "0.0.8", + "from": "minimist@0.0.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz" + }, "mime-types": { "version": "2.1.10", "from": "mime-types@~2.1.7", @@ -10980,21 +10890,16 @@ "from": "ms@0.7.1", "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.1.tgz" }, - "minimist": { - "version": "0.0.8", - "from": "minimist@0.0.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz" + "node-uuid": { + "version": "1.4.7", + "from": "node-uuid@~1.4.7", + "resolved": "https://registry.npmjs.org/node-uuid/-/node-uuid-1.4.7.tgz" }, "npmlog": { "version": "2.0.3", "from": "npmlog@~2.0.0", "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-2.0.3.tgz" }, - "node-uuid": { - "version": "1.4.7", - "from": "node-uuid@~1.4.7", - "resolved": "https://registry.npmjs.org/node-uuid/-/node-uuid-1.4.7.tgz" - }, "oauth-sign": { "version": "0.8.1", "from": "oauth-sign@~0.8.0", @@ -11025,41 +10930,41 @@ "from": "qs@~6.0.2", "resolved": "https://registry.npmjs.org/qs/-/qs-6.0.2.tgz" }, - "readable-stream": { - "version": "2.0.6", - "from": "readable-stream@^2.0.0 || ^1.1.13", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.0.6.tgz" - }, "request": { "version": "2.69.0", "from": "request@2.x", "resolved": "https://registry.npmjs.org/request/-/request-2.69.0.tgz" }, - "semver": { - "version": "5.1.0", - "from": "semver@~5.1.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.1.0.tgz" + "readable-stream": { + "version": "2.0.6", + "from": "readable-stream@^2.0.0 || ^1.1.13", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.0.6.tgz" }, "sntp": { "version": "1.0.9", "from": "sntp@1.x.x", "resolved": "https://registry.npmjs.org/sntp/-/sntp-1.0.9.tgz" }, + "semver": { + "version": "5.1.0", + "from": "semver@~5.1.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.1.0.tgz" + }, "sshpk": { "version": "1.7.4", "from": "sshpk@^1.7.0", "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.7.4.tgz" }, - "stringstream": { - "version": "0.0.5", - "from": "stringstream@~0.0.4", - "resolved": "https://registry.npmjs.org/stringstream/-/stringstream-0.0.5.tgz" - }, "string_decoder": { "version": "0.10.31", "from": "string_decoder@~0.10.x", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz" }, + "stringstream": { + "version": "0.0.5", + "from": "stringstream@~0.0.4", + "resolved": "https://registry.npmjs.org/stringstream/-/stringstream-0.0.5.tgz" + }, "strip-ansi": { "version": "3.0.1", "from": "strip-ansi@^3.0.0", @@ -11075,25 +10980,30 @@ "from": "strip-json-comments@~1.0.4", "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-1.0.4.tgz" }, + "tar-pack": { + "version": "3.1.3", + "from": "tar-pack@~3.1.0", + "resolved": "https://registry.npmjs.org/tar-pack/-/tar-pack-3.1.3.tgz" + }, "tar": { "version": "2.2.1", "from": "tar@~2.2.0", "resolved": "https://registry.npmjs.org/tar/-/tar-2.2.1.tgz" }, + "tunnel-agent": { + "version": "0.4.2", + "from": "tunnel-agent@~0.4.1", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.4.2.tgz" + }, "tough-cookie": { "version": "2.2.2", "from": "tough-cookie@~2.2.0", "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.2.2.tgz" }, - "tar-pack": { - "version": "3.1.3", - "from": "tar-pack@~3.1.0", - "resolved": "https://registry.npmjs.org/tar-pack/-/tar-pack-3.1.3.tgz" - }, - "tunnel-agent": { - "version": "0.4.2", - "from": "tunnel-agent@~0.4.1", - "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.4.2.tgz" + "uid-number": { + "version": "0.0.6", + "from": "uid-number@~0.0.6", + "resolved": "https://registry.npmjs.org/uid-number/-/uid-number-0.0.6.tgz" }, "tweetnacl": { "version": "0.14.3", @@ -11110,11 +11020,6 @@ "from": "verror@1.3.6", "resolved": "https://registry.npmjs.org/verror/-/verror-1.3.6.tgz" }, - "uid-number": { - "version": "0.0.6", - "from": "uid-number@~0.0.6", - "resolved": "https://registry.npmjs.org/uid-number/-/uid-number-0.0.6.tgz" - }, "wrappy": { "version": "1.0.1", "from": "wrappy@1", @@ -11282,137 +11187,137 @@ }, "colors": { "version": "1.1.2", - "from": "colors@>=1.1.0 <2.0.0", + "from": "https://registry.npmjs.org/colors/-/colors-1.1.2.tgz", "resolved": "https://registry.npmjs.org/colors/-/colors-1.1.2.tgz" }, "connect": { "version": "3.4.1", - "from": "connect@>=3.3.5 <4.0.0", + "from": "https://registry.npmjs.org/connect/-/connect-3.4.1.tgz", "resolved": "https://registry.npmjs.org/connect/-/connect-3.4.1.tgz", "dependencies": { "debug": { "version": "2.2.0", - "from": "debug@>=2.2.0 <2.3.0", + "from": "https://registry.npmjs.org/debug/-/debug-2.2.0.tgz", "resolved": "https://registry.npmjs.org/debug/-/debug-2.2.0.tgz", "dependencies": { "ms": { "version": "0.7.1", - "from": "ms@0.7.1", + "from": "https://registry.npmjs.org/ms/-/ms-0.7.1.tgz", "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.1.tgz" } } }, "finalhandler": { "version": "0.4.1", - "from": "finalhandler@0.4.1", + "from": "https://registry.npmjs.org/finalhandler/-/finalhandler-0.4.1.tgz", "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-0.4.1.tgz", "dependencies": { "escape-html": { "version": "1.0.3", - "from": "escape-html@>=1.0.3 <1.1.0", + "from": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz" }, "on-finished": { "version": "2.3.0", - "from": "on-finished@>=2.3.0 <2.4.0", + "from": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", "dependencies": { "ee-first": { "version": "1.1.1", - "from": "ee-first@1.1.1", + "from": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz" } } }, "unpipe": { "version": "1.0.0", - "from": "unpipe@>=1.0.0 <1.1.0", + "from": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz" } } }, "parseurl": { "version": "1.3.1", - "from": "parseurl@>=1.3.1 <1.4.0", + "from": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.1.tgz", "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.1.tgz" }, "utils-merge": { "version": "1.0.0", - "from": "utils-merge@1.0.0", + "from": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.0.tgz", "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.0.tgz" } } }, "core-js": { "version": "2.4.0", - "from": "core-js@>=2.1.0 <3.0.0", + "from": "https://registry.npmjs.org/core-js/-/core-js-2.4.0.tgz", "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.4.0.tgz" }, "di": { "version": "0.0.1", - "from": "di@>=0.0.1 <0.0.2", + "from": "https://registry.npmjs.org/di/-/di-0.0.1.tgz", "resolved": "https://registry.npmjs.org/di/-/di-0.0.1.tgz" }, "dom-serialize": { "version": "2.2.1", - "from": "dom-serialize@>=2.2.0 <3.0.0", + "from": "https://registry.npmjs.org/dom-serialize/-/dom-serialize-2.2.1.tgz", "resolved": "https://registry.npmjs.org/dom-serialize/-/dom-serialize-2.2.1.tgz", "dependencies": { "custom-event": { "version": "1.0.0", - "from": "custom-event@>=1.0.0 <1.1.0", + "from": "https://registry.npmjs.org/custom-event/-/custom-event-1.0.0.tgz", "resolved": "https://registry.npmjs.org/custom-event/-/custom-event-1.0.0.tgz" }, "ent": { "version": "2.2.0", - "from": "ent@>=2.2.0 <2.3.0", + "from": "https://registry.npmjs.org/ent/-/ent-2.2.0.tgz", "resolved": "https://registry.npmjs.org/ent/-/ent-2.2.0.tgz" }, "extend": { "version": "3.0.0", - "from": "extend@>=3.0.0 <4.0.0", + "from": "https://registry.npmjs.org/extend/-/extend-3.0.0.tgz", "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.0.tgz" }, "void-elements": { "version": "2.0.1", - "from": "void-elements@>=2.0.0 <3.0.0", + "from": "https://registry.npmjs.org/void-elements/-/void-elements-2.0.1.tgz", "resolved": "https://registry.npmjs.org/void-elements/-/void-elements-2.0.1.tgz" } } }, "expand-braces": { "version": "0.1.2", - "from": "expand-braces@>=0.1.1 <0.2.0", + "from": "https://registry.npmjs.org/expand-braces/-/expand-braces-0.1.2.tgz", "resolved": "https://registry.npmjs.org/expand-braces/-/expand-braces-0.1.2.tgz", "dependencies": { "array-slice": { "version": "0.2.3", - "from": "array-slice@>=0.2.3 <0.3.0", + "from": "https://registry.npmjs.org/array-slice/-/array-slice-0.2.3.tgz", "resolved": "https://registry.npmjs.org/array-slice/-/array-slice-0.2.3.tgz" }, "array-unique": { "version": "0.2.1", - "from": "array-unique@>=0.2.1 <0.3.0", + "from": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz", "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz" }, "braces": { "version": "0.1.5", - "from": "braces@>=0.1.2 <0.2.0", + "from": "https://registry.npmjs.org/braces/-/braces-0.1.5.tgz", "resolved": "https://registry.npmjs.org/braces/-/braces-0.1.5.tgz", "dependencies": { "expand-range": { "version": "0.1.1", - "from": "expand-range@>=0.1.0 <0.2.0", + "from": "https://registry.npmjs.org/expand-range/-/expand-range-0.1.1.tgz", "resolved": "https://registry.npmjs.org/expand-range/-/expand-range-0.1.1.tgz", "dependencies": { "is-number": { "version": "0.1.1", - "from": "is-number@>=0.1.1 <0.2.0", + "from": "https://registry.npmjs.org/is-number/-/is-number-0.1.1.tgz", "resolved": "https://registry.npmjs.org/is-number/-/is-number-0.1.1.tgz" }, "repeat-string": { "version": "0.2.2", - "from": "repeat-string@>=0.2.2 <0.3.0", + "from": "https://registry.npmjs.org/repeat-string/-/repeat-string-0.2.2.tgz", "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-0.2.2.tgz" } } @@ -11423,139 +11328,139 @@ }, "glob": { "version": "7.0.3", - "from": "glob@>=7.0.0 <8.0.0", + "from": "https://registry.npmjs.org/glob/-/glob-7.0.3.tgz", "resolved": "https://registry.npmjs.org/glob/-/glob-7.0.3.tgz", "dependencies": { "inflight": { "version": "1.0.4", - "from": "inflight@>=1.0.4 <2.0.0", + "from": "https://registry.npmjs.org/inflight/-/inflight-1.0.4.tgz", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.4.tgz", "dependencies": { "wrappy": { "version": "1.0.1", - "from": "wrappy@>=1.0.0 <2.0.0", + "from": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.1.tgz", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.1.tgz" } } }, "inherits": { "version": "2.0.1", - "from": "inherits@>=2.0.0 <3.0.0", + "from": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz" }, "once": { "version": "1.3.3", - "from": "once@>=1.3.0 <2.0.0", + "from": "https://registry.npmjs.org/once/-/once-1.3.3.tgz", "resolved": "https://registry.npmjs.org/once/-/once-1.3.3.tgz", "dependencies": { "wrappy": { "version": "1.0.1", - "from": "wrappy@>=1.0.0 <2.0.0", + "from": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.1.tgz", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.1.tgz" } } }, "path-is-absolute": { "version": "1.0.0", - "from": "path-is-absolute@>=1.0.0 <2.0.0", + "from": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.0.tgz", "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.0.tgz" } } }, "graceful-fs": { "version": "4.1.4", - "from": "graceful-fs@>=4.1.2 <5.0.0", + "from": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.4.tgz", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.4.tgz" }, "http-proxy": { "version": "1.13.2", - "from": "http-proxy@>=1.13.0 <2.0.0", + "from": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.13.2.tgz", "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.13.2.tgz", "dependencies": { "eventemitter3": { "version": "1.2.0", - "from": "eventemitter3@>=1.0.0 <2.0.0", + "from": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-1.2.0.tgz", "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-1.2.0.tgz" }, "requires-port": { "version": "1.0.0", - "from": "requires-port@>=1.0.0 <2.0.0", + "from": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz" } } }, "isbinaryfile": { "version": "3.0.0", - "from": "isbinaryfile@>=3.0.0 <4.0.0", + "from": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-3.0.0.tgz", "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-3.0.0.tgz" }, "lodash": { "version": "3.10.1", - "from": "lodash@>=3.8.0 <4.0.0", + "from": "https://registry.npmjs.org/lodash/-/lodash-3.10.1.tgz", "resolved": "https://registry.npmjs.org/lodash/-/lodash-3.10.1.tgz" }, "log4js": { "version": "0.6.36", - "from": "log4js@>=0.6.31 <0.7.0", + "from": "https://registry.npmjs.org/log4js/-/log4js-0.6.36.tgz", "resolved": "https://registry.npmjs.org/log4js/-/log4js-0.6.36.tgz", "dependencies": { "readable-stream": { "version": "1.0.34", - "from": "readable-stream@>=1.0.2 <1.1.0", + "from": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", "dependencies": { "core-util-is": { "version": "1.0.2", - "from": "core-util-is@>=1.0.0 <1.1.0", + "from": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz" }, "isarray": { "version": "0.0.1", - "from": "isarray@0.0.1", + "from": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz" }, "string_decoder": { "version": "0.10.31", - "from": "string_decoder@>=0.10.0 <0.11.0", + "from": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz" }, "inherits": { "version": "2.0.1", - "from": "inherits@>=2.0.1 <2.1.0", + "from": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz" } } }, "semver": { "version": "4.3.6", - "from": "semver@>=4.3.3 <4.4.0", + "from": "https://registry.npmjs.org/semver/-/semver-4.3.6.tgz", "resolved": "https://registry.npmjs.org/semver/-/semver-4.3.6.tgz" } } }, "mime": { "version": "1.3.4", - "from": "mime@>=1.3.4 <2.0.0", + "from": "https://registry.npmjs.org/mime/-/mime-1.3.4.tgz", "resolved": "https://registry.npmjs.org/mime/-/mime-1.3.4.tgz" }, "minimatch": { "version": "3.0.0", - "from": "minimatch@>=3.0.0 <4.0.0", + "from": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.0.tgz", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.0.tgz", "dependencies": { "brace-expansion": { "version": "1.1.4", - "from": "brace-expansion@>=1.0.0 <2.0.0", + "from": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.4.tgz", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.4.tgz", "dependencies": { "balanced-match": { "version": "0.4.1", - "from": "balanced-match@>=0.4.1 <0.5.0", + "from": "https://registry.npmjs.org/balanced-match/-/balanced-match-0.4.1.tgz", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-0.4.1.tgz" }, "concat-map": { "version": "0.0.1", - "from": "concat-map@0.0.1", + "from": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz" } } @@ -11564,122 +11469,122 @@ }, "optimist": { "version": "0.6.1", - "from": "optimist@>=0.6.1 <0.7.0", + "from": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz", "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz", "dependencies": { "wordwrap": { "version": "0.0.3", - "from": "wordwrap@>=0.0.2 <0.1.0", + "from": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz", "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz" }, "minimist": { "version": "0.0.10", - "from": "minimist@>=0.0.1 <0.1.0", + "from": "https://registry.npmjs.org/minimist/-/minimist-0.0.10.tgz", "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.10.tgz" } } }, "rimraf": { "version": "2.5.2", - "from": "rimraf@>=2.3.3 <3.0.0", + "from": "https://registry.npmjs.org/rimraf/-/rimraf-2.5.2.tgz", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.5.2.tgz" }, "socket.io": { "version": "1.4.6", - "from": "socket.io@>=1.4.5 <2.0.0", + "from": "https://registry.npmjs.org/socket.io/-/socket.io-1.4.6.tgz", "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-1.4.6.tgz", "dependencies": { "engine.io": { "version": "1.6.9", - "from": "engine.io@1.6.9", + "from": "https://registry.npmjs.org/engine.io/-/engine.io-1.6.9.tgz", "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-1.6.9.tgz", "dependencies": { "base64id": { "version": "0.1.0", - "from": "base64id@0.1.0", + "from": "https://registry.npmjs.org/base64id/-/base64id-0.1.0.tgz", "resolved": "https://registry.npmjs.org/base64id/-/base64id-0.1.0.tgz" }, "ws": { "version": "1.0.1", - "from": "ws@1.0.1", + "from": "https://registry.npmjs.org/ws/-/ws-1.0.1.tgz", "resolved": "https://registry.npmjs.org/ws/-/ws-1.0.1.tgz", "dependencies": { "options": { "version": "0.0.6", - "from": "options@>=0.0.5", + "from": "https://registry.npmjs.org/options/-/options-0.0.6.tgz", "resolved": "https://registry.npmjs.org/options/-/options-0.0.6.tgz" }, "ultron": { "version": "1.0.2", - "from": "ultron@>=1.0.0 <1.1.0", + "from": "https://registry.npmjs.org/ultron/-/ultron-1.0.2.tgz", "resolved": "https://registry.npmjs.org/ultron/-/ultron-1.0.2.tgz" } } }, "engine.io-parser": { "version": "1.2.4", - "from": "engine.io-parser@1.2.4", + "from": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-1.2.4.tgz", "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-1.2.4.tgz", "dependencies": { "after": { "version": "0.8.1", - "from": "after@0.8.1", + "from": "https://registry.npmjs.org/after/-/after-0.8.1.tgz", "resolved": "https://registry.npmjs.org/after/-/after-0.8.1.tgz" }, "arraybuffer.slice": { "version": "0.0.6", - "from": "arraybuffer.slice@0.0.6", + "from": "https://registry.npmjs.org/arraybuffer.slice/-/arraybuffer.slice-0.0.6.tgz", "resolved": "https://registry.npmjs.org/arraybuffer.slice/-/arraybuffer.slice-0.0.6.tgz" }, "base64-arraybuffer": { "version": "0.1.2", - "from": "base64-arraybuffer@0.1.2", + "from": "https://registry.npmjs.org/base64-arraybuffer/-/base64-arraybuffer-0.1.2.tgz", "resolved": "https://registry.npmjs.org/base64-arraybuffer/-/base64-arraybuffer-0.1.2.tgz" }, "blob": { "version": "0.0.4", - "from": "blob@0.0.4", + "from": "https://registry.npmjs.org/blob/-/blob-0.0.4.tgz", "resolved": "https://registry.npmjs.org/blob/-/blob-0.0.4.tgz" }, "has-binary": { "version": "0.1.6", - "from": "has-binary@0.1.6", + "from": "https://registry.npmjs.org/has-binary/-/has-binary-0.1.6.tgz", "resolved": "https://registry.npmjs.org/has-binary/-/has-binary-0.1.6.tgz", "dependencies": { "isarray": { "version": "0.0.1", - "from": "isarray@0.0.1", + "from": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz" } } }, "utf8": { "version": "2.1.0", - "from": "utf8@2.1.0", + "from": "https://registry.npmjs.org/utf8/-/utf8-2.1.0.tgz", "resolved": "https://registry.npmjs.org/utf8/-/utf8-2.1.0.tgz" } } }, "accepts": { "version": "1.1.4", - "from": "accepts@1.1.4", + "from": "https://registry.npmjs.org/accepts/-/accepts-1.1.4.tgz", "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.1.4.tgz", "dependencies": { "mime-types": { "version": "2.0.14", - "from": "mime-types@>=2.0.4 <2.1.0", + "from": "https://registry.npmjs.org/mime-types/-/mime-types-2.0.14.tgz", "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.0.14.tgz", "dependencies": { "mime-db": { "version": "1.12.0", - "from": "mime-db@>=1.12.0 <1.13.0", + "from": "https://registry.npmjs.org/mime-db/-/mime-db-1.12.0.tgz", "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.12.0.tgz" } } }, "negotiator": { "version": "0.4.9", - "from": "negotiator@0.4.9", + "from": "https://registry.npmjs.org/negotiator/-/negotiator-0.4.9.tgz", "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.4.9.tgz" } } @@ -11688,125 +11593,125 @@ }, "socket.io-parser": { "version": "2.2.6", - "from": "socket.io-parser@2.2.6", + "from": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-2.2.6.tgz", "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-2.2.6.tgz", "dependencies": { "json3": { "version": "3.3.2", - "from": "json3@3.3.2", + "from": "https://registry.npmjs.org/json3/-/json3-3.3.2.tgz", "resolved": "https://registry.npmjs.org/json3/-/json3-3.3.2.tgz" }, "component-emitter": { "version": "1.1.2", - "from": "component-emitter@1.1.2", + "from": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.1.2.tgz", "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.1.2.tgz" }, "isarray": { "version": "0.0.1", - "from": "isarray@0.0.1", + "from": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz" } } }, "socket.io-client": { "version": "1.4.6", - "from": "socket.io-client@1.4.6", + "from": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-1.4.6.tgz", "resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-1.4.6.tgz", "dependencies": { "engine.io-client": { "version": "1.6.9", - "from": "engine.io-client@1.6.9", + "from": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-1.6.9.tgz", "resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-1.6.9.tgz", "dependencies": { "has-cors": { "version": "1.1.0", - "from": "has-cors@1.1.0", + "from": "https://registry.npmjs.org/has-cors/-/has-cors-1.1.0.tgz", "resolved": "https://registry.npmjs.org/has-cors/-/has-cors-1.1.0.tgz" }, "ws": { "version": "1.0.1", - "from": "ws@1.0.1", + "from": "https://registry.npmjs.org/ws/-/ws-1.0.1.tgz", "resolved": "https://registry.npmjs.org/ws/-/ws-1.0.1.tgz", "dependencies": { "options": { "version": "0.0.6", - "from": "options@>=0.0.5", + "from": "https://registry.npmjs.org/options/-/options-0.0.6.tgz", "resolved": "https://registry.npmjs.org/options/-/options-0.0.6.tgz" }, "ultron": { "version": "1.0.2", - "from": "ultron@>=1.0.0 <1.1.0", + "from": "https://registry.npmjs.org/ultron/-/ultron-1.0.2.tgz", "resolved": "https://registry.npmjs.org/ultron/-/ultron-1.0.2.tgz" } } }, "xmlhttprequest-ssl": { "version": "1.5.1", - "from": "xmlhttprequest-ssl@1.5.1", + "from": "https://registry.npmjs.org/xmlhttprequest-ssl/-/xmlhttprequest-ssl-1.5.1.tgz", "resolved": "https://registry.npmjs.org/xmlhttprequest-ssl/-/xmlhttprequest-ssl-1.5.1.tgz" }, "component-emitter": { "version": "1.1.2", - "from": "component-emitter@1.1.2", + "from": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.1.2.tgz", "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.1.2.tgz" }, "engine.io-parser": { "version": "1.2.4", - "from": "engine.io-parser@1.2.4", + "from": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-1.2.4.tgz", "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-1.2.4.tgz", "dependencies": { "after": { "version": "0.8.1", - "from": "after@0.8.1", + "from": "https://registry.npmjs.org/after/-/after-0.8.1.tgz", "resolved": "https://registry.npmjs.org/after/-/after-0.8.1.tgz" }, "arraybuffer.slice": { "version": "0.0.6", - "from": "arraybuffer.slice@0.0.6", + "from": "https://registry.npmjs.org/arraybuffer.slice/-/arraybuffer.slice-0.0.6.tgz", "resolved": "https://registry.npmjs.org/arraybuffer.slice/-/arraybuffer.slice-0.0.6.tgz" }, "base64-arraybuffer": { "version": "0.1.2", - "from": "base64-arraybuffer@0.1.2", + "from": "https://registry.npmjs.org/base64-arraybuffer/-/base64-arraybuffer-0.1.2.tgz", "resolved": "https://registry.npmjs.org/base64-arraybuffer/-/base64-arraybuffer-0.1.2.tgz" }, "blob": { "version": "0.0.4", - "from": "blob@0.0.4", + "from": "https://registry.npmjs.org/blob/-/blob-0.0.4.tgz", "resolved": "https://registry.npmjs.org/blob/-/blob-0.0.4.tgz" }, "has-binary": { "version": "0.1.6", - "from": "has-binary@0.1.6", + "from": "https://registry.npmjs.org/has-binary/-/has-binary-0.1.6.tgz", "resolved": "https://registry.npmjs.org/has-binary/-/has-binary-0.1.6.tgz", "dependencies": { "isarray": { "version": "0.0.1", - "from": "isarray@0.0.1", + "from": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz" } } }, "utf8": { "version": "2.1.0", - "from": "utf8@2.1.0", + "from": "https://registry.npmjs.org/utf8/-/utf8-2.1.0.tgz", "resolved": "https://registry.npmjs.org/utf8/-/utf8-2.1.0.tgz" } } }, "parsejson": { "version": "0.0.1", - "from": "parsejson@0.0.1", + "from": "https://registry.npmjs.org/parsejson/-/parsejson-0.0.1.tgz", "resolved": "https://registry.npmjs.org/parsejson/-/parsejson-0.0.1.tgz", "dependencies": { "better-assert": { "version": "1.0.2", - "from": "better-assert@>=1.0.0 <1.1.0", + "from": "https://registry.npmjs.org/better-assert/-/better-assert-1.0.2.tgz", "resolved": "https://registry.npmjs.org/better-assert/-/better-assert-1.0.2.tgz", "dependencies": { "callsite": { "version": "1.0.0", - "from": "callsite@1.0.0", + "from": "https://registry.npmjs.org/callsite/-/callsite-1.0.0.tgz", "resolved": "https://registry.npmjs.org/callsite/-/callsite-1.0.0.tgz" } } @@ -11815,17 +11720,17 @@ }, "parseqs": { "version": "0.0.2", - "from": "parseqs@0.0.2", + "from": "https://registry.npmjs.org/parseqs/-/parseqs-0.0.2.tgz", "resolved": "https://registry.npmjs.org/parseqs/-/parseqs-0.0.2.tgz", "dependencies": { "better-assert": { "version": "1.0.2", - "from": "better-assert@>=1.0.0 <1.1.0", + "from": "https://registry.npmjs.org/better-assert/-/better-assert-1.0.2.tgz", "resolved": "https://registry.npmjs.org/better-assert/-/better-assert-1.0.2.tgz", "dependencies": { "callsite": { "version": "1.0.0", - "from": "callsite@1.0.0", + "from": "https://registry.npmjs.org/callsite/-/callsite-1.0.0.tgz", "resolved": "https://registry.npmjs.org/callsite/-/callsite-1.0.0.tgz" } } @@ -11834,49 +11739,49 @@ }, "component-inherit": { "version": "0.0.3", - "from": "component-inherit@0.0.3", + "from": "https://registry.npmjs.org/component-inherit/-/component-inherit-0.0.3.tgz", "resolved": "https://registry.npmjs.org/component-inherit/-/component-inherit-0.0.3.tgz" }, "yeast": { "version": "0.1.2", - "from": "yeast@0.1.2", + "from": "https://registry.npmjs.org/yeast/-/yeast-0.1.2.tgz", "resolved": "https://registry.npmjs.org/yeast/-/yeast-0.1.2.tgz" } } }, "component-bind": { "version": "1.0.0", - "from": "component-bind@1.0.0", + "from": "https://registry.npmjs.org/component-bind/-/component-bind-1.0.0.tgz", "resolved": "https://registry.npmjs.org/component-bind/-/component-bind-1.0.0.tgz" }, "component-emitter": { "version": "1.2.0", - "from": "component-emitter@1.2.0", + "from": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.0.tgz", "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.0.tgz" }, "object-component": { "version": "0.0.3", - "from": "object-component@0.0.3", + "from": "https://registry.npmjs.org/object-component/-/object-component-0.0.3.tgz", "resolved": "https://registry.npmjs.org/object-component/-/object-component-0.0.3.tgz" }, "indexof": { "version": "0.0.1", - "from": "indexof@0.0.1", + "from": "https://registry.npmjs.org/indexof/-/indexof-0.0.1.tgz", "resolved": "https://registry.npmjs.org/indexof/-/indexof-0.0.1.tgz" }, "parseuri": { "version": "0.0.4", - "from": "parseuri@0.0.4", + "from": "https://registry.npmjs.org/parseuri/-/parseuri-0.0.4.tgz", "resolved": "https://registry.npmjs.org/parseuri/-/parseuri-0.0.4.tgz", "dependencies": { "better-assert": { "version": "1.0.2", - "from": "better-assert@>=1.0.0 <1.1.0", + "from": "https://registry.npmjs.org/better-assert/-/better-assert-1.0.2.tgz", "resolved": "https://registry.npmjs.org/better-assert/-/better-assert-1.0.2.tgz", "dependencies": { "callsite": { "version": "1.0.0", - "from": "callsite@1.0.0", + "from": "https://registry.npmjs.org/callsite/-/callsite-1.0.0.tgz", "resolved": "https://registry.npmjs.org/callsite/-/callsite-1.0.0.tgz" } } @@ -11885,44 +11790,44 @@ }, "to-array": { "version": "0.1.4", - "from": "to-array@0.1.4", + "from": "https://registry.npmjs.org/to-array/-/to-array-0.1.4.tgz", "resolved": "https://registry.npmjs.org/to-array/-/to-array-0.1.4.tgz" }, "backo2": { "version": "1.0.2", - "from": "backo2@1.0.2", + "from": "https://registry.npmjs.org/backo2/-/backo2-1.0.2.tgz", "resolved": "https://registry.npmjs.org/backo2/-/backo2-1.0.2.tgz" } } }, "socket.io-adapter": { "version": "0.4.0", - "from": "socket.io-adapter@0.4.0", + "from": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-0.4.0.tgz", "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-0.4.0.tgz", "dependencies": { "socket.io-parser": { "version": "2.2.2", - "from": "socket.io-parser@2.2.2", + "from": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-2.2.2.tgz", "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-2.2.2.tgz", "dependencies": { "debug": { "version": "0.7.4", - "from": "debug@0.7.4", + "from": "https://registry.npmjs.org/debug/-/debug-0.7.4.tgz", "resolved": "https://registry.npmjs.org/debug/-/debug-0.7.4.tgz" }, "json3": { "version": "3.2.6", - "from": "json3@3.2.6", + "from": "https://registry.npmjs.org/json3/-/json3-3.2.6.tgz", "resolved": "https://registry.npmjs.org/json3/-/json3-3.2.6.tgz" }, "component-emitter": { "version": "1.1.2", - "from": "component-emitter@1.1.2", + "from": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.1.2.tgz", "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.1.2.tgz" }, "isarray": { "version": "0.0.1", - "from": "isarray@0.0.1", + "from": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz" } } @@ -11931,24 +11836,24 @@ }, "has-binary": { "version": "0.1.7", - "from": "has-binary@0.1.7", + "from": "https://registry.npmjs.org/has-binary/-/has-binary-0.1.7.tgz", "resolved": "https://registry.npmjs.org/has-binary/-/has-binary-0.1.7.tgz", "dependencies": { "isarray": { "version": "0.0.1", - "from": "isarray@0.0.1", + "from": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz" } } }, "debug": { "version": "2.2.0", - "from": "debug@2.2.0", + "from": "https://registry.npmjs.org/debug/-/debug-2.2.0.tgz", "resolved": "https://registry.npmjs.org/debug/-/debug-2.2.0.tgz", "dependencies": { "ms": { "version": "0.7.1", - "from": "ms@0.7.1", + "from": "https://registry.npmjs.org/ms/-/ms-0.7.1.tgz", "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.1.tgz" } } @@ -11957,17 +11862,17 @@ }, "source-map": { "version": "0.5.6", - "from": "source-map@>=0.5.3 <0.6.0", + "from": "https://registry.npmjs.org/source-map/-/source-map-0.5.6.tgz", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.6.tgz" }, "useragent": { "version": "2.1.9", - "from": "useragent@>=2.1.6 <3.0.0", + "from": "https://registry.npmjs.org/useragent/-/useragent-2.1.9.tgz", "resolved": "https://registry.npmjs.org/useragent/-/useragent-2.1.9.tgz", "dependencies": { "lru-cache": { "version": "2.2.4", - "from": "lru-cache@>=2.2.0 <2.3.0", + "from": "https://registry.npmjs.org/lru-cache/-/lru-cache-2.2.4.tgz", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-2.2.4.tgz" } } @@ -11976,91 +11881,91 @@ }, "karma-browserstack-launcher": { "version": "0.1.11", - "from": "karma-browserstack-launcher@>=0.1.8 <0.2.0", + "from": "https://registry.npmjs.org/karma-browserstack-launcher/-/karma-browserstack-launcher-0.1.11.tgz", "resolved": "https://registry.npmjs.org/karma-browserstack-launcher/-/karma-browserstack-launcher-0.1.11.tgz", "dependencies": { "browserstack": { "version": "1.3.1", - "from": "browserstack@1.3.1", + "from": "https://registry.npmjs.org/browserstack/-/browserstack-1.3.1.tgz", "resolved": "https://registry.npmjs.org/browserstack/-/browserstack-1.3.1.tgz" }, "browserstacktunnel-wrapper": { "version": "1.4.2", - "from": "browserstacktunnel-wrapper@>=1.4.2 <1.5.0", + "from": "https://registry.npmjs.org/browserstacktunnel-wrapper/-/browserstacktunnel-wrapper-1.4.2.tgz", "resolved": "https://registry.npmjs.org/browserstacktunnel-wrapper/-/browserstacktunnel-wrapper-1.4.2.tgz", "dependencies": { "unzip": { "version": "0.1.11", - "from": "unzip@>=0.1.9 <0.2.0", + "from": "https://registry.npmjs.org/unzip/-/unzip-0.1.11.tgz", "resolved": "https://registry.npmjs.org/unzip/-/unzip-0.1.11.tgz", "dependencies": { "fstream": { "version": "0.1.31", - "from": "fstream@>=0.1.30 <1.0.0", + "from": "https://registry.npmjs.org/fstream/-/fstream-0.1.31.tgz", "resolved": "https://registry.npmjs.org/fstream/-/fstream-0.1.31.tgz", "dependencies": { "graceful-fs": { "version": "3.0.8", - "from": "graceful-fs@>=3.0.2 <3.1.0", + "from": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-3.0.8.tgz", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-3.0.8.tgz" }, "inherits": { "version": "2.0.1", - "from": "inherits@>=2.0.0 <2.1.0", + "from": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz" }, "mkdirp": { "version": "0.5.1", - "from": "mkdirp@>=0.5.0 <0.6.0", + "from": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", "dependencies": { "minimist": { "version": "0.0.8", - "from": "minimist@0.0.8", + "from": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz" } } }, "rimraf": { "version": "2.5.2", - "from": "rimraf@>=2.0.0 <3.0.0", + "from": "https://registry.npmjs.org/rimraf/-/rimraf-2.5.2.tgz", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.5.2.tgz", "dependencies": { "glob": { "version": "7.0.3", - "from": "glob@>=7.0.0 <8.0.0", + "from": "https://registry.npmjs.org/glob/-/glob-7.0.3.tgz", "resolved": "https://registry.npmjs.org/glob/-/glob-7.0.3.tgz", "dependencies": { "inflight": { "version": "1.0.4", - "from": "inflight@>=1.0.4 <2.0.0", + "from": "https://registry.npmjs.org/inflight/-/inflight-1.0.4.tgz", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.4.tgz", "dependencies": { "wrappy": { "version": "1.0.1", - "from": "wrappy@>=1.0.0 <2.0.0", + "from": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.1.tgz", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.1.tgz" } } }, "minimatch": { "version": "3.0.0", - "from": "minimatch@>=2.0.0 <3.0.0||>=3.0.0 <4.0.0", + "from": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.0.tgz", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.0.tgz", "dependencies": { "brace-expansion": { "version": "1.1.4", - "from": "brace-expansion@>=1.0.0 <2.0.0", + "from": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.4.tgz", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.4.tgz", "dependencies": { "balanced-match": { "version": "0.4.1", - "from": "balanced-match@>=0.4.1 <0.5.0", + "from": "https://registry.npmjs.org/balanced-match/-/balanced-match-0.4.1.tgz", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-0.4.1.tgz" }, "concat-map": { "version": "0.0.1", - "from": "concat-map@0.0.1", + "from": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz" } } @@ -12069,19 +11974,19 @@ }, "once": { "version": "1.3.3", - "from": "once@>=1.3.0 <2.0.0", + "from": "https://registry.npmjs.org/once/-/once-1.3.3.tgz", "resolved": "https://registry.npmjs.org/once/-/once-1.3.3.tgz", "dependencies": { "wrappy": { "version": "1.0.1", - "from": "wrappy@>=1.0.0 <2.0.0", + "from": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.1.tgz", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.1.tgz" } } }, "path-is-absolute": { "version": "1.0.0", - "from": "path-is-absolute@>=1.0.0 <2.0.0", + "from": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.0.tgz", "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.0.tgz" } } @@ -12092,85 +11997,85 @@ }, "pullstream": { "version": "0.4.1", - "from": "pullstream@>=0.4.1 <1.0.0", + "from": "https://registry.npmjs.org/pullstream/-/pullstream-0.4.1.tgz", "resolved": "https://registry.npmjs.org/pullstream/-/pullstream-0.4.1.tgz", "dependencies": { "over": { "version": "0.0.5", - "from": "over@>=0.0.5 <1.0.0", + "from": "https://registry.npmjs.org/over/-/over-0.0.5.tgz", "resolved": "https://registry.npmjs.org/over/-/over-0.0.5.tgz" }, "slice-stream": { "version": "1.0.0", - "from": "slice-stream@>=1.0.0 <2.0.0", + "from": "https://registry.npmjs.org/slice-stream/-/slice-stream-1.0.0.tgz", "resolved": "https://registry.npmjs.org/slice-stream/-/slice-stream-1.0.0.tgz" } } }, "binary": { "version": "0.3.0", - "from": "binary@>=0.3.0 <1.0.0", + "from": "https://registry.npmjs.org/binary/-/binary-0.3.0.tgz", "resolved": "https://registry.npmjs.org/binary/-/binary-0.3.0.tgz", "dependencies": { "chainsaw": { "version": "0.1.0", - "from": "chainsaw@>=0.1.0 <0.2.0", + "from": "https://registry.npmjs.org/chainsaw/-/chainsaw-0.1.0.tgz", "resolved": "https://registry.npmjs.org/chainsaw/-/chainsaw-0.1.0.tgz", "dependencies": { "traverse": { "version": "0.3.9", - "from": "traverse@>=0.3.0 <0.4.0", + "from": "https://registry.npmjs.org/traverse/-/traverse-0.3.9.tgz", "resolved": "https://registry.npmjs.org/traverse/-/traverse-0.3.9.tgz" } } }, "buffers": { "version": "0.1.1", - "from": "buffers@>=0.1.1 <0.2.0", + "from": "https://registry.npmjs.org/buffers/-/buffers-0.1.1.tgz", "resolved": "https://registry.npmjs.org/buffers/-/buffers-0.1.1.tgz" } } }, "readable-stream": { "version": "1.0.34", - "from": "readable-stream@>=1.0.31 <1.1.0", + "from": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", "dependencies": { "core-util-is": { "version": "1.0.2", - "from": "core-util-is@>=1.0.0 <1.1.0", + "from": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz" }, "isarray": { "version": "0.0.1", - "from": "isarray@0.0.1", + "from": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz" }, "string_decoder": { "version": "0.10.31", - "from": "string_decoder@>=0.10.0 <0.11.0", + "from": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz" }, "inherits": { "version": "2.0.1", - "from": "inherits@>=2.0.1 <3.0.0", + "from": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz" } } }, "setimmediate": { "version": "1.0.4", - "from": "setimmediate@>=1.0.1 <2.0.0", + "from": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.4.tgz", "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.4.tgz" }, "match-stream": { "version": "0.0.2", - "from": "match-stream@>=0.0.2 <1.0.0", + "from": "https://registry.npmjs.org/match-stream/-/match-stream-0.0.2.tgz", "resolved": "https://registry.npmjs.org/match-stream/-/match-stream-0.0.2.tgz", "dependencies": { "buffers": { "version": "0.1.1", - "from": "buffers@>=0.1.1 <0.2.0", + "from": "https://registry.npmjs.org/buffers/-/buffers-0.1.1.tgz", "resolved": "https://registry.npmjs.org/buffers/-/buffers-0.1.1.tgz" } } @@ -12181,48 +12086,48 @@ }, "q": { "version": "1.4.1", - "from": "q@>=1.4.1 <1.5.0", + "from": "https://registry.npmjs.org/q/-/q-1.4.1.tgz", "resolved": "https://registry.npmjs.org/q/-/q-1.4.1.tgz" } } }, "karma-chrome-launcher": { "version": "0.2.3", - "from": "karma-chrome-launcher@>=0.2.2 <0.3.0", + "from": "https://registry.npmjs.org/karma-chrome-launcher/-/karma-chrome-launcher-0.2.3.tgz", "resolved": "https://registry.npmjs.org/karma-chrome-launcher/-/karma-chrome-launcher-0.2.3.tgz", "dependencies": { "fs-access": { "version": "1.0.0", - "from": "fs-access@>=1.0.0 <2.0.0", + "from": "https://registry.npmjs.org/fs-access/-/fs-access-1.0.0.tgz", "resolved": "https://registry.npmjs.org/fs-access/-/fs-access-1.0.0.tgz", "dependencies": { "null-check": { "version": "1.0.0", - "from": "null-check@>=1.0.0 <2.0.0", + "from": "https://registry.npmjs.org/null-check/-/null-check-1.0.0.tgz", "resolved": "https://registry.npmjs.org/null-check/-/null-check-1.0.0.tgz" } } }, "which": { "version": "1.2.8", - "from": "which@>=1.2.1 <2.0.0", + "from": "https://registry.npmjs.org/which/-/which-1.2.8.tgz", "resolved": "https://registry.npmjs.org/which/-/which-1.2.8.tgz", "dependencies": { "is-absolute": { "version": "0.1.7", - "from": "is-absolute@>=0.1.7 <0.2.0", + "from": "https://registry.npmjs.org/is-absolute/-/is-absolute-0.1.7.tgz", "resolved": "https://registry.npmjs.org/is-absolute/-/is-absolute-0.1.7.tgz", "dependencies": { "is-relative": { "version": "0.1.3", - "from": "is-relative@>=0.1.0 <0.2.0", + "from": "https://registry.npmjs.org/is-relative/-/is-relative-0.1.3.tgz", "resolved": "https://registry.npmjs.org/is-relative/-/is-relative-0.1.3.tgz" } } }, "isexe": { "version": "1.1.2", - "from": "isexe@>=1.1.1 <2.0.0", + "from": "https://registry.npmjs.org/isexe/-/isexe-1.1.2.tgz", "resolved": "https://registry.npmjs.org/isexe/-/isexe-1.1.2.tgz" } } @@ -12231,27 +12136,27 @@ }, "karma-firefox-launcher": { "version": "0.1.7", - "from": "karma-firefox-launcher@>=0.1.7 <0.2.0", + "from": "https://registry.npmjs.org/karma-firefox-launcher/-/karma-firefox-launcher-0.1.7.tgz", "resolved": "https://registry.npmjs.org/karma-firefox-launcher/-/karma-firefox-launcher-0.1.7.tgz" }, "karma-jasmine": { "version": "0.3.8", - "from": "karma-jasmine@>=0.3.7 <0.4.0", + "from": "https://registry.npmjs.org/karma-jasmine/-/karma-jasmine-0.3.8.tgz", "resolved": "https://registry.npmjs.org/karma-jasmine/-/karma-jasmine-0.3.8.tgz" }, "karma-junit-reporter": { "version": "0.3.8", - "from": "karma-junit-reporter@>=0.3.8 <0.4.0", + "from": "https://registry.npmjs.org/karma-junit-reporter/-/karma-junit-reporter-0.3.8.tgz", "resolved": "https://registry.npmjs.org/karma-junit-reporter/-/karma-junit-reporter-0.3.8.tgz", "dependencies": { "xmlbuilder": { "version": "3.1.0", - "from": "xmlbuilder@3.1.0", + "from": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-3.1.0.tgz", "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-3.1.0.tgz", "dependencies": { "lodash": { "version": "3.10.1", - "from": "lodash@3.10.1", + "from": "https://registry.npmjs.org/lodash/-/lodash-3.10.1.tgz", "resolved": "https://registry.npmjs.org/lodash/-/lodash-3.10.1.tgz" } } @@ -12260,84 +12165,84 @@ }, "karma-ng-scenario": { "version": "0.1.0", - "from": "karma-ng-scenario@>=0.1.0 <0.2.0", + "from": "https://registry.npmjs.org/karma-ng-scenario/-/karma-ng-scenario-0.1.0.tgz", "resolved": "https://registry.npmjs.org/karma-ng-scenario/-/karma-ng-scenario-0.1.0.tgz" }, "karma-sauce-launcher": { "version": "0.3.1", - "from": "karma-sauce-launcher@>=0.3.0 <0.4.0", + "from": "https://registry.npmjs.org/karma-sauce-launcher/-/karma-sauce-launcher-0.3.1.tgz", "resolved": "https://registry.npmjs.org/karma-sauce-launcher/-/karma-sauce-launcher-0.3.1.tgz", "dependencies": { "q": { "version": "1.4.1", - "from": "q@>=1.4.1 <2.0.0", + "from": "https://registry.npmjs.org/q/-/q-1.4.1.tgz", "resolved": "https://registry.npmjs.org/q/-/q-1.4.1.tgz" }, "sauce-connect-launcher": { "version": "0.13.0", - "from": "sauce-connect-launcher@>=0.13.0 <0.14.0", + "from": "https://registry.npmjs.org/sauce-connect-launcher/-/sauce-connect-launcher-0.13.0.tgz", "resolved": "https://registry.npmjs.org/sauce-connect-launcher/-/sauce-connect-launcher-0.13.0.tgz", "dependencies": { "lodash": { "version": "3.10.1", - "from": "lodash@3.10.1", + "from": "https://registry.npmjs.org/lodash/-/lodash-3.10.1.tgz", "resolved": "https://registry.npmjs.org/lodash/-/lodash-3.10.1.tgz" }, "async": { "version": "1.4.0", - "from": "async@1.4.0", + "from": "https://registry.npmjs.org/async/-/async-1.4.0.tgz", "resolved": "https://registry.npmjs.org/async/-/async-1.4.0.tgz" }, "adm-zip": { "version": "0.4.7", - "from": "adm-zip@>=0.4.3 <0.5.0", + "from": "https://registry.npmjs.org/adm-zip/-/adm-zip-0.4.7.tgz", "resolved": "https://registry.npmjs.org/adm-zip/-/adm-zip-0.4.7.tgz" }, "rimraf": { "version": "2.4.3", - "from": "rimraf@2.4.3", + "from": "https://registry.npmjs.org/rimraf/-/rimraf-2.4.3.tgz", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.4.3.tgz", "dependencies": { "glob": { "version": "5.0.15", - "from": "glob@>=5.0.14 <6.0.0", + "from": "https://registry.npmjs.org/glob/-/glob-5.0.15.tgz", "resolved": "https://registry.npmjs.org/glob/-/glob-5.0.15.tgz", "dependencies": { "inflight": { "version": "1.0.4", - "from": "inflight@>=1.0.4 <2.0.0", + "from": "https://registry.npmjs.org/inflight/-/inflight-1.0.4.tgz", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.4.tgz", "dependencies": { "wrappy": { "version": "1.0.1", - "from": "wrappy@>=1.0.0 <2.0.0", + "from": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.1.tgz", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.1.tgz" } } }, "inherits": { "version": "2.0.1", - "from": "inherits@>=2.0.0 <3.0.0", + "from": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz" }, "minimatch": { "version": "3.0.0", - "from": "minimatch@>=2.0.0 <3.0.0||>=3.0.0 <4.0.0", + "from": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.0.tgz", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.0.tgz", "dependencies": { "brace-expansion": { "version": "1.1.4", - "from": "brace-expansion@>=1.0.0 <2.0.0", + "from": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.4.tgz", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.4.tgz", "dependencies": { "balanced-match": { "version": "0.4.1", - "from": "balanced-match@>=0.4.1 <0.5.0", + "from": "https://registry.npmjs.org/balanced-match/-/balanced-match-0.4.1.tgz", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-0.4.1.tgz" }, "concat-map": { "version": "0.0.1", - "from": "concat-map@0.0.1", + "from": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz" } } @@ -12346,19 +12251,19 @@ }, "once": { "version": "1.3.3", - "from": "once@>=1.3.0 <2.0.0", + "from": "https://registry.npmjs.org/once/-/once-1.3.3.tgz", "resolved": "https://registry.npmjs.org/once/-/once-1.3.3.tgz", "dependencies": { "wrappy": { "version": "1.0.1", - "from": "wrappy@>=1.0.0 <2.0.0", + "from": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.1.tgz", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.1.tgz" } } }, "path-is-absolute": { "version": "1.0.0", - "from": "path-is-absolute@>=1.0.0 <2.0.0", + "from": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.0.tgz", "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.0.tgz" } } @@ -12369,41 +12274,41 @@ }, "saucelabs": { "version": "1.2.0", - "from": "saucelabs@>=1.0.1 <2.0.0", + "from": "https://registry.npmjs.org/saucelabs/-/saucelabs-1.2.0.tgz", "resolved": "https://registry.npmjs.org/saucelabs/-/saucelabs-1.2.0.tgz", "dependencies": { "https-proxy-agent": { "version": "1.0.0", - "from": "https-proxy-agent@>=1.0.0 <2.0.0", + "from": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-1.0.0.tgz", "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-1.0.0.tgz", "dependencies": { "agent-base": { "version": "2.0.1", - "from": "agent-base@>=2.0.0 <3.0.0", + "from": "https://registry.npmjs.org/agent-base/-/agent-base-2.0.1.tgz", "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-2.0.1.tgz", "dependencies": { "semver": { "version": "5.0.3", - "from": "semver@>=5.0.1 <5.1.0", + "from": "https://registry.npmjs.org/semver/-/semver-5.0.3.tgz", "resolved": "https://registry.npmjs.org/semver/-/semver-5.0.3.tgz" } } }, "debug": { "version": "2.2.0", - "from": "debug@>=2.0.0 <3.0.0", + "from": "https://registry.npmjs.org/debug/-/debug-2.2.0.tgz", "resolved": "https://registry.npmjs.org/debug/-/debug-2.2.0.tgz", "dependencies": { "ms": { "version": "0.7.1", - "from": "ms@0.7.1", + "from": "https://registry.npmjs.org/ms/-/ms-0.7.1.tgz", "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.1.tgz" } } }, "extend": { "version": "3.0.0", - "from": "extend@>=3.0.0 <4.0.0", + "from": "https://registry.npmjs.org/extend/-/extend-3.0.0.tgz", "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.0.tgz" } } @@ -12412,64 +12317,64 @@ }, "wd": { "version": "0.3.12", - "from": "wd@>=0.3.4 <0.4.0", + "from": "https://registry.npmjs.org/wd/-/wd-0.3.12.tgz", "resolved": "https://registry.npmjs.org/wd/-/wd-0.3.12.tgz", "dependencies": { "archiver": { "version": "0.14.4", - "from": "archiver@>=0.14.0 <0.15.0", + "from": "https://registry.npmjs.org/archiver/-/archiver-0.14.4.tgz", "resolved": "https://registry.npmjs.org/archiver/-/archiver-0.14.4.tgz", "dependencies": { "async": { "version": "0.9.2", - "from": "async@>=0.9.0 <0.10.0", + "from": "https://registry.npmjs.org/async/-/async-0.9.2.tgz", "resolved": "https://registry.npmjs.org/async/-/async-0.9.2.tgz" }, "buffer-crc32": { "version": "0.2.5", - "from": "buffer-crc32@>=0.2.1 <0.3.0", + "from": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.5.tgz", "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.5.tgz" }, "glob": { "version": "4.3.5", - "from": "glob@>=4.3.0 <4.4.0", + "from": "https://registry.npmjs.org/glob/-/glob-4.3.5.tgz", "resolved": "https://registry.npmjs.org/glob/-/glob-4.3.5.tgz", "dependencies": { "inflight": { "version": "1.0.4", - "from": "inflight@>=1.0.4 <2.0.0", + "from": "https://registry.npmjs.org/inflight/-/inflight-1.0.4.tgz", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.4.tgz", "dependencies": { "wrappy": { "version": "1.0.1", - "from": "wrappy@>=1.0.0 <2.0.0", + "from": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.1.tgz", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.1.tgz" } } }, "inherits": { "version": "2.0.1", - "from": "inherits@>=2.0.0 <3.0.0", + "from": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz" }, "minimatch": { "version": "2.0.10", - "from": "minimatch@>=2.0.1 <3.0.0", + "from": "https://registry.npmjs.org/minimatch/-/minimatch-2.0.10.tgz", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-2.0.10.tgz", "dependencies": { "brace-expansion": { "version": "1.1.4", - "from": "brace-expansion@>=1.0.0 <2.0.0", + "from": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.4.tgz", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.4.tgz", "dependencies": { "balanced-match": { "version": "0.4.1", - "from": "balanced-match@>=0.4.1 <0.5.0", + "from": "https://registry.npmjs.org/balanced-match/-/balanced-match-0.4.1.tgz", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-0.4.1.tgz" }, "concat-map": { "version": "0.0.1", - "from": "concat-map@0.0.1", + "from": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz" } } @@ -12478,12 +12383,12 @@ }, "once": { "version": "1.3.3", - "from": "once@>=1.3.0 <2.0.0", + "from": "https://registry.npmjs.org/once/-/once-1.3.3.tgz", "resolved": "https://registry.npmjs.org/once/-/once-1.3.3.tgz", "dependencies": { "wrappy": { "version": "1.0.1", - "from": "wrappy@>=1.0.0 <2.0.0", + "from": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.1.tgz", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.1.tgz" } } @@ -12492,64 +12397,64 @@ }, "lazystream": { "version": "0.1.0", - "from": "lazystream@>=0.1.0 <0.2.0", + "from": "https://registry.npmjs.org/lazystream/-/lazystream-0.1.0.tgz", "resolved": "https://registry.npmjs.org/lazystream/-/lazystream-0.1.0.tgz" }, "lodash": { "version": "3.2.0", - "from": "lodash@>=3.2.0 <3.3.0", + "from": "https://registry.npmjs.org/lodash/-/lodash-3.2.0.tgz", "resolved": "https://registry.npmjs.org/lodash/-/lodash-3.2.0.tgz" }, "readable-stream": { "version": "1.0.34", - "from": "readable-stream@>=1.0.26 <1.1.0", + "from": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", "dependencies": { "core-util-is": { "version": "1.0.2", - "from": "core-util-is@>=1.0.0 <1.1.0", + "from": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz" }, "isarray": { "version": "0.0.1", - "from": "isarray@0.0.1", + "from": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz" }, "string_decoder": { "version": "0.10.31", - "from": "string_decoder@>=0.10.0 <0.11.0", + "from": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz" }, "inherits": { "version": "2.0.1", - "from": "inherits@>=2.0.1 <2.1.0", + "from": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz" } } }, "tar-stream": { "version": "1.1.5", - "from": "tar-stream@>=1.1.0 <1.2.0", + "from": "https://registry.npmjs.org/tar-stream/-/tar-stream-1.1.5.tgz", "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-1.1.5.tgz", "dependencies": { "bl": { "version": "0.9.5", - "from": "bl@>=0.9.0 <0.10.0", + "from": "https://registry.npmjs.org/bl/-/bl-0.9.5.tgz", "resolved": "https://registry.npmjs.org/bl/-/bl-0.9.5.tgz" }, "end-of-stream": { "version": "1.1.0", - "from": "end-of-stream@>=1.0.0 <2.0.0", + "from": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.1.0.tgz", "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.1.0.tgz", "dependencies": { "once": { "version": "1.3.3", - "from": "once@>=1.3.0 <1.4.0", + "from": "https://registry.npmjs.org/once/-/once-1.3.3.tgz", "resolved": "https://registry.npmjs.org/once/-/once-1.3.3.tgz", "dependencies": { "wrappy": { "version": "1.0.1", - "from": "wrappy@>=1.0.0 <2.0.0", + "from": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.1.tgz", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.1.tgz" } } @@ -12558,29 +12463,29 @@ }, "xtend": { "version": "4.0.1", - "from": "xtend@>=4.0.0 <5.0.0", + "from": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz" } } }, "zip-stream": { "version": "0.5.2", - "from": "zip-stream@>=0.5.0 <0.6.0", + "from": "https://registry.npmjs.org/zip-stream/-/zip-stream-0.5.2.tgz", "resolved": "https://registry.npmjs.org/zip-stream/-/zip-stream-0.5.2.tgz", "dependencies": { "compress-commons": { "version": "0.2.9", - "from": "compress-commons@>=0.2.0 <0.3.0", + "from": "https://registry.npmjs.org/compress-commons/-/compress-commons-0.2.9.tgz", "resolved": "https://registry.npmjs.org/compress-commons/-/compress-commons-0.2.9.tgz", "dependencies": { "crc32-stream": { "version": "0.3.4", - "from": "crc32-stream@>=0.3.1 <0.4.0", + "from": "https://registry.npmjs.org/crc32-stream/-/crc32-stream-0.3.4.tgz", "resolved": "https://registry.npmjs.org/crc32-stream/-/crc32-stream-0.3.4.tgz" }, "node-int64": { "version": "0.3.3", - "from": "node-int64@>=0.3.0 <0.4.0", + "from": "https://registry.npmjs.org/node-int64/-/node-int64-0.3.3.tgz", "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.3.3.tgz" } } @@ -12591,47 +12496,47 @@ }, "async": { "version": "1.0.0", - "from": "async@>=1.0.0 <1.1.0", + "from": "https://registry.npmjs.org/async/-/async-1.0.0.tgz", "resolved": "https://registry.npmjs.org/async/-/async-1.0.0.tgz" }, "lodash": { "version": "3.9.3", - "from": "lodash@>=3.9.3 <3.10.0", + "from": "https://registry.npmjs.org/lodash/-/lodash-3.9.3.tgz", "resolved": "https://registry.npmjs.org/lodash/-/lodash-3.9.3.tgz" }, "request": { "version": "2.55.0", - "from": "request@>=2.55.0 <2.56.0", + "from": "https://registry.npmjs.org/request/-/request-2.55.0.tgz", "resolved": "https://registry.npmjs.org/request/-/request-2.55.0.tgz", "dependencies": { "bl": { "version": "0.9.5", - "from": "bl@>=0.9.0 <0.10.0", + "from": "https://registry.npmjs.org/bl/-/bl-0.9.5.tgz", "resolved": "https://registry.npmjs.org/bl/-/bl-0.9.5.tgz", "dependencies": { "readable-stream": { "version": "1.0.34", - "from": "readable-stream@>=1.0.26 <1.1.0", + "from": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", "dependencies": { "core-util-is": { "version": "1.0.2", - "from": "core-util-is@>=1.0.0 <1.1.0", + "from": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz" }, "isarray": { "version": "0.0.1", - "from": "isarray@0.0.1", + "from": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz" }, "string_decoder": { "version": "0.10.31", - "from": "string_decoder@>=0.10.0 <0.11.0", + "from": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz" }, "inherits": { "version": "2.0.1", - "from": "inherits@>=2.0.1 <2.1.0", + "from": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz" } } @@ -12640,242 +12545,242 @@ }, "caseless": { "version": "0.9.0", - "from": "caseless@>=0.9.0 <0.10.0", + "from": "https://registry.npmjs.org/caseless/-/caseless-0.9.0.tgz", "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.9.0.tgz" }, "forever-agent": { "version": "0.6.1", - "from": "forever-agent@>=0.6.0 <0.7.0", + "from": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz" }, "form-data": { "version": "0.2.0", - "from": "form-data@>=0.2.0 <0.3.0", + "from": "https://registry.npmjs.org/form-data/-/form-data-0.2.0.tgz", "resolved": "https://registry.npmjs.org/form-data/-/form-data-0.2.0.tgz", "dependencies": { "async": { "version": "0.9.2", - "from": "async@>=0.9.0 <0.10.0", + "from": "https://registry.npmjs.org/async/-/async-0.9.2.tgz", "resolved": "https://registry.npmjs.org/async/-/async-0.9.2.tgz" } } }, "json-stringify-safe": { "version": "5.0.1", - "from": "json-stringify-safe@>=5.0.0 <5.1.0", + "from": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz" }, "mime-types": { "version": "2.0.14", - "from": "mime-types@>=2.0.1 <2.1.0", + "from": "https://registry.npmjs.org/mime-types/-/mime-types-2.0.14.tgz", "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.0.14.tgz", "dependencies": { "mime-db": { "version": "1.12.0", - "from": "mime-db@>=1.12.0 <1.13.0", + "from": "https://registry.npmjs.org/mime-db/-/mime-db-1.12.0.tgz", "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.12.0.tgz" } } }, "node-uuid": { "version": "1.4.7", - "from": "node-uuid@>=1.4.0 <1.5.0", + "from": "https://registry.npmjs.org/node-uuid/-/node-uuid-1.4.7.tgz", "resolved": "https://registry.npmjs.org/node-uuid/-/node-uuid-1.4.7.tgz" }, "qs": { "version": "2.4.2", - "from": "qs@>=2.4.0 <2.5.0", + "from": "https://registry.npmjs.org/qs/-/qs-2.4.2.tgz", "resolved": "https://registry.npmjs.org/qs/-/qs-2.4.2.tgz" }, "tunnel-agent": { "version": "0.4.3", - "from": "tunnel-agent@>=0.4.0 <0.5.0", + "from": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.4.3.tgz", "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.4.3.tgz" }, "tough-cookie": { "version": "2.2.2", - "from": "tough-cookie@>=0.12.0", + "from": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.2.2.tgz", "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.2.2.tgz" }, "http-signature": { "version": "0.10.1", - "from": "http-signature@>=0.10.0 <0.11.0", + "from": "https://registry.npmjs.org/http-signature/-/http-signature-0.10.1.tgz", "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-0.10.1.tgz", "dependencies": { "assert-plus": { "version": "0.1.5", - "from": "assert-plus@>=0.1.5 <0.2.0", + "from": "https://registry.npmjs.org/assert-plus/-/assert-plus-0.1.5.tgz", "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-0.1.5.tgz" }, "asn1": { "version": "0.1.11", - "from": "asn1@0.1.11", + "from": "https://registry.npmjs.org/asn1/-/asn1-0.1.11.tgz", "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.1.11.tgz" }, "ctype": { "version": "0.5.3", - "from": "ctype@0.5.3", + "from": "https://registry.npmjs.org/ctype/-/ctype-0.5.3.tgz", "resolved": "https://registry.npmjs.org/ctype/-/ctype-0.5.3.tgz" } } }, "oauth-sign": { "version": "0.6.0", - "from": "oauth-sign@>=0.6.0 <0.7.0", + "from": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.6.0.tgz", "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.6.0.tgz" }, "hawk": { "version": "2.3.1", - "from": "hawk@>=2.3.0 <2.4.0", + "from": "https://registry.npmjs.org/hawk/-/hawk-2.3.1.tgz", "resolved": "https://registry.npmjs.org/hawk/-/hawk-2.3.1.tgz", "dependencies": { "hoek": { "version": "2.16.3", - "from": "hoek@>=2.0.0 <3.0.0", + "from": "https://registry.npmjs.org/hoek/-/hoek-2.16.3.tgz", "resolved": "https://registry.npmjs.org/hoek/-/hoek-2.16.3.tgz" }, "boom": { "version": "2.10.1", - "from": "boom@>=2.0.0 <3.0.0", + "from": "https://registry.npmjs.org/boom/-/boom-2.10.1.tgz", "resolved": "https://registry.npmjs.org/boom/-/boom-2.10.1.tgz" }, "cryptiles": { "version": "2.0.5", - "from": "cryptiles@>=2.0.0 <3.0.0", + "from": "https://registry.npmjs.org/cryptiles/-/cryptiles-2.0.5.tgz", "resolved": "https://registry.npmjs.org/cryptiles/-/cryptiles-2.0.5.tgz" }, "sntp": { "version": "1.0.9", - "from": "sntp@>=1.0.0 <2.0.0", + "from": "https://registry.npmjs.org/sntp/-/sntp-1.0.9.tgz", "resolved": "https://registry.npmjs.org/sntp/-/sntp-1.0.9.tgz" } } }, "aws-sign2": { "version": "0.5.0", - "from": "aws-sign2@>=0.5.0 <0.6.0", + "from": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.5.0.tgz", "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.5.0.tgz" }, "stringstream": { "version": "0.0.5", - "from": "stringstream@>=0.0.4 <0.1.0", + "from": "https://registry.npmjs.org/stringstream/-/stringstream-0.0.5.tgz", "resolved": "https://registry.npmjs.org/stringstream/-/stringstream-0.0.5.tgz" }, "combined-stream": { "version": "0.0.7", - "from": "combined-stream@>=0.0.5 <0.1.0", + "from": "https://registry.npmjs.org/combined-stream/-/combined-stream-0.0.7.tgz", "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-0.0.7.tgz", "dependencies": { "delayed-stream": { "version": "0.0.5", - "from": "delayed-stream@0.0.5", + "from": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-0.0.5.tgz", "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-0.0.5.tgz" } } }, "isstream": { "version": "0.1.2", - "from": "isstream@>=0.1.1 <0.2.0", + "from": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz" }, "har-validator": { "version": "1.8.0", - "from": "har-validator@>=1.4.0 <2.0.0", + "from": "https://registry.npmjs.org/har-validator/-/har-validator-1.8.0.tgz", "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-1.8.0.tgz", "dependencies": { "bluebird": { "version": "2.10.2", - "from": "bluebird@>=2.9.30 <3.0.0", + "from": "https://registry.npmjs.org/bluebird/-/bluebird-2.10.2.tgz", "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-2.10.2.tgz" }, "chalk": { "version": "1.1.3", - "from": "chalk@>=1.0.0 <2.0.0", + "from": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", "dependencies": { "ansi-styles": { "version": "2.2.1", - "from": "ansi-styles@>=2.2.1 <3.0.0", + "from": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz" }, "escape-string-regexp": { "version": "1.0.5", - "from": "escape-string-regexp@>=1.0.2 <2.0.0", + "from": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz" }, "has-ansi": { "version": "2.0.0", - "from": "has-ansi@>=2.0.0 <3.0.0", + "from": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", "dependencies": { "ansi-regex": { "version": "2.0.0", - "from": "ansi-regex@>=2.0.0 <3.0.0", + "from": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.0.0.tgz", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.0.0.tgz" } } }, "strip-ansi": { "version": "3.0.1", - "from": "strip-ansi@>=3.0.0 <4.0.0", + "from": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", "dependencies": { "ansi-regex": { "version": "2.0.0", - "from": "ansi-regex@>=2.0.0 <3.0.0", + "from": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.0.0.tgz", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.0.0.tgz" } } }, "supports-color": { "version": "2.0.0", - "from": "supports-color@>=2.0.0 <3.0.0", + "from": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz" } } }, "commander": { "version": "2.9.0", - "from": "commander@>=2.8.1 <3.0.0", + "from": "https://registry.npmjs.org/commander/-/commander-2.9.0.tgz", "resolved": "https://registry.npmjs.org/commander/-/commander-2.9.0.tgz", "dependencies": { "graceful-readlink": { "version": "1.0.1", - "from": "graceful-readlink@>=1.0.0", + "from": "https://registry.npmjs.org/graceful-readlink/-/graceful-readlink-1.0.1.tgz", "resolved": "https://registry.npmjs.org/graceful-readlink/-/graceful-readlink-1.0.1.tgz" } } }, "is-my-json-valid": { "version": "2.13.1", - "from": "is-my-json-valid@>=2.12.0 <3.0.0", + "from": "https://registry.npmjs.org/is-my-json-valid/-/is-my-json-valid-2.13.1.tgz", "resolved": "https://registry.npmjs.org/is-my-json-valid/-/is-my-json-valid-2.13.1.tgz", "dependencies": { "generate-function": { "version": "2.0.0", - "from": "generate-function@>=2.0.0 <3.0.0", + "from": "https://registry.npmjs.org/generate-function/-/generate-function-2.0.0.tgz", "resolved": "https://registry.npmjs.org/generate-function/-/generate-function-2.0.0.tgz" }, "generate-object-property": { "version": "1.2.0", - "from": "generate-object-property@>=1.1.0 <2.0.0", + "from": "https://registry.npmjs.org/generate-object-property/-/generate-object-property-1.2.0.tgz", "resolved": "https://registry.npmjs.org/generate-object-property/-/generate-object-property-1.2.0.tgz", "dependencies": { "is-property": { "version": "1.0.2", - "from": "is-property@>=1.0.0 <2.0.0", + "from": "https://registry.npmjs.org/is-property/-/is-property-1.0.2.tgz", "resolved": "https://registry.npmjs.org/is-property/-/is-property-1.0.2.tgz" } } }, "jsonpointer": { "version": "2.0.0", - "from": "jsonpointer@2.0.0", + "from": "https://registry.npmjs.org/jsonpointer/-/jsonpointer-2.0.0.tgz", "resolved": "https://registry.npmjs.org/jsonpointer/-/jsonpointer-2.0.0.tgz" }, "xtend": { "version": "4.0.1", - "from": "xtend@>=4.0.0 <5.0.0", + "from": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz" } } @@ -12886,12 +12791,12 @@ }, "underscore.string": { "version": "3.0.3", - "from": "underscore.string@>=3.0.3 <3.1.0", + "from": "https://registry.npmjs.org/underscore.string/-/underscore.string-3.0.3.tgz", "resolved": "https://registry.npmjs.org/underscore.string/-/underscore.string-3.0.3.tgz" }, "vargs": { "version": "0.1.0", - "from": "vargs@>=0.1.0 <0.2.0", + "from": "https://registry.npmjs.org/vargs/-/vargs-0.1.0.tgz", "resolved": "https://registry.npmjs.org/vargs/-/vargs-0.1.0.tgz" } } @@ -12900,42 +12805,42 @@ }, "karma-script-launcher": { "version": "0.1.0", - "from": "karma-script-launcher@>=0.1.0 <0.2.0", + "from": "https://registry.npmjs.org/karma-script-launcher/-/karma-script-launcher-0.1.0.tgz", "resolved": "https://registry.npmjs.org/karma-script-launcher/-/karma-script-launcher-0.1.0.tgz" }, "load-grunt-tasks": { "version": "0.6.0", - "from": "load-grunt-tasks@>=0.6.0 <0.7.0", + "from": "https://registry.npmjs.org/load-grunt-tasks/-/load-grunt-tasks-0.6.0.tgz", "resolved": "https://registry.npmjs.org/load-grunt-tasks/-/load-grunt-tasks-0.6.0.tgz", "dependencies": { "findup-sync": { "version": "0.1.3", - "from": "findup-sync@>=0.1.2 <0.2.0", + "from": "https://registry.npmjs.org/findup-sync/-/findup-sync-0.1.3.tgz", "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-0.1.3.tgz", "dependencies": { "glob": { "version": "3.2.11", - "from": "glob@>=3.2.9 <3.3.0", + "from": "https://registry.npmjs.org/glob/-/glob-3.2.11.tgz", "resolved": "https://registry.npmjs.org/glob/-/glob-3.2.11.tgz", "dependencies": { "inherits": { "version": "2.0.1", - "from": "inherits@>=2.0.0 <3.0.0", + "from": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz" }, "minimatch": { "version": "0.3.0", - "from": "minimatch@>=0.3.0 <0.4.0", + "from": "https://registry.npmjs.org/minimatch/-/minimatch-0.3.0.tgz", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-0.3.0.tgz", "dependencies": { "lru-cache": { "version": "2.7.3", - "from": "lru-cache@>=2.0.0 <3.0.0", + "from": "https://registry.npmjs.org/lru-cache/-/lru-cache-2.7.3.tgz", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-2.7.3.tgz" }, "sigmund": { "version": "1.0.1", - "from": "sigmund@>=1.0.0 <1.1.0", + "from": "https://registry.npmjs.org/sigmund/-/sigmund-1.0.1.tgz", "resolved": "https://registry.npmjs.org/sigmund/-/sigmund-1.0.1.tgz" } } @@ -12946,39 +12851,39 @@ }, "multimatch": { "version": "0.3.0", - "from": "multimatch@>=0.3.0 <0.4.0", + "from": "https://registry.npmjs.org/multimatch/-/multimatch-0.3.0.tgz", "resolved": "https://registry.npmjs.org/multimatch/-/multimatch-0.3.0.tgz", "dependencies": { "array-differ": { "version": "0.1.0", - "from": "array-differ@>=0.1.0 <0.2.0", + "from": "https://registry.npmjs.org/array-differ/-/array-differ-0.1.0.tgz", "resolved": "https://registry.npmjs.org/array-differ/-/array-differ-0.1.0.tgz" }, "array-union": { "version": "0.1.0", - "from": "array-union@>=0.1.0 <0.2.0", + "from": "https://registry.npmjs.org/array-union/-/array-union-0.1.0.tgz", "resolved": "https://registry.npmjs.org/array-union/-/array-union-0.1.0.tgz", "dependencies": { "array-uniq": { "version": "0.1.1", - "from": "array-uniq@>=0.1.0 <0.2.0", + "from": "https://registry.npmjs.org/array-uniq/-/array-uniq-0.1.1.tgz", "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-0.1.1.tgz" } } }, "minimatch": { "version": "0.3.0", - "from": "minimatch@>=0.3.0 <0.4.0", + "from": "https://registry.npmjs.org/minimatch/-/minimatch-0.3.0.tgz", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-0.3.0.tgz", "dependencies": { "lru-cache": { "version": "2.7.3", - "from": "lru-cache@>=2.0.0 <3.0.0", + "from": "https://registry.npmjs.org/lru-cache/-/lru-cache-2.7.3.tgz", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-2.7.3.tgz" }, "sigmund": { "version": "1.0.1", - "from": "sigmund@>=1.0.0 <1.1.0", + "from": "https://registry.npmjs.org/sigmund/-/sigmund-1.0.1.tgz", "resolved": "https://registry.npmjs.org/sigmund/-/sigmund-1.0.1.tgz" } } @@ -12989,120 +12894,120 @@ }, "lodash": { "version": "2.4.2", - "from": "lodash@>=2.4.1 <2.5.0", + "from": "https://registry.npmjs.org/lodash/-/lodash-2.4.2.tgz", "resolved": "https://registry.npmjs.org/lodash/-/lodash-2.4.2.tgz" }, "marked": { "version": "0.3.5", - "from": "marked@>=0.3.0 <0.4.0", + "from": "https://registry.npmjs.org/marked/-/marked-0.3.5.tgz", "resolved": "https://registry.npmjs.org/marked/-/marked-0.3.5.tgz" }, "node-html-encoder": { "version": "0.0.2", - "from": "node-html-encoder@0.0.2", + "from": "https://registry.npmjs.org/node-html-encoder/-/node-html-encoder-0.0.2.tgz", "resolved": "https://registry.npmjs.org/node-html-encoder/-/node-html-encoder-0.0.2.tgz" }, "promises-aplus-tests": { "version": "2.1.1", - "from": "promises-aplus-tests@>=2.1.0 <2.2.0", + "from": "https://registry.npmjs.org/promises-aplus-tests/-/promises-aplus-tests-2.1.1.tgz", "resolved": "https://registry.npmjs.org/promises-aplus-tests/-/promises-aplus-tests-2.1.1.tgz", "dependencies": { "mocha": { "version": "1.21.5", - "from": "mocha@>=1.21.4 <1.22.0", + "from": "https://registry.npmjs.org/mocha/-/mocha-1.21.5.tgz", "resolved": "https://registry.npmjs.org/mocha/-/mocha-1.21.5.tgz", "dependencies": { "commander": { "version": "2.3.0", - "from": "commander@2.3.0", + "from": "https://registry.npmjs.org/commander/-/commander-2.3.0.tgz", "resolved": "https://registry.npmjs.org/commander/-/commander-2.3.0.tgz" }, "debug": { "version": "2.0.0", - "from": "debug@2.0.0", + "from": "https://registry.npmjs.org/debug/-/debug-2.0.0.tgz", "resolved": "https://registry.npmjs.org/debug/-/debug-2.0.0.tgz", "dependencies": { "ms": { "version": "0.6.2", - "from": "ms@0.6.2", + "from": "https://registry.npmjs.org/ms/-/ms-0.6.2.tgz", "resolved": "https://registry.npmjs.org/ms/-/ms-0.6.2.tgz" } } }, "diff": { "version": "1.0.8", - "from": "diff@1.0.8", + "from": "https://registry.npmjs.org/diff/-/diff-1.0.8.tgz", "resolved": "https://registry.npmjs.org/diff/-/diff-1.0.8.tgz" }, "escape-string-regexp": { "version": "1.0.2", - "from": "escape-string-regexp@1.0.2", + "from": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.2.tgz", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.2.tgz" }, "glob": { "version": "3.2.3", - "from": "glob@3.2.3", + "from": "https://registry.npmjs.org/glob/-/glob-3.2.3.tgz", "resolved": "https://registry.npmjs.org/glob/-/glob-3.2.3.tgz", "dependencies": { "minimatch": { "version": "0.2.14", - "from": "minimatch@>=0.2.11 <0.3.0", + "from": "https://registry.npmjs.org/minimatch/-/minimatch-0.2.14.tgz", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-0.2.14.tgz", "dependencies": { "lru-cache": { "version": "2.7.3", - "from": "lru-cache@>=2.0.0 <3.0.0", + "from": "https://registry.npmjs.org/lru-cache/-/lru-cache-2.7.3.tgz", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-2.7.3.tgz" }, "sigmund": { "version": "1.0.1", - "from": "sigmund@>=1.0.0 <1.1.0", + "from": "https://registry.npmjs.org/sigmund/-/sigmund-1.0.1.tgz", "resolved": "https://registry.npmjs.org/sigmund/-/sigmund-1.0.1.tgz" } } }, "graceful-fs": { "version": "2.0.3", - "from": "graceful-fs@>=2.0.0 <2.1.0", + "from": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-2.0.3.tgz", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-2.0.3.tgz" }, "inherits": { "version": "2.0.1", - "from": "inherits@>=2.0.0 <3.0.0", + "from": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz" } } }, "growl": { "version": "1.8.1", - "from": "growl@1.8.1", + "from": "https://registry.npmjs.org/growl/-/growl-1.8.1.tgz", "resolved": "https://registry.npmjs.org/growl/-/growl-1.8.1.tgz" }, "jade": { "version": "0.26.3", - "from": "jade@0.26.3", + "from": "https://registry.npmjs.org/jade/-/jade-0.26.3.tgz", "resolved": "https://registry.npmjs.org/jade/-/jade-0.26.3.tgz", "dependencies": { "commander": { "version": "0.6.1", - "from": "commander@0.6.1", + "from": "https://registry.npmjs.org/commander/-/commander-0.6.1.tgz", "resolved": "https://registry.npmjs.org/commander/-/commander-0.6.1.tgz" }, "mkdirp": { "version": "0.3.0", - "from": "mkdirp@0.3.0", + "from": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.3.0.tgz", "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.3.0.tgz" } } }, "mkdirp": { "version": "0.5.0", - "from": "mkdirp@0.5.0", + "from": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.0.tgz", "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.0.tgz", "dependencies": { "minimist": { "version": "0.0.8", - "from": "minimist@0.0.8", + "from": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz" } } @@ -13111,83 +13016,83 @@ }, "sinon": { "version": "1.17.4", - "from": "sinon@>=1.10.3 <2.0.0", + "from": "https://registry.npmjs.org/sinon/-/sinon-1.17.4.tgz", "resolved": "https://registry.npmjs.org/sinon/-/sinon-1.17.4.tgz", "dependencies": { "formatio": { "version": "1.1.1", - "from": "formatio@1.1.1", + "from": "https://registry.npmjs.org/formatio/-/formatio-1.1.1.tgz", "resolved": "https://registry.npmjs.org/formatio/-/formatio-1.1.1.tgz" }, "util": { "version": "0.10.3", - "from": "util@>=0.10.3 <1.0.0", + "from": "https://registry.npmjs.org/util/-/util-0.10.3.tgz", "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz", "dependencies": { "inherits": { "version": "2.0.1", - "from": "inherits@2.0.1", + "from": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz" } } }, "lolex": { "version": "1.3.2", - "from": "lolex@1.3.2", + "from": "https://registry.npmjs.org/lolex/-/lolex-1.3.2.tgz", "resolved": "https://registry.npmjs.org/lolex/-/lolex-1.3.2.tgz" }, "samsam": { "version": "1.1.2", - "from": "samsam@1.1.2", + "from": "https://registry.npmjs.org/samsam/-/samsam-1.1.2.tgz", "resolved": "https://registry.npmjs.org/samsam/-/samsam-1.1.2.tgz" } } }, "underscore": { "version": "1.6.0", - "from": "underscore@>=1.6.0 <1.7.0", + "from": "https://registry.npmjs.org/underscore/-/underscore-1.6.0.tgz", "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.6.0.tgz" } } }, "protractor": { "version": "2.5.1", - "from": "protractor@>=2.1.0 <3.0.0", + "from": "https://registry.npmjs.org/protractor/-/protractor-2.5.1.tgz", "resolved": "https://registry.npmjs.org/protractor/-/protractor-2.5.1.tgz", "dependencies": { "request": { "version": "2.57.0", - "from": "request@>=2.57.0 <2.58.0", + "from": "https://registry.npmjs.org/request/-/request-2.57.0.tgz", "resolved": "https://registry.npmjs.org/request/-/request-2.57.0.tgz", "dependencies": { "bl": { "version": "0.9.5", - "from": "bl@>=0.9.0 <0.10.0", + "from": "https://registry.npmjs.org/bl/-/bl-0.9.5.tgz", "resolved": "https://registry.npmjs.org/bl/-/bl-0.9.5.tgz", "dependencies": { "readable-stream": { "version": "1.0.34", - "from": "readable-stream@>=1.0.26 <1.1.0", + "from": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", "dependencies": { "core-util-is": { "version": "1.0.2", - "from": "core-util-is@>=1.0.0 <1.1.0", + "from": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz" }, "isarray": { "version": "0.0.1", - "from": "isarray@0.0.1", + "from": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz" }, "string_decoder": { "version": "0.10.31", - "from": "string_decoder@>=0.10.0 <0.11.0", + "from": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz" }, "inherits": { "version": "2.0.1", - "from": "inherits@>=2.0.1 <2.1.0", + "from": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz" } } @@ -13196,32 +13101,32 @@ }, "caseless": { "version": "0.10.0", - "from": "caseless@>=0.10.0 <0.11.0", + "from": "https://registry.npmjs.org/caseless/-/caseless-0.10.0.tgz", "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.10.0.tgz" }, "forever-agent": { "version": "0.6.1", - "from": "forever-agent@>=0.6.0 <0.7.0", + "from": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz" }, "form-data": { "version": "0.2.0", - "from": "form-data@>=0.2.0 <0.3.0", + "from": "https://registry.npmjs.org/form-data/-/form-data-0.2.0.tgz", "resolved": "https://registry.npmjs.org/form-data/-/form-data-0.2.0.tgz", "dependencies": { "async": { "version": "0.9.2", - "from": "async@>=0.9.0 <0.10.0", + "from": "https://registry.npmjs.org/async/-/async-0.9.2.tgz", "resolved": "https://registry.npmjs.org/async/-/async-0.9.2.tgz" }, "combined-stream": { "version": "0.0.7", - "from": "combined-stream@>=0.0.4 <0.1.0", + "from": "https://registry.npmjs.org/combined-stream/-/combined-stream-0.0.7.tgz", "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-0.0.7.tgz", "dependencies": { "delayed-stream": { "version": "0.0.5", - "from": "delayed-stream@0.0.5", + "from": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-0.0.5.tgz", "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-0.0.5.tgz" } } @@ -13230,220 +13135,220 @@ }, "json-stringify-safe": { "version": "5.0.1", - "from": "json-stringify-safe@>=5.0.0 <5.1.0", + "from": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz" }, "mime-types": { "version": "2.0.14", - "from": "mime-types@>=2.0.1 <2.1.0", + "from": "https://registry.npmjs.org/mime-types/-/mime-types-2.0.14.tgz", "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.0.14.tgz", "dependencies": { "mime-db": { "version": "1.12.0", - "from": "mime-db@>=1.12.0 <1.13.0", + "from": "https://registry.npmjs.org/mime-db/-/mime-db-1.12.0.tgz", "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.12.0.tgz" } } }, "node-uuid": { "version": "1.4.7", - "from": "node-uuid@>=1.4.0 <1.5.0", + "from": "https://registry.npmjs.org/node-uuid/-/node-uuid-1.4.7.tgz", "resolved": "https://registry.npmjs.org/node-uuid/-/node-uuid-1.4.7.tgz" }, "qs": { "version": "3.1.0", - "from": "qs@>=3.1.0 <3.2.0", + "from": "https://registry.npmjs.org/qs/-/qs-3.1.0.tgz", "resolved": "https://registry.npmjs.org/qs/-/qs-3.1.0.tgz" }, "tunnel-agent": { "version": "0.4.3", - "from": "tunnel-agent@>=0.4.0 <0.5.0", + "from": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.4.3.tgz", "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.4.3.tgz" }, "tough-cookie": { "version": "2.2.2", - "from": "tough-cookie@>=0.12.0", + "from": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.2.2.tgz", "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.2.2.tgz" }, "http-signature": { "version": "0.11.0", - "from": "http-signature@>=0.11.0 <0.12.0", + "from": "https://registry.npmjs.org/http-signature/-/http-signature-0.11.0.tgz", "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-0.11.0.tgz", "dependencies": { "assert-plus": { "version": "0.1.5", - "from": "assert-plus@>=0.1.5 <0.2.0", + "from": "https://registry.npmjs.org/assert-plus/-/assert-plus-0.1.5.tgz", "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-0.1.5.tgz" }, "asn1": { "version": "0.1.11", - "from": "asn1@0.1.11", + "from": "https://registry.npmjs.org/asn1/-/asn1-0.1.11.tgz", "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.1.11.tgz" }, "ctype": { "version": "0.5.3", - "from": "ctype@0.5.3", + "from": "https://registry.npmjs.org/ctype/-/ctype-0.5.3.tgz", "resolved": "https://registry.npmjs.org/ctype/-/ctype-0.5.3.tgz" } } }, "oauth-sign": { "version": "0.8.2", - "from": "oauth-sign@>=0.8.0 <0.9.0", + "from": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.8.2.tgz", "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.8.2.tgz" }, "hawk": { "version": "2.3.1", - "from": "hawk@>=2.3.0 <2.4.0", + "from": "https://registry.npmjs.org/hawk/-/hawk-2.3.1.tgz", "resolved": "https://registry.npmjs.org/hawk/-/hawk-2.3.1.tgz", "dependencies": { "hoek": { "version": "2.16.3", - "from": "hoek@>=2.0.0 <3.0.0", + "from": "https://registry.npmjs.org/hoek/-/hoek-2.16.3.tgz", "resolved": "https://registry.npmjs.org/hoek/-/hoek-2.16.3.tgz" }, "boom": { "version": "2.10.1", - "from": "boom@>=2.0.0 <3.0.0", + "from": "https://registry.npmjs.org/boom/-/boom-2.10.1.tgz", "resolved": "https://registry.npmjs.org/boom/-/boom-2.10.1.tgz" }, "cryptiles": { "version": "2.0.5", - "from": "cryptiles@>=2.0.0 <3.0.0", + "from": "https://registry.npmjs.org/cryptiles/-/cryptiles-2.0.5.tgz", "resolved": "https://registry.npmjs.org/cryptiles/-/cryptiles-2.0.5.tgz" }, "sntp": { "version": "1.0.9", - "from": "sntp@>=1.0.0 <2.0.0", + "from": "https://registry.npmjs.org/sntp/-/sntp-1.0.9.tgz", "resolved": "https://registry.npmjs.org/sntp/-/sntp-1.0.9.tgz" } } }, "aws-sign2": { "version": "0.5.0", - "from": "aws-sign2@>=0.5.0 <0.6.0", + "from": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.5.0.tgz", "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.5.0.tgz" }, "stringstream": { "version": "0.0.5", - "from": "stringstream@>=0.0.4 <0.1.0", + "from": "https://registry.npmjs.org/stringstream/-/stringstream-0.0.5.tgz", "resolved": "https://registry.npmjs.org/stringstream/-/stringstream-0.0.5.tgz" }, "combined-stream": { "version": "1.0.5", - "from": "combined-stream@>=1.0.1 <1.1.0", + "from": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.5.tgz", "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.5.tgz", "dependencies": { "delayed-stream": { "version": "1.0.0", - "from": "delayed-stream@>=1.0.0 <1.1.0", + "from": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz" } } }, "isstream": { "version": "0.1.2", - "from": "isstream@>=0.1.1 <0.2.0", + "from": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz" }, "har-validator": { "version": "1.8.0", - "from": "har-validator@>=1.6.1 <2.0.0", + "from": "https://registry.npmjs.org/har-validator/-/har-validator-1.8.0.tgz", "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-1.8.0.tgz", "dependencies": { "bluebird": { "version": "2.10.2", - "from": "bluebird@>=2.9.30 <3.0.0", + "from": "https://registry.npmjs.org/bluebird/-/bluebird-2.10.2.tgz", "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-2.10.2.tgz" }, "chalk": { "version": "1.1.3", - "from": "chalk@>=1.0.0 <2.0.0", + "from": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", "dependencies": { "ansi-styles": { "version": "2.2.1", - "from": "ansi-styles@>=2.2.1 <3.0.0", + "from": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz" }, "escape-string-regexp": { "version": "1.0.5", - "from": "escape-string-regexp@>=1.0.2 <2.0.0", + "from": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz" }, "has-ansi": { "version": "2.0.0", - "from": "has-ansi@>=2.0.0 <3.0.0", + "from": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", "dependencies": { "ansi-regex": { "version": "2.0.0", - "from": "ansi-regex@>=2.0.0 <3.0.0", + "from": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.0.0.tgz", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.0.0.tgz" } } }, "strip-ansi": { "version": "3.0.1", - "from": "strip-ansi@>=3.0.0 <4.0.0", + "from": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", "dependencies": { "ansi-regex": { "version": "2.0.0", - "from": "ansi-regex@>=2.0.0 <3.0.0", + "from": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.0.0.tgz", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.0.0.tgz" } } }, "supports-color": { "version": "2.0.0", - "from": "supports-color@>=2.0.0 <3.0.0", + "from": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz" } } }, "commander": { "version": "2.9.0", - "from": "commander@>=2.8.1 <3.0.0", + "from": "https://registry.npmjs.org/commander/-/commander-2.9.0.tgz", "resolved": "https://registry.npmjs.org/commander/-/commander-2.9.0.tgz", "dependencies": { "graceful-readlink": { "version": "1.0.1", - "from": "graceful-readlink@>=1.0.0", + "from": "https://registry.npmjs.org/graceful-readlink/-/graceful-readlink-1.0.1.tgz", "resolved": "https://registry.npmjs.org/graceful-readlink/-/graceful-readlink-1.0.1.tgz" } } }, "is-my-json-valid": { "version": "2.13.1", - "from": "is-my-json-valid@>=2.12.0 <3.0.0", + "from": "https://registry.npmjs.org/is-my-json-valid/-/is-my-json-valid-2.13.1.tgz", "resolved": "https://registry.npmjs.org/is-my-json-valid/-/is-my-json-valid-2.13.1.tgz", "dependencies": { "generate-function": { "version": "2.0.0", - "from": "generate-function@>=2.0.0 <3.0.0", + "from": "https://registry.npmjs.org/generate-function/-/generate-function-2.0.0.tgz", "resolved": "https://registry.npmjs.org/generate-function/-/generate-function-2.0.0.tgz" }, "generate-object-property": { "version": "1.2.0", - "from": "generate-object-property@>=1.1.0 <2.0.0", + "from": "https://registry.npmjs.org/generate-object-property/-/generate-object-property-1.2.0.tgz", "resolved": "https://registry.npmjs.org/generate-object-property/-/generate-object-property-1.2.0.tgz", "dependencies": { "is-property": { "version": "1.0.2", - "from": "is-property@>=1.0.0 <2.0.0", + "from": "https://registry.npmjs.org/is-property/-/is-property-1.0.2.tgz", "resolved": "https://registry.npmjs.org/is-property/-/is-property-1.0.2.tgz" } } }, "jsonpointer": { "version": "2.0.0", - "from": "jsonpointer@2.0.0", + "from": "https://registry.npmjs.org/jsonpointer/-/jsonpointer-2.0.0.tgz", "resolved": "https://registry.npmjs.org/jsonpointer/-/jsonpointer-2.0.0.tgz" }, "xtend": { "version": "4.0.1", - "from": "xtend@>=4.0.0 <5.0.0", + "from": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz" } } @@ -13454,54 +13359,54 @@ }, "selenium-webdriver": { "version": "2.47.0", - "from": "selenium-webdriver@2.47.0", + "from": "https://registry.npmjs.org/selenium-webdriver/-/selenium-webdriver-2.47.0.tgz", "resolved": "https://registry.npmjs.org/selenium-webdriver/-/selenium-webdriver-2.47.0.tgz", "dependencies": { "rimraf": { "version": "2.5.2", - "from": "rimraf@>=2.2.8 <3.0.0", + "from": "https://registry.npmjs.org/rimraf/-/rimraf-2.5.2.tgz", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.5.2.tgz", "dependencies": { "glob": { "version": "7.0.3", - "from": "glob@>=7.0.0 <8.0.0", + "from": "https://registry.npmjs.org/glob/-/glob-7.0.3.tgz", "resolved": "https://registry.npmjs.org/glob/-/glob-7.0.3.tgz", "dependencies": { "inflight": { "version": "1.0.4", - "from": "inflight@>=1.0.4 <2.0.0", + "from": "https://registry.npmjs.org/inflight/-/inflight-1.0.4.tgz", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.4.tgz", "dependencies": { "wrappy": { "version": "1.0.1", - "from": "wrappy@>=1.0.0 <2.0.0", + "from": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.1.tgz", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.1.tgz" } } }, "inherits": { "version": "2.0.1", - "from": "inherits@>=2.0.0 <3.0.0", + "from": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz" }, "minimatch": { "version": "3.0.0", - "from": "minimatch@>=2.0.0 <3.0.0||>=3.0.0 <4.0.0", + "from": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.0.tgz", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.0.tgz", "dependencies": { "brace-expansion": { "version": "1.1.4", - "from": "brace-expansion@>=1.0.0 <2.0.0", + "from": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.4.tgz", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.4.tgz", "dependencies": { "balanced-match": { "version": "0.4.1", - "from": "balanced-match@>=0.4.1 <0.5.0", + "from": "https://registry.npmjs.org/balanced-match/-/balanced-match-0.4.1.tgz", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-0.4.1.tgz" }, "concat-map": { "version": "0.0.1", - "from": "concat-map@0.0.1", + "from": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz" } } @@ -13510,19 +13415,19 @@ }, "once": { "version": "1.3.3", - "from": "once@>=1.3.0 <2.0.0", + "from": "https://registry.npmjs.org/once/-/once-1.3.3.tgz", "resolved": "https://registry.npmjs.org/once/-/once-1.3.3.tgz", "dependencies": { "wrappy": { "version": "1.0.1", - "from": "wrappy@>=1.0.0 <2.0.0", + "from": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.1.tgz", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.1.tgz" } } }, "path-is-absolute": { "version": "1.0.0", - "from": "path-is-absolute@>=1.0.0 <2.0.0", + "from": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.0.tgz", "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.0.tgz" } } @@ -13531,54 +13436,54 @@ }, "tmp": { "version": "0.0.24", - "from": "tmp@0.0.24", + "from": "https://registry.npmjs.org/tmp/-/tmp-0.0.24.tgz", "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.24.tgz" }, "ws": { "version": "0.8.1", - "from": "ws@>=0.8.0 <0.9.0", + "from": "https://registry.npmjs.org/ws/-/ws-0.8.1.tgz", "resolved": "https://registry.npmjs.org/ws/-/ws-0.8.1.tgz", "dependencies": { "options": { "version": "0.0.6", - "from": "options@>=0.0.5", + "from": "https://registry.npmjs.org/options/-/options-0.0.6.tgz", "resolved": "https://registry.npmjs.org/options/-/options-0.0.6.tgz" }, "ultron": { "version": "1.0.2", - "from": "ultron@>=1.0.0 <1.1.0", + "from": "https://registry.npmjs.org/ultron/-/ultron-1.0.2.tgz", "resolved": "https://registry.npmjs.org/ultron/-/ultron-1.0.2.tgz" }, "bufferutil": { "version": "1.2.1", - "from": "bufferutil@>=1.2.0 <1.3.0", + "from": "https://registry.npmjs.org/bufferutil/-/bufferutil-1.2.1.tgz", "resolved": "https://registry.npmjs.org/bufferutil/-/bufferutil-1.2.1.tgz", "dependencies": { "bindings": { "version": "1.2.1", - "from": "bindings@>=1.2.0 <1.3.0", + "from": "https://registry.npmjs.org/bindings/-/bindings-1.2.1.tgz", "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.2.1.tgz" }, "nan": { "version": "2.3.3", - "from": "nan@>=2.0.5 <3.0.0", + "from": "https://registry.npmjs.org/nan/-/nan-2.3.3.tgz", "resolved": "https://registry.npmjs.org/nan/-/nan-2.3.3.tgz" } } }, "utf-8-validate": { "version": "1.2.1", - "from": "utf-8-validate@>=1.2.0 <1.3.0", + "from": "https://registry.npmjs.org/utf-8-validate/-/utf-8-validate-1.2.1.tgz", "resolved": "https://registry.npmjs.org/utf-8-validate/-/utf-8-validate-1.2.1.tgz", "dependencies": { "bindings": { "version": "1.2.1", - "from": "bindings@>=1.2.0 <1.3.0", + "from": "https://registry.npmjs.org/bindings/-/bindings-1.2.1.tgz", "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.2.1.tgz" }, "nan": { "version": "2.3.3", - "from": "nan@>=2.0.5 <3.0.0", + "from": "https://registry.npmjs.org/nan/-/nan-2.3.3.tgz", "resolved": "https://registry.npmjs.org/nan/-/nan-2.3.3.tgz" } } @@ -13587,17 +13492,17 @@ }, "xml2js": { "version": "0.4.4", - "from": "xml2js@0.4.4", + "from": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.4.tgz", "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.4.tgz", "dependencies": { "sax": { "version": "0.6.1", - "from": "sax@>=0.6.0 <0.7.0", + "from": "https://registry.npmjs.org/sax/-/sax-0.6.1.tgz", "resolved": "https://registry.npmjs.org/sax/-/sax-0.6.1.tgz" }, "xmlbuilder": { "version": "8.2.2", - "from": "xmlbuilder@>=1.0.0", + "from": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-8.2.2.tgz", "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-8.2.2.tgz" } } @@ -13606,73 +13511,73 @@ }, "minijasminenode": { "version": "1.1.1", - "from": "minijasminenode@1.1.1", + "from": "https://registry.npmjs.org/minijasminenode/-/minijasminenode-1.1.1.tgz", "resolved": "https://registry.npmjs.org/minijasminenode/-/minijasminenode-1.1.1.tgz" }, "jasminewd": { "version": "1.1.0", - "from": "jasminewd@1.1.0", + "from": "https://registry.npmjs.org/jasminewd/-/jasminewd-1.1.0.tgz", "resolved": "https://registry.npmjs.org/jasminewd/-/jasminewd-1.1.0.tgz" }, "jasminewd2": { "version": "0.0.6", - "from": "jasminewd2@0.0.6", + "from": "https://registry.npmjs.org/jasminewd2/-/jasminewd2-0.0.6.tgz", "resolved": "https://registry.npmjs.org/jasminewd2/-/jasminewd2-0.0.6.tgz" }, "jasmine": { "version": "2.3.2", - "from": "jasmine@2.3.2", + "from": "https://registry.npmjs.org/jasmine/-/jasmine-2.3.2.tgz", "resolved": "https://registry.npmjs.org/jasmine/-/jasmine-2.3.2.tgz", "dependencies": { "exit": { "version": "0.1.2", - "from": "exit@>=0.1.2 <0.2.0", + "from": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz" }, "jasmine-core": { "version": "2.3.4", - "from": "jasmine-core@>=2.3.0 <2.4.0", + "from": "https://registry.npmjs.org/jasmine-core/-/jasmine-core-2.3.4.tgz", "resolved": "https://registry.npmjs.org/jasmine-core/-/jasmine-core-2.3.4.tgz" } } }, "saucelabs": { "version": "1.0.1", - "from": "saucelabs@>=1.0.1 <1.1.0", + "from": "https://registry.npmjs.org/saucelabs/-/saucelabs-1.0.1.tgz", "resolved": "https://registry.npmjs.org/saucelabs/-/saucelabs-1.0.1.tgz", "dependencies": { "https-proxy-agent": { "version": "1.0.0", - "from": "https-proxy-agent@>=1.0.0 <2.0.0", + "from": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-1.0.0.tgz", "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-1.0.0.tgz", "dependencies": { "agent-base": { "version": "2.0.1", - "from": "agent-base@>=2.0.0 <3.0.0", + "from": "https://registry.npmjs.org/agent-base/-/agent-base-2.0.1.tgz", "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-2.0.1.tgz", "dependencies": { "semver": { "version": "5.0.3", - "from": "semver@>=5.0.1 <5.1.0", + "from": "https://registry.npmjs.org/semver/-/semver-5.0.3.tgz", "resolved": "https://registry.npmjs.org/semver/-/semver-5.0.3.tgz" } } }, "debug": { "version": "2.2.0", - "from": "debug@>=2.0.0 <3.0.0", + "from": "https://registry.npmjs.org/debug/-/debug-2.2.0.tgz", "resolved": "https://registry.npmjs.org/debug/-/debug-2.2.0.tgz", "dependencies": { "ms": { "version": "0.7.1", - "from": "ms@0.7.1", + "from": "https://registry.npmjs.org/ms/-/ms-0.7.1.tgz", "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.1.tgz" } } }, "extend": { "version": "3.0.0", - "from": "extend@>=3.0.0 <4.0.0", + "from": "https://registry.npmjs.org/extend/-/extend-3.0.0.tgz", "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.0.tgz" } } @@ -13681,27 +13586,27 @@ }, "glob": { "version": "3.2.11", - "from": "glob@>=3.2.0 <3.3.0", + "from": "https://registry.npmjs.org/glob/-/glob-3.2.11.tgz", "resolved": "https://registry.npmjs.org/glob/-/glob-3.2.11.tgz", "dependencies": { "inherits": { "version": "2.0.1", - "from": "inherits@>=2.0.0 <3.0.0", + "from": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz" }, "minimatch": { "version": "0.3.0", - "from": "minimatch@>=0.3.0 <0.4.0", + "from": "https://registry.npmjs.org/minimatch/-/minimatch-0.3.0.tgz", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-0.3.0.tgz", "dependencies": { "lru-cache": { "version": "2.7.3", - "from": "lru-cache@>=2.0.0 <3.0.0", + "from": "https://registry.npmjs.org/lru-cache/-/lru-cache-2.7.3.tgz", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-2.7.3.tgz" }, "sigmund": { "version": "1.0.1", - "from": "sigmund@>=1.0.0 <1.1.0", + "from": "https://registry.npmjs.org/sigmund/-/sigmund-1.0.1.tgz", "resolved": "https://registry.npmjs.org/sigmund/-/sigmund-1.0.1.tgz" } } @@ -13710,44 +13615,44 @@ }, "adm-zip": { "version": "0.4.4", - "from": "adm-zip@0.4.4", + "from": "https://registry.npmjs.org/adm-zip/-/adm-zip-0.4.4.tgz", "resolved": "https://registry.npmjs.org/adm-zip/-/adm-zip-0.4.4.tgz" }, "optimist": { "version": "0.6.1", - "from": "optimist@>=0.6.0 <0.7.0", + "from": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz", "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz", "dependencies": { "wordwrap": { "version": "0.0.3", - "from": "wordwrap@>=0.0.2 <0.1.0", + "from": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz", "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz" }, "minimist": { "version": "0.0.10", - "from": "minimist@>=0.0.1 <0.1.0", + "from": "https://registry.npmjs.org/minimist/-/minimist-0.0.10.tgz", "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.10.tgz" } } }, "q": { "version": "1.0.0", - "from": "q@1.0.0", + "from": "https://registry.npmjs.org/q/-/q-1.0.0.tgz", "resolved": "https://registry.npmjs.org/q/-/q-1.0.0.tgz" }, "source-map-support": { "version": "0.2.10", - "from": "source-map-support@>=0.2.6 <0.3.0", + "from": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.2.10.tgz", "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.2.10.tgz", "dependencies": { "source-map": { "version": "0.1.32", - "from": "source-map@0.1.32", + "from": "https://registry.npmjs.org/source-map/-/source-map-0.1.32.tgz", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.1.32.tgz", "dependencies": { "amdefine": { "version": "1.0.0", - "from": "amdefine@>=0.0.4", + "from": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.0.tgz", "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.0.tgz" } } @@ -13756,54 +13661,54 @@ }, "html-entities": { "version": "1.1.3", - "from": "html-entities@>=1.1.1 <1.2.0", + "from": "https://registry.npmjs.org/html-entities/-/html-entities-1.1.3.tgz", "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-1.1.3.tgz" }, "accessibility-developer-tools": { "version": "2.6.0", - "from": "accessibility-developer-tools@>=2.6.0 <2.7.0", + "from": "https://registry.npmjs.org/accessibility-developer-tools/-/accessibility-developer-tools-2.6.0.tgz", "resolved": "https://registry.npmjs.org/accessibility-developer-tools/-/accessibility-developer-tools-2.6.0.tgz" } } }, "q": { "version": "1.0.1", - "from": "q@>=1.0.0 <1.1.0", + "from": "https://registry.npmjs.org/q/-/q-1.0.1.tgz", "resolved": "https://registry.npmjs.org/q/-/q-1.0.1.tgz" }, "q-io": { "version": "1.13.2", - "from": "q-io@>=1.10.9 <2.0.0", + "from": "https://registry.npmjs.org/q-io/-/q-io-1.13.2.tgz", "resolved": "https://registry.npmjs.org/q-io/-/q-io-1.13.2.tgz", "dependencies": { "qs": { "version": "1.2.2", - "from": "qs@>=1.2.1 <2.0.0", + "from": "https://registry.npmjs.org/qs/-/qs-1.2.2.tgz", "resolved": "https://registry.npmjs.org/qs/-/qs-1.2.2.tgz" }, "url2": { "version": "0.0.0", - "from": "url2@>=0.0.0 <0.0.1", + "from": "https://registry.npmjs.org/url2/-/url2-0.0.0.tgz", "resolved": "https://registry.npmjs.org/url2/-/url2-0.0.0.tgz" }, "mime": { "version": "1.3.4", - "from": "mime@>=1.2.11 <2.0.0", + "from": "https://registry.npmjs.org/mime/-/mime-1.3.4.tgz", "resolved": "https://registry.npmjs.org/mime/-/mime-1.3.4.tgz" }, "mimeparse": { "version": "0.1.4", - "from": "mimeparse@>=0.1.4 <0.2.0", + "from": "https://registry.npmjs.org/mimeparse/-/mimeparse-0.1.4.tgz", "resolved": "https://registry.npmjs.org/mimeparse/-/mimeparse-0.1.4.tgz" }, "collections": { "version": "0.2.2", - "from": "collections@>=0.2.0 <0.3.0", + "from": "https://registry.npmjs.org/collections/-/collections-0.2.2.tgz", "resolved": "https://registry.npmjs.org/collections/-/collections-0.2.2.tgz", "dependencies": { "weak-map": { "version": "1.0.0", - "from": "weak-map@1.0.0", + "from": "https://registry.npmjs.org/weak-map/-/weak-map-1.0.0.tgz", "resolved": "https://registry.npmjs.org/weak-map/-/weak-map-1.0.0.tgz" } } @@ -13812,49 +13717,49 @@ }, "qq": { "version": "0.3.5", - "from": "qq@>=0.3.5 <0.4.0", + "from": "https://registry.npmjs.org/qq/-/qq-0.3.5.tgz", "resolved": "https://registry.npmjs.org/qq/-/qq-0.3.5.tgz", "dependencies": { "q": { "version": "0.8.4", - "from": "q@0.8.4", + "from": "https://registry.npmjs.org/q/-/q-0.8.4.tgz", "resolved": "https://registry.npmjs.org/q/-/q-0.8.4.tgz" } } }, "rewire": { "version": "2.1.5", - "from": "rewire@>=2.1.0 <2.2.0", + "from": "https://registry.npmjs.org/rewire/-/rewire-2.1.5.tgz", "resolved": "https://registry.npmjs.org/rewire/-/rewire-2.1.5.tgz" }, "sax": { "version": "1.2.1", - "from": "sax@>=1.1.1 <2.0.0", + "from": "https://registry.npmjs.org/sax/-/sax-1.2.1.tgz", "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.1.tgz" }, "semver": { "version": "4.0.3", - "from": "semver@>=4.0.3 <4.1.0", + "from": "https://registry.npmjs.org/semver/-/semver-4.0.3.tgz", "resolved": "https://registry.npmjs.org/semver/-/semver-4.0.3.tgz" }, "shelljs": { "version": "0.3.0", - "from": "shelljs@>=0.3.0 <0.4.0", + "from": "https://registry.npmjs.org/shelljs/-/shelljs-0.3.0.tgz", "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.3.0.tgz" }, "sorted-object": { "version": "1.0.0", - "from": "sorted-object@>=1.0.0 <2.0.0", + "from": "https://registry.npmjs.org/sorted-object/-/sorted-object-1.0.0.tgz", "resolved": "https://registry.npmjs.org/sorted-object/-/sorted-object-1.0.0.tgz" }, "stringmap": { "version": "0.2.2", - "from": "stringmap@>=0.2.2 <0.3.0", + "from": "https://registry.npmjs.org/stringmap/-/stringmap-0.2.2.tgz", "resolved": "https://registry.npmjs.org/stringmap/-/stringmap-0.2.2.tgz" }, "strip-json-comments": { "version": "2.0.1", - "from": "strip-json-comments@>=2.0.1 <3.0.0", + "from": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz" } } diff --git a/package.json b/package.json index 22756814c204..4a6af69e69d1 100644 --- a/package.json +++ b/package.json @@ -30,7 +30,7 @@ "commitizen": "^2.3.0", "cz-conventional-changelog": "1.1.4", "dgeni": "^0.4.0", - "dgeni-packages": "^0.13.0", + "dgeni-packages": "^0.14.0", "event-stream": "~3.1.0", "glob": "^6.0.1", "grunt": "~0.4.2", From a2c1675ff9805db13d8f5dfca8336e541a69a184 Mon Sep 17 00:00:00 2001 From: Georgios Kalpakas Date: Sat, 25 Jun 2016 17:06:02 +0300 Subject: [PATCH 0028/1173] docs(guide/interpolation): add known issue (do not change the content of interpolated strings) Closes #12813 Closes #14825 --- docs/content/guide/interpolation.ngdoc | 17 +++++++++++++++-- src/ng/directive/ngClass.js | 5 +++++ src/ng/directive/ngStyle.js | 5 +++++ 3 files changed, 25 insertions(+), 2 deletions(-) diff --git a/docs/content/guide/interpolation.ngdoc b/docs/content/guide/interpolation.ngdoc index 6aa1d66b316c..aeb9906bd9df 100644 --- a/docs/content/guide/interpolation.ngdoc +++ b/docs/content/guide/interpolation.ngdoc @@ -46,7 +46,7 @@ would be lost, because the browser ignores the attribute value. In the following example, the interpolation information would be ignored and the browser would simply interpret the attribute as present, meaning that the button would always be disabled. - ```html +```html Disabled: ``` @@ -58,7 +58,7 @@ For this reason, Angular provides special `ng`-prefixed directives for the follo These directives take an expression inside the attribute, and set the corresponding boolean attribute to true when the expression evaluates to truthy. - ```html +```html Disabled: ``` @@ -115,6 +115,19 @@ can be used with `ngAttr` instead. The following is a list of known problematic - **type** in ` + @@ -443,44 +447,52 @@ angular.module('docsTabsExample', []) # Unit-testing Component Controllers -The easiest way to unit-test a component controller is by using the {@link ngMock.$componentController $componentController} -that is included in {@link ngMock}. The advantage of this method is that you do not have -to create any DOM elements. The following example shows how to do this for the `heroDetail` component -from above. +The easiest way to unit-test a component controller is by using the +{@link ngMock.$componentController $componentController} that is included in {@link ngMock}. The +advantage of this method is that you do not have to create any DOM elements. The following example +shows how to do this for the `heroDetail` component from above. The examples use the [Jasmine](http://jasmine.github.io/) testing framework. **Controller Test:** ```js describe('component: heroDetail', function() { - var component, scope, hero, $componentController; + var $componentController; beforeEach(module('heroApp')); - - beforeEach(inject(function($rootScope, _$componentController_) { - scope = $rootScope.$new(); + beforeEach(inject(function(_$componentController_) { $componentController = _$componentController_; - hero = {name: 'Wolverine'}; })); - it('should assign the name bindings to the hero object', function() { + it('should expose a `hero` object', function() { // Here we are passing actual bindings to the component - component = $componentController('heroDetail', - null, - {hero: hero} - ); - expect(component.hero.name).toBe('Wolverine'); + var bindings = {hero: {name: 'Wolverine'}}; + var ctrl = $componentController('heroDetail', null, bindings); + + expect(ctrl.hero).toBeDefined(); + expect(ctrl.hero.name).toBe('Wolverine'); }); - it('should call the onDelete binding when a hero is deleted', function() { - var deleteSpy = jasmine.createSpy('deleteSpy'); - component = $componentController('heroDetail', - null, - {hero: hero, onDelete: deleteSpy} - ); + it('should call the `onDelete` binding, when deleting the hero', function() { + var onDeleteSpy = jasmine.createSpy('onDelete'); + var bindings = {hero: {}, onDelete: onDeleteSpy}; + var ctrl = $componentController('heroDetail', null, bindings); - component.onDelete({hero: component.hero}); - expect(deleteSpy).toHaveBeenCalledWith({hero: component.hero}); + ctrl.delete(); + expect(onDeleteSpy).toHaveBeenCalledWith({hero: ctrl.hero}); + }); + + it('should call the `onUpdate` binding, when updating a property', function() { + var onUpdateSpy = jasmine.createSpy('onUpdate'); + var bindings = {hero: {}, onUpdate: onUpdateSpy}; + var ctrl = $componentController('heroDetail', null, bindings); + + ctrl.update('foo', 'bar'); + expect(onUpdateSpy).toHaveBeenCalledWith({ + hero: ctrl.hero, + prop: 'foo', + value: 'bar' + }); }); }); From ad41baa1fdc057db3fe529ff87735b173b164b4c Mon Sep 17 00:00:00 2001 From: Lee Adcock Date: Wed, 17 Feb 2016 03:57:58 +0000 Subject: [PATCH 0033/1173] fix(ngAria): bind to `keydown` instead of `keypress` in `ngClick` Previously, `ngAria` would provide keyboard support for non-native buttons (via `ngClick`), by binding the `ngClick` handler to the `keypress` event. In an attempt to better emulate the behavior of native buttons, `ngAria` will now bind to the `keydown` event (instead of `keypress`). The configuration flag for this feature has been renamed from `bindKeypress` to `bindKeydown`, to closer describe the underlying behavior. Fixes #14063 Closes #14065 BREAKING CHANGE: If you were explicitly setting the value of the `bindKeypress` flag, you need to change your code to use `bindKeydown` instead. Before: `$ariaProvider.config({bindKeypress: xyz})` After: `$ariaProvider.config({bindKeydown: xyz})` **Note:** If the element already has any of the `ngKeydown`/`ngKeyup`/`ngKeypress` directives, `ngAria` will _not_ bind to the `keydown` event, since it assumes that the developer has already taken care of keyboard interaction for that element. Although it is not expected to affect many applications, it might be desirable to keep the previous behavior of binding to the `keypress` event instead of the `keydown`. In that case, you need to manually use the `ngKeypress` directive (in addition to `ngClick`). Before: ```html
    I respond to `click` and `keypress` (not `keydown`)
    ``` After: ```html
    I respond to `click` and `keypress` (not `keydown`)
    I respond to `click` and `keydown` (not `keypress`)
    ``` Finally, it is possible that this change affects your unit or end-to-end tests. If you are currently expecting your custom buttons to automatically respond to the `keypress` event (due to `ngAria`), you need to change the tests to trigger `keydown` events instead. --- src/ngAria/aria.js | 43 ++++++++++++---------- test/ngAria/ariaSpec.js | 81 +++++++++++++++++++++++++++++------------ 2 files changed, 80 insertions(+), 44 deletions(-) diff --git a/src/ngAria/aria.js b/src/ngAria/aria.js index f50c7e9776f2..ca493676c211 100644 --- a/src/ngAria/aria.js +++ b/src/ngAria/aria.js @@ -21,19 +21,19 @@ * * Below is a more detailed breakdown of the attributes handled by ngAria: * - * | Directive | Supported Attributes | - * |---------------------------------------------|----------------------------------------------------------------------------------------| + * | Directive | Supported Attributes | + * |---------------------------------------------|-----------------------------------------------------------------------------------------------------| * | {@link ng.directive:ngModel ngModel} | aria-checked, aria-valuemin, aria-valuemax, aria-valuenow, aria-invalid, aria-required, input roles | - * | {@link ng.directive:ngDisabled ngDisabled} | aria-disabled | - * | {@link ng.directive:ngRequired ngRequired} | aria-required - * | {@link ng.directive:ngChecked ngChecked} | aria-checked - * | {@link ng.directive:ngReadonly ngReadonly} | aria-readonly | - * | {@link ng.directive:ngValue ngValue} | aria-checked | - * | {@link ng.directive:ngShow ngShow} | aria-hidden | - * | {@link ng.directive:ngHide ngHide} | aria-hidden | - * | {@link ng.directive:ngDblclick ngDblclick} | tabindex | - * | {@link module:ngMessages ngMessages} | aria-live | - * | {@link ng.directive:ngClick ngClick} | tabindex, keypress event, button role | + * | {@link ng.directive:ngDisabled ngDisabled} | aria-disabled | + * | {@link ng.directive:ngRequired ngRequired} | aria-required | + * | {@link ng.directive:ngChecked ngChecked} | aria-checked | + * | {@link ng.directive:ngReadonly ngReadonly} | aria-readonly | + * | {@link ng.directive:ngValue ngValue} | aria-checked | + * | {@link ng.directive:ngShow ngShow} | aria-hidden | + * | {@link ng.directive:ngHide ngHide} | aria-hidden | + * | {@link ng.directive:ngDblclick ngDblclick} | tabindex | + * | {@link module:ngMessages ngMessages} | aria-live | + * | {@link ng.directive:ngClick ngClick} | tabindex, keydown event, button role | * * Find out more information about each directive by reading the * {@link guide/accessibility ngAria Developer Guide}. @@ -98,7 +98,7 @@ function $AriaProvider() { ariaInvalid: true, ariaValue: true, tabindex: true, - bindKeypress: true, + bindKeydown: true, bindRoleForClick: true }; @@ -114,12 +114,15 @@ function $AriaProvider() { * - **ariaDisabled** – `{boolean}` – Enables/disables aria-disabled tags * - **ariaRequired** – `{boolean}` – Enables/disables aria-required tags * - **ariaInvalid** – `{boolean}` – Enables/disables aria-invalid tags - * - **ariaValue** – `{boolean}` – Enables/disables aria-valuemin, aria-valuemax and aria-valuenow tags + * - **ariaValue** – `{boolean}` – Enables/disables aria-valuemin, aria-valuemax and + * aria-valuenow tags * - **tabindex** – `{boolean}` – Enables/disables tabindex tags - * - **bindKeypress** – `{boolean}` – Enables/disables keypress event binding on `div` and - * `li` elements with ng-click - * - **bindRoleForClick** – `{boolean}` – Adds role=button to non-interactive elements like `div` - * using ng-click, making them more accessible to users of assistive technologies + * - **bindKeydown** – `{boolean}` – Enables/disables keyboard event binding on non-interactive + * elements (such as `div` or `li`) using ng-click, making them more accessible to users of + * assistive technologies + * - **bindRoleForClick** – `{boolean}` – Adds role=button to non-interactive elements (such as + * `div` or `li`) using ng-click, making them more accessible to users of assistive + * technologies * * @description * Enables/disables various ARIA attributes @@ -373,8 +376,8 @@ ngAriaModule.directive('ngShow', ['$aria', function($aria) { elem.attr('tabindex', 0); } - if ($aria.config('bindKeypress') && !attr.ngKeypress) { - elem.on('keypress', function(event) { + if ($aria.config('bindKeydown') && !attr.ngKeydown && !attr.ngKeypress && !attr.ngKeyup) { + elem.on('keydown', function(event) { var keyCode = event.which || event.keyCode; if (keyCode === 32 || keyCode === 13) { scope.$apply(callback); diff --git a/test/ngAria/ariaSpec.js b/test/ngAria/ariaSpec.js index 5620707e9a0c..5eb25c3cbea1 100644 --- a/test/ngAria/ariaSpec.js +++ b/test/ngAria/ariaSpec.js @@ -681,8 +681,8 @@ describe('$aria', function() { var divElement = elements.find('div'); var liElement = elements.find('li'); - divElement.triggerHandler({type: 'keypress', keyCode: 32}); - liElement.triggerHandler({type: 'keypress', keyCode: 32}); + divElement.triggerHandler({type: 'keydown', keyCode: 32}); + liElement.triggerHandler({type: 'keydown', keyCode: 32}); expect(clickFn).toHaveBeenCalledWith('div'); expect(clickFn).toHaveBeenCalledWith('li'); @@ -703,32 +703,57 @@ describe('$aria', function() { var divElement = elements.find('div'); var liElement = elements.find('li'); - divElement.triggerHandler({type: 'keypress', which: 32}); - liElement.triggerHandler({type: 'keypress', which: 32}); + divElement.triggerHandler({type: 'keydown', which: 32}); + liElement.triggerHandler({type: 'keydown', which: 32}); expect(clickFn).toHaveBeenCalledWith('div'); expect(clickFn).toHaveBeenCalledWith('li'); }); - it('should not override existing ng-keypress', function() { - scope.someOtherAction = function() {}; - var keypressFn = spyOn(scope, 'someOtherAction'); + it('should not bind to key events if there is existing ng-keydown', function() { + scope.onClick = jasmine.createSpy('onClick'); + scope.onKeydown = jasmine.createSpy('onKeydown'); - scope.someAction = function() {}; - clickFn = spyOn(scope, 'someAction'); - compileElement('
    '); + var tmpl = '
    '; + compileElement(tmpl); + + element.triggerHandler({type: 'keydown', keyCode: 32}); + + expect(scope.onKeydown).toHaveBeenCalled(); + expect(scope.onClick).not.toHaveBeenCalled(); + }); + + it('should not bind to key events if there is existing ng-keypress', function() { + scope.onClick = jasmine.createSpy('onClick'); + scope.onKeypress = jasmine.createSpy('onKeypress'); + + var tmpl = '
    '; + compileElement(tmpl); element.triggerHandler({type: 'keypress', keyCode: 32}); - expect(clickFn).not.toHaveBeenCalled(); - expect(keypressFn).toHaveBeenCalled(); + expect(scope.onKeypress).toHaveBeenCalled(); + expect(scope.onClick).not.toHaveBeenCalled(); }); - it('should update bindings when keypress handled', function() { + it('should not bind to key events if there is existing ng-keyup', function() { + scope.onClick = jasmine.createSpy('onClick'); + scope.onKeyup = jasmine.createSpy('onKeyup'); + + var tmpl = '
    '; + compileElement(tmpl); + + element.triggerHandler({type: 'keyup', keyCode: 32}); + + expect(scope.onKeyup).toHaveBeenCalled(); + expect(scope.onClick).not.toHaveBeenCalled(); + }); + + it('should update bindings when keydown is handled', function() { compileElement('
    {{text}}
    '); expect(element.text()).toBe(''); spyOn(scope.$root, '$digest').and.callThrough(); - element.triggerHandler({ type: 'keypress', keyCode: 13 }); + element.triggerHandler({ type: 'keydown', keyCode: 13 }); expect(element.text()).toBe('clicked!'); expect(scope.$root.$digest).toHaveBeenCalledOnce(); }); @@ -737,14 +762,14 @@ describe('$aria', function() { compileElement('
    {{event.type}}' + '{{event.keyCode}}
    '); expect(element.text()).toBe(''); - element.triggerHandler({ type: 'keypress', keyCode: 13 }); - expect(element.text()).toBe('keypress13'); + element.triggerHandler({ type: 'keydown', keyCode: 13 }); + expect(element.text()).toBe('keydown13'); }); - it('should not bind keypress to elements not in the default config', function() { + it('should not bind keydown to natively interactive elements', function() { compileElement(''); expect(element.text()).toBe(''); - element.triggerHandler({ type: 'keypress', keyCode: 13 }); + element.triggerHandler({ type: 'keydown', keyCode: 13 }); expect(element.text()).toBe(''); }); }); @@ -761,21 +786,29 @@ describe('$aria', function() { }); }); - describe('actions when bindKeypress is set to false', function() { + describe('actions when bindKeydown is set to false', function() { beforeEach(configAriaProvider({ - bindKeypress: false + bindKeydown: false })); beforeEach(injectScopeAndCompiler); - it('should not a trigger click', function() { - scope.someAction = function() {}; - var clickFn = spyOn(scope, 'someAction'); + it('should not trigger click', function() { + scope.someAction = jasmine.createSpy('someAction'); element = $compile('
    ')(scope); + element.triggerHandler({type: 'keydown', keyCode: 13}); + element.triggerHandler({type: 'keydown', keyCode: 32}); + element.triggerHandler({type: 'keypress', keyCode: 13}); element.triggerHandler({type: 'keypress', keyCode: 32}); + element.triggerHandler({type: 'keyup', keyCode: 13}); + element.triggerHandler({type: 'keyup', keyCode: 32}); + + expect(scope.someAction).not.toHaveBeenCalled(); + + element.triggerHandler({type: 'click', keyCode: 32}); - expect(clickFn).not.toHaveBeenCalled(); + expect(scope.someAction).toHaveBeenCalledOnce(); }); }); From e8c2e119758e58e18fe43932d09a8ff9f506aa9d Mon Sep 17 00:00:00 2001 From: Martin Staffa Date: Wed, 6 Jul 2016 15:04:20 +0200 Subject: [PATCH 0034/1173] fix(select): don't register options when select has no ngModel When option elements use ngValue, value or interpolated text to set the option value, i.e. when the parent select doesn't have an ngModel, there is no necessity in registering the options with the select controller. The registration was usually not a problem, as the ngModelController is set to a noop controller, so that all further interactions are aborted ($render etc) However, since f02b707 ngValue sets a hashed value inside the option value (to support arbitrary value types). This can cause issues with tests that expect unhashed values. The issue was found in angular-material, which uses select + ngValue to populate mdSelect. POSSIBLE BREAKING CHANGE: Option elements will no longer set their value attribute from their text value when their select element has no ngModel associated. Setting the value is only needed for the select directive to match model values and options. If no ngModel is present, the select directive doesn't need it. This should not affect many applications as the behavior was undocumented and not part of a public API. It also has no effect on the usual HTML5 behavior that sets the select value to the option text if the option does not provide a value attribute. PR (#14864) --- src/ng/directive/select.js | 11 ++++++++--- test/ng/directive/selectSpec.js | 24 ++++++++++++++++++++++++ 2 files changed, 32 insertions(+), 3 deletions(-) diff --git a/src/ng/directive/select.js b/src/ng/directive/select.js index b583546d653f..59b505323d91 100644 --- a/src/ng/directive/select.js +++ b/src/ng/directive/select.js @@ -519,11 +519,16 @@ var selectDirective = function() { function selectPreLink(scope, element, attr, ctrls) { - // if ngModel is not defined, we don't need to do anything + var selectCtrl = ctrls[0]; var ngModelCtrl = ctrls[1]; - if (!ngModelCtrl) return; - var selectCtrl = ctrls[0]; + // if ngModel is not defined, we don't need to do anything but set the registerOption + // function to noop, so options don't get added internally + if (!ngModelCtrl) { + selectCtrl.registerOption = noop; + return; + } + selectCtrl.ngModelCtrl = ngModelCtrl; diff --git a/test/ng/directive/selectSpec.js b/test/ng/directive/selectSpec.js index 9027aa657326..17f1a6b26f74 100644 --- a/test/ng/directive/selectSpec.js +++ b/test/ng/directive/selectSpec.js @@ -136,6 +136,30 @@ describe('select', function() { }); + it('should not add options to the select if ngModel is not present', inject(function($rootScope) { + var scope = $rootScope; + scope.d = 'd'; + scope.e = 'e'; + scope.f = 'f'; + + compile(''); + + var selectCtrl = element.controller('select'); + + expect(selectCtrl.hasOption('a')).toBe(false); + expect(selectCtrl.hasOption('b')).toBe(false); + expect(selectCtrl.hasOption('c')).toBe(false); + expect(selectCtrl.hasOption('d')).toBe(false); + expect(selectCtrl.hasOption('e')).toBe(false); + expect(selectCtrl.hasOption('f')).toBe(false); + })); describe('select-one', function() { From c72e13fdb696eb0622efbc49d0e2ee487db30977 Mon Sep 17 00:00:00 2001 From: Martin Staffa Date: Thu, 7 Jul 2016 15:26:18 +0200 Subject: [PATCH 0035/1173] chore(package.json): update jasmine-reporters to 2.2.0 --- npm-shrinkwrap.clean.json | 763 ++++---------- npm-shrinkwrap.json | 2012 ++++++++++++++----------------------- package.json | 2 +- 3 files changed, 975 insertions(+), 1802 deletions(-) diff --git a/npm-shrinkwrap.clean.json b/npm-shrinkwrap.clean.json index 9bc84a265a67..aab6d85e2f55 100644 --- a/npm-shrinkwrap.clean.json +++ b/npm-shrinkwrap.clean.json @@ -7,10 +7,10 @@ "version": "3.3.6" }, "express": { - "version": "4.13.4", + "version": "4.14.0", "dependencies": { "accepts": { - "version": "1.2.13", + "version": "1.3.3", "dependencies": { "mime-types": { "version": "2.1.11", @@ -21,7 +21,7 @@ } }, "negotiator": { - "version": "0.5.3" + "version": "0.6.1" } } }, @@ -35,7 +35,7 @@ "version": "1.0.2" }, "cookie": { - "version": "0.1.5" + "version": "0.3.1" }, "cookie-signature": { "version": "1.0.6" @@ -51,6 +51,9 @@ "depd": { "version": "1.1.0" }, + "encodeurl": { + "version": "1.0.1" + }, "escape-html": { "version": "1.0.3" }, @@ -58,8 +61,11 @@ "version": "1.7.0" }, "finalhandler": { - "version": "0.4.1", + "version": "0.5.0", "dependencies": { + "statuses": { + "version": "1.3.0" + }, "unpipe": { "version": "1.0.0" } @@ -89,33 +95,36 @@ "version": "0.1.7" }, "proxy-addr": { - "version": "1.0.10", + "version": "1.1.2", "dependencies": { "forwarded": { "version": "0.1.0" }, "ipaddr.js": { - "version": "1.0.5" + "version": "1.1.1" } } }, "qs": { - "version": "4.0.0" + "version": "6.2.0" }, "range-parser": { - "version": "1.0.3" + "version": "1.2.0" }, "send": { - "version": "0.13.1", + "version": "0.14.1", "dependencies": { "destroy": { "version": "1.0.4" }, "http-errors": { - "version": "1.3.1", + "version": "1.5.0", "dependencies": { "inherits": { "version": "2.0.1" + }, + "setprototypeof": { + "version": "1.0.1" } } }, @@ -126,15 +135,15 @@ "version": "0.7.1" }, "statuses": { - "version": "1.2.1" + "version": "1.3.0" } } }, "serve-static": { - "version": "1.10.2" + "version": "1.11.1" }, "type-is": { - "version": "1.6.12", + "version": "1.6.13", "dependencies": { "media-typer": { "version": "0.3.0" @@ -153,7 +162,7 @@ "version": "1.0.0" }, "vary": { - "version": "1.0.1" + "version": "1.1.0" } } }, @@ -169,16 +178,19 @@ } }, "rimraf": { - "version": "2.5.2", + "version": "2.5.3", "dependencies": { "glob": { - "version": "7.0.3", + "version": "7.0.5", "dependencies": { + "fs.realpath": { + "version": "1.0.0" + }, "inflight": { - "version": "1.0.4", + "version": "1.0.5", "dependencies": { "wrappy": { - "version": "1.0.1" + "version": "1.0.2" } } }, @@ -186,10 +198,10 @@ "version": "2.0.1" }, "minimatch": { - "version": "3.0.0", + "version": "3.0.2", "dependencies": { "brace-expansion": { - "version": "1.1.4", + "version": "1.1.5", "dependencies": { "balanced-match": { "version": "0.4.1" @@ -205,7 +217,7 @@ "version": "1.3.3", "dependencies": { "wrappy": { - "version": "1.0.1" + "version": "1.0.2" } } }, @@ -337,7 +349,7 @@ } }, "browser-resolve": { - "version": "1.11.1", + "version": "1.11.2", "dependencies": { "resolve": { "version": "1.1.7" @@ -433,13 +445,13 @@ "version": "4.0.0", "dependencies": { "bn.js": { - "version": "4.11.3" + "version": "4.11.4" }, "browserify-rsa": { "version": "4.0.1" }, "elliptic": { - "version": "6.2.3", + "version": "6.3.1", "dependencies": { "brorand": { "version": "1.0.5" @@ -453,7 +465,7 @@ "version": "5.0.0", "dependencies": { "asn1.js": { - "version": "4.6.0", + "version": "4.6.2", "dependencies": { "minimalistic-assert": { "version": "1.0.0" @@ -482,10 +494,10 @@ "version": "4.0.0", "dependencies": { "bn.js": { - "version": "4.11.3" + "version": "4.11.4" }, "elliptic": { - "version": "6.2.3", + "version": "6.3.1", "dependencies": { "brorand": { "version": "1.0.5" @@ -518,7 +530,7 @@ "version": "5.0.2", "dependencies": { "bn.js": { - "version": "4.11.3" + "version": "4.11.4" }, "miller-rabin": { "version": "4.0.0", @@ -537,7 +549,7 @@ "version": "4.0.0", "dependencies": { "bn.js": { - "version": "4.11.3" + "version": "4.11.4" }, "browserify-rsa": { "version": "4.0.1" @@ -546,7 +558,7 @@ "version": "5.0.0", "dependencies": { "asn1.js": { - "version": "4.6.0", + "version": "4.6.2", "dependencies": { "minimalistic-assert": { "version": "1.0.0" @@ -586,7 +598,7 @@ "version": "1.3.9", "dependencies": { "JSONStream": { - "version": "1.1.1", + "version": "1.1.3", "dependencies": { "jsonparse": { "version": "1.2.0" @@ -611,10 +623,10 @@ "version": "4.5.3", "dependencies": { "inflight": { - "version": "1.0.4", + "version": "1.0.5", "dependencies": { "wrappy": { - "version": "1.0.1" + "version": "1.0.2" } } }, @@ -622,7 +634,7 @@ "version": "2.0.10", "dependencies": { "brace-expansion": { - "version": "1.1.4", + "version": "1.1.5", "dependencies": { "balanced-match": { "version": "0.4.1" @@ -638,7 +650,7 @@ "version": "1.3.3", "dependencies": { "wrappy": { - "version": "1.0.1" + "version": "1.0.2" } } } @@ -662,7 +674,7 @@ "version": "6.6.3", "dependencies": { "JSONStream": { - "version": "1.1.1", + "version": "1.1.3", "dependencies": { "jsonparse": { "version": "1.2.0" @@ -711,7 +723,7 @@ } }, "process": { - "version": "0.11.3" + "version": "0.11.5" }, "xtend": { "version": "4.0.1" @@ -741,7 +753,7 @@ "version": "3.9.1", "dependencies": { "JSONStream": { - "version": "1.1.1", + "version": "1.1.3", "dependencies": { "jsonparse": { "version": "1.2.0" @@ -884,7 +896,7 @@ "version": "1.4.2", "dependencies": { "process": { - "version": "0.11.3" + "version": "0.11.5" } } }, @@ -2930,7 +2942,7 @@ } }, "dgeni-packages": { - "version": "0.14.0", + "version": "0.13.0", "dependencies": { "catharsis": { "version": "0.8.8", @@ -2946,19 +2958,16 @@ } }, "change-case": { - "version": "3.0.0", + "version": "2.3.1", "dependencies": { "camel-case": { - "version": "3.0.0" + "version": "1.2.2" }, "constant-case": { - "version": "2.0.0" + "version": "1.1.2" }, "dot-case": { - "version": "2.1.0" - }, - "header-case": { - "version": "1.0.0" + "version": "1.1.2" }, "is-lower-case": { "version": "1.1.3" @@ -2972,29 +2981,26 @@ "lower-case-first": { "version": "1.0.2" }, - "no-case": { - "version": "2.3.0" - }, "param-case": { - "version": "2.1.0" + "version": "1.1.2" }, "pascal-case": { - "version": "2.0.0" + "version": "1.1.2" }, "path-case": { - "version": "2.1.0" + "version": "1.1.2" }, "sentence-case": { - "version": "2.1.0" + "version": "1.1.3" }, "snake-case": { - "version": "2.1.0" + "version": "1.1.2" }, "swap-case": { "version": "1.1.2" }, "title-case": { - "version": "2.1.0" + "version": "1.1.2" }, "upper-case": { "version": "1.1.3" @@ -3011,37 +3017,15 @@ "version": "4.2.0" }, "glob": { - "version": "7.0.5", + "version": "3.2.11", "dependencies": { - "fs.realpath": { - "version": "1.0.0" - }, - "inflight": { - "version": "1.0.5", - "dependencies": { - "wrappy": { - "version": "1.0.2" - } - } - }, "inherits": { "version": "2.0.1" - }, - "once": { - "version": "1.3.3", - "dependencies": { - "wrappy": { - "version": "1.0.2" - } - } - }, - "path-is-absolute": { - "version": "1.0.0" } } }, "htmlparser2": { - "version": "3.9.1", + "version": "3.9.0", "dependencies": { "domelementtype": { "version": "1.3.0" @@ -3065,18 +3049,15 @@ "entities": { "version": "1.1.1" }, - "inherits": { - "version": "2.0.1" - }, "readable-stream": { - "version": "2.1.4", + "version": "2.1.2", "dependencies": { - "buffer-shims": { - "version": "1.0.0" - }, "core-util-is": { "version": "1.0.2" }, + "inherits": { + "version": "2.0.1" + }, "isarray": { "version": "1.0.0" }, @@ -3093,22 +3074,14 @@ } } }, - "lodash": { - "version": "4.13.1" - }, "minimatch": { - "version": "3.0.2", + "version": "0.3.0", "dependencies": { - "brace-expansion": { - "version": "1.1.5", - "dependencies": { - "balanced-match": { - "version": "0.4.1" - }, - "concat-map": { - "version": "0.0.1" - } - } + "lru-cache": { + "version": "2.7.3" + }, + "sigmund": { + "version": "1.0.1" } } }, @@ -3167,46 +3140,135 @@ }, "async-each": { "version": "0.1.6" - }, - "fsevents": { - "version": "0.3.8", - "dependencies": { - "nan": { - "version": "2.3.5" - } - } } } } } }, - "q": { - "version": "1.4.1" - }, - "semver": { - "version": "5.2.0" - }, - "shelljs": { - "version": "0.7.0", + "q-io": { + "version": "1.10.9", "dependencies": { - "interpret": { - "version": "1.0.1" + "q": { + "version": "0.9.7" }, - "rechoir": { - "version": "0.6.2", + "qs": { + "version": "0.1.0" + }, + "url2": { + "version": "0.0.0" + }, + "mime": { + "version": "1.2.11" + }, + "mimeparse": { + "version": "0.1.4" + }, + "collections": { + "version": "0.2.2", "dependencies": { - "resolve": { - "version": "1.1.7" + "weak-map": { + "version": "1.0.0" } } } } }, + "semver": { + "version": "4.3.6" + }, + "shelljs": { + "version": "0.5.3" + }, "spdx-license-list": { "version": "2.1.0" }, "typescript": { "version": "1.8.10" + }, + "winston": { + "version": "0.7.3", + "dependencies": { + "async": { + "version": "0.2.10" + }, + "colors": { + "version": "0.6.2" + }, + "cycle": { + "version": "1.0.3" + }, + "eyes": { + "version": "0.1.8" + }, + "pkginfo": { + "version": "0.3.1" + }, + "request": { + "version": "2.16.6", + "dependencies": { + "form-data": { + "version": "0.0.10", + "dependencies": { + "combined-stream": { + "version": "0.0.7", + "dependencies": { + "delayed-stream": { + "version": "0.0.5" + } + } + } + } + }, + "mime": { + "version": "1.2.11" + }, + "hawk": { + "version": "0.10.2", + "dependencies": { + "hoek": { + "version": "0.7.6" + }, + "boom": { + "version": "0.3.8" + }, + "cryptiles": { + "version": "0.1.3" + }, + "sntp": { + "version": "0.1.4" + } + } + }, + "node-uuid": { + "version": "1.4.7" + }, + "cookie-jar": { + "version": "0.2.0" + }, + "aws-sign": { + "version": "0.2.0" + }, + "oauth-sign": { + "version": "0.2.0" + }, + "forever-agent": { + "version": "0.2.0" + }, + "tunnel-agent": { + "version": "0.2.0" + }, + "json-stringify-safe": { + "version": "3.0.0" + }, + "qs": { + "version": "0.5.6" + } + } + }, + "stack-trace": { + "version": "0.0.9" + } + } } } }, @@ -6401,10 +6463,45 @@ } }, "jasmine-reporters": { - "version": "1.0.2", + "version": "2.2.0", "dependencies": { + "jasmine": { + "version": "2.4.1", + "dependencies": { + "exit": { + "version": "0.1.2" + }, + "glob": { + "version": "3.2.11", + "dependencies": { + "inherits": { + "version": "2.0.1" + }, + "minimatch": { + "version": "0.3.0", + "dependencies": { + "lru-cache": { + "version": "2.7.3" + }, + "sigmund": { + "version": "1.0.1" + } + } + } + } + } + } + }, "mkdirp": { - "version": "0.3.5" + "version": "0.5.1", + "dependencies": { + "minimist": { + "version": "0.0.8" + } + } + }, + "xmldom": { + "version": "0.1.22" } } }, @@ -6861,398 +6958,6 @@ } } } - }, - "fsevents": { - "version": "1.0.12", - "dependencies": { - "nan": { - "version": "2.3.3" - }, - "node-pre-gyp": { - "version": "0.6.25", - "dependencies": { - "nopt": { - "version": "3.0.6", - "dependencies": { - "abbrev": { - "version": "1.0.7" - } - } - } - } - }, - "ansi-regex": { - "version": "2.0.0" - }, - "ansi": { - "version": "0.3.1" - }, - "ansi-styles": { - "version": "2.2.1" - }, - "are-we-there-yet": { - "version": "1.1.2" - }, - "assert-plus": { - "version": "0.2.0" - }, - "async": { - "version": "1.5.2" - }, - "aws-sign2": { - "version": "0.6.0" - }, - "bl": { - "version": "1.0.3" - }, - "block-stream": { - "version": "0.0.8" - }, - "asn1": { - "version": "0.2.3" - }, - "boom": { - "version": "2.10.1" - }, - "caseless": { - "version": "0.11.0" - }, - "combined-stream": { - "version": "1.0.5" - }, - "chalk": { - "version": "1.1.3" - }, - "core-util-is": { - "version": "1.0.2" - }, - "cryptiles": { - "version": "2.0.5" - }, - "commander": { - "version": "2.9.0" - }, - "debug": { - "version": "2.2.0" - }, - "delayed-stream": { - "version": "1.0.0" - }, - "deep-extend": { - "version": "0.4.1" - }, - "ecc-jsbn": { - "version": "0.1.1" - }, - "delegates": { - "version": "1.0.0" - }, - "escape-string-regexp": { - "version": "1.0.5" - }, - "extsprintf": { - "version": "1.0.2" - }, - "extend": { - "version": "3.0.0" - }, - "forever-agent": { - "version": "0.6.1" - }, - "form-data": { - "version": "1.0.0-rc4" - }, - "fstream": { - "version": "1.0.8" - }, - "gauge": { - "version": "1.2.7" - }, - "generate-function": { - "version": "2.0.0" - }, - "generate-object-property": { - "version": "1.2.0" - }, - "graceful-readlink": { - "version": "1.0.1" - }, - "graceful-fs": { - "version": "4.1.3" - }, - "har-validator": { - "version": "2.0.6" - }, - "has-ansi": { - "version": "2.0.0" - }, - "hawk": { - "version": "3.1.3" - }, - "has-unicode": { - "version": "2.0.0" - }, - "hoek": { - "version": "2.16.3" - }, - "inherits": { - "version": "2.0.1" - }, - "ini": { - "version": "1.3.4" - }, - "http-signature": { - "version": "1.1.1" - }, - "is-my-json-valid": { - "version": "2.13.1" - }, - "isarray": { - "version": "1.0.0" - }, - "isstream": { - "version": "0.1.2" - }, - "is-property": { - "version": "1.0.2" - }, - "jsbn": { - "version": "0.1.0" - }, - "is-typedarray": { - "version": "1.0.0" - }, - "jodid25519": { - "version": "1.0.2" - }, - "json-schema": { - "version": "0.2.2" - }, - "json-stringify-safe": { - "version": "5.0.1" - }, - "lodash.pad": { - "version": "4.1.0" - }, - "jsonpointer": { - "version": "2.0.0" - }, - "jsprim": { - "version": "1.2.2" - }, - "lodash.padend": { - "version": "4.2.0" - }, - "lodash.padstart": { - "version": "4.2.0" - }, - "lodash.repeat": { - "version": "4.0.0" - }, - "lodash.tostring": { - "version": "4.1.2" - }, - "mime-db": { - "version": "1.22.0" - }, - "minimist": { - "version": "0.0.8" - }, - "mime-types": { - "version": "2.1.10" - }, - "mkdirp": { - "version": "0.5.1" - }, - "ms": { - "version": "0.7.1" - }, - "node-uuid": { - "version": "1.4.7" - }, - "npmlog": { - "version": "2.0.3" - }, - "oauth-sign": { - "version": "0.8.1" - }, - "once": { - "version": "1.3.3" - }, - "pinkie": { - "version": "2.0.4" - }, - "pinkie-promise": { - "version": "2.0.0" - }, - "process-nextick-args": { - "version": "1.0.6" - }, - "qs": { - "version": "6.0.2" - }, - "request": { - "version": "2.69.0" - }, - "readable-stream": { - "version": "2.0.6" - }, - "sntp": { - "version": "1.0.9" - }, - "semver": { - "version": "5.1.0" - }, - "sshpk": { - "version": "1.7.4" - }, - "string_decoder": { - "version": "0.10.31" - }, - "stringstream": { - "version": "0.0.5" - }, - "strip-ansi": { - "version": "3.0.1" - }, - "supports-color": { - "version": "2.0.0" - }, - "strip-json-comments": { - "version": "1.0.4" - }, - "tar-pack": { - "version": "3.1.3" - }, - "tar": { - "version": "2.2.1" - }, - "tunnel-agent": { - "version": "0.4.2" - }, - "tough-cookie": { - "version": "2.2.2" - }, - "uid-number": { - "version": "0.0.6" - }, - "tweetnacl": { - "version": "0.14.3" - }, - "util-deprecate": { - "version": "1.0.2" - }, - "verror": { - "version": "1.3.6" - }, - "wrappy": { - "version": "1.0.1" - }, - "xtend": { - "version": "4.0.1" - }, - "dashdash": { - "version": "1.13.0", - "dependencies": { - "assert-plus": { - "version": "1.0.0" - } - } - }, - "rc": { - "version": "1.1.6", - "dependencies": { - "minimist": { - "version": "1.2.0" - } - } - }, - "aws4": { - "version": "1.3.2", - "dependencies": { - "lru-cache": { - "version": "4.0.1", - "dependencies": { - "pseudomap": { - "version": "1.0.2" - }, - "yallist": { - "version": "2.0.0" - } - } - } - } - }, - "fstream-ignore": { - "version": "1.0.3", - "dependencies": { - "minimatch": { - "version": "3.0.0", - "dependencies": { - "brace-expansion": { - "version": "1.1.3", - "dependencies": { - "balanced-match": { - "version": "0.3.0" - }, - "concat-map": { - "version": "0.0.1" - } - } - } - } - } - } - }, - "rimraf": { - "version": "2.5.2", - "dependencies": { - "glob": { - "version": "7.0.3", - "dependencies": { - "inflight": { - "version": "1.0.4", - "dependencies": { - "wrappy": { - "version": "1.0.1" - } - } - }, - "inherits": { - "version": "2.0.1" - }, - "minimatch": { - "version": "3.0.0", - "dependencies": { - "brace-expansion": { - "version": "1.1.3", - "dependencies": { - "balanced-match": { - "version": "0.3.0" - }, - "concat-map": { - "version": "0.0.1" - } - } - } - } - }, - "once": { - "version": "1.3.3", - "dependencies": { - "wrappy": { - "version": "1.0.1" - } - } - }, - "path-is-absolute": { - "version": "1.0.0" - } - } - } - } - } - } } } }, @@ -8730,28 +8435,6 @@ }, "ultron": { "version": "1.0.2" - }, - "bufferutil": { - "version": "1.2.1", - "dependencies": { - "bindings": { - "version": "1.2.1" - }, - "nan": { - "version": "2.3.3" - } - } - }, - "utf-8-validate": { - "version": "1.2.1", - "dependencies": { - "bindings": { - "version": "1.2.1" - }, - "nan": { - "version": "2.3.3" - } - } } } }, diff --git a/npm-shrinkwrap.json b/npm-shrinkwrap.json index a31a981f2543..4e90103d37af 100644 --- a/npm-shrinkwrap.json +++ b/npm-shrinkwrap.json @@ -8,228 +8,243 @@ "dependencies": { "bootstrap": { "version": "3.3.6", - "from": "https://registry.npmjs.org/bootstrap/-/bootstrap-3.3.6.tgz", + "from": "bootstrap@>=3.2.0 <4.0.0", "resolved": "https://registry.npmjs.org/bootstrap/-/bootstrap-3.3.6.tgz" }, "express": { - "version": "4.13.4", - "from": "https://registry.npmjs.org/express/-/express-4.13.4.tgz", - "resolved": "https://registry.npmjs.org/express/-/express-4.13.4.tgz", + "version": "4.14.0", + "from": "express@>=4.8.6 <5.0.0", + "resolved": "https://registry.npmjs.org/express/-/express-4.14.0.tgz", "dependencies": { "accepts": { - "version": "1.2.13", - "from": "https://registry.npmjs.org/accepts/-/accepts-1.2.13.tgz", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.2.13.tgz", + "version": "1.3.3", + "from": "accepts@>=1.3.3 <1.4.0", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.3.tgz", "dependencies": { "mime-types": { "version": "2.1.11", - "from": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.11.tgz", + "from": "mime-types@>=2.1.11 <2.2.0", "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.11.tgz", "dependencies": { "mime-db": { "version": "1.23.0", - "from": "https://registry.npmjs.org/mime-db/-/mime-db-1.23.0.tgz", + "from": "mime-db@>=1.23.0 <1.24.0", "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.23.0.tgz" } } }, "negotiator": { - "version": "0.5.3", - "from": "https://registry.npmjs.org/negotiator/-/negotiator-0.5.3.tgz", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.5.3.tgz" + "version": "0.6.1", + "from": "negotiator@0.6.1", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.1.tgz" } } }, "array-flatten": { "version": "1.1.1", - "from": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "from": "array-flatten@1.1.1", "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz" }, "content-disposition": { "version": "0.5.1", - "from": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.1.tgz", + "from": "content-disposition@0.5.1", "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.1.tgz" }, "content-type": { "version": "1.0.2", - "from": "https://registry.npmjs.org/content-type/-/content-type-1.0.2.tgz", + "from": "content-type@>=1.0.2 <1.1.0", "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.2.tgz" }, "cookie": { - "version": "0.1.5", - "from": "https://registry.npmjs.org/cookie/-/cookie-0.1.5.tgz", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.1.5.tgz" + "version": "0.3.1", + "from": "cookie@0.3.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.3.1.tgz" }, "cookie-signature": { "version": "1.0.6", - "from": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "from": "cookie-signature@1.0.6", "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz" }, "debug": { "version": "2.2.0", - "from": "https://registry.npmjs.org/debug/-/debug-2.2.0.tgz", + "from": "debug@>=2.2.0 <2.3.0", "resolved": "https://registry.npmjs.org/debug/-/debug-2.2.0.tgz", "dependencies": { "ms": { "version": "0.7.1", - "from": "https://registry.npmjs.org/ms/-/ms-0.7.1.tgz", + "from": "ms@0.7.1", "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.1.tgz" } } }, "depd": { "version": "1.1.0", - "from": "https://registry.npmjs.org/depd/-/depd-1.1.0.tgz", + "from": "depd@>=1.1.0 <1.2.0", "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.0.tgz" }, + "encodeurl": { + "version": "1.0.1", + "from": "encodeurl@>=1.0.1 <1.1.0", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.1.tgz" + }, "escape-html": { "version": "1.0.3", - "from": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "from": "escape-html@>=1.0.3 <1.1.0", "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz" }, "etag": { "version": "1.7.0", - "from": "https://registry.npmjs.org/etag/-/etag-1.7.0.tgz", + "from": "etag@>=1.7.0 <1.8.0", "resolved": "https://registry.npmjs.org/etag/-/etag-1.7.0.tgz" }, "finalhandler": { - "version": "0.4.1", - "from": "https://registry.npmjs.org/finalhandler/-/finalhandler-0.4.1.tgz", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-0.4.1.tgz", + "version": "0.5.0", + "from": "finalhandler@0.5.0", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-0.5.0.tgz", "dependencies": { + "statuses": { + "version": "1.3.0", + "from": "statuses@>=1.3.0 <1.4.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.3.0.tgz" + }, "unpipe": { "version": "1.0.0", - "from": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "from": "unpipe@>=1.0.0 <1.1.0", "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz" } } }, "fresh": { "version": "0.3.0", - "from": "https://registry.npmjs.org/fresh/-/fresh-0.3.0.tgz", + "from": "fresh@0.3.0", "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.3.0.tgz" }, "merge-descriptors": { "version": "1.0.1", - "from": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", + "from": "merge-descriptors@1.0.1", "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz" }, "methods": { "version": "1.1.2", - "from": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "from": "methods@>=1.1.2 <1.2.0", "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz" }, "on-finished": { "version": "2.3.0", - "from": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", + "from": "on-finished@>=2.3.0 <2.4.0", "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", "dependencies": { "ee-first": { "version": "1.1.1", - "from": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "from": "ee-first@1.1.1", "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz" } } }, "parseurl": { "version": "1.3.1", - "from": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.1.tgz", + "from": "parseurl@>=1.3.1 <1.4.0", "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.1.tgz" }, "path-to-regexp": { "version": "0.1.7", - "from": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", + "from": "path-to-regexp@0.1.7", "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz" }, "proxy-addr": { - "version": "1.0.10", - "from": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-1.0.10.tgz", - "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-1.0.10.tgz", + "version": "1.1.2", + "from": "proxy-addr@>=1.1.2 <1.2.0", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-1.1.2.tgz", "dependencies": { "forwarded": { "version": "0.1.0", - "from": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.0.tgz", + "from": "forwarded@>=0.1.0 <0.2.0", "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.0.tgz" }, "ipaddr.js": { - "version": "1.0.5", - "from": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.0.5.tgz", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.0.5.tgz" + "version": "1.1.1", + "from": "ipaddr.js@1.1.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.1.1.tgz" } } }, "qs": { - "version": "4.0.0", - "from": "https://registry.npmjs.org/qs/-/qs-4.0.0.tgz", - "resolved": "https://registry.npmjs.org/qs/-/qs-4.0.0.tgz" + "version": "6.2.0", + "from": "qs@6.2.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.2.0.tgz" }, "range-parser": { - "version": "1.0.3", - "from": "https://registry.npmjs.org/range-parser/-/range-parser-1.0.3.tgz", - "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.0.3.tgz" + "version": "1.2.0", + "from": "range-parser@>=1.2.0 <1.3.0", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.0.tgz" }, "send": { - "version": "0.13.1", - "from": "https://registry.npmjs.org/send/-/send-0.13.1.tgz", - "resolved": "https://registry.npmjs.org/send/-/send-0.13.1.tgz", + "version": "0.14.1", + "from": "send@0.14.1", + "resolved": "https://registry.npmjs.org/send/-/send-0.14.1.tgz", "dependencies": { "destroy": { "version": "1.0.4", - "from": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", + "from": "destroy@>=1.0.4 <1.1.0", "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz" }, "http-errors": { - "version": "1.3.1", - "from": "https://registry.npmjs.org/http-errors/-/http-errors-1.3.1.tgz", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.3.1.tgz", + "version": "1.5.0", + "from": "http-errors@>=1.5.0 <1.6.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.5.0.tgz", "dependencies": { "inherits": { "version": "2.0.1", - "from": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", + "from": "inherits@2.0.1", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz" + }, + "setprototypeof": { + "version": "1.0.1", + "from": "setprototypeof@1.0.1", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.0.1.tgz" } } }, "mime": { "version": "1.3.4", - "from": "https://registry.npmjs.org/mime/-/mime-1.3.4.tgz", + "from": "mime@1.3.4", "resolved": "https://registry.npmjs.org/mime/-/mime-1.3.4.tgz" }, "ms": { "version": "0.7.1", - "from": "https://registry.npmjs.org/ms/-/ms-0.7.1.tgz", + "from": "ms@0.7.1", "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.1.tgz" }, "statuses": { - "version": "1.2.1", - "from": "https://registry.npmjs.org/statuses/-/statuses-1.2.1.tgz", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.2.1.tgz" + "version": "1.3.0", + "from": "statuses@>=1.3.0 <1.4.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.3.0.tgz" } } }, "serve-static": { - "version": "1.10.2", - "from": "https://registry.npmjs.org/serve-static/-/serve-static-1.10.2.tgz", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.10.2.tgz" + "version": "1.11.1", + "from": "serve-static@>=1.11.1 <1.12.0", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.11.1.tgz" }, "type-is": { - "version": "1.6.12", - "from": "https://registry.npmjs.org/type-is/-/type-is-1.6.12.tgz", - "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.12.tgz", + "version": "1.6.13", + "from": "type-is@>=1.6.13 <1.7.0", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.13.tgz", "dependencies": { "media-typer": { "version": "0.3.0", - "from": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "from": "media-typer@0.3.0", "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz" }, "mime-types": { "version": "2.1.11", - "from": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.11.tgz", + "from": "mime-types@>=2.1.11 <2.2.0", "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.11.tgz", "dependencies": { "mime-db": { "version": "1.23.0", - "from": "https://registry.npmjs.org/mime-db/-/mime-db-1.23.0.tgz", + "from": "mime-db@>=1.23.0 <1.24.0", "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.23.0.tgz" } } @@ -238,78 +253,83 @@ }, "utils-merge": { "version": "1.0.0", - "from": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.0.tgz", + "from": "utils-merge@1.0.0", "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.0.tgz" }, "vary": { - "version": "1.0.1", - "from": "https://registry.npmjs.org/vary/-/vary-1.0.1.tgz", - "resolved": "https://registry.npmjs.org/vary/-/vary-1.0.1.tgz" + "version": "1.1.0", + "from": "vary@>=1.1.0 <1.2.0", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.0.tgz" } } }, "minimist": { "version": "1.2.0", - "from": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "from": "minimist@>=1.1.0 <2.0.0", "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz" }, "mkdirp": { "version": "0.5.1", - "from": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", + "from": "mkdirp@>=0.5.0 <0.6.0", "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", "dependencies": { "minimist": { "version": "0.0.8", - "from": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", + "from": "minimist@0.0.8", "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz" } } }, "rimraf": { - "version": "2.5.2", - "from": "https://registry.npmjs.org/rimraf/-/rimraf-2.5.2.tgz", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.5.2.tgz", + "version": "2.5.3", + "from": "rimraf@>=2.2.8 <3.0.0", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.5.3.tgz", "dependencies": { "glob": { - "version": "7.0.3", - "from": "https://registry.npmjs.org/glob/-/glob-7.0.3.tgz", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.0.3.tgz", + "version": "7.0.5", + "from": "glob@>=7.0.5 <8.0.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.0.5.tgz", "dependencies": { + "fs.realpath": { + "version": "1.0.0", + "from": "fs.realpath@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz" + }, "inflight": { - "version": "1.0.4", - "from": "https://registry.npmjs.org/inflight/-/inflight-1.0.4.tgz", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.4.tgz", + "version": "1.0.5", + "from": "inflight@>=1.0.4 <2.0.0", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.5.tgz", "dependencies": { "wrappy": { - "version": "1.0.1", - "from": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.1.tgz", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.1.tgz" + "version": "1.0.2", + "from": "wrappy@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz" } } }, "inherits": { "version": "2.0.1", - "from": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", + "from": "inherits@>=2.0.0 <3.0.0", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz" }, "minimatch": { - "version": "3.0.0", - "from": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.0.tgz", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.0.tgz", + "version": "3.0.2", + "from": "minimatch@>=3.0.2 <4.0.0", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.2.tgz", "dependencies": { "brace-expansion": { - "version": "1.1.4", - "from": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.4.tgz", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.4.tgz", + "version": "1.1.5", + "from": "brace-expansion@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.5.tgz", "dependencies": { "balanced-match": { "version": "0.4.1", - "from": "https://registry.npmjs.org/balanced-match/-/balanced-match-0.4.1.tgz", + "from": "balanced-match@>=0.4.1 <0.5.0", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-0.4.1.tgz" }, "concat-map": { "version": "0.0.1", - "from": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "from": "concat-map@0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz" } } @@ -318,19 +338,19 @@ }, "once": { "version": "1.3.3", - "from": "https://registry.npmjs.org/once/-/once-1.3.3.tgz", + "from": "once@>=1.3.0 <2.0.0", "resolved": "https://registry.npmjs.org/once/-/once-1.3.3.tgz", "dependencies": { "wrappy": { - "version": "1.0.1", - "from": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.1.tgz", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.1.tgz" + "version": "1.0.2", + "from": "wrappy@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz" } } }, "path-is-absolute": { "version": "1.0.0", - "from": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.0.tgz", + "from": "path-is-absolute@>=1.0.0 <2.0.0", "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.0.tgz" } } @@ -339,69 +359,69 @@ }, "underscore": { "version": "1.8.3", - "from": "https://registry.npmjs.org/underscore/-/underscore-1.8.3.tgz", + "from": "underscore@>=1.6.0 <2.0.0", "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.8.3.tgz" }, "di": { "version": "2.0.0-pre-9", - "from": "https://registry.npmjs.org/di/-/di-2.0.0-pre-9.tgz", + "from": "di@>=2.0.0-pre-9 <2.1.0", "resolved": "https://registry.npmjs.org/di/-/di-2.0.0-pre-9.tgz", "dependencies": { "traceur": { "version": "0.0.33", - "from": "git://github.com/vojtajina/traceur-compiler.git#d90b1e34c799bf61cd1aafdc33db0a554fa9e617", + "from": "vojtajina/traceur-compiler#add-es6-pure-transformer-dist", "resolved": "git://github.com/vojtajina/traceur-compiler.git#d90b1e34c799bf61cd1aafdc33db0a554fa9e617", "dependencies": { "commander": { "version": "2.9.0", - "from": "https://registry.npmjs.org/commander/-/commander-2.9.0.tgz", + "from": "commander@>=1.1.0", "resolved": "https://registry.npmjs.org/commander/-/commander-2.9.0.tgz", "dependencies": { "graceful-readlink": { "version": "1.0.1", - "from": "https://registry.npmjs.org/graceful-readlink/-/graceful-readlink-1.0.1.tgz", + "from": "graceful-readlink@>=1.0.0", "resolved": "https://registry.npmjs.org/graceful-readlink/-/graceful-readlink-1.0.1.tgz" } } }, "q-io": { "version": "1.10.9", - "from": "https://registry.npmjs.org/q-io/-/q-io-1.10.9.tgz", + "from": "q-io@>=1.10.6 <1.11.0", "resolved": "https://registry.npmjs.org/q-io/-/q-io-1.10.9.tgz", "dependencies": { "q": { "version": "0.9.7", - "from": "https://registry.npmjs.org/q/-/q-0.9.7.tgz", + "from": "q@>=0.9.7 <0.10.0", "resolved": "https://registry.npmjs.org/q/-/q-0.9.7.tgz" }, "qs": { "version": "0.1.0", - "from": "https://registry.npmjs.org/qs/-/qs-0.1.0.tgz", + "from": "qs@>=0.1.0 <0.2.0", "resolved": "https://registry.npmjs.org/qs/-/qs-0.1.0.tgz" }, "url2": { "version": "0.0.0", - "from": "https://registry.npmjs.org/url2/-/url2-0.0.0.tgz", + "from": "url2@>=0.0.0 <0.1.0", "resolved": "https://registry.npmjs.org/url2/-/url2-0.0.0.tgz" }, "mime": { "version": "1.2.11", - "from": "https://registry.npmjs.org/mime/-/mime-1.2.11.tgz", + "from": "mime@>=1.2.11 <1.3.0", "resolved": "https://registry.npmjs.org/mime/-/mime-1.2.11.tgz" }, "mimeparse": { "version": "0.1.4", - "from": "https://registry.npmjs.org/mimeparse/-/mimeparse-0.1.4.tgz", + "from": "mimeparse@>=0.1.4 <0.2.0", "resolved": "https://registry.npmjs.org/mimeparse/-/mimeparse-0.1.4.tgz" }, "collections": { "version": "0.2.2", - "from": "https://registry.npmjs.org/collections/-/collections-0.2.2.tgz", + "from": "collections@>=0.2.0 <0.3.0", "resolved": "https://registry.npmjs.org/collections/-/collections-0.2.2.tgz", "dependencies": { "weak-map": { "version": "1.0.0", - "from": "https://registry.npmjs.org/weak-map/-/weak-map-1.0.0.tgz", + "from": "weak-map@1.0.0", "resolved": "https://registry.npmjs.org/weak-map/-/weak-map-1.0.0.tgz" } } @@ -412,66 +432,66 @@ }, "es6-shim": { "version": "0.9.3", - "from": "https://registry.npmjs.org/es6-shim/-/es6-shim-0.9.3.tgz", + "from": "es6-shim@>=0.9.2 <0.10.0", "resolved": "https://registry.npmjs.org/es6-shim/-/es6-shim-0.9.3.tgz" } } }, "rx": { "version": "2.3.25", - "from": "https://registry.npmjs.org/rx/-/rx-2.3.25.tgz", + "from": "rx@>=2.3.20 <2.4.0", "resolved": "https://registry.npmjs.org/rx/-/rx-2.3.25.tgz" }, "browserify": { "version": "7.0.3", - "from": "https://registry.npmjs.org/browserify/-/browserify-7.0.3.tgz", + "from": "browserify@>=7.0.0 <7.1.0", "resolved": "https://registry.npmjs.org/browserify/-/browserify-7.0.3.tgz", "dependencies": { "JSONStream": { "version": "0.8.4", - "from": "https://registry.npmjs.org/JSONStream/-/JSONStream-0.8.4.tgz", + "from": "JSONStream@>=0.8.3 <0.9.0", "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-0.8.4.tgz", "dependencies": { "jsonparse": { "version": "0.0.5", - "from": "https://registry.npmjs.org/jsonparse/-/jsonparse-0.0.5.tgz", + "from": "jsonparse@0.0.5", "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-0.0.5.tgz" }, "through": { "version": "2.3.8", - "from": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "from": "through@>=2.2.7 <3.0.0", "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz" } } }, "assert": { "version": "1.1.2", - "from": "https://registry.npmjs.org/assert/-/assert-1.1.2.tgz", + "from": "assert@>=1.1.0 <1.2.0", "resolved": "https://registry.npmjs.org/assert/-/assert-1.1.2.tgz" }, "browser-pack": { "version": "3.2.0", - "from": "https://registry.npmjs.org/browser-pack/-/browser-pack-3.2.0.tgz", + "from": "browser-pack@>=3.2.0 <4.0.0", "resolved": "https://registry.npmjs.org/browser-pack/-/browser-pack-3.2.0.tgz", "dependencies": { "combine-source-map": { "version": "0.3.0", - "from": "https://registry.npmjs.org/combine-source-map/-/combine-source-map-0.3.0.tgz", + "from": "combine-source-map@>=0.3.0 <0.4.0", "resolved": "https://registry.npmjs.org/combine-source-map/-/combine-source-map-0.3.0.tgz", "dependencies": { "inline-source-map": { "version": "0.3.1", - "from": "https://registry.npmjs.org/inline-source-map/-/inline-source-map-0.3.1.tgz", + "from": "inline-source-map@>=0.3.0 <0.4.0", "resolved": "https://registry.npmjs.org/inline-source-map/-/inline-source-map-0.3.1.tgz", "dependencies": { "source-map": { "version": "0.3.0", - "from": "https://registry.npmjs.org/source-map/-/source-map-0.3.0.tgz", + "from": "source-map@>=0.3.0 <0.4.0", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.3.0.tgz", "dependencies": { "amdefine": { "version": "1.0.0", - "from": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.0.tgz", + "from": "amdefine@>=0.0.4", "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.0.tgz" } } @@ -480,17 +500,17 @@ }, "convert-source-map": { "version": "0.3.5", - "from": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-0.3.5.tgz", + "from": "convert-source-map@>=0.3.0 <0.4.0", "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-0.3.5.tgz" }, "source-map": { "version": "0.1.43", - "from": "https://registry.npmjs.org/source-map/-/source-map-0.1.43.tgz", + "from": "source-map@>=0.1.31 <0.2.0", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.1.43.tgz", "dependencies": { "amdefine": { "version": "1.0.0", - "from": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.0.tgz", + "from": "amdefine@>=0.0.4", "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.0.tgz" } } @@ -499,17 +519,17 @@ }, "through2": { "version": "0.5.1", - "from": "https://registry.npmjs.org/through2/-/through2-0.5.1.tgz", + "from": "through2@>=0.5.1 <0.6.0", "resolved": "https://registry.npmjs.org/through2/-/through2-0.5.1.tgz", "dependencies": { "readable-stream": { "version": "1.0.34", - "from": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", + "from": "readable-stream@>=1.0.17 <1.1.0", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", "dependencies": { "core-util-is": { "version": "1.0.2", - "from": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "from": "core-util-is@>=1.0.0 <1.1.0", "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz" } } @@ -519,135 +539,135 @@ } }, "browser-resolve": { - "version": "1.11.1", - "from": "https://registry.npmjs.org/browser-resolve/-/browser-resolve-1.11.1.tgz", - "resolved": "https://registry.npmjs.org/browser-resolve/-/browser-resolve-1.11.1.tgz", + "version": "1.11.2", + "from": "browser-resolve@>=1.3.0 <2.0.0", + "resolved": "https://registry.npmjs.org/browser-resolve/-/browser-resolve-1.11.2.tgz", "dependencies": { "resolve": { "version": "1.1.7", - "from": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz", + "from": "resolve@1.1.7", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz" } } }, "browserify-zlib": { "version": "0.1.4", - "from": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.1.4.tgz", + "from": "browserify-zlib@>=0.1.2 <0.2.0", "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.1.4.tgz", "dependencies": { "pako": { "version": "0.2.8", - "from": "https://registry.npmjs.org/pako/-/pako-0.2.8.tgz", + "from": "pako@>=0.2.0 <0.3.0", "resolved": "https://registry.npmjs.org/pako/-/pako-0.2.8.tgz" } } }, "buffer": { "version": "2.8.2", - "from": "https://registry.npmjs.org/buffer/-/buffer-2.8.2.tgz", + "from": "buffer@>=2.3.0 <3.0.0", "resolved": "https://registry.npmjs.org/buffer/-/buffer-2.8.2.tgz", "dependencies": { "base64-js": { "version": "0.0.7", - "from": "https://registry.npmjs.org/base64-js/-/base64-js-0.0.7.tgz", + "from": "base64-js@0.0.7", "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-0.0.7.tgz" }, "ieee754": { "version": "1.1.6", - "from": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.6.tgz", + "from": "ieee754@>=1.1.4 <2.0.0", "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.6.tgz" }, "is-array": { "version": "1.0.1", - "from": "https://registry.npmjs.org/is-array/-/is-array-1.0.1.tgz", + "from": "is-array@>=1.0.1 <2.0.0", "resolved": "https://registry.npmjs.org/is-array/-/is-array-1.0.1.tgz" } } }, "builtins": { "version": "0.0.7", - "from": "https://registry.npmjs.org/builtins/-/builtins-0.0.7.tgz", + "from": "builtins@>=0.0.3 <0.1.0", "resolved": "https://registry.npmjs.org/builtins/-/builtins-0.0.7.tgz" }, "commondir": { "version": "0.0.1", - "from": "https://registry.npmjs.org/commondir/-/commondir-0.0.1.tgz", + "from": "commondir@0.0.1", "resolved": "https://registry.npmjs.org/commondir/-/commondir-0.0.1.tgz" }, "concat-stream": { "version": "1.4.10", - "from": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.4.10.tgz", + "from": "concat-stream@>=1.4.1 <1.5.0", "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.4.10.tgz", "dependencies": { "typedarray": { "version": "0.0.6", - "from": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "from": "typedarray@>=0.0.5 <0.1.0", "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz" } } }, "console-browserify": { "version": "1.1.0", - "from": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.1.0.tgz", + "from": "console-browserify@>=1.1.0 <2.0.0", "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.1.0.tgz", "dependencies": { "date-now": { "version": "0.1.4", - "from": "https://registry.npmjs.org/date-now/-/date-now-0.1.4.tgz", + "from": "date-now@>=0.1.4 <0.2.0", "resolved": "https://registry.npmjs.org/date-now/-/date-now-0.1.4.tgz" } } }, "constants-browserify": { "version": "0.0.1", - "from": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-0.0.1.tgz", + "from": "constants-browserify@>=0.0.1 <0.1.0", "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-0.0.1.tgz" }, "crypto-browserify": { "version": "3.11.0", - "from": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.11.0.tgz", + "from": "crypto-browserify@>=3.0.0 <4.0.0", "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.11.0.tgz", "dependencies": { "browserify-cipher": { "version": "1.0.0", - "from": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.0.tgz", + "from": "browserify-cipher@>=1.0.0 <2.0.0", "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.0.tgz", "dependencies": { "browserify-aes": { "version": "1.0.6", - "from": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.0.6.tgz", + "from": "browserify-aes@>=1.0.4 <2.0.0", "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.0.6.tgz", "dependencies": { "buffer-xor": { "version": "1.0.3", - "from": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", + "from": "buffer-xor@>=1.0.2 <2.0.0", "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz" }, "cipher-base": { "version": "1.0.2", - "from": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.2.tgz", + "from": "cipher-base@>=1.0.0 <2.0.0", "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.2.tgz" } } }, "browserify-des": { "version": "1.0.0", - "from": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.0.tgz", + "from": "browserify-des@>=1.0.0 <2.0.0", "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.0.tgz", "dependencies": { "cipher-base": { "version": "1.0.2", - "from": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.2.tgz", + "from": "cipher-base@>=1.0.1 <2.0.0", "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.2.tgz" }, "des.js": { "version": "1.0.0", - "from": "https://registry.npmjs.org/des.js/-/des.js-1.0.0.tgz", + "from": "des.js@>=1.0.0 <2.0.0", "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.0.tgz", "dependencies": { "minimalistic-assert": { "version": "1.0.0", - "from": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.0.tgz", + "from": "minimalistic-assert@>=1.0.0 <2.0.0", "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.0.tgz" } } @@ -656,80 +676,80 @@ }, "evp_bytestokey": { "version": "1.0.0", - "from": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.0.tgz", + "from": "evp_bytestokey@>=1.0.0 <2.0.0", "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.0.tgz" } } }, "browserify-sign": { "version": "4.0.0", - "from": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.0.0.tgz", + "from": "browserify-sign@>=4.0.0 <5.0.0", "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.0.0.tgz", "dependencies": { "bn.js": { - "version": "4.11.3", - "from": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.3.tgz", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.3.tgz" + "version": "4.11.4", + "from": "bn.js@>=4.1.1 <5.0.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.4.tgz" }, "browserify-rsa": { "version": "4.0.1", - "from": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.0.1.tgz", + "from": "browserify-rsa@>=4.0.0 <5.0.0", "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.0.1.tgz" }, "elliptic": { - "version": "6.2.3", - "from": "https://registry.npmjs.org/elliptic/-/elliptic-6.2.3.tgz", - "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.2.3.tgz", + "version": "6.3.1", + "from": "elliptic@>=6.0.0 <7.0.0", + "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.3.1.tgz", "dependencies": { "brorand": { "version": "1.0.5", - "from": "https://registry.npmjs.org/brorand/-/brorand-1.0.5.tgz", + "from": "brorand@>=1.0.1 <2.0.0", "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.0.5.tgz" }, "hash.js": { "version": "1.0.3", - "from": "https://registry.npmjs.org/hash.js/-/hash.js-1.0.3.tgz", + "from": "hash.js@>=1.0.0 <2.0.0", "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.0.3.tgz" } } }, "parse-asn1": { "version": "5.0.0", - "from": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.0.0.tgz", + "from": "parse-asn1@>=5.0.0 <6.0.0", "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.0.0.tgz", "dependencies": { "asn1.js": { - "version": "4.6.0", - "from": "https://registry.npmjs.org/asn1.js/-/asn1.js-4.6.0.tgz", - "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-4.6.0.tgz", + "version": "4.6.2", + "from": "asn1.js@>=4.0.0 <5.0.0", + "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-4.6.2.tgz", "dependencies": { "minimalistic-assert": { "version": "1.0.0", - "from": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.0.tgz", + "from": "minimalistic-assert@>=1.0.0 <2.0.0", "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.0.tgz" } } }, "browserify-aes": { "version": "1.0.6", - "from": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.0.6.tgz", + "from": "browserify-aes@>=1.0.0 <2.0.0", "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.0.6.tgz", "dependencies": { "buffer-xor": { "version": "1.0.3", - "from": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", + "from": "buffer-xor@>=1.0.2 <2.0.0", "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz" }, "cipher-base": { "version": "1.0.2", - "from": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.2.tgz", + "from": "cipher-base@>=1.0.0 <2.0.0", "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.2.tgz" } } }, "evp_bytestokey": { "version": "1.0.0", - "from": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.0.tgz", + "from": "evp_bytestokey@>=1.0.0 <2.0.0", "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.0.tgz" } } @@ -738,27 +758,27 @@ }, "create-ecdh": { "version": "4.0.0", - "from": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.0.tgz", + "from": "create-ecdh@>=4.0.0 <5.0.0", "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.0.tgz", "dependencies": { "bn.js": { - "version": "4.11.3", - "from": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.3.tgz", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.3.tgz" + "version": "4.11.4", + "from": "bn.js@>=4.1.0 <5.0.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.4.tgz" }, "elliptic": { - "version": "6.2.3", - "from": "https://registry.npmjs.org/elliptic/-/elliptic-6.2.3.tgz", - "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.2.3.tgz", + "version": "6.3.1", + "from": "elliptic@>=6.0.0 <7.0.0", + "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.3.1.tgz", "dependencies": { "brorand": { "version": "1.0.5", - "from": "https://registry.npmjs.org/brorand/-/brorand-1.0.5.tgz", + "from": "brorand@>=1.0.1 <2.0.0", "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.0.5.tgz" }, "hash.js": { "version": "1.0.3", - "from": "https://registry.npmjs.org/hash.js/-/hash.js-1.0.3.tgz", + "from": "hash.js@>=1.0.0 <2.0.0", "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.0.3.tgz" } } @@ -767,49 +787,49 @@ }, "create-hash": { "version": "1.1.2", - "from": "https://registry.npmjs.org/create-hash/-/create-hash-1.1.2.tgz", + "from": "create-hash@>=1.1.0 <2.0.0", "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.1.2.tgz", "dependencies": { "cipher-base": { "version": "1.0.2", - "from": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.2.tgz", + "from": "cipher-base@>=1.0.1 <2.0.0", "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.2.tgz" }, "ripemd160": { "version": "1.0.1", - "from": "https://registry.npmjs.org/ripemd160/-/ripemd160-1.0.1.tgz", + "from": "ripemd160@>=1.0.0 <2.0.0", "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-1.0.1.tgz" }, "sha.js": { "version": "2.4.5", - "from": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.5.tgz", + "from": "sha.js@>=2.3.6 <3.0.0", "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.5.tgz" } } }, "create-hmac": { "version": "1.1.4", - "from": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.4.tgz", + "from": "create-hmac@>=1.1.0 <2.0.0", "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.4.tgz" }, "diffie-hellman": { "version": "5.0.2", - "from": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.2.tgz", + "from": "diffie-hellman@>=5.0.0 <6.0.0", "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.2.tgz", "dependencies": { "bn.js": { - "version": "4.11.3", - "from": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.3.tgz", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.3.tgz" + "version": "4.11.4", + "from": "bn.js@>=4.1.0 <5.0.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.4.tgz" }, "miller-rabin": { "version": "4.0.0", - "from": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.0.tgz", + "from": "miller-rabin@>=4.0.0 <5.0.0", "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.0.tgz", "dependencies": { "brorand": { "version": "1.0.5", - "from": "https://registry.npmjs.org/brorand/-/brorand-1.0.5.tgz", + "from": "brorand@>=1.0.1 <2.0.0", "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.0.5.tgz" } } @@ -818,61 +838,61 @@ }, "pbkdf2": { "version": "3.0.4", - "from": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.0.4.tgz", + "from": "pbkdf2@>=3.0.3 <4.0.0", "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.0.4.tgz" }, "public-encrypt": { "version": "4.0.0", - "from": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.0.tgz", + "from": "public-encrypt@>=4.0.0 <5.0.0", "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.0.tgz", "dependencies": { "bn.js": { - "version": "4.11.3", - "from": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.3.tgz", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.3.tgz" + "version": "4.11.4", + "from": "bn.js@>=4.1.0 <5.0.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.4.tgz" }, "browserify-rsa": { "version": "4.0.1", - "from": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.0.1.tgz", + "from": "browserify-rsa@>=4.0.0 <5.0.0", "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.0.1.tgz" }, "parse-asn1": { "version": "5.0.0", - "from": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.0.0.tgz", + "from": "parse-asn1@>=5.0.0 <6.0.0", "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.0.0.tgz", "dependencies": { "asn1.js": { - "version": "4.6.0", - "from": "https://registry.npmjs.org/asn1.js/-/asn1.js-4.6.0.tgz", - "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-4.6.0.tgz", + "version": "4.6.2", + "from": "asn1.js@>=4.0.0 <5.0.0", + "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-4.6.2.tgz", "dependencies": { "minimalistic-assert": { "version": "1.0.0", - "from": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.0.tgz", + "from": "minimalistic-assert@>=1.0.0 <2.0.0", "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.0.tgz" } } }, "browserify-aes": { "version": "1.0.6", - "from": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.0.6.tgz", + "from": "browserify-aes@>=1.0.0 <2.0.0", "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.0.6.tgz", "dependencies": { "buffer-xor": { "version": "1.0.3", - "from": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", + "from": "buffer-xor@>=1.0.2 <2.0.0", "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz" }, "cipher-base": { "version": "1.0.2", - "from": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.2.tgz", + "from": "cipher-base@>=1.0.0 <2.0.0", "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.2.tgz" } } }, "evp_bytestokey": { "version": "1.0.0", - "from": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.0.tgz", + "from": "evp_bytestokey@>=1.0.0 <2.0.0", "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.0.tgz" } } @@ -881,39 +901,39 @@ }, "randombytes": { "version": "2.0.3", - "from": "https://registry.npmjs.org/randombytes/-/randombytes-2.0.3.tgz", + "from": "randombytes@>=2.0.0 <3.0.0", "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.0.3.tgz" } } }, "deep-equal": { "version": "0.2.2", - "from": "https://registry.npmjs.org/deep-equal/-/deep-equal-0.2.2.tgz", + "from": "deep-equal@>=0.2.1 <0.3.0", "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-0.2.2.tgz" }, "defined": { "version": "0.0.0", - "from": "https://registry.npmjs.org/defined/-/defined-0.0.0.tgz", + "from": "defined@>=0.0.0 <0.1.0", "resolved": "https://registry.npmjs.org/defined/-/defined-0.0.0.tgz" }, "deps-sort": { "version": "1.3.9", - "from": "https://registry.npmjs.org/deps-sort/-/deps-sort-1.3.9.tgz", + "from": "deps-sort@>=1.3.5 <2.0.0", "resolved": "https://registry.npmjs.org/deps-sort/-/deps-sort-1.3.9.tgz", "dependencies": { "JSONStream": { - "version": "1.1.1", - "from": "https://registry.npmjs.org/JSONStream/-/JSONStream-1.1.1.tgz", - "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-1.1.1.tgz", + "version": "1.1.3", + "from": "JSONStream@>=1.0.3 <2.0.0", + "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-1.1.3.tgz", "dependencies": { "jsonparse": { "version": "1.2.0", - "from": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.2.0.tgz", + "from": "jsonparse@>=1.1.0 <2.0.0", "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.2.0.tgz" }, "through": { "version": "2.3.8", - "from": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "from": "through@>=2.2.7 <3.0.0", "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz" } } @@ -922,54 +942,54 @@ }, "domain-browser": { "version": "1.1.7", - "from": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.1.7.tgz", + "from": "domain-browser@>=1.1.0 <1.2.0", "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.1.7.tgz" }, "duplexer2": { "version": "0.0.2", - "from": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.0.2.tgz", + "from": "duplexer2@>=0.0.2 <0.1.0", "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.0.2.tgz" }, "events": { "version": "1.0.2", - "from": "https://registry.npmjs.org/events/-/events-1.0.2.tgz", + "from": "events@>=1.0.0 <1.1.0", "resolved": "https://registry.npmjs.org/events/-/events-1.0.2.tgz" }, "glob": { "version": "4.5.3", - "from": "https://registry.npmjs.org/glob/-/glob-4.5.3.tgz", + "from": "glob@>=4.0.5 <5.0.0", "resolved": "https://registry.npmjs.org/glob/-/glob-4.5.3.tgz", "dependencies": { "inflight": { - "version": "1.0.4", - "from": "https://registry.npmjs.org/inflight/-/inflight-1.0.4.tgz", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.4.tgz", + "version": "1.0.5", + "from": "inflight@>=1.0.4 <2.0.0", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.5.tgz", "dependencies": { "wrappy": { - "version": "1.0.1", - "from": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.1.tgz", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.1.tgz" + "version": "1.0.2", + "from": "wrappy@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz" } } }, "minimatch": { "version": "2.0.10", - "from": "https://registry.npmjs.org/minimatch/-/minimatch-2.0.10.tgz", + "from": "minimatch@>=2.0.1 <3.0.0", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-2.0.10.tgz", "dependencies": { "brace-expansion": { - "version": "1.1.4", - "from": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.4.tgz", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.4.tgz", + "version": "1.1.5", + "from": "brace-expansion@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.5.tgz", "dependencies": { "balanced-match": { "version": "0.4.1", - "from": "https://registry.npmjs.org/balanced-match/-/balanced-match-0.4.1.tgz", + "from": "balanced-match@>=0.4.1 <0.5.0", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-0.4.1.tgz" }, "concat-map": { "version": "0.0.1", - "from": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "from": "concat-map@0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz" } } @@ -978,13 +998,13 @@ }, "once": { "version": "1.3.3", - "from": "https://registry.npmjs.org/once/-/once-1.3.3.tgz", + "from": "once@>=1.3.0 <2.0.0", "resolved": "https://registry.npmjs.org/once/-/once-1.3.3.tgz", "dependencies": { "wrappy": { - "version": "1.0.1", - "from": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.1.tgz", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.1.tgz" + "version": "1.0.2", + "from": "wrappy@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz" } } } @@ -992,76 +1012,76 @@ }, "http-browserify": { "version": "1.7.0", - "from": "https://registry.npmjs.org/http-browserify/-/http-browserify-1.7.0.tgz", + "from": "http-browserify@>=1.4.0 <2.0.0", "resolved": "https://registry.npmjs.org/http-browserify/-/http-browserify-1.7.0.tgz", "dependencies": { "Base64": { "version": "0.2.1", - "from": "https://registry.npmjs.org/Base64/-/Base64-0.2.1.tgz", + "from": "Base64@>=0.2.0 <0.3.0", "resolved": "https://registry.npmjs.org/Base64/-/Base64-0.2.1.tgz" } } }, "https-browserify": { "version": "0.0.1", - "from": "https://registry.npmjs.org/https-browserify/-/https-browserify-0.0.1.tgz", + "from": "https-browserify@>=0.0.0 <0.1.0", "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-0.0.1.tgz" }, "inherits": { "version": "2.0.1", - "from": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", + "from": "inherits@>=2.0.1 <2.1.0", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz" }, "insert-module-globals": { "version": "6.6.3", - "from": "https://registry.npmjs.org/insert-module-globals/-/insert-module-globals-6.6.3.tgz", + "from": "insert-module-globals@>=6.1.0 <7.0.0", "resolved": "https://registry.npmjs.org/insert-module-globals/-/insert-module-globals-6.6.3.tgz", "dependencies": { "JSONStream": { - "version": "1.1.1", - "from": "https://registry.npmjs.org/JSONStream/-/JSONStream-1.1.1.tgz", - "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-1.1.1.tgz", + "version": "1.1.3", + "from": "JSONStream@>=1.0.3 <2.0.0", + "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-1.1.3.tgz", "dependencies": { "jsonparse": { "version": "1.2.0", - "from": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.2.0.tgz", + "from": "jsonparse@>=1.1.0 <2.0.0", "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.2.0.tgz" }, "through": { "version": "2.3.8", - "from": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "from": "through@>=2.2.7 <3.0.0", "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz" } } }, "combine-source-map": { "version": "0.6.1", - "from": "https://registry.npmjs.org/combine-source-map/-/combine-source-map-0.6.1.tgz", + "from": "combine-source-map@>=0.6.1 <0.7.0", "resolved": "https://registry.npmjs.org/combine-source-map/-/combine-source-map-0.6.1.tgz", "dependencies": { "convert-source-map": { "version": "1.1.3", - "from": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.1.3.tgz", + "from": "convert-source-map@>=1.1.0 <1.2.0", "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.1.3.tgz" }, "inline-source-map": { "version": "0.5.0", - "from": "https://registry.npmjs.org/inline-source-map/-/inline-source-map-0.5.0.tgz", + "from": "inline-source-map@>=0.5.0 <0.6.0", "resolved": "https://registry.npmjs.org/inline-source-map/-/inline-source-map-0.5.0.tgz" }, "lodash.memoize": { "version": "3.0.4", - "from": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-3.0.4.tgz", + "from": "lodash.memoize@>=3.0.3 <3.1.0", "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-3.0.4.tgz" }, "source-map": { "version": "0.4.4", - "from": "https://registry.npmjs.org/source-map/-/source-map-0.4.4.tgz", + "from": "source-map@>=0.4.2 <0.5.0", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.4.4.tgz", "dependencies": { "amdefine": { "version": "1.0.0", - "from": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.0.tgz", + "from": "amdefine@>=0.0.4", "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.0.tgz" } } @@ -1070,22 +1090,22 @@ }, "is-buffer": { "version": "1.1.3", - "from": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.3.tgz", + "from": "is-buffer@>=1.1.0 <2.0.0", "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.3.tgz" }, "lexical-scope": { "version": "1.2.0", - "from": "https://registry.npmjs.org/lexical-scope/-/lexical-scope-1.2.0.tgz", + "from": "lexical-scope@>=1.2.0 <2.0.0", "resolved": "https://registry.npmjs.org/lexical-scope/-/lexical-scope-1.2.0.tgz", "dependencies": { "astw": { "version": "2.0.0", - "from": "https://registry.npmjs.org/astw/-/astw-2.0.0.tgz", + "from": "astw@>=2.0.0 <3.0.0", "resolved": "https://registry.npmjs.org/astw/-/astw-2.0.0.tgz", "dependencies": { "acorn": { "version": "1.2.2", - "from": "https://registry.npmjs.org/acorn/-/acorn-1.2.2.tgz", + "from": "acorn@>=1.0.3 <2.0.0", "resolved": "https://registry.npmjs.org/acorn/-/acorn-1.2.2.tgz" } } @@ -1093,40 +1113,40 @@ } }, "process": { - "version": "0.11.3", - "from": "https://registry.npmjs.org/process/-/process-0.11.3.tgz", - "resolved": "https://registry.npmjs.org/process/-/process-0.11.3.tgz" + "version": "0.11.5", + "from": "process@>=0.11.0 <0.12.0", + "resolved": "https://registry.npmjs.org/process/-/process-0.11.5.tgz" }, "xtend": { "version": "4.0.1", - "from": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", + "from": "xtend@>=4.0.0 <5.0.0", "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz" } } }, "isarray": { "version": "0.0.1", - "from": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "from": "isarray@0.0.1", "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz" }, "labeled-stream-splicer": { "version": "1.0.2", - "from": "https://registry.npmjs.org/labeled-stream-splicer/-/labeled-stream-splicer-1.0.2.tgz", + "from": "labeled-stream-splicer@>=1.0.0 <2.0.0", "resolved": "https://registry.npmjs.org/labeled-stream-splicer/-/labeled-stream-splicer-1.0.2.tgz", "dependencies": { "stream-splicer": { "version": "1.3.2", - "from": "https://registry.npmjs.org/stream-splicer/-/stream-splicer-1.3.2.tgz", + "from": "stream-splicer@>=1.1.0 <2.0.0", "resolved": "https://registry.npmjs.org/stream-splicer/-/stream-splicer-1.3.2.tgz", "dependencies": { "readable-wrap": { "version": "1.0.0", - "from": "https://registry.npmjs.org/readable-wrap/-/readable-wrap-1.0.0.tgz", + "from": "readable-wrap@>=1.0.0 <2.0.0", "resolved": "https://registry.npmjs.org/readable-wrap/-/readable-wrap-1.0.0.tgz" }, "indexof": { "version": "0.0.1", - "from": "https://registry.npmjs.org/indexof/-/indexof-0.0.1.tgz", + "from": "indexof@0.0.1", "resolved": "https://registry.npmjs.org/indexof/-/indexof-0.0.1.tgz" } } @@ -1135,85 +1155,85 @@ }, "module-deps": { "version": "3.9.1", - "from": "https://registry.npmjs.org/module-deps/-/module-deps-3.9.1.tgz", + "from": "module-deps@>=3.6.3 <4.0.0", "resolved": "https://registry.npmjs.org/module-deps/-/module-deps-3.9.1.tgz", "dependencies": { "JSONStream": { - "version": "1.1.1", - "from": "https://registry.npmjs.org/JSONStream/-/JSONStream-1.1.1.tgz", - "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-1.1.1.tgz", + "version": "1.1.3", + "from": "JSONStream@>=1.0.3 <2.0.0", + "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-1.1.3.tgz", "dependencies": { "jsonparse": { "version": "1.2.0", - "from": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.2.0.tgz", + "from": "jsonparse@>=1.1.0 <2.0.0", "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.2.0.tgz" }, "through": { "version": "2.3.8", - "from": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "from": "through@>=2.2.7 <3.0.0", "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz" } } }, "defined": { "version": "1.0.0", - "from": "https://registry.npmjs.org/defined/-/defined-1.0.0.tgz", + "from": "defined@>=1.0.0 <2.0.0", "resolved": "https://registry.npmjs.org/defined/-/defined-1.0.0.tgz" }, "detective": { "version": "4.3.1", - "from": "https://registry.npmjs.org/detective/-/detective-4.3.1.tgz", + "from": "detective@>=4.0.0 <5.0.0", "resolved": "https://registry.npmjs.org/detective/-/detective-4.3.1.tgz", "dependencies": { "acorn": { "version": "1.2.2", - "from": "https://registry.npmjs.org/acorn/-/acorn-1.2.2.tgz", + "from": "acorn@>=1.0.3 <2.0.0", "resolved": "https://registry.npmjs.org/acorn/-/acorn-1.2.2.tgz" } } }, "parents": { "version": "1.0.1", - "from": "https://registry.npmjs.org/parents/-/parents-1.0.1.tgz", + "from": "parents@>=1.0.0 <2.0.0", "resolved": "https://registry.npmjs.org/parents/-/parents-1.0.1.tgz", "dependencies": { "path-platform": { "version": "0.11.15", - "from": "https://registry.npmjs.org/path-platform/-/path-platform-0.11.15.tgz", + "from": "path-platform@>=0.11.15 <0.12.0", "resolved": "https://registry.npmjs.org/path-platform/-/path-platform-0.11.15.tgz" } } }, "resolve": { "version": "1.1.7", - "from": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz", + "from": "resolve@>=1.1.3 <2.0.0", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz" }, "stream-combiner2": { "version": "1.0.2", - "from": "https://registry.npmjs.org/stream-combiner2/-/stream-combiner2-1.0.2.tgz", + "from": "stream-combiner2@>=1.0.0 <1.1.0", "resolved": "https://registry.npmjs.org/stream-combiner2/-/stream-combiner2-1.0.2.tgz", "dependencies": { "through2": { "version": "0.5.1", - "from": "https://registry.npmjs.org/through2/-/through2-0.5.1.tgz", + "from": "through2@>=0.5.1 <0.6.0", "resolved": "https://registry.npmjs.org/through2/-/through2-0.5.1.tgz", "dependencies": { "readable-stream": { "version": "1.0.34", - "from": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", + "from": "readable-stream@>=1.0.17 <1.1.0", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", "dependencies": { "core-util-is": { "version": "1.0.2", - "from": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "from": "core-util-is@>=1.0.0 <1.1.0", "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz" } } }, "xtend": { "version": "3.0.0", - "from": "https://registry.npmjs.org/xtend/-/xtend-3.0.0.tgz", + "from": "xtend@>=3.0.0 <3.1.0", "resolved": "https://registry.npmjs.org/xtend/-/xtend-3.0.0.tgz" } } @@ -1222,207 +1242,207 @@ }, "xtend": { "version": "4.0.1", - "from": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", + "from": "xtend@>=4.0.0 <5.0.0", "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz" } } }, "os-browserify": { "version": "0.1.2", - "from": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.1.2.tgz", + "from": "os-browserify@>=0.1.1 <0.2.0", "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.1.2.tgz" }, "parents": { "version": "0.0.3", - "from": "https://registry.npmjs.org/parents/-/parents-0.0.3.tgz", + "from": "parents@>=0.0.1 <0.1.0", "resolved": "https://registry.npmjs.org/parents/-/parents-0.0.3.tgz", "dependencies": { "path-platform": { "version": "0.0.1", - "from": "https://registry.npmjs.org/path-platform/-/path-platform-0.0.1.tgz", + "from": "path-platform@>=0.0.1 <0.0.2", "resolved": "https://registry.npmjs.org/path-platform/-/path-platform-0.0.1.tgz" } } }, "path-browserify": { "version": "0.0.0", - "from": "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.0.tgz", + "from": "path-browserify@>=0.0.0 <0.1.0", "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.0.tgz" }, "process": { "version": "0.8.0", - "from": "https://registry.npmjs.org/process/-/process-0.8.0.tgz", + "from": "process@>=0.8.0 <0.9.0", "resolved": "https://registry.npmjs.org/process/-/process-0.8.0.tgz" }, "punycode": { "version": "1.2.4", - "from": "https://registry.npmjs.org/punycode/-/punycode-1.2.4.tgz", + "from": "punycode@>=1.2.3 <1.3.0", "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.2.4.tgz" }, "querystring-es3": { "version": "0.2.1", - "from": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz", + "from": "querystring-es3@>=0.2.0 <0.3.0", "resolved": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz" }, "readable-stream": { "version": "1.1.14", - "from": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", + "from": "readable-stream@>=1.0.33-1 <2.0.0", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", "dependencies": { "core-util-is": { "version": "1.0.2", - "from": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "from": "core-util-is@>=1.0.0 <1.1.0", "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz" } } }, "resolve": { "version": "0.7.4", - "from": "https://registry.npmjs.org/resolve/-/resolve-0.7.4.tgz", + "from": "resolve@>=0.7.1 <0.8.0", "resolved": "https://registry.npmjs.org/resolve/-/resolve-0.7.4.tgz" }, "shallow-copy": { "version": "0.0.1", - "from": "https://registry.npmjs.org/shallow-copy/-/shallow-copy-0.0.1.tgz", + "from": "shallow-copy@0.0.1", "resolved": "https://registry.npmjs.org/shallow-copy/-/shallow-copy-0.0.1.tgz" }, "shasum": { "version": "1.0.2", - "from": "https://registry.npmjs.org/shasum/-/shasum-1.0.2.tgz", + "from": "shasum@>=1.0.0 <2.0.0", "resolved": "https://registry.npmjs.org/shasum/-/shasum-1.0.2.tgz", "dependencies": { "json-stable-stringify": { "version": "0.0.1", - "from": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-0.0.1.tgz", + "from": "json-stable-stringify@>=0.0.0 <0.1.0", "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-0.0.1.tgz", "dependencies": { "jsonify": { "version": "0.0.0", - "from": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz", + "from": "jsonify@>=0.0.0 <0.1.0", "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz" } } }, "sha.js": { "version": "2.4.5", - "from": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.5.tgz", + "from": "sha.js@>=2.4.4 <2.5.0", "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.5.tgz" } } }, "shell-quote": { "version": "0.0.1", - "from": "https://registry.npmjs.org/shell-quote/-/shell-quote-0.0.1.tgz", + "from": "shell-quote@>=0.0.1 <0.1.0", "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-0.0.1.tgz" }, "stream-browserify": { "version": "1.0.0", - "from": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-1.0.0.tgz", + "from": "stream-browserify@>=1.0.0 <2.0.0", "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-1.0.0.tgz" }, "string_decoder": { "version": "0.10.31", - "from": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "from": "string_decoder@>=0.10.0 <0.11.0", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz" }, "subarg": { "version": "1.0.0", - "from": "https://registry.npmjs.org/subarg/-/subarg-1.0.0.tgz", + "from": "subarg@>=1.0.0 <2.0.0", "resolved": "https://registry.npmjs.org/subarg/-/subarg-1.0.0.tgz" }, "syntax-error": { "version": "1.1.6", - "from": "https://registry.npmjs.org/syntax-error/-/syntax-error-1.1.6.tgz", + "from": "syntax-error@>=1.1.1 <2.0.0", "resolved": "https://registry.npmjs.org/syntax-error/-/syntax-error-1.1.6.tgz", "dependencies": { "acorn": { "version": "2.7.0", - "from": "https://registry.npmjs.org/acorn/-/acorn-2.7.0.tgz", + "from": "acorn@>=2.7.0 <3.0.0", "resolved": "https://registry.npmjs.org/acorn/-/acorn-2.7.0.tgz" } } }, "through2": { "version": "1.1.1", - "from": "https://registry.npmjs.org/through2/-/through2-1.1.1.tgz", + "from": "through2@>=1.0.0 <2.0.0", "resolved": "https://registry.npmjs.org/through2/-/through2-1.1.1.tgz", "dependencies": { "xtend": { "version": "4.0.1", - "from": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", + "from": "xtend@>=4.0.0 <4.1.0-0", "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz" } } }, "timers-browserify": { "version": "1.4.2", - "from": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-1.4.2.tgz", + "from": "timers-browserify@>=1.0.1 <2.0.0", "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-1.4.2.tgz", "dependencies": { "process": { - "version": "0.11.3", - "from": "https://registry.npmjs.org/process/-/process-0.11.3.tgz", - "resolved": "https://registry.npmjs.org/process/-/process-0.11.3.tgz" + "version": "0.11.5", + "from": "process@>=0.11.0 <0.12.0", + "resolved": "https://registry.npmjs.org/process/-/process-0.11.5.tgz" } } }, "tty-browserify": { "version": "0.0.0", - "from": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.0.tgz", + "from": "tty-browserify@>=0.0.0 <0.1.0", "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.0.tgz" }, "umd": { "version": "2.1.0", - "from": "https://registry.npmjs.org/umd/-/umd-2.1.0.tgz", + "from": "umd@>=2.1.0 <2.2.0", "resolved": "https://registry.npmjs.org/umd/-/umd-2.1.0.tgz", "dependencies": { "rfile": { "version": "1.0.0", - "from": "https://registry.npmjs.org/rfile/-/rfile-1.0.0.tgz", + "from": "rfile@>=1.0.0 <1.1.0", "resolved": "https://registry.npmjs.org/rfile/-/rfile-1.0.0.tgz", "dependencies": { "callsite": { "version": "1.0.0", - "from": "https://registry.npmjs.org/callsite/-/callsite-1.0.0.tgz", + "from": "callsite@>=1.0.0 <1.1.0", "resolved": "https://registry.npmjs.org/callsite/-/callsite-1.0.0.tgz" }, "resolve": { "version": "0.3.1", - "from": "https://registry.npmjs.org/resolve/-/resolve-0.3.1.tgz", + "from": "resolve@>=0.3.0 <0.4.0", "resolved": "https://registry.npmjs.org/resolve/-/resolve-0.3.1.tgz" } } }, "ruglify": { "version": "1.0.0", - "from": "https://registry.npmjs.org/ruglify/-/ruglify-1.0.0.tgz", + "from": "ruglify@>=1.0.0 <1.1.0", "resolved": "https://registry.npmjs.org/ruglify/-/ruglify-1.0.0.tgz", "dependencies": { "uglify-js": { "version": "2.2.5", - "from": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.2.5.tgz", + "from": "uglify-js@>=2.2.0 <2.3.0", "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.2.5.tgz", "dependencies": { "source-map": { "version": "0.1.43", - "from": "https://registry.npmjs.org/source-map/-/source-map-0.1.43.tgz", + "from": "source-map@>=0.1.7 <0.2.0", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.1.43.tgz", "dependencies": { "amdefine": { "version": "1.0.0", - "from": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.0.tgz", + "from": "amdefine@>=0.0.4", "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.0.tgz" } } }, "optimist": { "version": "0.3.7", - "from": "https://registry.npmjs.org/optimist/-/optimist-0.3.7.tgz", + "from": "optimist@>=0.3.5 <0.4.0", "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.3.7.tgz", "dependencies": { "wordwrap": { "version": "0.0.3", - "from": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz", + "from": "wordwrap@>=0.0.2 <0.1.0", "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz" } } @@ -1433,59 +1453,59 @@ }, "through": { "version": "2.3.8", - "from": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "from": "through@>=2.3.4 <2.4.0", "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz" }, "uglify-js": { "version": "2.4.24", - "from": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.4.24.tgz", + "from": "uglify-js@>=2.4.0 <2.5.0", "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.4.24.tgz", "dependencies": { "async": { "version": "0.2.10", - "from": "https://registry.npmjs.org/async/-/async-0.2.10.tgz", + "from": "async@>=0.2.6 <0.3.0", "resolved": "https://registry.npmjs.org/async/-/async-0.2.10.tgz" }, "source-map": { "version": "0.1.34", - "from": "https://registry.npmjs.org/source-map/-/source-map-0.1.34.tgz", + "from": "source-map@0.1.34", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.1.34.tgz", "dependencies": { "amdefine": { "version": "1.0.0", - "from": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.0.tgz", + "from": "amdefine@>=0.0.4", "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.0.tgz" } } }, "uglify-to-browserify": { "version": "1.0.2", - "from": "https://registry.npmjs.org/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz", + "from": "uglify-to-browserify@>=1.0.0 <1.1.0", "resolved": "https://registry.npmjs.org/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz" }, "yargs": { "version": "3.5.4", - "from": "https://registry.npmjs.org/yargs/-/yargs-3.5.4.tgz", + "from": "yargs@>=3.5.4 <3.6.0", "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.5.4.tgz", "dependencies": { "camelcase": { "version": "1.2.1", - "from": "https://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz", + "from": "camelcase@>=1.0.2 <2.0.0", "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz" }, "decamelize": { "version": "1.2.0", - "from": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "from": "decamelize@>=1.0.0 <2.0.0", "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz" }, "window-size": { "version": "0.1.0", - "from": "https://registry.npmjs.org/window-size/-/window-size-0.1.0.tgz", + "from": "window-size@0.1.0", "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.1.0.tgz" }, "wordwrap": { "version": "0.0.2", - "from": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz", + "from": "wordwrap@0.0.2", "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz" } } @@ -1496,41 +1516,41 @@ }, "url": { "version": "0.10.3", - "from": "https://registry.npmjs.org/url/-/url-0.10.3.tgz", + "from": "url@>=0.10.1 <0.11.0", "resolved": "https://registry.npmjs.org/url/-/url-0.10.3.tgz", "dependencies": { "punycode": { "version": "1.3.2", - "from": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", + "from": "punycode@1.3.2", "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz" }, "querystring": { "version": "0.2.0", - "from": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", + "from": "querystring@0.2.0", "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz" } } }, "util": { "version": "0.10.3", - "from": "https://registry.npmjs.org/util/-/util-0.10.3.tgz", + "from": "util@>=0.10.1 <0.11.0", "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz" }, "vm-browserify": { "version": "0.0.4", - "from": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-0.0.4.tgz", + "from": "vm-browserify@>=0.0.1 <0.1.0", "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-0.0.4.tgz", "dependencies": { "indexof": { "version": "0.0.1", - "from": "https://registry.npmjs.org/indexof/-/indexof-0.0.1.tgz", + "from": "indexof@0.0.1", "resolved": "https://registry.npmjs.org/indexof/-/indexof-0.0.1.tgz" } } }, "xtend": { "version": "3.0.0", - "from": "https://registry.npmjs.org/xtend/-/xtend-3.0.0.tgz", + "from": "xtend@>=3.0.0 <4.0.0", "resolved": "https://registry.npmjs.org/xtend/-/xtend-3.0.0.tgz" } } @@ -4498,22 +4518,23 @@ } }, "dgeni-packages": { - "version": "0.14.0", - "from": "dgeni-packages@0.14.0", + "version": "0.13.0", + "from": "https://registry.npmjs.org/dgeni-packages/-/dgeni-packages-0.13.0.tgz", + "resolved": "https://registry.npmjs.org/dgeni-packages/-/dgeni-packages-0.13.0.tgz", "dependencies": { "catharsis": { "version": "0.8.8", - "from": "catharsis@>=0.8.1 <0.9.0", + "from": "https://registry.npmjs.org/catharsis/-/catharsis-0.8.8.tgz", "resolved": "https://registry.npmjs.org/catharsis/-/catharsis-0.8.8.tgz", "dependencies": { "underscore-contrib": { "version": "0.3.0", - "from": "underscore-contrib@>=0.3.0 <0.4.0", + "from": "https://registry.npmjs.org/underscore-contrib/-/underscore-contrib-0.3.0.tgz", "resolved": "https://registry.npmjs.org/underscore-contrib/-/underscore-contrib-0.3.0.tgz", "dependencies": { "underscore": { "version": "1.6.0", - "from": "underscore@1.6.0", + "from": "https://registry.npmjs.org/underscore/-/underscore-1.6.0.tgz", "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.6.0.tgz" } } @@ -4521,186 +4542,142 @@ } }, "change-case": { - "version": "3.0.0", - "from": "change-case@3.0.0", - "resolved": "https://registry.npmjs.org/change-case/-/change-case-3.0.0.tgz", + "version": "2.3.1", + "from": "https://registry.npmjs.org/change-case/-/change-case-2.3.1.tgz", + "resolved": "https://registry.npmjs.org/change-case/-/change-case-2.3.1.tgz", "dependencies": { "camel-case": { - "version": "3.0.0", - "from": "camel-case@>=3.0.0 <4.0.0", - "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-3.0.0.tgz" + "version": "1.2.2", + "from": "https://registry.npmjs.org/camel-case/-/camel-case-1.2.2.tgz", + "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-1.2.2.tgz" }, "constant-case": { - "version": "2.0.0", - "from": "constant-case@>=2.0.0 <3.0.0", - "resolved": "https://registry.npmjs.org/constant-case/-/constant-case-2.0.0.tgz" + "version": "1.1.2", + "from": "https://registry.npmjs.org/constant-case/-/constant-case-1.1.2.tgz", + "resolved": "https://registry.npmjs.org/constant-case/-/constant-case-1.1.2.tgz" }, "dot-case": { - "version": "2.1.0", - "from": "dot-case@>=2.1.0 <3.0.0", - "resolved": "https://registry.npmjs.org/dot-case/-/dot-case-2.1.0.tgz" - }, - "header-case": { - "version": "1.0.0", - "from": "header-case@>=1.0.0 <2.0.0", - "resolved": "https://registry.npmjs.org/header-case/-/header-case-1.0.0.tgz" + "version": "1.1.2", + "from": "https://registry.npmjs.org/dot-case/-/dot-case-1.1.2.tgz", + "resolved": "https://registry.npmjs.org/dot-case/-/dot-case-1.1.2.tgz" }, "is-lower-case": { "version": "1.1.3", - "from": "is-lower-case@>=1.1.0 <2.0.0", + "from": "https://registry.npmjs.org/is-lower-case/-/is-lower-case-1.1.3.tgz", "resolved": "https://registry.npmjs.org/is-lower-case/-/is-lower-case-1.1.3.tgz" }, "is-upper-case": { "version": "1.1.2", - "from": "is-upper-case@>=1.1.0 <2.0.0", + "from": "https://registry.npmjs.org/is-upper-case/-/is-upper-case-1.1.2.tgz", "resolved": "https://registry.npmjs.org/is-upper-case/-/is-upper-case-1.1.2.tgz" }, "lower-case": { "version": "1.1.3", - "from": "lower-case@>=1.1.1 <2.0.0", + "from": "https://registry.npmjs.org/lower-case/-/lower-case-1.1.3.tgz", "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-1.1.3.tgz" }, "lower-case-first": { "version": "1.0.2", - "from": "lower-case-first@>=1.0.0 <2.0.0", + "from": "https://registry.npmjs.org/lower-case-first/-/lower-case-first-1.0.2.tgz", "resolved": "https://registry.npmjs.org/lower-case-first/-/lower-case-first-1.0.2.tgz" }, - "no-case": { - "version": "2.3.0", - "from": "no-case@>=2.2.0 <3.0.0", - "resolved": "https://registry.npmjs.org/no-case/-/no-case-2.3.0.tgz" - }, "param-case": { - "version": "2.1.0", - "from": "param-case@>=2.1.0 <3.0.0", - "resolved": "https://registry.npmjs.org/param-case/-/param-case-2.1.0.tgz" + "version": "1.1.2", + "from": "https://registry.npmjs.org/param-case/-/param-case-1.1.2.tgz", + "resolved": "https://registry.npmjs.org/param-case/-/param-case-1.1.2.tgz" }, "pascal-case": { - "version": "2.0.0", - "from": "pascal-case@>=2.0.0 <3.0.0", - "resolved": "https://registry.npmjs.org/pascal-case/-/pascal-case-2.0.0.tgz" + "version": "1.1.2", + "from": "https://registry.npmjs.org/pascal-case/-/pascal-case-1.1.2.tgz", + "resolved": "https://registry.npmjs.org/pascal-case/-/pascal-case-1.1.2.tgz" }, "path-case": { - "version": "2.1.0", - "from": "path-case@>=2.1.0 <3.0.0", - "resolved": "https://registry.npmjs.org/path-case/-/path-case-2.1.0.tgz" + "version": "1.1.2", + "from": "https://registry.npmjs.org/path-case/-/path-case-1.1.2.tgz", + "resolved": "https://registry.npmjs.org/path-case/-/path-case-1.1.2.tgz" }, "sentence-case": { - "version": "2.1.0", - "from": "sentence-case@>=2.1.0 <3.0.0", - "resolved": "https://registry.npmjs.org/sentence-case/-/sentence-case-2.1.0.tgz" + "version": "1.1.3", + "from": "https://registry.npmjs.org/sentence-case/-/sentence-case-1.1.3.tgz", + "resolved": "https://registry.npmjs.org/sentence-case/-/sentence-case-1.1.3.tgz" }, "snake-case": { - "version": "2.1.0", - "from": "snake-case@>=2.1.0 <3.0.0", - "resolved": "https://registry.npmjs.org/snake-case/-/snake-case-2.1.0.tgz" + "version": "1.1.2", + "from": "https://registry.npmjs.org/snake-case/-/snake-case-1.1.2.tgz", + "resolved": "https://registry.npmjs.org/snake-case/-/snake-case-1.1.2.tgz" }, "swap-case": { "version": "1.1.2", - "from": "swap-case@>=1.1.0 <2.0.0", + "from": "https://registry.npmjs.org/swap-case/-/swap-case-1.1.2.tgz", "resolved": "https://registry.npmjs.org/swap-case/-/swap-case-1.1.2.tgz" }, "title-case": { - "version": "2.1.0", - "from": "title-case@>=2.1.0 <3.0.0", - "resolved": "https://registry.npmjs.org/title-case/-/title-case-2.1.0.tgz" + "version": "1.1.2", + "from": "https://registry.npmjs.org/title-case/-/title-case-1.1.2.tgz", + "resolved": "https://registry.npmjs.org/title-case/-/title-case-1.1.2.tgz" }, "upper-case": { "version": "1.1.3", - "from": "upper-case@>=1.1.1 <2.0.0", + "from": "https://registry.npmjs.org/upper-case/-/upper-case-1.1.3.tgz", "resolved": "https://registry.npmjs.org/upper-case/-/upper-case-1.1.3.tgz" }, "upper-case-first": { "version": "1.1.2", - "from": "upper-case-first@>=1.1.0 <2.0.0", + "from": "https://registry.npmjs.org/upper-case-first/-/upper-case-first-1.1.2.tgz", "resolved": "https://registry.npmjs.org/upper-case-first/-/upper-case-first-1.1.2.tgz" } } }, "espree": { "version": "2.2.5", - "from": "espree@>=2.2.3 <3.0.0", + "from": "https://registry.npmjs.org/espree/-/espree-2.2.5.tgz", "resolved": "https://registry.npmjs.org/espree/-/espree-2.2.5.tgz" }, "estraverse": { "version": "4.2.0", - "from": "estraverse@>=4.1.0 <5.0.0", + "from": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz", "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz" }, "glob": { - "version": "7.0.5", - "from": "glob@>=7.0.5 <8.0.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.0.5.tgz", + "version": "3.2.11", + "from": "https://registry.npmjs.org/glob/-/glob-3.2.11.tgz", + "resolved": "https://registry.npmjs.org/glob/-/glob-3.2.11.tgz", "dependencies": { - "fs.realpath": { - "version": "1.0.0", - "from": "fs.realpath@>=1.0.0 <2.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz" - }, - "inflight": { - "version": "1.0.5", - "from": "inflight@>=1.0.4 <2.0.0", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.5.tgz", - "dependencies": { - "wrappy": { - "version": "1.0.2", - "from": "wrappy@>=1.0.0 <2.0.0", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz" - } - } - }, "inherits": { "version": "2.0.1", - "from": "inherits@>=2.0.0 <3.0.0", + "from": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz" - }, - "once": { - "version": "1.3.3", - "from": "once@>=1.3.0 <2.0.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.3.3.tgz", - "dependencies": { - "wrappy": { - "version": "1.0.2", - "from": "wrappy@>=1.0.0 <2.0.0", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz" - } - } - }, - "path-is-absolute": { - "version": "1.0.0", - "from": "path-is-absolute@>=1.0.0 <2.0.0", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.0.tgz" } } }, "htmlparser2": { - "version": "3.9.1", - "from": "htmlparser2@>=3.7.3 <4.0.0", - "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.9.1.tgz", + "version": "3.9.0", + "from": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.9.0.tgz", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.9.0.tgz", "dependencies": { "domelementtype": { "version": "1.3.0", - "from": "domelementtype@>=1.3.0 <2.0.0", + "from": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.0.tgz", "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.0.tgz" }, "domhandler": { "version": "2.3.0", - "from": "domhandler@>=2.3.0 <3.0.0", + "from": "https://registry.npmjs.org/domhandler/-/domhandler-2.3.0.tgz", "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.3.0.tgz" }, "domutils": { "version": "1.5.1", - "from": "domutils@>=1.5.1 <2.0.0", + "from": "https://registry.npmjs.org/domutils/-/domutils-1.5.1.tgz", "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.5.1.tgz", "dependencies": { "dom-serializer": { "version": "0.1.0", - "from": "dom-serializer@>=0.0.0 <1.0.0", + "from": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.1.0.tgz", "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.1.0.tgz", "dependencies": { "domelementtype": { "version": "1.1.3", - "from": "domelementtype@>=1.1.1 <1.2.0", + "from": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.1.3.tgz", "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.1.3.tgz" } } @@ -4709,159 +4686,142 @@ }, "entities": { "version": "1.1.1", - "from": "entities@>=1.1.1 <2.0.0", + "from": "https://registry.npmjs.org/entities/-/entities-1.1.1.tgz", "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.1.tgz" }, - "inherits": { - "version": "2.0.1", - "from": "inherits@>=2.0.0 <3.0.0", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz" - }, "readable-stream": { - "version": "2.1.4", - "from": "readable-stream@>=2.0.2 <3.0.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.1.4.tgz", + "version": "2.1.2", + "from": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.1.2.tgz", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.1.2.tgz", "dependencies": { - "buffer-shims": { - "version": "1.0.0", - "from": "buffer-shims@>=1.0.0 <2.0.0", - "resolved": "https://registry.npmjs.org/buffer-shims/-/buffer-shims-1.0.0.tgz" - }, "core-util-is": { "version": "1.0.2", - "from": "core-util-is@>=1.0.0 <1.1.0", + "from": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz" }, + "inherits": { + "version": "2.0.1", + "from": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz" + }, "isarray": { "version": "1.0.0", - "from": "isarray@>=1.0.0 <1.1.0", + "from": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz" }, "process-nextick-args": { "version": "1.0.7", - "from": "process-nextick-args@>=1.0.6 <1.1.0", + "from": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz", "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz" }, "string_decoder": { "version": "0.10.31", - "from": "string_decoder@>=0.10.0 <0.11.0", + "from": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz" }, "util-deprecate": { "version": "1.0.2", - "from": "util-deprecate@>=1.0.1 <1.1.0", + "from": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz" } } } } }, - "lodash": { - "version": "4.13.1", - "from": "lodash@>=4.13.1 <5.0.0", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.13.1.tgz" - }, "minimatch": { - "version": "3.0.2", - "from": "minimatch@>=3.0.2 <4.0.0", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.2.tgz", + "version": "0.3.0", + "from": "https://registry.npmjs.org/minimatch/-/minimatch-0.3.0.tgz", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-0.3.0.tgz", "dependencies": { - "brace-expansion": { - "version": "1.1.5", - "from": "brace-expansion@>=1.0.0 <2.0.0", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.5.tgz", - "dependencies": { - "balanced-match": { - "version": "0.4.1", - "from": "balanced-match@>=0.4.1 <0.5.0", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-0.4.1.tgz" - }, - "concat-map": { - "version": "0.0.1", - "from": "concat-map@0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz" - } - } + "lru-cache": { + "version": "2.7.3", + "from": "https://registry.npmjs.org/lru-cache/-/lru-cache-2.7.3.tgz", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-2.7.3.tgz" + }, + "sigmund": { + "version": "1.0.1", + "from": "https://registry.npmjs.org/sigmund/-/sigmund-1.0.1.tgz", + "resolved": "https://registry.npmjs.org/sigmund/-/sigmund-1.0.1.tgz" } } }, "nunjucks": { "version": "1.3.4", - "from": "nunjucks@>=1.2.0 <2.0.0", + "from": "https://registry.npmjs.org/nunjucks/-/nunjucks-1.3.4.tgz", "resolved": "https://registry.npmjs.org/nunjucks/-/nunjucks-1.3.4.tgz", "dependencies": { "optimist": { "version": "0.6.1", - "from": "optimist@*", + "from": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz", "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz", "dependencies": { "wordwrap": { "version": "0.0.3", - "from": "wordwrap@>=0.0.2 <0.1.0", + "from": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz", "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz" }, "minimist": { "version": "0.0.10", - "from": "minimist@>=0.0.1 <0.1.0", + "from": "https://registry.npmjs.org/minimist/-/minimist-0.0.10.tgz", "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.10.tgz" } } }, "chokidar": { "version": "0.12.6", - "from": "chokidar@>=0.12.5 <0.13.0", + "from": "https://registry.npmjs.org/chokidar/-/chokidar-0.12.6.tgz", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-0.12.6.tgz", "dependencies": { "readdirp": { "version": "1.3.0", - "from": "readdirp@>=1.3.0 <1.4.0", + "from": "https://registry.npmjs.org/readdirp/-/readdirp-1.3.0.tgz", "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-1.3.0.tgz", "dependencies": { "graceful-fs": { "version": "2.0.3", - "from": "graceful-fs@>=2.0.0 <2.1.0", + "from": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-2.0.3.tgz", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-2.0.3.tgz" }, "minimatch": { "version": "0.2.14", - "from": "minimatch@>=0.2.12 <0.3.0", + "from": "https://registry.npmjs.org/minimatch/-/minimatch-0.2.14.tgz", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-0.2.14.tgz", "dependencies": { "lru-cache": { "version": "2.7.3", - "from": "lru-cache@>=2.0.0 <3.0.0", + "from": "https://registry.npmjs.org/lru-cache/-/lru-cache-2.7.3.tgz", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-2.7.3.tgz" }, "sigmund": { "version": "1.0.1", - "from": "sigmund@>=1.0.0 <1.1.0", + "from": "https://registry.npmjs.org/sigmund/-/sigmund-1.0.1.tgz", "resolved": "https://registry.npmjs.org/sigmund/-/sigmund-1.0.1.tgz" } } }, "readable-stream": { "version": "1.0.34", - "from": "readable-stream@>=1.0.26-2 <1.1.0", + "from": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", "dependencies": { "core-util-is": { "version": "1.0.2", - "from": "core-util-is@>=1.0.0 <1.1.0", + "from": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz" }, "isarray": { "version": "0.0.1", - "from": "isarray@0.0.1", + "from": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz" }, "string_decoder": { "version": "0.10.31", - "from": "string_decoder@>=0.10.0 <0.11.0", + "from": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz" }, "inherits": { "version": "2.0.1", - "from": "inherits@>=2.0.1 <2.1.0", + "from": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz" } } @@ -4870,68 +4830,211 @@ }, "async-each": { "version": "0.1.6", - "from": "async-each@>=0.1.5 <0.2.0", + "from": "https://registry.npmjs.org/async-each/-/async-each-0.1.6.tgz", "resolved": "https://registry.npmjs.org/async-each/-/async-each-0.1.6.tgz" - }, - "fsevents": { - "version": "0.3.8", - "from": "fsevents@>=0.3.1 <0.4.0", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-0.3.8.tgz", - "dependencies": { - "nan": { - "version": "2.3.5", - "from": "nan@>=2.0.2 <3.0.0", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.3.5.tgz" - } - } } } } } }, - "q": { - "version": "1.4.1", - "from": "q@>=1.4.1 <1.5.0", - "resolved": "https://registry.npmjs.org/q/-/q-1.4.1.tgz" - }, - "semver": { - "version": "5.2.0", - "from": "semver@>=5.2.0 <6.0.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.2.0.tgz" - }, - "shelljs": { - "version": "0.7.0", - "from": "shelljs@>=0.7.0 <0.8.0", - "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.7.0.tgz", + "q-io": { + "version": "1.10.9", + "from": "https://registry.npmjs.org/q-io/-/q-io-1.10.9.tgz", + "resolved": "https://registry.npmjs.org/q-io/-/q-io-1.10.9.tgz", "dependencies": { - "interpret": { - "version": "1.0.1", - "from": "interpret@>=1.0.0 <2.0.0", - "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.0.1.tgz" + "q": { + "version": "0.9.7", + "from": "https://registry.npmjs.org/q/-/q-0.9.7.tgz", + "resolved": "https://registry.npmjs.org/q/-/q-0.9.7.tgz" }, - "rechoir": { - "version": "0.6.2", - "from": "rechoir@>=0.6.2 <0.7.0", - "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", - "dependencies": { - "resolve": { - "version": "1.1.7", - "from": "resolve@>=1.1.6 <2.0.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz" - } + "qs": { + "version": "0.1.0", + "from": "https://registry.npmjs.org/qs/-/qs-0.1.0.tgz", + "resolved": "https://registry.npmjs.org/qs/-/qs-0.1.0.tgz" + }, + "url2": { + "version": "0.0.0", + "from": "https://registry.npmjs.org/url2/-/url2-0.0.0.tgz", + "resolved": "https://registry.npmjs.org/url2/-/url2-0.0.0.tgz" + }, + "mime": { + "version": "1.2.11", + "from": "https://registry.npmjs.org/mime/-/mime-1.2.11.tgz", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.2.11.tgz" + }, + "mimeparse": { + "version": "0.1.4", + "from": "https://registry.npmjs.org/mimeparse/-/mimeparse-0.1.4.tgz", + "resolved": "https://registry.npmjs.org/mimeparse/-/mimeparse-0.1.4.tgz" + }, + "collections": { + "version": "0.2.2", + "from": "https://registry.npmjs.org/collections/-/collections-0.2.2.tgz", + "resolved": "https://registry.npmjs.org/collections/-/collections-0.2.2.tgz", + "dependencies": { + "weak-map": { + "version": "1.0.0", + "from": "https://registry.npmjs.org/weak-map/-/weak-map-1.0.0.tgz", + "resolved": "https://registry.npmjs.org/weak-map/-/weak-map-1.0.0.tgz" + } } } } }, + "semver": { + "version": "4.3.6", + "from": "https://registry.npmjs.org/semver/-/semver-4.3.6.tgz", + "resolved": "https://registry.npmjs.org/semver/-/semver-4.3.6.tgz" + }, + "shelljs": { + "version": "0.5.3", + "from": "https://registry.npmjs.org/shelljs/-/shelljs-0.5.3.tgz", + "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.5.3.tgz" + }, "spdx-license-list": { "version": "2.1.0", - "from": "spdx-license-list@>=2.1.0 <3.0.0", + "from": "https://registry.npmjs.org/spdx-license-list/-/spdx-license-list-2.1.0.tgz", "resolved": "https://registry.npmjs.org/spdx-license-list/-/spdx-license-list-2.1.0.tgz" }, "typescript": { "version": "1.8.10", - "from": "typescript@>=1.7.5 <2.0.0", + "from": "https://registry.npmjs.org/typescript/-/typescript-1.8.10.tgz", "resolved": "https://registry.npmjs.org/typescript/-/typescript-1.8.10.tgz" + }, + "winston": { + "version": "0.7.3", + "from": "https://registry.npmjs.org/winston/-/winston-0.7.3.tgz", + "resolved": "https://registry.npmjs.org/winston/-/winston-0.7.3.tgz", + "dependencies": { + "async": { + "version": "0.2.10", + "from": "https://registry.npmjs.org/async/-/async-0.2.10.tgz", + "resolved": "https://registry.npmjs.org/async/-/async-0.2.10.tgz" + }, + "colors": { + "version": "0.6.2", + "from": "https://registry.npmjs.org/colors/-/colors-0.6.2.tgz", + "resolved": "https://registry.npmjs.org/colors/-/colors-0.6.2.tgz" + }, + "cycle": { + "version": "1.0.3", + "from": "https://registry.npmjs.org/cycle/-/cycle-1.0.3.tgz", + "resolved": "https://registry.npmjs.org/cycle/-/cycle-1.0.3.tgz" + }, + "eyes": { + "version": "0.1.8", + "from": "https://registry.npmjs.org/eyes/-/eyes-0.1.8.tgz", + "resolved": "https://registry.npmjs.org/eyes/-/eyes-0.1.8.tgz" + }, + "pkginfo": { + "version": "0.3.1", + "from": "https://registry.npmjs.org/pkginfo/-/pkginfo-0.3.1.tgz", + "resolved": "https://registry.npmjs.org/pkginfo/-/pkginfo-0.3.1.tgz" + }, + "request": { + "version": "2.16.6", + "from": "https://registry.npmjs.org/request/-/request-2.16.6.tgz", + "resolved": "https://registry.npmjs.org/request/-/request-2.16.6.tgz", + "dependencies": { + "form-data": { + "version": "0.0.10", + "from": "https://registry.npmjs.org/form-data/-/form-data-0.0.10.tgz", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-0.0.10.tgz", + "dependencies": { + "combined-stream": { + "version": "0.0.7", + "from": "https://registry.npmjs.org/combined-stream/-/combined-stream-0.0.7.tgz", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-0.0.7.tgz", + "dependencies": { + "delayed-stream": { + "version": "0.0.5", + "from": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-0.0.5.tgz", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-0.0.5.tgz" + } + } + } + } + }, + "mime": { + "version": "1.2.11", + "from": "https://registry.npmjs.org/mime/-/mime-1.2.11.tgz", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.2.11.tgz" + }, + "hawk": { + "version": "0.10.2", + "from": "https://registry.npmjs.org/hawk/-/hawk-0.10.2.tgz", + "resolved": "https://registry.npmjs.org/hawk/-/hawk-0.10.2.tgz", + "dependencies": { + "hoek": { + "version": "0.7.6", + "from": "https://registry.npmjs.org/hoek/-/hoek-0.7.6.tgz", + "resolved": "https://registry.npmjs.org/hoek/-/hoek-0.7.6.tgz" + }, + "boom": { + "version": "0.3.8", + "from": "https://registry.npmjs.org/boom/-/boom-0.3.8.tgz", + "resolved": "https://registry.npmjs.org/boom/-/boom-0.3.8.tgz" + }, + "cryptiles": { + "version": "0.1.3", + "from": "https://registry.npmjs.org/cryptiles/-/cryptiles-0.1.3.tgz", + "resolved": "https://registry.npmjs.org/cryptiles/-/cryptiles-0.1.3.tgz" + }, + "sntp": { + "version": "0.1.4", + "from": "https://registry.npmjs.org/sntp/-/sntp-0.1.4.tgz", + "resolved": "https://registry.npmjs.org/sntp/-/sntp-0.1.4.tgz" + } + } + }, + "node-uuid": { + "version": "1.4.7", + "from": "https://registry.npmjs.org/node-uuid/-/node-uuid-1.4.7.tgz", + "resolved": "https://registry.npmjs.org/node-uuid/-/node-uuid-1.4.7.tgz" + }, + "cookie-jar": { + "version": "0.2.0", + "from": "https://registry.npmjs.org/cookie-jar/-/cookie-jar-0.2.0.tgz", + "resolved": "https://registry.npmjs.org/cookie-jar/-/cookie-jar-0.2.0.tgz" + }, + "aws-sign": { + "version": "0.2.0", + "from": "https://registry.npmjs.org/aws-sign/-/aws-sign-0.2.0.tgz", + "resolved": "https://registry.npmjs.org/aws-sign/-/aws-sign-0.2.0.tgz" + }, + "oauth-sign": { + "version": "0.2.0", + "from": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.2.0.tgz", + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.2.0.tgz" + }, + "forever-agent": { + "version": "0.2.0", + "from": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.2.0.tgz", + "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.2.0.tgz" + }, + "tunnel-agent": { + "version": "0.2.0", + "from": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.2.0.tgz", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.2.0.tgz" + }, + "json-stringify-safe": { + "version": "3.0.0", + "from": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-3.0.0.tgz", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-3.0.0.tgz" + }, + "qs": { + "version": "0.5.6", + "from": "https://registry.npmjs.org/qs/-/qs-0.5.6.tgz", + "resolved": "https://registry.npmjs.org/qs/-/qs-0.5.6.tgz" + } + } + }, + "stack-trace": { + "version": "0.0.9", + "from": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.9.tgz", + "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.9.tgz" + } + } } } }, @@ -9842,14 +9945,67 @@ } }, "jasmine-reporters": { - "version": "1.0.2", - "from": "https://registry.npmjs.org/jasmine-reporters/-/jasmine-reporters-1.0.2.tgz", - "resolved": "https://registry.npmjs.org/jasmine-reporters/-/jasmine-reporters-1.0.2.tgz", + "version": "2.2.0", + "from": "jasmine-reporters@2.2.0", + "resolved": "https://registry.npmjs.org/jasmine-reporters/-/jasmine-reporters-2.2.0.tgz", "dependencies": { + "jasmine": { + "version": "2.4.1", + "from": "jasmine@>=2.4.1 <3.0.0", + "resolved": "https://registry.npmjs.org/jasmine/-/jasmine-2.4.1.tgz", + "dependencies": { + "exit": { + "version": "0.1.2", + "from": "exit@>=0.1.2 <0.2.0", + "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz" + }, + "glob": { + "version": "3.2.11", + "from": "glob@>=3.2.11 <4.0.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-3.2.11.tgz", + "dependencies": { + "inherits": { + "version": "2.0.1", + "from": "inherits@>=2.0.0 <3.0.0", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz" + }, + "minimatch": { + "version": "0.3.0", + "from": "minimatch@>=0.3.0 <0.4.0", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-0.3.0.tgz", + "dependencies": { + "lru-cache": { + "version": "2.7.3", + "from": "lru-cache@>=2.0.0 <3.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-2.7.3.tgz" + }, + "sigmund": { + "version": "1.0.1", + "from": "sigmund@>=1.0.0 <1.1.0", + "resolved": "https://registry.npmjs.org/sigmund/-/sigmund-1.0.1.tgz" + } + } + } + } + } + } + }, "mkdirp": { - "version": "0.3.5", - "from": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.3.5.tgz", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.3.5.tgz" + "version": "0.5.1", + "from": "mkdirp@>=0.5.1 <0.6.0", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", + "dependencies": { + "minimist": { + "version": "0.0.8", + "from": "minimist@0.0.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz" + } + } + }, + "xmldom": { + "version": "0.1.22", + "from": "xmldom@>=0.1.22 <0.2.0", + "resolved": "https://registry.npmjs.org/xmldom/-/xmldom-0.1.22.tgz" } } }, @@ -10550,686 +10706,54 @@ } } } + } + } + }, + "colors": { + "version": "1.1.2", + "from": "https://registry.npmjs.org/colors/-/colors-1.1.2.tgz", + "resolved": "https://registry.npmjs.org/colors/-/colors-1.1.2.tgz" + }, + "connect": { + "version": "3.4.1", + "from": "https://registry.npmjs.org/connect/-/connect-3.4.1.tgz", + "resolved": "https://registry.npmjs.org/connect/-/connect-3.4.1.tgz", + "dependencies": { + "debug": { + "version": "2.2.0", + "from": "https://registry.npmjs.org/debug/-/debug-2.2.0.tgz", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.2.0.tgz", + "dependencies": { + "ms": { + "version": "0.7.1", + "from": "https://registry.npmjs.org/ms/-/ms-0.7.1.tgz", + "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.1.tgz" + } + } }, - "fsevents": { - "version": "1.0.12", - "from": "https://registry.npmjs.org/fsevents/-/fsevents-1.0.12.tgz", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.0.12.tgz", + "finalhandler": { + "version": "0.4.1", + "from": "https://registry.npmjs.org/finalhandler/-/finalhandler-0.4.1.tgz", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-0.4.1.tgz", "dependencies": { - "nan": { - "version": "2.3.3", - "from": "https://registry.npmjs.org/nan/-/nan-2.3.3.tgz", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.3.3.tgz" + "escape-html": { + "version": "1.0.3", + "from": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz" }, - "node-pre-gyp": { - "version": "0.6.25", - "from": "node-pre-gyp@0.6.25", - "resolved": "https://registry.npmjs.org/node-pre-gyp/-/node-pre-gyp-0.6.25.tgz", + "on-finished": { + "version": "2.3.0", + "from": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", "dependencies": { - "nopt": { - "version": "3.0.6", - "from": "nopt@~3.0.1", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz", - "dependencies": { - "abbrev": { - "version": "1.0.7", - "from": "abbrev@1", - "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.0.7.tgz" - } - } + "ee-first": { + "version": "1.1.1", + "from": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz" } } }, - "ansi-regex": { - "version": "2.0.0", - "from": "ansi-regex@^2.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.0.0.tgz" - }, - "ansi": { - "version": "0.3.1", - "from": "ansi@~0.3.1", - "resolved": "https://registry.npmjs.org/ansi/-/ansi-0.3.1.tgz" - }, - "ansi-styles": { - "version": "2.2.1", - "from": "ansi-styles@^2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz" - }, - "are-we-there-yet": { - "version": "1.1.2", - "from": "are-we-there-yet@~1.1.2", - "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.2.tgz" - }, - "assert-plus": { - "version": "0.2.0", - "from": "assert-plus@^0.2.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-0.2.0.tgz" - }, - "async": { - "version": "1.5.2", - "from": "async@^1.5.2", - "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz" - }, - "aws-sign2": { - "version": "0.6.0", - "from": "aws-sign2@~0.6.0", - "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.6.0.tgz" - }, - "bl": { - "version": "1.0.3", - "from": "bl@~1.0.0", - "resolved": "https://registry.npmjs.org/bl/-/bl-1.0.3.tgz" - }, - "block-stream": { - "version": "0.0.8", - "from": "block-stream@*", - "resolved": "https://registry.npmjs.org/block-stream/-/block-stream-0.0.8.tgz" - }, - "asn1": { - "version": "0.2.3", - "from": "asn1@>=0.2.3 <0.3.0", - "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.3.tgz" - }, - "boom": { - "version": "2.10.1", - "from": "boom@2.x.x", - "resolved": "https://registry.npmjs.org/boom/-/boom-2.10.1.tgz" - }, - "caseless": { - "version": "0.11.0", - "from": "caseless@~0.11.0", - "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.11.0.tgz" - }, - "combined-stream": { - "version": "1.0.5", - "from": "combined-stream@~1.0.5", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.5.tgz" - }, - "chalk": { - "version": "1.1.3", - "from": "chalk@^1.1.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz" - }, - "core-util-is": { - "version": "1.0.2", - "from": "core-util-is@~1.0.0", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz" - }, - "cryptiles": { - "version": "2.0.5", - "from": "cryptiles@2.x.x", - "resolved": "https://registry.npmjs.org/cryptiles/-/cryptiles-2.0.5.tgz" - }, - "commander": { - "version": "2.9.0", - "from": "commander@^2.9.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.9.0.tgz" - }, - "debug": { - "version": "2.2.0", - "from": "debug@~2.2.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.2.0.tgz" - }, - "delayed-stream": { - "version": "1.0.0", - "from": "delayed-stream@~1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz" - }, - "deep-extend": { - "version": "0.4.1", - "from": "deep-extend@~0.4.0", - "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.4.1.tgz" - }, - "ecc-jsbn": { - "version": "0.1.1", - "from": "ecc-jsbn@>=0.0.1 <1.0.0", - "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz" - }, - "delegates": { - "version": "1.0.0", - "from": "delegates@^1.0.0", - "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz" - }, - "escape-string-regexp": { - "version": "1.0.5", - "from": "escape-string-regexp@^1.0.2", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz" - }, - "extsprintf": { - "version": "1.0.2", - "from": "extsprintf@1.0.2", - "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.0.2.tgz" - }, - "extend": { - "version": "3.0.0", - "from": "extend@~3.0.0", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.0.tgz" - }, - "forever-agent": { - "version": "0.6.1", - "from": "forever-agent@~0.6.1", - "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz" - }, - "form-data": { - "version": "1.0.0-rc4", - "from": "form-data@~1.0.0-rc3", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-1.0.0-rc4.tgz" - }, - "fstream": { - "version": "1.0.8", - "from": "fstream@^1.0.2", - "resolved": "https://registry.npmjs.org/fstream/-/fstream-1.0.8.tgz" - }, - "gauge": { - "version": "1.2.7", - "from": "gauge@~1.2.5", - "resolved": "https://registry.npmjs.org/gauge/-/gauge-1.2.7.tgz" - }, - "generate-function": { - "version": "2.0.0", - "from": "generate-function@^2.0.0", - "resolved": "https://registry.npmjs.org/generate-function/-/generate-function-2.0.0.tgz" - }, - "generate-object-property": { - "version": "1.2.0", - "from": "generate-object-property@^1.1.0", - "resolved": "https://registry.npmjs.org/generate-object-property/-/generate-object-property-1.2.0.tgz" - }, - "graceful-readlink": { - "version": "1.0.1", - "from": "graceful-readlink@>= 1.0.0", - "resolved": "https://registry.npmjs.org/graceful-readlink/-/graceful-readlink-1.0.1.tgz" - }, - "graceful-fs": { - "version": "4.1.3", - "from": "graceful-fs@^4.1.2", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.3.tgz" - }, - "har-validator": { - "version": "2.0.6", - "from": "har-validator@~2.0.6", - "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-2.0.6.tgz" - }, - "has-ansi": { - "version": "2.0.0", - "from": "has-ansi@^2.0.0", - "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz" - }, - "hawk": { - "version": "3.1.3", - "from": "hawk@~3.1.0", - "resolved": "https://registry.npmjs.org/hawk/-/hawk-3.1.3.tgz" - }, - "has-unicode": { - "version": "2.0.0", - "from": "has-unicode@^2.0.0", - "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.0.tgz" - }, - "hoek": { - "version": "2.16.3", - "from": "hoek@2.x.x", - "resolved": "https://registry.npmjs.org/hoek/-/hoek-2.16.3.tgz" - }, - "inherits": { - "version": "2.0.1", - "from": "inherits@*", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz" - }, - "ini": { - "version": "1.3.4", - "from": "ini@~1.3.0", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.4.tgz" - }, - "http-signature": { - "version": "1.1.1", - "from": "http-signature@~1.1.0", - "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.1.1.tgz" - }, - "is-my-json-valid": { - "version": "2.13.1", - "from": "is-my-json-valid@^2.12.4", - "resolved": "https://registry.npmjs.org/is-my-json-valid/-/is-my-json-valid-2.13.1.tgz" - }, - "isarray": { - "version": "1.0.0", - "from": "isarray@~1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz" - }, - "isstream": { - "version": "0.1.2", - "from": "isstream@~0.1.2", - "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz" - }, - "is-property": { - "version": "1.0.2", - "from": "is-property@^1.0.0", - "resolved": "https://registry.npmjs.org/is-property/-/is-property-1.0.2.tgz" - }, - "jsbn": { - "version": "0.1.0", - "from": "jsbn@>=0.1.0 <0.2.0", - "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.0.tgz" - }, - "is-typedarray": { - "version": "1.0.0", - "from": "is-typedarray@~1.0.0", - "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz" - }, - "jodid25519": { - "version": "1.0.2", - "from": "jodid25519@>=1.0.0 <2.0.0", - "resolved": "https://registry.npmjs.org/jodid25519/-/jodid25519-1.0.2.tgz" - }, - "json-schema": { - "version": "0.2.2", - "from": "json-schema@0.2.2", - "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.2.tgz" - }, - "json-stringify-safe": { - "version": "5.0.1", - "from": "json-stringify-safe@~5.0.1", - "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz" - }, - "lodash.pad": { - "version": "4.1.0", - "from": "lodash.pad@^4.1.0", - "resolved": "https://registry.npmjs.org/lodash.pad/-/lodash.pad-4.1.0.tgz" - }, - "jsonpointer": { - "version": "2.0.0", - "from": "jsonpointer@2.0.0", - "resolved": "https://registry.npmjs.org/jsonpointer/-/jsonpointer-2.0.0.tgz" - }, - "jsprim": { - "version": "1.2.2", - "from": "jsprim@^1.2.2", - "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.2.2.tgz" - }, - "lodash.padend": { - "version": "4.2.0", - "from": "lodash.padend@^4.1.0", - "resolved": "https://registry.npmjs.org/lodash.padend/-/lodash.padend-4.2.0.tgz" - }, - "lodash.padstart": { - "version": "4.2.0", - "from": "lodash.padstart@^4.1.0", - "resolved": "https://registry.npmjs.org/lodash.padstart/-/lodash.padstart-4.2.0.tgz" - }, - "lodash.repeat": { - "version": "4.0.0", - "from": "lodash.repeat@^4.0.0", - "resolved": "https://registry.npmjs.org/lodash.repeat/-/lodash.repeat-4.0.0.tgz" - }, - "lodash.tostring": { - "version": "4.1.2", - "from": "lodash.tostring@^4.0.0", - "resolved": "https://registry.npmjs.org/lodash.tostring/-/lodash.tostring-4.1.2.tgz" - }, - "mime-db": { - "version": "1.22.0", - "from": "mime-db@~1.22.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.22.0.tgz" - }, - "minimist": { - "version": "0.0.8", - "from": "minimist@0.0.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz" - }, - "mime-types": { - "version": "2.1.10", - "from": "mime-types@~2.1.7", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.10.tgz" - }, - "mkdirp": { - "version": "0.5.1", - "from": "mkdirp@>=0.3.0 <0.4.0||>=0.4.0 <0.5.0||>=0.5.0 <0.6.0", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz" - }, - "ms": { - "version": "0.7.1", - "from": "ms@0.7.1", - "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.1.tgz" - }, - "node-uuid": { - "version": "1.4.7", - "from": "node-uuid@~1.4.7", - "resolved": "https://registry.npmjs.org/node-uuid/-/node-uuid-1.4.7.tgz" - }, - "npmlog": { - "version": "2.0.3", - "from": "npmlog@~2.0.0", - "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-2.0.3.tgz" - }, - "oauth-sign": { - "version": "0.8.1", - "from": "oauth-sign@~0.8.0", - "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.8.1.tgz" - }, - "once": { - "version": "1.3.3", - "from": "once@~1.3.3", - "resolved": "https://registry.npmjs.org/once/-/once-1.3.3.tgz" - }, - "pinkie": { - "version": "2.0.4", - "from": "pinkie@^2.0.0", - "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz" - }, - "pinkie-promise": { - "version": "2.0.0", - "from": "pinkie-promise@^2.0.0", - "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.0.tgz" - }, - "process-nextick-args": { - "version": "1.0.6", - "from": "process-nextick-args@~1.0.6", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.6.tgz" - }, - "qs": { - "version": "6.0.2", - "from": "qs@~6.0.2", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.0.2.tgz" - }, - "request": { - "version": "2.69.0", - "from": "request@2.x", - "resolved": "https://registry.npmjs.org/request/-/request-2.69.0.tgz" - }, - "readable-stream": { - "version": "2.0.6", - "from": "readable-stream@^2.0.0 || ^1.1.13", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.0.6.tgz" - }, - "sntp": { - "version": "1.0.9", - "from": "sntp@1.x.x", - "resolved": "https://registry.npmjs.org/sntp/-/sntp-1.0.9.tgz" - }, - "semver": { - "version": "5.1.0", - "from": "semver@~5.1.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.1.0.tgz" - }, - "sshpk": { - "version": "1.7.4", - "from": "sshpk@^1.7.0", - "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.7.4.tgz" - }, - "string_decoder": { - "version": "0.10.31", - "from": "string_decoder@~0.10.x", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz" - }, - "stringstream": { - "version": "0.0.5", - "from": "stringstream@~0.0.4", - "resolved": "https://registry.npmjs.org/stringstream/-/stringstream-0.0.5.tgz" - }, - "strip-ansi": { - "version": "3.0.1", - "from": "strip-ansi@^3.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz" - }, - "supports-color": { - "version": "2.0.0", - "from": "supports-color@^2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz" - }, - "strip-json-comments": { - "version": "1.0.4", - "from": "strip-json-comments@~1.0.4", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-1.0.4.tgz" - }, - "tar-pack": { - "version": "3.1.3", - "from": "tar-pack@~3.1.0", - "resolved": "https://registry.npmjs.org/tar-pack/-/tar-pack-3.1.3.tgz" - }, - "tar": { - "version": "2.2.1", - "from": "tar@~2.2.0", - "resolved": "https://registry.npmjs.org/tar/-/tar-2.2.1.tgz" - }, - "tunnel-agent": { - "version": "0.4.2", - "from": "tunnel-agent@~0.4.1", - "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.4.2.tgz" - }, - "tough-cookie": { - "version": "2.2.2", - "from": "tough-cookie@~2.2.0", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.2.2.tgz" - }, - "uid-number": { - "version": "0.0.6", - "from": "uid-number@~0.0.6", - "resolved": "https://registry.npmjs.org/uid-number/-/uid-number-0.0.6.tgz" - }, - "tweetnacl": { - "version": "0.14.3", - "from": "tweetnacl@>=0.13.0 <1.0.0", - "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.3.tgz" - }, - "util-deprecate": { - "version": "1.0.2", - "from": "util-deprecate@~1.0.1", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz" - }, - "verror": { - "version": "1.3.6", - "from": "verror@1.3.6", - "resolved": "https://registry.npmjs.org/verror/-/verror-1.3.6.tgz" - }, - "wrappy": { - "version": "1.0.1", - "from": "wrappy@1", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.1.tgz" - }, - "xtend": { - "version": "4.0.1", - "from": "xtend@^4.0.0", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz" - }, - "dashdash": { - "version": "1.13.0", - "from": "dashdash@>=1.10.1 <2.0.0", - "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.13.0.tgz", - "dependencies": { - "assert-plus": { - "version": "1.0.0", - "from": "assert-plus@^1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz" - } - } - }, - "rc": { - "version": "1.1.6", - "from": "rc@~1.1.0", - "resolved": "https://registry.npmjs.org/rc/-/rc-1.1.6.tgz", - "dependencies": { - "minimist": { - "version": "1.2.0", - "from": "minimist@^1.2.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz" - } - } - }, - "aws4": { - "version": "1.3.2", - "from": "aws4@^1.2.1", - "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.3.2.tgz", - "dependencies": { - "lru-cache": { - "version": "4.0.1", - "from": "lru-cache@^4.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.0.1.tgz", - "dependencies": { - "pseudomap": { - "version": "1.0.2", - "from": "pseudomap@^1.0.1", - "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz" - }, - "yallist": { - "version": "2.0.0", - "from": "yallist@^2.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.0.0.tgz" - } - } - } - } - }, - "fstream-ignore": { - "version": "1.0.3", - "from": "fstream-ignore@~1.0.3", - "resolved": "https://registry.npmjs.org/fstream-ignore/-/fstream-ignore-1.0.3.tgz", - "dependencies": { - "minimatch": { - "version": "3.0.0", - "from": "minimatch@^3.0.0", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.0.tgz", - "dependencies": { - "brace-expansion": { - "version": "1.1.3", - "from": "brace-expansion@^1.0.0", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.3.tgz", - "dependencies": { - "balanced-match": { - "version": "0.3.0", - "from": "balanced-match@^0.3.0", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-0.3.0.tgz" - }, - "concat-map": { - "version": "0.0.1", - "from": "concat-map@0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz" - } - } - } - } - } - } - }, - "rimraf": { - "version": "2.5.2", - "from": "rimraf@~2.5.0", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.5.2.tgz", - "dependencies": { - "glob": { - "version": "7.0.3", - "from": "glob@^7.0.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.0.3.tgz", - "dependencies": { - "inflight": { - "version": "1.0.4", - "from": "inflight@^1.0.4", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.4.tgz", - "dependencies": { - "wrappy": { - "version": "1.0.1", - "from": "wrappy@1", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.1.tgz" - } - } - }, - "inherits": { - "version": "2.0.1", - "from": "inherits@2", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz" - }, - "minimatch": { - "version": "3.0.0", - "from": "minimatch@2 || 3", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.0.tgz", - "dependencies": { - "brace-expansion": { - "version": "1.1.3", - "from": "brace-expansion@^1.0.0", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.3.tgz", - "dependencies": { - "balanced-match": { - "version": "0.3.0", - "from": "balanced-match@^0.3.0", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-0.3.0.tgz" - }, - "concat-map": { - "version": "0.0.1", - "from": "concat-map@0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz" - } - } - } - } - }, - "once": { - "version": "1.3.3", - "from": "once@^1.3.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.3.3.tgz", - "dependencies": { - "wrappy": { - "version": "1.0.1", - "from": "wrappy@1", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.1.tgz" - } - } - }, - "path-is-absolute": { - "version": "1.0.0", - "from": "path-is-absolute@^1.0.0", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.0.tgz" - } - } - } - } - } - } - } - } - }, - "colors": { - "version": "1.1.2", - "from": "https://registry.npmjs.org/colors/-/colors-1.1.2.tgz", - "resolved": "https://registry.npmjs.org/colors/-/colors-1.1.2.tgz" - }, - "connect": { - "version": "3.4.1", - "from": "https://registry.npmjs.org/connect/-/connect-3.4.1.tgz", - "resolved": "https://registry.npmjs.org/connect/-/connect-3.4.1.tgz", - "dependencies": { - "debug": { - "version": "2.2.0", - "from": "https://registry.npmjs.org/debug/-/debug-2.2.0.tgz", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.2.0.tgz", - "dependencies": { - "ms": { - "version": "0.7.1", - "from": "https://registry.npmjs.org/ms/-/ms-0.7.1.tgz", - "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.1.tgz" - } - } - }, - "finalhandler": { - "version": "0.4.1", - "from": "https://registry.npmjs.org/finalhandler/-/finalhandler-0.4.1.tgz", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-0.4.1.tgz", - "dependencies": { - "escape-html": { - "version": "1.0.3", - "from": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", - "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz" - }, - "on-finished": { - "version": "2.3.0", - "from": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", - "dependencies": { - "ee-first": { - "version": "1.1.1", - "from": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", - "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz" - } - } - }, - "unpipe": { + "unpipe": { "version": "1.0.0", "from": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz" @@ -13453,40 +12977,6 @@ "version": "1.0.2", "from": "https://registry.npmjs.org/ultron/-/ultron-1.0.2.tgz", "resolved": "https://registry.npmjs.org/ultron/-/ultron-1.0.2.tgz" - }, - "bufferutil": { - "version": "1.2.1", - "from": "https://registry.npmjs.org/bufferutil/-/bufferutil-1.2.1.tgz", - "resolved": "https://registry.npmjs.org/bufferutil/-/bufferutil-1.2.1.tgz", - "dependencies": { - "bindings": { - "version": "1.2.1", - "from": "https://registry.npmjs.org/bindings/-/bindings-1.2.1.tgz", - "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.2.1.tgz" - }, - "nan": { - "version": "2.3.3", - "from": "https://registry.npmjs.org/nan/-/nan-2.3.3.tgz", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.3.3.tgz" - } - } - }, - "utf-8-validate": { - "version": "1.2.1", - "from": "https://registry.npmjs.org/utf-8-validate/-/utf-8-validate-1.2.1.tgz", - "resolved": "https://registry.npmjs.org/utf-8-validate/-/utf-8-validate-1.2.1.tgz", - "dependencies": { - "bindings": { - "version": "1.2.1", - "from": "https://registry.npmjs.org/bindings/-/bindings-1.2.1.tgz", - "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.2.1.tgz" - }, - "nan": { - "version": "2.3.3", - "from": "https://registry.npmjs.org/nan/-/nan-2.3.3.tgz", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.3.3.tgz" - } - } } } }, diff --git a/package.json b/package.json index 4a6af69e69d1..c0bfc9c77bf6 100644 --- a/package.json +++ b/package.json @@ -54,7 +54,7 @@ "gulp-util": "^3.0.1", "jasmine-core": "^2.4.0", "jasmine-node": "^2.0.0", - "jasmine-reporters": "~1.0.1", + "jasmine-reporters": "^2.2.0", "jshint": "^2.9.1", "jshint-stylish": "^2.1.0", "karma": "^0.13.19", From a82a8a5210858e34a0727eba1ac03a389bdd67d8 Mon Sep 17 00:00:00 2001 From: Martin Staffa Date: Thu, 7 Jul 2016 15:29:25 +0200 Subject: [PATCH 0036/1173] chore(protractor): use jasmine2 as framework --- protractor-jenkins-conf.js | 2 +- protractor-shared-conf.js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/protractor-jenkins-conf.js b/protractor-jenkins-conf.js index f71bfdde89e8..ca2cf69f5c3f 100644 --- a/protractor-jenkins-conf.js +++ b/protractor-jenkins-conf.js @@ -15,7 +15,7 @@ exports.config = { baseUrl: 'http://localhost:8000/', - framework: 'jasmine', + framework: 'jasmine2', onPrepare: function() { /* global angular: false, browser: false, jasmine: false */ diff --git a/protractor-shared-conf.js b/protractor-shared-conf.js index 917040f2134c..7b09ee76255f 100644 --- a/protractor-shared-conf.js +++ b/protractor-shared-conf.js @@ -5,7 +5,7 @@ exports.config = { baseUrl: 'http://localhost:8000/', - framework: 'jasmine', + framework: 'jasmine2', onPrepare: function() { /* global angular: false, browser: false, jasmine: false */ From c0f0d136f0675ef699d6d6d183f11a3829bcfcb3 Mon Sep 17 00:00:00 2001 From: Oliver Salzburg Date: Fri, 8 Jul 2016 10:15:19 +0200 Subject: [PATCH 0037/1173] docs($http): fix default $http cache name The name of the cache is the string "$http", not the symbol itself. Closes #14885 --- src/ng/http.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ng/http.js b/src/ng/http.js index b90e16e90dfb..351591001673 100644 --- a/src/ng/http.js +++ b/src/ng/http.js @@ -629,7 +629,7 @@ function $HttpProvider() { * * cache a specific response - set config.cache value to TRUE or to a cache object * * If caching is enabled, but neither the default cache nor config.cache are set to a cache object, - * then the default `$cacheFactory($http)` object is used. + * then the default `$cacheFactory("$http")` object is used. * * The default cache value can be set by updating the * {@link ng.$http#defaults `$http.defaults.cache`} property or the From f8a3faf5c9d03bb83a78800bfa11e260f18161fa Mon Sep 17 00:00:00 2001 From: Georgios Kalpakas Date: Sun, 10 Jul 2016 11:46:36 +0300 Subject: [PATCH 0038/1173] docs(guide/module): remove newline in the middle of sentence --- docs/content/guide/module.ngdoc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/content/guide/module.ngdoc b/docs/content/guide/module.ngdoc index 433a3223918a..09ac5ae944f8 100644 --- a/docs/content/guide/module.ngdoc +++ b/docs/content/guide/module.ngdoc @@ -75,8 +75,8 @@ that you break your application to multiple modules like this: * And an application level module which depends on the above modules and contains any initialization code. -You can find a community -[style guide](https://github.com/johnpapa/angular-styleguide) to help yourself when application grows. +You can find a community [style guide](https://github.com/johnpapa/angular-styleguide) to help +yourself when application grows. The above is a suggestion. Tailor it to your needs. From 5fe823948f3af9d6ef34bb42112d87d4d7ae360f Mon Sep 17 00:00:00 2001 From: Georgios Kalpakas Date: Fri, 8 Jul 2016 19:05:27 +0300 Subject: [PATCH 0039/1173] chore(Jenkins): fix e2e tests on Jenkins Follow-up to c72e13f and a82a8a5. Closes #14889 --- protractor-jenkins-conf.js | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/protractor-jenkins-conf.js b/protractor-jenkins-conf.js index ca2cf69f5c3f..b37ef19e9f55 100644 --- a/protractor-jenkins-conf.js +++ b/protractor-jenkins-conf.js @@ -29,9 +29,10 @@ exports.config = { browser.addMockModule('disableNgAnimate', disableNgAnimate); - require('jasmine-reporters'); - jasmine.getEnv().addReporter( - new jasmine.JUnitXmlReporter('test_out/docs-e2e-' + exports.config.capabilities.browserName + '-', true, true)); + var reporters = require('jasmine-reporters'); + jasmine.getEnv().addReporter(new reporters.JUnitXmlReporter({ + savePath: 'test_out/docs-e2e-' + exports.config.capabilities.browserName + '-' + })); }, jasmineNodeOpts: { From 914b5c87ffbf1496f736314b68c97a44a8e39f63 Mon Sep 17 00:00:00 2001 From: Lioman Date: Mon, 11 Jul 2016 18:22:57 +0200 Subject: [PATCH 0040/1173] docs(FAQ): fix heading Add whitespace to H1 PR: (#14896) --- docs/content/misc/faq.ngdoc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/content/misc/faq.ngdoc b/docs/content/misc/faq.ngdoc index f91760e49841..57d9ccf65846 100644 --- a/docs/content/misc/faq.ngdoc +++ b/docs/content/misc/faq.ngdoc @@ -2,7 +2,7 @@ @name FAQ @description -#FAQ +# FAQ ## Questions From c253b8e5777710b51dd6cfe540f4ace859672cb9 Mon Sep 17 00:00:00 2001 From: Steve Berube Date: Tue, 12 Jul 2016 09:49:42 -0400 Subject: [PATCH 0041/1173] docs(guide/animations): use the arguments of `enabled()` in correct order Closes #14900 --- docs/content/guide/animations.ngdoc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/content/guide/animations.ngdoc b/docs/content/guide/animations.ngdoc index 741cb5334ccb..eb121f3578f6 100644 --- a/docs/content/guide/animations.ngdoc +++ b/docs/content/guide/animations.ngdoc @@ -313,8 +313,8 @@ This function can be used to enable / disable animations in two different ways: With a single `boolean` argument, it enables / disables animations globally: `$animate.enabled(false)` disables all animations in your app. -When the second argument is a native DOM or jQuery element, the function enables / disables -animations on this element *and all its children*: `$animate.enabled(false, myElement)`. This is the +When the first argument is a native DOM or jqLite/jQuery element, the function enables / disables +animations on this element *and all its children*: `$animate.enabled(myElement, false)`. This is the most flexible way to change the animation state. For example, even if you have used it to disable animations on a parent element, you can still re-enable it for a child element. And compared to the `classNameFilter`, you can change the animation status at runtime instead of during the config phase. From 76ca4f4c2099e3c8015c703cda946c50a5a893c2 Mon Sep 17 00:00:00 2001 From: Ronan Connolly Date: Tue, 12 Jul 2016 14:53:59 +0100 Subject: [PATCH 0042/1173] docs(guide/unit-testing): add missing heading Closes #14901 --- docs/content/guide/unit-testing.ngdoc | 2 ++ 1 file changed, 2 insertions(+) diff --git a/docs/content/guide/unit-testing.ngdoc b/docs/content/guide/unit-testing.ngdoc index f7b33c904668..d5825c394349 100644 --- a/docs/content/guide/unit-testing.ngdoc +++ b/docs/content/guide/unit-testing.ngdoc @@ -3,6 +3,8 @@ @sortOrder 410 @description +# Unit Testing + JavaScript is a dynamically typed language which comes with great power of expression, but it also comes with almost no help from the compiler. For this reason we feel very strongly that any code written in JavaScript needs to come with a strong set of tests. We have built many features into From 489224ba8557837c9bd59e52220d7ec822ac4be0 Mon Sep 17 00:00:00 2001 From: Georgios Kalpakas Date: Tue, 12 Jul 2016 17:45:58 +0300 Subject: [PATCH 0043/1173] refactor($animate): avoid unnecessary lookup Closes #14902 --- src/ngAnimate/animateQueue.js | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/ngAnimate/animateQueue.js b/src/ngAnimate/animateQueue.js index 385de478a920..4e2b7541ad0e 100644 --- a/src/ngAnimate/animateQueue.js +++ b/src/ngAnimate/animateQueue.js @@ -289,11 +289,10 @@ var $$AnimateQueueProvider = ['$animateProvider', function($animateProvider) { bool = animationsEnabled = !!element; } else { var node = getDomNode(element); - var recordExists = disabledElementsLookup.get(node); if (argCount === 1) { // (element) - Element getter - bool = !recordExists; + bool = !disabledElementsLookup.get(node); } else { // (element, bool) - Element setter disabledElementsLookup.put(node, !bool); From 859b1e300cfc09a9d0740e6ac028665ad96c93fd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Go=C5=82e=CC=A8biowski?= Date: Wed, 6 Jul 2016 14:05:39 +0200 Subject: [PATCH 0044/1173] test(jQuery): Run tests with jQuery 3 Closes #14874 --- Gruntfile.js | 5 ++++- angularFiles.js | 20 +++++++++++--------- bower.json | 3 ++- karma-jquery-2.1.conf.js | 17 ++--------------- karma-jquery-2.2.conf.js | 5 +++++ karma-jquery.conf-factory.js | 25 +++++++++++++++++++++++++ karma-jquery.conf.js | 17 ++--------------- test/ng/directive/selectSpec.js | 18 ++++++++++++++++-- 8 files changed, 67 insertions(+), 43 deletions(-) create mode 100644 karma-jquery-2.2.conf.js create mode 100644 karma-jquery.conf-factory.js diff --git a/Gruntfile.js b/Gruntfile.js index 35cfc7b8d4d8..52033d91c9a2 100644 --- a/Gruntfile.js +++ b/Gruntfile.js @@ -83,6 +83,7 @@ module.exports = function(grunt) { tests: { jqlite: 'karma-jqlite.conf.js', jquery: 'karma-jquery.conf.js', + 'jquery-2.2': 'karma-jquery-2.2.conf.js', 'jquery-2.1': 'karma-jquery-2.1.conf.js', docs: 'karma-docs.conf.js', modules: 'karma-modules.conf.js' @@ -92,6 +93,7 @@ module.exports = function(grunt) { autotest: { jqlite: 'karma-jqlite.conf.js', jquery: 'karma-jquery.conf.js', + 'jquery-2.2': 'karma-jquery-2.2.conf.js', 'jquery-2.1': 'karma-jquery-2.1.conf.js', modules: 'karma-modules.conf.js', docs: 'karma-docs.conf.js' @@ -364,10 +366,11 @@ module.exports = function(grunt) { grunt.registerTask('test', 'Run unit, docs and e2e tests with Karma', ['jshint', 'jscs', 'package', 'test:unit', 'test:promises-aplus', 'tests:docs', 'test:protractor']); grunt.registerTask('test:jqlite', 'Run the unit tests with Karma' , ['tests:jqlite']); grunt.registerTask('test:jquery', 'Run the jQuery (latest) unit tests with Karma', ['tests:jquery']); + grunt.registerTask('test:jquery-2.2', 'Run the jQuery 2.2 unit tests with Karma', ['tests:jquery-2.2']); grunt.registerTask('test:jquery-2.1', 'Run the jQuery 2.1 unit tests with Karma', ['tests:jquery-2.1']); grunt.registerTask('test:modules', 'Run the Karma module tests with Karma', ['build', 'tests:modules']); grunt.registerTask('test:docs', 'Run the doc-page tests with Karma', ['package', 'tests:docs']); - grunt.registerTask('test:unit', 'Run unit, jQuery and Karma module tests with Karma', ['test:jqlite', 'test:jquery', 'test:jquery-2.1', 'test:modules']); + grunt.registerTask('test:unit', 'Run unit, jQuery and Karma module tests with Karma', ['test:jqlite', 'test:jquery', 'test:jquery-2.2', 'test:jquery-2.1', 'test:modules']); grunt.registerTask('test:protractor', 'Run the end to end tests with Protractor and keep a test server running in the background', ['webdriver', 'connect:testserver', 'protractor:normal']); grunt.registerTask('test:travis-protractor', 'Run the end to end tests with Protractor for Travis CI builds', ['connect:testserver', 'protractor:travis']); grunt.registerTask('test:ci-protractor', 'Run the end to end tests with Protractor for Jenkins CI builds', ['webdriver', 'connect:testserver', 'protractor:jenkins']); diff --git a/angularFiles.js b/angularFiles.js index 0513de6742fe..71edff31c567 100755 --- a/angularFiles.js +++ b/angularFiles.js @@ -236,15 +236,6 @@ var angularFiles = { '@angularTest' ], - 'karmaJqueryOld': [ - 'bower_components/jquery-2.1/dist/jquery.js', - 'test/jquery_alias.js', - '@angularSrc', - '@angularSrcModules', - '@angularScenario', - '@angularTest' - ], - 'karmaJqueryExclude': [ 'src/angular-bootstrap.js', 'src/ngScenario/angular-bootstrap.js', @@ -253,6 +244,17 @@ var angularFiles = { ] }; +['2.1', '2.2'].forEach(function (jQueryVersion) { + angularFiles['karmaJquery' + jQueryVersion] = [] + .concat(angularFiles.karmaJquery) + .map(function (path) { + if (path.startsWith('bower_components/jquery')) { + return path.replace(/^bower_components\/jquery/, 'bower_components/jquery-' + jQueryVersion); + } + return path; + }); +}); + angularFiles['angularSrcModules'] = [].concat( angularFiles['angularModules']['ngAnimate'], angularFiles['angularModules']['ngMessageFormat'], diff --git a/bower.json b/bower.json index 20c425e22f7a..efdf0fe3403c 100644 --- a/bower.json +++ b/bower.json @@ -2,7 +2,8 @@ "name": "AngularJS", "license": "MIT", "devDependencies": { - "jquery": "2.2.3", + "jquery": "3.1.0", + "jquery-2.2": "jquery#2.2.4", "jquery-2.1": "jquery#2.1.4", "closure-compiler": "https://dl.google.com/closure-compiler/compiler-20140814.zip", "ng-closure-runner": "https://raw.github.com/angular/ng-closure-runner/v0.2.3/assets/ng-closure-runner.zip" diff --git a/karma-jquery-2.1.conf.js b/karma-jquery-2.1.conf.js index 7ea14d91dd8e..b9d4275e5f58 100644 --- a/karma-jquery-2.1.conf.js +++ b/karma-jquery-2.1.conf.js @@ -1,18 +1,5 @@ 'use strict'; -var angularFiles = require('./angularFiles'); -var sharedConfig = require('./karma-shared.conf'); +var karmaConfigFactory = require('./karma-jquery.conf-factory'); -module.exports = function(config) { - sharedConfig(config, {testName: 'AngularJS: jQuery', logFile: 'karma-jquery.log'}); - - config.set({ - files: angularFiles.mergeFilesFor('karmaJqueryOld'), - exclude: angularFiles.mergeFilesFor('karmaJqueryExclude'), - - junitReporter: { - outputFile: 'test_out/jquery.xml', - suite: 'jQuery' - } - }); -}; +module.exports = karmaConfigFactory('2.1'); diff --git a/karma-jquery-2.2.conf.js b/karma-jquery-2.2.conf.js new file mode 100644 index 000000000000..1d07d68e97d4 --- /dev/null +++ b/karma-jquery-2.2.conf.js @@ -0,0 +1,5 @@ +'use strict'; + +var karmaConfigFactory = require('./karma-jquery.conf-factory'); + +module.exports = karmaConfigFactory('2.2'); diff --git a/karma-jquery.conf-factory.js b/karma-jquery.conf-factory.js new file mode 100644 index 000000000000..993bca028997 --- /dev/null +++ b/karma-jquery.conf-factory.js @@ -0,0 +1,25 @@ +'use strict'; + +var angularFiles = require('./angularFiles'); +var sharedConfig = require('./karma-shared.conf'); + +module.exports = function (version) { + version = version || ''; + + return function(config) { + sharedConfig(config, { + testName: 'AngularJS: jQuery' + (version ? ' ' + version : ''), + logFile: 'karma-jquery' + version + '.log' + }); + + config.set({ + files: angularFiles.mergeFilesFor('karmaJquery' + version), + exclude: angularFiles.mergeFilesFor('karmaJqueryExclude'), + + junitReporter: { + outputFile: 'test_out/jquery.xml', + suite: 'jQuery' + } + }); + }; +}; diff --git a/karma-jquery.conf.js b/karma-jquery.conf.js index c7db1c25255a..38597296658d 100644 --- a/karma-jquery.conf.js +++ b/karma-jquery.conf.js @@ -1,18 +1,5 @@ 'use strict'; -var angularFiles = require('./angularFiles'); -var sharedConfig = require('./karma-shared.conf'); +var karmaConfigFactory = require('./karma-jquery.conf-factory'); -module.exports = function(config) { - sharedConfig(config, {testName: 'AngularJS: jQuery', logFile: 'karma-jquery.log'}); - - config.set({ - files: angularFiles.mergeFilesFor('karmaJquery'), - exclude: angularFiles.mergeFilesFor('karmaJqueryExclude'), - - junitReporter: { - outputFile: 'test_out/jquery.xml', - suite: 'jQuery' - } - }); -}; +module.exports = karmaConfigFactory(); diff --git a/test/ng/directive/selectSpec.js b/test/ng/directive/selectSpec.js index 17f1a6b26f74..2cd5b092a464 100644 --- a/test/ng/directive/selectSpec.js +++ b/test/ng/directive/selectSpec.js @@ -1912,7 +1912,14 @@ describe('select', function() { optionElements = element.find('option'); expect(optionElements.length).toEqual(1); expect(scope.obj.value).toEqual([]); - expect(element.val()).toBe(null); + + // Cover both jQuery 3.x ([]) and 2.x (null) behavior. + var val = element.val(); + if (val === null) { + val = []; + } + expect(val).toEqual([]); + expect(ngModelCtrlSpy).toHaveBeenCalledTimes(1); }); @@ -1970,7 +1977,14 @@ describe('select', function() { optionElements = element.find('option'); expect(optionElements.length).toEqual(3); expect(scope.obj.value).toEqual([]); - expect(element.val()).toBe(null); + + // Cover both jQuery 3.x ([]) and 2.x (null) behavior. + var val = element.val(); + if (val === null) { + val = []; + } + expect(val).toEqual([]); + expect(ngModelCtrlSpy).toHaveBeenCalledTimes(1); }); From 267ee9c892b0eb40908700ee2435793f8c6c1c84 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kate=20Mih=C3=A1likov=C3=A1?= Date: Fri, 11 Dec 2015 12:29:58 +0100 Subject: [PATCH 0045/1173] fix(ngMock): trigger digest in `$httpBackend.verifyNoOutstandingRequest()` Firing a digest at the beginning of the verification process, ensures that requests fired asynchronously - e.g. in the `resolve` handler of a promise as happens with `$http` - will get detected as well. Previously, in order to reliably verify that there was no outstanding request, users needed to manually trigger a digest, before calling `verifyNoOutstandingRequest()`. Failing to do so, could prevent `verifyNoOutstandingRequest()` from detecting pending requests and cover bugs in application code. This is no longer the case, since a digest will always be fired autommatically as part of a call to `verifyNoOutstandingRequest()`. Fixes #13506 Closes #13513 BREAKING CHANGE: Calling `$httpBackend.verifyNoOutstandingRequest()` will trigger a digest. This will ensure that requests fired asynchronously will also be detected (without the need to manually trigger a digest). This is not expected to affect the majority of test-suites. Most of the time, a digest is (directly or indirectly) triggered anyway, before calling `verifyNoOutstandingRequest()`. In the unlikely case that a test needs to verify the timing of a request with respect to the digest cycle, you should rely on other means, such as mocking and/or spying. --- src/ngMock/angular-mocks.js | 3 ++- test/ngMock/angular-mocksSpec.js | 17 +++++++++++++++++ 2 files changed, 19 insertions(+), 1 deletion(-) diff --git a/src/ngMock/angular-mocks.js b/src/ngMock/angular-mocks.js index 3ad263ce81b8..8d3e5881f621 100644 --- a/src/ngMock/angular-mocks.js +++ b/src/ngMock/angular-mocks.js @@ -1847,7 +1847,8 @@ function createHttpBackendMock($rootScope, $timeout, $delegate, $browser) { * afterEach($httpBackend.verifyNoOutstandingRequest); * ``` */ - $httpBackend.verifyNoOutstandingRequest = function() { + $httpBackend.verifyNoOutstandingRequest = function(digest) { + if (digest !== false) $rootScope.$digest(); if (responses.length) { throw new Error('Unflushed requests: ' + responses.length); } diff --git a/test/ngMock/angular-mocksSpec.js b/test/ngMock/angular-mocksSpec.js index d1e3b87298b9..a86c2f555003 100644 --- a/test/ngMock/angular-mocksSpec.js +++ b/test/ngMock/angular-mocksSpec.js @@ -1012,6 +1012,7 @@ describe('ngMock', function() { hb = $httpBackend; })); + it('should provide "expect" methods for each HTTP verb', function() { expect(typeof hb.expectGET).toBe("function"); expect(typeof hb.expectPOST).toBe("function"); @@ -1031,6 +1032,7 @@ describe('ngMock', function() { expect(typeof hb.whenHEAD).toBe("function"); }); + it('should provide "route" shortcuts for expect and when', function() { expect(typeof hb.whenRoute).toBe("function"); expect(typeof hb.expectRoute).toBe("function"); @@ -1653,6 +1655,7 @@ describe('ngMock', function() { }); }); + describe('verifyRequests', function() { it('should throw exception if not all requests were flushed', function() { @@ -1663,6 +1666,18 @@ describe('ngMock', function() { hb.verifyNoOutstandingRequest(); }).toThrowError('Unflushed requests: 1'); }); + + + it('should verify requests fired asynchronously', inject(function($q) { + hb.when('GET').respond(200); + $q.resolve().then(function() { + hb('GET', '/some', null, noop, {}); + }); + + expect(function() { + hb.verifyNoOutstandingRequest(); + }).toThrowError('Unflushed requests: 1'); + })); }); @@ -1723,6 +1738,7 @@ describe('ngMock', function() { }); }); + describe('expectRoute/whenRoute shortcuts', function() { angular.forEach(['expectRoute', 'whenRoute'], function(routeShortcut) { var methods = ['GET', 'POST', 'PUT', 'PATCH', 'DELETE', 'JSONP']; @@ -1753,6 +1769,7 @@ describe('ngMock', function() { }); }); + describe('MockHttpExpectation', function() { /* global MockHttpExpectation */ From d808631d3a4b0aa49b2f05d77f913cc4a3f5e7cd Mon Sep 17 00:00:00 2001 From: Peter Bacon Darwin Date: Thu, 14 Jul 2016 11:34:28 +0100 Subject: [PATCH 0046/1173] style(ngViewSpec): ensure only one top level describe block --- test/ngRoute/directive/ngViewSpec.js | 1521 +++++++++++++------------- 1 file changed, 762 insertions(+), 759 deletions(-) diff --git a/test/ngRoute/directive/ngViewSpec.js b/test/ngRoute/directive/ngViewSpec.js index daab5f26c987..b1a8c6838e0a 100644 --- a/test/ngRoute/directive/ngViewSpec.js +++ b/test/ngRoute/directive/ngViewSpec.js @@ -1,1029 +1,1032 @@ 'use strict'; describe('ngView', function() { - var element; - beforeEach(module('ngRoute')); + describe('basics', function() { + var element; - beforeEach(module(function($provide) { - return function($rootScope, $compile, $animate) { - element = $compile('
    ')($rootScope); - }; - })); + beforeEach(module('ngRoute')); + beforeEach(module(function($provide) { + return function($rootScope, $compile, $animate) { + element = $compile('
    ')($rootScope); + }; + })); - afterEach(function() { - dealoc(element); - }); + afterEach(function() { + dealoc(element); + }); - it('should do nothing when no routes are defined', - inject(function($rootScope, $compile, $location) { - $location.path('/unknown'); - $rootScope.$digest(); - expect(element.text()).toEqual(''); - })); + it('should do nothing when no routes are defined', + inject(function($rootScope, $compile, $location) { + $location.path('/unknown'); + $rootScope.$digest(); + expect(element.text()).toEqual(''); + })); - it('should instantiate controller after compiling the content', function() { - var log = [], controllerScope, - Ctrl = function($scope) { - controllerScope = $scope; - log.push('ctrl-init'); - }; - module(function($compileProvider, $routeProvider) { - $compileProvider.directive('compileLog', function() { - return { - compile: function() { - log.push('compile'); - } - }; - }); + it('should instantiate controller after compiling the content', function() { + var log = [], controllerScope, + Ctrl = function($scope) { + controllerScope = $scope; + log.push('ctrl-init'); + }; - $routeProvider.when('/some', {templateUrl: '/tpl.html', controller: Ctrl}); - }); + module(function($compileProvider, $routeProvider) { + $compileProvider.directive('compileLog', function() { + return { + compile: function() { + log.push('compile'); + } + }; + }); - inject(function($route, $rootScope, $templateCache, $location) { - $templateCache.put('/tpl.html', [200, '
    partial
    ', {}]); - $location.path('/some'); - $rootScope.$digest(); + $routeProvider.when('/some', {templateUrl: '/tpl.html', controller: Ctrl}); + }); + + inject(function($route, $rootScope, $templateCache, $location) { + $templateCache.put('/tpl.html', [200, '
    partial
    ', {}]); + $location.path('/some'); + $rootScope.$digest(); - expect(controllerScope.$parent).toBe($rootScope); - expect(controllerScope).toBe($route.current.scope); - expect(log).toEqual(['compile', 'ctrl-init']); + expect(controllerScope.$parent).toBe($rootScope); + expect(controllerScope).toBe($route.current.scope); + expect(log).toEqual(['compile', 'ctrl-init']); + }); }); - }); - it('should instantiate the associated controller when an empty template is downloaded', function() { - var log = [], controllerScope, - Ctrl = function($scope) { - controllerScope = $scope; - log.push('ctrl-init'); - }; + it('should instantiate the associated controller when an empty template is downloaded', function() { + var log = [], controllerScope, + Ctrl = function($scope) { + controllerScope = $scope; + log.push('ctrl-init'); + }; - module(function($routeProvider) { - $routeProvider.when('/some', {templateUrl: '/tpl.html', controller: Ctrl}); - }); + module(function($routeProvider) { + $routeProvider.when('/some', {templateUrl: '/tpl.html', controller: Ctrl}); + }); - inject(function($route, $rootScope, $templateCache, $location) { - $templateCache.put('/tpl.html', [200, '', {}]); - $location.path('/some'); + inject(function($route, $rootScope, $templateCache, $location) { + $templateCache.put('/tpl.html', [200, '', {}]); + $location.path('/some'); - expect(function() { - $rootScope.$digest(); - }).not.toThrow(); + expect(function() { + $rootScope.$digest(); + }).not.toThrow(); - expect(controllerScope).toBeDefined(); + expect(controllerScope).toBeDefined(); + }); }); - }); - it('should instantiate controller with an alias', function() { - var log = [], controllerScope, - Ctrl = function($scope) { - this.name = 'alias'; - controllerScope = $scope; - }; + it('should instantiate controller with an alias', function() { + var log = [], controllerScope, + Ctrl = function($scope) { + this.name = 'alias'; + controllerScope = $scope; + }; - module(function($compileProvider, $routeProvider) { - $routeProvider.when('/some', {templateUrl: '/tpl.html', controller: Ctrl, controllerAs: 'ctrl'}); - }); + module(function($compileProvider, $routeProvider) { + $routeProvider.when('/some', {templateUrl: '/tpl.html', controller: Ctrl, controllerAs: 'ctrl'}); + }); - inject(function($route, $rootScope, $templateCache, $location) { - $templateCache.put('/tpl.html', [200, '
    ', {}]); - $location.path('/some'); - $rootScope.$digest(); + inject(function($route, $rootScope, $templateCache, $location) { + $templateCache.put('/tpl.html', [200, '
    ', {}]); + $location.path('/some'); + $rootScope.$digest(); - expect(controllerScope.ctrl.name).toBe('alias'); + expect(controllerScope.ctrl.name).toBe('alias'); + }); }); - }); - it('should support string controller declaration', function() { - var MyCtrl = jasmine.createSpy('MyCtrl'); + it('should support string controller declaration', function() { + var MyCtrl = jasmine.createSpy('MyCtrl'); - module(function($controllerProvider, $routeProvider) { - $controllerProvider.register('MyCtrl', ['$scope', MyCtrl]); - $routeProvider.when('/foo', {controller: 'MyCtrl', templateUrl: '/tpl.html'}); - }); + module(function($controllerProvider, $routeProvider) { + $controllerProvider.register('MyCtrl', ['$scope', MyCtrl]); + $routeProvider.when('/foo', {controller: 'MyCtrl', templateUrl: '/tpl.html'}); + }); - inject(function($route, $location, $rootScope, $templateCache) { - $templateCache.put('/tpl.html', [200, '
    ', {}]); - $location.path('/foo'); - $rootScope.$digest(); + inject(function($route, $location, $rootScope, $templateCache) { + $templateCache.put('/tpl.html', [200, '
    ', {}]); + $location.path('/foo'); + $rootScope.$digest(); - expect($route.current.controller).toBe('MyCtrl'); - expect(MyCtrl).toHaveBeenCalledWith(element.children().scope()); + expect($route.current.controller).toBe('MyCtrl'); + expect(MyCtrl).toHaveBeenCalledWith(element.children().scope()); + }); }); - }); - it('should reference resolved locals in scope', function() { - module(function($routeProvider) { - $routeProvider.when('/foo', { - resolve: { - name: function() { - return 'shahar'; - } - }, - template: '
    {{$resolve.name}}
    ' + it('should reference resolved locals in scope', function() { + module(function($routeProvider) { + $routeProvider.when('/foo', { + resolve: { + name: function() { + return 'shahar'; + } + }, + template: '
    {{$resolve.name}}
    ' + }); }); - }); - inject(function($location, $rootScope) { - $location.path('/foo'); - $rootScope.$digest(); - expect(element.text()).toEqual('shahar'); + inject(function($location, $rootScope) { + $location.path('/foo'); + $rootScope.$digest(); + expect(element.text()).toEqual('shahar'); + }); }); - }); - it('should allow to provide an alias for resolved locals using resolveAs', function() { - module(function($routeProvider) { - $routeProvider.when('/foo', { - resolveAs: 'myResolve', - resolve: { - name: function() { - return 'shahar'; - } - }, - template: '
    {{myResolve.name}}
    ' + it('should allow to provide an alias for resolved locals using resolveAs', function() { + module(function($routeProvider) { + $routeProvider.when('/foo', { + resolveAs: 'myResolve', + resolve: { + name: function() { + return 'shahar'; + } + }, + template: '
    {{myResolve.name}}
    ' + }); }); - }); - inject(function($location, $rootScope) { - $location.path('/foo'); - $rootScope.$digest(); - expect(element.text()).toEqual('shahar'); + inject(function($location, $rootScope) { + $location.path('/foo'); + $rootScope.$digest(); + expect(element.text()).toEqual('shahar'); + }); }); - }); - it('should load content via xhr when route changes', function() { - module(function($routeProvider) { - $routeProvider.when('/foo', {templateUrl: 'myUrl1'}); - $routeProvider.when('/bar', {templateUrl: 'myUrl2'}); - }); + it('should load content via xhr when route changes', function() { + module(function($routeProvider) { + $routeProvider.when('/foo', {templateUrl: 'myUrl1'}); + $routeProvider.when('/bar', {templateUrl: 'myUrl2'}); + }); - inject(function($rootScope, $compile, $httpBackend, $location, $route) { - expect(element.text()).toEqual(''); + inject(function($rootScope, $compile, $httpBackend, $location, $route) { + expect(element.text()).toEqual(''); - $location.path('/foo'); - $httpBackend.expect('GET', 'myUrl1').respond('
    {{1+3}}
    '); - $rootScope.$digest(); - $httpBackend.flush(); - expect(element.text()).toEqual('4'); + $location.path('/foo'); + $httpBackend.expect('GET', 'myUrl1').respond('
    {{1+3}}
    '); + $rootScope.$digest(); + $httpBackend.flush(); + expect(element.text()).toEqual('4'); - $location.path('/bar'); - $httpBackend.expect('GET', 'myUrl2').respond('angular is da best'); - $rootScope.$digest(); - $httpBackend.flush(); - expect(element.text()).toEqual('angular is da best'); + $location.path('/bar'); + $httpBackend.expect('GET', 'myUrl2').respond('angular is da best'); + $rootScope.$digest(); + $httpBackend.flush(); + expect(element.text()).toEqual('angular is da best'); + }); }); - }); - it('should use inline content route changes', function() { - module(function($routeProvider) { - $routeProvider.when('/foo', {template: '
    {{1+3}}
    '}); - $routeProvider.when('/bar', {template: 'angular is da best'}); - $routeProvider.when('/blank', {template: ''}); - }); + it('should use inline content route changes', function() { + module(function($routeProvider) { + $routeProvider.when('/foo', {template: '
    {{1+3}}
    '}); + $routeProvider.when('/bar', {template: 'angular is da best'}); + $routeProvider.when('/blank', {template: ''}); + }); - inject(function($rootScope, $compile, $location, $route) { - expect(element.text()).toEqual(''); + inject(function($rootScope, $compile, $location, $route) { + expect(element.text()).toEqual(''); - $location.path('/foo'); - $rootScope.$digest(); - expect(element.text()).toEqual('4'); + $location.path('/foo'); + $rootScope.$digest(); + expect(element.text()).toEqual('4'); - $location.path('/bar'); - $rootScope.$digest(); - expect(element.text()).toEqual('angular is da best'); + $location.path('/bar'); + $rootScope.$digest(); + expect(element.text()).toEqual('angular is da best'); - $location.path('/blank'); - $rootScope.$digest(); - expect(element.text()).toEqual(''); + $location.path('/blank'); + $rootScope.$digest(); + expect(element.text()).toEqual(''); + }); }); - }); - it('should remove all content when location changes to an unknown route', function() { - module(function($routeProvider) { - $routeProvider.when('/foo', {templateUrl: 'myUrl1'}); - }); + it('should remove all content when location changes to an unknown route', function() { + module(function($routeProvider) { + $routeProvider.when('/foo', {templateUrl: 'myUrl1'}); + }); - inject(function($rootScope, $compile, $location, $httpBackend, $route) { - $location.path('/foo'); - $httpBackend.expect('GET', 'myUrl1').respond('
    {{1+3}}
    '); - $rootScope.$digest(); - $httpBackend.flush(); - expect(element.text()).toEqual('4'); + inject(function($rootScope, $compile, $location, $httpBackend, $route) { + $location.path('/foo'); + $httpBackend.expect('GET', 'myUrl1').respond('
    {{1+3}}
    '); + $rootScope.$digest(); + $httpBackend.flush(); + expect(element.text()).toEqual('4'); - $location.path('/unknown'); - $rootScope.$digest(); - expect(element.text()).toEqual(''); + $location.path('/unknown'); + $rootScope.$digest(); + expect(element.text()).toEqual(''); + }); }); - }); - it('should chain scopes and propagate evals to the child scope', function() { - module(function($routeProvider) { - $routeProvider.when('/foo', {templateUrl: 'myUrl1'}); - }); + it('should chain scopes and propagate evals to the child scope', function() { + module(function($routeProvider) { + $routeProvider.when('/foo', {templateUrl: 'myUrl1'}); + }); - inject(function($rootScope, $compile, $location, $httpBackend, $route) { - $rootScope.parentVar = 'parent'; + inject(function($rootScope, $compile, $location, $httpBackend, $route) { + $rootScope.parentVar = 'parent'; - $location.path('/foo'); - $httpBackend.expect('GET', 'myUrl1').respond('
    {{parentVar}}
    '); - $rootScope.$digest(); - $httpBackend.flush(); - expect(element.text()).toEqual('parent'); + $location.path('/foo'); + $httpBackend.expect('GET', 'myUrl1').respond('
    {{parentVar}}
    '); + $rootScope.$digest(); + $httpBackend.flush(); + expect(element.text()).toEqual('parent'); - $rootScope.parentVar = 'new parent'; - $rootScope.$digest(); - expect(element.text()).toEqual('new parent'); + $rootScope.parentVar = 'new parent'; + $rootScope.$digest(); + expect(element.text()).toEqual('new parent'); + }); }); - }); - it('should be possible to nest ngView in ngInclude', function() { + it('should be possible to nest ngView in ngInclude', function() { - module(function($routeProvider) { - $routeProvider.when('/foo', {templateUrl: 'viewPartial.html'}); - }); + module(function($routeProvider) { + $routeProvider.when('/foo', {templateUrl: 'viewPartial.html'}); + }); - inject(function($httpBackend, $location, $route, $compile, $rootScope) { - $httpBackend.whenGET('includePartial.html').respond('view: '); - $httpBackend.whenGET('viewPartial.html').respond('content'); - $location.path('/foo'); + inject(function($httpBackend, $location, $route, $compile, $rootScope) { + $httpBackend.whenGET('includePartial.html').respond('view: '); + $httpBackend.whenGET('viewPartial.html').respond('content'); + $location.path('/foo'); - var elm = $compile( - '
    ' + - 'include: ' + - '
    ')($rootScope); - $rootScope.$digest(); - $httpBackend.flush(); + var elm = $compile( + '
    ' + + 'include: ' + + '
    ')($rootScope); + $rootScope.$digest(); + $httpBackend.flush(); - expect(elm.text()).toEqual('include: view: content'); - expect($route.current.templateUrl).toEqual('viewPartial.html'); - dealoc(elm); + expect(elm.text()).toEqual('include: view: content'); + expect($route.current.templateUrl).toEqual('viewPartial.html'); + dealoc(elm); + }); }); - }); - it('should initialize view template after the view controller was initialized even when ' + - 'templates were cached', function() { - //this is a test for a regression that was introduced by making the ng-view cache sync - function ParentCtrl($scope) { - $scope.log.push('parent'); - } + it('should initialize view template after the view controller was initialized even when ' + + 'templates were cached', function() { + //this is a test for a regression that was introduced by making the ng-view cache sync + function ParentCtrl($scope) { + $scope.log.push('parent'); + } - module(function($routeProvider) { - $routeProvider.when('/foo', {controller: ParentCtrl, templateUrl: 'viewPartial.html'}); - }); + module(function($routeProvider) { + $routeProvider.when('/foo', {controller: ParentCtrl, templateUrl: 'viewPartial.html'}); + }); - inject(function($rootScope, $compile, $location, $httpBackend, $route) { - $rootScope.log = []; + inject(function($rootScope, $compile, $location, $httpBackend, $route) { + $rootScope.log = []; - $rootScope.ChildCtrl = function($scope) { - $scope.log.push('child'); - }; + $rootScope.ChildCtrl = function($scope) { + $scope.log.push('child'); + }; - $location.path('/foo'); - $httpBackend.expect('GET', 'viewPartial.html'). - respond('
    ' + - '
    ' + - '
    '); - $rootScope.$apply(); - $httpBackend.flush(); + $location.path('/foo'); + $httpBackend.expect('GET', 'viewPartial.html'). + respond('
    ' + + '
    ' + + '
    '); + $rootScope.$apply(); + $httpBackend.flush(); - expect($rootScope.log).toEqual(['parent', 'init', 'child']); + expect($rootScope.log).toEqual(['parent', 'init', 'child']); - $location.path('/'); - $rootScope.$apply(); - expect($rootScope.log).toEqual(['parent', 'init', 'child']); + $location.path('/'); + $rootScope.$apply(); + expect($rootScope.log).toEqual(['parent', 'init', 'child']); - $rootScope.log = []; - $location.path('/foo'); - $rootScope.$apply(); + $rootScope.log = []; + $location.path('/foo'); + $rootScope.$apply(); - expect($rootScope.log).toEqual(['parent', 'init', 'child']); + expect($rootScope.log).toEqual(['parent', 'init', 'child']); + }); }); - }); - it('should discard pending xhr callbacks if a new route is requested before the current ' + - 'finished loading', function() { - // this is a test for a bad race condition that affected feedback + it('should discard pending xhr callbacks if a new route is requested before the current ' + + 'finished loading', function() { + // this is a test for a bad race condition that affected feedback - module(function($routeProvider) { - $routeProvider.when('/foo', {templateUrl: 'myUrl1'}); - $routeProvider.when('/bar', {templateUrl: 'myUrl2'}); - }); + module(function($routeProvider) { + $routeProvider.when('/foo', {templateUrl: 'myUrl1'}); + $routeProvider.when('/bar', {templateUrl: 'myUrl2'}); + }); - inject(function($route, $rootScope, $location, $httpBackend) { - expect(element.text()).toEqual(''); + inject(function($route, $rootScope, $location, $httpBackend) { + expect(element.text()).toEqual(''); - $location.path('/foo'); - $httpBackend.expect('GET', 'myUrl1').respond('
    {{1+3}}
    '); - $rootScope.$digest(); - $location.path('/bar'); - $httpBackend.expect('GET', 'myUrl2').respond('
    {{1+1}}
    '); - $rootScope.$digest(); - $httpBackend.flush(); // now that we have two requests pending, flush! + $location.path('/foo'); + $httpBackend.expect('GET', 'myUrl1').respond('
    {{1+3}}
    '); + $rootScope.$digest(); + $location.path('/bar'); + $httpBackend.expect('GET', 'myUrl2').respond('
    {{1+1}}
    '); + $rootScope.$digest(); + $httpBackend.flush(); // now that we have two requests pending, flush! - expect(element.text()).toEqual('2'); + expect(element.text()).toEqual('2'); + }); }); - }); - it('should be async even if served from cache', function() { - module(function($routeProvider) { - $routeProvider.when('/foo', {controller: angular.noop, templateUrl: 'myUrl1'}); - }); + it('should be async even if served from cache', function() { + module(function($routeProvider) { + $routeProvider.when('/foo', {controller: angular.noop, templateUrl: 'myUrl1'}); + }); - inject(function($route, $rootScope, $location, $templateCache) { - $templateCache.put('myUrl1', [200, 'my partial', {}]); - $location.path('/foo'); + inject(function($route, $rootScope, $location, $templateCache) { + $templateCache.put('myUrl1', [200, 'my partial', {}]); + $location.path('/foo'); - var called = 0; - // we want to assert only during first watch - $rootScope.$watch(function() { - if (!called) expect(element.text()).toBe(''); - called++; - }); + var called = 0; + // we want to assert only during first watch + $rootScope.$watch(function() { + if (!called) expect(element.text()).toBe(''); + called++; + }); - $rootScope.$digest(); - expect(element.text()).toBe('my partial'); + $rootScope.$digest(); + expect(element.text()).toBe('my partial'); + }); }); - }); - it('should fire $contentLoaded event when content compiled and linked', function() { - var log = []; - var logger = function(name) { - return function() { - log.push(name); + it('should fire $contentLoaded event when content compiled and linked', function() { + var log = []; + var logger = function(name) { + return function() { + log.push(name); + }; + }; + var Ctrl = function($scope) { + $scope.value = 'bound-value'; + log.push('init-ctrl'); }; - }; - var Ctrl = function($scope) { - $scope.value = 'bound-value'; - log.push('init-ctrl'); - }; - - module(function($routeProvider) { - $routeProvider.when('/foo', {templateUrl: 'tpl.html', controller: Ctrl}); - }); - inject(function($templateCache, $rootScope, $location) { - $rootScope.$on('$routeChangeStart', logger('$routeChangeStart')); - $rootScope.$on('$routeChangeSuccess', logger('$routeChangeSuccess')); - $rootScope.$on('$viewContentLoaded', logger('$viewContentLoaded')); + module(function($routeProvider) { + $routeProvider.when('/foo', {templateUrl: 'tpl.html', controller: Ctrl}); + }); - $templateCache.put('tpl.html', [200, '{{value}}', {}]); - $location.path('/foo'); - $rootScope.$digest(); + inject(function($templateCache, $rootScope, $location) { + $rootScope.$on('$routeChangeStart', logger('$routeChangeStart')); + $rootScope.$on('$routeChangeSuccess', logger('$routeChangeSuccess')); + $rootScope.$on('$viewContentLoaded', logger('$viewContentLoaded')); - expect(element.text()).toBe('bound-value'); - expect(log).toEqual([ - '$routeChangeStart', 'init-ctrl', '$viewContentLoaded', '$routeChangeSuccess' - ]); - }); - }); + $templateCache.put('tpl.html', [200, '{{value}}', {}]); + $location.path('/foo'); + $rootScope.$digest(); - it('should destroy previous scope', function() { - module(function($routeProvider) { - $routeProvider.when('/foo', {templateUrl: 'tpl.html'}); + expect(element.text()).toBe('bound-value'); + expect(log).toEqual([ + '$routeChangeStart', 'init-ctrl', '$viewContentLoaded', '$routeChangeSuccess' + ]); + }); }); - inject(function($templateCache, $rootScope, $location) { - $templateCache.put('tpl.html', [200, 'partial', {}]); + it('should destroy previous scope', function() { + module(function($routeProvider) { + $routeProvider.when('/foo', {templateUrl: 'tpl.html'}); + }); - expect($rootScope.$$childHead).toBeNull(); - expect($rootScope.$$childTail).toBeNull(); + inject(function($templateCache, $rootScope, $location) { + $templateCache.put('tpl.html', [200, 'partial', {}]); - $location.path('/foo'); - $rootScope.$digest(); + expect($rootScope.$$childHead).toBeNull(); + expect($rootScope.$$childTail).toBeNull(); - expect(element.text()).toBe('partial'); - expect($rootScope.$$childHead).not.toBeNull(); - expect($rootScope.$$childTail).not.toBeNull(); + $location.path('/foo'); + $rootScope.$digest(); - $location.path('/non/existing/route'); - $rootScope.$digest(); + expect(element.text()).toBe('partial'); + expect($rootScope.$$childHead).not.toBeNull(); + expect($rootScope.$$childTail).not.toBeNull(); - expect(element.text()).toBe(''); - expect($rootScope.$$childHead).toBeNull(); - expect($rootScope.$$childTail).toBeNull(); + $location.path('/non/existing/route'); + $rootScope.$digest(); + + expect(element.text()).toBe(''); + expect($rootScope.$$childHead).toBeNull(); + expect($rootScope.$$childTail).toBeNull(); + }); }); - }); - it('should destroy previous scope if multiple route changes occur before server responds', - function() { - var log = []; - var createCtrl = function(name) { - return function($scope) { - log.push('init-' + name); - $scope.$on('$destroy', function() {log.push('destroy-' + name);}); + it('should destroy previous scope if multiple route changes occur before server responds', + function() { + var log = []; + var createCtrl = function(name) { + return function($scope) { + log.push('init-' + name); + $scope.$on('$destroy', function() {log.push('destroy-' + name);}); + }; }; - }; - module(function($routeProvider) { - $routeProvider.when('/one', {templateUrl: 'one.html', controller: createCtrl('ctrl1')}); - $routeProvider.when('/two', {templateUrl: 'two.html', controller: createCtrl('ctrl2')}); - }); + module(function($routeProvider) { + $routeProvider.when('/one', {templateUrl: 'one.html', controller: createCtrl('ctrl1')}); + $routeProvider.when('/two', {templateUrl: 'two.html', controller: createCtrl('ctrl2')}); + }); - inject(function($httpBackend, $rootScope, $location) { - $httpBackend.whenGET('one.html').respond('content 1'); - $httpBackend.whenGET('two.html').respond('content 2'); + inject(function($httpBackend, $rootScope, $location) { + $httpBackend.whenGET('one.html').respond('content 1'); + $httpBackend.whenGET('two.html').respond('content 2'); - $location.path('/one'); - $rootScope.$digest(); - $location.path('/two'); - $rootScope.$digest(); + $location.path('/one'); + $rootScope.$digest(); + $location.path('/two'); + $rootScope.$digest(); - $httpBackend.flush(); - expect(element.text()).toBe('content 2'); - expect(log).toEqual(['init-ctrl2']); + $httpBackend.flush(); + expect(element.text()).toBe('content 2'); + expect(log).toEqual(['init-ctrl2']); - $location.path('/non-existing'); - $rootScope.$digest(); + $location.path('/non-existing'); + $rootScope.$digest(); - expect(element.text()).toBe(''); - expect(log).toEqual(['init-ctrl2', 'destroy-ctrl2']); + expect(element.text()).toBe(''); + expect(log).toEqual(['init-ctrl2', 'destroy-ctrl2']); - expect($rootScope.$$childHead).toBeNull(); - expect($rootScope.$$childTail).toBeNull(); + expect($rootScope.$$childHead).toBeNull(); + expect($rootScope.$$childTail).toBeNull(); + }); }); - }); - it('should $destroy scope after update and reload', function() { - // this is a regression of bug, where $route doesn't copy scope when only updating + it('should $destroy scope after update and reload', function() { + // this is a regression of bug, where $route doesn't copy scope when only updating - var log = []; + var log = []; - function logger(msg) { - return function() { - log.push(msg); - }; - } + function logger(msg) { + return function() { + log.push(msg); + }; + } - function createController(name) { - return function($scope) { - log.push('init-' + name); - $scope.$on('$destroy', logger('destroy-' + name)); - $scope.$on('$routeUpdate', logger('route-update')); - }; - } + function createController(name) { + return function($scope) { + log.push('init-' + name); + $scope.$on('$destroy', logger('destroy-' + name)); + $scope.$on('$routeUpdate', logger('route-update')); + }; + } - module(function($routeProvider) { - $routeProvider.when('/bar', {templateUrl: 'tpl.html', controller: createController('bar')}); - $routeProvider.when('/foo', { - templateUrl: 'tpl.html', - controller: createController('foo'), - reloadOnSearch: false + module(function($routeProvider) { + $routeProvider.when('/bar', {templateUrl: 'tpl.html', controller: createController('bar')}); + $routeProvider.when('/foo', { + templateUrl: 'tpl.html', + controller: createController('foo'), + reloadOnSearch: false + }); }); - }); - inject(function($templateCache, $location, $rootScope) { - $templateCache.put('tpl.html', [200, 'partial', {}]); + inject(function($templateCache, $location, $rootScope) { + $templateCache.put('tpl.html', [200, 'partial', {}]); - $location.url('https://github.com/foo'); - $rootScope.$digest(); - expect(log).toEqual(['init-foo']); + $location.url('https://github.com/foo'); + $rootScope.$digest(); + expect(log).toEqual(['init-foo']); - $location.search({q: 'some'}); - $rootScope.$digest(); - expect(log).toEqual(['init-foo', 'route-update']); + $location.search({q: 'some'}); + $rootScope.$digest(); + expect(log).toEqual(['init-foo', 'route-update']); - $location.url('https://github.com/bar'); - $rootScope.$digest(); - expect(log).toEqual(['init-foo', 'route-update', 'destroy-foo', 'init-bar']); + $location.url('https://github.com/bar'); + $rootScope.$digest(); + expect(log).toEqual(['init-foo', 'route-update', 'destroy-foo', 'init-bar']); + }); }); - }); - it('should evaluate onload expression after linking the content', function() { - module(function($routeProvider) { - $routeProvider.when('/foo', {templateUrl: 'tpl.html'}); - }); + it('should evaluate onload expression after linking the content', function() { + module(function($routeProvider) { + $routeProvider.when('/foo', {templateUrl: 'tpl.html'}); + }); - inject(function($templateCache, $location, $rootScope) { - $templateCache.put('tpl.html', [200, '{{1+1}}', {}]); - $rootScope.load = jasmine.createSpy('onload'); + inject(function($templateCache, $location, $rootScope) { + $templateCache.put('tpl.html', [200, '{{1+1}}', {}]); + $rootScope.load = jasmine.createSpy('onload'); - $location.url('https://github.com/foo'); - $rootScope.$digest(); - expect($rootScope.load).toHaveBeenCalledOnce(); + $location.url('https://github.com/foo'); + $rootScope.$digest(); + expect($rootScope.load).toHaveBeenCalledOnce(); + }); }); - }); - it('should set $scope and $controllerController on the view elements (except for non-element nodes)', function() { - function MyCtrl($scope) { - $scope.state = 'WORKS'; - $scope.ctrl = this; - } + it('should set $scope and $controllerController on the view elements (except for non-element nodes)', function() { + function MyCtrl($scope) { + $scope.state = 'WORKS'; + $scope.ctrl = this; + } - module(function($routeProvider) { - $routeProvider.when('/foo', {templateUrl: 'tpl.html', controller: MyCtrl}); - }); + module(function($routeProvider) { + $routeProvider.when('/foo', {templateUrl: 'tpl.html', controller: MyCtrl}); + }); - inject(function($templateCache, $location, $rootScope, $route) { - // in the template the white-space before the div is an intentional non-element node, - // a text might get wrapped into span so it's safer to just use white space - $templateCache.put('tpl.html', [200, ' \n
    {{state}}
    ', {}]); + inject(function($templateCache, $location, $rootScope, $route) { + // in the template the white-space before the div is an intentional non-element node, + // a text might get wrapped into span so it's safer to just use white space + $templateCache.put('tpl.html', [200, ' \n
    {{state}}
    ', {}]); - $location.url('https://github.com/foo'); - $rootScope.$digest(); - expect(element.text()).toEqual(' \n WORKS'); + $location.url('https://github.com/foo'); + $rootScope.$digest(); + expect(element.text()).toEqual(' \n WORKS'); - var div = element.find('div'); - expect(div.parent()[0].nodeName.toUpperCase()).toBeOneOf('NG:VIEW', 'VIEW'); + var div = element.find('div'); + expect(div.parent()[0].nodeName.toUpperCase()).toBeOneOf('NG:VIEW', 'VIEW'); - expect(div.scope()).toBe($route.current.scope); - expect(div.scope().hasOwnProperty('state')).toBe(true); - expect(div.scope().state).toEqual('WORKS'); + expect(div.scope()).toBe($route.current.scope); + expect(div.scope().hasOwnProperty('state')).toBe(true); + expect(div.scope().state).toEqual('WORKS'); - expect(div.controller()).toBe($route.current.scope.ctrl); + expect(div.controller()).toBe($route.current.scope.ctrl); + }); }); - }); - it('should not set $scope or $controllerController on top level text elements in the view', function() { - function MyCtrl($scope) {} + it('should not set $scope or $controllerController on top level text elements in the view', function() { + function MyCtrl($scope) {} - module(function($routeProvider) { - $routeProvider.when('/foo', {templateUrl: 'tpl.html', controller: MyCtrl}); - }); + module(function($routeProvider) { + $routeProvider.when('/foo', {templateUrl: 'tpl.html', controller: MyCtrl}); + }); - inject(function($templateCache, $location, $rootScope, $route) { - $templateCache.put('tpl.html', '
    '); - $location.url('https://github.com/foo'); - $rootScope.$digest(); + inject(function($templateCache, $location, $rootScope, $route) { + $templateCache.put('tpl.html', '
    '); + $location.url('https://github.com/foo'); + $rootScope.$digest(); - angular.forEach(element.contents(), function(node) { - if (node.nodeType == 3 /* text node */) { - expect(angular.element(node).scope()).not.toBe($route.current.scope); - expect(angular.element(node).controller()).not.toBeDefined(); - } else if (node.nodeType == 8 /* comment node */) { - expect(angular.element(node).scope()).toBe(element.scope()); - expect(angular.element(node).controller()).toBe(element.controller()); - } else { - expect(angular.element(node).scope()).toBe($route.current.scope); - expect(angular.element(node).controller()).toBeDefined(); - } + angular.forEach(element.contents(), function(node) { + if (node.nodeType == 3 /* text node */) { + expect(angular.element(node).scope()).not.toBe($route.current.scope); + expect(angular.element(node).controller()).not.toBeDefined(); + } else if (node.nodeType == 8 /* comment node */) { + expect(angular.element(node).scope()).toBe(element.scope()); + expect(angular.element(node).controller()).toBe(element.controller()); + } else { + expect(angular.element(node).scope()).toBe($route.current.scope); + expect(angular.element(node).controller()).toBeDefined(); + } + }); }); }); }); -}); -describe('ngView and transcludes', function() { - var element, directive; + describe('and transcludes', function() { + var element, directive; - beforeEach(module('ngRoute', function($compileProvider) { - element = null; - directive = $compileProvider.directive; - })); + beforeEach(module('ngRoute', function($compileProvider) { + element = null; + directive = $compileProvider.directive; + })); - afterEach(function() { - if (element) { - dealoc(element); - } - }); + afterEach(function() { + if (element) { + dealoc(element); + } + }); - it('should allow access to directive controller from children when used in a replace template', function() { - var controller; - module(function($routeProvider) { - $routeProvider.when('/view', {templateUrl: 'view.html'}); - directive('template', function() { - return { - template: '
    ', - replace: true, - controller: function() { - this.flag = true; - } - }; - }); + it('should allow access to directive controller from children when used in a replace template', function() { + var controller; + module(function($routeProvider) { + $routeProvider.when('/view', {templateUrl: 'view.html'}); + directive('template', function() { + return { + template: '
    ', + replace: true, + controller: function() { + this.flag = true; + } + }; + }); - directive('test', function() { - return { - require: '^template', - link: function(scope, el, attr, ctrl) { - controller = ctrl; - } - }; + directive('test', function() { + return { + require: '^template', + link: function(scope, el, attr, ctrl) { + controller = ctrl; + } + }; + }); + }); + inject(function($compile, $rootScope, $httpBackend, $location) { + $httpBackend.expectGET('view.html').respond('
    '); + element = $compile('
    ')($rootScope); + $location.url('https://github.com/view'); + $rootScope.$apply(); + $httpBackend.flush(); + expect(controller.flag).toBe(true); }); }); - inject(function($compile, $rootScope, $httpBackend, $location) { - $httpBackend.expectGET('view.html').respond('
    '); - element = $compile('
    ')($rootScope); - $location.url('https://github.com/view'); - $rootScope.$apply(); - $httpBackend.flush(); - expect(controller.flag).toBe(true); - }); - }); - it("should compile its content correctly (although we remove it later)", function() { - var testElement; - module(function($compileProvider, $routeProvider) { - $routeProvider.when('/view', {template: ' '}); - var directive = $compileProvider.directive; - directive('test', function() { - return { - link: function(scope, element) { - testElement = element; - } - }; + it("should compile its content correctly (although we remove it later)", function() { + var testElement; + module(function($compileProvider, $routeProvider) { + $routeProvider.when('/view', {template: ' '}); + var directive = $compileProvider.directive; + directive('test', function() { + return { + link: function(scope, element) { + testElement = element; + } + }; + }); + }); + inject(function($compile, $rootScope, $location) { + element = $compile('
    ')($rootScope); + $location.url('https://github.com/view'); + $rootScope.$apply(); + expect(testElement[0].nodeName).toBe('DIV'); }); - }); - inject(function($compile, $rootScope, $location) { - element = $compile('
    ')($rootScope); - $location.url('https://github.com/view'); - $rootScope.$apply(); - expect(testElement[0].nodeName).toBe('DIV'); - }); - }); + }); - it('should link directives on the same element after the content has been loaded', function() { - var contentOnLink; - module(function($compileProvider, $routeProvider) { - $routeProvider.when('/view', {template: 'someContent'}); - $compileProvider.directive('test', function() { - return { - link: function(scope, element) { - contentOnLink = element.text(); - } - }; + it('should link directives on the same element after the content has been loaded', function() { + var contentOnLink; + module(function($compileProvider, $routeProvider) { + $routeProvider.when('/view', {template: 'someContent'}); + $compileProvider.directive('test', function() { + return { + link: function(scope, element) { + contentOnLink = element.text(); + } + }; + }); + }); + inject(function($compile, $rootScope, $location) { + element = $compile('
    ')($rootScope); + $location.url('https://github.com/view'); + $rootScope.$apply(); + expect(contentOnLink).toBe('someContent'); }); }); - inject(function($compile, $rootScope, $location) { - element = $compile('
    ')($rootScope); - $location.url('https://github.com/view'); - $rootScope.$apply(); - expect(contentOnLink).toBe('someContent'); - }); - }); - it('should add the content to the element before compiling it', function() { - var root; - module(function($compileProvider, $routeProvider) { - $routeProvider.when('/view', {template: ''}); - $compileProvider.directive('test', function() { - return { - link: function(scope, element) { - root = element.parent().parent(); - } - }; + it('should add the content to the element before compiling it', function() { + var root; + module(function($compileProvider, $routeProvider) { + $routeProvider.when('/view', {template: ''}); + $compileProvider.directive('test', function() { + return { + link: function(scope, element) { + root = element.parent().parent(); + } + }; + }); + }); + inject(function($compile, $rootScope, $location) { + element = $compile('
    ')($rootScope); + $location.url('https://github.com/view'); + $rootScope.$apply(); + expect(root[0]).toBe(element[0]); }); }); - inject(function($compile, $rootScope, $location) { - element = $compile('
    ')($rootScope); - $location.url('https://github.com/view'); - $rootScope.$apply(); - expect(root[0]).toBe(element[0]); - }); - }); -}); - -describe('ngView animations', function() { - var body, element, $rootElement; - - beforeEach(module('ngRoute')); - - function html(content) { - $rootElement.html(content); - body.append($rootElement); - element = $rootElement.children().eq(0); - return element; - } - - beforeEach(module(function() { - // we need to run animation on attached elements; - return function(_$rootElement_) { - $rootElement = _$rootElement_; - body = angular.element(document.body); - }; - })); - - afterEach(function() { - dealoc(body); - dealoc(element); }); + describe('animations', function() { + var body, element, $rootElement; - beforeEach(module(function($provide, $routeProvider) { - $routeProvider.when('/foo', {controller: angular.noop, templateUrl: '/foo.html'}); - $routeProvider.when('/bar', {controller: angular.noop, templateUrl: '/bar.html'}); - return function($templateCache) { - $templateCache.put('/foo.html', [200, '
    data
    ', {}]); - $templateCache.put('/bar.html', [200, '
    data2
    ', {}]); - }; - })); + beforeEach(module('ngRoute')); - describe('hooks', function() { - beforeEach(module('ngAnimate')); - beforeEach(module('ngAnimateMock')); + function html(content) { + $rootElement.html(content); + body.append($rootElement); + element = $rootElement.children().eq(0); + return element; + } - it('should fire off the enter animation', - inject(function($compile, $rootScope, $location, $timeout, $animate) { - element = $compile(html('
    '))($rootScope); + beforeEach(module(function() { + // we need to run animation on attached elements; + return function(_$rootElement_) { + $rootElement = _$rootElement_; + body = angular.element(document.body); + }; + })); - $location.path('/foo'); - $rootScope.$digest(); + afterEach(function() { + dealoc(body); + dealoc(element); + }); - var animation = $animate.queue.pop(); - expect(animation.event).toBe('enter'); - })); - it('should fire off the leave animation', - inject(function($compile, $rootScope, $location, $templateCache, $timeout, $animate) { + beforeEach(module(function($provide, $routeProvider) { + $routeProvider.when('/foo', {controller: angular.noop, templateUrl: '/foo.html'}); + $routeProvider.when('/bar', {controller: angular.noop, templateUrl: '/bar.html'}); + return function($templateCache) { + $templateCache.put('/foo.html', [200, '
    data
    ', {}]); + $templateCache.put('/bar.html', [200, '
    data2
    ', {}]); + }; + })); - var item; - $templateCache.put('/foo.html', [200, '
    foo
    ', {}]); - element = $compile(html('
    '))($rootScope); + describe('hooks', function() { + beforeEach(module('ngAnimate')); + beforeEach(module('ngAnimateMock')); - $location.path('/foo'); - $rootScope.$digest(); + it('should fire off the enter animation', + inject(function($compile, $rootScope, $location, $timeout, $animate) { + element = $compile(html('
    '))($rootScope); + $location.path('/foo'); + $rootScope.$digest(); - $location.path('/'); - $rootScope.$digest(); + var animation = $animate.queue.pop(); + expect(animation.event).toBe('enter'); + })); - var animation = $animate.queue.pop(); - expect(animation.event).toBe('leave'); - })); + it('should fire off the leave animation', + inject(function($compile, $rootScope, $location, $templateCache, $timeout, $animate) { - it('should animate two separate ngView elements', - inject(function($compile, $rootScope, $templateCache, $location, $animate) { var item; - $rootScope.tpl = 'one'; + $templateCache.put('/foo.html', [200, '
    foo
    ', {}]); element = $compile(html('
    '))($rootScope); - $rootScope.$digest(); $location.path('/foo'); $rootScope.$digest(); - //we don't care about the enter animation for the first element - $animate.queue.pop(); - $location.path('/bar'); + $location.path('/'); $rootScope.$digest(); - var animationB = $animate.queue.pop(); - expect(animationB.event).toBe('leave'); - var itemB = animationB.args[0]; + var animation = $animate.queue.pop(); + expect(animation.event).toBe('leave'); + })); - var animationA = $animate.queue.pop(); - expect(animationA.event).toBe('enter'); - var itemA = animationA.args[0]; + it('should animate two separate ngView elements', + inject(function($compile, $rootScope, $templateCache, $location, $animate) { + var item; + $rootScope.tpl = 'one'; + element = $compile(html('
    '))($rootScope); + $rootScope.$digest(); - expect(itemA).not.toEqual(itemB); - }) - ); + $location.path('/foo'); + $rootScope.$digest(); - it('should render ngClass on ngView', - inject(function($compile, $rootScope, $templateCache, $animate, $location) { + //we don't care about the enter animation for the first element + $animate.queue.pop(); - var item; - $rootScope.tpl = 'one'; - $rootScope.klass = 'classy'; - element = $compile(html('
    '))($rootScope); - $rootScope.$digest(); + $location.path('/bar'); + $rootScope.$digest(); - $location.path('/foo'); - $rootScope.$digest(); - $animate.flush(); + var animationB = $animate.queue.pop(); + expect(animationB.event).toBe('leave'); + var itemB = animationB.args[0]; - //we don't care about the enter animation - $animate.queue.shift(); + var animationA = $animate.queue.pop(); + expect(animationA.event).toBe('enter'); + var itemA = animationA.args[0]; - var animation = $animate.queue.shift(); - expect(animation.event).toBe('addClass'); + expect(itemA).not.toEqual(itemB); + }) + ); - item = animation.element; - expect(item.hasClass('classy')).toBe(true); + it('should render ngClass on ngView', + inject(function($compile, $rootScope, $templateCache, $animate, $location) { - $rootScope.klass = 'boring'; - $rootScope.$digest(); + var item; + $rootScope.tpl = 'one'; + $rootScope.klass = 'classy'; + element = $compile(html('
    '))($rootScope); + $rootScope.$digest(); - expect($animate.queue.shift().event).toBe('addClass'); - expect($animate.queue.shift().event).toBe('removeClass'); + $location.path('/foo'); + $rootScope.$digest(); + $animate.flush(); - $animate.flush(); + //we don't care about the enter animation + $animate.queue.shift(); - expect(item.hasClass('classy')).toBe(false); - expect(item.hasClass('boring')).toBe(true); + var animation = $animate.queue.shift(); + expect(animation.event).toBe('addClass'); - $location.path('/bar'); - $rootScope.$digest(); + item = animation.element; + expect(item.hasClass('classy')).toBe(true); + + $rootScope.klass = 'boring'; + $rootScope.$digest(); - //we don't care about the enter animation - $animate.queue.shift(); + expect($animate.queue.shift().event).toBe('addClass'); + expect($animate.queue.shift().event).toBe('removeClass'); - animation = $animate.queue.shift(); - item = animation.element; - expect(animation.event).toBe('leave'); + $animate.flush(); - expect($animate.queue.shift().event).toBe('addClass'); + expect(item.hasClass('classy')).toBe(false); + expect(item.hasClass('boring')).toBe(true); - expect(item.hasClass('boring')).toBe(true); - }) - ); + $location.path('/bar'); + $rootScope.$digest(); - it('should not double compile when the route changes', function() { + //we don't care about the enter animation + $animate.queue.shift(); - var window; - module(function($routeProvider, $animateProvider, $provide) { - $routeProvider.when('/foo', {template: '
    {{i}}
    '}); - $routeProvider.when('/bar', {template: '
    {{i}}
    '}); - $animateProvider.register('.my-animation', function() { - return { - leave: function(element, done) { - done(); - } - }; - }); - }); + animation = $animate.queue.shift(); + item = animation.element; + expect(animation.event).toBe('leave'); - inject(function($rootScope, $compile, $location, $route, $timeout, $rootElement, $sniffer, $animate) { - element = $compile(html('
    '))($rootScope); - $animate.enabled(true); + expect($animate.queue.shift().event).toBe('addClass'); - $location.path('/foo'); - $rootScope.$digest(); + expect(item.hasClass('boring')).toBe(true); + }) + ); - expect($animate.queue.shift().event).toBe('enter'); //ngView - expect($animate.queue.shift().event).toBe('enter'); //repeat 1 - expect($animate.queue.shift().event).toBe('enter'); //repeat 2 + it('should not double compile when the route changes', function() { - expect(element.text()).toEqual('12'); + var window; + module(function($routeProvider, $animateProvider, $provide) { + $routeProvider.when('/foo', {template: '
    {{i}}
    '}); + $routeProvider.when('/bar', {template: '
    {{i}}
    '}); + $animateProvider.register('.my-animation', function() { + return { + leave: function(element, done) { + done(); + } + }; + }); + }); - $location.path('/bar'); - $rootScope.$digest(); + inject(function($rootScope, $compile, $location, $route, $timeout, $rootElement, $sniffer, $animate) { + element = $compile(html('
    '))($rootScope); + $animate.enabled(true); - expect($animate.queue.shift().event).toBe('enter'); //ngView new - expect($animate.queue.shift().event).toBe('leave'); //ngView old + $location.path('/foo'); + $rootScope.$digest(); - $rootScope.$digest(); + expect($animate.queue.shift().event).toBe('enter'); //ngView + expect($animate.queue.shift().event).toBe('enter'); //repeat 1 + expect($animate.queue.shift().event).toBe('enter'); //repeat 2 - expect($animate.queue.shift().event).toBe('enter'); //ngRepeat 3 - expect($animate.queue.shift().event).toBe('enter'); //ngRepeat 4 + expect(element.text()).toEqual('12'); - $animate.flush(); + $location.path('/bar'); + $rootScope.$digest(); - expect(element.text()).toEqual('34'); + expect($animate.queue.shift().event).toBe('enter'); //ngView new + expect($animate.queue.shift().event).toBe('leave'); //ngView old - function n(text) { - return text.replace(/\r\n/m, '').replace(/\r\n/m, ''); - } - }); - }); + $rootScope.$digest(); - it('should destroy the previous leave animation if a new one takes place', - inject(function($compile, $rootScope, $animate, $location, $timeout) { - var $scope = $rootScope.$new(); - element = $compile(html( - '
    ' + - '
    ' + - '
    ' - ))($scope); + expect($animate.queue.shift().event).toBe('enter'); //ngRepeat 3 + expect($animate.queue.shift().event).toBe('enter'); //ngRepeat 4 - $scope.$apply('value = true'); + $animate.flush(); - $location.path('/bar'); - $rootScope.$digest(); + expect(element.text()).toEqual('34'); - var destroyed, inner = element.children(0); - inner.on('$destroy', function() { - destroyed = true; + function n(text) { + return text.replace(/\r\n/m, '').replace(/\r\n/m, ''); + } }); + }); - $location.path('/foo'); - $rootScope.$digest(); + it('should destroy the previous leave animation if a new one takes place', + inject(function($compile, $rootScope, $animate, $location, $timeout) { + var $scope = $rootScope.$new(); + element = $compile(html( + '
    ' + + '
    ' + + '
    ' + ))($scope); - $location.path('/bar'); - $rootScope.$digest(); + $scope.$apply('value = true'); - $location.path('/bar'); - $rootScope.$digest(); + $location.path('/bar'); + $rootScope.$digest(); - expect(destroyed).toBe(true); - }) - ); - }); + var destroyed, inner = element.children(0); + inner.on('$destroy', function() { + destroyed = true; + }); + $location.path('/foo'); + $rootScope.$digest(); - describe('autoscroll', function() { - var autoScrollSpy; + $location.path('/bar'); + $rootScope.$digest(); - function spyOnAnchorScroll() { - return function($provide, $routeProvider) { - autoScrollSpy = jasmine.createSpy('$anchorScroll'); - $provide.value('$anchorScroll', autoScrollSpy); - $routeProvider.when('/foo', { - controller: angular.noop, - template: '
    ' - }); - }; - } + $location.path('/bar'); + $rootScope.$digest(); - function spyOnAnimateEnter() { - return function($animate) { - spyOn($animate, 'enter').and.callThrough(); - }; - } + expect(destroyed).toBe(true); + }) + ); + }); - function compileAndLink(tpl) { - return function($compile, $rootScope, $location) { - element = $compile(tpl)($rootScope); - }; - } - beforeEach(module(spyOnAnchorScroll(), 'ngAnimateMock')); - beforeEach(inject(spyOnAnimateEnter())); + describe('autoscroll', function() { + var autoScrollSpy; - it('should call $anchorScroll if autoscroll attribute is present', inject( - compileAndLink('
    '), - function($rootScope, $animate, $timeout, $location) { + function spyOnAnchorScroll() { + return function($provide, $routeProvider) { + autoScrollSpy = jasmine.createSpy('$anchorScroll'); + $provide.value('$anchorScroll', autoScrollSpy); + $routeProvider.when('/foo', { + controller: angular.noop, + template: '
    ' + }); + }; + } - $location.path('/foo'); - $rootScope.$digest(); + function spyOnAnimateEnter() { + return function($animate) { + spyOn($animate, 'enter').and.callThrough(); + }; + } - $animate.flush(); - $rootScope.$digest(); + function compileAndLink(tpl) { + return function($compile, $rootScope, $location) { + element = $compile(tpl)($rootScope); + }; + } - expect($animate.queue.shift().event).toBe('enter'); - expect(autoScrollSpy).toHaveBeenCalledOnce(); - })); + beforeEach(module(spyOnAnchorScroll(), 'ngAnimateMock')); + beforeEach(inject(spyOnAnimateEnter())); + it('should call $anchorScroll if autoscroll attribute is present', inject( + compileAndLink('
    '), + function($rootScope, $animate, $timeout, $location) { - it('should call $anchorScroll if autoscroll evaluates to true', inject( - compileAndLink('
    '), - function($rootScope, $animate, $timeout, $location) { + $location.path('/foo'); + $rootScope.$digest(); - $rootScope.value = true; - $location.path('/foo'); - $rootScope.$digest(); + $animate.flush(); + $rootScope.$digest(); - $animate.flush(); - $rootScope.$digest(); + expect($animate.queue.shift().event).toBe('enter'); + expect(autoScrollSpy).toHaveBeenCalledOnce(); + })); - expect($animate.queue.shift().event).toBe('enter'); - expect(autoScrollSpy).toHaveBeenCalledOnce(); - })); + it('should call $anchorScroll if autoscroll evaluates to true', inject( + compileAndLink('
    '), + function($rootScope, $animate, $timeout, $location) { - it('should not call $anchorScroll if autoscroll attribute is not present', inject( - compileAndLink('
    '), - function($rootScope, $location, $animate, $timeout) { + $rootScope.value = true; + $location.path('/foo'); + $rootScope.$digest(); - $location.path('/foo'); - $rootScope.$digest(); - expect($animate.queue.shift().event).toBe('enter'); + $animate.flush(); + $rootScope.$digest(); - expect(autoScrollSpy).not.toHaveBeenCalled(); - })); + expect($animate.queue.shift().event).toBe('enter'); + expect(autoScrollSpy).toHaveBeenCalledOnce(); + })); - it('should not call $anchorScroll if autoscroll evaluates to false', inject( - compileAndLink('
    '), - function($rootScope, $location, $animate, $timeout) { + it('should not call $anchorScroll if autoscroll attribute is not present', inject( + compileAndLink('
    '), + function($rootScope, $location, $animate, $timeout) { - $rootScope.value = false; - $location.path('/foo'); - $rootScope.$digest(); - expect($animate.queue.shift().event).toBe('enter'); + $location.path('/foo'); + $rootScope.$digest(); + expect($animate.queue.shift().event).toBe('enter'); - expect(autoScrollSpy).not.toHaveBeenCalled(); - })); + expect(autoScrollSpy).not.toHaveBeenCalled(); + })); - it('should only call $anchorScroll after the "enter" animation completes', inject( - compileAndLink('
    '), - function($rootScope, $location, $animate, $timeout) { - $location.path('/foo'); + it('should not call $anchorScroll if autoscroll evaluates to false', inject( + compileAndLink('
    '), + function($rootScope, $location, $animate, $timeout) { - expect($animate.enter).not.toHaveBeenCalled(); + $rootScope.value = false; + $location.path('/foo'); $rootScope.$digest(); + expect($animate.queue.shift().event).toBe('enter'); expect(autoScrollSpy).not.toHaveBeenCalled(); + })); - expect($animate.queue.shift().event).toBe('enter'); - $animate.flush(); - $rootScope.$digest(); + it('should only call $anchorScroll after the "enter" animation completes', inject( + compileAndLink('
    '), + function($rootScope, $location, $animate, $timeout) { + $location.path('/foo'); - expect($animate.enter).toHaveBeenCalledOnce(); - expect(autoScrollSpy).toHaveBeenCalledOnce(); - } - )); + expect($animate.enter).not.toHaveBeenCalled(); + $rootScope.$digest(); + + expect(autoScrollSpy).not.toHaveBeenCalled(); + + expect($animate.queue.shift().event).toBe('enter'); + + $animate.flush(); + $rootScope.$digest(); + + expect($animate.enter).toHaveBeenCalledOnce(); + expect(autoScrollSpy).toHaveBeenCalledOnce(); + } + )); + }); }); -}); +}); \ No newline at end of file From c8a64817d2c62cdfda072dcae75d190746e7572e Mon Sep 17 00:00:00 2001 From: Peter Bacon Darwin Date: Thu, 14 Jul 2016 21:47:01 +0100 Subject: [PATCH 0047/1173] style(ngViewSpec): fix missing end of file newline --- test/ngRoute/directive/ngViewSpec.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/ngRoute/directive/ngViewSpec.js b/test/ngRoute/directive/ngViewSpec.js index b1a8c6838e0a..7c11b9a95670 100644 --- a/test/ngRoute/directive/ngViewSpec.js +++ b/test/ngRoute/directive/ngViewSpec.js @@ -1029,4 +1029,4 @@ describe('ngView', function() { )); }); }); -}); \ No newline at end of file +}); From aea62af5b8df56df94d0a15513f84014f8b94c61 Mon Sep 17 00:00:00 2001 From: Georgios Kalpakas Date: Fri, 15 Jul 2016 10:49:23 +0300 Subject: [PATCH 0048/1173] docs(guide): fix links to tutorial steps --- docs/content/guide/animations.ngdoc | 2 +- docs/content/guide/filter.ngdoc | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/content/guide/animations.ngdoc b/docs/content/guide/animations.ngdoc index eb121f3578f6..f2551ea374b0 100644 --- a/docs/content/guide/animations.ngdoc +++ b/docs/content/guide/animations.ngdoc @@ -423,4 +423,4 @@ You can also use one of the two other {@link guide/animations#how-to-selectively For a full breakdown of each method available on `$animate`, see the {@link ng.$animate API documentation}. -To see a complete demo, see the {@link tutorial/step_12 animation step within the AngularJS phonecat tutorial}. +To see a complete demo, see the {@link tutorial/step_14 animation step within the AngularJS phonecat tutorial}. diff --git a/docs/content/guide/filter.ngdoc b/docs/content/guide/filter.ngdoc index 8e9db3bcc864..1c548c75b09c 100644 --- a/docs/content/guide/filter.ngdoc +++ b/docs/content/guide/filter.ngdoc @@ -200,4 +200,4 @@ means that it will be executed one or more times during the each `$digest` cycle ## Testing custom filters -See the [phonecat tutorial](http://docs.angularjs.org/tutorial/step_09#test) for an example. +See the [phonecat tutorial](http://docs.angularjs.org/tutorial/step_11#testing) for an example. From cd06cccc7f41cd54e171b2ddba534ace1f36b1ff Mon Sep 17 00:00:00 2001 From: Martin Staffa Date: Fri, 15 Jul 2016 17:40:54 +0200 Subject: [PATCH 0049/1173] docs(ngSelected): note that it doesn't interact with ngModel Closes #14916 Related #14876 --- src/ng/directive/attrs.js | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/ng/directive/attrs.js b/src/ng/directive/attrs.js index 4a88da3e623c..e5db9db49fe8 100644 --- a/src/ng/directive/attrs.js +++ b/src/ng/directive/attrs.js @@ -271,6 +271,13 @@ * A special directive is necessary because we cannot use interpolation inside the `selected` * attribute. See the {@link guide/interpolation interpolation guide} for more info. * + *
    + * **Note:** `ngSelected` does not interact with the `select` and `ngModel` directives, it only + * sets the `selected` attribute on the element. If you are using `ngModel` on the select, you + * should not use `ngSelected` on the options, as `ngModel` will set the select value and + * selected options. + *
    + * * @example From 26dac5784ae23cae1222b051723d9a39c1186507 Mon Sep 17 00:00:00 2001 From: "John (J5) Palmieri" Date: Fri, 15 Jul 2016 11:10:12 -0400 Subject: [PATCH 0050/1173] doc(guide/Animations): point to $animate.pin() to enable animation for elements outside an Angular app Add a section inside of the ngAnimate documentation to point to $animate.pin(). It was not clear in the documentation why animations were being disabled inside of modals and popup menus. This documentation explains in what situations elements may be dynamically placed outside of the application DOM and points to the API documentation on how to enable animations for these types of elements. Related #14907 Closes #14918 --- docs/content/guide/animations.ngdoc | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/docs/content/guide/animations.ngdoc b/docs/content/guide/animations.ngdoc index f2551ea374b0..411a7bd3412b 100644 --- a/docs/content/guide/animations.ngdoc +++ b/docs/content/guide/animations.ngdoc @@ -347,6 +347,7 @@ By setting `transition: 0s`, ngAnimate will ignore the existing transition style animations will still execute, though). This can be used to prevent {@link guide/animations#preventing-collisions-with-existing-animations-and-third-party-libraries issues with existing animations interfering with ngAnimate}. + ## Preventing flicker before an animation starts When nesting elements with structural animations such as `ngIf` into elements that have class-based @@ -419,6 +420,23 @@ than any styles that are independent from ngAnimate. You can also use one of the two other {@link guide/animations#how-to-selectively-enable-disable-and-skip-animations strategies to disable animations}. + +### Enable animations for elements outside of the Angular application DOM tree: {@link ng.$animate#pin $animate.pin()} + +Before animating, `ngAnimate` checks to see if the element being animated is inside the application DOM tree, +and if it is not, no animation is run. Usually, this is not a problem as most apps use the `ngApp` +attribute / bootstrap the app on the `html` or `body` element. + +Problems arise when the application is bootstrapped on a different element, and animations are +attempted on elements that are outside the application tree, e.g. when libraries append popup and modal +elements as the last child in the body tag. + +You can use {@link ng.$animate#pin `$animate.pin(elementToAnimate, parentHost)`} to specify that an +element belongs to your application. Simply call it before the element is added to the DOM / before +the animation starts, with the element you want to animate, and the element which should be its +assumed parent. + + ## More about animations For a full breakdown of each method available on `$animate`, see the {@link ng.$animate API documentation}. From fa81df4779cfbae84058cf8992b05d1186cec071 Mon Sep 17 00:00:00 2001 From: Georgios Kalpakas Date: Fri, 15 Jul 2016 15:21:05 +0300 Subject: [PATCH 0051/1173] refactor(test/e2e): restore consistency across tests (just because) --- .../angular-already-loaded/index.html | 14 ++++---- .../fixtures/angular-already-loaded/script.js | 7 ++-- test/e2e/fixtures/loader/index.html | 35 ++++++++++--------- test/e2e/fixtures/loader/script.js | 2 +- test/e2e/fixtures/ngJq/index.html | 2 +- test/e2e/fixtures/ngJq/script.js | 5 +-- test/e2e/fixtures/ngJqJquery/index.html | 18 +++++----- test/e2e/fixtures/ngJqJquery/script.js | 5 +-- test/e2e/fixtures/sample/index.html | 12 ++++--- test/e2e/fixtures/sample/script.js | 7 ++-- test/e2e/tests/angular-already-loadedSpec.js | 5 ++- test/e2e/tests/loaderSpec.js | 4 +-- test/e2e/tests/ngJqSpec.js | 9 +++-- test/e2e/tests/sampleSpec.js | 6 ++-- 14 files changed, 69 insertions(+), 62 deletions(-) diff --git a/test/e2e/fixtures/angular-already-loaded/index.html b/test/e2e/fixtures/angular-already-loaded/index.html index 292124d4fe1b..b001636dabd8 100644 --- a/test/e2e/fixtures/angular-already-loaded/index.html +++ b/test/e2e/fixtures/angular-already-loaded/index.html @@ -1,10 +1,12 @@ -
    -

    {{text}}

    -
    + +
    +

    {{text}}

    +
    - - - + + + + diff --git a/test/e2e/fixtures/angular-already-loaded/script.js b/test/e2e/fixtures/angular-already-loaded/script.js index 2d625bb4f19c..f731efe3e2c9 100644 --- a/test/e2e/fixtures/angular-already-loaded/script.js +++ b/test/e2e/fixtures/angular-already-loaded/script.js @@ -1,4 +1,5 @@ -angular.module("test", []). - controller("TestCtrl", function($scope) { - $scope.text = "Hello, world!"; +angular. + module('test', []). + controller('TestController', function($scope) { + $scope.text = 'Hello, world!'; }); diff --git a/test/e2e/fixtures/loader/index.html b/test/e2e/fixtures/loader/index.html index 3df9ae87a5d4..a7f97b42cfca 100644 --- a/test/e2e/fixtures/loader/index.html +++ b/test/e2e/fixtures/loader/index.html @@ -1,20 +1,23 @@ -
    -

    {{text}}

    -
    + +
    +

    {{text}}

    +
    - - - - - - - - - - - - - + + + + + + + + + + + + + + + diff --git a/test/e2e/fixtures/loader/script.js b/test/e2e/fixtures/loader/script.js index 9dd6ec9919a7..3ea83bae30a5 100644 --- a/test/e2e/fixtures/loader/script.js +++ b/test/e2e/fixtures/loader/script.js @@ -11,6 +11,6 @@ angular. 'ngAria', 'ngAnimate' ]). - controller('TestCtrl', function TestCtrl($scope) { + controller('TestController', function($scope) { $scope.text = 'Hello, world!'; }); diff --git a/test/e2e/fixtures/ngJq/index.html b/test/e2e/fixtures/ngJq/index.html index af91514ac1e5..7d035a26225d 100644 --- a/test/e2e/fixtures/ngJq/index.html +++ b/test/e2e/fixtures/ngJq/index.html @@ -10,6 +10,6 @@ window[''] = window.jQuery; - + diff --git a/test/e2e/fixtures/ngJq/script.js b/test/e2e/fixtures/ngJq/script.js index f91e1ea9cd3b..89fc6b873250 100644 --- a/test/e2e/fixtures/ngJq/script.js +++ b/test/e2e/fixtures/ngJq/script.js @@ -1,4 +1,5 @@ -angular.module('test', []) - .run(function($rootScope) { +angular. + module('test', []). + run(function($rootScope) { $rootScope.jqueryVersion = window.angular.element().jquery || 'jqLite'; }); diff --git a/test/e2e/fixtures/ngJqJquery/index.html b/test/e2e/fixtures/ngJqJquery/index.html index d648e16df870..d98f4ca96f0f 100644 --- a/test/e2e/fixtures/ngJqJquery/index.html +++ b/test/e2e/fixtures/ngJqJquery/index.html @@ -1,14 +1,14 @@ - {{jqueryVersion}} + {{jqueryVersion}} - - - - - - + + + + + + diff --git a/test/e2e/fixtures/ngJqJquery/script.js b/test/e2e/fixtures/ngJqJquery/script.js index f91e1ea9cd3b..89fc6b873250 100644 --- a/test/e2e/fixtures/ngJqJquery/script.js +++ b/test/e2e/fixtures/ngJqJquery/script.js @@ -1,4 +1,5 @@ -angular.module('test', []) - .run(function($rootScope) { +angular. + module('test', []). + run(function($rootScope) { $rootScope.jqueryVersion = window.angular.element().jquery || 'jqLite'; }); diff --git a/test/e2e/fixtures/sample/index.html b/test/e2e/fixtures/sample/index.html index 45e8747fa931..8a1551be0b19 100644 --- a/test/e2e/fixtures/sample/index.html +++ b/test/e2e/fixtures/sample/index.html @@ -1,9 +1,11 @@ -
    -

    {{text}}

    -
    + +
    +

    {{text}}

    +
    - - + + + diff --git a/test/e2e/fixtures/sample/script.js b/test/e2e/fixtures/sample/script.js index 2d625bb4f19c..f731efe3e2c9 100644 --- a/test/e2e/fixtures/sample/script.js +++ b/test/e2e/fixtures/sample/script.js @@ -1,4 +1,5 @@ -angular.module("test", []). - controller("TestCtrl", function($scope) { - $scope.text = "Hello, world!"; +angular. + module('test', []). + controller('TestController', function($scope) { + $scope.text = 'Hello, world!'; }); diff --git a/test/e2e/tests/angular-already-loadedSpec.js b/test/e2e/tests/angular-already-loadedSpec.js index 87e4d8aabe14..24e964a31a08 100644 --- a/test/e2e/tests/angular-already-loadedSpec.js +++ b/test/e2e/tests/angular-already-loadedSpec.js @@ -1,10 +1,9 @@ describe('App where angular is loaded more than once', function() { beforeEach(function() { - loadFixture("angular-already-loaded").andWaitForAngular(); + loadFixture('angular-already-loaded').andWaitForAngular(); }); it('should have the interpolated text', function() { - expect(element(by.binding('text')).getText()) - .toBe('Hello, world!'); + expect(element(by.binding('text')).getText()).toBe('Hello, world!'); }); }); diff --git a/test/e2e/tests/loaderSpec.js b/test/e2e/tests/loaderSpec.js index bf63b5f064bd..9ee2b1268b4e 100644 --- a/test/e2e/tests/loaderSpec.js +++ b/test/e2e/tests/loaderSpec.js @@ -1,6 +1,6 @@ -describe('loader', function() { +describe('angular-loader', function() { beforeEach(function() { - loadFixture("loader").andWaitForAngular(); + loadFixture('loader').andWaitForAngular(); }); it('should not be broken by loading the modules before core', function() { diff --git a/test/e2e/tests/ngJqSpec.js b/test/e2e/tests/ngJqSpec.js index fd9ea368fc0d..0da186c6bd77 100644 --- a/test/e2e/tests/ngJqSpec.js +++ b/test/e2e/tests/ngJqSpec.js @@ -1,12 +1,11 @@ -describe('Customizing the jqlite / jquery version', function() { - - it('should be able to force jqlite', function() { - loadFixture("ngJq").andWaitForAngular(); +describe('Customizing the jqLite / jQuery version', function() { + it('should be able to force jqLite', function() { + loadFixture('ngJq').andWaitForAngular(); expect(element(by.binding('jqueryVersion')).getText()).toBe('jqLite'); }); it('should be able to use a specific version jQuery', function() { - loadFixture("ngJqJquery").andWaitForAngular(); + loadFixture('ngJqJquery').andWaitForAngular(); expect(element(by.binding('jqueryVersion')).getText()).toBe('2.1.0'); }); }); diff --git a/test/e2e/tests/sampleSpec.js b/test/e2e/tests/sampleSpec.js index 07cdec659e7e..dcc0e374106c 100644 --- a/test/e2e/tests/sampleSpec.js +++ b/test/e2e/tests/sampleSpec.js @@ -1,12 +1,10 @@ // Sample E2E test: -// describe('Sample', function() { beforeEach(function() { - loadFixture("sample").andWaitForAngular(); + loadFixture('sample').andWaitForAngular(); }); it('should have the interpolated text', function() { - expect(element(by.binding('text')).getText()) - .toBe('Hello, world!'); + expect(element(by.binding('text')).getText()).toBe('Hello, world!'); }); }); From 26acedde7c59cc15f156ba32d141a8be3cac46bc Mon Sep 17 00:00:00 2001 From: Georgios Kalpakas Date: Fri, 15 Jul 2016 15:23:57 +0300 Subject: [PATCH 0052/1173] refactor(test/e2e): remove explicit call to `waitForAngular()` Protractor automatically calls `waitForAngular()`, before every WebDriver action. Closes #14920 --- test/e2e/tests/angular-already-loadedSpec.js | 2 +- test/e2e/tests/helpers/main.js | 3 --- test/e2e/tests/loaderSpec.js | 2 +- test/e2e/tests/ngJqSpec.js | 4 ++-- test/e2e/tests/sampleSpec.js | 2 +- 5 files changed, 5 insertions(+), 8 deletions(-) diff --git a/test/e2e/tests/angular-already-loadedSpec.js b/test/e2e/tests/angular-already-loadedSpec.js index 24e964a31a08..4b304d86cedc 100644 --- a/test/e2e/tests/angular-already-loadedSpec.js +++ b/test/e2e/tests/angular-already-loadedSpec.js @@ -1,6 +1,6 @@ describe('App where angular is loaded more than once', function() { beforeEach(function() { - loadFixture('angular-already-loaded').andWaitForAngular(); + loadFixture('angular-already-loaded'); }); it('should have the interpolated text', function() { diff --git a/test/e2e/tests/helpers/main.js b/test/e2e/tests/helpers/main.js index 116271f9136f..5459ffc2d836 100644 --- a/test/e2e/tests/helpers/main.js +++ b/test/e2e/tests/helpers/main.js @@ -1,7 +1,4 @@ var helper = { - andWaitForAngular: function() { - browser.waitForAngular(); - }, loadFixture: function(fixture) { var i = 0; while (fixture[i] === '/') ++i; diff --git a/test/e2e/tests/loaderSpec.js b/test/e2e/tests/loaderSpec.js index 9ee2b1268b4e..f75d49b5bbf3 100644 --- a/test/e2e/tests/loaderSpec.js +++ b/test/e2e/tests/loaderSpec.js @@ -1,6 +1,6 @@ describe('angular-loader', function() { beforeEach(function() { - loadFixture('loader').andWaitForAngular(); + loadFixture('loader'); }); it('should not be broken by loading the modules before core', function() { diff --git a/test/e2e/tests/ngJqSpec.js b/test/e2e/tests/ngJqSpec.js index 0da186c6bd77..bfe30788c21f 100644 --- a/test/e2e/tests/ngJqSpec.js +++ b/test/e2e/tests/ngJqSpec.js @@ -1,11 +1,11 @@ describe('Customizing the jqLite / jQuery version', function() { it('should be able to force jqLite', function() { - loadFixture('ngJq').andWaitForAngular(); + loadFixture('ngJq'); expect(element(by.binding('jqueryVersion')).getText()).toBe('jqLite'); }); it('should be able to use a specific version jQuery', function() { - loadFixture('ngJqJquery').andWaitForAngular(); + loadFixture('ngJqJquery'); expect(element(by.binding('jqueryVersion')).getText()).toBe('2.1.0'); }); }); diff --git a/test/e2e/tests/sampleSpec.js b/test/e2e/tests/sampleSpec.js index dcc0e374106c..e46a936d28b7 100644 --- a/test/e2e/tests/sampleSpec.js +++ b/test/e2e/tests/sampleSpec.js @@ -1,7 +1,7 @@ // Sample E2E test: describe('Sample', function() { beforeEach(function() { - loadFixture('sample').andWaitForAngular(); + loadFixture('sample'); }); it('should have the interpolated text', function() { From 56d456360bb5bae9b30623c6ef91a69e5b9b5aa1 Mon Sep 17 00:00:00 2001 From: Georgios Kalpakas Date: Fri, 15 Jul 2016 15:25:07 +0300 Subject: [PATCH 0053/1173] chore(protractor): use `directConnect` locally to speed up tests Closes #14919 --- protractor-conf.js | 2 ++ 1 file changed, 2 insertions(+) diff --git a/protractor-conf.js b/protractor-conf.js index 3c3421ce780f..db0df757bbe0 100644 --- a/protractor-conf.js +++ b/protractor-conf.js @@ -12,4 +12,6 @@ config.capabilities = { browserName: 'chrome' }; +config.directConnect = true; + exports.config = config; From 4f6f2bce4ac93b85320e42e5023c09d099779b7d Mon Sep 17 00:00:00 2001 From: William Bagayoko Date: Wed, 27 Jan 2016 17:44:47 -0600 Subject: [PATCH 0054/1173] fix($http): properly increment/decrement `$browser.outstandingRequestCount` Calling `$http` will not increment `$browser.outstandingRequestCount` until after all (potentially) asynchronous request interceptors have been processed and will decrement it before any (potentially) asynchronous response interceptors have been processed. This can lead to `$browser.notifyWhenNoOutstandingRequests` firing prematurely, which can be problematic in end-to-end tests. This commit fixes this, by synchronizing the increment/decrement operations with `$http`'s internal interceptor promise chain. Fixes #13782 Closes #13862 Closes #14921 BREAKING CHANGE: HTTP requests now update the outstanding request count synchronously. Previously the request count would not have been updated until the request to the server is actually in flight. Now the request count is updated before the async interceptor is called. The new behaviour is correct but it may change the expected behaviour in a small number of e2e test cases where an async request interceptor is being used. --- src/ng/http.js | 17 ++++++++++++++--- src/ng/httpBackend.js | 2 -- test/e2e/fixtures/http/index.html | 11 +++++++++++ test/e2e/fixtures/http/script.js | 28 ++++++++++++++++++++++++++++ test/e2e/tests/httpSpec.js | 9 +++++++++ test/ng/httpSpec.js | 31 +++++++++++++++++++++++++++++++ 6 files changed, 93 insertions(+), 5 deletions(-) create mode 100644 test/e2e/fixtures/http/index.html create mode 100644 test/e2e/fixtures/http/script.js create mode 100644 test/e2e/tests/httpSpec.js diff --git a/src/ng/http.js b/src/ng/http.js index 351591001673..f02165ad6806 100644 --- a/src/ng/http.js +++ b/src/ng/http.js @@ -374,8 +374,8 @@ function $HttpProvider() { **/ var interceptorFactories = this.interceptors = []; - this.$get = ['$httpBackend', '$$cookieReader', '$cacheFactory', '$rootScope', '$q', '$injector', - function($httpBackend, $$cookieReader, $cacheFactory, $rootScope, $q, $injector) { + this.$get = ['$browser', '$httpBackend', '$$cookieReader', '$cacheFactory', '$rootScope', '$q', '$injector', + function($browser, $httpBackend, $$cookieReader, $cacheFactory, $rootScope, $q, $injector) { var defaultCache = $cacheFactory('$http'); @@ -981,7 +981,7 @@ function $HttpProvider() { }; var chain = [serverRequest, undefined]; - var promise = $q.when(config); + var promise = initiateOutstandingRequest(config); // apply interceptors forEach(reversedInterceptors, function(interceptor) { @@ -1000,6 +1000,8 @@ function $HttpProvider() { promise = promise.then(thenFn, rejectFn); } + promise.finally(completeOutstandingRequest); + if (useLegacyPromise) { promise.success = function(fn) { assertArgFn(fn, 'fn'); @@ -1025,6 +1027,15 @@ function $HttpProvider() { return promise; + function initiateOutstandingRequest(config) { + $browser.$$incOutstandingRequestCount(); + return $q.when(config); + } + + function completeOutstandingRequest() { + $browser.$$completeOutstandingRequest(noop); + } + function transformResponse(response) { // make a copy since the response must be cacheable var resp = extend({}, response); diff --git a/src/ng/httpBackend.js b/src/ng/httpBackend.js index d4a28d76e8f6..51c87ab57ed1 100644 --- a/src/ng/httpBackend.js +++ b/src/ng/httpBackend.js @@ -55,7 +55,6 @@ function $HttpBackendProvider() { function createHttpBackend($browser, createXhr, $browserDefer, callbacks, rawDocument) { // TODO(vojta): fix the signature return function(method, url, post, callback, headers, timeout, withCredentials, responseType, eventHandlers, uploadEventHandlers) { - $browser.$$incOutstandingRequestCount(); url = url || $browser.url(); if (lowercase(method) === 'jsonp') { @@ -162,7 +161,6 @@ function createHttpBackend($browser, createXhr, $browserDefer, callbacks, rawDoc jsonpDone = xhr = null; callback(status, response, headersString, statusText); - $browser.$$completeOutstandingRequest(noop); } }; diff --git a/test/e2e/fixtures/http/index.html b/test/e2e/fixtures/http/index.html new file mode 100644 index 000000000000..8a1551be0b19 --- /dev/null +++ b/test/e2e/fixtures/http/index.html @@ -0,0 +1,11 @@ + + + +
    +

    {{text}}

    +
    + + + + + diff --git a/test/e2e/fixtures/http/script.js b/test/e2e/fixtures/http/script.js new file mode 100644 index 000000000000..ebd69e2d1558 --- /dev/null +++ b/test/e2e/fixtures/http/script.js @@ -0,0 +1,28 @@ +angular. + module('test', []). + config(function($httpProvider) { + $httpProvider.interceptors.push(function($q) { + return { + request: function(config) { + return $q(function(resolve) { + setTimeout(resolve, 100, config); + }); + }, + response: function(response) { + return $q(function(resolve) { + setTimeout(resolve, 100, response); + }); + } + }; + }); + }). + controller('TestController', function($cacheFactory, $http, $scope) { + var url = '/some/url'; + + var cache = $cacheFactory('test'); + cache.put(url, 'Hello, world!'); + + $http. + get(url, {cache: cache}). + then(function(response) { $scope.text = response.data; }); + }); diff --git a/test/e2e/tests/httpSpec.js b/test/e2e/tests/httpSpec.js new file mode 100644 index 000000000000..fe8c7d67afd5 --- /dev/null +++ b/test/e2e/tests/httpSpec.js @@ -0,0 +1,9 @@ +describe('$http', function() { + beforeEach(function() { + loadFixture('http'); + }); + + it('should correctly update the outstanding request count', function() { + expect(element(by.binding('text')).getText()).toBe('Hello, world!'); + }); +}); diff --git a/test/ng/httpSpec.js b/test/ng/httpSpec.js index bd44b1cbbc00..041326459afe 100644 --- a/test/ng/httpSpec.js +++ b/test/ng/httpSpec.js @@ -1896,6 +1896,37 @@ describe('$http', function() { expect(paramSerializer({foo: 'foo', bar: ['bar', 'baz']})).toEqual('bar=bar&bar=baz&foo=foo'); }); }); + + describe('$browser\'s outstandingRequestCount', function() { + var incOutstandingRequestCountSpy, completeOutstandingRequestSpy; + + beforeEach(inject(function($browser) { + incOutstandingRequestCountSpy + = spyOn($browser, '$$incOutstandingRequestCount').andCallThrough(); + completeOutstandingRequestSpy + = spyOn($browser, '$$completeOutstandingRequest').andCallThrough(); + })); + + it('should update $browser outstandingRequestCount on success', function() { + $httpBackend.when('GET').respond(200); + + expect(incOutstandingRequestCountSpy).not.toHaveBeenCalled(); + $http.get(''); + expect(incOutstandingRequestCountSpy).toHaveBeenCalledOnce(); + $httpBackend.flush(); + expect(completeOutstandingRequestSpy).toHaveBeenCalledOnce(); + }); + + it('should update $browser outstandingRequestCount on error', function() { + $httpBackend.when('GET').respond(500); + + expect(incOutstandingRequestCountSpy).not.toHaveBeenCalled(); + $http.get(''); + expect(incOutstandingRequestCountSpy).toHaveBeenCalledOnce(); + $httpBackend.flush(); + expect(completeOutstandingRequestSpy).toHaveBeenCalledOnce(); + }); + }); }); From 5db625723b9d983124f5ebf2de29662ea971683e Mon Sep 17 00:00:00 2001 From: Georgios Kalpakas Date: Thu, 14 Jul 2016 20:32:15 +0300 Subject: [PATCH 0055/1173] refactor($http): move functions together and order alphabetically Closes #14921 --- src/ng/http.js | 64 +++++++++++++++++++++++++------------------------- 1 file changed, 32 insertions(+), 32 deletions(-) diff --git a/src/ng/http.js b/src/ng/http.js index f02165ad6806..bcfd163e7e91 100644 --- a/src/ng/http.js +++ b/src/ng/http.js @@ -957,28 +957,7 @@ function $HttpProvider() { config.headers = mergeHeaders(requestConfig); config.method = uppercase(config.method); config.paramSerializer = isString(config.paramSerializer) ? - $injector.get(config.paramSerializer) : config.paramSerializer; - - var serverRequest = function(config) { - var headers = config.headers; - var reqData = transformData(config.data, headersGetter(headers), undefined, config.transformRequest); - - // strip content-type if data is undefined - if (isUndefined(reqData)) { - forEach(headers, function(value, header) { - if (lowercase(header) === 'content-type') { - delete headers[header]; - } - }); - } - - if (isUndefined(config.withCredentials) && !isUndefined(defaults.withCredentials)) { - config.withCredentials = defaults.withCredentials; - } - - // send request - return sendReq(config, reqData).then(transformResponse, transformResponse); - }; + $injector.get(config.paramSerializer) : config.paramSerializer; var chain = [serverRequest, undefined]; var promise = initiateOutstandingRequest(config); @@ -1036,16 +1015,6 @@ function $HttpProvider() { $browser.$$completeOutstandingRequest(noop); } - function transformResponse(response) { - // make a copy since the response must be cacheable - var resp = extend({}, response); - resp.data = transformData(response.data, response.headers, response.status, - config.transformResponse); - return (isSuccess(response.status)) - ? resp - : $q.reject(resp); - } - function executeHeaderFns(headers, config) { var headerContent, processedHeaders = {}; @@ -1087,6 +1056,37 @@ function $HttpProvider() { // execute if header value is a function for merged headers return executeHeaderFns(reqHeaders, shallowCopy(config)); } + + function serverRequest(config) { + var headers = config.headers; + var reqData = transformData(config.data, headersGetter(headers), undefined, config.transformRequest); + + // strip content-type if data is undefined + if (isUndefined(reqData)) { + forEach(headers, function(value, header) { + if (lowercase(header) === 'content-type') { + delete headers[header]; + } + }); + } + + if (isUndefined(config.withCredentials) && !isUndefined(defaults.withCredentials)) { + config.withCredentials = defaults.withCredentials; + } + + // send request + return sendReq(config, reqData).then(transformResponse, transformResponse); + } + + function transformResponse(response) { + // make a copy since the response must be cacheable + var resp = extend({}, response); + resp.data = transformData(response.data, response.headers, response.status, + config.transformResponse); + return (isSuccess(response.status)) + ? resp + : $q.reject(resp); + } } $http.pendingRequests = []; From dc7f625f48a49a3bee955d1cd4f97bab4b256a25 Mon Sep 17 00:00:00 2001 From: Georgios Kalpakas Date: Thu, 14 Jul 2016 20:35:24 +0300 Subject: [PATCH 0056/1173] refactor($http): clean up code Closes #14921 --- src/ng/http.js | 36 ++++++++++++++++++++++-------------- 1 file changed, 22 insertions(+), 14 deletions(-) diff --git a/src/ng/http.js b/src/ng/http.js index bcfd163e7e91..a8ebdb289b8d 100644 --- a/src/ng/http.js +++ b/src/ng/http.js @@ -959,26 +959,25 @@ function $HttpProvider() { config.paramSerializer = isString(config.paramSerializer) ? $injector.get(config.paramSerializer) : config.paramSerializer; - var chain = [serverRequest, undefined]; - var promise = initiateOutstandingRequest(config); + $browser.$$incOutstandingRequestCount(); + + var requestInterceptors = []; + var responseInterceptors = []; + var promise = $q.when(config); // apply interceptors forEach(reversedInterceptors, function(interceptor) { if (interceptor.request || interceptor.requestError) { - chain.unshift(interceptor.request, interceptor.requestError); + requestInterceptors.unshift(interceptor.request, interceptor.requestError); } if (interceptor.response || interceptor.responseError) { - chain.push(interceptor.response, interceptor.responseError); + responseInterceptors.push(interceptor.response, interceptor.responseError); } }); - while (chain.length) { - var thenFn = chain.shift(); - var rejectFn = chain.shift(); - - promise = promise.then(thenFn, rejectFn); - } - + promise = chainInterceptors(promise, requestInterceptors); + promise = promise.then(serverRequest); + promise = chainInterceptors(promise, responseInterceptors); promise.finally(completeOutstandingRequest); if (useLegacyPromise) { @@ -1006,9 +1005,18 @@ function $HttpProvider() { return promise; - function initiateOutstandingRequest(config) { - $browser.$$incOutstandingRequestCount(); - return $q.when(config); + + function chainInterceptors(promise, interceptors) { + for (var i = 0, ii = interceptors.length; i < ii;) { + var thenFn = interceptors[i++]; + var rejectFn = interceptors[i++]; + + promise = promise.then(thenFn, rejectFn); + } + + interceptors.length = 0; + + return promise; } function completeOutstandingRequest() { From 47583d98005f6a498d397dbe2cedaadac69f0b47 Mon Sep 17 00:00:00 2001 From: Georgios Kalpakas Date: Thu, 14 Jul 2016 21:59:25 +0300 Subject: [PATCH 0057/1173] fix($http): avoid `Possibly Unhandled Rejection` error when the request fails Calling `promise.finally(...)` creates a new promise. If we don't return this promise, the user won't be able to attach an error handler to it and thus won't be able to prevent a potential PUR error. This commit also improves the test coverage for the increment/decrement `outstandingRequestCount` fix. Closes #13869 Closes #14921 --- src/ng/http.js | 2 +- test/ng/httpSpec.js | 224 +++++++++++++++++++++++++++++++++++++++++--- 2 files changed, 211 insertions(+), 15 deletions(-) diff --git a/src/ng/http.js b/src/ng/http.js index a8ebdb289b8d..6f9d573baf13 100644 --- a/src/ng/http.js +++ b/src/ng/http.js @@ -978,7 +978,7 @@ function $HttpProvider() { promise = chainInterceptors(promise, requestInterceptors); promise = promise.then(serverRequest); promise = chainInterceptors(promise, responseInterceptors); - promise.finally(completeOutstandingRequest); + promise = promise.finally(completeOutstandingRequest); if (useLegacyPromise) { promise.success = function(fn) { diff --git a/test/ng/httpSpec.js b/test/ng/httpSpec.js index 041326459afe..479ce359bc92 100644 --- a/test/ng/httpSpec.js +++ b/test/ng/httpSpec.js @@ -1896,37 +1896,233 @@ describe('$http', function() { expect(paramSerializer({foo: 'foo', bar: ['bar', 'baz']})).toEqual('bar=bar&bar=baz&foo=foo'); }); }); + }); - describe('$browser\'s outstandingRequestCount', function() { - var incOutstandingRequestCountSpy, completeOutstandingRequestSpy; - beforeEach(inject(function($browser) { - incOutstandingRequestCountSpy - = spyOn($browser, '$$incOutstandingRequestCount').andCallThrough(); - completeOutstandingRequestSpy - = spyOn($browser, '$$completeOutstandingRequest').andCallThrough(); - })); + describe('$browser\'s outstandingRequestCount', function() { + var $http; + var $httpBackend; + var $rootScope; + var incOutstandingRequestCountSpy; + var completeOutstandingRequestSpy; - it('should update $browser outstandingRequestCount on success', function() { - $httpBackend.when('GET').respond(200); + describe('without interceptors', function() { + beforeEach(setupServicesAndSpies); + + + it('should immediately call `$browser.$$incOutstandingRequestCount()`', function() { expect(incOutstandingRequestCountSpy).not.toHaveBeenCalled(); $http.get(''); expect(incOutstandingRequestCountSpy).toHaveBeenCalledOnce(); + }); + + + it('should call `$browser.$$completeOutstandingRequest()` on success', function() { + $httpBackend.when('GET').respond(200); + + $http.get(''); + expect(completeOutstandingRequestSpy).not.toHaveBeenCalled(); $httpBackend.flush(); expect(completeOutstandingRequestSpy).toHaveBeenCalledOnce(); }); - it('should update $browser outstandingRequestCount on error', function() { + + it('should call `$browser.$$completeOutstandingRequest()` on error', function() { $httpBackend.when('GET').respond(500); - expect(incOutstandingRequestCountSpy).not.toHaveBeenCalled(); - $http.get(''); - expect(incOutstandingRequestCountSpy).toHaveBeenCalledOnce(); + $http.get('').catch(noop); + expect(completeOutstandingRequestSpy).not.toHaveBeenCalled(); $httpBackend.flush(); expect(completeOutstandingRequestSpy).toHaveBeenCalledOnce(); }); + + + it('should increment/decrement `outstandingRequestCount` on error in `transformRequest`', + inject(function($exceptionHandler) { + expect(incOutstandingRequestCountSpy).not.toHaveBeenCalled(); + expect(completeOutstandingRequestSpy).not.toHaveBeenCalled(); + + $http.get('', {transformRequest: function() { throw new Error(); }}).catch(noop); + + expect(incOutstandingRequestCountSpy).toHaveBeenCalledOnce(); + expect(completeOutstandingRequestSpy).not.toHaveBeenCalled(); + + $rootScope.$digest(); + + expect(incOutstandingRequestCountSpy).toHaveBeenCalledOnce(); + expect(completeOutstandingRequestSpy).toHaveBeenCalledOnce(); + + expect($exceptionHandler.errors).toEqual([jasmine.any(Error)]); + $exceptionHandler.errors = []; + }) + ); + + + it('should increment/decrement `outstandingRequestCount` on error in `transformResponse`', + inject(function($exceptionHandler) { + expect(incOutstandingRequestCountSpy).not.toHaveBeenCalled(); + expect(completeOutstandingRequestSpy).not.toHaveBeenCalled(); + + $httpBackend.when('GET').respond(200); + $http.get('', {transformResponse: function() { throw new Error(); }}).catch(noop); + + expect(incOutstandingRequestCountSpy).toHaveBeenCalledOnce(); + expect(completeOutstandingRequestSpy).not.toHaveBeenCalled(); + + $httpBackend.flush(); + + expect(incOutstandingRequestCountSpy).toHaveBeenCalledOnce(); + expect(completeOutstandingRequestSpy).toHaveBeenCalledOnce(); + + expect($exceptionHandler.errors).toEqual([jasmine.any(Error)]); + $exceptionHandler.errors = []; + }) + ); }); + + + describe('with interceptors', function() { + var reqInterceptorDeferred; + var resInterceptorDeferred; + var reqInterceptorFulfilled; + var resInterceptorFulfilled; + + beforeEach(module(function($httpProvider) { + reqInterceptorDeferred = null; + resInterceptorDeferred = null; + reqInterceptorFulfilled = false; + resInterceptorFulfilled = false; + + $httpProvider.interceptors.push(function($q) { + return { + request: function(config) { + return (reqInterceptorDeferred = $q.defer()). + promise. + finally(function() { reqInterceptorFulfilled = true; }). + then(valueFn(config)); + }, + response: function() { + return (resInterceptorDeferred = $q.defer()). + promise. + finally(function() { resInterceptorFulfilled = true; }); + } + }; + }); + })); + + beforeEach(setupServicesAndSpies); + + beforeEach(function() { + $httpBackend.when('GET').respond(200); + }); + + + it('should increment/decrement `outstandingRequestCount` before/after async interceptors', + function() { + expect(reqInterceptorFulfilled).toBe(false); + expect(resInterceptorFulfilled).toBe(false); + expect(incOutstandingRequestCountSpy).not.toHaveBeenCalled(); + expect(completeOutstandingRequestSpy).not.toHaveBeenCalled(); + + $http.get(''); + $rootScope.$digest(); + + expect(reqInterceptorFulfilled).toBe(false); + expect(resInterceptorFulfilled).toBe(false); + expect(incOutstandingRequestCountSpy).toHaveBeenCalledOnce(); + expect(completeOutstandingRequestSpy).not.toHaveBeenCalled(); + + reqInterceptorDeferred.resolve(); + $httpBackend.flush(); + + expect(reqInterceptorFulfilled).toBe(true); + expect(resInterceptorFulfilled).toBe(false); + expect(incOutstandingRequestCountSpy).toHaveBeenCalledOnce(); + expect(completeOutstandingRequestSpy).not.toHaveBeenCalled(); + + resInterceptorDeferred.resolve(); + $rootScope.$digest(); + + expect(reqInterceptorFulfilled).toBe(true); + expect(resInterceptorFulfilled).toBe(true); + expect(incOutstandingRequestCountSpy).toHaveBeenCalledOnce(); + expect(completeOutstandingRequestSpy).toHaveBeenCalledOnce(); + } + ); + + + it('should increment/decrement `outstandingRequestCount` on error in request interceptor', + function() { + expect(reqInterceptorFulfilled).toBe(false); + expect(incOutstandingRequestCountSpy).not.toHaveBeenCalled(); + expect(completeOutstandingRequestSpy).not.toHaveBeenCalled(); + + $http.get('').catch(noop); + $rootScope.$digest(); + + expect(reqInterceptorFulfilled).toBe(false); + expect(incOutstandingRequestCountSpy).toHaveBeenCalledOnce(); + expect(completeOutstandingRequestSpy).not.toHaveBeenCalled(); + + reqInterceptorDeferred.reject(); + $rootScope.$digest(); + + expect(reqInterceptorFulfilled).toBe(true); + expect(incOutstandingRequestCountSpy).toHaveBeenCalledOnce(); + expect(completeOutstandingRequestSpy).toHaveBeenCalledOnce(); + } + ); + + + it('should increment/decrement `outstandingRequestCount` on error in response interceptor', + function() { + expect(reqInterceptorFulfilled).toBe(false); + expect(resInterceptorFulfilled).toBe(false); + expect(incOutstandingRequestCountSpy).not.toHaveBeenCalled(); + expect(completeOutstandingRequestSpy).not.toHaveBeenCalled(); + + $http.get('').catch(noop); + $rootScope.$digest(); + + expect(reqInterceptorFulfilled).toBe(false); + expect(resInterceptorFulfilled).toBe(false); + expect(incOutstandingRequestCountSpy).toHaveBeenCalledOnce(); + expect(completeOutstandingRequestSpy).not.toHaveBeenCalled(); + + reqInterceptorDeferred.resolve(); + $httpBackend.flush(); + + expect(reqInterceptorFulfilled).toBe(true); + expect(resInterceptorFulfilled).toBe(false); + expect(incOutstandingRequestCountSpy).toHaveBeenCalledOnce(); + expect(completeOutstandingRequestSpy).not.toHaveBeenCalled(); + + resInterceptorDeferred.reject(); + $rootScope.$digest(); + + expect(reqInterceptorFulfilled).toBe(true); + expect(resInterceptorFulfilled).toBe(true); + expect(incOutstandingRequestCountSpy).toHaveBeenCalledOnce(); + expect(completeOutstandingRequestSpy).toHaveBeenCalledOnce(); + } + ); + }); + + + // Helpers + function setupServicesAndSpies() { + inject(function($browser, _$http_, _$httpBackend_, _$rootScope_) { + $http = _$http_; + $httpBackend = _$httpBackend_; + $rootScope = _$rootScope_; + + incOutstandingRequestCountSpy = + spyOn($browser, '$$incOutstandingRequestCount').and.callThrough(); + completeOutstandingRequestSpy = + spyOn($browser, '$$completeOutstandingRequest').and.callThrough(); + }); + } }); From c13c666728c1a1485ef18e92d7cb35118ce39609 Mon Sep 17 00:00:00 2001 From: Georgios Kalpakas Date: Sun, 10 Jul 2016 21:16:26 +0300 Subject: [PATCH 0058/1173] feat(ngRoute): allow `ngView` to be included in an asynchronously loaded template During its linking phase, `ngView` relies on the info provided in `$route.current` for instantiating the initial view. `$route.current` is set in the callback of a listener to `$locationChangeSuccess`, which is registered during the instantiation of the `$route` service. Thus, it is crucial that the `$route` service is instantiated _before_ the initial `$locationChangeSuccess` event is fired. Since `ngView` declares `$route` as a dependency, the service is instantiated in time, if `ngView` is present during the initial load of the page. Yet, in cases where `ngView` is included in a template that is loaded asynchronously (e.g. in another directive's template), the directive factory might not be called soon enough for `$route` to be instantiated before the initial `$locationChangeSuccess` event is fired. This commit fixes it, by enabling eager instantiation of `$route` (during the initialization phase). Eager instantiation can be disabled (restoring the old behavior), but is on by default. Fixes #1213 Closes #14893 BREAKING CHANGE: In cases where `ngView` was loaded asynchronously, `$route` (and its dependencies; e.g. `$location`) might also have been instantiated asynchronously. After this change, `$route` (and its dependencies) will - by default - be instantiated early on. Although this is not expected to have unwanted side-effects in normal application bebavior, it may affect your unit tests: When testing a module that (directly or indirectly) depends on `ngRoute`, a request will be made for the default route's template. If not properly "trained", `$httpBackend` will complain about this unexpected request. You can restore the previous behavior (and avoid unexpected requests in tests), by using `$routeProvider.eagerInstantiationEnabled(false)`. --- src/ngRoute/route.js | 68 ++++++++++++++++++++++++++-- test/ngRoute/directive/ngViewSpec.js | 31 +++++++++++++ test/ngRoute/routeSpec.js | 53 ++++++++++++++++++++++ 3 files changed, 147 insertions(+), 5 deletions(-) diff --git a/src/ngRoute/route.js b/src/ngRoute/route.js index 4ead323e8baf..8dcb2bd718de 100644 --- a/src/ngRoute/route.js +++ b/src/ngRoute/route.js @@ -2,10 +2,11 @@ /* global shallowCopy: false */ -// There are necessary for `shallowCopy()` (included via `src/shallowCopy.js`). +// `isArray` and `isObject` are necessary for `shallowCopy()` (included via `src/shallowCopy.js`). // They are initialized inside the `$RouteProvider`, to ensure `window.angular` is available. var isArray; var isObject; +var isDefined; /** * @ngdoc module @@ -22,10 +23,17 @@ var isObject; * *
    */ - /* global -ngRouteModule */ -var ngRouteModule = angular.module('ngRoute', ['ng']). - provider('$route', $RouteProvider), - $routeMinErr = angular.$$minErr('ngRoute'); +/* global -ngRouteModule */ +var ngRouteModule = angular. + module('ngRoute', []). + provider('$route', $RouteProvider). + // Ensure `$route` will be instantiated in time to capture the initial `$locationChangeSuccess` + // event (unless explicitly disabled). This is necessary in case `ngView` is included in an + // asynchronously loaded template. + run(instantiateRoute); +var $routeMinErr = angular.$$minErr('ngRoute'); +var isEagerInstantiationEnabled; + /** * @ngdoc provider @@ -44,6 +52,7 @@ var ngRouteModule = angular.module('ngRoute', ['ng']). function $RouteProvider() { isArray = angular.isArray; isObject = angular.isObject; + isDefined = angular.isDefined; function inherit(parent, extra) { return angular.extend(Object.create(parent), extra); @@ -287,6 +296,47 @@ function $RouteProvider() { return this; }; + /** + * @ngdoc method + * @name $routeProvider#eagerInstantiationEnabled + * @kind function + * + * @description + * Call this method as a setter to enable/disable eager instantiation of the + * {@link ngRoute.$route $route} service upon application bootstrap. You can also call it as a + * getter (i.e. without any arguments) to get the current value of the + * `eagerInstantiationEnabled` flag. + * + * Instantiating `$route` early is necessary for capturing the initial + * {@link ng.$location#$locationChangeStart $locationChangeStart} event and navigating to the + * appropriate route. Usually, `$route` is instantiated in time by the + * {@link ngRoute.ngView ngView} directive. Yet, in cases where `ngView` is included in an + * asynchronously loaded template (e.g. in another directive's template), the directive factory + * might not be called soon enough for `$route` to be instantiated _before_ the initial + * `$locationChangeSuccess` event is fired. Eager instantiation ensures that `$route` is always + * instantiated in time, regardless of when `ngView` will be loaded. + * + * The default value is true. + * + * **Note**:
    + * You may want to disable the default behavior when unit-testing modules that depend on + * `ngRoute`, in order to avoid an unexpected request for the default route's template. + * + * @param {boolean=} enabled - If provided, update the internal `eagerInstantiationEnabled` flag. + * + * @returns {*} The current value of the `eagerInstantiationEnabled` flag if used as a getter or + * itself (for chaining) if used as a setter. + */ + isEagerInstantiationEnabled = true; + this.eagerInstantiationEnabled = function eagerInstantiationEnabled(enabled) { + if (isDefined(enabled)) { + isEagerInstantiationEnabled = enabled; + return this; + } + + return isEagerInstantiationEnabled; + }; + this.$get = ['$rootScope', '$location', @@ -791,3 +841,11 @@ function $RouteProvider() { } }]; } + +instantiateRoute.$inject = ['$injector']; +function instantiateRoute($injector) { + if (isEagerInstantiationEnabled) { + // Instantiate `$route` + $injector.get('$route'); + } +} diff --git a/test/ngRoute/directive/ngViewSpec.js b/test/ngRoute/directive/ngViewSpec.js index 7c11b9a95670..9655c7d6a4e4 100644 --- a/test/ngRoute/directive/ngViewSpec.js +++ b/test/ngRoute/directive/ngViewSpec.js @@ -1029,4 +1029,35 @@ describe('ngView', function() { )); }); }); + + describe('in async template', function() { + beforeEach(module('ngRoute')); + beforeEach(module(function($compileProvider, $provide, $routeProvider) { + $compileProvider.directive('asyncView', function() { + return {templateUrl: 'async-view.html'}; + }); + + $provide.decorator('$templateRequest', function($timeout) { + return function() { + return $timeout(angular.identity, 500, false, ''); + }; + }); + + $routeProvider.when('/', {template: 'Hello, world!'}); + })); + + + it('should work correctly upon initial page load', + // Injecting `$location` here is necessary, so that it gets instantiated early + inject(function($compile, $location, $rootScope, $timeout) { + var elem = $compile('')($rootScope); + $rootScope.$digest(); + $timeout.flush(500); + + expect(elem.text()).toBe('Hello, world!'); + + dealoc(elem); + }) + ); + }); }); diff --git a/test/ngRoute/routeSpec.js b/test/ngRoute/routeSpec.js index 1d6037a84f9d..5a0780f5efbf 100644 --- a/test/ngRoute/routeSpec.js +++ b/test/ngRoute/routeSpec.js @@ -1,5 +1,58 @@ 'use strict'; +describe('$routeProvider', function() { + var $routeProvider; + + beforeEach(module('ngRoute')); + beforeEach(module(function(_$routeProvider_) { + $routeProvider = _$routeProvider_; + $routeProvider.when('/foo', {template: 'Hello, world!'}); + })); + + + it('should support enabling/disabling automatic instantiation upon initial load', + inject(function() { + expect($routeProvider.eagerInstantiationEnabled(true)).toBe($routeProvider); + expect($routeProvider.eagerInstantiationEnabled()).toBe(true); + + expect($routeProvider.eagerInstantiationEnabled(false)).toBe($routeProvider); + expect($routeProvider.eagerInstantiationEnabled()).toBe(false); + + expect($routeProvider.eagerInstantiationEnabled(true)).toBe($routeProvider); + expect($routeProvider.eagerInstantiationEnabled()).toBe(true); + }) + ); + + + it('should automatically instantiate `$route` upon initial load', function() { + inject(function($location, $rootScope) { + $location.path('/foo'); + $rootScope.$digest(); + }); + + inject(function($route) { + expect($route.current).toBeDefined(); + }); + }); + + + it('should not automatically instantiate `$route` if disabled', function() { + module(function($routeProvider) { + $routeProvider.eagerInstantiationEnabled(false); + }); + + inject(function($location, $rootScope) { + $location.path('/foo'); + $rootScope.$digest(); + }); + + inject(function($route) { + expect($route.current).toBeUndefined(); + }); + }); +}); + + describe('$route', function() { var $httpBackend, element; From 4487cffb13f26c1dcece3120423251782ad5b4c9 Mon Sep 17 00:00:00 2001 From: Georgios Kalpakas Date: Tue, 28 Jun 2016 23:29:31 +0300 Subject: [PATCH 0059/1173] test($resource): add some tests wrt handling response errors The test currently fail on master, but should pass on 1.5.x. A subsequent commit will fix the regressions on master. (This commit should be backportable to 1.5.x.) Related to #14837. --- test/ngResource/resourceSpec.js | 71 ++++++++++++++++++++++++++++++++- 1 file changed, 70 insertions(+), 1 deletion(-) diff --git a/test/ngResource/resourceSpec.js b/test/ngResource/resourceSpec.js index 4f30d5c3052f..660c4fe93d3f 100644 --- a/test/ngResource/resourceSpec.js +++ b/test/ngResource/resourceSpec.js @@ -30,7 +30,7 @@ describe("basic usage", function() { } }); - callback = jasmine.createSpy(); + callback = jasmine.createSpy('callback'); })); @@ -907,6 +907,7 @@ describe("basic usage", function() { expect(cc.url).toBe('/new-id'); }); + it('should pass the same transformed value to success callbacks and to promises', function() { $httpBackend.expect('GET', '/CreditCard').respond(200, { value: 'original' }); @@ -1024,6 +1025,7 @@ describe("basic usage", function() { }); }); + it('should allow per action response interceptor that gets full response', function() { CreditCard = $resource('/CreditCard', {}, { query: { @@ -1079,6 +1081,46 @@ describe("basic usage", function() { expect(response.status).toBe(404); expect(response.config).toBeDefined(); }); + + + it('should fulfill the promise with the value returned by the responseError interceptor', + inject(function($q) { + CreditCard = $resource('/CreditCard', {}, { + test1: { + method: 'GET', + interceptor: {responseError: function() { return 'foo'; }} + }, + test2: { + method: 'GET', + interceptor: {responseError: function() { return $q.resolve('bar'); }} + }, + test3: { + method: 'GET', + interceptor: {responseError: function() { return $q.reject('baz'); }} + } + }); + + $httpBackend.whenGET('/CreditCard').respond(404); + + callback.calls.reset(); + CreditCard.test1().$promise.then(callback); + $httpBackend.flush(); + + expect(callback).toHaveBeenCalledOnceWith('foo'); + + callback.calls.reset(); + CreditCard.test2().$promise.then(callback); + $httpBackend.flush(); + + expect(callback).toHaveBeenCalledOnceWith('bar'); + + callback.calls.reset(); + CreditCard.test3().$promise.then(null, callback); + $httpBackend.flush(); + + expect(callback).toHaveBeenCalledOnceWith('baz'); + }) + ); }); @@ -1457,6 +1499,33 @@ describe('errors', function() { }); }); +describe('handling rejections', function() { + var $httpBackend; + var $resource; + + beforeEach(module('ngResource')); + + beforeEach(inject(function(_$httpBackend_, _$resource_) { + $httpBackend = _$httpBackend_; + $resource = _$resource_; + + $httpBackend.whenGET('/CreditCard').respond(404); + })); + + + it('should reject the promise even when there is an error callback', function() { + var errorCb1 = jasmine.createSpy('errorCb1'); + var errorCb2 = jasmine.createSpy('errorCb2'); + var CreditCard = $resource('/CreditCard'); + + CreditCard.get(noop, errorCb1).$promise.catch(errorCb2); + $httpBackend.flush(); + + expect(errorCb1).toHaveBeenCalledOnce(); + expect(errorCb2).toHaveBeenCalledOnce(); + }); +}); + describe('cancelling requests', function() { var httpSpy; var $httpBackend; From 5f6949fdae57b15340c1213cce379c6e6f8aff62 Mon Sep 17 00:00:00 2001 From: Georgios Kalpakas Date: Tue, 28 Jun 2016 23:32:28 +0300 Subject: [PATCH 0060/1173] fix($resource): fulfill promise with the correct value on error This fixes a regression introduced with 71cf28c. See #14837 for more info. Fixes #14837 Closes #14839 --- src/ngResource/resource.js | 20 +++++++--- test/ngResource/resourceSpec.js | 71 ++++++++++++++++++++++++++++++++- 2 files changed, 84 insertions(+), 7 deletions(-) diff --git a/src/ngResource/resource.js b/src/ngResource/resource.js index da2cffcd0bb3..7c4c944c2b89 100644 --- a/src/ngResource/resource.js +++ b/src/ngResource/resource.js @@ -695,6 +695,8 @@ angular.module('ngResource', ['ng']). defaultResponseInterceptor; var responseErrorInterceptor = action.interceptor && action.interceptor.responseError || undefined; + var hasError = !!error; + var hasResponseErrorInterceptor = !!responseErrorInterceptor; var timeoutDeferred; var numericTimeoutPromise; @@ -776,13 +778,19 @@ angular.module('ngResource', ['ng']). (success || noop)(value, response.headers); return value; }, - responseErrorInterceptor || error ? + (hasError || hasResponseErrorInterceptor) ? function(response) { - (error || noop)(response); - (responseErrorInterceptor || noop)(response); - return response; - } - : undefined); + if (hasError) error(response); + return hasResponseErrorInterceptor ? + responseErrorInterceptor(response) : + $q.reject(response); + } : + undefined); + if (hasError && !hasResponseErrorInterceptor) { + // Avoid `Possibly Unhandled Rejection` error, + // but still fulfill the returned promise with a rejection + promise.catch(noop); + } if (!isInstanceCall) { // we are creating instance / collection diff --git a/test/ngResource/resourceSpec.js b/test/ngResource/resourceSpec.js index 660c4fe93d3f..f872fa42528c 100644 --- a/test/ngResource/resourceSpec.js +++ b/test/ngResource/resourceSpec.js @@ -1500,12 +1500,17 @@ describe('errors', function() { }); describe('handling rejections', function() { + var $exceptionHandler; var $httpBackend; var $resource; beforeEach(module('ngResource')); + beforeEach(module(function($exceptionHandlerProvider) { + $exceptionHandlerProvider.mode('log'); + })); - beforeEach(inject(function(_$httpBackend_, _$resource_) { + beforeEach(inject(function(_$exceptionHandler_, _$httpBackend_, _$resource_) { + $exceptionHandler = _$exceptionHandler_; $httpBackend = _$httpBackend_; $resource = _$resource_; @@ -1524,6 +1529,70 @@ describe('handling rejections', function() { expect(errorCb1).toHaveBeenCalledOnce(); expect(errorCb2).toHaveBeenCalledOnce(); }); + + + it('should report a PUR when no error callback or responseError interceptor is provided', + function() { + var CreditCard = $resource('/CreditCard'); + + CreditCard.get(); + $httpBackend.flush(); + + expect($exceptionHandler.errors.length).toBe(1); + expect($exceptionHandler.errors[0]).toMatch(/^Possibly unhandled rejection/); + } + ); + + + it('should not report a PUR when an error callback or responseError interceptor is provided', + function() { + var CreditCard = $resource('/CreditCard', {}, { + test1: { + method: 'GET' + }, + test2: { + method: 'GET', + interceptor: {responseError: function() { return {}; }} + } + }); + + // With error callback + CreditCard.test1(noop, noop); + $httpBackend.flush(); + + expect($exceptionHandler.errors.length).toBe(0); + + // With responseError interceptor + CreditCard.test2(); + $httpBackend.flush(); + + expect($exceptionHandler.errors.length).toBe(0); + + // With error callback and responseError interceptor + CreditCard.test2(noop, noop); + $httpBackend.flush(); + + expect($exceptionHandler.errors.length).toBe(0); + } + ); + + + it('should report a PUR when the responseError interceptor returns a rejected promise', + inject(function($q) { + var CreditCard = $resource('/CreditCard', {}, { + test: { + method: 'GET', + interceptor: {responseError: function() { return $q.reject({}); }} + } + }); + + CreditCard.test(); + $httpBackend.flush(); + + expect($exceptionHandler.errors.length).toBe(1); + expect($exceptionHandler.errors[0]).toMatch(/^Possibly unhandled rejection/); + }) + ); }); describe('cancelling requests', function() { From 5dfb328c944fc3f4cdd301f0875958bdc6a8ab86 Mon Sep 17 00:00:00 2001 From: Georgios Kalpakas Date: Tue, 19 Jul 2016 15:31:45 +0300 Subject: [PATCH 0061/1173] refactor(test/e2e): make file/directory names consistent --- test/e2e/fixtures/{ngJqJquery => ng-jq-jquery}/index.html | 0 test/e2e/fixtures/{ngJq => ng-jq-jquery}/script.js | 0 test/e2e/fixtures/{ngJq => ng-jq}/index.html | 0 test/e2e/fixtures/{ngJqJquery => ng-jq}/script.js | 0 ...r-already-loadedSpec.js => angular-already-loaded.spec.js} | 0 test/e2e/tests/{httpSpec.js => http.spec.js} | 0 test/e2e/tests/{loaderSpec.js => loader.spec.js} | 0 test/e2e/tests/{ngJqSpec.js => ng-jq.spec.js} | 4 ++-- test/e2e/tests/{sampleSpec.js => sample.spec.js} | 0 9 files changed, 2 insertions(+), 2 deletions(-) rename test/e2e/fixtures/{ngJqJquery => ng-jq-jquery}/index.html (100%) rename test/e2e/fixtures/{ngJq => ng-jq-jquery}/script.js (100%) rename test/e2e/fixtures/{ngJq => ng-jq}/index.html (100%) rename test/e2e/fixtures/{ngJqJquery => ng-jq}/script.js (100%) rename test/e2e/tests/{angular-already-loadedSpec.js => angular-already-loaded.spec.js} (100%) rename test/e2e/tests/{httpSpec.js => http.spec.js} (100%) rename test/e2e/tests/{loaderSpec.js => loader.spec.js} (100%) rename test/e2e/tests/{ngJqSpec.js => ng-jq.spec.js} (85%) rename test/e2e/tests/{sampleSpec.js => sample.spec.js} (100%) diff --git a/test/e2e/fixtures/ngJqJquery/index.html b/test/e2e/fixtures/ng-jq-jquery/index.html similarity index 100% rename from test/e2e/fixtures/ngJqJquery/index.html rename to test/e2e/fixtures/ng-jq-jquery/index.html diff --git a/test/e2e/fixtures/ngJq/script.js b/test/e2e/fixtures/ng-jq-jquery/script.js similarity index 100% rename from test/e2e/fixtures/ngJq/script.js rename to test/e2e/fixtures/ng-jq-jquery/script.js diff --git a/test/e2e/fixtures/ngJq/index.html b/test/e2e/fixtures/ng-jq/index.html similarity index 100% rename from test/e2e/fixtures/ngJq/index.html rename to test/e2e/fixtures/ng-jq/index.html diff --git a/test/e2e/fixtures/ngJqJquery/script.js b/test/e2e/fixtures/ng-jq/script.js similarity index 100% rename from test/e2e/fixtures/ngJqJquery/script.js rename to test/e2e/fixtures/ng-jq/script.js diff --git a/test/e2e/tests/angular-already-loadedSpec.js b/test/e2e/tests/angular-already-loaded.spec.js similarity index 100% rename from test/e2e/tests/angular-already-loadedSpec.js rename to test/e2e/tests/angular-already-loaded.spec.js diff --git a/test/e2e/tests/httpSpec.js b/test/e2e/tests/http.spec.js similarity index 100% rename from test/e2e/tests/httpSpec.js rename to test/e2e/tests/http.spec.js diff --git a/test/e2e/tests/loaderSpec.js b/test/e2e/tests/loader.spec.js similarity index 100% rename from test/e2e/tests/loaderSpec.js rename to test/e2e/tests/loader.spec.js diff --git a/test/e2e/tests/ngJqSpec.js b/test/e2e/tests/ng-jq.spec.js similarity index 85% rename from test/e2e/tests/ngJqSpec.js rename to test/e2e/tests/ng-jq.spec.js index bfe30788c21f..9174e17c45c6 100644 --- a/test/e2e/tests/ngJqSpec.js +++ b/test/e2e/tests/ng-jq.spec.js @@ -1,11 +1,11 @@ describe('Customizing the jqLite / jQuery version', function() { it('should be able to force jqLite', function() { - loadFixture('ngJq'); + loadFixture('ng-jq'); expect(element(by.binding('jqueryVersion')).getText()).toBe('jqLite'); }); it('should be able to use a specific version jQuery', function() { - loadFixture('ngJqJquery'); + loadFixture('ng-jq-jquery'); expect(element(by.binding('jqueryVersion')).getText()).toBe('2.1.0'); }); }); diff --git a/test/e2e/tests/sampleSpec.js b/test/e2e/tests/sample.spec.js similarity index 100% rename from test/e2e/tests/sampleSpec.js rename to test/e2e/tests/sample.spec.js From ce40d5cbda07d062f49a8f97feae6c8f437f1b81 Mon Sep 17 00:00:00 2001 From: Brad Date: Tue, 19 Jul 2016 18:35:04 -0400 Subject: [PATCH 0062/1173] docs($httpParamSerializer): fix typo (remove superfluous quote) Closes #14934 --- src/ng/http.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ng/http.js b/src/ng/http.js index 6f9d573baf13..158a4748e8c3 100644 --- a/src/ng/http.js +++ b/src/ng/http.js @@ -35,7 +35,7 @@ function $HttpParamSerializerProvider() { * * `{'foo': 'bar'}` results in `foo=bar` * * `{'foo': Date.now()}` results in `foo=2015-04-01T09%3A50%3A49.262Z` (`toISOString()` and encoded representation of a Date object) * * `{'foo': ['bar', 'baz']}` results in `foo=bar&foo=baz` (repeated key for each array element) - * * `{'foo': {'bar':'baz'}}` results in `foo=%7B%22bar%22%3A%22baz%22%7D"` (stringified and encoded representation of an object) + * * `{'foo': {'bar':'baz'}}` results in `foo=%7B%22bar%22%3A%22baz%22%7D` (stringified and encoded representation of an object) * * Note that serializer will sort the request parameters alphabetically. * */ From 482a3ae9f956d126d814686512b29bc4fd26bc43 Mon Sep 17 00:00:00 2001 From: Georgios Kalpakas Date: Tue, 19 Jul 2016 00:33:02 +0300 Subject: [PATCH 0063/1173] test($anchorScroll): add e2e tests Fixes #9535 Closes #9583 Closes #14932 --- .../anchor-scroll-y-offset/index.html | 38 ++++ .../fixtures/anchor-scroll-y-offset/script.js | 17 ++ test/e2e/fixtures/anchor-scroll/index.html | 23 +++ test/e2e/fixtures/anchor-scroll/script.js | 9 + test/e2e/tests/anchor-scroll.spec.js | 187 ++++++++++++++++++ 5 files changed, 274 insertions(+) create mode 100644 test/e2e/fixtures/anchor-scroll-y-offset/index.html create mode 100644 test/e2e/fixtures/anchor-scroll-y-offset/script.js create mode 100644 test/e2e/fixtures/anchor-scroll/index.html create mode 100644 test/e2e/fixtures/anchor-scroll/script.js create mode 100644 test/e2e/tests/anchor-scroll.spec.js diff --git a/test/e2e/fixtures/anchor-scroll-y-offset/index.html b/test/e2e/fixtures/anchor-scroll-y-offset/index.html new file mode 100644 index 000000000000..e77b9b1ef3c9 --- /dev/null +++ b/test/e2e/fixtures/anchor-scroll-y-offset/index.html @@ -0,0 +1,38 @@ + + + +
    + +
    +
    + Anchor {{y}} of 5 +
    + + + + + + + diff --git a/test/e2e/fixtures/anchor-scroll-y-offset/script.js b/test/e2e/fixtures/anchor-scroll-y-offset/script.js new file mode 100644 index 000000000000..260b6dc76cba --- /dev/null +++ b/test/e2e/fixtures/anchor-scroll-y-offset/script.js @@ -0,0 +1,17 @@ +angular. + module('test', []). + controller('TestController', function($anchorScroll, $location, $scope) { + $anchorScroll.yOffset = 50; + + $scope.scrollTo = function(target) { + if ($location.hash() !== target) { + // Set `$location.hash()` to `target` and + // `$anchorScroll` will detect the change and scroll + $location.hash(target); + } else { + // The hash is the same, but `target` might be out of view - + // explicitly call `$anchorScroll` + $anchorScroll(); + } + }; + }); diff --git a/test/e2e/fixtures/anchor-scroll/index.html b/test/e2e/fixtures/anchor-scroll/index.html new file mode 100644 index 000000000000..71f0d9c1624c --- /dev/null +++ b/test/e2e/fixtures/anchor-scroll/index.html @@ -0,0 +1,23 @@ + + + +
    + + + + + + + diff --git a/test/e2e/fixtures/anchor-scroll/script.js b/test/e2e/fixtures/anchor-scroll/script.js new file mode 100644 index 000000000000..a83c034e9b0f --- /dev/null +++ b/test/e2e/fixtures/anchor-scroll/script.js @@ -0,0 +1,9 @@ +angular. + module('test', []). + controller('TestController', function($anchorScroll, $location, $scope) { + $scope.scrollTo = function(target) { + // Set `$location.hash()` to `target` and + // `$anchorScroll` will detect the change and scroll + $location.hash(target); + }; + }); diff --git a/test/e2e/tests/anchor-scroll.spec.js b/test/e2e/tests/anchor-scroll.spec.js new file mode 100644 index 000000000000..a5aaf44af7a3 --- /dev/null +++ b/test/e2e/tests/anchor-scroll.spec.js @@ -0,0 +1,187 @@ +describe('$anchorScroll', function() { + beforeEach(function() { + jasmine.addMatchers({ + toBeInViewport: function() { + return { + compare: function(id) { + var result = { + pass: browser.driver. + executeScript(_script_isInViewport, id). + then(function(isInViewport) { + result.message = 'Expected #' + id + (isInViewport ? ' not' : '') + + ' to be in viewport'; + return isInViewport; + }) + }; + + return result; + } + }; + }, + toHaveTop: function() { + return { + compare: function(id, expectedTop) { + var result = { + pass: browser.driver. + executeScript(_script_getTop, id). + then(function(actualTop) { + var passed = actualTop === expectedTop; + result.message = 'Expected #' + id + '\'s top' + (passed ? ' not' : '') + + ' to be ' + expectedTop + ', but it was ' + actualTop; + return passed; + }) + }; + + return result; + } + }; + } + }); + }); + + describe('basic functionality', function() { + beforeEach(function() { + loadFixture('anchor-scroll'); + }); + + it('should scroll to #bottom when clicking #top and vice versa', function() { + expect('top').toBeInViewport(); + expect('bottom').not.toBeInViewport(); + + element(by.id('top')).click(); + expect('top').not.toBeInViewport(); + expect('bottom').toBeInViewport(); + + element(by.id('bottom')).click(); + expect('top').toBeInViewport(); + expect('bottom').not.toBeInViewport(); + }); + }); + + describe('with `yOffset`', function() { + var yOffset = 50; + var buttons = element.all(by.repeater('x in [1, 2, 3, 4, 5]')); + var anchors = element.all(by.repeater('y in [1, 2, 3, 4, 5]')); + + beforeEach(function() { + loadFixture('anchor-scroll-y-offset'); + }); + + it('should scroll to the correct anchor when clicking each button', function() { + var lastAnchor = anchors.last(); + + // Make sure there is enough room to scroll the last anchor to the top + lastAnchor.getSize().then(function(size) { + var tempHeight = size.height - 10; + + execWithTempViewportHeight(tempHeight, function() { + buttons.each(function(button, idx) { + // For whatever reason, we need to run the assertions inside a callback :( + button.click().then(function() { + var anchorId = 'anchor-' + (idx + 1); + + expect(anchorId).toBeInViewport(); + expect(anchorId).toHaveTop(yOffset); + }); + }); + }); + }); + }); + + it('should automatically scroll when navigating to a URL with a hash', function() { + var lastAnchor = anchors.last(); + var lastAnchorId = 'anchor-5'; + + // Make sure there is enough room to scroll the last anchor to the top + lastAnchor.getSize().then(function(size) { + var tempHeight = size.height - 10; + + execWithTempViewportHeight(tempHeight, function() { + // Test updating `$location.url()` from within the app + expect(lastAnchorId).not.toBeInViewport(); + + browser.setLocation('#' + lastAnchorId); + expect(lastAnchorId).toBeInViewport(); + expect(lastAnchorId).toHaveTop(yOffset); + + // Test navigating to the URL directly + scrollToTop(); + expect(lastAnchorId).not.toBeInViewport(); + + browser.refresh(); + expect(lastAnchorId).toBeInViewport(); + expect(lastAnchorId).toHaveTop(yOffset); + }); + }); + }); + + it('should not scroll "overzealously"', function() { + var lastButton = buttons.last(); + var lastAnchor = anchors.last(); + var lastAnchorId = 'anchor-5'; + + // Make sure there is not enough room to scroll the last anchor to the top + lastAnchor.getSize().then(function(size) { + var tempHeight = size.height + (yOffset / 2); + + execWithTempViewportHeight(tempHeight, function() { + scrollIntoView(lastAnchorId); + expect(lastAnchorId).toHaveTop(yOffset / 2); + + lastButton.click(); + expect(lastAnchorId).toBeInViewport(); + expect(lastAnchorId).toHaveTop(yOffset); + }); + }); + }); + }); + + // Helpers + function _script_getTop(id) { + var elem = document.getElementById(id); + var rect = elem.getBoundingClientRect(); + + return rect.top; + } + + function _script_isInViewport(id) { + var elem = document.getElementById(id); + var rect = elem.getBoundingClientRect(); + var docElem = document.documentElement; + + return (rect.top < docElem.clientHeight) && + (rect.bottom > 0) && + (rect.left < docElem.clientWidth) && + (rect.right > 0); + } + + function execWithTempViewportHeight(tempHeight, fn) { + setViewportHeight(tempHeight).then(function(oldHeight) { + fn(); + setViewportHeight(oldHeight); + }); + } + + function scrollIntoView(id) { + browser.driver.executeScript('document.getElementById("' + id + '").scrollIntoView()'); + } + + function scrollToTop() { + browser.driver.executeScript('window.scrollTo(0, 0)'); + } + + function setViewportHeight(newHeight) { + return browser.driver. + executeScript('return document.documentElement.clientHeight'). + then(function(oldHeight) { + var heightDiff = newHeight - oldHeight; + var win = browser.driver.manage().window(); + + return win.getSize().then(function(size) { + return win. + setSize(size.width, size.height + heightDiff). + then(function() { return oldHeight; }); + }); + }); + } +}); From 83bc2479675fd1e0e023c5be1dbcbeb2e2932c6d Mon Sep 17 00:00:00 2001 From: Georgios Kalpakas Date: Thu, 21 Jul 2016 12:37:47 +0300 Subject: [PATCH 0064/1173] docs(CHANGELOG.md): add release notes for v1.2.30 --- CHANGELOG.md | 56 +++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 55 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 9948288a5fef..d947900bdc3a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,56 @@ + +# 1.2.30 patronal-resurrection (2016-07-21) + + +_**Note:** This release contains some security fixes that required breaking changes. Since the +legacy 1.2.x branch is the only version branch that supports IE8, it was necessary to introduce a +couple of low-impact breaking changes in a patch release - something we generally avoid - in order +to make the fixes available to people that still need IE8 support._ + +## Bug Fixes + +- **$compile:** + - secure `link[href]` as a `RESOURCE_URL`s in `$sce` + ([f35f334b](https://github.com/angular/angular.js/commit/f35f334bd3197585bdf034f4b6d9ffa3122dac62), + [#14687](https://github.com/angular/angular.js/issues/14687)) + - properly sanitize `xlink:href` attribute interoplation + ([f2fa1ed8](https://github.com/angular/angular.js/commit/f2fa1ed83d18d4e79a36f8c0db1c2524d762e513), + [2687c261](https://github.com/angular/angular.js/commit/2687c26140585d9e3716f9f559390f5d8d598fdf)) +- **ngSanitize:** blacklist the attribute `usemap` as it can be used as a security exploit + ([ac0d5286](https://github.com/angular/angular.js/commit/ac0d5286b8931633d774080d6396fb4825d8be33), + [#14903](https://github.com/angular/angular.js/issues/14903)) +- **ngAnimate:** do not use event.timeStamp anymore for time tracking + ([8d83b563](https://github.com/angular/angular.js/commit/8d83b5633471c847d58f337426fe069797dd49d9), + [#13494](https://github.com/angular/angular.js/issues/13494), [#13495](https://github.com/angular/angular.js/issues/13495)) + + +## Breaking Changes + +- **$compile:** due to [f35f334b](https://github.com/angular/angular.js/commit/f35f334bd3197585bdf034f4b6d9ffa3122dac62), + +`link[href]` attributes are now protected via `$sce`, which prevents interpolated values that fail +the `RESOURCE_URL` context tests from being used in interpolation. For example if the application is +running at `https://mydomain.org/` then the following will fail: + +```html + +``` + +By default, `RESOURCE_URL` safe URLs are only allowed from the same domain and protocol as the +application document. To use URLs from other domains and/or protocols, you may either whitelist them +using `$sceDelegateProvider.resourceUrlWhitelist(...)` or wrap them into a trusted value by calling +`$sce.trustAsResourceUrl(url)`. + +- **ngSanitize:** due to [234053fc](https://github.com/angular/angular.js/commit/234053fc9ad90e0d05be7e8359c6af66be94c094), + +The `$sanitize` service will now remove instances of the `usemap` attribute from any elements passed +to it. + +This attribute is used to reference another element by `name` or `id`. Since the `name` and `id` +attributes are already blacklisted, a sanitized `usemap` attribute could only reference unsanitized +content, which is a security risk. + + # 1.5.7 hexagonal-circumvolution (2016-06-15) @@ -624,7 +677,8 @@ changes section for more information - **ngSanitize:** due to [234053fc](https://github.com/angular/angular.js/commit/234053fc9ad90e0d05be7e8359c6af66be94c094), -The `$sanitize` service will now remove instances of the `usemap` attribute from any elements passed to it. +The `$sanitize` service will now remove instances of the `usemap` attribute from any elements passed +to it. This attribute is used to reference another element by `name` or `id`. Since the `name` and `id` attributes are already blacklisted, a sanitized `usemap` attribute could only reference unsanitized From 228754fe96ae5613bf4b419605891e3be3e3f75f Mon Sep 17 00:00:00 2001 From: Peter Bacon Darwin Date: Fri, 22 Jul 2016 16:01:46 +0100 Subject: [PATCH 0065/1173] docs(CHANGELOG.md): add release notes for v1.5.8 --- CHANGELOG.md | 73 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 73 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index d947900bdc3a..3cdbd3480673 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,76 @@ + +# 1.5.8 arbitrary-fallbacks (2016-07-22) + + +## Bug Fixes + +- **$animate:** do not get affected by custom, enumerable properties on `Object.prototype` + ([181e4401](https://github.com/angular/angular.js/commit/181e44019e850e5253378e29415cddf8d768bbef), + [#14804](https://github.com/angular/angular.js/issues/14804), [#14830](https://github.com/angular/angular.js/issues/14830)) +- **$compile:** ensure `$doCheck` hooks can be defined in the controller constructor + ([3010ed4e](https://github.com/angular/angular.js/commit/3010ed4ee5c2c18b9848b5664639971b9fdc8919), + [#14811](https://github.com/angular/angular.js/issues/14811)) +- **$injector:** fix class detection RegExp + ([4724d56c](https://github.com/angular/angular.js/commit/4724d56c939d02675433e7fe554608dff97ecf81), + [#14533](https://github.com/angular/angular.js/issues/14533)) +- **$jsonpCallbacks:** do not overwrite callbacks added by other apps + ([1778d347](https://github.com/angular/angular.js/commit/1778d347cd3c91335e3840eaa49f1e387db8602f), + [#14824](https://github.com/angular/angular.js/issues/14824)) +- **$timeout:** make $flush handle new $timeouts added in $timeout callbacks + ([1a387ba5](https://github.com/angular/angular.js/commit/1a387ba5dd1a8a831486fce23f6795bd1eef3d8b), + [#5420](https://github.com/angular/angular.js/issues/5420), [#14686](https://github.com/angular/angular.js/issues/14686)) +- **copy:** fix handling of typed subarrays + ([1645924d](https://github.com/angular/angular.js/commit/1645924d49a7905ce55cced4c4276654970bb226), + [#14842](https://github.com/angular/angular.js/issues/14842), [#14845](https://github.com/angular/angular.js/issues/14845)) +- **modules:** allow modules to be loaded in any order when using `angular-loader` + ([98e4a220](https://github.com/angular/angular.js/commit/98e4a220fe8301cec35498ae592adc0266f12437), + [#9140](https://github.com/angular/angular.js/issues/9140), [#14794](https://github.com/angular/angular.js/issues/14794)) +- **ngAnimate:** allow removal of class that is scheduled to be added with requestAnimationFrame + ([7ccfe92b](https://github.com/angular/angular.js/commit/7ccfe92bed7361832f1b8d25b1a8411eb24d3fb5), + [#14582](https://github.com/angular/angular.js/issues/14582)) +- **ngMocks:** allow `ErrorAddingDeclarationLocationStack` to be recognized as an `Error` + ([c6074dc3](https://github.com/angular/angular.js/commit/c6074dc34c31a07269bf7f628b971ef6dc805f17), + [#13821](https://github.com/angular/angular.js/issues/13821), [#14344](https://github.com/angular/angular.js/issues/14344)) +- **ngOptions:** don't duplicate groups with falsy values + ([c3bfd7f5](https://github.com/angular/angular.js/commit/c3bfd7f59d0ecbf4ba3253fb407e683c7bb0766c)) +- **ngTransclude:** + - ensure that fallback content is compiled and linked correctly + ([c405f88b](https://github.com/angular/angular.js/commit/c405f88bbc743f41591f6f3cfc022eea3c6c34ad), + [#14787](https://github.com/angular/angular.js/issues/14787)) + - only compile fallback content if necessary + ([159a68ec](https://github.com/angular/angular.js/commit/159a68ec7ba77e9128b0d0516b813ed3d223b6e3), + [#14768](https://github.com/angular/angular.js/issues/14768), [#14765](https://github.com/angular/angular.js/issues/14765), [#14775](https://github.com/angular/angular.js/issues/14775)) + + +## Features + +- **$compile:** backport $doCheck + ([de59ca71](https://github.com/angular/angular.js/commit/de59ca71072eac95ee68de308f92bc5f921dd07b), + [#14656](https://github.com/angular/angular.js/issues/14656)) +- **$jsonpCallbacks:** new service to abstract how JSONP callbacks are handled + ([a8cacfe9](https://github.com/angular/angular.js/commit/a8cacfe938287c54ce7099125cb735ad53f4c7c2), + [#14795](https://github.com/angular/angular.js/issues/14795)) +- **$q:** implement $q.race + ([b9a56d58](https://github.com/angular/angular.js/commit/b9a56d588f8b597b1dff30d8e184b7c37d94cdcf), + [#12929](https://github.com/angular/angular.js/issues/12929), [#14757](https://github.com/angular/angular.js/issues/14757)) +- **$resource:** pass the resource to a dynamic param functions + ([a126fcfe](https://github.com/angular/angular.js/commit/a126fcfee3bd8b02869bd2542c73e1eb21afe927), + [#4899](https://github.com/angular/angular.js/issues/4899)) +- **$swipe:** add pointer support + ([f797f83c](https://github.com/angular/angular.js/commit/f797f83cd66f1fd11b3c9399e7894217ffa06c38), + [#14061](https://github.com/angular/angular.js/issues/14061), [#14791](https://github.com/angular/angular.js/issues/14791)) +- **filterFilter:** allow overwriting the special `$` property name + ([33514ec3](https://github.com/angular/angular.js/commit/33514ec384d676d84b2a445bc15bae38c8c3ac8d), + [#13313](https://github.com/angular/angular.js/issues/13313)) + + +## Performance Improvements + +- **$compile:** wrap try/catch of collect comment directives into a function to avoid V8 deopt + ([acd45518](https://github.com/angular/angular.js/commit/acd455181de1cfa6b34d75f8d71a6c0b6995a777), + [#14848](https://github.com/angular/angular.js/issues/14848)) + + # 1.2.30 patronal-resurrection (2016-07-21) From 95660555aacb4c66f4dacda70adbb2252d005b78 Mon Sep 17 00:00:00 2001 From: Martin Staffa Date: Fri, 15 Jul 2016 12:03:02 +0200 Subject: [PATCH 0066/1173] chore(npm): update protractor to 4.0.0 4.0.0 is the first version with Selenium 2.53.x, and we need that as lower versions have problems with current Firefox versions. See https://github.com/SeleniumHQ/selenium/issues/1202 and https://github.com/SeleniumHQ/selenium/issues/2110. We are currently running tests on FF28. As part of the update the deprecated webdriver fn getInnerHtml has been replaced with getAttribute('innerHTML') --- npm-shrinkwrap.clean.json | 665 ++++++++------ npm-shrinkwrap.json | 1671 ++++++++++++++++++++---------------- package.json | 2 +- src/ng/sce.js | 4 +- src/ngSanitize/sanitize.js | 12 +- 5 files changed, 1309 insertions(+), 1045 deletions(-) diff --git a/npm-shrinkwrap.clean.json b/npm-shrinkwrap.clean.json index aab6d85e2f55..5b8b094796fc 100644 --- a/npm-shrinkwrap.clean.json +++ b/npm-shrinkwrap.clean.json @@ -8180,380 +8180,483 @@ } }, "protractor": { - "version": "2.5.1", + "version": "4.0.0", "dependencies": { - "request": { - "version": "2.57.0", + "adm-zip": { + "version": "0.4.7" + }, + "chalk": { + "version": "1.1.3", "dependencies": { - "bl": { - "version": "0.9.5", + "ansi-styles": { + "version": "2.2.1" + }, + "escape-string-regexp": { + "version": "1.0.5" + }, + "has-ansi": { + "version": "2.0.0", "dependencies": { - "readable-stream": { - "version": "1.0.34", + "ansi-regex": { + "version": "2.0.0" + } + } + }, + "strip-ansi": { + "version": "3.0.1", + "dependencies": { + "ansi-regex": { + "version": "2.0.0" + } + } + }, + "supports-color": { + "version": "2.0.0" + } + } + }, + "glob": { + "version": "7.0.5", + "dependencies": { + "fs.realpath": { + "version": "1.0.0" + }, + "inflight": { + "version": "1.0.5", + "dependencies": { + "wrappy": { + "version": "1.0.2" + } + } + }, + "inherits": { + "version": "2.0.1" + }, + "minimatch": { + "version": "3.0.2", + "dependencies": { + "brace-expansion": { + "version": "1.1.5", "dependencies": { - "core-util-is": { - "version": "1.0.2" + "balanced-match": { + "version": "0.4.2" }, - "isarray": { + "concat-map": { "version": "0.0.1" - }, - "string_decoder": { - "version": "0.10.31" - }, - "inherits": { - "version": "2.0.1" } } } } }, - "caseless": { - "version": "0.10.0" + "once": { + "version": "1.3.3", + "dependencies": { + "wrappy": { + "version": "1.0.2" + } + } }, - "forever-agent": { - "version": "0.6.1" + "path-is-absolute": { + "version": "1.0.0" + } + } + }, + "jasmine": { + "version": "2.4.1", + "dependencies": { + "exit": { + "version": "0.1.2" }, - "form-data": { - "version": "0.2.0", + "glob": { + "version": "3.2.11", "dependencies": { - "async": { - "version": "0.9.2" + "inherits": { + "version": "2.0.1" }, - "combined-stream": { - "version": "0.0.7", + "minimatch": { + "version": "0.3.0", "dependencies": { - "delayed-stream": { - "version": "0.0.5" + "lru-cache": { + "version": "2.7.3" + }, + "sigmund": { + "version": "1.0.1" } } } } + } + } + }, + "jasminewd2": { + "version": "0.0.9" + }, + "optimist": { + "version": "0.6.1", + "dependencies": { + "wordwrap": { + "version": "0.0.3" }, - "json-stringify-safe": { - "version": "5.0.1" - }, - "mime-types": { - "version": "2.0.14", + "minimist": { + "version": "0.0.10" + } + } + }, + "q": { + "version": "1.4.1" + }, + "saucelabs": { + "version": "1.2.0", + "dependencies": { + "https-proxy-agent": { + "version": "1.0.0", "dependencies": { - "mime-db": { - "version": "1.12.0" + "agent-base": { + "version": "2.0.1", + "dependencies": { + "semver": { + "version": "5.0.3" + } + } + }, + "debug": { + "version": "2.2.0", + "dependencies": { + "ms": { + "version": "0.7.1" + } + } + }, + "extend": { + "version": "3.0.0" } } + } + } + }, + "selenium-webdriver": { + "version": "2.53.3", + "dependencies": { + "adm-zip": { + "version": "0.4.4" }, - "node-uuid": { - "version": "1.4.7" - }, - "qs": { - "version": "3.1.0" - }, - "tunnel-agent": { - "version": "0.4.3" + "rimraf": { + "version": "2.5.3" }, - "tough-cookie": { - "version": "2.2.2" + "tmp": { + "version": "0.0.24" }, - "http-signature": { - "version": "0.11.0", + "ws": { + "version": "1.1.1", "dependencies": { - "assert-plus": { - "version": "0.1.5" - }, - "asn1": { - "version": "0.1.11" + "options": { + "version": "0.0.6" }, - "ctype": { - "version": "0.5.3" + "ultron": { + "version": "1.0.2" } } }, - "oauth-sign": { - "version": "0.8.2" - }, - "hawk": { - "version": "2.3.1", + "xml2js": { + "version": "0.4.4", "dependencies": { - "hoek": { - "version": "2.16.3" - }, - "boom": { - "version": "2.10.1" - }, - "cryptiles": { - "version": "2.0.5" + "sax": { + "version": "0.6.1" }, - "sntp": { - "version": "1.0.9" + "xmlbuilder": { + "version": "8.2.2" } } - }, - "aws-sign2": { - "version": "0.5.0" - }, - "stringstream": { - "version": "0.0.5" - }, - "combined-stream": { - "version": "1.0.5", + } + } + }, + "source-map-support": { + "version": "0.4.2", + "dependencies": { + "source-map": { + "version": "0.1.32", "dependencies": { - "delayed-stream": { + "amdefine": { "version": "1.0.0" } } - }, - "isstream": { - "version": "0.1.2" - }, - "har-validator": { - "version": "1.8.0", + } + } + }, + "webdriver-manager": { + "version": "10.2.1", + "dependencies": { + "del": { + "version": "2.2.1", "dependencies": { - "bluebird": { - "version": "2.10.2" - }, - "chalk": { - "version": "1.1.3", + "globby": { + "version": "5.0.0", "dependencies": { - "ansi-styles": { - "version": "2.2.1" - }, - "escape-string-regexp": { - "version": "1.0.5" - }, - "has-ansi": { - "version": "2.0.0", - "dependencies": { - "ansi-regex": { - "version": "2.0.0" - } - } - }, - "strip-ansi": { - "version": "3.0.1", + "array-union": { + "version": "1.0.2", "dependencies": { - "ansi-regex": { - "version": "2.0.0" + "array-uniq": { + "version": "1.0.3" } } }, - "supports-color": { - "version": "2.0.0" - } - } - }, - "commander": { - "version": "2.9.0", - "dependencies": { - "graceful-readlink": { + "arrify": { "version": "1.0.1" } } }, - "is-my-json-valid": { - "version": "2.13.1", + "is-path-cwd": { + "version": "1.0.0" + }, + "is-path-in-cwd": { + "version": "1.0.0", "dependencies": { - "generate-function": { - "version": "2.0.0" - }, - "generate-object-property": { - "version": "1.2.0", + "is-path-inside": { + "version": "1.0.0", "dependencies": { - "is-property": { - "version": "1.0.2" + "path-is-inside": { + "version": "1.0.1" } } - }, - "jsonpointer": { - "version": "2.0.0" - }, - "xtend": { - "version": "4.0.1" + } + } + }, + "object-assign": { + "version": "4.1.0" + }, + "pify": { + "version": "2.3.0" + }, + "pinkie-promise": { + "version": "2.0.1", + "dependencies": { + "pinkie": { + "version": "2.0.4" } } } } - } - } - }, - "selenium-webdriver": { - "version": "2.47.0", - "dependencies": { - "rimraf": { - "version": "2.5.2", + }, + "ini": { + "version": "1.3.4" + }, + "minimist": { + "version": "1.2.0" + }, + "request": { + "version": "2.73.0", "dependencies": { - "glob": { - "version": "7.0.3", + "aws-sign2": { + "version": "0.6.0" + }, + "aws4": { + "version": "1.4.1" + }, + "bl": { + "version": "1.1.2", "dependencies": { - "inflight": { - "version": "1.0.4", + "readable-stream": { + "version": "2.0.6", "dependencies": { - "wrappy": { + "core-util-is": { + "version": "1.0.2" + }, + "inherits": { + "version": "2.0.1" + }, + "isarray": { + "version": "1.0.0" + }, + "process-nextick-args": { + "version": "1.0.7" + }, + "string_decoder": { + "version": "0.10.31" + }, + "util-deprecate": { + "version": "1.0.2" + } + } + } + } + }, + "caseless": { + "version": "0.11.0" + }, + "combined-stream": { + "version": "1.0.5", + "dependencies": { + "delayed-stream": { + "version": "1.0.0" + } + } + }, + "extend": { + "version": "3.0.0" + }, + "forever-agent": { + "version": "0.6.1" + }, + "form-data": { + "version": "1.0.0-rc4", + "dependencies": { + "async": { + "version": "1.5.2" + } + } + }, + "har-validator": { + "version": "2.0.6", + "dependencies": { + "commander": { + "version": "2.9.0", + "dependencies": { + "graceful-readlink": { "version": "1.0.1" } } }, - "inherits": { - "version": "2.0.1" - }, - "minimatch": { - "version": "3.0.0", + "is-my-json-valid": { + "version": "2.13.1", "dependencies": { - "brace-expansion": { - "version": "1.1.4", + "generate-function": { + "version": "2.0.0" + }, + "generate-object-property": { + "version": "1.2.0", "dependencies": { - "balanced-match": { - "version": "0.4.1" - }, - "concat-map": { - "version": "0.0.1" + "is-property": { + "version": "1.0.2" } } + }, + "jsonpointer": { + "version": "2.0.0" + }, + "xtend": { + "version": "4.0.1" } } }, - "once": { - "version": "1.3.3", + "pinkie-promise": { + "version": "2.0.1", "dependencies": { - "wrappy": { - "version": "1.0.1" + "pinkie": { + "version": "2.0.4" } } - }, - "path-is-absolute": { - "version": "1.0.0" } } - } - } - }, - "tmp": { - "version": "0.0.24" - }, - "ws": { - "version": "0.8.1", - "dependencies": { - "options": { - "version": "0.0.6" }, - "ultron": { - "version": "1.0.2" - } - } - }, - "xml2js": { - "version": "0.4.4", - "dependencies": { - "sax": { - "version": "0.6.1" + "hawk": { + "version": "3.1.3", + "dependencies": { + "hoek": { + "version": "2.16.3" + }, + "boom": { + "version": "2.10.1" + }, + "cryptiles": { + "version": "2.0.5" + }, + "sntp": { + "version": "1.0.9" + } + } }, - "xmlbuilder": { - "version": "8.2.2" - } - } - } - } - }, - "minijasminenode": { - "version": "1.1.1" - }, - "jasminewd": { - "version": "1.1.0" - }, - "jasminewd2": { - "version": "0.0.6" - }, - "jasmine": { - "version": "2.3.2", - "dependencies": { - "exit": { - "version": "0.1.2" - }, - "jasmine-core": { - "version": "2.3.4" - } - } - }, - "saucelabs": { - "version": "1.0.1", - "dependencies": { - "https-proxy-agent": { - "version": "1.0.0", - "dependencies": { - "agent-base": { - "version": "2.0.1", + "http-signature": { + "version": "1.1.1", "dependencies": { - "semver": { - "version": "5.0.3" + "assert-plus": { + "version": "0.2.0" + }, + "jsprim": { + "version": "1.3.0", + "dependencies": { + "extsprintf": { + "version": "1.0.2" + }, + "json-schema": { + "version": "0.2.2" + }, + "verror": { + "version": "1.3.6" + } + } + }, + "sshpk": { + "version": "1.8.3", + "dependencies": { + "asn1": { + "version": "0.2.3" + }, + "assert-plus": { + "version": "1.0.0" + }, + "dashdash": { + "version": "1.14.0" + }, + "getpass": { + "version": "0.1.6" + }, + "jsbn": { + "version": "0.1.0" + }, + "tweetnacl": { + "version": "0.13.3" + }, + "jodid25519": { + "version": "1.0.2" + }, + "ecc-jsbn": { + "version": "0.1.1" + } + } } } }, - "debug": { - "version": "2.2.0", + "is-typedarray": { + "version": "1.0.0" + }, + "isstream": { + "version": "0.1.2" + }, + "json-stringify-safe": { + "version": "5.0.1" + }, + "mime-types": { + "version": "2.1.11", "dependencies": { - "ms": { - "version": "0.7.1" + "mime-db": { + "version": "1.23.0" } } }, - "extend": { - "version": "3.0.0" - } - } - } - } - }, - "glob": { - "version": "3.2.11", - "dependencies": { - "inherits": { - "version": "2.0.1" - }, - "minimatch": { - "version": "0.3.0", - "dependencies": { - "lru-cache": { - "version": "2.7.3" + "node-uuid": { + "version": "1.4.7" }, - "sigmund": { - "version": "1.0.1" + "oauth-sign": { + "version": "0.8.2" + }, + "qs": { + "version": "6.2.0" + }, + "stringstream": { + "version": "0.0.5" + }, + "tough-cookie": { + "version": "2.2.2" + }, + "tunnel-agent": { + "version": "0.4.3" } } - } - } - }, - "adm-zip": { - "version": "0.4.4" - }, - "optimist": { - "version": "0.6.1", - "dependencies": { - "wordwrap": { - "version": "0.0.3" }, - "minimist": { - "version": "0.0.10" - } - } - }, - "q": { - "version": "1.0.0" - }, - "source-map-support": { - "version": "0.2.10", - "dependencies": { - "source-map": { - "version": "0.1.32", - "dependencies": { - "amdefine": { - "version": "1.0.0" - } - } + "rimraf": { + "version": "2.5.3" } } - }, - "html-entities": { - "version": "1.1.3" - }, - "accessibility-developer-tools": { - "version": "2.6.0" } } }, diff --git a/npm-shrinkwrap.json b/npm-shrinkwrap.json index 4e90103d37af..6fed3f3ec309 100644 --- a/npm-shrinkwrap.json +++ b/npm-shrinkwrap.json @@ -8,243 +8,243 @@ "dependencies": { "bootstrap": { "version": "3.3.6", - "from": "bootstrap@>=3.2.0 <4.0.0", + "from": "https://registry.npmjs.org/bootstrap/-/bootstrap-3.3.6.tgz", "resolved": "https://registry.npmjs.org/bootstrap/-/bootstrap-3.3.6.tgz" }, "express": { "version": "4.14.0", - "from": "express@>=4.8.6 <5.0.0", + "from": "https://registry.npmjs.org/express/-/express-4.14.0.tgz", "resolved": "https://registry.npmjs.org/express/-/express-4.14.0.tgz", "dependencies": { "accepts": { "version": "1.3.3", - "from": "accepts@>=1.3.3 <1.4.0", + "from": "https://registry.npmjs.org/accepts/-/accepts-1.3.3.tgz", "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.3.tgz", "dependencies": { "mime-types": { "version": "2.1.11", - "from": "mime-types@>=2.1.11 <2.2.0", + "from": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.11.tgz", "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.11.tgz", "dependencies": { "mime-db": { "version": "1.23.0", - "from": "mime-db@>=1.23.0 <1.24.0", + "from": "https://registry.npmjs.org/mime-db/-/mime-db-1.23.0.tgz", "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.23.0.tgz" } } }, "negotiator": { "version": "0.6.1", - "from": "negotiator@0.6.1", + "from": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.1.tgz", "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.1.tgz" } } }, "array-flatten": { "version": "1.1.1", - "from": "array-flatten@1.1.1", + "from": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz" }, "content-disposition": { "version": "0.5.1", - "from": "content-disposition@0.5.1", + "from": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.1.tgz", "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.1.tgz" }, "content-type": { "version": "1.0.2", - "from": "content-type@>=1.0.2 <1.1.0", + "from": "https://registry.npmjs.org/content-type/-/content-type-1.0.2.tgz", "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.2.tgz" }, "cookie": { "version": "0.3.1", - "from": "cookie@0.3.1", + "from": "https://registry.npmjs.org/cookie/-/cookie-0.3.1.tgz", "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.3.1.tgz" }, "cookie-signature": { "version": "1.0.6", - "from": "cookie-signature@1.0.6", + "from": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz" }, "debug": { "version": "2.2.0", - "from": "debug@>=2.2.0 <2.3.0", + "from": "https://registry.npmjs.org/debug/-/debug-2.2.0.tgz", "resolved": "https://registry.npmjs.org/debug/-/debug-2.2.0.tgz", "dependencies": { "ms": { "version": "0.7.1", - "from": "ms@0.7.1", + "from": "https://registry.npmjs.org/ms/-/ms-0.7.1.tgz", "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.1.tgz" } } }, "depd": { "version": "1.1.0", - "from": "depd@>=1.1.0 <1.2.0", + "from": "https://registry.npmjs.org/depd/-/depd-1.1.0.tgz", "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.0.tgz" }, "encodeurl": { "version": "1.0.1", - "from": "encodeurl@>=1.0.1 <1.1.0", + "from": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.1.tgz", "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.1.tgz" }, "escape-html": { "version": "1.0.3", - "from": "escape-html@>=1.0.3 <1.1.0", + "from": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz" }, "etag": { "version": "1.7.0", - "from": "etag@>=1.7.0 <1.8.0", + "from": "https://registry.npmjs.org/etag/-/etag-1.7.0.tgz", "resolved": "https://registry.npmjs.org/etag/-/etag-1.7.0.tgz" }, "finalhandler": { "version": "0.5.0", - "from": "finalhandler@0.5.0", + "from": "https://registry.npmjs.org/finalhandler/-/finalhandler-0.5.0.tgz", "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-0.5.0.tgz", "dependencies": { "statuses": { "version": "1.3.0", - "from": "statuses@>=1.3.0 <1.4.0", + "from": "https://registry.npmjs.org/statuses/-/statuses-1.3.0.tgz", "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.3.0.tgz" }, "unpipe": { "version": "1.0.0", - "from": "unpipe@>=1.0.0 <1.1.0", + "from": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz" } } }, "fresh": { "version": "0.3.0", - "from": "fresh@0.3.0", + "from": "https://registry.npmjs.org/fresh/-/fresh-0.3.0.tgz", "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.3.0.tgz" }, "merge-descriptors": { "version": "1.0.1", - "from": "merge-descriptors@1.0.1", + "from": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz" }, "methods": { "version": "1.1.2", - "from": "methods@>=1.1.2 <1.2.0", + "from": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz" }, "on-finished": { "version": "2.3.0", - "from": "on-finished@>=2.3.0 <2.4.0", + "from": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", "dependencies": { "ee-first": { "version": "1.1.1", - "from": "ee-first@1.1.1", + "from": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz" } } }, "parseurl": { "version": "1.3.1", - "from": "parseurl@>=1.3.1 <1.4.0", + "from": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.1.tgz", "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.1.tgz" }, "path-to-regexp": { "version": "0.1.7", - "from": "path-to-regexp@0.1.7", + "from": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz" }, "proxy-addr": { "version": "1.1.2", - "from": "proxy-addr@>=1.1.2 <1.2.0", + "from": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-1.1.2.tgz", "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-1.1.2.tgz", "dependencies": { "forwarded": { "version": "0.1.0", - "from": "forwarded@>=0.1.0 <0.2.0", + "from": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.0.tgz", "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.0.tgz" }, "ipaddr.js": { "version": "1.1.1", - "from": "ipaddr.js@1.1.1", + "from": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.1.1.tgz", "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.1.1.tgz" } } }, "qs": { "version": "6.2.0", - "from": "qs@6.2.0", + "from": "https://registry.npmjs.org/qs/-/qs-6.2.0.tgz", "resolved": "https://registry.npmjs.org/qs/-/qs-6.2.0.tgz" }, "range-parser": { "version": "1.2.0", - "from": "range-parser@>=1.2.0 <1.3.0", + "from": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.0.tgz", "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.0.tgz" }, "send": { "version": "0.14.1", - "from": "send@0.14.1", + "from": "https://registry.npmjs.org/send/-/send-0.14.1.tgz", "resolved": "https://registry.npmjs.org/send/-/send-0.14.1.tgz", "dependencies": { "destroy": { "version": "1.0.4", - "from": "destroy@>=1.0.4 <1.1.0", + "from": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz" }, "http-errors": { "version": "1.5.0", - "from": "http-errors@>=1.5.0 <1.6.0", + "from": "https://registry.npmjs.org/http-errors/-/http-errors-1.5.0.tgz", "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.5.0.tgz", "dependencies": { "inherits": { "version": "2.0.1", - "from": "inherits@2.0.1", + "from": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz" }, "setprototypeof": { "version": "1.0.1", - "from": "setprototypeof@1.0.1", + "from": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.0.1.tgz", "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.0.1.tgz" } } }, "mime": { "version": "1.3.4", - "from": "mime@1.3.4", + "from": "https://registry.npmjs.org/mime/-/mime-1.3.4.tgz", "resolved": "https://registry.npmjs.org/mime/-/mime-1.3.4.tgz" }, "ms": { "version": "0.7.1", - "from": "ms@0.7.1", + "from": "https://registry.npmjs.org/ms/-/ms-0.7.1.tgz", "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.1.tgz" }, "statuses": { "version": "1.3.0", - "from": "statuses@>=1.3.0 <1.4.0", + "from": "https://registry.npmjs.org/statuses/-/statuses-1.3.0.tgz", "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.3.0.tgz" } } }, "serve-static": { "version": "1.11.1", - "from": "serve-static@>=1.11.1 <1.12.0", + "from": "https://registry.npmjs.org/serve-static/-/serve-static-1.11.1.tgz", "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.11.1.tgz" }, "type-is": { "version": "1.6.13", - "from": "type-is@>=1.6.13 <1.7.0", + "from": "https://registry.npmjs.org/type-is/-/type-is-1.6.13.tgz", "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.13.tgz", "dependencies": { "media-typer": { "version": "0.3.0", - "from": "media-typer@0.3.0", + "from": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz" }, "mime-types": { "version": "2.1.11", - "from": "mime-types@>=2.1.11 <2.2.0", + "from": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.11.tgz", "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.11.tgz", "dependencies": { "mime-db": { "version": "1.23.0", - "from": "mime-db@>=1.23.0 <1.24.0", + "from": "https://registry.npmjs.org/mime-db/-/mime-db-1.23.0.tgz", "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.23.0.tgz" } } @@ -253,83 +253,83 @@ }, "utils-merge": { "version": "1.0.0", - "from": "utils-merge@1.0.0", + "from": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.0.tgz", "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.0.tgz" }, "vary": { "version": "1.1.0", - "from": "vary@>=1.1.0 <1.2.0", + "from": "https://registry.npmjs.org/vary/-/vary-1.1.0.tgz", "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.0.tgz" } } }, "minimist": { "version": "1.2.0", - "from": "minimist@>=1.1.0 <2.0.0", + "from": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz" }, "mkdirp": { "version": "0.5.1", - "from": "mkdirp@>=0.5.0 <0.6.0", + "from": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", "dependencies": { "minimist": { "version": "0.0.8", - "from": "minimist@0.0.8", + "from": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz" } } }, "rimraf": { "version": "2.5.3", - "from": "rimraf@>=2.2.8 <3.0.0", + "from": "https://registry.npmjs.org/rimraf/-/rimraf-2.5.3.tgz", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.5.3.tgz", "dependencies": { "glob": { "version": "7.0.5", - "from": "glob@>=7.0.5 <8.0.0", + "from": "https://registry.npmjs.org/glob/-/glob-7.0.5.tgz", "resolved": "https://registry.npmjs.org/glob/-/glob-7.0.5.tgz", "dependencies": { "fs.realpath": { "version": "1.0.0", - "from": "fs.realpath@>=1.0.0 <2.0.0", + "from": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz" }, "inflight": { "version": "1.0.5", - "from": "inflight@>=1.0.4 <2.0.0", + "from": "https://registry.npmjs.org/inflight/-/inflight-1.0.5.tgz", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.5.tgz", "dependencies": { "wrappy": { "version": "1.0.2", - "from": "wrappy@>=1.0.0 <2.0.0", + "from": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz" } } }, "inherits": { "version": "2.0.1", - "from": "inherits@>=2.0.0 <3.0.0", + "from": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz" }, "minimatch": { "version": "3.0.2", - "from": "minimatch@>=3.0.2 <4.0.0", + "from": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.2.tgz", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.2.tgz", "dependencies": { "brace-expansion": { "version": "1.1.5", - "from": "brace-expansion@>=1.0.0 <2.0.0", + "from": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.5.tgz", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.5.tgz", "dependencies": { "balanced-match": { "version": "0.4.1", - "from": "balanced-match@>=0.4.1 <0.5.0", + "from": "https://registry.npmjs.org/balanced-match/-/balanced-match-0.4.1.tgz", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-0.4.1.tgz" }, "concat-map": { "version": "0.0.1", - "from": "concat-map@0.0.1", + "from": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz" } } @@ -338,19 +338,19 @@ }, "once": { "version": "1.3.3", - "from": "once@>=1.3.0 <2.0.0", + "from": "https://registry.npmjs.org/once/-/once-1.3.3.tgz", "resolved": "https://registry.npmjs.org/once/-/once-1.3.3.tgz", "dependencies": { "wrappy": { "version": "1.0.2", - "from": "wrappy@>=1.0.0 <2.0.0", + "from": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz" } } }, "path-is-absolute": { "version": "1.0.0", - "from": "path-is-absolute@>=1.0.0 <2.0.0", + "from": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.0.tgz", "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.0.tgz" } } @@ -359,69 +359,69 @@ }, "underscore": { "version": "1.8.3", - "from": "underscore@>=1.6.0 <2.0.0", + "from": "https://registry.npmjs.org/underscore/-/underscore-1.8.3.tgz", "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.8.3.tgz" }, "di": { "version": "2.0.0-pre-9", - "from": "di@>=2.0.0-pre-9 <2.1.0", + "from": "https://registry.npmjs.org/di/-/di-2.0.0-pre-9.tgz", "resolved": "https://registry.npmjs.org/di/-/di-2.0.0-pre-9.tgz", "dependencies": { "traceur": { "version": "0.0.33", - "from": "vojtajina/traceur-compiler#add-es6-pure-transformer-dist", + "from": "git://github.com/vojtajina/traceur-compiler.git#d90b1e34c799bf61cd1aafdc33db0a554fa9e617", "resolved": "git://github.com/vojtajina/traceur-compiler.git#d90b1e34c799bf61cd1aafdc33db0a554fa9e617", "dependencies": { "commander": { "version": "2.9.0", - "from": "commander@>=1.1.0", + "from": "https://registry.npmjs.org/commander/-/commander-2.9.0.tgz", "resolved": "https://registry.npmjs.org/commander/-/commander-2.9.0.tgz", "dependencies": { "graceful-readlink": { "version": "1.0.1", - "from": "graceful-readlink@>=1.0.0", + "from": "https://registry.npmjs.org/graceful-readlink/-/graceful-readlink-1.0.1.tgz", "resolved": "https://registry.npmjs.org/graceful-readlink/-/graceful-readlink-1.0.1.tgz" } } }, "q-io": { "version": "1.10.9", - "from": "q-io@>=1.10.6 <1.11.0", + "from": "https://registry.npmjs.org/q-io/-/q-io-1.10.9.tgz", "resolved": "https://registry.npmjs.org/q-io/-/q-io-1.10.9.tgz", "dependencies": { "q": { "version": "0.9.7", - "from": "q@>=0.9.7 <0.10.0", + "from": "https://registry.npmjs.org/q/-/q-0.9.7.tgz", "resolved": "https://registry.npmjs.org/q/-/q-0.9.7.tgz" }, "qs": { "version": "0.1.0", - "from": "qs@>=0.1.0 <0.2.0", + "from": "https://registry.npmjs.org/qs/-/qs-0.1.0.tgz", "resolved": "https://registry.npmjs.org/qs/-/qs-0.1.0.tgz" }, "url2": { "version": "0.0.0", - "from": "url2@>=0.0.0 <0.1.0", + "from": "https://registry.npmjs.org/url2/-/url2-0.0.0.tgz", "resolved": "https://registry.npmjs.org/url2/-/url2-0.0.0.tgz" }, "mime": { "version": "1.2.11", - "from": "mime@>=1.2.11 <1.3.0", + "from": "https://registry.npmjs.org/mime/-/mime-1.2.11.tgz", "resolved": "https://registry.npmjs.org/mime/-/mime-1.2.11.tgz" }, "mimeparse": { "version": "0.1.4", - "from": "mimeparse@>=0.1.4 <0.2.0", + "from": "https://registry.npmjs.org/mimeparse/-/mimeparse-0.1.4.tgz", "resolved": "https://registry.npmjs.org/mimeparse/-/mimeparse-0.1.4.tgz" }, "collections": { "version": "0.2.2", - "from": "collections@>=0.2.0 <0.3.0", + "from": "https://registry.npmjs.org/collections/-/collections-0.2.2.tgz", "resolved": "https://registry.npmjs.org/collections/-/collections-0.2.2.tgz", "dependencies": { "weak-map": { "version": "1.0.0", - "from": "weak-map@1.0.0", + "from": "https://registry.npmjs.org/weak-map/-/weak-map-1.0.0.tgz", "resolved": "https://registry.npmjs.org/weak-map/-/weak-map-1.0.0.tgz" } } @@ -432,66 +432,66 @@ }, "es6-shim": { "version": "0.9.3", - "from": "es6-shim@>=0.9.2 <0.10.0", + "from": "https://registry.npmjs.org/es6-shim/-/es6-shim-0.9.3.tgz", "resolved": "https://registry.npmjs.org/es6-shim/-/es6-shim-0.9.3.tgz" } } }, "rx": { "version": "2.3.25", - "from": "rx@>=2.3.20 <2.4.0", + "from": "https://registry.npmjs.org/rx/-/rx-2.3.25.tgz", "resolved": "https://registry.npmjs.org/rx/-/rx-2.3.25.tgz" }, "browserify": { "version": "7.0.3", - "from": "browserify@>=7.0.0 <7.1.0", + "from": "https://registry.npmjs.org/browserify/-/browserify-7.0.3.tgz", "resolved": "https://registry.npmjs.org/browserify/-/browserify-7.0.3.tgz", "dependencies": { "JSONStream": { "version": "0.8.4", - "from": "JSONStream@>=0.8.3 <0.9.0", + "from": "https://registry.npmjs.org/JSONStream/-/JSONStream-0.8.4.tgz", "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-0.8.4.tgz", "dependencies": { "jsonparse": { "version": "0.0.5", - "from": "jsonparse@0.0.5", + "from": "https://registry.npmjs.org/jsonparse/-/jsonparse-0.0.5.tgz", "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-0.0.5.tgz" }, "through": { "version": "2.3.8", - "from": "through@>=2.2.7 <3.0.0", + "from": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz" } } }, "assert": { "version": "1.1.2", - "from": "assert@>=1.1.0 <1.2.0", + "from": "https://registry.npmjs.org/assert/-/assert-1.1.2.tgz", "resolved": "https://registry.npmjs.org/assert/-/assert-1.1.2.tgz" }, "browser-pack": { "version": "3.2.0", - "from": "browser-pack@>=3.2.0 <4.0.0", + "from": "https://registry.npmjs.org/browser-pack/-/browser-pack-3.2.0.tgz", "resolved": "https://registry.npmjs.org/browser-pack/-/browser-pack-3.2.0.tgz", "dependencies": { "combine-source-map": { "version": "0.3.0", - "from": "combine-source-map@>=0.3.0 <0.4.0", + "from": "https://registry.npmjs.org/combine-source-map/-/combine-source-map-0.3.0.tgz", "resolved": "https://registry.npmjs.org/combine-source-map/-/combine-source-map-0.3.0.tgz", "dependencies": { "inline-source-map": { "version": "0.3.1", - "from": "inline-source-map@>=0.3.0 <0.4.0", + "from": "https://registry.npmjs.org/inline-source-map/-/inline-source-map-0.3.1.tgz", "resolved": "https://registry.npmjs.org/inline-source-map/-/inline-source-map-0.3.1.tgz", "dependencies": { "source-map": { "version": "0.3.0", - "from": "source-map@>=0.3.0 <0.4.0", + "from": "https://registry.npmjs.org/source-map/-/source-map-0.3.0.tgz", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.3.0.tgz", "dependencies": { "amdefine": { "version": "1.0.0", - "from": "amdefine@>=0.0.4", + "from": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.0.tgz", "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.0.tgz" } } @@ -500,17 +500,17 @@ }, "convert-source-map": { "version": "0.3.5", - "from": "convert-source-map@>=0.3.0 <0.4.0", + "from": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-0.3.5.tgz", "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-0.3.5.tgz" }, "source-map": { "version": "0.1.43", - "from": "source-map@>=0.1.31 <0.2.0", + "from": "https://registry.npmjs.org/source-map/-/source-map-0.1.43.tgz", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.1.43.tgz", "dependencies": { "amdefine": { "version": "1.0.0", - "from": "amdefine@>=0.0.4", + "from": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.0.tgz", "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.0.tgz" } } @@ -519,17 +519,17 @@ }, "through2": { "version": "0.5.1", - "from": "through2@>=0.5.1 <0.6.0", + "from": "https://registry.npmjs.org/through2/-/through2-0.5.1.tgz", "resolved": "https://registry.npmjs.org/through2/-/through2-0.5.1.tgz", "dependencies": { "readable-stream": { "version": "1.0.34", - "from": "readable-stream@>=1.0.17 <1.1.0", + "from": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", "dependencies": { "core-util-is": { "version": "1.0.2", - "from": "core-util-is@>=1.0.0 <1.1.0", + "from": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz" } } @@ -540,134 +540,134 @@ }, "browser-resolve": { "version": "1.11.2", - "from": "browser-resolve@>=1.3.0 <2.0.0", + "from": "https://registry.npmjs.org/browser-resolve/-/browser-resolve-1.11.2.tgz", "resolved": "https://registry.npmjs.org/browser-resolve/-/browser-resolve-1.11.2.tgz", "dependencies": { "resolve": { "version": "1.1.7", - "from": "resolve@1.1.7", + "from": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz" } } }, "browserify-zlib": { "version": "0.1.4", - "from": "browserify-zlib@>=0.1.2 <0.2.0", + "from": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.1.4.tgz", "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.1.4.tgz", "dependencies": { "pako": { "version": "0.2.8", - "from": "pako@>=0.2.0 <0.3.0", + "from": "https://registry.npmjs.org/pako/-/pako-0.2.8.tgz", "resolved": "https://registry.npmjs.org/pako/-/pako-0.2.8.tgz" } } }, "buffer": { "version": "2.8.2", - "from": "buffer@>=2.3.0 <3.0.0", + "from": "https://registry.npmjs.org/buffer/-/buffer-2.8.2.tgz", "resolved": "https://registry.npmjs.org/buffer/-/buffer-2.8.2.tgz", "dependencies": { "base64-js": { "version": "0.0.7", - "from": "base64-js@0.0.7", + "from": "https://registry.npmjs.org/base64-js/-/base64-js-0.0.7.tgz", "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-0.0.7.tgz" }, "ieee754": { "version": "1.1.6", - "from": "ieee754@>=1.1.4 <2.0.0", + "from": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.6.tgz", "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.6.tgz" }, "is-array": { "version": "1.0.1", - "from": "is-array@>=1.0.1 <2.0.0", + "from": "https://registry.npmjs.org/is-array/-/is-array-1.0.1.tgz", "resolved": "https://registry.npmjs.org/is-array/-/is-array-1.0.1.tgz" } } }, "builtins": { "version": "0.0.7", - "from": "builtins@>=0.0.3 <0.1.0", + "from": "https://registry.npmjs.org/builtins/-/builtins-0.0.7.tgz", "resolved": "https://registry.npmjs.org/builtins/-/builtins-0.0.7.tgz" }, "commondir": { "version": "0.0.1", - "from": "commondir@0.0.1", + "from": "https://registry.npmjs.org/commondir/-/commondir-0.0.1.tgz", "resolved": "https://registry.npmjs.org/commondir/-/commondir-0.0.1.tgz" }, "concat-stream": { "version": "1.4.10", - "from": "concat-stream@>=1.4.1 <1.5.0", + "from": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.4.10.tgz", "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.4.10.tgz", "dependencies": { "typedarray": { "version": "0.0.6", - "from": "typedarray@>=0.0.5 <0.1.0", + "from": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz" } } }, "console-browserify": { "version": "1.1.0", - "from": "console-browserify@>=1.1.0 <2.0.0", + "from": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.1.0.tgz", "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.1.0.tgz", "dependencies": { "date-now": { "version": "0.1.4", - "from": "date-now@>=0.1.4 <0.2.0", + "from": "https://registry.npmjs.org/date-now/-/date-now-0.1.4.tgz", "resolved": "https://registry.npmjs.org/date-now/-/date-now-0.1.4.tgz" } } }, "constants-browserify": { "version": "0.0.1", - "from": "constants-browserify@>=0.0.1 <0.1.0", + "from": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-0.0.1.tgz", "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-0.0.1.tgz" }, "crypto-browserify": { "version": "3.11.0", - "from": "crypto-browserify@>=3.0.0 <4.0.0", + "from": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.11.0.tgz", "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.11.0.tgz", "dependencies": { "browserify-cipher": { "version": "1.0.0", - "from": "browserify-cipher@>=1.0.0 <2.0.0", + "from": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.0.tgz", "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.0.tgz", "dependencies": { "browserify-aes": { "version": "1.0.6", - "from": "browserify-aes@>=1.0.4 <2.0.0", + "from": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.0.6.tgz", "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.0.6.tgz", "dependencies": { "buffer-xor": { "version": "1.0.3", - "from": "buffer-xor@>=1.0.2 <2.0.0", + "from": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz" }, "cipher-base": { "version": "1.0.2", - "from": "cipher-base@>=1.0.0 <2.0.0", + "from": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.2.tgz", "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.2.tgz" } } }, "browserify-des": { "version": "1.0.0", - "from": "browserify-des@>=1.0.0 <2.0.0", + "from": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.0.tgz", "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.0.tgz", "dependencies": { "cipher-base": { "version": "1.0.2", - "from": "cipher-base@>=1.0.1 <2.0.0", + "from": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.2.tgz", "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.2.tgz" }, "des.js": { "version": "1.0.0", - "from": "des.js@>=1.0.0 <2.0.0", + "from": "https://registry.npmjs.org/des.js/-/des.js-1.0.0.tgz", "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.0.tgz", "dependencies": { "minimalistic-assert": { "version": "1.0.0", - "from": "minimalistic-assert@>=1.0.0 <2.0.0", + "from": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.0.tgz", "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.0.tgz" } } @@ -676,80 +676,80 @@ }, "evp_bytestokey": { "version": "1.0.0", - "from": "evp_bytestokey@>=1.0.0 <2.0.0", + "from": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.0.tgz", "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.0.tgz" } } }, "browserify-sign": { "version": "4.0.0", - "from": "browserify-sign@>=4.0.0 <5.0.0", + "from": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.0.0.tgz", "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.0.0.tgz", "dependencies": { "bn.js": { "version": "4.11.4", - "from": "bn.js@>=4.1.1 <5.0.0", + "from": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.4.tgz", "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.4.tgz" }, "browserify-rsa": { "version": "4.0.1", - "from": "browserify-rsa@>=4.0.0 <5.0.0", + "from": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.0.1.tgz", "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.0.1.tgz" }, "elliptic": { "version": "6.3.1", - "from": "elliptic@>=6.0.0 <7.0.0", + "from": "https://registry.npmjs.org/elliptic/-/elliptic-6.3.1.tgz", "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.3.1.tgz", "dependencies": { "brorand": { "version": "1.0.5", - "from": "brorand@>=1.0.1 <2.0.0", + "from": "https://registry.npmjs.org/brorand/-/brorand-1.0.5.tgz", "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.0.5.tgz" }, "hash.js": { "version": "1.0.3", - "from": "hash.js@>=1.0.0 <2.0.0", + "from": "https://registry.npmjs.org/hash.js/-/hash.js-1.0.3.tgz", "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.0.3.tgz" } } }, "parse-asn1": { "version": "5.0.0", - "from": "parse-asn1@>=5.0.0 <6.0.0", + "from": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.0.0.tgz", "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.0.0.tgz", "dependencies": { "asn1.js": { "version": "4.6.2", - "from": "asn1.js@>=4.0.0 <5.0.0", + "from": "https://registry.npmjs.org/asn1.js/-/asn1.js-4.6.2.tgz", "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-4.6.2.tgz", "dependencies": { "minimalistic-assert": { "version": "1.0.0", - "from": "minimalistic-assert@>=1.0.0 <2.0.0", + "from": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.0.tgz", "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.0.tgz" } } }, "browserify-aes": { "version": "1.0.6", - "from": "browserify-aes@>=1.0.0 <2.0.0", + "from": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.0.6.tgz", "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.0.6.tgz", "dependencies": { "buffer-xor": { "version": "1.0.3", - "from": "buffer-xor@>=1.0.2 <2.0.0", + "from": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz" }, "cipher-base": { "version": "1.0.2", - "from": "cipher-base@>=1.0.0 <2.0.0", + "from": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.2.tgz", "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.2.tgz" } } }, "evp_bytestokey": { "version": "1.0.0", - "from": "evp_bytestokey@>=1.0.0 <2.0.0", + "from": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.0.tgz", "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.0.tgz" } } @@ -758,27 +758,27 @@ }, "create-ecdh": { "version": "4.0.0", - "from": "create-ecdh@>=4.0.0 <5.0.0", + "from": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.0.tgz", "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.0.tgz", "dependencies": { "bn.js": { "version": "4.11.4", - "from": "bn.js@>=4.1.0 <5.0.0", + "from": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.4.tgz", "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.4.tgz" }, "elliptic": { "version": "6.3.1", - "from": "elliptic@>=6.0.0 <7.0.0", + "from": "https://registry.npmjs.org/elliptic/-/elliptic-6.3.1.tgz", "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.3.1.tgz", "dependencies": { "brorand": { "version": "1.0.5", - "from": "brorand@>=1.0.1 <2.0.0", + "from": "https://registry.npmjs.org/brorand/-/brorand-1.0.5.tgz", "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.0.5.tgz" }, "hash.js": { "version": "1.0.3", - "from": "hash.js@>=1.0.0 <2.0.0", + "from": "https://registry.npmjs.org/hash.js/-/hash.js-1.0.3.tgz", "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.0.3.tgz" } } @@ -787,49 +787,49 @@ }, "create-hash": { "version": "1.1.2", - "from": "create-hash@>=1.1.0 <2.0.0", + "from": "https://registry.npmjs.org/create-hash/-/create-hash-1.1.2.tgz", "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.1.2.tgz", "dependencies": { "cipher-base": { "version": "1.0.2", - "from": "cipher-base@>=1.0.1 <2.0.0", + "from": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.2.tgz", "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.2.tgz" }, "ripemd160": { "version": "1.0.1", - "from": "ripemd160@>=1.0.0 <2.0.0", + "from": "https://registry.npmjs.org/ripemd160/-/ripemd160-1.0.1.tgz", "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-1.0.1.tgz" }, "sha.js": { "version": "2.4.5", - "from": "sha.js@>=2.3.6 <3.0.0", + "from": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.5.tgz", "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.5.tgz" } } }, "create-hmac": { "version": "1.1.4", - "from": "create-hmac@>=1.1.0 <2.0.0", + "from": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.4.tgz", "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.4.tgz" }, "diffie-hellman": { "version": "5.0.2", - "from": "diffie-hellman@>=5.0.0 <6.0.0", + "from": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.2.tgz", "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.2.tgz", "dependencies": { "bn.js": { "version": "4.11.4", - "from": "bn.js@>=4.1.0 <5.0.0", + "from": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.4.tgz", "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.4.tgz" }, "miller-rabin": { "version": "4.0.0", - "from": "miller-rabin@>=4.0.0 <5.0.0", + "from": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.0.tgz", "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.0.tgz", "dependencies": { "brorand": { "version": "1.0.5", - "from": "brorand@>=1.0.1 <2.0.0", + "from": "https://registry.npmjs.org/brorand/-/brorand-1.0.5.tgz", "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.0.5.tgz" } } @@ -838,61 +838,61 @@ }, "pbkdf2": { "version": "3.0.4", - "from": "pbkdf2@>=3.0.3 <4.0.0", + "from": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.0.4.tgz", "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.0.4.tgz" }, "public-encrypt": { "version": "4.0.0", - "from": "public-encrypt@>=4.0.0 <5.0.0", + "from": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.0.tgz", "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.0.tgz", "dependencies": { "bn.js": { "version": "4.11.4", - "from": "bn.js@>=4.1.0 <5.0.0", + "from": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.4.tgz", "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.4.tgz" }, "browserify-rsa": { "version": "4.0.1", - "from": "browserify-rsa@>=4.0.0 <5.0.0", + "from": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.0.1.tgz", "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.0.1.tgz" }, "parse-asn1": { "version": "5.0.0", - "from": "parse-asn1@>=5.0.0 <6.0.0", + "from": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.0.0.tgz", "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.0.0.tgz", "dependencies": { "asn1.js": { "version": "4.6.2", - "from": "asn1.js@>=4.0.0 <5.0.0", + "from": "https://registry.npmjs.org/asn1.js/-/asn1.js-4.6.2.tgz", "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-4.6.2.tgz", "dependencies": { "minimalistic-assert": { "version": "1.0.0", - "from": "minimalistic-assert@>=1.0.0 <2.0.0", + "from": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.0.tgz", "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.0.tgz" } } }, "browserify-aes": { "version": "1.0.6", - "from": "browserify-aes@>=1.0.0 <2.0.0", + "from": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.0.6.tgz", "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.0.6.tgz", "dependencies": { "buffer-xor": { "version": "1.0.3", - "from": "buffer-xor@>=1.0.2 <2.0.0", + "from": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz" }, "cipher-base": { "version": "1.0.2", - "from": "cipher-base@>=1.0.0 <2.0.0", + "from": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.2.tgz", "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.2.tgz" } } }, "evp_bytestokey": { "version": "1.0.0", - "from": "evp_bytestokey@>=1.0.0 <2.0.0", + "from": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.0.tgz", "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.0.tgz" } } @@ -901,39 +901,39 @@ }, "randombytes": { "version": "2.0.3", - "from": "randombytes@>=2.0.0 <3.0.0", + "from": "https://registry.npmjs.org/randombytes/-/randombytes-2.0.3.tgz", "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.0.3.tgz" } } }, "deep-equal": { "version": "0.2.2", - "from": "deep-equal@>=0.2.1 <0.3.0", + "from": "https://registry.npmjs.org/deep-equal/-/deep-equal-0.2.2.tgz", "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-0.2.2.tgz" }, "defined": { "version": "0.0.0", - "from": "defined@>=0.0.0 <0.1.0", + "from": "https://registry.npmjs.org/defined/-/defined-0.0.0.tgz", "resolved": "https://registry.npmjs.org/defined/-/defined-0.0.0.tgz" }, "deps-sort": { "version": "1.3.9", - "from": "deps-sort@>=1.3.5 <2.0.0", + "from": "https://registry.npmjs.org/deps-sort/-/deps-sort-1.3.9.tgz", "resolved": "https://registry.npmjs.org/deps-sort/-/deps-sort-1.3.9.tgz", "dependencies": { "JSONStream": { "version": "1.1.3", - "from": "JSONStream@>=1.0.3 <2.0.0", + "from": "https://registry.npmjs.org/JSONStream/-/JSONStream-1.1.3.tgz", "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-1.1.3.tgz", "dependencies": { "jsonparse": { "version": "1.2.0", - "from": "jsonparse@>=1.1.0 <2.0.0", + "from": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.2.0.tgz", "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.2.0.tgz" }, "through": { "version": "2.3.8", - "from": "through@>=2.2.7 <3.0.0", + "from": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz" } } @@ -942,54 +942,54 @@ }, "domain-browser": { "version": "1.1.7", - "from": "domain-browser@>=1.1.0 <1.2.0", + "from": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.1.7.tgz", "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.1.7.tgz" }, "duplexer2": { "version": "0.0.2", - "from": "duplexer2@>=0.0.2 <0.1.0", + "from": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.0.2.tgz", "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.0.2.tgz" }, "events": { "version": "1.0.2", - "from": "events@>=1.0.0 <1.1.0", + "from": "https://registry.npmjs.org/events/-/events-1.0.2.tgz", "resolved": "https://registry.npmjs.org/events/-/events-1.0.2.tgz" }, "glob": { "version": "4.5.3", - "from": "glob@>=4.0.5 <5.0.0", + "from": "https://registry.npmjs.org/glob/-/glob-4.5.3.tgz", "resolved": "https://registry.npmjs.org/glob/-/glob-4.5.3.tgz", "dependencies": { "inflight": { "version": "1.0.5", - "from": "inflight@>=1.0.4 <2.0.0", + "from": "https://registry.npmjs.org/inflight/-/inflight-1.0.5.tgz", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.5.tgz", "dependencies": { "wrappy": { "version": "1.0.2", - "from": "wrappy@>=1.0.0 <2.0.0", + "from": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz" } } }, "minimatch": { "version": "2.0.10", - "from": "minimatch@>=2.0.1 <3.0.0", + "from": "https://registry.npmjs.org/minimatch/-/minimatch-2.0.10.tgz", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-2.0.10.tgz", "dependencies": { "brace-expansion": { "version": "1.1.5", - "from": "brace-expansion@>=1.0.0 <2.0.0", + "from": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.5.tgz", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.5.tgz", "dependencies": { "balanced-match": { "version": "0.4.1", - "from": "balanced-match@>=0.4.1 <0.5.0", + "from": "https://registry.npmjs.org/balanced-match/-/balanced-match-0.4.1.tgz", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-0.4.1.tgz" }, "concat-map": { "version": "0.0.1", - "from": "concat-map@0.0.1", + "from": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz" } } @@ -998,12 +998,12 @@ }, "once": { "version": "1.3.3", - "from": "once@>=1.3.0 <2.0.0", + "from": "https://registry.npmjs.org/once/-/once-1.3.3.tgz", "resolved": "https://registry.npmjs.org/once/-/once-1.3.3.tgz", "dependencies": { "wrappy": { "version": "1.0.2", - "from": "wrappy@>=1.0.0 <2.0.0", + "from": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz" } } @@ -1012,76 +1012,76 @@ }, "http-browserify": { "version": "1.7.0", - "from": "http-browserify@>=1.4.0 <2.0.0", + "from": "https://registry.npmjs.org/http-browserify/-/http-browserify-1.7.0.tgz", "resolved": "https://registry.npmjs.org/http-browserify/-/http-browserify-1.7.0.tgz", "dependencies": { "Base64": { "version": "0.2.1", - "from": "Base64@>=0.2.0 <0.3.0", + "from": "https://registry.npmjs.org/Base64/-/Base64-0.2.1.tgz", "resolved": "https://registry.npmjs.org/Base64/-/Base64-0.2.1.tgz" } } }, "https-browserify": { "version": "0.0.1", - "from": "https-browserify@>=0.0.0 <0.1.0", + "from": "https://registry.npmjs.org/https-browserify/-/https-browserify-0.0.1.tgz", "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-0.0.1.tgz" }, "inherits": { "version": "2.0.1", - "from": "inherits@>=2.0.1 <2.1.0", + "from": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz" }, "insert-module-globals": { "version": "6.6.3", - "from": "insert-module-globals@>=6.1.0 <7.0.0", + "from": "https://registry.npmjs.org/insert-module-globals/-/insert-module-globals-6.6.3.tgz", "resolved": "https://registry.npmjs.org/insert-module-globals/-/insert-module-globals-6.6.3.tgz", "dependencies": { "JSONStream": { "version": "1.1.3", - "from": "JSONStream@>=1.0.3 <2.0.0", + "from": "https://registry.npmjs.org/JSONStream/-/JSONStream-1.1.3.tgz", "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-1.1.3.tgz", "dependencies": { "jsonparse": { "version": "1.2.0", - "from": "jsonparse@>=1.1.0 <2.0.0", + "from": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.2.0.tgz", "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.2.0.tgz" }, "through": { "version": "2.3.8", - "from": "through@>=2.2.7 <3.0.0", + "from": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz" } } }, "combine-source-map": { "version": "0.6.1", - "from": "combine-source-map@>=0.6.1 <0.7.0", + "from": "https://registry.npmjs.org/combine-source-map/-/combine-source-map-0.6.1.tgz", "resolved": "https://registry.npmjs.org/combine-source-map/-/combine-source-map-0.6.1.tgz", "dependencies": { "convert-source-map": { "version": "1.1.3", - "from": "convert-source-map@>=1.1.0 <1.2.0", + "from": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.1.3.tgz", "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.1.3.tgz" }, "inline-source-map": { "version": "0.5.0", - "from": "inline-source-map@>=0.5.0 <0.6.0", + "from": "https://registry.npmjs.org/inline-source-map/-/inline-source-map-0.5.0.tgz", "resolved": "https://registry.npmjs.org/inline-source-map/-/inline-source-map-0.5.0.tgz" }, "lodash.memoize": { "version": "3.0.4", - "from": "lodash.memoize@>=3.0.3 <3.1.0", + "from": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-3.0.4.tgz", "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-3.0.4.tgz" }, "source-map": { "version": "0.4.4", - "from": "source-map@>=0.4.2 <0.5.0", + "from": "https://registry.npmjs.org/source-map/-/source-map-0.4.4.tgz", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.4.4.tgz", "dependencies": { "amdefine": { "version": "1.0.0", - "from": "amdefine@>=0.0.4", + "from": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.0.tgz", "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.0.tgz" } } @@ -1090,22 +1090,22 @@ }, "is-buffer": { "version": "1.1.3", - "from": "is-buffer@>=1.1.0 <2.0.0", + "from": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.3.tgz", "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.3.tgz" }, "lexical-scope": { "version": "1.2.0", - "from": "lexical-scope@>=1.2.0 <2.0.0", + "from": "https://registry.npmjs.org/lexical-scope/-/lexical-scope-1.2.0.tgz", "resolved": "https://registry.npmjs.org/lexical-scope/-/lexical-scope-1.2.0.tgz", "dependencies": { "astw": { "version": "2.0.0", - "from": "astw@>=2.0.0 <3.0.0", + "from": "https://registry.npmjs.org/astw/-/astw-2.0.0.tgz", "resolved": "https://registry.npmjs.org/astw/-/astw-2.0.0.tgz", "dependencies": { "acorn": { "version": "1.2.2", - "from": "acorn@>=1.0.3 <2.0.0", + "from": "https://registry.npmjs.org/acorn/-/acorn-1.2.2.tgz", "resolved": "https://registry.npmjs.org/acorn/-/acorn-1.2.2.tgz" } } @@ -1114,39 +1114,39 @@ }, "process": { "version": "0.11.5", - "from": "process@>=0.11.0 <0.12.0", + "from": "https://registry.npmjs.org/process/-/process-0.11.5.tgz", "resolved": "https://registry.npmjs.org/process/-/process-0.11.5.tgz" }, "xtend": { "version": "4.0.1", - "from": "xtend@>=4.0.0 <5.0.0", + "from": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz" } } }, "isarray": { "version": "0.0.1", - "from": "isarray@0.0.1", + "from": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz" }, "labeled-stream-splicer": { "version": "1.0.2", - "from": "labeled-stream-splicer@>=1.0.0 <2.0.0", + "from": "https://registry.npmjs.org/labeled-stream-splicer/-/labeled-stream-splicer-1.0.2.tgz", "resolved": "https://registry.npmjs.org/labeled-stream-splicer/-/labeled-stream-splicer-1.0.2.tgz", "dependencies": { "stream-splicer": { "version": "1.3.2", - "from": "stream-splicer@>=1.1.0 <2.0.0", + "from": "https://registry.npmjs.org/stream-splicer/-/stream-splicer-1.3.2.tgz", "resolved": "https://registry.npmjs.org/stream-splicer/-/stream-splicer-1.3.2.tgz", "dependencies": { "readable-wrap": { "version": "1.0.0", - "from": "readable-wrap@>=1.0.0 <2.0.0", + "from": "https://registry.npmjs.org/readable-wrap/-/readable-wrap-1.0.0.tgz", "resolved": "https://registry.npmjs.org/readable-wrap/-/readable-wrap-1.0.0.tgz" }, "indexof": { "version": "0.0.1", - "from": "indexof@0.0.1", + "from": "https://registry.npmjs.org/indexof/-/indexof-0.0.1.tgz", "resolved": "https://registry.npmjs.org/indexof/-/indexof-0.0.1.tgz" } } @@ -1155,85 +1155,85 @@ }, "module-deps": { "version": "3.9.1", - "from": "module-deps@>=3.6.3 <4.0.0", + "from": "https://registry.npmjs.org/module-deps/-/module-deps-3.9.1.tgz", "resolved": "https://registry.npmjs.org/module-deps/-/module-deps-3.9.1.tgz", "dependencies": { "JSONStream": { "version": "1.1.3", - "from": "JSONStream@>=1.0.3 <2.0.0", + "from": "https://registry.npmjs.org/JSONStream/-/JSONStream-1.1.3.tgz", "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-1.1.3.tgz", "dependencies": { "jsonparse": { "version": "1.2.0", - "from": "jsonparse@>=1.1.0 <2.0.0", + "from": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.2.0.tgz", "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.2.0.tgz" }, "through": { "version": "2.3.8", - "from": "through@>=2.2.7 <3.0.0", + "from": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz" } } }, "defined": { "version": "1.0.0", - "from": "defined@>=1.0.0 <2.0.0", + "from": "https://registry.npmjs.org/defined/-/defined-1.0.0.tgz", "resolved": "https://registry.npmjs.org/defined/-/defined-1.0.0.tgz" }, "detective": { "version": "4.3.1", - "from": "detective@>=4.0.0 <5.0.0", + "from": "https://registry.npmjs.org/detective/-/detective-4.3.1.tgz", "resolved": "https://registry.npmjs.org/detective/-/detective-4.3.1.tgz", "dependencies": { "acorn": { "version": "1.2.2", - "from": "acorn@>=1.0.3 <2.0.0", + "from": "https://registry.npmjs.org/acorn/-/acorn-1.2.2.tgz", "resolved": "https://registry.npmjs.org/acorn/-/acorn-1.2.2.tgz" } } }, "parents": { "version": "1.0.1", - "from": "parents@>=1.0.0 <2.0.0", + "from": "https://registry.npmjs.org/parents/-/parents-1.0.1.tgz", "resolved": "https://registry.npmjs.org/parents/-/parents-1.0.1.tgz", "dependencies": { "path-platform": { "version": "0.11.15", - "from": "path-platform@>=0.11.15 <0.12.0", + "from": "https://registry.npmjs.org/path-platform/-/path-platform-0.11.15.tgz", "resolved": "https://registry.npmjs.org/path-platform/-/path-platform-0.11.15.tgz" } } }, "resolve": { "version": "1.1.7", - "from": "resolve@>=1.1.3 <2.0.0", + "from": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz" }, "stream-combiner2": { "version": "1.0.2", - "from": "stream-combiner2@>=1.0.0 <1.1.0", + "from": "https://registry.npmjs.org/stream-combiner2/-/stream-combiner2-1.0.2.tgz", "resolved": "https://registry.npmjs.org/stream-combiner2/-/stream-combiner2-1.0.2.tgz", "dependencies": { "through2": { "version": "0.5.1", - "from": "through2@>=0.5.1 <0.6.0", + "from": "https://registry.npmjs.org/through2/-/through2-0.5.1.tgz", "resolved": "https://registry.npmjs.org/through2/-/through2-0.5.1.tgz", "dependencies": { "readable-stream": { "version": "1.0.34", - "from": "readable-stream@>=1.0.17 <1.1.0", + "from": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", "dependencies": { "core-util-is": { "version": "1.0.2", - "from": "core-util-is@>=1.0.0 <1.1.0", + "from": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz" } } }, "xtend": { "version": "3.0.0", - "from": "xtend@>=3.0.0 <3.1.0", + "from": "https://registry.npmjs.org/xtend/-/xtend-3.0.0.tgz", "resolved": "https://registry.npmjs.org/xtend/-/xtend-3.0.0.tgz" } } @@ -1242,207 +1242,207 @@ }, "xtend": { "version": "4.0.1", - "from": "xtend@>=4.0.0 <5.0.0", + "from": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz" } } }, "os-browserify": { "version": "0.1.2", - "from": "os-browserify@>=0.1.1 <0.2.0", + "from": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.1.2.tgz", "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.1.2.tgz" }, "parents": { "version": "0.0.3", - "from": "parents@>=0.0.1 <0.1.0", + "from": "https://registry.npmjs.org/parents/-/parents-0.0.3.tgz", "resolved": "https://registry.npmjs.org/parents/-/parents-0.0.3.tgz", "dependencies": { "path-platform": { "version": "0.0.1", - "from": "path-platform@>=0.0.1 <0.0.2", + "from": "https://registry.npmjs.org/path-platform/-/path-platform-0.0.1.tgz", "resolved": "https://registry.npmjs.org/path-platform/-/path-platform-0.0.1.tgz" } } }, "path-browserify": { "version": "0.0.0", - "from": "path-browserify@>=0.0.0 <0.1.0", + "from": "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.0.tgz", "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.0.tgz" }, "process": { "version": "0.8.0", - "from": "process@>=0.8.0 <0.9.0", + "from": "https://registry.npmjs.org/process/-/process-0.8.0.tgz", "resolved": "https://registry.npmjs.org/process/-/process-0.8.0.tgz" }, "punycode": { "version": "1.2.4", - "from": "punycode@>=1.2.3 <1.3.0", + "from": "https://registry.npmjs.org/punycode/-/punycode-1.2.4.tgz", "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.2.4.tgz" }, "querystring-es3": { "version": "0.2.1", - "from": "querystring-es3@>=0.2.0 <0.3.0", + "from": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz", "resolved": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz" }, "readable-stream": { "version": "1.1.14", - "from": "readable-stream@>=1.0.33-1 <2.0.0", + "from": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", "dependencies": { "core-util-is": { "version": "1.0.2", - "from": "core-util-is@>=1.0.0 <1.1.0", + "from": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz" } } }, "resolve": { "version": "0.7.4", - "from": "resolve@>=0.7.1 <0.8.0", + "from": "https://registry.npmjs.org/resolve/-/resolve-0.7.4.tgz", "resolved": "https://registry.npmjs.org/resolve/-/resolve-0.7.4.tgz" }, "shallow-copy": { "version": "0.0.1", - "from": "shallow-copy@0.0.1", + "from": "https://registry.npmjs.org/shallow-copy/-/shallow-copy-0.0.1.tgz", "resolved": "https://registry.npmjs.org/shallow-copy/-/shallow-copy-0.0.1.tgz" }, "shasum": { "version": "1.0.2", - "from": "shasum@>=1.0.0 <2.0.0", + "from": "https://registry.npmjs.org/shasum/-/shasum-1.0.2.tgz", "resolved": "https://registry.npmjs.org/shasum/-/shasum-1.0.2.tgz", "dependencies": { "json-stable-stringify": { "version": "0.0.1", - "from": "json-stable-stringify@>=0.0.0 <0.1.0", + "from": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-0.0.1.tgz", "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-0.0.1.tgz", "dependencies": { "jsonify": { "version": "0.0.0", - "from": "jsonify@>=0.0.0 <0.1.0", + "from": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz", "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz" } } }, "sha.js": { "version": "2.4.5", - "from": "sha.js@>=2.4.4 <2.5.0", + "from": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.5.tgz", "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.5.tgz" } } }, "shell-quote": { "version": "0.0.1", - "from": "shell-quote@>=0.0.1 <0.1.0", + "from": "https://registry.npmjs.org/shell-quote/-/shell-quote-0.0.1.tgz", "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-0.0.1.tgz" }, "stream-browserify": { "version": "1.0.0", - "from": "stream-browserify@>=1.0.0 <2.0.0", + "from": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-1.0.0.tgz", "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-1.0.0.tgz" }, "string_decoder": { "version": "0.10.31", - "from": "string_decoder@>=0.10.0 <0.11.0", + "from": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz" }, "subarg": { "version": "1.0.0", - "from": "subarg@>=1.0.0 <2.0.0", + "from": "https://registry.npmjs.org/subarg/-/subarg-1.0.0.tgz", "resolved": "https://registry.npmjs.org/subarg/-/subarg-1.0.0.tgz" }, "syntax-error": { "version": "1.1.6", - "from": "syntax-error@>=1.1.1 <2.0.0", + "from": "https://registry.npmjs.org/syntax-error/-/syntax-error-1.1.6.tgz", "resolved": "https://registry.npmjs.org/syntax-error/-/syntax-error-1.1.6.tgz", "dependencies": { "acorn": { "version": "2.7.0", - "from": "acorn@>=2.7.0 <3.0.0", + "from": "https://registry.npmjs.org/acorn/-/acorn-2.7.0.tgz", "resolved": "https://registry.npmjs.org/acorn/-/acorn-2.7.0.tgz" } } }, "through2": { "version": "1.1.1", - "from": "through2@>=1.0.0 <2.0.0", + "from": "https://registry.npmjs.org/through2/-/through2-1.1.1.tgz", "resolved": "https://registry.npmjs.org/through2/-/through2-1.1.1.tgz", "dependencies": { "xtend": { "version": "4.0.1", - "from": "xtend@>=4.0.0 <4.1.0-0", + "from": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz" } } }, "timers-browserify": { "version": "1.4.2", - "from": "timers-browserify@>=1.0.1 <2.0.0", + "from": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-1.4.2.tgz", "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-1.4.2.tgz", "dependencies": { "process": { "version": "0.11.5", - "from": "process@>=0.11.0 <0.12.0", + "from": "https://registry.npmjs.org/process/-/process-0.11.5.tgz", "resolved": "https://registry.npmjs.org/process/-/process-0.11.5.tgz" } } }, "tty-browserify": { "version": "0.0.0", - "from": "tty-browserify@>=0.0.0 <0.1.0", + "from": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.0.tgz", "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.0.tgz" }, "umd": { "version": "2.1.0", - "from": "umd@>=2.1.0 <2.2.0", + "from": "https://registry.npmjs.org/umd/-/umd-2.1.0.tgz", "resolved": "https://registry.npmjs.org/umd/-/umd-2.1.0.tgz", "dependencies": { "rfile": { "version": "1.0.0", - "from": "rfile@>=1.0.0 <1.1.0", + "from": "https://registry.npmjs.org/rfile/-/rfile-1.0.0.tgz", "resolved": "https://registry.npmjs.org/rfile/-/rfile-1.0.0.tgz", "dependencies": { "callsite": { "version": "1.0.0", - "from": "callsite@>=1.0.0 <1.1.0", + "from": "https://registry.npmjs.org/callsite/-/callsite-1.0.0.tgz", "resolved": "https://registry.npmjs.org/callsite/-/callsite-1.0.0.tgz" }, "resolve": { "version": "0.3.1", - "from": "resolve@>=0.3.0 <0.4.0", + "from": "https://registry.npmjs.org/resolve/-/resolve-0.3.1.tgz", "resolved": "https://registry.npmjs.org/resolve/-/resolve-0.3.1.tgz" } } }, "ruglify": { "version": "1.0.0", - "from": "ruglify@>=1.0.0 <1.1.0", + "from": "https://registry.npmjs.org/ruglify/-/ruglify-1.0.0.tgz", "resolved": "https://registry.npmjs.org/ruglify/-/ruglify-1.0.0.tgz", "dependencies": { "uglify-js": { "version": "2.2.5", - "from": "uglify-js@>=2.2.0 <2.3.0", + "from": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.2.5.tgz", "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.2.5.tgz", "dependencies": { "source-map": { "version": "0.1.43", - "from": "source-map@>=0.1.7 <0.2.0", + "from": "https://registry.npmjs.org/source-map/-/source-map-0.1.43.tgz", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.1.43.tgz", "dependencies": { "amdefine": { "version": "1.0.0", - "from": "amdefine@>=0.0.4", + "from": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.0.tgz", "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.0.tgz" } } }, "optimist": { "version": "0.3.7", - "from": "optimist@>=0.3.5 <0.4.0", + "from": "https://registry.npmjs.org/optimist/-/optimist-0.3.7.tgz", "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.3.7.tgz", "dependencies": { "wordwrap": { "version": "0.0.3", - "from": "wordwrap@>=0.0.2 <0.1.0", + "from": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz", "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz" } } @@ -1453,59 +1453,59 @@ }, "through": { "version": "2.3.8", - "from": "through@>=2.3.4 <2.4.0", + "from": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz" }, "uglify-js": { "version": "2.4.24", - "from": "uglify-js@>=2.4.0 <2.5.0", + "from": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.4.24.tgz", "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.4.24.tgz", "dependencies": { "async": { "version": "0.2.10", - "from": "async@>=0.2.6 <0.3.0", + "from": "https://registry.npmjs.org/async/-/async-0.2.10.tgz", "resolved": "https://registry.npmjs.org/async/-/async-0.2.10.tgz" }, "source-map": { "version": "0.1.34", - "from": "source-map@0.1.34", + "from": "https://registry.npmjs.org/source-map/-/source-map-0.1.34.tgz", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.1.34.tgz", "dependencies": { "amdefine": { "version": "1.0.0", - "from": "amdefine@>=0.0.4", + "from": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.0.tgz", "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.0.tgz" } } }, "uglify-to-browserify": { "version": "1.0.2", - "from": "uglify-to-browserify@>=1.0.0 <1.1.0", + "from": "https://registry.npmjs.org/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz", "resolved": "https://registry.npmjs.org/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz" }, "yargs": { "version": "3.5.4", - "from": "yargs@>=3.5.4 <3.6.0", + "from": "https://registry.npmjs.org/yargs/-/yargs-3.5.4.tgz", "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.5.4.tgz", "dependencies": { "camelcase": { "version": "1.2.1", - "from": "camelcase@>=1.0.2 <2.0.0", + "from": "https://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz", "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz" }, "decamelize": { "version": "1.2.0", - "from": "decamelize@>=1.0.0 <2.0.0", + "from": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz" }, "window-size": { "version": "0.1.0", - "from": "window-size@0.1.0", + "from": "https://registry.npmjs.org/window-size/-/window-size-0.1.0.tgz", "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.1.0.tgz" }, "wordwrap": { "version": "0.0.2", - "from": "wordwrap@0.0.2", + "from": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz", "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz" } } @@ -1516,41 +1516,41 @@ }, "url": { "version": "0.10.3", - "from": "url@>=0.10.1 <0.11.0", + "from": "https://registry.npmjs.org/url/-/url-0.10.3.tgz", "resolved": "https://registry.npmjs.org/url/-/url-0.10.3.tgz", "dependencies": { "punycode": { "version": "1.3.2", - "from": "punycode@1.3.2", + "from": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz" }, "querystring": { "version": "0.2.0", - "from": "querystring@0.2.0", + "from": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz" } } }, "util": { "version": "0.10.3", - "from": "util@>=0.10.1 <0.11.0", + "from": "https://registry.npmjs.org/util/-/util-0.10.3.tgz", "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz" }, "vm-browserify": { "version": "0.0.4", - "from": "vm-browserify@>=0.0.1 <0.1.0", + "from": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-0.0.4.tgz", "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-0.0.4.tgz", "dependencies": { "indexof": { "version": "0.0.1", - "from": "indexof@0.0.1", + "from": "https://registry.npmjs.org/indexof/-/indexof-0.0.1.tgz", "resolved": "https://registry.npmjs.org/indexof/-/indexof-0.0.1.tgz" } } }, "xtend": { "version": "3.0.0", - "from": "xtend@>=3.0.0 <4.0.0", + "from": "https://registry.npmjs.org/xtend/-/xtend-3.0.0.tgz", "resolved": "https://registry.npmjs.org/xtend/-/xtend-3.0.0.tgz" } } @@ -9946,42 +9946,42 @@ }, "jasmine-reporters": { "version": "2.2.0", - "from": "jasmine-reporters@2.2.0", + "from": "https://registry.npmjs.org/jasmine-reporters/-/jasmine-reporters-2.2.0.tgz", "resolved": "https://registry.npmjs.org/jasmine-reporters/-/jasmine-reporters-2.2.0.tgz", "dependencies": { "jasmine": { "version": "2.4.1", - "from": "jasmine@>=2.4.1 <3.0.0", + "from": "https://registry.npmjs.org/jasmine/-/jasmine-2.4.1.tgz", "resolved": "https://registry.npmjs.org/jasmine/-/jasmine-2.4.1.tgz", "dependencies": { "exit": { "version": "0.1.2", - "from": "exit@>=0.1.2 <0.2.0", + "from": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz" }, "glob": { "version": "3.2.11", - "from": "glob@>=3.2.11 <4.0.0", + "from": "https://registry.npmjs.org/glob/-/glob-3.2.11.tgz", "resolved": "https://registry.npmjs.org/glob/-/glob-3.2.11.tgz", "dependencies": { "inherits": { "version": "2.0.1", - "from": "inherits@>=2.0.0 <3.0.0", + "from": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz" }, "minimatch": { "version": "0.3.0", - "from": "minimatch@>=0.3.0 <0.4.0", + "from": "https://registry.npmjs.org/minimatch/-/minimatch-0.3.0.tgz", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-0.3.0.tgz", "dependencies": { "lru-cache": { "version": "2.7.3", - "from": "lru-cache@>=2.0.0 <3.0.0", + "from": "https://registry.npmjs.org/lru-cache/-/lru-cache-2.7.3.tgz", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-2.7.3.tgz" }, "sigmund": { "version": "1.0.1", - "from": "sigmund@>=1.0.0 <1.1.0", + "from": "https://registry.npmjs.org/sigmund/-/sigmund-1.0.1.tgz", "resolved": "https://registry.npmjs.org/sigmund/-/sigmund-1.0.1.tgz" } } @@ -9992,19 +9992,19 @@ }, "mkdirp": { "version": "0.5.1", - "from": "mkdirp@>=0.5.1 <0.6.0", + "from": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", "dependencies": { "minimist": { "version": "0.0.8", - "from": "minimist@0.0.8", + "from": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz" } } }, "xmldom": { "version": "0.1.22", - "from": "xmldom@>=0.1.22 <0.2.0", + "from": "https://registry.npmjs.org/xmldom/-/xmldom-0.1.22.tgz", "resolved": "https://registry.npmjs.org/xmldom/-/xmldom-0.1.22.tgz" } } @@ -12580,584 +12580,745 @@ } }, "protractor": { - "version": "2.5.1", - "from": "https://registry.npmjs.org/protractor/-/protractor-2.5.1.tgz", - "resolved": "https://registry.npmjs.org/protractor/-/protractor-2.5.1.tgz", + "version": "4.0.0", + "from": "protractor@4.0.0", + "resolved": "https://registry.npmjs.org/protractor/-/protractor-4.0.0.tgz", "dependencies": { - "request": { - "version": "2.57.0", - "from": "https://registry.npmjs.org/request/-/request-2.57.0.tgz", - "resolved": "https://registry.npmjs.org/request/-/request-2.57.0.tgz", + "adm-zip": { + "version": "0.4.7", + "from": "adm-zip@0.4.7", + "resolved": "https://registry.npmjs.org/adm-zip/-/adm-zip-0.4.7.tgz" + }, + "chalk": { + "version": "1.1.3", + "from": "chalk@>=1.1.3 <2.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", "dependencies": { - "bl": { - "version": "0.9.5", - "from": "https://registry.npmjs.org/bl/-/bl-0.9.5.tgz", - "resolved": "https://registry.npmjs.org/bl/-/bl-0.9.5.tgz", - "dependencies": { - "readable-stream": { - "version": "1.0.34", - "from": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", - "dependencies": { - "core-util-is": { - "version": "1.0.2", - "from": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz" - }, - "isarray": { - "version": "0.0.1", - "from": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz" - }, - "string_decoder": { - "version": "0.10.31", - "from": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz" - }, - "inherits": { - "version": "2.0.1", - "from": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz" - } - } - } - } - }, - "caseless": { - "version": "0.10.0", - "from": "https://registry.npmjs.org/caseless/-/caseless-0.10.0.tgz", - "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.10.0.tgz" + "ansi-styles": { + "version": "2.2.1", + "from": "ansi-styles@>=2.2.1 <3.0.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz" }, - "forever-agent": { - "version": "0.6.1", - "from": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", - "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz" + "escape-string-regexp": { + "version": "1.0.5", + "from": "escape-string-regexp@>=1.0.2 <2.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz" }, - "form-data": { - "version": "0.2.0", - "from": "https://registry.npmjs.org/form-data/-/form-data-0.2.0.tgz", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-0.2.0.tgz", + "has-ansi": { + "version": "2.0.0", + "from": "has-ansi@>=2.0.0 <3.0.0", + "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", "dependencies": { - "async": { - "version": "0.9.2", - "from": "https://registry.npmjs.org/async/-/async-0.9.2.tgz", - "resolved": "https://registry.npmjs.org/async/-/async-0.9.2.tgz" - }, - "combined-stream": { - "version": "0.0.7", - "from": "https://registry.npmjs.org/combined-stream/-/combined-stream-0.0.7.tgz", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-0.0.7.tgz", - "dependencies": { - "delayed-stream": { - "version": "0.0.5", - "from": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-0.0.5.tgz", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-0.0.5.tgz" - } - } + "ansi-regex": { + "version": "2.0.0", + "from": "ansi-regex@>=2.0.0 <3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.0.0.tgz" } } }, - "json-stringify-safe": { - "version": "5.0.1", - "from": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", - "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz" - }, - "mime-types": { - "version": "2.0.14", - "from": "https://registry.npmjs.org/mime-types/-/mime-types-2.0.14.tgz", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.0.14.tgz", + "strip-ansi": { + "version": "3.0.1", + "from": "strip-ansi@>=3.0.0 <4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", "dependencies": { - "mime-db": { - "version": "1.12.0", - "from": "https://registry.npmjs.org/mime-db/-/mime-db-1.12.0.tgz", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.12.0.tgz" + "ansi-regex": { + "version": "2.0.0", + "from": "ansi-regex@>=2.0.0 <3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.0.0.tgz" } } }, - "node-uuid": { - "version": "1.4.7", - "from": "https://registry.npmjs.org/node-uuid/-/node-uuid-1.4.7.tgz", - "resolved": "https://registry.npmjs.org/node-uuid/-/node-uuid-1.4.7.tgz" - }, - "qs": { - "version": "3.1.0", - "from": "https://registry.npmjs.org/qs/-/qs-3.1.0.tgz", - "resolved": "https://registry.npmjs.org/qs/-/qs-3.1.0.tgz" - }, - "tunnel-agent": { - "version": "0.4.3", - "from": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.4.3.tgz", - "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.4.3.tgz" - }, - "tough-cookie": { - "version": "2.2.2", - "from": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.2.2.tgz", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.2.2.tgz" + "supports-color": { + "version": "2.0.0", + "from": "supports-color@>=2.0.0 <3.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz" + } + } + }, + "glob": { + "version": "7.0.5", + "from": "glob@>=7.0.3 <8.0.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.0.5.tgz", + "dependencies": { + "fs.realpath": { + "version": "1.0.0", + "from": "fs.realpath@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz" }, - "http-signature": { - "version": "0.11.0", - "from": "https://registry.npmjs.org/http-signature/-/http-signature-0.11.0.tgz", - "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-0.11.0.tgz", + "inflight": { + "version": "1.0.5", + "from": "inflight@>=1.0.4 <2.0.0", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.5.tgz", "dependencies": { - "assert-plus": { - "version": "0.1.5", - "from": "https://registry.npmjs.org/assert-plus/-/assert-plus-0.1.5.tgz", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-0.1.5.tgz" - }, - "asn1": { - "version": "0.1.11", - "from": "https://registry.npmjs.org/asn1/-/asn1-0.1.11.tgz", - "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.1.11.tgz" - }, - "ctype": { - "version": "0.5.3", - "from": "https://registry.npmjs.org/ctype/-/ctype-0.5.3.tgz", - "resolved": "https://registry.npmjs.org/ctype/-/ctype-0.5.3.tgz" + "wrappy": { + "version": "1.0.2", + "from": "wrappy@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz" } } }, - "oauth-sign": { - "version": "0.8.2", - "from": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.8.2.tgz", - "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.8.2.tgz" + "inherits": { + "version": "2.0.1", + "from": "inherits@>=2.0.0 <3.0.0", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz" }, - "hawk": { - "version": "2.3.1", - "from": "https://registry.npmjs.org/hawk/-/hawk-2.3.1.tgz", - "resolved": "https://registry.npmjs.org/hawk/-/hawk-2.3.1.tgz", + "minimatch": { + "version": "3.0.2", + "from": "minimatch@>=3.0.2 <4.0.0", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.2.tgz", "dependencies": { - "hoek": { - "version": "2.16.3", - "from": "https://registry.npmjs.org/hoek/-/hoek-2.16.3.tgz", - "resolved": "https://registry.npmjs.org/hoek/-/hoek-2.16.3.tgz" - }, - "boom": { - "version": "2.10.1", - "from": "https://registry.npmjs.org/boom/-/boom-2.10.1.tgz", - "resolved": "https://registry.npmjs.org/boom/-/boom-2.10.1.tgz" - }, - "cryptiles": { - "version": "2.0.5", - "from": "https://registry.npmjs.org/cryptiles/-/cryptiles-2.0.5.tgz", - "resolved": "https://registry.npmjs.org/cryptiles/-/cryptiles-2.0.5.tgz" - }, - "sntp": { - "version": "1.0.9", - "from": "https://registry.npmjs.org/sntp/-/sntp-1.0.9.tgz", - "resolved": "https://registry.npmjs.org/sntp/-/sntp-1.0.9.tgz" + "brace-expansion": { + "version": "1.1.5", + "from": "brace-expansion@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.5.tgz", + "dependencies": { + "balanced-match": { + "version": "0.4.2", + "from": "balanced-match@>=0.4.1 <0.5.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-0.4.2.tgz" + }, + "concat-map": { + "version": "0.0.1", + "from": "concat-map@0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz" + } + } } } }, - "aws-sign2": { - "version": "0.5.0", - "from": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.5.0.tgz", - "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.5.0.tgz" - }, - "stringstream": { - "version": "0.0.5", - "from": "https://registry.npmjs.org/stringstream/-/stringstream-0.0.5.tgz", - "resolved": "https://registry.npmjs.org/stringstream/-/stringstream-0.0.5.tgz" - }, - "combined-stream": { - "version": "1.0.5", - "from": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.5.tgz", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.5.tgz", + "once": { + "version": "1.3.3", + "from": "once@>=1.3.0 <2.0.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.3.3.tgz", "dependencies": { - "delayed-stream": { - "version": "1.0.0", - "from": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz" + "wrappy": { + "version": "1.0.2", + "from": "wrappy@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz" } } }, - "isstream": { + "path-is-absolute": { + "version": "1.0.0", + "from": "path-is-absolute@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.0.tgz" + } + } + }, + "jasmine": { + "version": "2.4.1", + "from": "jasmine@2.4.1", + "resolved": "https://registry.npmjs.org/jasmine/-/jasmine-2.4.1.tgz", + "dependencies": { + "exit": { "version": "0.1.2", - "from": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", - "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz" + "from": "exit@>=0.1.2 <0.2.0", + "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz" }, - "har-validator": { - "version": "1.8.0", - "from": "https://registry.npmjs.org/har-validator/-/har-validator-1.8.0.tgz", - "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-1.8.0.tgz", - "dependencies": { - "bluebird": { - "version": "2.10.2", - "from": "https://registry.npmjs.org/bluebird/-/bluebird-2.10.2.tgz", - "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-2.10.2.tgz" - }, - "chalk": { - "version": "1.1.3", - "from": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "glob": { + "version": "3.2.11", + "from": "glob@>=3.2.11 <4.0.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-3.2.11.tgz", + "dependencies": { + "inherits": { + "version": "2.0.1", + "from": "inherits@>=2.0.0 <3.0.0", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz" + }, + "minimatch": { + "version": "0.3.0", + "from": "minimatch@>=0.3.0 <0.4.0", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-0.3.0.tgz", "dependencies": { - "ansi-styles": { - "version": "2.2.1", - "from": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz" - }, - "escape-string-regexp": { - "version": "1.0.5", - "from": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz" - }, - "has-ansi": { - "version": "2.0.0", - "from": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", - "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", - "dependencies": { - "ansi-regex": { - "version": "2.0.0", - "from": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.0.0.tgz", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.0.0.tgz" - } - } - }, - "strip-ansi": { - "version": "3.0.1", - "from": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "dependencies": { - "ansi-regex": { - "version": "2.0.0", - "from": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.0.0.tgz", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.0.0.tgz" - } - } + "lru-cache": { + "version": "2.7.3", + "from": "lru-cache@>=2.0.0 <3.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-2.7.3.tgz" }, - "supports-color": { - "version": "2.0.0", - "from": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz" + "sigmund": { + "version": "1.0.1", + "from": "sigmund@>=1.0.0 <1.1.0", + "resolved": "https://registry.npmjs.org/sigmund/-/sigmund-1.0.1.tgz" } } - }, - "commander": { - "version": "2.9.0", - "from": "https://registry.npmjs.org/commander/-/commander-2.9.0.tgz", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.9.0.tgz", + } + } + } + } + }, + "jasminewd2": { + "version": "0.0.9", + "from": "jasminewd2@0.0.9", + "resolved": "https://registry.npmjs.org/jasminewd2/-/jasminewd2-0.0.9.tgz" + }, + "optimist": { + "version": "0.6.1", + "from": "optimist@>=0.6.0 <0.7.0", + "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz", + "dependencies": { + "wordwrap": { + "version": "0.0.3", + "from": "wordwrap@>=0.0.2 <0.1.0", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz" + }, + "minimist": { + "version": "0.0.10", + "from": "minimist@>=0.0.1 <0.1.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.10.tgz" + } + } + }, + "q": { + "version": "1.4.1", + "from": "q@1.4.1", + "resolved": "https://registry.npmjs.org/q/-/q-1.4.1.tgz" + }, + "saucelabs": { + "version": "1.2.0", + "from": "saucelabs@>=1.2.0 <1.3.0", + "resolved": "https://registry.npmjs.org/saucelabs/-/saucelabs-1.2.0.tgz", + "dependencies": { + "https-proxy-agent": { + "version": "1.0.0", + "from": "https-proxy-agent@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-1.0.0.tgz", + "dependencies": { + "agent-base": { + "version": "2.0.1", + "from": "agent-base@>=2.0.0 <3.0.0", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-2.0.1.tgz", "dependencies": { - "graceful-readlink": { - "version": "1.0.1", - "from": "https://registry.npmjs.org/graceful-readlink/-/graceful-readlink-1.0.1.tgz", - "resolved": "https://registry.npmjs.org/graceful-readlink/-/graceful-readlink-1.0.1.tgz" + "semver": { + "version": "5.0.3", + "from": "semver@>=5.0.1 <5.1.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.0.3.tgz" } } }, - "is-my-json-valid": { - "version": "2.13.1", - "from": "https://registry.npmjs.org/is-my-json-valid/-/is-my-json-valid-2.13.1.tgz", - "resolved": "https://registry.npmjs.org/is-my-json-valid/-/is-my-json-valid-2.13.1.tgz", + "debug": { + "version": "2.2.0", + "from": "debug@>=2.0.0 <3.0.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.2.0.tgz", "dependencies": { - "generate-function": { - "version": "2.0.0", - "from": "https://registry.npmjs.org/generate-function/-/generate-function-2.0.0.tgz", - "resolved": "https://registry.npmjs.org/generate-function/-/generate-function-2.0.0.tgz" - }, - "generate-object-property": { - "version": "1.2.0", - "from": "https://registry.npmjs.org/generate-object-property/-/generate-object-property-1.2.0.tgz", - "resolved": "https://registry.npmjs.org/generate-object-property/-/generate-object-property-1.2.0.tgz", - "dependencies": { - "is-property": { - "version": "1.0.2", - "from": "https://registry.npmjs.org/is-property/-/is-property-1.0.2.tgz", - "resolved": "https://registry.npmjs.org/is-property/-/is-property-1.0.2.tgz" - } - } - }, - "jsonpointer": { - "version": "2.0.0", - "from": "https://registry.npmjs.org/jsonpointer/-/jsonpointer-2.0.0.tgz", - "resolved": "https://registry.npmjs.org/jsonpointer/-/jsonpointer-2.0.0.tgz" - }, - "xtend": { - "version": "4.0.1", - "from": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz" + "ms": { + "version": "0.7.1", + "from": "ms@0.7.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.1.tgz" } } + }, + "extend": { + "version": "3.0.0", + "from": "extend@>=3.0.0 <4.0.0", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.0.tgz" } } } } }, "selenium-webdriver": { - "version": "2.47.0", - "from": "https://registry.npmjs.org/selenium-webdriver/-/selenium-webdriver-2.47.0.tgz", - "resolved": "https://registry.npmjs.org/selenium-webdriver/-/selenium-webdriver-2.47.0.tgz", + "version": "2.53.3", + "from": "selenium-webdriver@2.53.3", + "resolved": "https://registry.npmjs.org/selenium-webdriver/-/selenium-webdriver-2.53.3.tgz", "dependencies": { + "adm-zip": { + "version": "0.4.4", + "from": "adm-zip@0.4.4", + "resolved": "https://registry.npmjs.org/adm-zip/-/adm-zip-0.4.4.tgz" + }, "rimraf": { - "version": "2.5.2", - "from": "https://registry.npmjs.org/rimraf/-/rimraf-2.5.2.tgz", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.5.2.tgz", - "dependencies": { - "glob": { - "version": "7.0.3", - "from": "https://registry.npmjs.org/glob/-/glob-7.0.3.tgz", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.0.3.tgz", - "dependencies": { - "inflight": { - "version": "1.0.4", - "from": "https://registry.npmjs.org/inflight/-/inflight-1.0.4.tgz", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.4.tgz", - "dependencies": { - "wrappy": { - "version": "1.0.1", - "from": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.1.tgz", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.1.tgz" - } - } - }, - "inherits": { - "version": "2.0.1", - "from": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz" - }, - "minimatch": { - "version": "3.0.0", - "from": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.0.tgz", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.0.tgz", - "dependencies": { - "brace-expansion": { - "version": "1.1.4", - "from": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.4.tgz", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.4.tgz", - "dependencies": { - "balanced-match": { - "version": "0.4.1", - "from": "https://registry.npmjs.org/balanced-match/-/balanced-match-0.4.1.tgz", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-0.4.1.tgz" - }, - "concat-map": { - "version": "0.0.1", - "from": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz" - } - } - } - } - }, - "once": { - "version": "1.3.3", - "from": "https://registry.npmjs.org/once/-/once-1.3.3.tgz", - "resolved": "https://registry.npmjs.org/once/-/once-1.3.3.tgz", - "dependencies": { - "wrappy": { - "version": "1.0.1", - "from": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.1.tgz", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.1.tgz" - } - } - }, - "path-is-absolute": { - "version": "1.0.0", - "from": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.0.tgz", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.0.tgz" - } - } - } - } + "version": "2.5.3", + "from": "rimraf@>=2.2.8 <3.0.0", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.5.3.tgz" }, "tmp": { "version": "0.0.24", - "from": "https://registry.npmjs.org/tmp/-/tmp-0.0.24.tgz", + "from": "tmp@0.0.24", "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.24.tgz" }, "ws": { - "version": "0.8.1", - "from": "https://registry.npmjs.org/ws/-/ws-0.8.1.tgz", - "resolved": "https://registry.npmjs.org/ws/-/ws-0.8.1.tgz", + "version": "1.1.1", + "from": "ws@>=1.0.1 <2.0.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-1.1.1.tgz", "dependencies": { "options": { "version": "0.0.6", - "from": "https://registry.npmjs.org/options/-/options-0.0.6.tgz", + "from": "options@>=0.0.5", "resolved": "https://registry.npmjs.org/options/-/options-0.0.6.tgz" }, "ultron": { "version": "1.0.2", - "from": "https://registry.npmjs.org/ultron/-/ultron-1.0.2.tgz", + "from": "ultron@>=1.0.0 <1.1.0", "resolved": "https://registry.npmjs.org/ultron/-/ultron-1.0.2.tgz" } } }, "xml2js": { "version": "0.4.4", - "from": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.4.tgz", + "from": "xml2js@0.4.4", "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.4.tgz", "dependencies": { "sax": { "version": "0.6.1", - "from": "https://registry.npmjs.org/sax/-/sax-0.6.1.tgz", + "from": "sax@>=0.6.0 <0.7.0", "resolved": "https://registry.npmjs.org/sax/-/sax-0.6.1.tgz" }, "xmlbuilder": { "version": "8.2.2", - "from": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-8.2.2.tgz", + "from": "xmlbuilder@>=1.0.0", "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-8.2.2.tgz" } } } } }, - "minijasminenode": { - "version": "1.1.1", - "from": "https://registry.npmjs.org/minijasminenode/-/minijasminenode-1.1.1.tgz", - "resolved": "https://registry.npmjs.org/minijasminenode/-/minijasminenode-1.1.1.tgz" - }, - "jasminewd": { - "version": "1.1.0", - "from": "https://registry.npmjs.org/jasminewd/-/jasminewd-1.1.0.tgz", - "resolved": "https://registry.npmjs.org/jasminewd/-/jasminewd-1.1.0.tgz" - }, - "jasminewd2": { - "version": "0.0.6", - "from": "https://registry.npmjs.org/jasminewd2/-/jasminewd2-0.0.6.tgz", - "resolved": "https://registry.npmjs.org/jasminewd2/-/jasminewd2-0.0.6.tgz" - }, - "jasmine": { - "version": "2.3.2", - "from": "https://registry.npmjs.org/jasmine/-/jasmine-2.3.2.tgz", - "resolved": "https://registry.npmjs.org/jasmine/-/jasmine-2.3.2.tgz", + "source-map-support": { + "version": "0.4.2", + "from": "source-map-support@>=0.4.0 <0.5.0", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.4.2.tgz", "dependencies": { - "exit": { - "version": "0.1.2", - "from": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", - "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz" - }, - "jasmine-core": { - "version": "2.3.4", - "from": "https://registry.npmjs.org/jasmine-core/-/jasmine-core-2.3.4.tgz", - "resolved": "https://registry.npmjs.org/jasmine-core/-/jasmine-core-2.3.4.tgz" + "source-map": { + "version": "0.1.32", + "from": "source-map@0.1.32", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.1.32.tgz", + "dependencies": { + "amdefine": { + "version": "1.0.0", + "from": "amdefine@>=0.0.4", + "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.0.tgz" + } + } } } }, - "saucelabs": { - "version": "1.0.1", - "from": "https://registry.npmjs.org/saucelabs/-/saucelabs-1.0.1.tgz", - "resolved": "https://registry.npmjs.org/saucelabs/-/saucelabs-1.0.1.tgz", + "webdriver-manager": { + "version": "10.2.1", + "from": "webdriver-manager@>=10.2.1 <11.0.0", + "resolved": "https://registry.npmjs.org/webdriver-manager/-/webdriver-manager-10.2.1.tgz", "dependencies": { - "https-proxy-agent": { - "version": "1.0.0", - "from": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-1.0.0.tgz", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-1.0.0.tgz", + "del": { + "version": "2.2.1", + "from": "del@>=2.2.0 <3.0.0", + "resolved": "https://registry.npmjs.org/del/-/del-2.2.1.tgz", "dependencies": { - "agent-base": { - "version": "2.0.1", - "from": "https://registry.npmjs.org/agent-base/-/agent-base-2.0.1.tgz", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-2.0.1.tgz", + "globby": { + "version": "5.0.0", + "from": "globby@>=5.0.0 <6.0.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-5.0.0.tgz", "dependencies": { - "semver": { - "version": "5.0.3", - "from": "https://registry.npmjs.org/semver/-/semver-5.0.3.tgz", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.0.3.tgz" + "array-union": { + "version": "1.0.2", + "from": "array-union@>=1.0.1 <2.0.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", + "dependencies": { + "array-uniq": { + "version": "1.0.3", + "from": "array-uniq@>=1.0.1 <2.0.0", + "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz" + } + } + }, + "arrify": { + "version": "1.0.1", + "from": "arrify@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz" } } }, - "debug": { - "version": "2.2.0", - "from": "https://registry.npmjs.org/debug/-/debug-2.2.0.tgz", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.2.0.tgz", + "is-path-cwd": { + "version": "1.0.0", + "from": "is-path-cwd@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-1.0.0.tgz" + }, + "is-path-in-cwd": { + "version": "1.0.0", + "from": "is-path-in-cwd@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-1.0.0.tgz", "dependencies": { - "ms": { - "version": "0.7.1", - "from": "https://registry.npmjs.org/ms/-/ms-0.7.1.tgz", - "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.1.tgz" + "is-path-inside": { + "version": "1.0.0", + "from": "is-path-inside@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-1.0.0.tgz", + "dependencies": { + "path-is-inside": { + "version": "1.0.1", + "from": "path-is-inside@>=1.0.1 <2.0.0", + "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.1.tgz" + } + } } } }, - "extend": { - "version": "3.0.0", - "from": "https://registry.npmjs.org/extend/-/extend-3.0.0.tgz", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.0.tgz" + "object-assign": { + "version": "4.1.0", + "from": "object-assign@>=4.0.1 <5.0.0", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.0.tgz" + }, + "pify": { + "version": "2.3.0", + "from": "pify@>=2.0.0 <3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz" + }, + "pinkie-promise": { + "version": "2.0.1", + "from": "pinkie-promise@>=2.0.0 <3.0.0", + "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", + "dependencies": { + "pinkie": { + "version": "2.0.4", + "from": "pinkie@>=2.0.0 <3.0.0", + "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz" + } + } } } - } - } - }, - "glob": { - "version": "3.2.11", - "from": "https://registry.npmjs.org/glob/-/glob-3.2.11.tgz", - "resolved": "https://registry.npmjs.org/glob/-/glob-3.2.11.tgz", - "dependencies": { - "inherits": { - "version": "2.0.1", - "from": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz" }, - "minimatch": { - "version": "0.3.0", - "from": "https://registry.npmjs.org/minimatch/-/minimatch-0.3.0.tgz", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-0.3.0.tgz", - "dependencies": { - "lru-cache": { - "version": "2.7.3", - "from": "https://registry.npmjs.org/lru-cache/-/lru-cache-2.7.3.tgz", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-2.7.3.tgz" - }, - "sigmund": { - "version": "1.0.1", - "from": "https://registry.npmjs.org/sigmund/-/sigmund-1.0.1.tgz", - "resolved": "https://registry.npmjs.org/sigmund/-/sigmund-1.0.1.tgz" - } - } - } - } - }, - "adm-zip": { - "version": "0.4.4", - "from": "https://registry.npmjs.org/adm-zip/-/adm-zip-0.4.4.tgz", - "resolved": "https://registry.npmjs.org/adm-zip/-/adm-zip-0.4.4.tgz" - }, - "optimist": { - "version": "0.6.1", - "from": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz", - "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz", - "dependencies": { - "wordwrap": { - "version": "0.0.3", - "from": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz", - "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz" + "ini": { + "version": "1.3.4", + "from": "ini@>=1.3.4 <2.0.0", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.4.tgz" }, "minimist": { - "version": "0.0.10", - "from": "https://registry.npmjs.org/minimist/-/minimist-0.0.10.tgz", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.10.tgz" - } - } - }, - "q": { - "version": "1.0.0", - "from": "https://registry.npmjs.org/q/-/q-1.0.0.tgz", - "resolved": "https://registry.npmjs.org/q/-/q-1.0.0.tgz" - }, - "source-map-support": { - "version": "0.2.10", - "from": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.2.10.tgz", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.2.10.tgz", - "dependencies": { - "source-map": { - "version": "0.1.32", - "from": "https://registry.npmjs.org/source-map/-/source-map-0.1.32.tgz", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.1.32.tgz", + "version": "1.2.0", + "from": "minimist@>=1.2.0 <2.0.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz" + }, + "request": { + "version": "2.73.0", + "from": "request@>=2.69.0 <3.0.0", + "resolved": "https://registry.npmjs.org/request/-/request-2.73.0.tgz", "dependencies": { - "amdefine": { + "aws-sign2": { + "version": "0.6.0", + "from": "aws-sign2@>=0.6.0 <0.7.0", + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.6.0.tgz" + }, + "aws4": { + "version": "1.4.1", + "from": "aws4@>=1.2.1 <2.0.0", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.4.1.tgz" + }, + "bl": { + "version": "1.1.2", + "from": "bl@>=1.1.2 <1.2.0", + "resolved": "https://registry.npmjs.org/bl/-/bl-1.1.2.tgz", + "dependencies": { + "readable-stream": { + "version": "2.0.6", + "from": "readable-stream@>=2.0.5 <2.1.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.0.6.tgz", + "dependencies": { + "core-util-is": { + "version": "1.0.2", + "from": "core-util-is@>=1.0.0 <1.1.0", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz" + }, + "inherits": { + "version": "2.0.1", + "from": "inherits@>=2.0.1 <2.1.0", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz" + }, + "isarray": { + "version": "1.0.0", + "from": "isarray@>=1.0.0 <1.1.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz" + }, + "process-nextick-args": { + "version": "1.0.7", + "from": "process-nextick-args@>=1.0.6 <1.1.0", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz" + }, + "string_decoder": { + "version": "0.10.31", + "from": "string_decoder@>=0.10.0 <0.11.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz" + }, + "util-deprecate": { + "version": "1.0.2", + "from": "util-deprecate@>=1.0.1 <1.1.0", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz" + } + } + } + } + }, + "caseless": { + "version": "0.11.0", + "from": "caseless@>=0.11.0 <0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.11.0.tgz" + }, + "combined-stream": { + "version": "1.0.5", + "from": "combined-stream@>=1.0.5 <1.1.0", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.5.tgz", + "dependencies": { + "delayed-stream": { + "version": "1.0.0", + "from": "delayed-stream@>=1.0.0 <1.1.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz" + } + } + }, + "extend": { + "version": "3.0.0", + "from": "extend@>=3.0.0 <3.1.0", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.0.tgz" + }, + "forever-agent": { + "version": "0.6.1", + "from": "forever-agent@>=0.6.1 <0.7.0", + "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz" + }, + "form-data": { + "version": "1.0.0-rc4", + "from": "form-data@>=1.0.0-rc4 <1.1.0", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-1.0.0-rc4.tgz", + "dependencies": { + "async": { + "version": "1.5.2", + "from": "async@>=1.5.2 <2.0.0", + "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz" + } + } + }, + "har-validator": { + "version": "2.0.6", + "from": "har-validator@>=2.0.6 <2.1.0", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-2.0.6.tgz", + "dependencies": { + "commander": { + "version": "2.9.0", + "from": "commander@>=2.9.0 <3.0.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.9.0.tgz", + "dependencies": { + "graceful-readlink": { + "version": "1.0.1", + "from": "graceful-readlink@>=1.0.0", + "resolved": "https://registry.npmjs.org/graceful-readlink/-/graceful-readlink-1.0.1.tgz" + } + } + }, + "is-my-json-valid": { + "version": "2.13.1", + "from": "is-my-json-valid@>=2.12.4 <3.0.0", + "resolved": "https://registry.npmjs.org/is-my-json-valid/-/is-my-json-valid-2.13.1.tgz", + "dependencies": { + "generate-function": { + "version": "2.0.0", + "from": "generate-function@>=2.0.0 <3.0.0", + "resolved": "https://registry.npmjs.org/generate-function/-/generate-function-2.0.0.tgz" + }, + "generate-object-property": { + "version": "1.2.0", + "from": "generate-object-property@>=1.1.0 <2.0.0", + "resolved": "https://registry.npmjs.org/generate-object-property/-/generate-object-property-1.2.0.tgz", + "dependencies": { + "is-property": { + "version": "1.0.2", + "from": "is-property@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/is-property/-/is-property-1.0.2.tgz" + } + } + }, + "jsonpointer": { + "version": "2.0.0", + "from": "jsonpointer@2.0.0", + "resolved": "https://registry.npmjs.org/jsonpointer/-/jsonpointer-2.0.0.tgz" + }, + "xtend": { + "version": "4.0.1", + "from": "xtend@>=4.0.0 <5.0.0", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz" + } + } + }, + "pinkie-promise": { + "version": "2.0.1", + "from": "pinkie-promise@>=2.0.0 <3.0.0", + "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", + "dependencies": { + "pinkie": { + "version": "2.0.4", + "from": "pinkie@>=2.0.0 <3.0.0", + "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz" + } + } + } + } + }, + "hawk": { + "version": "3.1.3", + "from": "hawk@>=3.1.3 <3.2.0", + "resolved": "https://registry.npmjs.org/hawk/-/hawk-3.1.3.tgz", + "dependencies": { + "hoek": { + "version": "2.16.3", + "from": "hoek@>=2.0.0 <3.0.0", + "resolved": "https://registry.npmjs.org/hoek/-/hoek-2.16.3.tgz" + }, + "boom": { + "version": "2.10.1", + "from": "boom@>=2.0.0 <3.0.0", + "resolved": "https://registry.npmjs.org/boom/-/boom-2.10.1.tgz" + }, + "cryptiles": { + "version": "2.0.5", + "from": "cryptiles@>=2.0.0 <3.0.0", + "resolved": "https://registry.npmjs.org/cryptiles/-/cryptiles-2.0.5.tgz" + }, + "sntp": { + "version": "1.0.9", + "from": "sntp@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/sntp/-/sntp-1.0.9.tgz" + } + } + }, + "http-signature": { + "version": "1.1.1", + "from": "http-signature@>=1.1.0 <1.2.0", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.1.1.tgz", + "dependencies": { + "assert-plus": { + "version": "0.2.0", + "from": "assert-plus@>=0.2.0 <0.3.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-0.2.0.tgz" + }, + "jsprim": { + "version": "1.3.0", + "from": "jsprim@>=1.2.2 <2.0.0", + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.3.0.tgz", + "dependencies": { + "extsprintf": { + "version": "1.0.2", + "from": "extsprintf@1.0.2", + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.0.2.tgz" + }, + "json-schema": { + "version": "0.2.2", + "from": "json-schema@0.2.2", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.2.tgz" + }, + "verror": { + "version": "1.3.6", + "from": "verror@1.3.6", + "resolved": "https://registry.npmjs.org/verror/-/verror-1.3.6.tgz" + } + } + }, + "sshpk": { + "version": "1.8.3", + "from": "sshpk@>=1.7.0 <2.0.0", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.8.3.tgz", + "dependencies": { + "asn1": { + "version": "0.2.3", + "from": "asn1@>=0.2.3 <0.3.0", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.3.tgz" + }, + "assert-plus": { + "version": "1.0.0", + "from": "assert-plus@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz" + }, + "dashdash": { + "version": "1.14.0", + "from": "dashdash@>=1.12.0 <2.0.0", + "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.0.tgz" + }, + "getpass": { + "version": "0.1.6", + "from": "getpass@>=0.1.1 <0.2.0", + "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.6.tgz" + }, + "jsbn": { + "version": "0.1.0", + "from": "jsbn@>=0.1.0 <0.2.0", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.0.tgz" + }, + "tweetnacl": { + "version": "0.13.3", + "from": "tweetnacl@>=0.13.0 <0.14.0", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.13.3.tgz" + }, + "jodid25519": { + "version": "1.0.2", + "from": "jodid25519@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/jodid25519/-/jodid25519-1.0.2.tgz" + }, + "ecc-jsbn": { + "version": "0.1.1", + "from": "ecc-jsbn@>=0.1.1 <0.2.0", + "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz" + } + } + } + } + }, + "is-typedarray": { "version": "1.0.0", - "from": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.0.tgz", - "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.0.tgz" + "from": "is-typedarray@>=1.0.0 <1.1.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz" + }, + "isstream": { + "version": "0.1.2", + "from": "isstream@>=0.1.2 <0.2.0", + "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz" + }, + "json-stringify-safe": { + "version": "5.0.1", + "from": "json-stringify-safe@>=5.0.1 <5.1.0", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz" + }, + "mime-types": { + "version": "2.1.11", + "from": "mime-types@>=2.1.7 <2.2.0", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.11.tgz", + "dependencies": { + "mime-db": { + "version": "1.23.0", + "from": "mime-db@>=1.23.0 <1.24.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.23.0.tgz" + } + } + }, + "node-uuid": { + "version": "1.4.7", + "from": "node-uuid@>=1.4.7 <1.5.0", + "resolved": "https://registry.npmjs.org/node-uuid/-/node-uuid-1.4.7.tgz" + }, + "oauth-sign": { + "version": "0.8.2", + "from": "oauth-sign@>=0.8.1 <0.9.0", + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.8.2.tgz" + }, + "qs": { + "version": "6.2.0", + "from": "qs@>=6.2.0 <6.3.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.2.0.tgz" + }, + "stringstream": { + "version": "0.0.5", + "from": "stringstream@>=0.0.4 <0.1.0", + "resolved": "https://registry.npmjs.org/stringstream/-/stringstream-0.0.5.tgz" + }, + "tough-cookie": { + "version": "2.2.2", + "from": "tough-cookie@>=2.2.0 <2.3.0", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.2.2.tgz" + }, + "tunnel-agent": { + "version": "0.4.3", + "from": "tunnel-agent@>=0.4.1 <0.5.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.4.3.tgz" } } + }, + "rimraf": { + "version": "2.5.3", + "from": "rimraf@>=2.5.2 <3.0.0", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.5.3.tgz" } } - }, - "html-entities": { - "version": "1.1.3", - "from": "https://registry.npmjs.org/html-entities/-/html-entities-1.1.3.tgz", - "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-1.1.3.tgz" - }, - "accessibility-developer-tools": { - "version": "2.6.0", - "from": "https://registry.npmjs.org/accessibility-developer-tools/-/accessibility-developer-tools-2.6.0.tgz", - "resolved": "https://registry.npmjs.org/accessibility-developer-tools/-/accessibility-developer-tools-2.6.0.tgz" } } }, diff --git a/package.json b/package.json index c0bfc9c77bf6..b2cda7639e1f 100644 --- a/package.json +++ b/package.json @@ -71,7 +71,7 @@ "marked": "~0.3.0", "node-html-encoder": "0.0.2", "promises-aplus-tests": "~2.1.0", - "protractor": "^2.1.0", + "protractor": "^4.0.0", "q": "~1.0.0", "q-io": "^1.10.9", "qq": "^0.3.5", diff --git a/src/ng/sce.js b/src/ng/sce.js index f72916455fae..51d70e377aeb 100644 --- a/src/ng/sce.js +++ b/src/ng/sce.js @@ -632,12 +632,12 @@ function $SceDelegateProvider() { * * describe('SCE doc demo', function() { * it('should sanitize untrusted values', function() { - * expect(element.all(by.css('.htmlComment')).first().getInnerHtml()) + * expect(element.all(by.css('.htmlComment')).first().getAttribute('innerHTML')) * .toBe('Is anyone reading this?'); * }); * * it('should NOT sanitize explicitly trusted values', function() { - * expect(element(by.id('explicitlyTrustedHtml')).getInnerHtml()).toBe( + * expect(element(by.id('explicitlyTrustedHtml')).getAttribute('innerHTML')).toBe( * 'Hover over this text.'); * }); diff --git a/src/ngSanitize/sanitize.js b/src/ngSanitize/sanitize.js index 0c41331c42e5..4e722273cf45 100644 --- a/src/ngSanitize/sanitize.js +++ b/src/ngSanitize/sanitize.js @@ -107,19 +107,19 @@ var htmlSanitizeWriter; it('should sanitize the html snippet by default', function() { - expect(element(by.css('#bind-html-with-sanitize div')).getInnerHtml()). + expect(element(by.css('#bind-html-with-sanitize div')).getAttribute('innerHTML')). toBe('

    an html\nclick here\nsnippet

    '); }); it('should inline raw snippet if bound to a trusted value', function() { - expect(element(by.css('#bind-html-with-trust div')).getInnerHtml()). + expect(element(by.css('#bind-html-with-trust div')).getAttribute('innerHTML')). toBe("

    an html\n" + "click here\n" + "snippet

    "); }); it('should escape snippet without any filter', function() { - expect(element(by.css('#bind-default div')).getInnerHtml()). + expect(element(by.css('#bind-default div')).getAttribute('innerHTML')). toBe("<p style=\"color:blue\">an html\n" + "<em onmouseover=\"this.textContent='PWN3D!'\">click here</em>\n" + "snippet</p>"); @@ -128,11 +128,11 @@ var htmlSanitizeWriter; it('should update', function() { element(by.model('snippet')).clear(); element(by.model('snippet')).sendKeys('new text'); - expect(element(by.css('#bind-html-with-sanitize div')).getInnerHtml()). + expect(element(by.css('#bind-html-with-sanitize div')).getAttribute('innerHTML')). toBe('new text'); - expect(element(by.css('#bind-html-with-trust div')).getInnerHtml()).toBe( + expect(element(by.css('#bind-html-with-trust div')).getAttribute('innerHTML')).toBe( 'new text'); - expect(element(by.css('#bind-default div')).getInnerHtml()).toBe( + expect(element(by.css('#bind-default div')).getAttribute('innerHTML')).toBe( "new <b onclick=\"alert(1)\">text</b>"); });
    From 1d4216a8bcd32428f826ab544c3da88b87a2ca7b Mon Sep 17 00:00:00 2001 From: Martin Staffa Date: Thu, 21 Jul 2016 00:27:36 +0200 Subject: [PATCH 0067/1173] chore(travis): use Firefox 47 This commit also adds a new capability to the protractor configs that ensures that all angularjs.org tests run correctly on Firefox. See https://github.com/SeleniumHQ/selenium/issues/1202 --- docs/protractor-conf.js | 4 +--- protractor-conf.js | 4 +--- protractor-shared-conf.js | 5 +++++ protractor-travis-conf.js | 12 +++++++----- 4 files changed, 14 insertions(+), 11 deletions(-) diff --git a/docs/protractor-conf.js b/docs/protractor-conf.js index e85d509a9d52..9a9fb977b342 100644 --- a/docs/protractor-conf.js +++ b/docs/protractor-conf.js @@ -6,8 +6,6 @@ config.specs = [ 'app/e2e/**/*.scenario.js' ]; -config.capabilities = { - browserName: 'chrome', -}; +config.capabilities.browserName = 'chrome'; exports.config = config; diff --git a/protractor-conf.js b/protractor-conf.js index db0df757bbe0..d5078d9d52ce 100644 --- a/protractor-conf.js +++ b/protractor-conf.js @@ -8,9 +8,7 @@ config.specs = [ 'docs/app/e2e/**/*.scenario.js' ]; -config.capabilities = { - browserName: 'chrome' -}; +config.capabilities.browserName = 'chrome'; config.directConnect = true; diff --git a/protractor-shared-conf.js b/protractor-shared-conf.js index 7b09ee76255f..e39735058418 100644 --- a/protractor-shared-conf.js +++ b/protractor-shared-conf.js @@ -7,6 +7,11 @@ exports.config = { framework: 'jasmine2', + capabilities: { + // Fix element scrolling behavior in Firefox for fixed header elements (like angularjs.org has) + 'elementScrollBehavior': 1 + }, + onPrepare: function() { /* global angular: false, browser: false, jasmine: false */ diff --git a/protractor-travis-conf.js b/protractor-travis-conf.js index 706169ceb584..f33f56b1349b 100644 --- a/protractor-travis-conf.js +++ b/protractor-travis-conf.js @@ -13,7 +13,7 @@ if (process.env.BROWSER_PROVIDER === 'browserstack') { }), capabilitiesForBrowserStack({ browserName: 'firefox', - version: '28' + version: '47' }), capabilitiesForBrowserStack({ browserName: 'safari', @@ -33,7 +33,7 @@ if (process.env.BROWSER_PROVIDER === 'browserstack') { }), capabilitiesForSauceLabs({ browserName: 'firefox', - version: '28' + version: '47' }), capabilitiesForSauceLabs({ browserName: 'safari', @@ -54,7 +54,7 @@ function capabilitiesForBrowserStack(capabilities) { return { 'browserstack.user': process.env.BROWSER_STACK_USERNAME, 'browserstack.key': process.env.BROWSER_STACK_ACCESS_KEY, - 'browserstack.local' : 'true', + 'browserstack.local': 'true', 'browserstack.debug': 'true', 'browserstack.tunnelIdentifier': process.env.TRAVIS_JOB_NUMBER, 'tunnelIdentifier': process.env.TRAVIS_JOB_NUMBER, @@ -64,7 +64,8 @@ function capabilitiesForBrowserStack(capabilities) { 'browserName': capabilities.browserName, 'platform': capabilities.platform, - 'version': capabilities.version + 'version': capabilities.version, + 'elementScrollBehavior': 1 }; } @@ -77,6 +78,7 @@ function capabilitiesForSauceLabs(capabilities) { 'browserName': capabilities.browserName, 'platform': capabilities.platform, - 'version': capabilities.version + 'version': capabilities.version, + 'elementScrollBehavior': 1 }; } From ce3571280dd94437696ab3126baa95ba2c9ebebd Mon Sep 17 00:00:00 2001 From: Martin Staffa Date: Fri, 22 Jul 2016 21:30:43 +0200 Subject: [PATCH 0068/1173] docs(guide/External Resources): move it after the introduction --- docs/content/guide/external-resources.ngdoc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/content/guide/external-resources.ngdoc b/docs/content/guide/external-resources.ngdoc index bed690de6d0b..d3d147cd5928 100644 --- a/docs/content/guide/external-resources.ngdoc +++ b/docs/content/guide/external-resources.ngdoc @@ -1,6 +1,6 @@ @ngdoc overview @name External Resources -@sortOrder 205 +@sortOrder 150 @description # External Angular 1 Resources From 5fd42b6cb8909419d32a6c83e863c4035c0a74ab Mon Sep 17 00:00:00 2001 From: Martin Staffa Date: Fri, 22 Jul 2016 21:33:33 +0200 Subject: [PATCH 0069/1173] docs(form): clarify what $setPristine does --- src/ng/directive/form.js | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/ng/directive/form.js b/src/ng/directive/form.js index d88b02c5508f..cb3c475a0f63 100644 --- a/src/ng/directive/form.js +++ b/src/ng/directive/form.js @@ -252,9 +252,11 @@ function FormController(element, attrs, $scope, $animate, $interpolate) { * @description * Sets the form to its pristine state. * - * This method can be called to remove the 'ng-dirty' class and set the form to its pristine - * state (ng-pristine class). This method will also propagate to all the controls contained - * in this form. + * This method sets the form's `$pristine` state to true, the `$dirty` state to false, removes + * the `ng-dirty` class and adds the `ng-pristine` class. Additionally, it sets the `$submitted` + * state to false. + * + * This method will also propagate to all the controls contained in this form. * * Setting a form back to a pristine state is often useful when we want to 'reuse' a form after * saving or resetting it. From ca812b0aebfc62287c920c07977be2ad00692d53 Mon Sep 17 00:00:00 2001 From: Martin Staffa Date: Sat, 23 Jul 2016 16:07:02 +0200 Subject: [PATCH 0070/1173] chore(travis): use Chrome 51 and FF 47 in unit tests PR (#14943) --- karma-shared.conf.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/karma-shared.conf.js b/karma-shared.conf.js index ff75df4228a8..5a60585001cb 100644 --- a/karma-shared.conf.js +++ b/karma-shared.conf.js @@ -37,12 +37,12 @@ module.exports = function(config, specificOptions) { 'SL_Chrome': { base: 'SauceLabs', browserName: 'chrome', - version: '47' + version: '51' }, 'SL_Firefox': { base: 'SauceLabs', browserName: 'firefox', - version: '43' + version: '47' }, 'SL_Safari_8': { base: 'SauceLabs', From b4769c371ecb79ebcd02183373c214c20aa31e41 Mon Sep 17 00:00:00 2001 From: Martin Staffa Date: Sat, 23 Jul 2016 17:20:16 +0200 Subject: [PATCH 0071/1173] fix(ngOptions): remove selected attribute from unselected options When the select model changes, we add the "selected" attribute to the selected option, so that screen readers know which option is selected. Previously, we failed to remove the attribute from the selected / empty option when the model changed to match a different option, or the unknown / empty option. When using "track by", the behavior would also show when a user selected an option, and then the model was changed, because track by watches the tracked expression, and calls the $render function on change. This fix reads the current select value, finds the matching option and removes the "selected" attribute. IE9 had to be special cased, as it will report option.hasAttribute('selected') === true even if the option's property and attribute have been unset (even the dev tools show not selected attribute). I've added a custom matcher that accounts for this behavior. In all other browsers, property and attribute should always be in the same state. Since few people will use screen readers with IE9, I hope this is a satisfactory solution to the problem. Fixes #14892 Fixes #14419 Related #12731 PR (#14894) --- src/ng/directive/ngOptions.js | 9 ++- test/ng/directive/ngOptionsSpec.js | 96 ++++++++++++++++++++++++++++++ 2 files changed, 104 insertions(+), 1 deletion(-) diff --git a/src/ng/directive/ngOptions.js b/src/ng/directive/ngOptions.js index 10d970097f02..781d68b423d1 100644 --- a/src/ng/directive/ngOptions.js +++ b/src/ng/directive/ngOptions.js @@ -448,10 +448,11 @@ var ngOptionsDirective = ['$compile', '$document', '$parse', function($compile, var removeEmptyOption = function() { if (!providedEmptyOption) { emptyOption.remove(); + } else { + emptyOption.removeAttr('selected'); } }; - var renderUnknownOption = function() { selectElement.prepend(unknownOption); selectElement.val('?'); @@ -467,8 +468,13 @@ var ngOptionsDirective = ['$compile', '$document', '$parse', function($compile, if (!multiple) { selectCtrl.writeValue = function writeNgOptionsValue(value) { + var selectedOption = options.selectValueMap[selectElement.val()]; var option = options.getOptionFromViewValue(value); + // Make sure to remove the selected attribute from the previously selected option + // Otherwise, screen readers might get confused + if (selectedOption) selectedOption.element.removeAttribute('selected'); + if (option) { // Don't update the option when it is already selected. // For example, the browser will select the first option by default. In that case, @@ -509,6 +515,7 @@ var ngOptionsDirective = ['$compile', '$document', '$parse', function($compile, // If we are using `track by` then we must watch the tracked value on the model // since ngModel only watches for object identity change + // FIXME: When a user selects an option, this watch will fire needlessly if (ngOptions.trackBy) { scope.$watch( function() { return ngOptions.getTrackByValue(ngModelCtrl.$viewValue); }, diff --git a/test/ng/directive/ngOptionsSpec.js b/test/ng/directive/ngOptionsSpec.js index 8fb6a2a9fa3f..d16c586516b9 100644 --- a/test/ng/directive/ngOptionsSpec.js +++ b/test/ng/directive/ngOptionsSpec.js @@ -120,6 +120,47 @@ describe('ngOptions', function() { return { pass: errors.length === 0, message: message }; } }; + }, + toBeMarkedAsSelected: function() { + // Selected is special because the element property and attribute reflect each other's state. + // IE9 will wrongly report hasAttribute('selected') === true when the property is + // undefined or null, and the dev tools show that no attribute is set + return { + compare: function(actual) { + var errors = []; + if (actual.selected === null || typeof actual.selected === 'undefined' || actual.selected === false) { + errors.push('Expected option property "selected" to be truthy'); + } + + if (msie !== 9 && actual.hasAttribute('selected') === false) { + errors.push('Expected option to have attribute "selected"'); + } + + var result = { + pass: errors.length === 0, + message: errors.join('\n') + }; + + return result; + }, + negativeCompare: function(actual) { + var errors = []; + if (actual.selected) { + errors.push('Expected option property "selected" to be falsy'); + } + + if (msie !== 9 && actual.hasAttribute('selected')) { + errors.push('Expected option not to have attribute "selected"'); + } + + var result = { + pass: errors.length === 0, + message: errors.join('\n') + }; + + return result; + } + }; } }); }); @@ -744,6 +785,41 @@ describe('ngOptions', function() { }); + it('should remove the "selected" attribute from the previous option when the model changes', function() { + scope.values = [{id: 10, label: 'ten'}, {id:20, label: 'twenty'}]; + + createSelect({ + 'ng-model': 'selected', + 'ng-options': 'item.label for item in values' + }, true); + + var options = element.find('option'); + expect(options[0]).toBeMarkedAsSelected(); + expect(options[1]).not.toBeMarkedAsSelected(); + expect(options[2]).not.toBeMarkedAsSelected(); + + scope.selected = scope.values[0]; + scope.$digest(); + + expect(options[0]).not.toBeMarkedAsSelected(); + expect(options[1]).toBeMarkedAsSelected(); + expect(options[2]).not.toBeMarkedAsSelected(); + + scope.selected = scope.values[1]; + scope.$digest(); + + expect(options[0]).not.toBeMarkedAsSelected(); + expect(options[1]).not.toBeMarkedAsSelected(); + expect(options[2]).toBeMarkedAsSelected(); + + scope.selected = 'no match'; + scope.$digest(); + + expect(options[0]).toBeMarkedAsSelected(); + expect(options[1]).not.toBeMarkedAsSelected(); + expect(options[2]).not.toBeMarkedAsSelected(); + }); + describe('disableWhen expression', function() { describe('on single select', function() { @@ -1395,6 +1471,26 @@ describe('ngOptions', function() { }); }).not.toThrow(); }); + + it('should remove the "selected" attribute when the model changes', function() { + createSelect({ + 'ng-model': 'selected', + 'ng-options': 'item.label for item in arr track by item.id' + }); + + var options = element.find('option'); + browserTrigger(options[2], 'click'); + + expect(scope.selected).toEqual(scope.arr[1]); + + scope.selected = {}; + scope.$digest(); + + expect(options[0]).toBeMarkedAsSelected(); + expect(options[2]).not.toBeMarkedAsSelected(); + expect(options[2]).not.toBeMarkedAsSelected(); + }); + }); From 544df1879ba447c4390a58dedfc5f1420cff1a7b Mon Sep 17 00:00:00 2001 From: Giuseppe Scoppino Date: Sat, 23 Jul 2016 18:50:50 -0400 Subject: [PATCH 0072/1173] docs(guide/component): document `$doCheck` in the component guide The docs for `$compile` were updated in e235f20 to include information about the recently implemented `$doCheck` lifecycle hook for component controllers. The lifecycle hook documentation is mirrored in the Component guide, and this change mirrors the update made to the `$compile` docs, to the component guide docs. Closes #14946 --- docs/content/guide/component.ngdoc | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/docs/content/guide/component.ngdoc b/docs/content/guide/component.ngdoc index 473bc42aecc4..c5c2a6df228d 100644 --- a/docs/content/guide/component.ngdoc +++ b/docs/content/guide/component.ngdoc @@ -160,6 +160,12 @@ of the component. The following hook methods can be implemented: are the names of the bound properties that have changed, and the values are an object of the form `{ currentValue, previousValue, isFirstChange() }`. Use this hook to trigger updates within a component such as cloning the bound value to prevent accidental mutation of the outer value. + * `$doCheck()` - Called on each turn of the digest cycle. Provides an opportunity to detect and act on + changes. Any actions that you wish to take in response to the changes that you detect must be + invoked from this hook; implementing this has no effect on when `$onChanges` is called. For example, this hook + could be useful if you wish to perform a deep equality check, or to check a Date object, changes to which would not + be detected by Angular's change detector and thus not trigger `$onChanges`. This hook is invoked with no arguments; + if detecting changes, you must store the previous value(s) for comparison to the current values. * `$onDestroy()` - Called on a controller when its containing scope is destroyed. Use this hook for releasing external resources, watches and event handlers. * `$postLink()` - Called after this controller's element and its children have been linked. Similar to the post-link From 10a6e1a663600ebd8c6ff7a21f1a872d5d95d3db Mon Sep 17 00:00:00 2001 From: Georgios Kalpakas Date: Wed, 20 Jul 2016 10:57:18 +0300 Subject: [PATCH 0073/1173] chore(travis): update sauce-connect Closes #14936 --- lib/saucelabs/start_tunnel.sh | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/lib/saucelabs/start_tunnel.sh b/lib/saucelabs/start_tunnel.sh index 55f9a1fff0f5..23cb23cfb6dc 100755 --- a/lib/saucelabs/start_tunnel.sh +++ b/lib/saucelabs/start_tunnel.sh @@ -11,9 +11,10 @@ set -e # Curl and run this script as part of your .travis.yml before_script section: # before_script: # - curl https://gist.github.com/santiycr/5139565/raw/sauce_connect_setup.sh | bash -CONNECT_URL="https://saucelabs.com/downloads/sc-4.3.13-linux.tar.gz" +SC_VERSION="4.3.16" +CONNECT_URL="https://saucelabs.com/downloads/sc-$SC_VERSION-linux.tar.gz" CONNECT_DIR="/tmp/sauce-connect-$RANDOM" -CONNECT_DOWNLOAD="sc-4.3.7-linux.tar.gz" +CONNECT_DOWNLOAD="sc-$SC_VERSION-linux.tar.gz" CONNECT_LOG="$LOGS_DIR/sauce-connect" CONNECT_STDOUT="$LOGS_DIR/sauce-connect.stdout" From d6423804a98eae1306ff5d3462a8b731b034b5eb Mon Sep 17 00:00:00 2001 From: Georgios Kalpakas Date: Thu, 21 Jul 2016 23:28:35 +0300 Subject: [PATCH 0074/1173] test($parse): test custom literals with CSP both enabled and disabled (This commit also includes a minor clean-up.) --- src/ng/parse.js | 9 +++---- test/ng/parseSpec.js | 57 ++++++++++++++++++++++++-------------------- 2 files changed, 36 insertions(+), 30 deletions(-) diff --git a/src/ng/parse.js b/src/ng/parse.js index 3599b7f25947..4a6890b8d33d 100644 --- a/src/ng/parse.js +++ b/src/ng/parse.js @@ -398,8 +398,7 @@ AST.prototype = { filterChain: function() { var left = this.expression(); - var token; - while ((token = this.expect('|'))) { + while (this.expect('|')) { left = this.filter(left); } return left; @@ -695,6 +694,7 @@ function isStateless($filter, filterName) { function findConstantAndWatchExpressions(ast, $filter) { var allConstants; var argsToWatch; + var isStatelessFilter; switch (ast.type) { case AST.Program: allConstants = true; @@ -745,7 +745,8 @@ function findConstantAndWatchExpressions(ast, $filter) { ast.toWatch = [ast]; break; case AST.CallExpression: - allConstants = ast.filter ? isStateless($filter, ast.callee.name) : false; + isStatelessFilter = ast.filter ? isStateless($filter, ast.callee.name) : false; + allConstants = isStatelessFilter; argsToWatch = []; forEach(ast.arguments, function(expr) { findConstantAndWatchExpressions(expr, $filter); @@ -755,7 +756,7 @@ function findConstantAndWatchExpressions(ast, $filter) { } }); ast.constant = allConstants; - ast.toWatch = ast.filter && isStateless($filter, ast.callee.name) ? argsToWatch : [ast]; + ast.toWatch = isStatelessFilter ? argsToWatch : [ast]; break; case AST.AssignmentExpression: findConstantAndWatchExpressions(ast.left, $filter); diff --git a/test/ng/parseSpec.js b/test/ng/parseSpec.js index 116bd9f06de2..5afbd8c8f707 100644 --- a/test/ng/parseSpec.js +++ b/test/ng/parseSpec.js @@ -868,7 +868,6 @@ describe('parser', function() { }); - it('should understand logical operators', function() { forEach(['||', '&&'], function(operator) { expect(createAst('foo' + operator + 'bar')).toEqual( @@ -918,7 +917,6 @@ describe('parser', function() { }); - it('should understand ternary operators', function() { expect(createAst('foo?bar:baz')).toEqual( { @@ -1083,7 +1081,6 @@ describe('parser', function() { }); - it('should give higher precedence to the logical `or` than to the conditional operator', function() { expect(createAst('foo||bar?man:shell')).toEqual( { @@ -1355,6 +1352,7 @@ describe('parser', function() { ); }); + it('should understand ES6 object initializer', function() { // Shorthand properties definitions. expect(createAst('{x, y, z}')).toEqual( @@ -1447,6 +1445,7 @@ describe('parser', function() { ); }); + it('should understand multiple expressions', function() { expect(createAst('foo = bar; man = shell')).toEqual( { @@ -1551,6 +1550,7 @@ describe('parser', function() { ); }); + it('should give higher precedence to assignments over filters', function() { expect(createAst('foo=bar | man')).toEqual( { @@ -1577,6 +1577,7 @@ describe('parser', function() { ); }); + it('should accept expression as filters parameters', function() { expect(createAst('foo | bar:baz=man')).toEqual( { @@ -1604,6 +1605,7 @@ describe('parser', function() { ); }); + it('should accept expression as computer members', function() { expect(createAst('foo[a = 1]')).toEqual( { @@ -1628,6 +1630,7 @@ describe('parser', function() { ); }); + it('should accept expression in function arguments', function() { expect(createAst('foo(a = 1)')).toEqual( { @@ -1653,6 +1656,7 @@ describe('parser', function() { ); }); + it('should accept expression as part of ternary operators', function() { expect(createAst('foo || bar ? man = 1 : shell = 1')).toEqual( { @@ -1687,6 +1691,7 @@ describe('parser', function() { ); }); + it('should accept expression as part of array literals', function() { expect(createAst('[foo = 1]')).toEqual( { @@ -1711,6 +1716,7 @@ describe('parser', function() { ); }); + it('should accept expression as part of object literals', function() { expect(createAst('{foo: bar = 1}')).toEqual( { @@ -1741,6 +1747,7 @@ describe('parser', function() { ); }); + it('should be possible to use parenthesis to indicate precedence', function() { expect(createAst('(foo + bar).man')).toEqual( { @@ -1765,6 +1772,7 @@ describe('parser', function() { ); }); + it('should skip empty expressions', function() { expect(createAst('foo;;;;bar')).toEqual( { @@ -1813,9 +1821,10 @@ describe('parser', function() { }])); forEach([true, false], function(cspEnabled) { - beforeEach(module(['$parseProvider', function(parseProvider) { - parseProvider.addLiteral('Infinity', Infinity); - }])); + beforeEach(module(function($parseProvider) { + $parseProvider.addLiteral('Infinity', Infinity); + csp().noUnsafeEval = cspEnabled; + })); it('should allow extending literals with csp ' + cspEnabled, inject(function($rootScope) { expect($rootScope.$eval("Infinity")).toEqual(Infinity); @@ -2116,16 +2125,16 @@ describe('parser', function() { expect(scope.b).toEqual(234); }); - it('should evaluate assignments in ternary operator', function() { - scope.$eval('a = 1 ? 2 : 3'); - expect(scope.a).toBe(2); + it('should evaluate assignments in ternary operator', function() { + scope.$eval('a = 1 ? 2 : 3'); + expect(scope.a).toBe(2); - scope.$eval('0 ? a = 2 : a = 3'); - expect(scope.a).toBe(3); + scope.$eval('0 ? a = 2 : a = 3'); + expect(scope.a).toBe(3); - scope.$eval('1 ? a = 2 : a = 3'); - expect(scope.a).toBe(2); - }); + scope.$eval('1 ? a = 2 : a = 3'); + expect(scope.a).toBe(2); + }); it('should evaluate function call without arguments', function() { scope['const'] = function(a, b) {return 123;}; @@ -2417,7 +2426,6 @@ describe('parser', function() { }).toThrowMinErr( '$parse', 'isecfn', 'Referencing Function in Angular expressions is disallowed! ' + 'Expression: {}.toString.constructor'); - }); it('should not allow access to the Function prototype in the getter', function() { @@ -2426,7 +2434,6 @@ describe('parser', function() { }).toThrowMinErr( '$parse', 'isecfn', 'Referencing Function in Angular expressions is disallowed! ' + 'Expression: toString.constructor.prototype'); - }); it('should NOT allow access to Function constructor in getter', function() { @@ -2435,7 +2442,6 @@ describe('parser', function() { }).toThrowMinErr( '$parse', 'isecfn', 'Referencing Function in Angular expressions is disallowed! ' + 'Expression: {}.toString.constructor("alert(1)")'); - }); it('should NOT allow access to Function constructor in setter', function() { @@ -2936,14 +2942,14 @@ describe('parser', function() { }); }); - it('should prevent the exploit', function() { - expect(function() { - scope.$eval('(1)[{0: "__proto__", 1: "__proto__", 2: "__proto__", 3: "safe", length: 4, toString: [].pop}].foo = 1'); - }).toThrow(); - if (!msie || msie > 10) { - expect((1)['__proto__'].foo).toBeUndefined(); - } - }); + it('should prevent the exploit', function() { + expect(function() { + scope.$eval('(1)[{0: "__proto__", 1: "__proto__", 2: "__proto__", 3: "safe", length: 4, toString: [].pop}].foo = 1'); + }).toThrow(); + if (!msie || msie > 10) { + expect((1)['__proto__'].foo).toBeUndefined(); + } + }); it('should prevent the exploit', function() { expect(function() { @@ -3337,7 +3343,6 @@ describe('parser', function() { expect($rootScope.$$watchers.length).toBe(1); expect(log).toEqual([]); })); - }); }); From 8ddfa2a491231004f2ff016f7ec448c309c4f30f Mon Sep 17 00:00:00 2001 From: Georgios Kalpakas Date: Fri, 22 Jul 2016 12:46:02 +0300 Subject: [PATCH 0075/1173] fix($parse): correctly escape unsafe identifier characters This commit also adds a couple of tests for `$parseProvider.setIdentifierFns()`. Closes #14942 --- src/ng/parse.js | 2 +- test/ng/parseSpec.js | 88 ++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 89 insertions(+), 1 deletion(-) diff --git a/src/ng/parse.js b/src/ng/parse.js index 4a6890b8d33d..f80a214f4e61 100644 --- a/src/ng/parse.js +++ b/src/ng/parse.js @@ -1261,7 +1261,7 @@ ASTCompiler.prototype = { }, nonComputedMember: function(left, right) { - var SAFE_IDENTIFIER = /[$_a-zA-Z][$_a-zA-Z0-9]*/; + var SAFE_IDENTIFIER = /^[$_a-zA-Z][$_a-zA-Z0-9]*$/; var UNSAFE_CHARACTERS = /[^$_a-zA-Z0-9]/g; if (SAFE_IDENTIFIER.test(right)) { return left + '.' + right; diff --git a/test/ng/parseSpec.js b/test/ng/parseSpec.js index 5afbd8c8f707..cdb3e3aaa7c5 100644 --- a/test/ng/parseSpec.js +++ b/test/ng/parseSpec.js @@ -3897,4 +3897,92 @@ describe('parser', function() { }); }); }); + + forEach([true, false], function(cspEnabled) { + describe('custom identifiers (csp: ' + cspEnabled + ')', function() { + var isIdentifierStartRe = /[#a-z]/; + var isIdentifierContinueRe = /[\-a-z]/; + var isIdentifierStartFn; + var isIdentifierContinueFn; + var scope; + + beforeEach(module(function($parseProvider) { + isIdentifierStartFn = jasmine. + createSpy('isIdentifierStart'). + and.callFake(function(ch, cp) { return isIdentifierStartRe.test(ch); }); + isIdentifierContinueFn = jasmine. + createSpy('isIdentifierContinue'). + and.callFake(function(ch, cp) { return isIdentifierContinueRe.test(ch); }); + + $parseProvider.setIdentifierFns(isIdentifierStartFn, isIdentifierContinueFn); + csp().noUnsafeEval = cspEnabled; + })); + + beforeEach(inject(function($rootScope) { + scope = $rootScope; + })); + + + it('should allow specifying a custom `isIdentifierStart/Continue` functions', function() { + scope.x = {}; + + scope['#foo'] = 'foo'; + scope.x['#foo'] = 'foo'; + expect(scope.$eval('#foo')).toBe('foo'); + expect(scope.$eval('x.#foo')).toBe('foo'); + + scope['bar--'] = 42; + scope.x['bar--'] = 42; + expect(scope.$eval('bar--')).toBe(42); + expect(scope.$eval('x.bar--')).toBe(42); + expect(scope['bar--']).toBe(42); + expect(scope.x['bar--']).toBe(42); + + scope['#-'] = 'baz'; + scope.x['#-'] = 'baz'; + expect(scope.$eval('#-')).toBe('baz'); + expect(scope.$eval('x.#-')).toBe('baz'); + + expect(function() { scope.$eval('##'); }).toThrow(); + expect(function() { scope.$eval('x.##'); }).toThrow(); + + expect(function() { scope.$eval('--'); }).toThrow(); + expect(function() { scope.$eval('x.--'); }).toThrow(); + }); + + + it('should pass the character and codepoint to the custom functions', function() { + scope.$eval('#-'); + expect(isIdentifierStartFn).toHaveBeenCalledOnceWith('#', '#'.charCodeAt(0)); + expect(isIdentifierContinueFn).toHaveBeenCalledOnceWith('-', '-'.charCodeAt(0)); + + isIdentifierStartFn.calls.reset(); + isIdentifierContinueFn.calls.reset(); + + scope.$eval('#.foo.#-.bar-'); + expect(isIdentifierStartFn).toHaveBeenCalledTimes(7); + expect(isIdentifierStartFn.calls.allArgs()).toEqual([ + ['#', '#'.charCodeAt(0)], + ['.', '.'.charCodeAt(0)], + ['f', 'f'.charCodeAt(0)], + ['.', '.'.charCodeAt(0)], + ['#', '#'.charCodeAt(0)], + ['.', '.'.charCodeAt(0)], + ['b', 'b'.charCodeAt(0)] + ]); + expect(isIdentifierContinueFn).toHaveBeenCalledTimes(9); + expect(isIdentifierContinueFn.calls.allArgs()).toEqual([ + ['.', '.'.charCodeAt(0)], + ['o', 'o'.charCodeAt(0)], + ['o', 'o'.charCodeAt(0)], + ['.', '.'.charCodeAt(0)], + ['-', '-'.charCodeAt(0)], + ['.', '.'.charCodeAt(0)], + ['a', 'a'.charCodeAt(0)], + ['r', 'r'.charCodeAt(0)], + ['-', '-'.charCodeAt(0)] + ]); + }); + }); + }); }); From 4fa214ce32bf1cbdcfbbf6e525e057646370f6e7 Mon Sep 17 00:00:00 2001 From: Georgios Kalpakas Date: Mon, 25 Jul 2016 21:14:29 +0300 Subject: [PATCH 0076/1173] fix($parse): block assigning to fields of a constructor prototype This commit also adds the missing `isecaf` error page and more tests for assignment to constructors. Fixes #14939 Closes #14951 --- docs/content/error/$parse/isecaf.ngdoc | 12 ++ src/ng/parse.js | 24 ++- test/ng/parseSpec.js | 206 +++++++++++++++++++++++-- 3 files changed, 227 insertions(+), 15 deletions(-) create mode 100644 docs/content/error/$parse/isecaf.ngdoc diff --git a/docs/content/error/$parse/isecaf.ngdoc b/docs/content/error/$parse/isecaf.ngdoc new file mode 100644 index 000000000000..115e1b26d754 --- /dev/null +++ b/docs/content/error/$parse/isecaf.ngdoc @@ -0,0 +1,12 @@ +@ngdoc error +@name $parse:isecaf +@fullName Assigning to Fields of Disallowed Context +@description + +Occurs when an expression attempts to assign a value on a field of any of the `Boolean`, `Number`, +`String`, `Array`, `Object`, or `Function` constructors or the corresponding prototypes. + +Angular bans the modification of these constructors or their prototypes from within expressions, +since it is a known way to modify the behaviour of existing functions/operations. + +To resolve this error, avoid assigning to fields of constructors or their prototypes in expressions. diff --git a/src/ng/parse.js b/src/ng/parse.js index f80a214f4e61..27f436e567cb 100644 --- a/src/ng/parse.js +++ b/src/ng/parse.js @@ -113,10 +113,28 @@ function ensureSafeFunction(obj, fullExpression) { function ensureSafeAssignContext(obj, fullExpression) { if (obj) { - if (obj === (0).constructor || obj === (false).constructor || obj === ''.constructor || - obj === {}.constructor || obj === [].constructor || obj === Function.constructor) { + var booleanConstructor = (false).constructor; + var numberConstructor = (0).constructor; + var stringConstructor = ''.constructor; + var objectConstructor = {}.constructor; + var arrayConstructor = [].constructor; + var functionConstructor = Function.constructor; + + if (obj === booleanConstructor || + obj === numberConstructor || + obj === stringConstructor || + obj === objectConstructor || + obj === arrayConstructor || + obj === functionConstructor || + obj === booleanConstructor.prototype || + obj === numberConstructor.prototype || + obj === stringConstructor.prototype || + obj === objectConstructor.prototype || + obj === arrayConstructor.prototype || + obj === functionConstructor.prototype) { throw $parseMinErr('isecaf', - 'Assigning to a constructor is disallowed! Expression: {0}', fullExpression); + 'Assigning to a constructor or its prototype is disallowed! Expression: {0}', + fullExpression); } } } diff --git a/test/ng/parseSpec.js b/test/ng/parseSpec.js index cdb3e3aaa7c5..e1f21f6b80de 100644 --- a/test/ng/parseSpec.js +++ b/test/ng/parseSpec.js @@ -2963,39 +2963,221 @@ describe('parser', function() { }).toThrow(); }); - it('should prevent assigning in the context of a constructor', function() { + they('should prevent assigning in the context of the $prop constructor', { + Array: [[], '[]'], + Boolean: [true, '(true)'], + Number: [1, '(1)'], + String: ['string', '"string"'] + }, function(values) { + var thing = values[0]; + var expr = values[1]; + var constructorExpr = expr + '.constructor'; + + expect(function() { + scope.$eval(constructorExpr + '.join'); + }).not.toThrow(); expect(function() { - scope.$eval("''.constructor.join"); + delete scope.foo; + scope.$eval('foo = ' + constructorExpr + '.join'); }).not.toThrow(); expect(function() { - scope.$eval("''.constructor.join = ''.constructor.join"); + scope.$eval(constructorExpr + '.join = ""'); + }).toThrowMinErr('$parse', 'isecaf'); + expect(function() { + scope.$eval(constructorExpr + '[0] = ""'); + }).toThrowMinErr('$parse', 'isecaf'); + expect(function() { + delete scope.foo; + scope.$eval('foo = ' + constructorExpr + '; foo.join = ""'); + }).toThrowMinErr('$parse', 'isecaf'); + + expect(function() { + scope.foo = thing; + scope.$eval('foo.constructor[0] = ""'); + }).toThrowMinErr('$parse', 'isecaf'); + expect(function() { + delete scope.foo; + scope.$eval('foo.constructor[0] = ""', {foo: thing}); + }).toThrowMinErr('$parse', 'isecaf'); + expect(function() { + scope.foo = thing.constructor; + scope.$eval('foo[0] = ""'); + }).toThrowMinErr('$parse', 'isecaf'); + expect(function() { + delete scope.foo; + scope.$eval('foo[0] = ""', {foo: thing.constructor}); + }).toThrowMinErr('$parse', 'isecaf'); + }); + + they('should prevent assigning in the context of the $prop constructor', { + // These might throw different error (e.g. isecobj, isecfn), + // but still having them here for good measure + Function: [noop, '$eval'], + Object: [{}, '{}'] + }, function(values) { + var thing = values[0]; + var expr = values[1]; + var constructorExpr = expr + '.constructor'; + + expect(function() { + scope.$eval(constructorExpr + '.join'); + }).not.toThrowMinErr('$parse', 'isecaf'); + expect(function() { + delete scope.foo; + scope.$eval('foo = ' + constructorExpr + '.join'); + }).not.toThrowMinErr('$parse', 'isecaf'); + expect(function() { + scope.$eval(constructorExpr + '.join = ""'); }).toThrow(); expect(function() { - scope.$eval("''.constructor[0] = ''"); + scope.$eval(constructorExpr + '[0] = ""'); }).toThrow(); expect(function() { - scope.$eval("(0).constructor[0] = ''"); + delete scope.foo; + scope.$eval('foo = ' + constructorExpr + '; foo.join = ""'); }).toThrow(); + expect(function() { - scope.$eval("{}.constructor[0] = ''"); + scope.foo = thing; + scope.$eval('foo.constructor[0] = ""'); }).toThrow(); - // foo.constructor is the object constructor. expect(function() { - scope.$eval("foo.constructor[0] = ''", {foo: {}}); + delete scope.foo; + scope.$eval('foo.constructor[0] = ""', {foo: thing}); }).toThrow(); + expect(function() { + scope.foo = thing.constructor; + scope.$eval('foo[0] = ""'); + }).toThrowMinErr('$parse', 'isecaf'); + expect(function() { + delete scope.foo; + scope.$eval('foo[0] = ""', {foo: thing.constructor}); + }).toThrowMinErr('$parse', 'isecaf'); + }); + + it('should prevent assigning only in the context of an actual constructor', function() { // foo.constructor is not a constructor. expect(function() { - scope.$eval("foo.constructor[0] = ''", {foo: {constructor: ''}}); + delete scope.foo; + scope.$eval('foo.constructor[0] = ""', {foo: {constructor: ''}}); + }).not.toThrow(); + + expect(function() { + scope.$eval('"a".constructor.prototype.charAt = [].join'); + }).toThrowMinErr('$parse', 'isecaf'); + expect(function() { + scope.$eval('"a".constructor.prototype.charCodeAt = [].concat'); + }).toThrowMinErr('$parse', 'isecaf'); + }); + + they('should prevent assigning in the context of the $prop constructor prototype', { + Array: [[], '[]'], + Boolean: [true, '(true)'], + Number: [1, '(1)'], + String: ['string', '"string"'] + }, function(values) { + var thing = values[0]; + var expr = values[1]; + var constructorExpr = expr + '.constructor'; + var prototypeExpr = constructorExpr + '.prototype'; + + expect(function() { + scope.$eval(prototypeExpr + '.boin'); + }).not.toThrow(); + expect(function() { + delete scope.foo; + scope.$eval('foo = ' + prototypeExpr + '.boin'); }).not.toThrow(); expect(function() { - scope.$eval("objConstructor = {}.constructor; objConstructor.join = ''"); + scope.$eval(prototypeExpr + '.boin = ""'); + }).toThrowMinErr('$parse', 'isecaf'); + expect(function() { + scope.$eval(prototypeExpr + '[0] = ""'); + }).toThrowMinErr('$parse', 'isecaf'); + expect(function() { + delete scope.foo; + scope.$eval('foo = ' + constructorExpr + '; foo.prototype.boin = ""'); + }).toThrowMinErr('$parse', 'isecaf'); + expect(function() { + delete scope.foo; + scope.$eval('foo = ' + prototypeExpr + '; foo.boin = ""'); + }).toThrowMinErr('$parse', 'isecaf'); + + expect(function() { + scope.foo = thing.constructor; + scope.$eval('foo.prototype[0] = ""'); + }).toThrowMinErr('$parse', 'isecaf'); + expect(function() { + delete scope.foo; + scope.$eval('foo.prototype[0] = ""', {foo: thing.constructor}); + }).toThrowMinErr('$parse', 'isecaf'); + expect(function() { + scope.foo = thing.constructor.prototype; + scope.$eval('foo[0] = ""'); + }).toThrowMinErr('$parse', 'isecaf'); + expect(function() { + delete scope.foo; + scope.$eval('foo[0] = ""', {foo: thing.constructor.prototype}); + }).toThrowMinErr('$parse', 'isecaf'); + }); + + they('should prevent assigning in the context of a constructor prototype', { + // These might throw different error (e.g. isecobj, isecfn), + // but still having them here for good measure + Function: [noop, '$eval'], + Object: [{}, '{}'] + }, function(values) { + var thing = values[0]; + var expr = values[1]; + var constructorExpr = expr + '.constructor'; + var prototypeExpr = constructorExpr + '.prototype'; + + expect(function() { + scope.$eval(prototypeExpr + '.boin'); + }).not.toThrowMinErr('$parse', 'isecaf'); + expect(function() { + delete scope.foo; + scope.$eval('foo = ' + prototypeExpr + '.boin'); + }).not.toThrowMinErr('$parse', 'isecaf'); + expect(function() { + scope.$eval(prototypeExpr + '.boin = ""'); }).toThrow(); expect(function() { - scope.$eval("'a'.constructor.prototype.charAt=[].join"); + scope.$eval(prototypeExpr + '[0] = ""'); }).toThrow(); expect(function() { - scope.$eval("'a'.constructor.prototype.charCodeAt=[].concat"); + delete scope.foo; + scope.$eval('foo = ' + constructorExpr + '; foo.prototype.boin = ""'); }).toThrow(); + expect(function() { + delete scope.foo; + scope.$eval('foo = ' + prototypeExpr + '; foo.boin = ""'); + }).toThrow(); + + expect(function() { + scope.foo = thing.constructor; + scope.$eval('foo.prototype[0] = ""'); + }).toThrowMinErr('$parse', 'isecaf'); + expect(function() { + delete scope.foo; + scope.$eval('foo.prototype[0] = ""', {foo: thing.constructor}); + }).toThrowMinErr('$parse', 'isecaf'); + expect(function() { + scope.foo = thing.constructor.prototype; + scope.$eval('foo[0] = ""'); + }).toThrowMinErr('$parse', 'isecaf'); + expect(function() { + delete scope.foo; + scope.$eval('foo[0] = ""', {foo: thing.constructor.prototype}); + }).toThrowMinErr('$parse', 'isecaf'); + }); + + it('should prevent assigning only in the context of an actual prototype', function() { + // foo.constructor.prototype is not a constructor prototype. + expect(function() { + delete scope.foo; + scope.$eval('foo.constructor.prototype[0] = ""', {foo: {constructor: {prototype: ''}}}); + }).not.toThrow(); }); }); From c0795c97a5cd922722c813a5177c172b6820ed3b Mon Sep 17 00:00:00 2001 From: Georgios Kalpakas Date: Wed, 27 Jul 2016 12:04:03 +0300 Subject: [PATCH 0077/1173] docs(ngModel/numfmt): remove redundant argument --- docs/content/error/ngModel/numfmt.ngdoc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/content/error/ngModel/numfmt.ngdoc b/docs/content/error/ngModel/numfmt.ngdoc index 19e50f522ee3..3451d26fdf84 100644 --- a/docs/content/error/ngModel/numfmt.ngdoc +++ b/docs/content/error/ngModel/numfmt.ngdoc @@ -47,10 +47,10 @@ directive to convert it into the format the `input[number]` directive expects. return '' + value; }); ngModel.$formatters.push(function(value) { - return parseFloat(value, 10); + return parseFloat(value); }); } }; }); - \ No newline at end of file + From 9ac9fb1565ea601a16033061d5a460a41bd89f93 Mon Sep 17 00:00:00 2001 From: Chung-Min Cheng Date: Thu, 28 Jul 2016 12:17:01 +0900 Subject: [PATCH 0078/1173] docs(guide/animations): clean up example Remove unnecessary inline styles, merge styles for identical selectors and clean up. Closes #14960 --- docs/content/guide/animations.ngdoc | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/docs/content/guide/animations.ngdoc b/docs/content/guide/animations.ngdoc index 411a7bd3412b..8058f8ce41f3 100644 --- a/docs/content/guide/animations.ngdoc +++ b/docs/content/guide/animations.ngdoc @@ -25,26 +25,26 @@ Below is a quick example of animations being enabled for `ngShow` and `ngHide`: -
    +
    -
    - Visible... +
    + Content...
    - .sample-show-hide { - padding: 10px; + .content-area { border: 1px solid black; - background: white; + margin-top: 10px; + padding: 10px; } .sample-show-hide { transition: all linear 0.5s; } - .sample-show-hide.ng-hide { opacity: 0; } From 13b7bf0bb5262400a06de6419312fe3010f79cb2 Mon Sep 17 00:00:00 2001 From: Peter Bacon Darwin Date: Wed, 27 Jul 2016 18:30:35 +0100 Subject: [PATCH 0079/1173] docs(examples): give all examples a name Closes #14958 --- docs/content/error/ngModel/numfmt.ngdoc | 2 +- docs/content/guide/$location.ngdoc | 2 +- docs/content/guide/accessibility.ngdoc | 4 ++-- docs/content/guide/animations.ngdoc | 4 ++-- docs/content/guide/compiler.ngdoc | 2 +- docs/content/guide/component.ngdoc | 2 +- docs/content/guide/controller.ngdoc | 6 ++--- docs/content/guide/directive.ngdoc | 28 +++++++++++------------ docs/content/guide/expression.ngdoc | 10 ++++----- docs/content/guide/filter.ngdoc | 6 ++--- docs/content/guide/forms.ngdoc | 16 ++++++------- docs/content/guide/module.ngdoc | 4 ++-- docs/content/guide/scope.ngdoc | 8 +++---- docs/content/guide/services.ngdoc | 2 +- src/Angular.js | 6 ++--- src/ng/anchorScroll.js | 4 ++-- src/ng/cacheFactory.js | 2 +- src/ng/compile.js | 2 +- src/ng/directive/attrs.js | 12 +++++----- src/ng/directive/form.js | 2 +- src/ng/directive/ngBind.js | 6 ++--- src/ng/directive/ngClass.js | 8 +++---- src/ng/directive/ngCloak.js | 2 +- src/ng/directive/ngEventDirs.js | 30 ++++++++++++------------- src/ng/directive/ngIf.js | 2 +- src/ng/directive/ngInclude.js | 2 +- src/ng/directive/ngInit.js | 2 +- src/ng/directive/ngModel.js | 2 +- src/ng/directive/ngNonBindable.js | 2 +- src/ng/directive/ngOptions.js | 2 +- src/ng/directive/ngPluralize.js | 2 +- src/ng/directive/ngRepeat.js | 2 +- src/ng/directive/ngShowHide.js | 4 ++-- src/ng/directive/ngStyle.js | 2 +- src/ng/directive/ngSwitch.js | 2 +- src/ng/directive/ngTransclude.js | 2 +- src/ng/directive/script.js | 2 +- src/ng/document.js | 2 +- src/ng/filter/filter.js | 2 +- src/ng/filter/filters.js | 8 +++---- src/ng/filter/limitTo.js | 2 +- src/ng/http.js | 2 +- src/ng/interpolate.js | 2 +- src/ng/interval.js | 2 +- src/ng/log.js | 2 +- src/ng/sce.js | 2 +- src/ng/window.js | 2 +- src/ngSanitize/filter/linky.js | 2 +- src/ngSanitize/sanitize.js | 2 +- src/ngTouch/directive/ngClick.js | 2 +- src/ngTouch/directive/ngSwipe.js | 4 ++-- 51 files changed, 117 insertions(+), 117 deletions(-) diff --git a/docs/content/error/ngModel/numfmt.ngdoc b/docs/content/error/ngModel/numfmt.ngdoc index 3451d26fdf84..d59248f79393 100644 --- a/docs/content/error/ngModel/numfmt.ngdoc +++ b/docs/content/error/ngModel/numfmt.ngdoc @@ -20,7 +20,7 @@ In this example, our model stores the number as a string, so we provide the `str directive to convert it into the format the `input[number]` directive expects. - + diff --git a/docs/content/guide/$location.ngdoc b/docs/content/guide/$location.ngdoc index 51b3cb4a2ed4..cc41d81c92a5 100644 --- a/docs/content/guide/$location.ngdoc +++ b/docs/content/guide/$location.ngdoc @@ -834,7 +834,7 @@ then uses the information it obtains to compose hashbang URLs (such as Because `$location` uses getters/setters, you can use `ng-model-options="{ getterSetter: true }"` to bind it to `ngModel`: - +
    diff --git a/docs/content/guide/accessibility.ngdoc b/docs/content/guide/accessibility.ngdoc index 2e85d616f55a..411492060502 100644 --- a/docs/content/guide/accessibility.ngdoc +++ b/docs/content/guide/accessibility.ngdoc @@ -62,7 +62,7 @@ attributes (if they have not been explicitly specified by the developer): ### Example - +
    +
    <div> with ng-click and bindRoleForClick, tabindex set to false diff --git a/docs/content/guide/animations.ngdoc b/docs/content/guide/animations.ngdoc index 8058f8ce41f3..990cee18cca2 100644 --- a/docs/content/guide/animations.ngdoc +++ b/docs/content/guide/animations.ngdoc @@ -23,7 +23,7 @@ Animations are not available unless you include the {@link ngAnimate `ngAnimate` Below is a quick example of animations being enabled for `ngShow` and `ngHide`: - +
    ', '
    '], 'tr': [2, '', '
    '], 'td': [3, '', '
    '], - '_default': [0, "", ""] + '_default': [0, '', ''] }; wrapMap.optgroup = wrapMap.option; @@ -208,10 +208,10 @@ function jqLiteBuildFragment(html, context) { nodes.push(context.createTextNode(html)); } else { // Convert html into DOM nodes - tmp = fragment.appendChild(context.createElement("div")); - tag = (TAG_NAME_REGEXP.exec(html) || ["", ""])[1].toLowerCase(); + tmp = fragment.appendChild(context.createElement('div')); + tag = (TAG_NAME_REGEXP.exec(html) || ['', ''])[1].toLowerCase(); wrap = wrapMap[tag] || wrapMap._default; - tmp.innerHTML = wrap[1] + html.replace(XHTML_TAG_REGEXP, "<$1>") + wrap[2]; + tmp.innerHTML = wrap[1] + html.replace(XHTML_TAG_REGEXP, '<$1>') + wrap[2]; // Descend through wrappers to the right content i = wrap[0]; @@ -222,12 +222,12 @@ function jqLiteBuildFragment(html, context) { nodes = concat(nodes, tmp.childNodes); tmp = fragment.firstChild; - tmp.textContent = ""; + tmp.textContent = ''; } // Remove wrapper from fragment - fragment.textContent = ""; - fragment.innerHTML = ""; // Clear inner HTML + fragment.textContent = ''; + fragment.innerHTML = ''; // Clear inner HTML forEach(nodes, function(node) { fragment.appendChild(node); }); @@ -409,17 +409,17 @@ function jqLiteData(element, key, value) { function jqLiteHasClass(element, selector) { if (!element.getAttribute) return false; - return ((" " + (element.getAttribute('class') || '') + " ").replace(/[\n\t]/g, " "). - indexOf(" " + selector + " ") > -1); + return ((' ' + (element.getAttribute('class') || '') + ' ').replace(/[\n\t]/g, ' '). + indexOf(' ' + selector + ' ') > -1); } function jqLiteRemoveClass(element, cssClasses) { if (cssClasses && element.setAttribute) { forEach(cssClasses.split(' '), function(cssClass) { element.setAttribute('class', trim( - (" " + (element.getAttribute('class') || '') + " ") - .replace(/[\n\t]/g, " ") - .replace(" " + trim(cssClass) + " ", " ")) + (' ' + (element.getAttribute('class') || '') + ' ') + .replace(/[\n\t]/g, ' ') + .replace(' ' + trim(cssClass) + ' ', ' ')) ); }); } @@ -428,7 +428,7 @@ function jqLiteRemoveClass(element, cssClasses) { function jqLiteAddClass(element, cssClasses) { if (cssClasses && element.setAttribute) { var existingClasses = (' ' + (element.getAttribute('class') || '') + ' ') - .replace(/[\n\t]/g, " "); + .replace(/[\n\t]/g, ' '); forEach(cssClasses.split(' '), function(cssClass) { cssClass = trim(cssClass); diff --git a/src/loader.js b/src/loader.js index da71b184f241..e7395558950c 100644 --- a/src/loader.js +++ b/src/loader.js @@ -91,9 +91,9 @@ function setupModuleLoader(window) { } return ensure(modules, name, function() { if (!requires) { - throw $injectorMinErr('nomod', "Module '{0}' is not available! You either misspelled " + - "the module name or forgot to load it. If registering a module ensure that you " + - "specify the dependencies as the second argument.", name); + throw $injectorMinErr('nomod', 'Module \'{0}\' is not available! You either misspelled ' + + 'the module name or forgot to load it. If registering a module ensure that you ' + + 'specify the dependencies as the second argument.', name); } /** @type {!Array.>} */ diff --git a/src/ng/animate.js b/src/ng/animate.js index 06c706e7c12b..b55a0376bf4a 100644 --- a/src/ng/animate.js +++ b/src/ng/animate.js @@ -223,7 +223,7 @@ var $AnimateProvider = ['$provide', /** @this */ function($provide) { */ this.register = function(name, factory) { if (name && name.charAt(0) !== '.') { - throw $animateMinErr('notcsel', "Expecting class selector starting with '.' got '{0}'.", name); + throw $animateMinErr('notcsel', 'Expecting class selector starting with \'.\' got \'{0}\'.', name); } var key = name + '-animation'; @@ -249,7 +249,7 @@ var $AnimateProvider = ['$provide', /** @this */ function($provide) { if (arguments.length === 1) { this.$$classNameFilter = (expression instanceof RegExp) ? expression : null; if (this.$$classNameFilter) { - var reservedRegex = new RegExp("(\\s+|\\/)" + NG_ANIMATE_CLASSNAME + "(\\s+|\\/)"); + var reservedRegex = new RegExp('(\\s+|\\/)' + NG_ANIMATE_CLASSNAME + '(\\s+|\\/)'); if (reservedRegex.test(this.$$classNameFilter.toString())) { throw $animateMinErr('nongcls','$animateProvider.classNameFilter(regex) prohibits accepting a regex value which matches/contains the "{0}" CSS class.', NG_ANIMATE_CLASSNAME); diff --git a/src/ng/browser.js b/src/ng/browser.js index ebed151bbcd6..001f09b9c511 100644 --- a/src/ng/browser.js +++ b/src/ng/browser.js @@ -177,7 +177,7 @@ function Browser(window, document, $log, $sniffer) { // the new location.href if a reload happened or if there is a bug like in iOS 9 (see // https://openradar.appspot.com/22186109). // - the replacement is a workaround for https://bugzilla.mozilla.org/show_bug.cgi?id=407172 - return pendingLocation || location.href.replace(/%27/g,"'"); + return pendingLocation || location.href.replace(/%27/g,'\''); } }; diff --git a/src/ng/cacheFactory.js b/src/ng/cacheFactory.js index ae121d3bfacb..84e91c9883bd 100644 --- a/src/ng/cacheFactory.js +++ b/src/ng/cacheFactory.js @@ -89,7 +89,7 @@ function $CacheFactoryProvider() { function cacheFactory(cacheId, options) { if (cacheId in caches) { - throw minErr('$cacheFactory')('iid', "CacheId '{0}' is already taken!", cacheId); + throw minErr('$cacheFactory')('iid', 'CacheId \'{0}\' is already taken!', cacheId); } var size = 0, diff --git a/src/ng/compile.js b/src/ng/compile.js index 7e836fd020a3..e61307f3760f 100644 --- a/src/ng/compile.js +++ b/src/ng/compile.js @@ -987,11 +987,11 @@ function $CompileProvider($provide, $$sanitizeUriProvider) { if (!match) { throw $compileMinErr('iscp', - "Invalid {3} for directive '{0}'." + - " Definition: {... {1}: '{2}' ...}", + 'Invalid {3} for directive \'{0}\'.' + + ' Definition: {... {1}: \'{2}\' ...}', directiveName, scopeName, definition, - (isController ? "controller bindings definition" : - "isolate scope definition")); + (isController ? 'controller bindings definition' : + 'isolate scope definition')); } bindings[scopeName] = { @@ -1033,12 +1033,12 @@ function $CompileProvider($provide, $$sanitizeUriProvider) { if (!controller) { // There is no controller, there may or may not be a controllerAs property throw $compileMinErr('noctrl', - "Cannot bind to controller without directive '{0}'s controller.", + 'Cannot bind to controller without directive \'{0}\'s controller.', directiveName); } else if (!identifierForController(controller, controllerAs)) { // There is a controller, but no identifier or controllerAs property throw $compileMinErr('noident', - "Cannot bind to controller without identifier for directive '{0}'.", + 'Cannot bind to controller without identifier for directive \'{0}\'.', directiveName); } } @@ -1048,11 +1048,11 @@ function $CompileProvider($provide, $$sanitizeUriProvider) { function assertValidDirectiveName(name) { var letter = name.charAt(0); if (!letter || letter !== lowercase(letter)) { - throw $compileMinErr('baddir', "Directive/Component name '{0}' is invalid. The first character must be a lowercase letter", name); + throw $compileMinErr('baddir', 'Directive/Component name \'{0}\' is invalid. The first character must be a lowercase letter', name); } if (name !== name.trim()) { throw $compileMinErr('baddir', - "Directive/Component name '{0}' is invalid. The name should not contain leading or trailing whitespaces", + 'Directive/Component name \'{0}\' is invalid. The name should not contain leading or trailing whitespaces', name); } } @@ -1634,7 +1634,7 @@ function $CompileProvider($provide, $$sanitizeUriProvider) { this[key] = value = $$sanitizeUri(value, key === 'src'); } else if (nodeName === 'img' && key === 'srcset' && isDefined(value)) { // sanitize img[srcset] values - var result = ""; + var result = ''; // first check if there are spaces because it's not the same pattern var trimmedSrcset = trim(value); @@ -1652,7 +1652,7 @@ function $CompileProvider($provide, $$sanitizeUriProvider) { // sanitize the uri result += $$sanitizeUri(trim(rawUris[innerIdx]), true); // add the descriptor - result += (" " + trim(rawUris[innerIdx + 1])); + result += (' ' + trim(rawUris[innerIdx + 1])); } // split the last item into uri and descriptor @@ -1663,7 +1663,7 @@ function $CompileProvider($provide, $$sanitizeUriProvider) { // and add the last descriptor if any if (lastTuple.length === 2) { - result += (" " + trim(lastTuple[1])); + result += (' ' + trim(lastTuple[1])); } this[key] = value = result; } @@ -1736,7 +1736,7 @@ function $CompileProvider($provide, $$sanitizeUriProvider) { // Attributes names that do not start with letters (such as `(click)`) cannot be set using `setAttribute` // so we have to jump through some hoops to get such an attribute // https://github.com/angular/angular.js/pull/13318 - specialAttrHolder.innerHTML = ""; + specialAttrHolder.innerHTML = ''; var attributes = specialAttrHolder.firstChild.attributes; var attribute = attributes[0]; // We have to remove the attribute from its container element before we can add it to the destination element @@ -2159,7 +2159,7 @@ function $CompileProvider($provide, $$sanitizeUriProvider) { do { if (!node) { throw $compileMinErr('uterdir', - "Unterminated attribute, found '{0}' but no matching '{1}' found.", + 'Unterminated attribute, found \'{0}\' but no matching \'{1}\' found.', attrStart, attrEnd); } if (node.nodeType === NODE_TYPE_ELEMENT) { @@ -2334,7 +2334,7 @@ function $CompileProvider($provide, $$sanitizeUriProvider) { if (!directive.templateUrl && directive.controller) { directiveValue = directive.controller; controllerDirectives = controllerDirectives || createMap(); - assertNoDuplicate("'" + directiveName + "' controller", + assertNoDuplicate('\'' + directiveName + '\' controller', controllerDirectives[directiveName], directive, $compileNode); controllerDirectives[directiveName] = directive; } @@ -2472,7 +2472,7 @@ function $CompileProvider($provide, $$sanitizeUriProvider) { if ($template.length !== 1 || compileNode.nodeType !== NODE_TYPE_ELEMENT) { throw $compileMinErr('tplrt', - "Template for directive '{0}' must have exactly one root element. {1}", + 'Template for directive \'{0}\' must have exactly one root element. {1}', directiveName, ''); } @@ -2796,7 +2796,7 @@ function $CompileProvider($provide, $$sanitizeUriProvider) { if (!value && !optional) { throw $compileMinErr('ctreq', - "Controller '{0}', required by directive '{1}', can't be found!", + 'Controller \'{0}\', required by directive \'{1}\', can\'t be found!', name, directiveName); } } else if (isArray(require)) { @@ -2996,7 +2996,7 @@ function $CompileProvider($provide, $$sanitizeUriProvider) { if ($template.length !== 1 || compileNode.nodeType !== NODE_TYPE_ELEMENT) { throw $compileMinErr('tplrt', - "Template for directive '{0}' must have exactly one root element. {1}", + 'Template for directive \'{0}\' must have exactly one root element. {1}', origAsyncDirective.name, templateUrl); } @@ -3147,17 +3147,17 @@ function $CompileProvider($provide, $$sanitizeUriProvider) { function getTrustedContext(node, attrNormalizedName) { - if (attrNormalizedName === "srcdoc") { + if (attrNormalizedName === 'srcdoc') { return $sce.HTML; } var tag = nodeName_(node); // maction[xlink:href] can source SVG. It's not limited to . - if (attrNormalizedName === "xlinkHref" || - (tag === "form" && attrNormalizedName === "action") || + if (attrNormalizedName === 'xlinkHref' || + (tag === 'form' && attrNormalizedName === 'action') || // links can be stylesheets or imports, which can run script in the current origin - (tag === "link" && attrNormalizedName === "href") || - (tag !== "img" && (attrNormalizedName === "src" || - attrNormalizedName === "ngSrc"))) { + (tag === 'link' && attrNormalizedName === 'href') || + (tag !== 'img' && (attrNormalizedName === 'src' || + attrNormalizedName === 'ngSrc'))) { return $sce.RESOURCE_URL; } } @@ -3173,16 +3173,16 @@ function $CompileProvider($provide, $$sanitizeUriProvider) { if (!interpolateFn) return; - if (name === "multiple" && nodeName_(node) === "select") { - throw $compileMinErr("selmulti", - "Binding to the 'multiple' attribute is not supported. Element: {0}", + if (name === 'multiple' && nodeName_(node) === 'select') { + throw $compileMinErr('selmulti', + 'Binding to the \'multiple\' attribute is not supported. Element: {0}', startingTag(node)); } if (EVENT_HANDLER_ATTR_REGEXP.test(name)) { throw $compileMinErr('nodomevents', - "Interpolations for HTML DOM event attributes are disallowed. Please use the " + - "ng- versions (such as ng-click instead of onclick) instead."); + 'Interpolations for HTML DOM event attributes are disallowed. Please use the ' + + 'ng- versions (such as ng-click instead of onclick) instead.'); } directives.push({ @@ -3383,7 +3383,7 @@ function $CompileProvider($provide, $$sanitizeUriProvider) { // reset the change, or we will throw this exception on every $digest lastValue = destination[scopeName] = parentGet(scope); throw $compileMinErr('nonassign', - "Expression '{0}' in attribute '{1}' used with directive '{2}' is non-assignable!", + 'Expression \'{0}\' in attribute \'{1}\' used with directive \'{2}\' is non-assignable!', attrs[attrName], attrName, directive.name); }; lastValue = destination[scopeName] = parentGet(scope); diff --git a/src/ng/controller.js b/src/ng/controller.js index 39f5c319e820..b1cbdc5cf91d 100644 --- a/src/ng/controller.js +++ b/src/ng/controller.js @@ -112,8 +112,8 @@ function $ControllerProvider() { match = expression.match(CNTRL_REG); if (!match) { throw $controllerMinErr('ctrlfmt', - "Badly formed controller string '{0}'. " + - "Must match `__name__ as __id__` or `__name__`.", expression); + 'Badly formed controller string \'{0}\'. ' + + 'Must match `__name__ as __id__` or `__name__`.', expression); } constructor = match[1]; identifier = identifier || match[3]; @@ -172,7 +172,7 @@ function $ControllerProvider() { function addIdentifier(locals, identifier, instance, name) { if (!(locals && isObject(locals.$scope))) { throw minErr('$controller')('noscp', - "Cannot export controller '{0}' as '{1}'! No $scope object provided via `locals`.", + 'Cannot export controller \'{0}\' as \'{1}\'! No $scope object provided via `locals`.', name, identifier); } diff --git a/src/ng/directive/attrs.js b/src/ng/directive/attrs.js index 0e3233ee9f35..adc398425fd9 100644 --- a/src/ng/directive/attrs.js +++ b/src/ng/directive/attrs.js @@ -346,7 +346,7 @@ var ngAttributeAliasDirectives = {}; // boolean attrs are evaluated forEach(BOOLEAN_ATTR, function(propName, attrName) { // binding to multiple is not supported - if (propName === "multiple") return; + if (propName === 'multiple') return; function defaultLinkFn(scope, element, attr) { scope.$watch(attr[normalized], function ngBooleanAttrWatchAction(value) { @@ -383,10 +383,10 @@ forEach(ALIASED_ATTR, function(htmlAttr, ngAttr) { link: function(scope, element, attr) { //special case ngPattern when a literal regular expression value //is used as the expression (this way we don't have to watch anything). - if (ngAttr === "ngPattern" && attr.ngPattern.charAt(0) === "/") { + if (ngAttr === 'ngPattern' && attr.ngPattern.charAt(0) === '/') { var match = attr.ngPattern.match(REGEX_STRING_REGEXP); if (match) { - attr.$set("ngPattern", new RegExp(match[1], match[2])); + attr.$set('ngPattern', new RegExp(match[1], match[2])); return; } } diff --git a/src/ng/directive/ngController.js b/src/ng/directive/ngController.js index 565d81c7c6e4..cd3bfed63a4c 100644 --- a/src/ng/directive/ngController.js +++ b/src/ng/directive/ngController.js @@ -86,7 +86,7 @@ * .controller('SettingsController1', SettingsController1); * * function SettingsController1() { - * this.name = "John Smith"; + * this.name = 'John Smith'; * this.contacts = [ * {type: 'phone', value: '408 555 1212'}, * {type: 'email', value: 'john.smith@example.org'} @@ -170,7 +170,7 @@ * .controller('SettingsController2', ['$scope', SettingsController2]); * * function SettingsController2($scope) { - * $scope.name = "John Smith"; + * $scope.name = 'John Smith'; * $scope.contacts = [ * {type:'phone', value:'408 555 1212'}, * {type:'email', value:'john.smith@example.org'} diff --git a/src/ng/directive/ngModel.js b/src/ng/directive/ngModel.js index 9dc344519de4..6ef8ba408187 100644 --- a/src/ng/directive/ngModel.js +++ b/src/ng/directive/ngModel.js @@ -271,7 +271,7 @@ var NgModelController = ['$scope', '$exceptionHandler', '$attrs', '$element', '$ } }; } else if (!parsedNgModel.assign) { - throw ngModelMinErr('nonassign', "Expression '{0}' is non-assignable. Element: {1}", + throw ngModelMinErr('nonassign', 'Expression \'{0}\' is non-assignable. Element: {1}', $attr.ngModel, startingTag($element)); } }; @@ -640,7 +640,7 @@ var NgModelController = ['$scope', '$exceptionHandler', '$attrs', '$element', '$ var promise = validator(modelValue, viewValue); if (!isPromiseLike(promise)) { throw ngModelMinErr('nopromise', - "Expected asynchronous validator to return a promise but got '{0}' instead.", promise); + 'Expected asynchronous validator to return a promise but got \'{0}\' instead.', promise); } setValidity(name, undefined); validatorPromises.push(promise.then(function() { diff --git a/src/ng/directive/ngOptions.js b/src/ng/directive/ngOptions.js index 8a1d6739d260..16a23b18ca17 100644 --- a/src/ng/directive/ngOptions.js +++ b/src/ng/directive/ngOptions.js @@ -253,9 +253,9 @@ var ngOptionsDirective = ['$compile', '$document', '$parse', function($compile, var match = optionsExp.match(NG_OPTIONS_REGEXP); if (!(match)) { throw ngOptionsMinErr('iexp', - "Expected expression in form of " + - "'_select_ (as _label_)? for (_key_,)?_value_ in _collection_'" + - " but got '{0}'. Element: {1}", + 'Expected expression in form of ' + + '\'_select_ (as _label_)? for (_key_,)?_value_ in _collection_\'' + + ' but got \'{0}\'. Element: {1}', optionsExp, startingTag(selectElement)); } diff --git a/src/ng/directive/ngPluralize.js b/src/ng/directive/ngPluralize.js index 1cbb8a595d0f..8d3a8a8cc48d 100644 --- a/src/ng/directive/ngPluralize.js +++ b/src/ng/directive/ngPluralize.js @@ -221,7 +221,7 @@ var ngPluralizeDirective = ['$locale', '$interpolate', '$log', function($locale, var whenExpFn = whensExpFns[count]; if (isUndefined(whenExpFn)) { if (newVal != null) { - $log.debug("ngPluralize: no rule defined for '" + count + "' in " + whenExp); + $log.debug('ngPluralize: no rule defined for \'' + count + '\' in ' + whenExp); } watchRemover = noop; updateElementText(); diff --git a/src/ng/directive/ngRepeat.js b/src/ng/directive/ngRepeat.js index 26d357b9487a..213cd3bc583c 100644 --- a/src/ng/directive/ngRepeat.js +++ b/src/ng/directive/ngRepeat.js @@ -363,7 +363,7 @@ var ngRepeatDirective = ['$parse', '$animate', '$compile', function($parse, $ani var match = expression.match(/^\s*([\s\S]+?)\s+in\s+([\s\S]+?)(?:\s+as\s+([\s\S]+?))?(?:\s+track\s+by\s+([\s\S]+?))?\s*$/); if (!match) { - throw ngRepeatMinErr('iexp', "Expected expression in form of '_item_ in _collection_[ track by _id_]' but got '{0}'.", + throw ngRepeatMinErr('iexp', 'Expected expression in form of \'_item_ in _collection_[ track by _id_]\' but got \'{0}\'.', expression); } @@ -375,7 +375,7 @@ var ngRepeatDirective = ['$parse', '$animate', '$compile', function($parse, $ani match = lhs.match(/^(?:(\s*[\$\w]+)|\(\s*([\$\w]+)\s*,\s*([\$\w]+)\s*\))$/); if (!match) { - throw ngRepeatMinErr('iidexp', "'_item_' in '_item_ in _collection_' should be an identifier or '(_key_, _value_)' expression, but got '{0}'.", + throw ngRepeatMinErr('iidexp', '\'_item_\' in \'_item_ in _collection_\' should be an identifier or \'(_key_, _value_)\' expression, but got \'{0}\'.', lhs); } var valueIdentifier = match[3] || match[1]; @@ -383,7 +383,7 @@ var ngRepeatDirective = ['$parse', '$animate', '$compile', function($parse, $ani if (aliasAs && (!/^[$a-zA-Z_][$a-zA-Z0-9_]*$/.test(aliasAs) || /^(null|undefined|this|\$index|\$first|\$middle|\$last|\$even|\$odd|\$parent|\$root|\$id)$/.test(aliasAs))) { - throw ngRepeatMinErr('badident', "alias '{0}' is invalid --- must be a valid JS identifier which is not a reserved name.", + throw ngRepeatMinErr('badident', 'alias \'{0}\' is invalid --- must be a valid JS identifier which is not a reserved name.', aliasAs); } @@ -479,7 +479,7 @@ var ngRepeatDirective = ['$parse', '$animate', '$compile', function($parse, $ani if (block && block.scope) lastBlockMap[block.id] = block; }); throw ngRepeatMinErr('dupes', - "Duplicates in a repeater are not allowed. Use 'track by' expression to specify unique keys. Repeater: {0}, Duplicate key: {1}, Duplicate value: {2}", + 'Duplicates in a repeater are not allowed. Use \'track by\' expression to specify unique keys. Repeater: {0}, Duplicate key: {1}, Duplicate value: {2}', expression, trackById, value); } else { // new never before seen block diff --git a/src/ng/directive/ngTransclude.js b/src/ng/directive/ngTransclude.js index ea21eb155ad0..f19c251fc3b6 100644 --- a/src/ng/directive/ngTransclude.js +++ b/src/ng/directive/ngTransclude.js @@ -139,7 +139,7 @@ * }) * .controller('ExampleController', ['$scope', function($scope) { * $scope.title = 'Lorem Ipsum'; - * $scope.link = "https://google.com/"; + * $scope.link = 'https://google.com/'; * $scope.text = 'Neque porro quisquam est qui dolorem ipsum quia dolor...'; * }]); *
    diff --git a/src/ng/filter/filters.js b/src/ng/filter/filters.js index f35911d0965d..8d8f221a56cb 100644 --- a/src/ng/filter/filters.js +++ b/src/ng/filter/filters.js @@ -395,7 +395,7 @@ function dateStrGetter(name, shortForm, standAlone) { function timeZoneGetter(date, formats, offset) { var zone = -1 * offset; - var paddedZone = (zone >= 0) ? "+" : ""; + var paddedZone = (zone >= 0) ? '+' : ''; paddedZone += padNumber(Math[zone > 0 ? 'floor' : 'ceil'](zone / 60), 2) + padNumber(Math.abs(zone % 60), 2); @@ -641,7 +641,7 @@ function dateFilter($locale) { forEach(parts, function(value) { fn = DATE_FORMATS[value]; text += fn ? fn(date, $locale.DATETIME_FORMATS, dateTimezoneOffset) - : value === "''" ? "'" : value.replace(/(^'|'$)/g, '').replace(/''/g, "'"); + : value === '\'\'' ? '\'' : value.replace(/(^'|'$)/g, '').replace(/''/g, '\''); }); return text; diff --git a/src/ng/http.js b/src/ng/http.js index 00b9f71c2f64..0cbc72571a32 100644 --- a/src/ng/http.js +++ b/src/ng/http.js @@ -895,7 +895,7 @@ function $HttpProvider() { $scope.status = response.status; $scope.data = response.data; }, function(response) { - $scope.data = response.data || "Request failed"; + $scope.data = response.data || 'Request failed'; $scope.status = response.status; }); }; diff --git a/src/ng/httpBackend.js b/src/ng/httpBackend.js index 5d3604271f25..501c1de86c73 100644 --- a/src/ng/httpBackend.js +++ b/src/ng/httpBackend.js @@ -64,7 +64,7 @@ function createHttpBackend($browser, createXhr, $browserDefer, callbacks, rawDoc var jsonpDone = jsonpReq(url, callbackPath, function(status, text) { // jsonpReq only ever sets status to 200 (OK), 404 (ERROR) or -1 (WAITING) var response = (status === 200) && callbacks.getResponse(callbackPath); - completeRequest(callback, status, response, "", text); + completeRequest(callback, status, response, '', text); callbacks.removeCallback(callbackPath); }); } else { @@ -177,7 +177,7 @@ function createHttpBackend($browser, createXhr, $browserDefer, callbacks, rawDoc // - fetches local scripts via XHR and evals them // - adds and immediately removes script elements from the document var script = rawDocument.createElement('script'), callback = null; - script.type = "text/javascript"; + script.type = 'text/javascript'; script.src = url; script.async = true; @@ -187,14 +187,14 @@ function createHttpBackend($browser, createXhr, $browserDefer, callbacks, rawDoc rawDocument.body.removeChild(script); script = null; var status = -1; - var text = "unknown"; + var text = 'unknown'; if (event) { - if (event.type === "load" && !callbacks.wasCalled(callbackPath)) { - event = { type: "error" }; + if (event.type === 'load' && !callbacks.wasCalled(callbackPath)) { + event = { type: 'error' }; } text = event.type; - status = event.type === "error" ? 404 : 200; + status = event.type === 'error' ? 404 : 200; } if (done) { diff --git a/src/ng/interpolate.js b/src/ng/interpolate.js index 9414ae22b5c3..ebfdb72c5f26 100644 --- a/src/ng/interpolate.js +++ b/src/ng/interpolate.js @@ -3,13 +3,13 @@ var $interpolateMinErr = angular.$interpolateMinErr = minErr('$interpolate'); $interpolateMinErr.throwNoconcat = function(text) { throw $interpolateMinErr('noconcat', - "Error while interpolating: {0}\nStrict Contextual Escaping disallows " + - "interpolations that concatenate multiple expressions when a trusted value is " + - "required. See http://docs.angularjs.org/api/ng.$sce", text); + 'Error while interpolating: {0}\nStrict Contextual Escaping disallows ' + + 'interpolations that concatenate multiple expressions when a trusted value is ' + + 'required. See http://docs.angularjs.org/api/ng.$sce', text); }; $interpolateMinErr.interr = function(text, err) { - return $interpolateMinErr('interr', "Can't interpolate: {0}\n{1}", text, err.toString()); + return $interpolateMinErr('interr', 'Can\'t interpolate: {0}\n{1}', text, err.toString()); }; /** diff --git a/src/ng/location.js b/src/ng/location.js index 7e131182cf1a..31d1b2735caf 100644 --- a/src/ng/location.js +++ b/src/ng/location.js @@ -829,7 +829,7 @@ function $LocationProvider() { if (html5Mode.enabled) { if (!baseHref && html5Mode.requireBase) { throw $locationMinErr('nobase', - "$location in HTML5 mode requires a tag to be present!"); + '$location in HTML5 mode requires a tag to be present!'); } appBase = serverBase(initialUrl) + (baseHref || '/'); LocationMode = $sniffer.history ? LocationHtml5Url : LocationHashbangInHtml5Url; diff --git a/src/ng/parse.js b/src/ng/parse.js index 3a81c1e990b8..a008dd1e4fea 100644 --- a/src/ng/parse.js +++ b/src/ng/parse.js @@ -57,9 +57,9 @@ var objectValueOf = OBJECT_CTOR_PROTO.valueOf; function ensureSafeMemberName(name, fullExpression) { - if (name === "__defineGetter__" || name === "__defineSetter__" - || name === "__lookupGetter__" || name === "__lookupSetter__" - || name === "__proto__") { + if (name === '__defineGetter__' || name === '__defineSetter__' + || name === '__lookupGetter__' || name === '__lookupSetter__' + || name === '__proto__') { throw $parseMinErr('isecfld', 'Attempting to access a disallowed field in Angular expressions! ' + 'Expression: {0}', fullExpression); @@ -149,7 +149,7 @@ function ensureSafeAssignContext(obj, fullExpression) { var OPERATORS = createMap(); forEach('+ - * / % === !== == != < > <= >= && || ! = |'.split(' '), function(operator) { OPERATORS[operator] = true; }); -var ESCAPE = {"n":"\n", "f":"\f", "r":"\r", "t":"\t", "v":"\v", "'":"'", '"':'"'}; +var ESCAPE = {'n':'\n', 'f':'\f', 'r':'\r', 't':'\t', 'v':'\v', '\'':'\'', '"':'"'}; ///////////////////////////////////////// @@ -172,7 +172,7 @@ Lexer.prototype = { while (this.index < this.text.length) { var ch = this.text.charAt(this.index); - if (ch === '"' || ch === "'") { + if (ch === '"' || ch === '\'') { this.readString(ch); } else if (this.isNumber(ch) || ch === '.' && this.isNumber(this.peek())) { this.readNumber(); @@ -211,7 +211,7 @@ Lexer.prototype = { }, isNumber: function(ch) { - return ('0' <= ch && ch <= '9') && typeof ch === "string"; + return ('0' <= ch && ch <= '9') && typeof ch === 'string'; }, isWhitespace: function(ch) { @@ -635,7 +635,7 @@ AST.prototype = { this.consume(':'); property.value = this.expression(); } else { - this.throwError("invalid key", this.peek()); + this.throwError('invalid key', this.peek()); } properties.push(property); } while (this.expect(',')); @@ -1360,7 +1360,7 @@ ASTCompiler.prototype = { }, escape: function(value) { - if (isString(value)) return "'" + value.replace(this.stringEscapeRegex, this.stringEscapeFn) + "'"; + if (isString(value)) return '\'' + value.replace(this.stringEscapeRegex, this.stringEscapeFn) + '\''; if (isNumber(value)) return value.toString(); if (value === true) return 'true'; if (value === false) return 'false'; diff --git a/src/ng/q.js b/src/ng/q.js index 1b1802c6e82a..8664c992a43c 100644 --- a/src/ng/q.js +++ b/src/ng/q.js @@ -325,11 +325,11 @@ function qFactory(nextTick, exceptionHandler, errorOnUnhandledRejections) { return result.promise; }, - "catch": function(callback) { + 'catch': function(callback) { return this.then(null, callback); }, - "finally": function(callback, progressBack) { + 'finally': function(callback, progressBack) { return this.then(function(value) { return handleCallback(value, true, callback); }, function(error) { @@ -420,7 +420,7 @@ function qFactory(nextTick, exceptionHandler, errorOnUnhandledRejections) { if (val === this.promise) { this.$$reject($qMinErr( 'qcycle', - "Expected promise to be resolved with value other than itself '{0}'", + 'Expected promise to be resolved with value other than itself \'{0}\'', val)); } else { this.$$resolve(val); @@ -666,7 +666,7 @@ function qFactory(nextTick, exceptionHandler, errorOnUnhandledRejections) { var $Q = function Q(resolver) { if (!isFunction(resolver)) { - throw $qMinErr('norslvr', "Expected resolverFn, got '{0}'", resolver); + throw $qMinErr('norslvr', 'Expected resolverFn, got \'{0}\'', resolver); } var deferred = new Deferred(); diff --git a/src/ng/sce.js b/src/ng/sce.js index b2140e21bcbb..f16aee5597a8 100644 --- a/src/ng/sce.js +++ b/src/ng/sce.js @@ -612,7 +612,7 @@ function $SceDelegateProvider() { * .controller('AppController', ['$http', '$templateCache', '$sce', * function AppController($http, $templateCache, $sce) { * var self = this; - * $http.get("test_data.json", {cache: $templateCache}).success(function(userComments) { + * $http.get('test_data.json', {cache: $templateCache}).success(function(userComments) { * self.userComments = userComments; * }); * self.explicitlyTrustedHtml = $sce.trustAsHtml( @@ -1054,13 +1054,13 @@ function $SceProvider() { forEach(SCE_CONTEXTS, function(enumValue, name) { var lName = lowercase(name); - sce[camelCase("parse_as_" + lName)] = function(expr) { + sce[camelCase('parse_as_' + lName)] = function(expr) { return parse(enumValue, expr); }; - sce[camelCase("get_trusted_" + lName)] = function(value) { + sce[camelCase('get_trusted_' + lName)] = function(value) { return getTrusted(enumValue, value); }; - sce[camelCase("trust_as_" + lName)] = function(value) { + sce[camelCase('trust_as_' + lName)] = function(value) { return trustAs(enumValue, value); }; }); diff --git a/src/ng/urlUtils.js b/src/ng/urlUtils.js index ee58b435f3e9..60a40b7caa87 100644 --- a/src/ng/urlUtils.js +++ b/src/ng/urlUtils.js @@ -6,7 +6,7 @@ // doesn't know about mocked locations and resolves URLs to the real document - which is // exactly the behavior needed here. There is little value is mocking these out for this // service. -var urlParsingNode = window.document.createElement("a"); +var urlParsingNode = window.document.createElement('a'); var originUrl = urlResolve(window.location.href); @@ -61,7 +61,7 @@ function urlResolve(url) { if (msie) { // Normalize before parse. Refer Implementation Notes on why this is // done in two steps on IE. - urlParsingNode.setAttribute("href", href); + urlParsingNode.setAttribute('href', href); href = urlParsingNode.href; } diff --git a/src/ngAnimate/animateCss.js b/src/ngAnimate/animateCss.js index 8127222e3e83..27619d67c29b 100644 --- a/src/ngAnimate/animateCss.js +++ b/src/ngAnimate/animateCss.js @@ -361,7 +361,7 @@ var $AnimateCssProvider = ['$animateProvider', /** @this */ function($animatePro var parentCounter = 0; function gcsHashFn(node, extraClasses) { - var KEY = "$$ngAnimateParentKey"; + var KEY = '$$ngAnimateParentKey'; var parentNode = node.parentNode; var parentID = parentNode[KEY] || (parentNode[KEY] = ++parentCounter); return parentID + '-' + node.getAttribute('class') + '-' + extraClasses; @@ -632,7 +632,7 @@ var $AnimateCssProvider = ['$animateProvider', /** @this */ function($animatePro if (options.delay != null) { var delayStyle; - if (typeof options.delay !== "boolean") { + if (typeof options.delay !== 'boolean') { delayStyle = parseFloat(options.delay); // number in options.delay means we have to recalculate the delay for the closing timeout maxDelay = Math.max(delayStyle, 0); @@ -915,7 +915,7 @@ var $AnimateCssProvider = ['$animateProvider', /** @this */ function($animatePro } if (flags.applyAnimationDelay) { - relativeDelay = typeof options.delay !== "boolean" && truthyTimingValue(options.delay) + relativeDelay = typeof options.delay !== 'boolean' && truthyTimingValue(options.delay) ? parseFloat(options.delay) : relativeDelay; diff --git a/src/ngAnimate/module.js b/src/ngAnimate/module.js index 402e2c6752a8..b1167608c099 100644 --- a/src/ngAnimate/module.js +++ b/src/ngAnimate/module.js @@ -552,16 +552,16 @@ }]) .run(['$rootScope', function($rootScope) { $rootScope.records = [ - { id:1, title: "Miss Beulah Roob" }, - { id:2, title: "Trent Morissette" }, - { id:3, title: "Miss Ava Pouros" }, - { id:4, title: "Rod Pouros" }, - { id:5, title: "Abdul Rice" }, - { id:6, title: "Laurie Rutherford Sr." }, - { id:7, title: "Nakia McLaughlin" }, - { id:8, title: "Jordon Blanda DVM" }, - { id:9, title: "Rhoda Hand" }, - { id:10, title: "Alexandrea Sauer" } + { id: 1, title: 'Miss Beulah Roob' }, + { id: 2, title: 'Trent Morissette' }, + { id: 3, title: 'Miss Ava Pouros' }, + { id: 4, title: 'Rod Pouros' }, + { id: 5, title: 'Abdul Rice' }, + { id: 6, title: 'Laurie Rutherford Sr.' }, + { id: 7, title: 'Nakia McLaughlin' }, + { id: 8, title: 'Jordon Blanda DVM' }, + { id: 9, title: 'Rhoda Hand' }, + { id: 10, title: 'Alexandrea Sauer' } ]; }]) .controller('HomeController', [function() { diff --git a/src/ngAnimate/shared.js b/src/ngAnimate/shared.js index adfd35fc4668..f65ec61b0996 100644 --- a/src/ngAnimate/shared.js +++ b/src/ngAnimate/shared.js @@ -58,7 +58,7 @@ var TRANSITION_DURATION_PROP = TRANSITION_PROP + DURATION_KEY; var ngMinErr = angular.$$minErr('ng'); function assertArg(arg, name, reason) { if (!arg) { - throw ngMinErr('areq', "Argument '{0}' is {1}", (name || '?'), (reason || "required")); + throw ngMinErr('areq', 'Argument \'{0}\' is {1}', (name || '?'), (reason || 'required')); } return arg; } diff --git a/src/ngCookies/cookieWriter.js b/src/ngCookies/cookieWriter.js index 2c8b6fe654d0..33daf8fb74cd 100644 --- a/src/ngCookies/cookieWriter.js +++ b/src/ngCookies/cookieWriter.js @@ -40,9 +40,9 @@ function $$CookieWriter($document, $log, $browser) { // - 4096 bytes per cookie var cookieLength = str.length + 1; if (cookieLength > 4096) { - $log.warn("Cookie '" + name + - "' possibly not set or overflowed because it was too large (" + - cookieLength + " > 4096 bytes)!"); + $log.warn('Cookie \'' + name + + '\' possibly not set or overflowed because it was too large (' + + cookieLength + ' > 4096 bytes)!'); } return str; diff --git a/src/ngMessageFormat/messageFormatParser.js b/src/ngMessageFormat/messageFormatParser.js index 8621a3ee8727..cabacd2bb90d 100644 --- a/src/ngMessageFormat/messageFormatParser.js +++ b/src/ngMessageFormat/messageFormatParser.js @@ -146,7 +146,7 @@ MessageFormatParser.prototype.errorExpecting = function errorExpecting() { position.line, position.column, this.text); } var word = match[1]; - if (word === "select" || word === "plural") { + if (word === 'select' || word === 'plural') { position = indexToLineAndColumn(this.text, this.index); throw $interpolateMinErr('reqcomma', 'Expected a comma after the keyword “{0}” at line {1}, column {2} of text “{3}”', @@ -174,7 +174,7 @@ MessageFormatParser.prototype.ruleString = function ruleString() { MessageFormatParser.prototype.startStringAtMatch = function startStringAtMatch(match) { this.stringStartIndex = match.index; this.stringQuote = match[0]; - this.stringInterestsRe = this.stringQuote === "'" ? SQUOTED_STRING_INTEREST_RE : DQUOTED_STRING_INTEREST_RE; + this.stringInterestsRe = this.stringQuote === '\'' ? SQUOTED_STRING_INTEREST_RE : DQUOTED_STRING_INTEREST_RE; this.rule = this.ruleInsideString; }; @@ -201,8 +201,8 @@ MessageFormatParser.prototype.rulePluralOrSelect = function rulePluralOrSelect() } var argType = match[1]; switch (argType) { - case "plural": this.rule = this.rulePluralStyle; break; - case "select": this.rule = this.ruleSelectStyle; break; + case 'plural': this.rule = this.rulePluralStyle; break; + case 'select': this.rule = this.ruleSelectStyle; break; default: this.errorInParseLogic(); } }; @@ -220,7 +220,7 @@ MessageFormatParser.prototype.ruleSelectStyle = function ruleSelectStyle() { }; var NUMBER_RE = /[0]|(?:[1-9][0-9]*)/g; -var PLURAL_OFFSET_RE = new RegExp("\\s*offset\\s*:\\s*(" + NUMBER_RE.source + ")", "g"); +var PLURAL_OFFSET_RE = new RegExp('\\s*offset\\s*:\\s*(' + NUMBER_RE.source + ')', 'g'); MessageFormatParser.prototype.rulePluralOffset = function rulePluralOffset() { var match = this.matchRe(PLURAL_OFFSET_RE); @@ -251,7 +251,7 @@ MessageFormatParser.prototype.ruleSelectKeyword = function ruleSelectKeyword() { this.rule = this.ruleMessageText; }; -var EXPLICIT_VALUE_OR_KEYWORD_RE = new RegExp("\\s*(?:(?:=(" + NUMBER_RE.source + "))|(\\w+))", "g"); +var EXPLICIT_VALUE_OR_KEYWORD_RE = new RegExp('\\s*(?:(?:=(' + NUMBER_RE.source + '))|(\\w+))', 'g'); MessageFormatParser.prototype.rulePluralValueOrKeyword = function rulePluralValueOrKeyword() { var match = this.matchRe(EXPLICIT_VALUE_OR_KEYWORD_RE); if (match == null) { @@ -322,20 +322,20 @@ MessageFormatParser.prototype.ruleInInterpolationOrMessageText = function ruleIn this.rule = null; return; } - if (token[0] === "\\") { + if (token[0] === '\\') { // unescape next character and continue this.interpolationParts.addText(this.textPart + token[1]); return; } this.interpolationParts.addText(this.textPart); - if (token === "{{") { + if (token === '{{') { this.pushState(); this.ruleStack.push(this.ruleEndMustacheInInterpolationOrMessage); this.rule = this.ruleEnteredMustache; - } else if (token === "}") { + } else if (token === '}') { this.choices[this.choiceKey] = this.interpolationParts.toParsedFn(/*mustHaveExpression=*/false, this.text); this.rule = this.ruleChoiceKeyword; - } else if (token === "#") { + } else if (token === '#') { this.interpolationParts.addExpressionFn(this.expressionMinusOffsetFn); } else { this.errorInParseLogic(); @@ -359,7 +359,7 @@ MessageFormatParser.prototype.ruleInInterpolation = function ruleInInterpolation return; } var token = match[0]; - if (token[0] === "\\") { + if (token[0] === '\\') { // unescape next character and continue this.interpolationParts.addText(this.text.substring(currentIndex, match.index) + token[1]); return; @@ -425,18 +425,18 @@ MessageFormatParser.prototype.ruleAngularExpression = function ruleAngularExpres function getEndOperator(opBegin) { switch (opBegin) { - case "{": return "}"; - case "[": return "]"; - case "(": return ")"; + case '{': return '}'; + case '[': return ']'; + case '(': return ')'; default: return null; } } function getBeginOperator(opEnd) { switch (opEnd) { - case "}": return "{"; - case "]": return "["; - case ")": return "("; + case '}': return '{'; + case ']': return '['; + case ')': return '('; default: return null; } } @@ -470,12 +470,12 @@ MessageFormatParser.prototype.ruleInAngularExpression = function ruleInAngularEx this.getEndOperator(innermostOperator), this.text); } var operator = match[0]; - if (operator === "'" || operator === '"') { + if (operator === '\'' || operator === '"') { this.ruleStack.push(this.ruleInAngularExpression); this.startStringAtMatch(match); return; } - if (operator === ",") { + if (operator === ',') { if (this.trustedContext) { position = indexToLineAndColumn(this.text, this.index); throw $interpolateMinErr('unsafe', diff --git a/src/ngMessageFormat/messageFormatSelector.js b/src/ngMessageFormat/messageFormatSelector.js index b672dca0d23a..749d9fd861f4 100644 --- a/src/ngMessageFormat/messageFormatSelector.js +++ b/src/ngMessageFormat/messageFormatSelector.js @@ -17,7 +17,7 @@ function MessageSelectorBase(expressionFn, choices) { var self = this; this.expressionFn = expressionFn; this.choices = choices; - if (choices["other"] === undefined) { + if (choices['other'] === undefined) { throw $interpolateMinErr('reqother', '“other” is a required option.'); } this.parsedFn = function(context) { return self.getResult(context); }; @@ -91,7 +91,7 @@ SelectMessageProto.prototype = MessageSelectorBase.prototype; SelectMessage.prototype = new SelectMessageProto(); SelectMessage.prototype.categorizeValue = function categorizeSelectValue(value) { - return (this.choices[value] !== undefined) ? value : "other"; + return (this.choices[value] !== undefined) ? value : 'other'; }; /** @@ -111,11 +111,11 @@ PluralMessageProto.prototype = MessageSelectorBase.prototype; PluralMessage.prototype = new PluralMessageProto(); PluralMessage.prototype.categorizeValue = function categorizePluralValue(value) { if (isNaN(value)) { - return "other"; + return 'other'; } else if (this.choices[value] !== undefined) { return value; } else { var category = this.pluralCat(value - this.offset); - return (this.choices[category] !== undefined) ? category : "other"; + return (this.choices[category] !== undefined) ? category : 'other'; } }; diff --git a/src/ngMessageFormat/messageFormatService.js b/src/ngMessageFormat/messageFormatService.js index a8ad661c611a..458130f879dc 100644 --- a/src/ngMessageFormat/messageFormatService.js +++ b/src/ngMessageFormat/messageFormatService.js @@ -54,9 +54,9 @@ * this.gender = gender; * } * - * var alice = new Person("Alice", "female"), - * bob = new Person("Bob", "male"), - * ashley = new Person("Ashley", ""); + * var alice = new Person('Alice', 'female'), + * bob = new Person('Bob', 'male'), + * ashley = new Person('Ashley', ''); * * angular.module('msgFmtExample', ['ngMessageFormat']) * .controller('AppController', ['$scope', function($scope) { @@ -97,11 +97,11 @@ * this.gender = gender; * } * - * var alice = new Person("Alice", "female"), - * bob = new Person("Bob", "male"), - * sarah = new Person("Sarah", "female"), - * harry = new Person("Harry Potter", "male"), - * ashley = new Person("Ashley", ""); + * var alice = new Person('Alice', 'female'), + * bob = new Person('Bob', 'male'), + * sarah = new Person('Sarah', 'female'), + * harry = new Person('Harry Potter', 'male'), + * ashley = new Person('Ashley', ''); * * angular.module('msgFmtExample', ['ngMessageFormat']) * .controller('AppController', ['$scope', function($scope) { @@ -157,10 +157,10 @@ * this.gender = gender; * } * - * var alice = new Person("Alice", "female"), - * bob = new Person("Bob", "male"), - * harry = new Person("Harry Potter", "male"), - * ashley = new Person("Ashley", ""); + * var alice = new Person('Alice', 'female'), + * bob = new Person('Bob', 'male'), + * harry = new Person('Harry Potter', 'male'), + * ashley = new Person('Ashley', ''); * * angular.module('msgFmtExample', ['ngMessageFormat']) * .controller('AppController', ['$scope', function($scope) { @@ -200,7 +200,7 @@ var $$MessageFormatFactory = ['$parse', '$locale', '$sce', '$exceptionHandler', }]; var $$interpolateDecorator = ['$$messageFormat', '$delegate', function $$interpolateDecorator($$messageFormat, $interpolate) { - if ($interpolate['startSymbol']() !== "{{" || $interpolate['endSymbol']() !== "}}") { + if ($interpolate['startSymbol']() !== '{{' || $interpolate['endSymbol']() !== '}}') { throw $interpolateMinErr('nochgmustache', 'angular-message-format.js currently does not allow you to use custom start and end symbols for interpolation.'); } var interpolate = $$messageFormat['interpolate']; diff --git a/src/ngMock/angular-mocks.js b/src/ngMock/angular-mocks.js index c94a4a752cc3..93f99c62f5bd 100644 --- a/src/ngMock/angular-mocks.js +++ b/src/ngMock/angular-mocks.js @@ -33,7 +33,7 @@ angular.mock.$Browser = function() { var self = this; this.isMock = true; - self.$$url = "http://server/"; + self.$$url = 'http://server/'; self.$$lastUrl = self.$$url; // used by url polling fn self.pollFns = []; @@ -250,14 +250,14 @@ angular.mock.$ExceptionHandlerProvider = function() { } else { errors.push([].slice.call(arguments, 0)); } - if (mode === "rethrow") { + if (mode === 'rethrow') { throw e; } }; handler.errors = errors; break; default: - throw new Error("Unknown mode '" + mode + "', only 'log'/'rethrow' modes are allowed!"); + throw new Error('Unknown mode \'' + mode + '\', only \'log\'/\'rethrow\' modes are allowed!'); } }; @@ -407,8 +407,8 @@ angular.mock.$LogProvider = function() { }); }); if (errors.length) { - errors.unshift("Expected $log to be empty! Either a message was logged unexpectedly, or " + - "an expected log message was not checked and removed:"); + errors.unshift('Expected $log to be empty! Either a message was logged unexpectedly, or ' + + 'an expected log message was not checked and removed:'); errors.push(''); throw new Error(errors.join('\n---------\n')); } @@ -643,8 +643,8 @@ angular.mock.TzDate = function(offset, timestamp) { if (isNaN(timestamp)) { // eslint-disable-next-line no-throw-literal throw { - name: "Illegal Argument", - message: "Arg '" + tsStr + "' passed into TzDate constructor is not a valid date string" + name: 'Illegal Argument', + message: 'Arg \'' + tsStr + '\' passed into TzDate constructor is not a valid date string' }; } } else { @@ -750,7 +750,7 @@ angular.mock.TzDate = function(offset, timestamp) { angular.forEach(unimplementedMethods, function(methodName) { self[methodName] = function() { - throw new Error("Method '" + methodName + "' is not implemented in the TzDate mock"); + throw new Error('Method \'' + methodName + '\' is not implemented in the TzDate mock'); }; }); @@ -1909,7 +1909,7 @@ function createHttpBackendMock($rootScope, $timeout, $delegate, $browser) { function assertArgDefined(args, index, name) { if (args.length > index && angular.isUndefined(args[index])) { - throw new Error("Undefined argument `" + name + "`; the argument is provided but not defined"); + throw new Error('Undefined argument `' + name + '`; the argument is provided but not defined'); } } @@ -1989,7 +1989,7 @@ function MockHttpExpectation(method, url, data, headers, keys) { var obj = {}, key_value, key, queryStr = u.indexOf('?') > -1 ? u.substring(u.indexOf('?') + 1) - : ""; + : ''; angular.forEach(queryStr.split('&'), function(keyValue) { if (keyValue) { @@ -2879,14 +2879,14 @@ angular.mock.$RootScopeDecorator = ['$delegate', function($delegate) { */ module.sharedInjector = function() { if (!(module.$$beforeAllHook && module.$$afterAllHook)) { - throw Error("sharedInjector() cannot be used unless your test runner defines beforeAll/afterAll"); + throw Error('sharedInjector() cannot be used unless your test runner defines beforeAll/afterAll'); } var initialized = false; module.$$beforeAllHook(/** @this */ function() { if (injectorState.shared) { - injectorState.sharedError = Error("sharedInjector() cannot be called inside a context that has already called sharedInjector()"); + injectorState.sharedError = Error('sharedInjector() cannot be called inside a context that has already called sharedInjector()'); throw injectorState.sharedError; } initialized = true; @@ -2908,7 +2908,7 @@ angular.mock.$RootScopeDecorator = ['$delegate', function($delegate) { if (injectorState.shared && currentSpec && currentSpec !== this) { var state = currentSpec; currentSpec = this; - angular.forEach(["$injector","$modules","$providerInjector", "$injectorStrict"], function(k) { + angular.forEach(['$injector','$modules','$providerInjector', '$injectorStrict'], function(k) { currentSpec[k] = state[k]; state[k] = null; }); @@ -3098,7 +3098,7 @@ angular.mock.$RootScopeDecorator = ['$delegate', function($delegate) { if (strictDi) { // If strictDi is enabled, annotate the providerInjector blocks angular.forEach(modules, function(moduleFn) { - if (typeof moduleFn === "function") { + if (typeof moduleFn === 'function') { angular.injector.$$annotate(moduleFn); } }); diff --git a/src/ngMock/browserTrigger.js b/src/ngMock/browserTrigger.js index 036d8d636106..e2483204d467 100644 --- a/src/ngMock/browserTrigger.js +++ b/src/ngMock/browserTrigger.js @@ -198,7 +198,7 @@ function patchEventTargetForBubbling(event, target) { event._target = target; - Object.defineProperty(event, "target", {get: function() { return this._target;}}); + Object.defineProperty(event, 'target', {get: function() { return this._target;}}); } function isAttachedToDocument(element) { diff --git a/src/ngResource/resource.js b/src/ngResource/resource.js index 032e66f65564..c20207a44143 100644 --- a/src/ngResource/resource.js +++ b/src/ngResource/resource.js @@ -542,12 +542,12 @@ angular.module('ngResource', ['ng']). var urlParams = self.urlParams = Object.create(null); forEach(url.split(/\W/), function(param) { if (param === 'hasOwnProperty') { - throw $resourceMinErr('badname', "hasOwnProperty is not a valid parameter name."); + throw $resourceMinErr('badname', 'hasOwnProperty is not a valid parameter name.'); } - if (!(new RegExp("^\\d+$").test(param)) && param && - (new RegExp("(^|[^\\\\]):" + param + "(\\W|$)").test(url))) { + if (!(new RegExp('^\\d+$').test(param)) && param && + (new RegExp('(^|[^\\\\]):' + param + '(\\W|$)').test(url))) { urlParams[param] = { - isQueryParamValue: (new RegExp("\\?.*=:" + param + "(?:\\W|$)")).test(url) + isQueryParamValue: (new RegExp('\\?.*=:' + param + '(?:\\W|$)')).test(url) }; } }); @@ -566,11 +566,11 @@ angular.module('ngResource', ['ng']). } else { encodedVal = encodeUriSegment(val); } - url = url.replace(new RegExp(":" + urlParam + "(\\W|$)", "g"), function(match, p1) { + url = url.replace(new RegExp(':' + urlParam + '(\\W|$)', 'g'), function(match, p1) { return encodedVal + p1; }); } else { - url = url.replace(new RegExp("(/?):" + urlParam + "(\\W|$)", "g"), function(match, + url = url.replace(new RegExp('(/?):' + urlParam + '(\\W|$)', 'g'), function(match, leadingSlashes, tail) { if (tail.charAt(0) === '/') { return tail; @@ -687,7 +687,7 @@ angular.module('ngResource', ['ng']). case 0: break; default: throw $resourceMinErr('badargs', - "Expected up to 4 arguments [params, data, success, error], got {0} arguments", + 'Expected up to 4 arguments [params, data, success, error], got {0} arguments', arguments.length); } @@ -744,7 +744,7 @@ angular.module('ngResource', ['ng']). if (action.isArray) { value.length = 0; forEach(data, function(item) { - if (typeof item === "object") { + if (typeof item === 'object') { value.push(new Resource(item)); } else { // Valid JSON values may be string literals, and these should not be converted diff --git a/src/ngRoute/directive/ngView.js b/src/ngRoute/directive/ngView.js index 8cff45618261..dba842f1eafa 100644 --- a/src/ngRoute/directive/ngView.js +++ b/src/ngRoute/directive/ngView.js @@ -149,11 +149,11 @@ ngRouteModule.directive('ngView', ngViewFillContentFactory); this.$routeParams = $routeParams; }]) .controller('BookCtrl', ['$routeParams', function BookCtrl($routeParams) { - this.name = "BookCtrl"; + this.name = 'BookCtrl'; this.params = $routeParams; }]) .controller('ChapterCtrl', ['$routeParams', function ChapterCtrl($routeParams) { - this.name = "ChapterCtrl"; + this.name = 'ChapterCtrl'; this.params = $routeParams; }]); diff --git a/src/ngRoute/route.js b/src/ngRoute/route.js index 1c289e600117..551781da9346 100644 --- a/src/ngRoute/route.js +++ b/src/ngRoute/route.js @@ -431,12 +431,12 @@ function $RouteProvider() { * }) * * .controller('BookController', function($scope, $routeParams) { - * $scope.name = "BookController"; + * $scope.name = 'BookController'; * $scope.params = $routeParams; * }) * * .controller('ChapterController', function($scope, $routeParams) { - * $scope.name = "ChapterController"; + * $scope.name = 'ChapterController'; * $scope.params = $routeParams; * }) * diff --git a/src/ngSanitize/sanitize.js b/src/ngSanitize/sanitize.js index 64759e9c017a..a816069bcf48 100644 --- a/src/ngSanitize/sanitize.js +++ b/src/ngSanitize/sanitize.js @@ -230,36 +230,36 @@ function $SanitizeProvider() { // Safe Void Elements - HTML5 // http://dev.w3.org/html5/spec/Overview.html#void-elements - var voidElements = toMap("area,br,col,hr,img,wbr"); + var voidElements = toMap('area,br,col,hr,img,wbr'); // Elements that you can, intentionally, leave open (and which close themselves) // http://dev.w3.org/html5/spec/Overview.html#optional-tags - var optionalEndTagBlockElements = toMap("colgroup,dd,dt,li,p,tbody,td,tfoot,th,thead,tr"), - optionalEndTagInlineElements = toMap("rp,rt"), + var optionalEndTagBlockElements = toMap('colgroup,dd,dt,li,p,tbody,td,tfoot,th,thead,tr'), + optionalEndTagInlineElements = toMap('rp,rt'), optionalEndTagElements = extend({}, optionalEndTagInlineElements, optionalEndTagBlockElements); // Safe Block Elements - HTML5 - var blockElements = extend({}, optionalEndTagBlockElements, toMap("address,article," + - "aside,blockquote,caption,center,del,dir,div,dl,figure,figcaption,footer,h1,h2,h3,h4,h5," + - "h6,header,hgroup,hr,ins,map,menu,nav,ol,pre,section,table,ul")); + var blockElements = extend({}, optionalEndTagBlockElements, toMap('address,article,' + + 'aside,blockquote,caption,center,del,dir,div,dl,figure,figcaption,footer,h1,h2,h3,h4,h5,' + + 'h6,header,hgroup,hr,ins,map,menu,nav,ol,pre,section,table,ul')); // Inline Elements - HTML5 - var inlineElements = extend({}, optionalEndTagInlineElements, toMap("a,abbr,acronym,b," + - "bdi,bdo,big,br,cite,code,del,dfn,em,font,i,img,ins,kbd,label,map,mark,q,ruby,rp,rt,s," + - "samp,small,span,strike,strong,sub,sup,time,tt,u,var")); + var inlineElements = extend({}, optionalEndTagInlineElements, toMap('a,abbr,acronym,b,' + + 'bdi,bdo,big,br,cite,code,del,dfn,em,font,i,img,ins,kbd,label,map,mark,q,ruby,rp,rt,s,' + + 'samp,small,span,strike,strong,sub,sup,time,tt,u,var')); // SVG Elements // https://wiki.whatwg.org/wiki/Sanitization_rules#svg_Elements // Note: the elements animate,animateColor,animateMotion,animateTransform,set are intentionally omitted. // They can potentially allow for arbitrary javascript to be executed. See #11290 - var svgElements = toMap("circle,defs,desc,ellipse,font-face,font-face-name,font-face-src,g,glyph," + - "hkern,image,linearGradient,line,marker,metadata,missing-glyph,mpath,path,polygon,polyline," + - "radialGradient,rect,stop,svg,switch,text,title,tspan"); + var svgElements = toMap('circle,defs,desc,ellipse,font-face,font-face-name,font-face-src,g,glyph,' + + 'hkern,image,linearGradient,line,marker,metadata,missing-glyph,mpath,path,polygon,polyline,' + + 'radialGradient,rect,stop,svg,switch,text,title,tspan'); // Blocked Elements (will be stripped) - var blockedElements = toMap("script,style"); + var blockedElements = toMap('script,style'); var validElements = extend({}, voidElements, @@ -268,7 +268,7 @@ function $SanitizeProvider() { optionalEndTagElements); //Attributes that have href and hence need to be sanitized - var uriAttrs = toMap("background,cite,href,longdesc,src,xlink:href"); + var uriAttrs = toMap('background,cite,href,longdesc,src,xlink:href'); var htmlAttrs = toMap('abbr,align,alt,axis,bgcolor,border,cellpadding,cellspacing,class,clear,' + 'color,cols,colspan,compact,coords,dir,face,headers,height,hreflang,hspace,' + @@ -311,9 +311,9 @@ function $SanitizeProvider() { (function(window) { var doc; if (window.document && window.document.implementation) { - doc = window.document.implementation.createHTMLDocument("inert"); + doc = window.document.implementation.createHTMLDocument('inert'); } else { - throw $sanitizeMinErr('noinert', "Can't create an inert html document"); + throw $sanitizeMinErr('noinert', 'Can\'t create an inert html document'); } var docElement = doc.documentElement || doc.getDocumentElement(); var bodyElements = docElement.getElementsByTagName('body'); @@ -353,7 +353,7 @@ function $SanitizeProvider() { var mXSSAttempts = 5; do { if (mXSSAttempts === 0) { - throw $sanitizeMinErr('uinput', "Failed to sanitize html because the input is unstable"); + throw $sanitizeMinErr('uinput', 'Failed to sanitize html because the input is unstable'); } mXSSAttempts--; diff --git a/src/ngScenario/Application.js b/src/ngScenario/Application.js index 07efe4fa2baa..3639a3274506 100644 --- a/src/ngScenario/Application.js +++ b/src/ngScenario/Application.js @@ -97,7 +97,7 @@ angular.scenario.Application.prototype.navigateTo = function(url, loadFn, errorF }).attr('src', url); // for IE compatibility set the name *after* setting the frame url - frame[0].contentWindow.name = "NG_DEFER_BOOTSTRAP!"; + frame[0].contentWindow.name = 'NG_DEFER_BOOTSTRAP!'; } self.context.find('> h2 a').attr('href', url).text(url); }; diff --git a/src/ngScenario/angular-bootstrap.js b/src/ngScenario/angular-bootstrap.js index 3f1b0bf7bee5..fae98227f1a5 100644 --- a/src/ngScenario/angular-bootstrap.js +++ b/src/ngScenario/angular-bootstrap.js @@ -3,7 +3,7 @@ (function(previousOnLoad) { var prefix = (function() { var filename = /(.*\/)angular-bootstrap.js(#(.*))?/; - var scripts = window.document.getElementsByTagName("script"); + var scripts = window.document.getElementsByTagName('script'); for (var j = 0; j < scripts.length; j++) { var src = scripts[j].src; if (src && src.match(filename)) { @@ -28,28 +28,28 @@ angular.scenario.setUpAndRun({}); }; - addCSS("../../css/angular-scenario.css"); - addScript("../../lib/jquery/jquery.js"); + addCSS('../../css/angular-scenario.css'); + addScript('../../lib/jquery/jquery.js'); window.document.write( '' ); - addScript("../angular-bootstrap.js"); - - addScript("Scenario.js"); - addScript("Application.js"); - addScript("Describe.js"); - addScript("Future.js"); - addScript("Runner.js"); - addScript("SpecRunner.js"); - addScript("dsl.js"); - addScript("matchers.js"); - addScript("ObjectModel.js"); - addScript("output/Html.js"); - addScript("output/Json.js"); - addScript("output/Object.js"); - addScript("output/Xml.js"); + addScript('../angular-bootstrap.js'); + + addScript('Scenario.js'); + addScript('Application.js'); + addScript('Describe.js'); + addScript('Future.js'); + addScript('Runner.js'); + addScript('SpecRunner.js'); + addScript('dsl.js'); + addScript('matchers.js'); + addScript('ObjectModel.js'); + addScript('output/Html.js'); + addScript('output/Json.js'); + addScript('output/Object.js'); + addScript('output/Xml.js'); // Create the runner (which also sets up the global API) window.document.write( diff --git a/src/ngScenario/dsl.js b/src/ngScenario/dsl.js index 625c2b80c368..142811b043d1 100644 --- a/src/ngScenario/dsl.js +++ b/src/ngScenario/dsl.js @@ -50,7 +50,7 @@ angular.scenario.dsl('browser', function() { chain.navigateTo = function(url, delegate) { var application = this.application; - return this.addFuture("browser navigate to '" + url + "'", function(done) { + return this.addFuture('browser navigate to \'' + url + '\'', function(done) { if (delegate) { url = delegate.call(this, url); } @@ -181,11 +181,11 @@ angular.scenario.dsl('using', function() { */ angular.scenario.dsl('binding', function() { return function(name) { - return this.addFutureAction("select binding '" + name + "'", + return this.addFutureAction('select binding \'' + name + '\'', function($window, $document, done) { var values = $document.elements().bindings($window.angular.element, name); if (!values.length) { - return done("Binding selector '" + name + "' did not match."); + return done('Binding selector \'' + name + '\' did not match.'); } done(null, values[0]); }); @@ -204,7 +204,7 @@ angular.scenario.dsl('input', function() { var supportInputEvent = 'oninput' in window.document.createElement('div') && !msie; chain.enter = function(value, event) { - return this.addFutureAction("input '" + this.name + "' enter '" + value + "'", + return this.addFutureAction('input \'' + this.name + '\' enter \'' + value + '\'', function($window, $document, done) { var input = $document.elements('[ng\\:model="$1"]', this.name).filter(':input'); input.val(value); @@ -214,7 +214,7 @@ angular.scenario.dsl('input', function() { }; chain.check = function() { - return this.addFutureAction("checkbox '" + this.name + "' toggle", + return this.addFutureAction('checkbox \'' + this.name + '\' toggle', function($window, $document, done) { var input = $document.elements('[ng\\:model="$1"]', this.name).filter(':checkbox'); input.trigger('click'); @@ -223,7 +223,7 @@ angular.scenario.dsl('input', function() { }; chain.select = function(value) { - return this.addFutureAction("radio button '" + this.name + "' toggle '" + value + "'", + return this.addFutureAction('radio button \'' + this.name + '\' toggle \'' + value + '\'', function($window, $document, done) { var input = $document. elements('[ng\\:model="$1"][value="$2"]', this.name, value).filter(':radio'); @@ -233,7 +233,7 @@ angular.scenario.dsl('input', function() { }; chain.val = function() { - return this.addFutureAction("return input val", function($window, $document, done) { + return this.addFutureAction('return input val', function($window, $document, done) { var input = $document.elements('[ng\\:model="$1"]', this.name).filter(':input'); done(null,input.val()); }); @@ -257,7 +257,7 @@ angular.scenario.dsl('repeater', function() { var chain = {}; chain.count = function() { - return this.addFutureAction("repeater '" + this.label + "' count", + return this.addFutureAction('repeater \'' + this.label + '\' count', function($window, $document, done) { try { done(null, $document.elements().length); @@ -268,14 +268,14 @@ angular.scenario.dsl('repeater', function() { }; chain.column = function(binding) { - return this.addFutureAction("repeater '" + this.label + "' column '" + binding + "'", + return this.addFutureAction('repeater \'' + this.label + '\' column \'' + binding + '\'', function($window, $document, done) { done(null, $document.elements().bindings($window.angular.element, binding)); }); }; chain.row = function(index) { - return this.addFutureAction("repeater '" + this.label + "' row '" + index + "'", + return this.addFutureAction('repeater \'' + this.label + '\' row \'' + index + '\'', function($window, $document, done) { var matches = $document.elements().slice(index, index + 1); if (!matches.length) { @@ -300,7 +300,7 @@ angular.scenario.dsl('select', function() { var chain = {}; chain.option = function(value) { - return this.addFutureAction("select '" + this.name + "' option '" + value + "'", + return this.addFutureAction('select \'' + this.name + '\' option \'' + value + '\'', function($window, $document, done) { var select = $document.elements('select[ng\\:model="$1"]', this.name); var option = select.find('option[value="' + value + '"]'); @@ -316,7 +316,7 @@ angular.scenario.dsl('select', function() { if (option.length) { select.val(option.val()); } else { - return done("option '" + value + "' not found"); + return done('option \'' + value + '\' not found'); } } select.trigger('change'); @@ -326,7 +326,7 @@ angular.scenario.dsl('select', function() { chain.options = function() { var values = arguments; - return this.addFutureAction("select '" + this.name + "' options '" + values + "'", + return this.addFutureAction('select \'' + this.name + '\' options \'' + values + '\'', function($window, $document, done) { var select = $document.elements('select[multiple][ng\\:model="$1"]', this.name); select.val(values); @@ -363,7 +363,7 @@ angular.scenario.dsl('element', function() { var chain = {}; chain.count = function() { - return this.addFutureAction("element '" + this.label + "' count", + return this.addFutureAction('element \'' + this.label + '\' count', function($window, $document, done) { try { done(null, $document.elements().length); @@ -374,7 +374,7 @@ angular.scenario.dsl('element', function() { }; chain.click = function() { - return this.addFutureAction("element '" + this.label + "' click", + return this.addFutureAction('element \'' + this.label + '\' click', function($window, $document, done) { var elements = $document.elements(); var href = elements.attr('href'); @@ -391,7 +391,7 @@ angular.scenario.dsl('element', function() { }; chain.dblclick = function() { - return this.addFutureAction("element '" + this.label + "' dblclick", + return this.addFutureAction('element \'' + this.label + '\' dblclick', function($window, $document, done) { var elements = $document.elements(); var href = elements.attr('href'); @@ -408,7 +408,7 @@ angular.scenario.dsl('element', function() { }; chain.mouseover = function() { - return this.addFutureAction("element '" + this.label + "' mouseover", + return this.addFutureAction('element \'' + this.label + '\' mouseover', function($window, $document, done) { var elements = $document.elements(); elements.trigger('mouseover'); @@ -417,7 +417,7 @@ angular.scenario.dsl('element', function() { }; chain.mousedown = function() { - return this.addFutureAction("element '" + this.label + "' mousedown", + return this.addFutureAction('element \'' + this.label + '\' mousedown', function($window, $document, done) { var elements = $document.elements(); elements.trigger('mousedown'); @@ -426,7 +426,7 @@ angular.scenario.dsl('element', function() { }; chain.mouseup = function() { - return this.addFutureAction("element '" + this.label + "' mouseup", + return this.addFutureAction('element \'' + this.label + '\' mouseup', function($window, $document, done) { var elements = $document.elements(); elements.trigger('mouseup'); @@ -445,9 +445,9 @@ angular.scenario.dsl('element', function() { chain[methodName] = function(name, value) { var args = arguments, futureName = (args.length === 1) - ? "element '" + this.label + "' get " + methodName + " '" + name + "'" - : "element '" + this.label + "' set " + methodName + " '" + name + "' to '" + - value + "'"; + ? 'element \'' + this.label + '\' get ' + methodName + ' \'' + name + '\'' + : 'element \'' + this.label + '\' set ' + methodName + ' \'' + name + '\' to \'' + + value + '\''; return this.addFutureAction(futureName, function($window, $document, done) { var element = $document.elements(); @@ -460,8 +460,8 @@ angular.scenario.dsl('element', function() { chain[methodName] = function(value) { var args = arguments, futureName = (args.length === 0) - ? "element '" + this.label + "' " + methodName - : "element '" + this.label + "' set " + methodName + " to '" + value + "'"; + ? 'element \'' + this.label + '\' ' + methodName + : 'element \'' + this.label + '\' set ' + methodName + ' to \'' + value + '\''; return this.addFutureAction(futureName, function($window, $document, done) { var element = $document.elements(); diff --git a/src/ngScenario/output/Html.js b/src/ngScenario/output/Html.js index 7f69a734db20..962d5a32303a 100644 --- a/src/ngScenario/output/Html.js +++ b/src/ngScenario/output/Html.js @@ -76,7 +76,7 @@ angular.scenario.output('html', function(context, runner, model) { spec = model.getSpec(spec.id); ui.removeClass('status-pending'); ui.addClass('status-' + spec.status); - ui.find("> .test-info .timer-result").text(spec.duration + "ms"); + ui.find('> .test-info .timer-result').text(spec.duration + 'ms'); if (spec.status === 'success') { ui.find('> .test-info .test-name').addClass('closed'); ui.find('> .scrollpane .test-actions').hide(); diff --git a/test/AngularSpec.js b/test/AngularSpec.js index d8b9bf5b9af2..6fa00567139a 100644 --- a/test/AngularSpec.js +++ b/test/AngularSpec.js @@ -25,15 +25,15 @@ describe('angular', function() { }); }); - describe("copy", function() { - it("should return same object", function() { + describe('copy', function() { + it('should return same object', function() { var obj = {}; var arr = []; expect(copy({}, obj)).toBe(obj); expect(copy([], arr)).toBe(arr); }); - it("should preserve prototype chaining", function() { + it('should preserve prototype chaining', function() { var GrandParentProto = {}; var ParentProto = Object.create(GrandParentProto); var obj = Object.create(ParentProto); @@ -43,51 +43,51 @@ describe('angular', function() { expect(copy(new Foo()) instanceof Foo).toBe(true); }); - it("should copy Date", function() { + it('should copy Date', function() { var date = new Date(123); expect(copy(date) instanceof Date).toBeTruthy(); expect(copy(date).getTime()).toEqual(123); expect(copy(date) === date).toBeFalsy(); }); - it("should copy RegExp", function() { - var re = new RegExp(".*"); + it('should copy RegExp', function() { + var re = new RegExp('.*'); expect(copy(re) instanceof RegExp).toBeTruthy(); - expect(copy(re).source).toBe(".*"); + expect(copy(re).source).toBe('.*'); expect(copy(re) === re).toBe(false); }); - it("should copy literal RegExp", function() { + it('should copy literal RegExp', function() { var re = /.*/; expect(copy(re) instanceof RegExp).toBeTruthy(); - expect(copy(re).source).toEqual(".*"); + expect(copy(re).source).toEqual('.*'); expect(copy(re) === re).toBeFalsy(); }); - it("should copy RegExp with flags", function() { + it('should copy RegExp with flags', function() { var re = new RegExp('.*', 'gim'); expect(copy(re).global).toBe(true); expect(copy(re).ignoreCase).toBe(true); expect(copy(re).multiline).toBe(true); }); - it("should copy RegExp with lastIndex", function() { + it('should copy RegExp with lastIndex', function() { var re = /a+b+/g; var str = 'ab aabb'; expect(re.exec(str)[0]).toEqual('ab'); expect(copy(re).exec(str)[0]).toEqual('aabb'); }); - it("should deeply copy literal RegExp", function() { + it('should deeply copy literal RegExp', function() { var objWithRegExp = { re: /.*/ }; expect(copy(objWithRegExp).re instanceof RegExp).toBeTruthy(); - expect(copy(objWithRegExp).re.source).toEqual(".*"); + expect(copy(objWithRegExp).re.source).toEqual('.*'); expect(copy(objWithRegExp.re) === objWithRegExp.re).toBeFalsy(); }); - it("should copy a Uint8Array with no destination", function() { + it('should copy a Uint8Array with no destination', function() { if (typeof Uint8Array !== 'undefined') { var src = new Uint8Array(2); src[1] = 1; @@ -99,7 +99,7 @@ describe('angular', function() { } }); - it("should copy a Uint8ClampedArray with no destination", function() { + it('should copy a Uint8ClampedArray with no destination', function() { if (typeof Uint8ClampedArray !== 'undefined') { var src = new Uint8ClampedArray(2); src[1] = 1; @@ -111,7 +111,7 @@ describe('angular', function() { } }); - it("should copy a Uint16Array with no destination", function() { + it('should copy a Uint16Array with no destination', function() { if (typeof Uint16Array !== 'undefined') { var src = new Uint16Array(2); src[1] = 1; @@ -123,7 +123,7 @@ describe('angular', function() { } }); - it("should copy a Uint32Array with no destination", function() { + it('should copy a Uint32Array with no destination', function() { if (typeof Uint32Array !== 'undefined') { var src = new Uint32Array(2); src[1] = 1; @@ -135,7 +135,7 @@ describe('angular', function() { } }); - it("should copy a Int8Array with no destination", function() { + it('should copy a Int8Array with no destination', function() { if (typeof Int8Array !== 'undefined') { var src = new Int8Array(2); src[1] = 1; @@ -147,7 +147,7 @@ describe('angular', function() { } }); - it("should copy a Int16Array with no destination", function() { + it('should copy a Int16Array with no destination', function() { if (typeof Int16Array !== 'undefined') { var src = new Int16Array(2); src[1] = 1; @@ -159,7 +159,7 @@ describe('angular', function() { } }); - it("should copy a Int32Array with no destination", function() { + it('should copy a Int32Array with no destination', function() { if (typeof Int32Array !== 'undefined') { var src = new Int32Array(2); src[1] = 1; @@ -171,7 +171,7 @@ describe('angular', function() { } }); - it("should copy a Float32Array with no destination", function() { + it('should copy a Float32Array with no destination', function() { if (typeof Float32Array !== 'undefined') { var src = new Float32Array(2); src[1] = 1; @@ -183,7 +183,7 @@ describe('angular', function() { } }); - it("should copy a Float64Array with no destination", function() { + it('should copy a Float64Array with no destination', function() { if (typeof Float64Array !== 'undefined') { var src = new Float64Array(2); src[1] = 1; @@ -249,7 +249,7 @@ describe('angular', function() { } }); - it("should handle Uint16Array subarray", function() { + it('should handle Uint16Array subarray', function() { if (typeof Uint16Array !== 'undefined') { var arr = new Uint16Array(4); arr[1] = 1; @@ -263,109 +263,109 @@ describe('angular', function() { } }); - it("should throw an exception if a Uint8Array is the destination", function() { + it('should throw an exception if a Uint8Array is the destination', function() { if (typeof Uint8Array !== 'undefined') { var src = new Uint8Array(); var dst = new Uint8Array(5); expect(function() { copy(src, dst); }) - .toThrowMinErr("ng", "cpta", "Can't copy! TypedArray destination cannot be mutated."); + .toThrowMinErr('ng', 'cpta', 'Can\'t copy! TypedArray destination cannot be mutated.'); } }); - it("should throw an exception if a Uint8ClampedArray is the destination", function() { + it('should throw an exception if a Uint8ClampedArray is the destination', function() { if (typeof Uint8ClampedArray !== 'undefined') { var src = new Uint8ClampedArray(); var dst = new Uint8ClampedArray(5); expect(function() { copy(src, dst); }) - .toThrowMinErr("ng", "cpta", "Can't copy! TypedArray destination cannot be mutated."); + .toThrowMinErr('ng', 'cpta', 'Can\'t copy! TypedArray destination cannot be mutated.'); } }); - it("should throw an exception if a Uint16Array is the destination", function() { + it('should throw an exception if a Uint16Array is the destination', function() { if (typeof Uint16Array !== 'undefined') { var src = new Uint16Array(); var dst = new Uint16Array(5); expect(function() { copy(src, dst); }) - .toThrowMinErr("ng", "cpta", "Can't copy! TypedArray destination cannot be mutated."); + .toThrowMinErr('ng', 'cpta', 'Can\'t copy! TypedArray destination cannot be mutated.'); } }); - it("should throw an exception if a Uint32Array is the destination", function() { + it('should throw an exception if a Uint32Array is the destination', function() { if (typeof Uint32Array !== 'undefined') { var src = new Uint32Array(); var dst = new Uint32Array(5); expect(function() { copy(src, dst); }) - .toThrowMinErr("ng", "cpta", "Can't copy! TypedArray destination cannot be mutated."); + .toThrowMinErr('ng', 'cpta', 'Can\'t copy! TypedArray destination cannot be mutated.'); } }); - it("should throw an exception if a Int8Array is the destination", function() { + it('should throw an exception if a Int8Array is the destination', function() { if (typeof Int8Array !== 'undefined') { var src = new Int8Array(); var dst = new Int8Array(5); expect(function() { copy(src, dst); }) - .toThrowMinErr("ng", "cpta", "Can't copy! TypedArray destination cannot be mutated."); + .toThrowMinErr('ng', 'cpta', 'Can\'t copy! TypedArray destination cannot be mutated.'); } }); - it("should throw an exception if a Int16Array is the destination", function() { + it('should throw an exception if a Int16Array is the destination', function() { if (typeof Int16Array !== 'undefined') { var src = new Int16Array(); var dst = new Int16Array(5); expect(function() { copy(src, dst); }) - .toThrowMinErr("ng", "cpta", "Can't copy! TypedArray destination cannot be mutated."); + .toThrowMinErr('ng', 'cpta', 'Can\'t copy! TypedArray destination cannot be mutated.'); } }); - it("should throw an exception if a Int32Array is the destination", function() { + it('should throw an exception if a Int32Array is the destination', function() { if (typeof Int32Array !== 'undefined') { var src = new Int32Array(); var dst = new Int32Array(5); expect(function() { copy(src, dst); }) - .toThrowMinErr("ng", "cpta", "Can't copy! TypedArray destination cannot be mutated."); + .toThrowMinErr('ng', 'cpta', 'Can\'t copy! TypedArray destination cannot be mutated.'); } }); - it("should throw an exception if a Float32Array is the destination", function() { + it('should throw an exception if a Float32Array is the destination', function() { if (typeof Float32Array !== 'undefined') { var src = new Float32Array(); var dst = new Float32Array(5); expect(function() { copy(src, dst); }) - .toThrowMinErr("ng", "cpta", "Can't copy! TypedArray destination cannot be mutated."); + .toThrowMinErr('ng', 'cpta', 'Can\'t copy! TypedArray destination cannot be mutated.'); } }); - it("should throw an exception if a Float64Array is the destination", function() { + it('should throw an exception if a Float64Array is the destination', function() { if (typeof Float64Array !== 'undefined') { var src = new Float64Array(); var dst = new Float64Array(5); expect(function() { copy(src, dst); }) - .toThrowMinErr("ng", "cpta", "Can't copy! TypedArray destination cannot be mutated."); + .toThrowMinErr('ng', 'cpta', 'Can\'t copy! TypedArray destination cannot be mutated.'); } }); - it("should throw an exception if an ArrayBuffer is the destination", function() { + it('should throw an exception if an ArrayBuffer is the destination', function() { if (typeof ArrayBuffer !== 'undefined') { var src = new ArrayBuffer(5); var dst = new ArrayBuffer(5); expect(function() { copy(src, dst); }) - .toThrowMinErr("ng", "cpta", "Can't copy! TypedArray destination cannot be mutated."); + .toThrowMinErr('ng', 'cpta', 'Can\'t copy! TypedArray destination cannot be mutated.'); } }); - it("should deeply copy an array into an existing array", function() { - var src = [1, {name:"value"}]; - var dst = [{key:"v"}]; + it('should deeply copy an array into an existing array', function() { + var src = [1, {name:'value'}]; + var dst = [{key:'v'}]; expect(copy(src, dst)).toBe(dst); - expect(dst).toEqual([1, {name:"value"}]); - expect(dst[1]).toEqual({name:"value"}); + expect(dst).toEqual([1, {name:'value'}]); + expect(dst[1]).toEqual({name:'value'}); expect(dst[1]).not.toBe(src[1]); }); - it("should deeply copy an array into a new array", function() { - var src = [1, {name:"value"}]; + it('should deeply copy an array into a new array', function() { + var src = [1, {name:'value'}]; var dst = copy(src); - expect(src).toEqual([1, {name:"value"}]); + expect(src).toEqual([1, {name:'value'}]); expect(dst).toEqual(src); expect(dst).not.toBe(src); expect(dst[1]).not.toBe(src[1]); @@ -373,31 +373,31 @@ describe('angular', function() { it('should copy empty array', function() { var src = []; - var dst = [{key: "v"}]; + var dst = [{key: 'v'}]; expect(copy(src, dst)).toEqual([]); expect(dst).toEqual([]); }); - it("should deeply copy an object into an existing object", function() { - var src = {a:{name:"value"}}; - var dst = {b:{key:"v"}}; + it('should deeply copy an object into an existing object', function() { + var src = {a:{name:'value'}}; + var dst = {b:{key:'v'}}; expect(copy(src, dst)).toBe(dst); - expect(dst).toEqual({a:{name:"value"}}); + expect(dst).toEqual({a:{name:'value'}}); expect(dst.a).toEqual(src.a); expect(dst.a).not.toBe(src.a); }); - it("should deeply copy an object into a non-existing object", function() { - var src = {a:{name:"value"}}; + it('should deeply copy an object into a non-existing object', function() { + var src = {a:{name:'value'}}; var dst = copy(src, undefined); - expect(src).toEqual({a:{name:"value"}}); + expect(src).toEqual({a:{name:'value'}}); expect(dst).toEqual(src); expect(dst).not.toBe(src); expect(dst.a).toEqual(src.a); expect(dst.a).not.toBe(src.a); }); - it("should copy primitives", function() { + it('should copy primitives', function() { expect(copy(null)).toEqual(null); expect(copy('')).toBe(''); expect(copy('lala')).toBe('lala'); @@ -407,28 +407,28 @@ describe('angular', function() { it('should throw an exception if a Scope is being copied', inject(function($rootScope) { expect(function() { copy($rootScope.$new()); }). - toThrowMinErr("ng", "cpws", "Can't copy! Making copies of Window or Scope instances is not supported."); + toThrowMinErr('ng', 'cpws', 'Can\'t copy! Making copies of Window or Scope instances is not supported.'); expect(function() { copy({child: $rootScope.$new()}, {}); }). - toThrowMinErr("ng", "cpws", "Can't copy! Making copies of Window or Scope instances is not supported."); + toThrowMinErr('ng', 'cpws', 'Can\'t copy! Making copies of Window or Scope instances is not supported.'); expect(function() { copy([$rootScope.$new()]); }). - toThrowMinErr("ng", "cpws", "Can't copy! Making copies of Window or Scope instances is not supported."); + toThrowMinErr('ng', 'cpws', 'Can\'t copy! Making copies of Window or Scope instances is not supported.'); })); it('should throw an exception if a Window is being copied', function() { expect(function() { copy(window); }). - toThrowMinErr("ng", "cpws", "Can't copy! Making copies of Window or Scope instances is not supported."); + toThrowMinErr('ng', 'cpws', 'Can\'t copy! Making copies of Window or Scope instances is not supported.'); expect(function() { copy({child: window}); }). - toThrowMinErr("ng", "cpws", "Can't copy! Making copies of Window or Scope instances is not supported."); + toThrowMinErr('ng', 'cpws', 'Can\'t copy! Making copies of Window or Scope instances is not supported.'); expect(function() { copy([window], []); }). - toThrowMinErr("ng", "cpws", "Can't copy! Making copies of Window or Scope instances is not supported."); + toThrowMinErr('ng', 'cpws', 'Can\'t copy! Making copies of Window or Scope instances is not supported.'); }); it('should throw an exception when source and destination are equivalent', function() { var src, dst; src = dst = {key: 'value'}; - expect(function() { copy(src, dst); }).toThrowMinErr("ng", "cpi", "Can't copy! Source and destination are identical."); + expect(function() { copy(src, dst); }).toThrowMinErr('ng', 'cpi', 'Can\'t copy! Source and destination are identical.'); src = dst = [2, 4]; - expect(function() { copy(src, dst); }).toThrowMinErr("ng", "cpi", "Can't copy! Source and destination are identical."); + expect(function() { copy(src, dst); }).toThrowMinErr('ng', 'cpi', 'Can\'t copy! Source and destination are identical.'); }); it('should not copy the private $$hashKey', function() { @@ -604,7 +604,7 @@ describe('angular', function() { }); }); - describe("extend", function() { + describe('extend', function() { it('should not copy the private $$hashKey', function() { var src,dst; @@ -669,7 +669,7 @@ describe('angular', function() { it('should copy elements by reference', function() { var src = { element: document.createElement('div'), - jqObject: jqLite("

    s1s2

    ").find("span") }; + jqObject: jqLite('

    s1s2

    ').find('span') }; var dst = {}; extend(dst, src); @@ -697,13 +697,13 @@ describe('angular', function() { it('should replace primitives with objects', function() { - var dst = { foo: "bloop" }; - var src = { foo: { bar: { baz: "bloop" }}}; + var dst = { foo: 'bloop' }; + var src = { foo: { bar: { baz: 'bloop' }}}; merge(dst, src); expect(dst).toEqual({ foo: { bar: { - baz: "bloop" + baz: 'bloop' } } }); @@ -712,12 +712,12 @@ describe('angular', function() { it('should replace null values in destination with objects', function() { var dst = { foo: null }; - var src = { foo: { bar: { baz: "bloop" }}}; + var src = { foo: { bar: { baz: 'bloop' }}}; merge(dst, src); expect(dst).toEqual({ foo: { bar: { - baz: "bloop" + baz: 'bloop' } } }); @@ -1237,7 +1237,7 @@ describe('angular', function() { }); it('should return true if passed an object', function() { - expect(isArrayLike({0:"test", 1:"bob", 2:"tree", length:3})).toBe(true); + expect(isArrayLike({0:'test', 1:'bob', 2:'tree', length:3})).toBe(true); }); it('should return true if passed arguments object', function() { @@ -1316,21 +1316,21 @@ describe('angular', function() { it('should handle JQLite and jQuery objects like arrays', function() { - var jqObject = jqLite("

    s1s2

    ").find("span"), + var jqObject = jqLite('

    s1s2

    ').find('span'), log = []; forEach(jqObject, function(value, key) { log.push(key + ':' + value.innerHTML); }); expect(log).toEqual(['0:s1', '1:s2']); log = []; - jqObject = jqLite(""); + jqObject = jqLite(''); forEach(jqObject.children(), function(value, key) { log.push(key + ':' + value.innerHTML); }); expect(log).toEqual([]); }); it('should handle NodeList objects like arrays', function() { - var nodeList = jqLite("

    abc

    ")[0].childNodes, + var nodeList = jqLite('

    abc

    ')[0].childNodes, log = []; @@ -1340,11 +1340,11 @@ describe('angular', function() { it('should handle HTMLCollection objects like arrays', function() { - document.body.innerHTML = "

    " + - "a" + - "b" + - "c" + - "

    "; + document.body.innerHTML = '

    ' + + 'a' + + 'b' + + 'c' + + '

    '; var htmlCollection = document.getElementsByName('x'), log = []; @@ -1478,22 +1478,22 @@ describe('angular', function() { it('should follow the ES spec when called with jQuery/jqLite', function() { - testForEachSpec(2, jqLite("ab")); + testForEachSpec(2, jqLite('ab')); }); it('should follow the ES spec when called with childNodes NodeList', function() { - testForEachSpec(2, jqLite("

    ab

    ")[0].childNodes); + testForEachSpec(2, jqLite('

    ab

    ')[0].childNodes); }); it('should follow the ES spec when called with getElementsByTagName HTMLCollection', function() { - testForEachSpec(2, jqLite("

    ab

    ")[0].getElementsByTagName("*")); + testForEachSpec(2, jqLite('

    ab

    ')[0].getElementsByTagName('*')); }); it('should follow the ES spec when called with querySelectorAll HTMLCollection', function() { - testForEachSpec(2, jqLite("

    ab

    ")[0].querySelectorAll("*")); + testForEachSpec(2, jqLite('

    ab

    ')[0].querySelectorAll('*')); }); @@ -1520,8 +1520,8 @@ describe('angular', function() { toEqual('asdf1234asdf'); //don't encode unreserved' - expect(encodeUriSegment("-_.!~*'(); -_.!~*'();")). - toEqual("-_.!~*'();%20-_.!~*'();"); + expect(encodeUriSegment('-_.!~*\'(); -_.!~*\'();')). + toEqual('-_.!~*\'();%20-_.!~*\'();'); //don't encode the rest of pchar' expect(encodeUriSegment(':@&=+$, :@&=+$,')). @@ -1542,8 +1542,8 @@ describe('angular', function() { toEqual('asdf1234asdf'); //don't encode unreserved - expect(encodeUriQuery("-_.!~*'() -_.!~*'()")). - toEqual("-_.!~*'()+-_.!~*'()"); + expect(encodeUriQuery('-_.!~*\'() -_.!~*\'()')). + toEqual('-_.!~*\'()+-_.!~*\'()'); //don't encode the rest of pchar expect(encodeUriQuery(':@$, :@$,')). @@ -1842,9 +1842,9 @@ describe('angular', function() { it('version should have full/major/minor/dot/codeName properties', function() { expect(version).toBeDefined(); expect(version.full).toBe('"NG_VERSION_FULL"'); - expect(version.major).toBe("NG_VERSION_MAJOR"); - expect(version.minor).toBe("NG_VERSION_MINOR"); - expect(version.dot).toBe("NG_VERSION_DOT"); + expect(version.major).toBe('NG_VERSION_MAJOR'); + expect(version.minor).toBe('NG_VERSION_MINOR'); + expect(version.dot).toBe('NG_VERSION_DOT'); expect(version.codeName).toBe('"NG_VERSION_CODENAME"'); }); }); @@ -1858,7 +1858,7 @@ describe('angular', function() { dealoc(element); }); - it("should complain if app module can't be found", function() { + it('should complain if app module can\'t be found', function() { var element = jqLite('
    {{1+2}}
    '); expect(function() { @@ -1903,7 +1903,7 @@ describe('angular', function() { window.name = 'NG_DEFER_BOOTSTRAP!'; angular.resumeDeferredBootstrap = noop; - var spy = spyOn(angular, "resumeDeferredBootstrap"); + var spy = spyOn(angular, 'resumeDeferredBootstrap'); injector = angular.bootstrap(element); expect(spy).toHaveBeenCalled(); }); @@ -2065,7 +2065,7 @@ describe('angular', function() { var element = $compile('

    Hello, world!

    ')($rootScope), body = $document.find('body')[0], expected = [false, false, false, false, false, false, false, true, true], - tests = [null, undefined, "string", 1001, {}, 0, false, body, element]; + tests = [null, undefined, 'string', 1001, {}, 0, false, body, element]; angular.forEach(tests, function(value, idx) { var result = angular.isElement(value); expect(typeof result).toEqual('boolean'); diff --git a/test/BinderSpec.js b/test/BinderSpec.js index faeb9a9f25c7..5d9beae964cc 100644 --- a/test/BinderSpec.js +++ b/test/BinderSpec.js @@ -62,7 +62,7 @@ describe('Binder', function() { })); it('InputTypeButtonActionExecutesInScope2', inject(function($rootScope, $compile) { - var log = ""; + var log = ''; element = $compile('')($rootScope); $rootScope.action = function() { log += 'click;'; @@ -359,11 +359,11 @@ describe('Binder', function() { it('ShoulIgnoreVbNonBindable', inject(function($rootScope, $compile) { element = $compile( - "
    {{a}}" + - "
    {{a}}
    " + - "
    {{b}}
    " + - "
    {{c}}
    " + - "
    ")($rootScope); + '
    {{a}}' + + '
    {{a}}
    ' + + '
    {{b}}
    ' + + '
    {{c}}
    ' + + '
    ')($rootScope); $rootScope.a = 123; $rootScope.$apply(); expect(element.text()).toBe('123{{a}}{{b}}{{c}}'); @@ -371,7 +371,7 @@ describe('Binder', function() { it('ShouldTemplateBindPreElements', inject(function($rootScope, $compile) { element = $compile('
    Hello {{name}}!
    ')($rootScope); - $rootScope.name = "World"; + $rootScope.name = 'World'; $rootScope.$apply(); expect(sortedHtml(element)).toBe('
    Hello World!
    '); diff --git a/test/auto/injectorSpec.js b/test/auto/injectorSpec.js index c0760aecb687..2e93498bb819 100644 --- a/test/auto/injectorSpec.js +++ b/test/auto/injectorSpec.js @@ -20,7 +20,7 @@ describe('injector', function() { })); - it("should return same instance from calling provider", function() { + it('should return same instance from calling provider', function() { var instance = {}, original = instance; providers('instance', function() { return instance; }); @@ -80,14 +80,14 @@ describe('injector', function() { it('should provide useful message if no provider', function() { expect(function() { injector.get('idontexist'); - }).toThrowMinErr("$injector", "unpr", "Unknown provider: idontexistProvider <- idontexist"); + }).toThrowMinErr('$injector', 'unpr', 'Unknown provider: idontexistProvider <- idontexist'); }); it('should provide the caller name if given', function() { expect(function() { injector.get('idontexist', 'callerName'); - }).toThrowMinErr("$injector", "unpr", "Unknown provider: idontexistProvider <- idontexist <- callerName"); + }).toThrowMinErr('$injector', 'unpr', 'Unknown provider: idontexistProvider <- idontexist <- callerName'); }); @@ -96,18 +96,18 @@ describe('injector', function() { var $controller = injector.get('$controller'); expect(function() { $controller('myCtrl', {$scope: {}}); - }).toThrowMinErr("$injector", "unpr", "Unknown provider: idontexistProvider <- idontexist <- myCtrl"); + }).toThrowMinErr('$injector', 'unpr', 'Unknown provider: idontexistProvider <- idontexist <- myCtrl'); }); it('should not corrupt the cache when an object fails to get instantiated', function() { expect(function() { injector.get('idontexist'); - }).toThrowMinErr("$injector", "unpr", "Unknown provider: idontexistProvider <- idontexist"); + }).toThrowMinErr('$injector', 'unpr', 'Unknown provider: idontexistProvider <- idontexist'); expect(function() { injector.get('idontexist'); - }).toThrowMinErr("$injector", "unpr", "Unknown provider: idontexistProvider <- idontexist"); + }).toThrowMinErr('$injector', 'unpr', 'Unknown provider: idontexistProvider <- idontexist'); }); @@ -116,7 +116,7 @@ describe('injector', function() { providers('b', function(a) {return 2;}); expect(function() { injector.get('b'); - }).toThrowMinErr("$injector", "unpr", "Unknown provider: idontexistProvider <- idontexist <- a <- b"); + }).toThrowMinErr('$injector', 'unpr', 'Unknown provider: idontexistProvider <- idontexist <- a <- b'); }); @@ -147,13 +147,13 @@ describe('injector', function() { it('should call function', function() { Fn.$inject = ['a', 'b', 'c', 'd']; - injector.invoke(Fn, {name:"this"}, {c:3, d:4}); + injector.invoke(Fn, {name:'this'}, {c:3, d:4}); expect(args).toEqual([{name:'this'}, 1, 2, 3, 4]); }); it('should treat array as annotations', function() { - injector.invoke(['a', 'b', 'c', 'd', Fn], {name:"this"}, {c:3, d:4}); + injector.invoke(['a', 'b', 'c', 'd', Fn], {name:'this'}, {c:3, d:4}); expect(args).toEqual([{name:'this'}, 1, 2, 3, 4]); }); @@ -168,10 +168,10 @@ describe('injector', function() { it('should fail with errors if not function or array', function() { expect(function() { injector.invoke({}); - }).toThrowMinErr("ng", "areq", "Argument 'fn' is not a function, got Object"); + }).toThrowMinErr('ng', 'areq', 'Argument \'fn\' is not a function, got Object'); expect(function() { injector.invoke(['a', 123], {}); - }).toThrowMinErr("ng", "areq", "Argument 'fn' is not a function, got number"); + }).toThrowMinErr('ng', 'areq', 'Argument \'fn\' is not a function, got number'); }); }); @@ -947,7 +947,7 @@ describe('injector', function() { it('should throw usefull error on wrong argument type]', function() { expect(function() { $injector.invoke({}); - }).toThrowMinErr("ng", "areq", "Argument 'fn' is not a function, got Object"); + }).toThrowMinErr('ng', 'areq', 'Argument \'fn\' is not a function, got Object'); }); }); @@ -1044,7 +1044,7 @@ describe('injector', function() { }]); expect(function() { $injector.get('nameProvider'); - }).toThrowMinErr("$injector", "unpr", "Unknown provider: nameProviderProvider <- nameProvider"); + }).toThrowMinErr('$injector', 'unpr', 'Unknown provider: nameProviderProvider <- nameProvider'); }); @@ -1052,7 +1052,7 @@ describe('injector', function() { var $injector = createInjector([]); expect(function() { $injector.get('$provide').value('a', 'b'); - }).toThrowMinErr("$injector", "unpr", "Unknown provider: $provideProvider <- $provide"); + }).toThrowMinErr('$injector', 'unpr', 'Unknown provider: $provideProvider <- $provide'); }); diff --git a/test/helpers/matchers.js b/test/helpers/matchers.js index ec8cc436acb6..d68233e47db9 100644 --- a/test/helpers/matchers.js +++ b/test/helpers/matchers.js @@ -19,9 +19,9 @@ beforeEach(function() { }); var message = function() { - return "Expected to have " + presentClasses + - (absentClasses ? (" and not have " + absentClasses + "") : "") + - " but had " + element[0].className + "."; + return 'Expected to have ' + presentClasses + + (absentClasses ? (' and not have ' + absentClasses + '') : '') + + ' but had ' + element[0].className + '.'; }; return { pass: present && !absent, @@ -60,7 +60,7 @@ beforeEach(function() { function generateCompare(isNot) { return function(actual) { var message = valueFn( - "Expected object " + (isNot ? "not " : "") + "to be a promise"); + 'Expected object ' + (isNot ? 'not ' : '') + 'to be a promise'); return { pass: isPromiseLike(actual), message: message }; }; } @@ -72,7 +72,7 @@ beforeEach(function() { }; function generateCompare(isNot) { return function(actual) { - var message = valueFn("Expected element " + (isNot ? "" : "not ") + "to have 'ng-hide' class"); + var message = valueFn('Expected element ' + (isNot ? '' : 'not ') + 'to have \'ng-hide\' class'); var pass = !isNgElementHidden(actual); if (isNot) { pass = !pass; @@ -88,7 +88,7 @@ beforeEach(function() { }; function generateCompare(isNot) { return function(actual) { - var message = valueFn("Expected element " + (isNot ? "not " : "") + "to have 'ng-hide' class"); + var message = valueFn('Expected element ' + (isNot ? 'not ' : '') + 'to have \'ng-hide\' class'); var pass = isNgElementHidden(actual); if (isNot) { pass = !pass; @@ -235,13 +235,13 @@ beforeEach(function() { }; function hasClass(element, selector) { if (!element.getAttribute) return false; - return ((" " + (element.getAttribute('class') || '') + " ").replace(/[\n\t]/g, " "). - indexOf(" " + selector + " ") > -1); + return ((' ' + (element.getAttribute('class') || '') + ' ').replace(/[\n\t]/g, ' '). + indexOf(' ' + selector + ' ') > -1); } function generateCompare(isNot) { return function(actual, clazz) { var message = function() { - return "Expected '" + angular.mock.dump(actual) + "'" + (isNot ? " not " : "") + " to have class '" + clazz + "'."; + return 'Expected \'' + angular.mock.dump(actual) + '\'' + (isNot ? ' not ' : '') + ' to have class \'' + clazz + '\'.'; }; var classes = clazz.trim().split(/\s+/); for (var i = 0; i < classes.length; ++i) { @@ -268,11 +268,11 @@ beforeEach(function() { // This function escapes all special regex characters. // We use it to create matching regex from arbitrary strings. // http://stackoverflow.com/questions/3446170/escape-string-for-use-in-javascript-regex - return str.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g, "\\$&"); + return str.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g, '\\$&'); }, codeRegex = new RegExp('^\\[' + escapeRegexp(namespace) + ':' + escapeRegexp(code) + '\\]'), - not = isNot ? "not " : "", - regex = jasmine.isA_("RegExp", content) ? content : + not = isNot ? 'not ' : '', + regex = jasmine.isA_('RegExp', content) ? content : angular.isDefined(content) ? new RegExp(escapeRegexp(content)) : undefined; if (!angular.isFunction(actual)) { @@ -290,10 +290,10 @@ beforeEach(function() { } var message = function() { - return "Expected function " + not + "to throw " + - namespace + "MinErr('" + code + "')" + - (regex ? " matching " + regex.toString() : "") + - (exception ? ", but it threw " + exceptionMessage : "."); + return 'Expected function ' + not + 'to throw ' + + namespace + 'MinErr(\'' + code + '\')' + + (regex ? ' matching ' + regex.toString() : '') + + (exception ? ', but it threw ' + exceptionMessage : '.'); }; result = codeRegex.test(exceptionMessage); diff --git a/test/helpers/testabilityPatch.js b/test/helpers/testabilityPatch.js index 669c304d861c..dfb03b31e739 100644 --- a/test/helpers/testabilityPatch.js +++ b/test/helpers/testabilityPatch.js @@ -156,15 +156,15 @@ function jqLiteCacheSize() { * @param {boolean=} showNgClass */ function sortedHtml(element, showNgClass) { - var html = ""; + var html = ''; forEach(jqLite(element), function toString(node) { - if (node.nodeName === "#text") { + if (node.nodeName === '#text') { html += node.nodeValue. replace(/&(\w+[&;\W])?/g, function(match, entity) {return entity ? match : '&';}). replace(//g, '>'); - } else if (node.nodeName === "#comment") { + } else if (node.nodeName === '#comment') { html += ''; } else { html += '<' + (node.nodeName || '?NOT_A_NODE?').toLowerCase(); diff --git a/test/jqLiteSpec.js b/test/jqLiteSpec.js index 48835bb000c9..87ad0566a08f 100644 --- a/test/jqLiteSpec.js +++ b/test/jqLiteSpec.js @@ -20,7 +20,7 @@ describe('jqLite', function() { toJqEqual: function() { return { compare: function(_actual_, expected) { - var msg = "Unequal length"; + var msg = 'Unequal length'; var message = function() {return msg;}; var value = _actual_ && expected && _actual_.length === expected.length; @@ -28,9 +28,9 @@ describe('jqLite', function() { var actual = jqLite(_actual_[i])[0]; var expect = jqLite(expected[i])[0]; value = value && equals(expect, actual); - msg = "Not equal at index: " + i - + " - Expected: " + expect - + " - Actual: " + actual; + msg = 'Not equal at index: ' + i + + ' - Expected: ' + expect + + ' - Actual: ' + actual; } return { pass: value, message: message }; } @@ -230,9 +230,9 @@ describe('jqLite', function() { frag = document.createDocumentFragment(), $frag = jqLite(frag); frag.host = host[0]; - host.data("foo", 123); + host.data('foo', 123); host.append($frag); - expect($frag.inheritedData("foo")).toBe(123); + expect($frag.inheritedData('foo')).toBe(123); dealoc(host); dealoc($frag); @@ -438,24 +438,24 @@ describe('jqLite', function() { var node = document.createElement('div'); expect(jqLite.hasData(node)).toBe(false); - expect(jqLite.data(node, "foo")).toBeUndefined(); + expect(jqLite.data(node, 'foo')).toBeUndefined(); expect(jqLite.hasData(node)).toBe(false); - jqLite.data(node, "foo", "bar"); + jqLite.data(node, 'foo', 'bar'); expect(jqLite.hasData(node)).toBe(true); - expect(jqLite.data(node, "foo")).toBe("bar"); - expect(jqLite(node).data("foo")).toBe("bar"); + expect(jqLite.data(node, 'foo')).toBe('bar'); + expect(jqLite(node).data('foo')).toBe('bar'); expect(jqLite.data(node)).toBe(jqLite(node).data()); - jqLite.removeData(node, "foo"); - expect(jqLite.data(node, "foo")).toBeUndefined(); + jqLite.removeData(node, 'foo'); + expect(jqLite.data(node, 'foo')).toBeUndefined(); - jqLite.data(node, "bar", "baz"); + jqLite.data(node, 'bar', 'baz'); jqLite.removeData(node); jqLite.removeData(node); - expect(jqLite.data(node, "bar")).toBeUndefined(); + expect(jqLite.data(node, 'bar')).toBeUndefined(); jqLite(node).remove(); expect(jqLite.hasData(node)).toBe(false); @@ -1857,7 +1857,7 @@ describe('jqLite', function() { it('should wrap text node', function() { var root = jqLite('
    A<a>B</a>C
    '); var text = root.contents(); - expect(text.wrap("")[0]).toBe(text[0]); + expect(text.wrap('')[0]).toBe(text[0]); expect(root.find('span').text()).toEqual('ABC'); }); it('should wrap free text node', function() { @@ -1866,7 +1866,7 @@ describe('jqLite', function() { text.remove(); expect(root.text()).toBe(''); - text.wrap(""); + text.wrap(''); expect(text.parent().text()).toEqual('ABC'); }); it('should clone elements to be wrapped around target', function() { @@ -2084,9 +2084,9 @@ describe('jqLite', function() { element.on('click', pokeSpy); - element.triggerHandler('click', [{hello: "world"}]); + element.triggerHandler('click', [{hello: 'world'}]); data = pokeSpy.calls.mostRecent().args[1]; - expect(data.hello).toBe("world"); + expect(data.hello).toBe('world'); }); it('should mark event as prevented if preventDefault is called', function() { @@ -2122,7 +2122,7 @@ describe('jqLite', function() { expect(clickSpy).toHaveBeenCalledTimes(2); }); - it("should accept a custom event instead of eventName", function() { + it('should accept a custom event instead of eventName', function() { var element = jqLite('poke'), pokeSpy = jasmine.createSpy('poke'), customEvent = { diff --git a/test/loaderSpec.js b/test/loaderSpec.js index 26d676452b26..c4f7a33989bd 100644 --- a/test/loaderSpec.js +++ b/test/loaderSpec.js @@ -66,7 +66,7 @@ describe('module loader', function() { }); - it("should not throw error when `module.decorator` is declared before provider that it decorates", function() { + it('should not throw error when `module.decorator` is declared before provider that it decorates', function() { angular.module('theModule', []). decorator('theProvider', function($delegate) { return $delegate; }). factory('theProvider', function() { return {}; }); @@ -77,7 +77,7 @@ describe('module loader', function() { }); - it("should run decorators in order of declaration, even when mixed with provider.decorator", function() { + it('should run decorators in order of declaration, even when mixed with provider.decorator', function() { var log = ''; angular.module('theModule', []) @@ -107,7 +107,7 @@ describe('module loader', function() { }); - it("should decorate the last declared provider if multiple have been declared", function() { + it('should decorate the last declared provider if multiple have been declared', function() { var log = ''; angular.module('theModule', []). @@ -142,15 +142,15 @@ describe('module loader', function() { it('should complain of no module', function() { expect(function() { window.angular.module('dontExist'); - }).toThrowMinErr("$injector", "nomod", "Module 'dontExist' is not available! You either misspelled the module name " + - "or forgot to load it. If registering a module ensure that you specify the dependencies as the second " + - "argument."); + }).toThrowMinErr('$injector', 'nomod', 'Module \'dontExist\' is not available! You either misspelled the module name ' + + 'or forgot to load it. If registering a module ensure that you specify the dependencies as the second ' + + 'argument.'); }); it('should complain if a module is called "hasOwnProperty', function() { expect(function() { window.angular.module('hasOwnProperty', []); - }).toThrowMinErr('ng','badname', "hasOwnProperty is not a valid module name"); + }).toThrowMinErr('ng','badname', 'hasOwnProperty is not a valid module name'); }); it('should expose `$$minErr` on the `angular` object', function() { diff --git a/test/minErrSpec.js b/test/minErrSpec.js index abf036883eba..d438dc517b58 100644 --- a/test/minErrSpec.js +++ b/test/minErrSpec.js @@ -19,7 +19,7 @@ describe('minErr', function() { function someFn() { function nestedFn() { - myError = testError('fail', "I fail!"); + myError = testError('fail', 'I fail!'); } nestedFn(); } diff --git a/test/modules/no_bootstrap.js b/test/modules/no_bootstrap.js index b44324c59dfb..d39f8a5b1d76 100644 --- a/test/modules/no_bootstrap.js +++ b/test/modules/no_bootstrap.js @@ -1,4 +1,4 @@ 'use strict'; // When running the modules test, then the page should not be bootstrapped. -window.name = "NG_DEFER_BOOTSTRAP!"; +window.name = 'NG_DEFER_BOOTSTRAP!'; diff --git a/test/ng/animateCssSpec.js b/test/ng/animateCssSpec.js index dcc37b7fc9c9..5299cfa0a4fc 100644 --- a/test/ng/animateCssSpec.js +++ b/test/ng/animateCssSpec.js @@ -1,6 +1,6 @@ 'use strict'; -describe("$animateCss", function() { +describe('$animateCss', function() { var triggerRAF, element; beforeEach(inject(function($$rAF, $rootElement, $document) { @@ -14,9 +14,9 @@ describe("$animateCss", function() { body.append($rootElement); })); - describe("without animation", function() { + describe('without animation', function() { - it("should not alter the provided options input in any way", inject(function($animateCss) { + it('should not alter the provided options input in any way', inject(function($animateCss) { var initialOptions = { from: { height: '50px' }, to: { width: '50px' }, @@ -31,7 +31,7 @@ describe("$animateCss", function() { expect(copiedOptions).toEqual(initialOptions); })); - it("should not create a copy of the provided options if they have already been prepared earlier", + it('should not create a copy of the provided options if they have already been prepared earlier', inject(function($animateCss, $$rAF) { var options = { @@ -53,26 +53,26 @@ describe("$animateCss", function() { expect(options.from).toBeFalsy(); })); - it("should apply the provided [from] CSS to the element", inject(function($animateCss) { + it('should apply the provided [from] CSS to the element', inject(function($animateCss) { $animateCss(element, { from: { height: '50px' }}).start(); expect(element.css('height')).toBe('50px'); })); - it("should apply the provided [to] CSS to the element after the first frame", inject(function($animateCss) { + it('should apply the provided [to] CSS to the element after the first frame', inject(function($animateCss) { $animateCss(element, { to: { width: '50px' }}).start(); expect(element.css('width')).not.toBe('50px'); triggerRAF(); expect(element.css('width')).toBe('50px'); })); - it("should apply the provided [addClass] CSS classes to the element after the first frame", inject(function($animateCss) { + it('should apply the provided [addClass] CSS classes to the element after the first frame', inject(function($animateCss) { $animateCss(element, { addClass: 'golden man' }).start(); expect(element).not.toHaveClass('golden man'); triggerRAF(); expect(element).toHaveClass('golden man'); })); - it("should apply the provided [removeClass] CSS classes to the element after the first frame", inject(function($animateCss) { + it('should apply the provided [removeClass] CSS classes to the element after the first frame', inject(function($animateCss) { element.addClass('silver'); $animateCss(element, { removeClass: 'silver dude' }).start(); expect(element).toHaveClass('silver'); @@ -80,17 +80,17 @@ describe("$animateCss", function() { expect(element).not.toHaveClass('silver'); })); - it("should return an animator with a start method which returns a promise", inject(function($animateCss) { + it('should return an animator with a start method which returns a promise', inject(function($animateCss) { var promise = $animateCss(element, { addClass: 'cool' }).start(); expect(isPromiseLike(promise)).toBe(true); })); - it("should return an animator with an end method which returns a promise", inject(function($animateCss) { + it('should return an animator with an end method which returns a promise', inject(function($animateCss) { var promise = $animateCss(element, { addClass: 'cool' }).end(); expect(isPromiseLike(promise)).toBe(true); })); - it("should only resolve the promise once both a digest and RAF have passed after start", + it('should only resolve the promise once both a digest and RAF have passed after start', inject(function($animateCss, $rootScope) { var doneSpy = jasmine.createSpy(); @@ -106,7 +106,7 @@ describe("$animateCss", function() { expect(doneSpy).toHaveBeenCalled(); })); - it("should resolve immediately if runner.end() is called", + it('should resolve immediately if runner.end() is called', inject(function($animateCss, $rootScope) { var doneSpy = jasmine.createSpy(); @@ -120,7 +120,7 @@ describe("$animateCss", function() { expect(doneSpy).toHaveBeenCalled(); })); - it("should reject immediately if runner.end() is called", + it('should reject immediately if runner.end() is called', inject(function($animateCss, $rootScope) { var cancelSpy = jasmine.createSpy(); @@ -134,7 +134,7 @@ describe("$animateCss", function() { expect(cancelSpy).toHaveBeenCalled(); })); - it("should not resolve after the next frame if the runner has already been cancelled", + it('should not resolve after the next frame if the runner has already been cancelled', inject(function($animateCss, $rootScope) { var doneSpy = jasmine.createSpy(); @@ -153,7 +153,7 @@ describe("$animateCss", function() { expect(doneSpy).not.toHaveBeenCalled(); })); - it("should not bother applying the provided [from] and [to] styles to the element if [cleanupStyles] is present", + it('should not bother applying the provided [from] and [to] styles to the element if [cleanupStyles] is present', inject(function($animateCss, $rootScope) { var animator = $animateCss(element, { diff --git a/test/ng/animateRunnerSpec.js b/test/ng/animateRunnerSpec.js index 94f8b79fd1df..cd3ddea7f33d 100644 --- a/test/ng/animateRunnerSpec.js +++ b/test/ng/animateRunnerSpec.js @@ -29,8 +29,8 @@ describe('$$animateAsyncRun', function() { })); }); -describe("$$AnimateRunner", function() { - they("should trigger the host $prop function", +describe('$$AnimateRunner', function() { + they('should trigger the host $prop function', ['end', 'cancel', 'pause', 'resume'], function(method) { inject(function($$AnimateRunner) { @@ -42,7 +42,7 @@ describe("$$AnimateRunner", function() { }); }); - they("should trigger the inner runner's host $prop function", + they('should trigger the inner runner\'s host $prop function', ['end', 'cancel', 'pause', 'resume'], function(method) { inject(function($$AnimateRunner) { @@ -56,7 +56,7 @@ describe("$$AnimateRunner", function() { }); }); - it("should resolve the done function only if one RAF has passed", + it('should resolve the done function only if one RAF has passed', inject(function($$AnimateRunner, $$rAF) { var runner = new $$AnimateRunner(); @@ -68,7 +68,7 @@ describe("$$AnimateRunner", function() { expect(spy).toHaveBeenCalled(); })); - it("should resolve with the status provided in the completion function", + it('should resolve with the status provided in the completion function', inject(function($$AnimateRunner, $$rAF) { var runner = new $$AnimateRunner(); @@ -81,7 +81,7 @@ describe("$$AnimateRunner", function() { expect(capturedValue).toBe('special value'); })); - they("should immediately resolve each combined runner in a bottom-up order when $prop is called", + they('should immediately resolve each combined runner in a bottom-up order when $prop is called', ['end', 'cancel'], function(method) { inject(function($$AnimateRunner) { @@ -109,7 +109,7 @@ describe("$$AnimateRunner", function() { }); }); - they("should resolve/reject using a newly created promise when .then() is used upon $prop", + they('should resolve/reject using a newly created promise when .then() is used upon $prop', ['end', 'cancel'], function(method) { inject(function($$AnimateRunner, $rootScope) { @@ -140,14 +140,14 @@ describe("$$AnimateRunner", function() { }); }); - it("should expose/create the contained promise when getPromise() is called", + it('should expose/create the contained promise when getPromise() is called', inject(function($$AnimateRunner, $rootScope) { var runner = new $$AnimateRunner(); expect(isPromiseLike(runner.getPromise())).toBeTruthy(); })); - it("should expose the `catch` promise function to handle the rejected state", + it('should expose the `catch` promise function to handle the rejected state', inject(function($$AnimateRunner, $rootScope) { var runner = new $$AnimateRunner(); @@ -160,7 +160,7 @@ describe("$$AnimateRunner", function() { expect(animationFailed).toBe(true); })); - it("should use timeouts to trigger async operations when the document is hidden", function() { + it('should use timeouts to trigger async operations when the document is hidden', function() { var hidden = true; module(function($provide) { @@ -196,7 +196,7 @@ describe("$$AnimateRunner", function() { }); }); - they("should expose the `finally` promise function to handle the final state when $prop", + they('should expose the `finally` promise function to handle the final state when $prop', { 'rejected': 'cancel', 'resolved': 'end' }, function(method) { inject(function($$AnimateRunner, $rootScope) { var runner = new $$AnimateRunner(); @@ -210,8 +210,8 @@ describe("$$AnimateRunner", function() { }); }); - describe(".all()", function() { - it("should resolve when all runners have naturally resolved", + describe('.all()', function() { + it('should resolve when all runners have naturally resolved', inject(function($$rAF, $$AnimateRunner) { var runner1 = new $$AnimateRunner(); @@ -234,7 +234,7 @@ describe("$$AnimateRunner", function() { expect(status).toBe(true); })); - they("should immediately resolve if and when all runners have been $prop", + they('should immediately resolve if and when all runners have been $prop', { ended: 'end', cancelled: 'cancel' }, function(method) { inject(function($$AnimateRunner) { @@ -257,7 +257,7 @@ describe("$$AnimateRunner", function() { }); }); - it("should return a status of `false` if one or more runners was cancelled", + it('should return a status of `false` if one or more runners was cancelled', inject(function($$AnimateRunner) { var runner1 = new $$AnimateRunner(); @@ -277,8 +277,8 @@ describe("$$AnimateRunner", function() { })); }); - describe(".chain()", function() { - it("should evaluate an array of functions in a chain", + describe('.chain()', function() { + it('should evaluate an array of functions in a chain', inject(function($$rAF, $$AnimateRunner) { var runner1 = new $$AnimateRunner(); @@ -329,7 +329,7 @@ describe("$$AnimateRunner", function() { expect(status).toBe(true); })); - it("should break the chian when a function evaluates to false", + it('should break the chian when a function evaluates to false', inject(function($$rAF, $$AnimateRunner) { var runner1 = new $$AnimateRunner(); diff --git a/test/ng/animateSpec.js b/test/ng/animateSpec.js index eb98ed2811b9..9481a5619083 100644 --- a/test/ng/animateSpec.js +++ b/test/ng/animateSpec.js @@ -1,8 +1,8 @@ 'use strict'; -describe("$animate", function() { +describe('$animate', function() { - describe("without animation", function() { + describe('without animation', function() { var element, $rootElement; beforeEach(module(function() { @@ -12,14 +12,14 @@ describe("$animate", function() { }; })); - it("should add element at the start of enter animation", inject(function($animate, $compile, $rootScope) { + it('should add element at the start of enter animation', inject(function($animate, $compile, $rootScope) { var child = $compile('
    ')($rootScope); expect(element.contents().length).toBe(0); $animate.enter(child, element); expect(element.contents().length).toBe(1); })); - it("should enter the element to the start of the parent container", + it('should enter the element to the start of the parent container', inject(function($animate, $compile, $rootScope) { for (var i = 0; i < 5; i++) { @@ -32,7 +32,7 @@ describe("$animate", function() { expect(element.text()).toEqual('first 0 1 2 3 4'); })); - it("should remove the element at the end of leave animation", inject(function($animate, $compile, $rootScope) { + it('should remove the element at the end of leave animation', inject(function($animate, $compile, $rootScope) { var child = $compile('
    ')($rootScope); element.append(child); expect(element.contents().length).toBe(1); @@ -40,7 +40,7 @@ describe("$animate", function() { expect(element.contents().length).toBe(0); })); - it("should reorder the move animation", inject(function($animate, $compile, $rootScope) { + it('should reorder the move animation', inject(function($animate, $compile, $rootScope) { var child1 = $compile('
    1
    ')($rootScope); var child2 = $compile('
    2
    ')($rootScope); element.append(child1); @@ -50,7 +50,7 @@ describe("$animate", function() { expect(element.text()).toBe('21'); })); - it("should apply styles instantly to the element", + it('should apply styles instantly to the element', inject(function($animate, $compile, $rootScope) { $animate.animate(element, { color: 'rgb(0, 0, 0)' }); @@ -60,7 +60,7 @@ describe("$animate", function() { expect(element.css('color')).toBe('rgb(0, 255, 0)'); })); - it("should still perform DOM operations even if animations are disabled (post-digest)", inject(function($animate, $rootScope) { + it('should still perform DOM operations even if animations are disabled (post-digest)', inject(function($animate, $rootScope) { $animate.enabled(false); expect(element).toBeShown(); $animate.addClass(element, 'ng-hide'); @@ -68,7 +68,7 @@ describe("$animate", function() { expect(element).toBeHidden(); })); - it("should run each method and return a promise", inject(function($animate, $document) { + it('should run each method and return a promise', inject(function($animate, $document) { var element = jqLite('
    '); var move = jqLite('
    '); var parent = jqLite($document[0].body); @@ -82,17 +82,17 @@ describe("$animate", function() { expect($animate.leave(element)).toBeAPromise(); })); - it("should provide the `enabled` and `cancel` methods", inject(function($animate) { + it('should provide the `enabled` and `cancel` methods', inject(function($animate) { expect($animate.enabled()).toBeUndefined(); expect($animate.cancel({})).toBeUndefined(); })); - it("should provide the `on` and `off` methods", inject(function($animate) { + it('should provide the `on` and `off` methods', inject(function($animate) { expect(isFunction($animate.on)).toBe(true); expect(isFunction($animate.off)).toBe(true); })); - it("should add and remove classes on SVG elements", inject(function($animate, $rootScope) { + it('should add and remove classes on SVG elements', inject(function($animate, $rootScope) { if (!window.SVGElement) return; var svg = jqLite(''); var rect = svg.children(); @@ -106,16 +106,16 @@ describe("$animate", function() { expect(rect).not.toBeHidden(); })); - it("should throw error on wrong selector", function() { + it('should throw error on wrong selector', function() { module(function($animateProvider) { expect(function() { $animateProvider.register('abc', null); - }).toThrowMinErr("$animate", "notcsel", "Expecting class selector starting with '.' got 'abc'."); + }).toThrowMinErr('$animate', 'notcsel', 'Expecting class selector starting with \'.\' got \'abc\'.'); }); inject(); }); - it("should register the animation and be available for lookup", function() { + it('should register the animation and be available for lookup', function() { var provider; module(function($animateProvider) { provider = $animateProvider; @@ -130,7 +130,7 @@ describe("$animate", function() { }); }); - it("should apply and retain inline styles on the element that is animated", inject(function($animate, $rootScope) { + it('should apply and retain inline styles on the element that is animated', inject(function($animate, $rootScope) { var element = jqLite('
    '); var parent = jqLite('
    '); var other = jqLite('
    '); @@ -176,7 +176,7 @@ describe("$animate", function() { } })); - it("should merge the from and to styles that are provided", + it('should merge the from and to styles that are provided', inject(function($animate, $rootScope) { var element = jqLite('
    '); @@ -193,7 +193,7 @@ describe("$animate", function() { expect(style.borderColor).toBe('purple'); })); - it("should avoid cancelling out add/remove when the element already contains the class", + it('should avoid cancelling out add/remove when the element already contains the class', inject(function($animate, $rootScope) { var element = jqLite('
    '); @@ -205,7 +205,7 @@ describe("$animate", function() { expect(element).not.toHaveClass('ng-hide'); })); - it("should avoid cancelling out remove/add if the element does not contain the class", + it('should avoid cancelling out remove/add if the element does not contain the class', inject(function($animate, $rootScope) { var element = jqLite('
    '); @@ -217,7 +217,7 @@ describe("$animate", function() { expect(element).toHaveClass('ng-hide'); })); - they("should accept an unwrapped \"parent\" element for the $prop event", + they('should accept an unwrapped "parent" element for the $prop event', ['enter', 'move'], function(method) { inject(function($document, $animate, $rootElement) { @@ -230,7 +230,7 @@ describe("$animate", function() { }); }); - they("should accept an unwrapped \"after\" element for the $prop event", + they('should accept an unwrapped "after" element for the $prop event', ['enter', 'move'], function(method) { inject(function($document, $animate, $rootElement) { @@ -378,7 +378,7 @@ describe("$animate", function() { }); }); - it("should not alter the provided options input in any way throughout the animation", inject(function($animate, $rootElement, $rootScope) { + it('should not alter the provided options input in any way throughout the animation', inject(function($animate, $rootElement, $rootScope) { var element = jqLite('
    '); var parent = $rootElement; diff --git a/test/ng/browserSpecs.js b/test/ng/browserSpecs.js index 2777d616763a..5c55800d7134 100755 --- a/test/ng/browserSpecs.js +++ b/test/ng/browserSpecs.js @@ -337,7 +337,7 @@ describe('browser', function() { expect(locationReplace).not.toHaveBeenCalled(); }); - it("should retain the # character when the only change is clearing the hash fragment, to prevent page reload", function() { + it('should retain the # character when the only change is clearing the hash fragment, to prevent page reload', function() { sniffer.history = true; browser.url('http://server/#123'); @@ -384,8 +384,8 @@ describe('browser', function() { }); it('should decode single quotes to work around FF bug 407273', function() { - fakeWindow.location.href = "http://ff-bug/?single%27quote"; - expect(browser.url()).toBe("http://ff-bug/?single'quote"); + fakeWindow.location.href = 'http://ff-bug/?single%27quote'; + expect(browser.url()).toBe('http://ff-bug/?single\'quote'); }); it('should not set URL when the URL is already set', function() { @@ -733,7 +733,7 @@ describe('browser', function() { }); - it("should stop calling callbacks when application has been torn down", function() { + it('should stop calling callbacks when application has been torn down', function() { sniffer.history = true; browser.onUrlChange(callback); fakeWindow.location.href = 'http://server/new'; diff --git a/test/ng/cacheFactorySpec.js b/test/ng/cacheFactorySpec.js index cb65a1740679..ddfd8a2819e9 100644 --- a/test/ng/cacheFactorySpec.js +++ b/test/ng/cacheFactorySpec.js @@ -17,7 +17,7 @@ describe('$cacheFactory', function() { it('should complain if the cache id is being reused', inject(function($cacheFactory) { $cacheFactory('cache1'); expect(function() { $cacheFactory('cache1'); }). - toThrowMinErr("$cacheFactory", "iid", "CacheId 'cache1' is already taken!"); + toThrowMinErr('$cacheFactory', 'iid', 'CacheId \'cache1\' is already taken!'); })); @@ -108,7 +108,7 @@ describe('$cacheFactory', function() { })); - it("should return value from put", inject(function($cacheFactory) { + it('should return value from put', inject(function($cacheFactory) { var obj = {}; expect(cache.put('k1', obj)).toBe(obj); })); diff --git a/test/ng/compileSpec.js b/test/ng/compileSpec.js index cac88465c7dd..800fb1be9d27 100755 --- a/test/ng/compileSpec.js +++ b/test/ng/compileSpec.js @@ -70,7 +70,7 @@ describe('$compile', function() { directive('greet', function() { return { restrict: 'CAM', priority:10, compile: valueFn(function(scope, element, attrs) { - element.text("Hello " + attrs.greet); + element.text('Hello ' + attrs.greet); })}; }); @@ -201,7 +201,7 @@ describe('$compile', function() { module(function() { expect(function() { directive('hasOwnProperty', function() { }); - }).toThrowMinErr('ng','badname', "hasOwnProperty is not a valid directive name"); + }).toThrowMinErr('ng','badname', 'hasOwnProperty is not a valid directive name'); }); inject(function($compile) {}); }); @@ -210,7 +210,7 @@ describe('$compile', function() { module(function() { expect(function() { directive('BadDirectiveName', function() { }); - }).toThrowMinErr('$compile','baddir', "Directive/Component name 'BadDirectiveName' is invalid. The first character must be a lowercase letter"); + }).toThrowMinErr('$compile','baddir', 'Directive/Component name \'BadDirectiveName\' is invalid. The first character must be a lowercase letter'); }); inject(function($compile) {}); }); @@ -221,7 +221,7 @@ describe('$compile', function() { directive(name, function() { }); }).toThrowMinErr( '$compile','baddir', 'Directive/Component name \'' + name + '\' is invalid. ' + - "The name should not contain leading or trailing whitespaces"); + 'The name should not contain leading or trailing whitespaces'); } assertLeadingOrTrailingWhitespaceInDirectiveName(' leadingWhitespaceDirectiveName'); assertLeadingOrTrailingWhitespaceInDirectiveName('trailingWhitespaceDirectiveName '); @@ -535,7 +535,7 @@ describe('$compile', function() { $rootScope.$apply(); // object's children can't be compiled in this case, so we expect them to be raw - expect(element.html()).toBe("3"); + expect(element.html()).toBe('3'); })); it('should detect anchor elements with the string "SVG" in the `href` attribute as an anchor', inject(function($compile, $rootScope) { @@ -685,7 +685,7 @@ describe('$compile', function() { })); }); inject(function($compile, $rootScope, log) { - element = jqLite("
    A
    "); + element = jqLite('
    A
    '); $compile(element)($rootScope); expect(element.text()).toBe('AB'); expect(log).toEqual('LOG'); @@ -1128,7 +1128,7 @@ describe('$compile', function() { }); }); - it("should fail if replacing and template doesn't have a single root element", function() { + it('should fail if replacing and template doesn\'t have a single root element', function() { module(function() { directive('noRootElem', function() { return { @@ -1153,11 +1153,11 @@ describe('$compile', function() { inject(function($compile) { expect(function() { $compile('

    '); - }).toThrowMinErr("$compile", "tplrt", "Template for directive 'noRootElem' must have exactly one root element. "); + }).toThrowMinErr('$compile', 'tplrt', 'Template for directive \'noRootElem\' must have exactly one root element. '); expect(function() { $compile('

    '); - }).toThrowMinErr("$compile", "tplrt", "Template for directive 'multiRootElem' must have exactly one root element. "); + }).toThrowMinErr('$compile', 'tplrt', 'Template for directive \'multiRootElem\' must have exactly one root element. '); // ws is ok expect(function() { @@ -1240,7 +1240,7 @@ describe('$compile', function() { $rootScope.$digest(); expect(nodeName_(child)).toMatch(/a/i); expect(isSVGElement(child[0])).toBe(true); - expect(child[0].href.baseVal).toBe("/foo/bar"); + expect(child[0].href.baseVal).toBe('/foo/bar'); }); }); @@ -1295,12 +1295,12 @@ describe('$compile', function() { module(function() { function DirectiveClass() { this.restrict = 'E'; - this.template = "

    {{value}}

    "; + this.template = '

    {{value}}

    '; } DirectiveClass.prototype.compile = function() { return function(scope, element, attrs) { - scope.value = "Test Value"; + scope.value = 'Test Value'; }; }; @@ -1310,7 +1310,7 @@ describe('$compile', function() { inject(function($compile, $rootScope) { element = $compile('')($rootScope); $rootScope.$digest(); - expect(element.find("p")[0].innerHTML).toEqual("Test Value"); + expect(element.find('p')[0].innerHTML).toEqual('Test Value'); }); }); }); @@ -1987,7 +1987,7 @@ describe('$compile', function() { )); - it("should fail if replacing and template doesn't have a single root element", function() { + it('should fail if replacing and template doesn\'t have a single root element', function() { module(function($exceptionHandlerProvider) { $exceptionHandlerProvider.mode('log'); @@ -2175,7 +2175,7 @@ describe('$compile', function() { var child = element.children().eq(0); expect(nodeName_(child)).toMatch(/a/i); expect(isSVGElement(child[0])).toBe(true); - expect(child[0].href.baseVal).toBe("/foo/bar"); + expect(child[0].href.baseVal).toBe('/foo/bar'); }); }); @@ -2234,12 +2234,12 @@ describe('$compile', function() { module(function() { function DirectiveClass() { this.restrict = 'E'; - this.templateUrl = "test.html"; + this.templateUrl = 'test.html'; } DirectiveClass.prototype.compile = function() { return function(scope, element, attrs) { - scope.value = "Test Value"; + scope.value = 'Test Value'; }; }; @@ -2252,7 +2252,7 @@ describe('$compile', function() { element = $compile('')($rootScope); $httpBackend.flush(); $rootScope.$digest(); - expect(element.find("p")[0].innerHTML).toEqual("Test Value"); + expect(element.find('p')[0].innerHTML).toEqual('Test Value'); }); }); @@ -3253,7 +3253,7 @@ describe('$compile', function() { var base = jqLite('
    — {{ "This doesn\'t." }}
    '); element = $compile(base)($rootScope); $rootScope.$digest(); - expect(element.text()).toBe("— This doesn't."); + expect(element.text()).toBe('— This doesn\'t.'); // Unregister the MutationObserver (and hope it doesn't mess up with subsequent tests) observer.disconnect(); @@ -5058,7 +5058,7 @@ describe('$compile', function() { componentScope.ref = 'ignore me'; expect(function() { $rootScope.$apply(); }). - toThrowMinErr("$compile", "nonassign", "Expression ''hello ' + name' in attribute 'ref' used with directive 'myComponent' is non-assignable!"); + toThrowMinErr('$compile', 'nonassign', 'Expression \'\'hello \' + name\' in attribute \'ref\' used with directive \'myComponent\' is non-assignable!'); expect(componentScope.ref).toBe('hello world'); // reset since the exception was rethrown which prevented phase clearing $rootScope.$$phase = null; @@ -5075,7 +5075,7 @@ describe('$compile', function() { componentScope.ref = 'ignore me'; expect(function() { $rootScope.$apply(); }). - toThrowMinErr("$compile", "nonassign", "Expression 'undefined' in attribute 'ref' used with directive 'myComponent' is non-assignable!"); + toThrowMinErr('$compile', 'nonassign', 'Expression \'undefined\' in attribute \'ref\' used with directive \'myComponent\' is non-assignable!'); expect(componentScope.ref).toBeUndefined(); $rootScope.$$phase = null; // reset since the exception was rethrown which prevented phase clearing @@ -5132,7 +5132,7 @@ describe('$compile', function() { componentScope.reference = {name: 'b'}; expect(function() { $rootScope.$apply(); - }).toThrowMinErr("$compile", "nonassign", "Expression '{name: name}' in attribute 'reference' used with directive 'myComponent' is non-assignable!"); + }).toThrowMinErr('$compile', 'nonassign', 'Expression \'{name: name}\' in attribute \'reference\' used with directive \'myComponent\' is non-assignable!'); })); @@ -5140,7 +5140,7 @@ describe('$compile', function() { test('1', 1); test('null', null); test('undefined', undefined); - test("'someString'", 'someString'); + test('\'someString\'', 'someString'); test('true', true); function test(literalString, literalValue) { @@ -5193,7 +5193,7 @@ describe('$compile', function() { name: 'Tony', value: 91 }]; - $rootScope.query = ""; + $rootScope.query = ''; $rootScope.$apply(); compile('
    '); @@ -5201,7 +5201,7 @@ describe('$compile', function() { expect(componentScope.colref).toEqual($rootScope.collection); expect(componentScope.colrefAlias).toEqual(componentScope.colref); - $rootScope.query = "Gab"; + $rootScope.query = 'Gab'; $rootScope.$apply(); expect(componentScope.colref).toEqual([$rootScope.collection[0]]); @@ -5548,7 +5548,7 @@ describe('$compile', function() { test('1', 1); test('null', null); test('undefined', undefined); - test("'someString'", 'someString'); + test('\'someString\'', 'someString'); test('true', true); function test(literalString, literalValue) { @@ -5606,7 +5606,7 @@ describe('$compile', function() { it('should throw on unknown definition', inject(function() { expect(function() { compile('
    '); - }).toThrowMinErr("$compile", "iscp", "Invalid isolate scope definition for directive 'badDeclaration'. Definition: {... attr: 'xxx' ...}"); + }).toThrowMinErr('$compile', 'iscp', 'Invalid isolate scope definition for directive \'badDeclaration\'. Definition: {... attr: \'xxx\' ...}'); })); it('should expose a $$isolateBindings property onto the scope', inject(function() { @@ -5687,23 +5687,23 @@ describe('$compile', function() { var controllerCalled = false; // eslint-disable-next-line no-eval var Controller = eval( - "class Foo {\n" + - " constructor($scope) {}\n" + - " $onInit() { this.check(); }\n" + - " check() {\n" + - " expect(this.data).toEqualData({\n" + - " 'foo': 'bar',\n" + - " 'baz': 'biz'\n" + - " });\n" + - " expect(this.oneway).toEqualData({\n" + - " 'foo': 'bar',\n" + - " 'baz': 'biz'\n" + - " });\n" + - " expect(this.str).toBe('Hello, world!');\n" + - " expect(this.fn()).toBe('called!');\n" + - " controllerCalled = true;\n" + - " }\n" + - "}"); + 'class Foo {\n' + + ' constructor($scope) {}\n' + + ' $onInit() { this.check(); }\n' + + ' check() {\n' + + ' expect(this.data).toEqualData({\n' + + ' \'foo\': \'bar\',\n' + + ' \'baz\': \'biz\'\n' + + ' });\n' + + ' expect(this.oneway).toEqualData({\n' + + ' \'foo\': \'bar\',\n' + + ' \'baz\': \'biz\'\n' + + ' });\n' + + ' expect(this.str).toBe(\'Hello, world!\');\n' + + ' expect(this.fn()).toBe(\'called!\');\n' + + ' controllerCalled = true;\n' + + ' }\n' + + '}'); spyOn(Controller.prototype, '$onInit').and.callThrough(); module(function($compileProvider) { @@ -6755,7 +6755,7 @@ describe('$compile', function() { inject(function($compile, $rootScope) { expect(function() { element = $compile('
    ')($rootScope); - }).toThrowMinErr('$compile', 'ctreq', "Controller 'nested', required by directive 'nested', can't be found!"); + }).toThrowMinErr('$compile', 'ctreq', 'Controller \'nested\', required by directive \'nested\', can\'t be found!'); }); }); @@ -7353,7 +7353,7 @@ describe('$compile', function() { }); - it("should throw an error if required controller can't be found",function() { + it('should throw an error if required controller can\'t be found',function() { module(function() { directive('dep', function(log) { return { @@ -7367,12 +7367,12 @@ describe('$compile', function() { inject(function(log, $compile, $rootScope) { expect(function() { $compile('
    ')($rootScope); - }).toThrowMinErr("$compile", "ctreq", "Controller 'main', required by directive 'dep', can't be found!"); + }).toThrowMinErr('$compile', 'ctreq', 'Controller \'main\', required by directive \'dep\', can\'t be found!'); }); }); - it("should pass null if required controller can't be found and is optional",function() { + it('should pass null if required controller can\'t be found and is optional',function() { module(function() { directive('dep', function(log) { return { @@ -7390,7 +7390,7 @@ describe('$compile', function() { }); - it("should pass null if required controller can't be found and is optional with the question mark on the right",function() { + it('should pass null if required controller can\'t be found and is optional with the question mark on the right',function() { module(function() { directive('dep', function(log) { return { @@ -7585,7 +7585,7 @@ describe('$compile', function() { directive('myDirective', function() { return { scope: { - myFoo: "=" + myFoo: '=' }, template: '

    Hello

    ', controller: Ctrl @@ -7594,7 +7594,7 @@ describe('$compile', function() { }); inject(function($templateCache, $compile, $rootScope, log) { - $rootScope.foo = "bar"; + $rootScope.foo = 'bar'; element = $compile('
    ')($rootScope); $rootScope.$apply(); @@ -7612,7 +7612,7 @@ describe('$compile', function() { directive('myDirective', function() { return { scope: { - myFoo: "=" + myFoo: '=' }, templateUrl: 'hello.html', controller: Ctrl @@ -7622,7 +7622,7 @@ describe('$compile', function() { inject(function($templateCache, $compile, $rootScope, log) { $templateCache.put('hello.html', '

    Hello

    '); - $rootScope.foo = "bar"; + $rootScope.foo = 'bar'; element = $compile('
    ')($rootScope); $rootScope.$apply(); @@ -7747,8 +7747,8 @@ describe('$compile', function() { it('should throw ctreq with correct directive name, regardless of order', function() { module(function($compileProvider) { $compileProvider.directive('aDir', valueFn({ - restrict: "E", - require: "ngModel", + restrict: 'E', + require: 'ngModel', link: noop })); }); @@ -7760,7 +7760,7 @@ describe('$compile', function() { // affect which directive is referenced in the minErr message. element = $compile('')($rootScope); }).toThrowMinErr('$compile', 'ctreq', - "Controller 'ngModel', required by directive 'aDir', can't be found!"); + 'Controller \'ngModel\', required by directive \'aDir\', can\'t be found!'); }); }); }); @@ -7844,15 +7844,15 @@ describe('$compile', function() { }); inject(function($rootScope, $compile) { element = $compile('
    This is after {{after}}
    ')($rootScope); - $rootScope.before = "BEFORE"; - $rootScope.after = "AFTER"; + $rootScope.before = 'BEFORE'; + $rootScope.after = 'AFTER'; $rootScope.$apply(); expect(element.text()).toEqual('This is before BEFORE. This is after AFTER'); - $rootScope.before = "Not-Before"; - $rootScope.after = "AfTeR"; - $rootScope.$$childHead.before = "BeFoRe"; - $rootScope.$$childHead.after = "Not-After"; + $rootScope.before = 'Not-Before'; + $rootScope.after = 'AfTeR'; + $rootScope.$$childHead.before = 'BeFoRe'; + $rootScope.$$childHead.after = 'Not-After'; $rootScope.$apply(); expect(element.text()).toEqual('This is before BeFoRe. This is after AfTeR'); }); @@ -8115,7 +8115,7 @@ describe('$compile', function() { //Ensure the angular $destroy event is still sent var destroyCount = 0; - element.find("div").on("$destroy", function() { destroyCount++; }); + element.find('div').on('$destroy', function() { destroyCount++; }); $rootScope.$apply('xs = null'); @@ -9085,7 +9085,7 @@ describe('$compile', function() { describe('multiple siblings receiving transclusion', function() { - it("should only receive transclude from parent", function() { + it('should only receive transclude from parent', function() { module(function($compileProvider) { @@ -9458,9 +9458,9 @@ describe('$compile', function() { var child = element.children(); expect(log.toArray()).toEqual([ - "outer:#comment:outer:", - "innerAgain:#comment:innerAgain:", - "inner:#comment:innerAgain:" + 'outer:#comment:outer:', + 'innerAgain:#comment:innerAgain:', + 'inner:#comment:innerAgain:' ]); expect(child.length).toBe(1); expect(child.contents().length).toBe(2); @@ -9527,7 +9527,7 @@ describe('$compile', function() { describe('lazy compilation', function() { // See https://github.com/angular/angular.js/issues/7183 - it("should pass transclusion through to template of a 'replace' directive", function() { + it('should pass transclusion through to template of a \'replace\' directive', function() { module(function() { directive('transSync', function() { return { @@ -9556,7 +9556,7 @@ describe('$compile', function() { directive('replaceWithTemplate', function() { return { - templateUrl: "template.html", + templateUrl: 'template.html', replace: true }; }); @@ -10154,7 +10154,7 @@ describe('$compile', function() { it('should not sanitize attributes other than src', inject(function($compile, $rootScope) { element = $compile('')($rootScope); - $rootScope.testUrl = "javascript:doEvilStuff()"; + $rootScope.testUrl = 'javascript:doEvilStuff()'; $rootScope.$apply(); expect(element.attr('title')).toBe('javascript:doEvilStuff()'); @@ -10183,7 +10183,7 @@ describe('$compile', function() { }); inject(function($compile, $rootScope) { element = $compile('')($rootScope); - $rootScope.testUrl = "someUrl"; + $rootScope.testUrl = 'someUrl'; $$sanitizeUri.and.returnValue('someSanitizedUrl'); $rootScope.$apply(); @@ -10234,7 +10234,7 @@ describe('$compile', function() { }); inject(function($compile, $rootScope) { element = $compile('')($rootScope); - $rootScope.testUrl = "someUrl"; + $rootScope.testUrl = 'someUrl'; $$sanitizeUri.and.returnValue('someSanitizedUrl'); $rootScope.$apply(); @@ -10286,7 +10286,7 @@ describe('$compile', function() { it('should not sanitize href on elements other than anchor', inject(function($compile, $rootScope) { element = $compile('
    ')($rootScope); - $rootScope.testUrl = "javascript:doEvilStuff()"; + $rootScope.testUrl = 'javascript:doEvilStuff()'; $rootScope.$apply(); expect(element.attr('href')).toBe('javascript:doEvilStuff()'); @@ -10294,7 +10294,7 @@ describe('$compile', function() { it('should not sanitize attributes other than href', inject(function($compile, $rootScope) { element = $compile('')($rootScope); - $rootScope.testUrl = "javascript:doEvilStuff()"; + $rootScope.testUrl = 'javascript:doEvilStuff()'; $rootScope.$apply(); expect(element.attr('title')).toBe('javascript:doEvilStuff()'); @@ -10323,7 +10323,7 @@ describe('$compile', function() { }); inject(function($compile, $rootScope) { element = $compile('')($rootScope); - $rootScope.testUrl = "someUrl"; + $rootScope.testUrl = 'someUrl'; $$sanitizeUri.and.returnValue('someSanitizedUrl'); $rootScope.$apply(); @@ -10339,7 +10339,7 @@ describe('$compile', function() { }); inject(function($compile, $rootScope) { element = $compile('')($rootScope); - $rootScope.testUrl = "someUrl"; + $rootScope.testUrl = 'someUrl'; $$sanitizeUri.and.returnValue('someSanitizedUrl'); $rootScope.$apply(); @@ -10355,7 +10355,7 @@ describe('$compile', function() { }); inject(function($compile, $rootScope) { element = $compile('')($rootScope); - $rootScope.testUrl = "evilUrl"; + $rootScope.testUrl = 'evilUrl'; $$sanitizeUri.and.returnValue('someSanitizedUrl'); $rootScope.$apply(); @@ -10372,7 +10372,7 @@ describe('$compile', function() { }); inject(function($compile, $rootScope) { element = $compile('')($rootScope); - $rootScope.testUrl = "evilUrl"; + $rootScope.testUrl = 'evilUrl'; $$sanitizeUri.and.returnValue('someSanitizedUrl'); $rootScope.$apply(); @@ -10385,22 +10385,22 @@ describe('$compile', function() { describe('interpolation on HTML DOM event handler attributes onclick, onXYZ, formaction', function() { it('should disallow interpolation on onclick', inject(function($compile, $rootScope) { // All interpolations are disallowed. - $rootScope.onClickJs = ""; + $rootScope.onClickJs = ''; expect(function() { $compile('", - 'a': "", - 'input[text]': "", - 'input[radio]': "", - 'input[checkbox]': "", - 'textarea': "", - 'select': "", - 'details': "
    " + 'button': '', + 'a': '
    ', + 'input[text]': '', + 'input[radio]': '', + 'input[checkbox]': '', + 'textarea': '', + 'select': '', + 'details': '
    ' }, function(html) { compileElement(html); expect(element.attr('tabindex')).toBeUndefined(); diff --git a/test/ngCookies/cookieWriterSpec.js b/test/ngCookies/cookieWriterSpec.js index 4a1419c4f8cf..d43fa8b37f6b 100644 --- a/test/ngCookies/cookieWriterSpec.js +++ b/test/ngCookies/cookieWriterSpec.js @@ -4,16 +4,16 @@ describe('$$cookieWriter', function() { var $$cookieWriter, document; function deleteAllCookies() { - var cookies = document.cookie.split(";"); + var cookies = document.cookie.split(';'); var path = window.location.pathname; for (var i = 0; i < cookies.length; i++) { var cookie = cookies[i]; - var eqPos = cookie.indexOf("="); + var eqPos = cookie.indexOf('='); var name = eqPos > -1 ? cookie.substr(0, eqPos) : cookie; var parts = path.split('/'); while (parts.length) { - document.cookie = name + "=;path=" + (parts.join('/') || '/') + ";expires=Thu, 01 Jan 1970 00:00:00 GMT"; + document.cookie = name + '=;path=' + (parts.join('/') || '/') + ';expires=Thu, 01 Jan 1970 00:00:00 GMT'; parts.pop(); } } @@ -64,7 +64,7 @@ describe('$$cookieWriter', function() { it('should overwrite an existing unsynced cookie', function() { - document.cookie = "cookie=new;path=/"; + document.cookie = 'cookie=new;path=/'; var oldVal = $$cookieWriter('cookie', 'newer'); @@ -76,7 +76,7 @@ describe('$$cookieWriter', function() { $$cookieWriter('cookie1=', 'val;ue'); $$cookieWriter('cookie2=bar;baz', 'val=ue'); - var rawCookies = document.cookie.split("; "); //order is not guaranteed, so we need to parse + var rawCookies = document.cookie.split('; '); //order is not guaranteed, so we need to parse expect(rawCookies.length).toEqual(2); expect(rawCookies).toContain('cookie1%3D=val%3Bue'); expect(rawCookies).toContain('cookie2%3Dbar%3Bbaz=val%3Due'); @@ -97,8 +97,8 @@ describe('$$cookieWriter', function() { $$cookieWriter('x', longVal + 'xxxx'); //total size 4097-4099, a warning should be logged expect($log.warn.logs).toEqual( - [["Cookie 'x' possibly not set or overflowed because it was too large (4097 > 4096 " + - "bytes)!"]]); + [['Cookie \'x\' possibly not set or overflowed because it was too large (4097 > 4096 ' + + 'bytes)!']]); //force browser to dropped a cookie and make sure that the cache is not out of sync $$cookieWriter('x', 'shortVal'); @@ -107,8 +107,8 @@ describe('$$cookieWriter', function() { $$cookieWriter('x', longVal + longVal + longVal); //should be too long for all browsers if (document.cookie !== cookieStr) { - this.fail(new Error("browser didn't drop long cookie when it was expected. make the " + - "cookie in this test longer")); + this.fail(new Error('browser didn\'t drop long cookie when it was expected. make the ' + + 'cookie in this test longer')); } expect(document.cookie).toEqual('x=shortVal'); diff --git a/test/ngCookies/cookiesSpec.js b/test/ngCookies/cookiesSpec.js index 1b36749901d3..38c030443c3f 100644 --- a/test/ngCookies/cookiesSpec.js +++ b/test/ngCookies/cookiesSpec.js @@ -29,7 +29,7 @@ describe('$cookies', function() { it('should delete objects from the store when remove is called', inject(function($cookies) { - $cookies.putObject('gonner', { "I'll":"Be Back"}); + $cookies.putObject('gonner', { 'I\'ll':'Be Back'}); expect($cookies.get('gonner')).toEqual('{"I\'ll":"Be Back"}'); $cookies.remove('gonner'); expect($cookies.get('gonner')).toEqual(undefined); @@ -37,11 +37,11 @@ describe('$cookies', function() { it('should handle empty string value cookies', inject(function($cookies) { - $cookies.putObject("emptyCookie",''); + $cookies.putObject('emptyCookie',''); expect($cookies.get('emptyCookie')).toEqual('""'); - expect($cookies.getObject("emptyCookie")).toEqual(''); + expect($cookies.getObject('emptyCookie')).toEqual(''); mockedCookies['blankCookie'] = ''; - expect($cookies.getObject("blankCookie")).toEqual(''); + expect($cookies.getObject('blankCookie')).toEqual(''); })); diff --git a/test/ngMessageFormat/messageFormatSpec.js b/test/ngMessageFormat/messageFormatSpec.js index 43a6ae477293..4e2405fe4423 100644 --- a/test/ngMessageFormat/messageFormatSpec.js +++ b/test/ngMessageFormat/messageFormatSpec.js @@ -24,10 +24,10 @@ describe('$$ngMessageFormat', function() { this.gender = gender; } - var alice = new Person("Alice", "female"), - bob = new Person("Bob", "male"), - charlie = new Person("Charlie", "male"), - harry = new Person("Harry Potter", "male"); + var alice = new Person('Alice', 'female'), + bob = new Person('Bob', 'male'), + charlie = new Person('Charlie', 'male'), + harry = new Person('Harry Potter', 'male'); function initScope($scope) { $scope.recipients = [alice, bob, charlie]; @@ -55,40 +55,40 @@ describe('$$ngMessageFormat', function() { } it('should suppress falsy objects', function() { - assertMustache("{{undefined}}", ""); - assertMustache("{{null}}", ""); - assertMustache("{{a.b}}", ""); + assertMustache('{{undefined}}', ''); + assertMustache('{{null}}', ''); + assertMustache('{{a.b}}', ''); }); it('should jsonify objects', function() { - assertMustache("{{ {} }}", "{}"); - assertMustache("{{ true }}", "true"); - assertMustache("{{ false }}", "false"); - assertMustache("{{ 1 }}", "1"); - assertMustache("{{ '1' }}", "1"); - assertMustache("{{ sender }}", '{"name":"Harry Potter","gender":"male"}'); + assertMustache('{{ {} }}', '{}'); + assertMustache('{{ true }}', 'true'); + assertMustache('{{ false }}', 'false'); + assertMustache('{{ 1 }}', '1'); + assertMustache('{{ \'1\' }}', '1'); + assertMustache('{{ sender }}', '{"name":"Harry Potter","gender":"male"}'); }); it('should return function that can be called with no context', inject(function($interpolate) { - expect($interpolate("{{sender.name}}")()).toEqual(""); + expect($interpolate('{{sender.name}}')()).toEqual(''); })); describe('watchable', function() { it('ckck', function() { var calls = []; - $rootScope.$watch($interpolate("{{::name}}"), function(val) { + $rootScope.$watch($interpolate('{{::name}}'), function(val) { calls.push(val); }); $rootScope.$apply(); expect(calls.length).toBe(1); - $rootScope.name = "foo"; + $rootScope.name = 'foo'; $rootScope.$apply(); expect(calls.length).toBe(2); expect(calls[1]).toBe('foo'); - $rootScope.name = "bar"; + $rootScope.name = 'bar'; $rootScope.$apply(); expect(calls.length).toBe(2); }); @@ -117,96 +117,96 @@ describe('$$ngMessageFormat', function() { describe('plural', function() { it('no interpolation', function() { - var text = "" + - "{{recipients.length, plural,\n" + - " =0 {You gave no gifts}\n" + - " =1 {You gave one person a gift}\n" + + var text = '' + + '{{recipients.length, plural,\n' + + ' =0 {You gave no gifts}\n' + + ' =1 {You gave one person a gift}\n' + // "=1" should override "one" for exact value. - " one {YOU SHOULD NEVER SEE THIS MESSAGE}\n" + - " other {You gave some people gifts}\n" + - "}}"; + ' one {YOU SHOULD NEVER SEE THIS MESSAGE}\n' + + ' other {You gave some people gifts}\n' + + '}}'; var parsedFn = $interpolate(text, /*mustHaveExpression=*/true); expect(parsedFn.expressions.length).toBe(1); - expect(parsedFn.expressions[0]).toEqual("recipients.length"); + expect(parsedFn.expressions[0]).toEqual('recipients.length'); $rootScope.recipients.length = 2; - expect(parsedFn($rootScope)).toEqual("You gave some people gifts"); + expect(parsedFn($rootScope)).toEqual('You gave some people gifts'); $rootScope.recipients.length = 1; - expect(parsedFn($rootScope)).toEqual("You gave one person a gift"); + expect(parsedFn($rootScope)).toEqual('You gave one person a gift'); $rootScope.recipients.length = 0; - expect(parsedFn($rootScope)).toEqual("You gave no gifts"); + expect(parsedFn($rootScope)).toEqual('You gave no gifts'); }); it('with interpolation', function() { - var text = "" + - "{{recipients.length, plural,\n" + - " =0 {{{sender.name}} gave no gifts}\n" + - " =1 {{{sender.name}} gave one gift to {{recipients[0].name}}}\n" + + var text = '' + + '{{recipients.length, plural,\n' + + ' =0 {{{sender.name}} gave no gifts}\n' + + ' =1 {{{sender.name}} gave one gift to {{recipients[0].name}}}\n' + // "=1" should override "one" for exact value. - " one {YOU SHOULD NEVER SEE THIS MESSAGE}\n" + - " other {{{sender.name}} gave them a gift}\n" + - "}}"; + ' one {YOU SHOULD NEVER SEE THIS MESSAGE}\n' + + ' other {{{sender.name}} gave them a gift}\n' + + '}}'; var parsedFn = $interpolate(text, /*mustHaveExpression=*/true); expect(parsedFn.expressions.length).toBe(1); - expect(parsedFn.expressions[0]).toEqual("recipients.length"); + expect(parsedFn.expressions[0]).toEqual('recipients.length'); $rootScope.recipients.length = 2; - expect(parsedFn($rootScope)).toEqual("Harry Potter gave them a gift"); + expect(parsedFn($rootScope)).toEqual('Harry Potter gave them a gift'); $rootScope.recipients.length = 1; - expect(parsedFn($rootScope)).toEqual("Harry Potter gave one gift to Alice"); + expect(parsedFn($rootScope)).toEqual('Harry Potter gave one gift to Alice'); $rootScope.recipients.length = 0; - expect(parsedFn($rootScope)).toEqual("Harry Potter gave no gifts"); + expect(parsedFn($rootScope)).toEqual('Harry Potter gave no gifts'); }); it('with offset, interpolation, "#" symbol with and without escaping', function() { - var text = "" + - "{{recipients.length, plural, offset:1\n" + + var text = '' + + '{{recipients.length, plural, offset:1\n' + // NOTE: It's nonsensical to use "#" for "=0" with a positive offset. - " =0 {{{sender.name}} gave no gifts (\\#=#)}\n" + - " =1 {{{sender.name}} gave one gift to {{recipients[0].name}} (\\#=#)}\n" + - " one {{{sender.name}} gave {{recipients[0].name}} and one other person a gift (\\#=#)}\n" + - " other {{{sender.name}} gave {{recipients[0].name}} and # other people a gift (\\#=#)}\n" + - "}}"; + ' =0 {{{sender.name}} gave no gifts (\\#=#)}\n' + + ' =1 {{{sender.name}} gave one gift to {{recipients[0].name}} (\\#=#)}\n' + + ' one {{{sender.name}} gave {{recipients[0].name}} and one other person a gift (\\#=#)}\n' + + ' other {{{sender.name}} gave {{recipients[0].name}} and # other people a gift (\\#=#)}\n' + + '}}'; var parsedFn = $interpolate(text, /*mustHaveExpression=*/true); expect(parsedFn.expressions.length).toBe(1); - expect(parsedFn.expressions[0]).toEqual("recipients.length"); + expect(parsedFn.expressions[0]).toEqual('recipients.length'); $rootScope.recipients.length = 3; // "#" should get replaced with the value of "recipients.length - offset" - expect(parsedFn($rootScope)).toEqual("Harry Potter gave Alice and 2 other people a gift (#=2)"); + expect(parsedFn($rootScope)).toEqual('Harry Potter gave Alice and 2 other people a gift (#=2)'); $rootScope.recipients.length = 2; - expect(parsedFn($rootScope)).toEqual("Harry Potter gave Alice and one other person a gift (#=1)"); + expect(parsedFn($rootScope)).toEqual('Harry Potter gave Alice and one other person a gift (#=1)'); $rootScope.recipients.length = 1; - expect(parsedFn($rootScope)).toEqual("Harry Potter gave one gift to Alice (#=0)"); + expect(parsedFn($rootScope)).toEqual('Harry Potter gave one gift to Alice (#=0)'); $rootScope.recipients.length = 0; - expect(parsedFn($rootScope)).toEqual("Harry Potter gave no gifts (#=-1)"); + expect(parsedFn($rootScope)).toEqual('Harry Potter gave no gifts (#=-1)'); }); }); it('nested plural and select', function() { - var text = "" + - "{{recipients.length, plural,\n" + - " =0 {You gave no gifts}\n" + - " =1 {{{recipients[0].gender, select,\n" + - " male {You gave him a gift. -{{sender.name}}}\n" + - " female {You gave her a gift. -{{sender.name}}}\n" + - " other {You gave them a gift. -{{sender.name}}}\n" + - " }}\n" + - " }\n" + - " other {You gave {{recipients.length}} people gifts. -{{sender.name}}}\n" + - "}}"; + var text = '' + + '{{recipients.length, plural,\n' + + ' =0 {You gave no gifts}\n' + + ' =1 {{{recipients[0].gender, select,\n' + + ' male {You gave him a gift. -{{sender.name}}}\n' + + ' female {You gave her a gift. -{{sender.name}}}\n' + + ' other {You gave them a gift. -{{sender.name}}}\n' + + ' }}\n' + + ' }\n' + + ' other {You gave {{recipients.length}} people gifts. -{{sender.name}}}\n' + + '}}'; var parsedFn = $interpolate(text, /*mustHaveExpression=*/true); expect(parsedFn.expressions.length).toBe(1); - expect(parsedFn.expressions[0]).toEqual("recipients.length"); + expect(parsedFn.expressions[0]).toEqual('recipients.length'); var result = parsedFn($rootScope); - expect(result).toEqual("You gave 3 people gifts. -Harry Potter"); + expect(result).toEqual('You gave 3 people gifts. -Harry Potter'); }); }); @@ -217,11 +217,11 @@ describe('$$ngMessageFormat', function() { } it('should interpolate a plain string', function() { - assertInterpolation(" Hello, world! ", " Hello, world! "); + assertInterpolation(' Hello, world! ', ' Hello, world! '); }); it('should interpolate a simple expression', function() { - assertInterpolation("Hello, {{sender.name}}!", "Hello, Harry Potter!"); + assertInterpolation('Hello, {{sender.name}}!', 'Hello, Harry Potter!'); }); }); }); @@ -349,12 +349,12 @@ describe('$$ngMessageFormat', function() { it('should ignore undefined model', inject(function($interpolate) { - expect($interpolate("Hello {{'World'}}{{foo}}")({})).toBe('Hello World'); + expect($interpolate('Hello {{\'World\'}}{{foo}}')({})).toBe('Hello World'); })); it('should interpolate with undefined context', inject(function($interpolate) { - expect($interpolate("Hello, world!{{bloop}}")()).toBe("Hello, world!"); + expect($interpolate('Hello, world!{{bloop}}')()).toBe('Hello, world!'); })); describe('watching', function() { @@ -524,7 +524,7 @@ describe('$$ngMessageFormat', function() { it('should NOT interpolate non-trusted expressions', inject(function($interpolate, $rootScope) { var scope = $rootScope.$new(); - scope.foo = "foo"; + scope.foo = 'foo'; expect(function() { $interpolate('{{foo}}', true, sce.CSS)(scope); @@ -533,7 +533,7 @@ describe('$$ngMessageFormat', function() { it('should NOT interpolate mistyped expressions', inject(function($interpolate, $rootScope) { var scope = $rootScope.$new(); - scope.foo = sce.trustAsCss("foo"); + scope.foo = sce.trustAsCss('foo'); expect(function() { $interpolate('{{foo}}', true, sce.HTML)(scope); @@ -541,12 +541,12 @@ describe('$$ngMessageFormat', function() { })); it('should interpolate trusted expressions in a regular context', inject(function($interpolate) { - var foo = sce.trustAsCss("foo"); + var foo = sce.trustAsCss('foo'); expect($interpolate('{{foo}}', true)({foo: foo})).toBe('foo'); })); it('should interpolate trusted expressions in a specific trustedContext', inject(function($interpolate) { - var foo = sce.trustAsCss("foo"); + var foo = sce.trustAsCss('foo'); expect($interpolate('{{foo}}', true, sce.CSS)({foo: foo})).toBe('foo'); })); @@ -554,15 +554,15 @@ describe('$$ngMessageFormat', function() { // instance, you can construct evil JS code by putting together pieces of JS strings that are by // themselves safe to execute in isolation.) it('should NOT interpolate trusted expressions with multiple parts', inject(function($interpolate) { - var foo = sce.trustAsCss("foo"); - var bar = sce.trustAsCss("bar"); + var foo = sce.trustAsCss('foo'); + var bar = sce.trustAsCss('bar'); expect(function() { return $interpolate('{{foo}}{{bar}}', true, sce.CSS)({foo: foo, bar: bar}); }).toThrowMinErr( - "$interpolate", "noconcat", "Error while interpolating: {{foo}}{{bar}}\n" + - "Strict Contextual Escaping disallows interpolations that concatenate multiple " + - "expressions when a trusted value is required. See " + - "http://docs.angularjs.org/api/ng.$sce"); + '$interpolate', 'noconcat', 'Error while interpolating: {{foo}}{{bar}}\n' + + 'Strict Contextual Escaping disallows interpolations that concatenate multiple ' + + 'expressions when a trusted value is required. See ' + + 'http://docs.angularjs.org/api/ng.$sce'); })); }); @@ -584,50 +584,50 @@ describe('$$ngMessageFormat', function() { describe('parseBindings', function() { it('should Parse Text With No Bindings', inject(function($interpolate) { - expect($interpolate("a").expressions).toEqual([]); + expect($interpolate('a').expressions).toEqual([]); })); it('should Parse Empty Text', inject(function($interpolate) { - expect($interpolate("").expressions).toEqual([]); + expect($interpolate('').expressions).toEqual([]); })); it('should Parse Inner Binding', inject(function($interpolate) { - var interpolateFn = $interpolate("a{{b}}C"), + var interpolateFn = $interpolate('a{{b}}C'), expressions = interpolateFn.expressions; expect(expressions).toEqual(['b']); expect(interpolateFn({b: 123})).toEqual('a123C'); })); it('should Parse Ending Binding', inject(function($interpolate) { - var interpolateFn = $interpolate("a{{b}}"), + var interpolateFn = $interpolate('a{{b}}'), expressions = interpolateFn.expressions; expect(expressions).toEqual(['b']); expect(interpolateFn({b: 123})).toEqual('a123'); })); it('should Parse Begging Binding', inject(function($interpolate) { - var interpolateFn = $interpolate("{{b}}c"), + var interpolateFn = $interpolate('{{b}}c'), expressions = interpolateFn.expressions; expect(expressions).toEqual(['b']); expect(interpolateFn({b: 123})).toEqual('123c'); })); it('should Parse Loan Binding', inject(function($interpolate) { - var interpolateFn = $interpolate("{{b}}"), + var interpolateFn = $interpolate('{{b}}'), expressions = interpolateFn.expressions; expect(expressions).toEqual(['b']); expect(interpolateFn({b: 123})).toEqual('123'); })); it('should Parse Two Bindings', inject(function($interpolate) { - var interpolateFn = $interpolate("{{b}}{{c}}"), + var interpolateFn = $interpolate('{{b}}{{c}}'), expressions = interpolateFn.expressions; expect(expressions).toEqual(['b', 'c']); expect(interpolateFn({b: 111, c: 222})).toEqual('111222'); })); it('should Parse Two Bindings With Text In Middle', inject(function($interpolate) { - var interpolateFn = $interpolate("{{b}}x{{c}}"), + var interpolateFn = $interpolate('{{b}}x{{c}}'), expressions = interpolateFn.expressions; expect(expressions).toEqual(['b', 'c']); expect(interpolateFn({b: 111, c: 222})).toEqual('111x222'); @@ -648,21 +648,21 @@ describe('$$ngMessageFormat', function() { expect(function() { $interpolate('constant/{{var}}', true, isTrustedContext); }).toThrowMinErr( - "$interpolate", "noconcat", "Error while interpolating: constant/{{var}}\nStrict " + - "Contextual Escaping disallows interpolations that concatenate multiple expressions " + - "when a trusted value is required. See http://docs.angularjs.org/api/ng.$sce"); + '$interpolate', 'noconcat', 'Error while interpolating: constant/{{var}}\nStrict ' + + 'Contextual Escaping disallows interpolations that concatenate multiple expressions ' + + 'when a trusted value is required. See http://docs.angularjs.org/api/ng.$sce'); expect(function() { $interpolate('{{var}}/constant', true, isTrustedContext); }).toThrowMinErr( - "$interpolate", "noconcat", "Error while interpolating: {{var}}/constant\nStrict " + - "Contextual Escaping disallows interpolations that concatenate multiple expressions " + - "when a trusted value is required. See http://docs.angularjs.org/api/ng.$sce"); + '$interpolate', 'noconcat', 'Error while interpolating: {{var}}/constant\nStrict ' + + 'Contextual Escaping disallows interpolations that concatenate multiple expressions ' + + 'when a trusted value is required. See http://docs.angularjs.org/api/ng.$sce'); expect(function() { $interpolate('{{foo}}{{bar}}', true, isTrustedContext); }).toThrowMinErr( - "$interpolate", "noconcat", "Error while interpolating: {{foo}}{{bar}}\nStrict " + - "Contextual Escaping disallows interpolations that concatenate multiple expressions " + - "when a trusted value is required. See http://docs.angularjs.org/api/ng.$sce"); + '$interpolate', 'noconcat', 'Error while interpolating: {{foo}}{{bar}}\nStrict ' + + 'Contextual Escaping disallows interpolations that concatenate multiple expressions ' + + 'when a trusted value is required. See http://docs.angularjs.org/api/ng.$sce'); })); it('should interpolate a multi-part expression when isTrustedContext is false', inject(function($interpolate) { diff --git a/test/ngMessages/messagesSpec.js b/test/ngMessages/messagesSpec.js index 5bfbb0898c0d..a12a0ff11da8 100644 --- a/test/ngMessages/messagesSpec.js +++ b/test/ngMessages/messagesSpec.js @@ -342,21 +342,21 @@ describe('ngMessages', function() { }); expect(messageChildren(element).length).toBe(0); - expect(trim(element.text())).toEqual(""); + expect(trim(element.text())).toEqual(''); $rootScope.$apply(function() { $rootScope.col = { hair: true }; }); expect(messageChildren(element).length).toBe(1); - expect(trim(element.text())).toEqual("Your hair is too long"); + expect(trim(element.text())).toEqual('Your hair is too long'); $rootScope.$apply(function() { $rootScope.col = { age: true, hair: true}; }); expect(messageChildren(element).length).toBe(1); - expect(trim(element.text())).toEqual("Your age is incorrect"); + expect(trim(element.text())).toEqual('Your age is incorrect'); $rootScope.$apply(function() { // remove the age! @@ -364,7 +364,7 @@ describe('ngMessages', function() { }); expect(messageChildren(element).length).toBe(1); - expect(trim(element.text())).toEqual("Your hair is too long"); + expect(trim(element.text())).toEqual('Your hair is too long'); $rootScope.$apply(function() { // remove the hair! @@ -373,7 +373,7 @@ describe('ngMessages', function() { }); expect(messageChildren(element).length).toBe(1); - expect(trim(element.text())).toEqual("Enter something"); + expect(trim(element.text())).toEqual('Enter something'); })); @@ -743,7 +743,7 @@ describe('ngMessages', function() { }); expect(messageChildren(element).length).toBe(1); - expect(trim(element.text())).toEqual("A"); + expect(trim(element.text())).toEqual('A'); $rootScope.$apply(function() { $rootScope.data = { @@ -752,7 +752,7 @@ describe('ngMessages', function() { }); expect(messageChildren(element).length).toBe(1); - expect(trim(element.text())).toEqual("C"); + expect(trim(element.text())).toEqual('C'); }); }); @@ -790,13 +790,13 @@ describe('ngMessages', function() { $rootScope.$digest(); expect(messageChildren(element).length).toBe(1); - expect(trim(element.text())).toEqual("Your value is that of failure"); + expect(trim(element.text())).toEqual('Your value is that of failure'); $httpBackend.flush(); $rootScope.$digest(); expect(messageChildren(element).length).toBe(1); - expect(trim(element.text())).toEqual("You did not enter a value"); + expect(trim(element.text())).toEqual('You did not enter a value'); })); it('should allow for overriding the remote template messages within the element depending on where the remote template is placed', @@ -821,7 +821,7 @@ describe('ngMessages', function() { }); expect(messageChildren(element).length).toBe(1); - expect(trim(element.text())).toEqual("AAA"); + expect(trim(element.text())).toEqual('AAA'); $rootScope.$apply(function() { $rootScope.data = { @@ -831,7 +831,7 @@ describe('ngMessages', function() { }); expect(messageChildren(element).length).toBe(1); - expect(trim(element.text())).toEqual("B"); + expect(trim(element.text())).toEqual('B'); $rootScope.$apply(function() { $rootScope.data = { @@ -840,7 +840,7 @@ describe('ngMessages', function() { }); expect(messageChildren(element).length).toBe(1); - expect(trim(element.text())).toEqual("C"); + expect(trim(element.text())).toEqual('C'); })); it('should properly detect a previous message, even if it was registered later', @@ -934,7 +934,7 @@ describe('ngMessages', function() { }); expect(messageChildren(element).length).toBe(2); - expect(s(element.text())).toContain("13"); + expect(s(element.text())).toContain('13'); }); }); @@ -958,14 +958,14 @@ describe('ngMessages', function() { }); expect(messageChildren(element).length).toBe(2); - expect(s(element.text())).toEqual("XZ"); + expect(s(element.text())).toEqual('XZ'); $rootScope.$apply(function() { $rootScope.data.y = {}; }); expect(messageChildren(element).length).toBe(3); - expect(s(element.text())).toEqual("XYZ"); + expect(s(element.text())).toEqual('XYZ'); })); it('should render and override all truthy messages from a remote template', @@ -990,14 +990,14 @@ describe('ngMessages', function() { }); expect(messageChildren(element).length).toBe(2); - expect(s(element.text())).toEqual("ZZZX"); + expect(s(element.text())).toEqual('ZZZX'); $rootScope.$apply(function() { $rootScope.data.y = {}; }); expect(messageChildren(element).length).toBe(3); - expect(s(element.text())).toEqual("YYYZZZX"); + expect(s(element.text())).toEqual('YYYZZZX'); })); }); }); diff --git a/test/ngMock/angular-mocksSpec.js b/test/ngMock/angular-mocksSpec.js index c52c0758fc95..134b282515d1 100644 --- a/test/ngMock/angular-mocksSpec.js +++ b/test/ngMock/angular-mocksSpec.js @@ -172,7 +172,7 @@ describe('ngMock', function() { $log.reset(); })); - it("should skip debugging output if disabled (" + debugEnabled + ")", inject(function($log) { + it('should skip debugging output if disabled (' + debugEnabled + ')', inject(function($log) { $log.log('fake log'); $log.info('fake log'); $log.warn('fake log'); @@ -432,10 +432,10 @@ describe('ngMock', function() { expect($exceptionHandler.errors).toEqual([]); $interval.flush(1000); - expect($exceptionHandler.errors).toEqual(["Test Error"]); + expect($exceptionHandler.errors).toEqual(['Test Error']); $interval.flush(1000); - expect($exceptionHandler.errors).toEqual(["Test Error", "Test Error"]); + expect($exceptionHandler.errors).toEqual(['Test Error', 'Test Error']); })); @@ -626,7 +626,7 @@ describe('ngMock', function() { module(function($exceptionHandlerProvider) { expect(function() { $exceptionHandlerProvider.mode('XXX'); - }).toThrowError("Unknown mode 'XXX', only 'log'/'rethrow' modes are allowed!"); + }).toThrowError('Unknown mode \'XXX\', only \'log\'/\'rethrow\' modes are allowed!'); }); inject(); // Trigger the tests in `module` @@ -1013,28 +1013,28 @@ describe('ngMock', function() { it('should provide "expect" methods for each HTTP verb', function() { - expect(typeof hb.expectGET).toBe("function"); - expect(typeof hb.expectPOST).toBe("function"); - expect(typeof hb.expectPUT).toBe("function"); - expect(typeof hb.expectPATCH).toBe("function"); - expect(typeof hb.expectDELETE).toBe("function"); - expect(typeof hb.expectHEAD).toBe("function"); + expect(typeof hb.expectGET).toBe('function'); + expect(typeof hb.expectPOST).toBe('function'); + expect(typeof hb.expectPUT).toBe('function'); + expect(typeof hb.expectPATCH).toBe('function'); + expect(typeof hb.expectDELETE).toBe('function'); + expect(typeof hb.expectHEAD).toBe('function'); }); it('should provide "when" methods for each HTTP verb', function() { - expect(typeof hb.whenGET).toBe("function"); - expect(typeof hb.whenPOST).toBe("function"); - expect(typeof hb.whenPUT).toBe("function"); - expect(typeof hb.whenPATCH).toBe("function"); - expect(typeof hb.whenDELETE).toBe("function"); - expect(typeof hb.whenHEAD).toBe("function"); + expect(typeof hb.whenGET).toBe('function'); + expect(typeof hb.whenPOST).toBe('function'); + expect(typeof hb.whenPUT).toBe('function'); + expect(typeof hb.whenPATCH).toBe('function'); + expect(typeof hb.whenDELETE).toBe('function'); + expect(typeof hb.whenHEAD).toBe('function'); }); it('should provide "route" shortcuts for expect and when', function() { - expect(typeof hb.whenRoute).toBe("function"); - expect(typeof hb.expectRoute).toBe("function"); + expect(typeof hb.whenRoute).toBe('function'); + expect(typeof hb.expectRoute).toBe('function'); }); @@ -1342,7 +1342,7 @@ describe('ngMock', function() { it('should decode query parameters in respond() function', function() { hb.expect('GET', '/url?query=l%E2%80%A2ng%20string%20w%2F%20spec%5Eal%20char%24&id=1234&orderBy=-name') .respond(function(m, u, d, h, p) { - return [200, "id=" + p.id + ";orderBy=" + p.orderBy + ";query=" + p.query]; + return [200, 'id=' + p.id + ';orderBy=' + p.orderBy + ';query=' + p.query]; }); hb('GET', '/url?query=l%E2%80%A2ng%20string%20w%2F%20spec%5Eal%20char%24&id=1234&orderBy=-name', null, callback); @@ -1354,7 +1354,7 @@ describe('ngMock', function() { it('should include regex captures in respond() params when keys provided', function() { hb.expect('GET', /\/(.+)\/article\/(.+)/, undefined, undefined, ['id', 'name']) .respond(function(m, u, d, h, p) { - return [200, "id=" + p.id + ";name=" + p.name]; + return [200, 'id=' + p.id + ';name=' + p.name]; }); hb('GET', '/1234/article/cool-angular-article', null, callback); @@ -1491,7 +1491,7 @@ describe('ngMock', function() { }); - it("should use when's respond() when no expect() respond is defined", function() { + it('should use when\'s respond() when no expect() respond is defined', function() { callback.and.callFake(function(status, response) { expect(status).toBe(201); expect(response).toBe('data'); @@ -1848,7 +1848,7 @@ describe('ngMock', function() { expect(exp.matchData({})).toBe(false); expect(exp.match('POST', '/url', '{"id": "xxx", "status": "N"}')).toBe(true); - expect(exp.match('POST', '/url', {"id": "xxx", "status": "N"})).toBe(true); + expect(exp.match('POST', '/url', {'id': 'xxx', 'status': 'N'})).toBe(true); }); @@ -2856,42 +2856,42 @@ describe('sharedInjector', function() { // we use the 'module' and 'inject' globals from ngMock - it("allowes me to mutate a single instace of a module (proving it has been shared)", ngMockTest(function() { - sdescribe("test state is shared", function() { - angular.module("sharedInjectorTestModuleA", []) - .factory("testService", function() { + it('allowes me to mutate a single instace of a module (proving it has been shared)', ngMockTest(function() { + sdescribe('test state is shared', function() { + angular.module('sharedInjectorTestModuleA', []) + .factory('testService', function() { return { state: 0 }; }); module.sharedInjector(); - sbeforeAll(module("sharedInjectorTestModuleA")); + sbeforeAll(module('sharedInjectorTestModuleA')); - sit("access and mutate", inject(function(testService) { + sit('access and mutate', inject(function(testService) { testService.state += 1; })); - sit("expect mutation to have persisted", inject(function(testService) { + sit('expect mutation to have persisted', inject(function(testService) { expect(testService.state).toEqual(1); })); }); })); - it("works with standard beforeEach", ngMockTest(function() { - sdescribe("test state is not shared", function() { - angular.module("sharedInjectorTestModuleC", []) - .factory("testService", function() { + it('works with standard beforeEach', ngMockTest(function() { + sdescribe('test state is not shared', function() { + angular.module('sharedInjectorTestModuleC', []) + .factory('testService', function() { return { state: 0 }; }); - sbeforeEach(module("sharedInjectorTestModuleC")); + sbeforeEach(module('sharedInjectorTestModuleC')); - sit("access and mutate", inject(function(testService) { + sit('access and mutate', inject(function(testService) { testService.state += 1; })); - sit("expect mutation not to have persisted", inject(function(testService) { + sit('expect mutation not to have persisted', inject(function(testService) { expect(testService.state).toEqual(0); })); }); @@ -2899,70 +2899,70 @@ describe('sharedInjector', function() { it('allows me to stub with shared injector', ngMockTest(function() { - sdescribe("test state is shared", function() { - angular.module("sharedInjectorTestModuleD", []) - .value("testService", 43); + sdescribe('test state is shared', function() { + angular.module('sharedInjectorTestModuleD', []) + .value('testService', 43); module.sharedInjector(); - sbeforeAll(module("sharedInjectorTestModuleD", function($provide) { - $provide.value("testService", 42); + sbeforeAll(module('sharedInjectorTestModuleD', function($provide) { + $provide.value('testService', 42); })); - sit("expected access stubbed value", inject(function(testService) { + sit('expected access stubbed value', inject(function(testService) { expect(testService).toEqual(42); })); }); })); - it("doesn't interfere with other test describes", ngMockTest(function() { - angular.module("sharedInjectorTestModuleE", []) - .factory("testService", function() { + it('doesn\'t interfere with other test describes', ngMockTest(function() { + angular.module('sharedInjectorTestModuleE', []) + .factory('testService', function() { return { state: 0 }; }); - sdescribe("with stubbed injector", function() { + sdescribe('with stubbed injector', function() { module.sharedInjector(); - sbeforeAll(module("sharedInjectorTestModuleE")); + sbeforeAll(module('sharedInjectorTestModuleE')); - sit("access and mutate", inject(function(testService) { + sit('access and mutate', inject(function(testService) { expect(testService.state).toEqual(0); testService.state += 1; })); - sit("expect mutation to have persisted", inject(function(testService) { + sit('expect mutation to have persisted', inject(function(testService) { expect(testService.state).toEqual(1); })); }); - sdescribe("without stubbed injector", function() { - sbeforeEach(module("sharedInjectorTestModuleE")); + sdescribe('without stubbed injector', function() { + sbeforeEach(module('sharedInjectorTestModuleE')); - sit("access and mutate", inject(function(testService) { + sit('access and mutate', inject(function(testService) { expect(testService.state).toEqual(0); testService.state += 1; })); - sit("expect original, unmutated value", inject(function(testService) { + sit('expect original, unmutated value', inject(function(testService) { expect(testService.state).toEqual(0); })); }); })); - it("prevents nested use of sharedInjector()", function() { + it('prevents nested use of sharedInjector()', function() { var test = ngMockTest(function() { - sdescribe("outer", function() { + sdescribe('outer', function() { module.sharedInjector(); - sdescribe("inner", function() { + sdescribe('inner', function() { module.sharedInjector(); - sit("should not get here", function() { - throw Error("should have thrown before here!"); + sit('should not get here', function() { + throw Error('should have thrown before here!'); }); }); @@ -2986,9 +2986,9 @@ describe('sharedInjector', function() { if (re.test(e.message)) { return; } - throw Error("thrown error '" + e.message + "' did not match:" + re); + throw Error('thrown error \'' + e.message + '\' did not match:' + re); } - throw Error("should have thrown error"); + throw Error('should have thrown error'); } // run a set of test cases in the sdescribe stub test framework @@ -3002,7 +3002,7 @@ describe('sharedInjector', function() { module.$$beforeAllHook = sbeforeAll; module.$$afterAllHook = safterAll; - sdescribe.root = sdescribe("root", function() {}); + sdescribe.root = sdescribe('root', function() {}); sdescribe.root.beforeEach.push(module.$$beforeEach); sdescribe.root.afterEach.push(module.$$afterEach); @@ -3045,21 +3045,21 @@ describe('sharedInjector', function() { self.run = function() { var spec = {}; - self.hooks("beforeAll", spec); + self.hooks('beforeAll', spec); self.tests.forEach(function(test) { - if (self.parent) self.parent.hooks("beforeEach", spec); - self.hooks("beforeEach", spec); + if (self.parent) self.parent.hooks('beforeEach', spec); + self.hooks('beforeEach', spec); test.run.call(spec); - self.hooks("afterEach", spec); - if (self.parent) self.parent.hooks("afterEach", spec); + self.hooks('afterEach', spec); + if (self.parent) self.parent.hooks('afterEach', spec); }); self.describes.forEach(function(d) { d.run(); }); - self.hooks("afterAll", spec); + self.hooks('afterAll', spec); }; self.hooks = function(hook, spec) { @@ -3076,7 +3076,7 @@ describe('sharedInjector', function() { } function sit(name, fn) { - if (typeof fn !== "function") throw Error("not fn", fn); + if (typeof fn !== 'function') throw Error('not fn', fn); sdescribe.current.tests.push({ name: name, run: fn @@ -3084,22 +3084,22 @@ describe('sharedInjector', function() { } function sbeforeAll(fn) { - if (typeof fn !== "function") throw Error("not fn", fn); + if (typeof fn !== 'function') throw Error('not fn', fn); sdescribe.current.beforeAll.push(fn); } function safterAll(fn) { - if (typeof fn !== "function") throw Error("not fn", fn); + if (typeof fn !== 'function') throw Error('not fn', fn); sdescribe.current.afterAll.push(fn); } function sbeforeEach(fn) { - if (typeof fn !== "function") throw Error("not fn", fn); + if (typeof fn !== 'function') throw Error('not fn', fn); sdescribe.current.beforeEach.push(fn); } function safterEach(fn) { - if (typeof fn !== "function") throw Error("not fn", fn); + if (typeof fn !== 'function') throw Error('not fn', fn); sdescribe.current.afterEach.push(fn); } }); diff --git a/test/ngResource/resourceSpec.js b/test/ngResource/resourceSpec.js index 40e9df6b5695..7a142a43f7b2 100644 --- a/test/ngResource/resourceSpec.js +++ b/test/ngResource/resourceSpec.js @@ -1,8 +1,8 @@ 'use strict'; -describe("resource", function() { +describe('resource', function() { -describe("basic usage", function() { +describe('basic usage', function() { var $resource, CreditCard, callback, $httpBackend, resourceProvider; beforeEach(module('ngResource')); @@ -98,7 +98,7 @@ describe("basic usage", function() { }); - it("should build resource", function() { + it('should build resource', function() { expect(typeof CreditCard).toBe('function'); expect(typeof CreditCard.get).toBe('function'); expect(typeof CreditCard.save).toBe('function'); @@ -140,14 +140,14 @@ describe("basic usage", function() { it('should omit properties from prototype chain', function() { var original, clone = {}; function Func() {} - Func.prototype.hello = "world"; + Func.prototype.hello = 'world'; original = new Func(); - original.goodbye = "world"; + original.goodbye = 'world'; expect(shallowClearAndCopy(original, clone)).toBe(clone); expect(clone.hello).toBeUndefined(); - expect(clone.goodbye).toBe("world"); + expect(clone.goodbye).toBe('world'); }); }); @@ -403,7 +403,7 @@ describe("basic usage", function() { }); - it("should build resource with action default param overriding default param", function() { + it('should build resource with action default param overriding default param', function() { $httpBackend.expect('GET', '/Customer/123').respond({id: 'abc'}); var TypeItem = $resource('/:type/:typeId', {type: 'Order'}, {get: {method: 'GET', params: {type: 'Customer'}}}); @@ -448,11 +448,11 @@ describe("basic usage", function() { it('should throw an exception if a param is called "hasOwnProperty"', function() { expect(function() { $resource('/:hasOwnProperty').get(); - }).toThrowMinErr('$resource','badname', "hasOwnProperty is not a valid parameter name"); + }).toThrowMinErr('$resource','badname', 'hasOwnProperty is not a valid parameter name'); }); - it("should create resource", function() { + it('should create resource', function() { $httpBackend.expect('POST', '/CreditCard', '{"name":"misko"}').respond({id: 123, name: 'misko'}); var cc = CreditCard.save({name: 'misko'}, callback); @@ -467,7 +467,7 @@ describe("basic usage", function() { }); - it("should read resource", function() { + it('should read resource', function() { $httpBackend.expect('GET', '/CreditCard/123').respond({id: 123, number: '9876'}); var cc = CreditCard.get({id: 123}, callback); @@ -484,14 +484,14 @@ describe("basic usage", function() { it('should send correct headers', function() { $httpBackend.expectPUT('/CreditCard/123', undefined, function(headers) { - return headers['If-None-Match'] === "*"; + return headers['If-None-Match'] === '*'; }).respond({id:123}); CreditCard.conditionalPut({id: {key:123}}); }); - it("should read partial resource", function() { + it('should read partial resource', function() { $httpBackend.expect('GET', '/CreditCard').respond([{id:{key:123}}]); var ccs = CreditCard.query(); @@ -511,7 +511,7 @@ describe("basic usage", function() { }); - it("should update resource", function() { + it('should update resource', function() { $httpBackend.expect('POST', '/CreditCard/123', '{"id":{"key":123},"name":"misko"}'). respond({id: {key: 123}, name: 'rama'}); @@ -522,7 +522,7 @@ describe("basic usage", function() { }); - it("should query resource", function() { + it('should query resource', function() { $httpBackend.expect('GET', '/CreditCard?key=value').respond([{id: 1}, {id: 2}]); var ccs = CreditCard.query({key: 'value'}, callback); @@ -536,7 +536,7 @@ describe("basic usage", function() { }); - it("should have all arguments optional", function() { + it('should have all arguments optional', function() { $httpBackend.expect('GET', '/CreditCard').respond([{id:1}]); var log = ''; @@ -583,7 +583,7 @@ describe("basic usage", function() { }); - it("should patch a resource", function() { + it('should patch a resource', function() { $httpBackend.expectPATCH('/CreditCard/123', '{"name":"igor"}'). respond({id: 123, name: 'rama'}); @@ -1228,10 +1228,10 @@ describe("basic usage", function() { }); it('should not convert string literals in array into Resource objects', function() { - $httpBackend.expect('GET', '/names.json').respond(["mary", "jane"]); + $httpBackend.expect('GET', '/names.json').respond(['mary', 'jane']); var strings = $resource('/names.json').query(); $httpBackend.flush(); - expect(strings).toEqualData(["mary", "jane"]); + expect(strings).toEqualData(['mary', 'jane']); }); it('should not convert number literals in array into Resource objects', function() { @@ -1288,7 +1288,7 @@ describe("basic usage", function() { }); }); - describe("save", function() { + describe('save', function() { it('should append the suffix', function() { $httpBackend.expect('POST', '/users.json', '{"name":"user1"}').respond({id: 123, name: 'user1'}); var UserService = $resource('/users/:user_id.json', {user_id: '@id'}); diff --git a/test/ngRoute/directive/ngViewSpec.js b/test/ngRoute/directive/ngViewSpec.js index 37ce71d33071..d201ff331dac 100644 --- a/test/ngRoute/directive/ngViewSpec.js +++ b/test/ngRoute/directive/ngViewSpec.js @@ -633,7 +633,7 @@ describe('ngView', function() { }); }); - it("should compile its content correctly (although we remove it later)", function() { + it('should compile its content correctly (although we remove it later)', function() { var testElement; module(function($compileProvider, $routeProvider) { $routeProvider.when('/view', {template: ' '}); diff --git a/test/ngRoute/routeSpec.js b/test/ngRoute/routeSpec.js index 5a0780f5efbf..dd325e10e580 100644 --- a/test/ngRoute/routeSpec.js +++ b/test/ngRoute/routeSpec.js @@ -403,7 +403,7 @@ describe('$route', function() { expect($route.current).toBeDefined(); })); - it("should use route params inherited from prototype chain", function() { + it('should use route params inherited from prototype chain', function() { function BaseRoute() {} BaseRoute.prototype.templateUrl = 'foo.html'; @@ -882,7 +882,7 @@ describe('$route', function() { $rootScope.$digest(); $httpBackend.flush(); - expect($exceptionHandler.errors.pop().message).toContain("[$compile:tpload] Failed to load template: r1.html"); + expect($exceptionHandler.errors.pop().message).toContain('[$compile:tpload] Failed to load template: r1.html'); $httpBackend.expectGET('r2.html').respond(''); $location.path('/r2'); diff --git a/test/ngSanitize/filter/linkySpec.js b/test/ngSanitize/filter/linkySpec.js index eee62d237ee8..4599c1ee48ab 100644 --- a/test/ngSanitize/filter/linkySpec.js +++ b/test/ngSanitize/filter/linkySpec.js @@ -10,7 +10,7 @@ describe('linky', function() { })); it('should do basic filter', function() { - expect(linky("http://ab/%20(http://a/)%20%3Chttp://a/%3E%20http://1.2/v:~-123.%20c%20%E2%80%9Chttp://example.com%E2%80%9D%20%E2%80%98http://me.com%E2%80%99")). + expect(linky('http://ab/%20(http://a/)%20%3Chttp://a/%3E%20http://1.2/v:~-123.%20c%20%E2%80%9Chttp://example.com%E2%80%9D%20%E2%80%98http://me.com%E2%80%99')). toEqual('
    http://ab/ ' + '(http://a/) ' + '<http://a/> ' + @@ -65,13 +65,13 @@ describe('linky', function() { }); it('should handle mailto:', function() { - expect(linky("mailto:me@example.com")). + expect(linky('mailto:me@example.com')). toEqual('me@example.com'); - expect(linky("me@example.com")). + expect(linky('me@example.com')). toEqual('me@example.com'); - expect(linky("send email to me@example.com, but")). + expect(linky('send email to me@example.com, but')). toEqual('send email to me@example.com, but'); - expect(linky("my email is \"me@example.com\"")). + expect(linky('my email is "me@example.com"')). toEqual('my email is "me@example.com"'); }); @@ -80,10 +80,10 @@ describe('linky', function() { }); it('should handle target:', function() { - expect(linky("http://example.com/", "_blank")). + expect(linky('http://example.com/', '_blank')). toBeOneOf('http://example.com', 'http://example.com'); - expect(linky("http://example.com/", "someNamedIFrame")). + expect(linky('http://example.com/', 'someNamedIFrame')). toBeOneOf('http://example.com', 'http://example.com'); }); @@ -91,21 +91,21 @@ describe('linky', function() { describe('custom attributes', function() { it('should optionally add custom attributes', function() { - expect(linky("http://example.com/", "_self", {rel: "nofollow"})). + expect(linky('http://example.com/', '_self', {rel: 'nofollow'})). toBeOneOf('http://example.com', 'http://example.com'); }); it('should override target parameter with custom attributes', function() { - expect(linky("http://example.com/", "_self", {target: "_blank"})). + expect(linky('http://example.com/', '_self', {target: '_blank'})). toBeOneOf('http://example.com', 'http://example.com'); }); it('should optionally add custom attributes from function', function() { - expect(linky("http://example.com/", "_self", function(url) {return {"class": "blue"};})). + expect(linky('http://example.com/', '_self', function(url) {return {'class': 'blue'};})). toBeOneOf('http://example.com', 'http://example.com', 'http://example.com'); @@ -113,21 +113,21 @@ describe('linky', function() { it('should pass url as parameter to custom attribute function', function() { - var linkParameters = jasmine.createSpy('linkParameters').and.returnValue({"class": "blue"}); - linky("http://example.com/", "_self", linkParameters); + var linkParameters = jasmine.createSpy('linkParameters').and.returnValue({'class': 'blue'}); + linky('http://example.com/', '_self', linkParameters); expect(linkParameters).toHaveBeenCalledWith('http://example.com/'); }); it('should call the attribute function for all links in the input', function() { var attributeFn = jasmine.createSpy('attributeFn').and.returnValue({}); - linky("http://example.com and http://google.com", "_self", attributeFn); + linky('http://example.com and http://google.com', '_self', attributeFn); expect(attributeFn.calls.allArgs()).toEqual([['http://example.com/'], ['http://google.com/']]); }); it('should strip unsafe attributes', function() { - expect(linky("http://example.com/", "_self", {"class": "blue", "onclick": "alert('Hi')"})). + expect(linky('http://example.com/', '_self', {'class': 'blue', 'onclick': 'alert(\'Hi\')'})). toBeOneOf('http://example.com', 'http://example.com', 'http://example.com'); diff --git a/test/ngSanitize/sanitizeSpec.js b/test/ngSanitize/sanitizeSpec.js index 5794d06e17a8..3c6e63829ec9 100644 --- a/test/ngSanitize/sanitizeSpec.js +++ b/test/ngSanitize/sanitizeSpec.js @@ -22,7 +22,7 @@ describe('HTML', function() { var handler, start, text, comment; beforeEach(function() { - text = ""; + text = ''; start = null; handler = { start: function(tag, attrs) { @@ -347,7 +347,7 @@ describe('HTML', function() { }); it('should ignore unknown attributes', function() { - writer.start('div', {unknown:""}); + writer.start('div', {unknown:''}); expect(html).toEqual('
    '); }); diff --git a/test/ngScenario/ApplicationSpec.js b/test/ngScenario/ApplicationSpec.js index a6343cea424a..176f5b0a8ce0 100644 --- a/test/ngScenario/ApplicationSpec.js +++ b/test/ngScenario/ApplicationSpec.js @@ -10,7 +10,7 @@ describe('angular.scenario.Application', function() { beforeEach(function() { window.document.body.innerHTML = ''; - frames = _jQuery("
    "); + frames = _jQuery('
    '); _jQuery(window.document.body).append(frames); app = new angular.scenario.Application(frames); }); @@ -134,7 +134,7 @@ describe('angular.scenario.Application', function() { var injectorGet = $injector.get; spyOn($injector, 'get').and.callFake(function(name) { switch (name) { - case "$rootElement": return jqLite(testWindow.document); + case '$rootElement': return jqLite(testWindow.document); default: return injectorGet(name); } }); @@ -164,7 +164,7 @@ describe('angular.scenario.Application', function() { var injectorGet = $injector.get; var injectorSpy = spyOn($injector, 'get').and.callFake(function(name) { switch (name) { - case "$rootElement": return jqLite(testWindow.document); + case '$rootElement': return jqLite(testWindow.document); default: return injectorGet(name); } }); @@ -183,7 +183,7 @@ describe('angular.scenario.Application', function() { testWindow.angular.resumeDeferredBootstrap(); expect(app.rootElement).toBe(testWindow.document); expect(resumeBootstrapSpy).toHaveBeenCalled(); - expect(injectorSpy).toHaveBeenCalledWith("$rootElement"); + expect(injectorSpy).toHaveBeenCalledWith('$rootElement'); dealoc(testWindow.document); })); diff --git a/test/ngScenario/RunnerSpec.js b/test/ngScenario/RunnerSpec.js index 9f62504409b1..3de151a55d27 100644 --- a/test/ngScenario/RunnerSpec.js +++ b/test/ngScenario/RunnerSpec.js @@ -103,7 +103,7 @@ describe('angular.scenario.Runner', function() { $window.describe('describe', function() { $window.it('1', function() { var scope = $window.dslScope(); - scope.test = "foo"; + scope.test = 'foo'; expect($window.dslScope().test).toBeUndefined(); }); $window.it('2', function() { diff --git a/test/ngScenario/ScenarioSpec.js b/test/ngScenario/ScenarioSpec.js index a8e5280b5784..d3451a2ba327 100644 --- a/test/ngScenario/ScenarioSpec.js +++ b/test/ngScenario/ScenarioSpec.js @@ -1,6 +1,6 @@ 'use strict'; -describe("ScenarioSpec: Compilation", function() { +describe('ScenarioSpec: Compilation', function() { var element; afterEach(function() { @@ -9,7 +9,7 @@ describe("ScenarioSpec: Compilation", function() { describe('compilation', function() { - it("should compile dom node and return scope", inject(function($rootScope, $compile) { + it('should compile dom node and return scope', inject(function($rootScope, $compile) { var node = jqLite('
    {{b=a+1}}
    ')[0]; element = $compile(node)($rootScope); $rootScope.$digest(); @@ -17,13 +17,13 @@ describe("ScenarioSpec: Compilation", function() { expect($rootScope.b).toEqual(2); })); - it("should compile jQuery node and return scope", inject(function($rootScope, $compile) { + it('should compile jQuery node and return scope', inject(function($rootScope, $compile) { element = $compile(jqLite('
    {{a=123}}
    '))($rootScope); $rootScope.$digest(); expect(jqLite(element).text()).toEqual('123'); })); - it("should compile text node and return scope", inject(function($rootScope, $compile) { + it('should compile text node and return scope', inject(function($rootScope, $compile) { element = $compile('
    {{a=123}}
    ')($rootScope); $rootScope.$digest(); expect(jqLite(element).text()).toEqual('123'); diff --git a/test/ngScenario/dslSpec.js b/test/ngScenario/dslSpec.js index 700270af8574..a34d59d20d8d 100644 --- a/test/ngScenario/dslSpec.js +++ b/test/ngScenario/dslSpec.js @@ -1,6 +1,6 @@ 'use strict'; -describe("angular.scenario.dsl", function() { +describe('angular.scenario.dsl', function() { var element; var $window, $root; var eventLog; @@ -765,7 +765,7 @@ describe("angular.scenario.dsl", function() { it('should return value in text input', function() { doc.append(''); $root.dsl.input('test.input').val(); - expect($root.futureResult).toEqual("something"); + expect($root.futureResult).toEqual('something'); }); }); }); diff --git a/test/ngScenario/e2e/widgets-scenario.js b/test/ngScenario/e2e/widgets-scenario.js index 3d7a3e383645..40b176d1b30a 100644 --- a/test/ngScenario/e2e/widgets-scenario.js +++ b/test/ngScenario/e2e/widgets-scenario.js @@ -32,18 +32,18 @@ describe('widgets', function() { expect(binding('button').fromJson()).toEqual({'count': 0}); expect(binding('form').fromJson()).toEqual({'count': 0}); - element('form a', "'action' link").click(); + element('form a', '\'action\' link').click(); expect(binding('button').fromJson()).toEqual({'count': 1}); - element('input[value="submit input"]', "'submit input' button").click(); + element('input[value="submit input"]', '\'submit input\' button').click(); expect(binding('button').fromJson()).toEqual({'count': 2}); expect(binding('form').fromJson()).toEqual({'count': 1}); - element('button:contains("submit button")', "'submit button' button").click(); + element('button:contains("submit button")', '\'submit button\' button').click(); expect(binding('button').fromJson()).toEqual({'count': 2}); expect(binding('form').fromJson()).toEqual({'count': 2}); - element('input[value="button"]', "'button' button").click(); + element('input[value="button"]', '\'button\' button').click(); expect(binding('button').fromJson()).toEqual({'count': 3}); element('input[type="image"]', 'form image').click(); diff --git a/test/ngScenario/matchersSpec.js b/test/ngScenario/matchersSpec.js index d8a62a02d4bd..7b68d2b9b731 100644 --- a/test/ngScenario/matchersSpec.js +++ b/test/ngScenario/matchersSpec.js @@ -34,7 +34,7 @@ describe('angular.scenario.matchers', function() { expectMatcher(10, function() { matchers.toEqual(10); }); expectMatcher('value', function() { matchers.toBeDefined(); }); expectMatcher([1], function() { matchers.toBeTruthy(); }); - expectMatcher("", function() { matchers.toBeFalsy(); }); + expectMatcher('', function() { matchers.toBeFalsy(); }); expectMatcher(0, function() { matchers.toBeFalsy(); }); expectMatcher('foo', function() { matchers.toMatch('.o.'); }); expectMatcher(null, function() { matchers.toBeNull(); }); diff --git a/test/ngScenario/output/HtmlSpec.js b/test/ngScenario/output/HtmlSpec.js index 295fa45eaa54..541d4d4afadf 100644 --- a/test/ngScenario/output/HtmlSpec.js +++ b/test/ngScenario/output/HtmlSpec.js @@ -24,7 +24,7 @@ describe('angular.scenario.output.html', function() { }; runner = new angular.scenario.testing.MockRunner(); model = new angular.scenario.ObjectModel(runner); - context = _jQuery("
    "); + context = _jQuery('
    '); ui = angular.scenario.output.html(context, runner, model); }); diff --git a/validate-commit-msg.spec.js b/validate-commit-msg.spec.js index a00102174b5b..5a8ab1dc409e 100644 --- a/validate-commit-msg.spec.js +++ b/validate-commit-msg.spec.js @@ -44,7 +44,7 @@ describe('validate-commit-msg.js', function() { it('should validate 100 characters length', function() { - var msg = "fix($compile): something super mega extra giga tera long, maybe even longer and longer and longer... "; + var msg = 'fix($compile): something super mega extra giga tera long, maybe even longer and longer and longer... '; expect(m.validateMessage(msg)).toBe(INVALID); expect(errors).toEqual(['INVALID COMMIT MSG: is longer than 100 characters !']); From 859348c7f61ff5f93b9f81eb7f46842bd018d8e3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Go=C5=82e=CC=A8biowski?= Date: Thu, 11 Aug 2016 01:16:40 +0200 Subject: [PATCH 0113/1173] chore(*): change remaining `/* @this */` to `/** @this */` Ref ec565ddd9c536aa7f7441e89f03ea08e23de1a42 --- benchmarks/largetable-bp/app.js | 4 ++-- compare-master-to-stable.js | 2 +- docs/app/assets/js/search-worker.js | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/benchmarks/largetable-bp/app.js b/benchmarks/largetable-bp/app.js index 9cf977ebb707..ebd161ccaacd 100644 --- a/benchmarks/largetable-bp/app.js +++ b/benchmarks/largetable-bp/app.js @@ -23,9 +23,9 @@ app.controller('DataController', function DataController($scope, $rootScope) { $scope.numberOfBindings = totalRows * totalColumns * 2 + totalRows + 1; $scope.numberOfWatches = '?'; - /* @this */ + /** @this */ function iGetter() { return this.i; } - /* @this */ + /** @this */ function jGetter() { return this.j; } for (var i = 0; i < totalRows; i++) { diff --git a/compare-master-to-stable.js b/compare-master-to-stable.js index ab41b255f70d..fe80d2d6f931 100755 --- a/compare-master-to-stable.js +++ b/compare-master-to-stable.js @@ -21,7 +21,7 @@ var exec = function(cmd) { }; var andThen = function(fn, after) { - return /* @this */ function() { + return /** @this */ function() { return fn.apply(this, arguments).then(after); }; }; diff --git a/docs/app/assets/js/search-worker.js b/docs/app/assets/js/search-worker.js index 1292b3e1d380..0376c556d02e 100644 --- a/docs/app/assets/js/search-worker.js +++ b/docs/app/assets/js/search-worker.js @@ -8,7 +8,7 @@ importScripts('../components/lunr.js-0.5.12/lunr.min.js'); // Create the lunr index - the docs should be an array of object, each object containing // the path and search terms for a page -var index = lunr(/* @this */function() { +var index = lunr(/** @this */function() { this.ref('path'); this.field('titleWords', {boost: 50}); this.field('members', {boost: 40}); From 6304cde2fc7319e01a47d4ef8603bfbb886ff2aa Mon Sep 17 00:00:00 2001 From: Georgios Kalpakas Date: Fri, 12 Aug 2016 02:25:48 +0300 Subject: [PATCH 0114/1173] chore(build): fix version placeholder matching During the `build` task, the version placeholders will be replaced with the actual values using a RegExp, which expects the placeholders to be surrounded by double quotes. By replacing the quotes from double to single in #15011, the RegExp was not able to match the placeholders. (For reference, the RegExps that match and replace the version placeholders are in [lib/grunt/utils.js][1].) [1]: https://github.com/angular/angular.js/blob/859348c7f61ff5f93b9f81eb7f46842bd018d8e3/lib/grunt/utils.js#L125-L130 Closes #15016 --- lib/grunt/utils.js | 12 +++--- src/AngularPublic.js | 6 ++- test/e2e/fixtures/version/index.html | 6 +++ test/e2e/tests/version.spec.js | 57 ++++++++++++++++++++++++++++ 4 files changed, 73 insertions(+), 8 deletions(-) create mode 100644 test/e2e/fixtures/version/index.html create mode 100644 test/e2e/tests/version.spec.js diff --git a/lib/grunt/utils.js b/lib/grunt/utils.js index 60980d7e508f..9837478b7c55 100644 --- a/lib/grunt/utils.js +++ b/lib/grunt/utils.js @@ -122,12 +122,12 @@ module.exports = { process: function(src, NG_VERSION, strict) { var processed = src - .replace(/"NG_VERSION_FULL"/g, NG_VERSION.full) - .replace(/"NG_VERSION_MAJOR"/, NG_VERSION.major) - .replace(/"NG_VERSION_MINOR"/, NG_VERSION.minor) - .replace(/"NG_VERSION_DOT"/, NG_VERSION.patch) - .replace(/"NG_VERSION_CDN"/, NG_VERSION.cdn) - .replace(/"NG_VERSION_CODENAME"/, NG_VERSION.codeName); + .replace(/(['"])NG_VERSION_FULL\1/g, NG_VERSION.full) + .replace(/(['"])NG_VERSION_MAJOR\1/, NG_VERSION.major) + .replace(/(['"])NG_VERSION_MINOR\1/, NG_VERSION.minor) + .replace(/(['"])NG_VERSION_DOT\1/, NG_VERSION.patch) + .replace(/(['"])NG_VERSION_CDN\1/, NG_VERSION.cdn) + .replace(/(['"])NG_VERSION_CODENAME\1/, NG_VERSION.codeName); if (strict !== false) processed = this.singleStrict(processed, '\n\n', true); return processed; }, diff --git a/src/AngularPublic.js b/src/AngularPublic.js index ed7358178204..b1b5f332ce8a 100644 --- a/src/AngularPublic.js +++ b/src/AngularPublic.js @@ -114,8 +114,10 @@ * - `codeName` – `{string}` – Code name of the release, such as "jiggling-armfat". */ var version = { - full: '"NG_VERSION_FULL"', // all of these placeholder strings will be replaced by grunt's - major: 'NG_VERSION_MAJOR', // package task + // These placeholder strings will be replaced by grunt's `build` task. + // They need to be double- or single-quoted. + full: '"NG_VERSION_FULL"', + major: 'NG_VERSION_MAJOR', minor: 'NG_VERSION_MINOR', dot: 'NG_VERSION_DOT', codeName: '"NG_VERSION_CODENAME"' diff --git a/test/e2e/fixtures/version/index.html b/test/e2e/fixtures/version/index.html new file mode 100644 index 000000000000..ca1a2bf6fe7a --- /dev/null +++ b/test/e2e/fixtures/version/index.html @@ -0,0 +1,6 @@ + + + + + + diff --git a/test/e2e/tests/version.spec.js b/test/e2e/tests/version.spec.js new file mode 100644 index 000000000000..47551e45375f --- /dev/null +++ b/test/e2e/tests/version.spec.js @@ -0,0 +1,57 @@ +'use strict'; + +describe('angular.version', function() { + var version; + + beforeEach(function() { + loadFixture('version'); + version = browser.driver.executeScript('return angular.version'); + }); + + + it('should expose the current version as object', function() { + expect(version).toEqual(jasmine.any(Object)); + }); + + it('should contain property `full` (string)', function() { + expect(version.then(get('full'))).toEqual(jasmine.any(String)); + }); + + it('should contain property `major` (number)', function() { + expect(version.then(get('major'))).toEqual(jasmine.any(Number)); + }); + + it('should contain property `minor` (number)', function() { + expect(version.then(get('minor'))).toEqual(jasmine.any(Number)); + }); + + it('should contain property `dot` (number)', function() { + expect(version.then(get('dot'))).toEqual(jasmine.any(Number)); + }); + + it('should contain property `codeName` (string)', function() { + expect(version.then(get('codeName'))).toEqual(jasmine.any(String)); + }); + + it('should not contain "NG_VERSION_" in `codeName`', function() { + expect(version.then(get('codeName'))).not.toMatch(/NG_VERSION_/); + }); + + it('\'s `full` property should start with `"major.minor.dot"`', function() { + expect(version.then(validate)).toBe(true); + + function validate(ver) { + // We test for "starts with", because `full` is not always equal to `"major.minor.dot"`. + // Possible formats: `1.5.8`, `1.5.0-rc.2`, `1.5.9-build.4949`, `1.5.9-local+sha.859348c` + return ver.full.indexOf([ver.major, ver.minor, ver.dot].join('.')) === 0; + } + }); + + + // Helpers + function get(prop) { + return function getter(obj) { + return obj[prop]; + }; + } +}); From eacfe4148eb97e550117ed7fd3c37b58537a9f64 Mon Sep 17 00:00:00 2001 From: Martin Staffa Date: Fri, 12 Aug 2016 19:12:12 +0200 Subject: [PATCH 0115/1173] feat($controller): throw when requested controller is not registered Previously, it would throw the ng:areq error, which is less specific and just informs that the requested controller is not defined. Given how commonly controllers are used in Angular, it makes sense to have a specific error. The ng:areq error is still thrown when the registered controller is not a function. Closes #14980 PR (#15015) --- docs/content/error/$controller/ctrlreg.ngdoc | 23 ++++++++++++++++++++ docs/content/error/ng/areq.ngdoc | 3 ++- src/ng/controller.js | 5 +++++ test/ng/controllerSpec.js | 7 +++++- test/ng/directive/ngControllerSpec.js | 1 + 5 files changed, 37 insertions(+), 2 deletions(-) create mode 100644 docs/content/error/$controller/ctrlreg.ngdoc diff --git a/docs/content/error/$controller/ctrlreg.ngdoc b/docs/content/error/$controller/ctrlreg.ngdoc new file mode 100644 index 000000000000..64a77d7abbca --- /dev/null +++ b/docs/content/error/$controller/ctrlreg.ngdoc @@ -0,0 +1,23 @@ +@ngdoc error +@name $controller:ctrlreg +@fullName A controller with this name is not registered. +@description + +This error occurs when the {@link ng.$controller `$controller()`} service is called +with a string that does not match any of the registered controllers. The controller service may have +been invoked directly, or indirectly, for example through the {@link ng.ngController `ngController`} directive, +or inside a {@link angular.Module#component component} / {@link angular.Module#directive directive} / +{@link ngRoute.$routeProvider#when route} definition (when using a string for the controller property). +Third-party modules can also instantiate controllers with the {@link ng.$controller `$controller()`} service. + +Causes for this error can be: + +1. Your reference to the controller has a typo. For example, in +the {@link ng.ngController `ngController`} directive attribute, in a {@link angular.Module#component component} +definition's controller property, or in the call to {@link ng.$controller `$controller()`}. +2. You have not registered the controller (neither via {@link angular.Module#controller `Module.controller`} +nor {@link ng.$controllerProvider#register `$controllerProvider.register()`}. +3. You have a typo in the *registered* controller name. + + +Please consult the {@link ng.$controller $controller} service api docs to learn more. diff --git a/docs/content/error/ng/areq.ngdoc b/docs/content/error/ng/areq.ngdoc index 376ac035c00a..ddf1d408520b 100644 --- a/docs/content/error/ng/areq.ngdoc +++ b/docs/content/error/ng/areq.ngdoc @@ -5,4 +5,5 @@ AngularJS often asserts that certain values will be present and truthy using a helper function. If the assertion fails, this error is thrown. To fix this problem, -make sure that the value the assertion expects is defined and truthy. +make sure that the value the assertion expects is defined and matches the type mentioned in the +error. diff --git a/src/ng/controller.js b/src/ng/controller.js index b1cbdc5cf91d..f6c4a7c5abd1 100644 --- a/src/ng/controller.js +++ b/src/ng/controller.js @@ -122,6 +122,11 @@ function $ControllerProvider() { : getter(locals.$scope, constructor, true) || (globals ? getter($window, constructor, true) : undefined); + if (!expression) { + throw $controllerMinErr('ctrlreg', + 'The controller with the name \'{0}\' is not registered.', constructor); + } + assertArgFn(expression, constructor, true); } diff --git a/test/ng/controllerSpec.js b/test/ng/controllerSpec.js index f872e42c3cb6..8fca250c9fba 100644 --- a/test/ng/controllerSpec.js +++ b/test/ng/controllerSpec.js @@ -161,6 +161,12 @@ describe('$controller', function() { }).toThrow(); })); + it('should throw ctrlreg when the controller name does not match a registered controller', function() { + expect(function() { + $controller('IDoNotExist', {$scope: {}}); + }).toThrowMinErr('$controller', 'ctrlreg', 'The controller with the name \'IDoNotExist\' is not registered.'); + }); + describe('ctrl as syntax', function() { @@ -227,7 +233,6 @@ describe('$controller', function() { 'Must match `__name__ as __id__` or `__name__`.'); }); - it('should allow identifiers containing `$`', function() { var scope = {}; diff --git a/test/ng/directive/ngControllerSpec.js b/test/ng/directive/ngControllerSpec.js index 89bd23f9c781..f78baa7fff7e 100644 --- a/test/ng/directive/ngControllerSpec.js +++ b/test/ng/directive/ngControllerSpec.js @@ -150,4 +150,5 @@ describe('ngController', function() { $httpBackend.flush(); expect(controllerScope.name).toBeUndefined(); })); + }); From a272a3c0bd88b6df354102dc059a0d14b5b22675 Mon Sep 17 00:00:00 2001 From: Martin Staffa Date: Fri, 12 Aug 2016 19:58:08 +0200 Subject: [PATCH 0116/1173] fix(input[range]): correctly handle min/max; remove ngMin/ngMax support This commit fixes the handling of min/max, and removes support for ngMin/ngMax: min/max: Previously, interpolated min/max values on input range were not set when the first $render happens, because the interpolation directive only sets the actual element attribute value after a digest passes. That means that the browser would not adjust the input value according to min/max and the range input and model would not be initialzed as expected. With this change, input range will set the actual element attribute value during its own linking phase, as it is already available on the attrs argument passed to the link fn. ngMin/ngMax Since ng prefixed attributes do not set their corresponding element attribute, the range input would always have min = 0, and max = 100 (in supported browsers), regardless of the value in ngMin/ngMax. This is confusing and not very useful, so it's better to not support these attributes at all. The commit also fixes a test which used an interpolation inside an attribute that expects an expression. Fixes #14982 PR (#14996) --- src/ng/directive/input.js | 100 +++++++------ test/ng/directive/inputSpec.js | 212 +++++++++++++++------------- test/ng/directive/validatorsSpec.js | 2 +- 3 files changed, 165 insertions(+), 149 deletions(-) diff --git a/src/ng/directive/input.js b/src/ng/directive/input.js index 1d5f1ec1c598..94978da4e7e9 100644 --- a/src/ng/directive/input.js +++ b/src/ng/directive/input.js @@ -1061,8 +1061,11 @@ var inputType = { * Angular will also update the model value. * * Automatic value adjustment also means that a range input element can never have the `required`, - * `min`, or `max` errors, except when using `ngMax` and `ngMin`, which are not affected by automatic - * value adjustment, because they do not set the `min` and `max` attributes. + * `min`, or `max` errors. + * + * Note that `input[range]` is not compatible with`ngMax` and `ngMin`, because they do not set the + * `min` and `max` attributes, which means that the browser won't automatically adjust the input + * value based on their values, and will always assume min = 0 and max = 100. * * @param {string} ngModel Assignable angular expression to data-bind to. * @param {string=} name Property name of the form under which the control is published. @@ -1070,14 +1073,6 @@ var inputType = { * than `min`. Can be interpolated. * @param {string=} max Sets the `max` validation to ensure that the value entered is less than `max`. * Can be interpolated. - * @param {string=} ngMin Takes an expression. Sets the `min` validation to ensure that the value - * entered is greater than `min`. Does not set the `min` attribute and therefore - * adds no native HTML5 validation. It also means the browser won't adjust the - * element value in case `min` is greater than the current value. - * @param {string=} ngMax Takes an expression. Sets the `max` validation to ensure that the value - * entered is less than `max`. Does not set the `max` attribute and therefore - * adds no native HTML5 validation. It also means the browser won't adjust the - * element value in case `max` is less than the current value. * @param {string=} ngChange Angular expression to be executed when the ngModel value changes due * to user interaction with the input element. * @@ -1547,10 +1542,12 @@ function rangeInputType(scope, element, attr, ctrl, $sniffer, $browser) { numberFormatterParser(ctrl); baseInputType(scope, element, attr, ctrl, $sniffer, $browser); - var minVal = 0, - maxVal = 100, - supportsRange = ctrl.$$hasNativeValidators && element[0].type === 'range', - validity = element[0].validity; + var supportsRange = ctrl.$$hasNativeValidators && element[0].type === 'range', + minVal = supportsRange ? 0 : undefined, + maxVal = supportsRange ? 100 : undefined, + validity = element[0].validity, + hasMinAttr = isDefined(attr.min), + hasMaxAttr = isDefined(attr.max); var originalRender = ctrl.$render; @@ -1563,6 +1560,39 @@ function rangeInputType(scope, element, attr, ctrl, $sniffer, $browser) { } : originalRender; + if (hasMinAttr) { + ctrl.$validators.min = supportsRange ? + // Since all browsers set the input to a valid value, we don't need to check validity + function noopMinValidator() { return true; } : + // non-support browsers validate the range + function minValidator(modelValue, viewValue) { + return ctrl.$isEmpty(viewValue) || isUndefined(minVal) || viewValue >= minVal; + }; + + setInitialValueAndObserver('min', minChange); + } + + if (hasMaxAttr) { + ctrl.$validators.max = supportsRange ? + // Since all browsers set the input to a valid value, we don't need to check validity + function noopMaxValidator() { return true; } : + // ngMax doesn't set the max attr, so the browser doesn't adjust the input value as setting max would + function maxValidator(modelValue, viewValue) { + return ctrl.$isEmpty(viewValue) || isUndefined(maxVal) || viewValue <= maxVal; + }; + + setInitialValueAndObserver('max', maxChange); + } + + function setInitialValueAndObserver(htmlAttrName, changeFn) { + // interpolated attributes set the attribute value only after a digest, but we need the + // attribute value when the input is first rendered, so that the browser can adjust the + // input value based on the min/max value + element.attr(htmlAttrName, attr[htmlAttrName]); + + attr.$observe(htmlAttrName, changeFn); + } + function minChange(val) { if (isDefined(val) && !isNumber(val)) { val = parseFloat(val); @@ -1573,12 +1603,12 @@ function rangeInputType(scope, element, attr, ctrl, $sniffer, $browser) { return; } - if (supportsRange && minAttrType === 'min') { + if (supportsRange) { var elVal = element.val(); // IE11 doesn't set the el val correctly if the minVal is greater than the element value if (minVal > elVal) { - element.val(minVal); elVal = minVal; + element.val(elVal); } ctrl.$setViewValue(elVal); } else { @@ -1587,23 +1617,6 @@ function rangeInputType(scope, element, attr, ctrl, $sniffer, $browser) { } } - var minAttrType = isDefined(attr.ngMin) ? 'ngMin' : isDefined(attr.min) ? 'min' : false; - if (minAttrType) { - ctrl.$validators.min = isDefined(attr.min) && supportsRange ? - function noopMinValidator(value) { - // Since all browsers set the input to a valid value, we don't need to check validity - return true; - } : - // ngMin doesn't set the min attr, so the browser doesn't adjust the input value as setting min would - function minValidator(modelValue, viewValue) { - return ctrl.$isEmpty(viewValue) || isUndefined(minVal) || viewValue >= minVal; - }; - - // Assign minVal when the directive is linked. This won't run the validators as the model isn't ready yet - minChange(attr.min); - attr.$observe('min', minChange); - } - function maxChange(val) { if (isDefined(val) && !isNumber(val)) { val = parseFloat(val); @@ -1614,12 +1627,13 @@ function rangeInputType(scope, element, attr, ctrl, $sniffer, $browser) { return; } - if (supportsRange && maxAttrType === 'max') { + if (supportsRange) { var elVal = element.val(); // IE11 doesn't set the el val correctly if the maxVal is less than the element value if (maxVal < elVal) { element.val(maxVal); - elVal = minVal; + // IE11 and Chrome don't set the value to the minVal when max < min + elVal = maxVal < minVal ? minVal : maxVal; } ctrl.$setViewValue(elVal); } else { @@ -1627,22 +1641,6 @@ function rangeInputType(scope, element, attr, ctrl, $sniffer, $browser) { ctrl.$validate(); } } - var maxAttrType = isDefined(attr.max) ? 'max' : attr.ngMax ? 'ngMax' : false; - if (maxAttrType) { - ctrl.$validators.max = isDefined(attr.max) && supportsRange ? - function noopMaxValidator() { - // Since all browsers set the input to a valid value, we don't need to check validity - return true; - } : - // ngMax doesn't set the max attr, so the browser doesn't adjust the input value as setting max would - function maxValidator(modelValue, viewValue) { - return ctrl.$isEmpty(viewValue) || isUndefined(maxVal) || viewValue <= maxVal; - }; - - // Assign maxVal when the directive is linked. This won't run the validators as the model isn't ready yet - maxChange(attr.max); - attr.$observe('max', maxChange); - } } diff --git a/test/ng/directive/inputSpec.js b/test/ng/directive/inputSpec.js index d9546e063773..db804043a1e5 100644 --- a/test/ng/directive/inputSpec.js +++ b/test/ng/directive/inputSpec.js @@ -2877,7 +2877,7 @@ describe('input', function() { expect(inputElm.val()).toEqual('50'); }); - it('should set model to 50 when no value specified', function() { + it('should set model to 50 when no value specified and default min/max', function() { var inputElm = helper.compileInput(''); expect(inputElm.val()).toBe('50'); @@ -2887,7 +2887,7 @@ describe('input', function() { expect(scope.age).toBe(50); }); - it('should parse non-number values to 50', function() { + it('should parse non-number values to 50 when default min/max', function() { var inputElm = helper.compileInput(''); scope.$apply('age = 10'); @@ -2949,8 +2949,20 @@ describe('input', function() { describe('min', function() { if (supportsRange) { + + it('should initialize correctly with non-default model and min value', function() { + scope.value = -3; + scope.min = -5; + var inputElm = helper.compileInput(''); + + expect(inputElm).toBeValid(); + expect(inputElm.val()).toBe('-3'); + expect(scope.value).toBe(-3); + expect(scope.form.alias.$error.min).toBeFalsy(); + }); + // Browsers that implement range will never allow you to set the value < min values - it('should validate', function() { + it('should adjust invalid input values', function() { var inputElm = helper.compileInput(''); helper.changeInputValueTo('5'); @@ -2964,6 +2976,22 @@ describe('input', function() { expect(scope.form.alias.$error.min).toBeFalsy(); }); + it('should set the model to the min val if it is less than the min val', function() { + scope.value = -10; + // Default min is 0 + var inputElm = helper.compileInput(''); + + expect(inputElm).toBeValid(); + expect(inputElm.val()).toBe('0'); + expect(scope.value).toBe(0); + + scope.$apply('value = 5; min = 10'); + + expect(inputElm).toBeValid(); + expect(inputElm.val()).toBe('10'); + expect(scope.value).toBe(10); + }); + it('should adjust the element and model value when the min value changes on-the-fly', function() { scope.min = 10; var inputElm = helper.compileInput(''); @@ -2997,8 +3025,9 @@ describe('input', function() { }); } else { + // input[type=range] will become type=text in browsers that don't support it + it('should validate if "range" is not implemented', function() { - // This will become type=text in browsers that don't support it var inputElm = helper.compileInput(''); helper.changeInputValueTo('5'); @@ -3012,6 +3041,34 @@ describe('input', function() { expect(scope.form.alias.$error.min).toBeFalsy(); }); + it('should not assume a min val of 0 if the min interpolates to a non-number', function() { + scope.value = -10; + var inputElm = helper.compileInput(''); + + expect(inputElm).toBeValid(); + expect(inputElm.val()).toBe('-10'); + expect(scope.value).toBe(-10); + expect(scope.form.alias.$error.min).toBeFalsy(); + + helper.changeInputValueTo('-5'); + expect(inputElm).toBeValid(); + expect(inputElm.val()).toBe('-5'); + expect(scope.value).toBe(-5); + expect(scope.form.alias.$error.min).toBeFalsy(); + + scope.$apply('max = "null"'); + expect(inputElm).toBeValid(); + expect(inputElm.val()).toBe('-5'); + expect(scope.value).toBe(-5); + expect(scope.form.alias.$error.max).toBeFalsy(); + + scope.$apply('max = "asdf"'); + expect(inputElm).toBeValid(); + expect(inputElm.val()).toBe('-5'); + expect(scope.value).toBe(-5); + expect(scope.form.alias.$error.max).toBeFalsy(); + }); + it('should validate even if the min value changes on-the-fly', function() { scope.min = 10; var inputElm = helper.compileInput(''); @@ -3048,52 +3105,21 @@ describe('input', function() { } }); - describe('ngMin', function() { - - it('should validate', function() { - var inputElm = helper.compileInput(''); - - helper.changeInputValueTo('1'); - expect(inputElm).toBeInvalid(); - expect(scope.value).toBeFalsy(); - expect(scope.form.alias.$error.min).toBeTruthy(); - - helper.changeInputValueTo('100'); - expect(inputElm).toBeValid(); - expect(scope.value).toBe(100); - expect(scope.form.alias.$error.min).toBeFalsy(); - }); - - it('should validate even if the ngMin value changes on-the-fly', function() { - scope.min = 10; - var inputElm = helper.compileInput(''); - - helper.changeInputValueTo('15'); - expect(inputElm).toBeValid(); - - scope.min = 20; - scope.$digest(); - expect(inputElm).toBeInvalid(); - - scope.min = null; - scope.$digest(); - expect(inputElm).toBeValid(); - - scope.min = '20'; - scope.$digest(); - expect(inputElm).toBeInvalid(); - - scope.min = 'abc'; - scope.$digest(); - expect(inputElm).toBeValid(); - }); - }); - - describe('max', function() { if (supportsRange) { // Browsers that implement range will never allow you to set the value > max value + it('should initialize correctly with non-default model and max value', function() { + scope.value = 130; + scope.max = 150; + var inputElm = helper.compileInput(''); + + expect(inputElm).toBeValid(); + expect(inputElm.val()).toBe('130'); + expect(scope.value).toBe(130); + expect(scope.form.alias.$error.max).toBeFalsy(); + }); + it('should validate', function() { var inputElm = helper.compileInput(''); @@ -3108,9 +3134,16 @@ describe('input', function() { expect(scope.form.alias.$error.max).toBeFalsy(); }); - it('should set the model to the max val if it is more than the max val', function() { - scope.value = 90; - var inputElm = helper.compileInput(''); + it('should set the model to the max val if it is greater than the max val', function() { + scope.value = 110; + // Default max is 100 + var inputElm = helper.compileInput(''); + + expect(inputElm).toBeValid(); + expect(inputElm.val()).toBe('100'); + expect(scope.value).toBe(100); + + scope.$apply('value = 90; max = 10'); expect(inputElm).toBeValid(); expect(inputElm.val()).toBe('10'); @@ -3164,6 +3197,34 @@ describe('input', function() { expect(scope.form.alias.$error.max).toBeFalsy(); }); + it('should not assume a max val of 100 if the max attribute interpolates to a non-number', function() { + scope.value = 120; + var inputElm = helper.compileInput(''); + + expect(inputElm).toBeValid(); + expect(inputElm.val()).toBe('120'); + expect(scope.value).toBe(120); + expect(scope.form.alias.$error.max).toBeFalsy(); + + helper.changeInputValueTo('140'); + expect(inputElm).toBeValid(); + expect(inputElm.val()).toBe('140'); + expect(scope.value).toBe(140); + expect(scope.form.alias.$error.max).toBeFalsy(); + + scope.$apply('max = null'); + expect(inputElm).toBeValid(); + expect(inputElm.val()).toBe('140'); + expect(scope.value).toBe(140); + expect(scope.form.alias.$error.max).toBeFalsy(); + + scope.$apply('max = "asdf"'); + expect(inputElm).toBeValid(); + expect(inputElm.val()).toBe('140'); + expect(scope.value).toBe(140); + expect(scope.form.alias.$error.max).toBeFalsy(); + }); + it('should validate even if the max value changes on-the-fly', function() { scope.max = 10; var inputElm = helper.compileInput(''); @@ -3199,68 +3260,25 @@ describe('input', function() { } }); - describe('ngMax', function() { - - it('should validate', function() { - var inputElm = helper.compileInput(''); - - helper.changeInputValueTo('20'); - expect(inputElm).toBeInvalid(); - expect(scope.value).toBeUndefined(); - expect(scope.form.alias.$error.max).toBeTruthy(); - - helper.changeInputValueTo('0'); - expect(inputElm).toBeValid(); - expect(scope.value).toBe(0); - expect(scope.form.alias.$error.max).toBeFalsy(); - }); - - it('should validate even if the ngMax value changes on-the-fly', function() { - scope.max = 10; - var inputElm = helper.compileInput(''); - - helper.changeInputValueTo('5'); - expect(inputElm).toBeValid(); - - scope.max = 0; - scope.$digest(); - expect(inputElm).toBeInvalid(); - - scope.max = null; - scope.$digest(); - expect(inputElm).toBeValid(); - - scope.max = '4'; - scope.$digest(); - expect(inputElm).toBeInvalid(); - - scope.max = 'abc'; - scope.$digest(); - expect(inputElm).toBeValid(); - }); - - }); - if (supportsRange) { describe('min and max', function() { - it('should keep the initial default value when min and max are specified', function() { + it('should set the correct initial value when min and max are specified', function() { scope.max = 80; scope.min = 40; var inputElm = helper.compileInput(''); - expect(inputElm.val()).toBe('50'); - expect(scope.value).toBe(50); + expect(inputElm.val()).toBe('60'); + expect(scope.value).toBe(60); }); - it('should set element and model value to min if max is less than min', function() { scope.min = 40; var inputElm = helper.compileInput(''); - expect(inputElm.val()).toBe('50'); - expect(scope.value).toBe(50); + expect(inputElm.val()).toBe('70'); + expect(scope.value).toBe(70); scope.max = 20; scope.$digest(); diff --git a/test/ng/directive/validatorsSpec.js b/test/ng/directive/validatorsSpec.js index b598cfe50dc0..341c837ad6d9 100644 --- a/test/ng/directive/validatorsSpec.js +++ b/test/ng/directive/validatorsSpec.js @@ -351,7 +351,7 @@ describe('validators', function() { it('should accept values of any length when maxlength is non-numeric', function() { - var inputElm = helper.compileInput(''); + var inputElm = helper.compileInput(''); helper.changeInputValueTo('aaaaaaaaaa'); $rootScope.$apply('maxlength = "5"'); From 88f3517db2a66b3b8a1a5888e07ccca7c6604c01 Mon Sep 17 00:00:00 2001 From: Georgios Kalpakas Date: Wed, 17 Aug 2016 17:28:00 +0300 Subject: [PATCH 0117/1173] docs(guide/concepts): improve wording --- docs/content/guide/concepts.ngdoc | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/docs/content/guide/concepts.ngdoc b/docs/content/guide/concepts.ngdoc index 69f1845ad883..615da692d5f5 100644 --- a/docs/content/guide/concepts.ngdoc +++ b/docs/content/guide/concepts.ngdoc @@ -151,8 +151,9 @@ different currencies and also pay the invoice. What changed? First, there is a new JavaScript file that contains a {@link controller controller}. -More exactly, the file contains a constructor function that creates the actual controller instance. -The purpose of controllers is to expose variables and functionality to expressions and directives. +More accurately, the file specifies a constructor function that will be used to create the actual +controller instance. The purpose of controllers is to expose variables and functionality to +expressions and directives. Besides the new file that contains the controller code we also added an {@link ng.directive:ngController `ng-controller`} directive to the HTML. @@ -251,6 +252,7 @@ Let's refactor our example and move the currency conversion into a service in an What changed? + We moved the `convertCurrency` function and the definition of the existing currencies into the new file `finance2.js`. But how does the controller get a hold of the now separated function? @@ -274,10 +276,11 @@ The code snippet `angular.module('invoice2', ['finance2'])` specifies that the `finance2` module. By this, Angular uses the `InvoiceController` as well as the `currencyConverter` service. Now that Angular knows of all the parts of the application, it needs to create them. -In the previous section we saw that controllers are created using a factory function. -For services there are multiple ways to define their factory +In the previous section we saw that controllers are created using a constructor function. +For services, there are multiple ways to specify how they are created (see the {@link services service guide}). -In the example above, we are using an anonymous function as the factory function for `currencyConverter` service. +In the example above, we are using an anonymous function as the factory function for the +`currencyConverter` service. This function should return the `currencyConverter` service instance. Back to the initial question: How does the `InvoiceController` get a reference to the `currencyConverter` function? From 9a8b8aaa9641bfc85d245c4355fa5481285b593f Mon Sep 17 00:00:00 2001 From: Martin Staffa Date: Sat, 30 Jul 2016 16:58:35 +0200 Subject: [PATCH 0118/1173] feat(input[range]): support step Step support works like min / max, but with the following caveat. Currently, only Firefox fully implements the spec. Other browsers (Chrome, Safari, Edge) have issues when the step value changes after the input has been changed. They do not adjust the input value to a valid value, but instead set the stepMismatch validity state. Angular will take this validity state, and forward it as the ngModel "step" error. Adjusting the error ourselves would add too much code, as the logic is quite involved. --- src/ng/directive/input.js | 94 +++++++++++++++------ test/ng/directive/inputSpec.js | 145 +++++++++++++++++++++++++++++++++ 2 files changed, 212 insertions(+), 27 deletions(-) diff --git a/src/ng/directive/input.js b/src/ng/directive/input.js index 94978da4e7e9..dcc9567b1303 100644 --- a/src/ng/directive/input.js +++ b/src/ng/directive/input.js @@ -1037,13 +1037,19 @@ var inputType = { * The model for the range input must always be a `Number`. * * IE9 and other browsers that do not support the `range` type fall back - * to a text input. Model binding, validation and number parsing are nevertheless supported. + * to a text input without any default values for `min`, `max` and `step`. Model binding, + * validation and number parsing are nevertheless supported. * * Browsers that support range (latest Chrome, Safari, Firefox, Edge) treat `input[range]` * in a way that never allows the input to hold an invalid value. That means: * - any non-numerical value is set to `(max + min) / 2`. * - any numerical value that is less than the current min val, or greater than the current max val * is set to the min / max val respectively. + * - additionally, the current `step` is respected, so the nearest value that satisfies a step + * is used. + * + * See the [HTML Spec on input[type=range]](https://www.w3.org/TR/html5/forms.html#range-state-(type=range)) + * for more info. * * This has the following consequences for Angular: * @@ -1056,16 +1062,21 @@ var inputType = { * That means the model for range will immediately be set to `50` after `ngModel` has been * initialized. It also means a range input can never have the required error. * - * This does not only affect changes to the model value, but also to the values of the `min` and - * `max` attributes. When these change in a way that will cause the browser to modify the input value, - * Angular will also update the model value. + * This does not only affect changes to the model value, but also to the values of the `min`, + * `max`, and `step` attributes. When these change in a way that will cause the browser to modify + * the input value, Angular will also update the model value. * * Automatic value adjustment also means that a range input element can never have the `required`, * `min`, or `max` errors. * - * Note that `input[range]` is not compatible with`ngMax` and `ngMin`, because they do not set the - * `min` and `max` attributes, which means that the browser won't automatically adjust the input - * value based on their values, and will always assume min = 0 and max = 100. + * However, `step` is currently only fully implemented by Firefox. Other browsers have problems + * when the step value changes dynamically - they do not adjust the element value correctly, but + * instead may set the `stepMismatch` error. If that's the case, the Angular will set the `step` + * error on the input, and set the model to `undefined`. + * + * Note that `input[range]` is not compatible with`ngMax`, `ngMin`, and `ngStep`, because they do + * not set the `min` and `max` attributes, which means that the browser won't automatically adjust + * the input value based on their values, and will always assume min = 0, max = 100, and step = 1. * * @param {string} ngModel Assignable angular expression to data-bind to. * @param {string=} name Property name of the form under which the control is published. @@ -1073,6 +1084,8 @@ var inputType = { * than `min`. Can be interpolated. * @param {string=} max Sets the `max` validation to ensure that the value entered is less than `max`. * Can be interpolated. + * @param {string=} step Sets the `step` validation to ensure that the value entered matches the `step` + * Can be interpolated. * @param {string=} ngChange Angular expression to be executed when the ngModel value changes due * to user interaction with the input element. * @@ -1499,6 +1512,13 @@ function numberFormatterParser(ctrl) { }); } +function parseNumberAttrVal(val) { + if (isDefined(val) && !isNumber(val)) { + val = parseFloat(val); + } + return isNumber(val) && !isNaN(val) ? val : undefined; +} + function numberInputType(scope, element, attr, ctrl, $sniffer, $browser) { badInputChecker(scope, element, attr, ctrl); numberFormatterParser(ctrl); @@ -1511,10 +1531,7 @@ function numberInputType(scope, element, attr, ctrl, $sniffer, $browser) { }; attr.$observe('min', function(val) { - if (isDefined(val) && !isNumber(val)) { - val = parseFloat(val); - } - minVal = isNumber(val) && !isNaN(val) ? val : undefined; + minVal = parseNumberAttrVal(val); // TODO(matsko): implement validateLater to reduce number of validations ctrl.$validate(); }); @@ -1527,10 +1544,7 @@ function numberInputType(scope, element, attr, ctrl, $sniffer, $browser) { }; attr.$observe('max', function(val) { - if (isDefined(val) && !isNumber(val)) { - val = parseFloat(val); - } - maxVal = isNumber(val) && !isNaN(val) ? val : undefined; + maxVal = parseNumberAttrVal(val); // TODO(matsko): implement validateLater to reduce number of validations ctrl.$validate(); }); @@ -1545,9 +1559,11 @@ function rangeInputType(scope, element, attr, ctrl, $sniffer, $browser) { var supportsRange = ctrl.$$hasNativeValidators && element[0].type === 'range', minVal = supportsRange ? 0 : undefined, maxVal = supportsRange ? 100 : undefined, + stepVal = supportsRange ? 1 : undefined, validity = element[0].validity, hasMinAttr = isDefined(attr.min), - hasMaxAttr = isDefined(attr.max); + hasMaxAttr = isDefined(attr.max), + hasStepAttr = isDefined(attr.step); var originalRender = ctrl.$render; @@ -1564,7 +1580,7 @@ function rangeInputType(scope, element, attr, ctrl, $sniffer, $browser) { ctrl.$validators.min = supportsRange ? // Since all browsers set the input to a valid value, we don't need to check validity function noopMinValidator() { return true; } : - // non-support browsers validate the range + // non-support browsers validate the min val function minValidator(modelValue, viewValue) { return ctrl.$isEmpty(viewValue) || isUndefined(minVal) || viewValue >= minVal; }; @@ -1576,7 +1592,7 @@ function rangeInputType(scope, element, attr, ctrl, $sniffer, $browser) { ctrl.$validators.max = supportsRange ? // Since all browsers set the input to a valid value, we don't need to check validity function noopMaxValidator() { return true; } : - // ngMax doesn't set the max attr, so the browser doesn't adjust the input value as setting max would + // non-support browsers validate the max val function maxValidator(modelValue, viewValue) { return ctrl.$isEmpty(viewValue) || isUndefined(maxVal) || viewValue <= maxVal; }; @@ -1584,20 +1600,32 @@ function rangeInputType(scope, element, attr, ctrl, $sniffer, $browser) { setInitialValueAndObserver('max', maxChange); } + if (hasStepAttr) { + ctrl.$validators.step = supportsRange ? + function nativeStepValidator() { + // Currently, only FF implements the spec on step change correctly (i.e. adjusting the + // input element value to a valid value). It's possible that other browsers set the stepMismatch + // validity error instead, so we can at least report an error in that case. + return !validity.stepMismatch; + } : + // ngStep doesn't set the setp attr, so the browser doesn't adjust the input value as setting step would + function stepValidator(modelValue, viewValue) { + return ctrl.$isEmpty(viewValue) || isUndefined(stepVal) || viewValue % stepVal === 0; + }; + + setInitialValueAndObserver('step', stepChange); + } + function setInitialValueAndObserver(htmlAttrName, changeFn) { // interpolated attributes set the attribute value only after a digest, but we need the // attribute value when the input is first rendered, so that the browser can adjust the // input value based on the min/max value element.attr(htmlAttrName, attr[htmlAttrName]); - attr.$observe(htmlAttrName, changeFn); } function minChange(val) { - if (isDefined(val) && !isNumber(val)) { - val = parseFloat(val); - } - minVal = isNumber(val) && !isNaN(val) ? val : undefined; + minVal = parseNumberAttrVal(val); // ignore changes before model is initialized if (isNumber(ctrl.$modelValue) && isNaN(ctrl.$modelValue)) { return; @@ -1618,10 +1646,7 @@ function rangeInputType(scope, element, attr, ctrl, $sniffer, $browser) { } function maxChange(val) { - if (isDefined(val) && !isNumber(val)) { - val = parseFloat(val); - } - maxVal = isNumber(val) && !isNaN(val) ? val : undefined; + maxVal = parseNumberAttrVal(val); // ignore changes before model is initialized if (isNumber(ctrl.$modelValue) && isNaN(ctrl.$modelValue)) { return; @@ -1642,6 +1667,21 @@ function rangeInputType(scope, element, attr, ctrl, $sniffer, $browser) { } } + function stepChange(val) { + stepVal = parseNumberAttrVal(val); + // ignore changes before model is initialized + if (isNumber(ctrl.$modelValue) && isNaN(ctrl.$modelValue)) { + return; + } + + // Some browsers don't adjust the input value correctly, but set the stepMismatch error + if (supportsRange && ctrl.$viewValue !== element.val()) { + ctrl.$setViewValue(element.val()); + } else { + // TODO(matsko): implement validateLater to reduce number of validations + ctrl.$validate(); + } + } } function urlInputType(scope, element, attr, ctrl, $sniffer, $browser) { diff --git a/test/ng/directive/inputSpec.js b/test/ng/directive/inputSpec.js index db804043a1e5..ff9506245e2a 100644 --- a/test/ng/directive/inputSpec.js +++ b/test/ng/directive/inputSpec.js @@ -3290,6 +3290,151 @@ describe('input', function() { } + + describe('step', function() { + + if (supportsRange) { + // Browsers that implement range will never allow you to set a value that doesn't match the step value + // However, currently only Firefox fully inplements the spec when setting the value after the step value changes. + // Other browsers fail in various edge cases, which is why they are not tested here. + it('should round the input value to the nearest step on user input', function() { + var inputElm = helper.compileInput(''); + + helper.changeInputValueTo('5'); + expect(inputElm).toBeValid(); + expect(scope.value).toBe(5); + expect(scope.form.alias.$error.step).toBeFalsy(); + + helper.changeInputValueTo('10'); + expect(inputElm).toBeValid(); + expect(scope.value).toBe(10); + expect(scope.form.alias.$error.step).toBeFalsy(); + + helper.changeInputValueTo('9'); + expect(inputElm).toBeValid(); + expect(scope.value).toBe(10); + expect(scope.form.alias.$error.step).toBeFalsy(); + + helper.changeInputValueTo('7'); + expect(inputElm).toBeValid(); + expect(scope.value).toBe(5); + expect(scope.form.alias.$error.step).toBeFalsy(); + + helper.changeInputValueTo('7.5'); + expect(inputElm).toBeValid(); + expect(scope.value).toBe(10); + expect(scope.form.alias.$error.step).toBeFalsy(); + }); + + it('should round the input value to the nearest step when setting the model', function() { + var inputElm = helper.compileInput(''); + + scope.$apply('value = 10'); + expect(inputElm.val()).toBe('10'); + expect(inputElm).toBeValid(); + expect(scope.value).toBe(10); + expect(scope.form.alias.$error.step).toBeFalsy(); + + scope.$apply('value = 5'); + expect(inputElm.val()).toBe('5'); + expect(inputElm).toBeValid(); + expect(scope.value).toBe(5); + expect(scope.form.alias.$error.step).toBeFalsy(); + + scope.$apply('value = 7.5'); + expect(inputElm.val()).toBe('10'); + expect(inputElm).toBeValid(); + expect(scope.value).toBe(10); + expect(scope.form.alias.$error.step).toBeFalsy(); + + scope.$apply('value = 7'); + expect(inputElm.val()).toBe('5'); + expect(inputElm).toBeValid(); + expect(scope.value).toBe(5); + expect(scope.form.alias.$error.step).toBeFalsy(); + + scope.$apply('value = 9'); + expect(inputElm.val()).toBe('10'); + expect(inputElm).toBeValid(); + expect(scope.value).toBe(10); + expect(scope.form.alias.$error.step).toBeFalsy(); + }); + + } else { + it('should validate if "range" is not implemented', function() { + scope.step = 10; + scope.value = 20; + var inputElm = helper.compileInput(''); + + expect(inputElm.val()).toBe('20'); + expect(inputElm).toBeValid(); + expect(scope.value).toBe(20); + expect(scope.form.alias.$error.step).toBeFalsy(); + + helper.changeInputValueTo('18'); + expect(inputElm).toBeInvalid(); + expect(inputElm.val()).toBe('18'); + expect(scope.value).toBeUndefined(); + expect(scope.form.alias.$error.step).toBeTruthy(); + + helper.changeInputValueTo('10'); + expect(inputElm).toBeValid(); + expect(inputElm.val()).toBe('10'); + expect(scope.value).toBe(10); + expect(scope.form.alias.$error.step).toBeFalsy(); + + scope.$apply('value = 12'); + expect(inputElm).toBeInvalid(); + expect(inputElm.val()).toBe('12'); + expect(scope.value).toBe(12); + expect(scope.form.alias.$error.step).toBeTruthy(); + }); + + it('should validate even if the step value changes on-the-fly', function() { + scope.step = 10; + var inputElm = helper.compileInput(''); + + helper.changeInputValueTo('10'); + expect(inputElm).toBeValid(); + expect(scope.value).toBe(10); + + // Step changes, but value matches + scope.$apply('step = 5'); + expect(inputElm.val()).toBe('10'); + expect(inputElm).toBeValid(); + expect(scope.value).toBe(10); + expect(scope.form.alias.$error.step).toBeFalsy(); + + // Step changes, value does not match + scope.$apply('step = 6'); + expect(inputElm).toBeInvalid(); + expect(scope.value).toBeUndefined(); + expect(inputElm.val()).toBe('10'); + expect(scope.form.alias.$error.step).toBeTruthy(); + + // null = valid + scope.$apply('step = null'); + expect(inputElm).toBeValid(); + expect(scope.value).toBe(10); + expect(inputElm.val()).toBe('10'); + expect(scope.form.alias.$error.step).toBeFalsy(); + + // Step val as string + scope.$apply('step = "7"'); + expect(inputElm).toBeInvalid(); + expect(scope.value).toBeUndefined(); + expect(inputElm.val()).toBe('10'); + expect(scope.form.alias.$error.step).toBeTruthy(); + + // unparsable string is ignored + scope.$apply('step = "abc"'); + expect(inputElm).toBeValid(); + expect(scope.value).toBe(10); + expect(inputElm.val()).toBe('10'); + expect(scope.form.alias.$error.step).toBeFalsy(); + }); + } + }); }); describe('email', function() { From e1da4bed8e291003d485a8ad346ab80bed8ae2e3 Mon Sep 17 00:00:00 2001 From: Martin Staffa Date: Mon, 15 Aug 2016 23:01:53 +0200 Subject: [PATCH 0119/1173] feat(input[number]): support step input[number] will now set the step error if the input value (ngModel $viewValue) does not fit the step constraint set in the step / ngStep attribute. Fixes #10597 --- src/jqLite.js | 3 +- src/ng/directive/input.js | 23 +++++ test/ng/directive/inputSpec.js | 151 +++++++++++++++++++++++++++++++++ 3 files changed, 176 insertions(+), 1 deletion(-) diff --git a/src/jqLite.js b/src/jqLite.js index 802fdb574a13..e4ad42f86932 100644 --- a/src/jqLite.js +++ b/src/jqLite.js @@ -576,7 +576,8 @@ var ALIASED_ATTR = { 'ngMaxlength': 'maxlength', 'ngMin': 'min', 'ngMax': 'max', - 'ngPattern': 'pattern' + 'ngPattern': 'pattern', + 'ngStep': 'step' }; function getBooleanAttrName(element, name) { diff --git a/src/ng/directive/input.js b/src/ng/directive/input.js index dcc9567b1303..13990b4c0b68 100644 --- a/src/ng/directive/input.js +++ b/src/ng/directive/input.js @@ -679,7 +679,17 @@ var inputType = { * @param {string} ngModel Assignable angular expression to data-bind to. * @param {string=} name Property name of the form under which the control is published. * @param {string=} min Sets the `min` validation error key if the value entered is less than `min`. + * Can be interpolated. * @param {string=} max Sets the `max` validation error key if the value entered is greater than `max`. + * Can be interpolated. + * @param {string=} ngMin Like `min`, sets the `min` validation error key if the value entered is less than `ngMin`, + * but does not trigger HTML5 native validation. Takes an expression. + * @param {string=} ngMax Like `max`, sets the `max` validation error key if the value entered is greater than `ngMax`, + * but does not trigger HTML5 native validation. Takes an expression. + * @param {string=} step Sets the `step` validation error key if the value entered does not fit the `step` constraint. + * Can be interpolated. + * @param {string=} ngStep Like `step`, sets the `max` validation error key if the value entered does not fit the `ngStep` constraint, + * but does not trigger HTML5 native validation. Takes an expression. * @param {string=} required Sets `required` validation error key if the value is not entered. * @param {string=} ngRequired Adds `required` attribute and `required` validation constraint to * the element when the ngRequired expression evaluates to true. Use `ngRequired` instead of @@ -1549,6 +1559,19 @@ function numberInputType(scope, element, attr, ctrl, $sniffer, $browser) { ctrl.$validate(); }); } + + if (isDefined(attr.step) || attr.ngStep) { + var stepVal; + ctrl.$validators.step = function(modelValue, viewValue) { + return ctrl.$isEmpty(viewValue) || isUndefined(stepVal) || viewValue % stepVal === 0; + }; + + attr.$observe('step', function(val) { + stepVal = parseNumberAttrVal(val); + // TODO(matsko): implement validateLater to reduce number of validations + ctrl.$validate(); + }); + } } function rangeInputType(scope, element, attr, ctrl, $sniffer, $browser) { diff --git a/test/ng/directive/inputSpec.js b/test/ng/directive/inputSpec.js index ff9506245e2a..d61860df0a8d 100644 --- a/test/ng/directive/inputSpec.js +++ b/test/ng/directive/inputSpec.js @@ -2621,6 +2621,157 @@ describe('input', function() { }); }); + describe('step', function() { + it('should validate', function() { + $rootScope.step = 10; + $rootScope.value = 20; + var inputElm = helper.compileInput(''); + + expect(inputElm.val()).toBe('20'); + expect(inputElm).toBeValid(); + expect($rootScope.value).toBe(20); + expect($rootScope.form.alias.$error.step).toBeFalsy(); + + helper.changeInputValueTo('18'); + expect(inputElm).toBeInvalid(); + expect(inputElm.val()).toBe('18'); + expect($rootScope.value).toBeUndefined(); + expect($rootScope.form.alias.$error.step).toBeTruthy(); + + helper.changeInputValueTo('10'); + expect(inputElm).toBeValid(); + expect(inputElm.val()).toBe('10'); + expect($rootScope.value).toBe(10); + expect($rootScope.form.alias.$error.step).toBeFalsy(); + + $rootScope.$apply('value = 12'); + expect(inputElm).toBeInvalid(); + expect(inputElm.val()).toBe('12'); + expect($rootScope.value).toBe(12); + expect($rootScope.form.alias.$error.step).toBeTruthy(); + }); + + it('should validate even if the step value changes on-the-fly', function() { + $rootScope.step = 10; + var inputElm = helper.compileInput(''); + + helper.changeInputValueTo('10'); + expect(inputElm).toBeValid(); + expect($rootScope.value).toBe(10); + + // Step changes, but value matches + $rootScope.$apply('step = 5'); + expect(inputElm.val()).toBe('10'); + expect(inputElm).toBeValid(); + expect($rootScope.value).toBe(10); + expect($rootScope.form.alias.$error.step).toBeFalsy(); + + // Step changes, value does not match + $rootScope.$apply('step = 6'); + expect(inputElm).toBeInvalid(); + expect($rootScope.value).toBeUndefined(); + expect(inputElm.val()).toBe('10'); + expect($rootScope.form.alias.$error.step).toBeTruthy(); + + // null = valid + $rootScope.$apply('step = null'); + expect(inputElm).toBeValid(); + expect($rootScope.value).toBe(10); + expect(inputElm.val()).toBe('10'); + expect($rootScope.form.alias.$error.step).toBeFalsy(); + + // Step val as string + $rootScope.$apply('step = "7"'); + expect(inputElm).toBeInvalid(); + expect($rootScope.value).toBeUndefined(); + expect(inputElm.val()).toBe('10'); + expect($rootScope.form.alias.$error.step).toBeTruthy(); + + // unparsable string is ignored + $rootScope.$apply('step = "abc"'); + expect(inputElm).toBeValid(); + expect($rootScope.value).toBe(10); + expect(inputElm.val()).toBe('10'); + expect($rootScope.form.alias.$error.step).toBeFalsy(); + }); + }); + + + describe('ngStep', function() { + it('should validate', function() { + $rootScope.step = 10; + $rootScope.value = 20; + var inputElm = helper.compileInput(''); + + expect(inputElm.val()).toBe('20'); + expect(inputElm).toBeValid(); + expect($rootScope.value).toBe(20); + expect($rootScope.form.alias.$error.step).toBeFalsy(); + + helper.changeInputValueTo('18'); + expect(inputElm).toBeInvalid(); + expect(inputElm.val()).toBe('18'); + expect($rootScope.value).toBeUndefined(); + expect($rootScope.form.alias.$error.step).toBeTruthy(); + + helper.changeInputValueTo('10'); + expect(inputElm).toBeValid(); + expect(inputElm.val()).toBe('10'); + expect($rootScope.value).toBe(10); + expect($rootScope.form.alias.$error.step).toBeFalsy(); + + $rootScope.$apply('value = 12'); + expect(inputElm).toBeInvalid(); + expect(inputElm.val()).toBe('12'); + expect($rootScope.value).toBe(12); + expect($rootScope.form.alias.$error.step).toBeTruthy(); + }); + + it('should validate even if the step value changes on-the-fly', function() { + $rootScope.step = 10; + var inputElm = helper.compileInput(''); + + helper.changeInputValueTo('10'); + expect(inputElm).toBeValid(); + expect($rootScope.value).toBe(10); + + // Step changes, but value matches + $rootScope.$apply('step = 5'); + expect(inputElm.val()).toBe('10'); + expect(inputElm).toBeValid(); + expect($rootScope.value).toBe(10); + expect($rootScope.form.alias.$error.step).toBeFalsy(); + + // Step changes, value does not match + $rootScope.$apply('step = 6'); + expect(inputElm).toBeInvalid(); + expect($rootScope.value).toBeUndefined(); + expect(inputElm.val()).toBe('10'); + expect($rootScope.form.alias.$error.step).toBeTruthy(); + + // null = valid + $rootScope.$apply('step = null'); + expect(inputElm).toBeValid(); + expect($rootScope.value).toBe(10); + expect(inputElm.val()).toBe('10'); + expect($rootScope.form.alias.$error.step).toBeFalsy(); + + // Step val as string + $rootScope.$apply('step = "7"'); + expect(inputElm).toBeInvalid(); + expect($rootScope.value).toBeUndefined(); + expect(inputElm.val()).toBe('10'); + expect($rootScope.form.alias.$error.step).toBeTruthy(); + + // unparsable string is ignored + $rootScope.$apply('step = "abc"'); + expect(inputElm).toBeValid(); + expect($rootScope.value).toBe(10); + expect(inputElm.val()).toBe('10'); + expect($rootScope.form.alias.$error.step).toBeFalsy(); + }); + }); + describe('required', function() { From c54f7a93e09d165d8e6742da7c8b7df2391f0c91 Mon Sep 17 00:00:00 2001 From: Duly Bonheur Date: Wed, 17 Aug 2016 15:48:47 -0400 Subject: [PATCH 0120/1173] docs(ngRepeat): improve example description The example seems to also be filtering by age. It threw me off a bit because I was getting results when I entered numbers in the input field. PR (#15037) --- src/ng/directive/ngRepeat.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ng/directive/ngRepeat.js b/src/ng/directive/ngRepeat.js index 213cd3bc583c..0b1240d5c4d4 100644 --- a/src/ng/directive/ngRepeat.js +++ b/src/ng/directive/ngRepeat.js @@ -233,7 +233,7 @@ * * @example * This example uses `ngRepeat` to display a list of people. A filter is used to restrict the displayed - * results by name. New (entering) and removed (leaving) items are animated. + * results by name or by age. New (entering) and removed (leaving) items are animated.
    From e50e91c7a83ec148ea3ee929bbfe1924dcbb060b Mon Sep 17 00:00:00 2001 From: Martin Staffa Date: Wed, 17 Aug 2016 21:58:36 +0200 Subject: [PATCH 0121/1173] docs($componentController): add more info Closes #15038 --- src/ngMock/angular-mocks.js | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/src/ngMock/angular-mocks.js b/src/ngMock/angular-mocks.js index 93f99c62f5bd..2591716bd998 100644 --- a/src/ngMock/angular-mocks.js +++ b/src/ngMock/angular-mocks.js @@ -2257,12 +2257,21 @@ angular.mock.$ControllerDecorator = ['$delegate', function($delegate) { * @ngdoc service * @name $componentController * @description - * A service that can be used to create instances of component controllers. - *
    + * A service that can be used to create instances of component controllers. Useful for unit-testing. + * * Be aware that the controller will be instantiated and attached to the scope as specified in * the component definition object. If you do not provide a `$scope` object in the `locals` param * then the helper will create a new isolated scope as a child of `$rootScope`. - *
    + * + * If you are using `$element` or `$attrs` in the controller, make sure to provide them as `locals`. + * The `$element` must be a jqLite-wrapped DOM element, and `$attrs` should be an object that + * has all properties / functions that you are using in the controller. If this is getting too complex, + * you should compile the component instead and access the component's controller via the + * {@link angular.element#methods `controller`} function. + * + * See also the section on {@link guide/component#unit-testing-component-controllers unit-testing component controllers} + * in the guide. + * * @param {string} componentName the name of the component whose controller we want to instantiate * @param {Object} locals Injection locals for Controller. * @param {Object=} bindings Properties to add to the controller before invoking the constructor. This is used From 8df43677e296021045214efa6f5ef52c7a9d46d8 Mon Sep 17 00:00:00 2001 From: Benjamin Blackwood Date: Thu, 18 Aug 2016 15:00:15 +1000 Subject: [PATCH 0122/1173] docs($resource): add `status` param to `transformResponse` signature Add `status` param to `transformResponse` signature to keep inline with 1b74097. Closes #15041 --- src/ngResource/resource.js | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/ngResource/resource.js b/src/ngResource/resource.js index c20207a44143..262518d0a7a4 100644 --- a/src/ngResource/resource.js +++ b/src/ngResource/resource.js @@ -162,12 +162,13 @@ function shallowClearAndCopy(src, dst) { * transform function or an array of such functions. The transform function takes the http * request body and headers and returns its transformed (typically serialized) version. * By default, transformRequest will contain one function that checks if the request data is - * an object and serializes to using `angular.toJson`. To prevent this behavior, set + * an object and serializes it using `angular.toJson`. To prevent this behavior, set * `transformRequest` to an empty array: `transformRequest: []` * - **`transformResponse`** – - * `{function(data, headersGetter)|Array.}` – + * `{function(data, headersGetter, status)|Array.}` – * transform function or an array of such functions. The transform function takes the http - * response body and headers and returns its transformed (typically deserialized) version. + * response body, headers and status and returns its transformed (typically deserialized) + * version. * By default, transformResponse will contain one function that checks if the response looks * like a JSON string and deserializes it using `angular.fromJson`. To prevent this behavior, * set `transformResponse` to an empty array: `transformResponse: []` From 3d686a988dc4373da094cff6905e5b0d8da6afa4 Mon Sep 17 00:00:00 2001 From: Wei Wang Date: Mon, 1 Aug 2016 19:14:20 -0400 Subject: [PATCH 0123/1173] feat($location): add support for selectively rewriting links based on attribute In HTML5 mode, links can now be selectively rewritten, by setting `mode.rewriteLinks` to a string (denoting an attribute name). Anchor elements that have the specified attribute will be rewritten, while other links will remain untouched. This can be useful in situations where it is desirable to use HTML5 mode without a `` tag, but still support rewriting specific links only. See #14959 for more details on a possible usecase. Closes #14976 --- docs/content/guide/$location.ngdoc | 47 +++++++++++++----- src/ng/location.js | 79 ++++++++++++++++-------------- test/ng/locationSpec.js | 51 +++++++++++++++++-- 3 files changed, 123 insertions(+), 54 deletions(-) diff --git a/docs/content/guide/$location.ngdoc b/docs/content/guide/$location.ngdoc index 921d400a2286..1b3a46fd7d03 100644 --- a/docs/content/guide/$location.ngdoc +++ b/docs/content/guide/$location.ngdoc @@ -91,15 +91,27 @@ To configure the `$location` service, retrieve the {@link ng.$locationProvider $locationProvider} and set the parameters as follows: -- **html5Mode(mode)**: {boolean|Object}
    - `true` or `enabled:true` - see HTML5 mode
    - `false` or `enabled:false` - see Hashbang mode
    - `requireBase:true` - see Relative links
    - default: `enabled:false` - -- **hashPrefix(prefix)**: {string}
    - prefix used for Hashbang URLs (used in Hashbang mode or in legacy browser in Html5 mode)
    - default: `"!"` +- **html5Mode(mode)**: `{boolean|Object}`
    + `false` or `{enabled: false}` (default) - + see [Hashbang mode](guide/$location#hashbang-mode-default-mode-)
    + `true` or `{enabled: true}` - + see [HTML5 mode](guide/$location#html5-mode)
    + `{..., requireBase: true/false}` (only affects HTML5 mode) - + see [Relative links](guide/$location#relative-links)
    + `{..., rewriteLinks: true/false/'string'}` (only affects HTML5 mode) - + see [HTML link rewriting](guide/$location#html-link-rewriting)
    + Default: + ```j + { + enabled: false, + requireBase: true, + rewriteLinks: true + } + ``` + +- **hashPrefix(prefix)**: `{string}`
    + Prefix used for Hashbang URLs (used in Hashbang mode or in legacy browsers in HTML5 mode).
    + Default: `'!'` ### Example configuration ```js @@ -305,7 +317,7 @@ path and search. If the history API is not supported by a browser, `$location` s URL. This frees you from having to worry about whether the browser viewing your app supports the history API or not; the `$location` service makes this transparent to you. -### Html link rewriting +### HTML link rewriting When you use HTML5 history API mode, you will not need special hashbang links. All you have to do is specify regular URL links, such as: `link` @@ -326,6 +338,18 @@ reload to the original link. - Links starting with '/' that lead to a different base path
    Example: `link` +If `mode.rewriteLinks` is set to `false` in the `mode` configuration object passed to +`$locationProvider.html5Mode()`, the browser will perform a full page reload for every link. +`mode.rewriteLinks` can also be set to a string, which will enable link rewriting only on anchor +elements that have the given attribute. + +For example, if `mode.rewriteLinks` is set to `'internal-link'`: +- `link` will be rewritten +- `link` will perform a full page reload + +Note that [attribute name normalization](guide/directive#normalization) does not apply here, so +`'internalLink'` will **not** match `'internal-link'`. + ### Relative links @@ -853,6 +877,3 @@ angular.module('locationExample', []) # Related API * {@link ng.$location `$location` API} - - - diff --git a/src/ng/location.js b/src/ng/location.js index 31d1b2735caf..9de7702d0194 100644 --- a/src/ng/location.js +++ b/src/ng/location.js @@ -87,13 +87,13 @@ function serverBase(url) { /** - * LocationHtml5Url represents an url + * LocationHtml5Url represents a URL * This object is exposed as $location service when HTML5 mode is enabled and supported * * @constructor * @param {string} appBase application base URL * @param {string} appBaseNoFile application base URL stripped of any filename - * @param {string} basePrefix url path prefix + * @param {string} basePrefix URL path prefix */ function LocationHtml5Url(appBase, appBaseNoFile, basePrefix) { this.$$html5 = true; @@ -102,8 +102,8 @@ function LocationHtml5Url(appBase, appBaseNoFile, basePrefix) { /** - * Parse given html5 (regular) url string into properties - * @param {string} url HTML5 url + * Parse given HTML5 (regular) URL string into properties + * @param {string} url HTML5 URL * @private */ this.$$parse = function(url) { @@ -165,7 +165,7 @@ function LocationHtml5Url(appBase, appBaseNoFile, basePrefix) { /** - * LocationHashbangUrl represents url + * LocationHashbangUrl represents URL * This object is exposed as $location service when developer doesn't opt into html5 mode. * It also serves as the base class for html5 mode fallback on legacy browsers. * @@ -180,8 +180,8 @@ function LocationHashbangUrl(appBase, appBaseNoFile, hashPrefix) { /** - * Parse given hashbang url into properties - * @param {string} url Hashbang url + * Parse given hashbang URL into properties + * @param {string} url Hashbang URL * @private */ this.$$parse = function(url) { @@ -190,7 +190,7 @@ function LocationHashbangUrl(appBase, appBaseNoFile, hashPrefix) { if (!isUndefined(withoutBaseUrl) && withoutBaseUrl.charAt(0) === '#') { - // The rest of the url starts with a hash so we have + // The rest of the URL starts with a hash so we have // got either a hashbang path or a plain hash fragment withoutHashUrl = stripBaseUrl(hashPrefix, withoutBaseUrl); if (isUndefined(withoutHashUrl)) { @@ -255,7 +255,7 @@ function LocationHashbangUrl(appBase, appBaseNoFile, hashPrefix) { }; /** - * Compose hashbang url and update `absUrl` property + * Compose hashbang URL and update `absUrl` property * @private */ this.$$compose = function() { @@ -277,7 +277,7 @@ function LocationHashbangUrl(appBase, appBaseNoFile, hashPrefix) { /** - * LocationHashbangUrl represents url + * LocationHashbangUrl represents URL * This object is exposed as $location service when html5 history api is enabled but the browser * does not support it. * @@ -329,7 +329,7 @@ function LocationHashbangInHtml5Url(appBase, appBaseNoFile, hashPrefix) { var locationPrototype = { /** - * Ensure absolute url is initialized. + * Ensure absolute URL is initialized. * @private */ $$absUrl:'', @@ -353,17 +353,17 @@ var locationPrototype = { * @description * This method is getter only. * - * Return full url representation with all segments encoded according to rules specified in + * Return full URL representation with all segments encoded according to rules specified in * [RFC 3986](http://www.ietf.org/rfc/rfc3986.txt). * * * ```js - * // given url http://example.com/#/some/path?foo=bar&baz=xoxo + * // given URL http://example.com/#/some/path?foo=bar&baz=xoxo * var absUrl = $location.absUrl(); * // => "http://example.com/#/some/path?foo=bar&baz=xoxo" * ``` * - * @return {string} full url + * @return {string} full URL */ absUrl: locationGetter('$$absUrl'), @@ -374,18 +374,18 @@ var locationPrototype = { * @description * This method is getter / setter. * - * Return url (e.g. `/path?a=b#hash`) when called without any parameter. + * Return URL (e.g. `/path?a=b#hash`) when called without any parameter. * * Change path, search and hash, when called with parameter and return `$location`. * * * ```js - * // given url http://example.com/#/some/path?foo=bar&baz=xoxo + * // given URL http://example.com/#/some/path?foo=bar&baz=xoxo * var url = $location.url(); * // => "/some/path?foo=bar&baz=xoxo" * ``` * - * @param {string=} url New url without base prefix (e.g. `/path?a=b#hash`) + * @param {string=} url New URL without base prefix (e.g. `/path?a=b#hash`) * @return {string} url */ url: function(url) { @@ -408,16 +408,16 @@ var locationPrototype = { * @description * This method is getter only. * - * Return protocol of current url. + * Return protocol of current URL. * * * ```js - * // given url http://example.com/#/some/path?foo=bar&baz=xoxo + * // given URL http://example.com/#/some/path?foo=bar&baz=xoxo * var protocol = $location.protocol(); * // => "http" * ``` * - * @return {string} protocol of current url + * @return {string} protocol of current URL */ protocol: locationGetter('$$protocol'), @@ -428,24 +428,24 @@ var locationPrototype = { * @description * This method is getter only. * - * Return host of current url. + * Return host of current URL. * * Note: compared to the non-angular version `location.host` which returns `hostname:port`, this returns the `hostname` portion only. * * * ```js - * // given url http://example.com/#/some/path?foo=bar&baz=xoxo + * // given URL http://example.com/#/some/path?foo=bar&baz=xoxo * var host = $location.host(); * // => "example.com" * - * // given url http://user:password@example.com:8080/#/some/path?foo=bar&baz=xoxo + * // given URL http://user:password@example.com:8080/#/some/path?foo=bar&baz=xoxo * host = $location.host(); * // => "example.com" * host = location.host; * // => "example.com:8080" * ``` * - * @return {string} host of current url. + * @return {string} host of current URL. */ host: locationGetter('$$host'), @@ -456,11 +456,11 @@ var locationPrototype = { * @description * This method is getter only. * - * Return port of current url. + * Return port of current URL. * * * ```js - * // given url http://example.com/#/some/path?foo=bar&baz=xoxo + * // given URL http://example.com/#/some/path?foo=bar&baz=xoxo * var port = $location.port(); * // => 80 * ``` @@ -476,7 +476,7 @@ var locationPrototype = { * @description * This method is getter / setter. * - * Return path of current url when called without any parameter. + * Return path of current URL when called without any parameter. * * Change path when called with parameter and return `$location`. * @@ -485,7 +485,7 @@ var locationPrototype = { * * * ```js - * // given url http://example.com/#/some/path?foo=bar&baz=xoxo + * // given URL http://example.com/#/some/path?foo=bar&baz=xoxo * var path = $location.path(); * // => "/some/path" * ``` @@ -505,13 +505,13 @@ var locationPrototype = { * @description * This method is getter / setter. * - * Return search part (as object) of current url when called without any parameter. + * Return search part (as object) of current URL when called without any parameter. * * Change search part when called with parameter and return `$location`. * * * ```js - * // given url http://example.com/#/some/path?foo=bar&baz=xoxo + * // given URL http://example.com/#/some/path?foo=bar&baz=xoxo * var searchObject = $location.search(); * // => {foo: 'bar', baz: 'xoxo'} * @@ -527,7 +527,7 @@ var locationPrototype = { * of `$location` to the specified value. * * If the argument is a hash object containing an array of values, these values will be encoded - * as duplicate search parameters in the url. + * as duplicate search parameters in the URL. * * @param {(string|Number|Array|boolean)=} paramValue If `search` is a string or number, then `paramValue` * will override only a single search property. @@ -589,7 +589,7 @@ var locationPrototype = { * * * ```js - * // given url http://example.com/#/some/path?foo=bar&baz=xoxo#hashValue + * // given URL http://example.com/#/some/path?foo=bar&baz=xoxo#hashValue * var hash = $location.hash(); * // => "hashValue" * ``` @@ -750,8 +750,12 @@ function $LocationProvider() { * whether or not a tag is required to be present. If `enabled` and `requireBase` are * true, and a base tag is not present, an error will be thrown when `$location` is injected. * See the {@link guide/$location $location guide for more information} - * - **rewriteLinks** - `{boolean}` - (default: `true`) When html5Mode is enabled, - * enables/disables url rewriting for relative links. + * - **rewriteLinks** - `{boolean|string}` - (default: `true`) When html5Mode is enabled, + * enables/disables URL rewriting for relative links. If set to a string, URL rewriting will + * only happen on links with an attribute that matches the given string. For example, if set + * to `'internal-link'`, then the URL will only be rewritten for `` links. + * Note that [attribute name normalization](guide/directive#normalization) does not apply + * here, so `'internalLink'` will **not** match `'internal-link'`. * * @returns {Object} html5Mode object if used as getter or itself (chaining) if used as setter */ @@ -769,7 +773,7 @@ function $LocationProvider() { html5Mode.requireBase = mode.requireBase; } - if (isBoolean(mode.rewriteLinks)) { + if (isBoolean(mode.rewriteLinks) || isString(mode.rewriteLinks)) { html5Mode.rewriteLinks = mode.rewriteLinks; } @@ -866,10 +870,11 @@ function $LocationProvider() { } $rootElement.on('click', function(event) { + var rewriteLinks = html5Mode.rewriteLinks; // TODO(vojta): rewrite link when opening in new tab/window (in legacy browser) // currently we open nice url link and redirect then - if (!html5Mode.rewriteLinks || event.ctrlKey || event.metaKey || event.shiftKey || event.which === 2 || event.button === 2) return; + if (!rewriteLinks || event.ctrlKey || event.metaKey || event.shiftKey || event.which === 2 || event.button === 2) return; var elm = jqLite(event.target); @@ -879,6 +884,8 @@ function $LocationProvider() { if (elm[0] === $rootElement[0] || !(elm = elm.parent())[0]) return; } + if (isString(rewriteLinks) && isUndefined(elm.attr(rewriteLinks))) return; + var absHref = elm.prop('href'); // get the actual href attribute - see // http://msdn.microsoft.com/en-us/library/ie/dd347148(v=vs.85).aspx diff --git a/test/ng/locationSpec.js b/test/ng/locationSpec.js index 133cae044d80..2692d2cccc35 100644 --- a/test/ng/locationSpec.js +++ b/test/ng/locationSpec.js @@ -1588,7 +1588,7 @@ describe('$location', function() { it('should not rewrite links when rewriting links is disabled', function() { - configureTestLink({linkHref: 'link?a#b', html5Mode: {enabled: true, rewriteLinks:false}, supportHist: true}); + configureTestLink({linkHref: 'link?a#b'}); initService({html5Mode:{enabled: true, rewriteLinks:false},supportHistory:true}); inject( initBrowser({ url: 'http://host.com/base/index.html', basePath: '/base/index.html' }), @@ -1601,6 +1601,34 @@ describe('$location', function() { }); + it('should rewrite links when the specified rewriteLinks attr is present', function() { + configureTestLink({linkHref: 'link?a#b', attrs: 'do-rewrite'}); + initService({html5Mode: {enabled: true, rewriteLinks: 'do-rewrite'}, supportHistory: true}); + inject( + initBrowser({url: 'http://host.com/base/index.html', basePath: '/base/index.html'}), + setupRewriteChecks(), + function($browser) { + browserTrigger(link, 'click'); + expectRewriteTo($browser, 'http://host.com/base/link?a#b'); + } + ); + }); + + + it('should not rewrite links when the specified rewriteLinks attr is not present', function() { + configureTestLink({linkHref: 'link?a#b'}); + initService({html5Mode: {enabled: true, rewriteLinks: 'do-rewrite'}, supportHistory: true}); + inject( + initBrowser({url: 'http://host.com/base/index.html', basePath: '/base/index.html'}), + setupRewriteChecks(), + function($browser) { + browserTrigger(link, 'click'); + expectNoRewrite($browser); + } + ); + }); + + it('should rewrite full url links to same domain and base path', function() { configureTestLink({linkHref: 'http://host.com/base/new'}); initService({html5Mode:true,supportHistory:false,hashPrefix:'!'}); @@ -1692,7 +1720,7 @@ describe('$location', function() { it('should not rewrite when full link to different base path when history enabled on old browser', function() { - configureTestLink({linkHref: 'http://host.com/other_base/link', html5Mode: true, supportHist: false}); + configureTestLink({linkHref: 'http://host.com/other_base/link'}); inject( initBrowser({ url: 'http://host.com/base/index.html', basePath: '/base/index.html' }), setupRewriteChecks(), @@ -2343,7 +2371,7 @@ describe('$location', function() { describe('$locationProvider', function() { describe('html5Mode', function() { - it('should set enabled, requireBase and rewriteLinks when called with object', function() { + it('should set enabled, requireBase and rewriteLinks when called with object', function() { module(function($locationProvider) { $locationProvider.html5Mode({enabled: true, requireBase: false, rewriteLinks: false}); expect($locationProvider.html5Mode()).toEqual({ @@ -2357,12 +2385,12 @@ describe('$location', function() { }); - it('should only overwrite existing properties if values are boolean', function() { + it('should only overwrite existing properties if values are of the correct type', function() { module(function($locationProvider) { $locationProvider.html5Mode({ enabled: 'duh', requireBase: 'probably', - rewriteLinks: 'nope' + rewriteLinks: 0 }); expect($locationProvider.html5Mode()).toEqual({ @@ -2376,6 +2404,19 @@ describe('$location', function() { }); + it('should support setting rewriteLinks to a string', function() { + module(function($locationProvider) { + $locationProvider.html5Mode({ + rewriteLinks: 'yes-rewrite' + }); + + expect($locationProvider.html5Mode().rewriteLinks).toEqual('yes-rewrite'); + }); + + inject(function() {}); + }); + + it('should not set unknown input properties to html5Mode object', function() { module(function($locationProvider) { $locationProvider.html5Mode({ From cb31067c2ad3e3fdc9d05d15ba0d99501e745d6b Mon Sep 17 00:00:00 2001 From: Georgios Kalpakas Date: Thu, 25 Aug 2016 18:36:20 +0300 Subject: [PATCH 0124/1173] docs(tutorial/step_03): improve explanation of camel-/kebab-casing Related to #15051. --- docs/content/guide/directive.ngdoc | 2 +- docs/content/tutorial/step_03.ngdoc | 6 ++++-- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/docs/content/guide/directive.ngdoc b/docs/content/guide/directive.ngdoc index b9c2f5733ae5..a1ad4b62373f 100644 --- a/docs/content/guide/directive.ngdoc +++ b/docs/content/guide/directive.ngdoc @@ -70,7 +70,7 @@ Angular **normalizes** an element's tag and attribute name to determine which el directives. We typically refer to directives by their case-sensitive [camelCase](http://en.wikipedia.org/wiki/CamelCase) **normalized** name (e.g. `ngModel`). However, since HTML is case-insensitive, we refer to directives in the DOM by lower-case -forms, typically using [dash-delimited](http://en.wikipedia.org/wiki/Letter_case#Computers) +forms, typically using [dash-delimited](https://en.wikipedia.org/wiki/Letter_case#Special_case_styles) attributes on DOM elements (e.g. `ng-model`). The **normalization** process is as follows: diff --git a/docs/content/tutorial/step_03.ngdoc b/docs/content/tutorial/step_03.ngdoc index 047a5e3649bd..3486a18e039c 100644 --- a/docs/content/tutorial/step_03.ngdoc +++ b/docs/content/tutorial/step_03.ngdoc @@ -68,8 +68,9 @@ To create a component, we use the {@link angular.Module#component .component()} {@link module Angular module}. We must provide the name of the component and the Component Definition Object (CDO for short). -Remember that (since components are also directives) the name of the component is in `camelCase`, -but we will use `kebab-case`, when referring to it in our HTML. +Remember that (since components are also directives) the name of the component is in `camelCase` +(e.g. `myAwesomeComponent`), but we will use `kebab-case` (e.g. `my-awesome-component`) when +referring to it in our HTML. (See [here][case-styles] for a description of different case styles.) In its simplest form, the CDO will just contain a template and a controller. (We can actually omit the controller and Angular will create a dummy controller for us. This is useful for simple @@ -276,6 +277,7 @@ files, so it remains easy to locate as our application grows.
      +[case-styles]: https://en.wikipedia.org/wiki/Letter_case#Special_case_styles [jasmine-docs]: http://jasmine.github.io/2.4/introduction.html [jasmine-home]: http://jasmine.github.io/ [karma]: https://karma-runner.github.io/ From 13c2522baf7c8f616b2efcaab4bffd54c8736591 Mon Sep 17 00:00:00 2001 From: Georgios Kalpakas Date: Mon, 8 Aug 2016 13:48:11 +0300 Subject: [PATCH 0125/1173] fix($compile): correctly merge consecutive text nodes on IE11 As explained in #11781 and #14924, IE11 can (under certain circumstances) break up a text node into multiple consecutive ones, breaking interpolated expressions (e.g. `{{'foo'}}` would become `{{` + `'foo'}}`). To work-around this IE11 bug, #11796 introduced extra logic to merge consecutive text nodes (on IE11 only), which relies on the text nodes' having the same `parentNode`. This approach works fine in the common case, where `compileNodes` is called with a live NodeList object, because removing a text node from its parent will automatically update the latter's `.childNodes` NodeList. It falls short though, when calling `compileNodes` with either a jqLite/jQuery collection or an Array. In fails in two ways: 1. If the text nodes do not have a parent at the moment of compiling, there will be no merging. (This happens for example on directives with `transclude: {...}`.) 2. If the text nodes do have a parent, just removing a text node from its parent does **not** remove it from the collection/array, which means that the merged text nodes will still get compiled and linked (and possibly be displayed in the view). E.g. `['{{text1}}', '{{text2}}', '{{text3}}']` will become `['{{text1}}{{text2}}{{text3}}', '{{text2}}', '{{text3}}']`. -- This commit works around the above problems by: 1. Merging consecutive text nodes in the provided list, even if they have no parent. 2. When merging a text node, explicitly remove it from the list (unless it is a live, auto-updating list). This can nonetheless have undesirable (albeit rare) side effects by overzealously merging text nodes that are not meant to be merged (see the "BREAKING CHANGE" section below). Fixes #14924 Closes #15025 BREAKING CHANGE: **Note:** Everything described below affects **IE11 only**. Previously, consecutive text nodes would not get merged if they had no parent. They will now, which might have unexpectd side effects in the following cases: 1. Passing an array or jqLite/jQuery collection of parent-less text nodes to `$compile` directly: ```js // Assuming: var textNodes = [ document.createTextNode('{{'), document.createTextNode('"foo"'), document.createTextNode('}}') ]; var compiledNodes = $compile(textNodes)($rootScope); // Before: console.log(compiledNodes.length); // 3 console.log(compiledNodes.text()); // {{'foo'}} // After: console.log(compiledNodes.length); // 1 console.log(compiledNodes.text()); // foo // To get the old behavior, compile each node separately: var textNodes = [ document.createTextNode('{{'), document.createTextNode('"foo"'), document.createTextNode('}}') ]; var compiledNodes = angular.element(textNodes.map(function (node) { return $compile(node)($rootScope)[0]; })); ``` 2. Using multi-slot transclusion with non-consecutive, default-content text nodes (that form interpolated expressions when merged): ```js // Assuming the following component: .compoent('someThing', { template: '' transclude: { ignored: 'veryImportantContent' } }) ``` ```html {{ Nooot 'foo'}} {{ <-- Two separate 'foo'}} <-- text nodes foo <-- The text nodes were merged into `{{'foo'}}`, which was then interpolated {{ Nooot 'foo'}} {{ <-- Two separate 'foo'}} <-- nodes ``` --- src/ng/compile.js | 51 ++++++++++++++++++++------ test/ng/compileSpec.js | 83 +++++++++++++++++++++++++++++++++++++++++- 2 files changed, 122 insertions(+), 12 deletions(-) diff --git a/src/ng/compile.js b/src/ng/compile.js index e61307f3760f..dc2ecd4562c8 100644 --- a/src/ng/compile.js +++ b/src/ng/compile.js @@ -1902,12 +1902,22 @@ function $CompileProvider($provide, $$sanitizeUriProvider) { function compileNodes(nodeList, transcludeFn, $rootElement, maxPriority, ignoreDirective, previousCompileContext) { var linkFns = [], + // `nodeList` can be either an element's `.childNodes` (live NodeList) + // or a jqLite/jQuery collection or an array + notLiveList = isArray(nodeList) || (nodeList instanceof jqLite), attrs, directives, nodeLinkFn, childNodes, childLinkFn, linkFnFound, nodeLinkFnFound; + for (var i = 0; i < nodeList.length; i++) { attrs = new Attributes(); - // we must always refer to nodeList[i] since the nodes can be replaced underneath us. + // Workaround for #11781 and #14924 + if (msie === 11) { + mergeConsecutiveTextNodes(nodeList, i, notLiveList); + } + + // We must always refer to `nodeList[i]` hereafter, + // since the nodes can be replaced underneath us. directives = collectDirectives(nodeList[i], [], attrs, i === 0 ? maxPriority : undefined, ignoreDirective); @@ -1998,6 +2008,32 @@ function $CompileProvider($provide, $$sanitizeUriProvider) { } } + function mergeConsecutiveTextNodes(nodeList, idx, notLiveList) { + var node = nodeList[idx]; + var parent = node.parentNode; + var sibling; + + if (node.nodeType !== NODE_TYPE_TEXT) { + return; + } + + while (true) { + sibling = parent ? node.nextSibling : nodeList[idx + 1]; + if (!sibling || sibling.nodeType !== NODE_TYPE_TEXT) { + break; + } + + node.nodeValue = node.nodeValue + sibling.nodeValue; + + if (sibling.parentNode) { + sibling.parentNode.removeChild(sibling); + } + if (notLiveList && sibling === nodeList[idx + 1]) { + nodeList.splice(idx + 1, 1); + } + } + } + function createBoundTranscludeFn(scope, transcludeFn, previousBoundTranscludeFn) { function boundTranscludeFn(transcludedScope, cloneFn, controllers, futureParentElement, containingScope) { @@ -2107,13 +2143,6 @@ function $CompileProvider($provide, $$sanitizeUriProvider) { } break; case NODE_TYPE_TEXT: /* Text Node */ - if (msie === 11) { - // Workaround for #11781 - while (node.parentNode && node.nextSibling && node.nextSibling.nodeType === NODE_TYPE_TEXT) { - node.nodeValue = node.nodeValue + node.nextSibling.nodeValue; - node.parentNode.removeChild(node.nextSibling); - } - } addTextInterpolateDirective(directives, node.nodeValue); break; case NODE_TYPE_COMMENT: /* Comment */ @@ -2387,9 +2416,9 @@ function $CompileProvider($provide, $$sanitizeUriProvider) { var slots = createMap(); - $template = jqLite(jqLiteClone(compileNode)).contents(); - - if (isObject(directiveValue)) { + if (!isObject(directiveValue)) { + $template = jqLite(jqLiteClone(compileNode)).contents(); + } else { // We have transclusion slots, // collect them up, compile them and store their transclusion functions diff --git a/test/ng/compileSpec.js b/test/ng/compileSpec.js index 800fb1be9d27..2d3ed295a2de 100755 --- a/test/ng/compileSpec.js +++ b/test/ng/compileSpec.js @@ -3260,6 +3260,26 @@ describe('$compile', function() { })); + it('should not process text nodes merged into their sibling', inject(function($compile, $rootScope) { + var div = document.createElement('div'); + div.appendChild(document.createTextNode('1{{ value }}')); + div.appendChild(document.createTextNode('2{{ value }}')); + div.appendChild(document.createTextNode('3{{ value }}')); + + element = jqLite(div.childNodes); + + var initialWatcherCount = $rootScope.$countWatchers(); + $compile(element)($rootScope); + $rootScope.$apply('value = 0'); + var newWatcherCount = $rootScope.$countWatchers() - initialWatcherCount; + + expect(element.text()).toBe('102030'); + expect(newWatcherCount).toBe(3); + + dealoc(div); + })); + + it('should support custom start/end interpolation symbols in template and directive template', function() { module(function($interpolateProvider, $compileProvider) { @@ -8670,10 +8690,38 @@ describe('$compile', function() { element = $compile('
      ')($rootScope); expect(capturedChildCtrl).toBeTruthy(); }); - }); + // See issue https://github.com/angular/angular.js/issues/14924 + it('should not process top-level transcluded text nodes merged into their sibling', + function() { + module(function() { + directive('transclude', valueFn({ + template: '', + transclude: true, + scope: {} + })); + }); + + inject(function($compile) { + element = jqLite('
      '); + element[0].appendChild(document.createTextNode('1{{ value }}')); + element[0].appendChild(document.createTextNode('2{{ value }}')); + element[0].appendChild(document.createTextNode('3{{ value }}')); + + var initialWatcherCount = $rootScope.$countWatchers(); + $compile(element)($rootScope); + $rootScope.$apply('value = 0'); + var newWatcherCount = $rootScope.$countWatchers() - initialWatcherCount; + + expect(element.text()).toBe('102030'); + expect(newWatcherCount).toBe(3); + }); + } + ); + + // see issue https://github.com/angular/angular.js/issues/9413 describe('passing a parent bound transclude function to the link ' + 'function returned from `$compile`', function() { @@ -10136,6 +10184,39 @@ describe('$compile', function() { expect(element.children().eq(2).text()).toEqual('dorothy'); }); }); + + + // See issue https://github.com/angular/angular.js/issues/14924 + it('should not process top-level transcluded text nodes merged into their sibling', + function() { + module(function() { + directive('transclude', valueFn({ + template: '', + transclude: {}, + scope: {} + })); + }); + + inject(function($compile) { + element = jqLite('
      '); + element[0].appendChild(document.createTextNode('1{{ value }}')); + element[0].appendChild(document.createTextNode('2{{ value }}')); + element[0].appendChild(document.createTextNode('3{{ value }}')); + + var initialWatcherCount = $rootScope.$countWatchers(); + $compile(element)($rootScope); + $rootScope.$apply('value = 0'); + var newWatcherCount = $rootScope.$countWatchers() - initialWatcherCount; + + expect(element.text()).toBe('102030'); + expect(newWatcherCount).toBe(3); + + if (msie === 11) { + expect(element.find('ng-transclude').contents().length).toBe(1); + } + }); + } + ); }); From 485320129dd8a942acfcb1e9388eb09667f383b6 Mon Sep 17 00:00:00 2001 From: Martin Staffa Date: Fri, 26 Aug 2016 09:52:11 +0200 Subject: [PATCH 0126/1173] fix($compile): lower the $sce context for `src` on video, audio, source, and track Previously, video, audio, source, and track sources were $sce.RESOURCE_URL. This is not justified as no attacks (script execution) are possible through these attributes as far as we can tell. Angular2 also uses the same categorization. This change is not breaking, and uses of $sce.trustAsResourceUrl before assigning to src or ng-src attributes will just be silently ignored. This has also been given a LGTM by @mprobst via email. PR (#15039) Closes #14019 --- src/ng/compile.js | 13 +++++++---- src/ng/sce.js | 2 +- test/ng/compileSpec.js | 50 ++++++++++++++++++++++++++++++++++++++++-- 3 files changed, 58 insertions(+), 7 deletions(-) diff --git a/src/ng/compile.js b/src/ng/compile.js index dc2ecd4562c8..37e690e498b1 100644 --- a/src/ng/compile.js +++ b/src/ng/compile.js @@ -3180,13 +3180,18 @@ function $CompileProvider($provide, $$sanitizeUriProvider) { return $sce.HTML; } var tag = nodeName_(node); + // All tags with src attributes require a RESOURCE_URL value, except for + // img and various html5 media tags. + if (attrNormalizedName === 'src' || attrNormalizedName === 'ngSrc') { + if (['img', 'video', 'audio', 'source', 'track'].indexOf(tag) === -1) { + return $sce.RESOURCE_URL; + } // maction[xlink:href] can source SVG. It's not limited to . - if (attrNormalizedName === 'xlinkHref' || + } else if (attrNormalizedName === 'xlinkHref' || (tag === 'form' && attrNormalizedName === 'action') || // links can be stylesheets or imports, which can run script in the current origin - (tag === 'link' && attrNormalizedName === 'href') || - (tag !== 'img' && (attrNormalizedName === 'src' || - attrNormalizedName === 'ngSrc'))) { + (tag === 'link' && attrNormalizedName === 'href') + ) { return $sce.RESOURCE_URL; } } diff --git a/src/ng/sce.js b/src/ng/sce.js index f16aee5597a8..a530f2f379c3 100644 --- a/src/ng/sce.js +++ b/src/ng/sce.js @@ -537,7 +537,7 @@ function $SceDelegateProvider() { * | `$sce.HTML` | For HTML that's safe to source into the application. The {@link ng.directive:ngBindHtml ngBindHtml} directive uses this context for bindings. If an unsafe value is encountered and the {@link ngSanitize $sanitize} module is present this will sanitize the value instead of throwing an error. | * | `$sce.CSS` | For CSS that's safe to source into the application. Currently unused. Feel free to use it in your own directives. | * | `$sce.URL` | For URLs that are safe to follow as links. Currently unused (`

      Note that `$sce.RESOURCE_URL` makes a stronger statement about the URL than `$sce.URL` does and therefore contexts requiring values trusted for `$sce.RESOURCE_URL` can be used anywhere that values trusted for `$sce.URL` are required. | + * | `$sce.RESOURCE_URL` | For URLs that are not only safe to follow as links, but whose contents are also safe to include in your application. Examples include `ng-include`, `src` / `ngSrc` bindings for tags other than `IMG`, `VIDEO`, `AUDIO` and `SOURCE` (e.g. `IFRAME`, `OBJECT`, etc.)

      Note that `$sce.RESOURCE_URL` makes a stronger statement about the URL than `$sce.URL` does and therefore contexts requiring values trusted for `$sce.RESOURCE_URL` can be used anywhere that values trusted for `$sce.URL` are required. | * | `$sce.JS` | For JavaScript that is safe to execute in your application's context. Currently unused. Feel free to use it in your own directives. | * * ## Format of items in {@link ng.$sceDelegateProvider#resourceUrlWhitelist resourceUrlWhitelist}/{@link ng.$sceDelegateProvider#resourceUrlBlacklist Blacklist}
      diff --git a/test/ng/compileSpec.js b/test/ng/compileSpec.js index 2d3ed295a2de..0ccccb713c64 100755 --- a/test/ng/compileSpec.js +++ b/test/ng/compileSpec.js @@ -10219,8 +10219,7 @@ describe('$compile', function() { ); }); - - describe('img[src] sanitization', function() { + describe('*[src] context requirement', function() { it('should NOT require trusted values for img src', inject(function($rootScope, $compile, $sce) { element = $compile('')($rootScope); @@ -10233,6 +10232,53 @@ describe('$compile', function() { expect(element.attr('src')).toEqual('http://example.com/image2.png'); })); + // IE9 rejects the video / audio tag with "Error: Not implemented" and the source tag with + // "Unable to get value of the property 'childNodes': object is null or undefined" + if (!msie || msie > 9) { + they('should NOT require trusted values for $prop src', ['video', 'audio'], + function(tag) { + inject(function($rootScope, $compile, $sce) { + element = $compile('<' + tag + ' src="https://github.com/%7B%7BtestUrl%7D%7D">')($rootScope); + $rootScope.testUrl = 'http://example.com/image.mp4'; + $rootScope.$digest(); + expect(element.attr('src')).toEqual('http://example.com/image.mp4'); + + // But it should accept trusted values anyway. + $rootScope.testUrl = $sce.trustAsUrl('http://example.com/image2.mp4'); + $rootScope.$digest(); + expect(element.attr('src')).toEqual('http://example.com/image2.mp4'); + + // and trustedResourceUrls for retrocompatibility + $rootScope.testUrl = $sce.trustAsResourceUrl('http://example.com/image3.mp4'); + $rootScope.$digest(); + expect(element.attr('src')).toEqual('http://example.com/image3.mp4'); + }); + }); + + they('should NOT require trusted values for $prop src', ['source', 'track'], + function(tag) { + inject(function($rootScope, $compile, $sce) { + element = $compile('')($rootScope); + $rootScope.testUrl = 'http://example.com/image.mp4'; + $rootScope.$digest(); + expect(element.find(tag).attr('src')).toEqual('http://example.com/image.mp4'); + + // But it should accept trusted values anyway. + $rootScope.testUrl = $sce.trustAsUrl('http://example.com/image2.mp4'); + $rootScope.$digest(); + expect(element.find(tag).attr('src')).toEqual('http://example.com/image2.mp4'); + + // and trustedResourceUrls for retrocompatibility + $rootScope.testUrl = $sce.trustAsResourceUrl('http://example.com/image3.mp4'); + $rootScope.$digest(); + expect(element.find(tag).attr('src')).toEqual('http://example.com/image3.mp4'); + }); + }); + } + }); + + describe('img[src] sanitization', function() { + it('should not sanitize attributes other than src', inject(function($compile, $rootScope) { element = $compile('')($rootScope); $rootScope.testUrl = 'javascript:doEvilStuff()'; From 7fb81ecf12eccdb58daccee9f61970ce70311f0c Mon Sep 17 00:00:00 2001 From: Martin Staffa Date: Fri, 26 Aug 2016 09:55:16 +0200 Subject: [PATCH 0127/1173] Revert "fix($compile): lower the $sce context for `src` on video, audio, source, and track" This reverts commit 485320129dd8a942acfcb1e9388eb09667f383b6, because I did not author most of this commit. I merged via Github and for some reason it used the last commit in a series of commits to establish the author. --- src/ng/compile.js | 13 ++++------- src/ng/sce.js | 2 +- test/ng/compileSpec.js | 50 ++---------------------------------------- 3 files changed, 7 insertions(+), 58 deletions(-) diff --git a/src/ng/compile.js b/src/ng/compile.js index 37e690e498b1..dc2ecd4562c8 100644 --- a/src/ng/compile.js +++ b/src/ng/compile.js @@ -3180,18 +3180,13 @@ function $CompileProvider($provide, $$sanitizeUriProvider) { return $sce.HTML; } var tag = nodeName_(node); - // All tags with src attributes require a RESOURCE_URL value, except for - // img and various html5 media tags. - if (attrNormalizedName === 'src' || attrNormalizedName === 'ngSrc') { - if (['img', 'video', 'audio', 'source', 'track'].indexOf(tag) === -1) { - return $sce.RESOURCE_URL; - } // maction[xlink:href] can source SVG. It's not limited to . - } else if (attrNormalizedName === 'xlinkHref' || + if (attrNormalizedName === 'xlinkHref' || (tag === 'form' && attrNormalizedName === 'action') || // links can be stylesheets or imports, which can run script in the current origin - (tag === 'link' && attrNormalizedName === 'href') - ) { + (tag === 'link' && attrNormalizedName === 'href') || + (tag !== 'img' && (attrNormalizedName === 'src' || + attrNormalizedName === 'ngSrc'))) { return $sce.RESOURCE_URL; } } diff --git a/src/ng/sce.js b/src/ng/sce.js index a530f2f379c3..f16aee5597a8 100644 --- a/src/ng/sce.js +++ b/src/ng/sce.js @@ -537,7 +537,7 @@ function $SceDelegateProvider() { * | `$sce.HTML` | For HTML that's safe to source into the application. The {@link ng.directive:ngBindHtml ngBindHtml} directive uses this context for bindings. If an unsafe value is encountered and the {@link ngSanitize $sanitize} module is present this will sanitize the value instead of throwing an error. | * | `$sce.CSS` | For CSS that's safe to source into the application. Currently unused. Feel free to use it in your own directives. | * | `$sce.URL` | For URLs that are safe to follow as links. Currently unused (`
      Note that `$sce.RESOURCE_URL` makes a stronger statement about the URL than `$sce.URL` does and therefore contexts requiring values trusted for `$sce.RESOURCE_URL` can be used anywhere that values trusted for `$sce.URL` are required. | + * | `$sce.RESOURCE_URL` | For URLs that are not only safe to follow as links, but whose contents are also safe to include in your application. Examples include `ng-include`, `src` / `ngSrc` bindings for tags other than `IMG` (e.g. `IFRAME`, `OBJECT`, etc.)

      Note that `$sce.RESOURCE_URL` makes a stronger statement about the URL than `$sce.URL` does and therefore contexts requiring values trusted for `$sce.RESOURCE_URL` can be used anywhere that values trusted for `$sce.URL` are required. | * | `$sce.JS` | For JavaScript that is safe to execute in your application's context. Currently unused. Feel free to use it in your own directives. | * * ## Format of items in {@link ng.$sceDelegateProvider#resourceUrlWhitelist resourceUrlWhitelist}/{@link ng.$sceDelegateProvider#resourceUrlBlacklist Blacklist}
      diff --git a/test/ng/compileSpec.js b/test/ng/compileSpec.js index 0ccccb713c64..2d3ed295a2de 100755 --- a/test/ng/compileSpec.js +++ b/test/ng/compileSpec.js @@ -10219,7 +10219,8 @@ describe('$compile', function() { ); }); - describe('*[src] context requirement', function() { + + describe('img[src] sanitization', function() { it('should NOT require trusted values for img src', inject(function($rootScope, $compile, $sce) { element = $compile('')($rootScope); @@ -10232,53 +10233,6 @@ describe('$compile', function() { expect(element.attr('src')).toEqual('http://example.com/image2.png'); })); - // IE9 rejects the video / audio tag with "Error: Not implemented" and the source tag with - // "Unable to get value of the property 'childNodes': object is null or undefined" - if (!msie || msie > 9) { - they('should NOT require trusted values for $prop src', ['video', 'audio'], - function(tag) { - inject(function($rootScope, $compile, $sce) { - element = $compile('<' + tag + ' src="https://github.com/%7B%7BtestUrl%7D%7D">')($rootScope); - $rootScope.testUrl = 'http://example.com/image.mp4'; - $rootScope.$digest(); - expect(element.attr('src')).toEqual('http://example.com/image.mp4'); - - // But it should accept trusted values anyway. - $rootScope.testUrl = $sce.trustAsUrl('http://example.com/image2.mp4'); - $rootScope.$digest(); - expect(element.attr('src')).toEqual('http://example.com/image2.mp4'); - - // and trustedResourceUrls for retrocompatibility - $rootScope.testUrl = $sce.trustAsResourceUrl('http://example.com/image3.mp4'); - $rootScope.$digest(); - expect(element.attr('src')).toEqual('http://example.com/image3.mp4'); - }); - }); - - they('should NOT require trusted values for $prop src', ['source', 'track'], - function(tag) { - inject(function($rootScope, $compile, $sce) { - element = $compile('')($rootScope); - $rootScope.testUrl = 'http://example.com/image.mp4'; - $rootScope.$digest(); - expect(element.find(tag).attr('src')).toEqual('http://example.com/image.mp4'); - - // But it should accept trusted values anyway. - $rootScope.testUrl = $sce.trustAsUrl('http://example.com/image2.mp4'); - $rootScope.$digest(); - expect(element.find(tag).attr('src')).toEqual('http://example.com/image2.mp4'); - - // and trustedResourceUrls for retrocompatibility - $rootScope.testUrl = $sce.trustAsResourceUrl('http://example.com/image3.mp4'); - $rootScope.$digest(); - expect(element.find(tag).attr('src')).toEqual('http://example.com/image3.mp4'); - }); - }); - } - }); - - describe('img[src] sanitization', function() { - it('should not sanitize attributes other than src', inject(function($compile, $rootScope) { element = $compile('')($rootScope); $rootScope.testUrl = 'javascript:doEvilStuff()'; From ad9a99d6895e1c07c950f7141bb0edfc1d4aaf61 Mon Sep 17 00:00:00 2001 From: Raphael Jamet Date: Fri, 12 Feb 2016 14:01:10 +0100 Subject: [PATCH 0128/1173] fix($compile): lower the $sce context for src on video, audio, and track. Previously, video, audio, and track sources were $sce.RESOURCE_URL. This is not justified as no attacks are possible through these attributes as far as I can tell. This change is not breaking, and uses of $sce.trustAsResourceUrl before assigning to src or ng-src attributes will just be silently ignored. --- src/ng/compile.js | 13 +++++++---- src/ng/sce.js | 2 +- test/ng/compileSpec.js | 50 ++++++++++++++++++++++++++++++++++++++++-- 3 files changed, 58 insertions(+), 7 deletions(-) diff --git a/src/ng/compile.js b/src/ng/compile.js index dc2ecd4562c8..37e690e498b1 100644 --- a/src/ng/compile.js +++ b/src/ng/compile.js @@ -3180,13 +3180,18 @@ function $CompileProvider($provide, $$sanitizeUriProvider) { return $sce.HTML; } var tag = nodeName_(node); + // All tags with src attributes require a RESOURCE_URL value, except for + // img and various html5 media tags. + if (attrNormalizedName === 'src' || attrNormalizedName === 'ngSrc') { + if (['img', 'video', 'audio', 'source', 'track'].indexOf(tag) === -1) { + return $sce.RESOURCE_URL; + } // maction[xlink:href] can source SVG. It's not limited to . - if (attrNormalizedName === 'xlinkHref' || + } else if (attrNormalizedName === 'xlinkHref' || (tag === 'form' && attrNormalizedName === 'action') || // links can be stylesheets or imports, which can run script in the current origin - (tag === 'link' && attrNormalizedName === 'href') || - (tag !== 'img' && (attrNormalizedName === 'src' || - attrNormalizedName === 'ngSrc'))) { + (tag === 'link' && attrNormalizedName === 'href') + ) { return $sce.RESOURCE_URL; } } diff --git a/src/ng/sce.js b/src/ng/sce.js index f16aee5597a8..78d21981619b 100644 --- a/src/ng/sce.js +++ b/src/ng/sce.js @@ -537,7 +537,7 @@ function $SceDelegateProvider() { * | `$sce.HTML` | For HTML that's safe to source into the application. The {@link ng.directive:ngBindHtml ngBindHtml} directive uses this context for bindings. If an unsafe value is encountered and the {@link ngSanitize $sanitize} module is present this will sanitize the value instead of throwing an error. | * | `$sce.CSS` | For CSS that's safe to source into the application. Currently unused. Feel free to use it in your own directives. | * | `$sce.URL` | For URLs that are safe to follow as links. Currently unused (`
      Note that `$sce.RESOURCE_URL` makes a stronger statement about the URL than `$sce.URL` does and therefore contexts requiring values trusted for `$sce.RESOURCE_URL` can be used anywhere that values trusted for `$sce.URL` are required. | + * | `$sce.RESOURCE_URL` | For URLs that are not only safe to follow as links, but whose contents are also safe to include in your application. Examples include `ng-include`, `src` / `ngSrc` bindings for tags other than `IMG`, `VIDEO`, `AUDIO`, `SOURCE`, and `TRACK` (e.g. `IFRAME`, `OBJECT`, etc.)

      Note that `$sce.RESOURCE_URL` makes a stronger statement about the URL than `$sce.URL` does and therefore contexts requiring values trusted for `$sce.RESOURCE_URL` can be used anywhere that values trusted for `$sce.URL` are required. | * | `$sce.JS` | For JavaScript that is safe to execute in your application's context. Currently unused. Feel free to use it in your own directives. | * * ## Format of items in {@link ng.$sceDelegateProvider#resourceUrlWhitelist resourceUrlWhitelist}/{@link ng.$sceDelegateProvider#resourceUrlBlacklist Blacklist}
      diff --git a/test/ng/compileSpec.js b/test/ng/compileSpec.js index 2d3ed295a2de..0ccccb713c64 100755 --- a/test/ng/compileSpec.js +++ b/test/ng/compileSpec.js @@ -10219,8 +10219,7 @@ describe('$compile', function() { ); }); - - describe('img[src] sanitization', function() { + describe('*[src] context requirement', function() { it('should NOT require trusted values for img src', inject(function($rootScope, $compile, $sce) { element = $compile('')($rootScope); @@ -10233,6 +10232,53 @@ describe('$compile', function() { expect(element.attr('src')).toEqual('http://example.com/image2.png'); })); + // IE9 rejects the video / audio tag with "Error: Not implemented" and the source tag with + // "Unable to get value of the property 'childNodes': object is null or undefined" + if (!msie || msie > 9) { + they('should NOT require trusted values for $prop src', ['video', 'audio'], + function(tag) { + inject(function($rootScope, $compile, $sce) { + element = $compile('<' + tag + ' src="https://github.com/%7B%7BtestUrl%7D%7D">')($rootScope); + $rootScope.testUrl = 'http://example.com/image.mp4'; + $rootScope.$digest(); + expect(element.attr('src')).toEqual('http://example.com/image.mp4'); + + // But it should accept trusted values anyway. + $rootScope.testUrl = $sce.trustAsUrl('http://example.com/image2.mp4'); + $rootScope.$digest(); + expect(element.attr('src')).toEqual('http://example.com/image2.mp4'); + + // and trustedResourceUrls for retrocompatibility + $rootScope.testUrl = $sce.trustAsResourceUrl('http://example.com/image3.mp4'); + $rootScope.$digest(); + expect(element.attr('src')).toEqual('http://example.com/image3.mp4'); + }); + }); + + they('should NOT require trusted values for $prop src', ['source', 'track'], + function(tag) { + inject(function($rootScope, $compile, $sce) { + element = $compile('')($rootScope); + $rootScope.testUrl = 'http://example.com/image.mp4'; + $rootScope.$digest(); + expect(element.find(tag).attr('src')).toEqual('http://example.com/image.mp4'); + + // But it should accept trusted values anyway. + $rootScope.testUrl = $sce.trustAsUrl('http://example.com/image2.mp4'); + $rootScope.$digest(); + expect(element.find(tag).attr('src')).toEqual('http://example.com/image2.mp4'); + + // and trustedResourceUrls for retrocompatibility + $rootScope.testUrl = $sce.trustAsResourceUrl('http://example.com/image3.mp4'); + $rootScope.$digest(); + expect(element.find(tag).attr('src')).toEqual('http://example.com/image3.mp4'); + }); + }); + } + }); + + describe('img[src] sanitization', function() { + it('should not sanitize attributes other than src', inject(function($compile, $rootScope) { element = $compile('')($rootScope); $rootScope.testUrl = 'javascript:doEvilStuff()'; From 2785ad72599ca5f9558a116baecd83a5bebe3292 Mon Sep 17 00:00:00 2001 From: Martin Staffa Date: Fri, 29 Jul 2016 12:54:11 +0200 Subject: [PATCH 0129/1173] fix(select, ngOptions): make the handling of unknown / empty options consistent - when the model does not match any option, the select generates an unknown option with the value '? hashedModelVal ?' (select) or simply '?' (ngOptions) and inserts it into the select. This option is then auto-selected by the browser. Once the user selects an option / the application sets a matching model, the unknown option is removed from the select. It is therefore not user-selectable. Alternatively, the application can provide an option with the value='', the so-called empty option. The empty option takes over the role of the unknown option, in that it is selected when there's no matching model, but it is not removed when a option and model match, and it can also be selected by the user. The empty option has the value='' and sets the model to if selected. Previously, these concepts where a bit mushy, especially in ngOptions. This fix now delegates the bulk of the work to the selectCtrl, as the concept of unknown and empty option are the same for both directives. Only the generation of the empty option is different. The commit also adjusts a test for an officially unsupported use-case: multiple empty options. The new behavior is that the empty option that is registered last is used. The other one is still present. Otherwise, this behavior is unspecified, and the docs are clear that only a single empty option is allowed. We support dynamically generated empty options, but not multiple ones. I've left the test to highlight that this might be someone's use case, and the we are aware of it. --- src/ng/directive/ngOptions.js | 64 ++++++++------------------ src/ng/directive/select.js | 44 +++++++++++++++--- test/helpers/matchers.js | 41 +++++++++++++++++ test/ng/directive/ngOptionsSpec.js | 72 +++++++++++------------------- test/ng/directive/selectSpec.js | 20 +++++---- 5 files changed, 134 insertions(+), 107 deletions(-) diff --git a/src/ng/directive/ngOptions.js b/src/ng/directive/ngOptions.js index 16a23b18ca17..926ee5dc5eea 100644 --- a/src/ng/directive/ngOptions.js +++ b/src/ng/directive/ngOptions.js @@ -418,15 +418,14 @@ var ngOptionsDirective = ['$compile', '$document', '$parse', function($compile, // The emptyOption allows the application developer to provide their own custom "empty" // option when the viewValue does not match any of the option values. - var emptyOption; for (var i = 0, children = selectElement.children(), ii = children.length; i < ii; i++) { if (children[i].value === '') { - emptyOption = children.eq(i); + selectCtrl.emptyOption = children.eq(i); break; } } - var providedEmptyOption = !!emptyOption; + var providedEmptyOption = !!selectCtrl.emptyOption; var unknownOption = jqLite(optionTemplate.cloneNode(false)); unknownOption.val('?'); @@ -438,32 +437,9 @@ var ngOptionsDirective = ['$compile', '$document', '$parse', function($compile, // we only need to create it once. var listFragment = $document[0].createDocumentFragment(); - var renderEmptyOption = function() { - if (!providedEmptyOption) { - selectElement.prepend(emptyOption); - } - selectElement.val(''); - emptyOption.prop('selected', true); // needed for IE - emptyOption.attr('selected', true); - }; - - var removeEmptyOption = function() { - if (!providedEmptyOption) { - emptyOption.remove(); - } else { - emptyOption.removeAttr('selected'); - } - }; - - var renderUnknownOption = function() { - selectElement.prepend(unknownOption); - selectElement.val('?'); - unknownOption.prop('selected', true); // needed for IE - unknownOption.attr('selected', true); - }; - - var removeUnknownOption = function() { - unknownOption.remove(); + // Overwrite the implementation. ngOptions doesn't use hashes + selectCtrl.generateUnknownOptionValue = function(val) { + return '?'; }; // Update the controller methods for multiple selectable options @@ -484,8 +460,8 @@ var ngOptionsDirective = ['$compile', '$document', '$parse', function($compile, // set always if (selectElement[0].value !== option.selectValue) { - removeUnknownOption(); - removeEmptyOption(); + selectCtrl.removeUnknownOption(); + selectCtrl.unselectEmptyOption(); selectElement[0].value = option.selectValue; option.element.selected = true; @@ -493,12 +469,13 @@ var ngOptionsDirective = ['$compile', '$document', '$parse', function($compile, option.element.setAttribute('selected', 'selected'); } else { - if (value === null || providedEmptyOption) { - removeUnknownOption(); - renderEmptyOption(); + + if (providedEmptyOption) { + selectCtrl.selectEmptyOption(); + } else if (selectCtrl.unknownOption.parent().length) { + selectCtrl.updateUnknownOption(value); } else { - removeEmptyOption(); - renderUnknownOption(); + selectCtrl.renderUnknownOption(value); } } }; @@ -508,8 +485,8 @@ var ngOptionsDirective = ['$compile', '$document', '$parse', function($compile, var selectedOption = options.selectValueMap[selectElement.val()]; if (selectedOption && !selectedOption.disabled) { - removeEmptyOption(); - removeUnknownOption(); + selectCtrl.unselectEmptyOption(); + selectCtrl.removeUnknownOption(); return options.getViewValueFromOption(selectedOption); } return null; @@ -575,21 +552,18 @@ var ngOptionsDirective = ['$compile', '$document', '$parse', function($compile, } } - if (providedEmptyOption) { // we need to remove it before calling selectElement.empty() because otherwise IE will // remove the label from the element. wtf? - emptyOption.remove(); + selectCtrl.emptyOption.remove(); // compile the element since there might be bindings in it - $compile(emptyOption)(scope); + $compile(selectCtrl.emptyOption)(scope); // remove the class, which is added automatically because we recompile the element and it // becomes the compilation root - emptyOption.removeClass('ng-scope'); - } else { - emptyOption = jqLite(optionTemplate.cloneNode(false)); + selectCtrl.emptyOption.removeClass('ng-scope'); } selectElement.empty(); @@ -651,7 +625,7 @@ var ngOptionsDirective = ['$compile', '$document', '$parse', function($compile, // Ensure that the empty option is always there if it was explicitly provided if (providedEmptyOption) { - selectElement.prepend(emptyOption); + selectElement.prepend(selectCtrl.emptyOption); } options.items.forEach(function addOption(option) { diff --git a/src/ng/directive/select.js b/src/ng/directive/select.js index cae1184e2b0b..21dce4a28532 100644 --- a/src/ng/directive/select.js +++ b/src/ng/directive/select.js @@ -31,28 +31,57 @@ var SelectController = // We can't just jqLite('' + - '' + - ''); + '' + + '' + + ''); scope.$digest(); expect(element).toEqualSelect([unknownValue('x')], ''); @@ -390,19 +392,19 @@ describe('select', function() { expect(element.find('option').eq(0).text()).toBe('--static-select--'); scope.dynamicOptions = [ - { val: '', display: '--dynamic-select--' }, - { val: 'x', display: 'robot x' }, - { val: 'y', display: 'robot y' } + { val: '', display: '--dynamic-select--' }, + { val: 'x', display: 'robot x' }, + { val: 'y', display: 'robot y' } ]; scope.$digest(); - expect(element).toEqualSelect([''], '', 'x', 'y'); - + expect(element).toEqualSelect('', [''], 'x', 'y'); scope.dynamicOptions = []; scope.$digest(); expect(element).toEqualSelect(['']); }); + it('should select the empty option when model is undefined', function() { compile('' + + '' + + '' + + ''); + + scope.$digest(); + + var options = element.find('option'); + expect(options[0]).toBeMarkedAsSelected(); + expect(options[1]).not.toBeMarkedAsSelected(); + expect(options[2]).not.toBeMarkedAsSelected(); + + scope.selected = 'a'; + scope.$digest(); + + options = element.find('option'); + expect(options.length).toBe(2); + expect(options[0]).toBeMarkedAsSelected(); + expect(options[1]).not.toBeMarkedAsSelected(); + + scope.selected = 'b'; + scope.$digest(); + + options = element.find('option'); + expect(options[0]).not.toBeMarkedAsSelected(); + expect(options[1]).toBeMarkedAsSelected(); + + scope.selected = 'no match'; + scope.$digest(); + + options = element.find('option'); + expect(options[0]).toBeMarkedAsSelected(); + expect(options[1]).not.toBeMarkedAsSelected(); + expect(options[2]).not.toBeMarkedAsSelected(); + }); + describe('empty option', function() { it('should allow empty option to be added and removed dynamically', function() { @@ -525,6 +563,40 @@ describe('select', function() { expect(element).toEqualSelect([''], 'wallee'); }); }); + + it('should add/remove the "selected" attribute when the empty option is selected/unselected', function() { + compile(''); + + scope.$digest(); + + var options = element.find('option'); + expect(options.length).toBe(3); + expect(options[0]).toBeMarkedAsSelected(); + expect(options[1]).not.toBeMarkedAsSelected(); + expect(options[2]).not.toBeMarkedAsSelected(); + + scope.selected = 'a'; + scope.$digest(); + + options = element.find('option'); + expect(options.length).toBe(3); + expect(options[0]).not.toBeMarkedAsSelected(); + expect(options[1]).toBeMarkedAsSelected(); + expect(options[2]).not.toBeMarkedAsSelected(); + + scope.selected = 'no match'; + scope.$digest(); + + options = element.find('option'); + expect(options[0]).toBeMarkedAsSelected(); + expect(options[1]).not.toBeMarkedAsSelected(); + expect(options[2]).not.toBeMarkedAsSelected(); + }); + }); From e3a378e7a329f60f6b48517f83a4f4c9efecb056 Mon Sep 17 00:00:00 2001 From: Georgios Kalpakas Date: Fri, 26 Aug 2016 19:36:22 +0300 Subject: [PATCH 0131/1173] feat($resource): pass `status`/`statusText` to success callbacks Fixes #8341 Closes #8841 PR (#14836) --- src/ngResource/resource.js | 8 ++--- test/ngResource/resourceSpec.js | 59 +++++++++++++++++++++++++++++++++ 2 files changed, 63 insertions(+), 4 deletions(-) diff --git a/src/ngResource/resource.js b/src/ngResource/resource.js index 262518d0a7a4..ca62575d98a4 100644 --- a/src/ngResource/resource.js +++ b/src/ngResource/resource.js @@ -242,9 +242,9 @@ function shallowClearAndCopy(src, dst) { * - non-GET instance actions: `instance.$action([parameters], [success], [error])` * * - * Success callback is called with (value, responseHeaders) arguments, where the value is - * the populated resource instance or collection object. The error callback is called - * with (httpResponse) argument. + * Success callback is called with (value (Object|Array), responseHeaders (Function), + * status (number), statusText (string)) arguments, where the value is the populated resource + * instance or collection object. The error callback is called with (httpResponse) argument. * * Class actions return empty instance (with additional properties below). * Instance actions return promise of the action. @@ -777,7 +777,7 @@ angular.module('ngResource', ['ng']). promise = promise.then( function(response) { var value = responseInterceptor(response); - (success || noop)(value, response.headers); + (success || noop)(value, response.headers, response.status, response.statusText); return value; }, (hasError || hasResponseErrorInterceptor) ? diff --git a/test/ngResource/resourceSpec.js b/test/ngResource/resourceSpec.js index 7a142a43f7b2..37a182da44b8 100644 --- a/test/ngResource/resourceSpec.js +++ b/test/ngResource/resourceSpec.js @@ -1124,6 +1124,65 @@ describe('basic usage', function() { }); + describe('success mode', function() { + it('should call the success callback (as 1st argument) on 2xx responses', function() { + var instance, headers, status, statusText; + var successCb = jasmine.createSpy('successCb').and.callFake(function(d, h, s, t) { + expect(d).toBe(instance); + expect(h()).toEqual(jasmine.objectContaining(headers)); + expect(s).toBe(status); + expect(t).toBe(statusText); + }); + + instance = CreditCard.get(successCb); + headers = {foo: 'bar'}; + status = 200; + statusText = 'OK'; + $httpBackend.expect('GET', '/CreditCard').respond(status, {}, headers, statusText); + $httpBackend.flush(); + + expect(successCb).toHaveBeenCalledOnce(); + + instance = CreditCard.get(successCb); + headers = {baz: 'qux'}; + status = 299; + statusText = 'KO'; + $httpBackend.expect('GET', '/CreditCard').respond(status, {}, headers, statusText); + $httpBackend.flush(); + + expect(successCb).toHaveBeenCalledTimes(2); + }); + + + it('should call the success callback (as 2nd argument) on 2xx responses', function() { + var instance, headers, status, statusText; + var successCb = jasmine.createSpy('successCb').and.callFake(function(d, h, s, t) { + expect(d).toBe(instance); + expect(h()).toEqual(jasmine.objectContaining(headers)); + expect(s).toBe(status); + expect(t).toBe(statusText); + }); + + instance = CreditCard.get({id: 123}, successCb); + headers = {foo: 'bar'}; + status = 200; + statusText = 'OK'; + $httpBackend.expect('GET', '/CreditCard/123').respond(status, {}, headers, statusText); + $httpBackend.flush(); + + expect(successCb).toHaveBeenCalledOnce(); + + instance = CreditCard.get({id: 456}, successCb); + headers = {baz: 'qux'}; + status = 299; + statusText = 'KO'; + $httpBackend.expect('GET', '/CreditCard/456').respond(status, {}, headers, statusText); + $httpBackend.flush(); + + expect(successCb).toHaveBeenCalledTimes(2); + }); + }); + describe('failure mode', function() { var ERROR_CODE = 500, ERROR_RESPONSE = 'Server Error', From 53a3bf6634600c3aeff092eacc35edf399b27aec Mon Sep 17 00:00:00 2001 From: Martin Staffa Date: Sun, 28 Aug 2016 16:53:08 +0200 Subject: [PATCH 0132/1173] feat($compile): throw error when directive name or factory fn is invalid Closes: #15056 PR (#15057) --- src/ng/compile.js | 1 + test/ng/compileSpec.js | 19 +++++++++++++++++++ 2 files changed, 20 insertions(+) diff --git a/src/ng/compile.js b/src/ng/compile.js index 37e690e498b1..47fc44c2e053 100644 --- a/src/ng/compile.js +++ b/src/ng/compile.js @@ -1087,6 +1087,7 @@ function $CompileProvider($provide, $$sanitizeUriProvider) { * @returns {ng.$compileProvider} Self for chaining. */ this.directive = function registerDirective(name, directiveFactory) { + assertArg(name, 'name'); assertNotHasOwnProperty(name, 'directive'); if (isString(name)) { assertValidDirectiveName(name); diff --git a/test/ng/compileSpec.js b/test/ng/compileSpec.js index 0ccccb713c64..4c57925ec5a1 100755 --- a/test/ng/compileSpec.js +++ b/test/ng/compileSpec.js @@ -214,6 +214,7 @@ describe('$compile', function() { }); inject(function($compile) {}); }); + it('should throw an exception if a directive name has leading or trailing whitespace', function() { module(function() { function assertLeadingOrTrailingWhitespaceInDirectiveName(name) { @@ -230,6 +231,24 @@ describe('$compile', function() { inject(function($compile) {}); }); + it('should throw an exception if the directive name is not defined', function() { + module(function() { + expect(function() { + directive(); + }).toThrowMinErr('ng','areq'); + }); + inject(function($compile) {}); + }); + + it('should throw an exception if the directive factory is not defined', function() { + module(function() { + expect(function() { + directive('myDir'); + }).toThrowMinErr('ng','areq'); + }); + inject(function($compile) {}); + }); + it('should preserve context within declaration', function() { module(function() { directive('ff', function(log) { From 1e1fbc75f5e20e8541f517a5cf6f30f8f2eed53f Mon Sep 17 00:00:00 2001 From: Jason Bedard Date: Tue, 30 Aug 2016 13:45:33 -0700 Subject: [PATCH 0133/1173] fix($compile): disallow linking the same element more then once Previously the following would invoke the element link function multiple times, causing unknown and potentially buggy results: var link = $compile(html); link(scope); link(scope); This was always unsupported. Now this throws a multilink error. PR (#13422) --- docs/content/error/$compile/multilink.ngdoc | 27 +++++++++++++++++++ src/ng/compile.js | 7 +++++ test/ng/compileSpec.js | 29 +++++++++++++++++++-- 3 files changed, 61 insertions(+), 2 deletions(-) create mode 100644 docs/content/error/$compile/multilink.ngdoc diff --git a/docs/content/error/$compile/multilink.ngdoc b/docs/content/error/$compile/multilink.ngdoc new file mode 100644 index 000000000000..6404ec04f69a --- /dev/null +++ b/docs/content/error/$compile/multilink.ngdoc @@ -0,0 +1,27 @@ +@ngdoc error +@name $compile:multilink +@fullName Linking Element Multiple Times +@description + +This error occurs when a single element is linked more then once. + +For example, if an element is compiled and linked twice without cloning: +``` + var linker = $compile(template); + linker($scope); //=> ok + linker($scope); //=> multilink error +``` + +Linking an element as a clone multiple times is ok: +``` + var linker = $compile(template); + linker($scope, function() { ... }); //=> ok + linker($scope, function() { ... }); //=> ok +``` + +However once an element has been linked it can not be re-linked as a clone: +``` + var linker = $compile(template); + linker($scope); //=> ok + linker($scope, function() { ... }); //=> multilink error +``` \ No newline at end of file diff --git a/src/ng/compile.js b/src/ng/compile.js index 47fc44c2e053..6debbaa366e1 100644 --- a/src/ng/compile.js +++ b/src/ng/compile.js @@ -1817,6 +1817,9 @@ function $CompileProvider($provide, $$sanitizeUriProvider) { compile.$$addScopeClass($compileNodes); var namespace = null; return function publicLinkFn(scope, cloneConnectFn, options) { + if (!$compileNodes) { + throw $compileMinErr('multilink', 'This element has already been linked.'); + } assertArg(scope, 'scope'); if (previousCompileContext && previousCompileContext.needsNewScope) { @@ -1871,6 +1874,10 @@ function $CompileProvider($provide, $$sanitizeUriProvider) { if (cloneConnectFn) cloneConnectFn($linkNode, scope); if (compositeLinkFn) compositeLinkFn(scope, $linkNode, $linkNode, parentBoundTranscludeFn); + + if (!cloneConnectFn) { + $compileNodes = compositeLinkFn = null; + } return $linkNode; }; } diff --git a/test/ng/compileSpec.js b/test/ng/compileSpec.js index 4c57925ec5a1..b0998f24dc27 100755 --- a/test/ng/compileSpec.js +++ b/test/ng/compileSpec.js @@ -3631,6 +3631,14 @@ describe('$compile', function() { expect(element.text()).toBe('3'); }); }); + + it('should throw multilink error when linking the same element more then once', function() { + var linker = $compile('
      '); + linker($rootScope).remove(); + expect(function() { + linker($rootScope); + }).toThrowMinErr('$compile', 'multilink', 'This element has already been linked.'); + }); }); @@ -7971,6 +7979,22 @@ describe('$compile', function() { }); }); + it('should throw if a transcluded node is transcluded again', function() { + module(function() { + directive('trans', valueFn({ + transclude: true, + link: function(scope, element, attr, ctrl, $transclude) { + $transclude(); + $transclude(); + } + })); + }); + inject(function($rootScope, $compile) { + expect(function() { + $compile('')($rootScope); + }).toThrowMinErr('$compile', 'multilink', 'This element has already been linked.'); + }); + }); it('should not leak if two "element" transclusions are on the same element (with debug info)', function() { if (jQuery) { @@ -8113,7 +8137,7 @@ describe('$compile', function() { '
      ' + '
      ' + '
      '); - element = template($rootScope); + element = template($rootScope, noop); $rootScope.$digest(); $timeout.flush(); $httpBackend.flush(); @@ -8123,10 +8147,11 @@ describe('$compile', function() { $templateCache.removeAll(); var destroyedScope = $rootScope.$new(); destroyedScope.$destroy(); - var clone = template(destroyedScope); + var clone = template(destroyedScope, noop); $rootScope.$digest(); $timeout.flush(); expect(linkFn).not.toHaveBeenCalled(); + clone.remove(); }); }); From 11f2731f72e932615e8ce15e6a73f4ac808cc7e7 Mon Sep 17 00:00:00 2001 From: Jason Bedard Date: Tue, 30 Aug 2016 13:48:46 -0700 Subject: [PATCH 0134/1173] perf($compile): validate directive.restrict property on directive init This allows the removal of try/catch from addDirective to avoid V8 deopt. Previously the directive.restrict property was not validated. This would potentially cause exceptions on each compilation of the directive requiring a try/catch and potentially causing repeated errors. New validation when directive.restrict is specified: * must be a string * must contain at least one valid character (E, A, C, M) Cases which previously silently failed (now throw an error): * values with an indexOf method (such as strings, arrays) which returned returned -1 for all valid restrict characters Cases which previously worked unintentionally (now throw an error): * arrays with single-character strings of valid restrict characters PR (#13263) --- docs/content/error/$compile/badrestrict.ngdoc | 18 ++++++++ src/ng/compile.js | 43 +++++++++++-------- test/ng/compileSpec.js | 32 ++++++++++++++ 3 files changed, 76 insertions(+), 17 deletions(-) create mode 100644 docs/content/error/$compile/badrestrict.ngdoc diff --git a/docs/content/error/$compile/badrestrict.ngdoc b/docs/content/error/$compile/badrestrict.ngdoc new file mode 100644 index 000000000000..7c4eb41a1984 --- /dev/null +++ b/docs/content/error/$compile/badrestrict.ngdoc @@ -0,0 +1,18 @@ +@ngdoc error +@name $compile:badrestrict +@fullName Invalid Directive Restrict +@description + +This error occurs when the restrict property of a directive is not valid. + +The directive restrict property must be a string including one of more of the following characters: +* E (element) +* A (attribute) +* C (class) +* M (comment) + +For example: +```javascript +restrict: 'E' +restrict: 'EAC' +``` \ No newline at end of file diff --git a/src/ng/compile.js b/src/ng/compile.js index 6debbaa366e1..30f40539a9bc 100644 --- a/src/ng/compile.js +++ b/src/ng/compile.js @@ -1071,6 +1071,17 @@ function $CompileProvider($provide, $$sanitizeUriProvider) { return require; } + function getDirectiveRestrict(restrict, name) { + if (restrict && !(isString(restrict) && /[EACM]/.test(restrict))) { + throw $compileMinErr('badrestrict', + 'Restrict property \'{0}\' of directive \'{1}\' is invalid', + restrict, + name); + } + + return restrict || 'EA'; + } + /** * @ngdoc method * @name $compileProvider#directive @@ -1109,7 +1120,7 @@ function $CompileProvider($provide, $$sanitizeUriProvider) { directive.index = index; directive.name = directive.name || name; directive.require = getDirectiveRequire(directive); - directive.restrict = directive.restrict || 'EA'; + directive.restrict = getDirectiveRestrict(directive.restrict, name); directive.$$moduleName = directiveFactory.$$moduleName; directives.push(directive); } catch (e) { @@ -2912,24 +2923,22 @@ function $CompileProvider($provide, $$sanitizeUriProvider) { if (hasDirectives.hasOwnProperty(name)) { for (var directive, directives = $injector.get(name + Suffix), i = 0, ii = directives.length; i < ii; i++) { - try { - directive = directives[i]; - if ((isUndefined(maxPriority) || maxPriority > directive.priority) && - directive.restrict.indexOf(location) !== -1) { - if (startAttrName) { - directive = inherit(directive, {$$start: startAttrName, $$end: endAttrName}); - } - if (!directive.$$bindings) { - var bindings = directive.$$bindings = - parseDirectiveBindings(directive, directive.name); - if (isObject(bindings.isolateScope)) { - directive.$$isolateBindings = bindings.isolateScope; - } + directive = directives[i]; + if ((isUndefined(maxPriority) || maxPriority > directive.priority) && + directive.restrict.indexOf(location) !== -1) { + if (startAttrName) { + directive = inherit(directive, {$$start: startAttrName, $$end: endAttrName}); + } + if (!directive.$$bindings) { + var bindings = directive.$$bindings = + parseDirectiveBindings(directive, directive.name); + if (isObject(bindings.isolateScope)) { + directive.$$isolateBindings = bindings.isolateScope; } - tDirectives.push(directive); - match = directive; } - } catch (e) { $exceptionHandler(e); } + tDirectives.push(directive); + match = directive; + } } } return match; diff --git a/test/ng/compileSpec.js b/test/ng/compileSpec.js index b0998f24dc27..72015a3559ad 100755 --- a/test/ng/compileSpec.js +++ b/test/ng/compileSpec.js @@ -5877,6 +5877,38 @@ describe('$compile', function() { }); + it('should throw badrestrict on first compilation when restrict is invalid', function() { + module(function($compileProvider, $exceptionHandlerProvider) { + $compileProvider.directive('invalidRestrictBadString', valueFn({restrict: '"'})); + $compileProvider.directive('invalidRestrictTrue', valueFn({restrict: true})); + $compileProvider.directive('invalidRestrictObject', valueFn({restrict: {}})); + $compileProvider.directive('invalidRestrictNumber', valueFn({restrict: 42})); + + // We need to test with the exceptionHandler not rethrowing... + $exceptionHandlerProvider.mode('log'); + }); + + inject(function($exceptionHandler, $compile, $rootScope) { + $compile('
      ')($rootScope); + expect($exceptionHandler.errors.length).toBe(1); + expect($exceptionHandler.errors[0]).toMatch(/\$compile.*badrestrict.*'true'/); + + $compile('
      ')($rootScope); + $compile('
      ')($rootScope); + expect($exceptionHandler.errors.length).toBe(2); + expect($exceptionHandler.errors[1]).toMatch(/\$compile.*badrestrict.*'"'/); + + $compile('
      ')($rootScope); + expect($exceptionHandler.errors.length).toBe(3); + expect($exceptionHandler.errors[2]).toMatch(/\$compile.*badrestrict.*'{}'/); + + $compile('
      ')($rootScope); + expect($exceptionHandler.errors.length).toBe(4); + expect($exceptionHandler.errors[3]).toMatch(/\$compile.*badrestrict.*'42'/); + }); + }); + + it('should throw noident when missing controllerAs directive property', function() { module(function($compileProvider) { $compileProvider.directive('noIdent', valueFn({ From 81d52dfe3909cd442a793efb48dbef62340c03b0 Mon Sep 17 00:00:00 2001 From: Packt Date: Wed, 31 Aug 2016 16:48:11 +0530 Subject: [PATCH 0135/1173] docs(guide/External Resources): add a paid-online course Closes #15075 --- docs/content/guide/external-resources.ngdoc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/content/guide/external-resources.ngdoc b/docs/content/guide/external-resources.ngdoc index 1191a09da3f2..3113dcd76623 100644 --- a/docs/content/guide/external-resources.ngdoc +++ b/docs/content/guide/external-resources.ngdoc @@ -140,7 +140,7 @@ You can find a larger list of Angular external libraries at [ngmodules.org](http [Pluralsite (3 courses)](http://www.pluralsight.com/training/Courses/Find?highlight=true&searchTerm=angularjs), [Tuts+](https://tutsplus.com/course/easier-js-apps-with-angular/), [lynda.com](http://www.lynda.com/AngularJS-tutorials/Up-Running-AngularJS/133318-2.html), - [WintellectNOW (4 lessons)](http://www.wintellectnow.com/Course/Detail/mastering-angularjs) + [WintellectNOW (4 lessons)](http://www.wintellectnow.com/Course/Detail/mastering-angularjs), + [Packt](https://www.packtpub.com/web-development/angularjs-maintaining-web-applications) * **Paid onsite:** [angularbootcamp.com](http://angularbootcamp.com/) - From 5be6f993aa64de4b7da4fd26dcd2cf5285bd6ed3 Mon Sep 17 00:00:00 2001 From: Brian Glick Date: Thu, 1 Sep 2016 14:08:52 -0400 Subject: [PATCH 0136/1173] docs(currency): add missing line break Insert missing line break between currency examples PR (#15083) --- src/ng/filter/filters.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ng/filter/filters.js b/src/ng/filter/filters.js index 8d8f221a56cb..f0ef2f29d3aa 100644 --- a/src/ng/filter/filters.js +++ b/src/ng/filter/filters.js @@ -31,7 +31,7 @@ var ZERO_CHAR = '0';

      default currency symbol ($): {{amount | currency}}
      - custom currency identifier (USD$): {{amount | currency:"USD$"}} + custom currency identifier (USD$): {{amount | currency:"USD$"}}
      no fractions (0): {{amount | currency:"USD$":0}}
      From 87a2ff76af5d0a9268d8eb84db5755077d27c84c Mon Sep 17 00:00:00 2001 From: Peter Bacon Darwin Date: Thu, 1 Sep 2016 10:52:30 +0100 Subject: [PATCH 0137/1173] feat(ngModelOptions): allow options to be inherited from ancestor ngModelOptions Previously, you had to apply the complete set of ngModelOptions at every point where you might want to modify just one or two settings. This change allows more general settings to be applied nearer to the top of the DOM and then for more specific settings to override those general settings further down in the DOM. Furher there is now a new service `$modelOptions` that acts as the top level options that are inherited by all ngModelOptions directives that do not already have an ngModelOptions ancestor directive. Closes #10922 BREAKING CHANGE: Previously, if a setting was not applied on ngModelOptions, then it would default to undefined. Now the setting will be inherited from the nearest ngModelOptions ancestor. It is possible that an ngModelOptions directive that does not set a property, has an ancestor ngModelOptions that does set this property to a value other than undefined. This would cause the ngModel and input controls below this ngModelOptions directive to display different behaviour. This is fixed by explictly setting the property in the ngModelOptions to prevent it from inheriting from the ancestor. For example if you had the following HTML: ```
      ``` Then before this change the input would update on the default event not blur. After this change the input will inherit the option to update on blur. If you want the original behaviour then you will need to specify the option on the input as well: ```
      ``` The programmatic API for `ngModelOptions` has changed. You must now read options via the `getOption` method, rather than accessing the option directly as a property of the options object. This does not affect the usage in templates and only affects custom directives that might have been reading options for their own purposes. --- src/AngularPublic.js | 2 + src/ng/directive/input.js | 2 +- src/ng/directive/ngModel.js | 469 ++++++++++++++++++++----------- test/ng/directive/formSpec.js | 10 +- test/ng/directive/ngModelSpec.js | 96 +++++++ 5 files changed, 407 insertions(+), 172 deletions(-) diff --git a/src/AngularPublic.js b/src/AngularPublic.js index b1b5f332ce8a..3edd34e3abe9 100644 --- a/src/AngularPublic.js +++ b/src/AngularPublic.js @@ -79,6 +79,7 @@ $jsonpCallbacksProvider, $LocationProvider, $LogProvider, + $ModelOptionsProvider, $ParseProvider, $RootScopeProvider, $QProvider, @@ -246,6 +247,7 @@ function publishExternalAPI(angular) { $jsonpCallbacks: $jsonpCallbacksProvider, $location: $LocationProvider, $log: $LogProvider, + $modelOptions: $ModelOptionsProvider, $parse: $ParseProvider, $rootScope: $RootScopeProvider, $q: $QProvider, diff --git a/src/ng/directive/input.js b/src/ng/directive/input.js index 13990b4c0b68..dfb0aadda4ca 100644 --- a/src/ng/directive/input.js +++ b/src/ng/directive/input.js @@ -1424,7 +1424,7 @@ function createDateInputType(type, regexp, parseDate, format) { return function dynamicDateInputType(scope, element, attr, ctrl, $sniffer, $browser, $filter) { badInputChecker(scope, element, attr, ctrl); baseInputType(scope, element, attr, ctrl, $sniffer, $browser); - var timezone = ctrl && ctrl.$options && ctrl.$options.timezone; + var timezone = ctrl && ctrl.$options.getOption('timezone'); var previousDate; ctrl.$$parserName = type; diff --git a/src/ng/directive/ngModel.js b/src/ng/directive/ngModel.js index 6ef8ba408187..59424d0e2173 100644 --- a/src/ng/directive/ngModel.js +++ b/src/ng/directive/ngModel.js @@ -5,7 +5,8 @@ PRISTINE_CLASS: true, DIRTY_CLASS: true, UNTOUCHED_CLASS: true, - TOUCHED_CLASS: true + TOUCHED_CLASS: true, + $ModelOptionsProvider: true */ var VALID_CLASS = 'ng-valid', @@ -220,8 +221,8 @@ is set to `true`. The parse error is stored in `ngModel.$error.parse`. * * */ -var NgModelController = ['$scope', '$exceptionHandler', '$attrs', '$element', '$parse', '$animate', '$timeout', '$rootScope', '$q', '$interpolate', - /** @this */ function($scope, $exceptionHandler, $attr, $element, $parse, $animate, $timeout, $rootScope, $q, $interpolate) { +var NgModelController = ['$scope', '$exceptionHandler', '$attrs', '$element', '$parse', '$animate', '$timeout', '$rootScope', '$q', '$interpolate', '$modelOptions', + /** @this */ function($scope, $exceptionHandler, $attr, $element, $parse, $animate, $timeout, $rootScope, $q, $interpolate, $modelOptions) { this.$viewValue = Number.NaN; this.$modelValue = Number.NaN; this.$$rawModelValue = undefined; // stores the parsed modelValue / model set from scope regardless of validity. @@ -241,6 +242,7 @@ var NgModelController = ['$scope', '$exceptionHandler', '$attrs', '$element', '$ this.$pending = undefined; // keep pending keys here this.$name = $interpolate($attr.name || '', false)($scope); this.$$parentForm = nullFormCtrl; + this.$options = $modelOptions; var parsedNgModel = $parse($attr.ngModel), parsedNgModelAssign = parsedNgModel.assign, @@ -250,9 +252,10 @@ var NgModelController = ['$scope', '$exceptionHandler', '$attrs', '$element', '$ parserValid, ctrl = this; - this.$$setOptions = function(options) { - ctrl.$options = options; - if (options && options.getterSetter) { + + this.$$initGetterSetters = function() { + + if (ctrl.$options.getOption('getterSetter')) { var invokeModelGetter = $parse($attr.ngModel + '()'), invokeModelSetter = $parse($attr.ngModel + '($$$p)'); @@ -276,6 +279,7 @@ var NgModelController = ['$scope', '$exceptionHandler', '$attrs', '$element', '$ } }; + /** * @ngdoc method * @name ngModel.NgModelController#$render @@ -562,7 +566,7 @@ var NgModelController = ['$scope', '$exceptionHandler', '$attrs', '$element', '$ var prevValid = ctrl.$valid; var prevModelValue = ctrl.$modelValue; - var allowInvalid = ctrl.$options && ctrl.$options.allowInvalid; + var allowInvalid = ctrl.$options.getOption('allowInvalid'); ctrl.$$runValidators(modelValue, viewValue, function(allValid) { // If there was no change in validity, don't update the model @@ -724,7 +728,7 @@ var NgModelController = ['$scope', '$exceptionHandler', '$attrs', '$element', '$ ctrl.$modelValue = ngModelGet($scope); } var prevModelValue = ctrl.$modelValue; - var allowInvalid = ctrl.$options && ctrl.$options.allowInvalid; + var allowInvalid = ctrl.$options.getOption('allowInvalid'); ctrl.$$rawModelValue = modelValue; if (allowInvalid) { @@ -815,25 +819,19 @@ var NgModelController = ['$scope', '$exceptionHandler', '$attrs', '$element', '$ */ this.$setViewValue = function(value, trigger) { ctrl.$viewValue = value; - if (!ctrl.$options || ctrl.$options.updateOnDefault) { + if (ctrl.$options.getOption('updateOnDefault')) { ctrl.$$debounceViewValueCommit(trigger); } }; this.$$debounceViewValueCommit = function(trigger) { - var debounceDelay = 0, - options = ctrl.$options, - debounce; - - if (options && isDefined(options.debounce)) { - debounce = options.debounce; - if (isNumber(debounce)) { - debounceDelay = debounce; - } else if (isNumber(debounce[trigger])) { - debounceDelay = debounce[trigger]; - } else if (isNumber(debounce['default'])) { - debounceDelay = debounce['default']; - } + var options = ctrl.$options, + debounceDelay = options.getOption('debounce'); + + if (isNumber(debounceDelay[trigger])) { + debounceDelay = debounceDelay[trigger]; + } else if (isNumber(debounceDelay['default'])) { + debounceDelay = debounceDelay['default']; } $timeout.cancel(pendingDebounce); @@ -1096,9 +1094,14 @@ var ngModelDirective = ['$rootScope', function($rootScope) { return { pre: function ngModelPreLink(scope, element, attr, ctrls) { var modelCtrl = ctrls[0], - formCtrl = ctrls[1] || modelCtrl.$$parentForm; + formCtrl = ctrls[1] || modelCtrl.$$parentForm, + optionsCtrl = ctrls[2]; + + if (optionsCtrl) { + modelCtrl.$options = optionsCtrl.$options; + } - modelCtrl.$$setOptions(ctrls[2] && ctrls[2].$options); + modelCtrl.$$initGetterSetters(); // notify others, especially parent forms formCtrl.$addControl(modelCtrl); @@ -1115,8 +1118,8 @@ var ngModelDirective = ['$rootScope', function($rootScope) { }, post: function ngModelPostLink(scope, element, attr, ctrls) { var modelCtrl = ctrls[0]; - if (modelCtrl.$options && modelCtrl.$options.updateOn) { - element.on(modelCtrl.$options.updateOn, function(ev) { + if (modelCtrl.$options.getOption('updateOn')) { + element.on(modelCtrl.$options.getOption('updateOn'), function(ev) { modelCtrl.$$debounceViewValueCommit(ev && ev.type); }); } @@ -1137,17 +1140,47 @@ var ngModelDirective = ['$rootScope', function($rootScope) { }]; - -var DEFAULT_REGEXP = /(\s+|^)default(\s+|$)/; - /** * @ngdoc directive * @name ngModelOptions * * @description - * Allows tuning how model updates are done. Using `ngModelOptions` you can specify a custom list of - * events that will trigger a model update and/or a debouncing delay so that the actual update only - * takes place when a timer expires; this timer will be reset after another change takes place. + * This directive allows you to modify the behaviour of ngModel and input directives within your + * application. You can specify an ngModelOptions directive on any element and the settings affect + * the ngModel and input directives on all descendent elements. + * + * The ngModelOptions settings are found by evaluating the value of the ngModelOptions attribute as + * an Angular expression. This expression should evaluate to an object, whose properties contain + * the settings. + * + * If a setting is not specified as a property on the object for a particular ngModelOptions directive + * then it will inherit that setting from the first ngModelOptions directive found by traversing up the + * DOM tree. If there is no ancestor element containing an ngModelOptions directive then the settings in + * {@link $modelOptions} will be used. + * + * For example given the following fragment of HTML + * + * + * ```html + *
      + *
      + * + *
      + *
      + * ``` + * + * the `input` element will have the following settings + * + * ```js + * { allowInvalid: true, updateOn: 'default' } + * ``` + * + * + * ## Triggering and debouncing model updates + * + * The `updateOn` and `debounce` properties allow you to specify a custom list of events that will + * trigger a model update and/or a debouncing delay so that the actual update only takes place when + * a timer expires; this timer will be reset after another change takes place. * * Given the nature of `ngModelOptions`, the value displayed inside input fields in the view might * be different from the value in the actual model. This means that if you update the model you @@ -1163,7 +1196,130 @@ var DEFAULT_REGEXP = /(\s+|^)default(\s+|$)/; * `submit` event. Note that `ngClick` events will occur before the model is updated. Use `ngSubmit` * to have access to the updated model. * - * `ngModelOptions` has an effect on the element it's declared on and its descendants. + * The following example shows how to override immediate updates. Changes on the inputs within the + * form will update the model only when the control loses focus (blur event). If `escape` key is + * pressed while the input field is focused, the value is reset to the value in the current model. + * + * + * + *
      + *
      + * Name: + *
      + * + * Other data: + *
      + *
      + *
      user.name = 
      + *
      + *
      + * + * angular.module('optionsExample', []) + * .controller('ExampleController', ['$scope', function($scope) { + * $scope.user = { name: 'say', data: '' }; + * + * $scope.cancel = function(e) { + * if (e.keyCode === 27) { + * $scope.userForm.userName.$rollbackViewValue(); + * } + * }; + * }]); + * + * + * var model = element(by.binding('user.name')); + * var input = element(by.model('user.name')); + * var other = element(by.model('user.data')); + * + * it('should allow custom events', function() { + * input.sendKeys(' hello'); + * input.click(); + * expect(model.getText()).toEqual('say'); + * other.click(); + * expect(model.getText()).toEqual('say hello'); + * }); + * + * it('should $rollbackViewValue when model changes', function() { + * input.sendKeys(' hello'); + * expect(input.getAttribute('value')).toEqual('say hello'); + * input.sendKeys(protractor.Key.ESCAPE); + * expect(input.getAttribute('value')).toEqual('say'); + * other.click(); + * expect(model.getText()).toEqual('say'); + * }); + * + *
      + * + * The next example shows how to debounce model changes. Model will be updated only 1 sec after last change. + * If the `Clear` button is pressed, any debounced action is canceled and the value becomes empty. + * + * + * + *
      + *
      + * Name: + * + *
      + *
      + *
      user.name = 
      + *
      + *
      + * + * angular.module('optionsExample', []) + * .controller('ExampleController', ['$scope', function($scope) { + * $scope.user = { name: 'say' }; + * }]); + * + *
      + * + * ## Model updates and validation + * + * The default behaviour in `ngModel` is that the model value is set to `null` when the validation + * determines that the value is invalid. By setting the `allowInvalid` property to true, the model + * will still be updated even if the value is invalid. + * + * + * ## Connecting to the scope + * + * By setting the `getterSetter` property to true you are telling ngModel that the `ngModel` expression + * on the scope refers to a "getter/setter" function rather than the value itself. + * + * The following example shows how to bind to getter/setters: + * + * + * + *
      + *
      + * Name: + * + *
      + *
      user.name = 
      + *
      + *
      + * + * angular.module('getterSetterExample', []) + * .controller('ExampleController', ['$scope', function($scope) { + * var _name = 'Brian'; + * $scope.user = { + * name: function(newName) { + * return angular.isDefined(newName) ? (_name = newName) : _name; + * } + * }; + * }]); + * + *
      + * + * + * ## Specifying timezones + * + * You can specify the timezone that date/time input directives expect by providing its name in the + * `timezone` property. * * @param {Object} ngModelOptions options to apply to the current model. Valid keys are: * - `updateOn`: string specifying which event should the input be bound to. You can set several @@ -1176,153 +1332,134 @@ var DEFAULT_REGEXP = /(\s+|^)default(\s+|$)/; * - `allowInvalid`: boolean value which indicates that the model can be set with values that did * not validate correctly instead of the default behavior of setting the model to undefined. * - `getterSetter`: boolean value which determines whether or not to treat functions bound to - `ngModel` as getters/setters. + * `ngModel` as getters/setters. * - `timezone`: Defines the timezone to be used to read/write the `Date` instance in the model for * ``, ``, ... . It understands UTC/GMT and the * continental US time zone abbreviations, but for general use, use a time zone offset, for * example, `'+0430'` (4 hours, 30 minutes east of the Greenwich meridian) * If not specified, the timezone of the browser will be used. * - * @example - - The following example shows how to override immediate updates. Changes on the inputs within the - form will update the model only when the control loses focus (blur event). If `escape` key is - pressed while the input field is focused, the value is reset to the value in the current model. - - - -
      -
      -
      -
      -
      -
      user.name = 
      -
      user.data = 
      -
      -
      - - angular.module('optionsExample', []) - .controller('ExampleController', ['$scope', function($scope) { - $scope.user = { name: 'John', data: '' }; - - $scope.cancel = function(e) { - if (e.keyCode === 27) { - $scope.userForm.userName.$rollbackViewValue(); - } - }; - }]); - - - var model = element(by.binding('user.name')); - var input = element(by.model('user.name')); - var other = element(by.model('user.data')); - - it('should allow custom events', function() { - input.sendKeys(' Doe'); - input.click(); - expect(model.getText()).toEqual('John'); - other.click(); - expect(model.getText()).toEqual('John Doe'); - }); + */ +var ngModelOptionsDirective = ['$modelOptions', function($modelOptions) { + return { + restrict: 'A', + // ngModelOptions needs to run before ngModel and input directives + priority: 10, + require: ['ngModelOptions', '?^^ngModelOptions'], + controller: function NgModelOptionsController() {}, + link: { + pre: function ngModelOptionsPreLinkFn(scope, element, attrs, ctrls) { + var optionsCtrl = ctrls[0]; + var parentOptions = ctrls[1] ? ctrls[1].$options : $modelOptions; + optionsCtrl.$options = parentOptions.createChild(scope.$eval(attrs.ngModelOptions)); + } + } + }; +}]; - it('should $rollbackViewValue when model changes', function() { - input.sendKeys(' Doe'); - expect(input.getAttribute('value')).toEqual('John Doe'); - input.sendKeys(protractor.Key.ESCAPE); - expect(input.getAttribute('value')).toEqual('John'); - other.click(); - expect(model.getText()).toEqual('John'); - }); - -
      - This one shows how to debounce model changes. Model will be updated only 1 sec after last change. - If the `Clear` button is pressed, any debounced action is canceled and the value becomes empty. +/** + * @ngdoc provider + * @name $modelOptionsProvider + * @description + * + * Here, you can change the default settings from which {@link ngModelOptions} + * directives inherit. + * + * See the {@link ngModelOptions} directive for a list of the available options. + */ +function $ModelOptionsProvider() { + return { + /** + * @ngdoc property + * @name $modelOptionsProvider#defaultOptions + * @type {Object} + * @description + * The default options to fall back on when there are no more ngModelOption + * directives as ancestors. + * Use this property to specify the defaultOptions for the application as a whole. + * + * The initial default options are: + * + * * `updateOn`: `default` + * * `debounce`: `0` + * * `allowInvalid`: `undefined` + * * `getterSetter`: `undefined` + * * `timezone`: 'undefined' + */ + defaultOptions: { + updateOn: 'default', + debounce: 0 + }, - - -
      -
      - - -
      -
      -
      user.name = 
      -
      -
      - - angular.module('optionsExample', []) - .controller('ExampleController', ['$scope', function($scope) { - $scope.user = { name: 'Igor' }; - }]); - -
      + /** + * @ngdoc service + * @name $modelOptions + * @type ModelOptions + * @description + * + * This service provides the application wide default {@link ModelOptions} options that + * will be used by {@link ngModel} directives if no {@link ngModelOptions} directive is + * specified. + */ + $get: function() { + return new ModelOptions(this.defaultOptions); + } + }; +} - This one shows how to bind to getter/setters: - - -
      -
      - -
      -
      user.name = 
      -
      -
      - - angular.module('getterSetterExample', []) - .controller('ExampleController', ['$scope', function($scope) { - var _name = 'Brian'; - $scope.user = { - name: function(newName) { - // Note that newName can be undefined for two reasons: - // 1. Because it is called as a getter and thus called with no arguments - // 2. Because the property should actually be set to undefined. This happens e.g. if the - // input is invalid - return arguments.length ? (_name = newName) : _name; - } - }; - }]); - -
      +/** + * @ngdoc type + * @name ModelOptions + * @description + * A container for the options set by the {@link ngModelOptions} directive + * and the {@link $modelOptions} service. */ -var ngModelOptionsDirective = function() { - return { - restrict: 'A', - controller: ['$scope', '$attrs', function NgModelOptionsController($scope, $attrs) { - var that = this; - this.$options = copy($scope.$eval($attrs.ngModelOptions)); - // Allow adding/overriding bound events - if (isDefined(this.$options.updateOn)) { - this.$options.updateOnDefault = false; - // extract "default" pseudo-event from list of events that can trigger a model update - this.$options.updateOn = trim(this.$options.updateOn.replace(DEFAULT_REGEXP, function() { - that.$options.updateOnDefault = true; - return ' '; - })); - } else { - this.$options.updateOnDefault = true; - } - }] - }; -}; +var DEFAULT_REGEXP = /(\s+|^)default(\s+|$)/; +function ModelOptions(options, parentOptions) { + + // Extend the parent's options with these new ones + var _options = extend({}, parentOptions, options); + + // do extra processing on the options + + // updateOn and updateOnDefault + if (isDefined(_options.updateOn) && _options.updateOn.trim()) { + _options.updateOnDefault = false; + // extract "default" pseudo-event from list of events that can trigger a model update + _options.updateOn = trim(_options.updateOn.replace(DEFAULT_REGEXP, function() { + _options.updateOnDefault = true; + return ' '; + })); + } else if (parentOptions) { + _options.updateOn = parentOptions.updateOn; + _options.updateOnDefault = parentOptions.updateOnDefault; + } else { + _options.updateOnDefault = true; + } + /** + * @ngdoc method + * @name ModelOptions#getOption + * @param {string} name the name of the option to retrieve + * @returns {*} the value of the option + * @description + * Returns the value of the given option + */ + this.getOption = function(name) { return _options[name]; }; + + /** + * @ngdoc method + * @name ModelOptions#createChild + * @param {Object} options a hash of options for the new child that will override the parent's options + * @return {ModelOptions} a new `ModelOptions` object initialized with the given options. + */ + this.createChild = function(options) { + return new ModelOptions(options, _options); + }; +} // helper methods function addSetValidityMethod(context) { diff --git a/test/ng/directive/formSpec.js b/test/ng/directive/formSpec.js index f878c4826070..e1d681956b23 100644 --- a/test/ng/directive/formSpec.js +++ b/test/ng/directive/formSpec.js @@ -290,7 +290,7 @@ describe('form', function() { describe('triggering commit value on submit', function() { it('should trigger update on form submit', function() { var form = $compile( - '
      ' + + '' + '' + '
      ')(scope); scope.$digest(); @@ -305,7 +305,7 @@ describe('form', function() { it('should trigger update on form submit with nested forms', function() { var form = $compile( - '
      ' + + '' + '
      ' + '' + '
      ' + @@ -323,7 +323,7 @@ describe('form', function() { it('should trigger update before ng-submit is invoked', function() { var form = $compile( '' + + 'ng-model-options="{ updateOn: \'submit\' }" >' + '' + '
      ')(scope); scope.$digest(); @@ -342,7 +342,7 @@ describe('form', function() { describe('rollback view value', function() { it('should trigger rollback on form controls', function() { var form = $compile( - '
      ' + + '' + '' + '
      ', - link: function(scope) { - scope.setGreeting = function() { scope.greeting = 'Hello!'; }; - } - }; + $rootScope.bar = 'baz'; + $rootScope.$digest(); + expect(element.html()).toBe('1:foo;2:baz;3:foo;4:bar'); + }); }); - }); - - inject(function($rootScope) { - compile('
      ' + - '

      {{greeting}}

      ' + - '
      ' + - '
      '); - $rootScope.$digest(); - browserTrigger(element.find('button'), 'click'); - expect(element.find('p').text()).toBe('Hello!'); - }); - }); - }); + it('should be possible to one-time bind a parameter on a component with a template', function() { + module(function() { + directive('otherTplDir', function() { + return { + scope: {param1: '@', param2: '@'}, + templateUrl: 'other.html' + }; + }); + }); + inject(function($rootScope, $templateCache) { + $templateCache.put('other.html', '1:{{param1}};2:{{param2}};3:{{::param1}};4:{{::param2}}'); + compile('
      '); + $rootScope.$digest(); + expect(element.html()).toBe('1:;2:;3:;4:'); + expect(countWatches($rootScope)).toEqual(4); // (4 - 2) -> template watch group, 2 -> {{ }} - describe('attribute', function() { - it('should copy simple attribute', inject(function() { - compile('
      '); + $rootScope.foo = 'foo'; + $rootScope.$digest(); + expect(element.html()).toBe('1:foo;2:;3:;4:'); + expect(countWatches($rootScope)).toEqual(3); - expect(componentScope.attr).toEqual('some text'); - expect(componentScope.attrAlias).toEqual('some text'); - expect(componentScope.attrAlias).toEqual(componentScope.attr); - })); + $rootScope.foo = 'baz'; + $rootScope.bar = 'bar'; + $rootScope.$digest(); + expect(element.html()).toBe('1:foo;2:bar;3:;4:'); + expect(countWatches($rootScope)).toEqual(3); - it('should copy an attribute with spaces', inject(function() { - compile('
      '); + $rootScope.bar = 'baz'; + $rootScope.$digest(); + expect(element.html()).toBe('1:foo;2:baz;3:;4:'); + }); + }); - expect(componentScope.attr).toEqual(' some text '); - expect(componentScope.attrAlias).toEqual(' some text '); - expect(componentScope.attrAlias).toEqual(componentScope.attr); - })); + it('should continue with a digets cycle when there is a two-way binding from the child to the parent', function() { + module(function() { + directive('hello', function() { + return { + restrict: 'E', + scope: { greeting: '=' }, + template: '', + link: function(scope) { + scope.setGreeting = function() { scope.greeting = 'Hello!'; }; + } + }; + }); + }); - it('should set up the interpolation before it reaches the link function', inject(function() { - $rootScope.name = 'misko'; - compile('
      '); - expect(componentScope.attr).toEqual('hello misko'); - expect(componentScope.attrAlias).toEqual('hello misko'); - })); + inject(function($rootScope) { + compile('
      ' + + '

      {{greeting}}

      ' + + '
      ' + + '
      '); + $rootScope.$digest(); + browserTrigger(element.find('button'), 'click'); + expect(element.find('p').text()).toBe('Hello!'); + }); + }); - it('should update when interpolated attribute updates', inject(function() { - compile('
      '); + }); - $rootScope.name = 'igor'; - $rootScope.$apply(); - expect(componentScope.attr).toEqual('hello igor'); - expect(componentScope.attrAlias).toEqual('hello igor'); - })); - }); + describe('attribute', function() { + it('should copy simple attribute', inject(function() { + compile('
      '); + expect(componentScope.attr).toEqual('some text'); + expect(componentScope.attrAlias).toEqual('some text'); + expect(componentScope.attrAlias).toEqual(componentScope.attr); + })); - describe('object reference', function() { - it('should update local when origin changes', inject(function() { - compile('
      '); - expect(componentScope.ref).toBeUndefined(); - expect(componentScope.refAlias).toBe(componentScope.ref); + it('should copy an attribute with spaces', inject(function() { + compile('
      '); - $rootScope.name = 'misko'; - $rootScope.$apply(); + expect(componentScope.attr).toEqual(' some text '); + expect(componentScope.attrAlias).toEqual(' some text '); + expect(componentScope.attrAlias).toEqual(componentScope.attr); + })); - expect($rootScope.name).toBe('misko'); - expect(componentScope.ref).toBe('misko'); - expect(componentScope.refAlias).toBe('misko'); + it('should set up the interpolation before it reaches the link function', inject(function() { + $rootScope.name = 'misko'; + compile('
      '); + expect(componentScope.attr).toEqual('hello misko'); + expect(componentScope.attrAlias).toEqual('hello misko'); + })); - $rootScope.name = {}; - $rootScope.$apply(); - expect(componentScope.ref).toBe($rootScope.name); - expect(componentScope.refAlias).toBe($rootScope.name); - })); + it('should update when interpolated attribute updates', inject(function() { + compile('
      '); + $rootScope.name = 'igor'; + $rootScope.$apply(); - it('should update local when both change', inject(function() { - compile('
      '); - $rootScope.name = {mark:123}; - componentScope.ref = 'misko'; + expect(componentScope.attr).toEqual('hello igor'); + expect(componentScope.attrAlias).toEqual('hello igor'); + })); + }); - $rootScope.$apply(); - expect($rootScope.name).toEqual({mark:123}); - expect(componentScope.ref).toBe($rootScope.name); - expect(componentScope.refAlias).toBe($rootScope.name); - $rootScope.name = 'igor'; - componentScope.ref = {}; - $rootScope.$apply(); - expect($rootScope.name).toEqual('igor'); - expect(componentScope.ref).toBe($rootScope.name); - expect(componentScope.refAlias).toBe($rootScope.name); - })); + describe('object reference', function() { + it('should update local when origin changes', inject(function() { + compile('
      '); + expect(componentScope.ref).toBeUndefined(); + expect(componentScope.refAlias).toBe(componentScope.ref); - it('should not break if local and origin both change to the same value', inject(function() { - $rootScope.name = 'aaa'; + $rootScope.name = 'misko'; + $rootScope.$apply(); - compile('
      '); + expect($rootScope.name).toBe('misko'); + expect(componentScope.ref).toBe('misko'); + expect(componentScope.refAlias).toBe('misko'); - //change both sides to the same item within the same digest cycle - componentScope.ref = 'same'; - $rootScope.name = 'same'; - $rootScope.$apply(); + $rootScope.name = {}; + $rootScope.$apply(); + expect(componentScope.ref).toBe($rootScope.name); + expect(componentScope.refAlias).toBe($rootScope.name); + })); - //change origin back to its previous value - $rootScope.name = 'aaa'; - $rootScope.$apply(); - expect($rootScope.name).toBe('aaa'); - expect(componentScope.ref).toBe('aaa'); - })); + it('should update local when both change', inject(function() { + compile('
      '); + $rootScope.name = {mark:123}; + componentScope.ref = 'misko'; - it('should complain on non assignable changes', inject(function() { - compile('
      '); - $rootScope.name = 'world'; - $rootScope.$apply(); - expect(componentScope.ref).toBe('hello world'); + $rootScope.$apply(); + expect($rootScope.name).toEqual({mark:123}); + expect(componentScope.ref).toBe($rootScope.name); + expect(componentScope.refAlias).toBe($rootScope.name); - componentScope.ref = 'ignore me'; - expect(function() { $rootScope.$apply(); }). - toThrowMinErr('$compile', 'nonassign', 'Expression \'\'hello \' + name\' in attribute \'ref\' used with directive \'myComponent\' is non-assignable!'); - expect(componentScope.ref).toBe('hello world'); - // reset since the exception was rethrown which prevented phase clearing - $rootScope.$$phase = null; + $rootScope.name = 'igor'; + componentScope.ref = {}; + $rootScope.$apply(); + expect($rootScope.name).toEqual('igor'); + expect(componentScope.ref).toBe($rootScope.name); + expect(componentScope.refAlias).toBe($rootScope.name); + })); - $rootScope.name = 'misko'; - $rootScope.$apply(); - expect(componentScope.ref).toBe('hello misko'); - })); + it('should not break if local and origin both change to the same value', inject(function() { + $rootScope.name = 'aaa'; - it('should complain if assigning to undefined', inject(function() { - compile('
      '); - $rootScope.$apply(); - expect(componentScope.ref).toBeUndefined(); + compile('
      '); - componentScope.ref = 'ignore me'; - expect(function() { $rootScope.$apply(); }). - toThrowMinErr('$compile', 'nonassign', 'Expression \'undefined\' in attribute \'ref\' used with directive \'myComponent\' is non-assignable!'); - expect(componentScope.ref).toBeUndefined(); + //change both sides to the same item within the same digest cycle + componentScope.ref = 'same'; + $rootScope.name = 'same'; + $rootScope.$apply(); - $rootScope.$$phase = null; // reset since the exception was rethrown which prevented phase clearing - $rootScope.$apply(); - expect(componentScope.ref).toBeUndefined(); - })); + //change origin back to its previous value + $rootScope.name = 'aaa'; + $rootScope.$apply(); - // regression - it('should stabilize model', inject(function() { - compile('
      '); + expect($rootScope.name).toBe('aaa'); + expect(componentScope.ref).toBe('aaa'); + })); - var lastRefValueInParent; - $rootScope.$watch('name', function(ref) { - lastRefValueInParent = ref; - }); + it('should complain on non assignable changes', inject(function() { + compile('
      '); + $rootScope.name = 'world'; + $rootScope.$apply(); + expect(componentScope.ref).toBe('hello world'); - $rootScope.name = 'aaa'; - $rootScope.$apply(); + componentScope.ref = 'ignore me'; + expect(function() { $rootScope.$apply(); }). + toThrowMinErr('$compile', 'nonassign', 'Expression \'\'hello \' + name\' in attribute \'ref\' used with directive \'myComponent\' is non-assignable!'); + expect(componentScope.ref).toBe('hello world'); + // reset since the exception was rethrown which prevented phase clearing + $rootScope.$$phase = null; - componentScope.reference = 'new'; - $rootScope.$apply(); - - expect(lastRefValueInParent).toBe('new'); - })); - - describe('literal objects', function() { - it('should copy parent changes', inject(function() { - compile('
      '); - - $rootScope.name = 'a'; - $rootScope.$apply(); - expect(componentScope.reference).toEqual({name: 'a'}); - - $rootScope.name = 'b'; - $rootScope.$apply(); - expect(componentScope.reference).toEqual({name: 'b'}); - })); - - it('should not change the component when parent does not change', inject(function() { - compile('
      '); + $rootScope.name = 'misko'; + $rootScope.$apply(); + expect(componentScope.ref).toBe('hello misko'); + })); - $rootScope.name = 'a'; - $rootScope.$apply(); - var lastComponentValue = componentScope.reference; - $rootScope.$apply(); - expect(componentScope.reference).toBe(lastComponentValue); - })); + it('should complain if assigning to undefined', inject(function() { + compile('
      '); + $rootScope.$apply(); + expect(componentScope.ref).toBeUndefined(); - it('should complain when the component changes', inject(function() { - compile('
      '); + componentScope.ref = 'ignore me'; + expect(function() { $rootScope.$apply(); }). + toThrowMinErr('$compile', 'nonassign', 'Expression \'undefined\' in attribute \'ref\' used with directive \'myComponent\' is non-assignable!'); + expect(componentScope.ref).toBeUndefined(); - $rootScope.name = 'a'; - $rootScope.$apply(); - componentScope.reference = {name: 'b'}; - expect(function() { + $rootScope.$$phase = null; // reset since the exception was rethrown which prevented phase clearing $rootScope.$apply(); - }).toThrowMinErr('$compile', 'nonassign', 'Expression \'{name: name}\' in attribute \'reference\' used with directive \'myComponent\' is non-assignable!'); - - })); + expect(componentScope.ref).toBeUndefined(); + })); - it('should work for primitive literals', inject(function() { - test('1', 1); - test('null', null); - test('undefined', undefined); - test('\'someString\'', 'someString'); - test('true', true); + // regression + it('should stabilize model', inject(function() { + compile('
      '); - function test(literalString, literalValue) { - compile('
      '); + var lastRefValueInParent; + $rootScope.$watch('name', function(ref) { + lastRefValueInParent = ref; + }); + $rootScope.name = 'aaa'; $rootScope.$apply(); - expect(componentScope.reference).toBe(literalValue); - dealoc(element); - } - })); - - }); - }); + componentScope.reference = 'new'; + $rootScope.$apply(); + expect(lastRefValueInParent).toBe('new'); + })); - describe('optional object reference', function() { - it('should update local when origin changes', inject(function() { - compile('
      '); - expect(componentScope.optRef).toBeUndefined(); - expect(componentScope.optRefAlias).toBe(componentScope.optRef); + describe('literal objects', function() { + it('should copy parent changes', inject(function() { + compile('
      '); - $rootScope.name = 'misko'; - $rootScope.$apply(); - expect(componentScope.optref).toBe($rootScope.name); - expect(componentScope.optrefAlias).toBe($rootScope.name); + $rootScope.name = 'a'; + $rootScope.$apply(); + expect(componentScope.reference).toEqual({name: 'a'}); - $rootScope.name = {}; - $rootScope.$apply(); - expect(componentScope.optref).toBe($rootScope.name); - expect(componentScope.optrefAlias).toBe($rootScope.name); - })); + $rootScope.name = 'b'; + $rootScope.$apply(); + expect(componentScope.reference).toEqual({name: 'b'}); + })); - it('should not throw exception when reference does not exist', inject(function() { - compile('
      '); + it('should not change the component when parent does not change', inject(function() { + compile('
      '); - expect(componentScope.optref).toBeUndefined(); - expect(componentScope.optrefAlias).toBeUndefined(); - expect(componentScope.optreference).toBeUndefined(); - })); - }); + $rootScope.name = 'a'; + $rootScope.$apply(); + var lastComponentValue = componentScope.reference; + $rootScope.$apply(); + expect(componentScope.reference).toBe(lastComponentValue); + })); + it('should complain when the component changes', inject(function() { + compile('
      '); - describe('collection object reference', function() { - it('should update isolate scope when origin scope changes', inject(function() { - $rootScope.collection = [{ - name: 'Gabriel', - value: 18 - }, { - name: 'Tony', - value: 91 - }]; - $rootScope.query = ''; - $rootScope.$apply(); + $rootScope.name = 'a'; + $rootScope.$apply(); + componentScope.reference = {name: 'b'}; + expect(function() { + $rootScope.$apply(); + }).toThrowMinErr('$compile', 'nonassign', 'Expression \'{name: name}\' in attribute \'reference\' used with directive \'myComponent\' is non-assignable!'); - compile('
      '); + })); - expect(componentScope.colref).toEqual($rootScope.collection); - expect(componentScope.colrefAlias).toEqual(componentScope.colref); + it('should work for primitive literals', inject(function() { + test('1', 1); + test('null', null); + test('undefined', undefined); + test('\'someString\'', 'someString'); + test('true', true); - $rootScope.query = 'Gab'; - $rootScope.$apply(); + function test(literalString, literalValue) { + compile('
      '); - expect(componentScope.colref).toEqual([$rootScope.collection[0]]); - expect(componentScope.colrefAlias).toEqual([$rootScope.collection[0]]); - })); + $rootScope.$apply(); + expect(componentScope.reference).toBe(literalValue); + dealoc(element); + } + })); - it('should update origin scope when isolate scope changes', inject(function() { - $rootScope.collection = [{ - name: 'Gabriel', - value: 18 - }, { - name: 'Tony', - value: 91 - }]; + }); - compile('
      '); + }); - var newItem = { - name: 'Pablo', - value: 10 - }; - componentScope.colref.push(newItem); - componentScope.$apply(); - expect($rootScope.collection[2]).toEqual(newItem); - })); - }); + describe('optional object reference', function() { + it('should update local when origin changes', inject(function() { + compile('
      '); + expect(componentScope.optRef).toBeUndefined(); + expect(componentScope.optRefAlias).toBe(componentScope.optRef); + $rootScope.name = 'misko'; + $rootScope.$apply(); + expect(componentScope.optref).toBe($rootScope.name); + expect(componentScope.optrefAlias).toBe($rootScope.name); - describe('one-way binding', function() { - it('should update isolate when the identity of origin changes', inject(function() { - compile('
      '); + $rootScope.name = {}; + $rootScope.$apply(); + expect(componentScope.optref).toBe($rootScope.name); + expect(componentScope.optrefAlias).toBe($rootScope.name); + })); - expect(componentScope.owRef).toBeUndefined(); - expect(componentScope.owRefAlias).toBe(componentScope.owRef); + it('should not throw exception when reference does not exist', inject(function() { + compile('
      '); - $rootScope.obj = {value: 'initial'}; - $rootScope.$apply(); + expect(componentScope.optref).toBeUndefined(); + expect(componentScope.optrefAlias).toBeUndefined(); + expect(componentScope.optreference).toBeUndefined(); + })); + }); - expect($rootScope.obj).toEqual({value: 'initial'}); - expect(componentScope.owRef).toEqual({value: 'initial'}); - expect(componentScope.owRefAlias).toBe(componentScope.owRef); - // This changes in both scopes because of reference - $rootScope.obj.value = 'origin1'; - $rootScope.$apply(); - expect(componentScope.owRef.value).toBe('origin1'); - expect(componentScope.owRefAlias.value).toBe('origin1'); + describe('collection object reference', function() { + it('should update isolate scope when origin scope changes', inject(function() { + $rootScope.collection = [{ + name: 'Gabriel', + value: 18 + }, { + name: 'Tony', + value: 91 + }]; + $rootScope.query = ''; + $rootScope.$apply(); - componentScope.owRef = {value: 'isolate1'}; - componentScope.$apply(); - expect($rootScope.obj.value).toBe('origin1'); + compile('
      '); - // Change does not propagate because object identity hasn't changed - $rootScope.obj.value = 'origin2'; - $rootScope.$apply(); - expect(componentScope.owRef.value).toBe('isolate1'); - expect(componentScope.owRefAlias.value).toBe('origin2'); + expect(componentScope.colref).toEqual($rootScope.collection); + expect(componentScope.colrefAlias).toEqual(componentScope.colref); - // Change does propagate because object identity changes - $rootScope.obj = {value: 'origin3'}; - $rootScope.$apply(); - expect(componentScope.owRef.value).toBe('origin3'); - expect(componentScope.owRef).toBe($rootScope.obj); - expect(componentScope.owRefAlias).toBe($rootScope.obj); - })); + $rootScope.query = 'Gab'; + $rootScope.$apply(); - it('should update isolate when both change', inject(function() { - compile('
      '); + expect(componentScope.colref).toEqual([$rootScope.collection[0]]); + expect(componentScope.colrefAlias).toEqual([$rootScope.collection[0]]); + })); - $rootScope.name = {mark:123}; - componentScope.owRef = 'misko'; + it('should update origin scope when isolate scope changes', inject(function() { + $rootScope.collection = [{ + name: 'Gabriel', + value: 18 + }, { + name: 'Tony', + value: 91 + }]; - $rootScope.$apply(); - expect($rootScope.name).toEqual({mark:123}); - expect(componentScope.owRef).toBe($rootScope.name); - expect(componentScope.owRefAlias).toBe($rootScope.name); + compile('
      '); - $rootScope.name = 'igor'; - componentScope.owRef = {}; - $rootScope.$apply(); - expect($rootScope.name).toEqual('igor'); - expect(componentScope.owRef).toBe($rootScope.name); - expect(componentScope.owRefAlias).toBe($rootScope.name); - })); + var newItem = { + name: 'Pablo', + value: 10 + }; + componentScope.colref.push(newItem); + componentScope.$apply(); - describe('initialization', function() { - var component, log; + expect($rootScope.collection[2]).toEqual(newItem); + })); + }); - beforeEach(function() { - log = []; - angular.module('owComponentTest', []) - .component('owComponent', { - bindings: { input: '<' }, - controller: function() { - component = this; - this.input = 'constructor'; - log.push('constructor'); - this.$onInit = function() { - this.input = '$onInit'; - log.push('$onInit'); - }; + describe('one-way binding', function() { + it('should update isolate when the identity of origin changes', inject(function() { + compile('
      '); - this.$onChanges = function(changes) { - if (changes.input) { - log.push(['$onChanges', changes.input]); - } - }; - } - }); - }); + expect(componentScope.owRef).toBeUndefined(); + expect(componentScope.owRefAlias).toBe(componentScope.owRef); - it('should not update isolate again after $onInit if outer has not changed', function() { - module('owComponentTest'); - inject(function() { - $rootScope.name = 'outer'; - compile(''); + $rootScope.obj = {value: 'initial'}; + $rootScope.$apply(); - expect($rootScope.name).toEqual('outer'); - expect(component.input).toEqual('$onInit'); + expect($rootScope.obj).toEqual({value: 'initial'}); + expect(componentScope.owRef).toEqual({value: 'initial'}); + expect(componentScope.owRefAlias).toBe(componentScope.owRef); + // This changes in both scopes because of reference + $rootScope.obj.value = 'origin1'; $rootScope.$apply(); + expect(componentScope.owRef.value).toBe('origin1'); + expect(componentScope.owRefAlias.value).toBe('origin1'); - expect($rootScope.name).toEqual('outer'); - expect(component.input).toEqual('$onInit'); + componentScope.owRef = {value: 'isolate1'}; + componentScope.$apply(); + expect($rootScope.obj.value).toBe('origin1'); - expect(log).toEqual([ - 'constructor', - ['$onChanges', jasmine.objectContaining({ currentValue: 'outer' })], - '$onInit' - ]); - }); - }); + // Change does not propagate because object identity hasn't changed + $rootScope.obj.value = 'origin2'; + $rootScope.$apply(); + expect(componentScope.owRef.value).toBe('isolate1'); + expect(componentScope.owRefAlias.value).toBe('origin2'); - it('should update isolate again after $onInit if outer has changed (before initial watchAction call)', function() { - module('owComponentTest'); - inject(function() { - $rootScope.name = 'outer1'; - compile(''); + // Change does propagate because object identity changes + $rootScope.obj = {value: 'origin3'}; + $rootScope.$apply(); + expect(componentScope.owRef.value).toBe('origin3'); + expect(componentScope.owRef).toBe($rootScope.obj); + expect(componentScope.owRefAlias).toBe($rootScope.obj); + })); - expect(component.input).toEqual('$onInit'); - $rootScope.$apply('name = "outer2"'); + it('should update isolate when both change', inject(function() { + compile('
      '); - expect($rootScope.name).toEqual('outer2'); - expect(component.input).toEqual('outer2'); - expect(log).toEqual([ - 'constructor', - ['$onChanges', jasmine.objectContaining({ currentValue: 'outer1' })], - '$onInit', - ['$onChanges', jasmine.objectContaining({ currentValue: 'outer2', previousValue: 'outer1' })] - ]); - }); - }); + $rootScope.name = {mark:123}; + componentScope.owRef = 'misko'; - it('should update isolate again after $onInit if outer has changed (before initial watchAction call)', function() { - angular.module('owComponentTest') - .directive('changeInput', function() { - return function(scope, elem, attrs) { - scope.name = 'outer2'; - }; - }); - module('owComponentTest'); - inject(function() { - $rootScope.name = 'outer1'; - compile(''); + $rootScope.$apply(); + expect($rootScope.name).toEqual({mark:123}); + expect(componentScope.owRef).toBe($rootScope.name); + expect(componentScope.owRefAlias).toBe($rootScope.name); - expect(component.input).toEqual('$onInit'); - $rootScope.$digest(); + $rootScope.name = 'igor'; + componentScope.owRef = {}; + $rootScope.$apply(); + expect($rootScope.name).toEqual('igor'); + expect(componentScope.owRef).toBe($rootScope.name); + expect(componentScope.owRefAlias).toBe($rootScope.name); + })); - expect($rootScope.name).toEqual('outer2'); - expect(component.input).toEqual('outer2'); - expect(log).toEqual([ - 'constructor', - ['$onChanges', jasmine.objectContaining({ currentValue: 'outer1' })], - '$onInit', - ['$onChanges', jasmine.objectContaining({ currentValue: 'outer2', previousValue: 'outer1' })] - ]); - }); - }); - }); + describe('initialization', function() { + var component, log; + + beforeEach(function() { + log = []; + angular.module('owComponentTest', []) + .component('owComponent', { + bindings: { input: '<' }, + controller: function() { + component = this; + this.input = 'constructor'; + log.push('constructor'); + + this.$onInit = function() { + this.input = '$onInit'; + log.push('$onInit'); + }; - it('should not break when isolate and origin both change to the same value', inject(function() { - $rootScope.name = 'aaa'; - compile('
      '); + this.$onChanges = function(changes) { + if (changes.input) { + log.push(['$onChanges', changes.input]); + } + }; + } + }); + }); - //change both sides to the same item within the same digest cycle - componentScope.owRef = 'same'; - $rootScope.name = 'same'; - $rootScope.$apply(); + it('should not update isolate again after $onInit if outer has not changed', function() { + module('owComponentTest'); + inject(function() { + $rootScope.name = 'outer'; + compile(''); - //change origin back to its previous value - $rootScope.name = 'aaa'; - $rootScope.$apply(); + expect($rootScope.name).toEqual('outer'); + expect(component.input).toEqual('$onInit'); - expect($rootScope.name).toBe('aaa'); - expect(componentScope.owRef).toBe('aaa'); - })); + $rootScope.$apply(); + expect($rootScope.name).toEqual('outer'); + expect(component.input).toEqual('$onInit'); - it('should not update origin when identity of isolate changes', inject(function() { - $rootScope.name = {mark:123}; - compile('
      '); + expect(log).toEqual([ + 'constructor', + ['$onChanges', jasmine.objectContaining({ currentValue: 'outer' })], + '$onInit' + ]); + }); + }); - expect($rootScope.name).toEqual({mark:123}); - expect(componentScope.owRef).toBe($rootScope.name); - expect(componentScope.owRefAlias).toBe($rootScope.name); + it('should update isolate again after $onInit if outer has changed (before initial watchAction call)', function() { + module('owComponentTest'); + inject(function() { + $rootScope.name = 'outer1'; + compile(''); + + expect(component.input).toEqual('$onInit'); + $rootScope.$apply('name = "outer2"'); + + expect($rootScope.name).toEqual('outer2'); + expect(component.input).toEqual('outer2'); + expect(log).toEqual([ + 'constructor', + ['$onChanges', jasmine.objectContaining({ currentValue: 'outer1' })], + '$onInit', + ['$onChanges', jasmine.objectContaining({ currentValue: 'outer2', previousValue: 'outer1' })] + ]); + }); + }); - componentScope.owRef = 'martin'; - $rootScope.$apply(); - expect($rootScope.name).toEqual({mark: 123}); - expect(componentScope.owRef).toBe('martin'); - expect(componentScope.owRefAlias).toEqual({mark: 123}); - })); + it('should update isolate again after $onInit if outer has changed (before initial watchAction call)', function() { + angular.module('owComponentTest') + .directive('changeInput', function() { + return function(scope, elem, attrs) { + scope.name = 'outer2'; + }; + }); + module('owComponentTest'); + inject(function() { + $rootScope.name = 'outer1'; + compile(''); + + expect(component.input).toEqual('$onInit'); + $rootScope.$digest(); + + expect($rootScope.name).toEqual('outer2'); + expect(component.input).toEqual('outer2'); + expect(log).toEqual([ + 'constructor', + ['$onChanges', jasmine.objectContaining({ currentValue: 'outer1' })], + '$onInit', + ['$onChanges', jasmine.objectContaining({ currentValue: 'outer2', previousValue: 'outer1' })] + ]); + }); + }); + }); + it('should not break when isolate and origin both change to the same value', inject(function() { + $rootScope.name = 'aaa'; + compile('
      '); - it('should update origin when property of isolate object reference changes', inject(function() { - $rootScope.obj = {mark:123}; - compile('
      '); + //change both sides to the same item within the same digest cycle + componentScope.owRef = 'same'; + $rootScope.name = 'same'; + $rootScope.$apply(); - expect($rootScope.obj).toEqual({mark:123}); - expect(componentScope.owRef).toBe($rootScope.obj); + //change origin back to its previous value + $rootScope.name = 'aaa'; + $rootScope.$apply(); - componentScope.owRef.mark = 789; - $rootScope.$apply(); - expect($rootScope.obj).toEqual({mark: 789}); - expect(componentScope.owRef).toBe($rootScope.obj); - })); + expect($rootScope.name).toBe('aaa'); + expect(componentScope.owRef).toBe('aaa'); + })); - it('should not throw on non assignable expressions in the parent', inject(function() { - compile('
      '); + it('should not update origin when identity of isolate changes', inject(function() { + $rootScope.name = {mark:123}; + compile('
      '); - $rootScope.name = 'world'; - $rootScope.$apply(); - expect(componentScope.owRef).toBe('hello world'); + expect($rootScope.name).toEqual({mark:123}); + expect(componentScope.owRef).toBe($rootScope.name); + expect(componentScope.owRefAlias).toBe($rootScope.name); - componentScope.owRef = 'ignore me'; - expect(componentScope.owRef).toBe('ignore me'); - expect($rootScope.name).toBe('world'); + componentScope.owRef = 'martin'; + $rootScope.$apply(); + expect($rootScope.name).toEqual({mark: 123}); + expect(componentScope.owRef).toBe('martin'); + expect(componentScope.owRefAlias).toEqual({mark: 123}); + })); - $rootScope.name = 'misko'; - $rootScope.$apply(); - expect(componentScope.owRef).toBe('hello misko'); - })); + it('should update origin when property of isolate object reference changes', inject(function() { + $rootScope.obj = {mark:123}; + compile('
      '); - it('should not throw when assigning to undefined', inject(function() { - compile('
      '); + expect($rootScope.obj).toEqual({mark:123}); + expect(componentScope.owRef).toBe($rootScope.obj); - expect(componentScope.owRef).toBeUndefined(); + componentScope.owRef.mark = 789; + $rootScope.$apply(); + expect($rootScope.obj).toEqual({mark: 789}); + expect(componentScope.owRef).toBe($rootScope.obj); + })); - componentScope.owRef = 'ignore me'; - expect(componentScope.owRef).toBe('ignore me'); - $rootScope.$apply(); - expect(componentScope.owRef).toBe('ignore me'); - })); + it('should not throw on non assignable expressions in the parent', inject(function() { + compile('
      '); + $rootScope.name = 'world'; + $rootScope.$apply(); + expect(componentScope.owRef).toBe('hello world'); - it('should update isolate scope when "<"-bound NaN changes', inject(function() { - $rootScope.num = NaN; - compile('
      '); + componentScope.owRef = 'ignore me'; + expect(componentScope.owRef).toBe('ignore me'); + expect($rootScope.name).toBe('world'); - var isolateScope = element.isolateScope(); - expect(isolateScope.owRef).toBeNaN(); + $rootScope.name = 'misko'; + $rootScope.$apply(); + expect(componentScope.owRef).toBe('hello misko'); + })); - $rootScope.num = 64; - $rootScope.$apply(); - expect(isolateScope.owRef).toBe(64); - })); + it('should not throw when assigning to undefined', inject(function() { + compile('
      '); - describe('literal objects', function() { - it('should copy parent changes', inject(function() { - compile('
      '); + expect(componentScope.owRef).toBeUndefined(); - $rootScope.name = 'a'; - $rootScope.$apply(); - expect(componentScope.owRef).toEqual({name: 'a'}); + componentScope.owRef = 'ignore me'; + expect(componentScope.owRef).toBe('ignore me'); - $rootScope.name = 'b'; - $rootScope.$apply(); - expect(componentScope.owRef).toEqual({name: 'b'}); - })); + $rootScope.$apply(); + expect(componentScope.owRef).toBe('ignore me'); + })); - it('should not change the isolated scope when origin does not change', inject(function() { - compile('
      '); + it('should update isolate scope when "<"-bound NaN changes', inject(function() { + $rootScope.num = NaN; + compile('
      '); - $rootScope.name = 'a'; - $rootScope.$apply(); - var lastComponentValue = componentScope.owRef; - $rootScope.$apply(); - expect(componentScope.owRef).toBe(lastComponentValue); - })); + var isolateScope = element.isolateScope(); + expect(isolateScope.owRef).toBeNaN(); + $rootScope.num = 64; + $rootScope.$apply(); + expect(isolateScope.owRef).toBe(64); + })); - it('should deep-watch array literals', inject(function() { - $rootScope.name = 'georgios'; - $rootScope.obj = {name: 'pete'}; - compile('
      '); - expect(componentScope.owRef).toEqual([{name: 'georgios'}, {name: 'pete'}]); + describe('literal objects', function() { + it('should copy parent changes', inject(function() { + compile('
      '); - $rootScope.name = 'lucas'; - $rootScope.obj = {name: 'martin'}; - $rootScope.$apply(); - expect(componentScope.owRef).toEqual([{name: 'lucas'}, {name: 'martin'}]); - })); + $rootScope.name = 'a'; + $rootScope.$apply(); + expect(componentScope.owRef).toEqual({name: 'a'}); + $rootScope.name = 'b'; + $rootScope.$apply(); + expect(componentScope.owRef).toEqual({name: 'b'}); + })); - it('should deep-watch object literals', inject(function() { - $rootScope.name = 'georgios'; - $rootScope.obj = {name: 'pete'}; - compile('
      '); - expect(componentScope.owRef).toEqual({name: 'georgios', item: {name: 'pete'}}); + it('should not change the isolated scope when origin does not change', inject(function() { + compile('
      '); - $rootScope.name = 'lucas'; - $rootScope.obj = {name: 'martin'}; - $rootScope.$apply(); - expect(componentScope.owRef).toEqual({name: 'lucas', item: {name: 'martin'}}); - })); + $rootScope.name = 'a'; + $rootScope.$apply(); + var lastComponentValue = componentScope.owRef; + $rootScope.$apply(); + expect(componentScope.owRef).toBe(lastComponentValue); + })); - it('should not complain when the isolated scope changes', inject(function() { - compile('
      '); + it('should deep-watch array literals', inject(function() { + $rootScope.name = 'georgios'; + $rootScope.obj = {name: 'pete'}; + compile('
      '); - $rootScope.name = 'a'; - $rootScope.$apply(); - componentScope.owRef = {name: 'b'}; - componentScope.$apply(); + expect(componentScope.owRef).toEqual([{name: 'georgios'}, {name: 'pete'}]); - expect(componentScope.owRef).toEqual({name: 'b'}); - expect($rootScope.name).toBe('a'); + $rootScope.name = 'lucas'; + $rootScope.obj = {name: 'martin'}; + $rootScope.$apply(); + expect(componentScope.owRef).toEqual([{name: 'lucas'}, {name: 'martin'}]); + })); - $rootScope.name = 'c'; - $rootScope.$apply(); - expect(componentScope.owRef).toEqual({name: 'c'}); - })); - it('should work for primitive literals', inject(function() { - test('1', 1); - test('null', null); - test('undefined', undefined); - test('\'someString\'', 'someString'); - test('true', true); + it('should deep-watch object literals', inject(function() { + $rootScope.name = 'georgios'; + $rootScope.obj = {name: 'pete'}; + compile('
      '); - function test(literalString, literalValue) { - compile('
      '); + expect(componentScope.owRef).toEqual({name: 'georgios', item: {name: 'pete'}}); - expect(componentScope.owRef).toBe(literalValue); - dealoc(element); - } - })); + $rootScope.name = 'lucas'; + $rootScope.obj = {name: 'martin'}; + $rootScope.$apply(); + expect(componentScope.owRef).toEqual({name: 'lucas', item: {name: 'martin'}}); + })); - describe('optional one-way binding', function() { - it('should update local when origin changes', inject(function() { - compile('
      '); - expect(componentScope.owOptref).toBeUndefined(); - expect(componentScope.owOptrefAlias).toBe(componentScope.owOptref); + it('should not complain when the isolated scope changes', inject(function() { + compile('
      '); - $rootScope.name = 'misko'; - $rootScope.$apply(); - expect(componentScope.owOptref).toBe($rootScope.name); - expect(componentScope.owOptrefAlias).toBe($rootScope.name); + $rootScope.name = 'a'; + $rootScope.$apply(); + componentScope.owRef = {name: 'b'}; + componentScope.$apply(); - $rootScope.name = {}; - $rootScope.$apply(); - expect(componentScope.owOptref).toBe($rootScope.name); - expect(componentScope.owOptrefAlias).toBe($rootScope.name); - })); + expect(componentScope.owRef).toEqual({name: 'b'}); + expect($rootScope.name).toBe('a'); - it('should not throw exception when reference does not exist', inject(function() { - compile('
      '); + $rootScope.name = 'c'; + $rootScope.$apply(); + expect(componentScope.owRef).toEqual({name: 'c'}); + })); - expect(componentScope.owOptref).toBeUndefined(); - expect(componentScope.owOptrefAlias).toBeUndefined(); - })); - }); - }); - }); + it('should work for primitive literals', inject(function() { + test('1', 1); + test('null', null); + test('undefined', undefined); + test('\'someString\'', 'someString'); + test('true', true); - describe('executable expression', function() { - it('should allow expression execution with locals', inject(function() { - compile('
      '); - $rootScope.count = 2; + function test(literalString, literalValue) { + compile('
      '); - expect(typeof componentScope.expr).toBe('function'); - expect(typeof componentScope.exprAlias).toBe('function'); + expect(componentScope.owRef).toBe(literalValue); + dealoc(element); + } + })); - expect(componentScope.expr({offset: 1})).toEqual(3); - expect($rootScope.count).toEqual(3); + describe('optional one-way binding', function() { + it('should update local when origin changes', inject(function() { + compile('
      '); - expect(componentScope.exprAlias({offset: 10})).toEqual(13); - expect($rootScope.count).toEqual(13); - })); - }); + expect(componentScope.owOptref).toBeUndefined(); + expect(componentScope.owOptrefAlias).toBe(componentScope.owOptref); - it('should throw on unknown definition', inject(function() { - expect(function() { - compile('
      '); - }).toThrowMinErr('$compile', 'iscp', 'Invalid isolate scope definition for directive \'badDeclaration\'. Definition: {... attr: \'xxx\' ...}'); - })); + $rootScope.name = 'misko'; + $rootScope.$apply(); + expect(componentScope.owOptref).toBe($rootScope.name); + expect(componentScope.owOptrefAlias).toBe($rootScope.name); - it('should expose a $$isolateBindings property onto the scope', inject(function() { - compile('
      '); - - expect(typeof componentScope.$$isolateBindings).toBe('object'); - - expect(componentScope.$$isolateBindings.attr.mode).toBe('@'); - expect(componentScope.$$isolateBindings.attr.attrName).toBe('attr'); - expect(componentScope.$$isolateBindings.attrAlias.attrName).toBe('attr'); - expect(componentScope.$$isolateBindings.ref.mode).toBe('='); - expect(componentScope.$$isolateBindings.ref.attrName).toBe('ref'); - expect(componentScope.$$isolateBindings.refAlias.attrName).toBe('ref'); - expect(componentScope.$$isolateBindings.reference.mode).toBe('='); - expect(componentScope.$$isolateBindings.reference.attrName).toBe('reference'); - expect(componentScope.$$isolateBindings.owRef.mode).toBe('<'); - expect(componentScope.$$isolateBindings.owRef.attrName).toBe('owRef'); - expect(componentScope.$$isolateBindings.owRefAlias.attrName).toBe('owRef'); - expect(componentScope.$$isolateBindings.expr.mode).toBe('&'); - expect(componentScope.$$isolateBindings.expr.attrName).toBe('expr'); - expect(componentScope.$$isolateBindings.exprAlias.attrName).toBe('expr'); - - var firstComponentScope = componentScope, - first$$isolateBindings = componentScope.$$isolateBindings; - - dealoc(element); - compile('
      '); - expect(componentScope).not.toBe(firstComponentScope); - expect(componentScope.$$isolateBindings).toBe(first$$isolateBindings); - })); + $rootScope.name = {}; + $rootScope.$apply(); + expect(componentScope.owOptref).toBe($rootScope.name); + expect(componentScope.owOptrefAlias).toBe($rootScope.name); + })); + it('should not throw exception when reference does not exist', inject(function() { + compile('
      '); - it('should expose isolate scope variables on controller with controllerAs when bindToController is true (template)', function() { - var controllerCalled = false; - module(function($compileProvider) { - $compileProvider.directive('fooDir', valueFn({ - template: '

      isolate

      ', - scope: { - 'data': '=dirData', - 'oneway': '
      ')($rootScope); - expect(controllerCalled).toBe(true); - }); - }); + }); + }); + describe('executable expression', function() { + it('should allow expression execution with locals', inject(function() { + compile('
      '); + $rootScope.count = 2; - it('should eventually expose isolate scope variables on ES6 class controller with controllerAs when bindToController is true', function() { - if (!/chrome/i.test(window.navigator.userAgent)) return; - var controllerCalled = false; - // eslint-disable-next-line no-eval - var Controller = eval( - 'class Foo {\n' + - ' constructor($scope) {}\n' + - ' $onInit() { this.check(); }\n' + - ' check() {\n' + - ' expect(this.data).toEqualData({\n' + - ' \'foo\': \'bar\',\n' + - ' \'baz\': \'biz\'\n' + - ' });\n' + - ' expect(this.oneway).toEqualData({\n' + - ' \'foo\': \'bar\',\n' + - ' \'baz\': \'biz\'\n' + - ' });\n' + - ' expect(this.str).toBe(\'Hello, world!\');\n' + - ' expect(this.fn()).toBe(\'called!\');\n' + - ' controllerCalled = true;\n' + - ' }\n' + - '}'); - spyOn(Controller.prototype, '$onInit').and.callThrough(); + expect(typeof componentScope.expr).toBe('function'); + expect(typeof componentScope.exprAlias).toBe('function'); - module(function($compileProvider) { - $compileProvider.directive('fooDir', valueFn({ - template: '

      isolate

      ', - scope: { - 'data': '=dirData', - 'oneway': '
      ')($rootScope); - expect(Controller.prototype.$onInit).toHaveBeenCalled(); - expect(controllerCalled).toBe(true); - }); - }); + expect(componentScope.expr({offset: 1})).toEqual(3); + expect($rootScope.count).toEqual(3); + expect(componentScope.exprAlias({offset: 10})).toEqual(13); + expect($rootScope.count).toEqual(13); + })); + }); - it('should update @-bindings on controller when bindToController and attribute change observed', function() { - module(function($compileProvider) { - $compileProvider.directive('atBinding', valueFn({ - template: '

      {{At.text}}

      ', - scope: { - text: '@atBinding' - }, - controller: function($scope) {}, - bindToController: true, - controllerAs: 'At' + it('should throw on unknown definition', inject(function() { + expect(function() { + compile('
      '); + }).toThrowMinErr('$compile', 'iscp', 'Invalid isolate scope definition for directive \'badDeclaration\'. Definition: {... attr: \'xxx\' ...}'); })); - }); - inject(function($compile, $rootScope) { - element = $compile('
      ')($rootScope); - var p = element.find('p'); - $rootScope.$digest(); - expect(p.text()).toBe('Test: '); + it('should expose a $$isolateBindings property onto the scope', inject(function() { + compile('
      '); + + expect(typeof componentScope.$$isolateBindings).toBe('object'); + + expect(componentScope.$$isolateBindings.attr.mode).toBe('@'); + expect(componentScope.$$isolateBindings.attr.attrName).toBe('attr'); + expect(componentScope.$$isolateBindings.attrAlias.attrName).toBe('attr'); + expect(componentScope.$$isolateBindings.ref.mode).toBe('='); + expect(componentScope.$$isolateBindings.ref.attrName).toBe('ref'); + expect(componentScope.$$isolateBindings.refAlias.attrName).toBe('ref'); + expect(componentScope.$$isolateBindings.reference.mode).toBe('='); + expect(componentScope.$$isolateBindings.reference.attrName).toBe('reference'); + expect(componentScope.$$isolateBindings.owRef.mode).toBe('<'); + expect(componentScope.$$isolateBindings.owRef.attrName).toBe('owRef'); + expect(componentScope.$$isolateBindings.owRefAlias.attrName).toBe('owRef'); + expect(componentScope.$$isolateBindings.expr.mode).toBe('&'); + expect(componentScope.$$isolateBindings.expr.attrName).toBe('expr'); + expect(componentScope.$$isolateBindings.exprAlias.attrName).toBe('expr'); + + var firstComponentScope = componentScope, + first$$isolateBindings = componentScope.$$isolateBindings; - $rootScope.text = 'Kittens'; - $rootScope.$digest(); - expect(p.text()).toBe('Test: Kittens'); - }); - }); + dealoc(element); + compile('
      '); + expect(componentScope).not.toBe(firstComponentScope); + expect(componentScope.$$isolateBindings).toBe(first$$isolateBindings); + })); - it('should expose isolate scope variables on controller with controllerAs when bindToController is true (templateUrl)', function() { - var controllerCalled = false; - module(function($compileProvider) { - $compileProvider.directive('fooDir', valueFn({ - templateUrl: 'test.html', - scope: { - 'data': '=dirData', - 'oneway': 'isolate

      ', + scope: { + 'data': '=dirData', + 'oneway': 'isolate

      '); - $rootScope.fn = valueFn('called!'); - $rootScope.whom = 'world'; - $rootScope.remoteData = { - 'foo': 'bar', - 'baz': 'biz' - }; - element = $compile('
      ')($rootScope); - $rootScope.$digest(); - expect(controllerCalled).toBe(true); - }); - }); + }; + element = $compile('
      ')($rootScope); + expect(controllerCalled).toBe(true); + }); + }); - it('should throw noctrl when missing controller', function() { - module(function($compileProvider) { - $compileProvider.directive('noCtrl', valueFn({ - templateUrl: 'test.html', - scope: { - 'data': '=dirData', - 'oneway': '')($rootScope); - }).toThrowMinErr('$compile', 'noctrl', - 'Cannot bind to controller without directive \'noCtrl\'s controller.'); - }); - }); - - - it('should throw badrestrict on first compilation when restrict is invalid', function() { - module(function($compileProvider, $exceptionHandlerProvider) { - $compileProvider.directive('invalidRestrictBadString', valueFn({restrict: '"'})); - $compileProvider.directive('invalidRestrictTrue', valueFn({restrict: true})); - $compileProvider.directive('invalidRestrictObject', valueFn({restrict: {}})); - $compileProvider.directive('invalidRestrictNumber', valueFn({restrict: 42})); - - // We need to test with the exceptionHandler not rethrowing... - $exceptionHandlerProvider.mode('log'); - }); - - inject(function($exceptionHandler, $compile, $rootScope) { - $compile('
      ')($rootScope); - expect($exceptionHandler.errors.length).toBe(1); - expect($exceptionHandler.errors[0]).toMatch(/\$compile.*badrestrict.*'true'/); - - $compile('
      ')($rootScope); - $compile('
      ')($rootScope); - expect($exceptionHandler.errors.length).toBe(2); - expect($exceptionHandler.errors[1]).toMatch(/\$compile.*badrestrict.*'"'/); - - $compile('
      ')($rootScope); - expect($exceptionHandler.errors.length).toBe(3); - expect($exceptionHandler.errors[2]).toMatch(/\$compile.*badrestrict.*'{}'/); - - $compile('
      ')($rootScope); - expect($exceptionHandler.errors.length).toBe(4); - expect($exceptionHandler.errors[3]).toMatch(/\$compile.*badrestrict.*'42'/); - }); - }); - - - it('should throw noident when missing controllerAs directive property', function() { - module(function($compileProvider) { - $compileProvider.directive('noIdent', valueFn({ - templateUrl: 'test.html', - scope: { - 'data': '=dirData', - 'oneway': '')($rootScope); - }).toThrowMinErr('$compile', 'noident', - 'Cannot bind to controller without identifier for directive \'noIdent\'.'); - }); - }); - - - it('should throw noident when missing controller identifier', function() { - module(function($compileProvider, $controllerProvider) { - $controllerProvider.register('myCtrl', function() {}); - $compileProvider.directive('noIdent', valueFn({ - templateUrl: 'test.html', - scope: { - 'data': '=dirData', - 'oneway': '')($rootScope); - }).toThrowMinErr('$compile', 'noident', - 'Cannot bind to controller without identifier for directive \'noIdent\'.'); - }); - }); - - - it('should bind to controller via object notation (isolate scope)', function() { - var controllerCalled = false; - module(function($compileProvider, $controllerProvider) { - $controllerProvider.register('myCtrl', function() { - expect(this.data).toEqualData({ - 'foo': 'bar', - 'baz': 'biz' - }); - expect(this.oneway).toEqualData({ - 'foo': 'bar', - 'baz': 'biz' - }); - expect(this.str).toBe('Hello, world!'); - expect(this.fn()).toBe('called!'); - controllerCalled = true; - }); - $compileProvider.directive('fooDir', valueFn({ - templateUrl: 'test.html', - bindToController: { - 'data': '=dirData', - 'oneway': 'isolate

      '); - $rootScope.fn = valueFn('called!'); - $rootScope.whom = 'world'; - $rootScope.remoteData = { - 'foo': 'bar', - 'baz': 'biz' - }; - element = $compile('
      ')($rootScope); - $rootScope.$digest(); - expect(controllerCalled).toBe(true); - }); - }); - - - it('should bind to controller via object notation (new scope)', function() { - var controllerCalled = false; - module(function($compileProvider, $controllerProvider) { - $controllerProvider.register('myCtrl', function() { - expect(this.data).toEqualData({ - 'foo': 'bar', - 'baz': 'biz' - }); - expect(this.data).toEqualData({ - 'foo': 'bar', - 'baz': 'biz' - }); - expect(this.str).toBe('Hello, world!'); - expect(this.fn()).toBe('called!'); - controllerCalled = true; - }); - $compileProvider.directive('fooDir', valueFn({ - templateUrl: 'test.html', - bindToController: { - 'data': '=dirData', - 'oneway': 'isolate

      '); - $rootScope.fn = valueFn('called!'); - $rootScope.whom = 'world'; - $rootScope.remoteData = { - 'foo': 'bar', - 'baz': 'biz' - }; - element = $compile('
      ')($rootScope); - $rootScope.$digest(); - expect(controllerCalled).toBe(true); - }); - }); - - - it('should bind to multiple directives controllers via object notation (no scope)', function() { - var controller1Called = false; - var controller2Called = false; - module(function($compileProvider, $controllerProvider) { - $compileProvider.directive('foo', valueFn({ - bindToController: { - 'data': '=fooData', - 'oneway': ' ' + - '
      ')($rootScope); - $rootScope.$digest(); - expect(controller1Called).toBe(true); - expect(controller2Called).toBe(true); - }); - }); - - - it('should bind to multiple directives controllers via object notation (new iso scope)', function() { - var controller1Called = false; - var controller2Called = false; - module(function($compileProvider, $controllerProvider) { - $compileProvider.directive('foo', valueFn({ - bindToController: { - 'data': '=fooData', - 'oneway': ' ' + - '
      ')($rootScope); - $rootScope.$digest(); - expect(controller1Called).toBe(true); - expect(controller2Called).toBe(true); - }); - }); - - - it('should bind to multiple directives controllers via object notation (new scope)', function() { - var controller1Called = false; - var controller2Called = false; - module(function($compileProvider, $controllerProvider) { - $compileProvider.directive('foo', valueFn({ - bindToController: { - 'data': '=fooData', - 'oneway': ' ' + - '
      ')($rootScope); - $rootScope.$digest(); - expect(controller1Called).toBe(true); - expect(controller2Called).toBe(true); - }); - }); - - - it('should evaluate against the correct scope, when using `bindToController` (new scope)', - function() { - module(function($compileProvider, $controllerProvider) { - $controllerProvider.register({ - 'ParentCtrl': function() { - this.value1 = 'parent1'; - this.value2 = 'parent2'; - this.value3 = function() { return 'parent3'; }; - this.value4 = 'parent4'; - }, - 'ChildCtrl': function() { - this.value1 = 'child1'; - this.value2 = 'child2'; - this.value3 = function() { return 'child3'; }; - this.value4 = 'child4'; - } + it('should not pre-assign bound properties to the controller if `preAssignBindingsEnabled` is disabled', function() { + var controllerCalled = false, onInitCalled = false; + module(function($compileProvider) { + $compileProvider.preAssignBindingsEnabled(false); + $compileProvider.directive('fooDir', valueFn({ + template: '

      isolate

      ', + scope: { + 'data': '=dirData', + 'oneway': '' + - '' + - '' + - '
      ')($rootScope); - $rootScope.$digest(); - - var parentCtrl = element.controller('ngController'); - var childCtrl = element.find('child').controller('child'); - - expect(childCtrl.fromParent1).toBe(parentCtrl.value1); - expect(childCtrl.fromParent1).not.toBe(childCtrl.value1); - expect(childCtrl.fromParent2).toBe(parentCtrl.value2); - expect(childCtrl.fromParent2).not.toBe(childCtrl.value2); - expect(childCtrl.fromParent3()()).toBe(parentCtrl.value3()); - expect(childCtrl.fromParent3()()).not.toBe(childCtrl.value3()); - expect(childCtrl.fromParent4).toBe(parentCtrl.value4); - expect(childCtrl.fromParent4).not.toBe(childCtrl.value4); - - childCtrl.fromParent2 = 'modified'; - $rootScope.$digest(); - - expect(parentCtrl.value2).toBe('modified'); - expect(childCtrl.value2).toBe('child2'); - }); - } - ); - - - it('should evaluate against the correct scope, when using `bindToController` (new iso scope)', - function() { - module(function($compileProvider, $controllerProvider) { - $controllerProvider.register({ - 'ParentCtrl': function() { - this.value1 = 'parent1'; - this.value2 = 'parent2'; - this.value3 = function() { return 'parent3'; }; - this.value4 = 'parent4'; - }, - 'ChildCtrl': function() { - this.value1 = 'child1'; - this.value2 = 'child2'; - this.value3 = function() { return 'child3'; }; - this.value4 = 'child4'; - } + inject(function($compile, $rootScope) { + $rootScope.fn = valueFn('called!'); + $rootScope.whom = 'world'; + $rootScope.remoteData = { + 'foo': 'bar', + 'baz': 'biz' + }; + element = $compile('
      ')($rootScope); + expect(controllerCalled).toBe(true); + expect(onInitCalled).toBe(true); }); - - $compileProvider.directive('child', valueFn({ - scope: {}, - controller: 'ChildCtrl as ctrl', - bindToController: { - fromParent1: '@', - fromParent2: '=', - fromParent3: '&', - fromParent4: '<' - }, - template: '' - })); - }); - - inject(function($compile, $rootScope) { - element = $compile( - '
      ' + - '' + - '' + - '
      ')($rootScope); - $rootScope.$digest(); - - var parentCtrl = element.controller('ngController'); - var childCtrl = element.find('child').controller('child'); - - expect(childCtrl.fromParent1).toBe(parentCtrl.value1); - expect(childCtrl.fromParent1).not.toBe(childCtrl.value1); - expect(childCtrl.fromParent2).toBe(parentCtrl.value2); - expect(childCtrl.fromParent2).not.toBe(childCtrl.value2); - expect(childCtrl.fromParent3()()).toBe(parentCtrl.value3()); - expect(childCtrl.fromParent3()()).not.toBe(childCtrl.value3()); - expect(childCtrl.fromParent4).toBe(parentCtrl.value4); - expect(childCtrl.fromParent4).not.toBe(childCtrl.value4); - - childCtrl.fromParent2 = 'modified'; - $rootScope.$digest(); - - expect(parentCtrl.value2).toBe('modified'); - expect(childCtrl.value2).toBe('child2'); }); - } - ); + it('should pre-assign bound properties to the controller if `preAssignBindingsEnabled` is enabled', function() { + var controllerCalled = false, onInitCalled = false; + module(function($compileProvider) { + $compileProvider.preAssignBindingsEnabled(true); + $compileProvider.directive('fooDir', valueFn({ + template: '

      isolate

      ', + scope: { + 'data': '=dirData', + 'oneway': '
      ')($rootScope); + expect(controllerCalled).toBe(true); + expect(onInitCalled).toBe(true); + }); + }); + + it('should eventually expose isolate scope variables on ES6 class controller with controllerAs when bindToController is true', function() { + if (!/chrome/i.test(window.navigator.userAgent)) return; + var controllerCalled = false; + // eslint-disable-next-line no-eval + var Controller = eval( + 'class Foo {\n' + + ' constructor($scope) {}\n' + + ' $onInit() { this.check(); }\n' + + ' check() {\n' + + ' expect(this.data).toEqualData({\n' + + ' \'foo\': \'bar\',\n' + + ' \'baz\': \'biz\'\n' + + ' });\n' + + ' expect(this.oneway).toEqualData({\n' + + ' \'foo\': \'bar\',\n' + + ' \'baz\': \'biz\'\n' + + ' });\n' + + ' expect(this.str).toBe(\'Hello, world!\');\n' + + ' expect(this.fn()).toBe(\'called!\');\n' + + ' controllerCalled = true;\n' + + ' }\n' + + '}'); + spyOn(Controller.prototype, '$onInit').and.callThrough(); - it('should put controller in scope when controller identifier present but not using controllerAs', function() { - var controllerCalled = false; - var myCtrl; - module(function($compileProvider, $controllerProvider) { - $controllerProvider.register('myCtrl', function() { - controllerCalled = true; - myCtrl = this; + module(function($compileProvider) { + $compileProvider.directive('fooDir', valueFn({ + template: '

      isolate

      ', + scope: { + 'data': '=dirData', + 'oneway': '
      ')($rootScope); + expect(Controller.prototype.$onInit).toHaveBeenCalled(); + expect(controllerCalled).toBe(true); + }); }); - $compileProvider.directive('fooDir', valueFn({ - templateUrl: 'test.html', - bindToController: {}, - scope: true, - controller: 'myCtrl as theCtrl' - })); - }); - inject(function($compile, $rootScope, $templateCache) { - $templateCache.put('test.html', '

      isolate

      '); - element = $compile('
      ')($rootScope); - $rootScope.$digest(); - expect(controllerCalled).toBe(true); - var childScope = element.children().scope(); - expect(childScope).not.toBe($rootScope); - expect(childScope.theCtrl).toBe(myCtrl); - }); - }); - it('should re-install controllerAs and bindings for returned value from controller (new scope)', function() { - var controllerCalled = false; - var myCtrl; - - function MyCtrl() { - } - MyCtrl.prototype.test = function() { - expect(this.data).toEqualData({ - 'foo': 'bar', - 'baz': 'biz' - }); - expect(this.oneway).toEqualData({ - 'foo': 'bar', - 'baz': 'biz' - }); - expect(this.str).toBe('Hello, world!'); - expect(this.fn()).toBe('called!'); - }; - - module(function($compileProvider, $controllerProvider) { - $controllerProvider.register('myCtrl', function() { - controllerCalled = true; - myCtrl = this; - return new MyCtrl(); - }); - $compileProvider.directive('fooDir', valueFn({ - templateUrl: 'test.html', - bindToController: { - 'data': '=dirData', - 'oneway': 'isolate

      '); - $rootScope.fn = valueFn('called!'); - $rootScope.whom = 'world'; - $rootScope.remoteData = { - 'foo': 'bar', - 'baz': 'biz' - }; - element = $compile('
      ')($rootScope); - $rootScope.$digest(); - expect(controllerCalled).toBe(true); - var childScope = element.children().scope(); - expect(childScope).not.toBe($rootScope); - expect(childScope.theCtrl).not.toBe(myCtrl); - expect(childScope.theCtrl.constructor).toBe(MyCtrl); - childScope.theCtrl.test(); - }); - }); - + it('should update @-bindings on controller when bindToController and attribute change observed', function() { + module(function($compileProvider) { + $compileProvider.directive('atBinding', valueFn({ + template: '

      {{At.text}}

      ', + scope: { + text: '@atBinding' + }, + controller: function($scope) {}, + bindToController: true, + controllerAs: 'At' + })); + }); - it('should re-install controllerAs and bindings for returned value from controller (isolate scope)', function() { - var controllerCalled = false; - var myCtrl; + inject(function($compile, $rootScope) { + element = $compile('
      ')($rootScope); + var p = element.find('p'); + $rootScope.$digest(); + expect(p.text()).toBe('Test: '); - function MyCtrl() { - } - MyCtrl.prototype.test = function() { - expect(this.data).toEqualData({ - 'foo': 'bar', - 'baz': 'biz' - }); - expect(this.oneway).toEqualData({ - 'foo': 'bar', - 'baz': 'biz' + $rootScope.text = 'Kittens'; + $rootScope.$digest(); + expect(p.text()).toBe('Test: Kittens'); + }); }); - expect(this.str).toBe('Hello, world!'); - expect(this.fn()).toBe('called!'); - }; - module(function($compileProvider, $controllerProvider) { - $controllerProvider.register('myCtrl', function() { - controllerCalled = true; - myCtrl = this; - return new MyCtrl(); - }); - $compileProvider.directive('fooDir', valueFn({ - templateUrl: 'test.html', - bindToController: true, - scope: { - 'data': '=dirData', - 'oneway': 'isolate

      '); - $rootScope.fn = valueFn('called!'); - $rootScope.whom = 'world'; - $rootScope.remoteData = { - 'foo': 'bar', - 'baz': 'biz' - }; - element = $compile('
      ')($rootScope); - $rootScope.$digest(); - expect(controllerCalled).toBe(true); - var childScope = element.children().scope(); - expect(childScope).not.toBe($rootScope); - expect(childScope.theCtrl).not.toBe(myCtrl); - expect(childScope.theCtrl.constructor).toBe(MyCtrl); - childScope.theCtrl.test(); - }); - }); - describe('should not overwrite @-bound property each digest when not present', function() { - it('when creating new scope', function() { - module(function($compileProvider) { - $compileProvider.directive('testDir', valueFn({ - scope: true, - bindToController: { - prop: '@' - }, - controller: function() { - var self = this; - this.prop = this.prop || 'default'; - this.getProp = function() { - return self.prop; - }; - }, - controllerAs: 'ctrl', - template: '

      ' - })); - }); - inject(function($compile, $rootScope) { - element = $compile('
      ')($rootScope); - var scope = element.scope(); - expect(scope.ctrl.getProp()).toBe('default'); - - $rootScope.$digest(); - expect(scope.ctrl.getProp()).toBe('default'); + it('should expose isolate scope variables on controller with controllerAs when bindToController is true (templateUrl)', function() { + var controllerCalled = false; + module(function($compileProvider) { + $compileProvider.directive('fooDir', valueFn({ + templateUrl: 'test.html', + scope: { + 'data': '=dirData', + 'oneway': 'isolate

      '); + $rootScope.fn = valueFn('called!'); + $rootScope.whom = 'world'; + $rootScope.remoteData = { + 'foo': 'bar', + 'baz': 'biz' + }; + element = $compile('
      ')($rootScope); + $rootScope.$digest(); + expect(controllerCalled).toBe(true); + }); }); - }); - it('when creating isolate scope', function() { - module(function($compileProvider) { - $compileProvider.directive('testDir', valueFn({ - scope: {}, - bindToController: { - prop: '@' - }, - controller: function() { - var self = this; - this.prop = this.prop || 'default'; - this.getProp = function() { - return self.prop; - }; - }, - controllerAs: 'ctrl', - template: '

      ' - })); - }); - inject(function($compile, $rootScope) { - element = $compile('
      ')($rootScope); - var scope = element.isolateScope(); - expect(scope.ctrl.getProp()).toBe('default'); - $rootScope.$digest(); - expect(scope.ctrl.getProp()).toBe('default'); + it('should throw noctrl when missing controller', function() { + module(function($compileProvider) { + $compileProvider.directive('noCtrl', valueFn({ + templateUrl: 'test.html', + scope: { + 'data': '=dirData', + 'oneway': '')($rootScope); + }).toThrowMinErr('$compile', 'noctrl', + 'Cannot bind to controller without directive \'noCtrl\'s controller.'); + }); }); - }); - }); - }); + it('should throw badrestrict on first compilation when restrict is invalid', function() { + module(function($compileProvider, $exceptionHandlerProvider) { + $compileProvider.directive('invalidRestrictBadString', valueFn({restrict: '"'})); + $compileProvider.directive('invalidRestrictTrue', valueFn({restrict: true})); + $compileProvider.directive('invalidRestrictObject', valueFn({restrict: {}})); + $compileProvider.directive('invalidRestrictNumber', valueFn({restrict: 42})); - describe('controller', function() { - it('should get required controller', function() { - module(function() { - directive('main', function(log) { - return { - priority: 2, - controller: function() { - this.name = 'main'; - }, - link: function(scope, element, attrs, controller) { - log(controller.name); - } - }; - }); - directive('dep', function(log) { - return { - priority: 1, - require: 'main', - link: function(scope, element, attrs, controller) { - log('dep:' + controller.name); - } - }; - }); - directive('other', function(log) { - return { - link: function(scope, element, attrs, controller) { - log(!!controller); // should be false - } - }; - }); - }); - inject(function(log, $compile, $rootScope) { - element = $compile('
      ')($rootScope); - expect(log).toEqual('false; dep:main; main'); - }); - }); - - - it('should respect explicit return value from controller', function() { - var expectedController; - module(function() { - directive('logControllerProp', function(log) { - return { - controller: function($scope) { - this.foo = 'baz'; // value should not be used. - expectedController = {foo: 'bar'}; - return expectedController; - }, - link: function(scope, element, attrs, controller) { - expect(expectedController).toBeDefined(); - expect(controller).toBe(expectedController); - expect(controller.foo).toBe('bar'); - log('done'); - } - }; - }); - }); - inject(function(log, $compile, $rootScope) { - element = $compile('')($rootScope); - expect(log).toEqual('done'); - expect(element.data('$logControllerPropController')).toBe(expectedController); - }); - }); + // We need to test with the exceptionHandler not rethrowing... + $exceptionHandlerProvider.mode('log'); + }); + inject(function($exceptionHandler, $compile, $rootScope) { + $compile('
      ')($rootScope); + expect($exceptionHandler.errors.length).toBe(1); + expect($exceptionHandler.errors[0]).toMatch(/\$compile.*badrestrict.*'true'/); - it('should get explicit return value of required parent controller', function() { - var expectedController; - module(function() { - directive('nested', function(log) { - return { - require: '^^?nested', - controller: function() { - if (!expectedController) expectedController = {foo: 'bar'}; - return expectedController; - }, - link: function(scope, element, attrs, controller) { - if (element.parent().length) { - expect(expectedController).toBeDefined(); - expect(controller).toBe(expectedController); - expect(controller.foo).toBe('bar'); - log('done'); - } - } - }; - }); - }); - inject(function(log, $compile, $rootScope) { - element = $compile('
      ')($rootScope); - expect(log).toEqual('done'); - expect(element.data('$nestedController')).toBe(expectedController); - }); - }); + $compile('
      ')($rootScope); + $compile('
      ')($rootScope); + expect($exceptionHandler.errors.length).toBe(2); + expect($exceptionHandler.errors[1]).toMatch(/\$compile.*badrestrict.*'"'/); + $compile('
      ')($rootScope); + expect($exceptionHandler.errors.length).toBe(3); + expect($exceptionHandler.errors[2]).toMatch(/\$compile.*badrestrict.*'{}'/); - it('should respect explicit controller return value when using controllerAs', function() { - module(function() { - directive('main', function() { - return { - templateUrl: 'main.html', - scope: {}, - controller: function() { - this.name = 'lucas'; - return {name: 'george'}; - }, - controllerAs: 'mainCtrl' - }; + $compile('
      ')($rootScope); + expect($exceptionHandler.errors.length).toBe(4); + expect($exceptionHandler.errors[3]).toMatch(/\$compile.*badrestrict.*'42'/); + }); }); - }); - inject(function($templateCache, $compile, $rootScope) { - $templateCache.put('main.html', 'template:{{mainCtrl.name}}'); - element = $compile('
      ')($rootScope); - $rootScope.$apply(); - expect(element.text()).toBe('template:george'); - }); - }); - it('transcluded children should receive explicit return value of parent controller', function() { - var expectedController; - module(function() { - directive('nester', valueFn({ - transclude: true, - controller: function($transclude) { - this.foo = 'baz'; - expectedController = {transclude:$transclude, foo: 'bar'}; - return expectedController; - }, - link: function(scope, el, attr, ctrl) { - ctrl.transclude(cloneAttach); - function cloneAttach(clone) { - el.append(clone); - } - } - })); - directive('nested', function(log) { - return { - require: '^^nester', - link: function(scope, element, attrs, controller) { - expect(controller).toBeDefined(); - expect(controller).toBe(expectedController); - log('done'); - } - }; + it('should throw noident when missing controllerAs directive property', function() { + module(function($compileProvider) { + $compileProvider.directive('noIdent', valueFn({ + templateUrl: 'test.html', + scope: { + 'data': '=dirData', + 'oneway': '')($rootScope); + }).toThrowMinErr('$compile', 'noident', + 'Cannot bind to controller without identifier for directive \'noIdent\'.'); + }); }); - }); - inject(function(log, $compile) { - element = $compile('
      ')($rootScope); - $rootScope.$apply(); - expect(log.toString()).toBe('done'); - expect(element.data('$nesterController')).toBe(expectedController); - }); - }); - it('explicit controller return values are ignored if they are primitives', function() { - module(function() { - directive('logControllerProp', function(log) { - return { - controller: function($scope) { - this.foo = 'baz'; // value *will* be used. - return 'bar'; - }, - link: function(scope, element, attrs, controller) { - log(controller.foo); - } - }; + it('should throw noident when missing controller identifier', function() { + module(function($compileProvider, $controllerProvider) { + $controllerProvider.register('myCtrl', function() {}); + $compileProvider.directive('noIdent', valueFn({ + templateUrl: 'test.html', + scope: { + 'data': '=dirData', + 'oneway': '')($rootScope); + }).toThrowMinErr('$compile', 'noident', + 'Cannot bind to controller without identifier for directive \'noIdent\'.'); + }); }); - }); - inject(function(log, $compile, $rootScope) { - element = $compile('')($rootScope); - expect(log).toEqual('baz'); - expect(element.data('$logControllerPropController').foo).toEqual('baz'); - }); - }); - - it('should correctly assign controller return values for multiple directives', function() { - var directiveController, otherDirectiveController; - module(function() { - - directive('myDirective', function(log) { - return { - scope: true, - controller: function($scope) { - directiveController = { - foo: 'bar' - }; - return directiveController; - } - }; - }); - directive('myOtherDirective', function(log) { - return { - controller: function($scope) { - otherDirectiveController = { - baz: 'luh' + it('should bind to controller via object notation (isolate scope)', function() { + var controllerCalled = false; + module(function($compileProvider, $controllerProvider) { + $controllerProvider.register('myCtrl', function() { + this.check = function() { + expect(this.data).toEqualData({ + 'foo': 'bar', + 'baz': 'biz' + }); + expect(this.oneway).toEqualData({ + 'foo': 'bar', + 'baz': 'biz' + }); + expect(this.str).toBe('Hello, world!'); + expect(this.fn()).toBe('called!'); }; - return otherDirectiveController; - } - }; + controllerCalled = true; + if (preAssignBindingsEnabled) { + this.check(); + } else { + this.$onInit = this.check; + } + }); + $compileProvider.directive('fooDir', valueFn({ + templateUrl: 'test.html', + bindToController: { + 'data': '=dirData', + 'oneway': 'isolate

      '); + $rootScope.fn = valueFn('called!'); + $rootScope.whom = 'world'; + $rootScope.remoteData = { + 'foo': 'bar', + 'baz': 'biz' + }; + element = $compile('
      ')($rootScope); + $rootScope.$digest(); + expect(controllerCalled).toBe(true); + }); }); - }); - - inject(function(log, $compile, $rootScope) { - element = $compile('')($rootScope); - expect(element.data('$myDirectiveController')).toBe(directiveController); - expect(element.data('$myOtherDirectiveController')).toBe(otherDirectiveController); - }); - }); - - it('should get required parent controller', function() { - module(function() { - directive('nested', function(log) { - return { - require: '^^?nested', - controller: function($scope) {}, - link: function(scope, element, attrs, controller) { - log(!!controller); - } - }; + it('should bind to controller via object notation (new scope)', function() { + var controllerCalled = false; + module(function($compileProvider, $controllerProvider) { + $controllerProvider.register('myCtrl', function() { + this.check = function() { + expect(this.data).toEqualData({ + 'foo': 'bar', + 'baz': 'biz' + }); + expect(this.data).toEqualData({ + 'foo': 'bar', + 'baz': 'biz' + }); + expect(this.str).toBe('Hello, world!'); + expect(this.fn()).toBe('called!'); + }; + controllerCalled = true; + if (preAssignBindingsEnabled) { + this.check(); + } else { + this.$onInit = this.check; + } + }); + $compileProvider.directive('fooDir', valueFn({ + templateUrl: 'test.html', + bindToController: { + 'data': '=dirData', + 'oneway': 'isolate

      '); + $rootScope.fn = valueFn('called!'); + $rootScope.whom = 'world'; + $rootScope.remoteData = { + 'foo': 'bar', + 'baz': 'biz' + }; + element = $compile('
      ')($rootScope); + $rootScope.$digest(); + expect(controllerCalled).toBe(true); + }); }); - }); - inject(function(log, $compile, $rootScope) { - element = $compile('
      ')($rootScope); - expect(log).toEqual('true; false'); - }); - }); - it('should get required parent controller when the question mark precedes the ^^', function() { - module(function() { - directive('nested', function(log) { - return { - require: '?^^nested', - controller: function($scope) {}, - link: function(scope, element, attrs, controller) { - log(!!controller); - } - }; + it('should bind to multiple directives controllers via object notation (no scope)', function() { + var controller1Called = false; + var controller2Called = false; + module(function($compileProvider, $controllerProvider) { + $compileProvider.directive('foo', valueFn({ + bindToController: { + 'data': '=fooData', + 'oneway': ' ' + + '
      ')($rootScope); + $rootScope.$digest(); + expect(controller1Called).toBe(true); + expect(controller2Called).toBe(true); + }); }); - }); - inject(function(log, $compile, $rootScope) { - element = $compile('
      ')($rootScope); - expect(log).toEqual('true; false'); - }); - }); - it('should throw if required parent is not found', function() { - module(function() { - directive('nested', function() { - return { - require: '^^nested', - controller: function($scope) {}, - link: function(scope, element, attrs, controller) {} - }; + it('should bind to multiple directives controllers via object notation (new iso scope)', function() { + var controller1Called = false; + var controller2Called = false; + module(function($compileProvider, $controllerProvider) { + $compileProvider.directive('foo', valueFn({ + bindToController: { + 'data': '=fooData', + 'oneway': ' ' + + '
      ')($rootScope); + $rootScope.$digest(); + expect(controller1Called).toBe(true); + expect(controller2Called).toBe(true); + }); }); - }); - inject(function($compile, $rootScope) { - expect(function() { - element = $compile('
      ')($rootScope); - }).toThrowMinErr('$compile', 'ctreq', 'Controller \'nested\', required by directive \'nested\', can\'t be found!'); - }); - }); - it('should get required controller via linkingFn (template)', function() { - module(function() { - directive('dirA', function() { - return { - controller: function() { - this.name = 'dirA'; - } - }; - }); - directive('dirB', function(log) { - return { - require: 'dirA', - template: '

      dirB

      ', - link: function(scope, element, attrs, dirAController) { - log('dirAController.name: ' + dirAController.name); - } - }; + it('should bind to multiple directives controllers via object notation (new scope)', function() { + var controller1Called = false; + var controller2Called = false; + module(function($compileProvider, $controllerProvider) { + $compileProvider.directive('foo', valueFn({ + bindToController: { + 'data': '=fooData', + 'oneway': ' ' + + '
      ')($rootScope); + $rootScope.$digest(); + expect(controller1Called).toBe(true); + expect(controller2Called).toBe(true); + }); }); - }); - inject(function(log, $compile, $rootScope) { - element = $compile('
      ')($rootScope); - expect(log).toEqual('dirAController.name: dirA'); - }); - }); - it('should get required controller via linkingFn (templateUrl)', function() { - module(function() { - directive('dirA', function() { - return { - controller: function() { - this.name = 'dirA'; - } - }; - }); - directive('dirB', function(log) { - return { - require: 'dirA', - templateUrl: 'dirB.html', - link: function(scope, element, attrs, dirAController) { - log('dirAController.name: ' + dirAController.name); - } - }; - }); - }); - inject(function(log, $compile, $rootScope, $templateCache) { - $templateCache.put('dirB.html', '

      dirB

      '); - element = $compile('
      ')($rootScope); - $rootScope.$digest(); - expect(log).toEqual('dirAController.name: dirA'); - }); - }); + it('should evaluate against the correct scope, when using `bindToController` (new scope)', + function() { + module(function($compileProvider, $controllerProvider) { + $controllerProvider.register({ + 'ParentCtrl': function() { + this.value1 = 'parent1'; + this.value2 = 'parent2'; + this.value3 = function() { return 'parent3'; }; + this.value4 = 'parent4'; + }, + 'ChildCtrl': function() { + this.value1 = 'child1'; + this.value2 = 'child2'; + this.value3 = function() { return 'child3'; }; + this.value4 = 'child4'; + } + }); - it('should bind the required controllers to the directive controller, if provided as an object and bindToController is truthy', function() { - var parentController, siblingController; + $compileProvider.directive('child', valueFn({ + scope: true, + controller: 'ChildCtrl as ctrl', + bindToController: { + fromParent1: '@', + fromParent2: '=', + fromParent3: '&', + fromParent4: '<' + }, + template: '' + })); + }); - function ParentController() { this.name = 'Parent'; } - function SiblingController() { this.name = 'Sibling'; } - function MeController() { this.name = 'Me'; } - MeController.prototype.$onInit = function() { - parentController = this.container; - siblingController = this.friend; - }; - spyOn(MeController.prototype, '$onInit').and.callThrough(); + inject(function($compile, $rootScope) { + element = $compile( + '
      ' + + '' + + '' + + '
      ')($rootScope); + $rootScope.$digest(); - angular.module('my', []) - .directive('me', function() { - return { - restrict: 'E', - scope: {}, - require: { container: '^parent', friend: 'sibling' }, - bindToController: true, - controller: MeController, - controllerAs: '$ctrl' - }; - }) - .directive('parent', function() { - return { - restrict: 'E', - scope: {}, - controller: ParentController - }; - }) - .directive('sibling', function() { - return { - controller: SiblingController - }; - }); + var parentCtrl = element.controller('ngController'); + var childCtrl = element.find('child').controller('child'); - module('my'); - inject(function($compile, $rootScope, meDirective) { - element = $compile('')($rootScope); - expect(MeController.prototype.$onInit).toHaveBeenCalled(); - expect(parentController).toEqual(jasmine.any(ParentController)); - expect(siblingController).toEqual(jasmine.any(SiblingController)); - }); - }); + expect(childCtrl.fromParent1).toBe(parentCtrl.value1); + expect(childCtrl.fromParent1).not.toBe(childCtrl.value1); + expect(childCtrl.fromParent2).toBe(parentCtrl.value2); + expect(childCtrl.fromParent2).not.toBe(childCtrl.value2); + expect(childCtrl.fromParent3()()).toBe(parentCtrl.value3()); + expect(childCtrl.fromParent3()()).not.toBe(childCtrl.value3()); + expect(childCtrl.fromParent4).toBe(parentCtrl.value4); + expect(childCtrl.fromParent4).not.toBe(childCtrl.value4); + + childCtrl.fromParent2 = 'modified'; + $rootScope.$digest(); - it('should use the key if the name of a required controller is omitted', function() { - function ParentController() { this.name = 'Parent'; } - function ParentOptController() { this.name = 'ParentOpt'; } - function ParentOrSiblingController() { this.name = 'ParentOrSibling'; } - function ParentOrSiblingOptController() { this.name = 'ParentOrSiblingOpt'; } - function SiblingController() { this.name = 'Sibling'; } - function SiblingOptController() { this.name = 'SiblingOpt'; } - - angular.module('my', []) - .component('me', { - require: { - parent: '^^', - parentOpt: '?^^', - parentOrSibling1: '^', - parentOrSiblingOpt1: '?^', - parentOrSibling2: '^', - parentOrSiblingOpt2: '?^', - sibling: '', - siblingOpt: '?' + expect(parentCtrl.value2).toBe('modified'); + expect(childCtrl.value2).toBe('child2'); + }); } - }) - .directive('parent', function() { - return {controller: ParentController}; - }) - .directive('parentOpt', function() { - return {controller: ParentOptController}; - }) - .directive('parentOrSibling1', function() { - return {controller: ParentOrSiblingController}; - }) - .directive('parentOrSiblingOpt1', function() { - return {controller: ParentOrSiblingOptController}; - }) - .directive('parentOrSibling2', function() { - return {controller: ParentOrSiblingController}; - }) - .directive('parentOrSiblingOpt2', function() { - return {controller: ParentOrSiblingOptController}; - }) - .directive('sibling', function() { - return {controller: SiblingController}; - }) - .directive('siblingOpt', function() { - return {controller: SiblingOptController}; - }); + ); - module('my'); - inject(function($compile, $rootScope) { - var template = - '
      ' + - // With optional - '' + - '' + - '' + - // Without optional - '' + - '' + - '' + - '
      '; - element = $compile(template)($rootScope); - - var ctrl1 = element.find('me').eq(0).controller('me'); - expect(ctrl1.parent).toEqual(jasmine.any(ParentController)); - expect(ctrl1.parentOpt).toEqual(jasmine.any(ParentOptController)); - expect(ctrl1.parentOrSibling1).toEqual(jasmine.any(ParentOrSiblingController)); - expect(ctrl1.parentOrSiblingOpt1).toEqual(jasmine.any(ParentOrSiblingOptController)); - expect(ctrl1.parentOrSibling2).toEqual(jasmine.any(ParentOrSiblingController)); - expect(ctrl1.parentOrSiblingOpt2).toEqual(jasmine.any(ParentOrSiblingOptController)); - expect(ctrl1.sibling).toEqual(jasmine.any(SiblingController)); - expect(ctrl1.siblingOpt).toEqual(jasmine.any(SiblingOptController)); - - var ctrl2 = element.find('me').eq(1).controller('me'); - expect(ctrl2.parent).toEqual(jasmine.any(ParentController)); - expect(ctrl2.parentOpt).toBe(null); - expect(ctrl2.parentOrSibling1).toEqual(jasmine.any(ParentOrSiblingController)); - expect(ctrl2.parentOrSiblingOpt1).toBe(null); - expect(ctrl2.parentOrSibling2).toEqual(jasmine.any(ParentOrSiblingController)); - expect(ctrl2.parentOrSiblingOpt2).toBe(null); - expect(ctrl2.sibling).toEqual(jasmine.any(SiblingController)); - expect(ctrl2.siblingOpt).toBe(null); - }); - }); + it('should evaluate against the correct scope, when using `bindToController` (new iso scope)', + function() { + module(function($compileProvider, $controllerProvider) { + $controllerProvider.register({ + 'ParentCtrl': function() { + this.value1 = 'parent1'; + this.value2 = 'parent2'; + this.value3 = function() { return 'parent3'; }; + this.value4 = 'parent4'; + }, + 'ChildCtrl': function() { + this.value1 = 'child1'; + this.value2 = 'child2'; + this.value3 = function() { return 'child3'; }; + this.value4 = 'child4'; + } + }); - it('should not bind required controllers if bindToController is falsy', function() { - var parentController, siblingController; + $compileProvider.directive('child', valueFn({ + scope: {}, + controller: 'ChildCtrl as ctrl', + bindToController: { + fromParent1: '@', + fromParent2: '=', + fromParent3: '&', + fromParent4: '<' + }, + template: '' + })); + }); - function ParentController() { this.name = 'Parent'; } - function SiblingController() { this.name = 'Sibling'; } - function MeController() { this.name = 'Me'; } - MeController.prototype.$onInit = function() { - parentController = this.container; - siblingController = this.friend; - }; - spyOn(MeController.prototype, '$onInit').and.callThrough(); + inject(function($compile, $rootScope) { + element = $compile( + '
      ' + + '' + + '' + + '
      ')($rootScope); + $rootScope.$digest(); - angular.module('my', []) - .directive('me', function() { - return { - restrict: 'E', - scope: {}, - require: { container: '^parent', friend: 'sibling' }, - controller: MeController - }; - }) - .directive('parent', function() { - return { - restrict: 'E', - scope: {}, - controller: ParentController - }; - }) - .directive('sibling', function() { - return { - controller: SiblingController - }; - }); + var parentCtrl = element.controller('ngController'); + var childCtrl = element.find('child').controller('child'); - module('my'); - inject(function($compile, $rootScope, meDirective) { - element = $compile('')($rootScope); - expect(MeController.prototype.$onInit).toHaveBeenCalled(); - expect(parentController).toBeUndefined(); - expect(siblingController).toBeUndefined(); - }); - }); + expect(childCtrl.fromParent1).toBe(parentCtrl.value1); + expect(childCtrl.fromParent1).not.toBe(childCtrl.value1); + expect(childCtrl.fromParent2).toBe(parentCtrl.value2); + expect(childCtrl.fromParent2).not.toBe(childCtrl.value2); + expect(childCtrl.fromParent3()()).toBe(parentCtrl.value3()); + expect(childCtrl.fromParent3()()).not.toBe(childCtrl.value3()); + expect(childCtrl.fromParent4).toBe(parentCtrl.value4); + expect(childCtrl.fromParent4).not.toBe(childCtrl.value4); - it('should bind required controllers to controller that has an explicit constructor return value', function() { - var parentController, siblingController, meController; + childCtrl.fromParent2 = 'modified'; + $rootScope.$digest(); - function ParentController() { this.name = 'Parent'; } - function SiblingController() { this.name = 'Sibling'; } - function MeController() { - meController = { - name: 'Me', - $onInit: function() { - parentController = this.container; - siblingController = this.friend; + expect(parentCtrl.value2).toBe('modified'); + expect(childCtrl.value2).toBe('child2'); + }); } - }; - spyOn(meController, '$onInit').and.callThrough(); - return meController; - } - - angular.module('my', []) - .directive('me', function() { - return { - restrict: 'E', - scope: {}, - require: { container: '^parent', friend: 'sibling' }, - bindToController: true, - controller: MeController, - controllerAs: '$ctrl' - }; - }) - .directive('parent', function() { - return { - restrict: 'E', - scope: {}, - controller: ParentController - }; - }) - .directive('sibling', function() { - return { - controller: SiblingController - }; - }); + ); - module('my'); - inject(function($compile, $rootScope, meDirective) { - element = $compile('')($rootScope); - expect(meController.$onInit).toHaveBeenCalled(); - expect(parentController).toEqual(jasmine.any(ParentController)); - expect(siblingController).toEqual(jasmine.any(SiblingController)); - }); - }); + it('should put controller in scope when controller identifier present but not using controllerAs', function() { + var controllerCalled = false; + var myCtrl; + module(function($compileProvider, $controllerProvider) { + $controllerProvider.register('myCtrl', function() { + controllerCalled = true; + myCtrl = this; + }); + $compileProvider.directive('fooDir', valueFn({ + templateUrl: 'test.html', + bindToController: {}, + scope: true, + controller: 'myCtrl as theCtrl' + })); + }); + inject(function($compile, $rootScope, $templateCache) { + $templateCache.put('test.html', '

      isolate

      '); + element = $compile('
      ')($rootScope); + $rootScope.$digest(); + expect(controllerCalled).toBe(true); + var childScope = element.children().scope(); + expect(childScope).not.toBe($rootScope); + expect(childScope.theCtrl).toBe(myCtrl); + }); + }); - it('should bind required controllers to controllers that return an explicit constructor return value', function() { - var parentController, containerController, siblingController, friendController, meController; - function MeController() { - this.name = 'Me'; - this.$onInit = function() { - containerController = this.container; - friendController = this.friend; - }; - } - function ParentController() { - parentController = { name: 'Parent' }; - return parentController; - } - function SiblingController() { - siblingController = { name: 'Sibling' }; - return siblingController; - } + it('should re-install controllerAs and bindings for returned value from controller (new scope)', function() { + var controllerCalled = false; + var myCtrl; - angular.module('my', []) - .directive('me', function() { - return { - priority: 1, // make sure it is run before sibling to test this case correctly - restrict: 'E', - scope: {}, - require: { container: '^parent', friend: 'sibling' }, - bindToController: true, - controller: MeController, - controllerAs: '$ctrl' - }; - }) - .directive('parent', function() { - return { - restrict: 'E', - scope: {}, - controller: ParentController - }; - }) - .directive('sibling', function() { - return { - controller: SiblingController + function MyCtrl() { + } + MyCtrl.prototype.test = function() { + expect(this.data).toEqualData({ + 'foo': 'bar', + 'baz': 'biz' + }); + expect(this.oneway).toEqualData({ + 'foo': 'bar', + 'baz': 'biz' + }); + expect(this.str).toBe('Hello, world!'); + expect(this.fn()).toBe('called!'); }; + + module(function($compileProvider, $controllerProvider) { + $controllerProvider.register('myCtrl', function() { + controllerCalled = true; + myCtrl = this; + return new MyCtrl(); + }); + $compileProvider.directive('fooDir', valueFn({ + templateUrl: 'test.html', + bindToController: { + 'data': '=dirData', + 'oneway': 'isolate

      '); + $rootScope.fn = valueFn('called!'); + $rootScope.whom = 'world'; + $rootScope.remoteData = { + 'foo': 'bar', + 'baz': 'biz' + }; + element = $compile('
      ')($rootScope); + $rootScope.$digest(); + expect(controllerCalled).toBe(true); + var childScope = element.children().scope(); + expect(childScope).not.toBe($rootScope); + expect(childScope.theCtrl).not.toBe(myCtrl); + expect(childScope.theCtrl.constructor).toBe(MyCtrl); + childScope.theCtrl.test(); + }); }); - module('my'); - inject(function($compile, $rootScope, meDirective) { - element = $compile('')($rootScope); - expect(containerController).toEqual(parentController); - expect(friendController).toEqual(siblingController); - }); - }); - it('should require controller of an isolate directive from a non-isolate directive on the ' + - 'same element', function() { - var IsolateController = function() {}; - var isolateDirControllerInNonIsolateDirective; + it('should re-install controllerAs and bindings for returned value from controller (isolate scope)', function() { + var controllerCalled = false; + var myCtrl; - module(function() { - directive('isolate', function() { - return { - scope: {}, - controller: IsolateController - }; - }); - directive('nonIsolate', function() { - return { - require: 'isolate', - link: function(_, __, ___, isolateDirController) { - isolateDirControllerInNonIsolateDirective = isolateDirController; - } + function MyCtrl() { + } + MyCtrl.prototype.test = function() { + expect(this.data).toEqualData({ + 'foo': 'bar', + 'baz': 'biz' + }); + expect(this.oneway).toEqualData({ + 'foo': 'bar', + 'baz': 'biz' + }); + expect(this.str).toBe('Hello, world!'); + expect(this.fn()).toBe('called!'); }; + + module(function($compileProvider, $controllerProvider) { + $controllerProvider.register('myCtrl', function() { + controllerCalled = true; + myCtrl = this; + return new MyCtrl(); + }); + $compileProvider.directive('fooDir', valueFn({ + templateUrl: 'test.html', + bindToController: true, + scope: { + 'data': '=dirData', + 'oneway': 'isolate

      '); + $rootScope.fn = valueFn('called!'); + $rootScope.whom = 'world'; + $rootScope.remoteData = { + 'foo': 'bar', + 'baz': 'biz' + }; + element = $compile('
      ')($rootScope); + $rootScope.$digest(); + expect(controllerCalled).toBe(true); + var childScope = element.children().scope(); + expect(childScope).not.toBe($rootScope); + expect(childScope.theCtrl).not.toBe(myCtrl); + expect(childScope.theCtrl.constructor).toBe(MyCtrl); + childScope.theCtrl.test(); + }); }); - }); - inject(function($compile, $rootScope) { - element = $compile('
      ')($rootScope); + describe('should not overwrite @-bound property each digest when not present', function() { + it('when creating new scope', function() { + module(function($compileProvider) { + $compileProvider.directive('testDir', valueFn({ + scope: true, + bindToController: { + prop: '@' + }, + controller: function() { + var self = this; + this.initProp = function() { + this.prop = this.prop || 'default'; + }; + if (preAssignBindingsEnabled) { + this.initProp(); + } else { + this.$onInit = this.initProp; + } + this.getProp = function() { + return self.prop; + }; + }, + controllerAs: 'ctrl', + template: '

      ' + })); + }); + inject(function($compile, $rootScope) { + element = $compile('
      ')($rootScope); + var scope = element.scope(); + expect(scope.ctrl.getProp()).toBe('default'); - expect(isolateDirControllerInNonIsolateDirective).toBeDefined(); - expect(isolateDirControllerInNonIsolateDirective instanceof IsolateController).toBe(true); - }); - }); + $rootScope.$digest(); + expect(scope.ctrl.getProp()).toBe('default'); + }); + }); + it('when creating isolate scope', function() { + module(function($compileProvider) { + $compileProvider.directive('testDir', valueFn({ + scope: {}, + bindToController: { + prop: '@' + }, + controller: function() { + var self = this; + this.initProp = function() { + this.prop = this.prop || 'default'; + }; + this.getProp = function() { + return self.prop; + }; + if (preAssignBindingsEnabled) { + this.initProp(); + } else { + this.$onInit = this.initProp; + } + }, + controllerAs: 'ctrl', + template: '

      ' + })); + }); + inject(function($compile, $rootScope) { + element = $compile('
      ')($rootScope); + var scope = element.isolateScope(); + expect(scope.ctrl.getProp()).toBe('default'); - it('should give the isolate scope to the controller of another replaced directives in the template', function() { - module(function() { - directive('testDirective', function() { - return { - replace: true, - restrict: 'E', - scope: {}, - template: '' - }; + $rootScope.$digest(); + expect(scope.ctrl.getProp()).toBe('default'); + }); + }); }); - }); - inject(function($rootScope) { - compile('
      '); - - element = element.children().eq(0); - expect(element[0].checked).toBe(false); - element.isolateScope().model = true; - $rootScope.$digest(); - expect(element[0].checked).toBe(true); }); - }); - - it('should share isolate scope with replaced directives (template)', function() { - var normalScope; - var isolateScope; + describe('require', function() { - module(function() { - directive('isolate', function() { - return { - replace: true, - scope: {}, - template: '{{name}}', - link: function(s) { - isolateScope = s; - } - }; - }); - directive('nonIsolate', function() { - return { - link: function(s) { - normalScope = s; - } - }; + it('should get required controller', function() { + module(function() { + directive('main', function(log) { + return { + priority: 2, + controller: function() { + this.name = 'main'; + }, + link: function(scope, element, attrs, controller) { + log(controller.name); + } + }; + }); + directive('dep', function(log) { + return { + priority: 1, + require: 'main', + link: function(scope, element, attrs, controller) { + log('dep:' + controller.name); + } + }; + }); + directive('other', function(log) { + return { + link: function(scope, element, attrs, controller) { + log(!!controller); // should be false + } + }; + }); + }); + inject(function(log, $compile, $rootScope) { + element = $compile('
      ')($rootScope); + expect(log).toEqual('false; dep:main; main'); + }); }); - }); - inject(function($compile, $rootScope) { - element = $compile('
      ')($rootScope); - - expect(normalScope).toBe($rootScope); - expect(normalScope.name).toEqual(undefined); - expect(isolateScope.name).toEqual('WORKS'); - $rootScope.$digest(); - expect(element.text()).toEqual('WORKS'); - }); - }); + it('should respect explicit return value from controller', function() { + var expectedController; + module(function() { + directive('logControllerProp', function(log) { + return { + controller: function($scope) { + this.foo = 'baz'; // value should not be used. + expectedController = {foo: 'bar'}; + return expectedController; + }, + link: function(scope, element, attrs, controller) { + expect(expectedController).toBeDefined(); + expect(controller).toBe(expectedController); + expect(controller.foo).toBe('bar'); + log('done'); + } + }; + }); + }); + inject(function(log, $compile, $rootScope) { + element = $compile('')($rootScope); + expect(log).toEqual('done'); + expect(element.data('$logControllerPropController')).toBe(expectedController); + }); + }); - it('should share isolate scope with replaced directives (templateUrl)', function() { - var normalScope; - var isolateScope; - module(function() { - directive('isolate', function() { - return { - replace: true, - scope: {}, - templateUrl: 'main.html', - link: function(s) { - isolateScope = s; - } - }; - }); - directive('nonIsolate', function() { - return { - link: function(s) { - normalScope = s; - } - }; + it('should get explicit return value of required parent controller', function() { + var expectedController; + module(function() { + directive('nested', function(log) { + return { + require: '^^?nested', + controller: function() { + if (!expectedController) expectedController = {foo: 'bar'}; + return expectedController; + }, + link: function(scope, element, attrs, controller) { + if (element.parent().length) { + expect(expectedController).toBeDefined(); + expect(controller).toBe(expectedController); + expect(controller.foo).toBe('bar'); + log('done'); + } + } + }; + }); + }); + inject(function(log, $compile, $rootScope) { + element = $compile('
      ')($rootScope); + expect(log).toEqual('done'); + expect(element.data('$nestedController')).toBe(expectedController); + }); }); - }); - - inject(function($compile, $rootScope, $templateCache) { - $templateCache.put('main.html', '{{name}}'); - element = $compile('
      ')($rootScope); - $rootScope.$apply(); - expect(normalScope).toBe($rootScope); - expect(normalScope.name).toEqual(undefined); - expect(isolateScope.name).toEqual('WORKS'); - expect(element.text()).toEqual('WORKS'); - }); - }); + it('should respect explicit controller return value when using controllerAs', function() { + module(function() { + directive('main', function() { + return { + templateUrl: 'main.html', + scope: {}, + controller: function() { + this.name = 'lucas'; + return {name: 'george'}; + }, + controllerAs: 'mainCtrl' + }; + }); + }); + inject(function($templateCache, $compile, $rootScope) { + $templateCache.put('main.html', 'template:{{mainCtrl.name}}'); + element = $compile('
      ')($rootScope); + $rootScope.$apply(); + expect(element.text()).toBe('template:george'); + }); + }); - it('should not get confused about where to use isolate scope when a replaced directive is used multiple times', - function() { - module(function() { - directive('isolate', function() { - return { - replace: true, - scope: {}, - template: '' - }; - }); - directive('scopeTester', function(log) { - return { - link: function($scope, $element) { - log($element.attr('scope-tester') + '=' + ($scope.$root === $scope ? 'non-isolate' : 'isolate')); - } - }; + it('transcluded children should receive explicit return value of parent controller', function() { + var expectedController; + module(function() { + directive('nester', valueFn({ + transclude: true, + controller: function($transclude) { + this.foo = 'baz'; + expectedController = {transclude:$transclude, foo: 'bar'}; + return expectedController; + }, + link: function(scope, el, attr, ctrl) { + ctrl.transclude(cloneAttach); + function cloneAttach(clone) { + el.append(clone); + } + } + })); + directive('nested', function(log) { + return { + require: '^^nester', + link: function(scope, element, attrs, controller) { + expect(controller).toBeDefined(); + expect(controller).toBe(expectedController); + log('done'); + } + }; + }); + }); + inject(function(log, $compile) { + element = $compile('
      ')($rootScope); + $rootScope.$apply(); + expect(log.toString()).toBe('done'); + expect(element.data('$nesterController')).toBe(expectedController); + }); }); - }); - - inject(function($compile, $rootScope, log) { - element = $compile('
      ' + - '
      ' + - '' + - '
      ')($rootScope); - $rootScope.$digest(); - expect(log).toEqual('inside=isolate; ' + - 'outside replaced=non-isolate; ' + // outside - 'outside replaced=isolate; ' + // replaced - 'sibling=non-isolate'); - }); - }); + it('explicit controller return values are ignored if they are primitives', function() { + module(function() { + directive('logControllerProp', function(log) { + return { + controller: function($scope) { + this.foo = 'baz'; // value *will* be used. + return 'bar'; + }, + link: function(scope, element, attrs, controller) { + log(controller.foo); + } + }; + }); + }); + inject(function(log, $compile, $rootScope) { + element = $compile('')($rootScope); + expect(log).toEqual('baz'); + expect(element.data('$logControllerPropController').foo).toEqual('baz'); + }); + }); - it('should require controller of a non-isolate directive from an isolate directive on the ' + - 'same element', function() { - var NonIsolateController = function() {}; - var nonIsolateDirControllerInIsolateDirective; - module(function() { - directive('isolate', function() { - return { - scope: {}, - require: 'nonIsolate', - link: function(_, __, ___, nonIsolateDirController) { - nonIsolateDirControllerInIsolateDirective = nonIsolateDirController; - } - }; - }); - directive('nonIsolate', function() { - return { - controller: NonIsolateController - }; - }); - }); + it('should correctly assign controller return values for multiple directives', function() { + var directiveController, otherDirectiveController; + module(function() { - inject(function($compile, $rootScope) { - element = $compile('
      ')($rootScope); + directive('myDirective', function(log) { + return { + scope: true, + controller: function($scope) { + directiveController = { + foo: 'bar' + }; + return directiveController; + } + }; + }); - expect(nonIsolateDirControllerInIsolateDirective).toBeDefined(); - expect(nonIsolateDirControllerInIsolateDirective instanceof NonIsolateController).toBe(true); - }); - }); + directive('myOtherDirective', function(log) { + return { + controller: function($scope) { + otherDirectiveController = { + baz: 'luh' + }; + return otherDirectiveController; + } + }; + }); + }); - it('should support controllerAs', function() { - module(function() { - directive('main', function() { - return { - templateUrl: 'main.html', - transclude: true, - scope: {}, - controller: function() { - this.name = 'lucas'; - }, - controllerAs: 'mainCtrl' - }; + inject(function(log, $compile, $rootScope) { + element = $compile('')($rootScope); + expect(element.data('$myDirectiveController')).toBe(directiveController); + expect(element.data('$myOtherDirectiveController')).toBe(otherDirectiveController); + }); }); - }); - inject(function($templateCache, $compile, $rootScope) { - $templateCache.put('main.html', 'template:{{mainCtrl.name}}
      '); - element = $compile('
      transclude:{{mainCtrl.name}}
      ')($rootScope); - $rootScope.$apply(); - expect(element.text()).toBe('template:lucas transclude:'); - }); - }); - it('should support controller alias', function() { - module(function($controllerProvider) { - $controllerProvider.register('MainCtrl', function() { - this.name = 'lucas'; + it('should get required parent controller', function() { + module(function() { + directive('nested', function(log) { + return { + require: '^^?nested', + controller: function($scope) {}, + link: function(scope, element, attrs, controller) { + log(!!controller); + } + }; + }); + }); + inject(function(log, $compile, $rootScope) { + element = $compile('
      ')($rootScope); + expect(log).toEqual('true; false'); + }); }); - directive('main', function() { - return { - templateUrl: 'main.html', - scope: {}, - controller: 'MainCtrl as mainCtrl' - }; + + + it('should get required parent controller when the question mark precedes the ^^', function() { + module(function() { + directive('nested', function(log) { + return { + require: '?^^nested', + controller: function($scope) {}, + link: function(scope, element, attrs, controller) { + log(!!controller); + } + }; + }); + }); + inject(function(log, $compile, $rootScope) { + element = $compile('
      ')($rootScope); + expect(log).toEqual('true; false'); + }); }); - }); - inject(function($templateCache, $compile, $rootScope) { - $templateCache.put('main.html', '{{mainCtrl.name}}'); - element = $compile('
      ')($rootScope); - $rootScope.$apply(); - expect(element.text()).toBe('lucas'); - }); - }); - - it('should require controller on parent element',function() { - module(function() { - directive('main', function(log) { - return { - controller: function() { - this.name = 'main'; - } - }; - }); - directive('dep', function(log) { - return { - require: '^main', - link: function(scope, element, attrs, controller) { - log('dep:' + controller.name); - } - }; + it('should throw if required parent is not found', function() { + module(function() { + directive('nested', function() { + return { + require: '^^nested', + controller: function($scope) {}, + link: function(scope, element, attrs, controller) {} + }; + }); + }); + inject(function($compile, $rootScope) { + expect(function() { + element = $compile('
      ')($rootScope); + }).toThrowMinErr('$compile', 'ctreq', 'Controller \'nested\', required by directive \'nested\', can\'t be found!'); + }); }); - }); - inject(function(log, $compile, $rootScope) { - element = $compile('
      ')($rootScope); - expect(log).toEqual('dep:main'); - }); - }); - it('should throw an error if required controller can\'t be found',function() { - module(function() { - directive('dep', function(log) { - return { - require: '^main', - link: function(scope, element, attrs, controller) { - log('dep:' + controller.name); - } - }; + it('should get required controller via linkingFn (template)', function() { + module(function() { + directive('dirA', function() { + return { + controller: function() { + this.name = 'dirA'; + } + }; + }); + directive('dirB', function(log) { + return { + require: 'dirA', + template: '

      dirB

      ', + link: function(scope, element, attrs, dirAController) { + log('dirAController.name: ' + dirAController.name); + } + }; + }); + }); + inject(function(log, $compile, $rootScope) { + element = $compile('
      ')($rootScope); + expect(log).toEqual('dirAController.name: dirA'); + }); }); - }); - inject(function(log, $compile, $rootScope) { - expect(function() { - $compile('
      ')($rootScope); - }).toThrowMinErr('$compile', 'ctreq', 'Controller \'main\', required by directive \'dep\', can\'t be found!'); - }); - }); - it('should pass null if required controller can\'t be found and is optional',function() { - module(function() { - directive('dep', function(log) { - return { - require: '?^main', - link: function(scope, element, attrs, controller) { - log('dep:' + controller); - } - }; + it('should get required controller via linkingFn (templateUrl)', function() { + module(function() { + directive('dirA', function() { + return { + controller: function() { + this.name = 'dirA'; + } + }; + }); + directive('dirB', function(log) { + return { + require: 'dirA', + templateUrl: 'dirB.html', + link: function(scope, element, attrs, dirAController) { + log('dirAController.name: ' + dirAController.name); + } + }; + }); + }); + inject(function(log, $compile, $rootScope, $templateCache) { + $templateCache.put('dirB.html', '

      dirB

      '); + element = $compile('
      ')($rootScope); + $rootScope.$digest(); + expect(log).toEqual('dirAController.name: dirA'); + }); }); - }); - inject(function(log, $compile, $rootScope) { - $compile('
      ')($rootScope); - expect(log).toEqual('dep:null'); - }); - }); + it('should bind the required controllers to the directive controller, if provided as an object and bindToController is truthy', function() { + var parentController, siblingController; - it('should pass null if required controller can\'t be found and is optional with the question mark on the right',function() { - module(function() { - directive('dep', function(log) { - return { - require: '^?main', - link: function(scope, element, attrs, controller) { - log('dep:' + controller); - } + function ParentController() { this.name = 'Parent'; } + function SiblingController() { this.name = 'Sibling'; } + function MeController() { this.name = 'Me'; } + MeController.prototype.$onInit = function() { + parentController = this.container; + siblingController = this.friend; }; - }); - }); - inject(function(log, $compile, $rootScope) { - $compile('
      ')($rootScope); - expect(log).toEqual('dep:null'); - }); - }); + spyOn(MeController.prototype, '$onInit').and.callThrough(); + angular.module('my', []) + .directive('me', function() { + return { + restrict: 'E', + scope: {}, + require: { container: '^parent', friend: 'sibling' }, + bindToController: true, + controller: MeController, + controllerAs: '$ctrl' + }; + }) + .directive('parent', function() { + return { + restrict: 'E', + scope: {}, + controller: ParentController + }; + }) + .directive('sibling', function() { + return { + controller: SiblingController + }; + }); - it('should have optional controller on current element', function() { - module(function() { - directive('dep', function(log) { - return { - require: '?main', - link: function(scope, element, attrs, controller) { - log('dep:' + !!controller); - } + module('my'); + inject(function($compile, $rootScope, meDirective) { + element = $compile('')($rootScope); + expect(MeController.prototype.$onInit).toHaveBeenCalled(); + expect(parentController).toEqual(jasmine.any(ParentController)); + expect(siblingController).toEqual(jasmine.any(SiblingController)); + }); + }); + + it('should use the key if the name of a required controller is omitted', function() { + function ParentController() { this.name = 'Parent'; } + function ParentOptController() { this.name = 'ParentOpt'; } + function ParentOrSiblingController() { this.name = 'ParentOrSibling'; } + function ParentOrSiblingOptController() { this.name = 'ParentOrSiblingOpt'; } + function SiblingController() { this.name = 'Sibling'; } + function SiblingOptController() { this.name = 'SiblingOpt'; } + + angular.module('my', []) + .component('me', { + require: { + parent: '^^', + parentOpt: '?^^', + parentOrSibling1: '^', + parentOrSiblingOpt1: '?^', + parentOrSibling2: '^', + parentOrSiblingOpt2: '?^', + sibling: '', + siblingOpt: '?' + } + }) + .directive('parent', function() { + return {controller: ParentController}; + }) + .directive('parentOpt', function() { + return {controller: ParentOptController}; + }) + .directive('parentOrSibling1', function() { + return {controller: ParentOrSiblingController}; + }) + .directive('parentOrSiblingOpt1', function() { + return {controller: ParentOrSiblingOptController}; + }) + .directive('parentOrSibling2', function() { + return {controller: ParentOrSiblingController}; + }) + .directive('parentOrSiblingOpt2', function() { + return {controller: ParentOrSiblingOptController}; + }) + .directive('sibling', function() { + return {controller: SiblingController}; + }) + .directive('siblingOpt', function() { + return {controller: SiblingOptController}; + }); + + module('my'); + inject(function($compile, $rootScope) { + var template = + '
      ' + + // With optional + '' + + '' + + '' + + // Without optional + '' + + '' + + '' + + '
      '; + element = $compile(template)($rootScope); + + var ctrl1 = element.find('me').eq(0).controller('me'); + expect(ctrl1.parent).toEqual(jasmine.any(ParentController)); + expect(ctrl1.parentOpt).toEqual(jasmine.any(ParentOptController)); + expect(ctrl1.parentOrSibling1).toEqual(jasmine.any(ParentOrSiblingController)); + expect(ctrl1.parentOrSiblingOpt1).toEqual(jasmine.any(ParentOrSiblingOptController)); + expect(ctrl1.parentOrSibling2).toEqual(jasmine.any(ParentOrSiblingController)); + expect(ctrl1.parentOrSiblingOpt2).toEqual(jasmine.any(ParentOrSiblingOptController)); + expect(ctrl1.sibling).toEqual(jasmine.any(SiblingController)); + expect(ctrl1.siblingOpt).toEqual(jasmine.any(SiblingOptController)); + + var ctrl2 = element.find('me').eq(1).controller('me'); + expect(ctrl2.parent).toEqual(jasmine.any(ParentController)); + expect(ctrl2.parentOpt).toBe(null); + expect(ctrl2.parentOrSibling1).toEqual(jasmine.any(ParentOrSiblingController)); + expect(ctrl2.parentOrSiblingOpt1).toBe(null); + expect(ctrl2.parentOrSibling2).toEqual(jasmine.any(ParentOrSiblingController)); + expect(ctrl2.parentOrSiblingOpt2).toBe(null); + expect(ctrl2.sibling).toEqual(jasmine.any(SiblingController)); + expect(ctrl2.siblingOpt).toBe(null); + }); + }); + + + it('should not bind required controllers if bindToController is falsy', function() { + var parentController, siblingController; + + function ParentController() { this.name = 'Parent'; } + function SiblingController() { this.name = 'Sibling'; } + function MeController() { this.name = 'Me'; } + MeController.prototype.$onInit = function() { + parentController = this.container; + siblingController = this.friend; }; - }); - }); - inject(function(log, $compile, $rootScope) { - element = $compile('
      ')($rootScope); - expect(log).toEqual('dep:false'); - }); - }); + spyOn(MeController.prototype, '$onInit').and.callThrough(); + angular.module('my', []) + .directive('me', function() { + return { + restrict: 'E', + scope: {}, + require: { container: '^parent', friend: 'sibling' }, + controller: MeController + }; + }) + .directive('parent', function() { + return { + restrict: 'E', + scope: {}, + controller: ParentController + }; + }) + .directive('sibling', function() { + return { + controller: SiblingController + }; + }); - it('should support multiple controllers', function() { - module(function() { - directive('c1', valueFn({ - controller: function() { this.name = 'c1'; } - })); - directive('c2', valueFn({ - controller: function() { this.name = 'c2'; } - })); - directive('dep', function(log) { - return { - require: ['^c1', '^c2'], - link: function(scope, element, attrs, controller) { - log('dep:' + controller[0].name + '-' + controller[1].name); - } - }; + module('my'); + inject(function($compile, $rootScope, meDirective) { + element = $compile('')($rootScope); + expect(MeController.prototype.$onInit).toHaveBeenCalled(); + expect(parentController).toBeUndefined(); + expect(siblingController).toBeUndefined(); + }); }); - }); - inject(function(log, $compile, $rootScope) { - element = $compile('
      ')($rootScope); - expect(log).toEqual('dep:c1-c2'); - }); - }); - it('should support multiple controllers as an object hash', function() { - module(function() { - directive('c1', valueFn({ - controller: function() { this.name = 'c1'; } - })); - directive('c2', valueFn({ - controller: function() { this.name = 'c2'; } - })); - directive('dep', function(log) { - return { - require: { myC1: '^c1', myC2: '^c2' }, - link: function(scope, element, attrs, controllers) { - log('dep:' + controllers.myC1.name + '-' + controllers.myC2.name); - } - }; - }); - }); - inject(function(log, $compile, $rootScope) { - element = $compile('
      ')($rootScope); - expect(log).toEqual('dep:c1-c2'); - }); - }); + it('should bind required controllers to controller that has an explicit constructor return value', function() { + var parentController, siblingController, meController; - it('should support omitting the name of the required controller if it is the same as the key', - function() { - module(function() { - directive('myC1', valueFn({ - controller: function() { this.name = 'c1'; } - })); - directive('myC2', valueFn({ - controller: function() { this.name = 'c2'; } - })); - directive('dep', function(log) { - return { - require: { myC1: '^', myC2: '^' }, - link: function(scope, element, attrs, controllers) { - log('dep:' + controllers.myC1.name + '-' + controllers.myC2.name); + function ParentController() { this.name = 'Parent'; } + function SiblingController() { this.name = 'Sibling'; } + function MeController() { + meController = { + name: 'Me', + $onInit: function() { + parentController = this.container; + siblingController = this.friend; } }; + spyOn(meController, '$onInit').and.callThrough(); + return meController; + } + + angular.module('my', []) + .directive('me', function() { + return { + restrict: 'E', + scope: {}, + require: { container: '^parent', friend: 'sibling' }, + bindToController: true, + controller: MeController, + controllerAs: '$ctrl' + }; + }) + .directive('parent', function() { + return { + restrict: 'E', + scope: {}, + controller: ParentController + }; + }) + .directive('sibling', function() { + return { + controller: SiblingController + }; + }); + + module('my'); + inject(function($compile, $rootScope, meDirective) { + element = $compile('')($rootScope); + expect(meController.$onInit).toHaveBeenCalled(); + expect(parentController).toEqual(jasmine.any(ParentController)); + expect(siblingController).toEqual(jasmine.any(SiblingController)); }); }); - inject(function(log, $compile, $rootScope) { - element = $compile('
      ')($rootScope); - expect(log).toEqual('dep:c1-c2'); - }); - } - ); - it('should instantiate the controller just once when template/templateUrl', function() { - var syncCtrlSpy = jasmine.createSpy('sync controller'), - asyncCtrlSpy = jasmine.createSpy('async controller'); - module(function() { - directive('myDirectiveSync', valueFn({ - template: '
      Hello!
      ', - controller: syncCtrlSpy - })); - directive('myDirectiveAsync', valueFn({ - templateUrl: 'myDirectiveAsync.html', - controller: asyncCtrlSpy, - compile: function() { - return function() { + it('should bind required controllers to controllers that return an explicit constructor return value', function() { + var parentController, containerController, siblingController, friendController, meController; + + function MeController() { + this.name = 'Me'; + this.$onInit = function() { + containerController = this.container; + friendController = this.friend; }; } - })); - }); + function ParentController() { + parentController = { name: 'Parent' }; + return parentController; + } + function SiblingController() { + siblingController = { name: 'Sibling' }; + return siblingController; + } - inject(function($templateCache, $compile, $rootScope) { - expect(syncCtrlSpy).not.toHaveBeenCalled(); - expect(asyncCtrlSpy).not.toHaveBeenCalled(); + angular.module('my', []) + .directive('me', function() { + return { + priority: 1, // make sure it is run before sibling to test this case correctly + restrict: 'E', + scope: {}, + require: { container: '^parent', friend: 'sibling' }, + bindToController: true, + controller: MeController, + controllerAs: '$ctrl' + }; + }) + .directive('parent', function() { + return { + restrict: 'E', + scope: {}, + controller: ParentController + }; + }) + .directive('sibling', function() { + return { + controller: SiblingController + }; + }); - $templateCache.put('myDirectiveAsync.html', '
      Hello!
      '); - element = $compile('
      ' + - '' + - '' + - '
      ')($rootScope); - expect(syncCtrlSpy).not.toHaveBeenCalled(); - expect(asyncCtrlSpy).not.toHaveBeenCalled(); + module('my'); + inject(function($compile, $rootScope, meDirective) { + element = $compile('')($rootScope); + expect(containerController).toEqual(parentController); + expect(friendController).toEqual(siblingController); + }); + }); - $rootScope.$apply(); + it('should require controller of an isolate directive from a non-isolate directive on the ' + + 'same element', function() { + var IsolateController = function() {}; + var isolateDirControllerInNonIsolateDirective; - //expect(syncCtrlSpy).toHaveBeenCalledOnce(); - expect(asyncCtrlSpy).toHaveBeenCalledOnce(); - }); - }); + module(function() { + directive('isolate', function() { + return { + scope: {}, + controller: IsolateController + }; + }); + directive('nonIsolate', function() { + return { + require: 'isolate', + link: function(_, __, ___, isolateDirController) { + isolateDirControllerInNonIsolateDirective = isolateDirController; + } + }; + }); + }); + inject(function($compile, $rootScope) { + element = $compile('
      ')($rootScope); + expect(isolateDirControllerInNonIsolateDirective).toBeDefined(); + expect(isolateDirControllerInNonIsolateDirective instanceof IsolateController).toBe(true); + }); + }); - it('should instantiate controllers in the parent->child order when transluction, templateUrl and replacement ' + - 'are in the mix', function() { - // When a child controller is in the transclusion that replaces the parent element that has a directive with - // a controller, we should ensure that we first instantiate the parent and only then stuff that comes from the - // transclusion. - // - // The transclusion moves the child controller onto the same element as parent controller so both controllers are - // on the same level. - module(function() { - directive('parentDirective', function() { - return { - transclude: true, - replace: true, - templateUrl: 'parentDirective.html', - controller: function(log) { log('parentController'); } - }; - }); - directive('childDirective', function() { - return { - require: '^parentDirective', - templateUrl: 'childDirective.html', - controller: function(log) { log('childController'); } - }; + it('should give the isolate scope to the controller of another replaced directives in the template', function() { + module(function() { + directive('testDirective', function() { + return { + replace: true, + restrict: 'E', + scope: {}, + template: '' + }; + }); + }); + + inject(function($rootScope) { + compile('
      '); + + element = element.children().eq(0); + expect(element[0].checked).toBe(false); + element.isolateScope().model = true; + $rootScope.$digest(); + expect(element[0].checked).toBe(true); + }); }); - }); - inject(function($templateCache, log, $compile, $rootScope) { - $templateCache.put('parentDirective.html', '
      parentTemplateText;
      '); - $templateCache.put('childDirective.html', 'childTemplateText;'); - element = $compile('
      childContentText;
      ')($rootScope); - $rootScope.$apply(); - expect(log).toEqual('parentController; childController'); - expect(element.text()).toBe('childTemplateText;childContentText;'); - }); - }); + it('should share isolate scope with replaced directives (template)', function() { + var normalScope; + var isolateScope; + + module(function() { + directive('isolate', function() { + return { + replace: true, + scope: {}, + template: '{{name}}', + link: function(s) { + isolateScope = s; + } + }; + }); + directive('nonIsolate', function() { + return { + link: function(s) { + normalScope = s; + } + }; + }); + }); + inject(function($compile, $rootScope) { + element = $compile('
      ')($rootScope); - it('should instantiate the controller after the isolate scope bindings are initialized (with template)', function() { - module(function() { - var Ctrl = function($scope, log) { - log('myFoo=' + $scope.myFoo); - }; + expect(normalScope).toBe($rootScope); + expect(normalScope.name).toEqual(undefined); + expect(isolateScope.name).toEqual('WORKS'); + $rootScope.$digest(); + expect(element.text()).toEqual('WORKS'); + }); + }); - directive('myDirective', function() { - return { - scope: { - myFoo: '=' - }, - template: '

      Hello

      ', - controller: Ctrl - }; + + it('should share isolate scope with replaced directives (templateUrl)', function() { + var normalScope; + var isolateScope; + + module(function() { + directive('isolate', function() { + return { + replace: true, + scope: {}, + templateUrl: 'main.html', + link: function(s) { + isolateScope = s; + } + }; + }); + directive('nonIsolate', function() { + return { + link: function(s) { + normalScope = s; + } + }; + }); + }); + + inject(function($compile, $rootScope, $templateCache) { + $templateCache.put('main.html', '{{name}}'); + element = $compile('
      ')($rootScope); + $rootScope.$apply(); + + expect(normalScope).toBe($rootScope); + expect(normalScope.name).toEqual(undefined); + expect(isolateScope.name).toEqual('WORKS'); + expect(element.text()).toEqual('WORKS'); + }); }); - }); - inject(function($templateCache, $compile, $rootScope, log) { - $rootScope.foo = 'bar'; - element = $compile('
      ')($rootScope); - $rootScope.$apply(); - expect(log).toEqual('myFoo=bar'); - }); - }); + it('should not get confused about where to use isolate scope when a replaced directive is used multiple times', + function() { + module(function() { + directive('isolate', function() { + return { + replace: true, + scope: {}, + template: '' + }; + }); + directive('scopeTester', function(log) { + return { + link: function($scope, $element) { + log($element.attr('scope-tester') + '=' + ($scope.$root === $scope ? 'non-isolate' : 'isolate')); + } + }; + }); + }); - it('should instantiate the controller after the isolate scope bindings are initialized (with templateUrl)', function() { - module(function() { - var Ctrl = function($scope, log) { - log('myFoo=' + $scope.myFoo); - }; + inject(function($compile, $rootScope, log) { + element = $compile('
      ' + + '
      ' + + '' + + '
      ')($rootScope); - directive('myDirective', function() { - return { - scope: { - myFoo: '=' - }, - templateUrl: 'hello.html', - controller: Ctrl - }; + $rootScope.$digest(); + expect(log).toEqual('inside=isolate; ' + + 'outside replaced=non-isolate; ' + // outside + 'outside replaced=isolate; ' + // replaced + 'sibling=non-isolate'); + }); }); - }); - inject(function($templateCache, $compile, $rootScope, log) { - $templateCache.put('hello.html', '

      Hello

      '); - $rootScope.foo = 'bar'; - element = $compile('
      ')($rootScope); - $rootScope.$apply(); - expect(log).toEqual('myFoo=bar'); - }); - }); + it('should require controller of a non-isolate directive from an isolate directive on the ' + + 'same element', function() { + var NonIsolateController = function() {}; + var nonIsolateDirControllerInIsolateDirective; + module(function() { + directive('isolate', function() { + return { + scope: {}, + require: 'nonIsolate', + link: function(_, __, ___, nonIsolateDirController) { + nonIsolateDirControllerInIsolateDirective = nonIsolateDirController; + } + }; + }); + directive('nonIsolate', function() { + return { + controller: NonIsolateController + }; + }); + }); - it('should instantiate controllers in the parent->child->baby order when nested transluction, templateUrl and ' + - 'replacement are in the mix', function() { - // similar to the test above, except that we have one more layer of nesting and nested transclusion + inject(function($compile, $rootScope) { + element = $compile('
      ')($rootScope); - module(function() { - directive('parentDirective', function() { - return { - transclude: true, - replace: true, - templateUrl: 'parentDirective.html', - controller: function(log) { log('parentController'); } - }; - }); - directive('childDirective', function() { - return { - require: '^parentDirective', - transclude: true, - replace: true, - templateUrl: 'childDirective.html', - controller: function(log) { log('childController'); } - }; + expect(nonIsolateDirControllerInIsolateDirective).toBeDefined(); + expect(nonIsolateDirControllerInIsolateDirective instanceof NonIsolateController).toBe(true); + }); }); - directive('babyDirective', function() { - return { - require: '^childDirective', - templateUrl: 'babyDirective.html', - controller: function(log) { log('babyController'); } - }; + + + it('should support controllerAs', function() { + module(function() { + directive('main', function() { + return { + templateUrl: 'main.html', + transclude: true, + scope: {}, + controller: function() { + this.name = 'lucas'; + }, + controllerAs: 'mainCtrl' + }; + }); + }); + inject(function($templateCache, $compile, $rootScope) { + $templateCache.put('main.html', 'template:{{mainCtrl.name}}
      '); + element = $compile('
      transclude:{{mainCtrl.name}}
      ')($rootScope); + $rootScope.$apply(); + expect(element.text()).toBe('template:lucas transclude:'); + }); }); - }); - inject(function($templateCache, log, $compile, $rootScope) { - $templateCache.put('parentDirective.html', '
      parentTemplateText;
      '); - $templateCache.put('childDirective.html', 'childTemplateText;'); - $templateCache.put('babyDirective.html', 'babyTemplateText;'); - element = $compile('
      ' + - '
      ' + - 'childContentText;' + - '
      babyContent;
      ' + - '
      ' + - '
      ')($rootScope); - $rootScope.$apply(); - expect(log).toEqual('parentController; childController; babyController'); - expect(element.text()).toBe('childContentText;babyTemplateText;'); - }); - }); + it('should support controller alias', function() { + module(function($controllerProvider) { + $controllerProvider.register('MainCtrl', function() { + this.name = 'lucas'; + }); + directive('main', function() { + return { + templateUrl: 'main.html', + scope: {}, + controller: 'MainCtrl as mainCtrl' + }; + }); + }); + inject(function($templateCache, $compile, $rootScope) { + $templateCache.put('main.html', '{{mainCtrl.name}}'); + element = $compile('
      ')($rootScope); + $rootScope.$apply(); + expect(element.text()).toBe('lucas'); + }); + }); - it('should allow controller usage in pre-link directive functions with templateUrl', function() { - module(function() { - var Ctrl = function(log) { - log('instance'); - }; - directive('myDirective', function() { - return { - scope: true, - templateUrl: 'hello.html', - controller: Ctrl, - compile: function() { + it('should require controller on parent element',function() { + module(function() { + directive('main', function(log) { return { - pre: function(scope, template, attr, ctrl) {}, - post: function() {} + controller: function() { + this.name = 'main'; + } }; - } - }; + }); + directive('dep', function(log) { + return { + require: '^main', + link: function(scope, element, attrs, controller) { + log('dep:' + controller.name); + } + }; + }); + }); + inject(function(log, $compile, $rootScope) { + element = $compile('
      ')($rootScope); + expect(log).toEqual('dep:main'); + }); }); - }); - inject(function($templateCache, $compile, $rootScope, log) { - $templateCache.put('hello.html', '

      Hello

      '); - element = $compile('
      ')($rootScope); - $rootScope.$apply(); + it('should throw an error if required controller can\'t be found',function() { + module(function() { + directive('dep', function(log) { + return { + require: '^main', + link: function(scope, element, attrs, controller) { + log('dep:' + controller.name); + } + }; + }); + }); + inject(function(log, $compile, $rootScope) { + expect(function() { + $compile('
      ')($rootScope); + }).toThrowMinErr('$compile', 'ctreq', 'Controller \'main\', required by directive \'dep\', can\'t be found!'); + }); + }); - expect(log).toEqual('instance'); - expect(element.text()).toBe('Hello'); - }); - }); + it('should pass null if required controller can\'t be found and is optional',function() { + module(function() { + directive('dep', function(log) { + return { + require: '?^main', + link: function(scope, element, attrs, controller) { + log('dep:' + controller); + } + }; + }); + }); + inject(function(log, $compile, $rootScope) { + $compile('
      ')($rootScope); + expect(log).toEqual('dep:null'); + }); + }); - it('should allow controller usage in pre-link directive functions with a template', function() { - module(function() { - var Ctrl = function(log) { - log('instance'); - }; - directive('myDirective', function() { - return { - scope: true, - template: '

      Hello

      ', - controller: Ctrl, - compile: function() { + it('should pass null if required controller can\'t be found and is optional with the question mark on the right',function() { + module(function() { + directive('dep', function(log) { return { - pre: function(scope, template, attr, ctrl) {}, - post: function() {} + require: '^?main', + link: function(scope, element, attrs, controller) { + log('dep:' + controller); + } }; - } - }; + }); + }); + inject(function(log, $compile, $rootScope) { + $compile('
      ')($rootScope); + expect(log).toEqual('dep:null'); + }); }); - }); - inject(function($templateCache, $compile, $rootScope, log) { - element = $compile('
      ')($rootScope); - $rootScope.$apply(); - expect(log).toEqual('instance'); - expect(element.text()).toBe('Hello'); - }); - }); + it('should have optional controller on current element', function() { + module(function() { + directive('dep', function(log) { + return { + require: '?main', + link: function(scope, element, attrs, controller) { + log('dep:' + !!controller); + } + }; + }); + }); + inject(function(log, $compile, $rootScope) { + element = $compile('
      ')($rootScope); + expect(log).toEqual('dep:false'); + }); + }); - it('should throw ctreq with correct directive name, regardless of order', function() { - module(function($compileProvider) { - $compileProvider.directive('aDir', valueFn({ - restrict: 'E', - require: 'ngModel', - link: noop - })); - }); - inject(function($compile, $rootScope) { - expect(function() { - // a-dir will cause a ctreq error to be thrown. Previously, the error would reference - // the last directive in the chain (which in this case would be ngClick), based on - // priority and alphabetical ordering. This test verifies that the ordering does not - // affect which directive is referenced in the minErr message. - element = $compile('')($rootScope); - }).toThrowMinErr('$compile', 'ctreq', - 'Controller \'ngModel\', required by directive \'aDir\', can\'t be found!'); - }); - }); - }); + it('should support multiple controllers', function() { + module(function() { + directive('c1', valueFn({ + controller: function() { this.name = 'c1'; } + })); + directive('c2', valueFn({ + controller: function() { this.name = 'c2'; } + })); + directive('dep', function(log) { + return { + require: ['^c1', '^c2'], + link: function(scope, element, attrs, controller) { + log('dep:' + controller[0].name + '-' + controller[1].name); + } + }; + }); + }); + inject(function(log, $compile, $rootScope) { + element = $compile('
      ')($rootScope); + expect(log).toEqual('dep:c1-c2'); + }); + }); + it('should support multiple controllers as an object hash', function() { + module(function() { + directive('c1', valueFn({ + controller: function() { this.name = 'c1'; } + })); + directive('c2', valueFn({ + controller: function() { this.name = 'c2'; } + })); + directive('dep', function(log) { + return { + require: { myC1: '^c1', myC2: '^c2' }, + link: function(scope, element, attrs, controllers) { + log('dep:' + controllers.myC1.name + '-' + controllers.myC2.name); + } + }; + }); + }); + inject(function(log, $compile, $rootScope) { + element = $compile('
      ')($rootScope); + expect(log).toEqual('dep:c1-c2'); + }); + }); - describe('transclude', function() { + it('should support omitting the name of the required controller if it is the same as the key', + function() { + module(function() { + directive('myC1', valueFn({ + controller: function() { this.name = 'c1'; } + })); + directive('myC2', valueFn({ + controller: function() { this.name = 'c2'; } + })); + directive('dep', function(log) { + return { + require: { myC1: '^', myC2: '^' }, + link: function(scope, element, attrs, controllers) { + log('dep:' + controllers.myC1.name + '-' + controllers.myC2.name); + } + }; + }); + }); + inject(function(log, $compile, $rootScope) { + element = $compile('
      ')($rootScope); + expect(log).toEqual('dep:c1-c2'); + }); + } + ); - describe('content transclusion', function() { + it('should instantiate the controller just once when template/templateUrl', function() { + var syncCtrlSpy = jasmine.createSpy('sync controller'), + asyncCtrlSpy = jasmine.createSpy('async controller'); - it('should support transclude directive', function() { - module(function() { - directive('trans', function() { - return { - transclude: 'content', - replace: true, - scope: {}, - link: function(scope) { - scope.x = 'iso'; - }, - template: '
      • W:{{x}}-{{$parent.$id}}-{{$id}};
      ' - }; + module(function() { + directive('myDirectiveSync', valueFn({ + template: '
      Hello!
      ', + controller: syncCtrlSpy + })); + directive('myDirectiveAsync', valueFn({ + templateUrl: 'myDirectiveAsync.html', + controller: asyncCtrlSpy, + compile: function() { + return function() { + }; + } + })); }); - }); - inject(function(log, $rootScope, $compile) { - element = $compile('
      T:{{x}}-{{$parent.$id}}-{{$id}};
      ')($rootScope); - $rootScope.x = 'root'; - $rootScope.$apply(); - expect(element.text()).toEqual('W:iso-1-2;T:root-2-3;'); - expect(jqLite(jqLite(element.find('li')[1]).contents()[0]).text()).toEqual('T:root-2-3'); - expect(jqLite(element.find('span')[0]).text()).toEqual(';'); - }); - }); + inject(function($templateCache, $compile, $rootScope) { + expect(syncCtrlSpy).not.toHaveBeenCalled(); + expect(asyncCtrlSpy).not.toHaveBeenCalled(); - it('should transclude transcluded content', function() { - module(function() { - directive('book', valueFn({ - transclude: 'content', - template: '
      book-
      (
      )
      ' - })); - directive('chapter', valueFn({ - transclude: 'content', - templateUrl: 'chapter.html' - })); - directive('section', valueFn({ - transclude: 'content', - template: '
      section-!
      !
      ' - })); - return function($httpBackend) { - $httpBackend. - expect('GET', 'chapter.html'). - respond('
      chapter-
      [
      ]
      '); - }; - }); - inject(function(log, $rootScope, $compile, $httpBackend) { - element = $compile('
      paragraph
      ')($rootScope); - $rootScope.$apply(); + $templateCache.put('myDirectiveAsync.html', '
      Hello!
      '); + element = $compile('
      ' + + '' + + '' + + '
      ')($rootScope); + expect(syncCtrlSpy).not.toHaveBeenCalled(); + expect(asyncCtrlSpy).not.toHaveBeenCalled(); - expect(element.text()).toEqual('book-'); + $rootScope.$apply(); - $httpBackend.flush(); - $rootScope.$apply(); - expect(element.text()).toEqual('book-chapter-section-![(paragraph)]!'); + //expect(syncCtrlSpy).toHaveBeenCalledOnce(); + expect(asyncCtrlSpy).toHaveBeenCalledOnce(); + }); }); - }); - it('should not merge text elements from transcluded content', function() { - module(function() { - directive('foo', valueFn({ - transclude: 'content', - template: '
      This is before {{before}}.
      ', - link: function(scope, element, attr, ctrls, $transclude) { - var futureParent = element.children().eq(0); - $transclude(function(clone) { - futureParent.append(clone); - }, futureParent); - }, - scope: true - })); - }); - inject(function($rootScope, $compile) { - element = $compile('
      This is after {{after}}
      ')($rootScope); - $rootScope.before = 'BEFORE'; - $rootScope.after = 'AFTER'; - $rootScope.$apply(); - expect(element.text()).toEqual('This is before BEFORE. This is after AFTER'); - $rootScope.before = 'Not-Before'; - $rootScope.after = 'AfTeR'; - $rootScope.$$childHead.before = 'BeFoRe'; - $rootScope.$$childHead.after = 'Not-After'; - $rootScope.$apply(); - expect(element.text()).toEqual('This is before BeFoRe. This is after AfTeR'); - }); - }); + it('should instantiate controllers in the parent->child order when transluction, templateUrl and replacement ' + + 'are in the mix', function() { + // When a child controller is in the transclusion that replaces the parent element that has a directive with + // a controller, we should ensure that we first instantiate the parent and only then stuff that comes from the + // transclusion. + // + // The transclusion moves the child controller onto the same element as parent controller so both controllers are + // on the same level. + + module(function() { + directive('parentDirective', function() { + return { + transclude: true, + replace: true, + templateUrl: 'parentDirective.html', + controller: function(log) { log('parentController'); } + }; + }); + directive('childDirective', function() { + return { + require: '^parentDirective', + templateUrl: 'childDirective.html', + controller: function(log) { log('childController'); } + }; + }); + }); + inject(function($templateCache, log, $compile, $rootScope) { + $templateCache.put('parentDirective.html', '
      parentTemplateText;
      '); + $templateCache.put('childDirective.html', 'childTemplateText;'); - it('should only allow one content transclusion per element', function() { - module(function() { - directive('first', valueFn({ - transclude: true - })); - directive('second', valueFn({ - transclude: true - })); - }); - inject(function($compile) { - expect(function() { - $compile('
      '); - }).toThrowMinErr('$compile', 'multidir', /Multiple directives \[first, second\] asking for transclusion on:
      childContentText;
      ')($rootScope); + $rootScope.$apply(); + expect(log).toEqual('parentController; childController'); + expect(element.text()).toBe('childTemplateText;childContentText;'); + }); }); - }); - //see issue https://github.com/angular/angular.js/issues/12936 - it('should use the proper scope when it is on the root element of a replaced directive template', function() { - module(function() { - directive('isolate', valueFn({ - scope: {}, - replace: true, - template: '
      {{x}}
      ', - link: function(scope, element, attr, ctrl) { - scope.x = 'iso'; - } - })); - directive('trans', valueFn({ - transclude: 'content', - link: function(scope, element, attr, ctrl, $transclude) { - $transclude(function(clone) { - element.append(clone); - }); - } - })); - }); - inject(function($rootScope, $compile) { - element = $compile('')($rootScope); - $rootScope.x = 'root'; - $rootScope.$apply(); - expect(element.text()).toEqual('iso'); - }); - }); + it('should instantiate the controller after the isolate scope bindings are initialized (with template)', function() { + module(function() { + var Ctrl = function($scope, log) { + log('myFoo=' + $scope.myFoo); + }; + + directive('myDirective', function() { + return { + scope: { + myFoo: '=' + }, + template: '

      Hello

      ', + controller: Ctrl + }; + }); + }); + + inject(function($templateCache, $compile, $rootScope, log) { + $rootScope.foo = 'bar'; - //see issue https://github.com/angular/angular.js/issues/12936 - it('should use the proper scope when it is on the root element of a replaced directive template with child scope', function() { - module(function() { - directive('child', valueFn({ - scope: true, - replace: true, - template: '
      {{x}}
      ', - link: function(scope, element, attr, ctrl) { - scope.x = 'child'; - } - })); - directive('trans', valueFn({ - transclude: 'content', - link: function(scope, element, attr, ctrl, $transclude) { - $transclude(function(clone) { - element.append(clone); - }); - } - })); - }); - inject(function($rootScope, $compile) { - element = $compile('')($rootScope); - $rootScope.x = 'root'; - $rootScope.$apply(); - expect(element.text()).toEqual('child'); + element = $compile('
      ')($rootScope); + $rootScope.$apply(); + expect(log).toEqual('myFoo=bar'); + }); }); - }); - it('should throw if a transcluded node is transcluded again', function() { - module(function() { - directive('trans', valueFn({ - transclude: true, - link: function(scope, element, attr, ctrl, $transclude) { - $transclude(); - $transclude(); - } - })); - }); - inject(function($rootScope, $compile) { - expect(function() { - $compile('')($rootScope); - }).toThrowMinErr('$compile', 'multilink', 'This element has already been linked.'); - }); - }); - it('should not leak if two "element" transclusions are on the same element (with debug info)', function() { - if (jQuery) { - // jQuery 2.x doesn't expose the cache storage. - return; - } + it('should instantiate the controller after the isolate scope bindings are initialized (with templateUrl)', function() { + module(function() { + var Ctrl = function($scope, log) { + log('myFoo=' + $scope.myFoo); + }; + directive('myDirective', function() { + return { + scope: { + myFoo: '=' + }, + templateUrl: 'hello.html', + controller: Ctrl + }; + }); + }); - module(function($compileProvider) { - $compileProvider.debugInfoEnabled(true); - }); + inject(function($templateCache, $compile, $rootScope, log) { + $templateCache.put('hello.html', '

      Hello

      '); + $rootScope.foo = 'bar'; - inject(function($compile, $rootScope) { - var cacheSize = jqLiteCacheSize(); + element = $compile('
      ')($rootScope); + $rootScope.$apply(); + expect(log).toEqual('myFoo=bar'); + }); + }); - element = $compile('
      {{x}}
      ')($rootScope); - expect(jqLiteCacheSize()).toEqual(cacheSize + 1); - $rootScope.$apply('xs = [0,1]'); - expect(jqLiteCacheSize()).toEqual(cacheSize + 2); + it('should instantiate controllers in the parent->child->baby order when nested transluction, templateUrl and ' + + 'replacement are in the mix', function() { + // similar to the test above, except that we have one more layer of nesting and nested transclusion - $rootScope.$apply('xs = [0]'); - expect(jqLiteCacheSize()).toEqual(cacheSize + 1); + module(function() { + directive('parentDirective', function() { + return { + transclude: true, + replace: true, + templateUrl: 'parentDirective.html', + controller: function(log) { log('parentController'); } + }; + }); + directive('childDirective', function() { + return { + require: '^parentDirective', + transclude: true, + replace: true, + templateUrl: 'childDirective.html', + controller: function(log) { log('childController'); } + }; + }); + directive('babyDirective', function() { + return { + require: '^childDirective', + templateUrl: 'babyDirective.html', + controller: function(log) { log('babyController'); } + }; + }); + }); - $rootScope.$apply('xs = []'); - expect(jqLiteCacheSize()).toEqual(cacheSize + 1); + inject(function($templateCache, log, $compile, $rootScope) { + $templateCache.put('parentDirective.html', '
      parentTemplateText;
      '); + $templateCache.put('childDirective.html', 'childTemplateText;'); + $templateCache.put('babyDirective.html', 'babyTemplateText;'); - element.remove(); - expect(jqLiteCacheSize()).toEqual(cacheSize + 0); + element = $compile('
      ' + + '
      ' + + 'childContentText;' + + '
      babyContent;
      ' + + '
      ' + + '
      ')($rootScope); + $rootScope.$apply(); + expect(log).toEqual('parentController; childController; babyController'); + expect(element.text()).toBe('childContentText;babyTemplateText;'); + }); }); - }); - it('should not leak if two "element" transclusions are on the same element (without debug info)', function() { - if (jQuery) { - // jQuery 2.x doesn't expose the cache storage. - return; - } + it('should allow controller usage in pre-link directive functions with templateUrl', function() { + module(function() { + var Ctrl = function(log) { + log('instance'); + }; + + directive('myDirective', function() { + return { + scope: true, + templateUrl: 'hello.html', + controller: Ctrl, + compile: function() { + return { + pre: function(scope, template, attr, ctrl) {}, + post: function() {} + }; + } + }; + }); + }); + inject(function($templateCache, $compile, $rootScope, log) { + $templateCache.put('hello.html', '

      Hello

      '); - module(function($compileProvider) { - $compileProvider.debugInfoEnabled(false); + element = $compile('
      ')($rootScope); + $rootScope.$apply(); + + expect(log).toEqual('instance'); + expect(element.text()).toBe('Hello'); + }); }); - inject(function($compile, $rootScope) { - var cacheSize = jqLiteCacheSize(); - element = $compile('
      {{x}}
      ')($rootScope); - expect(jqLiteCacheSize()).toEqual(cacheSize); + it('should allow controller usage in pre-link directive functions with a template', function() { + module(function() { + var Ctrl = function(log) { + log('instance'); + }; + + directive('myDirective', function() { + return { + scope: true, + template: '

      Hello

      ', + controller: Ctrl, + compile: function() { + return { + pre: function(scope, template, attr, ctrl) {}, + post: function() {} + }; + } + }; + }); + }); - $rootScope.$apply('xs = [0,1]'); - expect(jqLiteCacheSize()).toEqual(cacheSize); + inject(function($templateCache, $compile, $rootScope, log) { + element = $compile('
      ')($rootScope); + $rootScope.$apply(); - $rootScope.$apply('xs = [0]'); - expect(jqLiteCacheSize()).toEqual(cacheSize); + expect(log).toEqual('instance'); + expect(element.text()).toBe('Hello'); + }); + }); - $rootScope.$apply('xs = []'); - expect(jqLiteCacheSize()).toEqual(cacheSize); - element.remove(); - expect(jqLiteCacheSize()).toEqual(cacheSize); + it('should throw ctreq with correct directive name, regardless of order', function() { + module(function($compileProvider) { + $compileProvider.directive('aDir', valueFn({ + restrict: 'E', + require: 'ngModel', + link: noop + })); + }); + inject(function($compile, $rootScope) { + expect(function() { + // a-dir will cause a ctreq error to be thrown. Previously, the error would reference + // the last directive in the chain (which in this case would be ngClick), based on + // priority and alphabetical ordering. This test verifies that the ordering does not + // affect which directive is referenced in the minErr message. + element = $compile('')($rootScope); + }).toThrowMinErr('$compile', 'ctreq', + 'Controller \'ngModel\', required by directive \'aDir\', can\'t be found!'); + }); }); }); - it('should not leak if two "element" transclusions are on the same element (with debug info)', function() { - if (jQuery) { - // jQuery 2.x doesn't expose the cache storage. - return; - } + describe('transclude', function() { - module(function($compileProvider) { - $compileProvider.debugInfoEnabled(true); - }); + describe('content transclusion', function() { - inject(function($compile, $rootScope) { - var cacheSize = jqLiteCacheSize(); - element = $compile('
      {{x}}
      ')($rootScope); + it('should support transclude directive', function() { + module(function() { + directive('trans', function() { + return { + transclude: 'content', + replace: true, + scope: {}, + link: function(scope) { + scope.x = 'iso'; + }, + template: '
      • W:{{x}}-{{$parent.$id}}-{{$id}};
      ' + }; + }); + }); + inject(function(log, $rootScope, $compile) { + element = $compile('
      T:{{x}}-{{$parent.$id}}-{{$id}};
      ')($rootScope); + $rootScope.x = 'root'; + $rootScope.$apply(); + expect(element.text()).toEqual('W:iso-1-2;T:root-2-3;'); + expect(jqLite(jqLite(element.find('li')[1]).contents()[0]).text()).toEqual('T:root-2-3'); + expect(jqLite(element.find('span')[0]).text()).toEqual(';'); + }); + }); + + + it('should transclude transcluded content', function() { + module(function() { + directive('book', valueFn({ + transclude: 'content', + template: '
      book-
      (
      )
      ' + })); + directive('chapter', valueFn({ + transclude: 'content', + templateUrl: 'chapter.html' + })); + directive('section', valueFn({ + transclude: 'content', + template: '
      section-!
      !
      ' + })); + return function($httpBackend) { + $httpBackend. + expect('GET', 'chapter.html'). + respond('
      chapter-
      [
      ]
      '); + }; + }); + inject(function(log, $rootScope, $compile, $httpBackend) { + element = $compile('
      paragraph
      ')($rootScope); + $rootScope.$apply(); - $rootScope.$apply('xs = [0,1]'); - // At this point we have a bunch of comment placeholders but no real transcluded elements - // So the cache only contains the root element's data - expect(jqLiteCacheSize()).toEqual(cacheSize + 1); + expect(element.text()).toEqual('book-'); - $rootScope.$apply('val = true'); - // Now we have two concrete transcluded elements plus some comments so two more cache items - expect(jqLiteCacheSize()).toEqual(cacheSize + 3); + $httpBackend.flush(); + $rootScope.$apply(); + expect(element.text()).toEqual('book-chapter-section-![(paragraph)]!'); + }); + }); - $rootScope.$apply('val = false'); - // Once again we only have comments so no transcluded elements and the cache is back to just - // the root element - expect(jqLiteCacheSize()).toEqual(cacheSize + 1); - element.remove(); - // Now we've even removed the root element along with its cache - expect(jqLiteCacheSize()).toEqual(cacheSize + 0); - }); - }); + it('should not merge text elements from transcluded content', function() { + module(function() { + directive('foo', valueFn({ + transclude: 'content', + template: '
      This is before {{before}}.
      ', + link: function(scope, element, attr, ctrls, $transclude) { + var futureParent = element.children().eq(0); + $transclude(function(clone) { + futureParent.append(clone); + }, futureParent); + }, + scope: true + })); + }); + inject(function($rootScope, $compile) { + element = $compile('
      This is after {{after}}
      ')($rootScope); + $rootScope.before = 'BEFORE'; + $rootScope.after = 'AFTER'; + $rootScope.$apply(); + expect(element.text()).toEqual('This is before BEFORE. This is after AFTER'); + + $rootScope.before = 'Not-Before'; + $rootScope.after = 'AfTeR'; + $rootScope.$$childHead.before = 'BeFoRe'; + $rootScope.$$childHead.after = 'Not-After'; + $rootScope.$apply(); + expect(element.text()).toEqual('This is before BeFoRe. This is after AfTeR'); + }); + }); - it('should not leak when continuing the compilation of elements on a scope that was destroyed', function() { - if (jQuery) { - // jQuery 2.x doesn't expose the cache storage. - return; - } - var linkFn = jasmine.createSpy('linkFn'); + it('should only allow one content transclusion per element', function() { + module(function() { + directive('first', valueFn({ + transclude: true + })); + directive('second', valueFn({ + transclude: true + })); + }); + inject(function($compile) { + expect(function() { + $compile('
      '); + }).toThrowMinErr('$compile', 'multidir', /Multiple directives \[first, second\] asking for transclusion on:
      {{x}}
      ', + link: function(scope, element, attr, ctrl) { + scope.x = 'iso'; + } + })); + directive('trans', valueFn({ + transclude: 'content', + link: function(scope, element, attr, ctrl, $transclude) { + $transclude(function(clone) { + element.append(clone); + }); + } + })); + }); + inject(function($rootScope, $compile) { + element = $compile('')($rootScope); + $rootScope.x = 'root'; + $rootScope.$apply(); + expect(element.text()).toEqual('iso'); }); }); - $compileProvider.directive('isolateRed', function() { - return { - restrict: 'A', - scope: {}, - template: '
      ' - }; + + + //see issue https://github.com/angular/angular.js/issues/12936 + it('should use the proper scope when it is on the root element of a replaced directive template with child scope', function() { + module(function() { + directive('child', valueFn({ + scope: true, + replace: true, + template: '
      {{x}}
      ', + link: function(scope, element, attr, ctrl) { + scope.x = 'child'; + } + })); + directive('trans', valueFn({ + transclude: 'content', + link: function(scope, element, attr, ctrl, $transclude) { + $transclude(function(clone) { + element.append(clone); + }); + } + })); + }); + inject(function($rootScope, $compile) { + element = $compile('')($rootScope); + $rootScope.x = 'root'; + $rootScope.$apply(); + expect(element.text()).toEqual('child'); + }); }); - $compileProvider.directive('red', function() { - return { - restrict: 'A', - templateUrl: 'red.html', - scope: {}, - link: linkFn - }; + + it('should throw if a transcluded node is transcluded again', function() { + module(function() { + directive('trans', valueFn({ + transclude: true, + link: function(scope, element, attr, ctrl, $transclude) { + $transclude(); + $transclude(); + } + })); + }); + inject(function($rootScope, $compile) { + expect(function() { + $compile('')($rootScope); + }).toThrowMinErr('$compile', 'multilink', 'This element has already been linked.'); + }); }); - }); - inject(function($compile, $rootScope, $httpBackend, $timeout, $templateCache) { - var cacheSize = jqLiteCacheSize(); - $httpBackend.whenGET('red.html').respond('

      red.html

      '); - var template = $compile( - '
      ' + - '
      ' + - '
      ' + - '
      ' + - '
      ' + - '
      ' + - '
      '); - element = template($rootScope, noop); - $rootScope.$digest(); - $timeout.flush(); - $httpBackend.flush(); - expect(linkFn).not.toHaveBeenCalled(); - expect(jqLiteCacheSize()).toEqual(cacheSize + 2); + it('should not leak if two "element" transclusions are on the same element (with debug info)', function() { + if (jQuery) { + // jQuery 2.x doesn't expose the cache storage. + return; + } - $templateCache.removeAll(); - var destroyedScope = $rootScope.$new(); - destroyedScope.$destroy(); - var clone = template(destroyedScope, noop); - $rootScope.$digest(); - $timeout.flush(); - expect(linkFn).not.toHaveBeenCalled(); - clone.remove(); - }); - }); - if (jQuery) { - describe('cleaning up after a replaced element', function() { - var $compile, xs; - beforeEach(inject(function(_$compile_) { - $compile = _$compile_; - xs = [0, 1]; - })); + module(function($compileProvider) { + $compileProvider.debugInfoEnabled(true); + }); - function testCleanup() { - var privateData, firstRepeatedElem; + inject(function($compile, $rootScope) { + var cacheSize = jqLiteCacheSize(); - element = $compile('
      {{x}}
      ')($rootScope); + element = $compile('
      {{x}}
      ')($rootScope); + expect(jqLiteCacheSize()).toEqual(cacheSize + 1); - $rootScope.$apply('xs = [' + xs + ']'); - firstRepeatedElem = element.children('.ng-scope').eq(0); + $rootScope.$apply('xs = [0,1]'); + expect(jqLiteCacheSize()).toEqual(cacheSize + 2); - expect(firstRepeatedElem.data('$scope')).toBeDefined(); - privateData = jQuery._data(firstRepeatedElem[0]); - expect(privateData.events).toBeDefined(); - expect(privateData.events.click).toBeDefined(); - expect(privateData.events.click[0]).toBeDefined(); + $rootScope.$apply('xs = [0]'); + expect(jqLiteCacheSize()).toEqual(cacheSize + 1); - //Ensure the angular $destroy event is still sent - var destroyCount = 0; - element.find('div').on('$destroy', function() { destroyCount++; }); + $rootScope.$apply('xs = []'); + expect(jqLiteCacheSize()).toEqual(cacheSize + 1); - $rootScope.$apply('xs = null'); + element.remove(); + expect(jqLiteCacheSize()).toEqual(cacheSize + 0); + }); + }); - expect(destroyCount).toBe(2); - expect(firstRepeatedElem.data('$scope')).not.toBeDefined(); - privateData = jQuery._data(firstRepeatedElem[0]); - expect(privateData && privateData.events).not.toBeDefined(); - } - it('should work without external libraries (except jQuery)', testCleanup); - - it('should work with another library patching jQuery.cleanData after Angular', function() { - var cleanedCount = 0; - var currentCleanData = jQuery.cleanData; - jQuery.cleanData = function(elems) { - cleanedCount += elems.length; - // Don't return the output and explicitly pass only the first parameter - // so that we're sure we're not relying on either of them. jQuery UI patch - // behaves in this way. - currentCleanData(elems); - }; + it('should not leak if two "element" transclusions are on the same element (without debug info)', function() { + if (jQuery) { + // jQuery 2.x doesn't expose the cache storage. + return; + } - testCleanup(); - // The ng-repeat template is removed/cleaned (the +1) - // and each clone of the ng-repeat template is also removed (xs.length) - expect(cleanedCount).toBe(xs.length + 1); + module(function($compileProvider) { + $compileProvider.debugInfoEnabled(false); + }); - // Restore the previous jQuery.cleanData. - jQuery.cleanData = currentCleanData; - }); - }); - } + inject(function($compile, $rootScope) { + var cacheSize = jqLiteCacheSize(); + element = $compile('
      {{x}}
      ')($rootScope); + expect(jqLiteCacheSize()).toEqual(cacheSize); - it('should add a $$transcluded property onto the transcluded scope', function() { - module(function() { - directive('trans', function() { - return { - transclude: true, - replace: true, - scope: true, - template: '
      I:{{$$transcluded}}
      ' - }; - }); - }); - inject(function($rootScope, $compile) { - element = $compile('
      T:{{$$transcluded}}
      ')($rootScope); - $rootScope.$apply(); - expect(jqLite(element.find('span')[0]).text()).toEqual('I:'); - expect(jqLite(element.find('span')[1]).text()).toEqual('T:true'); - }); - }); + $rootScope.$apply('xs = [0,1]'); + expect(jqLiteCacheSize()).toEqual(cacheSize); + $rootScope.$apply('xs = [0]'); + expect(jqLiteCacheSize()).toEqual(cacheSize); - it('should clear contents of the ng-translude element before appending transcluded content' + - ' if transcluded content exists', function() { - module(function() { - directive('trans', function() { - return { - transclude: true, - template: '
      old stuff!
      ' - }; - }); - }); - inject(function($rootScope, $compile) { - element = $compile('
      unicorn!
      ')($rootScope); - $rootScope.$apply(); - expect(sortedHtml(element.html())).toEqual('
      unicorn!
      '); - }); - }); + $rootScope.$apply('xs = []'); + expect(jqLiteCacheSize()).toEqual(cacheSize); - it('should NOT clear contents of the ng-translude element before appending transcluded content' + - ' if transcluded content does NOT exist', function() { - module(function() { - directive('trans', function() { - return { - transclude: true, - template: '
      old stuff!
      ' - }; + element.remove(); + expect(jqLiteCacheSize()).toEqual(cacheSize); + }); }); - }); - inject(function(log, $rootScope, $compile) { - element = $compile('
      ')($rootScope); - $rootScope.$apply(); - expect(sortedHtml(element.html())).toEqual('
      old stuff!
      '); - }); - }); - it('should clear the fallback content from the element during compile and before linking', function() { - module(function() { - directive('trans', function() { - return { - transclude: true, - template: '
      fallback content
      ' - }; - }); - }); - inject(function(log, $rootScope, $compile) { - element = jqLite('
      '); - var linkfn = $compile(element); - expect(element.html()).toEqual('
      '); - linkfn($rootScope); - $rootScope.$apply(); - expect(sortedHtml(element.html())).toEqual('
      fallback content
      '); - }); - }); + it('should not leak if two "element" transclusions are on the same element (with debug info)', function() { + if (jQuery) { + // jQuery 2.x doesn't expose the cache storage. + return; + } + module(function($compileProvider) { + $compileProvider.debugInfoEnabled(true); + }); - it('should allow cloning of the fallback via ngRepeat', function() { - module(function() { - directive('trans', function() { - return { - transclude: true, - template: '
      {{i}}
      ' - }; + inject(function($compile, $rootScope) { + var cacheSize = jqLiteCacheSize(); + element = $compile('
      {{x}}
      ')($rootScope); + + $rootScope.$apply('xs = [0,1]'); + // At this point we have a bunch of comment placeholders but no real transcluded elements + // So the cache only contains the root element's data + expect(jqLiteCacheSize()).toEqual(cacheSize + 1); + + $rootScope.$apply('val = true'); + // Now we have two concrete transcluded elements plus some comments so two more cache items + expect(jqLiteCacheSize()).toEqual(cacheSize + 3); + + $rootScope.$apply('val = false'); + // Once again we only have comments so no transcluded elements and the cache is back to just + // the root element + expect(jqLiteCacheSize()).toEqual(cacheSize + 1); + + element.remove(); + // Now we've even removed the root element along with its cache + expect(jqLiteCacheSize()).toEqual(cacheSize + 0); + }); }); - }); - inject(function(log, $rootScope, $compile) { - element = $compile('
      ')($rootScope); - $rootScope.$apply(); - expect(element.text()).toEqual('012'); - }); - }); + it('should not leak when continuing the compilation of elements on a scope that was destroyed', function() { + if (jQuery) { + // jQuery 2.x doesn't expose the cache storage. + return; + } + + var linkFn = jasmine.createSpy('linkFn'); + + module(function($controllerProvider, $compileProvider) { + $controllerProvider.register('Leak', function($scope, $timeout) { + $scope.code = 'red'; + $timeout(function() { + $scope.code = 'blue'; + }); + }); + $compileProvider.directive('isolateRed', function() { + return { + restrict: 'A', + scope: {}, + template: '
      ' + }; + }); + $compileProvider.directive('red', function() { + return { + restrict: 'A', + templateUrl: 'red.html', + scope: {}, + link: linkFn + }; + }); + }); - it('should not link the fallback content if transcluded content is provided', function() { - var linkSpy = jasmine.createSpy('postlink'); + inject(function($compile, $rootScope, $httpBackend, $timeout, $templateCache) { + var cacheSize = jqLiteCacheSize(); + $httpBackend.whenGET('red.html').respond('

      red.html

      '); + var template = $compile( + '
      ' + + '
      ' + + '
      ' + + '
      ' + + '
      ' + + '
      ' + + '
      '); + element = template($rootScope, noop); + $rootScope.$digest(); + $timeout.flush(); + $httpBackend.flush(); + expect(linkFn).not.toHaveBeenCalled(); + expect(jqLiteCacheSize()).toEqual(cacheSize + 2); - module(function() { - directive('inner', function() { - return { - restrict: 'E', - template: 'old stuff! ', - link: linkSpy - }; + $templateCache.removeAll(); + var destroyedScope = $rootScope.$new(); + destroyedScope.$destroy(); + var clone = template(destroyedScope, noop); + $rootScope.$digest(); + $timeout.flush(); + expect(linkFn).not.toHaveBeenCalled(); + clone.remove(); + }); }); - directive('trans', function() { - return { - transclude: true, - template: '
      ' - }; - }); - }); - inject(function($rootScope, $compile) { - element = $compile('
      unicorn!
      ')($rootScope); - $rootScope.$apply(); - expect(sortedHtml(element.html())).toEqual('
      unicorn!
      '); - expect(linkSpy).not.toHaveBeenCalled(); - }); - }); + if (jQuery) { + describe('cleaning up after a replaced element', function() { + var $compile, xs; + beforeEach(inject(function(_$compile_) { + $compile = _$compile_; + xs = [0, 1]; + })); - it('should compile and link the fallback content if no transcluded content is provided', function() { - var linkSpy = jasmine.createSpy('postlink'); + function testCleanup() { + var privateData, firstRepeatedElem; - module(function() { - directive('inner', function() { - return { - restrict: 'E', - template: 'old stuff! ', - link: linkSpy - }; - }); + element = $compile('
      {{x}}
      ')($rootScope); - directive('trans', function() { - return { - transclude: true, - template: '
      ' - }; - }); - }); - inject(function(log, $rootScope, $compile) { - element = $compile('
      ')($rootScope); - $rootScope.$apply(); - expect(sortedHtml(element.html())).toEqual('
      old stuff!
      '); - expect(linkSpy).toHaveBeenCalled(); - }); - }); + $rootScope.$apply('xs = [' + xs + ']'); + firstRepeatedElem = element.children('.ng-scope').eq(0); - it('should compile and link the fallback content if an optional transclusion slot is not provided', function() { - var linkSpy = jasmine.createSpy('postlink'); + expect(firstRepeatedElem.data('$scope')).toBeDefined(); + privateData = jQuery._data(firstRepeatedElem[0]); + expect(privateData.events).toBeDefined(); + expect(privateData.events.click).toBeDefined(); + expect(privateData.events.click[0]).toBeDefined(); - module(function() { - directive('inner', function() { - return { - restrict: 'E', - template: 'old stuff! ', - link: linkSpy - }; - }); + //Ensure the angular $destroy event is still sent + var destroyCount = 0; + element.find('div').on('$destroy', function() { destroyCount++; }); - directive('trans', function() { - return { - transclude: { optionalSlot: '?optional'}, - template: '
      ' - }; - }); - }); - inject(function(log, $rootScope, $compile) { - element = $compile('
      ')($rootScope); - $rootScope.$apply(); - expect(sortedHtml(element.html())).toEqual('
      old stuff!
      '); - expect(linkSpy).toHaveBeenCalled(); - }); - }); + $rootScope.$apply('xs = null'); - it('should cope if there is neither transcluded content nor fallback content', function() { - module(function() { - directive('trans', function() { - return { - transclude: true, - template: '
      ' - }; - }); - }); - inject(function($rootScope, $compile) { - element = $compile('
      ')($rootScope); - $rootScope.$apply(); - expect(sortedHtml(element.html())).toEqual('
      '); - }); - }); + expect(destroyCount).toBe(2); + expect(firstRepeatedElem.data('$scope')).not.toBeDefined(); + privateData = jQuery._data(firstRepeatedElem[0]); + expect(privateData && privateData.events).not.toBeDefined(); + } - it('should throw on an ng-transclude element inside no transclusion directive', function() { - inject(function($rootScope, $compile) { - // we need to do this because different browsers print empty attributes differently - try { - $compile('
      ')($rootScope); - } catch (e) { - expect(e.message).toMatch(new RegExp( - '^\\[ngTransclude:orphan\\] ' + - 'Illegal use of ngTransclude directive in the template! ' + - 'No parent directive that requires a transclusion found\\. ' + - 'Element:
      ' + - '
      ' + - '
      this one should get replaced with content
      ' + - '
      ' + - '
      ', - transclude: true - })); + it('should add a $$transcluded property onto the transcluded scope', function() { + module(function() { + directive('trans', function() { + return { + transclude: true, + replace: true, + scope: true, + template: '
      I:{{$$transcluded}}
      ' + }; + }); + }); + inject(function($rootScope, $compile) { + element = $compile('
      T:{{$$transcluded}}
      ')($rootScope); + $rootScope.$apply(); + expect(jqLite(element.find('span')[0]).text()).toEqual('I:'); + expect(jqLite(element.find('span')[1]).text()).toEqual('T:true'); + }); + }); - $compileProvider.directive('noTransBar', valueFn({ - template: '
      ' + - // This ng-transclude is invalid. It should throw an error. - '
      ' + - '
      ', - transclude: false - })); - }); + it('should clear contents of the ng-translude element before appending transcluded content' + + ' if transcluded content exists', function() { + module(function() { + directive('trans', function() { + return { + transclude: true, + template: '
      old stuff!
      ' + }; + }); + }); + inject(function($rootScope, $compile) { + element = $compile('
      unicorn!
      ')($rootScope); + $rootScope.$apply(); + expect(sortedHtml(element.html())).toEqual('
      unicorn!
      '); + }); + }); - inject(function($compile, $rootScope) { - expect(function() { - $compile('
      content
      ')($rootScope); - }).toThrowMinErr('ngTransclude', 'orphan', - 'Illegal use of ngTransclude directive in the template! No parent directive that requires a transclusion found. Element:
      '); - }); - }); + it('should NOT clear contents of the ng-translude element before appending transcluded content' + + ' if transcluded content does NOT exist', function() { + module(function() { + directive('trans', function() { + return { + transclude: true, + template: '
      old stuff!
      ' + }; + }); + }); + inject(function(log, $rootScope, $compile) { + element = $compile('
      ')($rootScope); + $rootScope.$apply(); + expect(sortedHtml(element.html())).toEqual('
      old stuff!
      '); + }); + }); - it('should not pass transclusion into a templateUrl directive', function() { + it('should clear the fallback content from the element during compile and before linking', function() { + module(function() { + directive('trans', function() { + return { + transclude: true, + template: '
      fallback content
      ' + }; + }); + }); + inject(function(log, $rootScope, $compile) { + element = jqLite('
      '); + var linkfn = $compile(element); + expect(element.html()).toEqual('
      '); + linkfn($rootScope); + $rootScope.$apply(); + expect(sortedHtml(element.html())).toEqual('
      fallback content
      '); + }); + }); - module(function($compileProvider) { - $compileProvider.directive('transFoo', valueFn({ - template: '
      ' + - '
      ' + - '
      this one should get replaced with content
      ' + - '
      ' + - '
      ', - transclude: true + it('should allow cloning of the fallback via ngRepeat', function() { + module(function() { + directive('trans', function() { + return { + transclude: true, + template: '
      {{i}}
      ' + }; + }); + }); + inject(function(log, $rootScope, $compile) { + element = $compile('
      ')($rootScope); + $rootScope.$apply(); + expect(element.text()).toEqual('012'); + }); + }); - })); - $compileProvider.directive('noTransBar', valueFn({ - templateUrl: 'noTransBar.html', - transclude: false + it('should not link the fallback content if transcluded content is provided', function() { + var linkSpy = jasmine.createSpy('postlink'); - })); - }); + module(function() { + directive('inner', function() { + return { + restrict: 'E', + template: 'old stuff! ', + link: linkSpy + }; + }); - inject(function($compile, $rootScope, $templateCache) { - $templateCache.put('noTransBar.html', - '
      ' + - // This ng-transclude is invalid. It should throw an error. - '
      ' + - '
      '); + directive('trans', function() { + return { + transclude: true, + template: '
      ' + }; + }); + }); + inject(function($rootScope, $compile) { + element = $compile('
      unicorn!
      ')($rootScope); + $rootScope.$apply(); + expect(sortedHtml(element.html())).toEqual('
      unicorn!
      '); + expect(linkSpy).not.toHaveBeenCalled(); + }); + }); - expect(function() { - element = $compile('
      content
      ')($rootScope); - $rootScope.$apply(); - }).toThrowMinErr('ngTransclude', 'orphan', - 'Illegal use of ngTransclude directive in the template! No parent directive that requires a transclusion found. Element:
      '); - }); - }); + it('should compile and link the fallback content if no transcluded content is provided', function() { + var linkSpy = jasmine.createSpy('postlink'); + module(function() { + directive('inner', function() { + return { + restrict: 'E', + template: 'old stuff! ', + link: linkSpy + }; + }); - it('should expose transcludeFn in compile fn even for templateUrl', function() { - module(function() { - directive('transInCompile', valueFn({ - transclude: true, - // template: '
      whatever
      ', - templateUrl: 'foo.html', - compile: function(_, __, transclude) { - return function(scope, element) { - transclude(scope, function(clone, scope) { - element.html(''); - element.append(clone); - }); - }; - } - })); - }); + directive('trans', function() { + return { + transclude: true, + template: '
      ' + }; + }); + }); + inject(function(log, $rootScope, $compile) { + element = $compile('
      ')($rootScope); + $rootScope.$apply(); + expect(sortedHtml(element.html())).toEqual('
      old stuff!
      '); + expect(linkSpy).toHaveBeenCalled(); + }); + }); - inject(function($compile, $rootScope, $templateCache) { - $templateCache.put('foo.html', '
      whatever
      '); + it('should compile and link the fallback content if an optional transclusion slot is not provided', function() { + var linkSpy = jasmine.createSpy('postlink'); - compile('
      transcluded content
      '); - $rootScope.$apply(); + module(function() { + directive('inner', function() { + return { + restrict: 'E', + template: 'old stuff! ', + link: linkSpy + }; + }); - expect(trim(element.text())).toBe('transcluded content'); - }); - }); + directive('trans', function() { + return { + transclude: { optionalSlot: '?optional'}, + template: '
      ' + }; + }); + }); + inject(function(log, $rootScope, $compile) { + element = $compile('
      ')($rootScope); + $rootScope.$apply(); + expect(sortedHtml(element.html())).toEqual('
      old stuff!
      '); + expect(linkSpy).toHaveBeenCalled(); + }); + }); + it('should cope if there is neither transcluded content nor fallback content', function() { + module(function() { + directive('trans', function() { + return { + transclude: true, + template: '
      ' + }; + }); + }); + inject(function($rootScope, $compile) { + element = $compile('
      ')($rootScope); + $rootScope.$apply(); + expect(sortedHtml(element.html())).toEqual('
      '); + }); + }); - it('should make the result of a transclusion available to the parent directive in post-linking phase' + - '(template)', function() { - module(function() { - directive('trans', function(log) { - return { - transclude: true, - template: '
      ', - link: { - pre: function($scope, $element) { - log('pre(' + $element.text() + ')'); - }, - post: function($scope, $element) { - log('post(' + $element.text() + ')'); - } + it('should throw on an ng-transclude element inside no transclusion directive', function() { + inject(function($rootScope, $compile) { + // we need to do this because different browsers print empty attributes differently + try { + $compile('
      ')($rootScope); + } catch (e) { + expect(e.message).toMatch(new RegExp( + '^\\[ngTransclude:orphan\\] ' + + 'Illegal use of ngTransclude directive in the template! ' + + 'No parent directive that requires a transclusion found\\. ' + + 'Element:
      unicorn!
      ')($rootScope); - $rootScope.$apply(); - expect(log).toEqual('pre(); post(unicorn!)'); - }); - }); - it('should make the result of a transclusion available to the parent directive in post-linking phase' + - '(templateUrl)', function() { - // when compiling an async directive the transclusion is always processed before the directive - // this is different compared to sync directive. delaying the transclusion makes little sense. + it('should not pass transclusion into a template directive when the directive didn\'t request transclusion', function() { - module(function() { - directive('trans', function(log) { - return { - transclude: true, - templateUrl: 'trans.html', - link: { - pre: function($scope, $element) { - log('pre(' + $element.text() + ')'); - }, - post: function($scope, $element) { - log('post(' + $element.text() + ')'); - } - } - }; - }); - }); - inject(function(log, $rootScope, $compile, $templateCache) { - $templateCache.put('trans.html', '
      '); + module(function($compileProvider) { - element = $compile('
      unicorn!
      ')($rootScope); - $rootScope.$apply(); - expect(log).toEqual('pre(); post(unicorn!)'); - }); - }); + $compileProvider.directive('transFoo', valueFn({ + template: '
      ' + + '
      ' + + '
      this one should get replaced with content
      ' + + '
      ' + + '
      ', + transclude: true + })); - it('should make the result of a transclusion available to the parent *replace* directive in post-linking phase' + - '(template)', function() { - module(function() { - directive('replacedTrans', function(log) { - return { - transclude: true, - replace: true, - template: '
      ', - link: { - pre: function($scope, $element) { - log('pre(' + $element.text() + ')'); - }, - post: function($scope, $element) { - log('post(' + $element.text() + ')'); - } - } - }; - }); - }); - inject(function(log, $rootScope, $compile) { - element = $compile('
      unicorn!
      ')($rootScope); - $rootScope.$apply(); - expect(log).toEqual('pre(); post(unicorn!)'); - }); - }); + $compileProvider.directive('noTransBar', valueFn({ + template: '
      ' + + // This ng-transclude is invalid. It should throw an error. + '
      ' + + '
      ', + transclude: false + })); + }); - it('should make the result of a transclusion available to the parent *replace* directive in post-linking phase' + - ' (templateUrl)', function() { - module(function() { - directive('replacedTrans', function(log) { - return { - transclude: true, - replace: true, - templateUrl: 'trans.html', - link: { - pre: function($scope, $element) { - log('pre(' + $element.text() + ')'); - }, - post: function($scope, $element) { - log('post(' + $element.text() + ')'); - } - } - }; + inject(function($compile, $rootScope) { + expect(function() { + $compile('
      content
      ')($rootScope); + }).toThrowMinErr('ngTransclude', 'orphan', + 'Illegal use of ngTransclude directive in the template! No parent directive that requires a transclusion found. Element:
      '); + }); }); - }); - inject(function(log, $rootScope, $compile, $templateCache) { - $templateCache.put('trans.html', '
      '); - element = $compile('
      unicorn!
      ')($rootScope); - $rootScope.$apply(); - expect(log).toEqual('pre(); post(unicorn!)'); - }); - }); - it('should copy the directive controller to all clones', function() { - var transcludeCtrl, cloneCount = 2; - module(function() { - directive('transclude', valueFn({ - transclude: 'content', - controller: function($transclude) { - transcludeCtrl = this; - }, - link: function(scope, el, attr, ctrl, $transclude) { - var i; - for (i = 0; i < cloneCount; i++) { - $transclude(cloneAttach); - } + it('should not pass transclusion into a templateUrl directive', function() { - function cloneAttach(clone) { - el.append(clone); - } - } - })); - }); - inject(function($compile) { - element = $compile('
      ')($rootScope); - var children = element.children(), i; - expect(transcludeCtrl).toBeDefined(); + module(function($compileProvider) { - expect(element.data('$transcludeController')).toBe(transcludeCtrl); - for (i = 0; i < cloneCount; i++) { - expect(children.eq(i).data('$transcludeController')).toBeUndefined(); - } - }); - }); + $compileProvider.directive('transFoo', valueFn({ + template: '
      ' + + '
      ' + + '
      this one should get replaced with content
      ' + + '
      ' + + '
      ', + transclude: true - it('should provide the $transclude controller local as 5th argument to the pre and post-link function', function() { - var ctrlTransclude, preLinkTransclude, postLinkTransclude; - module(function() { - directive('transclude', valueFn({ - transclude: 'content', - controller: function($transclude) { - ctrlTransclude = $transclude; - }, - compile: function() { - return { - pre: function(scope, el, attr, ctrl, $transclude) { - preLinkTransclude = $transclude; - }, - post: function(scope, el, attr, ctrl, $transclude) { - postLinkTransclude = $transclude; - } - }; - } - })); - }); - inject(function($compile) { - element = $compile('
      ')($rootScope); - expect(ctrlTransclude).toBeDefined(); - expect(ctrlTransclude).toBe(preLinkTransclude); - expect(ctrlTransclude).toBe(postLinkTransclude); - }); - }); + })); + + $compileProvider.directive('noTransBar', valueFn({ + templateUrl: 'noTransBar.html', + transclude: false + + })); + }); + + inject(function($compile, $rootScope, $templateCache) { + $templateCache.put('noTransBar.html', + '
      ' + + // This ng-transclude is invalid. It should throw an error. + '
      ' + + '
      '); + + expect(function() { + element = $compile('
      content
      ')($rootScope); + $rootScope.$apply(); + }).toThrowMinErr('ngTransclude', 'orphan', + 'Illegal use of ngTransclude directive in the template! No parent directive that requires a transclusion found. Element:
      '); + }); + }); + + + it('should expose transcludeFn in compile fn even for templateUrl', function() { + module(function() { + directive('transInCompile', valueFn({ + transclude: true, + // template: '
      whatever
      ', + templateUrl: 'foo.html', + compile: function(_, __, transclude) { + return function(scope, element) { + transclude(scope, function(clone, scope) { + element.html(''); + element.append(clone); + }); + }; + } + })); + }); - it('should allow an optional scope argument in $transclude', function() { - var capturedChildCtrl; - module(function() { - directive('transclude', valueFn({ - transclude: 'content', - link: function(scope, element, attr, ctrl, $transclude) { - $transclude(scope, function(clone) { - element.append(clone); + inject(function($compile, $rootScope, $templateCache) { + $templateCache.put('foo.html', '
      whatever
      '); + + compile('
      transcluded content
      '); + $rootScope.$apply(); + + expect(trim(element.text())).toBe('transcluded content'); + }); + }); + + + it('should make the result of a transclusion available to the parent directive in post-linking phase' + + '(template)', function() { + module(function() { + directive('trans', function(log) { + return { + transclude: true, + template: '
      ', + link: { + pre: function($scope, $element) { + log('pre(' + $element.text() + ')'); + }, + post: function($scope, $element) { + log('post(' + $element.text() + ')'); + } + } + }; }); - } - })); - }); - inject(function($compile) { - element = $compile('
      {{$id}}
      ')($rootScope); - $rootScope.$apply(); - expect(element.text()).toBe('' + $rootScope.$id); - }); + }); + inject(function(log, $rootScope, $compile) { + element = $compile('
      unicorn!
      ')($rootScope); + $rootScope.$apply(); + expect(log).toEqual('pre(); post(unicorn!)'); + }); + }); - }); - it('should expose the directive controller to transcluded children', function() { - var capturedChildCtrl; - module(function() { - directive('transclude', valueFn({ - transclude: 'content', - controller: function() { - }, - link: function(scope, element, attr, ctrl, $transclude) { - $transclude(function(clone) { - element.append(clone); + it('should make the result of a transclusion available to the parent directive in post-linking phase' + + '(templateUrl)', function() { + // when compiling an async directive the transclusion is always processed before the directive + // this is different compared to sync directive. delaying the transclusion makes little sense. + + module(function() { + directive('trans', function(log) { + return { + transclude: true, + templateUrl: 'trans.html', + link: { + pre: function($scope, $element) { + log('pre(' + $element.text() + ')'); + }, + post: function($scope, $element) { + log('post(' + $element.text() + ')'); + } + } + }; }); - } - })); - directive('child', valueFn({ - require: '^transclude', - link: function(scope, element, attr, ctrl) { - capturedChildCtrl = ctrl; - } - })); - }); - inject(function($compile) { - element = $compile('
      ')($rootScope); - expect(capturedChildCtrl).toBeTruthy(); - }); - }); + }); + inject(function(log, $rootScope, $compile, $templateCache) { + $templateCache.put('trans.html', '
      '); + element = $compile('
      unicorn!
      ')($rootScope); + $rootScope.$apply(); + expect(log).toEqual('pre(); post(unicorn!)'); + }); + }); - // See issue https://github.com/angular/angular.js/issues/14924 - it('should not process top-level transcluded text nodes merged into their sibling', - function() { - module(function() { - directive('transclude', valueFn({ - template: '', - transclude: true, - scope: {} - })); + + it('should make the result of a transclusion available to the parent *replace* directive in post-linking phase' + + '(template)', function() { + module(function() { + directive('replacedTrans', function(log) { + return { + transclude: true, + replace: true, + template: '
      ', + link: { + pre: function($scope, $element) { + log('pre(' + $element.text() + ')'); + }, + post: function($scope, $element) { + log('post(' + $element.text() + ')'); + } + } + }; + }); + }); + inject(function(log, $rootScope, $compile) { + element = $compile('
      unicorn!
      ')($rootScope); + $rootScope.$apply(); + expect(log).toEqual('pre(); post(unicorn!)'); + }); }); - inject(function($compile) { - element = jqLite('
      '); - element[0].appendChild(document.createTextNode('1{{ value }}')); - element[0].appendChild(document.createTextNode('2{{ value }}')); - element[0].appendChild(document.createTextNode('3{{ value }}')); - var initialWatcherCount = $rootScope.$countWatchers(); - $compile(element)($rootScope); - $rootScope.$apply('value = 0'); - var newWatcherCount = $rootScope.$countWatchers() - initialWatcherCount; + it('should make the result of a transclusion available to the parent *replace* directive in post-linking phase' + + ' (templateUrl)', function() { + module(function() { + directive('replacedTrans', function(log) { + return { + transclude: true, + replace: true, + templateUrl: 'trans.html', + link: { + pre: function($scope, $element) { + log('pre(' + $element.text() + ')'); + }, + post: function($scope, $element) { + log('post(' + $element.text() + ')'); + } + } + }; + }); + }); + inject(function(log, $rootScope, $compile, $templateCache) { + $templateCache.put('trans.html', '
      '); - expect(element.text()).toBe('102030'); - expect(newWatcherCount).toBe(3); + element = $compile('
      unicorn!
      ')($rootScope); + $rootScope.$apply(); + expect(log).toEqual('pre(); post(unicorn!)'); + }); }); - } - ); + it('should copy the directive controller to all clones', function() { + var transcludeCtrl, cloneCount = 2; + module(function() { + directive('transclude', valueFn({ + transclude: 'content', + controller: function($transclude) { + transcludeCtrl = this; + }, + link: function(scope, el, attr, ctrl, $transclude) { + var i; + for (i = 0; i < cloneCount; i++) { + $transclude(cloneAttach); + } - // see issue https://github.com/angular/angular.js/issues/9413 - describe('passing a parent bound transclude function to the link ' + - 'function returned from `$compile`', function() { + function cloneAttach(clone) { + el.append(clone); + } + } + })); + }); + inject(function($compile) { + element = $compile('
      ')($rootScope); + var children = element.children(), i; + expect(transcludeCtrl).toBeDefined(); - beforeEach(module(function() { - directive('lazyCompile', function($compile) { - return { - compile: function(tElement, tAttrs) { - var content = tElement.contents(); - tElement.empty(); - return function(scope, element, attrs, ctrls, transcludeFn) { - element.append(content); - $compile(content)(scope, undefined, { - parentBoundTranscludeFn: transcludeFn - }); - }; + expect(element.data('$transcludeController')).toBe(transcludeCtrl); + for (i = 0; i < cloneCount; i++) { + expect(children.eq(i).data('$transcludeController')).toBeUndefined(); } - }; + }); }); - directive('toggle', valueFn({ - scope: {t: '=toggle'}, - transclude: true, - template: '
      ' - })); - })); - it('should preserve the bound scope', function() { + it('should provide the $transclude controller local as 5th argument to the pre and post-link function', function() { + var ctrlTransclude, preLinkTransclude, postLinkTransclude; + module(function() { + directive('transclude', valueFn({ + transclude: 'content', + controller: function($transclude) { + ctrlTransclude = $transclude; + }, + compile: function() { + return { + pre: function(scope, el, attr, ctrl, $transclude) { + preLinkTransclude = $transclude; + }, + post: function(scope, el, attr, ctrl, $transclude) { + postLinkTransclude = $transclude; + } + }; + } + })); + }); + inject(function($compile) { + element = $compile('
      ')($rootScope); + expect(ctrlTransclude).toBeDefined(); + expect(ctrlTransclude).toBe(preLinkTransclude); + expect(ctrlTransclude).toBe(postLinkTransclude); + }); + }); - inject(function($compile, $rootScope) { - element = $compile( - '
      ' + - '
      ' + - '
      ' + - 'SuccessError' + - '
      ' + - '
      ')($rootScope); + it('should allow an optional scope argument in $transclude', function() { + var capturedChildCtrl; + module(function() { + directive('transclude', valueFn({ + transclude: 'content', + link: function(scope, element, attr, ctrl, $transclude) { + $transclude(scope, function(clone) { + element.append(clone); + }); + } + })); + }); + inject(function($compile) { + element = $compile('
      {{$id}}
      ')($rootScope); + $rootScope.$apply(); + expect(element.text()).toBe('' + $rootScope.$id); + }); - $rootScope.$apply('t = false'); - expect($rootScope.$countChildScopes()).toBe(1); - expect(element.text()).toBe(''); + }); - $rootScope.$apply('t = true'); - expect($rootScope.$countChildScopes()).toBe(4); - expect(element.text()).toBe('Success'); + it('should expose the directive controller to transcluded children', function() { + var capturedChildCtrl; + module(function() { + directive('transclude', valueFn({ + transclude: 'content', + controller: function() { + }, + link: function(scope, element, attr, ctrl, $transclude) { + $transclude(function(clone) { + element.append(clone); + }); + } + })); + directive('child', valueFn({ + require: '^transclude', + link: function(scope, element, attr, ctrl) { + capturedChildCtrl = ctrl; + } + })); + }); + inject(function($compile) { + element = $compile('
      ')($rootScope); + expect(capturedChildCtrl).toBeTruthy(); + }); + }); - $rootScope.$apply('t = false'); - expect($rootScope.$countChildScopes()).toBe(1); - expect(element.text()).toBe(''); - $rootScope.$apply('t = true'); - expect($rootScope.$countChildScopes()).toBe(4); - expect(element.text()).toBe('Success'); - }); - }); + // See issue https://github.com/angular/angular.js/issues/14924 + it('should not process top-level transcluded text nodes merged into their sibling', + function() { + module(function() { + directive('transclude', valueFn({ + template: '', + transclude: true, + scope: {} + })); + }); + inject(function($compile) { + element = jqLite('
      '); + element[0].appendChild(document.createTextNode('1{{ value }}')); + element[0].appendChild(document.createTextNode('2{{ value }}')); + element[0].appendChild(document.createTextNode('3{{ value }}')); - it('should preserve the bound scope when using recursive transclusion', function() { + var initialWatcherCount = $rootScope.$countWatchers(); + $compile(element)($rootScope); + $rootScope.$apply('value = 0'); + var newWatcherCount = $rootScope.$countWatchers() - initialWatcherCount; - directive('recursiveTransclude', valueFn({ - transclude: true, - template: '
      ' - })); + expect(element.text()).toBe('102030'); + expect(newWatcherCount).toBe(3); + }); + } + ); - inject(function($compile, $rootScope) { - element = $compile( - '
      ' + - '
      ' + - '
      ' + - '
      ' + - 'SuccessError' + - '
      ' + - '
      ' + - '
      ')($rootScope); - $rootScope.$apply('t = false'); - expect($rootScope.$countChildScopes()).toBe(1); - expect(element.text()).toBe(''); + // see issue https://github.com/angular/angular.js/issues/9413 + describe('passing a parent bound transclude function to the link ' + + 'function returned from `$compile`', function() { - $rootScope.$apply('t = true'); - expect($rootScope.$countChildScopes()).toBe(4); - expect(element.text()).toBe('Success'); + beforeEach(module(function() { + directive('lazyCompile', function($compile) { + return { + compile: function(tElement, tAttrs) { + var content = tElement.contents(); + tElement.empty(); + return function(scope, element, attrs, ctrls, transcludeFn) { + element.append(content); + $compile(content)(scope, undefined, { + parentBoundTranscludeFn: transcludeFn + }); + }; + } + }; + }); + directive('toggle', valueFn({ + scope: {t: '=toggle'}, + transclude: true, + template: '
      ' + })); + })); - $rootScope.$apply('t = false'); - expect($rootScope.$countChildScopes()).toBe(1); - expect(element.text()).toBe(''); + it('should preserve the bound scope', function() { - $rootScope.$apply('t = true'); - expect($rootScope.$countChildScopes()).toBe(4); - expect(element.text()).toBe('Success'); - }); - }); - }); + inject(function($compile, $rootScope) { + element = $compile( + '
      ' + + '
      ' + + '
      ' + + 'SuccessError' + + '
      ' + + '
      ')($rootScope); + + $rootScope.$apply('t = false'); + expect($rootScope.$countChildScopes()).toBe(1); + expect(element.text()).toBe(''); + + $rootScope.$apply('t = true'); + expect($rootScope.$countChildScopes()).toBe(4); + expect(element.text()).toBe('Success'); + + $rootScope.$apply('t = false'); + expect($rootScope.$countChildScopes()).toBe(1); + expect(element.text()).toBe(''); + + $rootScope.$apply('t = true'); + expect($rootScope.$countChildScopes()).toBe(4); + expect(element.text()).toBe('Success'); + }); + }); - // see issue https://github.com/angular/angular.js/issues/9095 - describe('removing a transcluded element', function() { + it('should preserve the bound scope when using recursive transclusion', function() { - beforeEach(module(function() { - directive('toggle', function() { - return { - transclude: true, - template: '
      ' - }; + directive('recursiveTransclude', valueFn({ + transclude: true, + template: '
      ' + })); + + inject(function($compile, $rootScope) { + element = $compile( + '
      ' + + '
      ' + + '
      ' + + '
      ' + + 'SuccessError' + + '
      ' + + '
      ' + + '
      ')($rootScope); + + $rootScope.$apply('t = false'); + expect($rootScope.$countChildScopes()).toBe(1); + expect(element.text()).toBe(''); + + $rootScope.$apply('t = true'); + expect($rootScope.$countChildScopes()).toBe(4); + expect(element.text()).toBe('Success'); + + $rootScope.$apply('t = false'); + expect($rootScope.$countChildScopes()).toBe(1); + expect(element.text()).toBe(''); + + $rootScope.$apply('t = true'); + expect($rootScope.$countChildScopes()).toBe(4); + expect(element.text()).toBe('Success'); + }); + }); }); - })); - it('should not leak the transclude scope when the transcluded content is an element transclusion directive', - inject(function($compile, $rootScope) { + // see issue https://github.com/angular/angular.js/issues/9095 + describe('removing a transcluded element', function() { - element = $compile( - '
      ' + - '
      {{ msg }}
      ' + - '
      ' - )($rootScope); - - $rootScope.$apply('t = true'); - expect(element.text()).toContain('msg-1'); - // Expected scopes: $rootScope, ngIf, transclusion, ngRepeat - expect($rootScope.$countChildScopes()).toBe(3); - - $rootScope.$apply('t = false'); - expect(element.text()).not.toContain('msg-1'); - // Expected scopes: $rootScope - expect($rootScope.$countChildScopes()).toBe(0); - - $rootScope.$apply('t = true'); - expect(element.text()).toContain('msg-1'); - // Expected scopes: $rootScope, ngIf, transclusion, ngRepeat - expect($rootScope.$countChildScopes()).toBe(3); - - $rootScope.$apply('t = false'); - expect(element.text()).not.toContain('msg-1'); - // Expected scopes: $rootScope - expect($rootScope.$countChildScopes()).toBe(0); - })); + beforeEach(module(function() { + directive('toggle', function() { + return { + transclude: true, + template: '
      ' + }; + }); + })); - it('should not leak the transclude scope when the transcluded content is an multi-element transclusion directive', - inject(function($compile, $rootScope) { + it('should not leak the transclude scope when the transcluded content is an element transclusion directive', + inject(function($compile, $rootScope) { - element = $compile( - '
      ' + - '
      {{ msg }}
      ' + - '
      {{ msg }}
      ' + - '
      ' - )($rootScope); - - $rootScope.$apply('t = true'); - expect(element.text()).toContain('msg-1msg-1'); - // Expected scopes: $rootScope, ngIf, transclusion, ngRepeat - expect($rootScope.$countChildScopes()).toBe(3); - - $rootScope.$apply('t = false'); - expect(element.text()).not.toContain('msg-1msg-1'); - // Expected scopes: $rootScope - expect($rootScope.$countChildScopes()).toBe(0); - - $rootScope.$apply('t = true'); - expect(element.text()).toContain('msg-1msg-1'); - // Expected scopes: $rootScope, ngIf, transclusion, ngRepeat - expect($rootScope.$countChildScopes()).toBe(3); - - $rootScope.$apply('t = false'); - expect(element.text()).not.toContain('msg-1msg-1'); - // Expected scopes: $rootScope - expect($rootScope.$countChildScopes()).toBe(0); - })); + element = $compile( + '
      ' + + '
      {{ msg }}
      ' + + '
      ' + )($rootScope); + $rootScope.$apply('t = true'); + expect(element.text()).toContain('msg-1'); + // Expected scopes: $rootScope, ngIf, transclusion, ngRepeat + expect($rootScope.$countChildScopes()).toBe(3); + + $rootScope.$apply('t = false'); + expect(element.text()).not.toContain('msg-1'); + // Expected scopes: $rootScope + expect($rootScope.$countChildScopes()).toBe(0); + + $rootScope.$apply('t = true'); + expect(element.text()).toContain('msg-1'); + // Expected scopes: $rootScope, ngIf, transclusion, ngRepeat + expect($rootScope.$countChildScopes()).toBe(3); + + $rootScope.$apply('t = false'); + expect(element.text()).not.toContain('msg-1'); + // Expected scopes: $rootScope + expect($rootScope.$countChildScopes()).toBe(0); + })); - it('should not leak the transclude scope if the transcluded contains only comments', - inject(function($compile, $rootScope) { - element = $compile( - '
      ' + - '' + - '
      ' - )($rootScope); - - $rootScope.$apply('t = true'); - expect(element.html()).toContain('some comment'); - // Expected scopes: $rootScope, ngIf, transclusion - expect($rootScope.$countChildScopes()).toBe(2); - - $rootScope.$apply('t = false'); - expect(element.html()).not.toContain('some comment'); - // Expected scopes: $rootScope - expect($rootScope.$countChildScopes()).toBe(0); - - $rootScope.$apply('t = true'); - expect(element.html()).toContain('some comment'); - // Expected scopes: $rootScope, ngIf, transclusion - expect($rootScope.$countChildScopes()).toBe(2); - - $rootScope.$apply('t = false'); - expect(element.html()).not.toContain('some comment'); - // Expected scopes: $rootScope - expect($rootScope.$countChildScopes()).toBe(0); - })); + it('should not leak the transclude scope when the transcluded content is an multi-element transclusion directive', + inject(function($compile, $rootScope) { - it('should not leak the transclude scope if the transcluded contains only text nodes', - inject(function($compile, $rootScope) { + element = $compile( + '
      ' + + '
      {{ msg }}
      ' + + '
      {{ msg }}
      ' + + '
      ' + )($rootScope); - element = $compile( - '
      ' + - 'some text' + - '
      ' - )($rootScope); - - $rootScope.$apply('t = true'); - expect(element.html()).toContain('some text'); - // Expected scopes: $rootScope, ngIf, transclusion - expect($rootScope.$countChildScopes()).toBe(2); - - $rootScope.$apply('t = false'); - expect(element.html()).not.toContain('some text'); - // Expected scopes: $rootScope - expect($rootScope.$countChildScopes()).toBe(0); - - $rootScope.$apply('t = true'); - expect(element.html()).toContain('some text'); - // Expected scopes: $rootScope, ngIf, transclusion - expect($rootScope.$countChildScopes()).toBe(2); - - $rootScope.$apply('t = false'); - expect(element.html()).not.toContain('some text'); - // Expected scopes: $rootScope - expect($rootScope.$countChildScopes()).toBe(0); - })); + $rootScope.$apply('t = true'); + expect(element.text()).toContain('msg-1msg-1'); + // Expected scopes: $rootScope, ngIf, transclusion, ngRepeat + expect($rootScope.$countChildScopes()).toBe(3); + + $rootScope.$apply('t = false'); + expect(element.text()).not.toContain('msg-1msg-1'); + // Expected scopes: $rootScope + expect($rootScope.$countChildScopes()).toBe(0); + + $rootScope.$apply('t = true'); + expect(element.text()).toContain('msg-1msg-1'); + // Expected scopes: $rootScope, ngIf, transclusion, ngRepeat + expect($rootScope.$countChildScopes()).toBe(3); + + $rootScope.$apply('t = false'); + expect(element.text()).not.toContain('msg-1msg-1'); + // Expected scopes: $rootScope + expect($rootScope.$countChildScopes()).toBe(0); + })); - it('should mark as destroyed all sub scopes of the scope being destroyed', - inject(function($compile, $rootScope) { - element = $compile( - '
      ' + - '
      {{ msg }}
      ' + - '
      ' - )($rootScope); + it('should not leak the transclude scope if the transcluded contains only comments', + inject(function($compile, $rootScope) { - $rootScope.$apply('t = true'); - var childScopes = getChildScopes($rootScope); + element = $compile( + '
      ' + + '' + + '
      ' + )($rootScope); - $rootScope.$apply('t = false'); - for (var i = 0; i < childScopes.length; ++i) { - expect(childScopes[i].$$destroyed).toBe(true); - } - })); - }); + $rootScope.$apply('t = true'); + expect(element.html()).toContain('some comment'); + // Expected scopes: $rootScope, ngIf, transclusion + expect($rootScope.$countChildScopes()).toBe(2); + + $rootScope.$apply('t = false'); + expect(element.html()).not.toContain('some comment'); + // Expected scopes: $rootScope + expect($rootScope.$countChildScopes()).toBe(0); + + $rootScope.$apply('t = true'); + expect(element.html()).toContain('some comment'); + // Expected scopes: $rootScope, ngIf, transclusion + expect($rootScope.$countChildScopes()).toBe(2); + + $rootScope.$apply('t = false'); + expect(element.html()).not.toContain('some comment'); + // Expected scopes: $rootScope + expect($rootScope.$countChildScopes()).toBe(0); + })); + it('should not leak the transclude scope if the transcluded contains only text nodes', + inject(function($compile, $rootScope) { - describe('nested transcludes', function() { + element = $compile( + '
      ' + + 'some text' + + '
      ' + )($rootScope); - beforeEach(module(function($compileProvider) { + $rootScope.$apply('t = true'); + expect(element.html()).toContain('some text'); + // Expected scopes: $rootScope, ngIf, transclusion + expect($rootScope.$countChildScopes()).toBe(2); + + $rootScope.$apply('t = false'); + expect(element.html()).not.toContain('some text'); + // Expected scopes: $rootScope + expect($rootScope.$countChildScopes()).toBe(0); + + $rootScope.$apply('t = true'); + expect(element.html()).toContain('some text'); + // Expected scopes: $rootScope, ngIf, transclusion + expect($rootScope.$countChildScopes()).toBe(2); + + $rootScope.$apply('t = false'); + expect(element.html()).not.toContain('some text'); + // Expected scopes: $rootScope + expect($rootScope.$countChildScopes()).toBe(0); + })); - $compileProvider.directive('noop', valueFn({})); + it('should mark as destroyed all sub scopes of the scope being destroyed', + inject(function($compile, $rootScope) { - $compileProvider.directive('sync', valueFn({ - template: '
      ', - transclude: true - })); + element = $compile( + '
      ' + + '
      {{ msg }}
      ' + + '
      ' + )($rootScope); - $compileProvider.directive('async', valueFn({ - templateUrl: 'async', - transclude: true - })); + $rootScope.$apply('t = true'); + var childScopes = getChildScopes($rootScope); - $compileProvider.directive('syncSync', valueFn({ - template: '
      ', - transclude: true - })); + $rootScope.$apply('t = false'); + for (var i = 0; i < childScopes.length; ++i) { + expect(childScopes[i].$$destroyed).toBe(true); + } + })); + }); - $compileProvider.directive('syncAsync', valueFn({ - template: '
      ', - transclude: true - })); - $compileProvider.directive('asyncSync', valueFn({ - templateUrl: 'asyncSync', - transclude: true - })); + describe('nested transcludes', function() { - $compileProvider.directive('asyncAsync', valueFn({ - templateUrl: 'asyncAsync', - transclude: true - })); + beforeEach(module(function($compileProvider) { - })); + $compileProvider.directive('noop', valueFn({})); - beforeEach(inject(function($templateCache) { - $templateCache.put('async', '
      '); - $templateCache.put('asyncSync', '
      '); - $templateCache.put('asyncAsync', '
      '); - })); + $compileProvider.directive('sync', valueFn({ + template: '
      ', + transclude: true + })); + $compileProvider.directive('async', valueFn({ + templateUrl: 'async', + transclude: true + })); - it('should allow nested transclude directives with sync template containing sync template', inject(function($compile, $rootScope) { - element = $compile('
      transcluded content
      ')($rootScope); - $rootScope.$digest(); - expect(element.text()).toEqual('transcluded content'); - })); + $compileProvider.directive('syncSync', valueFn({ + template: '
      ', + transclude: true + })); - it('should allow nested transclude directives with sync template containing async template', inject(function($compile, $rootScope) { - element = $compile('
      transcluded content
      ')($rootScope); - $rootScope.$digest(); - expect(element.text()).toEqual('transcluded content'); - })); + $compileProvider.directive('syncAsync', valueFn({ + template: '
      ', + transclude: true + })); - it('should allow nested transclude directives with async template containing sync template', inject(function($compile, $rootScope) { - element = $compile('
      transcluded content
      ')($rootScope); - $rootScope.$digest(); - expect(element.text()).toEqual('transcluded content'); - })); + $compileProvider.directive('asyncSync', valueFn({ + templateUrl: 'asyncSync', + transclude: true + })); - it('should allow nested transclude directives with async template containing asynch template', inject(function($compile, $rootScope) { - element = $compile('
      transcluded content
      ')($rootScope); - $rootScope.$digest(); - expect(element.text()).toEqual('transcluded content'); - })); + $compileProvider.directive('asyncAsync', valueFn({ + templateUrl: 'asyncAsync', + transclude: true + })); + })); - it('should not leak memory with nested transclusion', function() { - inject(function($compile, $rootScope) { - var size, initialSize = jqLiteCacheSize(); + beforeEach(inject(function($templateCache) { + $templateCache.put('async', '
      '); + $templateCache.put('asyncSync', '
      '); + $templateCache.put('asyncAsync', '
      '); + })); - element = jqLite('
      • {{n}} => EvenOdd
      '); - $compile(element)($rootScope.$new()); - $rootScope.nums = [0,1,2]; - $rootScope.$apply(); - size = jqLiteCacheSize(); + it('should allow nested transclude directives with sync template containing sync template', inject(function($compile, $rootScope) { + element = $compile('
      transcluded content
      ')($rootScope); + $rootScope.$digest(); + expect(element.text()).toEqual('transcluded content'); + })); - $rootScope.nums = [3,4,5]; - $rootScope.$apply(); - expect(jqLiteCacheSize()).toEqual(size); + it('should allow nested transclude directives with sync template containing async template', inject(function($compile, $rootScope) { + element = $compile('
      transcluded content
      ')($rootScope); + $rootScope.$digest(); + expect(element.text()).toEqual('transcluded content'); + })); - element.remove(); - expect(jqLiteCacheSize()).toEqual(initialSize); - }); - }); - }); + it('should allow nested transclude directives with async template containing sync template', inject(function($compile, $rootScope) { + element = $compile('
      transcluded content
      ')($rootScope); + $rootScope.$digest(); + expect(element.text()).toEqual('transcluded content'); + })); + it('should allow nested transclude directives with async template containing asynch template', inject(function($compile, $rootScope) { + element = $compile('
      transcluded content
      ')($rootScope); + $rootScope.$digest(); + expect(element.text()).toEqual('transcluded content'); + })); - describe('nested isolated scope transcludes', function() { - beforeEach(module(function($compileProvider) { - $compileProvider.directive('trans', valueFn({ - restrict: 'E', - template: '
      ', - transclude: true - })); + it('should not leak memory with nested transclusion', function() { + inject(function($compile, $rootScope) { + var size, initialSize = jqLiteCacheSize(); - $compileProvider.directive('transAsync', valueFn({ - restrict: 'E', - templateUrl: 'transAsync', - transclude: true - })); + element = jqLite('
      • {{n}} => EvenOdd
      '); + $compile(element)($rootScope.$new()); - $compileProvider.directive('iso', valueFn({ - restrict: 'E', - transclude: true, - template: '', - scope: {} - })); - $compileProvider.directive('isoAsync1', valueFn({ - restrict: 'E', - transclude: true, - template: '', - scope: {} - })); - $compileProvider.directive('isoAsync2', valueFn({ - restrict: 'E', - transclude: true, - templateUrl: 'isoAsync', - scope: {} - })); - })); + $rootScope.nums = [0,1,2]; + $rootScope.$apply(); + size = jqLiteCacheSize(); - beforeEach(inject(function($templateCache) { - $templateCache.put('transAsync', '
      '); - $templateCache.put('isoAsync', ''); - })); + $rootScope.nums = [3,4,5]; + $rootScope.$apply(); + expect(jqLiteCacheSize()).toEqual(size); + + element.remove(); + expect(jqLiteCacheSize()).toEqual(initialSize); + }); + }); + }); - it('should pass the outer scope to the transclude on the isolated template sync-sync', inject(function($compile, $rootScope) { + describe('nested isolated scope transcludes', function() { + beforeEach(module(function($compileProvider) { - $rootScope.val = 'transcluded content'; - element = $compile('')($rootScope); - $rootScope.$digest(); - expect(element.text()).toEqual('transcluded content'); - })); + $compileProvider.directive('trans', valueFn({ + restrict: 'E', + template: '
      ', + transclude: true + })); - it('should pass the outer scope to the transclude on the isolated template async-sync', inject(function($compile, $rootScope) { + $compileProvider.directive('transAsync', valueFn({ + restrict: 'E', + templateUrl: 'transAsync', + transclude: true + })); - $rootScope.val = 'transcluded content'; - element = $compile('')($rootScope); - $rootScope.$digest(); - expect(element.text()).toEqual('transcluded content'); - })); + $compileProvider.directive('iso', valueFn({ + restrict: 'E', + transclude: true, + template: '', + scope: {} + })); + $compileProvider.directive('isoAsync1', valueFn({ + restrict: 'E', + transclude: true, + template: '', + scope: {} + })); + $compileProvider.directive('isoAsync2', valueFn({ + restrict: 'E', + transclude: true, + templateUrl: 'isoAsync', + scope: {} + })); + })); - it('should pass the outer scope to the transclude on the isolated template async-async', inject(function($compile, $rootScope) { + beforeEach(inject(function($templateCache) { + $templateCache.put('transAsync', '
      '); + $templateCache.put('isoAsync', ''); + })); - $rootScope.val = 'transcluded content'; - element = $compile('')($rootScope); - $rootScope.$digest(); - expect(element.text()).toEqual('transcluded content'); - })); - }); + it('should pass the outer scope to the transclude on the isolated template sync-sync', inject(function($compile, $rootScope) { - describe('multiple siblings receiving transclusion', function() { + $rootScope.val = 'transcluded content'; + element = $compile('')($rootScope); + $rootScope.$digest(); + expect(element.text()).toEqual('transcluded content'); + })); - it('should only receive transclude from parent', function() { + it('should pass the outer scope to the transclude on the isolated template async-sync', inject(function($compile, $rootScope) { - module(function($compileProvider) { + $rootScope.val = 'transcluded content'; + element = $compile('')($rootScope); + $rootScope.$digest(); + expect(element.text()).toEqual('transcluded content'); + })); - $compileProvider.directive('myExample', valueFn({ - scope: {}, - link: function link(scope, element, attrs) { - var foo = element[0].querySelector('.foo'); - scope.children = angular.element(foo).children().length; - }, - template: '
      ' + - '
      myExample {{children}}!
      ' + - '
      has children
      ' + - '
      ' + - '
      ', - transclude: true + it('should pass the outer scope to the transclude on the isolated template async-async', inject(function($compile, $rootScope) { + $rootScope.val = 'transcluded content'; + element = $compile('')($rootScope); + $rootScope.$digest(); + expect(element.text()).toEqual('transcluded content'); })); }); - inject(function($compile, $rootScope) { - var element = $compile('
      ')($rootScope); - $rootScope.$digest(); - expect(element.text()).toEqual('myExample 0!'); - dealoc(element); + describe('multiple siblings receiving transclusion', function() { - element = $compile('

      ')($rootScope); - $rootScope.$digest(); - expect(element.text()).toEqual('myExample 1!has children'); - dealoc(element); + it('should only receive transclude from parent', function() { + + module(function($compileProvider) { + + $compileProvider.directive('myExample', valueFn({ + scope: {}, + link: function link(scope, element, attrs) { + var foo = element[0].querySelector('.foo'); + scope.children = angular.element(foo).children().length; + }, + template: '
      ' + + '
      myExample {{children}}!
      ' + + '
      has children
      ' + + '
      ' + + '
      ', + transclude: true + + })); + + }); + + inject(function($compile, $rootScope) { + var element = $compile('
      ')($rootScope); + $rootScope.$digest(); + expect(element.text()).toEqual('myExample 0!'); + dealoc(element); + + element = $compile('

      ')($rootScope); + $rootScope.$digest(); + expect(element.text()).toEqual('myExample 1!has children'); + dealoc(element); + }); + }); }); }); - }); - }); - describe('element transclusion', function() { + describe('element transclusion', function() { - it('should support basic element transclusion', function() { - module(function() { - directive('trans', function(log) { - return { - transclude: 'element', - priority: 2, - controller: function($transclude) { this.$transclude = $transclude; }, - compile: function(element, attrs, template) { - log('compile: ' + angular.mock.dump(element)); - return function(scope, element, attrs, ctrl) { - log('link'); - var cursor = element; - template(scope.$new(), function(clone) {cursor.after(cursor = clone);}); - ctrl.$transclude(function(clone) {cursor.after(clone);}); + it('should support basic element transclusion', function() { + module(function() { + directive('trans', function(log) { + return { + transclude: 'element', + priority: 2, + controller: function($transclude) { this.$transclude = $transclude; }, + compile: function(element, attrs, template) { + log('compile: ' + angular.mock.dump(element)); + return function(scope, element, attrs, ctrl) { + log('link'); + var cursor = element; + template(scope.$new(), function(clone) {cursor.after(cursor = clone);}); + ctrl.$transclude(function(clone) {cursor.after(clone);}); + }; + } }; - } - }; + }); + }); + inject(function(log, $rootScope, $compile) { + element = $compile('
      {{$parent.$id}}-{{$id}};
      ')($rootScope); + $rootScope.$apply(); + expect(log).toEqual('compile: ; link; LOG; LOG; HIGH'); + expect(element.text()).toEqual('1-2;1-3;'); + }); }); - }); - inject(function(log, $rootScope, $compile) { - element = $compile('
      {{$parent.$id}}-{{$id}};
      ')($rootScope); - $rootScope.$apply(); - expect(log).toEqual('compile: ; link; LOG; LOG; HIGH'); - expect(element.text()).toEqual('1-2;1-3;'); - }); - }); - it('should only allow one element transclusion per element', function() { - module(function() { - directive('first', valueFn({ - transclude: 'element' - })); - directive('second', valueFn({ - transclude: 'element' - })); - }); - inject(function($compile) { - expect(function() { - $compile('
      '); - }).toThrowMinErr('$compile', 'multidir', 'Multiple directives [first, second] asking for transclusion on: ' + - ''); - }); - }); + it('should only allow one element transclusion per element', function() { + module(function() { + directive('first', valueFn({ + transclude: 'element' + })); + directive('second', valueFn({ + transclude: 'element' + })); + }); + inject(function($compile) { + expect(function() { + $compile('
      '); + }).toThrowMinErr('$compile', 'multidir', 'Multiple directives [first, second] asking for transclusion on: ' + + ''); + }); + }); - it('should only allow one element transclusion per element when directives have different priorities', function() { - // we restart compilation in this case and we need to remember the duplicates during the second compile - // regression #3893 - module(function() { - directive('first', valueFn({ - transclude: 'element', - priority: 100 - })); - directive('second', valueFn({ - transclude: 'element' - })); - }); - inject(function($compile) { - expect(function() { - $compile('
      '); - }).toThrowMinErr('$compile', 'multidir', /Multiple directives \[first, second\] asking for transclusion on:
      '); + }).toThrowMinErr('$compile', 'multidir', /Multiple directives \[first, second\] asking for transclusion on:
      template.html

      '); - $compile('
      '); - expect(function() { - $httpBackend.flush(); - }).toThrowMinErr('$compile', 'multidir', /Multiple directives \[first, second\] asking for transclusion on:

      template.html

      '); + $compile('
      '); + expect(function() { + $httpBackend.flush(); + }).toThrowMinErr('$compile', 'multidir', /Multiple directives \[first, second\] asking for transclusion on:

      ', - replace: true - })); - directive('first', valueFn({ - transclude: 'element', - priority: 100 - })); - directive('second', valueFn({ - transclude: 'element' - })); - }); - inject(function($compile) { - expect(function() { - $compile('
      '); - }).toThrowMinErr('$compile', 'multidir', /Multiple directives \[first, second\] asking for transclusion on:

      ', + replace: true + })); + directive('first', valueFn({ + transclude: 'element', + priority: 100 + })); + directive('second', valueFn({ + transclude: 'element' + })); + }); + inject(function($compile) { + expect(function() { + $compile('
      '); + }).toThrowMinErr('$compile', 'multidir', /Multiple directives \[first, second\] asking for transclusion on:

      before

      after
      ').contents(); - expect(element.length).toEqual(3); - expect(nodeName_(element[1])).toBe('div'); - $compile(element)($rootScope); - expect(nodeName_(element[1])).toBe('#comment'); - expect(nodeName_(comment)).toBe('#comment'); - }); - }); + it('should support transcluded element on root content', function() { + var comment; + module(function() { + directive('transclude', valueFn({ + transclude: 'element', + compile: function(element, attr, linker) { + return function(scope, element, attr) { + comment = element; + }; + } + })); + }); + inject(function($compile, $rootScope) { + var element = jqLite('
      before
      after
      ').contents(); + expect(element.length).toEqual(3); + expect(nodeName_(element[1])).toBe('div'); + $compile(element)($rootScope); + expect(nodeName_(element[1])).toBe('#comment'); + expect(nodeName_(comment)).toBe('#comment'); + }); + }); - it('should terminate compilation only for element trasclusion', function() { - module(function() { - directive('elementTrans', function(log) { - return { - transclude: 'element', - priority: 50, - compile: log.fn('compile:elementTrans') - }; - }); - directive('regularTrans', function(log) { - return { - transclude: true, - priority: 50, - compile: log.fn('compile:regularTrans') - }; + it('should terminate compilation only for element trasclusion', function() { + module(function() { + directive('elementTrans', function(log) { + return { + transclude: 'element', + priority: 50, + compile: log.fn('compile:elementTrans') + }; + }); + directive('regularTrans', function(log) { + return { + transclude: true, + priority: 50, + compile: log.fn('compile:regularTrans') + }; + }); + }); + inject(function(log, $compile, $rootScope) { + $compile('
      ')($rootScope); + expect(log).toEqual('compile:elementTrans; compile:regularTrans; regular'); + }); }); - }); - inject(function(log, $compile, $rootScope) { - $compile('
      ')($rootScope); - expect(log).toEqual('compile:elementTrans; compile:regularTrans; regular'); - }); - }); - it('should instantiate high priority controllers only once, but low priority ones each time we transclude', - function() { - module(function() { - directive('elementTrans', function(log) { - return { - transclude: 'element', - priority: 50, - controller: function($transclude, $element) { - log('controller:elementTrans'); - $transclude(function(clone) { - $element.after(clone); - }); - $transclude(function(clone) { - $element.after(clone); - }); - $transclude(function(clone) { - $element.after(clone); - }); - } - }; + it('should instantiate high priority controllers only once, but low priority ones each time we transclude', + function() { + module(function() { + directive('elementTrans', function(log) { + return { + transclude: 'element', + priority: 50, + controller: function($transclude, $element) { + log('controller:elementTrans'); + $transclude(function(clone) { + $element.after(clone); + }); + $transclude(function(clone) { + $element.after(clone); + }); + $transclude(function(clone) { + $element.after(clone); + }); + } + }; + }); + directive('normalDir', function(log) { + return { + controller: function() { + log('controller:normalDir'); + } + }; + }); + }); + inject(function($compile, $rootScope, log) { + element = $compile('
      ')($rootScope); + expect(log).toEqual([ + 'controller:elementTrans', + 'controller:normalDir', + 'controller:normalDir', + 'controller:normalDir' + ]); + }); }); - directive('normalDir', function(log) { - return { - controller: function() { - log('controller:normalDir'); - } - }; + + it('should allow to access $transclude in the same directive', function() { + var _$transclude; + module(function() { + directive('transclude', valueFn({ + transclude: 'element', + controller: function($transclude) { + _$transclude = $transclude; + } + })); + }); + inject(function($compile) { + element = $compile('
      ')($rootScope); + expect(_$transclude).toBeDefined(); + }); }); - }); - inject(function($compile, $rootScope, log) { - element = $compile('
      ')($rootScope); - expect(log).toEqual([ - 'controller:elementTrans', - 'controller:normalDir', - 'controller:normalDir', - 'controller:normalDir' - ]); - }); - }); - it('should allow to access $transclude in the same directive', function() { - var _$transclude; - module(function() { - directive('transclude', valueFn({ - transclude: 'element', - controller: function($transclude) { - _$transclude = $transclude; - } - })); - }); - inject(function($compile) { - element = $compile('
      ')($rootScope); - expect(_$transclude).toBeDefined(); - }); - }); + it('should copy the directive controller to all clones', function() { + var transcludeCtrl, cloneCount = 2; + module(function() { + directive('transclude', valueFn({ + transclude: 'element', + controller: function() { + transcludeCtrl = this; + }, + link: function(scope, el, attr, ctrl, $transclude) { + var i; + for (i = 0; i < cloneCount; i++) { + $transclude(cloneAttach); + } - it('should copy the directive controller to all clones', function() { - var transcludeCtrl, cloneCount = 2; - module(function() { - directive('transclude', valueFn({ - transclude: 'element', - controller: function() { - transcludeCtrl = this; - }, - link: function(scope, el, attr, ctrl, $transclude) { - var i; + function cloneAttach(clone) { + el.after(clone); + } + } + })); + }); + inject(function($compile) { + element = $compile('
      ')($rootScope); + var children = element.children(), i; for (i = 0; i < cloneCount; i++) { - $transclude(cloneAttach); + expect(children.eq(i).data('$transcludeController')).toBe(transcludeCtrl); } + }); + }); - function cloneAttach(clone) { - el.after(clone); - } - } - })); - }); - inject(function($compile) { - element = $compile('
      ')($rootScope); - var children = element.children(), i; - for (i = 0; i < cloneCount; i++) { - expect(children.eq(i).data('$transcludeController')).toBe(transcludeCtrl); - } - }); - }); + it('should expose the directive controller to transcluded children', function() { + var capturedTranscludeCtrl; + module(function() { + directive('transclude', valueFn({ + transclude: 'element', + controller: function() { + }, + link: function(scope, element, attr, ctrl, $transclude) { + $transclude(scope, function(clone) { + element.after(clone); + }); + } + })); + directive('child', valueFn({ + require: '^transclude', + link: function(scope, element, attr, ctrl) { + capturedTranscludeCtrl = ctrl; + } + })); + }); + inject(function($compile) { + // We need to wrap the transclude directive's element in a parent element so that the + // cloned element gets deallocated/cleaned up correctly + element = $compile('
      ')($rootScope); + expect(capturedTranscludeCtrl).toBeTruthy(); + }); + }); - it('should expose the directive controller to transcluded children', function() { - var capturedTranscludeCtrl; - module(function() { - directive('transclude', valueFn({ - transclude: 'element', - controller: function() { - }, - link: function(scope, element, attr, ctrl, $transclude) { - $transclude(scope, function(clone) { - element.after(clone); + it('should allow access to $transclude in a templateUrl directive', function() { + var transclude; + module(function() { + directive('template', valueFn({ + templateUrl: 'template.html', + replace: true + })); + directive('transclude', valueFn({ + transclude: 'content', + controller: function($transclude) { + transclude = $transclude; + } + })); + }); + inject(function($compile, $httpBackend) { + $httpBackend.expectGET('template.html').respond('
      '); + element = $compile('
      ')($rootScope); + $httpBackend.flush(); + expect(transclude).toBeDefined(); + }); + }); + + // issue #6006 + it('should link directive with $element as a comment node', function() { + module(function($provide) { + directive('innerAgain', function(log) { + return { + transclude: 'element', + link: function(scope, element, attr, controllers, transclude) { + log('innerAgain:' + lowercase(nodeName_(element)) + ':' + trim(element[0].data)); + transclude(scope, function(clone) { + element.parent().append(clone); + }); + } + }; + }); + directive('inner', function(log) { + return { + replace: true, + templateUrl: 'inner.html', + link: function(scope, element) { + log('inner:' + lowercase(nodeName_(element)) + ':' + trim(element[0].data)); + } + }; }); - } - })); - directive('child', valueFn({ - require: '^transclude', - link: function(scope, element, attr, ctrl) { - capturedTranscludeCtrl = ctrl; - } - })); - }); - inject(function($compile) { - // We need to wrap the transclude directive's element in a parent element so that the - // cloned element gets deallocated/cleaned up correctly - element = $compile('
      ')($rootScope); - expect(capturedTranscludeCtrl).toBeTruthy(); + directive('outer', function(log) { + return { + transclude: 'element', + link: function(scope, element, attrs, controllers, transclude) { + log('outer:' + lowercase(nodeName_(element)) + ':' + trim(element[0].data)); + transclude(scope, function(clone) { + element.parent().append(clone); + }); + } + }; + }); + }); + inject(function(log, $compile, $rootScope, $templateCache) { + $templateCache.put('inner.html', '

      Content

      '); + element = $compile('
      ')($rootScope); + $rootScope.$digest(); + var child = element.children(); + + expect(log.toArray()).toEqual([ + 'outer:#comment:outer:', + 'innerAgain:#comment:innerAgain:', + 'inner:#comment:innerAgain:' + ]); + expect(child.length).toBe(1); + expect(child.contents().length).toBe(2); + expect(lowercase(nodeName_(child.contents().eq(0)))).toBe('#comment'); + expect(lowercase(nodeName_(child.contents().eq(1)))).toBe('div'); + }); + }); }); - }); - it('should allow access to $transclude in a templateUrl directive', function() { - var transclude; - module(function() { - directive('template', valueFn({ - templateUrl: 'template.html', - replace: true - })); - directive('transclude', valueFn({ - transclude: 'content', - controller: function($transclude) { - transclude = $transclude; - } - })); - }); - inject(function($compile, $httpBackend) { - $httpBackend.expectGET('template.html').respond('
      '); - element = $compile('
      ')($rootScope); - $httpBackend.flush(); - expect(transclude).toBeDefined(); - }); - }); - // issue #6006 - it('should link directive with $element as a comment node', function() { - module(function($provide) { - directive('innerAgain', function(log) { - return { - transclude: 'element', - link: function(scope, element, attr, controllers, transclude) { - log('innerAgain:' + lowercase(nodeName_(element)) + ':' + trim(element[0].data)); - transclude(scope, function(clone) { - element.parent().append(clone); - }); - } - }; - }); - directive('inner', function(log) { - return { - replace: true, - templateUrl: 'inner.html', - link: function(scope, element) { - log('inner:' + lowercase(nodeName_(element)) + ':' + trim(element[0].data)); - } - }; + it('should be possible to change the scope of a directive using $provide', function() { + module(function($provide) { + directive('foo', function() { + return { + scope: {}, + template: '
      ' + }; + }); + $provide.decorator('fooDirective', function($delegate) { + var directive = $delegate[0]; + directive.scope.something = '='; + directive.template = '{{something}}'; + return $delegate; + }); }); - directive('outer', function(log) { - return { - transclude: 'element', - link: function(scope, element, attrs, controllers, transclude) { - log('outer:' + lowercase(nodeName_(element)) + ':' + trim(element[0].data)); - transclude(scope, function(clone) { - element.parent().append(clone); - }); - } - }; + inject(function($compile, $rootScope) { + element = $compile('
      ')($rootScope); + $rootScope.bar = 'bar'; + $rootScope.$digest(); + expect(element.text()).toBe('bar'); }); }); - inject(function(log, $compile, $rootScope, $templateCache) { - $templateCache.put('inner.html', '

      Content

      '); - element = $compile('
      ')($rootScope); - $rootScope.$digest(); - var child = element.children(); - - expect(log.toArray()).toEqual([ - 'outer:#comment:outer:', - 'innerAgain:#comment:innerAgain:', - 'inner:#comment:innerAgain:' - ]); - expect(child.length).toBe(1); - expect(child.contents().length).toBe(2); - expect(lowercase(nodeName_(child.contents().eq(0)))).toBe('#comment'); - expect(lowercase(nodeName_(child.contents().eq(1)))).toBe('div'); - }); - }); - }); - it('should be possible to change the scope of a directive using $provide', function() { - module(function($provide) { - directive('foo', function() { - return { - scope: {}, - template: '
      ' - }; - }); - $provide.decorator('fooDirective', function($delegate) { - var directive = $delegate[0]; - directive.scope.something = '='; - directive.template = '{{something}}'; - return $delegate; + it('should distinguish different bindings with the same binding name', function() { + module(function() { + directive('foo', function() { + return { + scope: { + foo: '=', + bar: '=' + }, + template: '
      {{foo}}
      {{bar}}
      ' + }; + }); + }); + inject(function($compile, $rootScope) { + element = $compile('
      ')($rootScope); + $rootScope.$digest(); + expect(element.text()).toBe('foobar'); + }); }); - }); - inject(function($compile, $rootScope) { - element = $compile('
      ')($rootScope); - $rootScope.bar = 'bar'; - $rootScope.$digest(); - expect(element.text()).toBe('bar'); - }); - }); - - it('should distinguish different bindings with the same binding name', function() { - module(function() { - directive('foo', function() { - return { - scope: { - foo: '=', - bar: '=' - }, - template: '
      {{foo}}
      {{bar}}
      ' - }; - }); - }); - inject(function($compile, $rootScope) { - element = $compile('
      ')($rootScope); - $rootScope.$digest(); - expect(element.text()).toBe('foobar'); - }); - }); + it('should safely create transclude comment node and not break with "-->"', + inject(function($rootScope) { + // see: https://github.com/angular/angular.js/issues/1740 + element = $compile('
      • {{item}}|
      ')($rootScope); + $rootScope.$digest(); - it('should safely create transclude comment node and not break with "-->"', - inject(function($rootScope) { - // see: https://github.com/angular/angular.js/issues/1740 - element = $compile('
      • {{item}}|
      ')($rootScope); - $rootScope.$digest(); + expect(element.text()).toBe('-->|x|'); + })); - expect(element.text()).toBe('-->|x|'); - })); + describe('lazy compilation', function() { + // See https://github.com/angular/angular.js/issues/7183 + it('should pass transclusion through to template of a \'replace\' directive', function() { + module(function() { + directive('transSync', function() { + return { + transclude: true, + link: function(scope, element, attr, ctrl, transclude) { - describe('lazy compilation', function() { - // See https://github.com/angular/angular.js/issues/7183 - it('should pass transclusion through to template of a \'replace\' directive', function() { - module(function() { - directive('transSync', function() { - return { - transclude: true, - link: function(scope, element, attr, ctrl, transclude) { + expect(transclude).toEqual(jasmine.any(Function)); - expect(transclude).toEqual(jasmine.any(Function)); + transclude(function(child) { element.append(child); }); + } + }; + }); - transclude(function(child) { element.append(child); }); - } - }; - }); + directive('trans', function($timeout) { + return { + transclude: true, + link: function(scope, element, attrs, ctrl, transclude) { - directive('trans', function($timeout) { - return { - transclude: true, - link: function(scope, element, attrs, ctrl, transclude) { + // We use timeout here to simulate how ng-if works + $timeout(function() { + transclude(function(child) { element.append(child); }); + }); + } + }; + }); - // We use timeout here to simulate how ng-if works - $timeout(function() { - transclude(function(child) { element.append(child); }); - }); - } - }; - }); + directive('replaceWithTemplate', function() { + return { + templateUrl: 'template.html', + replace: true + }; + }); + }); - directive('replaceWithTemplate', function() { - return { - templateUrl: 'template.html', - replace: true - }; - }); - }); + inject(function($compile, $rootScope, $templateCache, $timeout) { - inject(function($compile, $rootScope, $templateCache, $timeout) { + $templateCache.put('template.html', '
      Content To Be Transcluded
      '); - $templateCache.put('template.html', '
      Content To Be Transcluded
      '); + expect(function() { + element = $compile('
      ')($rootScope); + $timeout.flush(); + }).not.toThrow(); - expect(function() { - element = $compile('
      ')($rootScope); - $timeout.flush(); - }).not.toThrow(); + expect(element.text()).toEqual('Content To Be Transcluded'); + }); - expect(element.text()).toEqual('Content To Be Transcluded'); - }); + }); - }); + it('should lazily compile the contents of directives that are transcluded', function() { + var innerCompilationCount = 0, transclude; - it('should lazily compile the contents of directives that are transcluded', function() { - var innerCompilationCount = 0, transclude; + module(function() { + directive('trans', valueFn({ + transclude: true, + controller: function($transclude) { + transclude = $transclude; + } + })); - module(function() { - directive('trans', valueFn({ - transclude: true, - controller: function($transclude) { - transclude = $transclude; - } - })); + directive('inner', valueFn({ + template: 'FooBar', + compile: function() { + innerCompilationCount += 1; + } + })); + }); - directive('inner', valueFn({ - template: 'FooBar', - compile: function() { - innerCompilationCount += 1; - } - })); - }); + inject(function($compile, $rootScope) { + element = $compile('')($rootScope); + expect(innerCompilationCount).toBe(0); + transclude(function(child) { element.append(child); }); + expect(innerCompilationCount).toBe(1); + expect(element.text()).toBe('FooBar'); + }); + }); - inject(function($compile, $rootScope) { - element = $compile('')($rootScope); - expect(innerCompilationCount).toBe(0); - transclude(function(child) { element.append(child); }); - expect(innerCompilationCount).toBe(1); - expect(element.text()).toBe('FooBar'); - }); - }); + it('should lazily compile the contents of directives that are transcluded with a template', function() { + var innerCompilationCount = 0, transclude; - it('should lazily compile the contents of directives that are transcluded with a template', function() { - var innerCompilationCount = 0, transclude; + module(function() { + directive('trans', valueFn({ + transclude: true, + template: '
      Baz
      ', + controller: function($transclude) { + transclude = $transclude; + } + })); - module(function() { - directive('trans', valueFn({ - transclude: true, - template: '
      Baz
      ', - controller: function($transclude) { - transclude = $transclude; - } - })); + directive('inner', valueFn({ + template: 'FooBar', + compile: function() { + innerCompilationCount += 1; + } + })); + }); - directive('inner', valueFn({ - template: 'FooBar', - compile: function() { - innerCompilationCount += 1; - } - })); - }); + inject(function($compile, $rootScope) { + element = $compile('')($rootScope); + expect(innerCompilationCount).toBe(0); + transclude(function(child) { element.append(child); }); + expect(innerCompilationCount).toBe(1); + expect(element.text()).toBe('BazFooBar'); + }); + }); - inject(function($compile, $rootScope) { - element = $compile('')($rootScope); - expect(innerCompilationCount).toBe(0); - transclude(function(child) { element.append(child); }); - expect(innerCompilationCount).toBe(1); - expect(element.text()).toBe('BazFooBar'); - }); - }); + it('should lazily compile the contents of directives that are transcluded with a templateUrl', function() { + var innerCompilationCount = 0, transclude; - it('should lazily compile the contents of directives that are transcluded with a templateUrl', function() { - var innerCompilationCount = 0, transclude; + module(function() { + directive('trans', valueFn({ + transclude: true, + templateUrl: 'baz.html', + controller: function($transclude) { + transclude = $transclude; + } + })); - module(function() { - directive('trans', valueFn({ - transclude: true, - templateUrl: 'baz.html', - controller: function($transclude) { - transclude = $transclude; - } - })); + directive('inner', valueFn({ + template: 'FooBar', + compile: function() { + innerCompilationCount += 1; + } + })); + }); - directive('inner', valueFn({ - template: 'FooBar', - compile: function() { - innerCompilationCount += 1; - } - })); - }); + inject(function($compile, $rootScope, $httpBackend) { + $httpBackend.expectGET('baz.html').respond('
      Baz
      '); + element = $compile('')($rootScope); + $httpBackend.flush(); - inject(function($compile, $rootScope, $httpBackend) { - $httpBackend.expectGET('baz.html').respond('
      Baz
      '); - element = $compile('')($rootScope); - $httpBackend.flush(); + expect(innerCompilationCount).toBe(0); + transclude(function(child) { element.append(child); }); + expect(innerCompilationCount).toBe(1); + expect(element.text()).toBe('BazFooBar'); + }); + }); - expect(innerCompilationCount).toBe(0); - transclude(function(child) { element.append(child); }); - expect(innerCompilationCount).toBe(1); - expect(element.text()).toBe('BazFooBar'); - }); - }); + it('should lazily compile the contents of directives that are transclude element', function() { + var innerCompilationCount = 0, transclude; - it('should lazily compile the contents of directives that are transclude element', function() { - var innerCompilationCount = 0, transclude; + module(function() { + directive('trans', valueFn({ + transclude: 'element', + controller: function($transclude) { + transclude = $transclude; + } + })); - module(function() { - directive('trans', valueFn({ - transclude: 'element', - controller: function($transclude) { - transclude = $transclude; - } - })); + directive('inner', valueFn({ + template: 'FooBar', + compile: function() { + innerCompilationCount += 1; + } + })); + }); - directive('inner', valueFn({ - template: 'FooBar', - compile: function() { - innerCompilationCount += 1; - } - })); - }); + inject(function($compile, $rootScope) { + element = $compile('
      ')($rootScope); + expect(innerCompilationCount).toBe(0); + transclude(function(child) { element.append(child); }); + expect(innerCompilationCount).toBe(1); + expect(element.text()).toBe('FooBar'); + }); + }); - inject(function($compile, $rootScope) { - element = $compile('
      ')($rootScope); - expect(innerCompilationCount).toBe(0); - transclude(function(child) { element.append(child); }); - expect(innerCompilationCount).toBe(1); - expect(element.text()).toBe('FooBar'); - }); - }); + it('should lazily compile transcluded directives with ngIf on them', function() { + var innerCompilationCount = 0, outerCompilationCount = 0, transclude; - it('should lazily compile transcluded directives with ngIf on them', function() { - var innerCompilationCount = 0, outerCompilationCount = 0, transclude; + module(function() { + directive('outer', valueFn({ + transclude: true, + compile: function() { + outerCompilationCount += 1; + }, + controller: function($transclude) { + transclude = $transclude; + } + })); - module(function() { - directive('outer', valueFn({ - transclude: true, - compile: function() { - outerCompilationCount += 1; - }, - controller: function($transclude) { - transclude = $transclude; - } - })); + directive('inner', valueFn({ + template: 'FooBar', + compile: function() { + innerCompilationCount += 1; + } + })); + }); - directive('inner', valueFn({ - template: 'FooBar', - compile: function() { - innerCompilationCount += 1; - } - })); - }); + inject(function($compile, $rootScope) { + $rootScope.shouldCompile = false; + + element = $compile('
      ')($rootScope); + expect(outerCompilationCount).toBe(0); + expect(innerCompilationCount).toBe(0); + expect(transclude).toBeUndefined(); + $rootScope.$apply('shouldCompile=true'); + expect(outerCompilationCount).toBe(1); + expect(innerCompilationCount).toBe(0); + expect(transclude).toBeDefined(); + transclude(function(child) { element.append(child); }); + expect(outerCompilationCount).toBe(1); + expect(innerCompilationCount).toBe(1); + expect(element.text()).toBe('FooBar'); + }); + }); - inject(function($compile, $rootScope) { - $rootScope.shouldCompile = false; + it('should eagerly compile multiple directives with transclusion and templateUrl/replace', function() { + var innerCompilationCount = 0; - element = $compile('
      ')($rootScope); - expect(outerCompilationCount).toBe(0); - expect(innerCompilationCount).toBe(0); - expect(transclude).toBeUndefined(); - $rootScope.$apply('shouldCompile=true'); - expect(outerCompilationCount).toBe(1); - expect(innerCompilationCount).toBe(0); - expect(transclude).toBeDefined(); - transclude(function(child) { element.append(child); }); - expect(outerCompilationCount).toBe(1); - expect(innerCompilationCount).toBe(1); - expect(element.text()).toBe('FooBar'); - }); - }); + module(function() { + directive('outer', valueFn({ + transclude: true + })); - it('should eagerly compile multiple directives with transclusion and templateUrl/replace', function() { - var innerCompilationCount = 0; + directive('outer', valueFn({ + templateUrl: 'inner.html', + replace: true + })); - module(function() { - directive('outer', valueFn({ - transclude: true - })); + directive('inner', valueFn({ + compile: function() { + innerCompilationCount += 1; + } + })); + }); - directive('outer', valueFn({ - templateUrl: 'inner.html', - replace: true - })); + inject(function($compile, $rootScope, $httpBackend) { + $httpBackend.expectGET('inner.html').respond(''); + element = $compile('')($rootScope); + $httpBackend.flush(); - directive('inner', valueFn({ - compile: function() { - innerCompilationCount += 1; - } - })); + expect(innerCompilationCount).toBe(1); + }); + }); }); - inject(function($compile, $rootScope, $httpBackend) { - $httpBackend.expectGET('inner.html').respond(''); - element = $compile('')($rootScope); - $httpBackend.flush(); - - expect(innerCompilationCount).toBe(1); - }); }); }); - }); - describe('multi-slot transclude', function() { it('should only include elements without a matching transclusion element in default transclusion slot', function() { module(function() { From 3cb5bad15db3b85490f29e24a4880c5dbcd60f43 Mon Sep 17 00:00:00 2001 From: Peter Bacon Darwin Date: Wed, 7 Sep 2016 08:42:19 +0100 Subject: [PATCH 0144/1173] test($compile): add tests for provider settings See https://github.com/angular/angular.js/pull/15095#issuecomment-244970426 --- test/ng/compileSpec.js | 54 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 54 insertions(+) diff --git a/test/ng/compileSpec.js b/test/ng/compileSpec.js index 16d437ac4ae3..9519585938d2 100755 --- a/test/ng/compileSpec.js +++ b/test/ng/compileSpec.js @@ -151,6 +151,60 @@ describe('$compile', function() { describe('configuration', function() { + it('should allow aHrefSanitizationWhitelist to be configured', function() { + module(function($compileProvider) { + expect($compileProvider.aHrefSanitizationWhitelist()).toEqual(/^\s*(https?|ftp|mailto|tel|file):/); // the default + $compileProvider.aHrefSanitizationWhitelist(/other/); + expect($compileProvider.aHrefSanitizationWhitelist()).toEqual(/other/); + }); + inject(); + }); + + it('should allow debugInfoEnabled to be configured', function() { + module(function($compileProvider) { + expect($compileProvider.debugInfoEnabled()).toBe(true); // the default + $compileProvider.debugInfoEnabled(false); + expect($compileProvider.debugInfoEnabled()).toBe(false); + }); + inject(); + }); + + it('should allow preAssignBindingsEnabled to be configured', function() { + module(function($compileProvider) { + expect($compileProvider.preAssignBindingsEnabled()).toBe(true); // the default + $compileProvider.preAssignBindingsEnabled(false); + expect($compileProvider.preAssignBindingsEnabled()).toBe(false); + }); + inject(); + }); + + it('should allow onChangesTtl to be configured', function() { + module(function($compileProvider) { + expect($compileProvider.onChangesTtl()).toBe(10); // the default + $compileProvider.onChangesTtl(2); + expect($compileProvider.onChangesTtl()).toBe(2); + }); + inject(); + }); + + it('should allow commentDirectivesEnabled to be configured', function() { + module(function($compileProvider) { + expect($compileProvider.commentDirectivesEnabled()).toBe(true); // the default + $compileProvider.commentDirectivesEnabled(false); + expect($compileProvider.commentDirectivesEnabled()).toBe(false); + }); + inject(); + }); + + it('should allow cssClassDirectivesEnabled to be configured', function() { + module(function($compileProvider) { + expect($compileProvider.cssClassDirectivesEnabled()).toBe(true); // the default + $compileProvider.cssClassDirectivesEnabled(false); + expect($compileProvider.cssClassDirectivesEnabled()).toBe(false); + }); + inject(); + }); + it('should register a directive', function() { module(function() { directive('div', function(log) { From 7d7efbf545c8c07713eb45301660dcfca4121445 Mon Sep 17 00:00:00 2001 From: Georgios Kalpakas Date: Tue, 6 Sep 2016 19:58:09 +0300 Subject: [PATCH 0145/1173] fix($compile): avoid calling `$onChanges()` twice for `NaN` initial values Closes #15098 --- src/ng/compile.js | 4 +++- test/ng/compileSpec.js | 36 ++++++++++++++++++++++++++++++++++-- 2 files changed, 37 insertions(+), 3 deletions(-) diff --git a/src/ng/compile.js b/src/ng/compile.js index ec3e828db87e..a63402e698db 100644 --- a/src/ng/compile.js +++ b/src/ng/compile.js @@ -3536,7 +3536,9 @@ function $CompileProvider($provide, $$sanitizeUriProvider) { }); function recordChanges(key, currentValue, previousValue) { - if (isFunction(destination.$onChanges) && currentValue !== previousValue) { + if (isFunction(destination.$onChanges) && currentValue !== previousValue && + // eslint-disable-next-line no-self-compare + (currentValue === currentValue || previousValue === previousValue)) { // If we have not already scheduled the top level onChangesQueue handler then do so now if (!onChangesQueue) { scope.$$postDigest(flushOnChangesQueue); diff --git a/test/ng/compileSpec.js b/test/ng/compileSpec.js index 9519585938d2..bb5717afa76b 100755 --- a/test/ng/compileSpec.js +++ b/test/ng/compileSpec.js @@ -4387,6 +4387,40 @@ describe('$compile', function() { }); + it('should not call `$onChanges` twice even when the initial value is `NaN`', function() { + var onChangesSpy = jasmine.createSpy('$onChanges'); + + module(function($compileProvider) { + $compileProvider.component('test', { + bindings: {prop: '<', attr: '@'}, + controller: function TestController() { + this.$onChanges = onChangesSpy; + } + }); + }); + + inject(function($compile, $rootScope) { + var template = '' + + ''; + $rootScope.a = 'foo'; + $rootScope.b = NaN; + + element = $compile(template)($rootScope); + $rootScope.$digest(); + + expect(onChangesSpy).toHaveBeenCalledTimes(2); + expect(onChangesSpy.calls.argsFor(0)[0]).toEqual({ + prop: jasmine.objectContaining({currentValue: 'foo'}), + attr: jasmine.objectContaining({currentValue: 'foo'}) + }); + expect(onChangesSpy.calls.argsFor(1)[0]).toEqual({ + prop: jasmine.objectContaining({currentValue: NaN}), + attr: jasmine.objectContaining({currentValue: 'NaN'}) + }); + }); + }); + + it('should only trigger one extra digest however many controllers have changes', function() { var log = []; function TestController1() { } @@ -4433,7 +4467,6 @@ describe('$compile', function() { it('should cope with changes occuring inside `$onChanges()` hooks', function() { var log = []; function OuterController() {} - OuterController.prototype.$onChanges = function(change) { log.push(['OuterController', change]); // Make a change to the inner component @@ -4468,7 +4501,6 @@ describe('$compile', function() { expect(log).toEqual([ ['OuterController', {prop1: jasmine.objectContaining({previousValue: undefined, currentValue: 42})}], - ['InnerController', {prop2: jasmine.objectContaining({previousValue: NaN, currentValue: NaN})}], ['InnerController', {prop2: jasmine.objectContaining({previousValue: NaN, currentValue: 84})}] ]); }); From c0cbe54bc68e805b7293ad56a71f5e50c2e9cf90 Mon Sep 17 00:00:00 2001 From: Georgios Kalpakas Date: Wed, 7 Sep 2016 15:03:43 +0300 Subject: [PATCH 0146/1173] test($compile): extend `$onChanges()` test to account for one more case Discussed in https://github.com/angular/angular.js/pull/15098/files#r77770755. --- test/ng/compileSpec.js | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/test/ng/compileSpec.js b/test/ng/compileSpec.js index bb5717afa76b..e4a8ddf4e960 100755 --- a/test/ng/compileSpec.js +++ b/test/ng/compileSpec.js @@ -4397,7 +4397,7 @@ describe('$compile', function() { this.$onChanges = onChangesSpy; } }); - }); + }); inject(function($compile, $rootScope) { var template = '' + @@ -4417,6 +4417,19 @@ describe('$compile', function() { prop: jasmine.objectContaining({currentValue: NaN}), attr: jasmine.objectContaining({currentValue: 'NaN'}) }); + + onChangesSpy.calls.reset(); + $rootScope.$apply('a = "bar"; b = 42'); + + expect(onChangesSpy).toHaveBeenCalledTimes(2); + expect(onChangesSpy.calls.argsFor(0)[0]).toEqual({ + prop: jasmine.objectContaining({previousValue: 'foo', currentValue: 'bar'}), + attr: jasmine.objectContaining({previousValue: 'foo', currentValue: 'bar'}) + }); + expect(onChangesSpy.calls.argsFor(1)[0]).toEqual({ + prop: jasmine.objectContaining({previousValue: NaN, currentValue: 42}), + attr: jasmine.objectContaining({previousValue: 'NaN', currentValue: '42'}) + }); }); }); From 704123a81bbfd9c88815543574ffbe6d4377eaa0 Mon Sep 17 00:00:00 2001 From: Georgios Kalpakas Date: Wed, 7 Sep 2016 19:10:23 +0300 Subject: [PATCH 0147/1173] docs($compile): be more explicit about linking not having taken place inside `cloneAttachFn` Fixes #15093 --- src/ng/compile.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ng/compile.js b/src/ng/compile.js index a63402e698db..02cd0bdbaa94 100644 --- a/src/ng/compile.js +++ b/src/ng/compile.js @@ -697,7 +697,7 @@ * * When you call a transclusion function you can pass in a **clone attach function**. This function accepts * two parameters, `function(clone, scope) { ... }`, where the `clone` is a fresh compiled copy of your transcluded - * content and the `scope` is the newly created transclusion scope, to which the clone is bound. + * content and the `scope` is the newly created transclusion scope, which the clone will be linked to. * *
      * **Best Practice**: Always provide a `cloneFn` (clone attach function) when you call a transclude function From 6341f4260abecb106a78427cc5aa6df5adc64eb3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Go=C5=82e=CC=A8biowski?= Date: Wed, 7 Sep 2016 11:56:17 +0200 Subject: [PATCH 0148/1173] refactor(jqLite): run more tests on jQuery 2.2, add version detection helpers --- test/jqLiteSpec.js | 146 ++++++++++++++++++++++----------------------- 1 file changed, 73 insertions(+), 73 deletions(-) diff --git a/test/jqLiteSpec.js b/test/jqLiteSpec.js index 87ad0566a08f..48be3ed8199a 100644 --- a/test/jqLiteSpec.js +++ b/test/jqLiteSpec.js @@ -3,6 +3,19 @@ describe('jqLite', function() { var scope, a, b, c, document; + // Checks if jQuery 2.1 is used. + function isJQuery21() { + if (_jqLiteMode) return false; + var jQueryVersionParts = _jQuery.fn.jquery.split('.'); + return jQueryVersionParts[0] + '.' + jQueryVersionParts[1] === '2.1'; + } + + // Checks if jQuery 2.x is used. + function isJQuery2x() { + if (_jqLiteMode) return false; + var jQueryVersionParts = _jQuery.fn.jquery.split('.'); + return jQueryVersionParts[0] === '2'; + } beforeEach(module(provideLog)); @@ -83,30 +96,27 @@ describe('jqLite', function() { }); - // This is not working correctly in jQuery prior to v3.0. + // This is not working correctly in jQuery prior to v2.2. // See https://github.com/jquery/jquery/issues/1987 for details. it('should properly handle dash-delimited node names', function() { - var jQueryVersion = window.jQuery && window.jQuery.fn.jquery.split('.')[0]; - var jQuery3xOrNewer = jQueryVersion && (Number(jQueryVersion) >= 3); + if (isJQuery21()) return; - if (_jqLiteMode || jQuery3xOrNewer) { - var nodeNames = 'thead tbody tfoot colgroup caption tr th td div kung'.split(' '); - var nodeNamesTested = 0; - var nodes, customNodeName; + var nodeNames = 'thead tbody tfoot colgroup caption tr th td div kung'.split(' '); + var nodeNamesTested = 0; + var nodes, customNodeName; - forEach(nodeNames, function(nodeName) { - var customNodeName = nodeName + '-foo'; - var nodes = jqLite('<' + customNodeName + '>Hello, world !'); + forEach(nodeNames, function(nodeName) { + var customNodeName = nodeName + '-foo'; + var nodes = jqLite('<' + customNodeName + '>Hello, world !'); - expect(nodes.length).toBe(1); - expect(nodeName_(nodes)).toBe(customNodeName); - expect(nodes.html()).toBe('Hello, world !'); + expect(nodes.length).toBe(1); + expect(nodeName_(nodes)).toBe(customNodeName); + expect(nodes.html()).toBe('Hello, world !'); - nodeNamesTested++; - }); + nodeNamesTested++; + }); - expect(nodeNamesTested).toBe(10); - } + expect(nodeNamesTested).toBe(10); }); @@ -712,11 +722,9 @@ describe('jqLite', function() { describe('class', function() { it('should properly do with SVG elements', function() { - // This is not working correctly in jQuery prior to v3.0. + // This is not working correctly in jQuery prior to v2.2. // See https://github.com/jquery/jquery/issues/2199 for details. - var jQueryVersion = window.jQuery && window.jQuery.fn.jquery.split('.')[0]; - var jQuery3xOrNewer = jQueryVersion && (Number(jQueryVersion) >= 3); - if (!_jqLiteMode && !jQuery3xOrNewer) return; + if (isJQuery21()) return; var svg = jqLite(''); var rect = svg.children(); @@ -1023,12 +1031,10 @@ describe('jqLite', function() { // See https://github.com/jquery/jquery/issues/2562 for more details. // jqLite will align with jQuery 3.0 behavior in Angular 1.6. var val; - var jQueryVersion = window.jQuery && window.jQuery.fn.jquery.split('.')[0]; - var jQuery3xOrNewer = jQueryVersion && (Number(jQueryVersion) >= 3); - if (!_jqLiteMode && jQuery3xOrNewer) { - val = []; - } else { + if (_jqLiteMode || isJQuery2x()) { val = null; + } else { + val = []; } expect(jqLite( @@ -1070,7 +1076,8 @@ describe('jqLite', function() { describe('on', function() { it('should bind to window on hashchange', function() { - if (jqLite.fn) return; // don't run in jQuery + if (!_jqLiteMode) return; // don't run in jQuery + var eventFn; var window = { document: {}, @@ -1260,7 +1267,7 @@ describe('jqLite', function() { }); it('should fire mouseenter when coming from outside the browser window', function() { - if (window.jQuery) return; + if (!_jqLiteMode) return; setup('
      root

      parentchild

        ', 'p', 'span'); @@ -1279,7 +1286,7 @@ describe('jqLite', function() { }); it('should fire the mousenter on SVG elements', function() { - if (window.jQuery) return; + if (!_jqLiteMode) return; setup( '
        ' + @@ -1301,29 +1308,28 @@ describe('jqLite', function() { }); }); - // Only run this test for jqLite and not normal jQuery - if (_jqLiteMode) { - it('should throw an error if eventData or a selector is passed', function() { - var elm = jqLite(a), - anObj = {}, - aString = '', - aValue = 45, - callback = function() {}; + it('should throw an error if eventData or a selector is passed', function() { + if (!_jqLiteMode) return; - expect(function() { - elm.on('click', anObj, callback); - }).toThrowMinErr('jqLite', 'onargs'); + var elm = jqLite(a), + anObj = {}, + aString = '', + aValue = 45, + callback = function() {}; - expect(function() { - elm.on('click', null, aString, callback); - }).toThrowMinErr('jqLite', 'onargs'); + expect(function() { + elm.on('click', anObj, callback); + }).toThrowMinErr('jqLite', 'onargs'); - expect(function() { - elm.on('click', aValue, callback); - }).toThrowMinErr('jqLite', 'onargs'); + expect(function() { + elm.on('click', null, aString, callback); + }).toThrowMinErr('jqLite', 'onargs'); - }); - } + expect(function() { + elm.on('click', aValue, callback); + }).toThrowMinErr('jqLite', 'onargs'); + + }); }); @@ -1554,11 +1560,6 @@ describe('jqLite', function() { describe('native listener deregistration', function() { - var jQueryVersionString = window.jQuery && window.jQuery.fn.jquery; - var jQueryMajor = jQueryVersionString && Number(jQueryVersionString.split('.')[0]); - var jQueryMinor = jQueryVersionString && Number(jQueryVersionString.split('.')[1]); - var jQuery21 = jQueryMajor === 2 && jQueryMinor === 1; - it('should deregister the native listener when all jqLite listeners for given type are gone ' + 'after off("eventName", listener) call', function() { var aElem = jqLite(a); @@ -1571,7 +1572,7 @@ describe('jqLite', function() { // jQuery <2.2 passes the non-needed `false` useCapture parameter. // See https://github.com/jquery/jquery/issues/2199 for details. - if (jQuery21) { + if (isJQuery21()) { expect(addEventListenerSpy).toHaveBeenCalledOnceWith('click', jasmine.any(Function), false); } else { expect(addEventListenerSpy).toHaveBeenCalledOnceWith('click', jasmine.any(Function)); @@ -1580,7 +1581,7 @@ describe('jqLite', function() { expect(removeEventListenerSpy).not.toHaveBeenCalled(); aElem.off('click', jqLiteListener); - if (jQuery21) { + if (isJQuery21()) { expect(removeEventListenerSpy).toHaveBeenCalledOnceWith('click', nativeListenerFn, false); } else { expect(removeEventListenerSpy).toHaveBeenCalledOnceWith('click', nativeListenerFn); @@ -1596,7 +1597,7 @@ describe('jqLite', function() { var nativeListenerFn; aElem.on('click', function() {}); - if (jQuery21) { + if (isJQuery21()) { expect(addEventListenerSpy).toHaveBeenCalledOnceWith('click', jasmine.any(Function), false); } else { expect(addEventListenerSpy).toHaveBeenCalledOnceWith('click', jasmine.any(Function)); @@ -1605,7 +1606,7 @@ describe('jqLite', function() { expect(removeEventListenerSpy).not.toHaveBeenCalled(); aElem.off('click'); - if (jQuery21) { + if (isJQuery21()) { expect(removeEventListenerSpy).toHaveBeenCalledOnceWith('click', nativeListenerFn, false); } else { expect(removeEventListenerSpy).toHaveBeenCalledOnceWith('click', nativeListenerFn); @@ -1621,7 +1622,7 @@ describe('jqLite', function() { var nativeListenerFn; aElem.on('click', function() {}); - if (jQuery21) { + if (isJQuery21()) { expect(addEventListenerSpy).toHaveBeenCalledOnceWith('click', jasmine.any(Function), false); } else { expect(addEventListenerSpy).toHaveBeenCalledOnceWith('click', jasmine.any(Function)); @@ -1630,7 +1631,7 @@ describe('jqLite', function() { addEventListenerSpy.calls.reset(); aElem.on('dblclick', function() {}); - if (jQuery21) { + if (isJQuery21()) { expect(addEventListenerSpy).toHaveBeenCalledOnceWith('dblclick', nativeListenerFn, false); } else { expect(addEventListenerSpy).toHaveBeenCalledOnceWith('dblclick', nativeListenerFn); @@ -1640,7 +1641,7 @@ describe('jqLite', function() { aElem.off('click dblclick'); - if (jQuery21) { + if (isJQuery21()) { expect(removeEventListenerSpy).toHaveBeenCalledWith('click', nativeListenerFn, false); expect(removeEventListenerSpy).toHaveBeenCalledWith('dblclick', nativeListenerFn, false); } else { @@ -1659,7 +1660,7 @@ describe('jqLite', function() { var nativeListenerFn; aElem.on('click', function() {}); - if (jQuery21) { + if (isJQuery21()) { expect(addEventListenerSpy).toHaveBeenCalledOnceWith('click', jasmine.any(Function), false); } else { expect(addEventListenerSpy).toHaveBeenCalledOnceWith('click', jasmine.any(Function)); @@ -1668,7 +1669,7 @@ describe('jqLite', function() { addEventListenerSpy.calls.reset(); aElem.on('dblclick', function() {}); - if (jQuery21) { + if (isJQuery21()) { expect(addEventListenerSpy).toHaveBeenCalledOnceWith('dblclick', nativeListenerFn, false); } else { expect(addEventListenerSpy).toHaveBeenCalledOnceWith('dblclick', nativeListenerFn); @@ -1676,7 +1677,7 @@ describe('jqLite', function() { aElem.off(); - if (jQuery21) { + if (isJQuery21()) { expect(removeEventListenerSpy).toHaveBeenCalledWith('click', nativeListenerFn, false); expect(removeEventListenerSpy).toHaveBeenCalledWith('dblclick', nativeListenerFn, false); } else { @@ -1688,16 +1689,15 @@ describe('jqLite', function() { }); - // Only run this test for jqLite and not normal jQuery - if (_jqLiteMode) { - it('should throw an error if a selector is passed', function() { - var aElem = jqLite(a); - aElem.on('click', noop); - expect(function() { - aElem.off('click', noop, '.test'); - }).toThrowError(/\[jqLite:offargs\]/); - }); - } + it('should throw an error if a selector is passed', function() { + if (!_jqLiteMode) return; + + var aElem = jqLite(a); + aElem.on('click', noop); + expect(function() { + aElem.off('click', noop, '.test'); + }).toThrowError(/\[jqLite:offargs\]/); + }); }); describe('one', function() { From dbb8483b4d6f7c133ac96b700a60fc26f52b6839 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Go=C5=82e=CC=A8biowski?= Date: Wed, 7 Sep 2016 12:03:07 +0200 Subject: [PATCH 0149/1173] refactor(matchers): add the toEqualOneOf matcher --- test/helpers/matchers.js | 21 +++++++++++++++++---- 1 file changed, 17 insertions(+), 4 deletions(-) diff --git a/test/helpers/matchers.js b/test/helpers/matchers.js index 79b02bbbb23a..9161e612c0ee 100644 --- a/test/helpers/matchers.js +++ b/test/helpers/matchers.js @@ -32,6 +32,12 @@ beforeEach(function() { }; } + function DOMTester(a, b) { + if (a && b && a.nodeType > 0 && b.nodeType > 0) { + return a === b; + } + } + function isNgElementHidden(element) { // we need to check element.getAttribute for SVG nodes var hidden = true; @@ -111,12 +117,19 @@ beforeEach(function() { }; } }; + }, - function DOMTester(a, b) { - if (a && b && a.nodeType > 0 && b.nodeType > 0) { - return a === b; + toEqualOneOf: function(util) { + return { + compare: function(actual) { + var expectedArgs = Array.prototype.slice.call(arguments, 1); + return { + pass: expectedArgs.some(function(expected) { + return util.equals(actual, expected, [DOMTester]); + }) + }; } - } + }; }, toEqualData: function() { From 121f64936e82c92c6ec055b07be7511cc1c2834a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Go=C5=82e=CC=A8biowski?= Date: Wed, 7 Sep 2016 12:09:43 +0200 Subject: [PATCH 0150/1173] refactor(jqLite): use the toEqualOneOf matcher in jqLite tests --- test/jqLiteSpec.js | 15 +++------------ 1 file changed, 3 insertions(+), 12 deletions(-) diff --git a/test/jqLiteSpec.js b/test/jqLiteSpec.js index 48be3ed8199a..3b51e17f2509 100644 --- a/test/jqLiteSpec.js +++ b/test/jqLiteSpec.js @@ -1026,22 +1026,13 @@ describe('jqLite', function() { '' + '').val()).toEqual(['test 1']); - // In jQuery >= 3.0 .val() on select[multiple] with no selected options returns an - // empty array, not null. - // See https://github.com/jquery/jquery/issues/2562 for more details. - // jqLite will align with jQuery 3.0 behavior in Angular 1.6. - var val; - if (_jqLiteMode || isJQuery2x()) { - val = null; - } else { - val = []; - } - + // In jQuery < 3.0 .val() on select[multiple] with no selected options returns an + // null instead of an empty array. expect(jqLite( '').val()).toEqual(val); + '').val()).toEqualOneOf(null, []); }); }); From d882fde2e532216e7cf424495db1ccb5be1789f8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Go=C5=82e=CC=A8biowski?= Date: Wed, 7 Sep 2016 12:13:00 +0200 Subject: [PATCH 0151/1173] feat(jqLite): return [] for .val() on JavaScript: var value = $element.val(); if (value) { /* do something */ } After: HTML: JavaScript: var value = $element.val(); if (value.length > 0) { /* do something */ } --- src/jqLite.js | 2 +- test/jqLiteSpec.js | 25 +++++++++++++++++++++++++ 2 files changed, 26 insertions(+), 1 deletion(-) diff --git a/src/jqLite.js b/src/jqLite.js index e4ad42f86932..1d199dee46d4 100644 --- a/src/jqLite.js +++ b/src/jqLite.js @@ -699,7 +699,7 @@ forEach({ result.push(option.value || option.text); } }); - return result.length === 0 ? null : result; + return result; } return element.value; } diff --git a/test/jqLiteSpec.js b/test/jqLiteSpec.js index 3b51e17f2509..b00703c9bc04 100644 --- a/test/jqLiteSpec.js +++ b/test/jqLiteSpec.js @@ -1034,6 +1034,31 @@ describe('jqLite', function() { '' + '').val()).toEqualOneOf(null, []); }); + + it('should get an empty array from a multi select if no elements are chosen', function() { + // In jQuery < 3.0 .val() on select[multiple] with no selected options returns an + // null instead of an empty array. + // See https://github.com/jquery/jquery/issues/2562 for more details. + if (isJQuery2x()) return; + + expect(jqLite( + '').val()).toEqual([]); + + expect(jqLite( + '').val()).toEqual([]); + }); }); From 8ec3f4b518fef6ba667c98481f997b8c2f4e769c Mon Sep 17 00:00:00 2001 From: sethbattin Date: Thu, 8 Sep 2016 08:18:32 -0500 Subject: [PATCH 0152/1173] docs($resourceProvider): include '$' in di in example The injection argument is missing the '$' in the two examples. The code fails as written. This change corrects it. (#15099) --- src/ngResource/resource.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/ngResource/resource.js b/src/ngResource/resource.js index ca62575d98a4..11fd7ebffc1a 100644 --- a/src/ngResource/resource.js +++ b/src/ngResource/resource.js @@ -475,7 +475,7 @@ angular.module('ngResource', ['ng']). * ```js * angular. * module('myApp'). - * config(['resourceProvider', function ($resourceProvider) { + * config(['$resourceProvider', function ($resourceProvider) { * $resourceProvider.defaults.actions.update = { * method: 'PUT' * }; @@ -487,7 +487,7 @@ angular.module('ngResource', ['ng']). * ```js * angular. * module('myApp'). - * config(['resourceProvider', function ($resourceProvider) { + * config(['$resourceProvider', function ($resourceProvider) { * $resourceProvider.defaults.actions = { * create: {method: 'POST'} * get: {method: 'GET'}, From c729554281f630ba7ae5de88c5f5481241730883 Mon Sep 17 00:00:00 2001 From: Austin O'Neil Date: Thu, 8 Sep 2016 07:21:10 -0600 Subject: [PATCH 0153/1173] docs(guide/component): clarify when to use directives instead of components Clarify that components cannot be used to perform actions in compile and prelink functions. Closes #15042 PR (#15100) --- docs/content/guide/component.ngdoc | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/docs/content/guide/component.ngdoc b/docs/content/guide/component.ngdoc index d0142bf36a5a..afc5273640b6 100644 --- a/docs/content/guide/component.ngdoc +++ b/docs/content/guide/component.ngdoc @@ -19,8 +19,7 @@ Advantages of Components: When not to use Components: -- for directives that rely on DOM manipulation, adding event listeners etc, because the compile -and link functions are unavailable +- for directives that need to perform actions in compile and pre-link functions, because they aren't available - when you need advanced directive definition options like priority, terminal, multi-element - when you want a directive that is triggered by an attribute or CSS class, rather than an element From 4941e047b77a3428310ae27c6c66fad29c3b0836 Mon Sep 17 00:00:00 2001 From: Martin Staffa Date: Thu, 8 Sep 2016 15:55:39 +0200 Subject: [PATCH 0154/1173] docs($compile): link to sections from properties in example --- src/ng/compile.js | 39 ++++++++++++++++++++------------------- 1 file changed, 20 insertions(+), 19 deletions(-) diff --git a/src/ng/compile.js b/src/ng/compile.js index 02cd0bdbaa94..4dcba455e5e5 100644 --- a/src/ng/compile.js +++ b/src/ng/compile.js @@ -67,33 +67,34 @@ * * myModule.directive('directiveName', function factory(injectables) { * var directiveDefinitionObject = { - * priority: 0, - * template: '
        ', // or // function(tElement, tAttrs) { ... }, + * {@link $compile#-priority- priority}: 0, + * {@link $compile#-template- template}: '
        ', // or // function(tElement, tAttrs) { ... }, * // or - * // templateUrl: 'directive.html', // or // function(tElement, tAttrs) { ... }, - * transclude: false, - * restrict: 'A', - * templateNamespace: 'html', - * scope: false, - * controller: function($scope, $element, $attrs, $transclude, otherInjectables) { ... }, - * controllerAs: 'stringIdentifier', - * bindToController: false, - * require: 'siblingDirectiveName', // or // ['^parentDirectiveName', '?optionalDirectiveName', '?^optionalParent'], - * compile: function compile(tElement, tAttrs, transclude) { + * // {@link $compile#-templateurl- templateUrl}: 'directive.html', // or // function(tElement, tAttrs) { ... }, + * {@link $compile#-transclude- transclude}: false, + * {@link $compile#-restrict- restrict}: 'A', + * {@link $compile#-templatenamespace- templateNamespace}: 'html', + * {@link $compile#-scope- scope}: false, + * {@link $compile#-controller- controller}: function($scope, $element, $attrs, $transclude, otherInjectables) { ... }, + * {@link $compile#-controlleras- controllerAs}: 'stringIdentifier', + * {@link $compile#-bindtocontroller- bindToController}: false, + * {@link $compile#-require- require}: 'siblingDirectiveName', // or // ['^parentDirectiveName', '?optionalDirectiveName', '?^optionalParent'], + * {@link $compile#-multielement- multiElement}: false, + * {@link $compile#-compile- compile}: function compile(tElement, tAttrs, transclude) { * return { - * pre: function preLink(scope, iElement, iAttrs, controller) { ... }, - * post: function postLink(scope, iElement, iAttrs, controller) { ... } + * {@link $compile#pre-linking-function pre}: function preLink(scope, iElement, iAttrs, controller) { ... }, + * {@link $compile#post-linking-function post}: function postLink(scope, iElement, iAttrs, controller) { ... } * } * // or * // return function postLink( ... ) { ... } * }, * // or - * // link: { - * // pre: function preLink(scope, iElement, iAttrs, controller) { ... }, - * // post: function postLink(scope, iElement, iAttrs, controller) { ... } + * // {@link $compile#-link- link}: { + * // {@link $compile#pre-linking-function pre}: function preLink(scope, iElement, iAttrs, controller) { ... }, + * // {@link $compile#post-linking-function post}: function postLink(scope, iElement, iAttrs, controller) { ... } * // } * // or - * // link: function postLink( ... ) { ... } + * // {@link $compile#-link- link}: function postLink( ... ) { ... } * }; * return directiveDefinitionObject; * }); @@ -245,7 +246,7 @@ * compiler}. The attributes are: * * #### `multiElement` - * When this property is set to true, the HTML compiler will collect DOM nodes between + * When this property is set to true (default is `false`), the HTML compiler will collect DOM nodes between * nodes with the attributes `directive-name-start` and `directive-name-end`, and group them * together as the directive elements. It is recommended that this feature be used on directives * which are not strictly behavioral (such as {@link ngClick}), and which From 0b22173000596bf4b78f6a90083b994d46164d79 Mon Sep 17 00:00:00 2001 From: Lucas Galfaso Date: Sun, 18 Jan 2015 21:45:24 +0100 Subject: [PATCH 0155/1173] feat(ngSwitch): allow multiple case matches via optional attribute ngSwitchWhenSeparator Adds an optional attribute `ngSwitchWhenSeparator` that allows multiple tokens to match a given `ngSwitchWhen`. Closes #3410 Closes #3516 Closes #10798 --- src/ng/directive/ngSwitch.js | 18 ++++- test/ng/directive/ngSwitchSpec.js | 107 ++++++++++++++++++++++++++++++ 2 files changed, 122 insertions(+), 3 deletions(-) diff --git a/src/ng/directive/ngSwitch.js b/src/ng/directive/ngSwitch.js index 1cfbdd7c730c..e35912d671af 100644 --- a/src/ng/directive/ngSwitch.js +++ b/src/ng/directive/ngSwitch.js @@ -50,7 +50,11 @@ * * * `ngSwitchWhen`: the case statement to match against. If match then this * case will be displayed. If the same match appears multiple times, all the - * elements will be displayed. + * elements will be displayed. It is possible to associate mutiple values to + * the same `ngSwitchWhen` by defining the optional attribute + * `ngSwitchWhenSeparator`. The separator will be used to split the value of + * the `ngSwitchWhen` attribute into multiple tokens, and the element will show + * if any of the `ngSwitch` evaluates to any of these tokens. * * `ngSwitchDefault`: the default case when no other case match. If there * are multiple default cases, all of them will be displayed when no other * case match. @@ -189,8 +193,16 @@ var ngSwitchWhenDirective = ngDirective({ require: '^ngSwitch', multiElement: true, link: function(scope, element, attrs, ctrl, $transclude) { - ctrl.cases['!' + attrs.ngSwitchWhen] = (ctrl.cases['!' + attrs.ngSwitchWhen] || []); - ctrl.cases['!' + attrs.ngSwitchWhen].push({ transclude: $transclude, element: element }); + + var cases = attrs.ngSwitchWhen.split(attrs.ngSwitchWhenSeparator).sort().filter( + // Filter duplicate cases + function(element, index, array) { return array[index - 1] !== element; } + ); + + forEach(cases, function(whenCase) { + ctrl.cases['!' + whenCase] = (ctrl.cases['!' + whenCase] || []); + ctrl.cases['!' + whenCase].push({ transclude: $transclude, element: element }); + }); } }); diff --git a/test/ng/directive/ngSwitchSpec.js b/test/ng/directive/ngSwitchSpec.js index cebb52b849cf..9e22ec8ba83f 100644 --- a/test/ng/directive/ngSwitchSpec.js +++ b/test/ng/directive/ngSwitchSpec.js @@ -299,6 +299,113 @@ describe('ngSwitch', function() { $rootScope.$apply('mode = "b"'); expect(element.children().length).toBe(1); })); + + + describe('ngSwitchWhen separator', function() { + it('should be possible to define a separator', inject(function($rootScope, $compile) { + element = $compile( + '
        ' + + '

        Block1|

        ' + + '

        Block2|

        ' + + '

        Block3|

        ' + + '
        ' + )($rootScope); + + $rootScope.$apply('mode = "a"'); + expect(element.children().length).toBe(2); + expect(element.text()).toBe('Block1|Block2|'); + $rootScope.$apply('mode = "b"'); + expect(element.children().length).toBe(1); + expect(element.text()).toBe('Block1|'); + $rootScope.$apply('mode = "c"'); + expect(element.children().length).toBe(1); + expect(element.text()).toBe('Block3|'); + })); + + + it('should be possible to use a separator at the end of the value', inject(function($rootScope, $compile) { + element = $compile( + '
        ' + + '

        Block1|

        ' + + '

        Block2|

        ' + + '

        Block3|

        ' + + '
        ' + )($rootScope); + + $rootScope.$apply('mode = "a"'); + expect(element.children().length).toBe(2); + expect(element.text()).toBe('Block1|Block2|'); + $rootScope.$apply('mode = ""'); + expect(element.children().length).toBe(1); + expect(element.text()).toBe('Block1|'); + $rootScope.$apply('mode = "c"'); + expect(element.children().length).toBe(1); + expect(element.text()).toBe('Block3|'); + })); + + + it('should be possible to use the empty string as a separator', inject(function($rootScope, $compile) { + element = $compile( + '
        ' + + '

        Block1|

        ' + + '

        Block2|

        ' + + '

        Block3|

        ' + + '
        ' + )($rootScope); + + $rootScope.$apply('mode = "a"'); + expect(element.children().length).toBe(2); + expect(element.text()).toBe('Block1|Block2|'); + $rootScope.$apply('mode = "b"'); + expect(element.children().length).toBe(1); + expect(element.text()).toBe('Block1|'); + $rootScope.$apply('mode = "c"'); + expect(element.children().length).toBe(1); + expect(element.text()).toBe('Block3|'); + })); + + + it('should be possible to use separators that are multiple characters long', inject(function($rootScope, $compile) { + element = $compile( + '
        ' + + '

        Block1|

        ' + + '

        Block2|

        ' + + '

        Block3|

        ' + + '
        ' + )($rootScope); + + $rootScope.$apply('mode = "a"'); + expect(element.children().length).toBe(2); + expect(element.text()).toBe('Block1|Block2|'); + $rootScope.$apply('mode = "b|a"'); + expect(element.children().length).toBe(1); + expect(element.text()).toBe('Block1|'); + $rootScope.$apply('mode = "c"'); + expect(element.children().length).toBe(1); + expect(element.text()).toBe('Block3|'); + })); + + + it('should ignore multiple appearances of the same item', inject(function($rootScope, $compile) { + element = $compile( + '
        ' + + '

        Block1|

        ' + + '

        Block2|

        ' + + '

        Block3|

        ' + + '
        ' + )($rootScope); + + $rootScope.$apply('mode = "a"'); + expect(element.children().length).toBe(2); + expect(element.text()).toBe('Block1|Block2|'); + $rootScope.$apply('mode = "b"'); + expect(element.children().length).toBe(1); + expect(element.text()).toBe('Block1|'); + $rootScope.$apply('mode = "c"'); + expect(element.children().length).toBe(1); + expect(element.text()).toBe('Block3|'); + })); + }); }); describe('ngSwitch animation', function() { From cc8ea72f3a9375deab4182eb35d615dd9a6eec7f Mon Sep 17 00:00:00 2001 From: Martin Staffa Date: Thu, 8 Sep 2016 21:23:41 +0200 Subject: [PATCH 0156/1173] docs(ngSwitch): add separator example --- src/ng/directive/ngSwitch.js | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/src/ng/directive/ngSwitch.js b/src/ng/directive/ngSwitch.js index e35912d671af..70e079b3fa33 100644 --- a/src/ng/directive/ngSwitch.js +++ b/src/ng/directive/ngSwitch.js @@ -70,7 +70,7 @@
        -
        Settings Div
        +
        Settings Div
        Home Span
        default
        @@ -79,7 +79,7 @@ angular.module('switchExample', ['ngAnimate']) .controller('ExampleController', ['$scope', function($scope) { - $scope.items = ['settings', 'home', 'other']; + $scope.items = ['settings', 'home', 'options', 'other']; $scope.selection = $scope.items[0]; }]); @@ -126,8 +126,12 @@ select.all(by.css('option')).get(1).click(); expect(switchElem.getText()).toMatch(/Home Span/); }); - it('should select default', function() { + it('should change to settings via "options"', function() { select.all(by.css('option')).get(2).click(); + expect(switchElem.getText()).toMatch(/Settings Div/); + }); + it('should select default', function() { + select.all(by.css('option')).get(3).click(); expect(switchElem.getText()).toMatch(/default/); }); From a83a209df6e2680dfc94c4335bed0d182d903b37 Mon Sep 17 00:00:00 2001 From: Georgios Kalpakas Date: Thu, 8 Sep 2016 23:36:51 +0300 Subject: [PATCH 0157/1173] docs(ngModelOptions): minor fixes/improvements --- src/ng/directive/ngModel.js | 43 +++++++++++++++++++++---------------- 1 file changed, 24 insertions(+), 19 deletions(-) diff --git a/src/ng/directive/ngModel.js b/src/ng/directive/ngModel.js index fd0ef15ce5ae..006cab47aa6a 100644 --- a/src/ng/directive/ngModel.js +++ b/src/ng/directive/ngModel.js @@ -1163,8 +1163,8 @@ var ngModelDirective = ['$rootScope', function($rootScope) { * * ```html *
        - *
        - * + * + * *
        *
        * ``` @@ -1204,14 +1204,17 @@ var ngModelDirective = ['$rootScope', function($rootScope) { * *
        *
        - * Name: - *
        - * - * Other data: - *
        + *
        + *
        *
        *
        user.name = 
        *
        @@ -1278,9 +1281,9 @@ var ngModelDirective = ['$rootScope', function($rootScope) { * * ## Model updates and validation * - * The default behaviour in `ngModel` is that the model value is set to `null` when the validation - * determines that the value is invalid. By setting the `allowInvalid` property to true, the model - * will still be updated even if the value is invalid. + * The default behaviour in `ngModel` is that the model value is set to `undefined` when the + * validation determines that the value is invalid. By setting the `allowInvalid` property to true, + * the model will still be updated even if the value is invalid. * * * ## Connecting to the scope @@ -1294,10 +1297,12 @@ var ngModelDirective = ['$rootScope', function($rootScope) { * *
        *
        - * Name: - * + * *
        *
        user.name = 
        *
        @@ -1324,7 +1329,7 @@ var ngModelDirective = ['$rootScope', function($rootScope) { * @param {Object} ngModelOptions options to apply to the current model. Valid keys are: * - `updateOn`: string specifying which event should the input be bound to. You can set several * events using an space delimited list. There is a special event called `default` that - * matches the default events belonging of the control. + * matches the default events belonging to the control. * - `debounce`: integer value which contains the debounce model update value in milliseconds. A * value of 0 triggers an immediate update. If an object is supplied instead, you can specify a * custom value for each event. For example: @@ -1334,7 +1339,7 @@ var ngModelDirective = ['$rootScope', function($rootScope) { * - `getterSetter`: boolean value which determines whether or not to treat functions bound to * `ngModel` as getters/setters. * - `timezone`: Defines the timezone to be used to read/write the `Date` instance in the model for - * ``, ``, ... . It understands UTC/GMT and the + * ``, ``, ... . It understands UTC/GMT and the * continental US time zone abbreviations, but for general use, use a time zone offset, for * example, `'+0430'` (4 hours, 30 minutes east of the Greenwich meridian) * If not specified, the timezone of the browser will be used. From 3f759b191dc0710b38042897749df17d50279de7 Mon Sep 17 00:00:00 2001 From: Tyler Romeo Date: Fri, 12 Aug 2016 17:12:02 -0400 Subject: [PATCH 0158/1173] fix($sniffer): don't use `history.pushState` in sandboxed Chrome Packaged Apps While sandboxed Chrome Packaged Apps (CPAs) have the same restrictions wrt accessing `history.pushState` as "normal" CPAs, they can't be detected in the same way, as they do not have access to the same APIs. Previously, due to their differences from normal CPAs, `$sniffer` would fail to detect sandboxed CPAs and incorrectly assume `history.pushState` is available (which resulted in an error being thrown). This commit fixes the detection of sandboxed CPAs in `$sniffer`. See #11932 and #13945 for previous work. Closes #15021 --- src/ng/sniffer.js | 12 +++++++++--- test/ng/snifferSpec.js | 22 ++++++++++++++++++++++ 2 files changed, 31 insertions(+), 3 deletions(-) diff --git a/src/ng/sniffer.js b/src/ng/sniffer.js index 8023bd8722ab..60ed39d81318 100644 --- a/src/ng/sniffer.js +++ b/src/ng/sniffer.js @@ -20,9 +20,15 @@ function $SnifferProvider() { this.$get = ['$window', '$document', function($window, $document) { var eventSupport = {}, - // Chrome Packaged Apps are not allowed to access `history.pushState`. They can be detected by - // the presence of `chrome.app.runtime` (see https://developer.chrome.com/apps/api_index) - isChromePackagedApp = $window.chrome && $window.chrome.app && $window.chrome.app.runtime, + // Chrome Packaged Apps are not allowed to access `history.pushState`. + // If not sandboxed, they can be detected by the presence of `chrome.app.runtime` + // (see https://developer.chrome.com/apps/api_index). If sandboxed, they can be detected by + // the presence of an extension runtime ID and the absence of other Chrome runtime APIs + // (see https://developer.chrome.com/apps/manifest/sandbox). + isChromePackagedApp = + $window.chrome && + ($window.chrome.app && $window.chrome.app.runtime || + !$window.chrome.app && $window.chrome.runtime && $window.chrome.runtime.id), hasHistoryPushState = !isChromePackagedApp && $window.history && $window.history.pushState, android = toInt((/android (\d+)/.exec(lowercase(($window.navigator || {}).userAgent)) || [])[1]), diff --git a/test/ng/snifferSpec.js b/test/ng/snifferSpec.js index dd52de11ff29..7216bc005b66 100644 --- a/test/ng/snifferSpec.js +++ b/test/ng/snifferSpec.js @@ -90,6 +90,28 @@ describe('$sniffer', function() { expect(pushStateAccessCount).toBe(0); }); + + it('should not try to access `history.pushState` in sandboxed Chrome Packaged Apps', + function() { + var pushStateAccessCount = 0; + + var mockHistory = Object.create(Object.prototype, { + pushState: {get: function() { pushStateAccessCount++; return noop; }} + }); + var mockWindow = { + chrome: { + runtime: { + id: 'x' + } + }, + history: mockHistory + }; + + sniffer(mockWindow); + + expect(pushStateAccessCount).toBe(0); + } + ); }); From 51a2eb7d6fe62ad2d7ba0866cfbde0e69cab82eb Mon Sep 17 00:00:00 2001 From: Mohsen Azimi Date: Thu, 8 Sep 2016 11:19:41 -0700 Subject: [PATCH 0159/1173] docs($q): fix typo in `race()` test description (array --> object) Closes #15111 --- test/ng/qSpec.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/ng/qSpec.js b/test/ng/qSpec.js index 0175451dc5c7..7e5a6cfdd500 100644 --- a/test/ng/qSpec.js +++ b/test/ng/qSpec.js @@ -2022,7 +2022,7 @@ describe('q', function() { }); describe('race (hash)', function() { - it('should do nothing if given an empty array', function() { + it('should do nothing if given an empty object', function() { q.race({}).then(success(), error()); expect(mockNextTick.queue.length).toBe(0); expect(logStr()).toBe(''); From 51c516e7d4f2d10b0aaa4487bd0b52772022207a Mon Sep 17 00:00:00 2001 From: Austin O'Neil Date: Fri, 9 Sep 2016 15:34:29 -0600 Subject: [PATCH 0160/1173] docs(ngOptions): correct links remove redundant link to ngOptions and add link to ngRepeat PR (#15117) --- src/ng/directive/ngOptions.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/ng/directive/ngOptions.js b/src/ng/directive/ngOptions.js index 8168b4110fdd..9b58f9b985fd 100644 --- a/src/ng/directive/ngOptions.js +++ b/src/ng/directive/ngOptions.js @@ -17,8 +17,8 @@ var ngOptionsMinErr = minErr('ngOptions'); * elements for the ``'s model is assigned via the `select` **`as`** part of the * comprehension expression * - reduced memory consumption by not creating a new scope for each repeated instance From 78e6a58368470cef3454b33acd8ee788f2eb88e2 Mon Sep 17 00:00:00 2001 From: Jason Bedard Date: Sun, 5 Jun 2016 18:30:13 -0700 Subject: [PATCH 0161/1173] refactor($q): remove unnecessary checks/helpers/wrappers - Remove internal `makePromise()` helper. - Remove unnecessary wrapper functions. - Remove unnecessary check for promises resolving multiple times. (By following the Promises/A+ spec, we know this will never happen.) - Switch from function expressions to (named) function declarations. Closes #15065 --- src/ng/q.js | 60 +++++++++++++++++------------------------------------ 1 file changed, 19 insertions(+), 41 deletions(-) diff --git a/src/ng/q.js b/src/ng/q.js index 8664c992a43c..7b9de29b0d52 100644 --- a/src/ng/q.js +++ b/src/ng/q.js @@ -298,14 +298,14 @@ function qFactory(nextTick, exceptionHandler, errorOnUnhandledRejections) { * * @returns {Deferred} Returns a new instance of deferred. */ - var defer = function() { + function defer() { var d = new Deferred(); //Necessary to support unbound execution :/ d.resolve = simpleBind(d, d.resolve); d.reject = simpleBind(d, d.reject); d.notify = simpleBind(d, d.notify); return d; - }; + } function Promise() { this.$$state = { status: 0 }; @@ -331,9 +331,9 @@ function qFactory(nextTick, exceptionHandler, errorOnUnhandledRejections) { 'finally': function(callback, progressBack) { return this.then(function(value) { - return handleCallback(value, true, callback); + return handleCallback(value, resolve, callback); }, function(error) { - return handleCallback(error, false, callback); + return handleCallback(error, reject, callback); }, progressBack); } }); @@ -372,7 +372,7 @@ function qFactory(nextTick, exceptionHandler, errorOnUnhandledRejections) { } finally { --queueSize; if (errorOnUnhandledRejections && queueSize === 0) { - nextTick(processChecksFn()); + nextTick(processChecks); } } } @@ -389,25 +389,17 @@ function qFactory(nextTick, exceptionHandler, errorOnUnhandledRejections) { } } - function processChecksFn() { - return function() { processChecks(); }; - } - - function processQueueFn(state) { - return function() { processQueue(state); }; - } - function scheduleProcessQueue(state) { if (errorOnUnhandledRejections && !state.pending && state.status === 2 && !state.pur) { if (queueSize === 0 && checkQueue.length === 0) { - nextTick(processChecksFn()); + nextTick(processChecks); } checkQueue.push(state); } if (state.processScheduled || !state.pending) return; state.processScheduled = true; ++queueSize; - nextTick(processQueueFn(state)); + nextTick(function() { processQueue(state); }); } function Deferred() { @@ -526,39 +518,27 @@ function qFactory(nextTick, exceptionHandler, errorOnUnhandledRejections) { * @param {*} reason Constant, message, exception or an object representing the rejection reason. * @returns {Promise} Returns a promise that was already resolved as rejected with the `reason`. */ - var reject = function(reason) { + function reject(reason) { var result = new Deferred(); result.reject(reason); return result.promise; - }; - - var makePromise = function makePromise(value, resolved) { - var result = new Deferred(); - if (resolved) { - result.resolve(value); - } else { - result.reject(value); - } - return result.promise; - }; + } - var handleCallback = function handleCallback(value, isResolved, callback) { + function handleCallback(value, resolver, callback) { var callbackOutput = null; try { if (isFunction(callback)) callbackOutput = callback(); } catch (e) { - return makePromise(e, false); + return reject(e); } if (isPromiseLike(callbackOutput)) { return callbackOutput.then(function() { - return makePromise(value, isResolved); - }, function(error) { - return makePromise(error, false); - }); + return resolver(value); + }, reject); } else { - return makePromise(value, isResolved); + return resolver(value); } - }; + } /** * @ngdoc method @@ -578,11 +558,11 @@ function qFactory(nextTick, exceptionHandler, errorOnUnhandledRejections) { */ - var when = function(value, callback, errback, progressBack) { + function when(value, callback, errback, progressBack) { var result = new Deferred(); result.resolve(value); return result.promise.then(callback, errback, progressBack); - }; + } /** * @ngdoc method @@ -624,11 +604,9 @@ function qFactory(nextTick, exceptionHandler, errorOnUnhandledRejections) { forEach(promises, function(promise, key) { counter++; when(promise).then(function(value) { - if (results.hasOwnProperty(key)) return; results[key] = value; if (!(--counter)) deferred.resolve(results); }, function(reason) { - if (results.hasOwnProperty(key)) return; deferred.reject(reason); }); }); @@ -664,7 +642,7 @@ function qFactory(nextTick, exceptionHandler, errorOnUnhandledRejections) { return deferred.promise; } - var $Q = function Q(resolver) { + function $Q(resolver) { if (!isFunction(resolver)) { throw $qMinErr('norslvr', 'Expected resolverFn, got \'{0}\'', resolver); } @@ -682,7 +660,7 @@ function qFactory(nextTick, exceptionHandler, errorOnUnhandledRejections) { resolver(resolveFn, rejectFn); return deferred.promise; - }; + } // Let's make the instanceof operator work for promises, so that // `new $q(fn) instanceof $q` would evaluate to true. From d14c7f3c31deb098bf8f1c50ea6d00af758dbdcb Mon Sep 17 00:00:00 2001 From: Georgii Dolzhykov Date: Sat, 10 Sep 2016 02:15:00 +0300 Subject: [PATCH 0162/1173] docs($compile): remove obsolete sentence Fixes #15109 Closes #15119 --- src/ng/compile.js | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/ng/compile.js b/src/ng/compile.js index 4dcba455e5e5..8741dc4d074a 100644 --- a/src/ng/compile.js +++ b/src/ng/compile.js @@ -267,14 +267,14 @@ * and other directives used in the directive's template will also be excluded from execution. * * #### `scope` - * The scope property can be `true`, an object or a falsy value: + * The scope property can be `false`, `true`, or an object: * - * * **falsy:** No scope will be created for the directive. The directive will use its parent's scope. + * * **`false` (default):** No scope will be created for the directive. The directive will use its + * parent's scope. * * * **`true`:** A new child scope that prototypically inherits from its parent will be created for * the directive's element. If multiple directives on the same element request a new scope, - * only one new scope is created. The new scope rule does not apply for the root of the template - * since the root of the template always gets a new scope. + * only one new scope is created. * * * **`{...}` (an object hash):** A new "isolate" scope is created for the directive's element. The * 'isolate' scope differs from normal scope in that it does not prototypically inherit from its parent From 912d5b9ad36efe3c4b8e0da4b20e2f3540472af8 Mon Sep 17 00:00:00 2001 From: Georgios Kalpakas Date: Mon, 12 Sep 2016 17:27:37 +0300 Subject: [PATCH 0163/1173] docs(ngView): remove obsolete known issue --- src/ngRoute/directive/ngView.js | 7 ------- 1 file changed, 7 deletions(-) diff --git a/src/ngRoute/directive/ngView.js b/src/ngRoute/directive/ngView.js index dba842f1eafa..ead89554f10f 100644 --- a/src/ngRoute/directive/ngView.js +++ b/src/ngRoute/directive/ngView.js @@ -26,13 +26,6 @@ ngRouteModule.directive('ngView', ngViewFillContentFactory); * * The enter and leave animation occur concurrently. * - * @knownIssue If `ngView` is contained in an asynchronously loaded template (e.g. in another - * directive's templateUrl or in a template loaded using `ngInclude`), then you need to - * make sure that `$route` is instantiated in time to capture the initial - * `$locationChangeStart` event and load the appropriate view. One way to achieve this - * is to have it as a dependency in a `.run` block: - * `myModule.run(['$route', function() {}]);` - * * @scope * @priority 400 * @param {string=} onload Expression to evaluate whenever the view updates. From 07849779ba365f371a8caa3b58e23f677cfdc5ad Mon Sep 17 00:00:00 2001 From: Martin Staffa Date: Mon, 12 Sep 2016 17:59:54 +0200 Subject: [PATCH 0164/1173] chore(benchmarks): fix order-by benchmark --- benchmarks/orderby-bp/app.js | 2 +- benchmarks/orderby-bp/jquery-noop.js | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) create mode 100644 benchmarks/orderby-bp/jquery-noop.js diff --git a/benchmarks/orderby-bp/app.js b/benchmarks/orderby-bp/app.js index 849042b87980..32bcfaeb0e12 100644 --- a/benchmarks/orderby-bp/app.js +++ b/benchmarks/orderby-bp/app.js @@ -7,7 +7,7 @@ app.controller('DataController', function DataController($rootScope, $scope) { this.rows = []; var self = this; - $scope.benchmarkType = 'basic'; + $scope.benchmarkType = 'baseline'; $scope.rawProperty = function(key) { return function(item) { diff --git a/benchmarks/orderby-bp/jquery-noop.js b/benchmarks/orderby-bp/jquery-noop.js new file mode 100644 index 000000000000..8cac7fe4a149 --- /dev/null +++ b/benchmarks/orderby-bp/jquery-noop.js @@ -0,0 +1 @@ +// Override me with ?jquery=/bower_components/jquery/dist/jquery.js From 21e4db9e0783d1f22b043cdb053e3b8c155a2786 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9rome=20Freyre?= Date: Wed, 14 Sep 2016 13:56:45 +0200 Subject: [PATCH 0165/1173] docs(input[range]): fix erroneous examples PR (#15135) --- src/ng/directive/input.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/ng/directive/input.js b/src/ng/directive/input.js index 9b109793b90c..7e26ca16f6d1 100644 --- a/src/ng/directive/input.js +++ b/src/ng/directive/input.js @@ -1116,7 +1116,7 @@ var inputType = {
        Model as number:
        Min:
        - Max:
        + Max:
        value = {{value}}
        myForm.range.$valid = {{myForm.range.$valid}}
        myForm.range.$error = {{myForm.range.$error}} @@ -1142,7 +1142,7 @@ var inputType = {
        Model as number:
        Min:
        - Max:
        + Max:
        value = {{value}}
        myForm.range.$valid = {{myForm.range.$valid}}
        myForm.range.$error = {{myForm.range.$error}} From 9e24e774a558143b3478536911a3a4c1714564ba Mon Sep 17 00:00:00 2001 From: Jason Bedard Date: Wed, 14 Sep 2016 13:21:09 -0700 Subject: [PATCH 0166/1173] perf(form, ngModel): change controllers to use prototype methods This makes the largetable-bp ng-model benchmarks 10-15% faster (down 90-100ms for me). The actual controller instantiation doesn't change too much but the overall numbers seem consistently faster, I assume all due to reducing memory usage / gc. Specifically on creation there is ~40% less memory GCed, on destruction there is about ~25% less. PR (#13286) BREAKING CHANGE: The use of prototype methods instead of new methods per instance removes the ability to pass NgModelController and FormController methods without context. For example `$scope.$watch('something', myNgModelCtrl.$render)` will no longer work because the `$render` method is passed without any context. This must now be replaced with ``` $scope.$watch('something', function() { myNgModelCtrl.$render(); }) ``` or possibly by using `Function.prototype.bind` or `angular.bind`. --- src/ng/directive/form.js | 322 +++++++++++++++-------- src/ng/directive/ngModel.js | 502 +++++++++++++++--------------------- 2 files changed, 425 insertions(+), 399 deletions(-) diff --git a/src/ng/directive/form.js b/src/ng/directive/form.js index dac2ebd05e5d..4790080854a8 100644 --- a/src/ng/directive/form.js +++ b/src/ng/directive/form.js @@ -1,6 +1,6 @@ 'use strict'; -/* global -nullFormCtrl, -SUBMITTED_CLASS, addSetValidityMethod: true +/* global -nullFormCtrl, -PENDING_CLASS, -SUBMITTED_CLASS */ var nullFormCtrl = { $addControl: noop, @@ -11,6 +11,7 @@ var nullFormCtrl = { $setPristine: noop, $setSubmitted: noop }, +PENDING_CLASS = 'ng-pending', SUBMITTED_CLASS = 'ng-submitted'; function nullFormRenameControl(control, name) { @@ -61,22 +62,28 @@ function nullFormRenameControl(control, name) { */ //asks for $scope to fool the BC controller module FormController.$inject = ['$element', '$attrs', '$scope', '$animate', '$interpolate']; -function FormController(element, attrs, $scope, $animate, $interpolate) { - var form = this, - controls = []; +function FormController($element, $attrs, $scope, $animate, $interpolate) { + this.$$controls = []; // init state - form.$error = {}; - form.$$success = {}; - form.$pending = undefined; - form.$name = $interpolate(attrs.name || attrs.ngForm || '')($scope); - form.$dirty = false; - form.$pristine = true; - form.$valid = true; - form.$invalid = false; - form.$submitted = false; - form.$$parentForm = nullFormCtrl; + this.$error = {}; + this.$$success = {}; + this.$pending = undefined; + this.$name = $interpolate($attrs.name || $attrs.ngForm || '')($scope); + this.$dirty = false; + this.$pristine = true; + this.$valid = true; + this.$invalid = false; + this.$submitted = false; + this.$$parentForm = nullFormCtrl; + + this.$$element = $element; + this.$$animate = $animate; + + setupValidity(this); +} +FormController.prototype = { /** * @ngdoc method * @name form.FormController#$rollbackViewValue @@ -88,11 +95,11 @@ function FormController(element, attrs, $scope, $animate, $interpolate) { * event defined in `ng-model-options`. This method is typically needed by the reset button of * a form that uses `ng-model-options` to pend updates. */ - form.$rollbackViewValue = function() { - forEach(controls, function(control) { + $rollbackViewValue: function() { + forEach(this.$$controls, function(control) { control.$rollbackViewValue(); }); - }; + }, /** * @ngdoc method @@ -105,11 +112,11 @@ function FormController(element, attrs, $scope, $animate, $interpolate) { * event defined in `ng-model-options`. This method is rarely needed as `NgModelController` * usually handles calling this in response to input events. */ - form.$commitViewValue = function() { - forEach(controls, function(control) { + $commitViewValue: function() { + forEach(this.$$controls, function(control) { control.$commitViewValue(); }); - }; + }, /** * @ngdoc method @@ -132,29 +139,29 @@ function FormController(element, attrs, $scope, $animate, $interpolate) { * For example, if an input control is added that is already `$dirty` and has `$error` properties, * calling `$setDirty()` and `$validate()` afterwards will propagate the state to the parent form. */ - form.$addControl = function(control) { + $addControl: function(control) { // Breaking change - before, inputs whose name was "hasOwnProperty" were quietly ignored // and not added to the scope. Now we throw an error. assertNotHasOwnProperty(control.$name, 'input'); - controls.push(control); + this.$$controls.push(control); if (control.$name) { - form[control.$name] = control; + this[control.$name] = control; } - control.$$parentForm = form; - }; + control.$$parentForm = this; + }, // Private API: rename a form control - form.$$renameControl = function(control, newName) { + $$renameControl: function(control, newName) { var oldName = control.$name; - if (form[oldName] === control) { - delete form[oldName]; + if (this[oldName] === control) { + delete this[oldName]; } - form[newName] = control; + this[newName] = control; control.$name = newName; - }; + }, /** * @ngdoc method @@ -172,60 +179,26 @@ function FormController(element, attrs, $scope, $animate, $interpolate) { * different from case to case. For example, removing the only `$dirty` control from a form may or * may not mean that the form is still `$dirty`. */ - form.$removeControl = function(control) { - if (control.$name && form[control.$name] === control) { - delete form[control.$name]; + $removeControl: function(control) { + if (control.$name && this[control.$name] === control) { + delete this[control.$name]; } - forEach(form.$pending, function(value, name) { - form.$setValidity(name, null, control); - }); - forEach(form.$error, function(value, name) { - form.$setValidity(name, null, control); - }); - forEach(form.$$success, function(value, name) { - form.$setValidity(name, null, control); - }); - - arrayRemove(controls, control); + forEach(this.$pending, function(value, name) { + // eslint-disable-next-line no-invalid-this + this.$setValidity(name, null, control); + }, this); + forEach(this.$error, function(value, name) { + // eslint-disable-next-line no-invalid-this + this.$setValidity(name, null, control); + }, this); + forEach(this.$$success, function(value, name) { + // eslint-disable-next-line no-invalid-this + this.$setValidity(name, null, control); + }, this); + + arrayRemove(this.$$controls, control); control.$$parentForm = nullFormCtrl; - }; - - - /** - * @ngdoc method - * @name form.FormController#$setValidity - * - * @description - * Sets the validity of a form control. - * - * This method will also propagate to parent forms. - */ - addSetValidityMethod({ - ctrl: this, - $element: element, - set: function(object, property, controller) { - var list = object[property]; - if (!list) { - object[property] = [controller]; - } else { - var index = list.indexOf(controller); - if (index === -1) { - list.push(controller); - } - } - }, - unset: function(object, property, controller) { - var list = object[property]; - if (!list) { - return; - } - arrayRemove(list, controller); - if (list.length === 0) { - delete object[property]; - } - }, - $animate: $animate - }); + }, /** * @ngdoc method @@ -237,13 +210,13 @@ function FormController(element, attrs, $scope, $animate, $interpolate) { * This method can be called to add the 'ng-dirty' class and set the form to a dirty * state (ng-dirty class). This method will also propagate to parent forms. */ - form.$setDirty = function() { - $animate.removeClass(element, PRISTINE_CLASS); - $animate.addClass(element, DIRTY_CLASS); - form.$dirty = true; - form.$pristine = false; - form.$$parentForm.$setDirty(); - }; + $setDirty: function() { + this.$$animate.removeClass(this.$$element, PRISTINE_CLASS); + this.$$animate.addClass(this.$$element, DIRTY_CLASS); + this.$dirty = true; + this.$pristine = false; + this.$$parentForm.$setDirty(); + }, /** * @ngdoc method @@ -261,15 +234,15 @@ function FormController(element, attrs, $scope, $animate, $interpolate) { * Setting a form back to a pristine state is often useful when we want to 'reuse' a form after * saving or resetting it. */ - form.$setPristine = function() { - $animate.setClass(element, PRISTINE_CLASS, DIRTY_CLASS + ' ' + SUBMITTED_CLASS); - form.$dirty = false; - form.$pristine = true; - form.$submitted = false; - forEach(controls, function(control) { + $setPristine: function() { + this.$$animate.setClass(this.$$element, PRISTINE_CLASS, DIRTY_CLASS + ' ' + SUBMITTED_CLASS); + this.$dirty = false; + this.$pristine = true; + this.$submitted = false; + forEach(this.$$controls, function(control) { control.$setPristine(); }); - }; + }, /** * @ngdoc method @@ -284,11 +257,11 @@ function FormController(element, attrs, $scope, $animate, $interpolate) { * Setting a form controls back to their untouched state is often useful when setting the form * back to its pristine state. */ - form.$setUntouched = function() { - forEach(controls, function(control) { + $setUntouched: function() { + forEach(this.$$controls, function(control) { control.$setUntouched(); }); - }; + }, /** * @ngdoc method @@ -297,12 +270,46 @@ function FormController(element, attrs, $scope, $animate, $interpolate) { * @description * Sets the form to its submitted state. */ - form.$setSubmitted = function() { - $animate.addClass(element, SUBMITTED_CLASS); - form.$submitted = true; - form.$$parentForm.$setSubmitted(); - }; -} + $setSubmitted: function() { + this.$$animate.addClass(this.$$element, SUBMITTED_CLASS); + this.$submitted = true; + this.$$parentForm.$setSubmitted(); + } +}; + +/** + * @ngdoc method + * @name form.FormController#$setValidity + * + * @description + * Sets the validity of a form control. + * + * This method will also propagate to parent forms. + */ +addSetValidityMethod({ + clazz: FormController, + set: function(object, property, controller) { + var list = object[property]; + if (!list) { + object[property] = [controller]; + } else { + var index = list.indexOf(controller); + if (index === -1) { + list.push(controller); + } + } + }, + unset: function(object, property, controller) { + var list = object[property]; + if (!list) { + return; + } + arrayRemove(list, controller); + if (list.length === 0) { + delete object[property]; + } + } +}); /** * @ngdoc directive @@ -549,3 +556,108 @@ var formDirectiveFactory = function(isNgForm) { var formDirective = formDirectiveFactory(); var ngFormDirective = formDirectiveFactory(true); + + + +// helper methods +function setupValidity(instance) { + instance.$$classCache = {}; + instance.$$classCache[INVALID_CLASS] = !(instance.$$classCache[VALID_CLASS] = instance.$$element.hasClass(VALID_CLASS)); +} +function addSetValidityMethod(context) { + var clazz = context.clazz, + set = context.set, + unset = context.unset; + + clazz.prototype.$setValidity = function(validationErrorKey, state, controller) { + if (isUndefined(state)) { + createAndSet(this, '$pending', validationErrorKey, controller); + } else { + unsetAndCleanup(this, '$pending', validationErrorKey, controller); + } + if (!isBoolean(state)) { + unset(this.$error, validationErrorKey, controller); + unset(this.$$success, validationErrorKey, controller); + } else { + if (state) { + unset(this.$error, validationErrorKey, controller); + set(this.$$success, validationErrorKey, controller); + } else { + set(this.$error, validationErrorKey, controller); + unset(this.$$success, validationErrorKey, controller); + } + } + if (this.$pending) { + cachedToggleClass(this, PENDING_CLASS, true); + this.$valid = this.$invalid = undefined; + toggleValidationCss(this, '', null); + } else { + cachedToggleClass(this, PENDING_CLASS, false); + this.$valid = isObjectEmpty(this.$error); + this.$invalid = !this.$valid; + toggleValidationCss(this, '', this.$valid); + } + + // re-read the state as the set/unset methods could have + // combined state in this.$error[validationError] (used for forms), + // where setting/unsetting only increments/decrements the value, + // and does not replace it. + var combinedState; + if (this.$pending && this.$pending[validationErrorKey]) { + combinedState = undefined; + } else if (this.$error[validationErrorKey]) { + combinedState = false; + } else if (this.$$success[validationErrorKey]) { + combinedState = true; + } else { + combinedState = null; + } + + toggleValidationCss(this, validationErrorKey, combinedState); + this.$$parentForm.$setValidity(validationErrorKey, combinedState, this); + }; + + function createAndSet(ctrl, name, value, controller) { + if (!ctrl[name]) { + ctrl[name] = {}; + } + set(ctrl[name], value, controller); + } + + function unsetAndCleanup(ctrl, name, value, controller) { + if (ctrl[name]) { + unset(ctrl[name], value, controller); + } + if (isObjectEmpty(ctrl[name])) { + ctrl[name] = undefined; + } + } + + function cachedToggleClass(ctrl, className, switchValue) { + if (switchValue && !ctrl.$$classCache[className]) { + ctrl.$$animate.addClass(ctrl.$$element, className); + ctrl.$$classCache[className] = true; + } else if (!switchValue && ctrl.$$classCache[className]) { + ctrl.$$animate.removeClass(ctrl.$$element, className); + ctrl.$$classCache[className] = false; + } + } + + function toggleValidationCss(ctrl, validationErrorKey, isValid) { + validationErrorKey = validationErrorKey ? '-' + snake_case(validationErrorKey, '-') : ''; + + cachedToggleClass(ctrl, VALID_CLASS + validationErrorKey, isValid === true); + cachedToggleClass(ctrl, INVALID_CLASS + validationErrorKey, isValid === false); + } +} + +function isObjectEmpty(obj) { + if (obj) { + for (var prop in obj) { + if (obj.hasOwnProperty(prop)) { + return false; + } + } + } + return true; +} diff --git a/src/ng/directive/ngModel.js b/src/ng/directive/ngModel.js index 006cab47aa6a..55310adceddd 100644 --- a/src/ng/directive/ngModel.js +++ b/src/ng/directive/ngModel.js @@ -6,7 +6,10 @@ DIRTY_CLASS: true, UNTOUCHED_CLASS: true, TOUCHED_CLASS: true, - $ModelOptionsProvider: true + PENDING_CLASS: true, + $ModelOptionsProvider: true, + addSetValidityMethod: true, + setupValidity: true */ var VALID_CLASS = 'ng-valid', @@ -15,7 +18,6 @@ var VALID_CLASS = 'ng-valid', DIRTY_CLASS = 'ng-dirty', UNTOUCHED_CLASS = 'ng-untouched', TOUCHED_CLASS = 'ng-touched', - PENDING_CLASS = 'ng-pending', EMPTY_CLASS = 'ng-empty', NOT_EMPTY_CLASS = 'ng-not-empty'; @@ -221,8 +223,8 @@ is set to `true`. The parse error is stored in `ngModel.$error.parse`. * * */ -var NgModelController = ['$scope', '$exceptionHandler', '$attrs', '$element', '$parse', '$animate', '$timeout', '$rootScope', '$q', '$interpolate', '$modelOptions', - /** @this */ function($scope, $exceptionHandler, $attr, $element, $parse, $animate, $timeout, $rootScope, $q, $interpolate, $modelOptions) { +NgModelController.$inject = ['$scope', '$exceptionHandler', '$attrs', '$element', '$parse', '$animate', '$timeout', '$q', '$interpolate', '$modelOptions']; +function NgModelController($scope, $exceptionHandler, $attr, $element, $parse, $animate, $timeout, $q, $interpolate, $modelOptions) { this.$viewValue = Number.NaN; this.$modelValue = Number.NaN; this.$$rawModelValue = undefined; // stores the parsed modelValue / model set from scope regardless of validity. @@ -244,40 +246,53 @@ var NgModelController = ['$scope', '$exceptionHandler', '$attrs', '$element', '$ this.$$parentForm = nullFormCtrl; this.$options = $modelOptions; - var parsedNgModel = $parse($attr.ngModel), - parsedNgModelAssign = parsedNgModel.assign, - ngModelGet = parsedNgModel, - ngModelSet = parsedNgModelAssign, - pendingDebounce = null, - parserValid, - ctrl = this; - - - this.$$initGetterSetters = function() { + this.$$parsedNgModel = $parse($attr.ngModel); + this.$$parsedNgModelAssign = this.$$parsedNgModel.assign; + this.$$ngModelGet = this.$$parsedNgModel; + this.$$ngModelSet = this.$$parsedNgModelAssign; + this.$$pendingDebounce = null; + this.$$parserValid = undefined; + + this.$$currentValidationRunId = 0; + + this.$$scope = $scope; + this.$$attr = $attr; + this.$$element = $element; + this.$$animate = $animate; + this.$$timeout = $timeout; + this.$$parse = $parse; + this.$$q = $q; + this.$$exceptionHandler = $exceptionHandler; + + setupValidity(this); + setupModelWatcher(this); +} - if (ctrl.$options.getOption('getterSetter')) { - var invokeModelGetter = $parse($attr.ngModel + '()'), - invokeModelSetter = $parse($attr.ngModel + '($$$p)'); +NgModelController.prototype = { + $$initGetterSetters: function() { + if (this.$options.getOption('getterSetter')) { + var invokeModelGetter = this.$$parse(this.$$attr.ngModel + '()'), + invokeModelSetter = this.$$parse(this.$$attr.ngModel + '($$$p)'); - ngModelGet = function($scope) { - var modelValue = parsedNgModel($scope); + this.$$ngModelGet = function($scope) { + var modelValue = this.$$parsedNgModel($scope); if (isFunction(modelValue)) { modelValue = invokeModelGetter($scope); } return modelValue; }; - ngModelSet = function($scope, newValue) { - if (isFunction(parsedNgModel($scope))) { + this.$$ngModelSet = function($scope, newValue) { + if (isFunction(this.$$parsedNgModel($scope))) { invokeModelSetter($scope, {$$$p: newValue}); } else { - parsedNgModelAssign($scope, newValue); + this.$$parsedNgModelAssign($scope, newValue); } }; - } else if (!parsedNgModel.assign) { + } else if (!this.$$parsedNgModel.assign) { throw ngModelMinErr('nonassign', 'Expression \'{0}\' is non-assignable. Element: {1}', - $attr.ngModel, startingTag($element)); + this.$$attr.ngModel, startingTag(this.$$element)); } - }; + }, /** @@ -300,7 +315,7 @@ var NgModelController = ['$scope', '$exceptionHandler', '$attrs', '$element', '$ * or `$viewValue` are objects (rather than a string or number) then `$render()` will not be * invoked if you only change a property on the objects. */ - this.$render = noop; + $render: noop, /** * @ngdoc method @@ -320,57 +335,20 @@ var NgModelController = ['$scope', '$exceptionHandler', '$attrs', '$element', '$ * @param {*} value The value of the input to check for emptiness. * @returns {boolean} True if `value` is "empty". */ - this.$isEmpty = function(value) { + $isEmpty: function(value) { // eslint-disable-next-line no-self-compare return isUndefined(value) || value === '' || value === null || value !== value; - }; + }, - this.$$updateEmptyClasses = function(value) { - if (ctrl.$isEmpty(value)) { - $animate.removeClass($element, NOT_EMPTY_CLASS); - $animate.addClass($element, EMPTY_CLASS); + $$updateEmptyClasses: function(value) { + if (this.$isEmpty(value)) { + this.$$animate.removeClass(this.$$element, NOT_EMPTY_CLASS); + this.$$animate.addClass(this.$$element, EMPTY_CLASS); } else { - $animate.removeClass($element, EMPTY_CLASS); - $animate.addClass($element, NOT_EMPTY_CLASS); + this.$$animate.removeClass(this.$$element, EMPTY_CLASS); + this.$$animate.addClass(this.$$element, NOT_EMPTY_CLASS); } - }; - - - var currentValidationRunId = 0; - - /** - * @ngdoc method - * @name ngModel.NgModelController#$setValidity - * - * @description - * Change the validity state, and notify the form. - * - * This method can be called within $parsers/$formatters or a custom validation implementation. - * However, in most cases it should be sufficient to use the `ngModel.$validators` and - * `ngModel.$asyncValidators` collections which will call `$setValidity` automatically. - * - * @param {string} validationErrorKey Name of the validator. The `validationErrorKey` will be assigned - * to either `$error[validationErrorKey]` or `$pending[validationErrorKey]` - * (for unfulfilled `$asyncValidators`), so that it is available for data-binding. - * The `validationErrorKey` should be in camelCase and will get converted into dash-case - * for class name. Example: `myError` will result in `ng-valid-my-error` and `ng-invalid-my-error` - * class and can be bound to as `{{someForm.someControl.$error.myError}}` . - * @param {boolean} isValid Whether the current state is valid (true), invalid (false), pending (undefined), - * or skipped (null). Pending is used for unfulfilled `$asyncValidators`. - * Skipped is used by Angular when validators do not run because of parse errors and - * when `$asyncValidators` do not run because any of the `$validators` failed. - */ - addSetValidityMethod({ - ctrl: this, - $element: $element, - set: function(object, property) { - object[property] = true; - }, - unset: function(object, property) { - delete object[property]; - }, - $animate: $animate - }); + }, /** * @ngdoc method @@ -383,12 +361,12 @@ var NgModelController = ['$scope', '$exceptionHandler', '$attrs', '$element', '$ * state (`ng-pristine` class). A model is considered to be pristine when the control * has not been changed from when first compiled. */ - this.$setPristine = function() { - ctrl.$dirty = false; - ctrl.$pristine = true; - $animate.removeClass($element, DIRTY_CLASS); - $animate.addClass($element, PRISTINE_CLASS); - }; + $setPristine: function() { + this.$dirty = false; + this.$pristine = true; + this.$$animate.removeClass(this.$$element, DIRTY_CLASS); + this.$$animate.addClass(this.$$element, PRISTINE_CLASS); + }, /** * @ngdoc method @@ -401,13 +379,13 @@ var NgModelController = ['$scope', '$exceptionHandler', '$attrs', '$element', '$ * state (`ng-dirty` class). A model is considered to be dirty when the control has been changed * from when first compiled. */ - this.$setDirty = function() { - ctrl.$dirty = true; - ctrl.$pristine = false; - $animate.removeClass($element, PRISTINE_CLASS); - $animate.addClass($element, DIRTY_CLASS); - ctrl.$$parentForm.$setDirty(); - }; + $setDirty: function() { + this.$dirty = true; + this.$pristine = false; + this.$$animate.removeClass(this.$$element, PRISTINE_CLASS); + this.$$animate.addClass(this.$$element, DIRTY_CLASS); + this.$$parentForm.$setDirty(); + }, /** * @ngdoc method @@ -421,11 +399,11 @@ var NgModelController = ['$scope', '$exceptionHandler', '$attrs', '$element', '$ * by default, however this function can be used to restore that state if the model has * already been touched by the user. */ - this.$setUntouched = function() { - ctrl.$touched = false; - ctrl.$untouched = true; - $animate.setClass($element, UNTOUCHED_CLASS, TOUCHED_CLASS); - }; + $setUntouched: function() { + this.$touched = false; + this.$untouched = true; + this.$$animate.setClass(this.$$element, UNTOUCHED_CLASS, TOUCHED_CLASS); + }, /** * @ngdoc method @@ -438,11 +416,11 @@ var NgModelController = ['$scope', '$exceptionHandler', '$attrs', '$element', '$ * touched state (`ng-touched` class). A model is considered to be touched when the user has * first focused the control element and then shifted focus away from the control (blur event). */ - this.$setTouched = function() { - ctrl.$touched = true; - ctrl.$untouched = false; - $animate.setClass($element, TOUCHED_CLASS, UNTOUCHED_CLASS); - }; + $setTouched: function() { + this.$touched = true; + this.$untouched = false; + this.$$animate.setClass(this.$$element, TOUCHED_CLASS, UNTOUCHED_CLASS); + }, /** * @ngdoc method @@ -532,11 +510,11 @@ var NgModelController = ['$scope', '$exceptionHandler', '$attrs', '$element', '$
        * */ - this.$rollbackViewValue = function() { - $timeout.cancel(pendingDebounce); - ctrl.$viewValue = ctrl.$$lastCommittedViewValue; - ctrl.$render(); - }; + $rollbackViewValue: function() { + this.$$timeout.cancel(this.$$pendingDebounce); + this.$viewValue = this.$$lastCommittedViewValue; + this.$render(); + }, /** * @ngdoc method @@ -550,45 +528,46 @@ var NgModelController = ['$scope', '$exceptionHandler', '$attrs', '$element', '$ * If the validity changes to valid, it will set the model to the last available valid * `$modelValue`, i.e. either the last parsed value or the last value set from the scope. */ - this.$validate = function() { + $validate: function() { // ignore $validate before model is initialized - if (isNumberNaN(ctrl.$modelValue)) { + if (isNumberNaN(this.$modelValue)) { return; } - var viewValue = ctrl.$$lastCommittedViewValue; + var viewValue = this.$$lastCommittedViewValue; // Note: we use the $$rawModelValue as $modelValue might have been // set to undefined during a view -> model update that found validation // errors. We can't parse the view here, since that could change // the model although neither viewValue nor the model on the scope changed - var modelValue = ctrl.$$rawModelValue; + var modelValue = this.$$rawModelValue; - var prevValid = ctrl.$valid; - var prevModelValue = ctrl.$modelValue; + var prevValid = this.$valid; + var prevModelValue = this.$modelValue; - var allowInvalid = ctrl.$options.getOption('allowInvalid'); + var allowInvalid = this.$options.getOption('allowInvalid'); - ctrl.$$runValidators(modelValue, viewValue, function(allValid) { + var that = this; + this.$$runValidators(modelValue, viewValue, function(allValid) { // If there was no change in validity, don't update the model // This prevents changing an invalid modelValue to undefined if (!allowInvalid && prevValid !== allValid) { - // Note: Don't check ctrl.$valid here, as we could have + // Note: Don't check this.$valid here, as we could have // external validators (e.g. calculated on the server), // that just call $setValidity and need the model value // to calculate their validity. - ctrl.$modelValue = allValid ? modelValue : undefined; + that.$modelValue = allValid ? modelValue : undefined; - if (ctrl.$modelValue !== prevModelValue) { - ctrl.$$writeModelToScope(); + if (that.$modelValue !== prevModelValue) { + that.$$writeModelToScope(); } } }); + }, - }; - - this.$$runValidators = function(modelValue, viewValue, doneCallback) { - currentValidationRunId++; - var localValidationRunId = currentValidationRunId; + $$runValidators: function(modelValue, viewValue, doneCallback) { + this.$$currentValidationRunId++; + var localValidationRunId = this.$$currentValidationRunId; + var that = this; // check parser error if (!processParseErrors()) { @@ -602,34 +581,34 @@ var NgModelController = ['$scope', '$exceptionHandler', '$attrs', '$element', '$ processAsyncValidators(); function processParseErrors() { - var errorKey = ctrl.$$parserName || 'parse'; - if (isUndefined(parserValid)) { + var errorKey = that.$$parserName || 'parse'; + if (isUndefined(that.$$parserValid)) { setValidity(errorKey, null); } else { - if (!parserValid) { - forEach(ctrl.$validators, function(v, name) { + if (!that.$$parserValid) { + forEach(that.$validators, function(v, name) { setValidity(name, null); }); - forEach(ctrl.$asyncValidators, function(v, name) { + forEach(that.$asyncValidators, function(v, name) { setValidity(name, null); }); } // Set the parse error last, to prevent unsetting it, should a $validators key == parserName - setValidity(errorKey, parserValid); - return parserValid; + setValidity(errorKey, that.$$parserValid); + return that.$$parserValid; } return true; } function processSyncValidators() { var syncValidatorsValid = true; - forEach(ctrl.$validators, function(validator, name) { + forEach(that.$validators, function(validator, name) { var result = validator(modelValue, viewValue); syncValidatorsValid = syncValidatorsValid && result; setValidity(name, result); }); if (!syncValidatorsValid) { - forEach(ctrl.$asyncValidators, function(v, name) { + forEach(that.$asyncValidators, function(v, name) { setValidity(name, null); }); return false; @@ -640,7 +619,7 @@ var NgModelController = ['$scope', '$exceptionHandler', '$attrs', '$element', '$ function processAsyncValidators() { var validatorPromises = []; var allValid = true; - forEach(ctrl.$asyncValidators, function(validator, name) { + forEach(that.$asyncValidators, function(validator, name) { var promise = validator(modelValue, viewValue); if (!isPromiseLike(promise)) { throw ngModelMinErr('nopromise', @@ -657,25 +636,25 @@ var NgModelController = ['$scope', '$exceptionHandler', '$attrs', '$element', '$ if (!validatorPromises.length) { validationDone(true); } else { - $q.all(validatorPromises).then(function() { + that.$$q.all(validatorPromises).then(function() { validationDone(allValid); }, noop); } } function setValidity(name, isValid) { - if (localValidationRunId === currentValidationRunId) { - ctrl.$setValidity(name, isValid); + if (localValidationRunId === that.$$currentValidationRunId) { + that.$setValidity(name, isValid); } } function validationDone(allValid) { - if (localValidationRunId === currentValidationRunId) { + if (localValidationRunId === that.$$currentValidationRunId) { doneCallback(allValid); } } - }; + }, /** * @ngdoc method @@ -688,84 +667,87 @@ var NgModelController = ['$scope', '$exceptionHandler', '$attrs', '$element', '$ * event defined in `ng-model-options`. this method is rarely needed as `NgModelController` * usually handles calling this in response to input events. */ - this.$commitViewValue = function() { - var viewValue = ctrl.$viewValue; + $commitViewValue: function() { + var viewValue = this.$viewValue; - $timeout.cancel(pendingDebounce); + this.$$timeout.cancel(this.$$pendingDebounce); // If the view value has not changed then we should just exit, except in the case where there is // a native validator on the element. In this case the validation state may have changed even though // the viewValue has stayed empty. - if (ctrl.$$lastCommittedViewValue === viewValue && (viewValue !== '' || !ctrl.$$hasNativeValidators)) { + if (this.$$lastCommittedViewValue === viewValue && (viewValue !== '' || !this.$$hasNativeValidators)) { return; } - ctrl.$$updateEmptyClasses(viewValue); - ctrl.$$lastCommittedViewValue = viewValue; + this.$$updateEmptyClasses(viewValue); + this.$$lastCommittedViewValue = viewValue; // change to dirty - if (ctrl.$pristine) { + if (this.$pristine) { this.$setDirty(); } this.$$parseAndValidate(); - }; + }, - this.$$parseAndValidate = function() { - var viewValue = ctrl.$$lastCommittedViewValue; + $$parseAndValidate: function() { + var viewValue = this.$$lastCommittedViewValue; var modelValue = viewValue; - parserValid = isUndefined(modelValue) ? undefined : true; + var that = this; + + this.$$parserValid = isUndefined(modelValue) ? undefined : true; - if (parserValid) { - for (var i = 0; i < ctrl.$parsers.length; i++) { - modelValue = ctrl.$parsers[i](modelValue); + if (this.$$parserValid) { + for (var i = 0; i < this.$parsers.length; i++) { + modelValue = this.$parsers[i](modelValue); if (isUndefined(modelValue)) { - parserValid = false; + this.$$parserValid = false; break; } } } - if (isNumberNaN(ctrl.$modelValue)) { - // ctrl.$modelValue has not been touched yet... - ctrl.$modelValue = ngModelGet($scope); + if (isNumberNaN(this.$modelValue)) { + // this.$modelValue has not been touched yet... + this.$modelValue = this.$$ngModelGet(this.$$scope); } - var prevModelValue = ctrl.$modelValue; - var allowInvalid = ctrl.$options.getOption('allowInvalid'); - ctrl.$$rawModelValue = modelValue; + var prevModelValue = this.$modelValue; + var allowInvalid = this.$options.getOption('allowInvalid'); + this.$$rawModelValue = modelValue; if (allowInvalid) { - ctrl.$modelValue = modelValue; + this.$modelValue = modelValue; writeToModelIfNeeded(); } // Pass the $$lastCommittedViewValue here, because the cached viewValue might be out of date. // This can happen if e.g. $setViewValue is called from inside a parser - ctrl.$$runValidators(modelValue, ctrl.$$lastCommittedViewValue, function(allValid) { + this.$$runValidators(modelValue, this.$$lastCommittedViewValue, function(allValid) { if (!allowInvalid) { - // Note: Don't check ctrl.$valid here, as we could have + // Note: Don't check this.$valid here, as we could have // external validators (e.g. calculated on the server), // that just call $setValidity and need the model value // to calculate their validity. - ctrl.$modelValue = allValid ? modelValue : undefined; + that.$modelValue = allValid ? modelValue : undefined; writeToModelIfNeeded(); } }); function writeToModelIfNeeded() { - if (ctrl.$modelValue !== prevModelValue) { - ctrl.$$writeModelToScope(); + if (that.$modelValue !== prevModelValue) { + that.$$writeModelToScope(); } } - }; + }, - this.$$writeModelToScope = function() { - ngModelSet($scope, ctrl.$modelValue); - forEach(ctrl.$viewChangeListeners, function(listener) { + $$writeModelToScope: function() { + this.$$ngModelSet(this.$$scope, this.$modelValue); + forEach(this.$viewChangeListeners, function(listener) { try { listener(); } catch (e) { - $exceptionHandler(e); + // eslint-disable-next-line no-invalid-this + this.$$exceptionHandler(e); } - }); - }; + }, this); + }, /** * @ngdoc method @@ -817,16 +799,15 @@ var NgModelController = ['$scope', '$exceptionHandler', '$attrs', '$element', '$ * @param {*} value value from the view. * @param {string} trigger Event that triggered the update. */ - this.$setViewValue = function(value, trigger) { - ctrl.$viewValue = value; - if (ctrl.$options.getOption('updateOnDefault')) { - ctrl.$$debounceViewValueCommit(trigger); + $setViewValue: function(value, trigger) { + this.$viewValue = value; + if (this.$options.getOption('updateOnDefault')) { + this.$$debounceViewValueCommit(trigger); } - }; + }, - this.$$debounceViewValueCommit = function(trigger) { - var options = ctrl.$options, - debounceDelay = options.getOption('debounce'); + $$debounceViewValueCommit: function(trigger) { + var debounceDelay = this.$options.getOption('debounce'); if (isNumber(debounceDelay[trigger])) { debounceDelay = debounceDelay[trigger]; @@ -834,20 +815,23 @@ var NgModelController = ['$scope', '$exceptionHandler', '$attrs', '$element', '$ debounceDelay = debounceDelay['default']; } - $timeout.cancel(pendingDebounce); + this.$$timeout.cancel(this.$$pendingDebounce); + var that = this; if (debounceDelay) { - pendingDebounce = $timeout(function() { - ctrl.$commitViewValue(); + this.$$pendingDebounce = this.$$timeout(function() { + that.$commitViewValue(); }, debounceDelay); - } else if ($rootScope.$$phase) { - ctrl.$commitViewValue(); + } else if (this.$$scope.$root.$$phase) { + this.$commitViewValue(); } else { - $scope.$apply(function() { - ctrl.$commitViewValue(); + this.$$scope.$apply(function() { + that.$commitViewValue(); }); } - }; + } +}; +function setupModelWatcher(ctrl) { // model -> value // Note: we cannot use a normal scope.$watch as we want to detect the following: // 1. scope value is 'a' @@ -856,8 +840,8 @@ var NgModelController = ['$scope', '$exceptionHandler', '$attrs', '$element', '$ // -> scope value did not change since the last digest as // ng-change executes in apply phase // 4. view should be changed back to 'a' - $scope.$watch(function ngModelWatch() { - var modelValue = ngModelGet($scope); + ctrl.$$scope.$watch(function ngModelWatch() { + var modelValue = ctrl.$$ngModelGet(ctrl.$$scope); // if scope model value and ngModel value are out of sync // TODO(perf): why not move this to the action fn? @@ -867,7 +851,7 @@ var NgModelController = ['$scope', '$exceptionHandler', '$attrs', '$element', '$ (ctrl.$modelValue === ctrl.$modelValue || modelValue === modelValue) ) { ctrl.$modelValue = ctrl.$$rawModelValue = modelValue; - parserValid = undefined; + ctrl.$$parserValid = undefined; var formatters = ctrl.$formatters, idx = formatters.length; @@ -888,7 +872,39 @@ var NgModelController = ['$scope', '$exceptionHandler', '$attrs', '$element', '$ return modelValue; }); -}]; +} + +/** + * @ngdoc method + * @name ngModel.NgModelController#$setValidity + * + * @description + * Change the validity state, and notify the form. + * + * This method can be called within $parsers/$formatters or a custom validation implementation. + * However, in most cases it should be sufficient to use the `ngModel.$validators` and + * `ngModel.$asyncValidators` collections which will call `$setValidity` automatically. + * + * @param {string} validationErrorKey Name of the validator. The `validationErrorKey` will be assigned + * to either `$error[validationErrorKey]` or `$pending[validationErrorKey]` + * (for unfulfilled `$asyncValidators`), so that it is available for data-binding. + * The `validationErrorKey` should be in camelCase and will get converted into dash-case + * for class name. Example: `myError` will result in `ng-valid-my-error` and `ng-invalid-my-error` + * class and can be bound to as `{{someForm.someControl.$error.myError}}` . + * @param {boolean} isValid Whether the current state is valid (true), invalid (false), pending (undefined), + * or skipped (null). Pending is used for unfulfilled `$asyncValidators`. + * Skipped is used by Angular when validators do not run because of parse errors and + * when `$asyncValidators` do not run because any of the `$validators` failed. + */ +addSetValidityMethod({ + clazz: NgModelController, + set: function(object, property) { + object[property] = true; + }, + unset: function(object, property) { + delete object[property]; + } +}); /** @@ -1124,13 +1140,17 @@ var ngModelDirective = ['$rootScope', function($rootScope) { }); } + function setTouched() { + modelCtrl.$setTouched(); + } + element.on('blur', function() { if (modelCtrl.$touched) return; if ($rootScope.$$phase) { - scope.$evalAsync(modelCtrl.$setTouched); + scope.$evalAsync(setTouched); } else { - scope.$apply(modelCtrl.$setTouched); + scope.$apply(setTouched); } }); } @@ -1465,109 +1485,3 @@ function ModelOptions(options, parentOptions) { return new ModelOptions(options, _options); }; } - -// helper methods -function addSetValidityMethod(context) { - var ctrl = context.ctrl, - $element = context.$element, - classCache = {}, - set = context.set, - unset = context.unset, - $animate = context.$animate; - - classCache[INVALID_CLASS] = !(classCache[VALID_CLASS] = $element.hasClass(VALID_CLASS)); - - ctrl.$setValidity = setValidity; - - function setValidity(validationErrorKey, state, controller) { - if (isUndefined(state)) { - createAndSet('$pending', validationErrorKey, controller); - } else { - unsetAndCleanup('$pending', validationErrorKey, controller); - } - if (!isBoolean(state)) { - unset(ctrl.$error, validationErrorKey, controller); - unset(ctrl.$$success, validationErrorKey, controller); - } else { - if (state) { - unset(ctrl.$error, validationErrorKey, controller); - set(ctrl.$$success, validationErrorKey, controller); - } else { - set(ctrl.$error, validationErrorKey, controller); - unset(ctrl.$$success, validationErrorKey, controller); - } - } - if (ctrl.$pending) { - cachedToggleClass(PENDING_CLASS, true); - ctrl.$valid = ctrl.$invalid = undefined; - toggleValidationCss('', null); - } else { - cachedToggleClass(PENDING_CLASS, false); - ctrl.$valid = isObjectEmpty(ctrl.$error); - ctrl.$invalid = !ctrl.$valid; - toggleValidationCss('', ctrl.$valid); - } - - // re-read the state as the set/unset methods could have - // combined state in ctrl.$error[validationError] (used for forms), - // where setting/unsetting only increments/decrements the value, - // and does not replace it. - var combinedState; - if (ctrl.$pending && ctrl.$pending[validationErrorKey]) { - combinedState = undefined; - } else if (ctrl.$error[validationErrorKey]) { - combinedState = false; - } else if (ctrl.$$success[validationErrorKey]) { - combinedState = true; - } else { - combinedState = null; - } - - toggleValidationCss(validationErrorKey, combinedState); - ctrl.$$parentForm.$setValidity(validationErrorKey, combinedState, ctrl); - } - - function createAndSet(name, value, controller) { - if (!ctrl[name]) { - ctrl[name] = {}; - } - set(ctrl[name], value, controller); - } - - function unsetAndCleanup(name, value, controller) { - if (ctrl[name]) { - unset(ctrl[name], value, controller); - } - if (isObjectEmpty(ctrl[name])) { - ctrl[name] = undefined; - } - } - - function cachedToggleClass(className, switchValue) { - if (switchValue && !classCache[className]) { - $animate.addClass($element, className); - classCache[className] = true; - } else if (!switchValue && classCache[className]) { - $animate.removeClass($element, className); - classCache[className] = false; - } - } - - function toggleValidationCss(validationErrorKey, isValid) { - validationErrorKey = validationErrorKey ? '-' + snake_case(validationErrorKey, '-') : ''; - - cachedToggleClass(VALID_CLASS + validationErrorKey, isValid === true); - cachedToggleClass(INVALID_CLASS + validationErrorKey, isValid === false); - } -} - -function isObjectEmpty(obj) { - if (obj) { - for (var prop in obj) { - if (obj.hasOwnProperty(prop)) { - return false; - } - } - } - return true; -} From 76d3dafdeaf2f343d094b5a34ffb74adf64bb284 Mon Sep 17 00:00:00 2001 From: Prashant Singh Pawar Date: Thu, 15 Sep 2016 06:10:27 -0400 Subject: [PATCH 0167/1173] fix($compile): don't throw tplrt error when there is a whitespace around a top-level comment Added new conditional for NODE_TYPE_TEXT inside removeComments method of $compile Added corresponding unit tests. Closes #15108 PR (#15132) --- src/ng/compile.js | 5 +++-- test/ng/compileSpec.js | 48 ++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 51 insertions(+), 2 deletions(-) diff --git a/src/ng/compile.js b/src/ng/compile.js index 8741dc4d074a..631ddc67cedd 100644 --- a/src/ng/compile.js +++ b/src/ng/compile.js @@ -3679,8 +3679,9 @@ function removeComments(jqNodes) { while (i--) { var node = jqNodes[i]; - if (node.nodeType === NODE_TYPE_COMMENT) { - splice.call(jqNodes, i, 1); + if (node.nodeType === NODE_TYPE_COMMENT || + (node.nodeType === NODE_TYPE_TEXT && node.nodeValue.trim() === '')) { + splice.call(jqNodes, i, 1); } } return jqNodes; diff --git a/test/ng/compileSpec.js b/test/ng/compileSpec.js index e4a8ddf4e960..70112d14a82f 100755 --- a/test/ng/compileSpec.js +++ b/test/ng/compileSpec.js @@ -1364,6 +1364,22 @@ describe('$compile', function() { }); }); + it('should ignore whitespace betwee comment and root node when replacing with a template', function() { + module(function() { + directive('replaceWithWhitespace', valueFn({ + replace: true, + template: '

        Hello, world!

        ' + })); + }); + inject(function($compile, $rootScope) { + expect(function() { + element = $compile('
        ')($rootScope); + }).not.toThrow(); + expect(element.find('p').length).toBe(1); + expect(element.find('p').text()).toBe('Hello, world!'); + }); + }); + it('should keep prototype properties on directive', function() { module(function() { function DirectiveClass() { @@ -2092,6 +2108,18 @@ describe('$compile', function() { $compile('

        '); $rootScope.$apply(); expect($exceptionHandler.errors).toEqual([]); + + // comments are ok + $templateCache.put('template.html', '
        \n'); + $compile('

        '); + $rootScope.$apply(); + expect($exceptionHandler.errors).toEqual([]); + + // white space around comments is ok + $templateCache.put('template.html', '
        \n'); + $compile('

        '); + $rootScope.$apply(); + expect($exceptionHandler.errors).toEqual([]); }); }); @@ -2303,6 +2331,26 @@ describe('$compile', function() { }); }); + it('should ignore whitespace between comment and root node when replacing with a templateUrl', function() { + module(function() { + directive('replaceWithWhitespace', valueFn({ + replace: true, + templateUrl: 'templateWithWhitespace.html' + })); + }); + inject(function($compile, $rootScope, $httpBackend) { + $httpBackend.whenGET('templateWithWhitespace.html'). + respond('

        Hello, world!

        '); + expect(function() { + element = $compile('
        ')($rootScope); + }).not.toThrow(); + $httpBackend.flush(); + expect(element.find('p').length).toBe(1); + expect(element.find('p').text()).toBe('Hello, world!'); + }); + }); + + it('should keep prototype properties on sync version of async directive', function() { module(function() { function DirectiveClass() { From 1547c751aa48efe7dbefef701c3df5983b04aa2e Mon Sep 17 00:00:00 2001 From: Peter Bacon Darwin Date: Tue, 6 Sep 2016 14:33:23 +0100 Subject: [PATCH 0168/1173] refactor($parse): remove Angular expression sandbox The angular expression parser (`$parse`) attempts to sandbox expressions to prevent unrestricted access to the global context. While the sandbox was not on the frontline of the security defense, developers kept relying upon it as a security feature even though it was always possible to access arbitrary JavaScript code if a malicious user could control the content of Angular templates in applications. This commit removes this sandbox, which has the following benefits: * it sends a clear message to developers that they should not rely on the sandbox to prevent XSS attacks; that they must prevent control of expression and templates instead. * it allows performance and size improvements in the core Angular 1 library. * it simplifies maintenance and provides opportunities to make the parser more capable. Please see the [Sandbox Removal Blog Post](http://angularjs.blogspot.com/2016/09/angular-16-expression-sandbox-removal.html) for more detail on what you should do to ensure that your application is secure. Closes #15094 --- docs/content/error/$parse/isecaf.ngdoc | 12 - docs/content/error/$parse/isecdom.ngdoc | 47 -- docs/content/error/$parse/isecff.ngdoc | 17 - docs/content/error/$parse/isecfld.ngdoc | 27 - docs/content/error/$parse/isecfn.ngdoc | 10 - docs/content/error/$parse/isecobj.ngdoc | 11 - docs/content/error/$parse/isecwindow.ngdoc | 45 -- docs/content/guide/expression.ngdoc | 6 +- docs/content/guide/security.ngdoc | 73 +- src/ng/parse.js | 264 +------ test/ng/directive/ngEventDirsSpec.js | 12 +- test/ng/parseSpec.js | 764 --------------------- 12 files changed, 66 insertions(+), 1222 deletions(-) delete mode 100644 docs/content/error/$parse/isecaf.ngdoc delete mode 100644 docs/content/error/$parse/isecdom.ngdoc delete mode 100644 docs/content/error/$parse/isecff.ngdoc delete mode 100644 docs/content/error/$parse/isecfld.ngdoc delete mode 100644 docs/content/error/$parse/isecfn.ngdoc delete mode 100644 docs/content/error/$parse/isecobj.ngdoc delete mode 100644 docs/content/error/$parse/isecwindow.ngdoc diff --git a/docs/content/error/$parse/isecaf.ngdoc b/docs/content/error/$parse/isecaf.ngdoc deleted file mode 100644 index 115e1b26d754..000000000000 --- a/docs/content/error/$parse/isecaf.ngdoc +++ /dev/null @@ -1,12 +0,0 @@ -@ngdoc error -@name $parse:isecaf -@fullName Assigning to Fields of Disallowed Context -@description - -Occurs when an expression attempts to assign a value on a field of any of the `Boolean`, `Number`, -`String`, `Array`, `Object`, or `Function` constructors or the corresponding prototypes. - -Angular bans the modification of these constructors or their prototypes from within expressions, -since it is a known way to modify the behaviour of existing functions/operations. - -To resolve this error, avoid assigning to fields of constructors or their prototypes in expressions. diff --git a/docs/content/error/$parse/isecdom.ngdoc b/docs/content/error/$parse/isecdom.ngdoc deleted file mode 100644 index 9f60e189ee92..000000000000 --- a/docs/content/error/$parse/isecdom.ngdoc +++ /dev/null @@ -1,47 +0,0 @@ -@ngdoc error -@name $parse:isecdom -@fullName Referencing a DOM node in Expression -@description - -Occurs when an expression attempts to access a DOM node. - -AngularJS restricts access to DOM nodes from within expressions since it's a known way to -execute arbitrary Javascript code. - -This check is only performed on object index and function calls in Angular expressions. These are -places that are harder for the developer to guard. Dotted member access (such as a.b.c) does not -perform this check - it's up to the developer to not expose such sensitive and powerful objects -directly on the scope chain. - -To resolve this error, avoid access to DOM nodes. - - -# Event Handlers and Return Values - -The `$parse:isecdom` error also occurs when an event handler invokes a function that returns a DOM -node. - -```html - -``` - -```js - $scope.iWillReturnDOM = function() { - return someDomNode; - } -``` - -To fix this issue, avoid returning DOM nodes from event handlers. - -*Note: This error often means that you are accessing DOM from your controllers, which is usually -a sign of poor coding style that violates separation of concerns.* - - -# Implicit Returns in CoffeeScript - -This error can occur more frequently when using CoffeeScript, which has a feature called implicit -returns. This language feature returns the last dereferenced object in the function when the -function has no explicit return statement. - -The solution in this scenario is to add an explicit return statement. For example `return false` to -the function. diff --git a/docs/content/error/$parse/isecff.ngdoc b/docs/content/error/$parse/isecff.ngdoc deleted file mode 100644 index a1e72775d254..000000000000 --- a/docs/content/error/$parse/isecff.ngdoc +++ /dev/null @@ -1,17 +0,0 @@ -@ngdoc error -@name $parse:isecff -@fullName Referencing 'call', 'apply' and 'bind' Disallowed -@description - -Occurs when an expression attempts to invoke Function's 'call', 'apply' or 'bind'. - -Angular bans the invocation of 'call', 'apply' and 'bind' from within expressions -since access is a known way to modify the behaviour of existing functions. - -To resolve this error, avoid using these methods in expressions. - -Example expression that would result in this error: - -``` -
        {{user.sendInfo.call({}, true)}}
        -``` diff --git a/docs/content/error/$parse/isecfld.ngdoc b/docs/content/error/$parse/isecfld.ngdoc deleted file mode 100644 index a19c5fa51e97..000000000000 --- a/docs/content/error/$parse/isecfld.ngdoc +++ /dev/null @@ -1,27 +0,0 @@ -@ngdoc error -@name $parse:isecfld -@fullName Referencing Disallowed Field in Expression -@description - -Occurs when an expression attempts to access one of the following fields: - -* __proto__ -* __defineGetter__ -* __defineSetter__ -* __lookupGetter__ -* __lookupSetter__ - -AngularJS bans access to these fields from within expressions since -access is a known way to mess with native objects or -to execute arbitrary Javascript code. - -To resolve this error, avoid using these fields in expressions. As a last resort, -alias their value and access them through the alias instead. - -Example expressions that would result in this error: - -``` -
        {{user.__proto__.hasOwnProperty = $emit}}
        - -
        {{user.__defineGetter__('name', noop)}}
        -``` diff --git a/docs/content/error/$parse/isecfn.ngdoc b/docs/content/error/$parse/isecfn.ngdoc deleted file mode 100644 index 417551cb3606..000000000000 --- a/docs/content/error/$parse/isecfn.ngdoc +++ /dev/null @@ -1,10 +0,0 @@ -@ngdoc error -@name $parse:isecfn -@fullName Referencing Function Disallowed -@description - -Occurs when an expression attempts to access the 'Function' object (constructor for all functions in JavaScript). - -Angular bans access to Function from within expressions since constructor access is a known way to execute arbitrary Javascript code. - -To resolve this error, avoid Function access. diff --git a/docs/content/error/$parse/isecobj.ngdoc b/docs/content/error/$parse/isecobj.ngdoc deleted file mode 100644 index 8da6e27a3505..000000000000 --- a/docs/content/error/$parse/isecobj.ngdoc +++ /dev/null @@ -1,11 +0,0 @@ -@ngdoc error -@name $parse:isecobj -@fullName Referencing Object Disallowed -@description - -Occurs when an expression attempts to access the 'Object' object (Root object in JavaScript). - -Angular bans access to Object from within expressions since access is a known way to modify -the behaviour of existing objects. - -To resolve this error, avoid Object access. diff --git a/docs/content/error/$parse/isecwindow.ngdoc b/docs/content/error/$parse/isecwindow.ngdoc deleted file mode 100644 index e7f4ceeaddd5..000000000000 --- a/docs/content/error/$parse/isecwindow.ngdoc +++ /dev/null @@ -1,45 +0,0 @@ -@ngdoc error -@name $parse:isecwindow -@fullName Referencing Window object in Expression -@description - -Occurs when an expression attempts to access a Window object. - -AngularJS restricts access to the Window object from within expressions since it's a known way to -execute arbitrary Javascript code. - -This check is only performed on object index and function calls in Angular expressions. These are -places that are harder for the developer to guard. Dotted member access (such as a.b.c) does not -perform this check - it's up to the developer to not expose such sensitive and powerful objects -directly on the scope chain. - -To resolve this error, avoid Window access. - -### Common CoffeeScript Issue - -Be aware that if you are using CoffeeScript, it automatically returns the value of the last statement in a -function. So for instance - -```coffeescript - scope.foo = -> - window.open 'https://example.com/' -``` - -compiles to something like - -```js - scope.foo = function() { - return window.open('https://example.com/'); - }; -``` - -You can see that this function will return the result of calling `window.open`, which is a `Window` -object. - -You can avoid this by explicitly returning something else from the function: - -```coffeescript - scope.foo = -> - window.open 'https://example.com/' - return true; -``` diff --git a/docs/content/guide/expression.ngdoc b/docs/content/guide/expression.ngdoc index 824facd9dfb3..24326b6abae1 100644 --- a/docs/content/guide/expression.ngdoc +++ b/docs/content/guide/expression.ngdoc @@ -113,11 +113,11 @@ You can try evaluating different expressions here: Angular does not use JavaScript's `eval()` to evaluate expressions. Instead Angular's {@link ng.$parse $parse} service processes these expressions. -Angular expressions do not have access to global variables like `window`, `document` or `location`. +Angular expressions do not have direct access to global variables like `window`, `document` or `location`. This restriction is intentional. It prevents accidental access to the global state – a common source of subtle bugs. -Instead use services like `$window` and `$location` in functions called from expressions. Such services -provide mockable access to globals. +Instead use services like `$window` and `$location` in functions on controllers, which are then called from expressions. +Such services provide mockable access to globals. It is possible to access the context object using the identifier `this` and the locals object using the identifier `$locals`. diff --git a/docs/content/guide/security.ngdoc b/docs/content/guide/security.ngdoc index 175c49edf9c0..9fcf0e7c6078 100644 --- a/docs/content/guide/security.ngdoc +++ b/docs/content/guide/security.ngdoc @@ -30,42 +30,55 @@ so keeping to AngularJS standards is not just a functionality issue, it's also c facilitate rapid security updates. -## Expression Sandboxing - -AngularJS's expressions are sandboxed not for security reasons, but instead to maintain a proper -separation of application responsibilities. For example, access to `window` is disallowed -because it makes it easy to introduce brittle global state into your application. - -However, this sandbox is not intended to stop attackers who can edit the template before it's -processed by Angular. It may be possible to run arbitrary JavaScript inside double-curly bindings -if an attacker can modify them. - -But if an attacker can change arbitrary HTML templates, there's nothing stopping them from doing: - -```html - -``` - -**It's better to design your application in such a way that users cannot change client-side templates.** - -For instance: +## Angular Templates and Expressions + +**If an attacker has access to control Angular templates or expressions, they can exploit an Angular application +via an XSS attack, regardless of the version.** + +There are a number of ways that templates and expressions can be controlled: + +* **Generating Angular templates on the server containing user-provided content**. This is the most common pitfall + where you are generating HTML via some server-side engine such as PHP, Java or ASP.NET. +* **Passing an expression generated from user-provided content in calls to the following methods on a {@link scope scope}**: + * `$watch(userContent, ...)` + * `$watchGroup(userContent, ...)` + * `$watchCollection(userContent, ...)` + * `$eval(userContent)` + * `$evalAsync(userContent)` + * `$apply(userContent)` + * `$applyAsync(userContent)` +* **Passing an expression generated from user-provided content in calls to services that parse expressions**: + * `$compile(userContent)` + * `$parse(userContent)` + * `$interpolate(userContent)` +* **Passing an expression generated from user provided content as a predicate to `orderBy` pipe**: + `{{ value | orderBy : userContent }}` + +### Sandbox removal +Each version of Angular 1 up to, but not including 1.6, contained an expression sandbox, which reduced the surface area of +the vulnerability but never removed it. **In Angular 1.6 we removed this sandbox as developers kept relying upon it as a security +feature even though it was always possible to access arbitrary JavaScript code if one could control the Angular templates +or expressions of applications.** + +Control of the Angular templates makes applications vulnerable even if there was a completely secure sandbox: +* https://ryhanson.com/stealing-session-tokens-on-plunker-with-an-angular-expression-injection/ in this blog post the author shows + a (now closed) vulnerability in the Plunker application due to server-side rendering inside an Angular template. +* https://ryhanson.com/angular-expression-injection-walkthrough/ in this blog post the author describes an attack, which does not + rely upon an expression sandbox bypass, that can be made because the sample application is rendering a template on the server that + contains user entered content. + +**It's best to design your application in such a way that users cannot change client-side templates.** * Do not mix client and server templates * Do not use user input to generate templates dynamically -* Do not run user input through `$scope.$eval` +* Do not run user input through `$scope.$eval` (or any of the other expression parsing functions listed above) * Consider using {@link ng.directive:ngCsp CSP} (but don't rely only on CSP) +**You can use suitably sanitized server-side templating to dynamically generate CSS, URLs, etc, but not for generating templates that are +bootstrapped/compiled by Angular.** -### Mixing client-side and server-side templates - -In general, we recommend against this because it can create unintended XSS vectors. - -However, it's ok to mix server-side templating in the bootstrap template (`index.html`) as long -as user input cannot be used on the server to output html that would then be processed by Angular -in a way that would allow for arbitrary code execution. - -**For instance, you can use server-side templating to dynamically generate CSS, URLs, etc, but not -for generating templates that are bootstrapped/compiled by Angular.** +**If you must continue to allow user-provided content in an Angular template then the safest option is to ensure that it is only +present in the part of the template that is made inert via the {@link ngNonBindable} directive.** ## HTTP Requests diff --git a/src/ng/parse.js b/src/ng/parse.js index a008dd1e4fea..ed0c4ca43afc 100644 --- a/src/ng/parse.js +++ b/src/ng/parse.js @@ -13,60 +13,23 @@ var $parseMinErr = minErr('$parse'); -var ARRAY_CTOR = [].constructor; -var BOOLEAN_CTOR = (false).constructor; -var FUNCTION_CTOR = Function.constructor; -var NUMBER_CTOR = (0).constructor; -var OBJECT_CTOR = {}.constructor; -var STRING_CTOR = ''.constructor; -var ARRAY_CTOR_PROTO = ARRAY_CTOR.prototype; -var BOOLEAN_CTOR_PROTO = BOOLEAN_CTOR.prototype; -var FUNCTION_CTOR_PROTO = FUNCTION_CTOR.prototype; -var NUMBER_CTOR_PROTO = NUMBER_CTOR.prototype; -var OBJECT_CTOR_PROTO = OBJECT_CTOR.prototype; -var STRING_CTOR_PROTO = STRING_CTOR.prototype; - -var CALL = FUNCTION_CTOR_PROTO.call; -var APPLY = FUNCTION_CTOR_PROTO.apply; -var BIND = FUNCTION_CTOR_PROTO.bind; - -var objectValueOf = OBJECT_CTOR_PROTO.valueOf; +var objectValueOf = {}.constructor.prototype.valueOf; // Sandboxing Angular Expressions // ------------------------------ -// Angular expressions are generally considered safe because these expressions only have direct -// access to `$scope` and locals. However, one can obtain the ability to execute arbitrary JS code by -// obtaining a reference to native JS functions such as the Function constructor. +// Angular expressions are no longer sandboxed. So it is now even easier to access arbitary JS code by +// various means such as obtaining a reference to native JS functions like the Function constructor. // // As an example, consider the following Angular expression: // // {}.toString.constructor('alert("evil JS code")') // -// This sandboxing technique is not perfect and doesn't aim to be. The goal is to prevent exploits -// against the expression language, but not to prevent exploits that were enabled by exposing -// sensitive JavaScript or browser APIs on Scope. Exposing such objects on a Scope is never a good -// practice and therefore we are not even trying to protect against interaction with an object -// explicitly exposed in this way. -// -// In general, it is not possible to access a Window object from an angular expression unless a -// window or some DOM object that has a reference to window is published onto a Scope. -// Similarly we prevent invocations of function known to be dangerous, as well as assignments to -// native objects. +// It is important to realise that if you create an expression from a string that contains user provided +// content then it is possible that your application contains a security vulnerability to an XSS style attack. // // See https://docs.angularjs.org/guide/security -function ensureSafeMemberName(name, fullExpression) { - if (name === '__defineGetter__' || name === '__defineSetter__' - || name === '__lookupGetter__' || name === '__lookupSetter__' - || name === '__proto__') { - throw $parseMinErr('isecfld', - 'Attempting to access a disallowed field in Angular expressions! ' - + 'Expression: {0}', fullExpression); - } - return name; -} - function getStringValue(name) { // Property names must be strings. This means that non-string objects cannot be used // as keys in an object. Any non-string object, including a number, is typecasted @@ -85,67 +48,6 @@ function getStringValue(name) { return name + ''; } -function ensureSafeObject(obj, fullExpression) { - // nifty check if obj is Function that is fast and works across iframes and other contexts - if (obj) { - if (obj.constructor === obj) { - throw $parseMinErr('isecfn', - 'Referencing Function in Angular expressions is disallowed! Expression: {0}', - fullExpression); - } else if (// isWindow(obj) - obj.window === obj) { - throw $parseMinErr('isecwindow', - 'Referencing the Window in Angular expressions is disallowed! Expression: {0}', - fullExpression); - } else if (// isElement(obj) - obj.children && (obj.nodeName || (obj.prop && obj.attr && obj.find))) { - throw $parseMinErr('isecdom', - 'Referencing DOM nodes in Angular expressions is disallowed! Expression: {0}', - fullExpression); - } else if (// block Object so that we can't get hold of dangerous Object.* methods - obj === Object) { - throw $parseMinErr('isecobj', - 'Referencing Object in Angular expressions is disallowed! Expression: {0}', - fullExpression); - } - } - return obj; -} - -function ensureSafeFunction(obj, fullExpression) { - if (obj) { - if (obj.constructor === obj) { - throw $parseMinErr('isecfn', - 'Referencing Function in Angular expressions is disallowed! Expression: {0}', - fullExpression); - } else if (obj === CALL || obj === APPLY || obj === BIND) { - throw $parseMinErr('isecff', - 'Referencing call, apply or bind in Angular expressions is disallowed! Expression: {0}', - fullExpression); - } - } -} - -function ensureSafeAssignContext(obj, fullExpression) { - if (obj) { - if (obj === ARRAY_CTOR || - obj === BOOLEAN_CTOR || - obj === FUNCTION_CTOR || - obj === NUMBER_CTOR || - obj === OBJECT_CTOR || - obj === STRING_CTOR || - obj === ARRAY_CTOR_PROTO || - obj === BOOLEAN_CTOR_PROTO || - obj === FUNCTION_CTOR_PROTO || - obj === NUMBER_CTOR_PROTO || - obj === OBJECT_CTOR_PROTO || - obj === STRING_CTOR_PROTO) { - throw $parseMinErr('isecaf', - 'Assigning to a constructor or its prototype is disallowed! Expression: {0}', - fullExpression); - } - } -} var OPERATORS = createMap(); forEach('+ - * / % === !== == != < > <= >= && || ! = |'.split(' '), function(operator) { OPERATORS[operator] = true; }); @@ -862,13 +764,12 @@ function ASTCompiler(astBuilder, $filter) { } ASTCompiler.prototype = { - compile: function(expression, expensiveChecks) { + compile: function(expression) { var self = this; var ast = this.astBuilder.ast(expression); this.state = { nextId: 0, filters: {}, - expensiveChecks: expensiveChecks, fn: {vars: [], body: [], own: {}}, assign: {vars: [], body: [], own: {}}, inputs: [] @@ -911,21 +812,13 @@ ASTCompiler.prototype = { // eslint-disable-next-line no-new-func var fn = (new Function('$filter', - 'ensureSafeMemberName', - 'ensureSafeObject', - 'ensureSafeFunction', 'getStringValue', - 'ensureSafeAssignContext', 'ifDefined', 'plus', 'text', fnString))( this.$filter, - ensureSafeMemberName, - ensureSafeObject, - ensureSafeFunction, getStringValue, - ensureSafeAssignContext, ifDefined, plusFn, expression); @@ -1042,7 +935,6 @@ ASTCompiler.prototype = { nameId.computed = false; nameId.name = ast.name; } - ensureSafeMemberName(ast.name); self.if_(self.stage === 'inputs' || self.not(self.getHasOwnProperty('l', ast.name)), function() { self.if_(self.stage === 'inputs' || 's', function() { @@ -1055,9 +947,6 @@ ASTCompiler.prototype = { }); }, intoId && self.lazyAssign(intoId, self.nonComputedMember('l', ast.name)) ); - if (self.state.expensiveChecks || isPossiblyDangerousMemberName(ast.name)) { - self.addEnsureSafeObject(intoId); - } recursionFn(intoId); break; case AST.MemberExpression: @@ -1065,32 +954,24 @@ ASTCompiler.prototype = { intoId = intoId || this.nextId(); self.recurse(ast.object, left, undefined, function() { self.if_(self.notNull(left), function() { - if (create && create !== 1) { - self.addEnsureSafeAssignContext(left); - } if (ast.computed) { right = self.nextId(); self.recurse(ast.property, right); self.getStringValue(right); - self.addEnsureSafeMemberName(right); if (create && create !== 1) { self.if_(self.not(self.computedMember(left, right)), self.lazyAssign(self.computedMember(left, right), '{}')); } - expression = self.ensureSafeObject(self.computedMember(left, right)); + expression = self.computedMember(left, right); self.assign(intoId, expression); if (nameId) { nameId.computed = true; nameId.name = right; } } else { - ensureSafeMemberName(ast.property.name); if (create && create !== 1) { self.if_(self.not(self.nonComputedMember(left, ast.property.name)), self.lazyAssign(self.nonComputedMember(left, ast.property.name), '{}')); } expression = self.nonComputedMember(left, ast.property.name); - if (self.state.expensiveChecks || isPossiblyDangerousMemberName(ast.property.name)) { - expression = self.ensureSafeObject(expression); - } self.assign(intoId, expression); if (nameId) { nameId.computed = false; @@ -1122,21 +1003,16 @@ ASTCompiler.prototype = { args = []; self.recurse(ast.callee, right, left, function() { self.if_(self.notNull(right), function() { - self.addEnsureSafeFunction(right); forEach(ast.arguments, function(expr) { self.recurse(expr, ast.constant ? undefined : self.nextId(), undefined, function(argument) { - args.push(self.ensureSafeObject(argument)); + args.push(argument); }); }); if (left.name) { - if (!self.state.expensiveChecks) { - self.addEnsureSafeObject(left.context); - } expression = self.member(left.context, left.name, left.computed) + '(' + args.join(',') + ')'; } else { expression = right + '(' + args.join(',') + ')'; } - expression = self.ensureSafeObject(expression); self.assign(intoId, expression); }, function() { self.assign(intoId, 'undefined'); @@ -1154,8 +1030,6 @@ ASTCompiler.prototype = { this.recurse(ast.left, undefined, left, function() { self.if_(self.notNull(left.context), function() { self.recurse(ast.right, right); - self.addEnsureSafeObject(self.member(left.context, left.name, left.computed)); - self.addEnsureSafeAssignContext(left.context); expression = self.member(left.context, left.name, left.computed) + ast.operator + right; self.assign(intoId, expression); recursionFn(intoId || expression); @@ -1303,42 +1177,10 @@ ASTCompiler.prototype = { return this.nonComputedMember(left, right); }, - addEnsureSafeObject: function(item) { - this.current().body.push(this.ensureSafeObject(item), ';'); - }, - - addEnsureSafeMemberName: function(item) { - this.current().body.push(this.ensureSafeMemberName(item), ';'); - }, - - addEnsureSafeFunction: function(item) { - this.current().body.push(this.ensureSafeFunction(item), ';'); - }, - - addEnsureSafeAssignContext: function(item) { - this.current().body.push(this.ensureSafeAssignContext(item), ';'); - }, - - ensureSafeObject: function(item) { - return 'ensureSafeObject(' + item + ',text)'; - }, - - ensureSafeMemberName: function(item) { - return 'ensureSafeMemberName(' + item + ',text)'; - }, - - ensureSafeFunction: function(item) { - return 'ensureSafeFunction(' + item + ',text)'; - }, - getStringValue: function(item) { this.assign(item, 'getStringValue(' + item + ')'); }, - ensureSafeAssignContext: function(item) { - return 'ensureSafeAssignContext(' + item + ',text)'; - }, - lazyRecurse: function(ast, intoId, nameId, recursionFn, create, skipWatchIdCheck) { var self = this; return function() { @@ -1390,11 +1232,10 @@ function ASTInterpreter(astBuilder, $filter) { } ASTInterpreter.prototype = { - compile: function(expression, expensiveChecks) { + compile: function(expression) { var self = this; var ast = this.astBuilder.ast(expression); this.expression = expression; - this.expensiveChecks = expensiveChecks; findConstantAndWatchExpressions(ast, self.$filter); var assignable; var assign; @@ -1465,20 +1306,17 @@ ASTInterpreter.prototype = { context ); case AST.Identifier: - ensureSafeMemberName(ast.name, self.expression); return self.identifier(ast.name, - self.expensiveChecks || isPossiblyDangerousMemberName(ast.name), context, create, self.expression); case AST.MemberExpression: left = this.recurse(ast.object, false, !!create); if (!ast.computed) { - ensureSafeMemberName(ast.property.name, self.expression); right = ast.property.name; } if (ast.computed) right = this.recurse(ast.property); return ast.computed ? this.computedMember(left, right, context, create, self.expression) : - this.nonComputedMember(left, right, self.expensiveChecks, context, create, self.expression); + this.nonComputedMember(left, right, context, create, self.expression); case AST.CallExpression: args = []; forEach(ast.arguments, function(expr) { @@ -1499,13 +1337,11 @@ ASTInterpreter.prototype = { var rhs = right(scope, locals, assign, inputs); var value; if (rhs.value != null) { - ensureSafeObject(rhs.context, self.expression); - ensureSafeFunction(rhs.value, self.expression); var values = []; for (var i = 0; i < args.length; ++i) { - values.push(ensureSafeObject(args[i](scope, locals, assign, inputs), self.expression)); + values.push(args[i](scope, locals, assign, inputs)); } - value = ensureSafeObject(rhs.value.apply(rhs.context, values), self.expression); + value = rhs.value.apply(rhs.context, values); } return context ? {value: value} : value; }; @@ -1515,8 +1351,6 @@ ASTInterpreter.prototype = { return function(scope, locals, assign, inputs) { var lhs = left(scope, locals, assign, inputs); var rhs = right(scope, locals, assign, inputs); - ensureSafeObject(lhs.value, self.expression); - ensureSafeAssignContext(lhs.context); lhs.context[lhs.name] = rhs; return context ? {value: rhs} : rhs; }; @@ -1708,16 +1542,13 @@ ASTInterpreter.prototype = { value: function(value, context) { return function() { return context ? {context: undefined, name: undefined, value: value} : value; }; }, - identifier: function(name, expensiveChecks, context, create, expression) { + identifier: function(name, context, create, expression) { return function(scope, locals, assign, inputs) { var base = locals && (name in locals) ? locals : scope; if (create && create !== 1 && base && !(base[name])) { base[name] = {}; } var value = base ? base[name] : undefined; - if (expensiveChecks) { - ensureSafeObject(value, expression); - } if (context) { return {context: base, name: name, value: value}; } else { @@ -1733,15 +1564,12 @@ ASTInterpreter.prototype = { if (lhs != null) { rhs = right(scope, locals, assign, inputs); rhs = getStringValue(rhs); - ensureSafeMemberName(rhs, expression); if (create && create !== 1) { - ensureSafeAssignContext(lhs); if (lhs && !(lhs[rhs])) { lhs[rhs] = {}; } } value = lhs[rhs]; - ensureSafeObject(value, expression); } if (context) { return {context: lhs, name: rhs, value: value}; @@ -1750,19 +1578,15 @@ ASTInterpreter.prototype = { } }; }, - nonComputedMember: function(left, right, expensiveChecks, context, create, expression) { + nonComputedMember: function(left, right, context, create, expression) { return function(scope, locals, assign, inputs) { var lhs = left(scope, locals, assign, inputs); if (create && create !== 1) { - ensureSafeAssignContext(lhs); if (lhs && !(lhs[right])) { lhs[right] = {}; } } var value = lhs != null ? lhs[right] : undefined; - if (expensiveChecks || isPossiblyDangerousMemberName(right)) { - ensureSafeObject(value, expression); - } if (context) { return {context: lhs, name: right, value: value}; } else { @@ -1794,14 +1618,10 @@ Parser.prototype = { constructor: Parser, parse: function(text) { - return this.astCompiler.compile(text, this.options.expensiveChecks); + return this.astCompiler.compile(text); } }; -function isPossiblyDangerousMemberName(name) { - return name === 'constructor'; -} - function getValueOf(value) { return isFunction(value.valueOf) ? value.valueOf() : objectValueOf.call(value); } @@ -1859,8 +1679,7 @@ function getValueOf(value) { * service. */ function $ParseProvider() { - var cacheDefault = createMap(); - var cacheExpensive = createMap(); + var cache = createMap(); var literals = { 'true': true, 'false': false, @@ -1918,37 +1737,20 @@ function $ParseProvider() { var noUnsafeEval = csp().noUnsafeEval; var $parseOptions = { csp: noUnsafeEval, - expensiveChecks: false, - literals: copy(literals), - isIdentifierStart: isFunction(identStart) && identStart, - isIdentifierContinue: isFunction(identContinue) && identContinue - }, - $parseOptionsExpensive = { - csp: noUnsafeEval, - expensiveChecks: true, literals: copy(literals), isIdentifierStart: isFunction(identStart) && identStart, isIdentifierContinue: isFunction(identContinue) && identContinue }; - var runningChecksEnabled = false; - - $parse.$$runningExpensiveChecks = function() { - return runningChecksEnabled; - }; - return $parse; - function $parse(exp, interceptorFn, expensiveChecks) { + function $parse(exp, interceptorFn) { var parsedExpression, oneTime, cacheKey; - expensiveChecks = expensiveChecks || runningChecksEnabled; - switch (typeof exp) { case 'string': exp = exp.trim(); cacheKey = exp; - var cache = (expensiveChecks ? cacheExpensive : cacheDefault); parsedExpression = cache[cacheKey]; if (!parsedExpression) { @@ -1956,9 +1758,8 @@ function $ParseProvider() { oneTime = true; exp = exp.substring(2); } - var parseOptions = expensiveChecks ? $parseOptionsExpensive : $parseOptions; - var lexer = new Lexer(parseOptions); - var parser = new Parser(lexer, $filter, parseOptions); + var lexer = new Lexer($parseOptions); + var parser = new Parser(lexer, $filter, $parseOptions); parsedExpression = parser.parse(exp); if (parsedExpression.constant) { parsedExpression.$$watchDelegate = constantWatchDelegate; @@ -1968,9 +1769,6 @@ function $ParseProvider() { } else if (parsedExpression.inputs) { parsedExpression.$$watchDelegate = inputsWatchDelegate; } - if (expensiveChecks) { - parsedExpression = expensiveChecksInterceptor(parsedExpression); - } cache[cacheKey] = parsedExpression; } return addInterceptor(parsedExpression, interceptorFn); @@ -1983,30 +1781,6 @@ function $ParseProvider() { } } - function expensiveChecksInterceptor(fn) { - if (!fn) return fn; - expensiveCheckFn.$$watchDelegate = fn.$$watchDelegate; - expensiveCheckFn.assign = expensiveChecksInterceptor(fn.assign); - expensiveCheckFn.constant = fn.constant; - expensiveCheckFn.literal = fn.literal; - for (var i = 0; fn.inputs && i < fn.inputs.length; ++i) { - fn.inputs[i] = expensiveChecksInterceptor(fn.inputs[i]); - } - expensiveCheckFn.inputs = fn.inputs; - - return expensiveCheckFn; - - function expensiveCheckFn(scope, locals, assign, inputs) { - var expensiveCheckOldValue = runningChecksEnabled; - runningChecksEnabled = true; - try { - return fn(scope, locals, assign, inputs); - } finally { - runningChecksEnabled = expensiveCheckOldValue; - } - } - } - function expressionInputDirtyCheck(newValue, oldValueOfValue) { if (newValue == null || oldValueOfValue == null) { // null/undefined diff --git a/test/ng/directive/ngEventDirsSpec.js b/test/ng/directive/ngEventDirsSpec.js index e2c2745f840e..d8288b828bbd 100644 --- a/test/ng/directive/ngEventDirsSpec.js +++ b/test/ng/directive/ngEventDirsSpec.js @@ -90,23 +90,13 @@ describe('event directives', function() { }); - describe('security', function() { + describe('DOM event object', function() { it('should allow access to the $event object', inject(function($rootScope, $compile) { var scope = $rootScope.$new(); element = $compile('')(scope); element.triggerHandler('click'); expect(scope.e.target).toBe(element[0]); })); - - it('should block access to DOM nodes (e.g. exposed via $event)', inject(function($rootScope, $compile) { - var scope = $rootScope.$new(); - element = $compile('')(scope); - expect(function() { - element.triggerHandler('click'); - }).toThrowMinErr( - '$parse', 'isecdom', 'Referencing DOM nodes in Angular expressions is disallowed! ' + - 'Expression: e = $event.target'); - })); }); describe('blur', function() { diff --git a/test/ng/parseSpec.js b/test/ng/parseSpec.js index ea216a644c75..79d49340da46 100644 --- a/test/ng/parseSpec.js +++ b/test/ng/parseSpec.js @@ -2422,770 +2422,6 @@ describe('parser', function() { })); - describe('sandboxing', function() { - describe('Function constructor', function() { - it('should not tranverse the Function constructor in the getter', function() { - expect(function() { - scope.$eval('{}.toString.constructor'); - }).toThrowMinErr( - '$parse', 'isecfn', 'Referencing Function in Angular expressions is disallowed! ' + - 'Expression: {}.toString.constructor'); - }); - - it('should not allow access to the Function prototype in the getter', function() { - expect(function() { - scope.$eval('toString.constructor.prototype'); - }).toThrowMinErr( - '$parse', 'isecfn', 'Referencing Function in Angular expressions is disallowed! ' + - 'Expression: toString.constructor.prototype'); - }); - - it('should NOT allow access to Function constructor in getter', function() { - expect(function() { - scope.$eval('{}.toString.constructor("alert(1)")'); - }).toThrowMinErr( - '$parse', 'isecfn', 'Referencing Function in Angular expressions is disallowed! ' + - 'Expression: {}.toString.constructor("alert(1)")'); - }); - - it('should NOT allow access to Function constructor in setter', function() { - - expect(function() { - scope.$eval('{}.toString.constructor.a = 1'); - }).toThrowMinErr( - '$parse', 'isecfn','Referencing Function in Angular expressions is disallowed! ' + - 'Expression: {}.toString.constructor.a = 1'); - - expect(function() { - scope.$eval('{}.toString["constructor"]["constructor"] = 1'); - }).toThrowMinErr( - '$parse', 'isecfn', 'Referencing Function in Angular expressions is disallowed! ' + - 'Expression: {}.toString["constructor"]["constructor"] = 1'); - - scope.key1 = 'const'; - scope.key2 = 'ructor'; - expect(function() { - scope.$eval('{}.toString[key1 + key2].foo = 1'); - }).toThrowMinErr( - '$parse', 'isecfn', 'Referencing Function in Angular expressions is disallowed! ' + - 'Expression: {}.toString[key1 + key2].foo = 1'); - - expect(function() { - scope.$eval('{}.toString["constructor"]["a"] = 1'); - }).toThrowMinErr( - '$parse', 'isecfn', 'Referencing Function in Angular expressions is disallowed! ' + - 'Expression: {}.toString["constructor"]["a"] = 1'); - - scope.a = []; - expect(function() { - scope.$eval('a.toString.constructor = 1', scope); - }).toThrowMinErr( - '$parse', 'isecfn', 'Referencing Function in Angular expressions is disallowed! ' + - 'Expression: a.toString.constructor'); - }); - - it('should disallow traversing the Function object in a setter: E02', function() { - expect(function() { - // This expression by itself isn't dangerous. However, one can use this to - // automatically call an object (e.g. a Function object) when it is automatically - // toString'd/valueOf'd by setting the RHS to Function.prototype.call. - scope.$eval('hasOwnProperty.constructor.prototype.valueOf = 1'); - }).toThrowMinErr( - '$parse', 'isecfn', 'Referencing Function in Angular expressions is disallowed! ' + - 'Expression: hasOwnProperty.constructor.prototype.valueOf'); - }); - - it('should disallow passing the Function object as a parameter: E03', function() { - expect(function() { - // This expression constructs a function but does not execute it. It does lead the - // way to execute it if one can get the toString/valueOf of it to call the function. - scope.$eval('["a", "alert(1)"].sort(hasOwnProperty.constructor)'); - }).toThrow(); - }); - - it('should prevent exploit E01', function() { - // This is a tracking exploit. The two individual tests, it('should … : E02') and - // it('should … : E03') test for two parts to block this exploit. This exploit works - // as follows: - // - // • Array.sort takes a comparison function and passes it 2 parameters to compare. If - // the result is non-primitive, sort then invokes valueOf() on the result. - // • The Function object conveniently accepts two string arguments so we can use this - // to construct a function. However, this doesn't do much unless we can execute it. - // • We set the valueOf property on Function.prototype to Function.prototype.call. - // This causes the function that we constructed to be executed when sort calls - // .valueOf() on the result of the comparison. - expect(function() { - scope.$eval('' + - 'hasOwnProperty.constructor.prototype.valueOf=valueOf.call;' + - '["a","alert(1)"].sort(hasOwnProperty.constructor)'); - }).toThrow(); - }); - - it('should NOT allow access to Function constructor that has been aliased in getters', function() { - scope.foo = { 'bar': Function }; - expect(function() { - scope.$eval('foo["bar"]'); - }).toThrowMinErr( - '$parse', 'isecfn', 'Referencing Function in Angular expressions is disallowed! ' + - 'Expression: foo["bar"]'); - }); - - it('should NOT allow access to Function constructor that has been aliased in setters', function() { - scope.foo = { 'bar': Function }; - expect(function() { - scope.$eval('foo["bar"] = 1'); - }).toThrowMinErr( - '$parse', 'isecfn', 'Referencing Function in Angular expressions is disallowed! ' + - 'Expression: foo["bar"] = 1'); - }); - - describe('expensiveChecks', function() { - it('should block access to window object even when aliased in getters', inject(function($parse, $window) { - scope.foo = {w: $window}; - // This isn't blocked for performance. - expect(scope.$eval($parse('foo.w'))).toBe($window); - // Event handlers use the more expensive path for better protection since they expose - // the $event object on the scope. - expect(function() { - scope.$eval($parse('foo.w', null, true)); - }).toThrowMinErr( - '$parse', 'isecwindow', 'Referencing the Window in Angular expressions is disallowed! ' + - 'Expression: foo.w'); - })); - - it('should block access to window object even when aliased in setters', inject(function($parse, $window) { - scope.foo = {w: $window}; - // This is blocked as it points to `window`. - expect(function() { - expect(scope.$eval($parse('foo.w = 1'))).toBe($window); - }).toThrowMinErr( - '$parse', 'isecwindow', 'Referencing the Window in Angular expressions is disallowed! ' + - 'Expression: foo.w = 1'); - // Event handlers use the more expensive path for better protection since they expose - // the $event object on the scope. - expect(function() { - scope.$eval($parse('foo.w = 1', null, true)); - }).toThrowMinErr( - '$parse', 'isecwindow', 'Referencing the Window in Angular expressions is disallowed! ' + - 'Expression: foo.w = 1'); - })); - - they('should propagate expensive checks when calling $prop', - ['foo.w && true', - '$eval("foo.w && true")', - 'this["$eval"]("foo.w && true")', - 'bar;$eval("foo.w && true")', - '$eval("foo.w && true");bar', - '$eval("foo.w && true", null, false)', - '$eval("foo");$eval("foo.w && true")', - '$eval("$eval(\\"foo.w && true\\")")', - '$eval("foo.e()")', - '$evalAsync("foo.w && true")', - 'this["$evalAsync"]("foo.w && true")', - 'bar;$evalAsync("foo.w && true")', - '$evalAsync("foo.w && true");bar', - '$evalAsync("foo.w && true", null, false)', - '$evalAsync("foo");$evalAsync("foo.w && true")', - '$evalAsync("$evalAsync(\\"foo.w && true\\")")', - '$evalAsync("foo.e()")', - '$evalAsync("$eval(\\"foo.w && true\\")")', - '$eval("$evalAsync(\\"foo.w && true\\")")', - '$watch("foo.w && true")', - '$watchCollection("foo.w && true", foo.f)', - '$watchGroup(["foo.w && true"])', - '$applyAsync("foo.w && true")'], function(expression) { - inject(function($parse, $window) { - scope.foo = { - w: $window, - bar: 'bar', - e: function() { scope.$eval('foo.w && true'); }, - f: function() {} - }; - expect($parse.$$runningExpensiveChecks()).toEqual(false); - expect(function() { - scope.$eval($parse(expression, null, true)); - scope.$digest(); - }).toThrowMinErr( - '$parse', 'isecwindow', 'Referencing the Window in Angular expressions is disallowed! ' + - 'Expression: foo.w && true'); - expect($parse.$$runningExpensiveChecks()).toEqual(false); - }); - }); - - they('should restore the state of $$runningExpensiveChecks when the expression $prop throws', - ['$eval("foo.t()")', - '$evalAsync("foo.t()", {foo: foo})'], function(expression) { - inject(function($parse, $window) { - scope.foo = { - t: function() { throw new Error(); } - }; - expect($parse.$$runningExpensiveChecks()).toEqual(false); - expect(function() { - scope.$eval($parse(expression, null, true)); - scope.$digest(); - }).toThrow(); - expect($parse.$$runningExpensiveChecks()).toEqual(false); - }); - }); - - it('should handle `inputs` when running with expensive checks', inject(function($parse) { - expect(function() { - scope.$watch($parse('a + b', null, true), noop); - scope.$digest(); - }).not.toThrow(); - })); - }); - }); - - describe('Function prototype functions', function() { - it('should NOT allow invocation to Function.call', function() { - scope.fn = Function.prototype.call; - - expect(function() { - scope.$eval('$eval.call()'); - }).toThrowMinErr( - '$parse', 'isecff', 'Referencing call, apply or bind in Angular expressions is disallowed! ' + - 'Expression: $eval.call()'); - - expect(function() { - scope.$eval('fn()'); - }).toThrowMinErr( - '$parse', 'isecff', 'Referencing call, apply or bind in Angular expressions is disallowed! ' + - 'Expression: fn()'); - }); - - it('should NOT allow invocation to Function.apply', function() { - scope.apply = Function.prototype.apply; - - expect(function() { - scope.$eval('$eval.apply()'); - }).toThrowMinErr( - '$parse', 'isecff', 'Referencing call, apply or bind in Angular expressions is disallowed! ' + - 'Expression: $eval.apply()'); - - expect(function() { - scope.$eval('apply()'); - }).toThrowMinErr( - '$parse', 'isecff', 'Referencing call, apply or bind in Angular expressions is disallowed! ' + - 'Expression: apply()'); - }); - - it('should NOT allow invocation to Function.bind', function() { - scope.bind = Function.prototype.bind; - - expect(function() { - scope.$eval('$eval.bind()'); - }).toThrowMinErr( - '$parse', 'isecff', 'Referencing call, apply or bind in Angular expressions is disallowed! ' + - 'Expression: $eval.bind()'); - - expect(function() { - scope.$eval('bind()'); - }).toThrowMinErr( - '$parse', 'isecff', 'Referencing call, apply or bind in Angular expressions is disallowed! ' + - 'Expression: bind()'); - }); - }); - - describe('Object constructor', function() { - - it('should NOT allow access to Object constructor that has been aliased in getters', function() { - scope.foo = { 'bar': Object }; - - expect(function() { - scope.$eval('foo.bar.keys(foo)'); - }).toThrowMinErr( - '$parse', 'isecobj', 'Referencing Object in Angular expressions is disallowed! ' + - 'Expression: foo.bar.keys(foo)'); - - expect(function() { - scope.$eval('foo["bar"]["keys"](foo)'); - }).toThrowMinErr( - '$parse', 'isecobj', 'Referencing Object in Angular expressions is disallowed! ' + - 'Expression: foo["bar"]["keys"](foo)'); - }); - - it('should NOT allow access to Object constructor that has been aliased in setters', function() { - scope.foo = { 'bar': Object }; - - expect(function() { - scope.$eval('foo.bar.keys(foo).bar = 1'); - }).toThrowMinErr( - '$parse', 'isecobj', 'Referencing Object in Angular expressions is disallowed! ' + - 'Expression: foo.bar.keys(foo).bar = 1'); - - expect(function() { - scope.$eval('foo["bar"]["keys"](foo).bar = 1'); - }).toThrowMinErr( - '$parse', 'isecobj', 'Referencing Object in Angular expressions is disallowed! ' + - 'Expression: foo["bar"]["keys"](foo).bar = 1'); - }); - }); - - describe('Window and $element/node', function() { - it('should NOT allow access to the Window or DOM when indexing', inject(function($window, $document) { - scope.wrap = {w: $window, d: $document}; - - expect(function() { - scope.$eval('wrap["w"]', scope); - }).toThrowMinErr( - '$parse', 'isecwindow', 'Referencing the Window in Angular expressions is ' + - 'disallowed! Expression: wrap["w"]'); - expect(function() { - scope.$eval('wrap["d"]', scope); - }).toThrowMinErr( - '$parse', 'isecdom', 'Referencing DOM nodes in Angular expressions is ' + - 'disallowed! Expression: wrap["d"]'); - expect(function() { - scope.$eval('wrap["w"] = 1', scope); - }).toThrowMinErr( - '$parse', 'isecwindow', 'Referencing the Window in Angular expressions is ' + - 'disallowed! Expression: wrap["w"] = 1'); - expect(function() { - scope.$eval('wrap["d"] = 1', scope); - }).toThrowMinErr( - '$parse', 'isecdom', 'Referencing DOM nodes in Angular expressions is ' + - 'disallowed! Expression: wrap["d"] = 1'); - })); - - it('should NOT allow access to the Window or DOM returned from a function', inject(function($window, $document) { - scope.getWin = valueFn($window); - scope.getDoc = valueFn($document); - - expect(function() { - scope.$eval('getWin()', scope); - }).toThrowMinErr( - '$parse', 'isecwindow', 'Referencing the Window in Angular expressions is ' + - 'disallowed! Expression: getWin()'); - expect(function() { - scope.$eval('getDoc()', scope); - }).toThrowMinErr( - '$parse', 'isecdom', 'Referencing DOM nodes in Angular expressions is ' + - 'disallowed! Expression: getDoc()'); - })); - - it('should NOT allow calling functions on Window or DOM', inject(function($window, $document) { - scope.a = {b: { win: $window, doc: $document }}; - expect(function() { - scope.$eval('a.b.win.alert(1)', scope); - }).toThrowMinErr( - '$parse', 'isecwindow', 'Referencing the Window in Angular expressions is ' + - 'disallowed! Expression: a.b.win.alert(1)'); - expect(function() { - scope.$eval('a.b.doc.on("click")', scope); - }).toThrowMinErr( - '$parse', 'isecdom', 'Referencing DOM nodes in Angular expressions is ' + - 'disallowed! Expression: a.b.doc.on("click")'); - })); - - // Issue #4805 - it('should NOT throw isecdom when referencing a Backbone Collection', function() { - // Backbone stuff is sort of hard to mock, if you have a better way of doing this, - // please fix this. - var fakeBackboneCollection = { - children: [{}, {}, {}], - find: function() {}, - on: function() {}, - off: function() {}, - bind: function() {} - }; - scope.backbone = fakeBackboneCollection; - expect(function() { scope.$eval('backbone'); }).not.toThrow(); - }); - - it('should NOT throw isecdom when referencing an array with node properties', function() { - var array = [1,2,3]; - array.on = array.attr = array.prop = array.bind = true; - scope.array = array; - expect(function() { scope.$eval('array'); }).not.toThrow(); - }); - }); - - describe('Disallowed fields', function() { - it('should NOT allow access or invocation of __defineGetter__', function() { - expect(function() { - scope.$eval('{}.__defineGetter__'); - }).toThrowMinErr('$parse', 'isecfld'); - expect(function() { - scope.$eval('{}.__defineGetter__("a", "".charAt)'); - }).toThrowMinErr('$parse', 'isecfld'); - - expect(function() { - scope.$eval('{}["__defineGetter__"]'); - }).toThrowMinErr('$parse', 'isecfld'); - expect(function() { - scope.$eval('{}["__defineGetter__"]("a", "".charAt)'); - }).toThrowMinErr('$parse', 'isecfld'); - - scope.a = '__define'; - scope.b = 'Getter__'; - expect(function() { - scope.$eval('{}[a + b]'); - }).toThrowMinErr('$parse', 'isecfld'); - expect(function() { - scope.$eval('{}[a + b]("a", "".charAt)'); - }).toThrowMinErr('$parse', 'isecfld'); - }); - - it('should NOT allow access or invocation of __defineSetter__', function() { - expect(function() { - scope.$eval('{}.__defineSetter__'); - }).toThrowMinErr('$parse', 'isecfld'); - expect(function() { - scope.$eval('{}.__defineSetter__("a", "".charAt)'); - }).toThrowMinErr('$parse', 'isecfld'); - - expect(function() { - scope.$eval('{}["__defineSetter__"]'); - }).toThrowMinErr('$parse', 'isecfld'); - expect(function() { - scope.$eval('{}["__defineSetter__"]("a", "".charAt)'); - }).toThrowMinErr('$parse', 'isecfld'); - - scope.a = '__define'; - scope.b = 'Setter__'; - expect(function() { - scope.$eval('{}[a + b]'); - }).toThrowMinErr('$parse', 'isecfld'); - expect(function() { - scope.$eval('{}[a + b]("a", "".charAt)'); - }).toThrowMinErr('$parse', 'isecfld'); - }); - - it('should NOT allow access or invocation of __lookupGetter__', function() { - expect(function() { - scope.$eval('{}.__lookupGetter__'); - }).toThrowMinErr('$parse', 'isecfld'); - expect(function() { - scope.$eval('{}.__lookupGetter__("a")'); - }).toThrowMinErr('$parse', 'isecfld'); - - expect(function() { - scope.$eval('{}["__lookupGetter__"]'); - }).toThrowMinErr('$parse', 'isecfld'); - expect(function() { - scope.$eval('{}["__lookupGetter__"]("a")'); - }).toThrowMinErr('$parse', 'isecfld'); - - scope.a = '__lookup'; - scope.b = 'Getter__'; - expect(function() { - scope.$eval('{}[a + b]'); - }).toThrowMinErr('$parse', 'isecfld'); - expect(function() { - scope.$eval('{}[a + b]("a")'); - }).toThrowMinErr('$parse', 'isecfld'); - }); - - it('should NOT allow access or invocation of __lookupSetter__', function() { - expect(function() { - scope.$eval('{}.__lookupSetter__'); - }).toThrowMinErr('$parse', 'isecfld'); - expect(function() { - scope.$eval('{}.__lookupSetter__("a")'); - }).toThrowMinErr('$parse', 'isecfld'); - - expect(function() { - scope.$eval('{}["__lookupSetter__"]'); - }).toThrowMinErr('$parse', 'isecfld'); - expect(function() { - scope.$eval('{}["__lookupSetter__"]("a")'); - }).toThrowMinErr('$parse', 'isecfld'); - - scope.a = '__lookup'; - scope.b = 'Setter__'; - expect(function() { - scope.$eval('{}[a + b]'); - }).toThrowMinErr('$parse', 'isecfld'); - expect(function() { - scope.$eval('{}[a + b]("a")'); - }).toThrowMinErr('$parse', 'isecfld'); - }); - - it('should NOT allow access to __proto__', function() { - expect(function() { - scope.$eval('__proto__'); - }).toThrowMinErr('$parse', 'isecfld'); - expect(function() { - scope.$eval('{}.__proto__'); - }).toThrowMinErr('$parse', 'isecfld'); - expect(function() { - scope.$eval('{}.__proto__.foo = 1'); - }).toThrowMinErr('$parse', 'isecfld'); - - expect(function() { - scope.$eval('{}["__proto__"]'); - }).toThrowMinErr('$parse', 'isecfld'); - expect(function() { - scope.$eval('{}["__proto__"].foo = 1'); - }).toThrowMinErr('$parse', 'isecfld'); - - expect(function() { - scope.$eval('{}[["__proto__"]]'); - }).toThrowMinErr('$parse', 'isecfld'); - expect(function() { - scope.$eval('{}[["__proto__"]].foo = 1'); - }).toThrowMinErr('$parse', 'isecfld'); - - expect(function() { - scope.$eval('0[["__proto__"]]'); - }).toThrowMinErr('$parse', 'isecfld'); - expect(function() { - scope.$eval('0[["__proto__"]].foo = 1'); - }).toThrowMinErr('$parse', 'isecfld'); - - scope.a = '__pro'; - scope.b = 'to__'; - expect(function() { - scope.$eval('{}[a + b]'); - }).toThrowMinErr('$parse', 'isecfld'); - expect(function() { - scope.$eval('{}[a + b].foo = 1'); - }).toThrowMinErr('$parse', 'isecfld'); - }); - }); - - it('should prevent the exploit', function() { - expect(function() { - scope.$eval('(1)[{0: "__proto__", 1: "__proto__", 2: "__proto__", 3: "safe", length: 4, toString: [].pop}].foo = 1'); - }).toThrow(); - if (!msie || msie > 10) { - // eslint-disable-next-line no-proto - expect((1)['__proto__'].foo).toBeUndefined(); - } - }); - - it('should prevent the exploit', function() { - expect(function() { - scope.$eval('' + - ' "".sub.call.call(' + - '({})["constructor"].getOwnPropertyDescriptor("".sub.__proto__, "constructor").value,' + - 'null,' + - '"alert(1)"' + - ')()' + - ''); - }).toThrow(); - }); - - they('should prevent assigning in the context of the $prop constructor', { - Array: [[], '[]'], - Boolean: [true, '(true)'], - Number: [1, '(1)'], - String: ['string', '"string"'] - }, function(values) { - var thing = values[0]; - var expr = values[1]; - var constructorExpr = expr + '.constructor'; - - expect(function() { - scope.$eval(constructorExpr + '.join'); - }).not.toThrow(); - expect(function() { - delete scope.foo; - scope.$eval('foo = ' + constructorExpr + '.join'); - }).not.toThrow(); - expect(function() { - scope.$eval(constructorExpr + '.join = ""'); - }).toThrowMinErr('$parse', 'isecaf'); - expect(function() { - scope.$eval(constructorExpr + '[0] = ""'); - }).toThrowMinErr('$parse', 'isecaf'); - expect(function() { - delete scope.foo; - scope.$eval('foo = ' + constructorExpr + '; foo.join = ""'); - }).toThrowMinErr('$parse', 'isecaf'); - - expect(function() { - scope.foo = thing; - scope.$eval('foo.constructor[0] = ""'); - }).toThrowMinErr('$parse', 'isecaf'); - expect(function() { - delete scope.foo; - scope.$eval('foo.constructor[0] = ""', {foo: thing}); - }).toThrowMinErr('$parse', 'isecaf'); - expect(function() { - scope.foo = thing.constructor; - scope.$eval('foo[0] = ""'); - }).toThrowMinErr('$parse', 'isecaf'); - expect(function() { - delete scope.foo; - scope.$eval('foo[0] = ""', {foo: thing.constructor}); - }).toThrowMinErr('$parse', 'isecaf'); - }); - - they('should prevent assigning in the context of the $prop constructor', { - // These might throw different error (e.g. isecobj, isecfn), - // but still having them here for good measure - Function: [noop, '$eval'], - Object: [{}, '{}'] - }, function(values) { - var thing = values[0]; - var expr = values[1]; - var constructorExpr = expr + '.constructor'; - - expect(function() { - scope.$eval(constructorExpr + '.join'); - }).not.toThrowMinErr('$parse', 'isecaf'); - expect(function() { - delete scope.foo; - scope.$eval('foo = ' + constructorExpr + '.join'); - }).not.toThrowMinErr('$parse', 'isecaf'); - expect(function() { - scope.$eval(constructorExpr + '.join = ""'); - }).toThrow(); - expect(function() { - scope.$eval(constructorExpr + '[0] = ""'); - }).toThrow(); - expect(function() { - delete scope.foo; - scope.$eval('foo = ' + constructorExpr + '; foo.join = ""'); - }).toThrow(); - - expect(function() { - scope.foo = thing; - scope.$eval('foo.constructor[0] = ""'); - }).toThrow(); - expect(function() { - delete scope.foo; - scope.$eval('foo.constructor[0] = ""', {foo: thing}); - }).toThrow(); - expect(function() { - scope.foo = thing.constructor; - scope.$eval('foo[0] = ""'); - }).toThrowMinErr('$parse', 'isecaf'); - expect(function() { - delete scope.foo; - scope.$eval('foo[0] = ""', {foo: thing.constructor}); - }).toThrowMinErr('$parse', 'isecaf'); - }); - - it('should prevent assigning only in the context of an actual constructor', function() { - // foo.constructor is not a constructor. - expect(function() { - delete scope.foo; - scope.$eval('foo.constructor[0] = ""', {foo: {constructor: ''}}); - }).not.toThrow(); - - expect(function() { - scope.$eval('"a".constructor.prototype.charAt = [].join'); - }).toThrowMinErr('$parse', 'isecaf'); - expect(function() { - scope.$eval('"a".constructor.prototype.charCodeAt = [].concat'); - }).toThrowMinErr('$parse', 'isecaf'); - }); - - they('should prevent assigning in the context of the $prop constructor prototype', { - Array: [[], '[]'], - Boolean: [true, '(true)'], - Number: [1, '(1)'], - String: ['string', '"string"'] - }, function(values) { - var thing = values[0]; - var expr = values[1]; - var constructorExpr = expr + '.constructor'; - var prototypeExpr = constructorExpr + '.prototype'; - - expect(function() { - scope.$eval(prototypeExpr + '.boin'); - }).not.toThrow(); - expect(function() { - delete scope.foo; - scope.$eval('foo = ' + prototypeExpr + '.boin'); - }).not.toThrow(); - expect(function() { - scope.$eval(prototypeExpr + '.boin = ""'); - }).toThrowMinErr('$parse', 'isecaf'); - expect(function() { - scope.$eval(prototypeExpr + '[0] = ""'); - }).toThrowMinErr('$parse', 'isecaf'); - expect(function() { - delete scope.foo; - scope.$eval('foo = ' + constructorExpr + '; foo.prototype.boin = ""'); - }).toThrowMinErr('$parse', 'isecaf'); - expect(function() { - delete scope.foo; - scope.$eval('foo = ' + prototypeExpr + '; foo.boin = ""'); - }).toThrowMinErr('$parse', 'isecaf'); - - expect(function() { - scope.foo = thing.constructor; - scope.$eval('foo.prototype[0] = ""'); - }).toThrowMinErr('$parse', 'isecaf'); - expect(function() { - delete scope.foo; - scope.$eval('foo.prototype[0] = ""', {foo: thing.constructor}); - }).toThrowMinErr('$parse', 'isecaf'); - expect(function() { - scope.foo = thing.constructor.prototype; - scope.$eval('foo[0] = ""'); - }).toThrowMinErr('$parse', 'isecaf'); - expect(function() { - delete scope.foo; - scope.$eval('foo[0] = ""', {foo: thing.constructor.prototype}); - }).toThrowMinErr('$parse', 'isecaf'); - }); - - they('should prevent assigning in the context of a constructor prototype', { - // These might throw different error (e.g. isecobj, isecfn), - // but still having them here for good measure - Function: [noop, '$eval'], - Object: [{}, '{}'] - }, function(values) { - var thing = values[0]; - var expr = values[1]; - var constructorExpr = expr + '.constructor'; - var prototypeExpr = constructorExpr + '.prototype'; - - expect(function() { - scope.$eval(prototypeExpr + '.boin'); - }).not.toThrowMinErr('$parse', 'isecaf'); - expect(function() { - delete scope.foo; - scope.$eval('foo = ' + prototypeExpr + '.boin'); - }).not.toThrowMinErr('$parse', 'isecaf'); - expect(function() { - scope.$eval(prototypeExpr + '.boin = ""'); - }).toThrow(); - expect(function() { - scope.$eval(prototypeExpr + '[0] = ""'); - }).toThrow(); - expect(function() { - delete scope.foo; - scope.$eval('foo = ' + constructorExpr + '; foo.prototype.boin = ""'); - }).toThrow(); - expect(function() { - delete scope.foo; - scope.$eval('foo = ' + prototypeExpr + '; foo.boin = ""'); - }).toThrow(); - - expect(function() { - scope.foo = thing.constructor; - scope.$eval('foo.prototype[0] = ""'); - }).toThrowMinErr('$parse', 'isecaf'); - expect(function() { - delete scope.foo; - scope.$eval('foo.prototype[0] = ""', {foo: thing.constructor}); - }).toThrowMinErr('$parse', 'isecaf'); - expect(function() { - scope.foo = thing.constructor.prototype; - scope.$eval('foo[0] = ""'); - }).toThrowMinErr('$parse', 'isecaf'); - expect(function() { - delete scope.foo; - scope.$eval('foo[0] = ""', {foo: thing.constructor.prototype}); - }).toThrowMinErr('$parse', 'isecaf'); - }); - - it('should prevent assigning only in the context of an actual prototype', function() { - // foo.constructor.prototype is not a constructor prototype. - expect(function() { - delete scope.foo; - scope.$eval('foo.constructor.prototype[0] = ""', {foo: {constructor: {prototype: ''}}}); - }).not.toThrow(); - }); - }); - it('should call the function from the received instance and not from a new one', function() { var n = 0; scope.fn = function() { From 32aa7e7395527624119e3917c54ee43b4d219301 Mon Sep 17 00:00:00 2001 From: Peter Bacon Darwin Date: Thu, 15 Sep 2016 11:59:42 +0100 Subject: [PATCH 0169/1173] fix(ngTransclude): use fallback content if only whitespace is provided If the transcluded content is only whitespace then we should use the fallback content instead. This allows more flexibility in formatting your HTML. Closes #15077 Closes #15140 BREAKING CHANGE: Previously whitespace only transclusion would be treated as the transclusion being "not empty", which meant that fallback content was not used in that case. Now if you only provide whitespace as the transclusion content, it will be assumed to be empty and the fallback content will be used instead. If you really do want whitespace then you can force it to be used by adding a comment to the whitespace. --- src/ng/directive/ngTransclude.js | 15 +++++++-- test/ng/compileSpec.js | 54 ++++++++++++++++++++++++++++++++ 2 files changed, 66 insertions(+), 3 deletions(-) diff --git a/src/ng/directive/ngTransclude.js b/src/ng/directive/ngTransclude.js index f19c251fc3b6..4f48f5ee0bbf 100644 --- a/src/ng/directive/ngTransclude.js +++ b/src/ng/directive/ngTransclude.js @@ -13,8 +13,8 @@ * * If the transcluded content is not empty (i.e. contains one or more DOM nodes, including whitespace text nodes), any existing * content of this element will be removed before the transcluded content is inserted. - * If the transcluded content is empty, the existing content is left intact. This lets you provide fallback content in the case - * that no transcluded content is provided. + * If the transcluded content is empty (or only whitespace), the existing content is left intact. This lets you provide fallback + * content in the case that no transcluded content is provided. * * @element ANY * @@ -195,7 +195,7 @@ var ngTranscludeDirective = ['$compile', function($compile) { } function ngTranscludeCloneAttachFn(clone, transcludedScope) { - if (clone.length) { + if (clone.length && notWhitespace(clone)) { $element.append(clone); } else { useFallbackContent(); @@ -212,6 +212,15 @@ var ngTranscludeDirective = ['$compile', function($compile) { $element.append(clone); }); } + + function notWhitespace(nodes) { + for (var i = 0, ii = nodes.length; i < ii; i++) { + var node = nodes[i]; + if (node.nodeType !== NODE_TYPE_TEXT || node.nodeValue.trim()) { + return true; + } + } + } }; } }; diff --git a/test/ng/compileSpec.js b/test/ng/compileSpec.js index 70112d14a82f..a9659524fd21 100755 --- a/test/ng/compileSpec.js +++ b/test/ng/compileSpec.js @@ -8728,6 +8728,60 @@ describe('$compile', function() { }); }); + it('should compile and link the fallback content if only whitespace transcluded content is provided', function() { + var linkSpy = jasmine.createSpy('postlink'); + + module(function() { + directive('inner', function() { + return { + restrict: 'E', + template: 'old stuff! ', + link: linkSpy + }; + }); + + directive('trans', function() { + return { + transclude: true, + template: '
        ' + }; + }); + }); + inject(function(log, $rootScope, $compile) { + element = $compile('
        \n \n
        ')($rootScope); + $rootScope.$apply(); + expect(sortedHtml(element.html())).toEqual('
        old stuff!
        '); + expect(linkSpy).toHaveBeenCalled(); + }); + }); + + it('should not link the fallback content if only whitespace and comments are provided as transclude content', function() { + var linkSpy = jasmine.createSpy('postlink'); + + module(function() { + directive('inner', function() { + return { + restrict: 'E', + template: 'old stuff! ', + link: linkSpy + }; + }); + + directive('trans', function() { + return { + transclude: true, + template: '
        ' + }; + }); + }); + inject(function(log, $rootScope, $compile) { + element = $compile('
        \n \n
        ')($rootScope); + $rootScope.$apply(); + expect(sortedHtml(element.html())).toEqual('
        \n \n
        '); + expect(linkSpy).not.toHaveBeenCalled(); + }); + }); + it('should compile and link the fallback content if an optional transclusion slot is not provided', function() { var linkSpy = jasmine.createSpy('postlink'); From 52bf2bd11e9070807762bad1a7ff048a67f24b75 Mon Sep 17 00:00:00 2001 From: Georgios Kalpakas Date: Mon, 12 Sep 2016 17:30:38 +0300 Subject: [PATCH 0170/1173] refactor(ngOptions): access `copy()` directly (`angular.copy` --> `copy`) --- src/ng/directive/ngOptions.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ng/directive/ngOptions.js b/src/ng/directive/ngOptions.js index 9b58f9b985fd..db00e4cee7bc 100644 --- a/src/ng/directive/ngOptions.js +++ b/src/ng/directive/ngOptions.js @@ -397,7 +397,7 @@ var ngOptionsDirective = ['$compile', '$document', '$parse', function($compile, getViewValueFromOption: function(option) { // If the viewValue could be an object that may be mutated by the application, // we need to make a copy and not return the reference to the value on the option. - return trackBy ? angular.copy(option.viewValue) : option.viewValue; + return trackBy ? copy(option.viewValue) : option.viewValue; } }; } From a1bdffa12f82e838dee5492956b380df7e54cdf9 Mon Sep 17 00:00:00 2001 From: Georgios Kalpakas Date: Mon, 12 Sep 2016 16:45:32 +0300 Subject: [PATCH 0171/1173] fix($compile): do not overwrite values set in `$onInit()` for `<`-bound literals See #15118 for more details. Fixes #15118 Closes #15123 --- src/ng/compile.js | 7 +++++-- test/ng/compileSpec.js | 33 ++++++++++++++++++++++++++++++++- 2 files changed, 37 insertions(+), 3 deletions(-) diff --git a/src/ng/compile.js b/src/ng/compile.js index 631ddc67cedd..1d2ae28e1b07 100644 --- a/src/ng/compile.js +++ b/src/ng/compile.js @@ -3506,18 +3506,21 @@ function $CompileProvider($provide, $$sanitizeUriProvider) { if (optional && !attrs[attrName]) break; parentGet = $parse(attrs[attrName]); + var deepWatch = parentGet.literal; var initialValue = destination[scopeName] = parentGet(scope); initialChanges[scopeName] = new SimpleChange(_UNINITIALIZED_VALUE, destination[scopeName]); removeWatch = scope.$watch(parentGet, function parentValueWatchAction(newValue, oldValue) { if (oldValue === newValue) { - if (oldValue === initialValue) return; + if (oldValue === initialValue || (deepWatch && equals(oldValue, initialValue))) { + return; + } oldValue = initialValue; } recordChanges(scopeName, newValue, oldValue); destination[scopeName] = newValue; - }, parentGet.literal); + }, deepWatch); removeWatchCollection.push(removeWatch); break; diff --git a/test/ng/compileSpec.js b/test/ng/compileSpec.js index a9659524fd21..2784d16ccf7c 100755 --- a/test/ng/compileSpec.js +++ b/test/ng/compileSpec.js @@ -5524,7 +5524,7 @@ describe('$compile', function() { expect($rootScope.name).toEqual('outer'); expect(component.input).toEqual('$onInit'); - $rootScope.$apply(); + $rootScope.$digest(); expect($rootScope.name).toEqual('outer'); expect(component.input).toEqual('$onInit'); @@ -5537,6 +5537,37 @@ describe('$compile', function() { }); }); + it('should not update isolate again after $onInit if outer is a literal', function() { + module('owComponentTest'); + inject(function() { + $rootScope.name = 'outer'; + compile(''); + + expect(component.input).toEqual('$onInit'); + + // No outer change + $rootScope.$apply('name = "outer"'); + expect(component.input).toEqual('$onInit'); + + // Outer change + $rootScope.$apply('name = "re-outer"'); + expect(component.input).toEqual(['re-outer']); + + expect(log).toEqual([ + 'constructor', + [ + '$onChanges', + jasmine.objectContaining({currentValue: ['outer']}) + ], + '$onInit', + [ + '$onChanges', + jasmine.objectContaining({previousValue: ['outer'], currentValue: ['re-outer']}) + ] + ]); + }); + }); + it('should update isolate again after $onInit if outer has changed (before initial watchAction call)', function() { module('owComponentTest'); inject(function() { From 16dccea8873b06285d4ec6eb3bb8e96ccbd3b64e Mon Sep 17 00:00:00 2001 From: thorn0 Date: Thu, 8 Sep 2016 17:54:13 +0300 Subject: [PATCH 0172/1173] fix($compile): `bindToController` should work without `controllerAs` Fixes #15088 Closes #15110 --- docs/content/error/$compile/noident.ngdoc | 71 ------- src/ng/compile.js | 28 +-- test/ng/compileSpec.js | 237 +++++++++------------- 3 files changed, 106 insertions(+), 230 deletions(-) delete mode 100644 docs/content/error/$compile/noident.ngdoc diff --git a/docs/content/error/$compile/noident.ngdoc b/docs/content/error/$compile/noident.ngdoc deleted file mode 100644 index 9770a94585e1..000000000000 --- a/docs/content/error/$compile/noident.ngdoc +++ /dev/null @@ -1,71 +0,0 @@ -@ngdoc error -@name $compile:noident -@fullName Controller identifier is required. -@description - -When using the `bindToController` feature of AngularJS, a directive is required -to have a Controller identifier, which is initialized in scope with the value of -the controller instance. This can be supplied using the "controllerAs" property -of the directive object, or alternatively by adding " as IDENTIFIER" to the controller -name. - -For example, the following directives are valid: - -```js -// OKAY, because controller is a string with an identifier component. -directive("okay", function() { - return { - bindToController: true, - controller: "myCtrl as $ctrl", - scope: { - text: "@text" - } - }; -}); - - -// OKAY, because the directive uses the controllerAs property to override -// the controller identifier. -directive("okay2", function() { - return { - bindToController: true, - controllerAs: "$ctrl", - controller: function() { - - }, - scope: { - text: "@text" - } - }; -}); -``` - -While the following are invalid: - -```js -// BAD, because the controller property is a string with no identifier. -directive("bad", function() { - return { - bindToController: true, - controller: "noIdentCtrl", - scope: { - text: "@text" - } - }; -}); - - -// BAD because the controller is not a string (therefore has no identifier), -// and there is no controllerAs property. -directive("bad2", function() { - return { - bindToController: true, - controller: function noControllerAs() { - - }, - scope: { - text: "@text" - } - }; -}); -``` diff --git a/src/ng/compile.js b/src/ng/compile.js index 1d2ae28e1b07..df611d315c3d 100644 --- a/src/ng/compile.js +++ b/src/ng/compile.js @@ -361,9 +361,7 @@ * * #### `bindToController` * This property is used to bind scope properties directly to the controller. It can be either - * `true` or an object hash with the same format as the `scope` property. Additionally, a controller - * alias must be set, either by using `controllerAs: 'myAlias'` or by specifying the alias in the controller - * definition: `controller: 'myCtrl as myAlias'`. + * `true` or an object hash with the same format as the `scope` property. * * When an isolate scope is used for a directive (see above), `bindToController: true` will * allow a component to have its properties bound to the controller, rather than to scope. @@ -1028,20 +1026,11 @@ function $CompileProvider($provide, $$sanitizeUriProvider) { bindings.bindToController = parseIsolateBindings(directive.bindToController, directiveName, true); } - if (isObject(bindings.bindToController)) { - var controller = directive.controller; - var controllerAs = directive.controllerAs; - if (!controller) { - // There is no controller, there may or may not be a controllerAs property - throw $compileMinErr('noctrl', - 'Cannot bind to controller without directive \'{0}\'s controller.', - directiveName); - } else if (!identifierForController(controller, controllerAs)) { - // There is a controller, but no identifier or controllerAs property - throw $compileMinErr('noident', - 'Cannot bind to controller without identifier for directive \'{0}\'.', - directiveName); - } + if (bindings.bindToController && !directive.controller) { + // There is no controller + throw $compileMinErr('noctrl', + 'Cannot bind to controller without directive \'{0}\'s controller.', + directiveName); } return bindings; } @@ -2710,7 +2699,7 @@ function $CompileProvider($provide, $$sanitizeUriProvider) { var bindings = controllerDirective.$$bindings.bindToController; if (preAssignBindingsEnabled) { - if (controller.identifier && bindings) { + if (bindings) { controller.bindingInfo = initializeDirectiveBindings(controllerScope, attrs, controller.instance, bindings, controllerDirective); } else { @@ -3413,8 +3402,7 @@ function $CompileProvider($provide, $$sanitizeUriProvider) { } - // Set up $watches for isolate scope and controller bindings. This process - // only occurs for isolate scopes and new scopes with controllerAs. + // Set up $watches for isolate scope and controller bindings. function initializeDirectiveBindings(scope, attrs, destination, bindings, directive) { var removeWatchCollection = []; var initialChanges = {}; diff --git a/test/ng/compileSpec.js b/test/ng/compileSpec.js index 2784d16ccf7c..492741a4496a 100755 --- a/test/ng/compileSpec.js +++ b/test/ng/compileSpec.js @@ -6205,154 +6205,113 @@ describe('$compile', function() { }); - it('should throw noident when missing controllerAs directive property', function() { - module(function($compileProvider) { - $compileProvider.directive('noIdent', valueFn({ - templateUrl: 'test.html', - scope: { - 'data': '=dirData', - 'oneway': '')($rootScope); - }).toThrowMinErr('$compile', 'noident', - 'Cannot bind to controller without identifier for directive \'noIdent\'.'); - }); - }); - - - it('should throw noident when missing controller identifier', function() { - module(function($compileProvider, $controllerProvider) { - $controllerProvider.register('myCtrl', function() {}); - $compileProvider.directive('noIdent', valueFn({ - templateUrl: 'test.html', - scope: { - 'data': '=dirData', - 'oneway': '')($rootScope); - }).toThrowMinErr('$compile', 'noident', - 'Cannot bind to controller without identifier for directive \'noIdent\'.'); - }); - }); + controllerAs: 'myCtrl' + }], + scopeOptions = [{ + description: 'isolate scope', + scope: {} + }, { + description: 'new scope', + scope: true + }, { + description: 'no scope', + scope: false + }], - it('should bind to controller via object notation (isolate scope)', function() { - var controllerCalled = false; - module(function($compileProvider, $controllerProvider) { - $controllerProvider.register('myCtrl', function() { - this.check = function() { - expect(this.data).toEqualData({ - 'foo': 'bar', - 'baz': 'biz' - }); - expect(this.oneway).toEqualData({ - 'foo': 'bar', - 'baz': 'biz' - }); - expect(this.str).toBe('Hello, world!'); - expect(this.fn()).toBe('called!'); - }; - controllerCalled = true; - if (preAssignBindingsEnabled) { - this.check(); - } else { - this.$onInit = this.check; - } - }); - $compileProvider.directive('fooDir', valueFn({ - templateUrl: 'test.html', - bindToController: { - 'data': '=dirData', - 'oneway': 'isolate

        '); - $rootScope.fn = valueFn('called!'); - $rootScope.whom = 'world'; - $rootScope.remoteData = { - 'foo': 'bar', - 'baz': 'biz' - }; - element = $compile('
        ')($rootScope); - $rootScope.$digest(); - expect(controllerCalled).toBe(true); - }); - }); + templateOptions = [{ + description: 'inline template', + template: '

        template

        ' + }, { + description: 'templateUrl setting', + templateUrl: 'test.html' + }, { + description: 'no template' + }]; + forEach(controllerOptions, function(controllerOption) { + forEach(scopeOptions, function(scopeOption) { + forEach(templateOptions, function(templateOption) { + + var description = [], + ddo = { + bindToController: { + 'data': '=dirData', + 'oneway': 'template

        '); + $rootScope.fn = valueFn('called!'); + $rootScope.whom = 'world'; + $rootScope.remoteData = { + 'foo': 'bar', + 'baz': 'biz' + }; + element = $compile('
        ')($rootScope); + $rootScope.$digest(); + expect(controllerCalled).toBe(true); + if (ddo.controllerAs || ddo.controller.indexOf(' as ') !== -1) { + if (ddo.scope) { + expect($rootScope.myCtrl).toBeUndefined(); + } else { + // The controller identifier was added to the containing scope. + expect($rootScope.myCtrl).toBeDefined(); + } + } + }); }); - expect(this.str).toBe('Hello, world!'); - expect(this.fn()).toBe('called!'); - }; - controllerCalled = true; - if (preAssignBindingsEnabled) { - this.check(); - } else { - this.$onInit = this.check; - } + + }); }); - $compileProvider.directive('fooDir', valueFn({ - templateUrl: 'test.html', - bindToController: { - 'data': '=dirData', - 'oneway': 'isolate

        '); - $rootScope.fn = valueFn('called!'); - $rootScope.whom = 'world'; - $rootScope.remoteData = { - 'foo': 'bar', - 'baz': 'biz' - }; - element = $compile('
        ')($rootScope); - $rootScope.$digest(); - expect(controllerCalled).toBe(true); }); + }); From bb8e955a02093b90567677820aefebb8b48f1c4f Mon Sep 17 00:00:00 2001 From: Stepan Suvorov Date: Sun, 18 Sep 2016 18:57:51 +0200 Subject: [PATCH 0173/1173] docs(cacheFactory): remove `ng-include` practice from docs Generally we don't use `ngInclude` any more, so this commit updates the example snippet to use component instead. Closes #15153 --- src/ng/cacheFactory.js | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/src/ng/cacheFactory.js b/src/ng/cacheFactory.js index 84e91c9883bd..3a8f5f5c7e67 100644 --- a/src/ng/cacheFactory.js +++ b/src/ng/cacheFactory.js @@ -385,12 +385,14 @@ function $CacheFactoryProvider() { * }); * ``` * - * To retrieve the template later, simply use it in your HTML: - * ```html - *
        + * To retrieve the template later, simply use it in your component: + * ```js + * myApp.component('myComponent', { + * template: 'templateId.html' + * }); * ``` * - * or get it via Javascript: + * or get it via $templateCache service: * ```js * $templateCache.get('templateId.html') * ``` From e1e2fe1c089d6cfac5b8c8517d29e6b7c431ea78 Mon Sep 17 00:00:00 2001 From: Georgios Kalpakas Date: Mon, 19 Sep 2016 17:57:31 +0300 Subject: [PATCH 0174/1173] docs($templateCache): fix typo (template --> templateCache) --- src/ng/cacheFactory.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/ng/cacheFactory.js b/src/ng/cacheFactory.js index 3a8f5f5c7e67..c4735d2738b9 100644 --- a/src/ng/cacheFactory.js +++ b/src/ng/cacheFactory.js @@ -388,11 +388,11 @@ function $CacheFactoryProvider() { * To retrieve the template later, simply use it in your component: * ```js * myApp.component('myComponent', { - * template: 'templateId.html' + * templateUrl: 'templateId.html' * }); * ``` * - * or get it via $templateCache service: + * or get it via the `$templateCache` service: * ```js * $templateCache.get('templateId.html') * ``` From f1cc58c7d282d48a9b23b90f1cc5e5b2bc9f296e Mon Sep 17 00:00:00 2001 From: Matt Gilson Date: Mon, 19 Sep 2016 08:36:25 -0700 Subject: [PATCH 0175/1173] docs(angular.toJson): add missing param type Reference: [JSON.stringify](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/JSON/stringify). Closes #15156 --- src/Angular.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Angular.js b/src/Angular.js index ad68d3e128d5..dced06cc28b2 100644 --- a/src/Angular.js +++ b/src/Angular.js @@ -1223,7 +1223,7 @@ function toJsonReplacer(key, value) { * Serializes input into a JSON-formatted string. Properties with leading $$ characters will be * stripped since angular uses this notation internally. * - * @param {Object|Array|Date|string|number} obj Input to be serialized into JSON. + * @param {Object|Array|Date|string|number|boolean} obj Input to be serialized into JSON. * @param {boolean|number} [pretty=2] If set to true, the JSON output will contain newlines and whitespace. * If set to an integer, the JSON output will contain that many spaces per indentation. * @returns {string|undefined} JSON-ified string representing `obj`. From b59bc0b01ddddbe42310d113dafe127d4e71511c Mon Sep 17 00:00:00 2001 From: davidcigital Date: Thu, 15 Sep 2016 13:59:55 +0100 Subject: [PATCH 0176/1173] docs(ngCsp): update explanation of CSP rules and how they affect Angular Update the description of CSP, mainly regarding `unsafe-eval` and `unsafe-inline`. The way it was presented previously was slightly misleading as it indicated that these were rules forbidding certain things, when in fact it's a keyword in the CSP that disables the very rule that was described. The updated text clarifies this better. Closes #15142 --- src/ng/directive/ngCsp.js | 44 ++++++++++++++++++++++----------------- 1 file changed, 25 insertions(+), 19 deletions(-) diff --git a/src/ng/directive/ngCsp.js b/src/ng/directive/ngCsp.js index f0303ef8a844..38a6e67b2b1e 100644 --- a/src/ng/directive/ngCsp.js +++ b/src/ng/directive/ngCsp.js @@ -7,28 +7,34 @@ * @element html * @description * - * Angular has some features that can break certain + * Angular has some features that can conflict with certain restrictions that are applied when using * [CSP (Content Security Policy)](https://developer.mozilla.org/en/Security/CSP) rules. * - * If you intend to implement these rules then you must tell Angular not to use these features. + * If you intend to implement CSP with these rules then you must tell Angular not to use these + * features. * * This is necessary when developing things like Google Chrome Extensions or Universal Windows Apps. * * - * The following rules affect Angular: + * The following default rules in CSP affect Angular: * - * * `unsafe-eval`: this rule forbids apps to use `eval` or `Function(string)` generated functions - * (among other things). Angular makes use of this in the {@link $parse} service to provide a 30% - * increase in the speed of evaluating Angular expressions. + * * The use of `eval()`, `Function(string)` and similar functions to dynamically create and execute + * code from strings is forbidden. Angular makes use of this in the {@link $parse} service to + * provide a 30% increase in the speed of evaluating Angular expressions. (This CSP rule can be + * disabled with the CSP keyword `unsafe-eval`, but it is generally not recommended as it would + * weaken the protections offered by CSP.) * - * * `unsafe-inline`: this rule forbids apps from inject custom styles into the document. Angular - * makes use of this to include some CSS rules (e.g. {@link ngCloak} and {@link ngHide}). - * To make these directives work when a CSP rule is blocking inline styles, you must link to the - * `angular-csp.css` in your HTML manually. + * * The use of inline resources, such as inline ` + + \ No newline at end of file diff --git a/test/e2e/tests/input-hidden.spec.js b/test/e2e/tests/input-hidden.spec.js new file mode 100644 index 000000000000..ef2669f0f64a --- /dev/null +++ b/test/e2e/tests/input-hidden.spec.js @@ -0,0 +1,17 @@ +'use strict'; + +describe('hidden thingy', function() { + it('should pass', function() { + + loadFixture('input-hidden'); + expect(element(by.css('input')).getAttribute('value')).toEqual(''); + + element(by.css('button')).click(); + expect(element(by.css('input')).getAttribute('value')).toEqual('{{ 7 * 6 }}'); + + loadFixture('sample'); + browser.driver.executeScript('history.back()'); + var expectedValue = browser.params.browser === 'safari' ? '{{ 7 * 6 }}' : ''; + expect(element(by.css('input')).getAttribute('value')).toEqual(expectedValue); + }); +}); From 8d394de91fd96f87afdbb277520b111232ec4bdb Mon Sep 17 00:00:00 2001 From: Peter Bacon Darwin Date: Mon, 10 Oct 2016 23:07:52 +0100 Subject: [PATCH 0220/1173] docs(CHANGELOG): add 1.2.31 and 1.4.13 release info --- CHANGELOG.md | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 1b3efbe3c208..99fa22865764 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,25 @@ + +# 1.4.13 croaking-elderweed (2016-10-10) + +## Bug Fixes +- **input:** ensure that hidden input values are correct after history back + ([693d1334](https://github.com/angular/angular.js/commit/693d1334566f78987f5a361a100db4f889f35abd) + + + +# 1.2.31 barking-moustache (2016-10-10) + +## Bug Fixes +- **input:** ensure that hidden input values are correct after history back + ([7ec663fc](https://github.com/angular/angular.js/commit/7ec663fc708aa7a9a9ce62d2306f24d7a733a86d) + + + +# 1.4.12 + +*Invalid release* + + # 1.5.8 arbitrary-fallbacks (2016-07-22) From ec83b04df1f38f37066c2ce6cf791405af73a9b3 Mon Sep 17 00:00:00 2001 From: Peter Bacon Darwin Date: Tue, 11 Oct 2016 13:28:56 +0100 Subject: [PATCH 0221/1173] revert:fix(input): ensure that hidden input values are correct after history.back This reverts commit 298f8c4d13fbaa104845619e5518cb03c2aad05b. There was a regression in angular-material that relied upon the input directive having `link.pre` property. --- src/ng/directive/input.js | 15 ++++++--------- test/e2e/fixtures/input-hidden/index.html | 10 ---------- test/e2e/tests/input-hidden.spec.js | 17 ----------------- 3 files changed, 6 insertions(+), 36 deletions(-) delete mode 100644 test/e2e/fixtures/input-hidden/index.html delete mode 100644 test/e2e/tests/input-hidden.spec.js diff --git a/src/ng/directive/input.js b/src/ng/directive/input.js index c253908651d8..7e26ca16f6d1 100644 --- a/src/ng/directive/input.js +++ b/src/ng/directive/input.js @@ -2002,16 +2002,13 @@ var inputDirective = ['$browser', '$sniffer', '$filter', '$parse', return { restrict: 'E', require: ['?ngModel'], - compile: function(tElement, tAttr) { - if (lowercase(tAttr.type) === 'hidden') tAttr.$set('autocomplete', 'off'); - return { - pre: function(scope, element, attr, ctrls) { - if (ctrls[0]) { - (inputType[lowercase(attr.type)] || inputType.text)(scope, element, attr, ctrls[0], $sniffer, - $browser, $filter, $parse); - } + link: { + pre: function(scope, element, attr, ctrls) { + if (ctrls[0]) { + (inputType[lowercase(attr.type)] || inputType.text)(scope, element, attr, ctrls[0], $sniffer, + $browser, $filter, $parse); } - }; + } } }; }]; diff --git a/test/e2e/fixtures/input-hidden/index.html b/test/e2e/fixtures/input-hidden/index.html deleted file mode 100644 index 881639100ad9..000000000000 --- a/test/e2e/fixtures/input-hidden/index.html +++ /dev/null @@ -1,10 +0,0 @@ - - - -
        - - -
        - - - \ No newline at end of file diff --git a/test/e2e/tests/input-hidden.spec.js b/test/e2e/tests/input-hidden.spec.js deleted file mode 100644 index ef2669f0f64a..000000000000 --- a/test/e2e/tests/input-hidden.spec.js +++ /dev/null @@ -1,17 +0,0 @@ -'use strict'; - -describe('hidden thingy', function() { - it('should pass', function() { - - loadFixture('input-hidden'); - expect(element(by.css('input')).getAttribute('value')).toEqual(''); - - element(by.css('button')).click(); - expect(element(by.css('input')).getAttribute('value')).toEqual('{{ 7 * 6 }}'); - - loadFixture('sample'); - browser.driver.executeScript('history.back()'); - var expectedValue = browser.params.browser === 'safari' ? '{{ 7 * 6 }}' : ''; - expect(element(by.css('input')).getAttribute('value')).toEqual(expectedValue); - }); -}); From 606ea5d23ee8bbb8b7ee238bf07ce4c72de7eaac Mon Sep 17 00:00:00 2001 From: Peter Bacon Darwin Date: Tue, 11 Oct 2016 13:33:42 +0100 Subject: [PATCH 0222/1173] fix($compile): ensure that hidden input values are correct after history.back Due to the nature of some browser's PageCache/BFCache, returning to an Angular app sometimes causes `input[hidden]` elements to retain the last value that was stored before the page was navigated away from previously. This is particularly problematic if the input has an interpolated value. E.g. `` since when the browser returns, instead of the original interpolation template, the HTML contains the previous value ``. This commit instructs the browser not to attempt to reinstate the previous value when navigating back in history by setting `autocomplete="off"` on the hidden input element element. --- src/ng/compile.js | 12 +++++++++++- test/e2e/fixtures/input-hidden/index.html | 10 ++++++++++ test/e2e/tests/input-hidden.spec.js | 17 +++++++++++++++++ 3 files changed, 38 insertions(+), 1 deletion(-) create mode 100644 test/e2e/fixtures/input-hidden/index.html create mode 100644 test/e2e/tests/input-hidden.spec.js diff --git a/src/ng/compile.js b/src/ng/compile.js index f26cfa22a053..6c9cf801f8bc 100644 --- a/src/ng/compile.js +++ b/src/ng/compile.js @@ -2115,13 +2115,17 @@ function $CompileProvider($provide, $$sanitizeUriProvider) { var nodeType = node.nodeType, attrsMap = attrs.$attr, match, + nodeName, className; switch (nodeType) { case NODE_TYPE_ELEMENT: /* Element */ + + nodeName = nodeName_(node); + // use the node name: addDirective(directives, - directiveNormalize(nodeName_(node)), 'E', maxPriority, ignoreDirective); + directiveNormalize(nodeName), 'E', maxPriority, ignoreDirective); // iterate over the attributes for (var attr, name, nName, ngAttrName, value, isNgAttr, nAttrs = node.attributes, @@ -2163,6 +2167,12 @@ function $CompileProvider($provide, $$sanitizeUriProvider) { attrEndName); } + if (nodeName === 'input' && node.getAttribute('type') === 'hidden') { + // Hidden input elements can have strange behaviour when navigating back to the page + // This tells the browser not to try to cache and reinstate previous values + node.setAttribute('autocomplete', 'off'); + } + // use class as directive if (!cssClassDirectivesEnabled) break; className = node.className; diff --git a/test/e2e/fixtures/input-hidden/index.html b/test/e2e/fixtures/input-hidden/index.html new file mode 100644 index 000000000000..881639100ad9 --- /dev/null +++ b/test/e2e/fixtures/input-hidden/index.html @@ -0,0 +1,10 @@ + + + +
        + + +
        + + + \ No newline at end of file diff --git a/test/e2e/tests/input-hidden.spec.js b/test/e2e/tests/input-hidden.spec.js new file mode 100644 index 000000000000..ef2669f0f64a --- /dev/null +++ b/test/e2e/tests/input-hidden.spec.js @@ -0,0 +1,17 @@ +'use strict'; + +describe('hidden thingy', function() { + it('should pass', function() { + + loadFixture('input-hidden'); + expect(element(by.css('input')).getAttribute('value')).toEqual(''); + + element(by.css('button')).click(); + expect(element(by.css('input')).getAttribute('value')).toEqual('{{ 7 * 6 }}'); + + loadFixture('sample'); + browser.driver.executeScript('history.back()'); + var expectedValue = browser.params.browser === 'safari' ? '{{ 7 * 6 }}' : ''; + expect(element(by.css('input')).getAttribute('value')).toEqual(expectedValue); + }); +}); From 4f44e018948c45bfb07f0170de4f703d22778d71 Mon Sep 17 00:00:00 2001 From: mohamed amr Date: Sun, 11 Sep 2016 20:31:14 +0200 Subject: [PATCH 0223/1173] fix($parse): treat falsy values as defined in assignment expressions Closes #14990 Closes #14994 --- src/ng/parse.js | 12 +++++--- test/ng/parseSpec.js | 66 ++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 74 insertions(+), 4 deletions(-) diff --git a/src/ng/parse.js b/src/ng/parse.js index 12682eaff889..3e2661e16f6d 100644 --- a/src/ng/parse.js +++ b/src/ng/parse.js @@ -944,7 +944,7 @@ ASTCompiler.prototype = { self.if_(self.stage === 'inputs' || 's', function() { if (create && create !== 1) { self.if_( - self.not(self.nonComputedMember('s', ast.name)), + self.isNull(self.nonComputedMember('s', ast.name)), self.lazyAssign(self.nonComputedMember('s', ast.name), '{}')); } self.assign(intoId, self.nonComputedMember('s', ast.name)); @@ -973,7 +973,7 @@ ASTCompiler.prototype = { } } else { if (create && create !== 1) { - self.if_(self.not(self.nonComputedMember(left, ast.property.name)), self.lazyAssign(self.nonComputedMember(left, ast.property.name), '{}')); + self.if_(self.isNull(self.nonComputedMember(left, ast.property.name)), self.lazyAssign(self.nonComputedMember(left, ast.property.name), '{}')); } expression = self.nonComputedMember(left, ast.property.name); self.assign(intoId, expression); @@ -1155,6 +1155,10 @@ ASTCompiler.prototype = { return '!(' + expression + ')'; }, + isNull: function(expression) { + return expression + '==null'; + }, + notNull: function(expression) { return expression + '!=null'; }, @@ -1546,7 +1550,7 @@ ASTInterpreter.prototype = { identifier: function(name, context, create, expression) { return function(scope, locals, assign, inputs) { var base = locals && (name in locals) ? locals : scope; - if (create && create !== 1 && base && !(base[name])) { + if (create && create !== 1 && base && base[name] == null) { base[name] = {}; } var value = base ? base[name] : undefined; @@ -1583,7 +1587,7 @@ ASTInterpreter.prototype = { return function(scope, locals, assign, inputs) { var lhs = left(scope, locals, assign, inputs); if (create && create !== 1) { - if (lhs && !(lhs[right])) { + if (lhs && lhs[right] == null) { lhs[right] = {}; } } diff --git a/test/ng/parseSpec.js b/test/ng/parseSpec.js index 9b4171077c03..6af4671b264f 100644 --- a/test/ng/parseSpec.js +++ b/test/ng/parseSpec.js @@ -3155,6 +3155,72 @@ describe('parser', function() { expect(isFunction(s.toString)).toBe(true); expect(l.toString).toBe(1); })); + + it('should overwrite undefined / null scope properties when assigning', inject(function($parse) { + var scope; + + scope = {}; + $parse('a.b = 1')(scope); + $parse('c["d"] = 2')(scope); + expect(scope).toEqual({a: {b: 1}, c: {d: 2}}); + + scope = {a: {}}; + $parse('a.b.c = 1')(scope); + $parse('a.c["d"] = 2')(scope); + expect(scope).toEqual({a: {b: {c: 1}, c: {d: 2}}}); + + scope = {a: undefined, c: undefined}; + $parse('a.b = 1')(scope); + $parse('c["d"] = 2')(scope); + expect(scope).toEqual({a: {b: 1}, c: {d: 2}}); + + scope = {a: {b: undefined, c: undefined}}; + $parse('a.b.c = 1')(scope); + $parse('a.c["d"] = 2')(scope); + expect(scope).toEqual({a: {b: {c: 1}, c: {d: 2}}}); + + scope = {a: null, c: null}; + $parse('a.b = 1')(scope); + $parse('c["d"] = 2')(scope); + expect(scope).toEqual({a: {b: 1}, c: {d: 2}}); + + scope = {a: {b: null, c: null}}; + $parse('a.b.c = 1')(scope); + $parse('a.c["d"] = 2')(scope); + expect(scope).toEqual({a: {b: {c: 1}, c: {d: 2}}}); + })); + + they('should not overwrite $prop scope properties when assigning', [0, false, '', NaN], + function(falsyValue) { + inject(function($parse) { + var scope; + + scope = {a: falsyValue, c: falsyValue}; + tryParseAndIgnoreException('a.b = 1'); + tryParseAndIgnoreException('c["d"] = 2'); + expect(scope).toEqual({a: falsyValue, c: falsyValue}); + + scope = {a: {b: falsyValue, c: falsyValue}}; + tryParseAndIgnoreException('a.b.c = 1'); + tryParseAndIgnoreException('a.c["d"] = 2'); + expect(scope).toEqual({a: {b: falsyValue, c: falsyValue}}); + + // Helpers + // + // Normally assigning property on a primitive should throw exception in strict mode + // and silently fail in non-strict mode, IE seems to always have the non-strict-mode behavior, + // so if we try to use 'expect(function() {$parse('a.b=1')({a:false});).toThrow()' for testing + // the test will fail in case of IE because it will not throw exception, and if we just use + // '$parse('a.b=1')({a:false})' the test will fail because it will throw exception in case of Chrome + // so we use tryParseAndIgnoreException helper to catch the exception silently for all cases. + // + function tryParseAndIgnoreException(expression) { + try { + $parse(expression)(scope); + } catch (error) {/* ignore exception */} + } + }); + }); }); describe('literal', function() { From 369fb7f4f73664bcdab0350701552d8bef6f605e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Go=C5=82e=CC=A8biowski?= Date: Sun, 9 Oct 2016 23:51:53 +0200 Subject: [PATCH 0224/1173] feat(jqLite): implement jqLite(f) as alias to jqLite(document).ready(f) jQuery has supported this form for a long time. As of jQuery 3.0 this form is the preferred one and all others are deprecated so jqLite(f) is now also supported. All internal invocations of jqLite(document).ready(f) (& equivalent) have been replaced by jqLite(f). Tests for these methods have been added as jqLite#ready had no explicit tests so far. --- docs/content/guide/bootstrap.ngdoc | 4 +-- src/angular.bind.js | 7 ++--- src/angular.suffix | 2 +- src/jqLite.js | 45 +++++++++++++++++------------- src/ngScenario/angular.suffix | 2 +- test/e2e/fixtures/ready/index.html | 13 +++++++++ test/e2e/fixtures/ready/script.js | 32 +++++++++++++++++++++ test/e2e/tests/ready.spec.js | 25 +++++++++++++++++ 8 files changed, 103 insertions(+), 27 deletions(-) create mode 100644 test/e2e/fixtures/ready/index.html create mode 100644 test/e2e/fixtures/ready/script.js create mode 100644 test/e2e/tests/ready.spec.js diff --git a/docs/content/guide/bootstrap.ngdoc b/docs/content/guide/bootstrap.ngdoc index f0a896baa1d4..15d4ae9a13af 100644 --- a/docs/content/guide/bootstrap.ngdoc +++ b/docs/content/guide/bootstrap.ngdoc @@ -115,7 +115,7 @@ Here is an example of manually initializing Angular: $scope.greetMe = 'World'; }]); - angular.element(document).ready(function() { + angular.element(function() { angular.bootstrap(document, ['myApp']); }); @@ -167,4 +167,4 @@ until `angular.resumeBootstrap()` is called. `angular.resumeBootstrap()` takes an optional array of modules that should be added to the original list of modules that the app was -about to be bootstrapped with. \ No newline at end of file +about to be bootstrapped with. diff --git a/src/angular.bind.js b/src/angular.bind.js index 45bcdecb7247..e23e8915a7e9 100644 --- a/src/angular.bind.js +++ b/src/angular.bind.js @@ -1,12 +1,11 @@ if (window.angular.bootstrap) { - //AngularJS is already loaded, so we can return here... + // AngularJS is already loaded, so we can return here... if (window.console) { console.log('WARNING: Tried to load angular more than once.'); } return; } -//try to bind to jquery now so that one can write jqLite(document).ready() -//but we will rebind on bootstrap again. +// try to bind to jquery now so that one can write jqLite(fn) +// but we will rebind on bootstrap again. bindJQuery(); - diff --git a/src/angular.suffix b/src/angular.suffix index 9cdd66db8a4b..fddb3d072ebe 100644 --- a/src/angular.suffix +++ b/src/angular.suffix @@ -1,4 +1,4 @@ - jqLite(window.document).ready(function() { + jqLite(function() { angularInit(window.document, bootstrap); }); diff --git a/src/jqLite.js b/src/jqLite.js index 92da9ef6fa65..fba31e738b8c 100644 --- a/src/jqLite.js +++ b/src/jqLite.js @@ -288,6 +288,8 @@ function JQLite(element) { if (argIsString) { jqLiteAddNodes(this, jqLiteParseHTML(element)); + } else if (isFunction(element)) { + jqLiteReady(element); } else { jqLiteAddNodes(this, element); } @@ -519,29 +521,34 @@ function jqLiteDocumentLoaded(action, win) { } } +function jqLiteReady(fn) { + var fired = false; + + function trigger() { + if (fired) return; + fired = true; + fn(); + } + + // check if document is already loaded + if (window.document.readyState === 'complete') { + window.setTimeout(fn); + } else { + // We can not use jqLite since we are not done loading and jQuery could be loaded later. + + // Works for modern browsers and IE9 + window.document.addEventListener('DOMContentLoaded', trigger); + + // Fallback to window.onload for others + window.addEventListener('load', trigger); + } +} + ////////////////////////////////////////// // Functions which are declared directly. ////////////////////////////////////////// var JQLitePrototype = JQLite.prototype = { - ready: function(fn) { - var fired = false; - - function trigger() { - if (fired) return; - fired = true; - fn(); - } - - // check if document is already loaded - if (window.document.readyState === 'complete') { - window.setTimeout(trigger); - } else { - this.on('DOMContentLoaded', trigger); // works for modern browsers and IE9 - // we can not use jqLite since we are not done loading and jQuery could be loaded later. - // eslint-disable-next-line new-cap - JQLite(window).on('load', trigger); // fallback to window.onload for others - } - }, + ready: jqLiteReady, toString: function() { var value = []; forEach(this, function(e) { value.push('' + e);}); diff --git a/src/ngScenario/angular.suffix b/src/ngScenario/angular.suffix index bb2bd6af2848..5c89e61036f3 100644 --- a/src/ngScenario/angular.suffix +++ b/src/ngScenario/angular.suffix @@ -14,7 +14,7 @@ angular.forEach(script.attributes, function(attr) { }); if (config.autotest) { - JQLite(window.document).ready(function() { + JQLite(function() { angular.scenario.setUpAndRun(config); }); } diff --git a/test/e2e/fixtures/ready/index.html b/test/e2e/fixtures/ready/index.html new file mode 100644 index 000000000000..732ce0690dc3 --- /dev/null +++ b/test/e2e/fixtures/ready/index.html @@ -0,0 +1,13 @@ + + + + {{beforeReady}} + {{afterReady}} + {{afterReadySync}} + {{afterReadyMethod}} + {{afterReadyMethodSync}} + + +
        This div is loaded after scripts.
        + + diff --git a/test/e2e/fixtures/ready/script.js b/test/e2e/fixtures/ready/script.js new file mode 100644 index 000000000000..77713e4606cd --- /dev/null +++ b/test/e2e/fixtures/ready/script.js @@ -0,0 +1,32 @@ +'use strict'; + +var beforeReady; +(function() { + var divAfterScripts = window.document.getElementById('div-after-scripts'); + beforeReady = divAfterScripts && divAfterScripts.textContent; +})(); + +var afterReady; +angular.element(function() { + var divAfterScripts = window.document.getElementById('div-after-scripts'); + afterReady = divAfterScripts && divAfterScripts.textContent; +}); + +var afterReadyMethod; +angular.element(window.document).ready(function() { + var divAfterScripts = window.document.getElementById('div-after-scripts'); + afterReadyMethod = divAfterScripts && divAfterScripts.textContent; +}); + +var afterReadySync = afterReady; +var afterReadyMethodSync = afterReadyMethod; + +angular + .module('test', []) + .run(function($rootScope) { + $rootScope.beforeReady = beforeReady; + $rootScope.afterReady = afterReady; + $rootScope.afterReadySync = afterReadySync; + $rootScope.afterReadyMethod = afterReadyMethod; + $rootScope.afterReadyMethodSync = afterReadyMethodSync; + }); diff --git a/test/e2e/tests/ready.spec.js b/test/e2e/tests/ready.spec.js new file mode 100644 index 000000000000..d2576b8c6734 --- /dev/null +++ b/test/e2e/tests/ready.spec.js @@ -0,0 +1,25 @@ +'use strict'; + +describe('Firing a callback on ready', function() { + it('should not have the div available immediately', function() { + loadFixture('ready'); + expect(element(by.className('before-ready')).getText()) + .toBe(''); + }); + + it('should wait for document ready', function() { + loadFixture('ready'); + expect(element(by.className('after-ready')).getText()) + .toBe('This div is loaded after scripts.'); + expect(element(by.className('after-ready-method')).getText()) + .toBe('This div is loaded after scripts.'); + }); + + it('should be asynchronous', function() { + loadFixture('ready'); + expect(element(by.className('after-ready-sync')).getText()) + .toBe(''); + expect(element(by.className('after-ready-method-sync')).getText()) + .toBe(''); + }); +}); From 8e82bf51b13c80bcba7195f649cff2445b9d641c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Go=C5=82e=CC=A8biowski?= Date: Sun, 9 Oct 2016 23:53:00 +0200 Subject: [PATCH 0225/1173] refactor(jqLite): deprecate jqLite#ready Use jqLite(fn) instead of jqLite(document).ready(fn). --- src/jqLite.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/jqLite.js b/src/jqLite.js index fba31e738b8c..0f87488bb2ab 100644 --- a/src/jqLite.js +++ b/src/jqLite.js @@ -76,7 +76,7 @@ * - [`parent()`](http://api.jquery.com/parent/) - Does not support selectors * - [`prepend()`](http://api.jquery.com/prepend/) * - [`prop()`](http://api.jquery.com/prop/) - * - [`ready()`](http://api.jquery.com/ready/) + * - [`ready()`](http://api.jquery.com/ready/) (_deprecated_, use `angular.element(callback)` instead of `angular.element(document).ready(callback)`) * - [`remove()`](http://api.jquery.com/remove/) * - [`removeAttr()`](http://api.jquery.com/removeAttr/) - Does not support multiple attributes * - [`removeClass()`](http://api.jquery.com/removeClass/) - Does not support a function as first argument From e008df6c8c1f2f7741618f5e57f3ebcbeebd9a15 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Go=C5=82e=CC=A8biowski?= Date: Wed, 12 Oct 2016 14:38:31 +0200 Subject: [PATCH 0226/1173] docs(jqLite): remove the removal plan info for bind/unbind We're not going to remove the aliases before jQuery does. --- src/jqLite.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/jqLite.js b/src/jqLite.js index 0f87488bb2ab..8a6410d781bd 100644 --- a/src/jqLite.js +++ b/src/jqLite.js @@ -56,7 +56,7 @@ * - [`after()`](http://api.jquery.com/after/) * - [`append()`](http://api.jquery.com/append/) * - [`attr()`](http://api.jquery.com/attr/) - Does not support functions as parameters - * - [`bind()`](http://api.jquery.com/bind/) (_deprecated_ - to be removed in 1.7.0, use [`on()`](http://api.jquery.com/on/)) - Does not support namespaces, selectors or eventData + * - [`bind()`](http://api.jquery.com/bind/) (_deprecated_, use [`on()`](http://api.jquery.com/on/)) - Does not support namespaces, selectors or eventData * - [`children()`](http://api.jquery.com/children/) - Does not support selectors * - [`clone()`](http://api.jquery.com/clone/) * - [`contents()`](http://api.jquery.com/contents/) @@ -85,7 +85,7 @@ * - [`text()`](http://api.jquery.com/text/) * - [`toggleClass()`](http://api.jquery.com/toggleClass/) - Does not support a function as first argument * - [`triggerHandler()`](http://api.jquery.com/triggerHandler/) - Passes a dummy event object to handlers - * - [`unbind()`](http://api.jquery.com/unbind/) (_deprecated_ - to be removed in 1.7.0, use [`off()`](http://api.jquery.com/off/)) - Does not support namespaces or event object as parameter + * - [`unbind()`](http://api.jquery.com/unbind/) (_deprecated_, use [`off()`](http://api.jquery.com/off/)) - Does not support namespaces or event object as parameter * - [`val()`](http://api.jquery.com/val/) * - [`wrap()`](http://api.jquery.com/wrap/) * From beab3baec3728cd4034df4bbccdf52af2b7d8b64 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Go=C5=82e=CC=A8biowski?= Date: Wed, 12 Oct 2016 14:41:53 +0200 Subject: [PATCH 0227/1173] chore(jqLite): remove the ready handlers instead of setting a flag This change aligns jqLite with the jQuery implementation. Closes #15237 --- src/jqLite.js | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/src/jqLite.js b/src/jqLite.js index 8a6410d781bd..df8565e90ad2 100644 --- a/src/jqLite.js +++ b/src/jqLite.js @@ -522,11 +522,9 @@ function jqLiteDocumentLoaded(action, win) { } function jqLiteReady(fn) { - var fired = false; - function trigger() { - if (fired) return; - fired = true; + window.document.removeEventListener('DOMContentLoaded', trigger); + window.removeEventListener('load', trigger); fn(); } From 73050cdda04675bfa6705dc841ddbbb6919eb048 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Go=C5=82e=CC=A8biowski?= Date: Wed, 12 Oct 2016 14:23:14 +0200 Subject: [PATCH 0228/1173] fix(jqLite): align jqLite camelCasing logic with JQuery jqLite needs camelCase for it's css method; it should only convert one dash followed by a lowercase letter to an uppercase one; it shouldn't touch underscores, colons or collapse multiple dashes into one. This is behavior of jQuery 3 as well. Also, jqLite's css camelCasing logic was put in a separate function and refactored: now the properties starting from an uppercase letter are used by default (i.e. Webkit, not webkit) and the only exception is for the -ms- prefix that is converted to ms, not Ms. This makes the logic clearer as we're just always changing a dash followed by a lowercase letter by an uppercase one; this is also how it works in jQuery. The camelCasing for the $compile and $sce services retains the previous behaviour. Ref #15126 Fix #7744 BREAKING CHANGE: before, when Angular was used without jQuery, the key passed to the css method was more heavily camelCased; now only a single (!) hyphen followed by a lowercase letter is getting transformed. This also affects APIs that rely on the css method, like ngStyle. If you use Angular with jQuery, it already behaved in this way so no changes are needed on your part. To migrate the code follow the example below: Before: HTML: // All five versions used to be equivalent.
        JS: // All five versions used to be equivalent. elem.css('background_color', 'blue'); elem.css('background:color', 'blue'); elem.css('background-color', 'blue'); elem.css('background--color', 'blue'); elem.css('backgroundColor', 'blue'); // All five versions used to be equivalent. var bgColor = elem.css('background_color'); var bgColor = elem.css('background:color'); var bgColor = elem.css('background-color'); var bgColor = elem.css('background--color'); var bgColor = elem.css('backgroundColor'); After: HTML: // Previous five versions are no longer equivalent but these two still are.
        JS: // Previous five versions are no longer equivalent but these two still are. elem.css('background-color', 'blue'); elem.css('backgroundColor', 'blue'); // Previous five versions are no longer equivalent but these two still are. var bgColor = elem.css('background-color'); var bgColor = elem.css('backgroundColor'); --- src/.eslintrc.json | 2 +- src/jqLite.js | 31 +++++++---- src/ng/compile.js | 6 +- src/ng/sce.js | 13 ++++- test/.eslintrc.json | 3 +- test/jqLiteSpec.js | 133 ++++++++++++++++++++++++++++++++++++++++---- 6 files changed, 159 insertions(+), 29 deletions(-) diff --git a/src/.eslintrc.json b/src/.eslintrc.json index a5d959535803..6022ac25baa9 100644 --- a/src/.eslintrc.json +++ b/src/.eslintrc.json @@ -123,7 +123,7 @@ "BOOLEAN_ATTR": false, "ALIASED_ATTR": false, "jqNextId": false, - "camelCase": false, + "fnCamelCaseReplace": false, "jqLitePatchJQueryRemove": false, "JQLite": false, "jqLiteClone": false, diff --git a/src/jqLite.js b/src/jqLite.js index df8565e90ad2..4b5c58304fce 100644 --- a/src/jqLite.js +++ b/src/jqLite.js @@ -136,22 +136,31 @@ JQLite._data = function(node) { function jqNextId() { return ++jqId; } -var SPECIAL_CHARS_REGEXP = /([:\-_]+(.))/g; -var MOZ_HACK_REGEXP = /^moz([A-Z])/; +var DASH_LOWERCASE_REGEXP = /-([a-z])/g; +var MS_HACK_REGEXP = /^-ms-/; var MOUSE_EVENT_MAP = { mouseleave: 'mouseout', mouseenter: 'mouseover' }; var jqLiteMinErr = minErr('jqLite'); /** - * Converts snake_case to camelCase. - * Also there is special case for Moz prefix starting with upper case letter. + * Converts kebab-case to camelCase. + * There is also a special case for the ms prefix starting with a lowercase letter. * @param name Name to normalize */ -function camelCase(name) { - return name. - replace(SPECIAL_CHARS_REGEXP, function(_, separator, letter, offset) { - return offset ? letter.toUpperCase() : letter; - }). - replace(MOZ_HACK_REGEXP, 'Moz$1'); +function cssKebabToCamel(name) { + return kebabToCamel(name.replace(MS_HACK_REGEXP, 'ms-')); +} + +function fnCamelCaseReplace(all, letter) { + return letter.toUpperCase(); +} + +/** + * Converts kebab-case to camelCase. + * @param name Name to normalize + */ +function kebabToCamel(name) { + return name + .replace(DASH_LOWERCASE_REGEXP, fnCamelCaseReplace); } var SINGLE_TAG_REGEXP = /^<([\w-]+)\s*\/?>(?:<\/\1>|)$/; @@ -633,7 +642,7 @@ forEach({ hasClass: jqLiteHasClass, css: function(element, name, value) { - name = camelCase(name); + name = cssKebabToCamel(name); if (isDefined(value)) { element.style[name] = value; diff --git a/src/ng/compile.js b/src/ng/compile.js index 6c9cf801f8bc..bc1cae5bfca6 100644 --- a/src/ng/compile.js +++ b/src/ng/compile.js @@ -3590,12 +3590,16 @@ SimpleChange.prototype.isFirstChange = function() { return this.previousValue == var PREFIX_REGEXP = /^((?:x|data)[:\-_])/i; +var SPECIAL_CHARS_REGEXP = /[:\-_]+(.)/g; + /** * Converts all accepted directives format into proper directive name. * @param name Name to normalize */ function directiveNormalize(name) { - return camelCase(name.replace(PREFIX_REGEXP, '')); + return name + .replace(PREFIX_REGEXP, '') + .replace(SPECIAL_CHARS_REGEXP, fnCamelCaseReplace); } /** diff --git a/src/ng/sce.js b/src/ng/sce.js index 074c13d84579..0201656c6ea7 100644 --- a/src/ng/sce.js +++ b/src/ng/sce.js @@ -27,6 +27,13 @@ var SCE_CONTEXTS = { // Helper functions follow. +var UNDERSCORE_LOWERCASE_REGEXP = /_([a-z])/g; + +function snakeToCamel(name) { + return name + .replace(UNDERSCORE_LOWERCASE_REGEXP, fnCamelCaseReplace); +} + function adjustMatcher(matcher) { if (matcher === 'self') { return matcher; @@ -1054,13 +1061,13 @@ function $SceProvider() { forEach(SCE_CONTEXTS, function(enumValue, name) { var lName = lowercase(name); - sce[camelCase('parse_as_' + lName)] = function(expr) { + sce[snakeToCamel('parse_as_' + lName)] = function(expr) { return parse(enumValue, expr); }; - sce[camelCase('get_trusted_' + lName)] = function(value) { + sce[snakeToCamel('get_trusted_' + lName)] = function(value) { return getTrusted(enumValue, value); }; - sce[camelCase('trust_as_' + lName)] = function(value) { + sce[snakeToCamel('trust_as_' + lName)] = function(value) { return trustAs(enumValue, value); }; }); diff --git a/test/.eslintrc.json b/test/.eslintrc.json index ca882335b492..026e7f2ed18f 100644 --- a/test/.eslintrc.json +++ b/test/.eslintrc.json @@ -118,7 +118,8 @@ /* jqLite.js */ "BOOLEAN_ATTR": false, "jqNextId": false, - "camelCase": false, + "kebabToCamel": false, + "fnCamelCaseReplace": false, "jqLitePatchJQueryRemove": false, "JQLite": false, "jqLiteClone": false, diff --git a/test/jqLiteSpec.js b/test/jqLiteSpec.js index f4a3fbfc16c5..0b54c233d43c 100644 --- a/test/jqLiteSpec.js +++ b/test/jqLiteSpec.js @@ -1055,6 +1055,105 @@ describe('jqLite', function() { expect(jqA.css('z-index')).toBeOneOf('7', 7); expect(jqA.css('zIndex')).toBeOneOf('7', 7); }); + + it('should leave non-dashed strings alone', function() { + var jqA = jqLite(a); + + jqA.css('foo', 'foo'); + jqA.css('fooBar', 'bar'); + + expect(a.style.foo).toBe('foo'); + expect(a.style.fooBar).toBe('bar'); + }); + + it('should convert dash-separated strings to camelCase', function() { + var jqA = jqLite(a); + + jqA.css('foo-bar', 'foo'); + jqA.css('foo-bar-baz', 'bar'); + jqA.css('foo:bar_baz', 'baz'); + + expect(a.style.fooBar).toBe('foo'); + expect(a.style.fooBarBaz).toBe('bar'); + expect(a.style['foo:bar_baz']).toBe('baz'); + }); + + it('should convert leading dashes followed by a lowercase letter', function() { + var jqA = jqLite(a); + + jqA.css('-foo-bar', 'foo'); + + expect(a.style.FooBar).toBe('foo'); + }); + + it('should not convert slashes followed by a non-letter', function() { + // jQuery 2.x had different behavior; skip the test. + if (isJQuery2x()) return; + + var jqA = jqLite(a); + + jqA.css('foo-42- -a-B', 'foo'); + + expect(a.style['foo-42- A-B']).toBe('foo'); + }); + + it('should convert the -ms- prefix to ms instead of Ms', function() { + var jqA = jqLite(a); + + jqA.css('-ms-foo-bar', 'foo'); + jqA.css('-moz-foo-bar', 'bar'); + jqA.css('-webkit-foo-bar', 'baz'); + + expect(a.style.msFooBar).toBe('foo'); + expect(a.style.MozFooBar).toBe('bar'); + expect(a.style.WebkitFooBar).toBe('baz'); + }); + + it('should not collapse sequences of dashes', function() { + var jqA = jqLite(a); + + jqA.css('foo---bar-baz--qaz', 'foo'); + + expect(a.style['foo--BarBaz-Qaz']).toBe('foo'); + }); + + + it('should read vendor prefixes with the special -ms- exception', function() { + // jQuery uses getComputedStyle() in a css getter so these tests would fail there. + if (!_jqLiteMode) return; + + var jqA = jqLite(a); + + a.style.WebkitFooBar = 'webkit-uppercase'; + a.style.webkitFooBar = 'webkit-lowercase'; + + a.style.MozFooBaz = 'moz-uppercase'; + a.style.mozFooBaz = 'moz-lowercase'; + + a.style.MsFooQaz = 'ms-uppercase'; + a.style.msFooQaz = 'ms-lowercase'; + + expect(jqA.css('-webkit-foo-bar')).toBe('webkit-uppercase'); + expect(jqA.css('-moz-foo-baz')).toBe('moz-uppercase'); + expect(jqA.css('-ms-foo-qaz')).toBe('ms-lowercase'); + }); + + it('should write vendor prefixes with the special -ms- exception', function() { + var jqA = jqLite(a); + + jqA.css('-webkit-foo-bar', 'webkit'); + jqA.css('-moz-foo-baz', 'moz'); + jqA.css('-ms-foo-qaz', 'ms'); + + expect(a.style.WebkitFooBar).toBe('webkit'); + expect(a.style.webkitFooBar).not.toBeDefined(); + + expect(a.style.MozFooBaz).toBe('moz'); + expect(a.style.mozFooBaz).not.toBeDefined(); + + expect(a.style.MsFooQaz).not.toBeDefined(); + expect(a.style.msFooQaz).toBe('ms'); + }); }); @@ -2267,25 +2366,35 @@ describe('jqLite', function() { }); - describe('camelCase', function() { + describe('kebabToCamel', function() { it('should leave non-dashed strings alone', function() { - expect(camelCase('foo')).toBe('foo'); - expect(camelCase('')).toBe(''); - expect(camelCase('fooBar')).toBe('fooBar'); + expect(kebabToCamel('foo')).toBe('foo'); + expect(kebabToCamel('')).toBe(''); + expect(kebabToCamel('fooBar')).toBe('fooBar'); + }); + + it('should convert dash-separated strings to camelCase', function() { + expect(kebabToCamel('foo-bar')).toBe('fooBar'); + expect(kebabToCamel('foo-bar-baz')).toBe('fooBarBaz'); + expect(kebabToCamel('foo:bar_baz')).toBe('foo:bar_baz'); }); + it('should convert leading dashes followed by a lowercase letter', function() { + expect(kebabToCamel('-foo-bar')).toBe('FooBar'); + }); - it('should covert dash-separated strings to camelCase', function() { - expect(camelCase('foo-bar')).toBe('fooBar'); - expect(camelCase('foo-bar-baz')).toBe('fooBarBaz'); - expect(camelCase('foo:bar_baz')).toBe('fooBarBaz'); + it('should not convert dashes followed by a non-letter', function() { + expect(kebabToCamel('foo-42- -a-B')).toBe('foo-42- A-B'); }); + it('should not convert browser specific css properties in a special way', function() { + expect(kebabToCamel('-ms-foo-bar')).toBe('MsFooBar'); + expect(kebabToCamel('-moz-foo-bar')).toBe('MozFooBar'); + expect(kebabToCamel('-webkit-foo-bar')).toBe('WebkitFooBar'); + }); - it('should covert browser specific css properties', function() { - expect(camelCase('-moz-foo-bar')).toBe('MozFooBar'); - expect(camelCase('-webkit-foo-bar')).toBe('webkitFooBar'); - expect(camelCase('-webkit-foo-bar')).toBe('webkitFooBar'); + it('should not collapse sequences of dashes', function() { + expect(kebabToCamel('foo---bar-baz--qaz')).toBe('foo--BarBaz-Qaz'); }); }); From fc0c11db845d53061430b7f05e773dcb3fb5b860 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Go=C5=82e=CC=A8biowski?= Date: Mon, 10 Oct 2016 01:56:28 +0200 Subject: [PATCH 0229/1173] fix(jqLite): camelCase keys in jqLite#data This change aligns jqLite with jQuery 3. The relevant bit of jQuery code is https://github.com/jquery/jquery/blob/3.1.1/src/data/Data.js Close #15126 BREAKING CHANGE: Previously, keys passed to the data method were left untouched. Now they are internally camelCased similarly to how jQuery handles it, i.e. only single (!) hyphens followed by a lowercase letter get converted to an uppercase letter. This means keys `a-b` and `aB` represent the same data piece; writing to one of them will also be reflected if you ask for the other one. If you use Angular with jQuery, it already behaved in this way so no changes are required on your part. To migrate the code follow the examples below: BEFORE: /* 1 */ elem.data('my-key', 2); elem.data('myKey', 3); /* 2 */ elem.data('foo-bar', 42); elem.data()['foo-bar']; // 42 elem.data()['fooBar']; // undefined /* 3 */ elem.data()['foo-bar'] = 1; elem.data()['fooBar'] = 2; elem.data()['foo-bar']; // 1 AFTER: /* 1 */ // Rename one of the keys as they would now map to the same data slot. elem.data('my-key', 2); elem.data('my-key2', 3); /* 2 */ elem.data('foo-bar', 42); elem.data()['foo-bar']; // undefined elem.data()['fooBar']; // 42 /* 3 */ elem.data()['foo-bar'] = 1; elem.data()['fooBar'] = 2; elem.data()['foo-bar']; // 2 --- src/jqLite.js | 9 ++++++--- test/jqLiteSpec.js | 33 +++++++++++++++++++++++++++++++++ 2 files changed, 39 insertions(+), 3 deletions(-) diff --git a/src/jqLite.js b/src/jqLite.js index 4b5c58304fce..e882407be63f 100644 --- a/src/jqLite.js +++ b/src/jqLite.js @@ -394,6 +394,7 @@ function jqLiteExpandoStore(element, createIfNecessary) { function jqLiteData(element, key, value) { if (jqLiteAcceptsData(element)) { + var prop; var isSimpleSetter = isDefined(value); var isSimpleGetter = !isSimpleSetter && key && !isObject(key); @@ -402,16 +403,18 @@ function jqLiteData(element, key, value) { var data = expandoStore && expandoStore.data; if (isSimpleSetter) { // data('key', value) - data[key] = value; + data[kebabToCamel(key)] = value; } else { if (massGetter) { // data() return data; } else { if (isSimpleGetter) { // data('key') // don't force creation of expandoStore if it doesn't exist yet - return data && data[key]; + return data && data[kebabToCamel(key)]; } else { // mass-setter: data({key1: val1, key2: val2}) - extend(data, key); + for (prop in key) { + data[kebabToCamel(prop)] = key[prop]; + } } } } diff --git a/test/jqLiteSpec.js b/test/jqLiteSpec.js index 0b54c233d43c..886ca7c2cd42 100644 --- a/test/jqLiteSpec.js +++ b/test/jqLiteSpec.js @@ -594,6 +594,39 @@ describe('jqLite', function() { }).not.toThrow(); }); }); + + describe('camelCasing keys', function() { + // jQuery 2.x has different behavior; skip the tests. + if (isJQuery2x()) return; + + it('should camelCase the key in a setter', function() { + var element = jqLite(a); + + element.data('a-B-c-d-42--e', 'z-x'); + expect(element.data()).toEqual({'a-BCD-42-E': 'z-x'}); + }); + + it('should camelCase the key in a getter', function() { + var element = jqLite(a); + + element.data()['a-BCD-42-E'] = 'x-c'; + expect(element.data('a-B-c-d-42--e')).toBe('x-c'); + }); + + it('should camelCase the key in a mass setter', function() { + var element = jqLite(a); + + element.data({'a-B-c-d-42--e': 'c-v', 'r-t-v': 42}); + expect(element.data()).toEqual({'a-BCD-42-E': 'c-v', 'rTV': 42}); + }); + + it('should ignore non-camelCase keys in the data in a getter', function() { + var element = jqLite(a); + + element.data()['a-b'] = 'b-n'; + expect(element.data('a-b')).toBe(undefined); + }); + }); }); From c22615cbfbaa7d1712e79b6bf2ace6eb41313bac Mon Sep 17 00:00:00 2001 From: Martin Staffa Date: Fri, 14 Oct 2016 11:39:21 +0200 Subject: [PATCH 0230/1173] refactor(compileSpec): make tests consistent PR (#15141) --- test/ng/compileSpec.js | 206 ++++++++++++++--------------------------- 1 file changed, 72 insertions(+), 134 deletions(-) diff --git a/test/ng/compileSpec.js b/test/ng/compileSpec.js index 1786d3cd603b..544baf8a74ca 100755 --- a/test/ng/compileSpec.js +++ b/test/ng/compileSpec.js @@ -1201,41 +1201,52 @@ describe('$compile', function() { }); }); - it('should fail if replacing and template doesn\'t have a single root element', function() { - module(function() { - directive('noRootElem', function() { - return { - replace: true, - template: 'dada' - }; - }); - directive('multiRootElem', function() { - return { - replace: true, - template: '
        ' - }; - }); - directive('singleRootWithWhiteSpace', function() { + describe('replace and not exactly one root element', function() { + var templateVar; + + beforeEach(module(function() { + directive('template', function() { return { replace: true, - template: '
        \n' + template: function() { + return templateVar; + } }; }); - }); + })); - inject(function($compile) { - expect(function() { - $compile('

        '); - }).toThrowMinErr('$compile', 'tplrt', 'Template for directive \'noRootElem\' must have exactly one root element. '); + they('should throw if: $prop', + { + 'no root element': 'dada', + 'multiple root elements': '
        ' + }, function(directiveTemplate) { - expect(function() { - $compile('

        '); - }).toThrowMinErr('$compile', 'tplrt', 'Template for directive \'multiRootElem\' must have exactly one root element. '); + inject(function($compile) { + templateVar = directiveTemplate; + expect(function() { + $compile('

        '); + }).toThrowMinErr('$compile', 'tplrt', + 'Template for directive \'template\' must have exactly one root element.' + ); + }); + }); - // ws is ok - expect(function() { - $compile('

        '); - }).not.toThrow(); + they('should not throw if the root element is accompanied by: $prop', + { + 'whitespace': '
        Hello World!
        \n', + 'comments': '
        Hello World!
        \n', + 'comments + whitespace': '
        Hello World!
        \n' + }, function(directiveTemplate) { + + inject(function($compile, $rootScope) { + templateVar = directiveTemplate; + var element; + expect(function() { + element = $compile('

        ')($rootScope); + }).not.toThrow(); + expect(element.length).toBe(1); + expect(element.text()).toBe('Hello World!'); + }); }); }); @@ -1348,38 +1359,6 @@ describe('$compile', function() { }); } - it('should ignore comment nodes when replacing with a template', function() { - module(function() { - directive('replaceWithComments', valueFn({ - replace: true, - template: '

        Hello, world!

        ' - })); - }); - inject(function($compile, $rootScope) { - expect(function() { - element = $compile('
        ')($rootScope); - }).not.toThrow(); - expect(element.find('p').length).toBe(1); - expect(element.find('p').text()).toBe('Hello, world!'); - }); - }); - - it('should ignore whitespace betwee comment and root node when replacing with a template', function() { - module(function() { - directive('replaceWithWhitespace', valueFn({ - replace: true, - template: '

        Hello, world!

        ' - })); - }); - inject(function($compile, $rootScope) { - expect(function() { - element = $compile('
        ')($rootScope); - }).not.toThrow(); - expect(element.find('p').length).toBe(1); - expect(element.find('p').text()).toBe('Hello, world!'); - }); - }); - it('should keep prototype properties on directive', function() { module(function() { function DirectiveClass() { @@ -2078,10 +2057,9 @@ describe('$compile', function() { } )); + describe('replace and not exactly one root element', function() { - it('should fail if replacing and template doesn\'t have a single root element', function() { - module(function($exceptionHandlerProvider) { - $exceptionHandlerProvider.mode('log'); + beforeEach(module(function() { directive('template', function() { return { @@ -2089,46 +2067,45 @@ describe('$compile', function() { templateUrl: 'template.html' }; }); - }); + })); - inject(function($compile, $templateCache, $rootScope, $exceptionHandler) { - // no root element - $templateCache.put('template.html', 'dada'); - $compile('

        '); - $rootScope.$digest(); - expect($exceptionHandler.errors.pop()).toEqualMinErr('$compile', 'tplrt', - 'Template for directive \'template\' must have exactly one root element. ' + - 'template.html'); + they('should throw if: $prop', + { + 'no root element': 'dada', + 'multiple root elements': '
        ' + }, function(directiveTemplate) { - // multi root - $templateCache.put('template.html', '
        '); - $compile('

        '); - $rootScope.$digest(); - expect($exceptionHandler.errors.pop()).toEqualMinErr('$compile', 'tplrt', - 'Template for directive \'template\' must have exactly one root element. ' + - 'template.html'); + inject(function($compile, $templateCache, $rootScope, $exceptionHandler) { + $templateCache.put('template.html', directiveTemplate); + $compile('

        ')($rootScope); + $rootScope.$digest(); - // ws is ok - $templateCache.put('template.html', '
        \n'); - $compile('

        '); - $rootScope.$apply(); - expect($exceptionHandler.errors).toEqual([]); + expect($exceptionHandler.errors.pop()).toEqualMinErr('$compile', 'tplrt', + 'Template for directive \'template\' must have exactly one root element. ' + + 'template.html' + ); + }); + }); - // comments are ok - $templateCache.put('template.html', '
        \n'); - $compile('

        '); - $rootScope.$apply(); - expect($exceptionHandler.errors).toEqual([]); + they('should not throw if the root element is accompanied by: $prop', + { + 'whitespace': '
        Hello World!
        \n', + 'comments': '
        Hello World!
        \n', + 'comments + whitespace': '
        Hello World!
        \n' + }, function(directiveTemplate) { - // white space around comments is ok - $templateCache.put('template.html', '
        \n'); - $compile('

        '); - $rootScope.$apply(); - expect($exceptionHandler.errors).toEqual([]); + inject(function($compile, $templateCache, $rootScope) { + $templateCache.put('template.html', directiveTemplate); + element = $compile('

        ')($rootScope); + expect(function() { + $rootScope.$digest(); + }).not.toThrow(); + expect(element.length).toBe(1); + expect(element.text()).toBe('Hello World!'); + }); }); }); - it('should resume delayed compilation without duplicates when in a repeater', function() { // this is a test for a regression // scope creation, isolate watcher setup, controller instantiation, etc should happen @@ -2317,45 +2294,6 @@ describe('$compile', function() { }); } - it('should ignore comment nodes when replacing with a templateUrl', function() { - module(function() { - directive('replaceWithComments', valueFn({ - replace: true, - templateUrl: 'templateWithComments.html' - })); - }); - inject(function($compile, $rootScope, $httpBackend) { - $httpBackend.whenGET('templateWithComments.html'). - respond('

        Hello, world!

        '); - expect(function() { - element = $compile('
        ')($rootScope); - }).not.toThrow(); - $httpBackend.flush(); - expect(element.find('p').length).toBe(1); - expect(element.find('p').text()).toBe('Hello, world!'); - }); - }); - - it('should ignore whitespace between comment and root node when replacing with a templateUrl', function() { - module(function() { - directive('replaceWithWhitespace', valueFn({ - replace: true, - templateUrl: 'templateWithWhitespace.html' - })); - }); - inject(function($compile, $rootScope, $httpBackend) { - $httpBackend.whenGET('templateWithWhitespace.html'). - respond('

        Hello, world!

        '); - expect(function() { - element = $compile('
        ')($rootScope); - }).not.toThrow(); - $httpBackend.flush(); - expect(element.find('p').length).toBe(1); - expect(element.find('p').text()).toBe('Hello, world!'); - }); - }); - - it('should keep prototype properties on sync version of async directive', function() { module(function() { function DirectiveClass() { From 406c1b094bc0a8a79b06f0d5f0cecdfb9f6087b0 Mon Sep 17 00:00:00 2001 From: Georgii Dolzhykov Date: Thu, 13 Oct 2016 15:23:18 +0300 Subject: [PATCH 0231/1173] docs($rootScope.Scope): grammar Closes #15263 --- src/ng/rootScope.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/ng/rootScope.js b/src/ng/rootScope.js index 7731c646dfee..618c7b93872c 100644 --- a/src/ng/rootScope.js +++ b/src/ng/rootScope.js @@ -436,8 +436,8 @@ function $RootScopeProvider() { * A variant of {@link ng.$rootScope.Scope#$watch $watch()} where it watches an array of `watchExpressions`. * If any one expression in the collection changes the `listener` is executed. * - * - The items in the `watchExpressions` array are observed via standard $watch operation and are examined on every - * call to $digest() to see if any items changes. + * - The items in the `watchExpressions` array are observed via the standard `$watch` operation. Their return + * values are examined for changes on every call to `$digest`. * - The `listener` is called whenever any expression in the `watchExpressions` array changes. * * @param {Array.} watchExpressions Array of expressions that will be individually From b8c8262808f2e1527f5e7607b40765efee71c975 Mon Sep 17 00:00:00 2001 From: Venkat Ganesan Date: Sun, 16 Oct 2016 20:34:22 -0700 Subject: [PATCH 0232/1173] docs(input[checkbox]): mention `ngChecked` Closes #14465 Closes #15277 --- src/ng/directive/input.js | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/ng/directive/input.js b/src/ng/directive/input.js index 7e26ca16f6d1..47a0fa8db508 100644 --- a/src/ng/directive/input.js +++ b/src/ng/directive/input.js @@ -1098,6 +1098,9 @@ var inputType = { * Can be interpolated. * @param {string=} ngChange Angular expression to be executed when the ngModel value changes due * to user interaction with the input element. + * @param {expression=} ngChecked If the expression is truthy, then the `checked` attribute will be set on the + * element. **Note** : `ngChecked` should not be used alongside `ngModel`. + * Checkout {@link ng.directive:ngChecked ngChecked} for usage. * * @example From aa6a80618d1e191501488f50b4e21b43f63eabdf Mon Sep 17 00:00:00 2001 From: Georgios Kalpakas Date: Sun, 16 Oct 2016 14:14:16 +0300 Subject: [PATCH 0233/1173] chore(tutorial): make diagram images responsive Fixes angular/angular-phonecat#376 Closes #15275 --- docs/app/assets/css/docs.css | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/app/assets/css/docs.css b/docs/app/assets/css/docs.css index eb4fa813086e..c9b51256876e 100644 --- a/docs/app/assets/css/docs.css +++ b/docs/app/assets/css/docs.css @@ -650,6 +650,7 @@ ul.events > li { .diagram { margin-bottom: 10px; margin-top: 30px; + max-width: 100%; } @media only screen and (min-width: 769px) and (max-width: 991px) { From 705afcd160c8428133b36f2cd63db305dc52f2d7 Mon Sep 17 00:00:00 2001 From: Martin Staffa Date: Mon, 17 Oct 2016 12:21:29 +0200 Subject: [PATCH 0234/1173] fix($location): prevent infinite digest with IDN urls in Edge MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Internationalized Domain Urls, for example urls with Umlaut (Ä, Ö, Ü) cause infinite digest in Edge 38.14393.0.0 because lastIndexOf doesn't work correctly in this version when the search string is the same as the haystack string. The patch uses an implementation based on core.js: https://github.com/zloirock/core-js/blob/v2.4.1/modules/es6.string.starts-with.js#L16 Edge Bug: https://developer.microsoft.com/en-us/microsoft-edge/platform/issues/9271625/ Fixes #15217 PR #15235 --- src/ng/location.js | 4 ++-- test/ng/locationSpec.js | 10 +++++++++- 2 files changed, 11 insertions(+), 3 deletions(-) diff --git a/src/ng/location.js b/src/ng/location.js index 9de7702d0194..53a20cda62f0 100644 --- a/src/ng/location.js +++ b/src/ng/location.js @@ -48,8 +48,8 @@ function parseAppUrl(relativeUrl, locationObj) { } } -function startsWith(haystack, needle) { - return haystack.lastIndexOf(needle, 0) === 0; +function startsWith(str, search) { + return str.slice(0, search.length) === search; } /** diff --git a/test/ng/locationSpec.js b/test/ng/locationSpec.js index 2692d2cccc35..21e171198f7b 100644 --- a/test/ng/locationSpec.js +++ b/test/ng/locationSpec.js @@ -2450,10 +2450,11 @@ describe('$location', function() { describe('LocationHtml5Url', function() { - var locationUrl, locationIndexUrl; + var locationUrl, locationUmlautUrl, locationIndexUrl; beforeEach(function() { locationUrl = new LocationHtml5Url('http://server/pre/', 'http://server/pre/', 'http://server/pre/path'); + locationUmlautUrl = new LocationHtml5Url('http://xn--srver-gra/pre/', 'http://xn--srver-gra/pre/', 'http://xn--srver-gra/pre/path'); locationIndexUrl = new LocationHtml5Url('http://server/pre/index.html', 'http://server/pre/', 'http://server/pre/path'); }); @@ -2465,6 +2466,13 @@ describe('$location', function() { // Note: relies on the previous state! expect(parseLinkAndReturn(locationUrl, 'someIgnoredAbsoluteHref', '#test')).toEqual('http://server/pre/otherPath#test'); + expect(parseLinkAndReturn(locationUmlautUrl, 'http://other/')).toEqual(undefined); + expect(parseLinkAndReturn(locationUmlautUrl, 'http://xn--srver-gra/pre')).toEqual('http://xn--srver-gra/pre/'); + expect(parseLinkAndReturn(locationUmlautUrl, 'http://xn--srver-gra/pre/')).toEqual('http://xn--srver-gra/pre/'); + expect(parseLinkAndReturn(locationUmlautUrl, 'http://xn--srver-gra/pre/otherPath')).toEqual('http://xn--srver-gra/pre/otherPath'); + // Note: relies on the previous state! + expect(parseLinkAndReturn(locationUmlautUrl, 'someIgnoredAbsoluteHref', '#test')).toEqual('http://xn--srver-gra/pre/otherPath#test'); + expect(parseLinkAndReturn(locationIndexUrl, 'http://server/pre')).toEqual('http://server/pre/'); expect(parseLinkAndReturn(locationIndexUrl, 'http://server/pre/')).toEqual('http://server/pre/'); expect(parseLinkAndReturn(locationIndexUrl, 'http://server/pre/otherPath')).toEqual('http://server/pre/otherPath'); From db02008fe274410d2b8e2715fa4a3c8c9b2ce809 Mon Sep 17 00:00:00 2001 From: Martin Staffa Date: Mon, 17 Oct 2016 19:31:39 +0200 Subject: [PATCH 0235/1173] chore(doc-gen, docs-app): create plnkr examples with correct Angular version When the docs are based on the snapshot, the plnkr examples must use the snapshot files from code.angularjs.org Closes #15267 PR (#15269) --- docs/app/src/examples.js | 5 +-- docs/config/index.js | 7 +++- docs/config/services/deployments/plnkr.js | 49 +++++++++++++++++++++++ 3 files changed, 56 insertions(+), 5 deletions(-) create mode 100644 docs/config/services/deployments/plnkr.js diff --git a/docs/app/src/examples.js b/docs/app/src/examples.js index fca74d9fc21a..a5434f0364f7 100644 --- a/docs/app/src/examples.js +++ b/docs/app/src/examples.js @@ -181,9 +181,8 @@ angular.module('examples', []) filePromises.push($http.get(exampleFolder + '/' + filename, { transformResponse: [] }) .then(function(response) { - // The manifests provide the production index file but Plunkr wants - // a straight index.html - if (filename === 'index-production.html') { + // Plunkr needs an index file that's simply named index.html + if (filename === 'index-plnkr.html') { filename = 'index.html'; } diff --git a/docs/config/index.js b/docs/config/index.js index 4ec1423c65a0..c4662d3197eb 100644 --- a/docs/config/index.js +++ b/docs/config/index.js @@ -23,6 +23,7 @@ module.exports = new Package('angularjs', [ .factory(require('./services/deployments/default')) .factory(require('./services/deployments/jquery')) .factory(require('./services/deployments/production')) +.factory(require('./services/deployments/plnkr')) .factory(require('./inline-tag-defs/type')) @@ -150,7 +151,8 @@ module.exports = new Package('angularjs', [ generateProtractorTestsProcessor, generateExamplesProcessor, debugDeployment, defaultDeployment, - jqueryDeployment, productionDeployment) { + jqueryDeployment, productionDeployment, + plnkrDeployment) { generateIndexPagesProcessor.deployments = [ debugDeployment, @@ -170,7 +172,8 @@ module.exports = new Package('angularjs', [ debugDeployment, defaultDeployment, jqueryDeployment, - productionDeployment + productionDeployment, + plnkrDeployment ]; }) diff --git a/docs/config/services/deployments/plnkr.js b/docs/config/services/deployments/plnkr.js new file mode 100644 index 000000000000..f6967bc5abd8 --- /dev/null +++ b/docs/config/services/deployments/plnkr.js @@ -0,0 +1,49 @@ +'use strict'; +// Special deployment that is only used for the examples on plnkr. +// While the embedded examples use the Angular files relative the docs folder, +// plnkr uses the CDN urls, and needs to switch between Google CDN for tagged versions +// and the code.angularjs.org server for the snapshot (master) version. + +var versionInfo = require('../../../../lib/versions/version-info'); +var isSnapshot = versionInfo.currentVersion.isSnapshot; + +var cdnUrl = isSnapshot ? + '//code.angularjs.org/snapshot' : + '//ajax.googleapis.com/ajax/libs/angularjs/' + versionInfo.cdnVersion; + +module.exports = function plnkrDeployment(getVersion) { + return { + name: 'plnkr', + examples: { + commonFiles: { + scripts: [cdnUrl + '/angular.min.js'] + }, + dependencyPath: cdnUrl + '/' + }, + scripts: [ + cdnUrl + '/angular.min.js', + cdnUrl + '/angular-resource.min.js', + cdnUrl + '/angular-route.min.js', + cdnUrl + '/angular-cookies.min.js', + cdnUrl + '/angular-sanitize.min.js', + cdnUrl + '/angular-touch.min.js', + cdnUrl + '/angular-animate.min.js', + 'components/marked-' + getVersion('marked', 'node_modules', 'package.json') + '/lib/marked.js', + 'js/angular-bootstrap/dropdown-toggle.min.js', + 'components/lunr.js-' + getVersion('lunr.js') + '/lunr.min.js', + 'components/google-code-prettify-' + getVersion('google-code-prettify') + '/src/prettify.js', + 'components/google-code-prettify-' + getVersion('google-code-prettify') + '/src/lang-css.js', + 'js/versions-data.js', + 'js/pages-data.js', + 'js/nav-data.js', + 'js/docs.min.js' + ], + stylesheets: [ + 'components/bootstrap-' + getVersion('bootstrap') + '/css/bootstrap.min.css', + 'components/open-sans-fontface-' + getVersion('open-sans-fontface') + '/open-sans.css', + 'css/prettify-theme.css', + 'css/docs.css', + 'css/animations.css' + ] + }; +}; From 19973609f43af781b1c4467f3acbc42b3a8f791e Mon Sep 17 00:00:00 2001 From: Martin Staffa Date: Mon, 17 Oct 2016 19:32:15 +0200 Subject: [PATCH 0236/1173] chore(docs-app): show loader when loading view / partial Closes #14385 PR (#15280) --- docs/app/src/docs.js | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/docs/app/src/docs.js b/docs/app/src/docs.js index 3593009b653b..287e5bfd7200 100644 --- a/docs/app/src/docs.js +++ b/docs/app/src/docs.js @@ -23,6 +23,11 @@ angular.module('DocsController', []) $scope.$on('$includeContentLoaded', function() { var pagePath = $scope.currentPage ? $scope.currentPage.path : $location.path(); $window._gaq.push(['_trackPageview', pagePath]); + $scope.loading = false; + }); + + $scope.$on('$includeContentError', function() { + $scope.loading = false; }); $scope.$watch(function docsPathWatch() {return $location.path(); }, function docsPathWatchAction(path) { @@ -31,6 +36,8 @@ angular.module('DocsController', []) var currentPage = $scope.currentPage = NG_PAGES[path]; + $scope.loading = true; + if (currentPage) { $scope.partialPath = 'partials/' + path + '.html'; $scope.currentArea = NG_NAVIGATION[currentPage.area]; From daa47e33e38d1c097a94494f19e4e492d049f608 Mon Sep 17 00:00:00 2001 From: Martin Staffa Date: Mon, 17 Oct 2016 23:16:41 +0200 Subject: [PATCH 0237/1173] Revert "chore(doc-gen, docs-app): create plnkr examples with correct Angular version" This patch relies on a change in the dgeni example package, which has not been added to dgeni yet. This reverts commit db02008fe274410d2b8e2715fa4a3c8c9b2ce809. --- docs/app/src/examples.js | 5 ++- docs/config/index.js | 7 +--- docs/config/services/deployments/plnkr.js | 49 ----------------------- 3 files changed, 5 insertions(+), 56 deletions(-) delete mode 100644 docs/config/services/deployments/plnkr.js diff --git a/docs/app/src/examples.js b/docs/app/src/examples.js index a5434f0364f7..fca74d9fc21a 100644 --- a/docs/app/src/examples.js +++ b/docs/app/src/examples.js @@ -181,8 +181,9 @@ angular.module('examples', []) filePromises.push($http.get(exampleFolder + '/' + filename, { transformResponse: [] }) .then(function(response) { - // Plunkr needs an index file that's simply named index.html - if (filename === 'index-plnkr.html') { + // The manifests provide the production index file but Plunkr wants + // a straight index.html + if (filename === 'index-production.html') { filename = 'index.html'; } diff --git a/docs/config/index.js b/docs/config/index.js index c4662d3197eb..4ec1423c65a0 100644 --- a/docs/config/index.js +++ b/docs/config/index.js @@ -23,7 +23,6 @@ module.exports = new Package('angularjs', [ .factory(require('./services/deployments/default')) .factory(require('./services/deployments/jquery')) .factory(require('./services/deployments/production')) -.factory(require('./services/deployments/plnkr')) .factory(require('./inline-tag-defs/type')) @@ -151,8 +150,7 @@ module.exports = new Package('angularjs', [ generateProtractorTestsProcessor, generateExamplesProcessor, debugDeployment, defaultDeployment, - jqueryDeployment, productionDeployment, - plnkrDeployment) { + jqueryDeployment, productionDeployment) { generateIndexPagesProcessor.deployments = [ debugDeployment, @@ -172,8 +170,7 @@ module.exports = new Package('angularjs', [ debugDeployment, defaultDeployment, jqueryDeployment, - productionDeployment, - plnkrDeployment + productionDeployment ]; }) diff --git a/docs/config/services/deployments/plnkr.js b/docs/config/services/deployments/plnkr.js deleted file mode 100644 index f6967bc5abd8..000000000000 --- a/docs/config/services/deployments/plnkr.js +++ /dev/null @@ -1,49 +0,0 @@ -'use strict'; -// Special deployment that is only used for the examples on plnkr. -// While the embedded examples use the Angular files relative the docs folder, -// plnkr uses the CDN urls, and needs to switch between Google CDN for tagged versions -// and the code.angularjs.org server for the snapshot (master) version. - -var versionInfo = require('../../../../lib/versions/version-info'); -var isSnapshot = versionInfo.currentVersion.isSnapshot; - -var cdnUrl = isSnapshot ? - '//code.angularjs.org/snapshot' : - '//ajax.googleapis.com/ajax/libs/angularjs/' + versionInfo.cdnVersion; - -module.exports = function plnkrDeployment(getVersion) { - return { - name: 'plnkr', - examples: { - commonFiles: { - scripts: [cdnUrl + '/angular.min.js'] - }, - dependencyPath: cdnUrl + '/' - }, - scripts: [ - cdnUrl + '/angular.min.js', - cdnUrl + '/angular-resource.min.js', - cdnUrl + '/angular-route.min.js', - cdnUrl + '/angular-cookies.min.js', - cdnUrl + '/angular-sanitize.min.js', - cdnUrl + '/angular-touch.min.js', - cdnUrl + '/angular-animate.min.js', - 'components/marked-' + getVersion('marked', 'node_modules', 'package.json') + '/lib/marked.js', - 'js/angular-bootstrap/dropdown-toggle.min.js', - 'components/lunr.js-' + getVersion('lunr.js') + '/lunr.min.js', - 'components/google-code-prettify-' + getVersion('google-code-prettify') + '/src/prettify.js', - 'components/google-code-prettify-' + getVersion('google-code-prettify') + '/src/lang-css.js', - 'js/versions-data.js', - 'js/pages-data.js', - 'js/nav-data.js', - 'js/docs.min.js' - ], - stylesheets: [ - 'components/bootstrap-' + getVersion('bootstrap') + '/css/bootstrap.min.css', - 'components/open-sans-fontface-' + getVersion('open-sans-fontface') + '/open-sans.css', - 'css/prettify-theme.css', - 'css/docs.css', - 'css/animations.css' - ] - }; -}; From 18263f1c527f656c0b7194d128b2de7ed2d90641 Mon Sep 17 00:00:00 2001 From: Martin Staffa Date: Wed, 19 Oct 2016 11:55:50 +0200 Subject: [PATCH 0238/1173] chore(docs-app): improve layout when loading partials By setting the current partial content to hidden, the current height of the window is maintained until the new content is loaded. This prevents flickering caused by the scrollbar (dis)appearing and the footer coming into view. --- docs/app/assets/css/docs.css | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/docs/app/assets/css/docs.css b/docs/app/assets/css/docs.css index c9b51256876e..c095047aaad1 100644 --- a/docs/app/assets/css/docs.css +++ b/docs/app/assets/css/docs.css @@ -653,6 +653,13 @@ ul.events > li { max-width: 100%; } +@media only screen and (min-width: 769px) { + [ng-include="partialPath"].ng-hide { + display: block !important; + visibility: hidden; + } +} + @media only screen and (min-width: 769px) and (max-width: 991px) { .main-body-grid { margin-top: 160px; From 00b60f2f03c46f4e8ee40b518747f15f33bbfebc Mon Sep 17 00:00:00 2001 From: Martin Staffa Date: Wed, 19 Oct 2016 12:12:56 +0200 Subject: [PATCH 0239/1173] docs(a): remove outdated practice Using a tags as buttons is bad for accessibility and usability --- src/ng/directive/a.js | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/src/ng/directive/a.js b/src/ng/directive/a.js index e1e57195e8c6..17913a043b72 100644 --- a/src/ng/directive/a.js +++ b/src/ng/directive/a.js @@ -6,12 +6,10 @@ * @restrict E * * @description - * Modifies the default behavior of the html A tag so that the default action is prevented when + * Modifies the default behavior of the html a tag so that the default action is prevented when * the href attribute is empty. * - * This change permits the easy creation of action links with the `ngClick` directive - * without changing the location or causing page reloads, e.g.: - * `Add Item` + * For dynamically creating `href` attributes for a tags, see the {@link ng.ngHref `ngHref`} directive. */ var htmlAnchorDirective = valueFn({ restrict: 'E', From d6c91ea17589a6401e766dac70367bc48d7d3b74 Mon Sep 17 00:00:00 2001 From: Georgios Kalpakas Date: Thu, 13 Oct 2016 19:57:12 +0300 Subject: [PATCH 0240/1173] refactor(input): avoid duplicating `step`/`ngStep` tests --- test/ng/directive/inputSpec.js | 208 +++++++++++---------------------- 1 file changed, 70 insertions(+), 138 deletions(-) diff --git a/test/ng/directive/inputSpec.js b/test/ng/directive/inputSpec.js index 15471354c56f..9973c2411cd3 100644 --- a/test/ng/directive/inputSpec.js +++ b/test/ng/directive/inputSpec.js @@ -2621,154 +2621,88 @@ describe('input', function() { }); }); - describe('step', function() { - it('should validate', function() { - $rootScope.step = 10; - $rootScope.value = 20; - var inputElm = helper.compileInput(''); - - expect(inputElm.val()).toBe('20'); - expect(inputElm).toBeValid(); - expect($rootScope.value).toBe(20); - expect($rootScope.form.alias.$error.step).toBeFalsy(); - - helper.changeInputValueTo('18'); - expect(inputElm).toBeInvalid(); - expect(inputElm.val()).toBe('18'); - expect($rootScope.value).toBeUndefined(); - expect($rootScope.form.alias.$error.step).toBeTruthy(); - - helper.changeInputValueTo('10'); - expect(inputElm).toBeValid(); - expect(inputElm.val()).toBe('10'); - expect($rootScope.value).toBe(10); - expect($rootScope.form.alias.$error.step).toBeFalsy(); - - $rootScope.$apply('value = 12'); - expect(inputElm).toBeInvalid(); - expect(inputElm.val()).toBe('12'); - expect($rootScope.value).toBe(12); - expect($rootScope.form.alias.$error.step).toBeTruthy(); - }); - - it('should validate even if the step value changes on-the-fly', function() { - $rootScope.step = 10; - var inputElm = helper.compileInput(''); - - helper.changeInputValueTo('10'); - expect(inputElm).toBeValid(); - expect($rootScope.value).toBe(10); - - // Step changes, but value matches - $rootScope.$apply('step = 5'); - expect(inputElm.val()).toBe('10'); - expect(inputElm).toBeValid(); - expect($rootScope.value).toBe(10); - expect($rootScope.form.alias.$error.step).toBeFalsy(); - - // Step changes, value does not match - $rootScope.$apply('step = 6'); - expect(inputElm).toBeInvalid(); - expect($rootScope.value).toBeUndefined(); - expect(inputElm.val()).toBe('10'); - expect($rootScope.form.alias.$error.step).toBeTruthy(); - - // null = valid - $rootScope.$apply('step = null'); - expect(inputElm).toBeValid(); - expect($rootScope.value).toBe(10); - expect(inputElm.val()).toBe('10'); - expect($rootScope.form.alias.$error.step).toBeFalsy(); - - // Step val as string - $rootScope.$apply('step = "7"'); - expect(inputElm).toBeInvalid(); - expect($rootScope.value).toBeUndefined(); - expect(inputElm.val()).toBe('10'); - expect($rootScope.form.alias.$error.step).toBeTruthy(); - // unparsable string is ignored - $rootScope.$apply('step = "abc"'); - expect(inputElm).toBeValid(); - expect($rootScope.value).toBe(10); - expect(inputElm.val()).toBe('10'); - expect($rootScope.form.alias.$error.step).toBeFalsy(); - }); - }); + forEach({ + step: 'step="{{step}}"', + ngStep: 'ng-step="step"' + }, function(attrHtml, attrName) { + describe(attrName, function() { - describe('ngStep', function() { - it('should validate', function() { - $rootScope.step = 10; - $rootScope.value = 20; - var inputElm = helper.compileInput(''); + it('should validate', function() { + $rootScope.step = 10; + $rootScope.value = 20; + var inputElm = helper.compileInput( + ''); - expect(inputElm.val()).toBe('20'); - expect(inputElm).toBeValid(); - expect($rootScope.value).toBe(20); - expect($rootScope.form.alias.$error.step).toBeFalsy(); + expect(inputElm.val()).toBe('20'); + expect(inputElm).toBeValid(); + expect($rootScope.value).toBe(20); + expect($rootScope.form.alias.$error.step).toBeFalsy(); - helper.changeInputValueTo('18'); - expect(inputElm).toBeInvalid(); - expect(inputElm.val()).toBe('18'); - expect($rootScope.value).toBeUndefined(); - expect($rootScope.form.alias.$error.step).toBeTruthy(); + helper.changeInputValueTo('18'); + expect(inputElm).toBeInvalid(); + expect(inputElm.val()).toBe('18'); + expect($rootScope.value).toBeUndefined(); + expect($rootScope.form.alias.$error.step).toBeTruthy(); - helper.changeInputValueTo('10'); - expect(inputElm).toBeValid(); - expect(inputElm.val()).toBe('10'); - expect($rootScope.value).toBe(10); - expect($rootScope.form.alias.$error.step).toBeFalsy(); + helper.changeInputValueTo('10'); + expect(inputElm).toBeValid(); + expect(inputElm.val()).toBe('10'); + expect($rootScope.value).toBe(10); + expect($rootScope.form.alias.$error.step).toBeFalsy(); - $rootScope.$apply('value = 12'); - expect(inputElm).toBeInvalid(); - expect(inputElm.val()).toBe('12'); - expect($rootScope.value).toBe(12); - expect($rootScope.form.alias.$error.step).toBeTruthy(); - }); + $rootScope.$apply('value = 12'); + expect(inputElm).toBeInvalid(); + expect(inputElm.val()).toBe('12'); + expect($rootScope.value).toBe(12); + expect($rootScope.form.alias.$error.step).toBeTruthy(); + }); - it('should validate even if the step value changes on-the-fly', function() { - $rootScope.step = 10; - var inputElm = helper.compileInput(''); + it('should validate even if the step value changes on-the-fly', function() { + $rootScope.step = 10; + var inputElm = helper.compileInput( + ''); - helper.changeInputValueTo('10'); - expect(inputElm).toBeValid(); - expect($rootScope.value).toBe(10); + helper.changeInputValueTo('10'); + expect(inputElm).toBeValid(); + expect($rootScope.value).toBe(10); - // Step changes, but value matches - $rootScope.$apply('step = 5'); - expect(inputElm.val()).toBe('10'); - expect(inputElm).toBeValid(); - expect($rootScope.value).toBe(10); - expect($rootScope.form.alias.$error.step).toBeFalsy(); + // Step changes, but value matches + $rootScope.$apply('step = 5'); + expect(inputElm.val()).toBe('10'); + expect(inputElm).toBeValid(); + expect($rootScope.value).toBe(10); + expect($rootScope.form.alias.$error.step).toBeFalsy(); - // Step changes, value does not match - $rootScope.$apply('step = 6'); - expect(inputElm).toBeInvalid(); - expect($rootScope.value).toBeUndefined(); - expect(inputElm.val()).toBe('10'); - expect($rootScope.form.alias.$error.step).toBeTruthy(); + // Step changes, value does not match + $rootScope.$apply('step = 6'); + expect(inputElm).toBeInvalid(); + expect($rootScope.value).toBeUndefined(); + expect(inputElm.val()).toBe('10'); + expect($rootScope.form.alias.$error.step).toBeTruthy(); - // null = valid - $rootScope.$apply('step = null'); - expect(inputElm).toBeValid(); - expect($rootScope.value).toBe(10); - expect(inputElm.val()).toBe('10'); - expect($rootScope.form.alias.$error.step).toBeFalsy(); + // null = valid + $rootScope.$apply('step = null'); + expect(inputElm).toBeValid(); + expect($rootScope.value).toBe(10); + expect(inputElm.val()).toBe('10'); + expect($rootScope.form.alias.$error.step).toBeFalsy(); - // Step val as string - $rootScope.$apply('step = "7"'); - expect(inputElm).toBeInvalid(); - expect($rootScope.value).toBeUndefined(); - expect(inputElm.val()).toBe('10'); - expect($rootScope.form.alias.$error.step).toBeTruthy(); + // Step val as string + $rootScope.$apply('step = "7"'); + expect(inputElm).toBeInvalid(); + expect($rootScope.value).toBeUndefined(); + expect(inputElm.val()).toBe('10'); + expect($rootScope.form.alias.$error.step).toBeTruthy(); - // unparsable string is ignored - $rootScope.$apply('step = "abc"'); - expect(inputElm).toBeValid(); - expect($rootScope.value).toBe(10); - expect(inputElm.val()).toBe('10'); - expect($rootScope.form.alias.$error.step).toBeFalsy(); + // unparsable string is ignored + $rootScope.$apply('step = "abc"'); + expect(inputElm).toBeValid(); + expect($rootScope.value).toBe(10); + expect(inputElm.val()).toBe('10'); + expect($rootScope.form.alias.$error.step).toBeFalsy(); + }); }); }); @@ -3001,7 +2935,6 @@ describe('input', function() { }); describe('range', function() { - var scope; var rangeTestEl = angular.element(''); @@ -3048,7 +2981,6 @@ describe('input', function() { expect(scope.age).toBe(50); expect(inputElm).toBeValid(); }); - } else { it('should reset the model if view is invalid', function() { @@ -3438,7 +3370,6 @@ describe('input', function() { expect(scope.value).toBe(40); }); }); - } @@ -3448,6 +3379,7 @@ describe('input', function() { // Browsers that implement range will never allow you to set a value that doesn't match the step value // However, currently only Firefox fully implements the spec when setting the value after the step value changes. // Other browsers fail in various edge cases, which is why they are not tested here. + it('should round the input value to the nearest step on user input', function() { var inputElm = helper.compileInput(''); @@ -3510,8 +3442,8 @@ describe('input', function() { expect(scope.value).toBe(10); expect(scope.form.alias.$error.step).toBeFalsy(); }); - } else { + it('should validate if "range" is not implemented', function() { scope.step = 10; scope.value = 20; From 081d06ffd15c2c6c539ce97b5eb63fa8e2403818 Mon Sep 17 00:00:00 2001 From: Georgios Kalpakas Date: Thu, 13 Oct 2016 19:59:23 +0300 Subject: [PATCH 0241/1173] fix(input): fix `step` validation for `input[number]`/`input[range]` Related to 9a8b8aa and #15257. Fixes the issue discussed in https://github.com/angular/angular.js/commit/9a8b8aa#commitcomment-19108436. Fixes #15257 Closes #15264 --- src/ng/directive/input.js | 58 +++++++++++- test/ng/directive/inputSpec.js | 166 +++++++++++++++++++++++++++++++++ 2 files changed, 220 insertions(+), 4 deletions(-) diff --git a/src/ng/directive/input.js b/src/ng/directive/input.js index 47a0fa8db508..8d8afcdb8306 100644 --- a/src/ng/directive/input.js +++ b/src/ng/directive/input.js @@ -1532,13 +1532,62 @@ function parseNumberAttrVal(val) { return !isNumberNaN(val) ? val : undefined; } +function isNumberInteger(num) { + // See http://stackoverflow.com/questions/14636536/how-to-check-if-a-variable-is-an-integer-in-javascript#14794066 + // (minus the assumption that `num` is a number) + + // eslint-disable-next-line no-bitwise + return (num | 0) === num; +} + +function countDecimals(num) { + var numString = num.toString(); + var decimalSymbolIndex = numString.indexOf('.'); + + if (decimalSymbolIndex === -1) { + if (-1 < num && num < 1) { + // It may be in the exponential notation format (`1e-X`) + var match = /e-(\d+)$/.exec(numString); + + if (match) { + return Number(match[1]); + } + } + + return 0; + } + + return numString.length - decimalSymbolIndex - 1; +} + +function isValidForStep(viewValue, stepBase, step) { + // At this point `stepBase` and `step` are expected to be non-NaN values + // and `viewValue` is expected to be a valid stringified number. + var value = Number(viewValue); + + // Due to limitations in Floating Point Arithmetic (e.g. `0.3 - 0.2 !== 0.1` or + // `0.5 % 0.1 !== 0`), we need to convert all numbers to integers. + if (!isNumberInteger(value) || !isNumberInteger(stepBase) || !isNumberInteger(step)) { + var decimalCount = Math.max(countDecimals(value), countDecimals(stepBase), countDecimals(step)); + var multiplier = Math.pow(10, decimalCount); + + value = value * multiplier; + stepBase = stepBase * multiplier; + step = step * multiplier; + } + + return (value - stepBase) % step === 0; +} + function numberInputType(scope, element, attr, ctrl, $sniffer, $browser) { badInputChecker(scope, element, attr, ctrl); numberFormatterParser(ctrl); baseInputType(scope, element, attr, ctrl, $sniffer, $browser); + var minVal; + var maxVal; + if (isDefined(attr.min) || attr.ngMin) { - var minVal; ctrl.$validators.min = function(value) { return ctrl.$isEmpty(value) || isUndefined(minVal) || value >= minVal; }; @@ -1551,7 +1600,6 @@ function numberInputType(scope, element, attr, ctrl, $sniffer, $browser) { } if (isDefined(attr.max) || attr.ngMax) { - var maxVal; ctrl.$validators.max = function(value) { return ctrl.$isEmpty(value) || isUndefined(maxVal) || value <= maxVal; }; @@ -1566,7 +1614,8 @@ function numberInputType(scope, element, attr, ctrl, $sniffer, $browser) { if (isDefined(attr.step) || attr.ngStep) { var stepVal; ctrl.$validators.step = function(modelValue, viewValue) { - return ctrl.$isEmpty(viewValue) || isUndefined(stepVal) || viewValue % stepVal === 0; + return ctrl.$isEmpty(viewValue) || isUndefined(stepVal) || + isValidForStep(viewValue, minVal || 0, stepVal); }; attr.$observe('step', function(val) { @@ -1636,7 +1685,8 @@ function rangeInputType(scope, element, attr, ctrl, $sniffer, $browser) { } : // ngStep doesn't set the setp attr, so the browser doesn't adjust the input value as setting step would function stepValidator(modelValue, viewValue) { - return ctrl.$isEmpty(viewValue) || isUndefined(stepVal) || viewValue % stepVal === 0; + return ctrl.$isEmpty(viewValue) || isUndefined(stepVal) || + isValidForStep(viewValue, minVal || 0, stepVal); }; setInitialValueAndObserver('step', stepChange); diff --git a/test/ng/directive/inputSpec.js b/test/ng/directive/inputSpec.js index 9973c2411cd3..40ceff4ac879 100644 --- a/test/ng/directive/inputSpec.js +++ b/test/ng/directive/inputSpec.js @@ -2703,6 +2703,91 @@ describe('input', function() { expect(inputElm.val()).toBe('10'); expect($rootScope.form.alias.$error.step).toBeFalsy(); }); + + it('should use the correct "step base" when `[min]` is specified', function() { + $rootScope.min = 5; + $rootScope.step = 10; + $rootScope.value = 10; + var inputElm = helper.compileInput( + ''); + var ngModel = inputElm.controller('ngModel'); + + expect(inputElm.val()).toBe('10'); + expect(inputElm).toBeInvalid(); + expect(ngModel.$error.step).toBe(true); + expect($rootScope.value).toBeUndefined(); + + helper.changeInputValueTo('15'); + expect(inputElm).toBeValid(); + expect($rootScope.value).toBe(15); + + $rootScope.$apply('step = 3'); + expect(inputElm.val()).toBe('15'); + expect(inputElm).toBeInvalid(); + expect(ngModel.$error.step).toBe(true); + expect($rootScope.value).toBeUndefined(); + + helper.changeInputValueTo('8'); + expect(inputElm).toBeValid(); + expect($rootScope.value).toBe(8); + + $rootScope.$apply('min = 10; step = 20'); + helper.changeInputValueTo('30'); + expect(inputElm.val()).toBe('30'); + expect(inputElm).toBeValid(); + expect($rootScope.value).toBe(30); + + $rootScope.$apply('min = 5'); + expect(inputElm.val()).toBe('30'); + expect(inputElm).toBeInvalid(); + expect(ngModel.$error.step).toBe(true); + expect($rootScope.value).toBeUndefined(); + + $rootScope.$apply('step = 0.00000001'); + expect(inputElm.val()).toBe('30'); + expect(inputElm).toBeValid(); + expect($rootScope.value).toBe(30); + + // 0.3 - 0.2 === 0.09999999999999998 + $rootScope.$apply('min = 0.2; step = (0.3 - 0.2)'); + helper.changeInputValueTo('0.3'); + expect(inputElm.val()).toBe('0.3'); + expect(inputElm).toBeInvalid(); + expect(ngModel.$error.step).toBe(true); + expect($rootScope.value).toBeUndefined(); + }); + + it('should correctly validate even in cases where the JS floating point arithmetic fails', + function() { + $rootScope.step = 0.1; + var inputElm = helper.compileInput( + ''); + var ngModel = inputElm.controller('ngModel'); + + expect(inputElm.val()).toBe(''); + expect(inputElm).toBeValid(); + expect($rootScope.value).toBeUndefined(); + + helper.changeInputValueTo('0.3'); + expect(inputElm).toBeValid(); + expect($rootScope.value).toBe(0.3); + + helper.changeInputValueTo('2.9999999999999996'); + expect(inputElm).toBeInvalid(); + expect(ngModel.$error.step).toBe(true); + expect($rootScope.value).toBeUndefined(); + + // 0.5 % 0.1 === 0.09999999999999998 + helper.changeInputValueTo('0.5'); + expect(inputElm).toBeValid(); + expect($rootScope.value).toBe(0.5); + + // 3.5 % 0.1 === 0.09999999999999981 + helper.changeInputValueTo('3.5'); + expect(inputElm).toBeValid(); + expect($rootScope.value).toBe(3.5); + } + ); }); }); @@ -3516,6 +3601,87 @@ describe('input', function() { expect(inputElm.val()).toBe('10'); expect(scope.form.alias.$error.step).toBeFalsy(); }); + + it('should use the correct "step base" when `[min]` is specified', function() { + $rootScope.min = 5; + $rootScope.step = 10; + $rootScope.value = 10; + var inputElm = helper.compileInput( + ''); + var ngModel = inputElm.controller('ngModel'); + + expect(inputElm.val()).toBe('10'); + expect(inputElm).toBeInvalid(); + expect(ngModel.$error.step).toBe(true); + expect($rootScope.value).toBeUndefined(); + + helper.changeInputValueTo('15'); + expect(inputElm).toBeValid(); + expect($rootScope.value).toBe(15); + + $rootScope.$apply('step = 3'); + expect(inputElm.val()).toBe('15'); + expect(inputElm).toBeInvalid(); + expect(ngModel.$error.step).toBe(true); + expect($rootScope.value).toBeUndefined(); + + helper.changeInputValueTo('8'); + expect(inputElm).toBeValid(); + expect($rootScope.value).toBe(8); + + $rootScope.$apply('min = 10; step = 20; value = 30'); + expect(inputElm.val()).toBe('30'); + expect(inputElm).toBeValid(); + expect($rootScope.value).toBe(30); + + $rootScope.$apply('min = 5'); + expect(inputElm.val()).toBe('30'); + expect(inputElm).toBeInvalid(); + expect(ngModel.$error.step).toBe(true); + expect($rootScope.value).toBeUndefined(); + + $rootScope.$apply('step = 0.00000001'); + expect(inputElm.val()).toBe('30'); + expect(inputElm).toBeValid(); + expect($rootScope.value).toBe(30); + + // 0.3 - 0.2 === 0.09999999999999998 + $rootScope.$apply('min = 0.2; step = 0.09999999999999998; value = 0.3'); + expect(inputElm.val()).toBe('0.3'); + expect(inputElm).toBeInvalid(); + expect(ngModel.$error.step).toBe(true); + expect($rootScope.value).toBeUndefined(); + }); + + it('should correctly validate even in cases where the JS floating point arithmetic fails', + function() { + var inputElm = helper.compileInput(''); + var ngModel = inputElm.controller('ngModel'); + + expect(inputElm.val()).toBe(''); + expect(inputElm).toBeValid(); + expect($rootScope.value).toBeUndefined(); + + helper.changeInputValueTo('0.3'); + expect(inputElm).toBeValid(); + expect($rootScope.value).toBe(0.3); + + helper.changeInputValueTo('2.9999999999999996'); + expect(inputElm).toBeInvalid(); + expect(ngModel.$error.step).toBe(true); + expect($rootScope.value).toBeUndefined(); + + // 0.5 % 0.1 === 0.09999999999999998 + helper.changeInputValueTo('0.5'); + expect(inputElm).toBeValid(); + expect($rootScope.value).toBe(0.5); + + // 3.5 % 0.1 === 0.09999999999999981 + helper.changeInputValueTo('3.5'); + expect(inputElm).toBeValid(); + expect($rootScope.value).toBe(3.5); + } + ); } }); }); From 7dacbcc991657dacbec7b0cad4df318a8075ec04 Mon Sep 17 00:00:00 2001 From: Georgios Kalpakas Date: Wed, 19 Oct 2016 15:27:38 +0300 Subject: [PATCH 0242/1173] test(input): fix typo (`step="{{step}}""` --> `step="{{step}}"`) --- test/ng/directive/inputSpec.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/ng/directive/inputSpec.js b/test/ng/directive/inputSpec.js index 40ceff4ac879..d7063f2c6c7d 100644 --- a/test/ng/directive/inputSpec.js +++ b/test/ng/directive/inputSpec.js @@ -3607,7 +3607,7 @@ describe('input', function() { $rootScope.step = 10; $rootScope.value = 10; var inputElm = helper.compileInput( - ''); + ''); var ngModel = inputElm.controller('ngModel'); expect(inputElm.val()).toBe('10'); From 35482babd9eb0970edbc99f223e04594a9d09364 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Go=C5=82e=CC=A8biowski?= Date: Mon, 17 Oct 2016 23:08:41 +0200 Subject: [PATCH 0243/1173] refactor($sniffer): remove $sniffer.vendorPrefix Previously, Angular tried to detect the CSS prefix the browser supports and then use the saved one. This strategy is not ideal as currently some browsers are supporting more than one vendor prefix. The best example is Microsoft Edge that added -webkit- prefixes to be more Web-compatible; Firefox is doing a similar thing on mobile. Some of the -webkit--prefixed things are now even getting into specs to sanction that they're now required for Web compatibility. In some cases Edge even supports only the -webkit--prefixed property; one example is -webkit-appearance. $sniffer.vendorPrefix is no longer used in Angular core outside of $sniffer itself; taking that and the above problems into account, it's better to just remove it. The only remaining use case was an internal use in detection of support for transitions/animations but we can directly check the webkit prefix there manually; no other prefix matters for them anyway. $sniffer is undocumented API so this removal is not a breaking change. However, if you've previously been using it in your code, just paste the following to get the same function: var vendorPrefix = (function() { var prefix, prop, match; var vendorRegex = /^(Moz|webkit|ms)(?=[A-Z])/; for (prop in document.createElement('div').style) { if ((match = vendorRegex.exec(prop))) { prefix = match[0]; break; } } return prefix; })(); The vendorPrefix variable will contain what $sniffer.vendorPrefix used to. Note that we advise to not check for vendor prefixes this way; if you have to do it, it's better to check it separately for each CSS property used for the reasons described at the beginning. If you use jQuery, you don't have to do anything; it automatically adds vendor prefixes to CSS prefixes for you in the .css() method. Fixes #13690 Closes #15287 --- src/ng/sniffer.js | 29 ++++----------------- test/helpers/privateMocks.js | 16 +++++++----- test/ng/snifferSpec.js | 43 +++----------------------------- test/ngAnimate/animateCssSpec.js | 15 ++++++----- 4 files changed, 26 insertions(+), 77 deletions(-) diff --git a/src/ng/sniffer.js b/src/ng/sniffer.js index 60ed39d81318..217f3ba9d0a7 100644 --- a/src/ng/sniffer.js +++ b/src/ng/sniffer.js @@ -34,33 +34,15 @@ function $SnifferProvider() { toInt((/android (\d+)/.exec(lowercase(($window.navigator || {}).userAgent)) || [])[1]), boxee = /Boxee/i.test(($window.navigator || {}).userAgent), document = $document[0] || {}, - vendorPrefix, - vendorRegex = /^(Moz|webkit|ms)(?=[A-Z])/, bodyStyle = document.body && document.body.style, transitions = false, - animations = false, - match; + animations = false; if (bodyStyle) { - for (var prop in bodyStyle) { - if ((match = vendorRegex.exec(prop))) { - vendorPrefix = match[0]; - vendorPrefix = vendorPrefix[0].toUpperCase() + vendorPrefix.substr(1); - break; - } - } - - if (!vendorPrefix) { - vendorPrefix = ('WebkitOpacity' in bodyStyle) && 'webkit'; - } - - transitions = !!(('transition' in bodyStyle) || (vendorPrefix + 'Transition' in bodyStyle)); - animations = !!(('animation' in bodyStyle) || (vendorPrefix + 'Animation' in bodyStyle)); - - if (android && (!transitions || !animations)) { - transitions = isString(bodyStyle.webkitTransition); - animations = isString(bodyStyle.webkitAnimation); - } + // Support: Android <5, Blackberry Browser 10, default Chrome in Android 4.4.x + // Mentioned browsers need a -webkit- prefix for transitions & animations. + transitions = !!('transition' in bodyStyle || 'webkitTransition' in bodyStyle); + animations = !!('animation' in bodyStyle || 'webkitAnimation' in bodyStyle); } @@ -90,7 +72,6 @@ function $SnifferProvider() { return eventSupport[event]; }, csp: csp(), - vendorPrefix: vendorPrefix, transitions: transitions, animations: animations, android: android diff --git a/test/helpers/privateMocks.js b/test/helpers/privateMocks.js index 1a1580b2c118..897e2a290e5d 100644 --- a/test/helpers/privateMocks.js +++ b/test/helpers/privateMocks.js @@ -36,7 +36,7 @@ function browserSupportsCssAnimations() { return !(window.document.documentMode < 10); } -function createMockStyleSheet(doc, prefix) { +function createMockStyleSheet(doc) { doc = doc ? doc[0] : window.document; var node = doc.createElement('style'); @@ -57,13 +57,17 @@ function createMockStyleSheet(doc, prefix) { }, addPossiblyPrefixedRule: function(selector, styles) { - if (prefix) { - var prefixedStyles = styles.split(/\s*;\s*/g).map(function(style) { - return !style ? '' : prefix + style; + // Support: Android <5, Blackberry Browser 10, default Chrome in Android 4.4.x + // Mentioned browsers need a -webkit- prefix for transitions & animations. + var prefixedStyles = styles.split(/\s*;\s*/g) + .filter(function(style) { + return style && /^(?:transition|animation)\b/.test(style); + }) + .map(function(style) { + return '-webkit-' + style; }).join('; '); - this.addRule(selector, prefixedStyles); - } + this.addRule(selector, prefixedStyles); this.addRule(selector, styles); }, diff --git a/test/ng/snifferSpec.js b/test/ng/snifferSpec.js index 7216bc005b66..9ab3a7315ebe 100644 --- a/test/ng/snifferSpec.js +++ b/test/ng/snifferSpec.js @@ -172,39 +172,6 @@ describe('$sniffer', function() { }); - describe('vendorPrefix', function() { - it('should return the correct vendor prefix based on the browser', function() { - inject(function($sniffer, $window) { - var expectedPrefix; - var ua = $window.navigator.userAgent.toLowerCase(); - if (/edge/i.test(ua)) { - expectedPrefix = 'Ms'; - } else if (/chrome/i.test(ua) || /safari/i.test(ua) || /webkit/i.test(ua)) { - expectedPrefix = 'Webkit'; - } else if (/firefox/i.test(ua)) { - expectedPrefix = 'Moz'; - } else if (/ie/i.test(ua) || /trident/i.test(ua)) { - expectedPrefix = 'Ms'; - } - expect($sniffer.vendorPrefix).toBe(expectedPrefix); - }); - }); - - - it('should still work for an older version of Webkit', function() { - var mockDocument = { - body: { - style: { - WebkitOpacity: '0' - } - } - }; - - expect(sniffer({}, mockDocument).vendorPrefix).toBe('webkit'); - }); - }); - - describe('animations', function() { it('should be either true or false', inject(function($sniffer) { expect($sniffer.animations).toBeDefined(); @@ -222,13 +189,12 @@ describe('$sniffer', function() { }); - it('should be true with vendor-specific animations', function() { + it('should be true with -webkit-prefixed animations', function() { var animationStyle = 'some_animation 2s linear'; var mockDocument = { body: { style: { - WebkitAnimation: animationStyle, - MozAnimation: animationStyle + webkitAnimation: animationStyle } } }; @@ -299,13 +265,12 @@ describe('$sniffer', function() { }); - it('should be true with vendor-specific transitions', function() { + it('should be true with -webkit-prefixed transitions', function() { var transitionStyle = '1s linear all'; var mockDocument = { body: { style: { - WebkitTransition: transitionStyle, - MozTransition: transitionStyle + webkitTransition: transitionStyle } } }; diff --git a/test/ngAnimate/animateCssSpec.js b/test/ngAnimate/animateCssSpec.js index b0e7cf58faef..079716f8eacf 100644 --- a/test/ngAnimate/animateCssSpec.js +++ b/test/ngAnimate/animateCssSpec.js @@ -16,8 +16,8 @@ describe('ngAnimate $animateCss', function() { } function getPossiblyPrefixedStyleValue(element, styleProp) { - var value = element.css(prefix + styleProp); - if (isUndefined(value)) value = element.css(styleProp); + var value = element.css(styleProp); + if (isUndefined(value)) value = element.css('-webkit-' + styleProp); return value; } @@ -40,11 +40,10 @@ describe('ngAnimate $animateCss', function() { color: 'blue' }; - var ss, prefix, triggerAnimationStartFrame; + var ss, triggerAnimationStartFrame; beforeEach(module(function() { return function($document, $sniffer, $$rAF, $animate) { - prefix = '-' + $sniffer.vendorPrefix.toLowerCase() + '-'; - ss = createMockStyleSheet($document, prefix); + ss = createMockStyleSheet($document); $animate.enabled(true); triggerAnimationStartFrame = function() { @@ -873,8 +872,8 @@ describe('ngAnimate $animateCss', function() { angular.element($document[0].body).append($rootElement); - ss.addRule('.ng-enter-stagger', prefix + 'animation-delay:0.2s'); - ss.addRule('.transition-animation', 'transition:2s 5s linear all;'); + ss.addPossiblyPrefixedRule('.ng-enter-stagger', 'animation-delay:0.2s'); + ss.addPossiblyPrefixedRule('.transition-animation', 'transition:2s 5s linear all;'); for (var i = 0; i < 5; i++) { var element = angular.element('
        '); @@ -2508,7 +2507,7 @@ describe('ngAnimate $animateCss', function() { } }, function(testDetailsFactory) { inject(function($animateCss, $rootElement) { - var testDetails = testDetailsFactory(prefix); + var testDetails = testDetailsFactory(); ss.addPossiblyPrefixedRule('.ng-enter', testDetails.css); var options = { From f5f802c6e68a3d4e22f5e7725057652519d15e60 Mon Sep 17 00:00:00 2001 From: laranhee Date: Thu, 20 Oct 2016 11:37:04 +0900 Subject: [PATCH 0244/1173] docs($rootScope): add missing round bracket Closes #15299 --- src/ng/rootScope.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ng/rootScope.js b/src/ng/rootScope.js index 618c7b93872c..cd53ab4dc552 100644 --- a/src/ng/rootScope.js +++ b/src/ng/rootScope.js @@ -285,7 +285,7 @@ function $RootScopeProvider() { * $digest()} and should return the value that will be watched. (`watchExpression` should not change * its value when executed multiple times with the same input because it may be executed multiple * times by {@link ng.$rootScope.Scope#$digest $digest()}. That is, `watchExpression` should be - * [idempotent](http://en.wikipedia.org/wiki/Idempotence). + * [idempotent](http://en.wikipedia.org/wiki/Idempotence).) * - The `listener` is called only when the value from the current `watchExpression` and the * previous call to `watchExpression` are not equal (with the exception of the initial run, * see below). Inequality is determined according to reference inequality, From 828f8a63b588003da426405083f56c8bfaacb450 Mon Sep 17 00:00:00 2001 From: Jason Bedard Date: Sat, 8 Oct 2016 12:23:44 -0700 Subject: [PATCH 0245/1173] docs($controller): deprecate the use of $controllerProvider#allowGlobals Closes #15230 --- src/ng/controller.js | 5 ++++- src/ng/directive/ngController.js | 2 +- src/ngMock/angular-mocks.js | 2 +- 3 files changed, 6 insertions(+), 3 deletions(-) diff --git a/src/ng/controller.js b/src/ng/controller.js index f6c4a7c5abd1..14b6c17beac0 100644 --- a/src/ng/controller.js +++ b/src/ng/controller.js @@ -59,6 +59,9 @@ function $ControllerProvider() { * @ngdoc method * @name $controllerProvider#allowGlobals * @description If called, allows `$controller` to find controller constructors on `window` + * + * @deprecated + * This method of finding controllers has been deprecated. This will be removed in 1.7. */ this.allowGlobals = function() { globals = true; @@ -79,7 +82,7 @@ function $ControllerProvider() { * * check if a controller with given name is registered via `$controllerProvider` * * check if evaluating the string on the current scope returns a constructor * * if $controllerProvider#allowGlobals, check `window[constructor]` on the global - * `window` object (not recommended) + * `window` object (deprecated, not recommended) * * The string can use the `controller as property` syntax, where the controller instance is published * as the specified property on the `scope`; the `scope` must be injected into `locals` param for this diff --git a/src/ng/directive/ngController.js b/src/ng/directive/ngController.js index cd3bfed63a4c..d31b2548920d 100644 --- a/src/ng/directive/ngController.js +++ b/src/ng/directive/ngController.js @@ -33,7 +33,7 @@ * * If the current `$controllerProvider` is configured to use globals (via * {@link ng.$controllerProvider#allowGlobals `$controllerProvider.allowGlobals()` }), this may - * also be the name of a globally accessible constructor function (not recommended). + * also be the name of a globally accessible constructor function (deprecated, not recommended). * * @example * Here is a simple form for editing user contact information. Adding, removing, clearing, and diff --git a/src/ngMock/angular-mocks.js b/src/ngMock/angular-mocks.js index e112f2f4053d..d4cf61ed5647 100644 --- a/src/ngMock/angular-mocks.js +++ b/src/ngMock/angular-mocks.js @@ -2225,7 +2225,7 @@ angular.mock.$RootElementProvider = function() { * * check if a controller with given name is registered via `$controllerProvider` * * check if evaluating the string on the current scope returns a constructor * * if $controllerProvider#allowGlobals, check `window[constructor]` on the global - * `window` object (not recommended) + * `window` object (deprecated, not recommended) * * The string can use the `controller as property` syntax, where the controller instance is published * as the specified property on the `scope`; the `scope` must be injected into `locals` param for this From 41034bb41beb6df132f677b83d6518df38827408 Mon Sep 17 00:00:00 2001 From: Jason Bedard Date: Thu, 20 Oct 2016 01:00:32 -0700 Subject: [PATCH 0246/1173] test($compile): ensure equal but different instance changes are detected in onChanges Closes #15300 --- test/ng/compileSpec.js | 49 +++++++++++++++++++++++++++++++++++++++++- 1 file changed, 48 insertions(+), 1 deletion(-) diff --git a/test/ng/compileSpec.js b/test/ng/compileSpec.js index 544baf8a74ca..4c4f1f589a2f 100755 --- a/test/ng/compileSpec.js +++ b/test/ng/compileSpec.js @@ -5453,7 +5453,7 @@ describe('$compile', function() { this.$onChanges = function(changes) { if (changes.input) { - log.push(['$onChanges', changes.input]); + log.push(['$onChanges', copy(changes.input)]); } }; } @@ -5482,6 +5482,53 @@ describe('$compile', function() { }); }); + it('should not update isolate again after $onInit if outer object reference has not changed', function() { + module('owComponentTest'); + inject(function() { + $rootScope.name = ['outer']; + compile(''); + + expect($rootScope.name).toEqual(['outer']); + expect(component.input).toEqual('$onInit'); + + $rootScope.name[0] = 'inner'; + $rootScope.$digest(); + + expect($rootScope.name).toEqual(['inner']); + expect(component.input).toEqual('$onInit'); + + expect(log).toEqual([ + 'constructor', + ['$onChanges', jasmine.objectContaining({ currentValue: ['outer'] })], + '$onInit' + ]); + }); + }); + + it('should update isolate again after $onInit if outer object reference changes even if equal', function() { + module('owComponentTest'); + inject(function() { + $rootScope.name = ['outer']; + compile(''); + + expect($rootScope.name).toEqual(['outer']); + expect(component.input).toEqual('$onInit'); + + $rootScope.name = ['outer']; + $rootScope.$digest(); + + expect($rootScope.name).toEqual(['outer']); + expect(component.input).toEqual(['outer']); + + expect(log).toEqual([ + 'constructor', + ['$onChanges', jasmine.objectContaining({ currentValue: ['outer'] })], + '$onInit', + ['$onChanges', jasmine.objectContaining({ previousValue: ['outer'], currentValue: ['outer'] })] + ]); + }); + }); + it('should not update isolate again after $onInit if outer is a literal', function() { module('owComponentTest'); inject(function() { From 586e2acb269016a0fee66ac33f4a385f631afad0 Mon Sep 17 00:00:00 2001 From: Jonathan Yates Date: Wed, 19 Oct 2016 09:33:15 -0700 Subject: [PATCH 0247/1173] fix($compile): clean up `@`-binding observers when re-assigning bindings Fixes #15268 Closes #15298 --- src/ng/compile.js | 3 ++- test/ng/compileSpec.js | 31 +++++++++++++++++++++++++++++++ 2 files changed, 33 insertions(+), 1 deletion(-) diff --git a/src/ng/compile.js b/src/ng/compile.js index bc1cae5bfca6..6d988aa698f9 100644 --- a/src/ng/compile.js +++ b/src/ng/compile.js @@ -3434,7 +3434,7 @@ function $CompileProvider($provide, $$sanitizeUriProvider) { if (!optional && !hasOwnProperty.call(attrs, attrName)) { destination[scopeName] = attrs[attrName] = undefined; } - attrs.$observe(attrName, function(value) { + removeWatch = attrs.$observe(attrName, function(value) { if (isString(value) || isBoolean(value)) { var oldValue = destination[scopeName]; recordChanges(scopeName, value, oldValue); @@ -3453,6 +3453,7 @@ function $CompileProvider($provide, $$sanitizeUriProvider) { destination[scopeName] = lastValue; } initialChanges[scopeName] = new SimpleChange(_UNINITIALIZED_VALUE, destination[scopeName]); + removeWatchCollection.push(removeWatch); break; case '=': diff --git a/test/ng/compileSpec.js b/test/ng/compileSpec.js index 4c4f1f589a2f..4b85144bf8dd 100755 --- a/test/ng/compileSpec.js +++ b/test/ng/compileSpec.js @@ -4378,6 +4378,37 @@ describe('$compile', function() { }); }); + it('should clean up `@`-binding observers when re-assigning bindings', function() { + var constructorSpy = jasmine.createSpy('constructor'); + var prototypeSpy = jasmine.createSpy('prototype'); + + function TestController() { + return {$onChanges: constructorSpy}; + } + TestController.prototype.$onChanges = prototypeSpy; + + module(function($compileProvider) { + $compileProvider.component('test', { + bindings: {attr: '@'}, + controller: TestController + }); + }); + + inject(function($compile, $rootScope) { + var template = ''; + $rootScope.a = 'foo'; + + element = $compile(template)($rootScope); + $rootScope.$digest(); + expect(constructorSpy).toHaveBeenCalled(); + expect(prototypeSpy).not.toHaveBeenCalled(); + + constructorSpy.calls.reset(); + $rootScope.$apply('a = "bar"'); + expect(constructorSpy).toHaveBeenCalled(); + expect(prototypeSpy).not.toHaveBeenCalled(); + }); + }); it('should not call `$onChanges` twice even when the initial value is `NaN`', function() { var onChangesSpy = jasmine.createSpy('$onChanges'); From a6118dfda45b2911c305d344a7c6a4a9411e2d13 Mon Sep 17 00:00:00 2001 From: Georgios Kalpakas Date: Fri, 21 Oct 2016 11:58:31 +0300 Subject: [PATCH 0248/1173] chore(ng-closure-runner): upgrade to version 0.2.4 Version 0.2.4's `minErr` implementation is up to date with the one in core. Fixes #14971 Closes #15307 --- bower.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bower.json b/bower.json index 1d6ee278b5f3..95db7a55a742 100644 --- a/bower.json +++ b/bower.json @@ -6,6 +6,6 @@ "jquery-2.2": "jquery#2.2.4", "jquery-2.1": "jquery#2.1.4", "closure-compiler": "https://dl.google.com/closure-compiler/compiler-20140814.zip", - "ng-closure-runner": "https://raw.github.com/angular/ng-closure-runner/v0.2.3/assets/ng-closure-runner.zip" + "ng-closure-runner": "https://raw.github.com/angular/ng-closure-runner/v0.2.4/assets/ng-closure-runner.zip" } } From eeb9ef09f9972ec1850549f06a324f150b732873 Mon Sep 17 00:00:00 2001 From: Peter Bacon Darwin Date: Fri, 21 Oct 2016 08:58:36 +0100 Subject: [PATCH 0249/1173] chore(gruntfile): check the node version before starting We specify the node version that is required to run the build in the `.nvmrc` file. So let's check that the current node version satisfies this and report a helpful message if it is not. --- Gruntfile.js | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/Gruntfile.js b/Gruntfile.js index 5b31c8ea24be..c338ae85f9da 100644 --- a/Gruntfile.js +++ b/Gruntfile.js @@ -9,6 +9,14 @@ var versionInfo = require('./lib/versions/version-info'); var path = require('path'); var e2e = require('./test/e2e/tools'); +var semver = require('semver'); +var fs = require('fs'); + +var useNodeVersion = fs.readFileSync('.nvmrc', 'utf8'); +if (!semver.satisfies(process.version, useNodeVersion)) { + throw new Error('Invalid node version; please use node v' + useNodeVersion); +} + module.exports = function(grunt) { //grunt plugins require('load-grunt-tasks')(grunt); From 21ac2c42eab490a1fb2235c694ae8d934c5e9b36 Mon Sep 17 00:00:00 2001 From: emed Date: Tue, 25 Oct 2016 10:11:22 -0600 Subject: [PATCH 0250/1173] docs(error/ueoe): add another possible cause Mention unescaped quotes as another possible cause for this error. Closes #15313 --- docs/content/error/$parse/ueoe.ngdoc | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/docs/content/error/$parse/ueoe.ngdoc b/docs/content/error/$parse/ueoe.ngdoc index 97535a317416..e96df0322377 100644 --- a/docs/content/error/$parse/ueoe.ngdoc +++ b/docs/content/error/$parse/ueoe.ngdoc @@ -4,6 +4,9 @@ @description Occurs when an expression is missing tokens at the end of the expression. -For example, forgetting a closing bracket in an expression will trigger this error. -To resolve, learn more about {@link guide/expression Angular expressions}, identify the error and fix the expression's syntax. +For example, forgetting to close a bracket or failing to properly escape quotes in an expression +will trigger this error. + +To resolve, learn more about {@link guide/expression Angular expressions}, identify the error and +fix the expression's syntax. From 6a3374968680ccd809b62ba22b834389ebba99bc Mon Sep 17 00:00:00 2001 From: Allan Watson Date: Thu, 20 Oct 2016 13:49:18 -0400 Subject: [PATCH 0251/1173] docs(orderBy): clarify behavior of default comparator wrt `null` Document how `orderBy`'s default comparator handles `null` values. Fixes #15293 Closes #15304 --- docs/content/guide/migration.ngdoc | 5 ++++- src/ng/filter/orderBy.js | 3 +++ 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/docs/content/guide/migration.ngdoc b/docs/content/guide/migration.ngdoc index 6ddb29cb5a25..db4b5754639f 100644 --- a/docs/content/guide/migration.ngdoc +++ b/docs/content/guide/migration.ngdoc @@ -1125,7 +1125,11 @@ and "$dependentProvider" would have actually accomplished something and changed app. This is no longer possible within a single module. +### Filters (`orderBy`) +- due to [a097aa95](https://github.com/angular/angular.js/commit/a097aa95b7c78beab6d1b7d521c25f7d9d7843d9), + `orderBy` now treats `null` values (which in JavaScript have type `object`) as having a string + represenation of `'null'`. ### Animation (`ngAnimate`) @@ -1229,7 +1233,6 @@ or simply use: - ## Migrating from 1.0 to 1.2 diff --git a/src/ng/filter/orderBy.js b/src/ng/filter/orderBy.js index a86f3a82ab90..f65821a98e6a 100644 --- a/src/ng/filter/orderBy.js +++ b/src/ng/filter/orderBy.js @@ -86,6 +86,9 @@ * * **Note:** If you notice numbers not being sorted as expected, make sure they are actually being * saved as numbers and not strings. + * **Note:** For the purpose of sorting, `null` values are treated as the string `'null'` (i.e. + * `type: 'string'`, `value: 'null'`). This may cause unexpected sort order relative to + * other values. * * @param {Array|ArrayLike} collection - The collection (array or array-like object) to sort. * @param {(Function|string|Array.)=} expression - A predicate (or list of From 491d23ed571c514cdd44479166d843501813ac91 Mon Sep 17 00:00:00 2001 From: Peter Bacon Darwin Date: Wed, 26 Oct 2016 17:21:57 +0100 Subject: [PATCH 0252/1173] chore(deps): add changez --- npm-shrinkwrap.clean.json | 794 ++++++++++++++++++++++ npm-shrinkwrap.json | 1325 ++++++++++++++++++++++++++++++++++++- package.json | 4 +- 3 files changed, 2086 insertions(+), 37 deletions(-) diff --git a/npm-shrinkwrap.clean.json b/npm-shrinkwrap.clean.json index 16f7fc7818c4..4a38d100b7bc 100644 --- a/npm-shrinkwrap.clean.json +++ b/npm-shrinkwrap.clean.json @@ -2212,6 +2212,800 @@ "canonical-path": { "version": "0.0.2" }, + "changez": { + "version": "2.1.1", + "dependencies": { + "commander": { + "version": "2.9.0", + "dependencies": { + "graceful-readlink": { + "version": "1.0.1" + } + } + }, + "find-package": { + "version": "1.0.0", + "dependencies": { + "parents": { + "version": "1.0.1", + "dependencies": { + "path-platform": { + "version": "0.11.15" + } + } + } + } + }, + "nunjucks": { + "version": "2.5.2", + "dependencies": { + "asap": { + "version": "2.0.5" + }, + "chokidar": { + "version": "1.6.1", + "dependencies": { + "anymatch": { + "version": "1.3.0", + "dependencies": { + "arrify": { + "version": "1.0.1" + }, + "micromatch": { + "version": "2.3.11", + "dependencies": { + "arr-diff": { + "version": "2.0.0", + "dependencies": { + "arr-flatten": { + "version": "1.0.1" + } + } + }, + "array-unique": { + "version": "0.2.1" + }, + "braces": { + "version": "1.8.5", + "dependencies": { + "expand-range": { + "version": "1.8.2", + "dependencies": { + "fill-range": { + "version": "2.2.3", + "dependencies": { + "is-number": { + "version": "2.1.0" + }, + "isobject": { + "version": "2.1.0", + "dependencies": { + "isarray": { + "version": "1.0.0" + } + } + }, + "randomatic": { + "version": "1.1.5" + }, + "repeat-string": { + "version": "1.6.1" + } + } + } + } + }, + "preserve": { + "version": "0.2.0" + }, + "repeat-element": { + "version": "1.1.2" + } + } + }, + "expand-brackets": { + "version": "0.1.5", + "dependencies": { + "is-posix-bracket": { + "version": "0.1.1" + } + } + }, + "extglob": { + "version": "0.3.2" + }, + "filename-regex": { + "version": "2.0.0" + }, + "is-extglob": { + "version": "1.0.0" + }, + "kind-of": { + "version": "3.0.4", + "dependencies": { + "is-buffer": { + "version": "1.1.4" + } + } + }, + "normalize-path": { + "version": "2.0.1" + }, + "object.omit": { + "version": "2.0.0", + "dependencies": { + "for-own": { + "version": "0.1.4", + "dependencies": { + "for-in": { + "version": "0.1.6" + } + } + }, + "is-extendable": { + "version": "0.1.1" + } + } + }, + "parse-glob": { + "version": "3.0.4", + "dependencies": { + "glob-base": { + "version": "0.3.0" + }, + "is-dotfile": { + "version": "1.0.2" + } + } + }, + "regex-cache": { + "version": "0.4.3", + "dependencies": { + "is-equal-shallow": { + "version": "0.1.3" + }, + "is-primitive": { + "version": "2.0.0" + } + } + } + } + } + } + }, + "async-each": { + "version": "1.0.1" + }, + "glob-parent": { + "version": "2.0.0" + }, + "inherits": { + "version": "2.0.3" + }, + "is-binary-path": { + "version": "1.0.1", + "dependencies": { + "binary-extensions": { + "version": "1.7.0" + } + } + }, + "is-glob": { + "version": "2.0.1", + "dependencies": { + "is-extglob": { + "version": "1.0.0" + } + } + }, + "path-is-absolute": { + "version": "1.0.1" + }, + "readdirp": { + "version": "2.1.0", + "dependencies": { + "graceful-fs": { + "version": "4.1.9" + }, + "minimatch": { + "version": "3.0.3", + "dependencies": { + "brace-expansion": { + "version": "1.1.6", + "dependencies": { + "balanced-match": { + "version": "0.4.2" + }, + "concat-map": { + "version": "0.0.1" + } + } + } + } + }, + "readable-stream": { + "version": "2.1.5", + "dependencies": { + "buffer-shims": { + "version": "1.0.0" + }, + "core-util-is": { + "version": "1.0.2" + }, + "isarray": { + "version": "1.0.0" + }, + "process-nextick-args": { + "version": "1.0.7" + }, + "string_decoder": { + "version": "0.10.31" + }, + "util-deprecate": { + "version": "1.0.2" + } + } + }, + "set-immediate-shim": { + "version": "1.0.1" + } + } + }, + "fsevents": { + "version": "1.0.14", + "dependencies": { + "nan": { + "version": "2.4.0" + }, + "node-pre-gyp": { + "version": "0.6.29" + }, + "abbrev": { + "version": "1.0.9" + }, + "ansi-styles": { + "version": "2.2.1" + }, + "aproba": { + "version": "1.0.4" + }, + "ansi-regex": { + "version": "2.0.0" + }, + "are-we-there-yet": { + "version": "1.1.2" + }, + "asn1": { + "version": "0.2.3" + }, + "assert-plus": { + "version": "0.2.0" + }, + "aws-sign2": { + "version": "0.6.0" + }, + "async": { + "version": "1.5.2" + }, + "aws4": { + "version": "1.4.1" + }, + "block-stream": { + "version": "0.0.9" + }, + "balanced-match": { + "version": "0.4.2" + }, + "boom": { + "version": "2.10.1" + }, + "brace-expansion": { + "version": "1.1.5" + }, + "caseless": { + "version": "0.11.0" + }, + "buffer-shims": { + "version": "1.0.0" + }, + "chalk": { + "version": "1.1.3" + }, + "code-point-at": { + "version": "1.0.0" + }, + "commander": { + "version": "2.9.0" + }, + "combined-stream": { + "version": "1.0.5" + }, + "concat-map": { + "version": "0.0.1" + }, + "cryptiles": { + "version": "2.0.5" + }, + "console-control-strings": { + "version": "1.1.0" + }, + "debug": { + "version": "2.2.0" + }, + "core-util-is": { + "version": "1.0.2" + }, + "deep-extend": { + "version": "0.4.1" + }, + "delegates": { + "version": "1.0.0" + }, + "ecc-jsbn": { + "version": "0.1.1" + }, + "delayed-stream": { + "version": "1.0.0" + }, + "extend": { + "version": "3.0.0" + }, + "escape-string-regexp": { + "version": "1.0.5" + }, + "extsprintf": { + "version": "1.0.2" + }, + "forever-agent": { + "version": "0.6.1" + }, + "fstream": { + "version": "1.0.10" + }, + "gauge": { + "version": "2.6.0" + }, + "fs.realpath": { + "version": "1.0.0" + }, + "form-data": { + "version": "1.0.0-rc4" + }, + "fstream-ignore": { + "version": "1.0.5" + }, + "generate-object-property": { + "version": "1.2.0" + }, + "generate-function": { + "version": "2.0.0" + }, + "graceful-fs": { + "version": "4.1.4" + }, + "graceful-readlink": { + "version": "1.0.1" + }, + "glob": { + "version": "7.0.5" + }, + "har-validator": { + "version": "2.0.6" + }, + "has-unicode": { + "version": "2.0.1" + }, + "has-ansi": { + "version": "2.0.0" + }, + "has-color": { + "version": "0.1.7" + }, + "hoek": { + "version": "2.16.3" + }, + "hawk": { + "version": "3.1.3" + }, + "inherits": { + "version": "2.0.1" + }, + "ini": { + "version": "1.3.4" + }, + "http-signature": { + "version": "1.1.1" + }, + "is-my-json-valid": { + "version": "2.13.1" + }, + "is-fullwidth-code-point": { + "version": "1.0.0" + }, + "is-typedarray": { + "version": "1.0.0" + }, + "inflight": { + "version": "1.0.5" + }, + "isarray": { + "version": "1.0.0" + }, + "is-property": { + "version": "1.0.2" + }, + "jodid25519": { + "version": "1.0.2" + }, + "isstream": { + "version": "0.1.2" + }, + "jsonpointer": { + "version": "2.0.0" + }, + "jsbn": { + "version": "0.1.0" + }, + "json-schema": { + "version": "0.2.2" + }, + "json-stringify-safe": { + "version": "5.0.1" + }, + "mime-db": { + "version": "1.23.0" + }, + "jsprim": { + "version": "1.3.0" + }, + "minimist": { + "version": "0.0.8" + }, + "mime-types": { + "version": "2.1.11" + }, + "minimatch": { + "version": "3.0.2" + }, + "ms": { + "version": "0.7.1" + }, + "mkdirp": { + "version": "0.5.1" + }, + "nopt": { + "version": "3.0.6" + }, + "node-uuid": { + "version": "1.4.7" + }, + "npmlog": { + "version": "3.1.2" + }, + "oauth-sign": { + "version": "0.8.2" + }, + "number-is-nan": { + "version": "1.0.0" + }, + "object-assign": { + "version": "4.1.0" + }, + "pinkie": { + "version": "2.0.4" + }, + "pinkie-promise": { + "version": "2.0.1" + }, + "process-nextick-args": { + "version": "1.0.7" + }, + "once": { + "version": "1.3.3" + }, + "path-is-absolute": { + "version": "1.0.0" + }, + "qs": { + "version": "6.2.0" + }, + "readable-stream": { + "version": "2.1.4" + }, + "request": { + "version": "2.73.0" + }, + "rimraf": { + "version": "2.5.3" + }, + "semver": { + "version": "5.2.0" + }, + "signal-exit": { + "version": "3.0.0" + }, + "set-blocking": { + "version": "2.0.0" + }, + "string_decoder": { + "version": "0.10.31" + }, + "strip-ansi": { + "version": "3.0.1" + }, + "sntp": { + "version": "1.0.9" + }, + "stringstream": { + "version": "0.0.5" + }, + "string-width": { + "version": "1.0.1" + }, + "tar": { + "version": "2.2.1" + }, + "tunnel-agent": { + "version": "0.4.3" + }, + "strip-json-comments": { + "version": "1.0.4" + }, + "tar-pack": { + "version": "3.1.4" + }, + "tough-cookie": { + "version": "2.2.2" + }, + "supports-color": { + "version": "2.0.0" + }, + "uid-number": { + "version": "0.0.6" + }, + "util-deprecate": { + "version": "1.0.2" + }, + "tweetnacl": { + "version": "0.13.3" + }, + "verror": { + "version": "1.3.6" + }, + "wide-align": { + "version": "1.1.0" + }, + "xtend": { + "version": "4.0.1" + }, + "wrappy": { + "version": "1.0.2" + }, + "bl": { + "version": "1.1.2", + "dependencies": { + "readable-stream": { + "version": "2.0.6" + } + } + }, + "sshpk": { + "version": "1.8.3", + "dependencies": { + "assert-plus": { + "version": "1.0.0" + } + } + }, + "dashdash": { + "version": "1.14.0", + "dependencies": { + "assert-plus": { + "version": "1.0.0" + } + } + }, + "getpass": { + "version": "0.1.6", + "dependencies": { + "assert-plus": { + "version": "1.0.0" + } + } + }, + "rc": { + "version": "1.1.6", + "dependencies": { + "minimist": { + "version": "1.2.0" + } + } + } + } + } + } + }, + "yargs": { + "version": "3.32.0", + "dependencies": { + "camelcase": { + "version": "2.1.1" + }, + "cliui": { + "version": "3.2.0", + "dependencies": { + "strip-ansi": { + "version": "3.0.1", + "dependencies": { + "ansi-regex": { + "version": "2.0.0" + } + } + }, + "wrap-ansi": { + "version": "2.0.0" + } + } + }, + "decamelize": { + "version": "1.2.0" + }, + "os-locale": { + "version": "1.4.0", + "dependencies": { + "lcid": { + "version": "1.0.0", + "dependencies": { + "invert-kv": { + "version": "1.0.0" + } + } + } + } + }, + "string-width": { + "version": "1.0.2", + "dependencies": { + "code-point-at": { + "version": "1.0.1", + "dependencies": { + "number-is-nan": { + "version": "1.0.1" + } + } + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "dependencies": { + "number-is-nan": { + "version": "1.0.1" + } + } + }, + "strip-ansi": { + "version": "3.0.1", + "dependencies": { + "ansi-regex": { + "version": "2.0.0" + } + } + } + } + }, + "window-size": { + "version": "0.1.4" + }, + "y18n": { + "version": "3.2.1" + } + } + } + } + }, + "shelljs": { + "version": "0.7.4", + "dependencies": { + "glob": { + "version": "7.1.1", + "dependencies": { + "fs.realpath": { + "version": "1.0.0" + }, + "inflight": { + "version": "1.0.6", + "dependencies": { + "wrappy": { + "version": "1.0.2" + } + } + }, + "inherits": { + "version": "2.0.3" + }, + "minimatch": { + "version": "3.0.3", + "dependencies": { + "brace-expansion": { + "version": "1.1.6", + "dependencies": { + "balanced-match": { + "version": "0.4.2" + }, + "concat-map": { + "version": "0.0.1" + } + } + } + } + }, + "once": { + "version": "1.4.0", + "dependencies": { + "wrappy": { + "version": "1.0.2" + } + } + }, + "path-is-absolute": { + "version": "1.0.1" + } + } + }, + "interpret": { + "version": "1.0.1" + }, + "rechoir": { + "version": "0.6.2", + "dependencies": { + "resolve": { + "version": "1.1.7" + } + } + } + } + }, + "simple-node-logger": { + "version": "0.93.12", + "dependencies": { + "lodash": { + "version": "4.16.4" + }, + "moment": { + "version": "2.15.2" + }, + "path": { + "version": "0.12.7", + "dependencies": { + "process": { + "version": "0.11.9" + } + } + }, + "util": { + "version": "0.10.3", + "dependencies": { + "inherits": { + "version": "2.0.1" + } + } + } + } + } + } + }, + "changez-angular": { + "version": "2.1.0", + "dependencies": { + "nunjucks-date": { + "version": "1.2.0", + "dependencies": { + "moment": { + "version": "2.15.2" + } + } + } + } + }, "cheerio": { "version": "0.17.0", "dependencies": { diff --git a/npm-shrinkwrap.json b/npm-shrinkwrap.json index 4023e8f04610..2344bfb3726a 100644 --- a/npm-shrinkwrap.json +++ b/npm-shrinkwrap.json @@ -3402,6 +3402,1259 @@ "from": "https://registry.npmjs.org/canonical-path/-/canonical-path-0.0.2.tgz", "resolved": "https://registry.npmjs.org/canonical-path/-/canonical-path-0.0.2.tgz" }, + "changez": { + "version": "2.1.1", + "from": "changez@2.1.1", + "dependencies": { + "commander": { + "version": "2.9.0", + "from": "commander@>=2.9.0 <3.0.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.9.0.tgz", + "dependencies": { + "graceful-readlink": { + "version": "1.0.1", + "from": "graceful-readlink@>=1.0.0", + "resolved": "https://registry.npmjs.org/graceful-readlink/-/graceful-readlink-1.0.1.tgz" + } + } + }, + "find-package": { + "version": "1.0.0", + "from": "find-package@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/find-package/-/find-package-1.0.0.tgz", + "dependencies": { + "parents": { + "version": "1.0.1", + "from": "parents@>=1.0.1 <2.0.0", + "resolved": "https://registry.npmjs.org/parents/-/parents-1.0.1.tgz", + "dependencies": { + "path-platform": { + "version": "0.11.15", + "from": "path-platform@>=0.11.15 <0.12.0", + "resolved": "https://registry.npmjs.org/path-platform/-/path-platform-0.11.15.tgz" + } + } + } + } + }, + "nunjucks": { + "version": "2.5.2", + "from": "nunjucks@>=2.5.2 <3.0.0", + "resolved": "https://registry.npmjs.org/nunjucks/-/nunjucks-2.5.2.tgz", + "dependencies": { + "asap": { + "version": "2.0.5", + "from": "asap@>=2.0.3 <3.0.0", + "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.5.tgz" + }, + "chokidar": { + "version": "1.6.1", + "from": "chokidar@>=1.6.0 <2.0.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-1.6.1.tgz", + "dependencies": { + "anymatch": { + "version": "1.3.0", + "from": "anymatch@>=1.3.0 <2.0.0", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-1.3.0.tgz", + "dependencies": { + "arrify": { + "version": "1.0.1", + "from": "arrify@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz" + }, + "micromatch": { + "version": "2.3.11", + "from": "micromatch@>=2.1.5 <3.0.0", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz", + "dependencies": { + "arr-diff": { + "version": "2.0.0", + "from": "arr-diff@>=2.0.0 <3.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz", + "dependencies": { + "arr-flatten": { + "version": "1.0.1", + "from": "arr-flatten@>=1.0.1 <2.0.0", + "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.0.1.tgz" + } + } + }, + "array-unique": { + "version": "0.2.1", + "from": "array-unique@>=0.2.1 <0.3.0", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz" + }, + "braces": { + "version": "1.8.5", + "from": "braces@>=1.8.2 <2.0.0", + "resolved": "https://registry.npmjs.org/braces/-/braces-1.8.5.tgz", + "dependencies": { + "expand-range": { + "version": "1.8.2", + "from": "expand-range@>=1.8.1 <2.0.0", + "resolved": "https://registry.npmjs.org/expand-range/-/expand-range-1.8.2.tgz", + "dependencies": { + "fill-range": { + "version": "2.2.3", + "from": "fill-range@>=2.1.0 <3.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-2.2.3.tgz", + "dependencies": { + "is-number": { + "version": "2.1.0", + "from": "is-number@>=2.1.0 <3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-2.1.0.tgz" + }, + "isobject": { + "version": "2.1.0", + "from": "isobject@>=2.0.0 <3.0.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", + "dependencies": { + "isarray": { + "version": "1.0.0", + "from": "isarray@1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz" + } + } + }, + "randomatic": { + "version": "1.1.5", + "from": "randomatic@>=1.1.3 <2.0.0", + "resolved": "https://registry.npmjs.org/randomatic/-/randomatic-1.1.5.tgz" + }, + "repeat-string": { + "version": "1.6.1", + "from": "repeat-string@>=1.5.2 <2.0.0", + "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz" + } + } + } + } + }, + "preserve": { + "version": "0.2.0", + "from": "preserve@>=0.2.0 <0.3.0", + "resolved": "https://registry.npmjs.org/preserve/-/preserve-0.2.0.tgz" + }, + "repeat-element": { + "version": "1.1.2", + "from": "repeat-element@>=1.1.2 <2.0.0", + "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.2.tgz" + } + } + }, + "expand-brackets": { + "version": "0.1.5", + "from": "expand-brackets@>=0.1.4 <0.2.0", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz", + "dependencies": { + "is-posix-bracket": { + "version": "0.1.1", + "from": "is-posix-bracket@>=0.1.0 <0.2.0", + "resolved": "https://registry.npmjs.org/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz" + } + } + }, + "extglob": { + "version": "0.3.2", + "from": "extglob@>=0.3.1 <0.4.0", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz" + }, + "filename-regex": { + "version": "2.0.0", + "from": "filename-regex@>=2.0.0 <3.0.0", + "resolved": "https://registry.npmjs.org/filename-regex/-/filename-regex-2.0.0.tgz" + }, + "is-extglob": { + "version": "1.0.0", + "from": "is-extglob@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz" + }, + "kind-of": { + "version": "3.0.4", + "from": "kind-of@>=3.0.2 <4.0.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.0.4.tgz", + "dependencies": { + "is-buffer": { + "version": "1.1.4", + "from": "is-buffer@>=1.0.2 <2.0.0", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.4.tgz" + } + } + }, + "normalize-path": { + "version": "2.0.1", + "from": "normalize-path@>=2.0.1 <3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.0.1.tgz" + }, + "object.omit": { + "version": "2.0.0", + "from": "object.omit@>=2.0.0 <3.0.0", + "resolved": "https://registry.npmjs.org/object.omit/-/object.omit-2.0.0.tgz", + "dependencies": { + "for-own": { + "version": "0.1.4", + "from": "for-own@>=0.1.3 <0.2.0", + "resolved": "https://registry.npmjs.org/for-own/-/for-own-0.1.4.tgz", + "dependencies": { + "for-in": { + "version": "0.1.6", + "from": "for-in@>=0.1.5 <0.2.0", + "resolved": "https://registry.npmjs.org/for-in/-/for-in-0.1.6.tgz" + } + } + }, + "is-extendable": { + "version": "0.1.1", + "from": "is-extendable@>=0.1.1 <0.2.0", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz" + } + } + }, + "parse-glob": { + "version": "3.0.4", + "from": "parse-glob@>=3.0.4 <4.0.0", + "resolved": "https://registry.npmjs.org/parse-glob/-/parse-glob-3.0.4.tgz", + "dependencies": { + "glob-base": { + "version": "0.3.0", + "from": "glob-base@>=0.3.0 <0.4.0", + "resolved": "https://registry.npmjs.org/glob-base/-/glob-base-0.3.0.tgz" + }, + "is-dotfile": { + "version": "1.0.2", + "from": "is-dotfile@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/is-dotfile/-/is-dotfile-1.0.2.tgz" + } + } + }, + "regex-cache": { + "version": "0.4.3", + "from": "regex-cache@>=0.4.2 <0.5.0", + "resolved": "https://registry.npmjs.org/regex-cache/-/regex-cache-0.4.3.tgz", + "dependencies": { + "is-equal-shallow": { + "version": "0.1.3", + "from": "is-equal-shallow@>=0.1.3 <0.2.0", + "resolved": "https://registry.npmjs.org/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz" + }, + "is-primitive": { + "version": "2.0.0", + "from": "is-primitive@>=2.0.0 <3.0.0", + "resolved": "https://registry.npmjs.org/is-primitive/-/is-primitive-2.0.0.tgz" + } + } + } + } + } + } + }, + "async-each": { + "version": "1.0.1", + "from": "async-each@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.1.tgz" + }, + "glob-parent": { + "version": "2.0.0", + "from": "glob-parent@>=2.0.0 <3.0.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-2.0.0.tgz" + }, + "inherits": { + "version": "2.0.3", + "from": "inherits@>=2.0.0 <3.0.0", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz" + }, + "is-binary-path": { + "version": "1.0.1", + "from": "is-binary-path@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", + "dependencies": { + "binary-extensions": { + "version": "1.7.0", + "from": "binary-extensions@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.7.0.tgz" + } + } + }, + "is-glob": { + "version": "2.0.1", + "from": "is-glob@>=2.0.0 <3.0.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", + "dependencies": { + "is-extglob": { + "version": "1.0.0", + "from": "is-extglob@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz" + } + } + }, + "path-is-absolute": { + "version": "1.0.1", + "from": "path-is-absolute@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz" + }, + "readdirp": { + "version": "2.1.0", + "from": "readdirp@>=2.0.0 <3.0.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.1.0.tgz", + "dependencies": { + "graceful-fs": { + "version": "4.1.9", + "from": "graceful-fs@>=4.1.2 <5.0.0", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.9.tgz" + }, + "minimatch": { + "version": "3.0.3", + "from": "minimatch@>=3.0.2 <4.0.0", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.3.tgz", + "dependencies": { + "brace-expansion": { + "version": "1.1.6", + "from": "brace-expansion@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.6.tgz", + "dependencies": { + "balanced-match": { + "version": "0.4.2", + "from": "balanced-match@>=0.4.1 <0.5.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-0.4.2.tgz" + }, + "concat-map": { + "version": "0.0.1", + "from": "concat-map@0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz" + } + } + } + } + }, + "readable-stream": { + "version": "2.1.5", + "from": "readable-stream@>=2.0.2 <3.0.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.1.5.tgz", + "dependencies": { + "buffer-shims": { + "version": "1.0.0", + "from": "buffer-shims@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/buffer-shims/-/buffer-shims-1.0.0.tgz" + }, + "core-util-is": { + "version": "1.0.2", + "from": "core-util-is@>=1.0.0 <1.1.0", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz" + }, + "isarray": { + "version": "1.0.0", + "from": "isarray@>=1.0.0 <1.1.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz" + }, + "process-nextick-args": { + "version": "1.0.7", + "from": "process-nextick-args@>=1.0.6 <1.1.0", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz" + }, + "string_decoder": { + "version": "0.10.31", + "from": "string_decoder@>=0.10.0 <0.11.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz" + }, + "util-deprecate": { + "version": "1.0.2", + "from": "util-deprecate@>=1.0.1 <1.1.0", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz" + } + } + }, + "set-immediate-shim": { + "version": "1.0.1", + "from": "set-immediate-shim@>=1.0.1 <2.0.0", + "resolved": "https://registry.npmjs.org/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz" + } + } + }, + "fsevents": { + "version": "1.0.14", + "from": "fsevents@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.0.14.tgz", + "dependencies": { + "nan": { + "version": "2.4.0", + "from": "nan@>=2.3.0 <3.0.0", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.4.0.tgz" + }, + "node-pre-gyp": { + "version": "0.6.29", + "from": "node-pre-gyp@>=0.6.29 <0.7.0", + "resolved": "https://registry.npmjs.org/node-pre-gyp/-/node-pre-gyp-0.6.29.tgz" + }, + "abbrev": { + "version": "1.0.9", + "from": "abbrev@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.0.9.tgz" + }, + "ansi-styles": { + "version": "2.2.1", + "from": "ansi-styles@>=2.2.1 <3.0.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz" + }, + "aproba": { + "version": "1.0.4", + "from": "aproba@>=1.0.3 <2.0.0", + "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.0.4.tgz" + }, + "ansi-regex": { + "version": "2.0.0", + "from": "ansi-regex@>=2.0.0 <3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.0.0.tgz" + }, + "are-we-there-yet": { + "version": "1.1.2", + "from": "are-we-there-yet@>=1.1.2 <1.2.0", + "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.2.tgz" + }, + "asn1": { + "version": "0.2.3", + "from": "asn1@>=0.2.3 <0.3.0", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.3.tgz" + }, + "assert-plus": { + "version": "0.2.0", + "from": "assert-plus@>=0.2.0 <0.3.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-0.2.0.tgz" + }, + "aws-sign2": { + "version": "0.6.0", + "from": "aws-sign2@>=0.6.0 <0.7.0", + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.6.0.tgz" + }, + "async": { + "version": "1.5.2", + "from": "async@>=1.5.2 <2.0.0", + "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz" + }, + "aws4": { + "version": "1.4.1", + "from": "aws4@>=1.2.1 <2.0.0", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.4.1.tgz" + }, + "block-stream": { + "version": "0.0.9", + "from": "block-stream@*", + "resolved": "https://registry.npmjs.org/block-stream/-/block-stream-0.0.9.tgz" + }, + "balanced-match": { + "version": "0.4.2", + "from": "balanced-match@>=0.4.1 <0.5.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-0.4.2.tgz" + }, + "boom": { + "version": "2.10.1", + "from": "boom@>=2.0.0 <3.0.0", + "resolved": "https://registry.npmjs.org/boom/-/boom-2.10.1.tgz" + }, + "brace-expansion": { + "version": "1.1.5", + "from": "brace-expansion@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.5.tgz" + }, + "caseless": { + "version": "0.11.0", + "from": "caseless@>=0.11.0 <0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.11.0.tgz" + }, + "buffer-shims": { + "version": "1.0.0", + "from": "buffer-shims@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/buffer-shims/-/buffer-shims-1.0.0.tgz" + }, + "chalk": { + "version": "1.1.3", + "from": "chalk@>=1.1.1 <2.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz" + }, + "code-point-at": { + "version": "1.0.0", + "from": "code-point-at@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.0.0.tgz" + }, + "commander": { + "version": "2.9.0", + "from": "commander@>=2.9.0 <3.0.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.9.0.tgz" + }, + "combined-stream": { + "version": "1.0.5", + "from": "combined-stream@>=1.0.5 <1.1.0", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.5.tgz" + }, + "concat-map": { + "version": "0.0.1", + "from": "concat-map@0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz" + }, + "cryptiles": { + "version": "2.0.5", + "from": "cryptiles@>=2.0.0 <3.0.0", + "resolved": "https://registry.npmjs.org/cryptiles/-/cryptiles-2.0.5.tgz" + }, + "console-control-strings": { + "version": "1.1.0", + "from": "console-control-strings@>=1.1.0 <1.2.0", + "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz" + }, + "debug": { + "version": "2.2.0", + "from": "debug@>=2.2.0 <2.3.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.2.0.tgz" + }, + "core-util-is": { + "version": "1.0.2", + "from": "core-util-is@>=1.0.0 <1.1.0", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz" + }, + "deep-extend": { + "version": "0.4.1", + "from": "deep-extend@>=0.4.0 <0.5.0", + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.4.1.tgz" + }, + "delegates": { + "version": "1.0.0", + "from": "delegates@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz" + }, + "ecc-jsbn": { + "version": "0.1.1", + "from": "ecc-jsbn@>=0.1.1 <0.2.0", + "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz" + }, + "delayed-stream": { + "version": "1.0.0", + "from": "delayed-stream@>=1.0.0 <1.1.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz" + }, + "extend": { + "version": "3.0.0", + "from": "extend@>=3.0.0 <3.1.0", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.0.tgz" + }, + "escape-string-regexp": { + "version": "1.0.5", + "from": "escape-string-regexp@>=1.0.2 <2.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz" + }, + "extsprintf": { + "version": "1.0.2", + "from": "extsprintf@1.0.2", + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.0.2.tgz" + }, + "forever-agent": { + "version": "0.6.1", + "from": "forever-agent@>=0.6.1 <0.7.0", + "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz" + }, + "fstream": { + "version": "1.0.10", + "from": "fstream@>=1.0.2 <2.0.0", + "resolved": "https://registry.npmjs.org/fstream/-/fstream-1.0.10.tgz" + }, + "gauge": { + "version": "2.6.0", + "from": "gauge@>=2.6.0 <2.7.0", + "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.6.0.tgz" + }, + "fs.realpath": { + "version": "1.0.0", + "from": "fs.realpath@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz" + }, + "form-data": { + "version": "1.0.0-rc4", + "from": "form-data@>=1.0.0-rc4 <1.1.0", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-1.0.0-rc4.tgz" + }, + "fstream-ignore": { + "version": "1.0.5", + "from": "fstream-ignore@>=1.0.5 <1.1.0", + "resolved": "https://registry.npmjs.org/fstream-ignore/-/fstream-ignore-1.0.5.tgz" + }, + "generate-object-property": { + "version": "1.2.0", + "from": "generate-object-property@>=1.1.0 <2.0.0", + "resolved": "https://registry.npmjs.org/generate-object-property/-/generate-object-property-1.2.0.tgz" + }, + "generate-function": { + "version": "2.0.0", + "from": "generate-function@>=2.0.0 <3.0.0", + "resolved": "https://registry.npmjs.org/generate-function/-/generate-function-2.0.0.tgz" + }, + "graceful-fs": { + "version": "4.1.4", + "from": "graceful-fs@>=4.1.2 <5.0.0", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.4.tgz" + }, + "graceful-readlink": { + "version": "1.0.1", + "from": "graceful-readlink@>=1.0.0", + "resolved": "https://registry.npmjs.org/graceful-readlink/-/graceful-readlink-1.0.1.tgz" + }, + "glob": { + "version": "7.0.5", + "from": "glob@>=7.0.5 <8.0.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.0.5.tgz" + }, + "har-validator": { + "version": "2.0.6", + "from": "har-validator@>=2.0.6 <2.1.0", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-2.0.6.tgz" + }, + "has-unicode": { + "version": "2.0.1", + "from": "has-unicode@>=2.0.0 <3.0.0", + "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz" + }, + "has-ansi": { + "version": "2.0.0", + "from": "has-ansi@>=2.0.0 <3.0.0", + "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz" + }, + "has-color": { + "version": "0.1.7", + "from": "has-color@>=0.1.7 <0.2.0", + "resolved": "https://registry.npmjs.org/has-color/-/has-color-0.1.7.tgz" + }, + "hoek": { + "version": "2.16.3", + "from": "hoek@>=2.0.0 <3.0.0", + "resolved": "https://registry.npmjs.org/hoek/-/hoek-2.16.3.tgz" + }, + "hawk": { + "version": "3.1.3", + "from": "hawk@>=3.1.3 <3.2.0", + "resolved": "https://registry.npmjs.org/hawk/-/hawk-3.1.3.tgz" + }, + "inherits": { + "version": "2.0.1", + "from": "inherits@>=2.0.1 <2.1.0", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz" + }, + "ini": { + "version": "1.3.4", + "from": "ini@>=1.3.0 <1.4.0", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.4.tgz" + }, + "http-signature": { + "version": "1.1.1", + "from": "http-signature@>=1.1.0 <1.2.0", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.1.1.tgz" + }, + "is-my-json-valid": { + "version": "2.13.1", + "from": "is-my-json-valid@>=2.12.4 <3.0.0", + "resolved": "https://registry.npmjs.org/is-my-json-valid/-/is-my-json-valid-2.13.1.tgz" + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "from": "is-fullwidth-code-point@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz" + }, + "is-typedarray": { + "version": "1.0.0", + "from": "is-typedarray@>=1.0.0 <1.1.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz" + }, + "inflight": { + "version": "1.0.5", + "from": "inflight@>=1.0.4 <2.0.0", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.5.tgz" + }, + "isarray": { + "version": "1.0.0", + "from": "isarray@>=1.0.0 <1.1.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz" + }, + "is-property": { + "version": "1.0.2", + "from": "is-property@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/is-property/-/is-property-1.0.2.tgz" + }, + "jodid25519": { + "version": "1.0.2", + "from": "jodid25519@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/jodid25519/-/jodid25519-1.0.2.tgz" + }, + "isstream": { + "version": "0.1.2", + "from": "isstream@>=0.1.2 <0.2.0", + "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz" + }, + "jsonpointer": { + "version": "2.0.0", + "from": "jsonpointer@2.0.0", + "resolved": "https://registry.npmjs.org/jsonpointer/-/jsonpointer-2.0.0.tgz" + }, + "jsbn": { + "version": "0.1.0", + "from": "jsbn@>=0.1.0 <0.2.0", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.0.tgz" + }, + "json-schema": { + "version": "0.2.2", + "from": "json-schema@0.2.2", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.2.tgz" + }, + "json-stringify-safe": { + "version": "5.0.1", + "from": "json-stringify-safe@>=5.0.1 <5.1.0", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz" + }, + "mime-db": { + "version": "1.23.0", + "from": "mime-db@>=1.23.0 <1.24.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.23.0.tgz" + }, + "jsprim": { + "version": "1.3.0", + "from": "jsprim@>=1.2.2 <2.0.0", + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.3.0.tgz" + }, + "minimist": { + "version": "0.0.8", + "from": "minimist@0.0.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz" + }, + "mime-types": { + "version": "2.1.11", + "from": "mime-types@>=2.1.7 <2.2.0", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.11.tgz" + }, + "minimatch": { + "version": "3.0.2", + "from": "minimatch@>=3.0.2 <4.0.0", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.2.tgz" + }, + "ms": { + "version": "0.7.1", + "from": "ms@0.7.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.1.tgz" + }, + "mkdirp": { + "version": "0.5.1", + "from": "mkdirp@>=0.5.0 <0.6.0", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz" + }, + "nopt": { + "version": "3.0.6", + "from": "nopt@>=3.0.1 <3.1.0", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz" + }, + "node-uuid": { + "version": "1.4.7", + "from": "node-uuid@>=1.4.7 <1.5.0", + "resolved": "https://registry.npmjs.org/node-uuid/-/node-uuid-1.4.7.tgz" + }, + "npmlog": { + "version": "3.1.2", + "from": "npmlog@>=3.1.2 <3.2.0", + "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-3.1.2.tgz" + }, + "oauth-sign": { + "version": "0.8.2", + "from": "oauth-sign@>=0.8.1 <0.9.0", + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.8.2.tgz" + }, + "number-is-nan": { + "version": "1.0.0", + "from": "number-is-nan@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.0.tgz" + }, + "object-assign": { + "version": "4.1.0", + "from": "object-assign@>=4.1.0 <5.0.0", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.0.tgz" + }, + "pinkie": { + "version": "2.0.4", + "from": "pinkie@>=2.0.0 <3.0.0", + "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz" + }, + "pinkie-promise": { + "version": "2.0.1", + "from": "pinkie-promise@>=2.0.0 <3.0.0", + "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz" + }, + "process-nextick-args": { + "version": "1.0.7", + "from": "process-nextick-args@>=1.0.6 <1.1.0", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz" + }, + "once": { + "version": "1.3.3", + "from": "once@>=1.3.0 <2.0.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.3.3.tgz" + }, + "path-is-absolute": { + "version": "1.0.0", + "from": "path-is-absolute@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.0.tgz" + }, + "qs": { + "version": "6.2.0", + "from": "qs@>=6.2.0 <6.3.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.2.0.tgz" + }, + "readable-stream": { + "version": "2.1.4", + "from": "readable-stream@>=2.0.0 <3.0.0||>=1.1.13 <2.0.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.1.4.tgz" + }, + "request": { + "version": "2.73.0", + "from": "request@>=2.0.0 <3.0.0", + "resolved": "https://registry.npmjs.org/request/-/request-2.73.0.tgz" + }, + "rimraf": { + "version": "2.5.3", + "from": "rimraf@>=2.5.0 <2.6.0", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.5.3.tgz" + }, + "semver": { + "version": "5.2.0", + "from": "semver@>=5.2.0 <5.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.2.0.tgz" + }, + "signal-exit": { + "version": "3.0.0", + "from": "signal-exit@>=3.0.0 <4.0.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.0.tgz" + }, + "set-blocking": { + "version": "2.0.0", + "from": "set-blocking@>=2.0.0 <2.1.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz" + }, + "string_decoder": { + "version": "0.10.31", + "from": "string_decoder@>=0.10.0 <0.11.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz" + }, + "strip-ansi": { + "version": "3.0.1", + "from": "strip-ansi@>=3.0.1 <4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz" + }, + "sntp": { + "version": "1.0.9", + "from": "sntp@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/sntp/-/sntp-1.0.9.tgz" + }, + "stringstream": { + "version": "0.0.5", + "from": "stringstream@>=0.0.4 <0.1.0", + "resolved": "https://registry.npmjs.org/stringstream/-/stringstream-0.0.5.tgz" + }, + "string-width": { + "version": "1.0.1", + "from": "string-width@>=1.0.1 <2.0.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.1.tgz" + }, + "tar": { + "version": "2.2.1", + "from": "tar@>=2.2.0 <2.3.0", + "resolved": "https://registry.npmjs.org/tar/-/tar-2.2.1.tgz" + }, + "tunnel-agent": { + "version": "0.4.3", + "from": "tunnel-agent@>=0.4.1 <0.5.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.4.3.tgz" + }, + "strip-json-comments": { + "version": "1.0.4", + "from": "strip-json-comments@>=1.0.4 <1.1.0", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-1.0.4.tgz" + }, + "tar-pack": { + "version": "3.1.4", + "from": "tar-pack@>=3.1.0 <3.2.0", + "resolved": "https://registry.npmjs.org/tar-pack/-/tar-pack-3.1.4.tgz" + }, + "tough-cookie": { + "version": "2.2.2", + "from": "tough-cookie@>=2.2.0 <2.3.0", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.2.2.tgz" + }, + "supports-color": { + "version": "2.0.0", + "from": "supports-color@>=2.0.0 <3.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz" + }, + "uid-number": { + "version": "0.0.6", + "from": "uid-number@>=0.0.6 <0.1.0", + "resolved": "https://registry.npmjs.org/uid-number/-/uid-number-0.0.6.tgz" + }, + "util-deprecate": { + "version": "1.0.2", + "from": "util-deprecate@>=1.0.1 <1.1.0", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz" + }, + "tweetnacl": { + "version": "0.13.3", + "from": "tweetnacl@>=0.13.0 <0.14.0", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.13.3.tgz" + }, + "verror": { + "version": "1.3.6", + "from": "verror@1.3.6", + "resolved": "https://registry.npmjs.org/verror/-/verror-1.3.6.tgz" + }, + "wide-align": { + "version": "1.1.0", + "from": "wide-align@>=1.1.0 <2.0.0", + "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.0.tgz" + }, + "xtend": { + "version": "4.0.1", + "from": "xtend@>=4.0.0 <5.0.0", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz" + }, + "wrappy": { + "version": "1.0.2", + "from": "wrappy@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz" + }, + "bl": { + "version": "1.1.2", + "from": "bl@>=1.1.2 <1.2.0", + "resolved": "https://registry.npmjs.org/bl/-/bl-1.1.2.tgz", + "dependencies": { + "readable-stream": { + "version": "2.0.6", + "from": "readable-stream@>=2.0.5 <2.1.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.0.6.tgz" + } + } + }, + "sshpk": { + "version": "1.8.3", + "from": "sshpk@>=1.7.0 <2.0.0", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.8.3.tgz", + "dependencies": { + "assert-plus": { + "version": "1.0.0", + "from": "assert-plus@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz" + } + } + }, + "dashdash": { + "version": "1.14.0", + "from": "dashdash@>=1.12.0 <2.0.0", + "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.0.tgz", + "dependencies": { + "assert-plus": { + "version": "1.0.0", + "from": "assert-plus@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz" + } + } + }, + "getpass": { + "version": "0.1.6", + "from": "getpass@>=0.1.1 <0.2.0", + "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.6.tgz", + "dependencies": { + "assert-plus": { + "version": "1.0.0", + "from": "assert-plus@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz" + } + } + }, + "rc": { + "version": "1.1.6", + "from": "rc@>=1.1.0 <1.2.0", + "resolved": "https://registry.npmjs.org/rc/-/rc-1.1.6.tgz", + "dependencies": { + "minimist": { + "version": "1.2.0", + "from": "minimist@>=1.2.0 <2.0.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz" + } + } + } + } + } + } + }, + "yargs": { + "version": "3.32.0", + "from": "yargs@>=3.32.0 <4.0.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.32.0.tgz", + "dependencies": { + "camelcase": { + "version": "2.1.1", + "from": "camelcase@>=2.0.1 <3.0.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz" + }, + "cliui": { + "version": "3.2.0", + "from": "cliui@>=3.0.3 <4.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", + "dependencies": { + "strip-ansi": { + "version": "3.0.1", + "from": "strip-ansi@>=3.0.0 <4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "dependencies": { + "ansi-regex": { + "version": "2.0.0", + "from": "ansi-regex@>=2.0.0 <3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.0.0.tgz" + } + } + }, + "wrap-ansi": { + "version": "2.0.0", + "from": "wrap-ansi@>=2.0.0 <3.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.0.0.tgz" + } + } + }, + "decamelize": { + "version": "1.2.0", + "from": "decamelize@>=1.1.1 <2.0.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz" + }, + "os-locale": { + "version": "1.4.0", + "from": "os-locale@>=1.4.0 <2.0.0", + "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz", + "dependencies": { + "lcid": { + "version": "1.0.0", + "from": "lcid@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz", + "dependencies": { + "invert-kv": { + "version": "1.0.0", + "from": "invert-kv@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz" + } + } + } + } + }, + "string-width": { + "version": "1.0.2", + "from": "string-width@>=1.0.1 <2.0.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "dependencies": { + "code-point-at": { + "version": "1.0.1", + "from": "code-point-at@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.0.1.tgz", + "dependencies": { + "number-is-nan": { + "version": "1.0.1", + "from": "number-is-nan@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz" + } + } + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "from": "is-fullwidth-code-point@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "dependencies": { + "number-is-nan": { + "version": "1.0.1", + "from": "number-is-nan@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz" + } + } + }, + "strip-ansi": { + "version": "3.0.1", + "from": "strip-ansi@>=3.0.0 <4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "dependencies": { + "ansi-regex": { + "version": "2.0.0", + "from": "ansi-regex@>=2.0.0 <3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.0.0.tgz" + } + } + } + } + }, + "window-size": { + "version": "0.1.4", + "from": "window-size@>=0.1.4 <0.2.0", + "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.1.4.tgz" + }, + "y18n": { + "version": "3.2.1", + "from": "y18n@>=3.2.0 <4.0.0", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz" + } + } + } + } + }, + "shelljs": { + "version": "0.7.4", + "from": "shelljs@>=0.7.4 <0.8.0", + "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.7.4.tgz", + "dependencies": { + "glob": { + "version": "7.1.1", + "from": "glob@>=7.0.0 <8.0.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.1.tgz", + "dependencies": { + "fs.realpath": { + "version": "1.0.0", + "from": "fs.realpath@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz" + }, + "inflight": { + "version": "1.0.6", + "from": "inflight@>=1.0.4 <2.0.0", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "dependencies": { + "wrappy": { + "version": "1.0.2", + "from": "wrappy@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz" + } + } + }, + "inherits": { + "version": "2.0.3", + "from": "inherits@>=2.0.0 <3.0.0", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz" + }, + "minimatch": { + "version": "3.0.3", + "from": "minimatch@>=3.0.2 <4.0.0", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.3.tgz", + "dependencies": { + "brace-expansion": { + "version": "1.1.6", + "from": "brace-expansion@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.6.tgz", + "dependencies": { + "balanced-match": { + "version": "0.4.2", + "from": "balanced-match@>=0.4.1 <0.5.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-0.4.2.tgz" + }, + "concat-map": { + "version": "0.0.1", + "from": "concat-map@0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz" + } + } + } + } + }, + "once": { + "version": "1.4.0", + "from": "once@>=1.3.0 <2.0.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "dependencies": { + "wrappy": { + "version": "1.0.2", + "from": "wrappy@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz" + } + } + }, + "path-is-absolute": { + "version": "1.0.1", + "from": "path-is-absolute@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz" + } + } + }, + "interpret": { + "version": "1.0.1", + "from": "interpret@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.0.1.tgz" + }, + "rechoir": { + "version": "0.6.2", + "from": "rechoir@>=0.6.2 <0.7.0", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", + "dependencies": { + "resolve": { + "version": "1.1.7", + "from": "resolve@>=1.1.6 <2.0.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz" + } + } + } + } + }, + "simple-node-logger": { + "version": "0.93.12", + "from": "simple-node-logger@>=0.93.12 <0.94.0", + "resolved": "https://registry.npmjs.org/simple-node-logger/-/simple-node-logger-0.93.12.tgz", + "dependencies": { + "lodash": { + "version": "4.16.4", + "from": "lodash@>=4.5.0 <5.0.0", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.16.4.tgz" + }, + "moment": { + "version": "2.15.2", + "from": "moment@>=2.8.4 <3.0.0", + "resolved": "https://registry.npmjs.org/moment/-/moment-2.15.2.tgz" + }, + "path": { + "version": "0.12.7", + "from": "path@>=0.12.7 <0.13.0", + "resolved": "https://registry.npmjs.org/path/-/path-0.12.7.tgz", + "dependencies": { + "process": { + "version": "0.11.9", + "from": "process@>=0.11.1 <0.12.0", + "resolved": "https://registry.npmjs.org/process/-/process-0.11.9.tgz" + } + } + }, + "util": { + "version": "0.10.3", + "from": "util@>=0.10.3 <0.11.0", + "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz", + "dependencies": { + "inherits": { + "version": "2.0.1", + "from": "inherits@2.0.1", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz" + } + } + } + } + } + } + }, + "changez-angular": { + "version": "2.1.0", + "from": "changez-angular@2.1.0", + "resolved": "https://registry.npmjs.org/changez-angular/-/changez-angular-2.1.0.tgz", + "dependencies": { + "nunjucks-date": { + "version": "1.2.0", + "from": "nunjucks-date@>=1.2.0 <2.0.0", + "resolved": "https://registry.npmjs.org/nunjucks-date/-/nunjucks-date-1.2.0.tgz", + "dependencies": { + "moment": { + "version": "2.15.2", + "from": "moment@>=2.8.4 <3.0.0", + "resolved": "https://registry.npmjs.org/moment/-/moment-2.15.2.tgz" + } + } + } + } + }, "cheerio": { "version": "0.17.0", "from": "https://registry.npmjs.org/cheerio/-/cheerio-0.17.0.tgz", @@ -4042,34 +5295,34 @@ }, "cross-spawn": { "version": "4.0.0", - "from": "cross-spawn@latest", + "from": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-4.0.0.tgz", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-4.0.0.tgz", "dependencies": { "lru-cache": { "version": "4.0.1", - "from": "lru-cache@>=4.0.1 <5.0.0", + "from": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.0.1.tgz", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.0.1.tgz", "dependencies": { "pseudomap": { "version": "1.0.2", - "from": "pseudomap@>=1.0.1 <2.0.0", + "from": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz" }, "yallist": { "version": "2.0.0", - "from": "yallist@>=2.0.0 <3.0.0", + "from": "https://registry.npmjs.org/yallist/-/yallist-2.0.0.tgz", "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.0.0.tgz" } } }, "which": { "version": "1.2.10", - "from": "which@>=1.2.9 <2.0.0", + "from": "https://registry.npmjs.org/which/-/which-1.2.10.tgz", "resolved": "https://registry.npmjs.org/which/-/which-1.2.10.tgz", "dependencies": { "isexe": { "version": "1.1.2", - "from": "isexe@>=1.1.1 <2.0.0", + "from": "https://registry.npmjs.org/isexe/-/isexe-1.1.2.tgz", "resolved": "https://registry.npmjs.org/isexe/-/isexe-1.1.2.tgz" } } @@ -12282,39 +13535,39 @@ }, "log4js": { "version": "0.6.38", - "from": "log4js@>=0.6.27 <0.7.0", + "from": "https://registry.npmjs.com/log4js/-/log4js-0.6.38.tgz", "resolved": "https://registry.npmjs.com/log4js/-/log4js-0.6.38.tgz", "dependencies": { "readable-stream": { "version": "1.0.34", - "from": "readable-stream@>=1.0.2 <1.1.0", + "from": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", "dependencies": { "core-util-is": { "version": "1.0.2", - "from": "core-util-is@>=1.0.0 <1.1.0", + "from": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz" }, "isarray": { "version": "0.0.1", - "from": "isarray@0.0.1", + "from": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz" }, "string_decoder": { "version": "0.10.31", - "from": "string_decoder@>=0.10.0 <0.11.0", + "from": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz" }, "inherits": { "version": "2.0.1", - "from": "inherits@>=2.0.1 <2.1.0", + "from": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz" } } }, "semver": { "version": "4.3.6", - "from": "semver@>=4.3.3 <4.4.0", + "from": "https://registry.npmjs.org/semver/-/semver-4.3.6.tgz", "resolved": "https://registry.npmjs.org/semver/-/semver-4.3.6.tgz" } } @@ -13232,64 +14485,64 @@ }, "selenium-webdriver": { "version": "2.53.3", - "from": "selenium-webdriver@>=2.53.1 <3.0.0", + "from": "https://registry.npmjs.org/selenium-webdriver/-/selenium-webdriver-2.53.3.tgz", "resolved": "https://registry.npmjs.org/selenium-webdriver/-/selenium-webdriver-2.53.3.tgz", "dependencies": { "adm-zip": { "version": "0.4.4", - "from": "adm-zip@0.4.4", + "from": "https://registry.npmjs.org/adm-zip/-/adm-zip-0.4.4.tgz", "resolved": "https://registry.npmjs.org/adm-zip/-/adm-zip-0.4.4.tgz" }, "rimraf": { "version": "2.5.4", - "from": "rimraf@>=2.2.8 <3.0.0", + "from": "https://registry.npmjs.org/rimraf/-/rimraf-2.5.4.tgz", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.5.4.tgz", "dependencies": { "glob": { "version": "7.0.6", - "from": "glob@>=7.0.5 <8.0.0", + "from": "https://registry.npmjs.org/glob/-/glob-7.0.6.tgz", "resolved": "https://registry.npmjs.org/glob/-/glob-7.0.6.tgz", "dependencies": { "fs.realpath": { "version": "1.0.0", - "from": "fs.realpath@>=1.0.0 <2.0.0", + "from": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz" }, "inflight": { "version": "1.0.5", - "from": "inflight@>=1.0.4 <2.0.0", + "from": "https://registry.npmjs.org/inflight/-/inflight-1.0.5.tgz", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.5.tgz", "dependencies": { "wrappy": { "version": "1.0.2", - "from": "wrappy@>=1.0.0 <2.0.0", + "from": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz" } } }, "inherits": { "version": "2.0.1", - "from": "inherits@>=2.0.0 <3.0.0", + "from": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz" }, "minimatch": { "version": "3.0.3", - "from": "minimatch@>=3.0.2 <4.0.0", + "from": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.3.tgz", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.3.tgz", "dependencies": { "brace-expansion": { "version": "1.1.6", - "from": "brace-expansion@>=1.0.0 <2.0.0", + "from": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.6.tgz", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.6.tgz", "dependencies": { "balanced-match": { "version": "0.4.2", - "from": "balanced-match@>=0.4.1 <0.5.0", + "from": "https://registry.npmjs.org/balanced-match/-/balanced-match-0.4.2.tgz", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-0.4.2.tgz" }, "concat-map": { "version": "0.0.1", - "from": "concat-map@0.0.1", + "from": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz" } } @@ -13298,19 +14551,19 @@ }, "once": { "version": "1.3.3", - "from": "once@>=1.3.0 <2.0.0", + "from": "https://registry.npmjs.org/once/-/once-1.3.3.tgz", "resolved": "https://registry.npmjs.org/once/-/once-1.3.3.tgz", "dependencies": { "wrappy": { "version": "1.0.2", - "from": "wrappy@>=1.0.0 <2.0.0", + "from": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz" } } }, "path-is-absolute": { "version": "1.0.0", - "from": "path-is-absolute@>=1.0.0 <2.0.0", + "from": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.0.tgz", "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.0.tgz" } } @@ -13319,39 +14572,39 @@ }, "tmp": { "version": "0.0.24", - "from": "tmp@0.0.24", + "from": "https://registry.npmjs.org/tmp/-/tmp-0.0.24.tgz", "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.24.tgz" }, "ws": { "version": "1.1.1", - "from": "ws@>=1.0.1 <2.0.0", + "from": "https://registry.npmjs.org/ws/-/ws-1.1.1.tgz", "resolved": "https://registry.npmjs.org/ws/-/ws-1.1.1.tgz", "dependencies": { "options": { "version": "0.0.6", - "from": "options@>=0.0.5", + "from": "https://registry.npmjs.org/options/-/options-0.0.6.tgz", "resolved": "https://registry.npmjs.org/options/-/options-0.0.6.tgz" }, "ultron": { "version": "1.0.2", - "from": "ultron@>=1.0.0 <1.1.0", + "from": "https://registry.npmjs.org/ultron/-/ultron-1.0.2.tgz", "resolved": "https://registry.npmjs.org/ultron/-/ultron-1.0.2.tgz" } } }, "xml2js": { "version": "0.4.4", - "from": "xml2js@0.4.4", + "from": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.4.tgz", "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.4.tgz", "dependencies": { "sax": { "version": "0.6.1", - "from": "sax@>=0.6.0 <0.7.0", + "from": "https://registry.npmjs.org/sax/-/sax-0.6.1.tgz", "resolved": "https://registry.npmjs.org/sax/-/sax-0.6.1.tgz" }, "xmlbuilder": { "version": "8.2.2", - "from": "xmlbuilder@>=1.0.0", + "from": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-8.2.2.tgz", "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-8.2.2.tgz" } } @@ -13575,7 +14828,7 @@ }, "shelljs": { "version": "0.3.0", - "from": "shelljs@0.3.0", + "from": "https://registry.npmjs.org/shelljs/-/shelljs-0.3.0.tgz", "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.3.0.tgz" }, "sorted-object": { diff --git a/package.json b/package.json index 84c2718dca5e..f5a1c3a703e5 100644 --- a/package.json +++ b/package.json @@ -3,7 +3,7 @@ "license": "MIT", "branchVersion": "^1.5.0-beta.2", "branchPattern": "1.5.*", - "distTag": "beta", + "distTag": "next", "repository": { "type": "git", "url": "https://github.com/angular/angular.js.git" @@ -26,6 +26,8 @@ "bower": "~1.3.9", "browserstacktunnel-wrapper": "^1.4.2", "canonical-path": "0.0.2", + "changez": "^2.1.1", + "changez-angular": "^2.1.0", "cheerio": "^0.17.0", "commitizen": "^2.3.0", "cross-spawn": "^4.0.0", From 3c88c624463ff86896d2e4750ad75e152c87f5ed Mon Sep 17 00:00:00 2001 From: Peter Bacon Darwin Date: Wed, 26 Oct 2016 17:26:10 +0100 Subject: [PATCH 0253/1173] docs(CHANGELOG): add 1.6.0-rc.0 release notes --- CHANGELOG.md | 1078 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 1078 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 99fa22865764..21af6b80eab7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,1081 @@ + +# 1.6.0-rc.0 bracing-vortex (2016-10-26) + +## Major notes +Please read the [Sandbox Removal Blog Post](http://angularjs.blogspot.com/2016/09/angular-16-expression-sandbox-removal.html). + +## Bug Fixes +- **input:** fix `step` validation for `input[type=number]`/`input[type=range]` ([081d06](https://github.com/angular/angular.js/commit/081d06ffd15c2c6c539ce97b5eb63fa8e2403818) [#15257](https://github.com/angular/angular.js/issues/15257)) +- **jqLite:** + - camelCase keys in `jqLite#data` ([fc0c11](https://github.com/angular/angular.js/commit/fc0c11db845d53061430b7f05e773dcb3fb5b860) [#15126](https://github.com/angular/angular.js/issues/15126)) + - align jqLite camelCasing logic with JQuery ([73050c](https://github.com/angular/angular.js/commit/73050cdda04675bfa6705dc841ddbbb6919eb048) [#7744](https://github.com/angular/angular.js/issues/7744)) +- **$parse:** + - treat falsy values as defined in assignment expressions ([4f44e0](https://github.com/angular/angular.js/commit/4f44e018948c45bfb07f0170de4f703d22778d71)) + - call once stable bind-once expressions with filter ([3b5751](https://github.com/angular/angular.js/commit/3b5751dce8d6c699dc76e47cfa544c30b38b9771)) + - Handle sign of `-undefined` consistently ([c1eaf3](https://github.com/angular/angular.js/commit/c1eaf3480b9a88e5309ff4931a720f3f62bd7606)) +- **ngModel:** treat synchronous validators as boolean always ([7bc71a](https://github.com/angular/angular.js/commit/7bc71adc63bb6bb609b44dd2d3ea8fb0cd3f300b) [#14734](https://github.com/angular/angular.js/issues/14734)) +- **$q:** treat thrown errors as regular rejections ([e13eea](https://github.com/angular/angular.js/commit/e13eeabd7e34a78becec06cfbe72c23f2dcb85f9) [#3174](https://github.com/angular/angular.js/issues/3174) [#15213](https://github.com/angular/angular.js/issues/15213)) +- **ngTransclude:** use fallback content if only whitespace is provided ([32aa7e](https://github.com/angular/angular.js/commit/32aa7e7395527624119e3917c54ee43b4d219301) [#15077](https://github.com/angular/angular.js/issues/15077)) +- **$compile:** + - don't throw tplrt error when there is a whitespace around a top-level comment ([76d3da](https://github.com/angular/angular.js/commit/76d3dafdeaf2f343d094b5a34ffb74adf64bb284) [#15108](https://github.com/angular/angular.js/issues/15108)) + - disallow linking the same element more than once ([1e1fbc](https://github.com/angular/angular.js/commit/1e1fbc75f5e20e8541f517a5cf6f30f8f2eed53f)) + - lower the $sce context for src on video, audio, and track. ([ad9a99](https://github.com/angular/angular.js/commit/ad9a99d6895e1c07c950f7141bb0edfc1d4aaf61)) + - correctly merge consecutive text nodes on IE11 ([13c252](https://github.com/angular/angular.js/commit/13c2522baf7c8f616b2efcaab4bffd54c8736591) [#14924](https://github.com/angular/angular.js/issues/14924)) + - secure `link[href]` as a `RESOURCE_URL`s in `$sce`. ([04cad4](https://github.com/angular/angular.js/commit/04cad41d26ebaf44b5ee0c29a152d61f235f3efa) [#14687](https://github.com/angular/angular.js/issues/14687)) + - don't add leading white-space in attributes for a specific merge case ([305ba1](https://github.com/angular/angular.js/commit/305ba1a3fb3529cb3fdf04c12ac03fbb4f634456)) + - don't trim white-space in attributes ([97bbf8](https://github.com/angular/angular.js/commit/97bbf86a1979d099802f0d631c17c54b87563b40) [#5513](https://github.com/angular/angular.js/issues/5513) [#5597](https://github.com/angular/angular.js/issues/5597)) + - move check for interpolation of on-event attributes to compile time ([b89c21](https://github.com/angular/angular.js/commit/b89c2181a9a165e06c027390164e08635ec449f4) [#13267](https://github.com/angular/angular.js/issues/13267)) +- **select:** + - add/remove selected attribute for selected/unselected options ([c75698](https://github.com/angular/angular.js/commit/c75698df55f5a026bcd7fcecbb9d4ff0bc3ebc3e)) + - don't register options when select has no ngModel ([e8c2e1](https://github.com/angular/angular.js/commit/e8c2e119758e58e18fe43932d09a8ff9f506aa9d)) + - handle model updates when options are manipulated ([47c15f](https://github.com/angular/angular.js/commit/47c15fbcc10f118170813021e8e605ffd263ad84)) + - remove workaround for Chrome bug ([87eff2](https://github.com/angular/angular.js/commit/87eff27e971414fb163e2b5a7cfe78cb097a1951)) +- **select, ngOptions:** make the handling of unknown / empty options consistent ([2785ad](https://github.com/angular/angular.js/commit/2785ad72599ca5f9558a116baecd83a5bebe3292)) +- **ngValue:** set the element's value property in addition to the value attribute ([e6afca](https://github.com/angular/angular.js/commit/e6afca00c9061a3e13b570796ca3ab428c1723a1) [#14031](https://github.com/angular/angular.js/issues/14031)) +- **aria/ngModel:** do not overwrite the default `$isEmpty()` method for checkboxes ([975a61](https://github.com/angular/angular.js/commit/975a6170efceb2a5e6377c57329731c0636eb8c8) [#14621](https://github.com/angular/angular.js/issues/14621)) +- **$resource:** + - fulfill promise with the correct value on error ([5f6949](https://github.com/angular/angular.js/commit/5f6949fdae57b15340c1213cce379c6e6f8aff62) [#14837](https://github.com/angular/angular.js/issues/14837)) + - pass all extra, owned properties as params ([acb545](https://github.com/angular/angular.js/commit/acb545ec3ebf099db68561033645941c900973b5) [#14866](https://github.com/angular/angular.js/issues/14866)) + - add semicolon to whitelist of delimiters to unencode in URL params ([2456ab](https://github.com/angular/angular.js/commit/2456ab63a613902d21c151445f9c697a76ab43b3)) +- **$http:** + - avoid `Possibly Unhandled Rejection` error when the request fails ([47583d](https://github.com/angular/angular.js/commit/47583d98005f6a498d397dbe2cedaadac69f0b47) [#13869](https://github.com/angular/angular.js/issues/13869)) + - properly increment/decrement `$browser.outstandingRequestCount` ([4f6f2b](https://github.com/angular/angular.js/commit/4f6f2bce4ac93b85320e42e5023c09d099779b7d) [#13782](https://github.com/angular/angular.js/issues/13782) [#14921](https://github.com/angular/angular.js/issues/14921)) +- **ngMock:** trigger digest in `$httpBackend.verifyNoOutstandingRequest()` ([267ee9](https://github.com/angular/angular.js/commit/267ee9c892b0eb40908700ee2435793f8c6c1c84) [#13506](https://github.com/angular/angular.js/issues/13506)) +- **ngAria:** + - bind to `keydown` instead of `keypress` in `ngClick` ([ad41ba](https://github.com/angular/angular.js/commit/ad41baa1fdc057db3fe529ff87735b173b164b4c) [#14063](https://github.com/angular/angular.js/issues/14063)) + - don't add roles to native control elements ([9978de](https://github.com/angular/angular.js/commit/9978de11b7295fec1a2f4cb8fbeb9b62b54cb711) [#14076](https://github.com/angular/angular.js/issues/14076)) +- **ngBind:** use same string representation as `$interpolate` ([fa80a6](https://github.com/angular/angular.js/commit/fa80a61a05a3b49a2c770d5544cb8480907a18d3)) +- **ngMock/$httpBackend:** fail if a url is provided but is `undefined` ([7551b8](https://github.com/angular/angular.js/commit/7551b8975a91ee286cc2cf4af5e78f924533575e) [#8442](https://github.com/angular/angular.js/issues/8442) [#10934](https://github.com/angular/angular.js/issues/10934)) +- **$route:** don't process route change controllers and templates for `redirectTo` routes ([7f4b35](https://github.com/angular/angular.js/commit/7f4b356c2bebb87f0c26b57a20415b004b20bcd1) [#3332](https://github.com/angular/angular.js/issues/3332)) +- **loader:** `module.decorator` order of operations is now irrelevant ([6a2ebd](https://github.com/angular/angular.js/commit/6a2ebdba5df27e789e3cb10f11eedf90f7b9b97e) [#12382](https://github.com/angular/angular.js/issues/12382)) +- **ngAnimate:** make svg elements work with `classNameFilter` ([81bf7e](https://github.com/angular/angular.js/commit/81bf7ed73ee67f9eb997da869c52839449ca02b3)) + + +## New Features +- **jqLite:** + - implement `jqLite(f)` as alias to `jqLite(document).ready(f)` ([369fb7](https://github.com/angular/angular.js/commit/369fb7f4f73664bcdab0350701552d8bef6f605e)) + - don't throw for elements with missing `getAttribute` ([4e6c14](https://github.com/angular/angular.js/commit/4e6c14dcae4a9a30b3610a288ef8d20db47c4417)) + - don't remove a boolean attribute for `.attr(attrName, '')` ([3faf45](https://github.com/angular/angular.js/commit/3faf4505732758165083c9d21de71fa9b6983f4a)) + - remove the attribute for `.attr(attribute, null)` ([4e3624](https://github.com/angular/angular.js/commit/4e3624552284d0e725bf6262b2e468cd2c7682fa)) + - return `[]` for `.val()` on `` with no selection + +For the jqLite element representing a select element in +the multiple variant with no options chosen the .val() getter used to return +null and now returns an empty array. + +To migrate the code follow the example below: + +Before: + +HTML: + +``` + +``` + +JavaScript: + +``` + var value = $element.val(); + if (value) { + /* do something */ + } +``` + +After: + +HTML: + +``` + +``` + +JavaScript: + +``` + var value = $element.val(); + if (value.length > 0) { + /* do something */ + } +``` + + +### `ngModel` due to: + +- **[7bc71a](https://github.com/angular/angular.js/commit/7bc71adc63bb6bb609b44dd2d3ea8fb0cd3f300b)**: treat synchronous validators as boolean always + +Previously, only a literal `false` return would resolve as the +synchronous validator failing. Now, all traditionally false JavaScript values +are treated as failing the validator, as one would naturally expect. + +Specifically, the values `0` (the number zero), `null`, `NaN` and `''` (the +empty string) used to be considered valid (passing) and they are now considered +invalid (failing). The value `undefined` was treated similarly to a pending +asynchronous validator, causing the validation to be pending. `undefined` is +also now considered invalid. + +To migrate, make sure your synchronous validators are returning either a +literal `true` or a literal `false` value. For most code, we expect this to +already be the case. Only a very small subset of projects will be affected. + +Namely, anyone using `undefined` or any falsy value as a return will now see +their validation failing, whereas previously falsy values other than `undefined` +would have been seen as passing and `undefined` would have been seen as pending. + +- **[9e24e7](https://github.com/angular/angular.js/commit/9e24e774a558143b3478536911a3a4c1714564ba)**: change controllers to use prototype methods + +The use of prototype methods instead of new methods per instance removes the ability to pass +NgModelController and FormController methods without context. + +For example + +`$scope.$watch('something', myNgModelCtrl.$render)` + +will no longer work because the `$render` method is passed without any context. +This must now be replaced with + +``` +$scope.$watch('something', function() { + myNgModelCtrl.$render(); +}) +``` + +or possibly by using `Function.prototype.bind` or `angular.bind`. + + +- **[975a61](https://github.com/angular/angular.js/commit/975a6170efceb2a5e6377c57329731c0636eb8c8)**: do not overwrite the default `$isEmpty()` method for checkboxes + +Custom `checkbox`-shaped controls (e.g. checkboxes, menuitemcheckboxes), no longer have a custom +`$isEmpty()` method on their `NgModelController` that checks for `value === false`. Unless +overwritten, the default `$isEmpty()` method will be used, which treats `undefined`, `null`, `NaN` +and `''` as "empty". + +**Note:** The `$isEmpty()` method is used to determine if the checkbox is checked ("not empty" means + "checked") and thus it can indirectly affect other things, such as the control's validity + with respect to the `required` validator (e.g. "empty" + "required" --> "invalid"). + +Before: + +```js +var template = ''; +var customCheckbox = $compile(template)(scope); +var ctrl = customCheckbox.controller('ngModel'); + +scope.$apply('value = false'); +console.log(ctrl.$isEmpty()); //--> true + +scope.$apply('value = true'); +console.log(ctrl.$isEmpty()); //--> false + +scope.$apply('value = undefined'/* or null or NaN or '' */); +console.log(ctrl.$isEmpty()); //--> false +``` + +After: + +```js +var template = ''; +var customCheckbox = $compile(template)(scope); +var ctrl = customCheckbox.controller('ngModel'); + +scope.$apply('value = false'); +console.log(ctrl.$isEmpty()); //--> false + +scope.$apply('value = true'); +console.log(ctrl.$isEmpty()); //--> false + +scope.$apply('value = undefined'/* or null or NaN or '' */); +console.log(ctrl.$isEmpty()); //--> true +``` + +-- +If you want to have a custom `$isEmpty()` method, you need to overwrite the default. For example: + +```js +.directive('myCheckbox', function myCheckboxDirective() { + return { + require: 'ngModel', + link: function myCheckboxPostLink(scope, elem, attrs, ngModelCtrl) { + ngModelCtrl.$isEmpty = function myCheckboxIsEmpty(value) { + return !value; // Any falsy value means "empty" + + // Or to restore the previous behavior: + // return value === false; + }; + } + }; +}) +``` + +### `$http` due to: +- **[b54a39](https://github.com/angular/angular.js/commit/b54a39e2029005e0572fbd2ac0e8f6a4e5d69014)**: remove deprecated callback methods: `success()/error()` + +`$http`'s deprecated custom callback methods - `success()` and `error()` - have been removed. +You can use the standard `then()`/`catch()` promise methods instead, but note that the method +signatures and return values are different. + +`success(fn)` can be replaced with `then(fn)`, and `error(fn)` can be replaced with either +`then(null, fn)` or `catch(fn)`. + +Before: + +```js +$http(...). + success(function onSuccess(data, status, headers, config) { + // Handle success + ... + }). + error(function onError(data, status, headers, config) { + // Handle error + ... + }); +``` + +After: + +```js +$http(...). + then(function onSuccess(response) { + // Handle success + var data = response.data; + var status = response.status; + var statusText = response.statusText; + var headers = response.headers; + var config = response.config; + ... + }, function onError(response) { + // Handle error + var data = response.data; + var status = response.status; + var statusText = response.statusText; + var headers = response.headers; + var config = response.config; + ... + }); + +// or + +$http(...). + then(function onSuccess(response) { + // Handle success + var data = response.data; + var status = response.status; + var statusText = response.statusText; + var headers = response.headers; + var config = response.config; + ... + }). + catch(function onError(response) { + // Handle error + var data = response.data; + var status = response.status; + var statusText = response.statusText; + var headers = response.headers; + var config = response.config; + ... + }); +``` + +**Note:** +There is a subtle difference between the variations showed above. When using +`$http(...).success(onSuccess).error(onError)` or `$http(...).then(onSuccess, onError)`, the +`onError()` callback will only handle errors/rejections produced by the `$http()` call. If the +`onSuccess()` callback produces an error/rejection, it won't be handled by `onError()` and might go +unnoticed. In contrast, when using `$http(...).then(onSuccess).catch(onError)`, `onError()` will +handle errors/rejections produced by both `$http()` _and_ `onSuccess()`. + +- **[fb6634](https://github.com/angular/angular.js/commit/fb663418710736161a6b5da49c345e92edf58dcb)**: JSONP callback must be specified by `jsonpCallbackParam` config + +You can no longer use the `JSON_CALLBACK` placeholder in your JSONP requests. +Instead you must provide the name of the query parameter that will pass the +callback via the `jsonpCallbackParam` property of the config object, or app-wide via +the `$http.defaults.jsonpCallbackParam` property, which is `"callback"` by default. + +Before this change: + +``` +$http.json('trusted/url?callback=JSON_CALLBACK'); +$http.json('other/trusted/url', {params: {cb:'JSON_CALLBACK'}}); +``` + +After this change: + +``` +$http.json('trusted/url'); +$http.json('other/trusted/url', {jsonpCallbackParam:'cb'}); +``` + +- **[6476af](https://github.com/angular/angular.js/commit/6476af83cd0418c84e034a955b12a842794385c4)**: JSONP requests now require a trusted resource URL + +All JSONP requests now require the URL to be trusted as resource URLs. +There are two approaches to trust a URL: + +**Whitelisting with the `$sceDelegateProvider.resourceUrlWhitelist()` +method.** + +You configure this list in a module configuration block: + +``` +appModule.config(['$sceDelegateProvider', function($sceDelegateProvider) { + $sceDelegateProvider.resourceUrlWhiteList([ + // Allow same origin resource loads. + 'self', + // Allow JSONP calls that match this pattern + 'https://some.dataserver.com/**.jsonp?**`+%20%20]);+}]);+```++**Explicitly%20trusting%20the%20URL%20via%20the%20`$sce.trustAsResourceUrl(url)`+method**++You%20can%20pass%20a%20trusted%20object%20instead%20of%20a%20string%20as%20a%20URL%20to%20the%20`$http`+service:++```+var%20promise%20=%20$http.jsonp($sce.trustAsResourceUrl(url));+```++-%20**[4f6f2b](https://github.com/angular/angular.js/commit/4f6f2bce4ac93b85320e42e5023c09d099779b7d)**:%20properly%20increment/decrement%20`$browser.outstandingRequestCount`++HTTP%20requests%20now%20update%20the%20outstanding%20request%20count%20synchronously.+Previously%20the%20request%20count%20would%20not%20have%20been%20updated%20until%20the+request%20to%20the%20server%20is%20actually%20in%20flight.%20Now%20the%20request%20count%20is+updated%20before%20the%20async%20interceptor%20is%20called.++The%20new%20behaviour%20is%20correct%20but%20it%20may%20change%20the%20expected%20behaviour%20in+a%20small%20number%20of%20e2e%20test%20cases%20where%20an%20async%20request%20interceptor%20is+being%20used.+++###%20%60$q%60%20due%20to:++-%20**[e13eea](https://github.com/angular/angular.js/commit/e13eeabd7e34a78becec06cfbe72c23f2dcb85f9)**:%20treat%20thrown%20errors%20as%20regular%20rejections++Previously,%20throwing%20an%20error%20from%20a%20promise's `onFulfilled` or `onRejection` handlers, would result +in passing the error to the `$exceptionHandler()` (in addition to rejecting the promise with the +error as reason). + +Now, a thrown error is treated exactly the same as a regular rejection. This applies to all +services/controllers/filters etc that rely on `$q` (including built-in services, such as `$http` and +`$route`). For example, `$http`'s `transformRequest/Response` functions or a route's `redirectTo` +function as well as functions specified in a route's `resolve` object, will no longer result in a +call to `$exceptionHandler()` if they throw an error. Other than that, everything will continue to +behave in the same way; i.e. the promises will be rejected, route transition will be cancelled, +`$routeChangeError` events will be broadcasted etc. + +- **[c9dffd](https://github.com/angular/angular.js/commit/c9dffde1cb167660120753181cb6d01dc1d1b3d0)**: report promises with non rejection callback + +Unhandled rejected promises will be logged to $exceptionHandler. + +Tests that depend on specific order or number of messages in $exceptionHandler +will need to handle rejected promises report. + + +### `ngTransclude` due to: + +- **[32aa7e](https://github.com/angular/angular.js/commit/32aa7e7395527624119e3917c54ee43b4d219301)**: use fallback content if only whitespace is provided + +Previously whitespace only transclusion would be treated as the transclusion +being "not empty", which meant that fallback content was not used in that +case. + +Now if you only provide whitespace as the transclusion content, it will be +assumed to be empty and the fallback content will be used instead. + +If you really do want whitespace then you can force it to be used by adding +a comment to the whitespace. + + +### `ngModelOptions` due to: + +- **[87a2ff](https://github.com/angular/angular.js/commit/87a2ff76af5d0a9268d8eb84db5755077d27c84c)**: allow options to be inherited from ancestor `ngModelOptions` + +Previously, if a setting was not applied on `ngModelOptions`, then it would default +to undefined. Now the setting will be inherited from the nearest ngModelOptions +ancestor. + +It is possible that an `ngModelOptions` directive that does not set a property, +has an ancestor ngModelOptions that does set this property to a value other than +`undefined`. This would cause the `ngModel` and input controls below this `ngModelOptions` +directive to display different behaviour. This is fixed by explictly setting the +property in the `ngModelOptions` to prevent it from inheriting from the ancestor. + +For example if you had the following HTML: + +``` +
        + +
        +``` + +Then before this change the input would update on the default event not blur. +After this change the input will inherit the option to update on blur. +If you want the original behaviour then you will need to specify the option +on the input as well: + +``` +
        + +
        +``` + +The programmatic API for `ngModelOptions` has changed. You must now read options +via the `getOption` method, rather than accessing the option directly as a property +of the options object. This does not affect the usage in templates and only +affects custom directives that might have been reading options for their own purposes. + + +### `$compile` due to: + +- **[13c252](https://github.com/angular/angular.js/commit/13c2522baf7c8f616b2efcaab4bffd54c8736591)**: correctly merge consecutive text nodes on IE11 + +**Note:** Everything described below affects **IE11 only**. + +Previously, consecutive text nodes would not get merged if they had no parent. They will now, which +might have unexpectd side effects in the following cases: + +1. Passing an array or jqLite/jQuery collection of parent-less text nodes to `$compile` directly: + + ```js + // Assuming: + var textNodes = [ + document.createTextNode('{{'), + document.createTextNode('"foo:"'), + document.createTextNode('}}') + ]; + var compiledNodes = $compile(textNodes)($rootScope); + + // Before: + console.log(compiledNodes.length); // 3 + console.log(compiledNodes.text()); // {{'foo'}} + + // After: + console.log(compiledNodes.length); // 1 + console.log(compiledNodes.text()); // foo + + // To get the old behavior, compile each node separately: + var textNodes = [ + document.createTextNode('{{'), + document.createTextNode('"foo"'), + document.createTextNode('}}') + ]; + var compiledNodes = angular.element(textNodes.map(function (node) { + return $compile(node)($rootScope)[0]; + })); + ``` + +2. Using multi-slot transclusion with non-consecutive, default-content text nodes (that form + interpolated expressions when merged): + + ```js + // Assuming the following component: + .compoent('someThing', { + template: '' + transclude: { + ignored: 'veryImportantContent' + } + }) + ``` + + ```html + + + {{ + Nooot + 'foo'}} + + + + + + {{ <-- Two separate + 'foo'}} <-- text nodes + + + + + + + foo <-- The text nodes were merged into `{{'foo'}}`, which was then interpolated + + + + + + + {{ + Nooot + 'foo'}} + + + + + + {{ <-- Two separate + 'foo'}} <-- nodes + + + ``` + +- **[b89c21](https://github.com/angular/angular.js/commit/b89c2181a9a165e06c027390164e08635ec449f4)**: move check for interpolation of on-event attributes to compile time + +Using interpolation in any on* event attributes (e.g. `