diff --git a/.travis.yml b/.travis.yml index db65c2d1bcef..cebf27e29b5c 100644 --- a/.travis.yml +++ b/.travis.yml @@ -48,7 +48,7 @@ install: - npm config set loglevel http - npm install -g npm@2.5 # Instal npm dependecies and ensure that npm cache is not stale - - scripts/npm/install-dependencies.sh + - npm install before_script: - mkdir -p $LOGS_DIR @@ -61,6 +61,7 @@ script: - ./scripts/travis/build.sh after_script: + - ./scripts/travis/tear_down_browser_provider.sh - ./scripts/travis/print_logs.sh notifications: diff --git a/CHANGELOG.md b/CHANGELOG.md index 6144c3a0965b..6b40a381d05a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,146 @@ + +# 1.4.8 ice-manipulation (2015-11-19) + + +## Bug Fixes + +- **$animate:** ensure leave animation calls `close` callback + ([6bd6dbff](https://github.com/angular/angular.js/commit/6bd6dbff4961a601c03e9465442788781d329ba6), + [#12278](https://github.com/angular/angular.js/issues/12278), [#12096](https://github.com/angular/angular.js/issues/12096), [#13054](https://github.com/angular/angular.js/issues/13054)) +- **$cacheFactory:** check key exists before decreasing cache size count + ([2a5a52a7](https://github.com/angular/angular.js/commit/2a5a52a76ccf60c6e8c5d881e90e11a2666a6d3c), + [#12321](https://github.com/angular/angular.js/issues/12321), [#12329](https://github.com/angular/angular.js/issues/12329)) +- **$compile:** + - bind all directive controllers correctly when using `bindToController` + ([5d8861fb](https://github.com/angular/angular.js/commit/5d8861fb2f203e8a688b6044cbd1140cd79fd049), + [#11343](https://github.com/angular/angular.js/issues/11343), [#11345](https://github.com/angular/angular.js/issues/11345)) + - evaluate against the correct scope with bindToController on new scope + ([b9f7c453](https://github.com/angular/angular.js/commit/b9f7c453e00d6938106f414952f74d5e5fdcb993), + [#13021](https://github.com/angular/angular.js/issues/13021), [#13025](https://github.com/angular/angular.js/issues/13025)) + - fix scoping of transclusion directives inside replace directive + ([74da0340](https://github.com/angular/angular.js/commit/74da03407782d679951cd8f693860cea214f2580), + [#12975](https://github.com/angular/angular.js/issues/12975), [#12936](https://github.com/angular/angular.js/issues/12936), [#13244](https://github.com/angular/angular.js/issues/13244)) +- **$http:** apply `transformResponse` even when `data` is empty + ([c6909464](https://github.com/angular/angular.js/commit/c690946469e09cfe6b774e63dbe14ace92ce6cb7), + [#12976](https://github.com/angular/angular.js/issues/12976), [#12979](https://github.com/angular/angular.js/issues/12979)) +- **$location:** ensure `$locationChangeSuccess` fires even if URL ends with `#` + ([6f8ddb6d](https://github.com/angular/angular.js/commit/6f8ddb6d4329441e8d4a856978413aa9b9bd918f), + [#12175](https://github.com/angular/angular.js/issues/12175), [#13251](https://github.com/angular/angular.js/issues/13251)) +- **$parse:** evaluate once simple expressions only once + ([e4036824](https://github.com/angular/angular.js/commit/e403682444fa08af4f3491badf2f3a10d7595699), + [#12983](https://github.com/angular/angular.js/issues/12983), [#13002](https://github.com/angular/angular.js/issues/13002)) +- **$resource:** allow XHR request to be cancelled via a timeout promise + ([7170f9d9](https://github.com/angular/angular.js/commit/7170f9d9ca765c578f8d3eb4699860a9330a0a11), + [#12657](https://github.com/angular/angular.js/issues/12657), [#12675](https://github.com/angular/angular.js/issues/12675), [#10890](https://github.com/angular/angular.js/issues/10890), [#9332](https://github.com/angular/angular.js/issues/9332)) +- **$rootScope:** prevent IE9 memory leak when destroying scopes + ([87b0055c](https://github.com/angular/angular.js/commit/87b0055c80f40589c5bcf3765e59e872bcfae119), + [#10706](https://github.com/angular/angular.js/issues/10706), [#11786](https://github.com/angular/angular.js/issues/11786)) +- **Angular.js:** fix `isArrayLike` for unusual cases + ([70edec94](https://github.com/angular/angular.js/commit/70edec947c7b189694ae66b129568182e3369cab), + [#10186](https://github.com/angular/angular.js/issues/10186), [#8000](https://github.com/angular/angular.js/issues/8000), [#4855](https://github.com/angular/angular.js/issues/4855), [#4751](https://github.com/angular/angular.js/issues/4751), [#10272](https://github.com/angular/angular.js/issues/10272)) +- **isArrayLike:** handle jQuery objects of length 0 + ([d3da55c4](https://github.com/angular/angular.js/commit/d3da55c40f1e1ddceced5da51e364888ff9d82ff)) +- **jqLite:** + - deregister special `mouseenter` / `mouseleave` events correctly + ([22f66025](https://github.com/angular/angular.js/commit/22f66025db262417ebb78c1ce1f4d7058dca3fd3), + [#12795](https://github.com/angular/angular.js/issues/12795), [#12799](https://github.com/angular/angular.js/issues/12799)) + - ensure mouseenter works with svg elements on IE + ([c1f34e8e](https://github.com/angular/angular.js/commit/c1f34e8eeb5105767f6cbf4727b8c5664be2a261), + [#10259](https://github.com/angular/angular.js/issues/10259), [#10276](https://github.com/angular/angular.js/issues/10276)) +- **limitTo:** start at 0 if `begin` is negative and exceeds input length + ([4fc40bc9](https://github.com/angular/angular.js/commit/4fc40bc9320a1d5902e648b70fa79c7cf7e794c7), + [#12775](https://github.com/angular/angular.js/issues/12775), [#12781](https://github.com/angular/angular.js/issues/12781)) +- **merge:** + - ensure that jqlite->jqlite and DOM->DOM + ([2f8db1bf](https://github.com/angular/angular.js/commit/2f8db1bf01173b546a2868fc7b8b188c2383fbff)) + - clone elements instead of treating them like simple objects + ([838cf4be](https://github.com/angular/angular.js/commit/838cf4be3c671903796dbb69d95c0e5ac1516a06), + [#12286](https://github.com/angular/angular.js/issues/12286)) +- **ngAria:** don't add tabindex to radio and checkbox inputs + ([59f1f4e1](https://github.com/angular/angular.js/commit/59f1f4e19a02e6e6f4c41c15b0e9f3372d85cecc), + [#12492](https://github.com/angular/angular.js/issues/12492), [#13095](https://github.com/angular/angular.js/issues/13095)) +- **ngInput:** change URL_REGEXP to better match RFC3987 + ([cb51116d](https://github.com/angular/angular.js/commit/cb51116dbd225ccfdbc9a565a66a170e65d26331), + [#11341](https://github.com/angular/angular.js/issues/11341), [#11381](https://github.com/angular/angular.js/issues/11381)) +- **ngMock:** reset cache before every test + ([91b7cd9b](https://github.com/angular/angular.js/commit/91b7cd9b74d72a48d844c5c3e0e9dee03405e0ca), + [#13013](https://github.com/angular/angular.js/issues/13013)) +- **ngOptions:** + - skip comments and empty options when looking for options + ([0f58334b](https://github.com/angular/angular.js/commit/0f58334b7b9a9d3d6ff34e9754961b6f67731fae), + [#12190](https://github.com/angular/angular.js/issues/12190), [#13029](https://github.com/angular/angular.js/issues/13029), [#13033](https://github.com/angular/angular.js/issues/13033)) + - override select option registration to allow compilation of empty option + ([7b2ecf42](https://github.com/angular/angular.js/commit/7b2ecf42c697eb8d51a0f2d73b324bd900139e05), + [#11685](https://github.com/angular/angular.js/issues/11685), [#12972](https://github.com/angular/angular.js/issues/12972), [#12968](https://github.com/angular/angular.js/issues/12968), [#13012](https://github.com/angular/angular.js/issues/13012)) + + +## Performance Improvements + +- **$compile:** use static jquery data method to avoid creating new instances + ([55ad192e](https://github.com/angular/angular.js/commit/55ad192e4ab79295ab15ecaaf8f6b9e7932a0336)) +- **copy:** + - avoid regex in `isTypedArray` + ([19fab4a1](https://github.com/angular/angular.js/commit/19fab4a1d79d2445795273f1622344353cf4d104)) + - only validate/clear if the user specifies a destination + ([d1293540](https://github.com/angular/angular.js/commit/d1293540e13573eb9ea5f90730bb9c9710c345db), + [#12068](https://github.com/angular/angular.js/issues/12068)) +- **merge:** remove unnecessary wrapping of jqLite element + ([ce6a96b0](https://github.com/angular/angular.js/commit/ce6a96b0d76dd2e5ab2247ca3059d284575bc6f0), + [#13236](https://github.com/angular/angular.js/issues/13236)) + + +## Breaking Changes + + + +# 1.4.7 dark-luminescence (2015-09-29) + + +## Bug Fixes + +- **$compile:** use createMap() for $$observe listeners when initialized from attr interpolation + ([5a98e806](https://github.com/angular/angular.js/commit/5a98e806ef3c59916bb4668268125610b11effe8), + [#10446](https://github.com/angular/angular.js/issues/10446)) +- **$parse:** + - block assigning to fields of a constructor + ([a7f3761e](https://github.com/angular/angular.js/commit/a7f3761eda5309f76b73c6fb1d3173a270112899), + [#12860](https://github.com/angular/angular.js/issues/12860)) + - do not convert to string computed properties multiple times + ([698af191](https://github.com/angular/angular.js/commit/698af191ded2465ca4e0f97959b75fede5a531ab)) +- **filters:** ensure `formatNumber` observes i18n decimal separators + ([4994acd2](https://github.com/angular/angular.js/commit/4994acd26e582eec8a92b139bfc09ca79a9b8835), + [#10342](https://github.com/angular/angular.js/issues/10342), [#12850](https://github.com/angular/angular.js/issues/12850)) +- **jqLite:** properly handle dash-delimited node names in `jqLiteBuildFragment` + ([cdd1227a](https://github.com/angular/angular.js/commit/cdd1227a308edd34d31b67f338083b6e0c4c0db9), + [#10617](https://github.com/angular/angular.js/issues/10617), [#12759](https://github.com/angular/angular.js/issues/12759)) +- **ngAnimate:** + - ensure anchoring uses body as a container when needed + ([9d3704ca](https://github.com/angular/angular.js/commit/9d3704ca467081f16b71b011eb50c53d5cdb2f34), + [#12872](https://github.com/angular/angular.js/issues/12872)) + - callback detection should only use RAF when necessary + ([fa8c399f](https://github.com/angular/angular.js/commit/fa8c399fadc30b78710868fe59d2930fdc17c7a5)) +- **ngMessages:** prevent race condition with ngAnimate + ([7295c60f](https://github.com/angular/angular.js/commit/7295c60ffb9f2e4f32043c538ace740b187f565a), + [#12856](https://github.com/angular/angular.js/issues/12856), [#12903](https://github.com/angular/angular.js/issues/12903)) +- **ngOptions:** + - prevent frozen select ui in IE + ([dbc69851](https://github.com/angular/angular.js/commit/dbc698517ff620b3a6279f65d4a9b6e3c15087b9), + [#11314](https://github.com/angular/angular.js/issues/11314), [#11795](https://github.com/angular/angular.js/issues/11795)) + + +## Features + +- **$animateCss:** add support for temporary styles via `cleanupStyles` + ([e52d731b](https://github.com/angular/angular.js/commit/e52d731bfd1fbb6c616125fbde2fb365722254b7), + [#12930](https://github.com/angular/angular.js/issues/12930)) +- **$http:** add `$xhrFactory` service to enable creation of custom xhr objects + ([7a413df5](https://github.com/angular/angular.js/commit/7a413df5e47e04e20a1c93d35922050bbcbfb492), + [#2318](https://github.com/angular/angular.js/issues/2318), [#9319](https://github.com/angular/angular.js/issues/9319), [#12159](https://github.com/angular/angular.js/issues/12159)) + + +## Breaking Changes + + # 1.4.6 multiplicative-elevation (2015-09-17) @@ -170,8 +313,6 @@ the built-in pattern validator: ``` - - # 1.4.5 permanent-internship (2015-08-28) @@ -1340,7 +1481,6 @@ mechanism. - **ngMessages:** due to [c9a4421f](https://github.com/angular/angular.js/commit/c9a4421fc3c97448527eadef1f42eb2f487ec2e0), - The `ngMessagesInclude` attribute is now its own directive and that must be placed as a **child** element within the element with the ngMessages directive. (Keep in mind that the former behaviour of the @@ -1363,6 +1503,26 @@ end of the container containing the ngMessages directive). ``` +- **ngMessages:** due to [c9a4421f](https://github.com/angular/angular.js/commit/c9a4421fc3c97448527eadef1f42eb2f487ec2e0), + +it is no longer possible to use interpolation inside the `ngMessages` attribute expression. This technique +is generally not recommended, and can easily break when a directive implementation changes. In cases +where a simple expression is not possible, you can delegate accessing the object to a function: + +```html +
...
+``` +would become +```html +
...
+``` +where `ctrl.getMessages()` +```javascript +ctrl.getMessages = function($index) { + return ctrl.form['field_' + $index].$error; +} +``` + - **$http:** due to [5da1256](https://github.com/angular/angular.js/commit/5da1256fc2812d5b28fb0af0de81256054856369), `transformRequest` functions can no longer modify request headers. @@ -1818,6 +1978,12 @@ But in practice this is not what people want and so this change iterates over pr in the order they are returned by Object.keys(obj), which is almost always the order in which the properties were defined. +- **ngOptions:** due to [7fda214c](https://github.com/angular/angular.js/commit/7fda214c4f65a6a06b25cf5d5aff013a364e9cef), + +setting the ngOptions attribute expression after the element is compiled, will no longer trigger the ngOptions behavior. +This worked previously because the ngOptions logic was part of the select directive, while +it is now implemented in the ngOptions directive itself. + - **select:** due to [7fda214c](https://github.com/angular/angular.js/commit/7fda214c4f65a6a06b25cf5d5aff013a364e9cef), the `select` directive will now use strict comparison of the `ngModel` scope value against `option` @@ -2420,7 +2586,36 @@ We also added a documentation page focused on security, which contains some of t [#9578](https://github.com/angular/angular.js/issues/9578), [#9751](https://github.com/angular/angular.js/issues/9751)) +## Breaking Changes + +- **$observe:** Due to [531a8de7](https://github.com/angular/angular.js/commit/531a8de72c439d8ddd064874bf364c00cedabb11), +observers no longer register on undefined attributes. For example, if you were using `$observe` on +an absent optional attribute to set a default value, the following would not work anymore: + +```html + +``` + +```js +// link function for directive myDir +link: function(scope, element, attr) { + attr.$observe('myAttr', function(newVal) { + scope.myValue = newVal ? newVal : 'myDefaultValue'; + }) +} +``` + +Instead, check if the attribute is set before registering the observer: +```js +link: function(scope, element, attr) { + if (attr.myAttr) { + // register the observer + } else { + // set the default + } +} +``` # 1.3.0 superluminal-nudge (2014-10-13) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 4a93f7090811..4cb8a995c774 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -71,7 +71,7 @@ chances of your issue being dealt with quickly: * **Angular Version(s)** - is it a regression? * **Browsers and Operating System** - is this a problem with all browsers or only IE8? * **Reproduce the Error** - provide a live example (using [Plunker][plunker] or - [JSFiddle][jsfiddle]) or a unambiguous set of steps. + [JSFiddle][jsfiddle]) or an unambiguous set of steps. * **Related Issues** - has a similar issue been reported before? * **Suggest a Fix** - if you can't fix the bug yourself, perhaps you can point to what might be causing the problem (line of code or commit) diff --git a/Gruntfile.js b/Gruntfile.js index 53aaf59a9ad6..018f08b16f1c 100644 --- a/Gruntfile.js +++ b/Gruntfile.js @@ -305,7 +305,7 @@ module.exports = function(grunt) { shell: { "npm-install": { - command: path.normalize('scripts/npm/install-dependencies.sh') + command: 'node scripts/npm/check-node-modules.js' }, "promises-aplus-tests": { diff --git a/README.md b/README.md index aac26f18c667..b3e6c71c4d9c 100644 --- a/README.md +++ b/README.md @@ -21,7 +21,7 @@ piece of cake. Best of all?? It makes development fun! Building AngularJS --------- -[Once you have your environment setup](http://docs.angularjs.org/misc/contribute) just run: +[Once you have your environment set up](http://docs.angularjs.org/misc/contribute) just run: grunt package diff --git a/angularFiles.js b/angularFiles.js index 9d18fd831b6c..c94f44be7adb 100755 --- a/angularFiles.js +++ b/angularFiles.js @@ -14,6 +14,7 @@ var angularFiles = { 'src/ng/anchorScroll.js', 'src/ng/animate.js', + 'src/ng/animateRunner.js', 'src/ng/animateCss.js', 'src/ng/browser.js', 'src/ng/cacheFactory.js', @@ -92,7 +93,6 @@ var angularFiles = { 'angularModules': { 'ngAnimate': [ 'src/ngAnimate/shared.js', - 'src/ngAnimate/body.js', 'src/ngAnimate/rafScheduler.js', 'src/ngAnimate/animateChildrenDirective.js', 'src/ngAnimate/animateCss.js', @@ -100,7 +100,6 @@ var angularFiles = { 'src/ngAnimate/animateJs.js', 'src/ngAnimate/animateJsDriver.js', 'src/ngAnimate/animateQueue.js', - 'src/ngAnimate/animateRunner.js', 'src/ngAnimate/animation.js', 'src/ngAnimate/module.js' ], diff --git a/docs/app/assets/css/docs.css b/docs/app/assets/css/docs.css index 0bd14d669af8..e72f1c88fe83 100644 --- a/docs/app/assets/css/docs.css +++ b/docs/app/assets/css/docs.css @@ -589,6 +589,12 @@ ul.events > li { vertical-align: top; } +.table > tbody > tr.head > td, +.table > tbody > tr.head > th { + border-bottom: 2px solid #ddd; + padding-top: 50px; +} + @media only screen and (min-width: 769px) and (max-width: 991px) { .main-body-grid { margin-top: 160px; diff --git a/docs/content/error/$compile/ctreq.ngdoc b/docs/content/error/$compile/ctreq.ngdoc index d222a1bdc65f..8aedd10a38c5 100644 --- a/docs/content/error/$compile/ctreq.ngdoc +++ b/docs/content/error/$compile/ctreq.ngdoc @@ -8,7 +8,7 @@ but the required directive controller is not present on the current DOM element To resolve this error ensure that there is no typo in the required controller name and that the required directive controller is present on the current element. -If the required controller is expected to be on a ancestor element, make sure that you prefix the controller name in the `require` definition with `^`. +If the required controller is expected to be on an ancestor element, make sure that you prefix the controller name in the `require` definition with `^`. If the required controller is optionally requested, use `?` or `^?` to specify that. diff --git a/docs/content/error/$location/nobase.ngdoc b/docs/content/error/$location/nobase.ngdoc index 69500d43a767..ad90064cdba0 100644 --- a/docs/content/error/$location/nobase.ngdoc +++ b/docs/content/error/$location/nobase.ngdoc @@ -1,6 +1,6 @@ @ngdoc error @name $location:nobase -@fullName $location in HTML5 mode requires a tag to be present! +@fullName $location in HTML5 mode requires a `` tag to be present! @description If you configure {@link ng.$location `$location`} to use @@ -15,7 +15,7 @@ $locationProvider.html5Mode({ }); ``` -Note that removing the requirement for a tag will have adverse side effects when resolving +Note that removing the requirement for a `` tag will have adverse side effects when resolving relative paths with `$location` in IE9. The base URL is then used to resolve all relative URLs throughout the application regardless of the diff --git a/docs/content/guide/$location.ngdoc b/docs/content/guide/$location.ngdoc index 237c49a1b484..03833c06ae26 100644 --- a/docs/content/guide/$location.ngdoc +++ b/docs/content/guide/$location.ngdoc @@ -356,15 +356,15 @@ legacy browsers and hashbang links in modern browser: ### Example -Here you can see two `$location` instances, both in **Html5 mode**, but on different browsers, so -that you can see the differences. These `$location` services are connected to a fake browsers. Each -input represents the address bar of the browser. +Here you can see two `$location` instances that show the difference between **Html5 mode** and **Html5 Fallback mode**. +Note that to simulate different levels of browser support, the `$location` instances are connected to +a fakeBrowser service, which you don't have to set up in actual projects. -Note that when you type hashbang url into first browser (or vice versa) it doesn't rewrite / +Note that when you type hashbang url into the first browser (or vice versa) it doesn't rewrite / redirect to regular / hashbang url, as this conversion happens only during parsing the initial URL = on page reload. -In these examples we use `` +In these examples we use ``. The inputs represent the address bar of the browser. #### Browser in HTML5 mode @@ -389,6 +389,7 @@ In these examples we use `` angular.module('html5-mode', ['fake-browser', 'address-bar']) + // Configure the fakeBrowser. Do not set these values in actual projects. .constant('initUrl', 'http://www.example.com/base/path?a=b#h') .constant('baseHref', '/base/index.html') .value('$sniffer', { history: true }) @@ -538,6 +539,7 @@ In these examples we use `` angular.module('hashbang-mode', ['fake-browser', 'address-bar']) + // Configure the fakeBrowser. Do not set these values in actual projects. .constant('initUrl', 'http://www.example.com/base/index.html#!/path?a=b#h') .constant('baseHref', '/base/index.html') .value('$sniffer', { history: false }) @@ -769,8 +771,8 @@ then uses the information it obtains to compose hashbang URLs (such as - Navigation outside the app - Use lower level API + Navigation outside the app + Use lower level API @@ -784,8 +786,8 @@ then uses the information it obtains to compose hashbang URLs (such as - Read access - Change to + Read access + Change to diff --git a/docs/content/guide/concepts.ngdoc b/docs/content/guide/concepts.ngdoc index 8c2a4a0cfc80..d72495a3ac33 100644 --- a/docs/content/guide/concepts.ngdoc +++ b/docs/content/guide/concepts.ngdoc @@ -76,7 +76,7 @@ stores/updates the value of the input field into/from a variable. The second kind of new markup are the double curly braces `{{ expression | filter }}`: When the compiler encounters this markup, it will replace it with the evaluated value of the markup. An {@link expression expression} in a template is a JavaScript-like code snippet that allows -to read and write variables. Note that those variables are not global variables. +Angular to read and write variables. Note that those variables are not global variables. Just like variables in a JavaScript function live in a scope, Angular provides a {@link scope scope} for the variables accessible to expressions. The values that are stored in variables on the scope are referred to as the *model* @@ -348,8 +348,7 @@ The following example shows how this is done with Angular: return { currencies: currencies, - convert: convert, - refresh: refresh + convert: convert }; }]); diff --git a/docs/content/guide/directive.ngdoc b/docs/content/guide/directive.ngdoc index 581a0f7e5b2e..a277e5f7ee5d 100644 --- a/docs/content/guide/directive.ngdoc +++ b/docs/content/guide/directive.ngdoc @@ -43,8 +43,7 @@ mirrors the process of compiling source code in Before we can write a directive, we need to know how Angular's {@link guide/compiler HTML compiler} determines when to use a given directive. -Similar to the terminology used when an [element **matches** a selector] -(https://developer.mozilla.org/en-US/docs/Web/API/Element.matches), we say an element **matches** a +Similar to the terminology used when an [element **matches** a selector](https://developer.mozilla.org/en-US/docs/Web/API/Element.matches), we say an element **matches** a directive when the directive is part of its declaration. In the following example, we say that the `` element **matches** the `ngModel` directive @@ -588,14 +587,24 @@ want to reuse throughout your app. In this example we will build a directive that displays the current time. Once a second, it updates the DOM to reflect the current time. -Directives that want to modify the DOM typically use the `link` option. -`link` takes a function with the following signature, `function link(scope, element, attrs) { ... }` -where: +Directives that want to modify the DOM typically use the `link` option to register DOM listeners +as well as update the DOM. It is executed after the template has been cloned and is where +directive logic will be put. + + `link` takes a function with the following signature, +`function link(scope, element, attrs, controller, transcludeFn) { ... }`, where: * `scope` is an Angular scope object. * `element` is the jqLite-wrapped element that this directive matches. * `attrs` is a hash object with key-value pairs of normalized attribute names and their corresponding attribute values. +* `controller` is the directive's required controller instance(s) or its own controller (if any). + The exact value depends on the directive's require property. +* `transcludeFn` is a transclude linking function pre-bound to the correct transclusion scope. + +
+For more details on the `link` option refer to the {@link ng.$compile#-link- `$compile` API} page. +
In our `link` function, we want to update the displayed time once a second, or whenever a user changes the time formatting string that our directive binds to. We will use the `$interval` service @@ -903,7 +912,7 @@ to which tab is active. restrict: 'E', transclude: true, scope: {}, - controller: function($scope) { + controller: ['$scope', function($scope) { var panes = $scope.panes = []; $scope.select = function(pane) { @@ -919,7 +928,7 @@ to which tab is active. } panes.push(pane); }; - }, + }], templateUrl: 'my-tabs.html' }; }) diff --git a/docs/content/guide/expression.ngdoc b/docs/content/guide/expression.ngdoc index b5d0d4c7a9f5..b0e9816740ee 100644 --- a/docs/content/guide/expression.ngdoc +++ b/docs/content/guide/expression.ngdoc @@ -35,7 +35,9 @@ Angular expressions are like JavaScript expressions with the following differenc * **No RegExp Creation With Literal Notation:** You cannot create regular expressions in an Angular expression. - * **No Comma And Void Operators:** You cannot use `,` or `void` in an Angular expression. + * **No Object Creation With New Operator:** You cannot use `new` operator in an Angular expression. + + * **No Comma And Void Operators:** You cannot use `,` or `void` operators in an Angular expression. * **Filters:** You can use {@link guide/filter filters} within expressions to format data before displaying it. diff --git a/docs/content/guide/forms.ngdoc b/docs/content/guide/forms.ngdoc index 336f26d7f07d..588f57ac40e7 100644 --- a/docs/content/guide/forms.ngdoc +++ b/docs/content/guide/forms.ngdoc @@ -383,7 +383,7 @@ In the following example we create two directives: return { require: 'ngModel', link: function(scope, elm, attrs, ctrl) { - var usernames = ['Jim', 'John', 'Jill', 'Jackie']; + var usernames = ['Jim', 'John', 'Jill', 'Jackie']; ctrl.$asyncValidators.username = function(modelValue, viewValue) { diff --git a/docs/content/guide/migration.ngdoc b/docs/content/guide/migration.ngdoc index a77534fc2856..507ea7ae3b54 100644 --- a/docs/content/guide/migration.ngdoc +++ b/docs/content/guide/migration.ngdoc @@ -170,6 +170,25 @@ other inline messages situated as children within the `ngMessages` container dir Depending on where the `ngMessagesInclude` directive is placed it will be prioritized inline with the other messages before and after it. +Also due to [c9a4421f](https://github.com/angular/angular.js/commit/c9a4421fc3c97448527eadef1f42eb2f487ec2e0), +it is no longer possible to use interpolation inside the `ngMessages` attribute expression. This technique +is generally not recommended, and can easily break when a directive implementation changes. In cases +where a simple expression is not possible, you can delegate accessing the object to a function: + +```html +
...
+``` +would become +```html +
...
+``` +where `ctrl.getMessages()` +```javascript +ctrl.getMessages = function($index) { + return ctrl.form['field_' + $index].$error; +} +``` + ### ngOptions The `ngOptions` directive has also been refactored and as a result some long-standing bugs @@ -189,6 +208,10 @@ But in practice this is not what people want and so this change iterates over pr in the order they are returned by Object.keys(obj), which is almost always the order in which the properties were defined. +Also due to [7fda214c](https://github.com/angular/angular.js/commit/7fda214c4f65a6a06b25cf5d5aff013a364e9cef), +setting the ngOptions attribute expression after the element is compiled, will no longer trigger the ngOptions behavior. +This worked previously because the ngOptions logic was part of the select directive, while +it is now implemented in the ngOptions directive itself. ### select @@ -561,6 +584,36 @@ After: }; }); + - due to [531a8de7](https://github.com/angular/angular.js/commit/531a8de72c439d8ddd064874bf364c00cedabb11), +`$observe` no longer registers on undefined attributes. For example, if you were using `$observe` on +an absent optional attribute to set a default value, the following would not work anymore: + +```html + +``` + +```js +// Link function for directive myDir +link: function(scope, element, attr) { + attr.$observe('myAttr', function(newVal) { + scope.myValue = newVal ? newVal : 'myDefaultValue'; + }) +} +``` + +Instead, check if the attribute is set before registering the observer: + +```js +link: function(scope, element, attr) { + if (attr.myAttr) { + // register the observer + } else { + // set the default + } +} +``` + + @@ -633,8 +686,15 @@ $scope.resetWithCancel = function (e) { [#5864](https://github.com/angular/angular.js/issues/5864)) +- {@link input[checkbox] `input[checkbox]`} now supports constant expressions in `ngTrueValue` and + `ngFalseValue`, making it now possible to e.g. use boolean and integer values. Previously, these attributes would + always be treated as strings, whereas they are now parsed as expressions, and will throw if an expression + is non-constant. To convert non-constant strings into constant expressions, simply wrap them in an + extra pair of quotes, like so: + `` + See [c90cefe1614](https://github.com/angular/angular.js/commit/c90cefe16142d973a123e945fc9058e8a874c357) ## Scopes and Digests (`$scope`) diff --git a/docs/content/guide/production.ngdoc b/docs/content/guide/production.ngdoc index 1ecfd4cb3b96..52d088122ca3 100644 --- a/docs/content/guide/production.ngdoc +++ b/docs/content/guide/production.ngdoc @@ -44,7 +44,7 @@ and {@link angular.reloadWithDebugInfo `angular.reloadWithDebugInfo`}. ## Strict DI Mode -Using strict di mode in your production application will throw errors when a injectable +Using strict di mode in your production application will throw errors when an injectable function is not {@link di#dependency-annotation annotated explicitly}. Strict di mode is intended to help you make sure that your code will work when minified. However, it also will force you to diff --git a/docs/content/guide/scope.ngdoc b/docs/content/guide/scope.ngdoc index 7fbeb233f7ef..30263b73df4c 100644 --- a/docs/content/guide/scope.ngdoc +++ b/docs/content/guide/scope.ngdoc @@ -391,7 +391,7 @@ implementing custom event callbacks, or when working with third-party library ca 5. The {@link ng.$rootScope.Scope#$watch $watch} list is a set of expressions which may have changed since last iteration. If a change is detected then the `$watch` function is called which typically updates the DOM with the new value. - 6. Once the Angular {@link ng.$rootScope.Scope#$digest $digest} loop finishes + 6. Once the Angular {@link ng.$rootScope.Scope#$digest $digest} loop finishes, the execution leaves the Angular and JavaScript context. This is followed by the browser re-rendering the DOM to reflect any changes. @@ -419,4 +419,4 @@ user enters text into the text field. which in turn updates the DOM. 6. Angular exits the execution context, which in turn exits the `keydown` event and with it the JavaScript execution context. - 7. The browser re-renders the view with update text. + 7. The browser re-renders the view with the updated text. diff --git a/docs/content/guide/unit-testing.ngdoc b/docs/content/guide/unit-testing.ngdoc index e17ca02d4bee..bcc7cf04dbd7 100644 --- a/docs/content/guide/unit-testing.ngdoc +++ b/docs/content/guide/unit-testing.ngdoc @@ -359,7 +359,7 @@ element, to which it can then insert the transcluded content into its template. Before compilation: ```html -
+
Some transcluded content
``` diff --git a/docs/content/tutorial/step_00.ngdoc b/docs/content/tutorial/step_00.ngdoc index a3a913b4600c..7184d5fdd512 100644 --- a/docs/content/tutorial/step_00.ngdoc +++ b/docs/content/tutorial/step_00.ngdoc @@ -6,12 +6,14 @@
    -You are now ready to build the AngularJS phonecat app. In this step, you will become familiar -with the most important source code files, learn how to start the development servers bundled with +In this step of the tutorial, you will become familiar with the most important source code files of +the AngularJS phonecat app. You will also learn how to start the development servers bundled with angular-seed, and run the application in the browser. +Before you continue, make sure you have set up your development environment and installed all necessary +dependencies, as described in {@link tutorial/index#get-started Get Started}. -In `angular-phonecat` directory, run this command: +In the `angular-phonecat` directory, run this command: ``` git checkout -f step-0 diff --git a/docs/content/tutorial/step_02.ngdoc b/docs/content/tutorial/step_02.ngdoc index 5461ae0cdbc1..2fad895f9c78 100644 --- a/docs/content/tutorial/step_02.ngdoc +++ b/docs/content/tutorial/step_02.ngdoc @@ -61,7 +61,7 @@ by the value of the expressions. We have added a new directive, called `ng-controller`, which attaches a `PhoneListCtrl` __controller__ to the <body> tag. At this point: -* The expressions in curly braces (`{{phone.name}}` and `{{phone.snippet}}` denote +* The expressions in curly braces (`{{phone.name}}` and `{{phone.snippet}}`) denote bindings, which are referring to our application model, which is set up in our `PhoneListCtrl` controller. @@ -195,8 +195,19 @@ to ensure that Karma and its necessary plugins are installed. You can do this by To run the tests, and then watch the files for changes: `npm test`. -* Karma will start a new instance of Chrome browser automatically. Just ignore it and let it run in - the background. Karma will use this browser for test execution. +* Karma will start new instances of Chrome and Firefox browsers automatically. Just ignore them and + let them run in the background. Karma will use these browsers for test execution. +* If you only have one of the browsers installed on your machine (either Chrome or Firefox), make + sure to update the karma configuration file before running the test. Locate the configuration file + in `test/karma.conf.js`, then update the `browsers` property. + + E.g. if you only have Chrome installed: +
    +    ...
    +    browsers: ['Chrome'],
    +    ...
    +  
    + * You should see the following or similar output in the terminal:
    @@ -250,7 +261,7 @@ browser is limited, which results in your karma tests running extremely slow.
                 row number
                 {{i+1}}
               
    -  
    +
       Extra points: try and make an 8x8 table using an additional `ng-repeat`.
     
     * Make the unit test fail by changing `expect(scope.phones.length).toBe(3)` to instead use `toBe(4)`.
    diff --git a/docs/content/tutorial/step_07.ngdoc b/docs/content/tutorial/step_07.ngdoc
    index 071d52c76f51..824e322d3e48 100644
    --- a/docs/content/tutorial/step_07.ngdoc
    +++ b/docs/content/tutorial/step_07.ngdoc
    @@ -37,12 +37,12 @@ We are using [Bower][bower] to install client-side dependencies.  This step upda
         "angular-mocks": "1.4.x",
         "jquery": "~2.1.1",
         "bootstrap": "~3.1.1",
    -    "angular-route": "~1.4.0"
    +    "angular-route": "1.4.x"
       }
     }
     ```
     
    -The new dependency `"angular-route": "~1.4.0"` tells bower to install a version of the
    +The new dependency `"angular-route": "1.4.x"` tells bower to install a version of the
     angular-route component that is compatible with version 1.4.x.  We must tell bower to download
     and install this dependency.
     
    diff --git a/docs/content/tutorial/step_08.ngdoc b/docs/content/tutorial/step_08.ngdoc
    index e13b8db0ed6e..6e5ef9abd8f7 100644
    --- a/docs/content/tutorial/step_08.ngdoc
    +++ b/docs/content/tutorial/step_08.ngdoc
    @@ -12,8 +12,8 @@ phone in the phone list.
     * When you click on a phone on the list, the phone details page with phone-specific information
     is displayed.
     
    -To implement the phone details view we used {@link ng.$http $http} to fetch our data, and we
    -fleshed out the `phone-detail.html` view template.
    +To implement the phone details view we are going to use {@link ng.$http $http} to fetch our data,
    +and then flesh out the `phone-detail.html` view template.
     
     
    diff --git a/docs/content/tutorial/step_11.ngdoc b/docs/content/tutorial/step_11.ngdoc index 56dad6817ebc..946a7185ecd0 100644 --- a/docs/content/tutorial/step_11.ngdoc +++ b/docs/content/tutorial/step_11.ngdoc @@ -32,17 +32,18 @@ We are using [Bower][bower] to install client side dependencies. This step upda "license": "MIT", "private": true, "dependencies": { - "angular": "~1.3.0", - "angular-mocks": "~1.3.0", + "angular": "1.4.x", + "angular-mocks": "1.4.x", + "jquery": "~2.1.1", "bootstrap": "~3.1.1", - "angular-route": "~1.3.0", - "angular-resource": "~1.3.0" + "angular-route": "1.4.x", + "angular-resource": "1.4.x" } } ``` -The new dependency `"angular-resource": "~1.3.0"` tells bower to install a version of the -angular-resource component that is compatible with version 1.3.x. We must ask bower to download +The new dependency `"angular-resource": "1.4.x"` tells bower to install a version of the +angular-resource component that is compatible with version 1.4.x. We must ask bower to download and install this dependency. We can do this by running: ``` diff --git a/docs/content/tutorial/step_12.ngdoc b/docs/content/tutorial/step_12.ngdoc index 17dd6241244f..f9ac9adade07 100644 --- a/docs/content/tutorial/step_12.ngdoc +++ b/docs/content/tutorial/step_12.ngdoc @@ -36,20 +36,20 @@ We are using [Bower][bower] to install client side dependencies. This step upda "license": "MIT", "private": true, "dependencies": { - "angular": "~1.3.0", - "angular-mocks": "~1.3.0", - "bootstrap": "~3.1.1", - "angular-route": "~1.3.0", - "angular-resource": "~1.3.0", + "angular": "1.4.x", + "angular-mocks": "1.4.x", "jquery": "~2.1.1", - "angular-animate": "~1.3.0" + "bootstrap": "~3.1.1", + "angular-route": "1.4.x", + "angular-resource": "1.4.x", + "angular-animate": "1.4.x" } } ``` -* `"angular-animate": "~1.3.0"` tells bower to install a version of the -angular-animate component that is compatible with version 1.3.x. -* `"jquery": "2.1.1"` tells bower to install the 2.1.1 version of jQuery. Note that this is not an +* `"angular-animate": "1.4.x"` tells bower to install a version of the +angular-animate component that is compatible with version 1.4.x. +* `"jquery": "~2.1.1"` tells bower to install the 2.1.1 version of jQuery. Note that this is not an Angular library, it is the standard jQuery library. We can use bower to install a wide range of 3rd party libraries. @@ -111,7 +111,7 @@ __`app/index.html`.__ ```
    - **Important:** Be sure to use jQuery version 2.1 or newer when using Angular 1.3; jQuery 1.x is + **Important:** Be sure to use jQuery version 2.1 or newer when using Angular 1.4; jQuery 1.x is not officially supported. Be sure to load jQuery before all AngularJS scripts, otherwise AngularJS won't detect jQuery and animations will not work as expected. @@ -239,9 +239,9 @@ The name of the starting class is the name of the event that is fired (like `ent The active class name is the same as the starting class's but with an `-active` suffix. This two-class CSS naming convention allows the developer to craft an animation, beginning to end. -In our example above, elements expand from a height of **0** to **120 pixels** when items are added or moved, -around and collapsing the items before removing them from the list. -There's also a nice fade-in and fade-out effect that also occurs at the same time. All of this is handled +In our example above, elements are expanded from a height of **0** to **120 pixels** when they're added to the +list and are collapsed back down to **0 pixels** before being removed from the list. +There's also a nice fade-in and fade-out effect that occurs at the same time. All of this is handled by the CSS transition declarations at the top of the example code above. Although most modern browsers have good support for [CSS transitions](http://caniuse.com/#feat=css-transitions) diff --git a/i18n/spec/closureI18nExtractorSpec.js b/i18n/spec/closureI18nExtractorSpec.js index 07641ca9ffce..d3ebc843bdb1 100644 --- a/i18n/spec/closureI18nExtractorSpec.js +++ b/i18n/spec/closureI18nExtractorSpec.js @@ -11,6 +11,8 @@ function newTestLocaleInfo() { DATETIME_FORMATS: { MONTH: ['janvier', 'février', 'mars', 'avril', 'mai', 'juin', 'juillet', 'août', 'septembre', 'octobre', 'novembre', 'décembre'], + STANDALONEMONTH: ['janvier', 'février', 'mars', 'avril', 'mai', 'juin', 'juillet', 'août', 'septembre', + 'octobre', 'novembre', 'décembre'], SHORTMONTH: ['janv.', 'févr.', 'mars', 'avr.', 'mai', 'juin', 'juil.', 'août', 'sept.', 'oct.', 'nov.', 'déc.'], DAY: ['dimanche', 'lundi', 'mardi', 'mercredi', 'jeudi', 'vendredi', 'samedi'], @@ -180,6 +182,8 @@ describe("extractDateTimeSymbols", function() { DATETIME_FORMATS: { MONTH: ['janvier', 'février', 'mars', 'avril', 'mai', 'juin', 'juillet', 'août', 'septembre', 'octobre', 'novembre', 'décembre'], + STANDALONEMONTH: ['janvier', 'février', 'mars', 'avril', 'mai', 'juin', 'juillet', + 'août', 'septembre', 'octobre', 'novembre', 'décembre'], SHORTMONTH: ['janv.', 'févr.', 'mars', 'avr.', 'mai', 'juin', 'juil.', 'août', 'sept.', 'oct.', 'nov.', 'déc.'], DAY: ['dimanche', 'lundi', 'mardi', 'mercredi', 'jeudi', 'vendredi', 'samedi'], diff --git a/i18n/spec/converterSpec.js b/i18n/spec/converterSpec.js index e02bde9f4155..43b8d7223507 100644 --- a/i18n/spec/converterSpec.js +++ b/i18n/spec/converterSpec.js @@ -27,6 +27,7 @@ describe("convertNumberData", function() { describe("convertDatetimeData", function() { var convert = converter.convertDatetimeData, dataObj = { MONTHS: ['Enero', 'Pebrero'], + STANDALONEMONTHS: ['Enero', 'Pebrero'], SHORTMONTHS: ['Ene', 'Peb'], WEEKDAYS: ['Linggo', 'Lunes'], SHORTWEEKDAYS: ['Lin', 'Lun'], @@ -37,6 +38,7 @@ describe("convertDatetimeData", function() { it('should convert empty datetime obj', function() { var processedData = convert(dataObj); expect(processedData.MONTH).toEqual(['Enero', 'Pebrero']); + expect(processedData.STANDALONEMONTH).toEqual(['Enero', 'Pebrero']); expect(processedData.SHORTMONTH).toEqual(['Ene', 'Peb']); expect(processedData.DAY).toEqual(['Linggo', 'Lunes']); expect(processedData.SHORTDAY).toEqual(['Lin', 'Lun']); diff --git a/i18n/src/converter.js b/i18n/src/converter.js index 259dbd0e747a..9f5c3527677e 100644 --- a/i18n/src/converter.js +++ b/i18n/src/converter.js @@ -39,6 +39,7 @@ function convertDatetimeData(dataObj) { datetimeFormats.MONTH = dataObj.MONTHS; datetimeFormats.SHORTMONTH = dataObj.SHORTMONTHS; + datetimeFormats.STANDALONEMONTH = dataObj.STANDALONEMONTHS; datetimeFormats.DAY = dataObj.WEEKDAYS; datetimeFormats.SHORTDAY = dataObj.SHORTWEEKDAYS; datetimeFormats.AMPMS = dataObj.AMPMS; diff --git a/lib/browserstack/teardown_tunnel.sh b/lib/browserstack/teardown_tunnel.sh new file mode 100755 index 000000000000..86fd334284e3 --- /dev/null +++ b/lib/browserstack/teardown_tunnel.sh @@ -0,0 +1,8 @@ +#!/bin/bash + +set -e -o pipefail + + +echo "Shutting down Browserstack tunnel" +echo "TODO: implement me" +exit 1 \ No newline at end of file diff --git a/lib/saucelabs/teardown_tunnel.sh b/lib/saucelabs/teardown_tunnel.sh new file mode 100755 index 000000000000..91b918a485e3 --- /dev/null +++ b/lib/saucelabs/teardown_tunnel.sh @@ -0,0 +1,16 @@ +#!/bin/bash + +set -e -o pipefail + + +echo "Shutting down Sauce Connect tunnel" + +killall sc + +while [[ -n `ps -ef | grep "sauce-connect-" | grep -v "grep"` ]]; do + printf "." + sleep .5 +done + +echo "" +echo "Sauce Connect tunnel has been shut down" diff --git a/npm-shrinkwrap.clean.json b/npm-shrinkwrap.clean.json index a7555fce9dc9..d77137f88000 100644 --- a/npm-shrinkwrap.clean.json +++ b/npm-shrinkwrap.clean.json @@ -2266,6 +2266,3131 @@ } } }, + "commitizen": { + "version": "2.3.0", + "dependencies": { + "babel": { + "version": "5.8.23", + "dependencies": { + "babel-core": { + "version": "5.8.33", + "dependencies": { + "babel-plugin-constant-folding": { + "version": "1.0.1" + }, + "babel-plugin-dead-code-elimination": { + "version": "1.0.2" + }, + "babel-plugin-eval": { + "version": "1.0.1" + }, + "babel-plugin-inline-environment-variables": { + "version": "1.0.1" + }, + "babel-plugin-jscript": { + "version": "1.0.4" + }, + "babel-plugin-member-expression-literals": { + "version": "1.0.1" + }, + "babel-plugin-property-literals": { + "version": "1.0.1" + }, + "babel-plugin-proto-to-assign": { + "version": "1.0.4" + }, + "babel-plugin-react-constant-elements": { + "version": "1.0.3" + }, + "babel-plugin-react-display-name": { + "version": "1.0.3" + }, + "babel-plugin-remove-console": { + "version": "1.0.1" + }, + "babel-plugin-remove-debugger": { + "version": "1.0.1" + }, + "babel-plugin-runtime": { + "version": "1.0.7" + }, + "babel-plugin-undeclared-variables-check": { + "version": "1.0.2", + "dependencies": { + "leven": { + "version": "1.0.2" + } + } + }, + "babel-plugin-undefined-to-void": { + "version": "1.1.6" + }, + "babylon": { + "version": "5.8.29" + }, + "bluebird": { + "version": "2.10.2" + }, + "core-js": { + "version": "1.2.3" + }, + "debug": { + "version": "2.2.0", + "dependencies": { + "ms": { + "version": "0.7.1" + } + } + }, + "detect-indent": { + "version": "3.0.1", + "dependencies": { + "get-stdin": { + "version": "4.0.1" + } + } + }, + "esutils": { + "version": "2.0.2" + }, + "globals": { + "version": "6.4.1" + }, + "home-or-tmp": { + "version": "1.0.0", + "dependencies": { + "os-tmpdir": { + "version": "1.0.1" + }, + "user-home": { + "version": "1.1.1" + } + } + }, + "is-integer": { + "version": "1.0.6", + "dependencies": { + "is-finite": { + "version": "1.0.1", + "dependencies": { + "number-is-nan": { + "version": "1.0.0" + } + } + } + } + }, + "js-tokens": { + "version": "1.0.1" + }, + "json5": { + "version": "0.4.0" + }, + "line-numbers": { + "version": "0.2.0", + "dependencies": { + "left-pad": { + "version": "0.0.3" + } + } + }, + "minimatch": { + "version": "2.0.10", + "dependencies": { + "brace-expansion": { + "version": "1.1.1", + "dependencies": { + "balanced-match": { + "version": "0.2.1" + }, + "concat-map": { + "version": "0.0.1" + } + } + } + } + }, + "private": { + "version": "0.1.6" + }, + "regenerator": { + "version": "0.8.40", + "dependencies": { + "commoner": { + "version": "0.10.3", + "dependencies": { + "q": { + "version": "1.1.2" + }, + "commander": { + "version": "2.5.1" + }, + "graceful-fs": { + "version": "3.0.8" + }, + "glob": { + "version": "4.2.2", + "dependencies": { + "inflight": { + "version": "1.0.4", + "dependencies": { + "wrappy": { + "version": "1.0.1" + } + } + }, + "inherits": { + "version": "2.0.1" + }, + "minimatch": { + "version": "1.0.0", + "dependencies": { + "lru-cache": { + "version": "2.7.0" + }, + "sigmund": { + "version": "1.0.1" + } + } + }, + "once": { + "version": "1.3.2", + "dependencies": { + "wrappy": { + "version": "1.0.1" + } + } + } + } + }, + "mkdirp": { + "version": "0.5.1", + "dependencies": { + "minimist": { + "version": "0.0.8" + } + } + }, + "install": { + "version": "0.1.8" + }, + "iconv-lite": { + "version": "0.4.13" + } + } + }, + "defs": { + "version": "1.1.1", + "dependencies": { + "alter": { + "version": "0.2.0", + "dependencies": { + "stable": { + "version": "0.1.5" + } + } + }, + "ast-traverse": { + "version": "0.1.1" + }, + "breakable": { + "version": "1.0.0" + }, + "simple-fmt": { + "version": "0.1.0" + }, + "simple-is": { + "version": "0.2.0" + }, + "stringset": { + "version": "0.2.1" + }, + "tryor": { + "version": "0.1.2" + }, + "yargs": { + "version": "3.27.0", + "dependencies": { + "camelcase": { + "version": "1.2.1" + }, + "cliui": { + "version": "2.1.0", + "dependencies": { + "center-align": { + "version": "0.1.2", + "dependencies": { + "align-text": { + "version": "0.1.3", + "dependencies": { + "kind-of": { + "version": "2.0.1", + "dependencies": { + "is-buffer": { + "version": "1.1.0" + } + } + }, + "longest": { + "version": "1.0.1" + }, + "repeat-string": { + "version": "1.5.2" + } + } + }, + "lazy-cache": { + "version": "0.2.4" + } + } + }, + "right-align": { + "version": "0.1.3", + "dependencies": { + "align-text": { + "version": "0.1.3", + "dependencies": { + "kind-of": { + "version": "2.0.1", + "dependencies": { + "is-buffer": { + "version": "1.1.0" + } + } + }, + "longest": { + "version": "1.0.1" + }, + "repeat-string": { + "version": "1.5.2" + } + } + } + } + }, + "wordwrap": { + "version": "0.0.2" + } + } + }, + "decamelize": { + "version": "1.1.1" + }, + "os-locale": { + "version": "1.4.0", + "dependencies": { + "lcid": { + "version": "1.0.0", + "dependencies": { + "invert-kv": { + "version": "1.0.0" + } + } + } + } + }, + "window-size": { + "version": "0.1.2" + }, + "y18n": { + "version": "3.2.0" + } + } + } + } + }, + "esprima-fb": { + "version": "15001.1001.0-dev-harmony-fb" + }, + "recast": { + "version": "0.10.33", + "dependencies": { + "ast-types": { + "version": "0.8.12" + } + } + }, + "through": { + "version": "2.3.8" + } + } + }, + "regexpu": { + "version": "1.3.0", + "dependencies": { + "esprima": { + "version": "2.7.0" + }, + "recast": { + "version": "0.10.34", + "dependencies": { + "esprima-fb": { + "version": "15001.1001.0-dev-harmony-fb" + }, + "ast-types": { + "version": "0.8.12" + } + } + }, + "regenerate": { + "version": "1.2.1" + }, + "regjsgen": { + "version": "0.2.0" + }, + "regjsparser": { + "version": "0.1.5", + "dependencies": { + "jsesc": { + "version": "0.5.0" + } + } + } + } + }, + "repeating": { + "version": "1.1.3", + "dependencies": { + "is-finite": { + "version": "1.0.1", + "dependencies": { + "number-is-nan": { + "version": "1.0.0" + } + } + } + } + }, + "resolve": { + "version": "1.1.6" + }, + "shebang-regex": { + "version": "1.0.0" + }, + "source-map": { + "version": "0.5.3" + }, + "source-map-support": { + "version": "0.2.10", + "dependencies": { + "source-map": { + "version": "0.1.32", + "dependencies": { + "amdefine": { + "version": "1.0.0" + } + } + } + } + }, + "to-fast-properties": { + "version": "1.0.1" + }, + "trim-right": { + "version": "1.0.1" + }, + "try-resolve": { + "version": "1.0.1" + } + } + }, + "chokidar": { + "version": "1.2.0", + "dependencies": { + "anymatch": { + "version": "1.3.0", + "dependencies": { + "micromatch": { + "version": "2.2.0", + "dependencies": { + "arr-diff": { + "version": "1.1.0", + "dependencies": { + "arr-flatten": { + "version": "1.0.1" + }, + "array-slice": { + "version": "0.2.3" + } + } + }, + "array-unique": { + "version": "0.2.1" + }, + "braces": { + "version": "1.8.2", + "dependencies": { + "expand-range": { + "version": "1.8.1", + "dependencies": { + "fill-range": { + "version": "2.2.2", + "dependencies": { + "is-number": { + "version": "1.1.2" + }, + "isobject": { + "version": "1.0.2" + }, + "randomatic": { + "version": "1.1.0" + }, + "repeat-string": { + "version": "1.5.2" + } + } + } + } + }, + "lazy-cache": { + "version": "0.2.4" + }, + "preserve": { + "version": "0.2.0" + }, + "repeat-element": { + "version": "1.1.2" + } + } + }, + "expand-brackets": { + "version": "0.1.4" + }, + "extglob": { + "version": "0.3.1", + "dependencies": { + "ansi-green": { + "version": "0.1.1", + "dependencies": { + "ansi-wrap": { + "version": "0.1.0" + } + } + }, + "is-extglob": { + "version": "1.0.0" + }, + "success-symbol": { + "version": "0.1.0" + } + } + }, + "filename-regex": { + "version": "2.0.0" + }, + "is-glob": { + "version": "1.1.3" + }, + "kind-of": { + "version": "1.1.0" + }, + "object.omit": { + "version": "1.1.0", + "dependencies": { + "for-own": { + "version": "0.1.3", + "dependencies": { + "for-in": { + "version": "0.1.4" + } + } + }, + "isobject": { + "version": "1.0.2" + } + } + }, + "parse-glob": { + "version": "3.0.4", + "dependencies": { + "glob-base": { + "version": "0.3.0" + }, + "is-dotfile": { + "version": "1.0.2" + }, + "is-extglob": { + "version": "1.0.0" + }, + "is-glob": { + "version": "2.0.1" + } + } + }, + "regex-cache": { + "version": "0.4.2", + "dependencies": { + "is-equal-shallow": { + "version": "0.1.3" + }, + "is-primitive": { + "version": "2.0.0" + } + } + } + } + } + } + }, + "arrify": { + "version": "1.0.0" + }, + "async-each": { + "version": "0.1.6" + }, + "glob-parent": { + "version": "2.0.0" + }, + "is-binary-path": { + "version": "1.0.1", + "dependencies": { + "binary-extensions": { + "version": "1.3.1" + } + } + }, + "is-glob": { + "version": "2.0.1", + "dependencies": { + "is-extglob": { + "version": "1.0.0" + } + } + }, + "lodash.flatten": { + "version": "3.0.2", + "dependencies": { + "lodash._baseflatten": { + "version": "3.1.4", + "dependencies": { + "lodash.isarguments": { + "version": "3.0.4" + }, + "lodash.isarray": { + "version": "3.0.4" + } + } + }, + "lodash._isiterateecall": { + "version": "3.0.9" + } + } + }, + "readdirp": { + "version": "2.0.0", + "dependencies": { + "graceful-fs": { + "version": "4.1.2" + }, + "minimatch": { + "version": "2.0.10", + "dependencies": { + "brace-expansion": { + "version": "1.1.1", + "dependencies": { + "balanced-match": { + "version": "0.2.1" + }, + "concat-map": { + "version": "0.0.1" + } + } + } + } + }, + "readable-stream": { + "version": "2.0.4", + "dependencies": { + "core-util-is": { + "version": "1.0.1" + }, + "inherits": { + "version": "2.0.1" + }, + "isarray": { + "version": "0.0.1" + }, + "process-nextick-args": { + "version": "1.0.3" + }, + "string_decoder": { + "version": "0.10.31" + }, + "util-deprecate": { + "version": "1.0.2" + } + } + } + } + }, + "fsevents": { + "version": "1.0.2", + "dependencies": { + "nan": { + "version": "2.1.0" + }, + "node-pre-gyp": { + "version": "0.6.12", + "dependencies": { + "nopt": { + "version": "3.0.4", + "dependencies": { + "abbrev": { + "version": "1.0.7" + } + } + }, + "npmlog": { + "version": "1.2.1", + "dependencies": { + "ansi": { + "version": "0.3.0" + }, + "are-we-there-yet": { + "version": "1.0.4", + "dependencies": { + "delegates": { + "version": "0.1.0" + }, + "readable-stream": { + "version": "1.1.13", + "dependencies": { + "core-util-is": { + "version": "1.0.1" + }, + "isarray": { + "version": "0.0.1" + }, + "string_decoder": { + "version": "0.10.31" + }, + "inherits": { + "version": "2.0.1" + } + } + } + } + }, + "gauge": { + "version": "1.2.2", + "dependencies": { + "has-unicode": { + "version": "1.0.0" + }, + "lodash.pad": { + "version": "3.1.1", + "dependencies": { + "lodash._basetostring": { + "version": "3.0.1" + }, + "lodash._createpadding": { + "version": "3.6.1", + "dependencies": { + "lodash.repeat": { + "version": "3.0.1" + } + } + } + } + }, + "lodash.padleft": { + "version": "3.1.1", + "dependencies": { + "lodash._basetostring": { + "version": "3.0.1" + }, + "lodash._createpadding": { + "version": "3.6.1", + "dependencies": { + "lodash.repeat": { + "version": "3.0.1" + } + } + } + } + }, + "lodash.padright": { + "version": "3.1.1", + "dependencies": { + "lodash._basetostring": { + "version": "3.0.1" + }, + "lodash._createpadding": { + "version": "3.6.1", + "dependencies": { + "lodash.repeat": { + "version": "3.0.1" + } + } + } + } + } + } + } + } + }, + "request": { + "version": "2.64.0", + "dependencies": { + "bl": { + "version": "1.0.0", + "dependencies": { + "readable-stream": { + "version": "2.0.2", + "dependencies": { + "core-util-is": { + "version": "1.0.1" + }, + "inherits": { + "version": "2.0.1" + }, + "isarray": { + "version": "0.0.1" + }, + "process-nextick-args": { + "version": "1.0.3" + }, + "string_decoder": { + "version": "0.10.31" + }, + "util-deprecate": { + "version": "1.0.1" + } + } + } + } + }, + "caseless": { + "version": "0.11.0" + }, + "extend": { + "version": "3.0.0" + }, + "forever-agent": { + "version": "0.6.1" + }, + "form-data": { + "version": "1.0.0-rc3", + "dependencies": { + "async": { + "version": "1.4.2" + } + } + }, + "json-stringify-safe": { + "version": "5.0.1" + }, + "mime-types": { + "version": "2.1.7", + "dependencies": { + "mime-db": { + "version": "1.19.0" + } + } + }, + "node-uuid": { + "version": "1.4.3" + }, + "qs": { + "version": "5.1.0" + }, + "tunnel-agent": { + "version": "0.4.1" + }, + "tough-cookie": { + "version": "2.1.0" + }, + "http-signature": { + "version": "0.11.0", + "dependencies": { + "assert-plus": { + "version": "0.1.5" + }, + "asn1": { + "version": "0.1.11" + }, + "ctype": { + "version": "0.5.3" + } + } + }, + "oauth-sign": { + "version": "0.8.0" + }, + "hawk": { + "version": "3.1.0", + "dependencies": { + "hoek": { + "version": "2.16.3" + }, + "boom": { + "version": "2.9.0" + }, + "cryptiles": { + "version": "2.0.5" + }, + "sntp": { + "version": "1.0.9" + } + } + }, + "aws-sign2": { + "version": "0.5.0" + }, + "stringstream": { + "version": "0.0.4" + }, + "combined-stream": { + "version": "1.0.5", + "dependencies": { + "delayed-stream": { + "version": "1.0.0" + } + } + }, + "isstream": { + "version": "0.1.2" + }, + "har-validator": { + "version": "1.8.0", + "dependencies": { + "bluebird": { + "version": "2.10.2" + }, + "chalk": { + "version": "1.1.1", + "dependencies": { + "ansi-styles": { + "version": "2.1.0" + }, + "escape-string-regexp": { + "version": "1.0.3" + }, + "has-ansi": { + "version": "2.0.0", + "dependencies": { + "ansi-regex": { + "version": "2.0.0" + } + } + }, + "strip-ansi": { + "version": "3.0.0", + "dependencies": { + "ansi-regex": { + "version": "2.0.0" + } + } + }, + "supports-color": { + "version": "2.0.0" + } + } + }, + "commander": { + "version": "2.8.1", + "dependencies": { + "graceful-readlink": { + "version": "1.0.1" + } + } + }, + "is-my-json-valid": { + "version": "2.12.2", + "dependencies": { + "generate-function": { + "version": "2.0.0" + }, + "generate-object-property": { + "version": "1.2.0", + "dependencies": { + "is-property": { + "version": "1.0.2" + } + } + }, + "jsonpointer": { + "version": "2.0.0" + }, + "xtend": { + "version": "4.0.0" + } + } + } + } + } + } + }, + "semver": { + "version": "5.0.3" + }, + "tar": { + "version": "2.2.1", + "dependencies": { + "block-stream": { + "version": "0.0.8" + }, + "fstream": { + "version": "1.0.8", + "dependencies": { + "graceful-fs": { + "version": "4.1.2" + } + } + }, + "inherits": { + "version": "2.0.1" + } + } + }, + "tar-pack": { + "version": "2.0.0", + "dependencies": { + "uid-number": { + "version": "0.0.3" + }, + "once": { + "version": "1.1.1" + }, + "debug": { + "version": "0.7.4" + }, + "rimraf": { + "version": "2.2.8" + }, + "fstream": { + "version": "0.1.31", + "dependencies": { + "graceful-fs": { + "version": "3.0.8" + }, + "inherits": { + "version": "2.0.1" + } + } + }, + "tar": { + "version": "0.1.20", + "dependencies": { + "block-stream": { + "version": "0.0.8" + }, + "inherits": { + "version": "2.0.1" + } + } + }, + "fstream-ignore": { + "version": "0.0.7", + "dependencies": { + "minimatch": { + "version": "0.2.14", + "dependencies": { + "lru-cache": { + "version": "2.7.0" + }, + "sigmund": { + "version": "1.0.1" + } + } + }, + "inherits": { + "version": "2.0.1" + } + } + }, + "readable-stream": { + "version": "1.0.33", + "dependencies": { + "core-util-is": { + "version": "1.0.1" + }, + "isarray": { + "version": "0.0.1" + }, + "string_decoder": { + "version": "0.10.31" + }, + "inherits": { + "version": "2.0.1" + } + } + }, + "graceful-fs": { + "version": "1.2.3" + } + } + }, + "mkdirp": { + "version": "0.5.1", + "dependencies": { + "minimist": { + "version": "0.0.8" + } + } + }, + "rc": { + "version": "1.1.2", + "dependencies": { + "minimist": { + "version": "1.2.0" + }, + "deep-extend": { + "version": "0.2.11" + }, + "strip-json-comments": { + "version": "0.1.3" + }, + "ini": { + "version": "1.3.4" + } + } + }, + "rimraf": { + "version": "2.4.3", + "dependencies": { + "glob": { + "version": "5.0.15", + "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.1", + "dependencies": { + "balanced-match": { + "version": "0.2.0" + }, + "concat-map": { + "version": "0.0.1" + } + } + } + } + }, + "once": { + "version": "1.3.2", + "dependencies": { + "wrappy": { + "version": "1.0.1" + } + } + }, + "path-is-absolute": { + "version": "1.0.0" + } + } + } + } + } + } + } + } + } + } + }, + "commander": { + "version": "2.9.0", + "dependencies": { + "graceful-readlink": { + "version": "1.0.1" + } + } + }, + "convert-source-map": { + "version": "1.1.1" + }, + "fs-readdir-recursive": { + "version": "0.1.2" + }, + "lodash": { + "version": "3.10.1" + }, + "output-file-sync": { + "version": "1.1.1", + "dependencies": { + "mkdirp": { + "version": "0.5.1", + "dependencies": { + "minimist": { + "version": "0.0.8" + } + } + }, + "xtend": { + "version": "4.0.0" + } + } + }, + "path-exists": { + "version": "1.0.0" + }, + "path-is-absolute": { + "version": "1.0.0" + }, + "source-map": { + "version": "0.4.4", + "dependencies": { + "amdefine": { + "version": "1.0.0" + } + } + }, + "slash": { + "version": "1.0.0" + } + } + }, + "chalk": { + "version": "1.1.1", + "dependencies": { + "ansi-styles": { + "version": "2.1.0" + }, + "escape-string-regexp": { + "version": "1.0.3" + }, + "has-ansi": { + "version": "2.0.0", + "dependencies": { + "ansi-regex": { + "version": "2.0.0" + } + } + }, + "strip-ansi": { + "version": "3.0.0", + "dependencies": { + "ansi-regex": { + "version": "2.0.0" + } + } + }, + "supports-color": { + "version": "2.0.0" + } + } + }, + "dedent": { + "version": "0.4.0" + }, + "find-node-modules": { + "version": "1.0.1", + "dependencies": { + "findup-sync": { + "version": "0.2.1", + "dependencies": { + "glob": { + "version": "4.3.5", + "dependencies": { + "inflight": { + "version": "1.0.4", + "dependencies": { + "wrappy": { + "version": "1.0.1" + } + } + }, + "inherits": { + "version": "2.0.1" + }, + "minimatch": { + "version": "2.0.10", + "dependencies": { + "brace-expansion": { + "version": "1.1.1", + "dependencies": { + "balanced-match": { + "version": "0.2.1" + }, + "concat-map": { + "version": "0.0.1" + } + } + } + } + }, + "once": { + "version": "1.3.2", + "dependencies": { + "wrappy": { + "version": "1.0.1" + } + } + } + } + } + } + }, + "merge": { + "version": "1.2.0" + } + } + }, + "glob": { + "version": "5.0.15", + "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.1", + "dependencies": { + "balanced-match": { + "version": "0.2.1" + }, + "concat-map": { + "version": "0.0.1" + } + } + } + } + }, + "once": { + "version": "1.3.2", + "dependencies": { + "wrappy": { + "version": "1.0.1" + } + } + }, + "path-is-absolute": { + "version": "1.0.0" + } + } + }, + "gulp": { + "version": "3.9.0", + "dependencies": { + "archy": { + "version": "1.0.0" + }, + "deprecated": { + "version": "0.0.1" + }, + "interpret": { + "version": "0.6.6" + }, + "liftoff": { + "version": "2.2.0", + "dependencies": { + "extend": { + "version": "2.0.1" + }, + "findup-sync": { + "version": "0.3.0" + }, + "flagged-respawn": { + "version": "0.3.1" + }, + "rechoir": { + "version": "0.6.2" + }, + "resolve": { + "version": "1.1.6" + } + } + }, + "orchestrator": { + "version": "0.3.7", + "dependencies": { + "end-of-stream": { + "version": "0.1.5", + "dependencies": { + "once": { + "version": "1.3.2", + "dependencies": { + "wrappy": { + "version": "1.0.1" + } + } + } + } + }, + "sequencify": { + "version": "0.0.7" + }, + "stream-consume": { + "version": "0.1.0" + } + } + }, + "pretty-hrtime": { + "version": "1.0.1" + }, + "semver": { + "version": "4.3.6" + }, + "tildify": { + "version": "1.1.2", + "dependencies": { + "os-homedir": { + "version": "1.0.1" + } + } + }, + "v8flags": { + "version": "2.0.10", + "dependencies": { + "user-home": { + "version": "1.1.1" + } + } + }, + "vinyl-fs": { + "version": "0.3.14", + "dependencies": { + "defaults": { + "version": "1.0.3", + "dependencies": { + "clone": { + "version": "1.0.2" + } + } + }, + "glob-stream": { + "version": "3.1.18", + "dependencies": { + "glob": { + "version": "4.5.3", + "dependencies": { + "inflight": { + "version": "1.0.4", + "dependencies": { + "wrappy": { + "version": "1.0.1" + } + } + }, + "inherits": { + "version": "2.0.1" + }, + "once": { + "version": "1.3.2", + "dependencies": { + "wrappy": { + "version": "1.0.1" + } + } + } + } + }, + "minimatch": { + "version": "2.0.10", + "dependencies": { + "brace-expansion": { + "version": "1.1.1", + "dependencies": { + "balanced-match": { + "version": "0.2.1" + }, + "concat-map": { + "version": "0.0.1" + } + } + } + } + }, + "ordered-read-streams": { + "version": "0.1.0" + }, + "glob2base": { + "version": "0.0.12", + "dependencies": { + "find-index": { + "version": "0.1.1" + } + } + }, + "unique-stream": { + "version": "1.0.0" + } + } + }, + "glob-watcher": { + "version": "0.0.6", + "dependencies": { + "gaze": { + "version": "0.5.2", + "dependencies": { + "globule": { + "version": "0.1.0", + "dependencies": { + "lodash": { + "version": "1.0.2" + }, + "glob": { + "version": "3.1.21", + "dependencies": { + "graceful-fs": { + "version": "1.2.3" + }, + "inherits": { + "version": "1.0.2" + } + } + }, + "minimatch": { + "version": "0.2.14", + "dependencies": { + "lru-cache": { + "version": "2.7.0" + }, + "sigmund": { + "version": "1.0.1" + } + } + } + } + } + } + } + } + }, + "graceful-fs": { + "version": "3.0.8" + }, + "mkdirp": { + "version": "0.5.1", + "dependencies": { + "minimist": { + "version": "0.0.8" + } + } + }, + "strip-bom": { + "version": "1.0.0", + "dependencies": { + "first-chunk-stream": { + "version": "1.0.0" + }, + "is-utf8": { + "version": "0.2.0" + } + } + }, + "through2": { + "version": "0.6.5", + "dependencies": { + "readable-stream": { + "version": "1.0.33", + "dependencies": { + "core-util-is": { + "version": "1.0.1" + }, + "isarray": { + "version": "0.0.1" + }, + "string_decoder": { + "version": "0.10.31" + }, + "inherits": { + "version": "2.0.1" + } + } + }, + "xtend": { + "version": "4.0.0" + } + } + }, + "vinyl": { + "version": "0.4.6", + "dependencies": { + "clone": { + "version": "0.2.0" + }, + "clone-stats": { + "version": "0.0.1" + } + } + } + } + } + } + }, + "gulp-git": { + "version": "1.6.0", + "dependencies": { + "any-shell-escape": { + "version": "0.1.1" + }, + "gulp-util": { + "version": "3.0.7", + "dependencies": { + "array-differ": { + "version": "1.0.0" + }, + "array-uniq": { + "version": "1.0.2" + }, + "beeper": { + "version": "1.1.0" + }, + "dateformat": { + "version": "1.0.11", + "dependencies": { + "get-stdin": { + "version": "5.0.0" + }, + "meow": { + "version": "3.5.0", + "dependencies": { + "camelcase-keys": { + "version": "1.0.0", + "dependencies": { + "camelcase": { + "version": "1.2.1" + }, + "map-obj": { + "version": "1.0.1" + } + } + }, + "loud-rejection": { + "version": "1.0.0" + }, + "normalize-package-data": { + "version": "2.3.4", + "dependencies": { + "hosted-git-info": { + "version": "2.1.4" + }, + "is-builtin-module": { + "version": "1.0.0", + "dependencies": { + "builtin-modules": { + "version": "1.1.0" + } + } + }, + "validate-npm-package-license": { + "version": "3.0.1", + "dependencies": { + "spdx-correct": { + "version": "1.0.2", + "dependencies": { + "spdx-license-ids": { + "version": "1.1.0" + } + } + }, + "spdx-expression-parse": { + "version": "1.0.0", + "dependencies": { + "spdx-exceptions": { + "version": "1.0.3" + }, + "spdx-license-ids": { + "version": "1.1.0" + } + } + } + } + } + } + }, + "object-assign": { + "version": "4.0.1" + }, + "read-pkg-up": { + "version": "1.0.1", + "dependencies": { + "find-up": { + "version": "1.0.0", + "dependencies": { + "path-exists": { + "version": "2.0.0" + }, + "pinkie-promise": { + "version": "1.0.0", + "dependencies": { + "pinkie": { + "version": "1.0.0" + } + } + } + } + }, + "read-pkg": { + "version": "1.1.0", + "dependencies": { + "load-json-file": { + "version": "1.0.1", + "dependencies": { + "graceful-fs": { + "version": "4.1.2" + }, + "parse-json": { + "version": "2.2.0", + "dependencies": { + "error-ex": { + "version": "1.2.0" + } + } + }, + "pify": { + "version": "2.3.0" + }, + "pinkie-promise": { + "version": "1.0.0", + "dependencies": { + "pinkie": { + "version": "1.0.0" + } + } + }, + "strip-bom": { + "version": "2.0.0", + "dependencies": { + "is-utf8": { + "version": "0.2.0" + } + } + } + } + }, + "path-type": { + "version": "1.0.0", + "dependencies": { + "graceful-fs": { + "version": "4.1.2" + }, + "pify": { + "version": "2.3.0" + }, + "pinkie-promise": { + "version": "1.0.0", + "dependencies": { + "pinkie": { + "version": "1.0.0" + } + } + } + } + } + } + } + } + }, + "redent": { + "version": "1.0.0", + "dependencies": { + "indent-string": { + "version": "2.1.0", + "dependencies": { + "repeating": { + "version": "2.0.0", + "dependencies": { + "is-finite": { + "version": "1.0.1", + "dependencies": { + "number-is-nan": { + "version": "1.0.0" + } + } + } + } + } + } + }, + "strip-indent": { + "version": "1.0.1", + "dependencies": { + "get-stdin": { + "version": "4.0.1" + } + } + } + } + }, + "trim-newlines": { + "version": "1.0.0" + } + } + } + } + }, + "fancy-log": { + "version": "1.1.0" + }, + "gulplog": { + "version": "1.0.0", + "dependencies": { + "glogg": { + "version": "1.0.0", + "dependencies": { + "sparkles": { + "version": "1.0.0" + } + } + } + } + }, + "has-gulplog": { + "version": "0.1.0", + "dependencies": { + "sparkles": { + "version": "1.0.0" + } + } + }, + "lodash._reescape": { + "version": "3.0.0" + }, + "lodash._reevaluate": { + "version": "3.0.0" + }, + "lodash._reinterpolate": { + "version": "3.0.0" + }, + "lodash.template": { + "version": "3.6.2", + "dependencies": { + "lodash._basecopy": { + "version": "3.0.1" + }, + "lodash._basetostring": { + "version": "3.0.1" + }, + "lodash._basevalues": { + "version": "3.0.0" + }, + "lodash._isiterateecall": { + "version": "3.0.9" + }, + "lodash.escape": { + "version": "3.0.0" + }, + "lodash.keys": { + "version": "3.1.2", + "dependencies": { + "lodash._getnative": { + "version": "3.9.1" + }, + "lodash.isarguments": { + "version": "3.0.4" + }, + "lodash.isarray": { + "version": "3.0.4" + } + } + }, + "lodash.restparam": { + "version": "3.6.1" + }, + "lodash.templatesettings": { + "version": "3.1.0" + } + } + }, + "multipipe": { + "version": "0.1.2", + "dependencies": { + "duplexer2": { + "version": "0.0.2", + "dependencies": { + "readable-stream": { + "version": "1.1.13", + "dependencies": { + "core-util-is": { + "version": "1.0.1" + }, + "isarray": { + "version": "0.0.1" + }, + "string_decoder": { + "version": "0.10.31" + }, + "inherits": { + "version": "2.0.1" + } + } + } + } + } + } + }, + "object-assign": { + "version": "3.0.0" + }, + "replace-ext": { + "version": "0.0.1" + }, + "through2": { + "version": "2.0.0", + "dependencies": { + "readable-stream": { + "version": "2.0.4", + "dependencies": { + "core-util-is": { + "version": "1.0.1" + }, + "inherits": { + "version": "2.0.1" + }, + "isarray": { + "version": "0.0.1" + }, + "process-nextick-args": { + "version": "1.0.3" + }, + "string_decoder": { + "version": "0.10.31" + }, + "util-deprecate": { + "version": "1.0.2" + } + } + }, + "xtend": { + "version": "4.0.0" + } + } + }, + "vinyl": { + "version": "0.5.3", + "dependencies": { + "clone": { + "version": "1.0.2" + }, + "clone-stats": { + "version": "0.0.1" + } + } + } + } + }, + "require-dir": { + "version": "0.1.0" + }, + "through2": { + "version": "0.6.5", + "dependencies": { + "readable-stream": { + "version": "1.0.33", + "dependencies": { + "core-util-is": { + "version": "1.0.1" + }, + "isarray": { + "version": "0.0.1" + }, + "string_decoder": { + "version": "0.10.31" + }, + "inherits": { + "version": "2.0.1" + } + } + }, + "xtend": { + "version": "4.0.0" + } + } + } + } + }, + "inquirer": { + "version": "0.10.1", + "dependencies": { + "ansi-escapes": { + "version": "1.1.0" + }, + "ansi-regex": { + "version": "2.0.0" + }, + "cli-cursor": { + "version": "1.0.2", + "dependencies": { + "restore-cursor": { + "version": "1.0.1", + "dependencies": { + "exit-hook": { + "version": "1.1.1" + }, + "onetime": { + "version": "1.0.0" + } + } + } + } + }, + "cli-width": { + "version": "1.1.0" + }, + "figures": { + "version": "1.4.0" + }, + "lodash": { + "version": "3.10.1" + }, + "readline2": { + "version": "1.0.1", + "dependencies": { + "code-point-at": { + "version": "1.0.0", + "dependencies": { + "number-is-nan": { + "version": "1.0.0" + } + } + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "dependencies": { + "number-is-nan": { + "version": "1.0.0" + } + } + }, + "mute-stream": { + "version": "0.0.5" + } + } + }, + "run-async": { + "version": "0.1.0", + "dependencies": { + "once": { + "version": "1.3.2", + "dependencies": { + "wrappy": { + "version": "1.0.1" + } + } + } + } + }, + "rx-lite": { + "version": "3.1.2" + }, + "strip-ansi": { + "version": "3.0.0" + }, + "through": { + "version": "2.3.8" + } + } + }, + "json": { + "version": "9.0.3" + }, + "minimist": { + "version": "1.2.0" + }, + "node-uuid": { + "version": "1.4.3" + }, + "nodemon": { + "version": "1.7.3", + "dependencies": { + "chokidar": { + "version": "1.2.0", + "dependencies": { + "anymatch": { + "version": "1.3.0", + "dependencies": { + "micromatch": { + "version": "2.2.0", + "dependencies": { + "arr-diff": { + "version": "1.1.0", + "dependencies": { + "arr-flatten": { + "version": "1.0.1" + }, + "array-slice": { + "version": "0.2.3" + } + } + }, + "array-unique": { + "version": "0.2.1" + }, + "braces": { + "version": "1.8.2", + "dependencies": { + "expand-range": { + "version": "1.8.1", + "dependencies": { + "fill-range": { + "version": "2.2.2", + "dependencies": { + "is-number": { + "version": "1.1.2" + }, + "isobject": { + "version": "1.0.2" + }, + "randomatic": { + "version": "1.1.0" + }, + "repeat-string": { + "version": "1.5.2" + } + } + } + } + }, + "lazy-cache": { + "version": "0.2.4" + }, + "preserve": { + "version": "0.2.0" + }, + "repeat-element": { + "version": "1.1.2" + } + } + }, + "expand-brackets": { + "version": "0.1.4" + }, + "extglob": { + "version": "0.3.1", + "dependencies": { + "ansi-green": { + "version": "0.1.1", + "dependencies": { + "ansi-wrap": { + "version": "0.1.0" + } + } + }, + "is-extglob": { + "version": "1.0.0" + }, + "success-symbol": { + "version": "0.1.0" + } + } + }, + "filename-regex": { + "version": "2.0.0" + }, + "is-glob": { + "version": "1.1.3" + }, + "kind-of": { + "version": "1.1.0" + }, + "object.omit": { + "version": "1.1.0", + "dependencies": { + "for-own": { + "version": "0.1.3", + "dependencies": { + "for-in": { + "version": "0.1.4" + } + } + }, + "isobject": { + "version": "1.0.2" + } + } + }, + "parse-glob": { + "version": "3.0.4", + "dependencies": { + "glob-base": { + "version": "0.3.0" + }, + "is-dotfile": { + "version": "1.0.2" + }, + "is-extglob": { + "version": "1.0.0" + }, + "is-glob": { + "version": "2.0.1" + } + } + }, + "regex-cache": { + "version": "0.4.2", + "dependencies": { + "is-equal-shallow": { + "version": "0.1.3" + }, + "is-primitive": { + "version": "2.0.0" + } + } + } + } + } + } + }, + "arrify": { + "version": "1.0.0" + }, + "async-each": { + "version": "0.1.6" + }, + "glob-parent": { + "version": "2.0.0" + }, + "is-binary-path": { + "version": "1.0.1", + "dependencies": { + "binary-extensions": { + "version": "1.3.1" + } + } + }, + "is-glob": { + "version": "2.0.1", + "dependencies": { + "is-extglob": { + "version": "1.0.0" + } + } + }, + "lodash.flatten": { + "version": "3.0.2", + "dependencies": { + "lodash._baseflatten": { + "version": "3.1.4", + "dependencies": { + "lodash.isarguments": { + "version": "3.0.4" + }, + "lodash.isarray": { + "version": "3.0.4" + } + } + }, + "lodash._isiterateecall": { + "version": "3.0.9" + } + } + }, + "path-is-absolute": { + "version": "1.0.0" + }, + "readdirp": { + "version": "2.0.0", + "dependencies": { + "graceful-fs": { + "version": "4.1.2" + }, + "minimatch": { + "version": "2.0.10", + "dependencies": { + "brace-expansion": { + "version": "1.1.1", + "dependencies": { + "balanced-match": { + "version": "0.2.1" + }, + "concat-map": { + "version": "0.0.1" + } + } + } + } + }, + "readable-stream": { + "version": "2.0.4", + "dependencies": { + "core-util-is": { + "version": "1.0.1" + }, + "inherits": { + "version": "2.0.1" + }, + "isarray": { + "version": "0.0.1" + }, + "process-nextick-args": { + "version": "1.0.3" + }, + "string_decoder": { + "version": "0.10.31" + }, + "util-deprecate": { + "version": "1.0.2" + } + } + } + } + }, + "fsevents": { + "version": "1.0.2", + "dependencies": { + "nan": { + "version": "2.1.0" + }, + "node-pre-gyp": { + "version": "0.6.12", + "dependencies": { + "nopt": { + "version": "3.0.4", + "dependencies": { + "abbrev": { + "version": "1.0.7" + } + } + }, + "npmlog": { + "version": "1.2.1", + "dependencies": { + "ansi": { + "version": "0.3.0" + }, + "are-we-there-yet": { + "version": "1.0.4", + "dependencies": { + "delegates": { + "version": "0.1.0" + }, + "readable-stream": { + "version": "1.1.13", + "dependencies": { + "core-util-is": { + "version": "1.0.1" + }, + "isarray": { + "version": "0.0.1" + }, + "string_decoder": { + "version": "0.10.31" + }, + "inherits": { + "version": "2.0.1" + } + } + } + } + }, + "gauge": { + "version": "1.2.2", + "dependencies": { + "has-unicode": { + "version": "1.0.0" + }, + "lodash.pad": { + "version": "3.1.1", + "dependencies": { + "lodash._basetostring": { + "version": "3.0.1" + }, + "lodash._createpadding": { + "version": "3.6.1", + "dependencies": { + "lodash.repeat": { + "version": "3.0.1" + } + } + } + } + }, + "lodash.padleft": { + "version": "3.1.1", + "dependencies": { + "lodash._basetostring": { + "version": "3.0.1" + }, + "lodash._createpadding": { + "version": "3.6.1", + "dependencies": { + "lodash.repeat": { + "version": "3.0.1" + } + } + } + } + }, + "lodash.padright": { + "version": "3.1.1", + "dependencies": { + "lodash._basetostring": { + "version": "3.0.1" + }, + "lodash._createpadding": { + "version": "3.6.1", + "dependencies": { + "lodash.repeat": { + "version": "3.0.1" + } + } + } + } + } + } + } + } + }, + "request": { + "version": "2.64.0", + "dependencies": { + "bl": { + "version": "1.0.0", + "dependencies": { + "readable-stream": { + "version": "2.0.2", + "dependencies": { + "core-util-is": { + "version": "1.0.1" + }, + "inherits": { + "version": "2.0.1" + }, + "isarray": { + "version": "0.0.1" + }, + "process-nextick-args": { + "version": "1.0.3" + }, + "string_decoder": { + "version": "0.10.31" + }, + "util-deprecate": { + "version": "1.0.1" + } + } + } + } + }, + "caseless": { + "version": "0.11.0" + }, + "extend": { + "version": "3.0.0" + }, + "forever-agent": { + "version": "0.6.1" + }, + "form-data": { + "version": "1.0.0-rc3", + "dependencies": { + "async": { + "version": "1.4.2" + } + } + }, + "json-stringify-safe": { + "version": "5.0.1" + }, + "mime-types": { + "version": "2.1.7", + "dependencies": { + "mime-db": { + "version": "1.19.0" + } + } + }, + "node-uuid": { + "version": "1.4.3" + }, + "qs": { + "version": "5.1.0" + }, + "tunnel-agent": { + "version": "0.4.1" + }, + "tough-cookie": { + "version": "2.1.0" + }, + "http-signature": { + "version": "0.11.0", + "dependencies": { + "assert-plus": { + "version": "0.1.5" + }, + "asn1": { + "version": "0.1.11" + }, + "ctype": { + "version": "0.5.3" + } + } + }, + "oauth-sign": { + "version": "0.8.0" + }, + "hawk": { + "version": "3.1.0", + "dependencies": { + "hoek": { + "version": "2.16.3" + }, + "boom": { + "version": "2.9.0" + }, + "cryptiles": { + "version": "2.0.5" + }, + "sntp": { + "version": "1.0.9" + } + } + }, + "aws-sign2": { + "version": "0.5.0" + }, + "stringstream": { + "version": "0.0.4" + }, + "combined-stream": { + "version": "1.0.5", + "dependencies": { + "delayed-stream": { + "version": "1.0.0" + } + } + }, + "isstream": { + "version": "0.1.2" + }, + "har-validator": { + "version": "1.8.0", + "dependencies": { + "bluebird": { + "version": "2.10.2" + }, + "chalk": { + "version": "1.1.1", + "dependencies": { + "ansi-styles": { + "version": "2.1.0" + }, + "escape-string-regexp": { + "version": "1.0.3" + }, + "has-ansi": { + "version": "2.0.0", + "dependencies": { + "ansi-regex": { + "version": "2.0.0" + } + } + }, + "strip-ansi": { + "version": "3.0.0", + "dependencies": { + "ansi-regex": { + "version": "2.0.0" + } + } + }, + "supports-color": { + "version": "2.0.0" + } + } + }, + "commander": { + "version": "2.8.1", + "dependencies": { + "graceful-readlink": { + "version": "1.0.1" + } + } + }, + "is-my-json-valid": { + "version": "2.12.2", + "dependencies": { + "generate-function": { + "version": "2.0.0" + }, + "generate-object-property": { + "version": "1.2.0", + "dependencies": { + "is-property": { + "version": "1.0.2" + } + } + }, + "jsonpointer": { + "version": "2.0.0" + }, + "xtend": { + "version": "4.0.0" + } + } + } + } + } + } + }, + "semver": { + "version": "5.0.3" + }, + "tar": { + "version": "2.2.1", + "dependencies": { + "block-stream": { + "version": "0.0.8" + }, + "fstream": { + "version": "1.0.8", + "dependencies": { + "graceful-fs": { + "version": "4.1.2" + } + } + }, + "inherits": { + "version": "2.0.1" + } + } + }, + "tar-pack": { + "version": "2.0.0", + "dependencies": { + "uid-number": { + "version": "0.0.3" + }, + "once": { + "version": "1.1.1" + }, + "debug": { + "version": "0.7.4" + }, + "rimraf": { + "version": "2.2.8" + }, + "fstream": { + "version": "0.1.31", + "dependencies": { + "graceful-fs": { + "version": "3.0.8" + }, + "inherits": { + "version": "2.0.1" + } + } + }, + "tar": { + "version": "0.1.20", + "dependencies": { + "block-stream": { + "version": "0.0.8" + }, + "inherits": { + "version": "2.0.1" + } + } + }, + "fstream-ignore": { + "version": "0.0.7", + "dependencies": { + "minimatch": { + "version": "0.2.14", + "dependencies": { + "lru-cache": { + "version": "2.7.0" + }, + "sigmund": { + "version": "1.0.1" + } + } + }, + "inherits": { + "version": "2.0.1" + } + } + }, + "readable-stream": { + "version": "1.0.33", + "dependencies": { + "core-util-is": { + "version": "1.0.1" + }, + "isarray": { + "version": "0.0.1" + }, + "string_decoder": { + "version": "0.10.31" + }, + "inherits": { + "version": "2.0.1" + } + } + }, + "graceful-fs": { + "version": "1.2.3" + } + } + }, + "mkdirp": { + "version": "0.5.1", + "dependencies": { + "minimist": { + "version": "0.0.8" + } + } + }, + "rc": { + "version": "1.1.2", + "dependencies": { + "minimist": { + "version": "1.2.0" + }, + "deep-extend": { + "version": "0.2.11" + }, + "strip-json-comments": { + "version": "0.1.3" + }, + "ini": { + "version": "1.3.4" + } + } + }, + "rimraf": { + "version": "2.4.3", + "dependencies": { + "glob": { + "version": "5.0.15", + "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.1", + "dependencies": { + "balanced-match": { + "version": "0.2.0" + }, + "concat-map": { + "version": "0.0.1" + } + } + } + } + }, + "once": { + "version": "1.3.2", + "dependencies": { + "wrappy": { + "version": "1.0.1" + } + } + }, + "path-is-absolute": { + "version": "1.0.0" + } + } + } + } + } + } + } + } + } + } + }, + "debug": { + "version": "2.2.0", + "dependencies": { + "ms": { + "version": "0.7.1" + } + } + }, + "es6-promise": { + "version": "3.0.2" + }, + "lodash.defaults": { + "version": "3.1.2", + "dependencies": { + "lodash.assign": { + "version": "3.2.0", + "dependencies": { + "lodash._baseassign": { + "version": "3.2.0", + "dependencies": { + "lodash._basecopy": { + "version": "3.0.1" + } + } + }, + "lodash._createassigner": { + "version": "3.1.1", + "dependencies": { + "lodash._bindcallback": { + "version": "3.0.1" + }, + "lodash._isiterateecall": { + "version": "3.0.9" + } + } + }, + "lodash.keys": { + "version": "3.1.2", + "dependencies": { + "lodash._getnative": { + "version": "3.9.1" + }, + "lodash.isarguments": { + "version": "3.0.4" + }, + "lodash.isarray": { + "version": "3.0.4" + } + } + } + } + }, + "lodash.restparam": { + "version": "3.6.1" + } + } + }, + "minimatch": { + "version": "3.0.0", + "dependencies": { + "brace-expansion": { + "version": "1.1.1", + "dependencies": { + "balanced-match": { + "version": "0.2.1" + }, + "concat-map": { + "version": "0.0.1" + } + } + } + } + }, + "ps-tree": { + "version": "1.0.1", + "dependencies": { + "event-stream": { + "version": "3.3.2", + "dependencies": { + "through": { + "version": "2.3.8" + }, + "duplexer": { + "version": "0.1.1" + }, + "from": { + "version": "0.1.3" + }, + "map-stream": { + "version": "0.1.0" + }, + "pause-stream": { + "version": "0.0.11" + }, + "split": { + "version": "0.3.3" + }, + "stream-combiner": { + "version": "0.0.4" + } + } + } + } + }, + "touch": { + "version": "1.0.0", + "dependencies": { + "nopt": { + "version": "1.0.10", + "dependencies": { + "abbrev": { + "version": "1.0.7" + } + } + } + } + }, + "undefsafe": { + "version": "0.0.3" + }, + "update-notifier": { + "version": "0.5.0", + "dependencies": { + "configstore": { + "version": "1.3.0", + "dependencies": { + "graceful-fs": { + "version": "4.1.2" + }, + "mkdirp": { + "version": "0.5.1", + "dependencies": { + "minimist": { + "version": "0.0.8" + } + } + }, + "object-assign": { + "version": "4.0.1" + }, + "os-tmpdir": { + "version": "1.0.1" + }, + "osenv": { + "version": "0.1.3", + "dependencies": { + "os-homedir": { + "version": "1.0.1" + } + } + }, + "uuid": { + "version": "2.0.1" + }, + "write-file-atomic": { + "version": "1.1.3", + "dependencies": { + "slide": { + "version": "1.1.6" + } + } + }, + "xdg-basedir": { + "version": "2.0.0", + "dependencies": { + "os-homedir": { + "version": "1.0.1" + } + } + } + } + }, + "is-npm": { + "version": "1.0.0" + }, + "latest-version": { + "version": "1.0.1", + "dependencies": { + "package-json": { + "version": "1.2.0", + "dependencies": { + "got": { + "version": "3.3.1", + "dependencies": { + "duplexify": { + "version": "3.4.2", + "dependencies": { + "end-of-stream": { + "version": "1.0.0", + "dependencies": { + "once": { + "version": "1.3.2", + "dependencies": { + "wrappy": { + "version": "1.0.1" + } + } + } + } + }, + "readable-stream": { + "version": "2.0.4", + "dependencies": { + "core-util-is": { + "version": "1.0.1" + }, + "inherits": { + "version": "2.0.1" + }, + "isarray": { + "version": "0.0.1" + }, + "process-nextick-args": { + "version": "1.0.3" + }, + "string_decoder": { + "version": "0.10.31" + }, + "util-deprecate": { + "version": "1.0.2" + } + } + } + } + }, + "infinity-agent": { + "version": "2.0.3" + }, + "is-redirect": { + "version": "1.0.0" + }, + "is-stream": { + "version": "1.0.1" + }, + "lowercase-keys": { + "version": "1.0.0" + }, + "nested-error-stacks": { + "version": "1.0.1", + "dependencies": { + "inherits": { + "version": "2.0.1" + } + } + }, + "object-assign": { + "version": "3.0.0" + }, + "prepend-http": { + "version": "1.0.3" + }, + "read-all-stream": { + "version": "3.0.1", + "dependencies": { + "pinkie-promise": { + "version": "1.0.0", + "dependencies": { + "pinkie": { + "version": "1.0.0" + } + } + }, + "readable-stream": { + "version": "2.0.4", + "dependencies": { + "core-util-is": { + "version": "1.0.1" + }, + "inherits": { + "version": "2.0.1" + }, + "isarray": { + "version": "0.0.1" + }, + "process-nextick-args": { + "version": "1.0.3" + }, + "string_decoder": { + "version": "0.10.31" + }, + "util-deprecate": { + "version": "1.0.2" + } + } + } + } + }, + "timed-out": { + "version": "2.0.0" + } + } + }, + "registry-url": { + "version": "3.0.3", + "dependencies": { + "rc": { + "version": "1.1.2", + "dependencies": { + "deep-extend": { + "version": "0.2.11" + }, + "strip-json-comments": { + "version": "0.1.3" + }, + "ini": { + "version": "1.3.4" + } + } + } + } + } + } + } + } + }, + "repeating": { + "version": "1.1.3", + "dependencies": { + "is-finite": { + "version": "1.0.1", + "dependencies": { + "number-is-nan": { + "version": "1.0.0" + } + } + } + } + }, + "semver-diff": { + "version": "2.0.0", + "dependencies": { + "semver": { + "version": "4.3.6" + } + } + }, + "string-length": { + "version": "1.0.1", + "dependencies": { + "strip-ansi": { + "version": "3.0.0", + "dependencies": { + "ansi-regex": { + "version": "2.0.0" + } + } + } + } + } + } + } + } + }, + "rimraf": { + "version": "2.4.3" + }, + "semver": { + "version": "5.0.3" + }, + "shelljs": { + "version": "0.5.3" + }, + "strip-json-comments": { + "version": "1.0.4" + } + } + }, + "cz-conventional-changelog": { + "version": "1.1.4", + "dependencies": { + "word-wrap": { + "version": "1.1.0" + } + } + }, "dgeni": { "version": "0.4.1", "dependencies": { @@ -2385,7 +5510,7 @@ } }, "dgeni-packages": { - "version": "0.10.19", + "version": "0.11.0", "dependencies": { "catharsis": { "version": "0.8.7", @@ -2404,7 +5529,7 @@ "version": "2.3.0", "dependencies": { "camel-case": { - "version": "1.1.2" + "version": "1.2.0" }, "constant-case": { "version": "1.1.1" @@ -2453,11 +5578,11 @@ } } }, - "esprima": { - "version": "1.2.5" + "espree": { + "version": "2.2.5" }, "estraverse": { - "version": "1.9.3" + "version": "4.1.1" }, "glob": { "version": "3.2.11", @@ -2518,7 +5643,7 @@ "version": "0.3.0", "dependencies": { "lru-cache": { - "version": "2.6.5" + "version": "2.7.0" }, "sigmund": { "version": "1.0.1" @@ -2552,7 +5677,7 @@ "version": "0.2.14", "dependencies": { "lru-cache": { - "version": "2.6.5" + "version": "2.7.0" }, "sigmund": { "version": "1.0.1" @@ -2585,7 +5710,7 @@ "version": "0.3.8", "dependencies": { "nan": { - "version": "2.0.5" + "version": "2.1.0" } } } @@ -2643,7 +5768,7 @@ "version": "0.1.8" }, "pkginfo": { - "version": "0.3.0" + "version": "0.3.1" }, "request": { "version": "2.16.6", diff --git a/npm-shrinkwrap.json b/npm-shrinkwrap.json index fce8997ee875..24d8e917c697 100644 --- a/npm-shrinkwrap.json +++ b/npm-shrinkwrap.json @@ -3480,6 +3480,4817 @@ } } }, + "commitizen": { + "version": "2.3.0", + "from": "commitizen@*", + "resolved": "https://registry.npmjs.org/commitizen/-/commitizen-2.3.0.tgz", + "dependencies": { + "babel": { + "version": "5.8.23", + "from": "babel@5.8.23", + "resolved": "https://registry.npmjs.org/babel/-/babel-5.8.23.tgz", + "dependencies": { + "babel-core": { + "version": "5.8.33", + "from": "babel-core@>=5.6.21 <6.0.0", + "resolved": "https://registry.npmjs.org/babel-core/-/babel-core-5.8.33.tgz", + "dependencies": { + "babel-plugin-constant-folding": { + "version": "1.0.1", + "from": "babel-plugin-constant-folding@>=1.0.1 <2.0.0", + "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", + "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", + "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", + "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", + "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", + "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", + "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", + "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", + "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", + "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", + "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", + "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", + "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", + "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", + "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", + "resolved": "https://registry.npmjs.org/babel-plugin-undefined-to-void/-/babel-plugin-undefined-to-void-1.1.6.tgz" + }, + "babylon": { + "version": "5.8.29", + "from": "babylon@>=5.8.29 <6.0.0", + "resolved": "https://registry.npmjs.org/babylon/-/babylon-5.8.29.tgz" + }, + "bluebird": { + "version": "2.10.2", + "from": "bluebird@>=2.9.33 <3.0.0", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-2.10.2.tgz" + }, + "core-js": { + "version": "1.2.3", + "from": "core-js@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-1.2.3.tgz" + }, + "debug": { + "version": "2.2.0", + "from": "debug@>=2.1.1 <3.0.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.2.0.tgz", + "dependencies": { + "ms": { + "version": "0.7.1", + "from": "ms@0.7.1", + "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", + "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", + "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz" + } + } + }, + "esutils": { + "version": "2.0.2", + "from": "esutils@>=2.0.0 <3.0.0", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz" + }, + "globals": { + "version": "6.4.1", + "from": "globals@>=6.4.0 <7.0.0", + "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", + "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", + "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", + "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", + "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", + "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", + "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.0.tgz" + } + } + } + } + }, + "js-tokens": { + "version": "1.0.1", + "from": "js-tokens@1.0.1", + "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", + "resolved": "https://registry.npmjs.org/json5/-/json5-0.4.0.tgz" + }, + "line-numbers": { + "version": "0.2.0", + "from": "line-numbers@0.2.0", + "resolved": "https://registry.npmjs.org/line-numbers/-/line-numbers-0.2.0.tgz", + "dependencies": { + "left-pad": { + "version": "0.0.3", + "from": "left-pad@0.0.3", + "resolved": "https://registry.npmjs.org/left-pad/-/left-pad-0.0.3.tgz" + } + } + }, + "minimatch": { + "version": "2.0.10", + "from": "minimatch@>=2.0.3 <3.0.0", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-2.0.10.tgz", + "dependencies": { + "brace-expansion": { + "version": "1.1.1", + "from": "brace-expansion@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.1.tgz", + "dependencies": { + "balanced-match": { + "version": "0.2.1", + "from": "balanced-match@>=0.2.0 <0.3.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-0.2.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" + } + } + } + } + }, + "private": { + "version": "0.1.6", + "from": "private@>=0.1.6 <0.2.0", + "resolved": "https://registry.npmjs.org/private/-/private-0.1.6.tgz" + }, + "regenerator": { + "version": "0.8.40", + "from": "regenerator@0.8.40", + "resolved": "https://registry.npmjs.org/regenerator/-/regenerator-0.8.40.tgz", + "dependencies": { + "commoner": { + "version": "0.10.3", + "from": "commoner@>=0.10.3 <0.11.0", + "resolved": "https://registry.npmjs.org/commoner/-/commoner-0.10.3.tgz", + "dependencies": { + "q": { + "version": "1.1.2", + "from": "q@>=1.1.2 <1.2.0", + "resolved": "https://registry.npmjs.org/q/-/q-1.1.2.tgz" + }, + "commander": { + "version": "2.5.1", + "from": "commander@>=2.5.0 <2.6.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.5.1.tgz" + }, + "graceful-fs": { + "version": "3.0.8", + "from": "graceful-fs@>=3.0.4 <3.1.0", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-3.0.8.tgz" + }, + "glob": { + "version": "4.2.2", + "from": "glob@>=4.2.1 <4.3.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-4.2.2.tgz", + "dependencies": { + "inflight": { + "version": "1.0.4", + "from": "inflight@>=1.0.4 <2.0.0", + "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", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.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" + }, + "minimatch": { + "version": "1.0.0", + "from": "minimatch@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-1.0.0.tgz", + "dependencies": { + "lru-cache": { + "version": "2.7.0", + "from": "lru-cache@>=2.0.0 <3.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-2.7.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" + } + } + }, + "once": { + "version": "1.3.2", + "from": "once@>=1.3.0 <2.0.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.3.2.tgz", + "dependencies": { + "wrappy": { + "version": "1.0.1", + "from": "wrappy@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.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", + "dependencies": { + "minimist": { + "version": "0.0.8", + "from": "minimist@0.0.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz" + } + } + }, + "install": { + "version": "0.1.8", + "from": "install@>=0.1.7 <0.2.0", + "resolved": "https://registry.npmjs.org/install/-/install-0.1.8.tgz" + }, + "iconv-lite": { + "version": "0.4.13", + "from": "iconv-lite@>=0.4.5 <0.5.0", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.13.tgz" + } + } + }, + "defs": { + "version": "1.1.1", + "from": "defs@>=1.1.0 <1.2.0", + "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", + "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", + "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", + "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", + "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", + "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", + "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", + "resolved": "https://registry.npmjs.org/stringset/-/stringset-0.2.1.tgz" + }, + "tryor": { + "version": "0.1.2", + "from": "tryor@>=0.1.2 <0.2.0", + "resolved": "https://registry.npmjs.org/tryor/-/tryor-0.1.2.tgz" + }, + "yargs": { + "version": "3.27.0", + "from": "yargs@>=3.27.0 <3.28.0", + "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", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz" + }, + "cliui": { + "version": "2.1.0", + "from": "cliui@>=2.1.0 <3.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-2.1.0.tgz", + "dependencies": { + "center-align": { + "version": "0.1.2", + "from": "center-align@>=0.1.1 <0.2.0", + "resolved": "https://registry.npmjs.org/center-align/-/center-align-0.1.2.tgz", + "dependencies": { + "align-text": { + "version": "0.1.3", + "from": "align-text@>=0.1.1 <0.2.0", + "resolved": "https://registry.npmjs.org/align-text/-/align-text-0.1.3.tgz", + "dependencies": { + "kind-of": { + "version": "2.0.1", + "from": "kind-of@>=2.0.0 <3.0.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-2.0.1.tgz", + "dependencies": { + "is-buffer": { + "version": "1.1.0", + "from": "is-buffer@>=1.0.2 <2.0.0", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.0.tgz" + } + } + }, + "longest": { + "version": "1.0.1", + "from": "longest@>=1.0.1 <2.0.0", + "resolved": "https://registry.npmjs.org/longest/-/longest-1.0.1.tgz" + }, + "repeat-string": { + "version": "1.5.2", + "from": "repeat-string@>=1.5.2 <2.0.0", + "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.5.2.tgz" + } + } + }, + "lazy-cache": { + "version": "0.2.4", + "from": "lazy-cache@>=0.2.4 <0.3.0", + "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-0.2.4.tgz" + } + } + }, + "right-align": { + "version": "0.1.3", + "from": "right-align@>=0.1.1 <0.2.0", + "resolved": "https://registry.npmjs.org/right-align/-/right-align-0.1.3.tgz", + "dependencies": { + "align-text": { + "version": "0.1.3", + "from": "align-text@>=0.1.1 <0.2.0", + "resolved": "https://registry.npmjs.org/align-text/-/align-text-0.1.3.tgz", + "dependencies": { + "kind-of": { + "version": "2.0.1", + "from": "kind-of@>=2.0.0 <3.0.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-2.0.1.tgz", + "dependencies": { + "is-buffer": { + "version": "1.1.0", + "from": "is-buffer@>=1.0.2 <2.0.0", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.0.tgz" + } + } + }, + "longest": { + "version": "1.0.1", + "from": "longest@>=1.0.1 <2.0.0", + "resolved": "https://registry.npmjs.org/longest/-/longest-1.0.1.tgz" + }, + "repeat-string": { + "version": "1.5.2", + "from": "repeat-string@>=1.5.2 <2.0.0", + "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.5.2.tgz" + } + } + } + } + }, + "wordwrap": { + "version": "0.0.2", + "from": "wordwrap@0.0.2", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz" + } + } + }, + "decamelize": { + "version": "1.1.1", + "from": "decamelize@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.1.1.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" + } + } + } + } + }, + "window-size": { + "version": "0.1.2", + "from": "window-size@>=0.1.2 <0.2.0", + "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.1.2.tgz" + }, + "y18n": { + "version": "3.2.0", + "from": "y18n@>=3.2.0 <4.0.0", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.0.tgz" + } + } + } + } + }, + "esprima-fb": { + "version": "15001.1001.0-dev-harmony-fb", + "from": "esprima-fb@>=15001.1001.0-dev-harmony-fb <15001.1002.0", + "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", + "resolved": "https://registry.npmjs.org/recast/-/recast-0.10.33.tgz", + "dependencies": { + "ast-types": { + "version": "0.8.12", + "from": "ast-types@0.8.12", + "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", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz" + } + } + }, + "regexpu": { + "version": "1.3.0", + "from": "regexpu@>=1.3.0 <2.0.0", + "resolved": "https://registry.npmjs.org/regexpu/-/regexpu-1.3.0.tgz", + "dependencies": { + "esprima": { + "version": "2.7.0", + "from": "esprima@>=2.6.0 <3.0.0", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-2.7.0.tgz" + }, + "recast": { + "version": "0.10.34", + "from": "recast@>=0.10.10 <0.11.0", + "resolved": "https://registry.npmjs.org/recast/-/recast-0.10.34.tgz", + "dependencies": { + "esprima-fb": { + "version": "15001.1001.0-dev-harmony-fb", + "from": "esprima-fb@>=15001.1001.0-dev-harmony-fb <15001.1002.0", + "resolved": "https://registry.npmjs.org/esprima-fb/-/esprima-fb-15001.1001.0-dev-harmony-fb.tgz" + }, + "ast-types": { + "version": "0.8.12", + "from": "ast-types@0.8.12", + "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.8.12.tgz" + } + } + }, + "regenerate": { + "version": "1.2.1", + "from": "regenerate@>=1.2.1 <2.0.0", + "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.2.1.tgz" + }, + "regjsgen": { + "version": "0.2.0", + "from": "regjsgen@>=0.2.0 <0.3.0", + "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.2.0.tgz" + }, + "regjsparser": { + "version": "0.1.5", + "from": "regjsparser@>=0.1.4 <0.2.0", + "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", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz" + } + } + } + } + }, + "repeating": { + "version": "1.1.3", + "from": "repeating@>=1.1.2 <2.0.0", + "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", + "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", + "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.0.tgz" + } + } + } + } + }, + "resolve": { + "version": "1.1.6", + "from": "resolve@>=1.1.6 <2.0.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.1.6.tgz" + }, + "shebang-regex": { + "version": "1.0.0", + "from": "shebang-regex@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz" + }, + "source-map": { + "version": "0.5.3", + "from": "source-map@>=0.5.0 <0.6.0", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.3.tgz" + }, + "source-map-support": { + "version": "0.2.10", + "from": "source-map-support@>=0.2.10 <0.3.0", + "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", + "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" + } + } + } + } + }, + "to-fast-properties": { + "version": "1.0.1", + "from": "to-fast-properties@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.1.tgz" + }, + "trim-right": { + "version": "1.0.1", + "from": "trim-right@>=1.0.0 <2.0.0", + "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", + "resolved": "https://registry.npmjs.org/try-resolve/-/try-resolve-1.0.1.tgz" + } + } + }, + "chokidar": { + "version": "1.2.0", + "from": "chokidar@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-1.2.0.tgz", + "dependencies": { + "anymatch": { + "version": "1.3.0", + "from": "anymatch@>=1.1.0 <2.0.0", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-1.3.0.tgz", + "dependencies": { + "micromatch": { + "version": "2.2.0", + "from": "micromatch@>=2.1.5 <3.0.0", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-2.2.0.tgz", + "dependencies": { + "arr-diff": { + "version": "1.1.0", + "from": "arr-diff@>=1.0.1 <2.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-1.1.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-slice": { + "version": "0.2.3", + "from": "array-slice@>=0.2.3 <0.3.0", + "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", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz" + }, + "braces": { + "version": "1.8.2", + "from": "braces@>=1.8.0 <2.0.0", + "resolved": "https://registry.npmjs.org/braces/-/braces-1.8.2.tgz", + "dependencies": { + "expand-range": { + "version": "1.8.1", + "from": "expand-range@>=1.8.1 <2.0.0", + "resolved": "https://registry.npmjs.org/expand-range/-/expand-range-1.8.1.tgz", + "dependencies": { + "fill-range": { + "version": "2.2.2", + "from": "fill-range@>=2.1.0 <3.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-2.2.2.tgz", + "dependencies": { + "is-number": { + "version": "1.1.2", + "from": "is-number@>=1.1.2 <2.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-1.1.2.tgz" + }, + "isobject": { + "version": "1.0.2", + "from": "isobject@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-1.0.2.tgz" + }, + "randomatic": { + "version": "1.1.0", + "from": "randomatic@>=1.1.0 <2.0.0", + "resolved": "https://registry.npmjs.org/randomatic/-/randomatic-1.1.0.tgz" + }, + "repeat-string": { + "version": "1.5.2", + "from": "repeat-string@>=1.5.2 <2.0.0", + "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.5.2.tgz" + } + } + } + } + }, + "lazy-cache": { + "version": "0.2.4", + "from": "lazy-cache@>=0.2.3 <0.3.0", + "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-0.2.4.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.4", + "from": "expand-brackets@>=0.1.1 <0.2.0", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.4.tgz" + }, + "extglob": { + "version": "0.3.1", + "from": "extglob@>=0.3.0 <0.4.0", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-0.3.1.tgz", + "dependencies": { + "ansi-green": { + "version": "0.1.1", + "from": "ansi-green@>=0.1.1 <0.2.0", + "resolved": "https://registry.npmjs.org/ansi-green/-/ansi-green-0.1.1.tgz", + "dependencies": { + "ansi-wrap": { + "version": "0.1.0", + "from": "ansi-wrap@0.1.0", + "resolved": "https://registry.npmjs.org/ansi-wrap/-/ansi-wrap-0.1.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" + }, + "success-symbol": { + "version": "0.1.0", + "from": "success-symbol@>=0.1.0 <0.2.0", + "resolved": "https://registry.npmjs.org/success-symbol/-/success-symbol-0.1.0.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-glob": { + "version": "1.1.3", + "from": "is-glob@>=1.1.3 <2.0.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-1.1.3.tgz" + }, + "kind-of": { + "version": "1.1.0", + "from": "kind-of@>=1.1.0 <2.0.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-1.1.0.tgz" + }, + "object.omit": { + "version": "1.1.0", + "from": "object.omit@>=1.1.0 <2.0.0", + "resolved": "https://registry.npmjs.org/object.omit/-/object.omit-1.1.0.tgz", + "dependencies": { + "for-own": { + "version": "0.1.3", + "from": "for-own@>=0.1.3 <0.2.0", + "resolved": "https://registry.npmjs.org/for-own/-/for-own-0.1.3.tgz", + "dependencies": { + "for-in": { + "version": "0.1.4", + "from": "for-in@>=0.1.4 <0.2.0", + "resolved": "https://registry.npmjs.org/for-in/-/for-in-0.1.4.tgz" + } + } + }, + "isobject": { + "version": "1.0.2", + "from": "isobject@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-1.0.2.tgz" + } + } + }, + "parse-glob": { + "version": "3.0.4", + "from": "parse-glob@>=3.0.1 <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" + }, + "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" + }, + "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" + } + } + }, + "regex-cache": { + "version": "0.4.2", + "from": "regex-cache@>=0.4.2 <0.5.0", + "resolved": "https://registry.npmjs.org/regex-cache/-/regex-cache-0.4.2.tgz", + "dependencies": { + "is-equal-shallow": { + "version": "0.1.3", + "from": "is-equal-shallow@>=0.1.1 <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" + } + } + } + } + } + } + }, + "arrify": { + "version": "1.0.0", + "from": "arrify@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.0.tgz" + }, + "async-each": { + "version": "0.1.6", + "from": "async-each@>=0.1.5 <0.2.0", + "resolved": "https://registry.npmjs.org/async-each/-/async-each-0.1.6.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" + }, + "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.3.1", + "from": "binary-extensions@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.3.1.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" + } + } + }, + "lodash.flatten": { + "version": "3.0.2", + "from": "lodash.flatten@>=3.0.2 <4.0.0", + "resolved": "https://registry.npmjs.org/lodash.flatten/-/lodash.flatten-3.0.2.tgz", + "dependencies": { + "lodash._baseflatten": { + "version": "3.1.4", + "from": "lodash._baseflatten@>=3.0.0 <4.0.0", + "resolved": "https://registry.npmjs.org/lodash._baseflatten/-/lodash._baseflatten-3.1.4.tgz", + "dependencies": { + "lodash.isarguments": { + "version": "3.0.4", + "from": "lodash.isarguments@>=3.0.0 <4.0.0", + "resolved": "https://registry.npmjs.org/lodash.isarguments/-/lodash.isarguments-3.0.4.tgz" + }, + "lodash.isarray": { + "version": "3.0.4", + "from": "lodash.isarray@>=3.0.0 <4.0.0", + "resolved": "https://registry.npmjs.org/lodash.isarray/-/lodash.isarray-3.0.4.tgz" + } + } + }, + "lodash._isiterateecall": { + "version": "3.0.9", + "from": "lodash._isiterateecall@>=3.0.0 <4.0.0", + "resolved": "https://registry.npmjs.org/lodash._isiterateecall/-/lodash._isiterateecall-3.0.9.tgz" + } + } + }, + "readdirp": { + "version": "2.0.0", + "from": "readdirp@>=2.0.0 <3.0.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.0.0.tgz", + "dependencies": { + "graceful-fs": { + "version": "4.1.2", + "from": "graceful-fs@>=4.1.2 <5.0.0", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.2.tgz" + }, + "minimatch": { + "version": "2.0.10", + "from": "minimatch@>=2.0.10 <3.0.0", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-2.0.10.tgz", + "dependencies": { + "brace-expansion": { + "version": "1.1.1", + "from": "brace-expansion@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.1.tgz", + "dependencies": { + "balanced-match": { + "version": "0.2.1", + "from": "balanced-match@>=0.2.0 <0.3.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-0.2.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" + } + } + } + } + }, + "readable-stream": { + "version": "2.0.4", + "from": "readable-stream@>=2.0.2 <3.0.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.0.4.tgz", + "dependencies": { + "core-util-is": { + "version": "1.0.1", + "from": "core-util-is@>=1.0.0 <1.1.0", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.1.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": "0.0.1", + "from": "isarray@0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz" + }, + "process-nextick-args": { + "version": "1.0.3", + "from": "process-nextick-args@>=1.0.0 <1.1.0", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.3.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" + } + } + } + } + }, + "fsevents": { + "version": "1.0.2", + "from": "fsevents@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.0.2.tgz", + "dependencies": { + "nan": { + "version": "2.1.0", + "from": "nan@>=2.0.2 <3.0.0", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.1.0.tgz" + }, + "node-pre-gyp": { + "version": "0.6.12", + "from": "node-pre-gyp@0.6.12", + "resolved": "https://registry.npmjs.org/node-pre-gyp/-/node-pre-gyp-0.6.12.tgz", + "dependencies": { + "nopt": { + "version": "3.0.4", + "from": "nopt@~3.0.1", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.4.tgz", + "dependencies": { + "abbrev": { + "version": "1.0.7", + "from": "abbrev@1", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.0.7.tgz" + } + } + }, + "npmlog": { + "version": "1.2.1", + "from": "npmlog@~1.2.0", + "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-1.2.1.tgz", + "dependencies": { + "ansi": { + "version": "0.3.0", + "from": "ansi@~0.3.0", + "resolved": "https://registry.npmjs.org/ansi/-/ansi-0.3.0.tgz" + }, + "are-we-there-yet": { + "version": "1.0.4", + "from": "are-we-there-yet@~1.0.0", + "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.0.4.tgz", + "dependencies": { + "delegates": { + "version": "0.1.0", + "from": "delegates@^0.1.0", + "resolved": "https://registry.npmjs.org/delegates/-/delegates-0.1.0.tgz" + }, + "readable-stream": { + "version": "1.1.13", + "from": "readable-stream@^1.1.13", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.13.tgz", + "dependencies": { + "core-util-is": { + "version": "1.0.1", + "from": "core-util-is@~1.0.0", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.1.tgz" + }, + "isarray": { + "version": "0.0.1", + "from": "isarray@0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.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" + }, + "inherits": { + "version": "2.0.1", + "from": "inherits@2", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz" + } + } + } + } + }, + "gauge": { + "version": "1.2.2", + "from": "gauge@~1.2.0", + "resolved": "https://registry.npmjs.org/gauge/-/gauge-1.2.2.tgz", + "dependencies": { + "has-unicode": { + "version": "1.0.0", + "from": "has-unicode@^1.0.0", + "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-1.0.0.tgz" + }, + "lodash.pad": { + "version": "3.1.1", + "from": "lodash.pad@^3.0.0", + "resolved": "https://registry.npmjs.org/lodash.pad/-/lodash.pad-3.1.1.tgz", + "dependencies": { + "lodash._basetostring": { + "version": "3.0.1", + "from": "lodash._basetostring@^3.0.0", + "resolved": "https://registry.npmjs.org/lodash._basetostring/-/lodash._basetostring-3.0.1.tgz" + }, + "lodash._createpadding": { + "version": "3.6.1", + "from": "lodash._createpadding@^3.0.0", + "resolved": "https://registry.npmjs.org/lodash._createpadding/-/lodash._createpadding-3.6.1.tgz", + "dependencies": { + "lodash.repeat": { + "version": "3.0.1", + "from": "lodash.repeat@^3.0.0", + "resolved": "https://registry.npmjs.org/lodash.repeat/-/lodash.repeat-3.0.1.tgz" + } + } + } + } + }, + "lodash.padleft": { + "version": "3.1.1", + "from": "lodash.padleft@^3.0.0", + "resolved": "https://registry.npmjs.org/lodash.padleft/-/lodash.padleft-3.1.1.tgz", + "dependencies": { + "lodash._basetostring": { + "version": "3.0.1", + "from": "lodash._basetostring@^3.0.0", + "resolved": "https://registry.npmjs.org/lodash._basetostring/-/lodash._basetostring-3.0.1.tgz" + }, + "lodash._createpadding": { + "version": "3.6.1", + "from": "lodash._createpadding@^3.0.0", + "resolved": "https://registry.npmjs.org/lodash._createpadding/-/lodash._createpadding-3.6.1.tgz", + "dependencies": { + "lodash.repeat": { + "version": "3.0.1", + "from": "lodash.repeat@^3.0.0", + "resolved": "https://registry.npmjs.org/lodash.repeat/-/lodash.repeat-3.0.1.tgz" + } + } + } + } + }, + "lodash.padright": { + "version": "3.1.1", + "from": "lodash.padright@^3.0.0", + "resolved": "https://registry.npmjs.org/lodash.padright/-/lodash.padright-3.1.1.tgz", + "dependencies": { + "lodash._basetostring": { + "version": "3.0.1", + "from": "lodash._basetostring@^3.0.0", + "resolved": "https://registry.npmjs.org/lodash._basetostring/-/lodash._basetostring-3.0.1.tgz" + }, + "lodash._createpadding": { + "version": "3.6.1", + "from": "lodash._createpadding@^3.0.0", + "resolved": "https://registry.npmjs.org/lodash._createpadding/-/lodash._createpadding-3.6.1.tgz", + "dependencies": { + "lodash.repeat": { + "version": "3.0.1", + "from": "lodash.repeat@^3.0.0", + "resolved": "https://registry.npmjs.org/lodash.repeat/-/lodash.repeat-3.0.1.tgz" + } + } + } + } + } + } + } + } + }, + "request": { + "version": "2.64.0", + "from": "request@2.x", + "resolved": "https://registry.npmjs.org/request/-/request-2.64.0.tgz", + "dependencies": { + "bl": { + "version": "1.0.0", + "from": "bl@~1.0.0", + "resolved": "https://registry.npmjs.org/bl/-/bl-1.0.0.tgz", + "dependencies": { + "readable-stream": { + "version": "2.0.2", + "from": "readable-stream@~2.0.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.0.2.tgz", + "dependencies": { + "core-util-is": { + "version": "1.0.1", + "from": "core-util-is@~1.0.0", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.1.tgz" + }, + "inherits": { + "version": "2.0.1", + "from": "inherits@~2.0.1", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz" + }, + "isarray": { + "version": "0.0.1", + "from": "isarray@0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz" + }, + "process-nextick-args": { + "version": "1.0.3", + "from": "process-nextick-args@~1.0.0", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.3.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" + }, + "util-deprecate": { + "version": "1.0.1", + "from": "util-deprecate@~1.0.1", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.1.tgz" + } + } + } + } + }, + "caseless": { + "version": "0.11.0", + "from": "caseless@~0.11.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.11.0.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.0", + "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz" + }, + "form-data": { + "version": "1.0.0-rc3", + "from": "form-data@~1.0.0-rc1", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-1.0.0-rc3.tgz", + "dependencies": { + "async": { + "version": "1.4.2", + "from": "async@^1.4.0", + "resolved": "https://registry.npmjs.org/async/-/async-1.4.2.tgz" + } + } + }, + "json-stringify-safe": { + "version": "5.0.1", + "from": "json-stringify-safe@~5.0.0", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz" + }, + "mime-types": { + "version": "2.1.7", + "from": "mime-types@~2.1.2", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.7.tgz", + "dependencies": { + "mime-db": { + "version": "1.19.0", + "from": "mime-db@~1.19.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.19.0.tgz" + } + } + }, + "node-uuid": { + "version": "1.4.3", + "from": "node-uuid@~1.4.0", + "resolved": "https://registry.npmjs.org/node-uuid/-/node-uuid-1.4.3.tgz" + }, + "qs": { + "version": "5.1.0", + "from": "qs@~5.1.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-5.1.0.tgz" + }, + "tunnel-agent": { + "version": "0.4.1", + "from": "tunnel-agent@~0.4.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.4.1.tgz" + }, + "tough-cookie": { + "version": "2.1.0", + "from": "tough-cookie@>=0.12.0", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.1.0.tgz" + }, + "http-signature": { + "version": "0.11.0", + "from": "http-signature@~0.11.0", + "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", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-0.1.5.tgz" + }, + "asn1": { + "version": "0.1.11", + "from": "asn1@0.1.11", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.1.11.tgz" + }, + "ctype": { + "version": "0.5.3", + "from": "ctype@0.5.3", + "resolved": "https://registry.npmjs.org/ctype/-/ctype-0.5.3.tgz" + } + } + }, + "oauth-sign": { + "version": "0.8.0", + "from": "oauth-sign@~0.8.0", + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.8.0.tgz" + }, + "hawk": { + "version": "3.1.0", + "from": "hawk@~3.1.0", + "resolved": "https://registry.npmjs.org/hawk/-/hawk-3.1.0.tgz", + "dependencies": { + "hoek": { + "version": "2.16.3", + "from": "hoek@2.x.x", + "resolved": "https://registry.npmjs.org/hoek/-/hoek-2.16.3.tgz" + }, + "boom": { + "version": "2.9.0", + "from": "boom@^2.8.x", + "resolved": "https://registry.npmjs.org/boom/-/boom-2.9.0.tgz" + }, + "cryptiles": { + "version": "2.0.5", + "from": "cryptiles@2.x.x", + "resolved": "https://registry.npmjs.org/cryptiles/-/cryptiles-2.0.5.tgz" + }, + "sntp": { + "version": "1.0.9", + "from": "sntp@1.x.x", + "resolved": "https://registry.npmjs.org/sntp/-/sntp-1.0.9.tgz" + } + } + }, + "aws-sign2": { + "version": "0.5.0", + "from": "aws-sign2@~0.5.0", + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.5.0.tgz" + }, + "stringstream": { + "version": "0.0.4", + "from": "stringstream@~0.0.4", + "resolved": "https://registry.npmjs.org/stringstream/-/stringstream-0.0.4.tgz" + }, + "combined-stream": { + "version": "1.0.5", + "from": "combined-stream@~1.0.1", + "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", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz" + } + } + }, + "isstream": { + "version": "0.1.2", + "from": "isstream@~0.1.1", + "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz" + }, + "har-validator": { + "version": "1.8.0", + "from": "har-validator@^1.6.1", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-1.8.0.tgz", + "dependencies": { + "bluebird": { + "version": "2.10.2", + "from": "bluebird@^2.9.30", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-2.10.2.tgz" + }, + "chalk": { + "version": "1.1.1", + "from": "chalk@^1.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.1.tgz", + "dependencies": { + "ansi-styles": { + "version": "2.1.0", + "from": "ansi-styles@^2.1.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.1.0.tgz" + }, + "escape-string-regexp": { + "version": "1.0.3", + "from": "escape-string-regexp@^1.0.2", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.3.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", + "dependencies": { + "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" + } + } + }, + "strip-ansi": { + "version": "3.0.0", + "from": "strip-ansi@^3.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.0.tgz", + "dependencies": { + "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" + } + } + }, + "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" + } + } + }, + "commander": { + "version": "2.8.1", + "from": "commander@^2.8.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.8.1.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.12.2", + "from": "is-my-json-valid@^2.12.0", + "resolved": "https://registry.npmjs.org/is-my-json-valid/-/is-my-json-valid-2.12.2.tgz", + "dependencies": { + "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", + "dependencies": { + "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" + } + } + }, + "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.0", + "from": "xtend@^4.0.0", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.0.tgz" + } + } + } + } + } + } + }, + "semver": { + "version": "5.0.3", + "from": "semver@~5.0.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.0.3.tgz" + }, + "tar": { + "version": "2.2.1", + "from": "tar@~2.2.0", + "resolved": "https://registry.npmjs.org/tar/-/tar-2.2.1.tgz", + "dependencies": { + "block-stream": { + "version": "0.0.8", + "from": "block-stream@*", + "resolved": "https://registry.npmjs.org/block-stream/-/block-stream-0.0.8.tgz" + }, + "fstream": { + "version": "1.0.8", + "from": "fstream@^1.0.2", + "resolved": "https://registry.npmjs.org/fstream/-/fstream-1.0.8.tgz", + "dependencies": { + "graceful-fs": { + "version": "4.1.2", + "from": "graceful-fs@^4.1.2", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.2.tgz" + } + } + }, + "inherits": { + "version": "2.0.1", + "from": "inherits@2", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz" + } + } + }, + "tar-pack": { + "version": "2.0.0", + "from": "tar-pack@~2.0.0", + "resolved": "https://registry.npmjs.org/tar-pack/-/tar-pack-2.0.0.tgz", + "dependencies": { + "uid-number": { + "version": "0.0.3", + "from": "uid-number@0.0.3", + "resolved": "https://registry.npmjs.org/uid-number/-/uid-number-0.0.3.tgz" + }, + "once": { + "version": "1.1.1", + "from": "once@~1.1.1", + "resolved": "https://registry.npmjs.org/once/-/once-1.1.1.tgz" + }, + "debug": { + "version": "0.7.4", + "from": "debug@~0.7.2", + "resolved": "https://registry.npmjs.org/debug/-/debug-0.7.4.tgz" + }, + "rimraf": { + "version": "2.2.8", + "from": "rimraf@~2.2.0", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.2.8.tgz" + }, + "fstream": { + "version": "0.1.31", + "from": "fstream@~0.1.22", + "resolved": "https://registry.npmjs.org/fstream/-/fstream-0.1.31.tgz", + "dependencies": { + "graceful-fs": { + "version": "3.0.8", + "from": "graceful-fs@~3.0.2", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-3.0.8.tgz" + }, + "inherits": { + "version": "2.0.1", + "from": "inherits@~2.0.0", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz" + } + } + }, + "tar": { + "version": "0.1.20", + "from": "tar@~0.1.17", + "resolved": "https://registry.npmjs.org/tar/-/tar-0.1.20.tgz", + "dependencies": { + "block-stream": { + "version": "0.0.8", + "from": "block-stream@*", + "resolved": "https://registry.npmjs.org/block-stream/-/block-stream-0.0.8.tgz" + }, + "inherits": { + "version": "2.0.1", + "from": "inherits@2", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz" + } + } + }, + "fstream-ignore": { + "version": "0.0.7", + "from": "fstream-ignore@0.0.7", + "resolved": "https://registry.npmjs.org/fstream-ignore/-/fstream-ignore-0.0.7.tgz", + "dependencies": { + "minimatch": { + "version": "0.2.14", + "from": "minimatch@~0.2.0", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-0.2.14.tgz", + "dependencies": { + "lru-cache": { + "version": "2.7.0", + "from": "lru-cache@2", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-2.7.0.tgz" + }, + "sigmund": { + "version": "1.0.1", + "from": "sigmund@~1.0.0", + "resolved": "https://registry.npmjs.org/sigmund/-/sigmund-1.0.1.tgz" + } + } + }, + "inherits": { + "version": "2.0.1", + "from": "inherits@~2.0.1", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz" + } + } + }, + "readable-stream": { + "version": "1.0.33", + "from": "readable-stream@~1.0.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.33.tgz", + "dependencies": { + "core-util-is": { + "version": "1.0.1", + "from": "core-util-is@~1.0.0", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.1.tgz" + }, + "isarray": { + "version": "0.0.1", + "from": "isarray@0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.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" + }, + "inherits": { + "version": "2.0.1", + "from": "inherits@~2.0.1", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz" + } + } + }, + "graceful-fs": { + "version": "1.2.3", + "from": "graceful-fs@1.2", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-1.2.3.tgz" + } + } + }, + "mkdirp": { + "version": "0.5.1", + "from": "mkdirp@~0.5.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" + } + } + }, + "rc": { + "version": "1.1.2", + "from": "rc@~1.1.0", + "resolved": "https://registry.npmjs.org/rc/-/rc-1.1.2.tgz", + "dependencies": { + "minimist": { + "version": "1.2.0", + "from": "minimist@^1.1.2", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz" + }, + "deep-extend": { + "version": "0.2.11", + "from": "deep-extend@~0.2.5", + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.2.11.tgz" + }, + "strip-json-comments": { + "version": "0.1.3", + "from": "strip-json-comments@0.1.x", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-0.1.3.tgz" + }, + "ini": { + "version": "1.3.4", + "from": "ini@~1.3.0", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.4.tgz" + } + } + }, + "rimraf": { + "version": "2.4.3", + "from": "rimraf@~2.4.0", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.4.3.tgz", + "dependencies": { + "glob": { + "version": "5.0.15", + "from": "glob@^5.0.14", + "resolved": "https://registry.npmjs.org/glob/-/glob-5.0.15.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.0.1", + "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.1", + "from": "brace-expansion@^1.0.0", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.1.tgz", + "dependencies": { + "balanced-match": { + "version": "0.2.0", + "from": "balanced-match@^0.2.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-0.2.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.2", + "from": "once@^1.3.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.3.2.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" + } + } + } + } + } + } + } + } + } + } + }, + "commander": { + "version": "2.9.0", + "from": "commander@>=2.6.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" + } + } + }, + "convert-source-map": { + "version": "1.1.1", + "from": "convert-source-map@>=1.1.0 <2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.1.1.tgz" + }, + "fs-readdir-recursive": { + "version": "0.1.2", + "from": "fs-readdir-recursive@>=0.1.0 <0.2.0", + "resolved": "https://registry.npmjs.org/fs-readdir-recursive/-/fs-readdir-recursive-0.1.2.tgz" + }, + "lodash": { + "version": "3.10.1", + "from": "lodash@>=3.2.0 <4.0.0", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-3.10.1.tgz" + }, + "output-file-sync": { + "version": "1.1.1", + "from": "output-file-sync@>=1.1.0 <2.0.0", + "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", + "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" + } + } + }, + "xtend": { + "version": "4.0.0", + "from": "xtend@>=4.0.0 <5.0.0", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.0.tgz" + } + } + }, + "path-exists": { + "version": "1.0.0", + "from": "path-exists@>=1.0.0 <2.0.0", + "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", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.0.tgz" + }, + "source-map": { + "version": "0.4.4", + "from": "source-map@>=0.4.0 <0.5.0", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.4.4.tgz", + "dependencies": { + "amdefine": { + "version": "1.0.0", + "from": "amdefine@>=0.0.4", + "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.0.tgz" + } + } + }, + "slash": { + "version": "1.0.0", + "from": "slash@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz" + } + } + }, + "chalk": { + "version": "1.1.1", + "from": "chalk@1.1.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.1.tgz", + "dependencies": { + "ansi-styles": { + "version": "2.1.0", + "from": "ansi-styles@>=2.1.0 <3.0.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.1.0.tgz" + }, + "escape-string-regexp": { + "version": "1.0.3", + "from": "escape-string-regexp@>=1.0.2 <2.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.3.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": { + "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" + } + } + }, + "strip-ansi": { + "version": "3.0.0", + "from": "strip-ansi@>=3.0.0 <4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.0.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" + } + } + }, + "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" + } + } + }, + "dedent": { + "version": "0.4.0", + "from": "dedent@0.4.0", + "resolved": "https://registry.npmjs.org/dedent/-/dedent-0.4.0.tgz" + }, + "find-node-modules": { + "version": "1.0.1", + "from": "find-node-modules@1.0.1", + "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", + "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", + "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", + "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", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.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" + }, + "minimatch": { + "version": "2.0.10", + "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.1", + "from": "brace-expansion@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.1.tgz", + "dependencies": { + "balanced-match": { + "version": "0.2.1", + "from": "balanced-match@>=0.2.0 <0.3.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-0.2.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" + } + } + } + } + }, + "once": { + "version": "1.3.2", + "from": "once@>=1.3.0 <2.0.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.3.2.tgz", + "dependencies": { + "wrappy": { + "version": "1.0.1", + "from": "wrappy@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.1.tgz" + } + } + } + } + } + } + }, + "merge": { + "version": "1.2.0", + "from": "merge@>=1.2.0 <2.0.0", + "resolved": "https://registry.npmjs.org/merge/-/merge-1.2.0.tgz" + } + } + }, + "glob": { + "version": "5.0.15", + "from": "glob@5.0.15", + "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", + "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", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.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" + }, + "minimatch": { + "version": "3.0.0", + "from": "minimatch@>=2.0.0 <3.0.0||>=3.0.0 <4.0.0", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.0.tgz", + "dependencies": { + "brace-expansion": { + "version": "1.1.1", + "from": "brace-expansion@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.1.tgz", + "dependencies": { + "balanced-match": { + "version": "0.2.1", + "from": "balanced-match@>=0.2.0 <0.3.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-0.2.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" + } + } + } + } + }, + "once": { + "version": "1.3.2", + "from": "once@>=1.3.0 <2.0.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.3.2.tgz", + "dependencies": { + "wrappy": { + "version": "1.0.1", + "from": "wrappy@>=1.0.0 <2.0.0", + "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", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.0.tgz" + } + } + }, + "gulp": { + "version": "3.9.0", + "from": "gulp@3.9.0", + "resolved": "https://registry.npmjs.org/gulp/-/gulp-3.9.0.tgz", + "dependencies": { + "archy": { + "version": "1.0.0", + "from": "archy@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/archy/-/archy-1.0.0.tgz" + }, + "deprecated": { + "version": "0.0.1", + "from": "deprecated@>=0.0.1 <0.0.2", + "resolved": "https://registry.npmjs.org/deprecated/-/deprecated-0.0.1.tgz" + }, + "interpret": { + "version": "0.6.6", + "from": "interpret@>=0.6.2 <0.7.0", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-0.6.6.tgz" + }, + "liftoff": { + "version": "2.2.0", + "from": "liftoff@>=2.1.0 <3.0.0", + "resolved": "https://registry.npmjs.org/liftoff/-/liftoff-2.2.0.tgz", + "dependencies": { + "extend": { + "version": "2.0.1", + "from": "extend@>=2.0.1 <3.0.0", + "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", + "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-0.3.0.tgz" + }, + "flagged-respawn": { + "version": "0.3.1", + "from": "flagged-respawn@>=0.3.1 <0.4.0", + "resolved": "https://registry.npmjs.org/flagged-respawn/-/flagged-respawn-0.3.1.tgz" + }, + "rechoir": { + "version": "0.6.2", + "from": "rechoir@>=0.6.0 <0.7.0", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz" + }, + "resolve": { + "version": "1.1.6", + "from": "resolve@>=1.1.6 <2.0.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.1.6.tgz" + } + } + }, + "orchestrator": { + "version": "0.3.7", + "from": "orchestrator@>=0.3.0 <0.4.0", + "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", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-0.1.5.tgz", + "dependencies": { + "once": { + "version": "1.3.2", + "from": "once@>=1.3.0 <1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.3.2.tgz", + "dependencies": { + "wrappy": { + "version": "1.0.1", + "from": "wrappy@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.1.tgz" + } + } + } + } + }, + "sequencify": { + "version": "0.0.7", + "from": "sequencify@>=0.0.7 <0.1.0", + "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", + "resolved": "https://registry.npmjs.org/stream-consume/-/stream-consume-0.1.0.tgz" + } + } + }, + "pretty-hrtime": { + "version": "1.0.1", + "from": "pretty-hrtime@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/pretty-hrtime/-/pretty-hrtime-1.0.1.tgz" + }, + "semver": { + "version": "4.3.6", + "from": "semver@>=4.1.0 <5.0.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-4.3.6.tgz" + }, + "tildify": { + "version": "1.1.2", + "from": "tildify@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/tildify/-/tildify-1.1.2.tgz", + "dependencies": { + "os-homedir": { + "version": "1.0.1", + "from": "os-homedir@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.1.tgz" + } + } + }, + "v8flags": { + "version": "2.0.10", + "from": "v8flags@>=2.0.2 <3.0.0", + "resolved": "https://registry.npmjs.org/v8flags/-/v8flags-2.0.10.tgz", + "dependencies": { + "user-home": { + "version": "1.1.1", + "from": "user-home@>=1.1.1 <2.0.0", + "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", + "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", + "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", + "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", + "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", + "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", + "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", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.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" + }, + "once": { + "version": "1.3.2", + "from": "once@>=1.3.0 <2.0.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.3.2.tgz", + "dependencies": { + "wrappy": { + "version": "1.0.1", + "from": "wrappy@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.1.tgz" + } + } + } + } + }, + "minimatch": { + "version": "2.0.10", + "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.1", + "from": "brace-expansion@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.1.tgz", + "dependencies": { + "balanced-match": { + "version": "0.2.1", + "from": "balanced-match@>=0.2.0 <0.3.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-0.2.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" + } + } + } + } + }, + "ordered-read-streams": { + "version": "0.1.0", + "from": "ordered-read-streams@>=0.1.0 <0.2.0", + "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", + "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", + "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", + "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", + "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", + "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", + "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", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-1.0.2.tgz" + }, + "glob": { + "version": "3.1.21", + "from": "glob@>=3.1.21 <3.2.0", + "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", + "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", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-1.0.2.tgz" + } + } + }, + "minimatch": { + "version": "0.2.14", + "from": "minimatch@>=0.2.11 <0.3.0", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-0.2.14.tgz", + "dependencies": { + "lru-cache": { + "version": "2.7.0", + "from": "lru-cache@>=2.0.0 <3.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-2.7.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" + } + } + } + } + } + } + } + } + }, + "graceful-fs": { + "version": "3.0.8", + "from": "graceful-fs@>=3.0.0 <4.0.0", + "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", + "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" + } + } + }, + "strip-bom": { + "version": "1.0.0", + "from": "strip-bom@>=1.0.0 <2.0.0", + "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", + "resolved": "https://registry.npmjs.org/first-chunk-stream/-/first-chunk-stream-1.0.0.tgz" + }, + "is-utf8": { + "version": "0.2.0", + "from": "is-utf8@>=0.2.0 <0.3.0", + "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.0.tgz" + } + } + }, + "through2": { + "version": "0.6.5", + "from": "through2@>=0.6.1 <0.7.0", + "resolved": "https://registry.npmjs.org/through2/-/through2-0.6.5.tgz", + "dependencies": { + "readable-stream": { + "version": "1.0.33", + "from": "readable-stream@>=1.0.33-1 <1.1.0-0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.33.tgz", + "dependencies": { + "core-util-is": { + "version": "1.0.1", + "from": "core-util-is@>=1.0.0 <1.1.0", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.1.tgz" + }, + "isarray": { + "version": "0.0.1", + "from": "isarray@0.0.1", + "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", + "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", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz" + } + } + }, + "xtend": { + "version": "4.0.0", + "from": "xtend@>=4.0.0 <5.0.0", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.0.tgz" + } + } + }, + "vinyl": { + "version": "0.4.6", + "from": "vinyl@>=0.4.0 <0.5.0", + "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", + "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", + "resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-0.0.1.tgz" + } + } + } + } + } + } + }, + "gulp-git": { + "version": "1.6.0", + "from": "gulp-git@1.6.0", + "resolved": "https://registry.npmjs.org/gulp-git/-/gulp-git-1.6.0.tgz", + "dependencies": { + "any-shell-escape": { + "version": "0.1.1", + "from": "any-shell-escape@>=0.1.1 <0.2.0", + "resolved": "https://registry.npmjs.org/any-shell-escape/-/any-shell-escape-0.1.1.tgz" + }, + "gulp-util": { + "version": "3.0.7", + "from": "gulp-util@>=3.0.6 <4.0.0", + "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", + "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", + "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", + "resolved": "https://registry.npmjs.org/beeper/-/beeper-1.1.0.tgz" + }, + "dateformat": { + "version": "1.0.11", + "from": "dateformat@>=1.0.11 <2.0.0", + "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-1.0.11.tgz", + "dependencies": { + "get-stdin": { + "version": "5.0.0", + "from": "get-stdin@*", + "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-5.0.0.tgz" + }, + "meow": { + "version": "3.5.0", + "from": "meow@*", + "resolved": "https://registry.npmjs.org/meow/-/meow-3.5.0.tgz", + "dependencies": { + "camelcase-keys": { + "version": "1.0.0", + "from": "camelcase-keys@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-1.0.0.tgz", + "dependencies": { + "camelcase": { + "version": "1.2.1", + "from": "camelcase@>=1.0.1 <2.0.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz" + }, + "map-obj": { + "version": "1.0.1", + "from": "map-obj@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz" + } + } + }, + "loud-rejection": { + "version": "1.0.0", + "from": "loud-rejection@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/loud-rejection/-/loud-rejection-1.0.0.tgz" + }, + "normalize-package-data": { + "version": "2.3.4", + "from": "normalize-package-data@>=2.3.4 <3.0.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.3.4.tgz", + "dependencies": { + "hosted-git-info": { + "version": "2.1.4", + "from": "hosted-git-info@>=2.0.2 <3.0.0", + "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", + "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-1.0.0.tgz", + "dependencies": { + "builtin-modules": { + "version": "1.1.0", + "from": "builtin-modules@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.0.tgz" + } + } + }, + "validate-npm-package-license": { + "version": "3.0.1", + "from": "validate-npm-package-license@>=3.0.1 <4.0.0", + "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", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-1.0.2.tgz", + "dependencies": { + "spdx-license-ids": { + "version": "1.1.0", + "from": "spdx-license-ids@>=1.0.2 <2.0.0", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-1.1.0.tgz" + } + } + }, + "spdx-expression-parse": { + "version": "1.0.0", + "from": "spdx-expression-parse@>=1.0.0 <1.1.0", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-1.0.0.tgz", + "dependencies": { + "spdx-exceptions": { + "version": "1.0.3", + "from": "spdx-exceptions@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-1.0.3.tgz" + }, + "spdx-license-ids": { + "version": "1.1.0", + "from": "spdx-license-ids@>=1.0.2 <2.0.0", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-1.1.0.tgz" + } + } + } + } + } + } + }, + "object-assign": { + "version": "4.0.1", + "from": "object-assign@>=4.0.1 <5.0.0", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.0.1.tgz" + }, + "read-pkg-up": { + "version": "1.0.1", + "from": "read-pkg-up@>=1.0.1 <2.0.0", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", + "dependencies": { + "find-up": { + "version": "1.0.0", + "from": "find-up@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.0.0.tgz", + "dependencies": { + "path-exists": { + "version": "2.0.0", + "from": "path-exists@>=2.0.0 <3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.0.0.tgz" + }, + "pinkie-promise": { + "version": "1.0.0", + "from": "pinkie-promise@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-1.0.0.tgz", + "dependencies": { + "pinkie": { + "version": "1.0.0", + "from": "pinkie@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-1.0.0.tgz" + } + } + } + } + }, + "read-pkg": { + "version": "1.1.0", + "from": "read-pkg@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", + "dependencies": { + "load-json-file": { + "version": "1.0.1", + "from": "load-json-file@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.0.1.tgz", + "dependencies": { + "graceful-fs": { + "version": "4.1.2", + "from": "graceful-fs@>=4.1.2 <5.0.0", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.2.tgz" + }, + "parse-json": { + "version": "2.2.0", + "from": "parse-json@>=2.2.0 <3.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", + "dependencies": { + "error-ex": { + "version": "1.2.0", + "from": "error-ex@>=1.2.0 <2.0.0", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.2.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": "1.0.0", + "from": "pinkie-promise@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-1.0.0.tgz", + "dependencies": { + "pinkie": { + "version": "1.0.0", + "from": "pinkie@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-1.0.0.tgz" + } + } + }, + "strip-bom": { + "version": "2.0.0", + "from": "strip-bom@>=2.0.0 <3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", + "dependencies": { + "is-utf8": { + "version": "0.2.0", + "from": "is-utf8@>=0.2.0 <0.3.0", + "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.0.tgz" + } + } + } + } + }, + "path-type": { + "version": "1.0.0", + "from": "path-type@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.0.0.tgz", + "dependencies": { + "graceful-fs": { + "version": "4.1.2", + "from": "graceful-fs@>=4.1.2 <5.0.0", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.2.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": "1.0.0", + "from": "pinkie-promise@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-1.0.0.tgz", + "dependencies": { + "pinkie": { + "version": "1.0.0", + "from": "pinkie@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-1.0.0.tgz" + } + } + } + } + } + } + } + } + }, + "redent": { + "version": "1.0.0", + "from": "redent@>=1.0.0 <2.0.0", + "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", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-2.1.0.tgz", + "dependencies": { + "repeating": { + "version": "2.0.0", + "from": "repeating@>=2.0.0 <3.0.0", + "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.0.tgz", + "dependencies": { + "is-finite": { + "version": "1.0.1", + "from": "is-finite@>=1.0.0 <2.0.0", + "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", + "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.0.tgz" + } + } + } + } + } + } + }, + "strip-indent": { + "version": "1.0.1", + "from": "strip-indent@>=1.0.1 <2.0.0", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-1.0.1.tgz", + "dependencies": { + "get-stdin": { + "version": "4.0.1", + "from": "get-stdin@>=4.0.1 <5.0.0", + "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz" + } + } + } + } + }, + "trim-newlines": { + "version": "1.0.0", + "from": "trim-newlines@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-1.0.0.tgz" + } + } + } + } + }, + "fancy-log": { + "version": "1.1.0", + "from": "fancy-log@>=1.1.0 <2.0.0", + "resolved": "https://registry.npmjs.org/fancy-log/-/fancy-log-1.1.0.tgz" + }, + "gulplog": { + "version": "1.0.0", + "from": "gulplog@>=1.0.0 <2.0.0", + "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", + "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", + "resolved": "https://registry.npmjs.org/sparkles/-/sparkles-1.0.0.tgz" + } + } + } + } + }, + "has-gulplog": { + "version": "0.1.0", + "from": "has-gulplog@>=0.1.0 <0.2.0", + "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", + "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", + "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", + "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", + "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", + "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", + "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", + "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", + "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", + "resolved": "https://registry.npmjs.org/lodash._isiterateecall/-/lodash._isiterateecall-3.0.9.tgz" + }, + "lodash.escape": { + "version": "3.0.0", + "from": "lodash.escape@>=3.0.0 <4.0.0", + "resolved": "https://registry.npmjs.org/lodash.escape/-/lodash.escape-3.0.0.tgz" + }, + "lodash.keys": { + "version": "3.1.2", + "from": "lodash.keys@>=3.0.0 <4.0.0", + "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", + "resolved": "https://registry.npmjs.org/lodash._getnative/-/lodash._getnative-3.9.1.tgz" + }, + "lodash.isarguments": { + "version": "3.0.4", + "from": "lodash.isarguments@>=3.0.0 <4.0.0", + "resolved": "https://registry.npmjs.org/lodash.isarguments/-/lodash.isarguments-3.0.4.tgz" + }, + "lodash.isarray": { + "version": "3.0.4", + "from": "lodash.isarray@>=3.0.0 <4.0.0", + "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", + "resolved": "https://registry.npmjs.org/lodash.restparam/-/lodash.restparam-3.6.1.tgz" + }, + "lodash.templatesettings": { + "version": "3.1.0", + "from": "lodash.templatesettings@>=3.0.0 <4.0.0", + "resolved": "https://registry.npmjs.org/lodash.templatesettings/-/lodash.templatesettings-3.1.0.tgz" + } + } + }, + "multipipe": { + "version": "0.1.2", + "from": "multipipe@>=0.1.2 <0.2.0", + "resolved": "https://registry.npmjs.org/multipipe/-/multipipe-0.1.2.tgz", + "dependencies": { + "duplexer2": { + "version": "0.0.2", + "from": "duplexer2@0.0.2", + "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.0.2.tgz", + "dependencies": { + "readable-stream": { + "version": "1.1.13", + "from": "readable-stream@>=1.1.9 <1.2.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.13.tgz", + "dependencies": { + "core-util-is": { + "version": "1.0.1", + "from": "core-util-is@>=1.0.0 <1.1.0", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.1.tgz" + }, + "isarray": { + "version": "0.0.1", + "from": "isarray@0.0.1", + "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", + "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", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz" + } + } + } + } + } + } + }, + "object-assign": { + "version": "3.0.0", + "from": "object-assign@>=3.0.0 <4.0.0", + "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", + "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-0.0.1.tgz" + }, + "through2": { + "version": "2.0.0", + "from": "through2@>=2.0.0 <3.0.0", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.0.tgz", + "dependencies": { + "readable-stream": { + "version": "2.0.4", + "from": "readable-stream@>=2.0.0 <2.1.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.0.4.tgz", + "dependencies": { + "core-util-is": { + "version": "1.0.1", + "from": "core-util-is@>=1.0.0 <1.1.0", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.1.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": "0.0.1", + "from": "isarray@0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz" + }, + "process-nextick-args": { + "version": "1.0.3", + "from": "process-nextick-args@>=1.0.0 <1.1.0", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.3.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" + } + } + }, + "xtend": { + "version": "4.0.0", + "from": "xtend@>=4.0.0 <4.1.0", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.0.tgz" + } + } + }, + "vinyl": { + "version": "0.5.3", + "from": "vinyl@>=0.5.0 <0.6.0", + "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", + "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", + "resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-0.0.1.tgz" + } + } + } + } + }, + "require-dir": { + "version": "0.1.0", + "from": "require-dir@>=0.1.0 <0.2.0", + "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", + "resolved": "https://registry.npmjs.org/through2/-/through2-0.6.5.tgz", + "dependencies": { + "readable-stream": { + "version": "1.0.33", + "from": "readable-stream@>=1.0.33-1 <1.1.0-0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.33.tgz", + "dependencies": { + "core-util-is": { + "version": "1.0.1", + "from": "core-util-is@>=1.0.0 <1.1.0", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.1.tgz" + }, + "isarray": { + "version": "0.0.1", + "from": "isarray@0.0.1", + "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", + "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", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz" + } + } + }, + "xtend": { + "version": "4.0.0", + "from": "xtend@>=4.0.0 <5.0.0", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.0.tgz" + } + } + } + } + }, + "inquirer": { + "version": "0.10.1", + "from": "inquirer@0.10.1", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-0.10.1.tgz", + "dependencies": { + "ansi-escapes": { + "version": "1.1.0", + "from": "ansi-escapes@>=1.1.0 <2.0.0", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-1.1.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" + }, + "cli-cursor": { + "version": "1.0.2", + "from": "cli-cursor@>=1.0.1 <2.0.0", + "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", + "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", + "resolved": "https://registry.npmjs.org/exit-hook/-/exit-hook-1.1.1.tgz" + }, + "onetime": { + "version": "1.0.0", + "from": "onetime@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-1.0.0.tgz" + } + } + } + } + }, + "cli-width": { + "version": "1.1.0", + "from": "cli-width@>=1.0.1 <2.0.0", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-1.1.0.tgz" + }, + "figures": { + "version": "1.4.0", + "from": "figures@>=1.3.5 <2.0.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-1.4.0.tgz" + }, + "lodash": { + "version": "3.10.1", + "from": "lodash@>=3.2.0 <4.0.0", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-3.10.1.tgz" + }, + "readline2": { + "version": "1.0.1", + "from": "readline2@>=1.0.1 <2.0.0", + "resolved": "https://registry.npmjs.org/readline2/-/readline2-1.0.1.tgz", + "dependencies": { + "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", + "dependencies": { + "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" + } + } + }, + "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.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" + } + } + }, + "mute-stream": { + "version": "0.0.5", + "from": "mute-stream@0.0.5", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.5.tgz" + } + } + }, + "run-async": { + "version": "0.1.0", + "from": "run-async@>=0.1.0 <0.2.0", + "resolved": "https://registry.npmjs.org/run-async/-/run-async-0.1.0.tgz", + "dependencies": { + "once": { + "version": "1.3.2", + "from": "once@>=1.3.0 <2.0.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.3.2.tgz", + "dependencies": { + "wrappy": { + "version": "1.0.1", + "from": "wrappy@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.1.tgz" + } + } + } + } + }, + "rx-lite": { + "version": "3.1.2", + "from": "rx-lite@>=3.1.2 <4.0.0", + "resolved": "https://registry.npmjs.org/rx-lite/-/rx-lite-3.1.2.tgz" + }, + "strip-ansi": { + "version": "3.0.0", + "from": "strip-ansi@>=3.0.0 <4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.0.tgz" + }, + "through": { + "version": "2.3.8", + "from": "through@>=2.3.6 <3.0.0", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz" + } + } + }, + "json": { + "version": "9.0.3", + "from": "json@9.0.3", + "resolved": "https://registry.npmjs.org/json/-/json-9.0.3.tgz" + }, + "minimist": { + "version": "1.2.0", + "from": "minimist@1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz" + }, + "node-uuid": { + "version": "1.4.3", + "from": "node-uuid@1.4.3", + "resolved": "https://registry.npmjs.org/node-uuid/-/node-uuid-1.4.3.tgz" + }, + "nodemon": { + "version": "1.7.3", + "from": "nodemon@1.7.3", + "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-1.7.3.tgz", + "dependencies": { + "chokidar": { + "version": "1.2.0", + "from": "chokidar@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-1.2.0.tgz", + "dependencies": { + "anymatch": { + "version": "1.3.0", + "from": "anymatch@>=1.1.0 <2.0.0", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-1.3.0.tgz", + "dependencies": { + "micromatch": { + "version": "2.2.0", + "from": "micromatch@>=2.1.5 <3.0.0", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-2.2.0.tgz", + "dependencies": { + "arr-diff": { + "version": "1.1.0", + "from": "arr-diff@>=1.0.1 <2.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-1.1.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-slice": { + "version": "0.2.3", + "from": "array-slice@>=0.2.3 <0.3.0", + "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", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz" + }, + "braces": { + "version": "1.8.2", + "from": "braces@>=1.8.0 <2.0.0", + "resolved": "https://registry.npmjs.org/braces/-/braces-1.8.2.tgz", + "dependencies": { + "expand-range": { + "version": "1.8.1", + "from": "expand-range@>=1.8.1 <2.0.0", + "resolved": "https://registry.npmjs.org/expand-range/-/expand-range-1.8.1.tgz", + "dependencies": { + "fill-range": { + "version": "2.2.2", + "from": "fill-range@>=2.1.0 <3.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-2.2.2.tgz", + "dependencies": { + "is-number": { + "version": "1.1.2", + "from": "is-number@>=1.1.2 <2.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-1.1.2.tgz" + }, + "isobject": { + "version": "1.0.2", + "from": "isobject@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-1.0.2.tgz" + }, + "randomatic": { + "version": "1.1.0", + "from": "randomatic@>=1.1.0 <2.0.0", + "resolved": "https://registry.npmjs.org/randomatic/-/randomatic-1.1.0.tgz" + }, + "repeat-string": { + "version": "1.5.2", + "from": "repeat-string@>=1.5.2 <2.0.0", + "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.5.2.tgz" + } + } + } + } + }, + "lazy-cache": { + "version": "0.2.4", + "from": "lazy-cache@>=0.2.3 <0.3.0", + "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-0.2.4.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.4", + "from": "expand-brackets@>=0.1.1 <0.2.0", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.4.tgz" + }, + "extglob": { + "version": "0.3.1", + "from": "extglob@>=0.3.0 <0.4.0", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-0.3.1.tgz", + "dependencies": { + "ansi-green": { + "version": "0.1.1", + "from": "ansi-green@>=0.1.1 <0.2.0", + "resolved": "https://registry.npmjs.org/ansi-green/-/ansi-green-0.1.1.tgz", + "dependencies": { + "ansi-wrap": { + "version": "0.1.0", + "from": "ansi-wrap@0.1.0", + "resolved": "https://registry.npmjs.org/ansi-wrap/-/ansi-wrap-0.1.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" + }, + "success-symbol": { + "version": "0.1.0", + "from": "success-symbol@>=0.1.0 <0.2.0", + "resolved": "https://registry.npmjs.org/success-symbol/-/success-symbol-0.1.0.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-glob": { + "version": "1.1.3", + "from": "is-glob@>=1.1.3 <2.0.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-1.1.3.tgz" + }, + "kind-of": { + "version": "1.1.0", + "from": "kind-of@>=1.1.0 <2.0.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-1.1.0.tgz" + }, + "object.omit": { + "version": "1.1.0", + "from": "object.omit@>=1.1.0 <2.0.0", + "resolved": "https://registry.npmjs.org/object.omit/-/object.omit-1.1.0.tgz", + "dependencies": { + "for-own": { + "version": "0.1.3", + "from": "for-own@>=0.1.3 <0.2.0", + "resolved": "https://registry.npmjs.org/for-own/-/for-own-0.1.3.tgz", + "dependencies": { + "for-in": { + "version": "0.1.4", + "from": "for-in@>=0.1.4 <0.2.0", + "resolved": "https://registry.npmjs.org/for-in/-/for-in-0.1.4.tgz" + } + } + }, + "isobject": { + "version": "1.0.2", + "from": "isobject@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-1.0.2.tgz" + } + } + }, + "parse-glob": { + "version": "3.0.4", + "from": "parse-glob@>=3.0.1 <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" + }, + "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" + }, + "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" + } + } + }, + "regex-cache": { + "version": "0.4.2", + "from": "regex-cache@>=0.4.2 <0.5.0", + "resolved": "https://registry.npmjs.org/regex-cache/-/regex-cache-0.4.2.tgz", + "dependencies": { + "is-equal-shallow": { + "version": "0.1.3", + "from": "is-equal-shallow@>=0.1.1 <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" + } + } + } + } + } + } + }, + "arrify": { + "version": "1.0.0", + "from": "arrify@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.0.tgz" + }, + "async-each": { + "version": "0.1.6", + "from": "async-each@>=0.1.5 <0.2.0", + "resolved": "https://registry.npmjs.org/async-each/-/async-each-0.1.6.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" + }, + "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.3.1", + "from": "binary-extensions@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.3.1.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" + } + } + }, + "lodash.flatten": { + "version": "3.0.2", + "from": "lodash.flatten@>=3.0.2 <4.0.0", + "resolved": "https://registry.npmjs.org/lodash.flatten/-/lodash.flatten-3.0.2.tgz", + "dependencies": { + "lodash._baseflatten": { + "version": "3.1.4", + "from": "lodash._baseflatten@>=3.0.0 <4.0.0", + "resolved": "https://registry.npmjs.org/lodash._baseflatten/-/lodash._baseflatten-3.1.4.tgz", + "dependencies": { + "lodash.isarguments": { + "version": "3.0.4", + "from": "lodash.isarguments@>=3.0.0 <4.0.0", + "resolved": "https://registry.npmjs.org/lodash.isarguments/-/lodash.isarguments-3.0.4.tgz" + }, + "lodash.isarray": { + "version": "3.0.4", + "from": "lodash.isarray@>=3.0.0 <4.0.0", + "resolved": "https://registry.npmjs.org/lodash.isarray/-/lodash.isarray-3.0.4.tgz" + } + } + }, + "lodash._isiterateecall": { + "version": "3.0.9", + "from": "lodash._isiterateecall@>=3.0.0 <4.0.0", + "resolved": "https://registry.npmjs.org/lodash._isiterateecall/-/lodash._isiterateecall-3.0.9.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" + }, + "readdirp": { + "version": "2.0.0", + "from": "readdirp@>=2.0.0 <3.0.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.0.0.tgz", + "dependencies": { + "graceful-fs": { + "version": "4.1.2", + "from": "graceful-fs@>=4.1.2 <5.0.0", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.2.tgz" + }, + "minimatch": { + "version": "2.0.10", + "from": "minimatch@>=2.0.10 <3.0.0", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-2.0.10.tgz", + "dependencies": { + "brace-expansion": { + "version": "1.1.1", + "from": "brace-expansion@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.1.tgz", + "dependencies": { + "balanced-match": { + "version": "0.2.1", + "from": "balanced-match@>=0.2.0 <0.3.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-0.2.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" + } + } + } + } + }, + "readable-stream": { + "version": "2.0.4", + "from": "readable-stream@>=2.0.2 <3.0.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.0.4.tgz", + "dependencies": { + "core-util-is": { + "version": "1.0.1", + "from": "core-util-is@>=1.0.0 <1.1.0", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.1.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": "0.0.1", + "from": "isarray@0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz" + }, + "process-nextick-args": { + "version": "1.0.3", + "from": "process-nextick-args@>=1.0.0 <1.1.0", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.3.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" + } + } + } + } + }, + "fsevents": { + "version": "1.0.2", + "from": "fsevents@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.0.2.tgz", + "dependencies": { + "nan": { + "version": "2.1.0", + "from": "nan@>=2.0.2 <3.0.0", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.1.0.tgz" + }, + "node-pre-gyp": { + "version": "0.6.12", + "from": "node-pre-gyp@0.6.12", + "resolved": "https://registry.npmjs.org/node-pre-gyp/-/node-pre-gyp-0.6.12.tgz", + "dependencies": { + "nopt": { + "version": "3.0.4", + "from": "nopt@~3.0.1", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.4.tgz", + "dependencies": { + "abbrev": { + "version": "1.0.7", + "from": "abbrev@1", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.0.7.tgz" + } + } + }, + "npmlog": { + "version": "1.2.1", + "from": "npmlog@~1.2.0", + "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-1.2.1.tgz", + "dependencies": { + "ansi": { + "version": "0.3.0", + "from": "ansi@~0.3.0", + "resolved": "https://registry.npmjs.org/ansi/-/ansi-0.3.0.tgz" + }, + "are-we-there-yet": { + "version": "1.0.4", + "from": "are-we-there-yet@~1.0.0", + "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.0.4.tgz", + "dependencies": { + "delegates": { + "version": "0.1.0", + "from": "delegates@^0.1.0", + "resolved": "https://registry.npmjs.org/delegates/-/delegates-0.1.0.tgz" + }, + "readable-stream": { + "version": "1.1.13", + "from": "readable-stream@^1.1.13", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.13.tgz", + "dependencies": { + "core-util-is": { + "version": "1.0.1", + "from": "core-util-is@~1.0.0", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.1.tgz" + }, + "isarray": { + "version": "0.0.1", + "from": "isarray@0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.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" + }, + "inherits": { + "version": "2.0.1", + "from": "inherits@2", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz" + } + } + } + } + }, + "gauge": { + "version": "1.2.2", + "from": "gauge@~1.2.0", + "resolved": "https://registry.npmjs.org/gauge/-/gauge-1.2.2.tgz", + "dependencies": { + "has-unicode": { + "version": "1.0.0", + "from": "has-unicode@^1.0.0", + "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-1.0.0.tgz" + }, + "lodash.pad": { + "version": "3.1.1", + "from": "lodash.pad@^3.0.0", + "resolved": "https://registry.npmjs.org/lodash.pad/-/lodash.pad-3.1.1.tgz", + "dependencies": { + "lodash._basetostring": { + "version": "3.0.1", + "from": "lodash._basetostring@^3.0.0", + "resolved": "https://registry.npmjs.org/lodash._basetostring/-/lodash._basetostring-3.0.1.tgz" + }, + "lodash._createpadding": { + "version": "3.6.1", + "from": "lodash._createpadding@^3.0.0", + "resolved": "https://registry.npmjs.org/lodash._createpadding/-/lodash._createpadding-3.6.1.tgz", + "dependencies": { + "lodash.repeat": { + "version": "3.0.1", + "from": "lodash.repeat@^3.0.0", + "resolved": "https://registry.npmjs.org/lodash.repeat/-/lodash.repeat-3.0.1.tgz" + } + } + } + } + }, + "lodash.padleft": { + "version": "3.1.1", + "from": "lodash.padleft@^3.0.0", + "resolved": "https://registry.npmjs.org/lodash.padleft/-/lodash.padleft-3.1.1.tgz", + "dependencies": { + "lodash._basetostring": { + "version": "3.0.1", + "from": "lodash._basetostring@^3.0.0", + "resolved": "https://registry.npmjs.org/lodash._basetostring/-/lodash._basetostring-3.0.1.tgz" + }, + "lodash._createpadding": { + "version": "3.6.1", + "from": "lodash._createpadding@^3.0.0", + "resolved": "https://registry.npmjs.org/lodash._createpadding/-/lodash._createpadding-3.6.1.tgz", + "dependencies": { + "lodash.repeat": { + "version": "3.0.1", + "from": "lodash.repeat@^3.0.0", + "resolved": "https://registry.npmjs.org/lodash.repeat/-/lodash.repeat-3.0.1.tgz" + } + } + } + } + }, + "lodash.padright": { + "version": "3.1.1", + "from": "lodash.padright@^3.0.0", + "resolved": "https://registry.npmjs.org/lodash.padright/-/lodash.padright-3.1.1.tgz", + "dependencies": { + "lodash._basetostring": { + "version": "3.0.1", + "from": "lodash._basetostring@^3.0.0", + "resolved": "https://registry.npmjs.org/lodash._basetostring/-/lodash._basetostring-3.0.1.tgz" + }, + "lodash._createpadding": { + "version": "3.6.1", + "from": "lodash._createpadding@^3.0.0", + "resolved": "https://registry.npmjs.org/lodash._createpadding/-/lodash._createpadding-3.6.1.tgz", + "dependencies": { + "lodash.repeat": { + "version": "3.0.1", + "from": "lodash.repeat@^3.0.0", + "resolved": "https://registry.npmjs.org/lodash.repeat/-/lodash.repeat-3.0.1.tgz" + } + } + } + } + } + } + } + } + }, + "request": { + "version": "2.64.0", + "from": "request@2.x", + "resolved": "https://registry.npmjs.org/request/-/request-2.64.0.tgz", + "dependencies": { + "bl": { + "version": "1.0.0", + "from": "bl@~1.0.0", + "resolved": "https://registry.npmjs.org/bl/-/bl-1.0.0.tgz", + "dependencies": { + "readable-stream": { + "version": "2.0.2", + "from": "readable-stream@~2.0.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.0.2.tgz", + "dependencies": { + "core-util-is": { + "version": "1.0.1", + "from": "core-util-is@~1.0.0", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.1.tgz" + }, + "inherits": { + "version": "2.0.1", + "from": "inherits@~2.0.1", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz" + }, + "isarray": { + "version": "0.0.1", + "from": "isarray@0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz" + }, + "process-nextick-args": { + "version": "1.0.3", + "from": "process-nextick-args@~1.0.0", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.3.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" + }, + "util-deprecate": { + "version": "1.0.1", + "from": "util-deprecate@~1.0.1", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.1.tgz" + } + } + } + } + }, + "caseless": { + "version": "0.11.0", + "from": "caseless@~0.11.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.11.0.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.0", + "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz" + }, + "form-data": { + "version": "1.0.0-rc3", + "from": "form-data@~1.0.0-rc1", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-1.0.0-rc3.tgz", + "dependencies": { + "async": { + "version": "1.4.2", + "from": "async@^1.4.0", + "resolved": "https://registry.npmjs.org/async/-/async-1.4.2.tgz" + } + } + }, + "json-stringify-safe": { + "version": "5.0.1", + "from": "json-stringify-safe@~5.0.0", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz" + }, + "mime-types": { + "version": "2.1.7", + "from": "mime-types@~2.1.2", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.7.tgz", + "dependencies": { + "mime-db": { + "version": "1.19.0", + "from": "mime-db@~1.19.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.19.0.tgz" + } + } + }, + "node-uuid": { + "version": "1.4.3", + "from": "node-uuid@~1.4.0", + "resolved": "https://registry.npmjs.org/node-uuid/-/node-uuid-1.4.3.tgz" + }, + "qs": { + "version": "5.1.0", + "from": "qs@~5.1.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-5.1.0.tgz" + }, + "tunnel-agent": { + "version": "0.4.1", + "from": "tunnel-agent@~0.4.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.4.1.tgz" + }, + "tough-cookie": { + "version": "2.1.0", + "from": "tough-cookie@>=0.12.0", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.1.0.tgz" + }, + "http-signature": { + "version": "0.11.0", + "from": "http-signature@~0.11.0", + "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", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-0.1.5.tgz" + }, + "asn1": { + "version": "0.1.11", + "from": "asn1@0.1.11", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.1.11.tgz" + }, + "ctype": { + "version": "0.5.3", + "from": "ctype@0.5.3", + "resolved": "https://registry.npmjs.org/ctype/-/ctype-0.5.3.tgz" + } + } + }, + "oauth-sign": { + "version": "0.8.0", + "from": "oauth-sign@~0.8.0", + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.8.0.tgz" + }, + "hawk": { + "version": "3.1.0", + "from": "hawk@~3.1.0", + "resolved": "https://registry.npmjs.org/hawk/-/hawk-3.1.0.tgz", + "dependencies": { + "hoek": { + "version": "2.16.3", + "from": "hoek@2.x.x", + "resolved": "https://registry.npmjs.org/hoek/-/hoek-2.16.3.tgz" + }, + "boom": { + "version": "2.9.0", + "from": "boom@^2.8.x", + "resolved": "https://registry.npmjs.org/boom/-/boom-2.9.0.tgz" + }, + "cryptiles": { + "version": "2.0.5", + "from": "cryptiles@2.x.x", + "resolved": "https://registry.npmjs.org/cryptiles/-/cryptiles-2.0.5.tgz" + }, + "sntp": { + "version": "1.0.9", + "from": "sntp@1.x.x", + "resolved": "https://registry.npmjs.org/sntp/-/sntp-1.0.9.tgz" + } + } + }, + "aws-sign2": { + "version": "0.5.0", + "from": "aws-sign2@~0.5.0", + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.5.0.tgz" + }, + "stringstream": { + "version": "0.0.4", + "from": "stringstream@~0.0.4", + "resolved": "https://registry.npmjs.org/stringstream/-/stringstream-0.0.4.tgz" + }, + "combined-stream": { + "version": "1.0.5", + "from": "combined-stream@~1.0.1", + "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", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz" + } + } + }, + "isstream": { + "version": "0.1.2", + "from": "isstream@~0.1.1", + "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz" + }, + "har-validator": { + "version": "1.8.0", + "from": "har-validator@^1.6.1", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-1.8.0.tgz", + "dependencies": { + "bluebird": { + "version": "2.10.2", + "from": "bluebird@^2.9.30", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-2.10.2.tgz" + }, + "chalk": { + "version": "1.1.1", + "from": "chalk@^1.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.1.tgz", + "dependencies": { + "ansi-styles": { + "version": "2.1.0", + "from": "ansi-styles@^2.1.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.1.0.tgz" + }, + "escape-string-regexp": { + "version": "1.0.3", + "from": "escape-string-regexp@^1.0.2", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.3.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", + "dependencies": { + "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" + } + } + }, + "strip-ansi": { + "version": "3.0.0", + "from": "strip-ansi@^3.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.0.tgz", + "dependencies": { + "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" + } + } + }, + "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" + } + } + }, + "commander": { + "version": "2.8.1", + "from": "commander@^2.8.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.8.1.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.12.2", + "from": "is-my-json-valid@^2.12.0", + "resolved": "https://registry.npmjs.org/is-my-json-valid/-/is-my-json-valid-2.12.2.tgz", + "dependencies": { + "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", + "dependencies": { + "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" + } + } + }, + "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.0", + "from": "xtend@^4.0.0", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.0.tgz" + } + } + } + } + } + } + }, + "semver": { + "version": "5.0.3", + "from": "semver@~5.0.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.0.3.tgz" + }, + "tar": { + "version": "2.2.1", + "from": "tar@~2.2.0", + "resolved": "https://registry.npmjs.org/tar/-/tar-2.2.1.tgz", + "dependencies": { + "block-stream": { + "version": "0.0.8", + "from": "block-stream@*", + "resolved": "https://registry.npmjs.org/block-stream/-/block-stream-0.0.8.tgz" + }, + "fstream": { + "version": "1.0.8", + "from": "fstream@^1.0.2", + "resolved": "https://registry.npmjs.org/fstream/-/fstream-1.0.8.tgz", + "dependencies": { + "graceful-fs": { + "version": "4.1.2", + "from": "graceful-fs@^4.1.2", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.2.tgz" + } + } + }, + "inherits": { + "version": "2.0.1", + "from": "inherits@2", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz" + } + } + }, + "tar-pack": { + "version": "2.0.0", + "from": "tar-pack@~2.0.0", + "resolved": "https://registry.npmjs.org/tar-pack/-/tar-pack-2.0.0.tgz", + "dependencies": { + "uid-number": { + "version": "0.0.3", + "from": "uid-number@0.0.3", + "resolved": "https://registry.npmjs.org/uid-number/-/uid-number-0.0.3.tgz" + }, + "once": { + "version": "1.1.1", + "from": "once@~1.1.1", + "resolved": "https://registry.npmjs.org/once/-/once-1.1.1.tgz" + }, + "debug": { + "version": "0.7.4", + "from": "debug@~0.7.2", + "resolved": "https://registry.npmjs.org/debug/-/debug-0.7.4.tgz" + }, + "rimraf": { + "version": "2.2.8", + "from": "rimraf@~2.2.0", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.2.8.tgz" + }, + "fstream": { + "version": "0.1.31", + "from": "fstream@~0.1.22", + "resolved": "https://registry.npmjs.org/fstream/-/fstream-0.1.31.tgz", + "dependencies": { + "graceful-fs": { + "version": "3.0.8", + "from": "graceful-fs@~3.0.2", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-3.0.8.tgz" + }, + "inherits": { + "version": "2.0.1", + "from": "inherits@~2.0.0", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz" + } + } + }, + "tar": { + "version": "0.1.20", + "from": "tar@~0.1.17", + "resolved": "https://registry.npmjs.org/tar/-/tar-0.1.20.tgz", + "dependencies": { + "block-stream": { + "version": "0.0.8", + "from": "block-stream@*", + "resolved": "https://registry.npmjs.org/block-stream/-/block-stream-0.0.8.tgz" + }, + "inherits": { + "version": "2.0.1", + "from": "inherits@2", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz" + } + } + }, + "fstream-ignore": { + "version": "0.0.7", + "from": "fstream-ignore@0.0.7", + "resolved": "https://registry.npmjs.org/fstream-ignore/-/fstream-ignore-0.0.7.tgz", + "dependencies": { + "minimatch": { + "version": "0.2.14", + "from": "minimatch@~0.2.0", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-0.2.14.tgz", + "dependencies": { + "lru-cache": { + "version": "2.7.0", + "from": "lru-cache@2", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-2.7.0.tgz" + }, + "sigmund": { + "version": "1.0.1", + "from": "sigmund@~1.0.0", + "resolved": "https://registry.npmjs.org/sigmund/-/sigmund-1.0.1.tgz" + } + } + }, + "inherits": { + "version": "2.0.1", + "from": "inherits@~2.0.1", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz" + } + } + }, + "readable-stream": { + "version": "1.0.33", + "from": "readable-stream@~1.0.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.33.tgz", + "dependencies": { + "core-util-is": { + "version": "1.0.1", + "from": "core-util-is@~1.0.0", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.1.tgz" + }, + "isarray": { + "version": "0.0.1", + "from": "isarray@0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.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" + }, + "inherits": { + "version": "2.0.1", + "from": "inherits@~2.0.1", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz" + } + } + }, + "graceful-fs": { + "version": "1.2.3", + "from": "graceful-fs@1.2", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-1.2.3.tgz" + } + } + }, + "mkdirp": { + "version": "0.5.1", + "from": "mkdirp@~0.5.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" + } + } + }, + "rc": { + "version": "1.1.2", + "from": "rc@~1.1.0", + "resolved": "https://registry.npmjs.org/rc/-/rc-1.1.2.tgz", + "dependencies": { + "minimist": { + "version": "1.2.0", + "from": "minimist@^1.1.2", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz" + }, + "deep-extend": { + "version": "0.2.11", + "from": "deep-extend@~0.2.5", + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.2.11.tgz" + }, + "strip-json-comments": { + "version": "0.1.3", + "from": "strip-json-comments@0.1.x", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-0.1.3.tgz" + }, + "ini": { + "version": "1.3.4", + "from": "ini@~1.3.0", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.4.tgz" + } + } + }, + "rimraf": { + "version": "2.4.3", + "from": "rimraf@~2.4.0", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.4.3.tgz", + "dependencies": { + "glob": { + "version": "5.0.15", + "from": "glob@^5.0.14", + "resolved": "https://registry.npmjs.org/glob/-/glob-5.0.15.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.0.1", + "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.1", + "from": "brace-expansion@^1.0.0", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.1.tgz", + "dependencies": { + "balanced-match": { + "version": "0.2.0", + "from": "balanced-match@^0.2.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-0.2.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.2", + "from": "once@^1.3.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.3.2.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" + } + } + } + } + } + } + } + } + } + } + }, + "debug": { + "version": "2.2.0", + "from": "debug@>=2.2.0 <3.0.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.2.0.tgz", + "dependencies": { + "ms": { + "version": "0.7.1", + "from": "ms@0.7.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.1.tgz" + } + } + }, + "es6-promise": { + "version": "3.0.2", + "from": "es6-promise@>=3.0.2 <4.0.0", + "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-3.0.2.tgz" + }, + "lodash.defaults": { + "version": "3.1.2", + "from": "lodash.defaults@>=3.1.2 <4.0.0", + "resolved": "https://registry.npmjs.org/lodash.defaults/-/lodash.defaults-3.1.2.tgz", + "dependencies": { + "lodash.assign": { + "version": "3.2.0", + "from": "lodash.assign@>=3.0.0 <4.0.0", + "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", + "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", + "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", + "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", + "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", + "resolved": "https://registry.npmjs.org/lodash._isiterateecall/-/lodash._isiterateecall-3.0.9.tgz" + } + } + }, + "lodash.keys": { + "version": "3.1.2", + "from": "lodash.keys@>=3.0.0 <4.0.0", + "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", + "resolved": "https://registry.npmjs.org/lodash._getnative/-/lodash._getnative-3.9.1.tgz" + }, + "lodash.isarguments": { + "version": "3.0.4", + "from": "lodash.isarguments@>=3.0.0 <4.0.0", + "resolved": "https://registry.npmjs.org/lodash.isarguments/-/lodash.isarguments-3.0.4.tgz" + }, + "lodash.isarray": { + "version": "3.0.4", + "from": "lodash.isarray@>=3.0.0 <4.0.0", + "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", + "resolved": "https://registry.npmjs.org/lodash.restparam/-/lodash.restparam-3.6.1.tgz" + } + } + }, + "minimatch": { + "version": "3.0.0", + "from": "minimatch@>=2.0.0 <3.0.0||>=3.0.0 <4.0.0", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.0.tgz", + "dependencies": { + "brace-expansion": { + "version": "1.1.1", + "from": "brace-expansion@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.1.tgz", + "dependencies": { + "balanced-match": { + "version": "0.2.1", + "from": "balanced-match@>=0.2.0 <0.3.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-0.2.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" + } + } + } + } + }, + "ps-tree": { + "version": "1.0.1", + "from": "ps-tree@>=1.0.1 <2.0.0", + "resolved": "https://registry.npmjs.org/ps-tree/-/ps-tree-1.0.1.tgz", + "dependencies": { + "event-stream": { + "version": "3.3.2", + "from": "event-stream@>=3.3.0 <3.4.0", + "resolved": "https://registry.npmjs.org/event-stream/-/event-stream-3.3.2.tgz", + "dependencies": { + "through": { + "version": "2.3.8", + "from": "through@>=2.3.1 <2.4.0", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz" + }, + "duplexer": { + "version": "0.1.1", + "from": "duplexer@>=0.1.1 <0.2.0", + "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.1.tgz" + }, + "from": { + "version": "0.1.3", + "from": "from@>=0.0.0 <1.0.0", + "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", + "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", + "resolved": "https://registry.npmjs.org/pause-stream/-/pause-stream-0.0.11.tgz" + }, + "split": { + "version": "0.3.3", + "from": "split@>=0.3.0 <0.4.0", + "resolved": "https://registry.npmjs.org/split/-/split-0.3.3.tgz" + }, + "stream-combiner": { + "version": "0.0.4", + "from": "stream-combiner@>=0.0.4 <0.1.0", + "resolved": "https://registry.npmjs.org/stream-combiner/-/stream-combiner-0.0.4.tgz" + } + } + } + } + }, + "touch": { + "version": "1.0.0", + "from": "touch@1.0.0", + "resolved": "https://registry.npmjs.org/touch/-/touch-1.0.0.tgz", + "dependencies": { + "nopt": { + "version": "1.0.10", + "from": "nopt@>=1.0.10 <1.1.0", + "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", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.0.7.tgz" + } + } + } + } + }, + "undefsafe": { + "version": "0.0.3", + "from": "undefsafe@0.0.3", + "resolved": "https://registry.npmjs.org/undefsafe/-/undefsafe-0.0.3.tgz" + }, + "update-notifier": { + "version": "0.5.0", + "from": "update-notifier@0.5.0", + "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-0.5.0.tgz", + "dependencies": { + "configstore": { + "version": "1.3.0", + "from": "configstore@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/configstore/-/configstore-1.3.0.tgz", + "dependencies": { + "graceful-fs": { + "version": "4.1.2", + "from": "graceful-fs@>=4.1.2 <5.0.0", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.2.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", + "dependencies": { + "minimist": { + "version": "0.0.8", + "from": "minimist@0.0.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz" + } + } + }, + "object-assign": { + "version": "4.0.1", + "from": "object-assign@>=4.0.1 <5.0.0", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.0.1.tgz" + }, + "os-tmpdir": { + "version": "1.0.1", + "from": "os-tmpdir@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.1.tgz" + }, + "osenv": { + "version": "0.1.3", + "from": "osenv@>=0.1.0 <0.2.0", + "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.3.tgz", + "dependencies": { + "os-homedir": { + "version": "1.0.1", + "from": "os-homedir@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.1.tgz" + } + } + }, + "uuid": { + "version": "2.0.1", + "from": "uuid@>=2.0.1 <3.0.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-2.0.1.tgz" + }, + "write-file-atomic": { + "version": "1.1.3", + "from": "write-file-atomic@>=1.1.2 <2.0.0", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-1.1.3.tgz", + "dependencies": { + "slide": { + "version": "1.1.6", + "from": "slide@>=1.1.5 <2.0.0", + "resolved": "https://registry.npmjs.org/slide/-/slide-1.1.6.tgz" + } + } + }, + "xdg-basedir": { + "version": "2.0.0", + "from": "xdg-basedir@>=2.0.0 <3.0.0", + "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-2.0.0.tgz", + "dependencies": { + "os-homedir": { + "version": "1.0.1", + "from": "os-homedir@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.1.tgz" + } + } + } + } + }, + "is-npm": { + "version": "1.0.0", + "from": "is-npm@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-1.0.0.tgz" + }, + "latest-version": { + "version": "1.0.1", + "from": "latest-version@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-1.0.1.tgz", + "dependencies": { + "package-json": { + "version": "1.2.0", + "from": "package-json@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/package-json/-/package-json-1.2.0.tgz", + "dependencies": { + "got": { + "version": "3.3.1", + "from": "got@>=3.2.0 <4.0.0", + "resolved": "https://registry.npmjs.org/got/-/got-3.3.1.tgz", + "dependencies": { + "duplexify": { + "version": "3.4.2", + "from": "duplexify@>=3.2.0 <4.0.0", + "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.4.2.tgz", + "dependencies": { + "end-of-stream": { + "version": "1.0.0", + "from": "end-of-stream@1.0.0", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.0.0.tgz", + "dependencies": { + "once": { + "version": "1.3.2", + "from": "once@>=1.3.0 <1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.3.2.tgz", + "dependencies": { + "wrappy": { + "version": "1.0.1", + "from": "wrappy@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.1.tgz" + } + } + } + } + }, + "readable-stream": { + "version": "2.0.4", + "from": "readable-stream@>=2.0.0 <3.0.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.0.4.tgz", + "dependencies": { + "core-util-is": { + "version": "1.0.1", + "from": "core-util-is@>=1.0.0 <1.1.0", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.1.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": "0.0.1", + "from": "isarray@0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz" + }, + "process-nextick-args": { + "version": "1.0.3", + "from": "process-nextick-args@>=1.0.0 <1.1.0", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.3.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" + } + } + } + } + }, + "infinity-agent": { + "version": "2.0.3", + "from": "infinity-agent@>=2.0.0 <3.0.0", + "resolved": "https://registry.npmjs.org/infinity-agent/-/infinity-agent-2.0.3.tgz" + }, + "is-redirect": { + "version": "1.0.0", + "from": "is-redirect@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/is-redirect/-/is-redirect-1.0.0.tgz" + }, + "is-stream": { + "version": "1.0.1", + "from": "is-stream@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.0.1.tgz" + }, + "lowercase-keys": { + "version": "1.0.0", + "from": "lowercase-keys@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.0.tgz" + }, + "nested-error-stacks": { + "version": "1.0.1", + "from": "nested-error-stacks@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/nested-error-stacks/-/nested-error-stacks-1.0.1.tgz", + "dependencies": { + "inherits": { + "version": "2.0.1", + "from": "inherits@>=2.0.1 <2.1.0", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz" + } + } + }, + "object-assign": { + "version": "3.0.0", + "from": "object-assign@>=3.0.0 <4.0.0", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-3.0.0.tgz" + }, + "prepend-http": { + "version": "1.0.3", + "from": "prepend-http@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.3.tgz" + }, + "read-all-stream": { + "version": "3.0.1", + "from": "read-all-stream@>=3.0.0 <4.0.0", + "resolved": "https://registry.npmjs.org/read-all-stream/-/read-all-stream-3.0.1.tgz", + "dependencies": { + "pinkie-promise": { + "version": "1.0.0", + "from": "pinkie-promise@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-1.0.0.tgz", + "dependencies": { + "pinkie": { + "version": "1.0.0", + "from": "pinkie@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-1.0.0.tgz" + } + } + }, + "readable-stream": { + "version": "2.0.4", + "from": "readable-stream@>=2.0.0 <3.0.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.0.4.tgz", + "dependencies": { + "core-util-is": { + "version": "1.0.1", + "from": "core-util-is@>=1.0.0 <1.1.0", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.1.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": "0.0.1", + "from": "isarray@0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz" + }, + "process-nextick-args": { + "version": "1.0.3", + "from": "process-nextick-args@>=1.0.0 <1.1.0", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.3.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" + } + } + } + } + }, + "timed-out": { + "version": "2.0.0", + "from": "timed-out@>=2.0.0 <3.0.0", + "resolved": "https://registry.npmjs.org/timed-out/-/timed-out-2.0.0.tgz" + } + } + }, + "registry-url": { + "version": "3.0.3", + "from": "registry-url@>=3.0.0 <4.0.0", + "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-3.0.3.tgz", + "dependencies": { + "rc": { + "version": "1.1.2", + "from": "rc@>=1.0.1 <2.0.0", + "resolved": "https://registry.npmjs.org/rc/-/rc-1.1.2.tgz", + "dependencies": { + "deep-extend": { + "version": "0.2.11", + "from": "deep-extend@>=0.2.5 <0.3.0", + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.2.11.tgz" + }, + "strip-json-comments": { + "version": "0.1.3", + "from": "strip-json-comments@>=0.1.0 <0.2.0", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-0.1.3.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" + } + } + } + } + } + } + } + } + }, + "repeating": { + "version": "1.1.3", + "from": "repeating@>=1.1.2 <2.0.0", + "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", + "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", + "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.0.tgz" + } + } + } + } + }, + "semver-diff": { + "version": "2.0.0", + "from": "semver-diff@>=2.0.0 <3.0.0", + "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-2.0.0.tgz", + "dependencies": { + "semver": { + "version": "4.3.6", + "from": "semver@>=4.0.0 <5.0.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-4.3.6.tgz" + } + } + }, + "string-length": { + "version": "1.0.1", + "from": "string-length@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/string-length/-/string-length-1.0.1.tgz", + "dependencies": { + "strip-ansi": { + "version": "3.0.0", + "from": "strip-ansi@>=3.0.0 <4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.0.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" + } + } + } + } + } + } + } + } + }, + "rimraf": { + "version": "2.4.3", + "from": "rimraf@2.4.3", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.4.3.tgz" + }, + "semver": { + "version": "5.0.3", + "from": "semver@5.0.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.0.3.tgz" + }, + "shelljs": { + "version": "0.5.3", + "from": "shelljs@0.5.3", + "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.5.3.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" + } + } + }, + "cz-conventional-changelog": { + "version": "1.1.4", + "from": "cz-conventional-changelog@*", + "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", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.1.0.tgz" + } + } + }, "dgeni": { "version": "0.4.1", "from": "https://registry.npmjs.org/dgeni/-/dgeni-0.4.1.tgz", @@ -3487,96 +8298,96 @@ "dependencies": { "dependency-graph": { "version": "0.1.0", - "from": "dependency-graph@>=0.1.0 <0.2.0", + "from": "https://registry.npmjs.org/dependency-graph/-/dependency-graph-0.1.0.tgz", "resolved": "https://registry.npmjs.org/dependency-graph/-/dependency-graph-0.1.0.tgz", "dependencies": { "underscore": { "version": "1.4.4", - "from": "underscore@1.4.4", + "from": "https://registry.npmjs.org/underscore/-/underscore-1.4.4.tgz", "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.4.4.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" }, "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": "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" }, "validate.js": { "version": "0.2.0", - "from": "validate.js@>=0.2.0 <0.3.0", + "from": "https://registry.npmjs.org/validate.js/-/validate.js-0.2.0.tgz", "resolved": "https://registry.npmjs.org/validate.js/-/validate.js-0.2.0.tgz" }, "winston": { "version": "0.7.3", - "from": "winston@>=0.7.2 <0.8.0", + "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": "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" }, "pkginfo": { "version": "0.3.0", - "from": "pkginfo@>=0.3.0 <0.4.0", + "from": "https://registry.npmjs.org/pkginfo/-/pkginfo-0.3.0.tgz", "resolved": "https://registry.npmjs.org/pkginfo/-/pkginfo-0.3.0.tgz" }, "request": { "version": "2.16.6", - "from": "request@>=2.16.0 <2.17.0", + "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": "form-data@>=0.0.3 <0.1.0", + "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": "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" } } @@ -3585,81 +8396,81 @@ }, "mime": { "version": "1.2.11", - "from": "mime@>=1.2.7 <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" }, "hawk": { "version": "0.10.2", - "from": "hawk@>=0.10.2 <0.11.0", + "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": "hoek@>=0.7.0 <0.8.0", + "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": "boom@>=0.3.0 <0.4.0", + "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": "cryptiles@>=0.1.0 <0.2.0", + "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": "sntp@>=0.1.0 <0.2.0", + "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.3", - "from": "node-uuid@>=1.4.0 <1.5.0", + "from": "https://registry.npmjs.org/node-uuid/-/node-uuid-1.4.3.tgz", "resolved": "https://registry.npmjs.org/node-uuid/-/node-uuid-1.4.3.tgz" }, "cookie-jar": { "version": "0.2.0", - "from": "cookie-jar@>=0.2.0 <0.3.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": "aws-sign@>=0.2.0 <0.3.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": "oauth-sign@>=0.2.0 <0.3.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": "forever-agent@>=0.2.0 <0.3.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": "tunnel-agent@>=0.2.0 <0.3.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": "json-stringify-safe@>=3.0.0 <3.1.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": "qs@>=0.5.4 <0.6.0", + "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": "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" } } @@ -3667,8 +8478,9 @@ } }, "dgeni-packages": { - "version": "0.10.19", - "from": "dgeni-packages@0.10.19", + "version": "0.11.0", + "from": "dgeni-packages@0.11.0", + "resolved": "https://registry.npmjs.org/dgeni-packages/-/dgeni-packages-0.11.0.tgz", "dependencies": { "catharsis": { "version": "0.8.7", @@ -3695,9 +8507,9 @@ "resolved": "https://registry.npmjs.org/change-case/-/change-case-2.3.0.tgz", "dependencies": { "camel-case": { - "version": "1.1.2", + "version": "1.2.0", "from": "camel-case@>=1.1.1 <2.0.0", - "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-1.1.2.tgz" + "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-1.2.0.tgz" }, "constant-case": { "version": "1.1.1", @@ -3776,15 +8588,15 @@ } } }, - "esprima": { - "version": "1.2.5", - "from": "esprima@>=1.0.4 <2.0.0", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-1.2.5.tgz" + "espree": { + "version": "2.2.5", + "from": "espree@>=2.2.3 <3.0.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-2.2.5.tgz" }, "estraverse": { - "version": "1.9.3", - "from": "estraverse@>=1.5.1 <2.0.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-1.9.3.tgz" + "version": "4.1.1", + "from": "estraverse@>=4.1.0 <5.0.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.1.1.tgz" }, "glob": { "version": "3.2.11", @@ -3877,9 +8689,9 @@ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-0.3.0.tgz", "dependencies": { "lru-cache": { - "version": "2.6.5", + "version": "2.7.0", "from": "lru-cache@>=2.0.0 <3.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-2.6.5.tgz" + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-2.7.0.tgz" }, "sigmund": { "version": "1.0.1", @@ -3931,9 +8743,9 @@ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-0.2.14.tgz", "dependencies": { "lru-cache": { - "version": "2.6.5", + "version": "2.7.0", "from": "lru-cache@>=2.0.0 <3.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-2.6.5.tgz" + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-2.7.0.tgz" }, "sigmund": { "version": "1.0.1", @@ -3982,9 +8794,9 @@ "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-0.3.8.tgz", "dependencies": { "nan": { - "version": "2.0.5", + "version": "2.1.0", "from": "nan@>=2.0.2 <3.0.0", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.0.5.tgz" + "resolved": "https://registry.npmjs.org/nan/-/nan-2.1.0.tgz" } } } @@ -4072,9 +8884,9 @@ "resolved": "https://registry.npmjs.org/eyes/-/eyes-0.1.8.tgz" }, "pkginfo": { - "version": "0.3.0", + "version": "0.3.1", "from": "pkginfo@>=0.3.0 <0.4.0", - "resolved": "https://registry.npmjs.org/pkginfo/-/pkginfo-0.3.0.tgz" + "resolved": "https://registry.npmjs.org/pkginfo/-/pkginfo-0.3.1.tgz" }, "request": { "version": "2.16.6", @@ -5803,7 +10615,7 @@ "dependencies": { "wrappy": { "version": "1.0.1", - "from": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.1.tgz", + "from": "wrappy@>=1.0.0 <2.0.0", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.1.tgz" } } @@ -5820,7 +10632,7 @@ "dependencies": { "wrappy": { "version": "1.0.1", - "from": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.1.tgz", + "from": "wrappy@>=1.0.0 <2.0.0", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.1.tgz" } } @@ -5991,7 +10803,7 @@ }, "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" }, "inherits": { @@ -7319,7 +12131,7 @@ }, "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" }, "inherits": { diff --git a/package.json b/package.json index 93503ac37fea..7481bee600eb 100644 --- a/package.json +++ b/package.json @@ -13,6 +13,11 @@ "npm": "~2.5" }, "engineStrict": true, + "scripts": { + "preinstall": "node scripts/npm/check-node-modules.js --purge", + "postinstall": "node scripts/npm/copy-npm-shrinkwrap.js", + "commit": "git-cz" + }, "devDependencies": { "angular-benchpress": "0.x.x", "benchmark": "1.x.x", @@ -20,8 +25,10 @@ "browserstacktunnel-wrapper": "~1.3.1", "canonical-path": "0.0.2", "cheerio": "^0.17.0", + "commitizen": "^2.3.0", + "cz-conventional-changelog": "^1.1.4", "dgeni": "^0.4.0", - "dgeni-packages": "^0.10.0", + "dgeni-packages": "^0.11.0", "event-stream": "~3.1.0", "grunt": "~0.4.2", "grunt-bump": "~0.0.13", @@ -76,5 +83,10 @@ "url": "https://github.com/angular/angular.js/blob/master/LICENSE" } ], - "dependencies": {} + "dependencies": {}, + "config": { + "commitizen": { + "path": "node_modules/cz-conventional-changelog" + } + } } diff --git a/protractor-conf.js b/protractor-conf.js index 8fad56be8828..3c3421ce780f 100644 --- a/protractor-conf.js +++ b/protractor-conf.js @@ -9,7 +9,7 @@ config.specs = [ ]; config.capabilities = { - browserName: 'chrome', + browserName: 'chrome' }; exports.config = config; diff --git a/scripts/bower/publish.sh b/scripts/bower/publish.sh index 0024b86066b1..766cc82ce721 100755 --- a/scripts/bower/publish.sh +++ b/scripts/bower/publish.sh @@ -14,8 +14,9 @@ function init { TMP_DIR=$(resolveDir ../../tmp) BUILD_DIR=$(resolveDir ../../build) NEW_VERSION=$(cat $BUILD_DIR/version.txt) + PROJECT_DIR=$(resolveDir ../..) # get the npm dist-tag from a custom property (distTag) in package.json - DIST_TAG=$(readJsonProp "package.json" "distTag") + DIST_TAG=$(readJsonProp "$PROJECT_DIR/package.json" "distTag") } diff --git a/scripts/npm/check-node-modules.js b/scripts/npm/check-node-modules.js new file mode 100644 index 000000000000..a9bc24a9a593 --- /dev/null +++ b/scripts/npm/check-node-modules.js @@ -0,0 +1,74 @@ +// Implementation based on: +// https://github.com/angular/angular/blob/3b9c08676a4c921bbfa847802e08566fb601ba7a/tools/npm/check-node-modules.js +'use strict'; + +// Imports +var fs = require('fs'); +var path = require('path'); + +// Constants +var PROJECT_ROOT = path.join(__dirname, '../../'); +var NODE_MODULES_DIR = 'node_modules'; +var NPM_SHRINKWRAP_FILE = 'npm-shrinkwrap.json'; +var NPM_SHRINKWRAP_CACHED_FILE = NODE_MODULES_DIR + '/npm-shrinkwrap.cached.json'; + +// Run +_main(); + +// Functions - Definitions +function _main() { + var purgeIfStale = process.argv.indexOf('--purge') !== -1; + + process.chdir(PROJECT_ROOT); + checkNodeModules(purgeIfStale); +} + +function checkNodeModules(purgeIfStale) { + var nodeModulesOk = compareMarkerFiles(NPM_SHRINKWRAP_FILE, NPM_SHRINKWRAP_CACHED_FILE); + + if (nodeModulesOk) { + console.log(':-) npm dependencies are looking good!'); + } else if (purgeIfStale) { + console.log(':-( npm dependencies are stale or in an unknown state!'); + console.log(' Purging \'' + NODE_MODULES_DIR + '\'...'); + deleteDirSync(NODE_MODULES_DIR); + } else { + var separator = new Array(81).join('!'); + + console.warn(separator); + console.warn(':-( npm dependencies are stale or in an unknown state!'); + console.warn('You can rebuild the dependencies by running `npm install`.'); + console.warn(separator); + } + + return nodeModulesOk; +} + +function compareMarkerFiles(markerFilePath, cachedMarkerFilePath) { + if (!fs.existsSync(cachedMarkerFilePath)) return false; + + var opts = {encoding: 'utf-8'}; + var markerContent = fs.readFileSync(markerFilePath, opts); + var cachedMarkerContent = fs.readFileSync(cachedMarkerFilePath, opts); + + return markerContent === cachedMarkerContent; +} + +// Custom implementation of `rm -rf` that works consistently across OSes +function deleteDirSync(path) { + if (fs.existsSync(path)) { + fs.readdirSync(path).forEach(deleteDirOrFileSync); + fs.rmdirSync(path); + } + + // Helpers + function deleteDirOrFileSync(subpath) { + var curPath = path + '/' + subpath; + + if (fs.lstatSync(curPath).isDirectory()) { + deleteDirSync(curPath); + } else { + fs.unlinkSync(curPath); + } + } +} diff --git a/scripts/npm/copy-npm-shrinkwrap.js b/scripts/npm/copy-npm-shrinkwrap.js new file mode 100644 index 000000000000..78bfe3baaafa --- /dev/null +++ b/scripts/npm/copy-npm-shrinkwrap.js @@ -0,0 +1,60 @@ +'use strict'; + +// Imports +var fs = require('fs'); +var path = require('path'); + +// Constants +var PROJECT_ROOT = path.join(__dirname, '../../'); +var NODE_MODULES_DIR = 'node_modules'; +var NPM_SHRINKWRAP_FILE = 'npm-shrinkwrap.json'; +var NPM_SHRINKWRAP_CACHED_FILE = NODE_MODULES_DIR + '/npm-shrinkwrap.cached.json'; + +// Run +_main(); + +// Functions - Definitions +function _main() { + process.chdir(PROJECT_ROOT); + copyFile(NPM_SHRINKWRAP_FILE, NPM_SHRINKWRAP_CACHED_FILE, onCopied); +} + +// Implementation based on: +// https://stackoverflow.com/questions/11293857/fastest-way-to-copy-file-in-node-js#answer-21995878 +function copyFile(srcPath, dstPath, callback) { + var callbackCalled = false; + + if (!fs.existsSync(srcPath)) { + done(new Error('Missing source file: ' + srcPath)); + return; + } + + var rs = fs.createReadStream(srcPath); + rs.on('error', done); + + var ws = fs.createWriteStream(dstPath); + ws.on('error', done); + ws.on('finish', done); + + rs.pipe(ws); + + // Helpers + function done(err) { + if (callback && !callbackCalled) { + callbackCalled = true; + callback(err); + } + } +} + +function onCopied(err) { + if (err) { + var separator = new Array(81).join('!'); + + console.error(separator); + console.error( + 'Failed to copy `' + NPM_SHRINKWRAP_FILE + '` to `' + NPM_SHRINKWRAP_CACHED_FILE + '`:'); + console.error(err); + console.error(separator); + } +} diff --git a/scripts/npm/install-dependencies.sh b/scripts/npm/install-dependencies.sh deleted file mode 100755 index 1851d4ea6ae4..000000000000 --- a/scripts/npm/install-dependencies.sh +++ /dev/null @@ -1,16 +0,0 @@ -#!/bin/bash - -set -e - -SHRINKWRAP_FILE=npm-shrinkwrap.json -SHRINKWRAP_CACHED_FILE=node_modules/npm-shrinkwrap.cached.json - -if diff -q $SHRINKWRAP_FILE $SHRINKWRAP_CACHED_FILE; then - echo 'No shrinkwrap changes detected. npm install will be skipped...'; -else - echo 'Blowing away node_modules and reinstalling npm dependencies...' - rm -rf node_modules - npm install - cp $SHRINKWRAP_FILE $SHRINKWRAP_CACHED_FILE - echo 'npm install successful!' -fi diff --git a/scripts/travis/tear_down_browser_provider.sh b/scripts/travis/tear_down_browser_provider.sh new file mode 100755 index 000000000000..1b1b7314cf5f --- /dev/null +++ b/scripts/travis/tear_down_browser_provider.sh @@ -0,0 +1,4 @@ +#!/bin/bash +# Has to be run from project root directory. + +./lib/${BROWSER_PROVIDER}/teardown_tunnel.sh diff --git a/src/Angular.js b/src/Angular.js index fdd72ecf6883..0e437ad9044f 100644 --- a/src/Angular.js +++ b/src/Angular.js @@ -198,20 +198,24 @@ msie = document.documentMode; * String ...) */ function isArrayLike(obj) { - if (obj == null || isWindow(obj)) { - return false; - } + + // `null`, `undefined` and `window` are not array-like + if (obj == null || isWindow(obj)) return false; + + // arrays, strings and jQuery/jqLite objects are array like + // * jqLite is either the jQuery or jqLite constructor function + // * we have to check the existance of jqLite first as this method is called + // via the forEach method when constructing the jqLite object in the first place + if (isArray(obj) || isString(obj) || (jqLite && obj instanceof jqLite)) return true; // Support: iOS 8.2 (not reproducible in simulator) // "length" in obj used to prevent JIT error (gh-11508) var length = "length" in Object(obj) && obj.length; - if (obj.nodeType === NODE_TYPE_ELEMENT && length) { - return true; - } - - return isString(obj) || isArray(obj) || length === 0 || - typeof length === 'number' && length > 0 && (length - 1) in obj; + // NodeList objects (with `item` method) and + // other objects with suitable length characteristics are array-like + return isNumber(length) && + (length >= 0 && (length - 1) in obj || typeof obj.item == 'function'); } /** @@ -356,6 +360,10 @@ function baseExtend(dst, objs, deep) { dst[key] = new Date(src.valueOf()); } else if (isRegExp(src)) { dst[key] = new RegExp(src); + } else if (src.nodeName) { + dst[key] = src.cloneNode(true); + } else if (isElement(src)) { + dst[key] = src.clone(); } else { if (!isObject(dst[key])) dst[key] = isArray(src) ? [] : {}; baseExtend(dst[key], [src], true); @@ -471,7 +479,7 @@ identity.$inject = []; function valueFn(value) {return function() {return value;};} function hasCustomToString(obj) { - return isFunction(obj.toString) && obj.toString !== Object.prototype.toString; + return isFunction(obj.toString) && obj.toString !== toString; } @@ -670,9 +678,9 @@ function isPromiseLike(obj) { } -var TYPED_ARRAY_REGEXP = /^\[object (Uint8(Clamped)?)|(Uint16)|(Uint32)|(Int8)|(Int16)|(Int32)|(Float(32)|(64))Array\]$/; +var TYPED_ARRAY_REGEXP = /^\[object (?:Uint8|Uint8Clamped|Uint16|Uint32|Int8|Int16|Int32|Float32|Float64)Array\]$/; function isTypedArray(value) { - return TYPED_ARRAY_REGEXP.test(toString.call(value)); + return value && isNumber(value.length) && TYPED_ARRAY_REGEXP.test(toString.call(value)); } @@ -794,100 +802,111 @@ function arrayRemove(array, value) { */ -function copy(source, destination, stackSource, stackDest) { - if (isWindow(source) || isScope(source)) { - throw ngMinErr('cpws', - "Can't copy! Making copies of Window or Scope instances is not supported."); - } - if (isTypedArray(destination)) { - throw ngMinErr('cpta', - "Can't copy! TypedArray destination cannot be mutated."); - } - - if (!destination) { - destination = source; - if (isObject(source)) { - var index; - if (stackSource && (index = stackSource.indexOf(source)) !== -1) { - return stackDest[index]; - } +function copy(source, destination) { + var stackSource = []; + var stackDest = []; - // TypedArray, Date and RegExp have specific copy functionality and must be - // pushed onto the stack before returning. - // Array and other objects create the base object and recurse to copy child - // objects. The array/object will be pushed onto the stack when recursed. - if (isArray(source)) { - return copy(source, [], stackSource, stackDest); - } else if (isTypedArray(source)) { - destination = new source.constructor(source); - } else if (isDate(source)) { - destination = new Date(source.getTime()); - } else if (isRegExp(source)) { - destination = new RegExp(source.source, source.toString().match(/[^\/]*$/)[0]); - destination.lastIndex = source.lastIndex; - } else if (isFunction(source.cloneNode)) { - destination = source.cloneNode(true); - } else { - var emptyObject = Object.create(getPrototypeOf(source)); - return copy(source, emptyObject, stackSource, stackDest); - } + if (destination) { + if (isTypedArray(destination)) { + throw ngMinErr('cpta', "Can't copy! TypedArray destination cannot be mutated."); + } + if (source === destination) { + throw ngMinErr('cpi', "Can't copy! Source and destination are identical."); + } - if (stackDest) { - stackSource.push(source); - stackDest.push(destination); - } + // Empty the destination object + if (isArray(destination)) { + destination.length = 0; + } else { + forEach(destination, function(value, key) { + if (key !== '$$hashKey') { + delete destination[key]; + } + }); } - } else { - if (source === destination) throw ngMinErr('cpi', - "Can't copy! Source and destination are identical."); - stackSource = stackSource || []; - stackDest = stackDest || []; + stackSource.push(source); + stackDest.push(destination); + return copyRecurse(source, destination); + } - if (isObject(source)) { - stackSource.push(source); - stackDest.push(destination); - } + return copyElement(source); + function copyRecurse(source, destination) { + var h = destination.$$hashKey; var result, key; if (isArray(source)) { - destination.length = 0; - for (var i = 0; i < source.length; i++) { - destination.push(copy(source[i], null, stackSource, stackDest)); + for (var i = 0, ii = source.length; i < ii; i++) { + destination.push(copyElement(source[i])); } - } else { - var h = destination.$$hashKey; - if (isArray(destination)) { - destination.length = 0; - } else { - forEach(destination, function(value, key) { - delete destination[key]; - }); + } else if (isBlankObject(source)) { + // createMap() fast path --- Safe to avoid hasOwnProperty check because prototype chain is empty + for (key in source) { + destination[key] = copyElement(source[key]); } - if (isBlankObject(source)) { - // createMap() fast path --- Safe to avoid hasOwnProperty check because prototype chain is empty - for (key in source) { - destination[key] = copy(source[key], null, stackSource, stackDest); - } - } else if (source && typeof source.hasOwnProperty === 'function') { - // Slow path, which must rely on hasOwnProperty - for (key in source) { - if (source.hasOwnProperty(key)) { - destination[key] = copy(source[key], null, stackSource, stackDest); - } + } else if (source && typeof source.hasOwnProperty === 'function') { + // Slow path, which must rely on hasOwnProperty + for (key in source) { + if (source.hasOwnProperty(key)) { + destination[key] = copyElement(source[key]); } - } else { - // Slowest path --- hasOwnProperty can't be called as a method - for (key in source) { - if (hasOwnProperty.call(source, key)) { - destination[key] = copy(source[key], null, stackSource, stackDest); - } + } + } else { + // Slowest path --- hasOwnProperty can't be called as a method + for (key in source) { + if (hasOwnProperty.call(source, key)) { + destination[key] = copyElement(source[key]); } } - setHashKey(destination,h); } + setHashKey(destination, h); + return destination; + } + + function copyElement(source) { + // Simple values + if (!isObject(source)) { + return source; + } + + // Already copied values + var index = stackSource.indexOf(source); + if (index !== -1) { + return stackDest[index]; + } + + if (isWindow(source) || isScope(source)) { + throw ngMinErr('cpws', + "Can't copy! Making copies of Window or Scope instances is not supported."); + } + + var needsRecurse = false; + var destination; + + if (isArray(source)) { + destination = []; + needsRecurse = true; + } else if (isTypedArray(source)) { + destination = new source.constructor(source); + } else if (isDate(source)) { + destination = new Date(source.getTime()); + } else if (isRegExp(source)) { + destination = new RegExp(source.source, source.toString().match(/[^\/]*$/)[0]); + destination.lastIndex = source.lastIndex; + } else if (isFunction(source.cloneNode)) { + destination = source.cloneNode(true); + } else { + destination = Object.create(getPrototypeOf(source)); + needsRecurse = true; + } + + stackSource.push(source); + stackDest.push(destination); + + return needsRecurse + ? copyRecurse(source, destination) + : destination; } - return destination; } /** diff --git a/src/AngularPublic.js b/src/AngularPublic.js index 9409999f4557..b5be4e53acdf 100644 --- a/src/AngularPublic.js +++ b/src/AngularPublic.js @@ -57,7 +57,8 @@ $AnimateProvider, $CoreAnimateCssProvider, $$CoreAnimateQueueProvider, - $$CoreAnimateRunnerProvider, + $$AnimateRunnerFactoryProvider, + $$AnimateAsyncRunFactoryProvider, $BrowserProvider, $CacheFactoryProvider, $ControllerProvider, @@ -72,6 +73,7 @@ $HttpParamSerializerProvider, $HttpParamSerializerJQLikeProvider, $HttpBackendProvider, + $xhrFactoryProvider, $LocationProvider, $LogProvider, $ParseProvider, @@ -216,7 +218,8 @@ function publishExternalAPI(angular) { $animate: $AnimateProvider, $animateCss: $CoreAnimateCssProvider, $$animateQueue: $$CoreAnimateQueueProvider, - $$AnimateRunner: $$CoreAnimateRunnerProvider, + $$AnimateRunner: $$AnimateRunnerFactoryProvider, + $$animateAsyncRun: $$AnimateAsyncRunFactoryProvider, $browser: $BrowserProvider, $cacheFactory: $CacheFactoryProvider, $controller: $ControllerProvider, @@ -230,6 +233,7 @@ function publishExternalAPI(angular) { $httpParamSerializer: $HttpParamSerializerProvider, $httpParamSerializerJQLike: $HttpParamSerializerJQLikeProvider, $httpBackend: $HttpBackendProvider, + $xhrFactory: $xhrFactoryProvider, $location: $LocationProvider, $log: $LogProvider, $parse: $ParseProvider, diff --git a/src/jqLite.js b/src/jqLite.js index c899ac186ee4..fe05f6ba4591 100644 --- a/src/jqLite.js +++ b/src/jqLite.js @@ -33,16 +33,22 @@ * * If jQuery is available, `angular.element` is an alias for the * [jQuery](http://api.jquery.com/jQuery/) function. If jQuery is not available, `angular.element` - * delegates to Angular's built-in subset of jQuery, called "jQuery lite" or "jqLite." + * delegates to Angular's built-in subset of jQuery, called "jQuery lite" or **jqLite**. * - *
    jqLite is a tiny, API-compatible subset of jQuery that allows - * Angular to manipulate the DOM in a cross-browser compatible way. **jqLite** implements only the most - * commonly needed functionality with the goal of having a very small footprint.
    + * jqLite is a tiny, API-compatible subset of jQuery that allows + * Angular to manipulate the DOM in a cross-browser compatible way. jqLite implements only the most + * commonly needed functionality with the goal of having a very small footprint. * - * To use `jQuery`, simply ensure it is loaded before the `angular.js` file. + * To use `jQuery`, simply ensure it is loaded before the `angular.js` file. You can also use the + * {@link ngJq `ngJq`} directive to specify that jqlite should be used over jQuery, or to use a + * specific version of jQuery if multiple versions exist on the page. * - *
    **Note:** all element references in Angular are always wrapped with jQuery or - * jqLite; they are never raw DOM references.
    + *
    **Note:** All element references in Angular are always wrapped with jQuery or + * jqLite (such as the element argument in a directive's compile / link function). They are never raw DOM references.
    + * + *
    **Note:** Keep in mind that this function will not find elements + * by tag name / CSS selector. For lookups by tag name, try instead `angular.element(document).find(...)` + * or `$document.find()`, or use the standard DOM APIs, e.g. `document.querySelectorAll()`.
    * * ## Angular's jqLite * jqLite provides only the following jQuery methods: @@ -55,7 +61,8 @@ * - [`children()`](http://api.jquery.com/children/) - Does not support selectors * - [`clone()`](http://api.jquery.com/clone/) * - [`contents()`](http://api.jquery.com/contents/) - * - [`css()`](http://api.jquery.com/css/) - Only retrieves inline-styles, does not call `getComputedStyle()`. As a setter, does not convert numbers to strings or append 'px'. + * - [`css()`](http://api.jquery.com/css/) - Only retrieves inline-styles, does not call `getComputedStyle()`. + * As a setter, does not convert numbers to strings or append 'px', and also does not have automatic property prefixing. * - [`data()`](http://api.jquery.com/data/) * - [`detach()`](http://api.jquery.com/detach/) * - [`empty()`](http://api.jquery.com/empty/) @@ -241,6 +248,14 @@ function jqLiteParseHTML(html, context) { return []; } + +// IE9-11 has no method "contains" in SVG element and in Node.prototype. Bug #10259. +var jqLiteContains = Node.prototype.contains || function(arg) { + // jshint bitwise: false + return !!(this.compareDocumentPosition(arg) & 16); + // jshint bitwise: true +}; + ///////////////////////////////////////////// function JQLite(element) { if (element instanceof JQLite) { @@ -299,17 +314,23 @@ function jqLiteOff(element, type, fn, unsupported) { delete events[type]; } } else { - forEach(type.split(' '), function(type) { + + var removeHandler = function(type) { + var listenerFns = events[type]; if (isDefined(fn)) { - var listenerFns = events[type]; arrayRemove(listenerFns || [], fn); - if (listenerFns && listenerFns.length > 0) { - return; - } } + if (!(isDefined(fn) && listenerFns && listenerFns.length > 0)) { + removeEventListenerFn(element, type, handle); + delete events[type]; + } + }; - removeEventListenerFn(element, type, handle); - delete events[type]; + forEach(type.split(' '), function(type) { + removeHandler(type); + if (MOUSE_EVENT_MAP[type]) { + removeHandler(MOUSE_EVENT_MAP[type]); + } }); } } @@ -764,6 +785,9 @@ function createEventHandler(element, events) { return event.immediatePropagationStopped === true; }; + // Some events have special handlers that wrap the real handler + var handlerWrapper = eventFns.specialHandlerWrapper || defaultHandlerWrapper; + // Copy event handlers in case event handlers array is modified during execution. if ((eventFnsLength > 1)) { eventFns = shallowCopy(eventFns); @@ -771,7 +795,7 @@ function createEventHandler(element, events) { for (var i = 0; i < eventFnsLength; i++) { if (!event.isImmediatePropagationStopped()) { - eventFns[i].call(element, event); + handlerWrapper(element, event, eventFns[i]); } } }; @@ -782,6 +806,22 @@ function createEventHandler(element, events) { return eventHandler; } +function defaultHandlerWrapper(element, event, handler) { + handler.call(element, event); +} + +function specialMouseHandlerWrapper(target, event, handler) { + // Refer to jQuery's implementation of mouseenter & mouseleave + // Read about mouseenter and mouseleave: + // http://www.quirksmode.org/js/events_mouse.html#link8 + var related = event.relatedTarget; + // For mousenter/leave call the handler if related is outside the target. + // NB: No relatedTarget if the mouse left/entered the browser window + if (!related || (related !== target && !jqLiteContains.call(target, related))) { + handler.call(target, event); + } +} + ////////////////////////////////////////// // Functions iterating traversal. // These functions chain results into a single @@ -810,35 +850,28 @@ forEach({ var types = type.indexOf(' ') >= 0 ? type.split(' ') : [type]; var i = types.length; - while (i--) { - type = types[i]; + var addHandler = function(type, specialHandlerWrapper, noEventListener) { var eventFns = events[type]; if (!eventFns) { - events[type] = []; - - if (type === 'mouseenter' || type === 'mouseleave') { - // Refer to jQuery's implementation of mouseenter & mouseleave - // Read about mouseenter and mouseleave: - // http://www.quirksmode.org/js/events_mouse.html#link8 - - jqLiteOn(element, MOUSE_EVENT_MAP[type], function(event) { - var target = this, related = event.relatedTarget; - // For mousenter/leave call the handler if related is outside the target. - // NB: No relatedTarget if the mouse left/entered the browser window - if (!related || (related !== target && !target.contains(related))) { - handle(event, type); - } - }); - - } else { - if (type !== '$destroy') { - addEventListenerFn(element, type, handle); - } + eventFns = events[type] = []; + eventFns.specialHandlerWrapper = specialHandlerWrapper; + if (type !== '$destroy' && !noEventListener) { + addEventListenerFn(element, type, handle); } - eventFns = events[type]; } + eventFns.push(fn); + }; + + while (i--) { + type = types[i]; + if (MOUSE_EVENT_MAP[type]) { + addHandler(MOUSE_EVENT_MAP[type], specialMouseHandlerWrapper); + addHandler(type, undefined, true); + } else { + addHandler(type); + } } }, diff --git a/src/loader.js b/src/loader.js index 71ff78269dcb..93ce8e720a99 100644 --- a/src/loader.js +++ b/src/loader.js @@ -188,7 +188,7 @@ function setupModuleLoader(window) { * @param {string} name constant name * @param {*} object Constant value. * @description - * Because the constant are fixed, they get applied before other provide methods. + * Because the constants are fixed, they get applied before other provide methods. * See {@link auto.$provide#constant $provide.constant()}. */ constant: invokeLater('$provide', 'constant', 'unshift'), diff --git a/src/ng/anchorScroll.js b/src/ng/anchorScroll.js index a4b25dff56fc..7ffb6f45ebe5 100644 --- a/src/ng/anchorScroll.js +++ b/src/ng/anchorScroll.js @@ -41,7 +41,7 @@ function $AnchorScrollProvider() { * When called, it scrolls to the element related to the specified `hash` or (if omitted) to the * current value of {@link ng.$location#hash $location.hash()}, according to the rules specified * in the - * [HTML5 spec](http://dev.w3.org/html5/spec/Overview.html#the-indicated-part-of-the-document). + * [HTML5 spec](http://www.w3.org/html/wg/drafts/html/master/browsers.html#the-indicated-part-of-the-document). * * It also watches the {@link ng.$location#hash $location.hash()} and automatically scrolls to * match any anchor whenever it changes. This can be disabled by calling diff --git a/src/ng/animate.js b/src/ng/animate.js index f3b6ffdd4f3f..6df23c4179ec 100644 --- a/src/ng/animate.js +++ b/src/ng/animate.js @@ -53,29 +53,6 @@ function prepareAnimateOptions(options) { : {}; } -var $$CoreAnimateRunnerProvider = function() { - this.$get = ['$q', '$$rAF', function($q, $$rAF) { - function AnimateRunner() {} - AnimateRunner.all = noop; - AnimateRunner.chain = noop; - AnimateRunner.prototype = { - end: noop, - cancel: noop, - resume: noop, - pause: noop, - complete: noop, - then: function(pass, fail) { - return $q(function(resolve) { - $$rAF(function() { - resolve(); - }); - }).then(pass, fail); - } - }; - return AnimateRunner; - }]; -}; - // this is prefixed with Core since it conflicts with // the animateQueueProvider defined in ngAnimate/animateQueue.js var $$CoreAnimateQueueProvider = function() { @@ -101,7 +78,12 @@ var $$CoreAnimateQueueProvider = function() { addRemoveClassesPostDigest(element, options.addClass, options.removeClass); } - return new $$AnimateRunner(); // jshint ignore:line + var runner = new $$AnimateRunner(); // jshint ignore:line + + // since there are no animations to run the runner needs to be + // notified that the animation call is complete. + runner.complete(); + return runner; } }; @@ -285,7 +267,7 @@ var $AnimateProvider = ['$provide', function($provide) { * when an animation is detected (and animations are enabled), $animate will do the heavy lifting * to ensure that animation runs with the triggered DOM operation. * - * By default $animate doesn't trigger an animations. This is because the `ngAnimate` module isn't + * By default $animate doesn't trigger any animations. This is because the `ngAnimate` module isn't * included and only when it is active then the animation hooks that `$animate` triggers will be * functional. Once active then all structural `ng-` directives will trigger animations as they perform * their DOM-related operations (enter, leave and move). Other directives such as `ngClass`, diff --git a/src/ng/animateCss.js b/src/ng/animateCss.js index 4c08725d948e..b3e3c3786550 100644 --- a/src/ng/animateCss.js +++ b/src/ng/animateCss.js @@ -12,43 +12,28 @@ * Click here {@link ngAnimate.$animateCss to read the documentation for $animateCss}. */ var $CoreAnimateCssProvider = function() { - this.$get = ['$$rAF', '$q', function($$rAF, $q) { + this.$get = ['$$rAF', '$q', '$$AnimateRunner', function($$rAF, $q, $$AnimateRunner) { - var RAFPromise = function() {}; - RAFPromise.prototype = { - done: function(cancel) { - this.defer && this.defer[cancel === true ? 'reject' : 'resolve'](); - }, - end: function() { - this.done(); - }, - cancel: function() { - this.done(true); - }, - getPromise: function() { - if (!this.defer) { - this.defer = $q.defer(); - } - return this.defer.promise; - }, - then: function(f1,f2) { - return this.getPromise().then(f1,f2); - }, - 'catch': function(f1) { - return this.getPromise()['catch'](f1); - }, - 'finally': function(f1) { - return this.getPromise()['finally'](f1); + return function(element, initialOptions) { + // we always make a copy of the options since + // there should never be any side effects on + // the input data when running `$animateCss`. + var options = copy(initialOptions); + + // there is no point in applying the styles since + // there is no animation that goes on at all in + // this version of $animateCss. + if (options.cleanupStyles) { + options.from = options.to = null; } - }; - return function(element, options) { if (options.from) { element.css(options.from); options.from = null; } - var closed, runner = new RAFPromise(); + /* jshint newcap: false*/ + var closed, runner = new $$AnimateRunner(); return { start: run, end: run @@ -56,16 +41,16 @@ var $CoreAnimateCssProvider = function() { function run() { $$rAF(function() { - close(); + applyAnimationContents(); if (!closed) { - runner.done(); + runner.complete(); } closed = true; }); return runner; } - function close() { + function applyAnimationContents() { if (options.addClass) { element.addClass(options.addClass); options.addClass = null; diff --git a/src/ng/animateRunner.js b/src/ng/animateRunner.js new file mode 100644 index 000000000000..51701b4c16f8 --- /dev/null +++ b/src/ng/animateRunner.js @@ -0,0 +1,170 @@ +'use strict'; + +var $$AnimateAsyncRunFactoryProvider = function() { + this.$get = ['$$rAF', function($$rAF) { + var waitQueue = []; + + function waitForTick(fn) { + waitQueue.push(fn); + if (waitQueue.length > 1) return; + $$rAF(function() { + for (var i = 0; i < waitQueue.length; i++) { + waitQueue[i](); + } + waitQueue = []; + }); + } + + return function() { + var passed = false; + waitForTick(function() { + passed = true; + }); + return function(callback) { + passed ? callback() : waitForTick(callback); + }; + }; + }]; +}; + +var $$AnimateRunnerFactoryProvider = function() { + this.$get = ['$q', '$sniffer', '$$animateAsyncRun', + function($q, $sniffer, $$animateAsyncRun) { + + var INITIAL_STATE = 0; + var DONE_PENDING_STATE = 1; + var DONE_COMPLETE_STATE = 2; + + AnimateRunner.chain = function(chain, callback) { + var index = 0; + + next(); + function next() { + if (index === chain.length) { + callback(true); + return; + } + + chain[index](function(response) { + if (response === false) { + callback(false); + return; + } + index++; + next(); + }); + } + }; + + AnimateRunner.all = function(runners, callback) { + var count = 0; + var status = true; + forEach(runners, function(runner) { + runner.done(onProgress); + }); + + function onProgress(response) { + status = status && response; + if (++count === runners.length) { + callback(status); + } + } + }; + + function AnimateRunner(host) { + this.setHost(host); + + this._doneCallbacks = []; + this._runInAnimationFrame = $$animateAsyncRun(); + this._state = 0; + } + + AnimateRunner.prototype = { + setHost: function(host) { + this.host = host || {}; + }, + + done: function(fn) { + if (this._state === DONE_COMPLETE_STATE) { + fn(); + } else { + this._doneCallbacks.push(fn); + } + }, + + progress: noop, + + getPromise: function() { + if (!this.promise) { + var self = this; + this.promise = $q(function(resolve, reject) { + self.done(function(status) { + status === false ? reject() : resolve(); + }); + }); + } + return this.promise; + }, + + then: function(resolveHandler, rejectHandler) { + return this.getPromise().then(resolveHandler, rejectHandler); + }, + + 'catch': function(handler) { + return this.getPromise()['catch'](handler); + }, + + 'finally': function(handler) { + return this.getPromise()['finally'](handler); + }, + + pause: function() { + if (this.host.pause) { + this.host.pause(); + } + }, + + resume: function() { + if (this.host.resume) { + this.host.resume(); + } + }, + + end: function() { + if (this.host.end) { + this.host.end(); + } + this._resolve(true); + }, + + cancel: function() { + if (this.host.cancel) { + this.host.cancel(); + } + this._resolve(false); + }, + + complete: function(response) { + var self = this; + if (self._state === INITIAL_STATE) { + self._state = DONE_PENDING_STATE; + self._runInAnimationFrame(function() { + self._resolve(response); + }); + } + }, + + _resolve: function(response) { + if (this._state !== DONE_COMPLETE_STATE) { + forEach(this._doneCallbacks, function(fn) { + fn(response); + }); + this._doneCallbacks.length = 0; + this._state = DONE_COMPLETE_STATE; + } + } + }; + + return AnimateRunner; + }]; +}; diff --git a/src/ng/cacheFactory.js b/src/ng/cacheFactory.js index ad3939879af7..9e5576a7a57d 100644 --- a/src/ng/cacheFactory.js +++ b/src/ng/cacheFactory.js @@ -67,10 +67,10 @@ $scope.keys = []; $scope.cache = $cacheFactory('cacheId'); $scope.put = function(key, value) { - if (isUndefined($scope.cache.get(key))) { + if (angular.isUndefined($scope.cache.get(key))) { $scope.keys.push(key); } - $scope.cache.put(key, isUndefined(value) ? null : value); + $scope.cache.put(key, angular.isUndefined(value) ? null : value); }; }]); @@ -93,9 +93,9 @@ function $CacheFactoryProvider() { var size = 0, stats = extend({}, options, {id: cacheId}), - data = {}, + data = createMap(), capacity = (options && options.capacity) || Number.MAX_VALUE, - lruHash = {}, + lruHash = createMap(), freshEnd = null, staleEnd = null; @@ -223,6 +223,8 @@ function $CacheFactoryProvider() { delete lruHash[key]; } + if (!(key in data)) return; + delete data[key]; size--; }, @@ -237,9 +239,9 @@ function $CacheFactoryProvider() { * Clears the cache object of any entries. */ removeAll: function() { - data = {}; + data = createMap(); size = 0; - lruHash = {}; + lruHash = createMap(); freshEnd = staleEnd = null; }, @@ -399,4 +401,3 @@ function $TemplateCacheProvider() { return $cacheFactory('templates'); }]; } - diff --git a/src/ng/compile.js b/src/ng/compile.js index 20eb7593d776..41701ef89865 100644 --- a/src/ng/compile.js +++ b/src/ng/compile.js @@ -1240,6 +1240,7 @@ function $CompileProvider($provide, $$sanitizeUriProvider) { return template.replace(/\{\{/g, startSymbol).replace(/}}/g, endSymbol); }, NG_ATTR_BINDING = /^ngAttr[A-Z]/; + var MULTI_ELEMENT_DIR_RE = /^(.+)Start$/; compile.$$addBindingInfo = debugInfoEnabled ? function $$addBindingInfo($element, binding) { var bindings = $element.data('$binding') || []; @@ -1292,6 +1293,14 @@ function $CompileProvider($provide, $$sanitizeUriProvider) { return function publicLinkFn(scope, cloneConnectFn, options) { assertArg(scope, 'scope'); + if (previousCompileContext && previousCompileContext.needsNewScope) { + // A parent directive did a replace and a directive on this element asked + // for transclusion, which caused us to lose a layer of element on which + // we could hold the new transclusion scope, so we will create it manually + // here. + scope = scope.$parent.$new(); + } + options = options || {}; var parentBoundTranscludeFn = options.parentBoundTranscludeFn, transcludeControllers = options.transcludeControllers, @@ -1437,11 +1446,6 @@ function $CompileProvider($provide, $$sanitizeUriProvider) { if (nodeLinkFn.scope) { childScope = scope.$new(); compile.$$addScopeInfo(jqLite(node), childScope); - var destroyBindings = nodeLinkFn.$$destroyBindings; - if (destroyBindings) { - nodeLinkFn.$$destroyBindings = null; - childScope.$on('$destroyed', destroyBindings); - } } else { childScope = scope; } @@ -1460,8 +1464,7 @@ function $CompileProvider($provide, $$sanitizeUriProvider) { childBoundTranscludeFn = null; } - nodeLinkFn(childLinkFn, childScope, node, $rootElement, childBoundTranscludeFn, - nodeLinkFn); + nodeLinkFn(childLinkFn, childScope, node, $rootElement, childBoundTranscludeFn); } else if (childLinkFn) { childLinkFn(scope, node.childNodes, undefined, parentBoundTranscludeFn); @@ -1530,13 +1533,11 @@ function $CompileProvider($provide, $$sanitizeUriProvider) { }); } - var directiveNName = ngAttrName.replace(/(Start|End)$/, ''); - if (directiveIsMultiElement(directiveNName)) { - if (ngAttrName === directiveNName + 'Start') { - attrStartName = name; - attrEndName = name.substr(0, name.length - 5) + 'end'; - name = name.substr(0, name.length - 6); - } + var multiElementMatch = ngAttrName.match(MULTI_ELEMENT_DIR_RE); + if (multiElementMatch && directiveIsMultiElement(multiElementMatch[1])) { + attrStartName = name; + attrEndName = name.substr(0, name.length - 5) + 'end'; + name = name.substr(0, name.length - 6); } nName = directiveNormalize(name.toLowerCase()); @@ -1775,7 +1776,8 @@ function $CompileProvider($provide, $$sanitizeUriProvider) { } else { $template = jqLite(jqLiteClone(compileNode)).contents(); $compileNode.empty(); // clear contents - childTranscludeFn = compile($template, transcludeFn); + childTranscludeFn = compile($template, transcludeFn, undefined, + undefined, { needsNewScope: directive.$$isolateScope || directive.$$newScope}); } } @@ -1817,8 +1819,11 @@ function $CompileProvider($provide, $$sanitizeUriProvider) { var templateDirectives = collectDirectives(compileNode, [], newTemplateAttrs); var unprocessedDirectives = directives.splice(i + 1, directives.length - (i + 1)); - if (newIsolateScopeDirective) { - markDirectivesAsIsolate(templateDirectives); + if (newIsolateScopeDirective || newScopeDirective) { + // The original directive caused the current element to be replaced but this element + // also needs to have a new scope, so we need to tell the template directives + // that they would need to get their scope from further up, if they require transclusion + markDirectiveScope(templateDirectives, newIsolateScopeDirective, newScopeDirective); } directives = directives.concat(templateDirectives).concat(unprocessedDirectives); mergeTemplateAttributes(templateAttrs, newTemplateAttrs); @@ -1971,10 +1976,9 @@ function $CompileProvider($provide, $$sanitizeUriProvider) { return elementControllers; } - function nodeLinkFn(childLinkFn, scope, linkNode, $rootElement, boundTranscludeFn, - thisLinkFn) { - var i, ii, linkFn, controller, isolateScope, elementControllers, transcludeFn, $element, - attrs; + function nodeLinkFn(childLinkFn, scope, linkNode, $rootElement, boundTranscludeFn) { + var linkFn, isolateScope, controllerScope, elementControllers, transcludeFn, $element, + attrs, removeScopeBindingWatches, removeControllerBindingWatches; if (compileNode === linkNode) { attrs = templateAttrs; @@ -1984,8 +1988,11 @@ function $CompileProvider($provide, $$sanitizeUriProvider) { attrs = new Attributes($element, templateAttrs); } + controllerScope = scope; if (newIsolateScopeDirective) { isolateScope = scope.$new(true); + } else if (newScopeDirective) { + controllerScope = scope.$parent; } if (boundTranscludeFn) { @@ -2006,42 +2013,34 @@ function $CompileProvider($provide, $$sanitizeUriProvider) { compile.$$addScopeClass($element, true); isolateScope.$$isolateBindings = newIsolateScopeDirective.$$isolateBindings; - initializeDirectiveBindings(scope, attrs, isolateScope, - isolateScope.$$isolateBindings, - newIsolateScopeDirective, isolateScope); + removeScopeBindingWatches = initializeDirectiveBindings(scope, attrs, isolateScope, + isolateScope.$$isolateBindings, + newIsolateScopeDirective); + if (removeScopeBindingWatches) { + isolateScope.$on('$destroy', removeScopeBindingWatches); + } } - if (elementControllers) { - // Initialize bindToController bindings for new/isolate scopes - var scopeDirective = newIsolateScopeDirective || newScopeDirective; - var bindings; - var controllerForBindings; - if (scopeDirective && elementControllers[scopeDirective.name]) { - bindings = scopeDirective.$$bindings.bindToController; - controller = elementControllers[scopeDirective.name]; - - if (controller && controller.identifier && bindings) { - controllerForBindings = controller; - thisLinkFn.$$destroyBindings = - initializeDirectiveBindings(scope, attrs, controller.instance, - bindings, scopeDirective); - } + + // Initialize bindToController bindings + for (var name in elementControllers) { + var controllerDirective = controllerDirectives[name]; + var controller = elementControllers[name]; + var bindings = controllerDirective.$$bindings.bindToController; + + if (controller.identifier && bindings) { + removeControllerBindingWatches = + initializeDirectiveBindings(controllerScope, attrs, controller.instance, bindings, controllerDirective); } - for (i in elementControllers) { - controller = elementControllers[i]; - var controllerResult = controller(); - - if (controllerResult !== controller.instance) { - // If the controller constructor has a return value, overwrite the instance - // from setupControllers and update the element data - controller.instance = controllerResult; - $element.data('$' + i + 'Controller', controllerResult); - if (controller === controllerForBindings) { - // Remove and re-install bindToController bindings - thisLinkFn.$$destroyBindings(); - thisLinkFn.$$destroyBindings = - initializeDirectiveBindings(scope, attrs, controllerResult, bindings, scopeDirective); - } - } + + var controllerResult = controller(); + if (controllerResult !== controller.instance) { + // If the controller constructor has a return value, overwrite the instance + // from setupControllers + controller.instance = controllerResult; + $element.data('$' + controllerDirective.name + 'Controller', controllerResult); + removeControllerBindingWatches && removeControllerBindingWatches(); + removeControllerBindingWatches = + initializeDirectiveBindings(controllerScope, attrs, controller.instance, bindings, controllerDirective); } } @@ -2101,10 +2100,15 @@ function $CompileProvider($provide, $$sanitizeUriProvider) { } } - function markDirectivesAsIsolate(directives) { - // mark all directives as needing isolate scope. + // Depending upon the context in which a directive finds itself it might need to have a new isolated + // or child scope created. For instance: + // * if the directive has been pulled into a template because another directive with a higher priority + // asked for element transclusion + // * if the directive itself asks for transclusion but it is at the root of a template and the original + // element was replaced. See https://github.com/angular/angular.js/issues/12936 + function markDirectiveScope(directives, isolateScope, newScope) { for (var j = 0, jj = directives.length; j < jj; j++) { - directives[j] = inherit(directives[j], {$$isolateScope: true}); + directives[j] = inherit(directives[j], {$$isolateScope: isolateScope, $$newScope: newScope}); } } @@ -2251,7 +2255,9 @@ function $CompileProvider($provide, $$sanitizeUriProvider) { var templateDirectives = collectDirectives(compileNode, [], tempTemplateAttrs); if (isObject(origAsyncDirective.scope)) { - markDirectivesAsIsolate(templateDirectives); + // the original directive that caused the template to be loaded async required + // an isolate scope + markDirectiveScope(templateDirectives, true); } directives = templateDirectives.concat(directives); mergeTemplateAttributes(tAttrs, tempTemplateAttrs); @@ -2300,7 +2306,7 @@ function $CompileProvider($provide, $$sanitizeUriProvider) { childBoundTranscludeFn = boundTranscludeFn; } afterTemplateNodeLinkFn(afterTemplateChildLinkFn, scope, linkNode, $rootElement, - childBoundTranscludeFn, afterTemplateNodeLinkFn); + childBoundTranscludeFn); } linkQueue = null; }); @@ -2317,8 +2323,7 @@ function $CompileProvider($provide, $$sanitizeUriProvider) { if (afterTemplateNodeLinkFn.transcludeOnThisElement) { childBoundTranscludeFn = createBoundTranscludeFn(scope, afterTemplateNodeLinkFn.transclude, boundTranscludeFn); } - afterTemplateNodeLinkFn(afterTemplateChildLinkFn, scope, node, rootElement, childBoundTranscludeFn, - afterTemplateNodeLinkFn); + afterTemplateNodeLinkFn(afterTemplateChildLinkFn, scope, node, rootElement, childBoundTranscludeFn); } }; } @@ -2427,7 +2432,7 @@ function $CompileProvider($provide, $$sanitizeUriProvider) { compile: function() { return { pre: function attrInterpolatePreLinkFn(scope, element, attr) { - var $$observers = (attr.$$observers || (attr.$$observers = {})); + var $$observers = (attr.$$observers || (attr.$$observers = createMap())); if (EVENT_HANDLER_ATTR_REGEXP.test(name)) { throw $compileMinErr('nodomevents', @@ -2530,7 +2535,7 @@ function $CompileProvider($provide, $$sanitizeUriProvider) { // Copy over user data (that includes Angular's $scope etc.). Don't copy private // data here because there's no public interface in jQuery to do that and copying over // event listeners (which is the main use of private data) wouldn't work anyway. - jqLite(newNode).data(jqLite(firstElementToRemove).data()); + jqLite.data(newNode, jqLite.data(firstElementToRemove)); // Remove data of the replaced element. We cannot just call .remove() // on the element it since that would deallocate scope that is needed @@ -2578,9 +2583,8 @@ 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. - function initializeDirectiveBindings(scope, attrs, destination, bindings, - directive, newScope) { - var onNewScopeDestroyed; + function initializeDirectiveBindings(scope, attrs, destination, bindings, directive) { + var removeWatchCollection = []; forEach(bindings, function(definition, scopeName) { var attrName = definition.attrName, optional = definition.optional, @@ -2642,14 +2646,13 @@ function $CompileProvider($provide, $$sanitizeUriProvider) { return lastValue = parentValue; }; parentValueWatch.$stateful = true; - var unwatch; + var removeWatch; if (definition.collection) { - unwatch = scope.$watchCollection(attrs[attrName], parentValueWatch); + removeWatch = scope.$watchCollection(attrs[attrName], parentValueWatch); } else { - unwatch = scope.$watch($parse(attrs[attrName], parentValueWatch), null, parentGet.literal); + removeWatch = scope.$watch($parse(attrs[attrName], parentValueWatch), null, parentGet.literal); } - onNewScopeDestroyed = (onNewScopeDestroyed || []); - onNewScopeDestroyed.push(unwatch); + removeWatchCollection.push(removeWatch); break; case '&': @@ -2665,16 +2668,12 @@ function $CompileProvider($provide, $$sanitizeUriProvider) { break; } }); - var destroyBindings = onNewScopeDestroyed ? function destroyBindings() { - for (var i = 0, ii = onNewScopeDestroyed.length; i < ii; ++i) { - onNewScopeDestroyed[i](); + + return removeWatchCollection.length && function removeWatches() { + for (var i = 0, ii = removeWatchCollection.length; i < ii; ++i) { + removeWatchCollection[i](); } - } : noop; - if (newScope && destroyBindings !== noop) { - newScope.$on('$destroy', destroyBindings); - return noop; - } - return destroyBindings; + }; } }]; } diff --git a/src/ng/directive/input.js b/src/ng/directive/input.js index 4b0d8cf4b1c3..bcf34b26747e 100644 --- a/src/ng/directive/input.js +++ b/src/ng/directive/input.js @@ -11,7 +11,8 @@ // Regex code is obtained from SO: https://stackoverflow.com/questions/3143070/javascript-regex-iso-datetime#answer-3143231 var ISO_DATE_REGEXP = /\d{4}-[01]\d-[0-3]\dT[0-2]\d:[0-5]\d:[0-5]\d\.\d+([+-][0-2]\d:[0-5]\d|Z)/; -var URL_REGEXP = /^(ftp|http|https):\/\/(\w+:{0,1}\w*@)?(\S+)(:[0-9]+)?(\/|\/([\w#!:.?+=&%@!\-\/]))?$/; +// See valid URLs in RFC3987 (http://tools.ietf.org/html/rfc3987) +var URL_REGEXP = /^[A-Za-z][A-Za-z\d.+-]*:\/*(?:\w+(?::\w+)?@)?[^\s/]+(?::\d+)?(?:\/[\w#!:.?+=&%@\-/[\]$'()*,;~]*)?$/; var EMAIL_REGEXP = /^[a-z0-9!#$%&'*+\/=?^_`{|}~.-]+@[a-z0-9]([a-z0-9-]*[a-z0-9])?(\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)*$/i; var NUMBER_REGEXP = /^\s*(\-|\+)?(\d+|(\d*(\.\d*)))([eE][+-]?\d+)?\s*$/; var DATE_REGEXP = /^(\d{4})-(\d{2})-(\d{2})$/; diff --git a/src/ng/directive/ngInclude.js b/src/ng/directive/ngInclude.js index 97c11a6bab1c..2b844b84ba3d 100644 --- a/src/ng/directive/ngInclude.js +++ b/src/ng/directive/ngInclude.js @@ -34,7 +34,13 @@ * @param {string} ngInclude|src angular expression evaluating to URL. If the source is a string constant, * make sure you wrap it in **single** quotes, e.g. `src="'myPartialTemplate.html'"`. * @param {string=} onload Expression to evaluate when a new partial is loaded. - * + *
    + * **Note:** When using onload on SVG elements in IE11, the browser will try to call + * a function with the name on the window element, which will usually throw a + * "function is undefined" error. To fix this, you can instead use `data-onload` or a + * different form that {@link guide/directive#normalization matches} `onload`. + *
    + * * @param {string=} autoscroll Whether `ngInclude` should call {@link ng.$anchorScroll * $anchorScroll} to scroll the viewport after the content is loaded. * diff --git a/src/ng/directive/ngList.js b/src/ng/directive/ngList.js index 0b48853eb07d..637352b5190d 100644 --- a/src/ng/directive/ngList.js +++ b/src/ng/directive/ngList.js @@ -66,7 +66,7 @@ * * * - * ### Example - splitting on whitespace + * ### Example - splitting on newline * * * diff --git a/src/ng/directive/ngModel.js b/src/ng/directive/ngModel.js index 034c386a5527..fe99e136169b 100644 --- a/src/ng/directive/ngModel.js +++ b/src/ng/directive/ngModel.js @@ -22,7 +22,9 @@ var ngModelMinErr = minErr('ngModel'); * @ngdoc type * @name ngModel.NgModelController * - * @property {string} $viewValue Actual string value in the view. + * @property {*} $viewValue The actual value from the control's view. For `input` elements, this is a + * String. See {@link ngModel.NgModelController#$setViewValue} for information about when the $viewValue + * is set. * @property {*} $modelValue The value in the model that the control is bound to. * @property {Array.} $parsers Array of functions to execute, as a pipeline, whenever the control reads value from the DOM. The functions are called in array order, each passing @@ -433,11 +435,14 @@ var NgModelController = ['$scope', '$exceptionHandler', '$attrs', '$element', '$ * which may be caused by a pending debounced event or because the input is waiting for a some * future event. * - * If you have an input that uses `ng-model-options` to set up debounced events or events such - * as blur you can have a situation where there is a period when the `$viewValue` - * is out of synch with the ngModel's `$modelValue`. + * If you have an input that uses `ng-model-options` to set up debounced updates or updates that + * depend on special events such as blur, you can have a situation where there is a period when + * the `$viewValue` is out of sync with the ngModel's `$modelValue`. * - * In this case, you can run into difficulties if you try to update the ngModel's `$modelValue` + * In this case, you can use `$rollbackViewValue()` to manually cancel the debounced / future update + * and reset the input to the last committed view value. + * + * It is also possible that you run into difficulties if you try to update the ngModel's `$modelValue` * programmatically before these debounced/future events have resolved/occurred, because Angular's * dirty checking mechanism is not able to tell whether the model has actually changed or not. * @@ -450,39 +455,63 @@ var NgModelController = ['$scope', '$exceptionHandler', '$attrs', '$element', '$ * angular.module('cancel-update-example', []) * * .controller('CancelUpdateController', ['$scope', function($scope) { - * $scope.resetWithCancel = function(e) { - * if (e.keyCode == 27) { - * $scope.myForm.myInput1.$rollbackViewValue(); - * $scope.myValue = ''; - * } - * }; - * $scope.resetWithoutCancel = function(e) { + * $scope.model = {}; + * + * $scope.setEmpty = function(e, value, rollback) { * if (e.keyCode == 27) { - * $scope.myValue = ''; + * e.preventDefault(); + * if (rollback) { + * $scope.myForm[value].$rollbackViewValue(); + * } + * $scope.model[value] = ''; * } * }; * }]); * * *
    - *

    Try typing something in each input. See that the model only updates when you - * blur off the input. - *

    - *

    Now see what happens if you start typing then press the Escape key

    + *

    Both of these inputs are only updated if they are blurred. Hitting escape should + * empty them. Follow these steps and observe the difference:

    + *
      + *
    1. Type something in the input. You will see that the model is not yet updated
    2. + *
    3. Press the Escape key. + *
        + *
      1. In the first example, nothing happens, because the model is already '', and no + * update is detected. If you blur the input, the model will be set to the current view. + *
      2. + *
      3. In the second example, the pending update is cancelled, and the input is set back + * to the last committed view value (''). Blurring the input does nothing. + *
      4. + *
      + *
    4. + *
    * *
    - *

    With $rollbackViewValue()

    - *
    - * myValue: "{{ myValue }}" + *
    + *

    Without $rollbackViewValue():

    + * + * value1: "{{ model.value1 }}" + *
    * - *

    Without $rollbackViewValue()

    - *
    - * myValue: "{{ myValue }}" + *
    + *

    With $rollbackViewValue():

    + * + * value2: "{{ model.value2 }}" + *
    *
    *
    *
    + + div { + display: table-cell; + } + div:nth-child(1) { + padding-right: 30px; + } + + *
    */ this.$rollbackViewValue = function() { @@ -1139,12 +1168,13 @@ var DEFAULT_REGEXP = /(\s+|^)default(\s+|$)/;
    user.name = 
    +
    user.data = 
    angular.module('optionsExample', []) .controller('ExampleController', ['$scope', function($scope) { - $scope.user = { name: 'say', data: '' }; + $scope.user = { name: 'John', data: '' }; $scope.cancel = function(e) { if (e.keyCode == 27) { @@ -1159,20 +1189,20 @@ var DEFAULT_REGEXP = /(\s+|^)default(\s+|$)/; var other = element(by.model('user.data')); it('should allow custom events', function() { - input.sendKeys(' hello'); + input.sendKeys(' Doe'); input.click(); - expect(model.getText()).toEqual('say'); + expect(model.getText()).toEqual('John'); other.click(); - expect(model.getText()).toEqual('say hello'); + expect(model.getText()).toEqual('John Doe'); }); it('should $rollbackViewValue when model changes', function() { - input.sendKeys(' hello'); - expect(input.getAttribute('value')).toEqual('say hello'); + input.sendKeys(' Doe'); + expect(input.getAttribute('value')).toEqual('John Doe'); input.sendKeys(protractor.Key.ESCAPE); - expect(input.getAttribute('value')).toEqual('say'); + expect(input.getAttribute('value')).toEqual('John'); other.click(); - expect(model.getText()).toEqual('say'); + expect(model.getText()).toEqual('John'); }); @@ -1198,7 +1228,7 @@ var DEFAULT_REGEXP = /(\s+|^)default(\s+|$)/; angular.module('optionsExample', []) .controller('ExampleController', ['$scope', function($scope) { - $scope.user = { name: 'say' }; + $scope.user = { name: 'Igor' }; }]); diff --git a/src/ng/directive/ngOptions.js b/src/ng/directive/ngOptions.js index e07aa137f2a6..bb29b7cec1c7 100644 --- a/src/ng/directive/ngOptions.js +++ b/src/ng/directive/ngOptions.js @@ -33,19 +33,27 @@ var ngOptionsMinErr = minErr('ngOptions'); * * ## Complex Models (objects or collections) * - * **Note:** By default, `ngModel` watches the model by reference, not value. This is important when - * binding any input directive to a model that is an object or a collection. + * By default, `ngModel` watches the model by reference, not value. This is important to know when + * binding the select to a model that is an object or a collection. * - * Since this is a common situation for `ngOptions` the directive additionally watches the model using - * `$watchCollection` when the select has the `multiple` attribute or when there is a `track by` clause in - * the options expression. This allows ngOptions to trigger a re-rendering of the options even if the actual - * object/collection has not changed identity but only a property on the object or an item in the collection - * changes. + * One issue occurs if you want to preselect an option. For example, if you set + * the model to an object that is equal to an object in your collection, `ngOptions` won't be able to set the selection, + * because the objects are not identical. So by default, you should always reference the item in your collection + * for preselections, e.g.: `$scope.selected = $scope.collection[3]`. * - * Note that `$watchCollection` does a shallow comparison of the properties of the object (or the items in the collection - * if the model is an array). This means that changing a property deeper inside the object/collection that the - * first level will not trigger a re-rendering. + * Another solution is to use a `track by` clause, because then `ngOptions` will track the identity + * of the item not by reference, but by the result of the `track by` expression. For example, if your + * collection items have an id property, you would `track by item.id`. + * + * A different issue with objects or collections is that ngModel won't detect if an object property or + * a collection item changes. For that reason, `ngOptions` additionally watches the model using + * `$watchCollection`, when the expression contains a `track by` clause or the the select has the `multiple` attribute. + * This allows ngOptions to trigger a re-rendering of the options even if the actual object/collection + * has not changed identity, but only a property on the object or an item in the collection changes. * + * Note that `$watchCollection` does a shallow comparison of the properties of the object (or the items in the collection + * if the model is an array). This means that changing a property deeper than the first level inside the + * object/collection will not trigger a re-rendering. * * ## `select` **`as`** * @@ -58,17 +66,13 @@ var ngOptionsMinErr = minErr('ngOptions'); * ### `select` **`as`** and **`track by`** * *
    - * Do not use `select` **`as`** and **`track by`** in the same expression. They are not designed to work together. + * Be careful when using `select` **`as`** and **`track by`** in the same expression. *
    * - * Consider the following example: - * - * ```html - * - * ``` + * Given this array of items on the $scope: * * ```js - * $scope.values = [{ + * $scope.items = [{ * id: 1, * label: 'aLabel', * subItem: { name: 'aSubItem' } @@ -77,20 +81,33 @@ var ngOptionsMinErr = minErr('ngOptions'); * label: 'bLabel', * subItem: { name: 'bSubItem' } * }]; + * ``` + * + * This will work: * - * $scope.selected = { name: 'aSubItem' }; + * ```html + * + * ``` + * ```js + * $scope.selected = $scope.items[0]; * ``` * - * With the purpose of preserving the selection, the **`track by`** expression is always applied to the element - * of the data source (to `item` in this example). To calculate whether an element is selected, we do the - * following: + * but this will not work: * - * 1. Apply **`track by`** to the elements in the array. In the example: `[1, 2]` - * 2. Apply **`track by`** to the already selected value in `ngModel`. - * In the example: this is not possible as **`track by`** refers to `item.id`, but the selected - * value from `ngModel` is `{name: 'aSubItem'}`, so the **`track by`** expression is applied to - * a wrong object, the selected element can't be found, ` + * ``` + * ```js + * $scope.selected = $scope.items[0].subItem; + * ``` + * + * In both examples, the **`track by`** expression is applied successfully to each `item` in the + * `items` array. Because the selected option has been set programmatically in the controller, the + * **`track by`** expression is also applied to the `ngModel` value. In the first example, the + * `ngModel` value is `items[0]` and the **`track by`** expression evaluates to `items[0].id` with + * no issue. In the second example, the `ngModel` value is `items[0].subItem` and the **`track by`** + * expression evaluates to `items[0].subItem.id` (which is undefined). As a result, the model value + * is not matched against any ` '); + + scope.options = ['a', 'b', 'c', 'd']; + + expect(function() { + element = $compile('')(scope); + scope.$digest(); + }).not.toThrow(); + + dealoc(element); + })); + }); @@ -2521,5 +2760,20 @@ describe('ngOptions', function() { expect(scope.value).toBe('third'); expect(element).toEqualSelectValue('third'); })); + + it('should not set $dirty with select-multiple after compilation', function() { + scope.values = ['a', 'b']; + scope.selected = ['b']; + + createSelect({ + 'ng-model':'selected', + 'multiple':true, + 'ng-options':'value for value in values', + 'name': 'select' + }); + + expect(element.find('option')[1].selected).toBe(true); + expect(scope.form.select.$pristine).toBe(true); + }); }); }); diff --git a/test/ng/directive/ngRepeatSpec.js b/test/ng/directive/ngRepeatSpec.js index 018564f02356..4523718b64f0 100644 --- a/test/ng/directive/ngRepeatSpec.js +++ b/test/ng/directive/ngRepeatSpec.js @@ -612,6 +612,15 @@ describe('ngRepeat', function() { expect(element.text()).toEqual('misko:m:0|shyam:s:1|frodo:f:2|'); }); + it('should expose iterator offset as $index when iterating over objects with length key value 0', function() { + element = $compile( + '
      ' + + '
    • {{key}}:{{val}}:{{$index}}|
    • ' + + '
    ')(scope); + scope.items = {'misko':'m', 'shyam':'s', 'frodo':'f', 'length':0}; + scope.$digest(); + expect(element.text()).toEqual('misko:m:0|shyam:s:1|frodo:f:2|length:0:3|'); + }); it('should expose iterator position as $first, $middle and $last when iterating over arrays', function() { diff --git a/test/ng/filter/filtersSpec.js b/test/ng/filter/filtersSpec.js index 52ad6fbd6a4d..979fd2bf02b8 100644 --- a/test/ng/filter/filtersSpec.js +++ b/test/ng/filter/filtersSpec.js @@ -62,6 +62,8 @@ describe('filters', function() { it('should format according different separators', function() { var num = formatNumber(1234567.1, pattern, '.', ',', 2); expect(num).toBe('1.234.567,10'); + num = formatNumber(1e-14, pattern, '.', ',', 14); + expect(num).toBe('0,00000000000001'); }); it('should format with or without fractionSize', function() { @@ -90,6 +92,39 @@ describe('filters', function() { expect(formatNumber(-0.0001, pattern, ',', '.', 3)).toBe('0.000'); expect(formatNumber(-0.0000001, pattern, ',', '.', 6)).toBe('0.000000'); }); + + it('should work with numbers that are close to the limit for exponent notation', function() { + // previously, numbers that n * (10 ^ fractionSize) > localLimitMax + // were ending up with a second exponent in them, then coercing to + // NaN when formatNumber rounded them with the safe rounding + // function. + + var localLimitMax = 999999999999999900000, + localLimitMin = 10000000000000000000, + exampleNumber = 444444444400000000000; + + expect(formatNumber(localLimitMax, pattern, ',', '.', 2)) + .toBe('999,999,999,999,999,900,000.00'); + expect(formatNumber(localLimitMin, pattern, ',', '.', 2)) + .toBe('10,000,000,000,000,000,000.00'); + expect(formatNumber(exampleNumber, pattern, ',', '.', 2)) + .toBe('444,444,444,400,000,000,000.00'); + + }); + + it('should format large number',function() { + var num; + num = formatNumber(12345868059685210000, pattern, ',', '.', 2); + expect(num).toBe('12,345,868,059,685,210,000.00'); + num = formatNumber(79832749837498327498274983793234322432, pattern, ',', '.', 2); + expect(num).toBe('7.98e+37'); + num = formatNumber(8798327498374983274928, pattern, ',', '.', 2); + expect(num).toBe('8,798,327,498,374,983,000,000.00'); + num = formatNumber(879832749374983274928, pattern, ',', '.', 2); + expect(num).toBe('879,832,749,374,983,200,000.00'); + num = formatNumber(879832749374983274928, pattern, ',', '.', 32); + expect(num).toBe('879,832,749,374,983,200,000.00000000000000000000000000000000'); + }); }); describe('currency', function() { @@ -184,13 +219,10 @@ describe('filters', function() { }); it('should filter exponentially large numbers', function() { - expect(number(1e50)).toEqual('1e+50'); - expect(number(-2e100)).toEqual('-2e+100'); - }); - - it('should ignore fraction sizes for large numbers', function() { - expect(number(1e50, 2)).toEqual('1e+50'); - expect(number(-2e100, 5)).toEqual('-2e+100'); + expect(number(1.23e50)).toEqual('1.23e+50'); + expect(number(-2.3456e100)).toEqual('-2.346e+100'); + expect(number(1e50, 2)).toEqual('1.00e+50'); + expect(number(-2e100, 5)).toEqual('-2.00000e+100'); }); it('should filter exponentially small numbers', function() { @@ -204,6 +236,14 @@ describe('filters', function() { expect(number(-1e-7, 6)).toEqual('0.000000'); expect(number(-1e-8, 9)).toEqual('-0.000000010'); }); + + it('should filter exponentially small numbers when no fraction specified', function() { + expect(number(1e-10)).toEqual('0.000'); + expect(number(0.0000000001)).toEqual('0.000'); + + expect(number(-1e-10)).toEqual('0.000'); + expect(number(-0.0000000001)).toEqual('0.000'); + }); }); describe('json', function() { diff --git a/test/ng/filter/limitToSpec.js b/test/ng/filter/limitToSpec.js index 343290a55c5d..a403c43b94ba 100644 --- a/test/ng/filter/limitToSpec.js +++ b/test/ng/filter/limitToSpec.js @@ -140,16 +140,19 @@ describe('Filter: limitTo', function() { it('should return an empty array if Y exceeds input length', function() { expect(limitTo(items, '3', 12)).toEqual([]); - expect(limitTo(items, 4, '-12')).toEqual([]); expect(limitTo(items, -3, '12')).toEqual([]); - expect(limitTo(items, '-4', -12)).toEqual([]); }); it('should return an empty string if Y exceeds input length', function() { expect(limitTo(str, '3', 12)).toEqual(""); - expect(limitTo(str, 4, '-12')).toEqual(""); expect(limitTo(str, -3, '12')).toEqual(""); - expect(limitTo(str, '-4', -12)).toEqual(""); + }); + + it('should start at 0 if Y is negative and exceeds input length', function() { + expect(limitTo(items, 4, '-12')).toEqual(['a', 'b', 'c', 'd']); + expect(limitTo(items, '-4', -12)).toEqual(['e', 'f', 'g', 'h']); + expect(limitTo(str, 4, '-12')).toEqual("tuvw"); + expect(limitTo(str, '-4', -12)).toEqual("wxyz"); }); it('should return the entire string beginning from Y if X is positive and X+Y exceeds input length', function() { diff --git a/test/ng/httpBackendSpec.js b/test/ng/httpBackendSpec.js index 03490fc4ca1f..cd356959578d 100644 --- a/test/ng/httpBackendSpec.js +++ b/test/ng/httpBackendSpec.js @@ -233,6 +233,13 @@ describe('$httpBackend', function() { expect(MockXhr.$$lastInstance.withCredentials).toBe(true); }); + it('should call $xhrFactory with method and url', function() { + var mockXhrFactory = jasmine.createSpy('mockXhrFactory').andCallFake(createMockXhr); + $backend = createHttpBackend($browser, mockXhrFactory, $browser.defer, callbacks, fakeDocument); + $backend('GET', '/some-url', 'some-data', noop); + expect(mockXhrFactory).toHaveBeenCalledWith('GET', '/some-url'); + }); + describe('responseType', function() { diff --git a/test/ng/httpSpec.js b/test/ng/httpSpec.js index 168305eab34f..56424dff8e56 100644 --- a/test/ng/httpSpec.js +++ b/test/ng/httpSpec.js @@ -302,6 +302,13 @@ describe('$http', function() { }).toThrowMinErr('$http','badreq', 'Http request configuration must be an object. Received: /url'); }); + it('should throw error if the request configuration url is not a string', function() { + expect(function() { + $http({url: false}); + }).toThrowMinErr('$http','badreq', 'Http request configuration url must be a string. Received: false'); + }); + + it('should send GET requests if no method specified', function() { $httpBackend.expect('GET', '/url').respond(''); $http({url: '/url'}); @@ -1391,6 +1398,25 @@ describe('$http', function() { expect(callback).toHaveBeenCalledOnce(); expect(callback.mostRecentCall.args[0]).toBe('RESP-FIRST:V1'); }); + + + it('should apply `transformResponse` even if the response data is empty', function(data) { + var callback = jasmine.createSpy('transformResponse'); + var config = {transformResponse: callback}; + + $httpBackend.expect('GET', '/url1').respond(200, undefined); + $httpBackend.expect('GET', '/url2').respond(200, null); + $httpBackend.expect('GET', '/url3').respond(200, ''); + $http.get('/url1', config); + $http.get('/url2', config); + $http.get('/url3', config); + $httpBackend.flush(); + + expect(callback.callCount).toBe(3); + expect(callback.calls[0].args[0]).toBe(undefined); + expect(callback.calls[1].args[0]).toBe(null); + expect(callback.calls[2].args[0]).toBe(''); + }); }); }); diff --git a/test/ng/locationSpec.js b/test/ng/locationSpec.js index 1efe3396762f..8e1607c83146 100644 --- a/test/ng/locationSpec.js +++ b/test/ng/locationSpec.js @@ -2141,6 +2141,31 @@ describe('$location', function() { }) ); + it('should fire $locationChangeSuccess when browser location changes to URL which ends with #', + inject(function($location, $browser, $rootScope, $log) { + $location.url('/somepath'); + $rootScope.$apply(); + + expect($browser.url()).toEqual('http://server/#/somepath'); + expect($location.url()).toEqual('/somepath'); + + $rootScope.$on('$locationChangeStart', function(event, newUrl, oldUrl) { + $log.info('start', newUrl, oldUrl); + }); + $rootScope.$on('$locationChangeSuccess', function(event, newUrl, oldUrl) { + $log.info('after', newUrl, oldUrl); + }); + + $browser.url('http://server/#'); + $browser.poll(); + + expect($log.info.logs.shift()). + toEqual(['start', 'http://server/', 'http://server/#/somepath']); + expect($log.info.logs.shift()). + toEqual(['after', 'http://server/', 'http://server/#/somepath']); + }) + ); + it('should allow redirect during browser url change', inject(function($location, $browser, $rootScope, $log) { $rootScope.$on('$locationChangeStart', function(event, newUrl, oldUrl) { diff --git a/test/ng/parseSpec.js b/test/ng/parseSpec.js index 5b477b464947..82c6223e86ae 100644 --- a/test/ng/parseSpec.js +++ b/test/ng/parseSpec.js @@ -2692,6 +2692,15 @@ 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('' + @@ -2703,6 +2712,35 @@ describe('parser', function() { ''); }).toThrow(); }); + + it('should prevent assigning in the context of a constructor', function() { + expect(function() { + scope.$eval("''.constructor.join"); + }).not.toThrow(); + expect(function() { + scope.$eval("''.constructor.join = ''.constructor.join"); + }).toThrow(); + expect(function() { + scope.$eval("''.constructor[0] = ''"); + }).toThrow(); + expect(function() { + scope.$eval("(0).constructor[0] = ''"); + }).toThrow(); + expect(function() { + scope.$eval("{}.constructor[0] = ''"); + }).toThrow(); + // foo.constructor is the object constructor. + expect(function() { + scope.$eval("foo.constructor[0] = ''", {foo: {}}); + }).toThrow(); + // foo.constructor is not a constructor. + expect(function() { + scope.$eval("foo.constructor[0] = ''", {foo: {constructor: ''}}); + }).not.toThrow(); + expect(function() { + scope.$eval("objConstructor = {}.constructor; objConstructor.join = ''"); + }).toThrow(); + }); }); it('should call the function from the received instance and not from a new one', function() { @@ -3127,6 +3165,17 @@ describe('parser', function() { expect(called).toBe(true); })); + it('should invoke interceptors when the expression is `undefined`', inject(function($parse) { + var called = false; + function interceptor(v) { + called = true; + return v; + } + scope.$watch($parse(undefined, interceptor)); + scope.$digest(); + expect(called).toBe(true); + })); + it('should treat filters with constant input as constants', inject(function($parse) { var filterCalls = 0; $filterProvider.register('foo', valueFn(function(input) { diff --git a/test/ng/rootScopeSpec.js b/test/ng/rootScopeSpec.js index 8bdc6b4c50f0..a9a1ae120494 100644 --- a/test/ng/rootScopeSpec.js +++ b/test/ng/rootScopeSpec.js @@ -1211,6 +1211,36 @@ describe('Scope', function() { expect(child.parentModel).toBe('parent'); expect(child.childModel).toBe('child'); })); + + + if (msie === 9) { + // See issue https://github.com/angular/angular.js/issues/10706 + it('should completely disconnect all child scopes on IE9', inject(function($rootScope) { + var parent = $rootScope.$new(), + child1 = parent.$new(), + child2 = parent.$new(), + grandChild1 = child1.$new(), + grandChild2 = child1.$new(); + + child1.$destroy(); + $rootScope.$digest(); + + expect(isDisconnected(parent)).toBe(false); + expect(isDisconnected(child1)).toBe(true); + expect(isDisconnected(child2)).toBe(false); + expect(isDisconnected(grandChild1)).toBe(true); + expect(isDisconnected(grandChild2)).toBe(true); + + function isDisconnected($scope) { + return $scope.$$nextSibling === null && + $scope.$$prevSibling === null && + $scope.$$childHead === null && + $scope.$$childTail === null && + $scope.$root === null && + $scope.$$watchers === null; + } + })); + } }); diff --git a/test/ngAnimate/animateCssDriverSpec.js b/test/ngAnimate/animateCssDriverSpec.js index 589d5932e3ff..923f9e3f821c 100644 --- a/test/ngAnimate/animateCssDriverSpec.js +++ b/test/ngAnimate/animateCssDriverSpec.js @@ -121,7 +121,7 @@ describe("ngAnimate $$animateCssDriver", function() { var from, to, fromAnimation, toAnimation; beforeEach(module(function() { - return function($rootElement, $$body) { + return function($rootElement, $document) { from = element; to = jqLite('
    '); fromAnimation = { element: from, event: 'enter' }; @@ -129,8 +129,14 @@ describe("ngAnimate $$animateCssDriver", function() { $rootElement.append(from); $rootElement.append(to); - // we need to do this so that style detection works - $$body.append($rootElement); + var doc = $document[0]; + + // there is one test in here that expects the rootElement + // to superceed the body node + if (!$rootElement[0].contains(doc.body)) { + // we need to do this so that style detection works + jqLite(doc.body).append($rootElement); + } }; })); @@ -975,6 +981,39 @@ describe("ngAnimate $$animateCssDriver", function() { expect(completed).toBe(true); })); + + it("should use as the element container if the rootElement exists outside of the tag", function() { + module(function($provide) { + $provide.factory('$rootElement', function($document) { + return jqLite($document[0].querySelector('html')); + }); + }); + inject(function($rootElement, $rootScope, $animate, $document) { + ss.addRule('.ending-element', 'width:9999px; height:6666px; display:inline-block;'); + + var fromAnchor = jqLite('
    '); + from.append(fromAnchor); + + var toAnchor = jqLite('
    '); + to.append(toAnchor); + + $rootElement.append(fromAnchor); + $rootElement.append(toAnchor); + + var completed = false; + driver({ + from: fromAnimation, + to: toAnimation, + anchors: [{ + 'out': fromAnchor, + 'in': toAnchor + }] + }).start(); + + var clone = captureLog[2].element[0]; + expect(clone.parentNode).toBe($document[0].body); + }); + }); }); }); }); diff --git a/test/ngAnimate/animateCssSpec.js b/test/ngAnimate/animateCssSpec.js index a4071782ab43..52182493f61a 100644 --- a/test/ngAnimate/animateCssSpec.js +++ b/test/ngAnimate/animateCssSpec.js @@ -35,12 +35,12 @@ describe("ngAnimate $animateCss", function() { }); it("should return false if neither transitions or keyframes are supported by the browser", - inject(function($animateCss, $sniffer, $rootElement, $$body) { + inject(function($animateCss, $sniffer, $rootElement, $document) { var animator; var element = jqLite('
    '); $rootElement.append(element); - $$body.append($rootElement); + jqLite($document[0].body).append($rootElement); $sniffer.transitions = $sniffer.animations = false; animator = $animateCss(element, { @@ -54,13 +54,13 @@ describe("ngAnimate $animateCss", function() { if (!browserSupportsCssAnimations()) return; it("should not attempt an animation if animations are globally disabled", - inject(function($animateCss, $animate, $rootElement, $$body) { + inject(function($animateCss, $animate, $rootElement, $document) { $animate.enabled(false); var animator, element = jqLite('
    '); $rootElement.append(element); - $$body.append($rootElement); + jqLite($document[0].body).append($rootElement); animator = $animateCss(element, { duration: 10, @@ -109,9 +109,9 @@ describe("ngAnimate $animateCss", function() { describe("rAF usage", function() { it("should buffer all requests into a single requestAnimationFrame call", - inject(function($animateCss, $$rAF, $rootScope, $$body, $rootElement) { + inject(function($animateCss, $$rAF, $rootScope, $document, $rootElement) { - $$body.append($rootElement); + jqLite($document[0].body).append($rootElement); var count = 0; var runners = []; @@ -149,8 +149,8 @@ describe("ngAnimate $animateCss", function() { }; }); }); - inject(function($animateCss, $$rAF, $$body, $rootElement) { - $$body.append($rootElement); + inject(function($animateCss, $$rAF, $document, $rootElement) { + jqLite($document[0].body).append($rootElement); function makeRequest() { var element = jqLite('
    '); @@ -169,10 +169,10 @@ describe("ngAnimate $animateCss", function() { describe("animator and runner", function() { var animationDuration = 5; var element, animator; - beforeEach(inject(function($animateCss, $rootElement, $$body) { + beforeEach(inject(function($animateCss, $rootElement, $document) { element = jqLite('
    '); $rootElement.append(element); - $$body.append($rootElement); + jqLite($document[0].body).append($rootElement); animator = $animateCss(element, { event: 'enter', @@ -365,10 +365,10 @@ describe("ngAnimate $animateCss", function() { { timeStamp: Date.now() + ((delay || 1) * 1000), elapsedTime: duration }); } - beforeEach(inject(function($rootElement, $$body) { + beforeEach(inject(function($rootElement, $document) { element = jqLite('
    '); $rootElement.append(element); - $$body.append($rootElement); + jqLite($document[0].body).append($rootElement); options = { event: 'enter', structural: true }; })); @@ -638,9 +638,9 @@ describe("ngAnimate $animateCss", function() { describe("staggering", function() { it("should apply a stagger based when an active ng-EVENT-stagger class with a transition-delay is detected", - inject(function($animateCss, $$body, $rootElement, $timeout) { + inject(function($animateCss, $document, $rootElement, $timeout) { - $$body.append($rootElement); + jqLite($document[0].body).append($rootElement); ss.addRule('.ng-enter-stagger', 'transition-delay:0.2s'); ss.addRule('.ng-enter', 'transition:2s linear all'); @@ -679,9 +679,9 @@ describe("ngAnimate $animateCss", function() { })); it("should apply a stagger based when for all provided addClass/removeClass CSS classes", - inject(function($animateCss, $$body, $rootElement, $timeout) { + inject(function($animateCss, $document, $rootElement, $timeout) { - $$body.append($rootElement); + jqLite($document[0].body).append($rootElement); ss.addRule('.red-add-stagger,' + '.blue-remove-stagger,' + @@ -749,9 +749,9 @@ describe("ngAnimate $animateCss", function() { })); it("should block the transition animation between start and animate when staggered", - inject(function($animateCss, $$body, $rootElement) { + inject(function($animateCss, $document, $rootElement) { - $$body.append($rootElement); + jqLite($document[0].body).append($rootElement); ss.addRule('.ng-enter-stagger', 'transition-delay:0.2s'); ss.addRule('.ng-enter', 'transition:2s linear all;'); @@ -780,9 +780,9 @@ describe("ngAnimate $animateCss", function() { })); it("should block (pause) the keyframe animation between start and animate when staggered", - inject(function($animateCss, $$body, $rootElement) { + inject(function($animateCss, $document, $rootElement) { - $$body.append($rootElement); + jqLite($document[0].body).append($rootElement); ss.addRule('.ng-enter-stagger', prefix + 'animation-delay:0.2s'); ss.addRule('.ng-enter', prefix + 'animation:my_animation 2s;'); @@ -809,9 +809,9 @@ describe("ngAnimate $animateCss", function() { })); it("should not apply a stagger if the transition delay value is inherited from a earlier CSS class", - inject(function($animateCss, $$body, $rootElement) { + inject(function($animateCss, $document, $rootElement) { - $$body.append($rootElement); + jqLite($document[0].body).append($rootElement); ss.addRule('.transition-animation', 'transition:2s 5s linear all;'); @@ -828,9 +828,9 @@ describe("ngAnimate $animateCss", function() { })); it("should apply a stagger only if the transition duration value is zero when inherited from a earlier CSS class", - inject(function($animateCss, $$body, $rootElement) { + inject(function($animateCss, $document, $rootElement) { - $$body.append($rootElement); + jqLite($document[0].body).append($rootElement); ss.addRule('.transition-animation', 'transition:2s 5s linear all;'); ss.addRule('.transition-animation.ng-enter-stagger', @@ -854,9 +854,9 @@ describe("ngAnimate $animateCss", function() { it("should ignore animation staggers if only transition animations were detected", - inject(function($animateCss, $$body, $rootElement) { + inject(function($animateCss, $document, $rootElement) { - $$body.append($rootElement); + jqLite($document[0].body).append($rootElement); ss.addRule('.ng-enter-stagger', prefix + 'animation-delay:0.2s'); ss.addRule('.transition-animation', 'transition:2s 5s linear all;'); @@ -874,9 +874,9 @@ describe("ngAnimate $animateCss", function() { })); it("should ignore transition staggers if only keyframe animations were detected", - inject(function($animateCss, $$body, $rootElement) { + inject(function($animateCss, $document, $rootElement) { - $$body.append($rootElement); + jqLite($document[0].body).append($rootElement); ss.addRule('.ng-enter-stagger', 'transition-delay:0.2s'); ss.addRule('.transition-animation', prefix + 'animation:2s 5s my_animation;'); @@ -894,9 +894,9 @@ describe("ngAnimate $animateCss", function() { })); it("should start on the highest stagger value if both transition and keyframe staggers are used together", - inject(function($animateCss, $$body, $rootElement, $timeout, $browser) { + inject(function($animateCss, $document, $rootElement, $timeout, $browser) { - $$body.append($rootElement); + jqLite($document[0].body).append($rootElement); ss.addRule('.ng-enter-stagger', 'transition-delay:0.5s;' + prefix + 'animation-delay:1s'); @@ -932,9 +932,9 @@ describe("ngAnimate $animateCss", function() { })); it("should apply the closing timeout ontop of the stagger timeout", - inject(function($animateCss, $$body, $rootElement, $timeout, $browser) { + inject(function($animateCss, $document, $rootElement, $timeout, $browser) { - $$body.append($rootElement); + jqLite($document[0].body).append($rootElement); ss.addRule('.ng-enter-stagger', 'transition-delay:1s;'); ss.addRule('.ng-enter', 'transition:10s linear all;'); @@ -959,9 +959,9 @@ describe("ngAnimate $animateCss", function() { })); it("should apply the closing timeout ontop of the stagger timeout with an added delay", - inject(function($animateCss, $$body, $rootElement, $timeout, $browser) { + inject(function($animateCss, $document, $rootElement, $timeout, $browser) { - $$body.append($rootElement); + jqLite($document[0].body).append($rootElement); ss.addRule('.ng-enter-stagger', 'transition-delay:1s;'); ss.addRule('.ng-enter', 'transition:10s linear all; transition-delay:50s;'); @@ -986,9 +986,9 @@ describe("ngAnimate $animateCss", function() { })); it("should issue a stagger if a stagger value is provided in the options", - inject(function($animateCss, $$body, $rootElement, $timeout) { + inject(function($animateCss, $document, $rootElement, $timeout) { - $$body.append($rootElement); + jqLite($document[0].body).append($rootElement); ss.addRule('.ng-enter', 'transition:2s linear all'); var elm, i, elements = []; @@ -1025,9 +1025,9 @@ describe("ngAnimate $animateCss", function() { })); it("should only add/remove classes once the stagger timeout has passed", - inject(function($animateCss, $$body, $rootElement, $timeout) { + inject(function($animateCss, $document, $rootElement, $timeout) { - $$body.append($rootElement); + jqLite($document[0].body).append($rootElement); var element = jqLite('
    '); $rootElement.append(element); @@ -1052,13 +1052,13 @@ describe("ngAnimate $animateCss", function() { describe("closing timeout", function() { it("should close off the animation after 150% of the animation time has passed", - inject(function($animateCss, $$body, $rootElement, $timeout) { + inject(function($animateCss, $document, $rootElement, $timeout) { ss.addRule('.ng-enter', 'transition:10s linear all;'); var element = jqLite('
    '); $rootElement.append(element); - $$body.append($rootElement); + jqLite($document[0].body).append($rootElement); var animator = $animateCss(element, { event: 'enter', structural: true }); animator.start(); @@ -1075,13 +1075,13 @@ describe("ngAnimate $animateCss", function() { })); it("should close off the animation after 150% of the animation time has passed and consider the detected delay value", - inject(function($animateCss, $$body, $rootElement, $timeout) { + inject(function($animateCss, $document, $rootElement, $timeout) { ss.addRule('.ng-enter', 'transition:10s linear all; transition-delay:30s;'); var element = jqLite('
    '); $rootElement.append(element); - $$body.append($rootElement); + jqLite($document[0].body).append($rootElement); var animator = $animateCss(element, { event: 'enter', structural: true }); animator.start(); @@ -1098,13 +1098,13 @@ describe("ngAnimate $animateCss", function() { })); it("should still resolve the animation once expired", - inject(function($animateCss, $$body, $rootElement, $timeout, $animate, $rootScope) { + inject(function($animateCss, $document, $rootElement, $timeout, $animate, $rootScope) { ss.addRule('.ng-enter', 'transition:10s linear all;'); var element = jqLite('
    '); $rootElement.append(element); - $$body.append($rootElement); + jqLite($document[0].body).append($rootElement); var animator = $animateCss(element, { event: 'enter', structural: true }); @@ -1123,13 +1123,13 @@ describe("ngAnimate $animateCss", function() { })); it("should not resolve/reject after passing if the animation completed successfully", - inject(function($animateCss, $$body, $rootElement, $timeout, $rootScope, $animate) { + inject(function($animateCss, $document, $rootElement, $timeout, $rootScope, $animate) { ss.addRule('.ng-enter', 'transition:10s linear all;'); var element = jqLite('
    '); $rootElement.append(element); - $$body.append($rootElement); + jqLite($document[0].body).append($rootElement); var animator = $animateCss(element, { event: 'enter', structural: true }); @@ -1160,7 +1160,7 @@ describe("ngAnimate $animateCss", function() { })); it("should close all stacked animations after the last timeout runs on the same element", - inject(function($animateCss, $$body, $rootElement, $timeout, $animate) { + inject(function($animateCss, $document, $rootElement, $timeout, $animate) { var now = 0; spyOn(Date, 'now').andCallFake(function() { @@ -1177,7 +1177,7 @@ describe("ngAnimate $animateCss", function() { var element = jqLite('
    '); $rootElement.append(element); - $$body.append($rootElement); + jqLite($document[0].body).append($rootElement); // timeout will be at 1500s animate(element, 'red', doneSpy); @@ -1218,11 +1218,11 @@ describe("ngAnimate $animateCss", function() { })); it("should not throw an error any pending timeout requests resolve after the element has already been removed", - inject(function($animateCss, $$body, $rootElement, $timeout, $animate) { + inject(function($animateCss, $document, $rootElement, $timeout, $animate) { var element = jqLite('
    '); $rootElement.append(element); - $$body.append($rootElement); + jqLite($document[0].body).append($rootElement); ss.addRule('.red', 'transition:1s linear all;'); @@ -1234,6 +1234,73 @@ describe("ngAnimate $animateCss", function() { $timeout.flush(); }).not.toThrow(); })); + + it("should consider a positive options.delay value for the closing timeout", + inject(function($animateCss, $rootElement, $timeout, $document) { + + var element = jqLite('
    '); + $rootElement.append(element); + jqLite($document[0].body).append($rootElement); + + var options = { + delay: 3, + duration: 3, + to: { + height: '100px' + } + }; + + var animator = $animateCss(element, options); + + animator.start(); + triggerAnimationStartFrame(); + + // At this point, the animation should still be running (closing timeout is 7500ms ... duration * 1.5 + delay => 7.5) + $timeout.flush(7000); + + expect(element.css(prefix + 'transition-delay')).toBe('3s'); + expect(element.css(prefix + 'transition-duration')).toBe('3s'); + + // Let's flush the remaining amout of time for the timeout timer to kick in + $timeout.flush(500); + + expect(element.css(prefix + 'transition-duration')).toBeOneOf('', '0s'); + expect(element.css(prefix + 'transition-delay')).toBeOneOf('', '0s'); + })); + + it("should ignore a boolean options.delay value for the closing timeout", + inject(function($animateCss, $rootElement, $timeout, $document) { + + var element = jqLite('
    '); + $rootElement.append(element); + jqLite($document[0].body).append($rootElement); + + var options = { + delay: true, + duration: 3, + to: { + height: '100px' + } + }; + + var animator = $animateCss(element, options); + + animator.start(); + triggerAnimationStartFrame(); + + // At this point, the animation should still be running (closing timeout is 4500ms ... duration * 1.5 => 4.5) + $timeout.flush(4000); + + expect(element.css(prefix + 'transition-delay')).toBeOneOf('initial', '0s'); + expect(element.css(prefix + 'transition-duration')).toBe('3s'); + + // Let's flush the remaining amout of time for the timeout timer to kick in + $timeout.flush(500); + + expect(element.css(prefix + 'transition-duration')).toBeOneOf('', '0s'); + expect(element.css(prefix + 'transition-delay')).toBeOneOf('', '0s'); + })); + }); describe("getComputedStyle", function() { @@ -1255,8 +1322,8 @@ describe("ngAnimate $animateCss", function() { } })); - return function($$body, $rootElement) { - $$body.append($rootElement); + return function($document, $rootElement) { + jqLite($document[0].body).append($rootElement); }; })); @@ -1340,7 +1407,7 @@ describe("ngAnimate $animateCss", function() { }); it('should avoid applying the same cache to an element a follow-up animation is run on the same element', - inject(function($animateCss, $rootElement, $$body) { + inject(function($animateCss, $rootElement, $document) { function endTransition(element, elapsedTime) { browserTrigger(element, 'transitionend', @@ -1357,7 +1424,7 @@ describe("ngAnimate $animateCss", function() { var element = jqLite('
    '); $rootElement.append(element); - $$body.append($rootElement); + jqLite($document[0].body).append($rootElement); startAnimation(element, 0.5, 'red'); expect(element.attr('style')).toContain('transition'); @@ -1377,14 +1444,14 @@ describe("ngAnimate $animateCss", function() { })); it("should clear cache if no animation so follow-up animation on the same element will not be from cache", - inject(function($animateCss, $rootElement, $$body, $$rAF) { + inject(function($animateCss, $rootElement, $document, $$rAF) { var element = jqLite('
    '); var options = { event: 'enter', structural: true }; $rootElement.append(element); - $$body.append($rootElement); + jqLite($document[0].body).append($rootElement); var animator = $animateCss(element, options); expect(animator.$$willAnimate).toBeFalsy(); @@ -1396,11 +1463,11 @@ describe("ngAnimate $animateCss", function() { })); it('should apply a custom temporary class when a non-structural animation is used', - inject(function($animateCss, $rootElement, $$body) { + inject(function($animateCss, $rootElement, $document) { var element = jqLite('
    '); $rootElement.append(element); - $$body.append($rootElement); + jqLite($document[0].body).append($rootElement); $animateCss(element, { event: 'super', @@ -1416,10 +1483,10 @@ describe("ngAnimate $animateCss", function() { describe("structural animations", function() { they('should decorate the element with the ng-$prop CSS class', ['enter', 'leave', 'move'], function(event) { - inject(function($animateCss, $rootElement, $$body) { + inject(function($animateCss, $rootElement, $document) { var element = jqLite('
    '); $rootElement.append(element); - $$body.append($rootElement); + jqLite($document[0].body).append($rootElement); $animateCss(element, { event: event, @@ -1433,10 +1500,10 @@ describe("ngAnimate $animateCss", function() { they('should decorate the element with the ng-$prop-active CSS class', ['enter', 'leave', 'move'], function(event) { - inject(function($animateCss, $rootElement, $$body) { + inject(function($animateCss, $rootElement, $document) { var element = jqLite('
    '); $rootElement.append(element); - $$body.append($rootElement); + jqLite($document[0].body).append($rootElement); var animator = $animateCss(element, { event: event, @@ -1454,10 +1521,10 @@ describe("ngAnimate $animateCss", function() { they('should remove the ng-$prop and ng-$prop-active CSS classes from the element once the animation is done', ['enter', 'leave', 'move'], function(event) { - inject(function($animateCss, $rootElement, $$body) { + inject(function($animateCss, $rootElement, $document) { var element = jqLite('
    '); $rootElement.append(element); - $$body.append($rootElement); + jqLite($document[0].body).append($rootElement); var animator = $animateCss(element, { event: event, @@ -1511,10 +1578,10 @@ describe("ngAnimate $animateCss", function() { they('should place a CSS transition block after the preparation function to block accidental style changes', ['enter', 'leave', 'move', 'addClass', 'removeClass'], function(event) { - inject(function($animateCss, $rootElement, $$body) { + inject(function($animateCss, $rootElement, $document) { var element = jqLite('
    '); $rootElement.append(element); - $$body.append($rootElement); + jqLite($document[0].body).append($rootElement); ss.addRule('.cool-animation', 'transition:1.5s linear all;'); element.addClass('cool-animation'); @@ -1541,10 +1608,10 @@ describe("ngAnimate $animateCss", function() { they('should not place a CSS transition block if options.skipBlocking is provided', ['enter', 'leave', 'move', 'addClass', 'removeClass'], function(event) { - inject(function($animateCss, $rootElement, $$body, $window) { + inject(function($animateCss, $rootElement, $document, $window) { var element = jqLite('
    '); $rootElement.append(element); - $$body.append($rootElement); + jqLite($document[0].body).append($rootElement); ss.addRule('.cool-animation', 'transition:1.5s linear all;'); element.addClass('cool-animation'); @@ -1582,10 +1649,10 @@ describe("ngAnimate $animateCss", function() { they('should place a CSS transition block after the preparation function even if a duration is provided', ['enter', 'leave', 'move', 'addClass', 'removeClass'], function(event) { - inject(function($animateCss, $rootElement, $$body) { + inject(function($animateCss, $rootElement, $document) { var element = jqLite('
    '); $rootElement.append(element); - $$body.append($rootElement); + jqLite($document[0].body).append($rootElement); ss.addRule('.cool-animation', 'transition:1.5s linear all;'); element.addClass('cool-animation'); @@ -1616,11 +1683,11 @@ describe("ngAnimate $animateCss", function() { }); it('should allow multiple events to be animated at the same time', - inject(function($animateCss, $rootElement, $$body) { + inject(function($animateCss, $rootElement, $document) { var element = jqLite('
    '); $rootElement.append(element); - $$body.append($rootElement); + jqLite($document[0].body).append($rootElement); $animateCss(element, { event: ['enter', 'leave', 'move'], @@ -1688,10 +1755,10 @@ describe("ngAnimate $animateCss", function() { they('should remove the class-$prop-add and class-$prop-active CSS classes from the element once the animation is done', ['enter', 'leave', 'move'], function(event) { - inject(function($animateCss, $rootElement, $$body) { + inject(function($animateCss, $rootElement, $document) { var element = jqLite('
    '); $rootElement.append(element); - $$body.append($rootElement); + jqLite($document[0].body).append($rootElement); var options = {}; options.event = event; @@ -1713,7 +1780,7 @@ describe("ngAnimate $animateCss", function() { they('should allow the class duration styles to be recalculated once started if the CSS classes being applied result new transition styles', ['add', 'remove'], function(event) { - inject(function($animateCss, $rootElement, $$body) { + inject(function($animateCss, $rootElement, $document) { var element = jqLite('
    '); @@ -1728,7 +1795,7 @@ describe("ngAnimate $animateCss", function() { } $rootElement.append(element); - $$body.append($rootElement); + jqLite($document[0].body).append($rootElement); var options = {}; options[event + 'Class'] = 'natural-class'; @@ -1749,13 +1816,13 @@ describe("ngAnimate $animateCss", function() { they('should force the class-based values to be applied early if no options.applyClassEarly is used as an option', ['enter', 'leave', 'move'], function(event) { - inject(function($animateCss, $rootElement, $$body) { + inject(function($animateCss, $rootElement, $document) { ss.addRule('.blue.ng-' + event, 'transition:2s linear all;'); var element = jqLite('
    '); $rootElement.append(element); - $$body.append($rootElement); + jqLite($document[0].body).append($rootElement); var runner = $animateCss(element, { addClass: 'blue', @@ -1790,14 +1857,45 @@ describe("ngAnimate $animateCss", function() { describe("options", function() { var element; beforeEach(module(function() { - return function($rootElement, $$body) { - $$body.append($rootElement); + return function($rootElement, $document) { + jqLite($document[0].body).append($rootElement); element = jqLite('
    '); $rootElement.append(element); }; })); + it("should not alter the provided options input in any way throughout the animation", inject(function($animateCss) { + var initialOptions = { + from: { height: '50px' }, + to: { width: '50px' }, + addClass: 'one', + removeClass: 'two', + duration: 10, + delay: 10, + structural: true, + keyframeStyle: '1s rotate', + transitionStyle: '1s linear', + stagger: 0.5, + staggerIndex: 3 + }; + + var copiedOptions = copy(initialOptions); + expect(copiedOptions).toEqual(initialOptions); + + var animator = $animateCss(element, copiedOptions); + expect(copiedOptions).toEqual(initialOptions); + + var runner = animator.start(); + expect(copiedOptions).toEqual(initialOptions); + + triggerAnimationStartFrame(); + expect(copiedOptions).toEqual(initialOptions); + + runner.end(); + expect(copiedOptions).toEqual(initialOptions); + })); + describe("[$$skipPreparationClasses]", function() { it('should not apply and remove the preparation classes to the element when true', inject(function($animateCss) { @@ -2741,10 +2839,10 @@ describe("ngAnimate $animateCss", function() { describe("[easing]", function() { var element; - beforeEach(inject(function($$body, $rootElement) { + beforeEach(inject(function($document, $rootElement) { element = jqLite('
    '); $rootElement.append(element); - $$body.append($rootElement); + jqLite($document[0].body).append($rootElement); })); it("should apply easing to a transition animation if it exists", inject(function($animateCss) { @@ -2786,6 +2884,71 @@ describe("ngAnimate $animateCss", function() { })); }); + describe("[cleanupStyles]", function() { + it("should cleanup [from] and [to] styles that have been applied for the animation when true", + inject(function($animateCss) { + + var runner = $animateCss(element, { + duration: 1, + from: { background: 'gold' }, + to: { color: 'brown' }, + cleanupStyles: true + }).start(); + + assertStyleIsPresent(element, 'background', true); + assertStyleIsPresent(element, 'color', false); + + triggerAnimationStartFrame(); + + assertStyleIsPresent(element, 'background', true); + assertStyleIsPresent(element, 'color', true); + + runner.end(); + + assertStyleIsPresent(element, 'background', false); + assertStyleIsPresent(element, 'color', false); + + function assertStyleIsPresent(element, style, bool) { + expect(element[0].style[style])[bool ? 'toBeTruthy' : 'toBeFalsy'](); + } + })); + + it('should restore existing overidden styles already present on the element when true', + inject(function($animateCss) { + + element.css('height', '100px'); + element.css('width', '111px'); + + var runner = $animateCss(element, { + duration: 1, + from: { height: '200px', 'font-size':'66px' }, + to: { height: '300px', 'font-size': '99px', width: '222px' }, + cleanupStyles: true + }).start(); + + assertStyle(element, 'height', '200px'); + assertStyle(element, 'font-size', '66px'); + assertStyle(element, 'width', '111px'); + + triggerAnimationStartFrame(); + + assertStyle(element, 'height', '300px'); + assertStyle(element, 'width', '222px'); + assertStyle(element, 'font-size', '99px'); + + runner.end(); + + assertStyle(element, 'width', '111px'); + assertStyle(element, 'height', '100px'); + + expect(element[0].style.getPropertyValue('font-size')).not.toBe('66px'); + + function assertStyle(element, prop, value) { + expect(element[0].style.getPropertyValue(prop)).toBe(value); + } + })); + }); + it('should round up long elapsedTime values to close off a CSS3 animation', inject(function($animateCss) { @@ -2812,13 +2975,13 @@ describe("ngAnimate $animateCss", function() { describe('SVG', function() { it('should properly apply transitions on an SVG element', - inject(function($animateCss, $rootScope, $compile, $$body, $rootElement) { + inject(function($animateCss, $rootScope, $compile, $document, $rootElement) { var element = $compile('' + '' + '')($rootScope); - $$body.append($rootElement); + jqLite($document[0].body).append($rootElement); $rootElement.append(element); $animateCss(element, { diff --git a/test/ngAnimate/animateSpec.js b/test/ngAnimate/animateSpec.js index 06e06a867cfa..dc665ead5398 100644 --- a/test/ngAnimate/animateSpec.js +++ b/test/ngAnimate/animateSpec.js @@ -26,12 +26,12 @@ describe("animations", function() { }); }); - inject(function($animate, $rootScope, $$body) { + inject(function($animate, $rootScope, $document) { $animate.enabled(true); element = jqLite('
    '); - $animate.enter(element, $$body); + $animate.enter(element, jqLite($document[0].body)); $rootScope.$digest(); expect(capturedAnimation).toBeTruthy(); @@ -116,7 +116,7 @@ describe("animations", function() { return overriddenAnimationRunner || defaultFakeAnimationRunner; }); - return function($rootElement, $q, $animate, $$AnimateRunner, $$body) { + return function($rootElement, $q, $animate, $$AnimateRunner, $document) { defaultFakeAnimationRunner = new $$AnimateRunner(); $animate.enabled(true); @@ -126,10 +126,28 @@ describe("animations", function() { $rootElement.append(parent); $rootElement.append(parent2); - $$body.append($rootElement); + jqLite($document[0].body).append($rootElement); }; })); + it("should not alter the provided options input in any way throughout the animation", inject(function($animate, $rootScope) { + var initialOptions = { + from: { height: '50px' }, + to: { width: '50px' }, + addClass: 'one', + removeClass: 'two' + }; + + var copiedOptions = copy(initialOptions); + expect(copiedOptions).toEqual(initialOptions); + + var runner = $animate.enter(element, parent, null, copiedOptions); + expect(copiedOptions).toEqual(initialOptions); + + $rootScope.$digest(); + expect(copiedOptions).toEqual(initialOptions); + })); + it('should animate only the specified CSS className matched within $animateProvider.classNameFilter', function() { module(function($animateProvider) { $animateProvider.classNameFilter(/only-allow-this-animation/); @@ -149,20 +167,24 @@ describe("animations", function() { }); }); - they('should nullify both options.$prop when passed into an animation if it is not a string or an array', ['addClass', 'removeClass'], function(prop) { + they('should not apply the provided options.$prop value unless it\'s a string or string-based array', ['addClass', 'removeClass'], function(prop) { inject(function($animate, $rootScope) { + var startingCssClasses = element.attr('class') || ''; + var options1 = {}; options1[prop] = function() {}; $animate.enter(element, parent, null, options1); - expect(options1[prop]).toBeFalsy(); + expect(element.attr('class')).toEqual(startingCssClasses); + $rootScope.$digest(); var options2 = {}; options2[prop] = true; $animate.leave(element, options2); - expect(options2[prop]).toBeFalsy(); + expect(element.attr('class')).toEqual(startingCssClasses); + $rootScope.$digest(); capturedAnimation = null; @@ -170,11 +192,15 @@ describe("animations", function() { var options3 = {}; if (prop === 'removeClass') { element.addClass('fatias'); + startingCssClasses = element.attr('class'); } options3[prop] = ['fatias']; $animate.enter(element, parent, null, options3); - expect(options3[prop]).toBe('fatias'); + + $rootScope.$digest(); + + expect(element.attr('class')).not.toEqual(startingCssClasses); }); }); @@ -749,7 +775,7 @@ describe("animations", function() { })); it("should disable all child animations for atleast one turn when a structural animation is issued", - inject(function($animate, $rootScope, $compile, $$body, $rootElement, $$AnimateRunner) { + inject(function($animate, $rootScope, $compile, $document, $rootElement, $$AnimateRunner) { element = $compile( '
    ' + @@ -759,7 +785,7 @@ describe("animations", function() { '
    ' )($rootScope); - $$body.append($rootElement); + jqLite($document[0].body).append($rootElement); $rootElement.append(element); var runner = new $$AnimateRunner(); @@ -808,47 +834,70 @@ describe("animations", function() { expect(capturedAnimation[0]).toBe(element); })); - it('should skip all pre-digest queued child animations when a parent structural animation is triggered', - inject(function($rootScope, $rootElement, $animate) { + describe('when a parent structural animation is triggered:', function() { - parent.append(element); + it('should skip all pre-digest queued child animations', + inject(function($rootScope, $rootElement, $animate) { - $animate.addClass(element, 'rumlow'); - $animate.move(parent, null, parent2); + parent.append(element); - expect(capturedAnimation).toBeFalsy(); - expect(capturedAnimationHistory.length).toBe(0); - $rootScope.$digest(); + $animate.addClass(element, 'rumlow'); + $animate.move(parent, null, parent2); - expect(capturedAnimation[0]).toBe(parent); - expect(capturedAnimationHistory.length).toBe(1); - })); + expect(capturedAnimation).toBeFalsy(); + expect(capturedAnimationHistory.length).toBe(0); + $rootScope.$digest(); - it('should end all ongoing post-digest child animations when a parent structural animation is triggered', - inject(function($rootScope, $rootElement, $animate) { + expect(capturedAnimation[0]).toBe(parent); + expect(capturedAnimationHistory.length).toBe(1); + })); - parent.append(element); + it('should end all ongoing post-digest child animations', + inject(function($rootScope, $rootElement, $animate) { - $animate.addClass(element, 'rumlow'); - var isCancelled = false; - overriddenAnimationRunner = extend(defaultFakeAnimationRunner, { - end: function() { - isCancelled = true; - } - }); + parent.append(element); - $rootScope.$digest(); - expect(capturedAnimation[0]).toBe(element); - expect(isCancelled).toBe(false); + $animate.addClass(element, 'rumlow'); + var isCancelled = false; + overriddenAnimationRunner = extend(defaultFakeAnimationRunner, { + end: function() { + isCancelled = true; + } + }); - // restore the default - overriddenAnimationRunner = defaultFakeAnimationRunner; - $animate.move(parent, null, parent2); - $rootScope.$digest(); - expect(capturedAnimation[0]).toBe(parent); + $rootScope.$digest(); + expect(capturedAnimation[0]).toBe(element); + expect(isCancelled).toBe(false); - expect(isCancelled).toBe(true); - })); + // restore the default + overriddenAnimationRunner = defaultFakeAnimationRunner; + $animate.move(parent, null, parent2); + $rootScope.$digest(); + expect(capturedAnimation[0]).toBe(parent); + + expect(isCancelled).toBe(true); + })); + + it('should ignore children that have animation data-attributes but no animation data', + inject(function($rootScope, $rootElement, $animate) { + + parent.append(element); + + $animate.addClass(element, 'rumlow'); + + $rootScope.$digest(); + expect(capturedAnimation[0]).toBe(element); + + // If an element is cloned during an animation, the clone has the data-attributes indicating + // an animation + var clone = element.clone(); + parent.append(clone); + + $animate.move(parent, null, parent2); + $rootScope.$digest(); + expect(capturedAnimation[0]).toBe(parent); + })); + }); it('should not end any child animations if a parent class-based animation is issued', inject(function($rootScope, $rootElement, $animate) { @@ -890,7 +939,6 @@ describe("animations", function() { }); $rootScope.$digest(); - $animate.flush(); expect(capturedAnimation).toBeTruthy(); expect(runner1done).toBeFalsy(); @@ -910,7 +958,6 @@ describe("animations", function() { }); $rootScope.$digest(); - $animate.flush(); expect(capturedAnimation).toBeTruthy(); expect(runner2done).toBeFalsy(); @@ -990,8 +1037,6 @@ describe("animations", function() { var doneHandler = jasmine.createSpy('addClass done'); runner.done(doneHandler); - $animate.flush(); - expect(doneHandler).not.toHaveBeenCalled(); $animate.removeClass(element, 'active-class'); @@ -1011,8 +1056,6 @@ describe("animations", function() { var doneHandler = jasmine.createSpy('addClass done'); runner.done(doneHandler); - $animate.flush(); - expect(doneHandler).not.toHaveBeenCalled(); $animate.addClass(element, 'active-class'); @@ -1284,8 +1327,8 @@ describe("animations", function() { return new $$AnimateRunner(); }; }); - return function($rootElement, $$body, $animate) { - $$body.append($rootElement); + return function($rootElement, $document, $animate) { + jqLite($document[0].body).append($rootElement); parent = jqLite('
    '); element = jqLite('
    '); child = jqLite('
    '); @@ -1388,40 +1431,75 @@ describe("animations", function() { }); })); - it('should allow an element to pinned elsewhere and still be available in animations', - inject(function($animate, $compile, $$body, $rootElement, $rootScope) { - - var innerParent = jqLite('
    '); - $$body.append(innerParent); - innerParent.append($rootElement); + it('should throw if the arguments are not elements', + inject(function($animate, $compile, $document, $rootScope, $rootElement) { var element = jqLite('
    '); - $$body.append(element); - $animate.addClass(element, 'red'); - $rootScope.$digest(); - expect(capturedAnimation).toBeFalsy(); + expect(function() { + $animate.pin(element); + }).toThrowMinErr('ng', 'areq', 'Argument \'parentElement\' is not an element'); - $animate.pin(element, $rootElement); - - $animate.addClass(element, 'blue'); - $rootScope.$digest(); - expect(capturedAnimation).toBeTruthy(); + expect(function() { + $animate.pin(null, $rootElement); + }).toThrowMinErr('ng', 'areq', 'Argument \'element\' is not an element'); dealoc(element); })); + + they('should animate an element inside a pinned element that is the $prop element', + ['same', 'parent', 'grandparent'], + function(elementRelation) { + inject(function($animate, $compile, $document, $rootElement, $rootScope) { + + var pinElement, animateElement; + + var innerParent = jqLite('
    '); + jqLite($document[0].body).append(innerParent); + innerParent.append($rootElement); + + switch (elementRelation) { + case 'same': + pinElement = jqLite('
    '); + break; + case 'parent': + pinElement = jqLite('
    '); + break; + case 'grandparent': + pinElement = jqLite('
    '); + break; + } + + jqLite($document[0].body).append(pinElement); + animateElement = jqLite($document[0].getElementById('animate')); + + $animate.addClass(animateElement, 'red'); + $rootScope.$digest(); + expect(capturedAnimation).toBeFalsy(); + + // Pin the element to the app root to enable animations + $animate.pin(pinElement, $rootElement); + + $animate.addClass(animateElement, 'blue'); + $rootScope.$digest(); + expect(capturedAnimation).toBeTruthy(); + + dealoc(pinElement); + }); + }); + it('should adhere to the disabled state of the hosted parent when an element is pinned', - inject(function($animate, $compile, $$body, $rootElement, $rootScope) { + inject(function($animate, $compile, $document, $rootElement, $rootScope) { var innerParent = jqLite('
    '); - $$body.append(innerParent); + jqLite($document[0].body).append(innerParent); innerParent.append($rootElement); var innerChild = jqLite('
    '); $rootElement.append(innerChild); var element = jqLite('
    '); - $$body.append(element); + jqLite($document[0].body).append(element); $animate.pin(element, innerChild); @@ -1456,17 +1534,17 @@ describe("animations", function() { }; }); - return function($$body, $rootElement, $animate) { - $$body.append($rootElement); + return function($document, $rootElement, $animate) { + jqLite($document[0].body).append($rootElement); $animate.enabled(true); }; })); it('should trigger a callback for an enter animation', - inject(function($animate, $rootScope, $rootElement, $$body) { + inject(function($animate, $rootScope, $rootElement, $document) { var callbackTriggered = false; - $animate.on('enter', $$body, function() { + $animate.on('enter', jqLite($document[0].body), function() { callbackTriggered = true; }); @@ -1480,12 +1558,12 @@ describe("animations", function() { })); it('should fire the callback with the signature of (element, phase, data)', - inject(function($animate, $rootScope, $rootElement, $$body) { + inject(function($animate, $rootScope, $rootElement, $document) { var capturedElement; var capturedPhase; var capturedData; - $animate.on('enter', $$body, + $animate.on('enter', jqLite($document[0].body), function(element, phase, data) { capturedElement = element; @@ -1519,7 +1597,6 @@ describe("animations", function() { element = jqLite('
    '); $animate.enter(element, $rootElement); $rootScope.$digest(); - $animate.flush(); expect(callbackTriggered).toBe(false); })); @@ -1544,13 +1621,13 @@ describe("animations", function() { })); it('should remove all the event-based event listeners when $animate.off(event) is called', - inject(function($animate, $rootScope, $rootElement, $$body) { + inject(function($animate, $rootScope, $rootElement, $document) { element = jqLite('
    '); var count = 0; $animate.on('enter', element, counter); - $animate.on('enter', $$body, counter); + $animate.on('enter', jqLite($document[0].body), counter); function counter(element, phase) { count++; @@ -1572,13 +1649,13 @@ describe("animations", function() { })); it('should remove the container-based event listeners when $animate.off(event, container) is called', - inject(function($animate, $rootScope, $rootElement, $$body) { + inject(function($animate, $rootScope, $rootElement, $document) { element = jqLite('
    '); var count = 0; $animate.on('enter', element, counter); - $animate.on('enter', $$body, counter); + $animate.on('enter', jqLite($document[0].body), counter); function counter(element, phase) { if (phase === 'start') { @@ -1592,7 +1669,7 @@ describe("animations", function() { expect(count).toBe(2); - $animate.off('enter', $$body); + $animate.off('enter', jqLite($document[0].body)); $animate.enter(element, $rootElement); $rootScope.$digest(); @@ -1638,13 +1715,13 @@ describe("animations", function() { })); it('should fire a `start` callback when the animation starts with the matching element', - inject(function($animate, $rootScope, $rootElement, $$body) { + inject(function($animate, $rootScope, $rootElement, $document) { element = jqLite('
    '); var capturedState; var capturedElement; - $animate.on('enter', $$body, function(element, phase) { + $animate.on('enter', jqLite($document[0].body), function(element, phase) { capturedState = phase; capturedElement = element; }); @@ -1658,13 +1735,13 @@ describe("animations", function() { })); it('should fire a `close` callback when the animation ends with the matching element', - inject(function($animate, $rootScope, $rootElement, $$body) { + inject(function($animate, $rootScope, $rootElement, $document) { element = jqLite('
    '); var capturedState; var capturedElement; - $animate.on('enter', $$body, function(element, phase) { + $animate.on('enter', jqLite($document[0].body), function(element, phase) { capturedState = phase; capturedElement = element; }); @@ -1707,6 +1784,69 @@ describe("animations", function() { expect(count).toBe(1); })); + it('should always detect registered callbacks after one postDigest has fired', + inject(function($animate, $rootScope, $rootElement) { + + element = jqLite('
    '); + + var spy = jasmine.createSpy(); + registerCallback(); + + var runner = $animate.enter(element, $rootElement); + registerCallback(); + + $rootScope.$digest(); + registerCallback(); + + expect(spy.callCount).toBe(0); + $animate.flush(); + + // this is not 3 since the 3rd callback + // was added after the first callback + // was fired + expect(spy.callCount).toBe(2); + + spy.reset(); + runner.end(); + + $animate.flush(); + + // now we expect all three callbacks + // to fire when the animation ends since + // the callback detection happens again + expect(spy.callCount).toBe(3); + + function registerCallback() { + $animate.on('enter', element, spy); + } + })); + + it('should use RAF if there are detected callbacks within the hierachy of the element being animated', + inject(function($animate, $rootScope, $rootElement, $$rAF) { + + var runner; + + element = jqLite('
    '); + runner = $animate.enter(element, $rootElement); + $rootScope.$digest(); + runner.end(); + + assertRAFsUsed(false); + + var spy = jasmine.createSpy(); + $animate.on('leave', element, spy); + + runner = $animate.leave(element, $rootElement); + $rootScope.$digest(); + runner.end(); + + assertRAFsUsed(true); + + function assertRAFsUsed(bool) { + expect($$rAF.queue.length)[bool ? 'toBeGreaterThan' : 'toBe'](0); + } + })); + it('leave: should remove the element even if another animation is called after', inject(function($animate, $rootScope, $rootElement) { @@ -1725,5 +1865,86 @@ describe("animations", function() { expect(isElementRemoved).toBe(true); })); + it('leave : should trigger a callback for an leave animation', + inject(function($animate, $rootScope, $$rAF, $rootElement, $document) { + + var callbackTriggered = false; + $animate.on('leave', jqLite($document[0].body), function() { + callbackTriggered = true; + }); + + element = jqLite('
    '); + $rootElement.append(element); + $animate.leave(element, $rootElement); + $rootScope.$digest(); + + $$rAF.flush(); + + expect(callbackTriggered).toBe(true); + })); + + it('leave : should not fire a callback if the element is outside of the given container', + inject(function($animate, $rootScope, $$rAF, $rootElement) { + + var callbackTriggered = false; + var innerContainer = jqLite('
    '); + $rootElement.append(innerContainer); + + $animate.on('leave', innerContainer, + function(element, phase, data) { + callbackTriggered = true; + }); + + element = jqLite('
    '); + $rootElement.append(element); + $animate.leave(element, $rootElement); + $rootScope.$digest(); + + expect(callbackTriggered).toBe(false); + })); + + it('leave : should fire a `start` callback when the animation starts with the matching element', + inject(function($animate, $rootScope, $$rAF, $rootElement, $document) { + + element = jqLite('
    '); + + var capturedState; + var capturedElement; + $animate.on('leave', jqLite($document[0].body), function(element, phase) { + capturedState = phase; + capturedElement = element; + }); + + $rootElement.append(element); + $animate.leave(element, $rootElement); + $rootScope.$digest(); + $$rAF.flush(); + + expect(capturedState).toBe('start'); + expect(capturedElement).toBe(element); + })); + + it('leave : should fire a `close` callback when the animation ends with the matching element', + inject(function($animate, $rootScope, $$rAF, $rootElement, $document) { + + element = jqLite('
    '); + + var capturedState; + var capturedElement; + $animate.on('leave', jqLite($document[0].body), function(element, phase) { + capturedState = phase; + capturedElement = element; + }); + + $rootElement.append(element); + var runner = $animate.leave(element, $rootElement); + $rootScope.$digest(); + runner.end(); + $$rAF.flush(); + + expect(capturedState).toBe('close'); + expect(capturedElement).toBe(element); + })); + }); }); diff --git a/test/ngAnimate/animationSpec.js b/test/ngAnimate/animationSpec.js index ff5d998076cf..04ba3e5949a3 100644 --- a/test/ngAnimate/animationSpec.js +++ b/test/ngAnimate/animationSpec.js @@ -836,8 +836,8 @@ describe('$$animation', function() { element = jqLite('
    '); parent = jqLite('
    '); - return function($$AnimateRunner, $q, $rootElement, $$body) { - $$body.append($rootElement); + return function($$AnimateRunner, $rootElement, $document) { + jqLite($document[0].body).append($rootElement); $rootElement.append(parent); mockedDriverFn = function(element, method, options, domOperation) { diff --git a/test/ngAnimate/bodySpec.js b/test/ngAnimate/bodySpec.js deleted file mode 100644 index f87dabf1e355..000000000000 --- a/test/ngAnimate/bodySpec.js +++ /dev/null @@ -1,9 +0,0 @@ -'use strict'; - -describe('$$body', function() { - beforeEach(module('ngAnimate')); - - it("should inject $document", inject(function($$body, $document) { - expect($$body).toEqual(jqLite($document[0].body)); - })); -}); diff --git a/test/ngAnimate/integrationSpec.js b/test/ngAnimate/integrationSpec.js index 5e1e335b72f4..feb28e581456 100644 --- a/test/ngAnimate/integrationSpec.js +++ b/test/ngAnimate/integrationSpec.js @@ -7,12 +7,12 @@ describe('ngAnimate integration tests', function() { var element, html, ss; beforeEach(module(function() { - return function($rootElement, $document, $$body, $window, $animate) { + return function($rootElement, $document, $window, $animate) { $animate.enabled(true); ss = createMockStyleSheet($document, $window); - var body = $$body; + var body = jqLite($document[0].body); html = function(element) { body.append($rootElement); $rootElement.append(element); @@ -319,6 +319,38 @@ describe('ngAnimate integration tests', function() { } }); }); + + it('should trigger callbacks at the start and end of an animation', + inject(function($rootScope, $rootElement, $animate, $compile) { + + ss.addRule('.animate-me', 'transition:2s linear all;'); + + var parent = jqLite('
    '); + element = parent.find('div'); + html(parent); + + $compile(parent)($rootScope); + $rootScope.$digest(); + + var spy = jasmine.createSpy(); + $animate.on('enter', parent, spy); + + $rootScope.exp = true; + $rootScope.$digest(); + + element = parent.find('div'); + + $animate.flush(); + + expect(spy.callCount).toBe(1); + + browserTrigger(element, 'transitionend', { timeStamp: Date.now(), elapsedTime: 2 }); + $animate.flush(); + + expect(spy.callCount).toBe(2); + + dealoc(element); + })); }); describe('JS animations', function() { @@ -530,5 +562,50 @@ describe('ngAnimate integration tests', function() { } }); }); + + it("should not alter the provided options values in anyway throughout the animation", function() { + var animationSpy = jasmine.createSpy(); + module(function($animateProvider) { + $animateProvider.register('.this-animation', function() { + return { + enter: function(element, done) { + animationSpy(); + done(); + } + }; + }); + }); + + inject(function($animate, $rootScope, $compile) { + element = jqLite('
    '); + var child = jqLite('
    '); + + var initialOptions = { + from: { height: '50px' }, + to: { width: '100px' }, + addClass: 'one', + removeClass: 'two' + }; + + var copiedOptions = copy(initialOptions); + expect(copiedOptions).toEqual(initialOptions); + + html(element); + $compile(element)($rootScope); + + $animate.enter(child, element, null, copiedOptions); + $rootScope.$digest(); + expect(copiedOptions).toEqual(initialOptions); + + $animate.flush(); + expect(copiedOptions).toEqual(initialOptions); + + expect(child).toHaveClass('one'); + expect(child).not.toHaveClass('two'); + + expect(child.attr('style')).toContain('100px'); + expect(child.attr('style')).toContain('50px'); + }); + }); }); }); diff --git a/test/ngAria/ariaSpec.js b/test/ngAria/ariaSpec.js index 911e6aab73d5..73b015f710c3 100644 --- a/test/ngAria/ariaSpec.js +++ b/test/ngAria/ariaSpec.js @@ -616,16 +616,18 @@ describe('$aria', function() { describe('tabindex', function() { beforeEach(injectScopeAndCompiler); - it('should not attach to native controls', function() { - var element = [ - $compile("")(scope), - $compile("")(scope), - $compile("")(scope), - $compile("")(scope), - $compile("")(scope), - $compile("
    ")(scope) - ]; - expectAriaAttrOnEachElement(element, 'tabindex', undefined); + they('should not attach to native control $prop', { + 'button': "", + 'a': "
    ", + 'input[text]': "", + 'input[radio]': "", + 'input[checkbox]': "", + 'textarea': "", + 'select': "", + 'details': "
    " + }, function(html) { + compileElement(html); + expect(element.attr('tabindex')).toBeUndefined(); }); it('should not attach to random ng-model elements', function() { diff --git a/test/ngMessages/messagesSpec.js b/test/ngMessages/messagesSpec.js index 037175031ded..3d4f1100f06c 100644 --- a/test/ngMessages/messagesSpec.js +++ b/test/ngMessages/messagesSpec.js @@ -372,6 +372,50 @@ describe('ngMessages', function() { expect(trim(element.text())).toEqual("Enter something"); })); + // issue #12856 + it('should only detach the message object that is associated with the message node being removed', + inject(function($rootScope, $compile, $animate) { + + // We are going to spy on the `leave` method to give us control over + // when the element is actually removed + spyOn($animate, 'leave'); + + // Create a basic ng-messages set up + element = $compile('
    ' + + '
    Enter something
    ' + + '
    ')($rootScope); + + // Trigger the message to be displayed + $rootScope.col = { primary: true }; + $rootScope.$digest(); + expect(messageChildren(element).length).toEqual(1); + var oldMessageNode = messageChildren(element)[0]; + + // Remove the message + $rootScope.col = { primary: undefined }; + $rootScope.$digest(); + + // Since we have spied on the `leave` method, the message node is still in the DOM + expect($animate.leave).toHaveBeenCalledOnce(); + var nodeToRemove = $animate.leave.mostRecentCall.args[0][0]; + expect(nodeToRemove).toBe(oldMessageNode); + $animate.leave.reset(); + + // Add the message back in + $rootScope.col = { primary: true }; + $rootScope.$digest(); + + // Simulate the animation completing on the node + jqLite(nodeToRemove).remove(); + + // We should not get another call to `leave` + expect($animate.leave).not.toHaveBeenCalled(); + + // There should only be the new message node + expect(messageChildren(element).length).toEqual(1); + var newMessageNode = messageChildren(element)[0]; + expect(newMessageNode).not.toBe(oldMessageNode); + })); it('should render animations when the active/inactive classes are added/removed', function() { module('ngAnimate'); diff --git a/test/ngResource/resourceSpec.js b/test/ngResource/resourceSpec.js index 0fa7fc52959b..560f71ac1f3d 100644 --- a/test/ngResource/resourceSpec.js +++ b/test/ngResource/resourceSpec.js @@ -156,7 +156,7 @@ describe("resource", function() { }); - it('should ignore slashes of undefinend parameters', function() { + it('should ignore slashes of undefined parameters', function() { var R = $resource('/Path/:a/:b/:c'); $httpBackend.when('GET', '/Path').respond('{}'); @@ -181,7 +181,7 @@ describe("resource", function() { R.get({a:6, b:7, c:8}); }); - it('should not ignore leading slashes of undefinend parameters that have non-slash trailing sequence', function() { + it('should not ignore leading slashes of undefined parameters that have non-slash trailing sequence', function() { var R = $resource('/Path/:a.foo/:b.bar/:c.baz'); $httpBackend.when('GET', '/Path/.foo/.bar.baz').respond('{}'); @@ -242,7 +242,7 @@ describe("resource", function() { }); it('should not encode @ in url params', function() { - //encodeURIComponent is too agressive and doesn't follow http://www.ietf.org/rfc/rfc3986.txt + //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 //so we need this test to make sure that we don't over-encode the params and break stuff like //buzz api which uses @self @@ -1355,6 +1355,48 @@ describe('resource', function() { /^\[\$resource:badcfg\] Error in resource configuration for action `get`\. Expected response to contain an object but got an array \(Request: GET \/Customer\/123\)/ ); }); +}); + +describe('resource with promises as `timeout`', function() { + var httpSpy; + var $httpBackend; + var $resource; + + beforeEach(module('ngResource', function($provide) { + $provide.decorator('$http', function($delegate) { + httpSpy = jasmine.createSpy('$http').andCallFake($delegate); + return httpSpy; + }); + })); + + beforeEach(inject(function(_$httpBackend_, _$resource_) { + $httpBackend = _$httpBackend_; + $resource = _$resource_; + })); + it('should ignore non-numeric timeouts in actions and log a $debug message', + inject(function($log, $q) { + spyOn($log, 'debug'); + $httpBackend.whenGET('/CreditCard').respond({}); + + var CreditCard = $resource('/CreditCard', {}, { + get: { + method: 'GET', + timeout: $q.defer().promise + } + }); + + CreditCard.get(); + $httpBackend.flush(); + expect(httpSpy).toHaveBeenCalledOnce(); + expect(httpSpy.calls[0].args[0].timeout).toBeUndefined(); + expect($log.debug).toHaveBeenCalledOnceWith('ngResource:\n' + + ' Only numeric values are allowed as `timeout`.\n' + + ' Promises are not supported in $resource, because the same value would ' + + 'be used for multiple requests.\n' + + ' If you need support for cancellable $resource actions, you should ' + + 'upgrade to version 1.5 or higher.'); + }) + ); });