From 08120612741421da9e702d70e41e586314a30209 Mon Sep 17 00:00:00 2001 From: Takashi Nakagawa Date: Tue, 4 Mar 2014 21:23:05 +0900 Subject: [PATCH 001/837] chore(grunt): remove unnecessary white spaces --- lib/grunt/utils.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/lib/grunt/utils.js b/lib/grunt/utils.js index b9affd822601..a736033da36c 100644 --- a/lib/grunt/utils.js +++ b/lib/grunt/utils.js @@ -26,7 +26,7 @@ var getRandomPorts = function() { var getPackage = function() { if ( !pkg ) { - // Search up the folder hierarchy for the first package.json + // Search up the folder hierarchy for the first package.json var packageFolder = path.resolve('.'); while ( !fs.existsSync(path.join(packageFolder, 'package.json')) ) { var parent = path.dirname(packageFolder); @@ -34,7 +34,7 @@ var getPackage = function() { packageFolder = parent; } pkg = JSON.parse(fs.readFileSync(path.join(packageFolder,'package.json'), 'UTF-8')); - + } return pkg; @@ -225,7 +225,7 @@ module.exports = { }, - updateWebdriver: function(done){ + updateWebdriver: function(done){ if (process.env.TRAVIS) { // Skip the webdriver-manager update on Travis, since the browsers will // be provided remotely. From a72bc4e69f4482136e0cde28cec6b4531fcac940 Mon Sep 17 00:00:00 2001 From: Sharon DiOrio Date: Mon, 9 Dec 2013 16:39:28 -0500 Subject: [PATCH 002/837] docs(tutorial/index): improve accessibility - Adds accessibility attributes to links and images. - Adds a note on using NVM for node. --- docs/content/tutorial/index.ngdoc | 63 ++++++++++++++++++------------- 1 file changed, 36 insertions(+), 27 deletions(-) diff --git a/docs/content/tutorial/index.ngdoc b/docs/content/tutorial/index.ngdoc index dfceb03ba1d1..67a1f50161e5 100644 --- a/docs/content/tutorial/index.ngdoc +++ b/docs/content/tutorial/index.ngdoc @@ -9,7 +9,8 @@ the construction of an AngularJS web app. The app you will build is a catalog th of Android devices, lets you filter the list to see only devices that interest you, and then view details for any device. - +demo
+application running in the browser Work through the tutorial to see how Angular makes browsers smarter — without the use of extensions or plug-ins. As you work through the tutorial, you will: @@ -57,63 +58,71 @@ and follow the instructions for setting up your computer.
  1. You'll need Git, which you can get from - the Git site.

  2. + the Git site.

  3. Clone the angular-phonecat repository located at - Github by running the following command:

    + Github by + running the following command:

    git clone https://github.com/angular/angular-phonecat.git
    -

    This command creates the angular-phonecat directory in your current -directory.

  4. +

    This command creates the angular-phonecat directory in your current directory.

  5. Change your current directory to angular-phonecat:

    cd angular-phonecat
    -

    The tutorial instructions, from now on, assume you are running all commands from the angular-phonecat -directory.

  6. +

    The tutorial instructions, from now on, assume you are running all commands from the + angular-phonecat directory.

  7. You will also need Node.js and Karma to run unit tests, so please verify that you have - Node.js v0.10 or better installed + Node.js v0.10 or better installed and that the node executable is on your PATH by running the following command in a terminal window:

  8. node --version
    -

    Additionally install Karma and its plugins if you - don't have it already:

    +
    **Helpful note:** If you need to run a different version of + node.js in your local environment, consider installing + + Node Version Manager (nvm).
    +

    Additionally install Karma and + its plugins if you don't have it already:

           npm install
           
  9. You will need an http server running on your system. Mac and Linux machines typically -have Apache pre-installed, but If you don't already have one installed, you can use node -to run a simple bundled http server: node scripts/web-server.js.

  10. + have Apache pre-installed, but If you don't already have one installed, you can use node + to run scripts/web-server.js, a simple bundled http server.

  1. You will need Node.js and Karma to run unit tests, so please verify that you have - Node.js v0.10 or better installed + Node.js v0.10 or better installed and that the node executable is on your PATH by running the following command in a terminal window:

    node --version
    -

    Additionally install Karma if you - don't have it already:

    +
    **Helpful note:** If you need to run a different version of + node.js in your local environment, consider installing + + Node Version Manager (nvm).
    +

    Additionally install Karma + if you don't have it already:

    npm install -g karma
  2. You'll also need Git, which you can get from - the Git site.

  3. + the Git site.

  4. Clone the angular-phonecat repository located at Github by running the following command:

    -
    git clone https://github.com/angular/angular-phonecat.git
    + href="https://github.com/angular/angular-phonecat" "Github Angular-phonecat Repo">Github by running + the following command:

    git clone https://github.com/angular/angular-phonecat.git

    This command creates the angular-phonecat directory in your current directory.

  5. Change your current directory to angular-phonecat:

    cd angular-phonecat

    The tutorial instructions assume you are running all commands from the angular-phonecat -directory.

    + directory.

    You should run all git commands from Git bash.

    -

    Other commands like test.bat or e2e-test.bat should be -executed from the Windows command line.

  6. -
  7. You need an http server running on your system, but if you don't already have one -already installed, you can use node to run a simple -bundled http server: node scripts\web-server.js.

  8. +

    Other commands like test.bat or e2e-test.bat should be executed from the + Windows command line. +

  9. You need an http server running on your system, but if you don't already have one already + installed, you can use node to run scripts\web-server.js, a simple bundled + http server.

-The last thing to do is to make sure your computer has a web browser and a good text editor -installed. Now, let's get some cool stuff done! +The last thing to do is to make sure your computer has a web browser and a good text editor installed. Now, +let's get some cool stuff done! -{@link step_00 Get Started!} +Get Started! From 73250089cdb43446bf35c4368eaa43c5aeebf878 Mon Sep 17 00:00:00 2001 From: Chung-Min Cheng Date: Tue, 4 Mar 2014 21:03:19 +0900 Subject: [PATCH 003/837] docs(tutorial): update step_08.ngdoc Closes #6537 --- docs/content/tutorial/step_08.ngdoc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/content/tutorial/step_08.ngdoc b/docs/content/tutorial/step_08.ngdoc index 25de2cb8b8cf..ed085731d909 100644 --- a/docs/content/tutorial/step_08.ngdoc +++ b/docs/content/tutorial/step_08.ngdoc @@ -107,7 +107,7 @@ __`app/partials/phone-detail.html`:__ ... - +
  • Additional Features
    {{phone.additionalFeatures}}
  • From 229a155aef431e5f45db918d8e97a8f87114935e Mon Sep 17 00:00:00 2001 From: mgerstenblatt Date: Wed, 5 Mar 2014 15:51:43 -0500 Subject: [PATCH 004/837] docs(guide/forms): fix a typo Closes #6556 --- docs/content/guide/forms.ngdoc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/content/guide/forms.ngdoc b/docs/content/guide/forms.ngdoc index ba2eb499f7dd..0b91fc61f8ee 100644 --- a/docs/content/guide/forms.ngdoc +++ b/docs/content/guide/forms.ngdoc @@ -56,7 +56,7 @@ Note that `novalidate` is used to disable browser's native form validation. # Using CSS classes -To allow styling of form as well as controls, `ngModel` add these CSS classes: +To allow styling of form as well as controls, `ngModel` adds these CSS classes: - `ng-valid` - `ng-invalid` From 6d4ce240de18fc71c97635ae93a4738c59606e41 Mon Sep 17 00:00:00 2001 From: Zak Johnson Date: Wed, 5 Mar 2014 13:16:02 -0800 Subject: [PATCH 005/837] docs(guide/services): clean up typos --- docs/content/guide/services.ngdoc | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/docs/content/guide/services.ngdoc b/docs/content/guide/services.ngdoc index d92be1426c59..86458f5f1cfc 100644 --- a/docs/content/guide/services.ngdoc +++ b/docs/content/guide/services.ngdoc @@ -11,10 +11,10 @@ Angular services are: * Lazily instantiated – Angular only instantiates a service when an application component depends on it. -* Singletons – Each component is dependent on a service gets a reference to the single instance +* Singletons – Each component dependent on a service gets a reference to the single instance generated by the service factory. -Angular offers several useful services (like {@link ng.$http `$http`}) but for most applications +Angular offers several useful services (like {@link ng.$http `$http`}), but for most applications you'll also want to {@link services#creating-services create your own}.
    @@ -215,8 +215,8 @@ In the example, note that: {@link ng.$log `$log`} services. * The `routeTemplateMonitor` service depends on the built-in {@link ngRoute.$route `$route`} service and our custom `batchLog` service. -* Both services use the and array notation to declare their dependencies. -* That the order of identifiers in the array is the same as the order of argument +* Both services use the array notation to declare their dependencies. +* The order of identifiers in the array is the same as the order of argument names in the factory function. ### Registering a Service with `$provide` @@ -234,7 +234,7 @@ angular.module('myModule', []).config(function($provide) { }); ``` -This is technique is often used in unit tests to mock out a service's dependencies. +This technique is often used in unit tests to mock out a service's dependencies. ## Unit Testing From 84f36701bc70079f5bb983aaa5b24d7b46c49299 Mon Sep 17 00:00:00 2001 From: tpiere Date: Sun, 26 Jan 2014 10:21:07 -0600 Subject: [PATCH 006/837] docs(tutorial): update step_09.ngdoc Closes #5991 --- docs/content/tutorial/step_09.ngdoc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/content/tutorial/step_09.ngdoc b/docs/content/tutorial/step_09.ngdoc index e95025fbfa2a..a3c6c6adabcf 100644 --- a/docs/content/tutorial/step_09.ngdoc +++ b/docs/content/tutorial/step_09.ngdoc @@ -40,13 +40,13 @@ The name of our filter is "checkmark". The `input` evaluates to either `true` or return one of the two unicode characters we have chosen to represent true (`\u2713` -> ✓) or false (`\u2718` -> ✘). Now that our filter is ready, we need to register the `phonecatFilters` module as a dependency for -our main `phonecat` module. +our main `phonecatApp` module. __`app/js/app.js`:__ ```js ... -angular.module('phonecatApp', ['phonecatFilters']). +angular.module('phonecatApp', ['ngRoute','phonecatControllers','phonecatFilters']). ... ``` From f39ac571c4b21a90e8422206d0a5bb75846ebfca Mon Sep 17 00:00:00 2001 From: Tony Bergeron Date: Wed, 5 Mar 2014 11:06:32 -0600 Subject: [PATCH 007/837] docs(directive.ngdoc): typo fix --- docs/content/guide/directive.ngdoc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/content/guide/directive.ngdoc b/docs/content/guide/directive.ngdoc index e80bb8bbad08..cadae1b30060 100644 --- a/docs/content/guide/directive.ngdoc +++ b/docs/content/guide/directive.ngdoc @@ -295,7 +295,7 @@ The `restrict` option is typically set to: These restictions can all be combined as needed: -* `'AEC'` - matches either attribure or element or class name +* `'AEC'` - matches either attribute or element or class name Let's change our directive to use `restrict: 'E'`: From 8c7b9b8de432e4fa6267ce7c58fca85f68001b01 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Timoth=C3=A9e=20Jeannin?= Date: Tue, 4 Mar 2014 20:39:10 +0100 Subject: [PATCH 008/837] style: enable jscs requireLeftStickedOperators rule Closed #6544. --- .jscs.json | 3 ++- .jscs.json.todo | 1 - src/jqLite.js | 2 +- src/ngSanitize/sanitize.js | 2 +- test/auto/injectorSpec.js | 2 +- test/ng/sceSpecs.js | 2 +- test/ngTouch/directive/ngSwipeSpec.js | 4 ++-- test/ngTouch/swipeSpec.js | 4 ++-- 8 files changed, 10 insertions(+), 10 deletions(-) diff --git a/.jscs.json b/.jscs.json index 0fc84a6639e5..440737e1f2a9 100644 --- a/.jscs.json +++ b/.jscs.json @@ -1,5 +1,6 @@ { "disallowKeywords": ["with"], "disallowTrailingWhitespace": true, - "requireRightStickedOperators": ["!"] + "requireRightStickedOperators": ["!"], + "requireLeftStickedOperators": [","] } diff --git a/.jscs.json.todo b/.jscs.json.todo index 96326dce1082..1fb8c28d9018 100644 --- a/.jscs.json.todo +++ b/.jscs.json.todo @@ -8,7 +8,6 @@ "requireSpaceAfterKeywords": ["if", "else", "for", "while", "do", "switch", "return", "try", "catch"], "disallowLeftStickedOperators": ["?", "+", "-", "/", "*", "=", "==", "===", "!=", "!==", ">", ">=", "<", "<="], "disallowRightStickedOperators": ["?", "+", "/", "*", ":", "=", "==", "===", "!=", "!==", ">", ">=", "<", "<="], - "requireLeftStickedOperators": [","], "disallowImplicitTypeConversion": ["string"], "disallowMultipleLineBreaks": true, "disallowKeywordsOnNewLine": ["else"], diff --git a/src/jqLite.js b/src/jqLite.js index 809ede034a00..ba613f218f9e 100644 --- a/src/jqLite.js +++ b/src/jqLite.js @@ -457,7 +457,7 @@ forEach({ return jqLite(element).data('$isolateScope') || jqLite(element).data('$isolateScopeNoTemplate'); }, - controller: jqLiteController , + controller: jqLiteController, injector: function(element) { return jqLiteInheritedData(element, '$injector'); diff --git a/src/ngSanitize/sanitize.js b/src/ngSanitize/sanitize.js index 35dc8f100bec..38d088bbe407 100644 --- a/src/ngSanitize/sanitize.js +++ b/src/ngSanitize/sanitize.js @@ -254,7 +254,7 @@ function htmlParser( html, handler ) { match = html.match( DOCTYPE_REGEXP ); if ( match ) { - html = html.replace( match[0] , ''); + html = html.replace( match[0], ''); chars = false; } // end tag diff --git a/test/auto/injectorSpec.js b/test/auto/injectorSpec.js index a70cd763793e..4b9679784c0e 100644 --- a/test/auto/injectorSpec.js +++ b/test/auto/injectorSpec.js @@ -163,7 +163,7 @@ describe('injector', function() { function $f_n0 /* */( $a, // x, <-- looks like an arg but it is a comment - b_ , /* z, <-- looks like an arg but it is a + b_, /* z, <-- looks like an arg but it is a multi-line comment function (a, b) {} */ diff --git a/test/ng/sceSpecs.js b/test/ng/sceSpecs.js index e2a16c1cbc0f..40e79c5737ff 100644 --- a/test/ng/sceSpecs.js +++ b/test/ng/sceSpecs.js @@ -109,7 +109,7 @@ describe('SCE', function() { })); it('should NOT wrap unknown contexts', inject(function($sce) { - expect(function() { $sce.trustAs('unknown1' , '123'); }).toThrowMinErr( + expect(function() { $sce.trustAs('unknown1', '123'); }).toThrowMinErr( '$sce', 'icontext', 'Attempted to trust a value in invalid context. Context: unknown1; Value: 123'); })); diff --git a/test/ngTouch/directive/ngSwipeSpec.js b/test/ngTouch/directive/ngSwipeSpec.js index 2aa1a8fe338d..b46a9384e5f9 100644 --- a/test/ngTouch/directive/ngSwipeSpec.js +++ b/test/ngTouch/directive/ngSwipeSpec.js @@ -222,6 +222,6 @@ var swipeTests = function(description, restrictBrowsers, startEvent, moveEvent, }); } -swipeTests('touch', true /* restrictBrowers */, 'touchstart', 'touchmove', 'touchend'); -swipeTests('mouse', false /* restrictBrowers */, 'mousedown', 'mousemove', 'mouseup'); +swipeTests('touch', /* restrictBrowers */ true, 'touchstart', 'touchmove', 'touchend'); +swipeTests('mouse', /* restrictBrowers */ false, 'mousedown', 'mousemove', 'mouseup'); diff --git a/test/ngTouch/swipeSpec.js b/test/ngTouch/swipeSpec.js index 435dda8c0109..1eb53e45d619 100644 --- a/test/ngTouch/swipeSpec.js +++ b/test/ngTouch/swipeSpec.js @@ -387,6 +387,6 @@ var swipeTests = function(description, restrictBrowsers, startEvent, moveEvent, }); } -swipeTests('touch', true /* restrictBrowers */, 'touchstart', 'touchmove', 'touchend'); -swipeTests('mouse', false /* restrictBrowers */, 'mousedown', 'mousemove', 'mouseup'); +swipeTests('touch', /* restrictBrowers */ true, 'touchstart', 'touchmove', 'touchend'); +swipeTests('mouse', /* restrictBrowers */ false, 'mousedown', 'mousemove', 'mouseup'); From 4c4d24a33802e630fac848978156c3697f70ceae Mon Sep 17 00:00:00 2001 From: Chirayu Krishnappa Date: Wed, 5 Mar 2014 11:20:38 -0800 Subject: [PATCH 009/837] chore(publish.sh): publish to all serving backends --- scripts/code.angularjs.org/publish.sh | 34 ++++++++++++++++++++------- 1 file changed, 26 insertions(+), 8 deletions(-) diff --git a/scripts/code.angularjs.org/publish.sh b/scripts/code.angularjs.org/publish.sh index 4845ad2ace70..fdbadf3b7908 100755 --- a/scripts/code.angularjs.org/publish.sh +++ b/scripts/code.angularjs.org/publish.sh @@ -55,19 +55,37 @@ function prepare { git commit -m "v$NEW_VERSION" } -function publish { - if [[ $IS_SNAPSHOT_BUILD ]]; then - echo "-- Updating snapshot version" - curl -G --data-urlencode "ver=$NEW_VERSION" http://code.angularjs.org/fetchLatestSnapshot.php - exit 0; - fi +function _update_snapshot() { + for backend in "$@" ; do + echo "-- Updating snapshot version: backend=$backend" + curl -G --data-urlencode "ver=$NEW_VERSION" http://$backend:8003/fetchLatestSnapshot.php + done +} + +function _update_code() { cd $REPO_DIR + echo "-- Pushing code.angularjs.org" git push origin master - echo "-- Refreshing code.angularjs.org" - curl http://code.angularjs.org/gitFetchSite.php + for backend in "$@" ; do + echo "-- Refreshing code.angularjs.org: backend=$backend" + curl http://$backend:8003/gitFetchSite.php + done +} + +function publish { + # The TXT record for backends.angularjs.org is a CSV of the IP addresses for + # the currently serving Compute Engine backends. + # code.angularjs.org is served out of port 8003 on these backends. + backends=("$(dig backends.angularjs.org +short TXT | python -c 'print raw_input()[1:-1].replace(",", "\n")')") + + if [[ $IS_SNAPSHOT_BUILD ]]; then + _update_snapshot ${backends[@]} + else + _update_code ${backends[@]} + fi } source $(dirname $0)/../utils.inc From 1c20aed31801eac10e31214593f8f9d0a2a8430b Mon Sep 17 00:00:00 2001 From: Misha Moroshko Date: Thu, 6 Mar 2014 15:06:55 +1100 Subject: [PATCH 010/837] docs(guide/services): minor fixes --- docs/content/guide/services.ngdoc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/content/guide/services.ngdoc b/docs/content/guide/services.ngdoc index 86458f5f1cfc..bc2a4f85d143 100644 --- a/docs/content/guide/services.ngdoc +++ b/docs/content/guide/services.ngdoc @@ -19,7 +19,7 @@ you'll also want to {@link services#creating-services create your own}.
    **Note:** Like other core Angular identifiers built-in services always start with `$` -(i.e. `$http`). +(e.g. `$http`).
    @@ -129,7 +129,7 @@ injection of `$window`, `$scope`, and our `notify` service: -
    +
    **Careful:** If you plan to [minify](http://en.wikipedia.org/wiki/Minification_(programming) your code, your variable names will get renamed unless you use one of the annotation techniques above.
    From e8c8c5459e552d795fe9995038a5090efa727098 Mon Sep 17 00:00:00 2001 From: Eddie Hedges Date: Thu, 6 Mar 2014 21:50:01 -0600 Subject: [PATCH 011/837] docs(tutorial): link update for Jasmine Jasmine doesn't live at the replaced link anymore. It has a link to click through, but I figured it would be better to just go directly to the correct location. Closes #6591 --- docs/content/tutorial/step_02.ngdoc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/content/tutorial/step_02.ngdoc b/docs/content/tutorial/step_02.ngdoc index 37e91ef74716..83512e9ff882 100644 --- a/docs/content/tutorial/step_02.ngdoc +++ b/docs/content/tutorial/step_02.ngdoc @@ -183,7 +183,7 @@ is available to be injected. ### Writing and Running Tests Angular developers prefer the syntax of Jasmine's Behavior-driven Development (BDD) framework when writing tests. Although Angular does not require you to use Jasmine, we wrote all of the tests in -this tutorial in Jasmine. You can learn about Jasmine on the [Jasmine home page](http://pivotal.github.com/jasmine/) and at the [Jasmine docs](http://pivotal.github.io/jasmine/). +this tutorial in Jasmine. You can learn about Jasmine on the [Jasmine home page](http://jasmine.github.io/) and at the [Jasmine docs](http://jasmine.github.io/). The angular-seed project is pre-configured to run all unit tests using [Karma](http://karma-runner.github.io/). Ensure that the necessary karma plugins are installed. You can do this by issuing `npm install` into your terminal. From 021d3aa21a4b7f2ea69a4a9bff7a7ff7986d343c Mon Sep 17 00:00:00 2001 From: Peter Bacon Darwin Date: Fri, 7 Mar 2014 05:33:21 +0000 Subject: [PATCH 012/837] chore(doc-gen): improve error reporting --- docs/config/processors/pages-data.js | 9 +++------ docs/docs.config.js | 2 ++ docs/gulpfile.js | 6 +++++- 3 files changed, 10 insertions(+), 7 deletions(-) diff --git a/docs/config/processors/pages-data.js b/docs/config/processors/pages-data.js index 43fdc9ddb747..1b93b021a2b7 100644 --- a/docs/config/processors/pages-data.js +++ b/docs/config/processors/pages-data.js @@ -145,6 +145,9 @@ module.exports = { _(docs) .filter(function(doc) { return doc.area === 'api'; }) .filter(function(doc) { return doc.docType === 'module'; }) + .forEach(function(doc) { if ( !doc.path ) { + log.warn('Missing path property for ', doc.id); + }}) .map(function(doc) { return _.pick(doc, ['id', 'module', 'docType', 'area']); }) .tap(function(docs) { log.debug(docs); @@ -188,12 +191,6 @@ module.exports = { area.navGroups = navGroupMapper(pages, area); }); - _.forEach(docs, function(doc) { - if ( !doc.path ) { - log.warn('Missing path property for ', doc.id); - } - }); - // Extract a list of basic page information for mapping paths to paritals and for client side searching var pages = _(docs) .map(function(doc) { diff --git a/docs/docs.config.js b/docs/docs.config.js index c1539cb64152..62fd6066ffd8 100644 --- a/docs/docs.config.js +++ b/docs/docs.config.js @@ -25,6 +25,8 @@ module.exports = function(config) { { pattern: '**/*.ngdoc', basePath: path.resolve(basePath, 'content') } ]); + config.set('processing.stopOnError', true); + config.set('processing.errors.minerrInfoPath', path.resolve(basePath, '../build/errors.json')); config.set('rendering.outputFolder', '../build/docs'); diff --git a/docs/gulpfile.js b/docs/gulpfile.js index caef1a89e414..c47c04f5b606 100644 --- a/docs/gulpfile.js +++ b/docs/gulpfile.js @@ -49,7 +49,11 @@ gulp.task('assets', ['bower'], function() { gulp.task('doc-gen', function() { - return docGenerator('docs.config.js').generateDocs(); + return docGenerator('docs.config.js') + .generateDocs() + .catch(function(error) { + process.exit(1); + }); }); // JSHint the example and protractor test files From 1537f8026726c9bf818e27cb361c47446857a2d8 Mon Sep 17 00:00:00 2001 From: Peter Bacon Darwin Date: Fri, 7 Mar 2014 05:34:13 +0000 Subject: [PATCH 013/837] chore(doc-gen): fix error-doc processor The meta-data should be parsed from the name not the id. --- docs/config/processors/error-docs.js | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/docs/config/processors/error-docs.js b/docs/config/processors/error-docs.js index 3fed96c578d5..2543190d1d8e 100644 --- a/docs/config/processors/error-docs.js +++ b/docs/config/processors/error-docs.js @@ -22,6 +22,12 @@ module.exports = { _.forEach(docs, function(doc) { if ( doc.docType === 'error' ) { + // Parse out the error info from the id + parts = doc.name.split(':'); + doc.namespace = parts[0]; + doc.name = parts[1]; + + var namespaceDoc = errorNamespaces[doc.namespace]; if ( !namespaceDoc ) { // First time we came across this namespace, so create a new one From 50ce5746a7265b403ca47e9a8d149c6a8e88e745 Mon Sep 17 00:00:00 2001 From: Peter Bacon Darwin Date: Fri, 7 Mar 2014 11:18:55 +0000 Subject: [PATCH 014/837] docs($route): fix formatting of example code --- src/ngRoute/route.js | 193 ++++++++++++++++++++++--------------------- 1 file changed, 97 insertions(+), 96 deletions(-) diff --git a/src/ngRoute/route.js b/src/ngRoute/route.js index a1236ec9341b..80aef0344c7f 100644 --- a/src/ngRoute/route.js +++ b/src/ngRoute/route.js @@ -262,102 +262,103 @@ function $RouteProvider(){ * {@link ngRoute.$routeParams `$routeParams`} service. * * @example - This example shows how changing the URL hash causes the `$route` to match a route against the - URL, and the `ngView` pulls in the partial. - - Note that this example is using {@link ng.directive:script inlined templates} - to get it working on jsfiddle as well. - - - -
    - Choose: - Moby | - Moby: Ch1 | - Gatsby | - Gatsby: Ch4 | - Scarlet Letter
    - -
    -
    - -
    $location.path() = {{$location.path()}}
    -
    $route.current.templateUrl = {{$route.current.templateUrl}}
    -
    $route.current.params = {{$route.current.params}}
    -
    $route.current.scope.name = {{$route.current.scope.name}}
    -
    $routeParams = {{$routeParams}}
    -
    -
    - - - controller: {{name}}
    - Book Id: {{params.bookId}}
    -
    - - - controller: {{name}}
    - Book Id: {{params.bookId}}
    - Chapter Id: {{params.chapterId}} -
    - - - angular.module('ngRouteExample', ['ngRoute']) - - .config(function($routeProvider, $locationProvider) { - $routeProvider.when('/Book/:bookId', { - templateUrl: 'book.html', - controller: BookCntl, - resolve: { - // I will cause a 1 second delay - delay: function($q, $timeout) { - var delay = $q.defer(); - $timeout(delay.resolve, 1000); - return delay.promise; - } - } - }); - $routeProvider.when('/Book/:bookId/ch/:chapterId', { - templateUrl: 'chapter.html', - controller: ChapterCntl - }); - - // configure html5 to get links working on jsfiddle - $locationProvider.html5Mode(true); - }); - - function MainCntl($scope, $route, $routeParams, $location) { - $scope.$route = $route; - $scope.$location = $location; - $scope.$routeParams = $routeParams; - } - - function BookCntl($scope, $routeParams) { - $scope.name = "BookCntl"; - $scope.params = $routeParams; - } - - function ChapterCntl($scope, $routeParams) { - $scope.name = "ChapterCntl"; - $scope.params = $routeParams; - } - - - - it('should load and compile correct template', function() { - element(by.linkText('Moby: Ch1')).click(); - var content = element(by.css('[ng-view]')).getText(); - expect(content).toMatch(/controller\: ChapterCntl/); - expect(content).toMatch(/Book Id\: Moby/); - expect(content).toMatch(/Chapter Id\: 1/); - - element(by.partialLinkText('Scarlet')).click(); - - content = element(by.css('[ng-view]')).getText(); - expect(content).toMatch(/controller\: BookCntl/); - expect(content).toMatch(/Book Id\: Scarlet/); - }); - -
    + * This example shows how changing the URL hash causes the `$route` to match a route against the + * URL, and the `ngView` pulls in the partial. + * + * Note that this example is using {@link ng.directive:script inlined templates} + * to get it working on jsfiddle as well. + * + * + * + *
    + * Choose: + * Moby | + * Moby: Ch1 | + * Gatsby | + * Gatsby: Ch4 | + * Scarlet Letter
    + * + *
    + *
    + * + *
    $location.path() = {{$location.path()}}
    + *
    $route.current.templateUrl = {{$route.current.templateUrl}}
    + *
    $route.current.params = {{$route.current.params}}
    + *
    $route.current.scope.name = {{$route.current.scope.name}}
    + *
    $routeParams = {{$routeParams}}
    + *
    + *
    + * + * + * controller: {{name}}
    + * Book Id: {{params.bookId}}
    + *
    + * + * + * controller: {{name}}
    + * Book Id: {{params.bookId}}
    + * Chapter Id: {{params.chapterId}} + *
    + * + * + * angular.module('ngRouteExample', ['ngRoute']) + * + * .config(function($routeProvider, $locationProvider) { + * $routeProvider.when('/Book/:bookId', { + * templateUrl: 'book.html', + * controller: BookCntl, + * resolve: { + * // I will cause a 1 second delay + * delay: function($q, $timeout) { + * var delay = $q.defer(); + * $timeout(delay.resolve, 1000); + * return delay.promise; + * } + * } + * }); + * $routeProvider.when('/Book/:bookId/ch/:chapterId', { + * templateUrl: 'chapter.html', + * controller: ChapterCntl + * }); + * + * // configure html5 to get links working on jsfiddle + * $locationProvider.html5Mode(true); + * }); + * + * function MainCntl($scope, $route, $routeParams, $location) { + * $scope.$route = $route; + * $scope.$location = $location; + * $scope.$routeParams = $routeParams; + * } + * + * function BookCntl($scope, $routeParams) { + * $scope.name = "BookCntl"; + * $scope.params = $routeParams; + * } + * + * function ChapterCntl($scope, $routeParams) { + * $scope.name = "ChapterCntl"; + * $scope.params = $routeParams; + * } + * + * + * + * it('should load and compile correct template', function() { + * element(by.linkText('Moby: Ch1')).click(); + * var content = element(by.css('[ng-view]')).getText(); + * expect(content).toMatch(/controller\: ChapterCntl/); + * expect(content).toMatch(/Book Id\: Moby/); + * expect(content).toMatch(/Chapter Id\: 1/); + * + * element(by.partialLinkText('Scarlet')).click(); + * + * content = element(by.css('[ng-view]')).getText(); + * expect(content).toMatch(/controller\: BookCntl/); + * expect(content).toMatch(/Book Id\: Scarlet/); + * }); + * + *
    */ /** From 2eff3267819737d1cc457800fd86a846acbf1b1e Mon Sep 17 00:00:00 2001 From: Peter Bacon Darwin Date: Fri, 7 Mar 2014 11:18:55 +0000 Subject: [PATCH 015/837] chore(doc-gen): add inline @type tag --- docs/config/index.js | 4 ++++ docs/config/inline-tag-defs/type.js | 12 ++++++++++++ 2 files changed, 16 insertions(+) create mode 100644 docs/config/inline-tag-defs/type.js diff --git a/docs/config/index.js b/docs/config/index.js index 9dfa4abf710f..5aca987a4298 100644 --- a/docs/config/index.js +++ b/docs/config/index.js @@ -25,6 +25,10 @@ module.exports = function(config) { require('./tag-defs/tutorial-step') ]); + config.append('processing.inlineTagDefinitions', [ + require('./inline-tag-defs/type') + ]); + config.set('processing.search.ignoreWordsFile', path.resolve(packagePath, 'ignore.words')); config.prepend('rendering.templateFolders', [ diff --git a/docs/config/inline-tag-defs/type.js b/docs/config/inline-tag-defs/type.js new file mode 100644 index 000000000000..b0a11b5a63ac --- /dev/null +++ b/docs/config/inline-tag-defs/type.js @@ -0,0 +1,12 @@ +var typeClassFilter = require('dgeni-packages/ngdoc/rendering/filters/type-class'); +var encoder = new require('node-html-encoder').Encoder(); + +module.exports = { + name: 'type', + description: 'Replace with markup that displays a nice type', + handlerFactory: function() { + return function(doc, tagName, tagDescription) { + return ''+encoder.htmlEncode(tagDescription) + ''; + }; + } +}; From dec5eb6e837e41a33787852dde8feae545987fb2 Mon Sep 17 00:00:00 2001 From: Peter Bacon Darwin Date: Fri, 7 Mar 2014 11:18:55 +0000 Subject: [PATCH 016/837] chore(doc-gen): add contentFolder config property --- docs/docs.config.js | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/docs.config.js b/docs/docs.config.js index 62fd6066ffd8..2e163254877e 100644 --- a/docs/docs.config.js +++ b/docs/docs.config.js @@ -30,6 +30,7 @@ module.exports = function(config) { config.set('processing.errors.minerrInfoPath', path.resolve(basePath, '../build/errors.json')); config.set('rendering.outputFolder', '../build/docs'); + config.set('rendering.contentsFolder', 'partials'); config.set('logging.level', 'info'); From 7678501bc9358d93cbd95bec93426685ad7c8561 Mon Sep 17 00:00:00 2001 From: Peter Bacon Darwin Date: Fri, 7 Mar 2014 11:18:55 +0000 Subject: [PATCH 017/837] chore(package): update dgeni dependencies --- package.json | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/package.json b/package.json index 629b736007f8..bd55594c2aac 100644 --- a/package.json +++ b/package.json @@ -50,10 +50,11 @@ "gulp-concat": "~2.1.7", "canonical-path": "0.0.2", "winston": "~0.7.2", - "dgeni": "~0.2.0", - "dgeni-packages": "^0.3.0", + "dgeni": "^0.2.2", + "dgeni-packages": "^0.6.0", "gulp-jshint": "~1.4.2", - "jshint-stylish": "~0.1.5" + "jshint-stylish": "~0.1.5", + "node-html-encoder": "0.0.2" }, "licenses": [ { From ca0ac649971ae4fb50419b38f92a98d2226eb696 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lucas=20Galfas=C3=B3?= Date: Mon, 17 Feb 2014 13:02:58 +0100 Subject: [PATCH 018/837] fix($compile): support templates with thead and tfoot root elements If the first element in a template is a or a , then use the existing logic to handle table elements compilation. Closes #6289 --- src/ng/compile.js | 17 +++++++-------- test/ng/compileSpec.js | 48 ++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 56 insertions(+), 9 deletions(-) diff --git a/src/ng/compile.js b/src/ng/compile.js index 5b625c193478..c7cd08bce127 100644 --- a/src/ng/compile.js +++ b/src/ng/compile.js @@ -503,7 +503,7 @@ function $CompileProvider($provide, $$sanitizeUriProvider) { Suffix = 'Directive', COMMENT_DIRECTIVE_REGEXP = /^\s*directive\:\s*([\d\w\-_]+)\s+(.*)$/, CLASS_DIRECTIVE_REGEXP = /(([\d\w\-_]+)(?:\:([^;]+))?;?)/, - TABLE_CONTENT_REGEXP = /^<\s*(tr|th|td|tbody)(\s+[^>]*)?>/i; + TABLE_CONTENT_REGEXP = /^<\s*(tr|th|td|thead|tbody|tfoot)(\s+[^>]*)?>/i; // Ref: http://developers.whatwg.org/webappapis.html#event-handler-idl-attributes // The assumption is that future DOM event attribute names will begin with @@ -1649,16 +1649,15 @@ function $CompileProvider($provide, $$sanitizeUriProvider) { template = trim(template); if ((type = TABLE_CONTENT_REGEXP.exec(template))) { type = type[1].toLowerCase(); - var table = jqLite('' + template + '
    '), - tbody = table.children('tbody'), - leaf = /(td|th)/.test(type) && table.find('tr'); - if (tbody.length && type !== 'tbody') { - table = tbody; + var table = jqLite('' + template + '
    '); + if (/(thead|tbody|tfoot)/.test(type)) { + return table.children(type); } - if (leaf && leaf.length) { - table = leaf; + table = table.children('tbody'); + if (type === 'tr') { + return table.children('tr'); } - return table.contents(); + return table.children('tr').contents(); } return jqLite('
    ' + template + diff --git a/test/ng/compileSpec.js b/test/ng/compileSpec.js index 98b1650f7706..5110c4d62634 100755 --- a/test/ng/compileSpec.js +++ b/test/ng/compileSpec.js @@ -529,10 +529,18 @@ describe('$compile', function() { replace: true, template: 'TH' })); + directive('replaceWithThead', valueFn({ + replace: true, + template: 'TD' + })); directive('replaceWithTbody', valueFn({ replace: true, template: 'TD' })); + directive('replaceWithTfoot', valueFn({ + replace: true, + template: 'TD' + })); })); @@ -718,12 +726,26 @@ describe('$compile', function() { expect(nodeName_(element)).toMatch(/th/i); })); + it('should support templates with root tags', inject(function($compile, $rootScope) { + expect(function() { + element = $compile('
    ')($rootScope); + }).not.toThrow(); + expect(nodeName_(element)).toMatch(/thead/i); + })); + it('should support templates with root tags', inject(function($compile, $rootScope) { expect(function() { element = $compile('
    ')($rootScope); }).not.toThrow(); expect(nodeName_(element)).toMatch(/tbody/i); })); + + it('should support templates with root tags', inject(function($compile, $rootScope) { + expect(function() { + element = $compile('
    ')($rootScope); + }).not.toThrow(); + expect(nodeName_(element)).toMatch(/tfoot/i); + })); }); @@ -833,10 +855,18 @@ describe('$compile', function() { replace: true, templateUrl: 'th.html' })); + directive('replaceWithThead', valueFn({ + replace: true, + templateUrl: 'thead.html' + })); directive('replaceWithTbody', valueFn({ replace: true, templateUrl: 'tbody.html' })); + directive('replaceWithTfoot', valueFn({ + replace: true, + templateUrl: 'tfoot.html' + })); } )); @@ -1500,6 +1530,15 @@ describe('$compile', function() { expect(nodeName_(element)).toMatch(/th/i); })); + it('should support templates with root tags', inject(function($compile, $rootScope, $templateCache) { + $templateCache.put('thead.html', 'TD'); + expect(function() { + element = $compile('
    ')($rootScope); + }).not.toThrow(); + $rootScope.$digest(); + expect(nodeName_(element)).toMatch(/thead/i); + })); + it('should support templates with root tags', inject(function($compile, $rootScope, $templateCache) { $templateCache.put('tbody.html', 'TD'); expect(function() { @@ -1508,6 +1547,15 @@ describe('$compile', function() { $rootScope.$digest(); expect(nodeName_(element)).toMatch(/tbody/i); })); + + it('should support templates with root tags', inject(function($compile, $rootScope, $templateCache) { + $templateCache.put('tfoot.html', 'TD'); + expect(function() { + element = $compile('
    ')($rootScope); + }).not.toThrow(); + $rootScope.$digest(); + expect(nodeName_(element)).toMatch(/tfoot/i); + })); }); From a8aba8957be799823391168352a435fe60e3fc7d Mon Sep 17 00:00:00 2001 From: Peter Bacon Darwin Date: Tue, 11 Mar 2014 06:34:09 +0000 Subject: [PATCH 019/837] docs(versions): rework the version info extraction The docs were relying on the grunt/util module for getting version info but this was unreliable and full of custom regexes. This is moved into a new version-info module that makes much better use of the semver library. --- docs/config/processors/git-data.js | 7 +- docs/config/templates/indexPage.template.html | 2 +- docs/docs.config.js | 5 +- lib/versions/version-info.js | 157 ++++++++++++++++++ 4 files changed, 164 insertions(+), 7 deletions(-) create mode 100644 lib/versions/version-info.js diff --git a/docs/config/processors/git-data.js b/docs/config/processors/git-data.js index 229864bb920f..16bbef43c67d 100644 --- a/docs/config/processors/git-data.js +++ b/docs/config/processors/git-data.js @@ -1,4 +1,5 @@ var gruntUtils = require('../../../lib/grunt/utils'); +var versionInfo = require('../../../lib/versions/version-info'); module.exports = { name: 'git-data', @@ -6,9 +7,9 @@ module.exports = { description: 'This processor adds information from the local git repository to the extraData injectable', init: function(config, injectables) { injectables.value('gitData', { - version: gruntUtils.getVersion(), - versions: gruntUtils.getPreviousVersions(), - info: gruntUtils.getGitRepoInfo() + version: versionInfo.currentVersion, + versions: versionInfo.previousVersions, + info: versionInfo.gitRepoInfo }); }, process: function(extraData, gitData) { diff --git a/docs/config/templates/indexPage.template.html b/docs/config/templates/indexPage.template.html index 9582c825abe7..0dfe6cc0d412 100644 --- a/docs/config/templates/indexPage.template.html +++ b/docs/config/templates/indexPage.template.html @@ -175,7 +175,7 @@

    {{ key }}

    - {{size}}
    - This is not valid integer! - - The value must be in range 0 to 10! -
    - -
    - Length (float): - - {{length}}
    - - This is not a valid float number! -
    - -
    +
    +
    + Size (integer 0 - 10): + {{size}}
    + This is not valid integer! + + The value must be in range 0 to 10! +
    + +
    + Length (float): + + {{length}}
    + + This is not a valid float number! +
    +
    From a43c6e18282409a60074be2039f20554d63de77b Mon Sep 17 00:00:00 2001 From: doodeec Date: Wed, 5 Mar 2014 18:23:22 +0100 Subject: [PATCH 036/837] docs($route): change routes property to correct type change $route.routes property type to Object, property is marked incorrectly as an Array Closes #6552 --- src/ngRoute/route.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ngRoute/route.js b/src/ngRoute/route.js index 80aef0344c7f..1044eb271322 100644 --- a/src/ngRoute/route.js +++ b/src/ngRoute/route.js @@ -247,7 +247,7 @@ function $RouteProvider(){ * - `$scope` - The current route scope. * - `$template` - The current route template HTML. * - * @property {Array.} routes Array of all configured routes. + * @property {Object} routes Object with all route configuration Objects as its properties. * * @description * `$route` is used for deep-linking URLs to controllers and views (HTML partials). From 98f6a82390db04101744c74d063630195ce5a308 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Matias=20Niemel=C3=A4?= Date: Mon, 10 Mar 2014 15:07:29 -0400 Subject: [PATCH 037/837] chore(docs): ensure the "Improve this doc" button is clickable Closes #6631 --- docs/app/assets/css/docs.css | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/docs/app/assets/css/docs.css b/docs/app/assets/css/docs.css index 64f2e4b76ed4..98c0bec677f3 100644 --- a/docs/app/assets/css/docs.css +++ b/docs/app/assets/css/docs.css @@ -501,10 +501,6 @@ h4 { padding-top:20px; } -.improve-docs { - float:right; -} - .btn { color:#428bca; position: relative; @@ -538,10 +534,17 @@ h4 { background:white!important; } +.view-source, .improve-docs { + position:relative; + z-index:100; +} + .view-source { margin-right:10px; - padding-right:10px; - border-right:1px solid #999; +} + +.improve-docs { + float:right; } .return-arguments, From 1102ffaaf8afb3d985965220bc32d3126703ad49 Mon Sep 17 00:00:00 2001 From: Basem Mostafa Date: Mon, 10 Mar 2014 22:55:57 +0200 Subject: [PATCH 038/837] docs(ngRepeat): Separate animation class in new lines Moving to new lines & making it bold to avoid confusion when they r all in same line without any separation Closes #6633 --- src/ng/directive/ngRepeat.js | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/ng/directive/ngRepeat.js b/src/ng/directive/ngRepeat.js index c6a9bda3f48a..11f35c56e84c 100644 --- a/src/ng/directive/ngRepeat.js +++ b/src/ng/directive/ngRepeat.js @@ -68,9 +68,11 @@ * as **data-ng-repeat-start**, **x-ng-repeat-start** and **ng:repeat-start**). * * @animations - * enter - when a new item is added to the list or when an item is revealed after a filter - * leave - when an item is removed from the list or when an item is filtered out - * move - when an adjacent item is filtered out causing a reorder or when the item contents are reordered + * **.enter** - when a new item is added to the list or when an item is revealed after a filter + * + * **.leave** - when an item is removed from the list or when an item is filtered out + * + * **.move** - when an adjacent item is filtered out causing a reorder or when the item contents are reordered * * @element ANY * @scope From 465663ed77f9fc0bed2b69b95d545c7f99c40cbd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Louis=20Hau=C3=9Fknecht?= Date: Mon, 10 Mar 2014 21:56:48 +0100 Subject: [PATCH 039/837] docs(route.js): changed html entities lt gt to < and > --- src/ngRoute/route.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/ngRoute/route.js b/src/ngRoute/route.js index 1044eb271322..1319dd02cf7a 100644 --- a/src/ngRoute/route.js +++ b/src/ngRoute/route.js @@ -82,7 +82,7 @@ function $RouteProvider(){ * * If `template` is a function, it will be called with the following parameters: * - * - `{Array.<Object>}` - route parameters extracted from the current + * - `{Array.}` - route parameters extracted from the current * `$location.path()` by applying the current route * * - `templateUrl` – `{string=|function()=}` – path or function that returns a path to an html @@ -90,7 +90,7 @@ function $RouteProvider(){ * * If `templateUrl` is a function, it will be called with the following parameters: * - * - `{Array.<Object>}` - route parameters extracted from the current + * - `{Array.}` - route parameters extracted from the current * `$location.path()` by applying the current route * * - `resolve` - `{Object.=}` - An optional map of dependencies which should From f2a6be3129fd6de02062c3798ef25d0eeecbd0de Mon Sep 17 00:00:00 2001 From: Igor Minar Date: Thu, 6 Mar 2014 02:15:24 -0800 Subject: [PATCH 040/837] chore(build): don't instruct Jenkins test on IE for an unknown reason the VMs can't connect to local karma, so all builds on Jenkins (ci.angularjs.org) are failing right now. Since we want to kill Jenkins anyway, and travis tests on IE, this should not have any significant impact on us. Conflicts: jenkins_build.sh --- jenkins_build.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/jenkins_build.sh b/jenkins_build.sh index 806eb0f2c95f..b6800082e21f 100755 --- a/jenkins_build.sh +++ b/jenkins_build.sh @@ -10,7 +10,7 @@ set -xe # Define reasonable set of browsers in case we are running manually from commandline if [[ -z "$BROWSERS" ]] then - BROWSERS="Chrome,Firefox,Opera,/Users/jenkins/bin/safari.sh,/Users/jenkins/bin/ie8.sh,/Users/jenkins/bin/ie9.sh" + BROWSERS="Chrome,Firefox,Opera,/Users/jenkins/bin/safari.sh" fi # CLEAN # From 612c882b839c029e4a4632c45ecc9b2e2f4d45d4 Mon Sep 17 00:00:00 2001 From: Igor Minar Date: Tue, 11 Mar 2014 16:31:50 -0700 Subject: [PATCH 041/837] chore(npm): add shrinkwrap to lock down dependencies We need to be able to build angular at older shas, without the lock file / shrinkwrap file the dependencies will resolve differently on different machines and at different times. This will help us avoid broken builds and hard to track down issues. I had to manually edit this file after it was generated because `npm shrinkwrap` will install optional dependencies as if they were hard dependencies. See: https://github.com/npm/npm/issues/2679#issuecomment-37361236 My manual edit: ``` diff --git a/npm-shrinkwrap.json b/npm-shrinkwrap.json index 756df44..dc157eb 100644 --- a/npm-shrinkwrap.json +++ b/npm-shrinkwrap.json @@ -3110,19 +3110,7 @@ "chokidar": { "version": "0.8.1", "from": "https://registry.npmjs.org/chokidar/-/chokidar-0.8.1.tgz", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-0.8.1.tgz", - "dependencies": { - "fsevents": { - "version": "0.1.6", - "from": "fsevents@0.1.6", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-0.1.6.tgz" - }, - "recursive-readdir": { - "version": "0.0.2", - "from": "recursive-readdir@0.0.2", - "resolved": "https://registry.npmjs.org/recursive-readdir/-/recursive-readdir-0.0.2.tgz" - } - } + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-0.8.1.tgz" }, "glob": { "version": "3.2.9", ``` Additionally chokidar doesn't list the dependencies above as optional, but that will hopefully be soon fixed: https://github.com/paulmillr/chokidar/pull/106 In the meantime the patch from the PR above needs to be applied to node_modules/karma/node_modules/chokidar/package.json before running `npm shrinkwrap` ---- After this change is applied, angular core developers don't need to do anything differently, except when updating dependencies we need to call `npm update && npm shrinkwrap --dev` followed by reappling my patch above until npm's bug. Closes #6653 --- npm-shrinkwrap.json | 4325 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 4325 insertions(+) create mode 100644 npm-shrinkwrap.json diff --git a/npm-shrinkwrap.json b/npm-shrinkwrap.json new file mode 100644 index 000000000000..dc157ebaed31 --- /dev/null +++ b/npm-shrinkwrap.json @@ -0,0 +1,4325 @@ +{ + "name": "angularjs", + "dependencies": { + "bower": { + "version": "1.2.8", + "from": "https://registry.npmjs.org/bower/-/bower-1.2.8.tgz", + "resolved": "https://registry.npmjs.org/bower/-/bower-1.2.8.tgz", + "dependencies": { + "abbrev": { + "version": "1.0.4", + "from": "abbrev@1.0.4", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.0.4.tgz" + }, + "archy": { + "version": "0.0.2", + "from": "https://registry.npmjs.org/archy/-/archy-0.0.2.tgz", + "resolved": "https://registry.npmjs.org/archy/-/archy-0.0.2.tgz" + }, + "bower-config": { + "version": "0.5.0", + "from": "https://registry.npmjs.org/bower-config/-/bower-config-0.5.0.tgz", + "resolved": "https://registry.npmjs.org/bower-config/-/bower-config-0.5.0.tgz", + "dependencies": { + "mout": { + "version": "0.6.0", + "from": "https://registry.npmjs.org/mout/-/mout-0.6.0.tgz", + "resolved": "https://registry.npmjs.org/mout/-/mout-0.6.0.tgz" + }, + "optimist": { + "version": "0.6.1", + "from": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz", + "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz", + "dependencies": { + "wordwrap": { + "version": "0.0.2", + "from": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz" + }, + "minimist": { + "version": "0.0.8", + "from": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz" + } + } + } + } + }, + "bower-endpoint-parser": { + "version": "0.2.1", + "from": "https://registry.npmjs.org/bower-endpoint-parser/-/bower-endpoint-parser-0.2.1.tgz", + "resolved": "https://registry.npmjs.org/bower-endpoint-parser/-/bower-endpoint-parser-0.2.1.tgz" + }, + "bower-json": { + "version": "0.4.0", + "from": "https://registry.npmjs.org/bower-json/-/bower-json-0.4.0.tgz", + "resolved": "https://registry.npmjs.org/bower-json/-/bower-json-0.4.0.tgz", + "dependencies": { + "deep-extend": { + "version": "0.2.8", + "from": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.2.8.tgz", + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.2.8.tgz" + }, + "intersect": { + "version": "0.0.3", + "from": "https://registry.npmjs.org/intersect/-/intersect-0.0.3.tgz", + "resolved": "https://registry.npmjs.org/intersect/-/intersect-0.0.3.tgz" + } + } + }, + "bower-logger": { + "version": "0.2.2", + "from": "https://registry.npmjs.org/bower-logger/-/bower-logger-0.2.2.tgz", + "resolved": "https://registry.npmjs.org/bower-logger/-/bower-logger-0.2.2.tgz" + }, + "bower-registry-client": { + "version": "0.1.6", + "from": "https://registry.npmjs.org/bower-registry-client/-/bower-registry-client-0.1.6.tgz", + "resolved": "https://registry.npmjs.org/bower-registry-client/-/bower-registry-client-0.1.6.tgz", + "dependencies": { + "async": { + "version": "0.2.10", + "from": "https://registry.npmjs.org/async/-/async-0.2.10.tgz", + "resolved": "https://registry.npmjs.org/async/-/async-0.2.10.tgz" + }, + "bower-config": { + "version": "0.4.5", + "from": "https://registry.npmjs.org/bower-config/-/bower-config-0.4.5.tgz", + "resolved": "https://registry.npmjs.org/bower-config/-/bower-config-0.4.5.tgz", + "dependencies": { + "mout": { + "version": "0.6.0", + "from": "https://registry.npmjs.org/mout/-/mout-0.6.0.tgz", + "resolved": "https://registry.npmjs.org/mout/-/mout-0.6.0.tgz" + }, + "optimist": { + "version": "0.6.1", + "from": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz", + "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz", + "dependencies": { + "wordwrap": { + "version": "0.0.2", + "from": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz" + }, + "minimist": { + "version": "0.0.8", + "from": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz" + } + } + } + } + }, + "request-replay": { + "version": "0.2.0", + "from": "https://registry.npmjs.org/request-replay/-/request-replay-0.2.0.tgz", + "resolved": "https://registry.npmjs.org/request-replay/-/request-replay-0.2.0.tgz" + } + } + }, + "cardinal": { + "version": "0.4.4", + "from": "https://registry.npmjs.org/cardinal/-/cardinal-0.4.4.tgz", + "resolved": "https://registry.npmjs.org/cardinal/-/cardinal-0.4.4.tgz", + "dependencies": { + "redeyed": { + "version": "0.4.4", + "from": "https://registry.npmjs.org/redeyed/-/redeyed-0.4.4.tgz", + "resolved": "https://registry.npmjs.org/redeyed/-/redeyed-0.4.4.tgz", + "dependencies": { + "esprima": { + "version": "1.0.4", + "from": "https://registry.npmjs.org/esprima/-/esprima-1.0.4.tgz", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-1.0.4.tgz" + } + } + }, + "ansicolors": { + "version": "0.2.1", + "from": "https://registry.npmjs.org/ansicolors/-/ansicolors-0.2.1.tgz", + "resolved": "https://registry.npmjs.org/ansicolors/-/ansicolors-0.2.1.tgz" + } + } + }, + "chalk": { + "version": "0.2.1", + "from": "https://registry.npmjs.org/chalk/-/chalk-0.2.1.tgz", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-0.2.1.tgz", + "dependencies": { + "has-color": { + "version": "0.1.4", + "from": "https://registry.npmjs.org/has-color/-/has-color-0.1.4.tgz", + "resolved": "https://registry.npmjs.org/has-color/-/has-color-0.1.4.tgz" + }, + "ansi-styles": { + "version": "0.2.0", + "from": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-0.2.0.tgz", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-0.2.0.tgz" + } + } + }, + "chmodr": { + "version": "0.1.0", + "from": "https://registry.npmjs.org/chmodr/-/chmodr-0.1.0.tgz", + "resolved": "https://registry.npmjs.org/chmodr/-/chmodr-0.1.0.tgz" + }, + "decompress-zip": { + "version": "0.0.4", + "from": "https://registry.npmjs.org/decompress-zip/-/decompress-zip-0.0.4.tgz", + "resolved": "https://registry.npmjs.org/decompress-zip/-/decompress-zip-0.0.4.tgz", + "dependencies": { + "mkpath": { + "version": "0.1.0", + "from": "https://registry.npmjs.org/mkpath/-/mkpath-0.1.0.tgz", + "resolved": "https://registry.npmjs.org/mkpath/-/mkpath-0.1.0.tgz" + }, + "binary": { + "version": "0.3.0", + "from": "https://registry.npmjs.org/binary/-/binary-0.3.0.tgz", + "resolved": "https://registry.npmjs.org/binary/-/binary-0.3.0.tgz", + "dependencies": { + "chainsaw": { + "version": "0.1.0", + "from": "https://registry.npmjs.org/chainsaw/-/chainsaw-0.1.0.tgz", + "resolved": "https://registry.npmjs.org/chainsaw/-/chainsaw-0.1.0.tgz", + "dependencies": { + "traverse": { + "version": "0.3.9", + "from": "https://registry.npmjs.org/traverse/-/traverse-0.3.9.tgz", + "resolved": "https://registry.npmjs.org/traverse/-/traverse-0.3.9.tgz" + } + } + }, + "buffers": { + "version": "0.1.1", + "from": "https://registry.npmjs.org/buffers/-/buffers-0.1.1.tgz", + "resolved": "https://registry.npmjs.org/buffers/-/buffers-0.1.1.tgz" + } + } + }, + "touch": { + "version": "0.0.2", + "from": "https://registry.npmjs.org/touch/-/touch-0.0.2.tgz", + "resolved": "https://registry.npmjs.org/touch/-/touch-0.0.2.tgz", + "dependencies": { + "nopt": { + "version": "1.0.10", + "from": "nopt@1.0.10", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-1.0.10.tgz" + } + } + }, + "readable-stream": { + "version": "1.1.11", + "from": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.11.tgz", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.11.tgz", + "dependencies": { + "core-util-is": { + "version": "1.0.1", + "from": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.1.tgz", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.1.tgz" + }, + "string_decoder": { + "version": "0.10.25-1", + "from": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.25-1.tgz", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.25-1.tgz" + }, + "debuglog": { + "version": "0.0.2", + "from": "https://registry.npmjs.org/debuglog/-/debuglog-0.0.2.tgz", + "resolved": "https://registry.npmjs.org/debuglog/-/debuglog-0.0.2.tgz" + } + } + } + } + }, + "fstream": { + "version": "0.1.25", + "from": "https://registry.npmjs.org/fstream/-/fstream-0.1.25.tgz", + "resolved": "https://registry.npmjs.org/fstream/-/fstream-0.1.25.tgz", + "dependencies": { + "inherits": { + "version": "2.0.1", + "from": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz" + } + } + }, + "fstream-ignore": { + "version": "0.0.7", + "from": "https://registry.npmjs.org/fstream-ignore/-/fstream-ignore-0.0.7.tgz", + "resolved": "https://registry.npmjs.org/fstream-ignore/-/fstream-ignore-0.0.7.tgz", + "dependencies": { + "minimatch": { + "version": "0.2.14", + "from": "minimatch@0.2.14", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-0.2.14.tgz", + "dependencies": { + "sigmund": { + "version": "1.0.0", + "from": "sigmund@1.0.0", + "resolved": "https://registry.npmjs.org/sigmund/-/sigmund-1.0.0.tgz" + } + } + }, + "inherits": { + "version": "2.0.1", + "from": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz" + } + } + }, + "glob": { + "version": "3.2.9", + "from": "https://registry.npmjs.org/glob/-/glob-3.2.9.tgz", + "resolved": "https://registry.npmjs.org/glob/-/glob-3.2.9.tgz", + "dependencies": { + "minimatch": { + "version": "0.2.14", + "from": "minimatch@0.2.14", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-0.2.14.tgz", + "dependencies": { + "sigmund": { + "version": "1.0.0", + "from": "sigmund@1.0.0", + "resolved": "https://registry.npmjs.org/sigmund/-/sigmund-1.0.0.tgz" + } + } + }, + "inherits": { + "version": "2.0.1", + "from": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz" + } + } + }, + "graceful-fs": { + "version": "2.0.2", + "from": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-2.0.2.tgz", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-2.0.2.tgz" + }, + "handlebars": { + "version": "1.0.12", + "from": "https://registry.npmjs.org/handlebars/-/handlebars-1.0.12.tgz", + "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-1.0.12.tgz", + "dependencies": { + "optimist": { + "version": "0.3.7", + "from": "https://registry.npmjs.org/optimist/-/optimist-0.3.7.tgz", + "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.3.7.tgz", + "dependencies": { + "wordwrap": { + "version": "0.0.2", + "from": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz" + } + } + }, + "uglify-js": { + "version": "2.3.6", + "from": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.3.6.tgz", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.3.6.tgz", + "dependencies": { + "async": { + "version": "0.2.10", + "from": "https://registry.npmjs.org/async/-/async-0.2.10.tgz", + "resolved": "https://registry.npmjs.org/async/-/async-0.2.10.tgz" + }, + "source-map": { + "version": "0.1.32", + "from": "https://registry.npmjs.org/source-map/-/source-map-0.1.32.tgz", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.1.32.tgz", + "dependencies": { + "amdefine": { + "version": "0.1.0", + "from": "https://registry.npmjs.org/amdefine/-/amdefine-0.1.0.tgz", + "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-0.1.0.tgz" + } + } + } + } + } + } + }, + "inquirer": { + "version": "0.3.5", + "from": "https://registry.npmjs.org/inquirer/-/inquirer-0.3.5.tgz", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-0.3.5.tgz", + "dependencies": { + "lodash": { + "version": "1.2.1", + "from": "https://registry.npmjs.org/lodash/-/lodash-1.2.1.tgz", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-1.2.1.tgz" + }, + "async": { + "version": "0.2.10", + "from": "https://registry.npmjs.org/async/-/async-0.2.10.tgz", + "resolved": "https://registry.npmjs.org/async/-/async-0.2.10.tgz" + }, + "cli-color": { + "version": "0.2.3", + "from": "https://registry.npmjs.org/cli-color/-/cli-color-0.2.3.tgz", + "resolved": "https://registry.npmjs.org/cli-color/-/cli-color-0.2.3.tgz", + "dependencies": { + "es5-ext": { + "version": "0.9.2", + "from": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.9.2.tgz", + "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.9.2.tgz" + }, + "memoizee": { + "version": "0.2.6", + "from": "https://registry.npmjs.org/memoizee/-/memoizee-0.2.6.tgz", + "resolved": "https://registry.npmjs.org/memoizee/-/memoizee-0.2.6.tgz", + "dependencies": { + "event-emitter": { + "version": "0.2.2", + "from": "https://registry.npmjs.org/event-emitter/-/event-emitter-0.2.2.tgz", + "resolved": "https://registry.npmjs.org/event-emitter/-/event-emitter-0.2.2.tgz" + }, + "next-tick": { + "version": "0.1.0", + "from": "https://registry.npmjs.org/next-tick/-/next-tick-0.1.0.tgz", + "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-0.1.0.tgz" + } + } + } + } + }, + "mute-stream": { + "version": "0.0.3", + "from": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.3.tgz", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.3.tgz" + } + } + }, + "junk": { + "version": "0.2.2", + "from": "https://registry.npmjs.org/junk/-/junk-0.2.2.tgz", + "resolved": "https://registry.npmjs.org/junk/-/junk-0.2.2.tgz" + }, + "mkdirp": { + "version": "0.3.5", + "from": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.3.5.tgz", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.3.5.tgz" + }, + "mout": { + "version": "0.7.1", + "from": "https://registry.npmjs.org/mout/-/mout-0.7.1.tgz", + "resolved": "https://registry.npmjs.org/mout/-/mout-0.7.1.tgz" + }, + "nopt": { + "version": "2.1.2", + "from": "https://registry.npmjs.org/nopt/-/nopt-2.1.2.tgz", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-2.1.2.tgz" + }, + "lru-cache": { + "version": "2.3.1", + "from": "https://registry.npmjs.org/lru-cache/-/lru-cache-2.3.1.tgz", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-2.3.1.tgz" + }, + "open": { + "version": "0.0.4", + "from": "https://registry.npmjs.org/open/-/open-0.0.4.tgz", + "resolved": "https://registry.npmjs.org/open/-/open-0.0.4.tgz" + }, + "osenv": { + "version": "0.0.3", + "from": "https://registry.npmjs.org/osenv/-/osenv-0.0.3.tgz", + "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.0.3.tgz" + }, + "promptly": { + "version": "0.2.0", + "from": "https://registry.npmjs.org/promptly/-/promptly-0.2.0.tgz", + "resolved": "https://registry.npmjs.org/promptly/-/promptly-0.2.0.tgz", + "dependencies": { + "read": { + "version": "1.0.5", + "from": "https://registry.npmjs.org/read/-/read-1.0.5.tgz", + "resolved": "https://registry.npmjs.org/read/-/read-1.0.5.tgz", + "dependencies": { + "mute-stream": { + "version": "0.0.4", + "from": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.4.tgz", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.4.tgz" + } + } + } + } + }, + "q": { + "version": "0.9.7", + "from": "https://registry.npmjs.org/q/-/q-0.9.7.tgz", + "resolved": "https://registry.npmjs.org/q/-/q-0.9.7.tgz" + }, + "request": { + "version": "2.27.0", + "from": "https://registry.npmjs.org/request/-/request-2.27.0.tgz", + "resolved": "https://registry.npmjs.org/request/-/request-2.27.0.tgz", + "dependencies": { + "qs": { + "version": "0.6.6", + "from": "https://registry.npmjs.org/qs/-/qs-0.6.6.tgz", + "resolved": "https://registry.npmjs.org/qs/-/qs-0.6.6.tgz" + }, + "json-stringify-safe": { + "version": "5.0.0", + "from": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.0.tgz", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.0.tgz" + }, + "forever-agent": { + "version": "0.5.2", + "from": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.5.2.tgz", + "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.5.2.tgz" + }, + "tunnel-agent": { + "version": "0.3.0", + "from": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.3.0.tgz", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.3.0.tgz" + }, + "http-signature": { + "version": "0.10.0", + "from": "https://registry.npmjs.org/http-signature/-/http-signature-0.10.0.tgz", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-0.10.0.tgz", + "dependencies": { + "assert-plus": { + "version": "0.1.2", + "from": "https://registry.npmjs.org/assert-plus/-/assert-plus-0.1.2.tgz", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-0.1.2.tgz" + }, + "asn1": { + "version": "0.1.11", + "from": "https://registry.npmjs.org/asn1/-/asn1-0.1.11.tgz", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.1.11.tgz" + }, + "ctype": { + "version": "0.5.2", + "from": "https://registry.npmjs.org/ctype/-/ctype-0.5.2.tgz", + "resolved": "https://registry.npmjs.org/ctype/-/ctype-0.5.2.tgz" + } + } + }, + "hawk": { + "version": "1.0.0", + "from": "https://registry.npmjs.org/hawk/-/hawk-1.0.0.tgz", + "resolved": "https://registry.npmjs.org/hawk/-/hawk-1.0.0.tgz", + "dependencies": { + "hoek": { + "version": "0.9.1", + "from": "https://registry.npmjs.org/hoek/-/hoek-0.9.1.tgz", + "resolved": "https://registry.npmjs.org/hoek/-/hoek-0.9.1.tgz" + }, + "boom": { + "version": "0.4.2", + "from": "https://registry.npmjs.org/boom/-/boom-0.4.2.tgz", + "resolved": "https://registry.npmjs.org/boom/-/boom-0.4.2.tgz" + }, + "cryptiles": { + "version": "0.2.2", + "from": "https://registry.npmjs.org/cryptiles/-/cryptiles-0.2.2.tgz", + "resolved": "https://registry.npmjs.org/cryptiles/-/cryptiles-0.2.2.tgz" + }, + "sntp": { + "version": "0.2.4", + "from": "https://registry.npmjs.org/sntp/-/sntp-0.2.4.tgz", + "resolved": "https://registry.npmjs.org/sntp/-/sntp-0.2.4.tgz" + } + } + }, + "aws-sign": { + "version": "0.3.0", + "from": "https://registry.npmjs.org/aws-sign/-/aws-sign-0.3.0.tgz", + "resolved": "https://registry.npmjs.org/aws-sign/-/aws-sign-0.3.0.tgz" + }, + "oauth-sign": { + "version": "0.3.0", + "from": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.3.0.tgz", + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.3.0.tgz" + }, + "cookie-jar": { + "version": "0.3.0", + "from": "https://registry.npmjs.org/cookie-jar/-/cookie-jar-0.3.0.tgz", + "resolved": "https://registry.npmjs.org/cookie-jar/-/cookie-jar-0.3.0.tgz" + }, + "node-uuid": { + "version": "1.4.1", + "from": "https://registry.npmjs.org/node-uuid/-/node-uuid-1.4.1.tgz", + "resolved": "https://registry.npmjs.org/node-uuid/-/node-uuid-1.4.1.tgz" + }, + "mime": { + "version": "1.2.11", + "from": "https://registry.npmjs.org/mime/-/mime-1.2.11.tgz", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.2.11.tgz" + }, + "form-data": { + "version": "0.1.2", + "from": "https://registry.npmjs.org/form-data/-/form-data-0.1.2.tgz", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-0.1.2.tgz", + "dependencies": { + "combined-stream": { + "version": "0.0.4", + "from": "https://registry.npmjs.org/combined-stream/-/combined-stream-0.0.4.tgz", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-0.0.4.tgz", + "dependencies": { + "delayed-stream": { + "version": "0.0.5", + "from": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-0.0.5.tgz", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-0.0.5.tgz" + } + } + }, + "async": { + "version": "0.2.10", + "from": "https://registry.npmjs.org/async/-/async-0.2.10.tgz", + "resolved": "https://registry.npmjs.org/async/-/async-0.2.10.tgz" + } + } + } + } + }, + "request-progress": { + "version": "0.3.1", + "from": "https://registry.npmjs.org/request-progress/-/request-progress-0.3.1.tgz", + "resolved": "https://registry.npmjs.org/request-progress/-/request-progress-0.3.1.tgz", + "dependencies": { + "throttleit": { + "version": "0.0.2", + "from": "https://registry.npmjs.org/throttleit/-/throttleit-0.0.2.tgz", + "resolved": "https://registry.npmjs.org/throttleit/-/throttleit-0.0.2.tgz" + } + } + }, + "retry": { + "version": "0.6.0", + "from": "https://registry.npmjs.org/retry/-/retry-0.6.0.tgz", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.6.0.tgz" + }, + "rimraf": { + "version": "2.2.6", + "from": "https://registry.npmjs.org/rimraf/-/rimraf-2.2.6.tgz", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.2.6.tgz" + }, + "stringify-object": { + "version": "0.1.8", + "from": "https://registry.npmjs.org/stringify-object/-/stringify-object-0.1.8.tgz", + "resolved": "https://registry.npmjs.org/stringify-object/-/stringify-object-0.1.8.tgz" + }, + "sudo-block": { + "version": "0.2.1", + "from": "https://registry.npmjs.org/sudo-block/-/sudo-block-0.2.1.tgz", + "resolved": "https://registry.npmjs.org/sudo-block/-/sudo-block-0.2.1.tgz", + "dependencies": { + "chalk": { + "version": "0.1.1", + "from": "https://registry.npmjs.org/chalk/-/chalk-0.1.1.tgz", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-0.1.1.tgz", + "dependencies": { + "has-color": { + "version": "0.1.4", + "from": "https://registry.npmjs.org/has-color/-/has-color-0.1.4.tgz", + "resolved": "https://registry.npmjs.org/has-color/-/has-color-0.1.4.tgz" + }, + "ansi-styles": { + "version": "0.1.2", + "from": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-0.1.2.tgz", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-0.1.2.tgz" + } + } + } + } + }, + "tar": { + "version": "0.1.19", + "from": "https://registry.npmjs.org/tar/-/tar-0.1.19.tgz", + "resolved": "https://registry.npmjs.org/tar/-/tar-0.1.19.tgz", + "dependencies": { + "inherits": { + "version": "2.0.1", + "from": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz" + }, + "block-stream": { + "version": "0.0.7", + "from": "https://registry.npmjs.org/block-stream/-/block-stream-0.0.7.tgz", + "resolved": "https://registry.npmjs.org/block-stream/-/block-stream-0.0.7.tgz" + } + } + }, + "tmp": { + "version": "0.0.23", + "from": "https://registry.npmjs.org/tmp/-/tmp-0.0.23.tgz", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.23.tgz" + }, + "update-notifier": { + "version": "0.1.7", + "from": "https://registry.npmjs.org/update-notifier/-/update-notifier-0.1.7.tgz", + "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-0.1.7.tgz", + "dependencies": { + "configstore": { + "version": "0.1.7", + "from": "https://registry.npmjs.org/configstore/-/configstore-0.1.7.tgz", + "resolved": "https://registry.npmjs.org/configstore/-/configstore-0.1.7.tgz", + "dependencies": { + "lodash": { + "version": "2.4.1", + "from": "https://registry.npmjs.org/lodash/-/lodash-2.4.1.tgz", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-2.4.1.tgz" + }, + "js-yaml": { + "version": "2.1.3", + "from": "https://registry.npmjs.org/js-yaml/-/js-yaml-2.1.3.tgz", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-2.1.3.tgz", + "dependencies": { + "argparse": { + "version": "0.1.15", + "from": "https://registry.npmjs.org/argparse/-/argparse-0.1.15.tgz", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-0.1.15.tgz", + "dependencies": { + "underscore": { + "version": "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" + }, + "underscore.string": { + "version": "2.3.3", + "from": "https://registry.npmjs.org/underscore.string/-/underscore.string-2.3.3.tgz", + "resolved": "https://registry.npmjs.org/underscore.string/-/underscore.string-2.3.3.tgz" + } + } + }, + "esprima": { + "version": "1.0.4", + "from": "https://registry.npmjs.org/esprima/-/esprima-1.0.4.tgz", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-1.0.4.tgz" + } + } + } + } + } + } + }, + "which": { + "version": "1.0.5", + "from": "https://registry.npmjs.org/which/-/which-1.0.5.tgz", + "resolved": "https://registry.npmjs.org/which/-/which-1.0.5.tgz" + }, + "p-throttler": { + "version": "0.0.1", + "from": "https://registry.npmjs.org/p-throttler/-/p-throttler-0.0.1.tgz", + "resolved": "https://registry.npmjs.org/p-throttler/-/p-throttler-0.0.1.tgz" + } + } + }, + "browserstacktunnel-wrapper": { + "version": "1.1.2", + "from": "https://registry.npmjs.org/browserstacktunnel-wrapper/-/browserstacktunnel-wrapper-1.1.2.tgz", + "resolved": "https://registry.npmjs.org/browserstacktunnel-wrapper/-/browserstacktunnel-wrapper-1.1.2.tgz" + }, + "canonical-path": { + "version": "0.0.2", + "from": "https://registry.npmjs.org/canonical-path/-/canonical-path-0.0.2.tgz", + "resolved": "https://registry.npmjs.org/canonical-path/-/canonical-path-0.0.2.tgz" + }, + "dgeni": { + "version": "0.2.2", + "from": "https://registry.npmjs.org/dgeni/-/dgeni-0.2.2.tgz", + "resolved": "https://registry.npmjs.org/dgeni/-/dgeni-0.2.2.tgz", + "dependencies": { + "rimraf": { + "version": "2.2.6", + "from": "https://registry.npmjs.org/rimraf/-/rimraf-2.2.6.tgz", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.2.6.tgz" + }, + "optimist": { + "version": "0.6.1", + "from": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz", + "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz", + "dependencies": { + "wordwrap": { + "version": "0.0.2", + "from": "wordwrap@0.0.2", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz" + }, + "minimist": { + "version": "0.0.8", + "from": "minimist@0.0.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz" + } + } + }, + "lodash": { + "version": "2.4.1", + "from": "lodash@2.4.1", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-2.4.1.tgz" + }, + "dependency-graph": { + "version": "0.1.0", + "from": "dependency-graph@0.1.0", + "resolved": "https://registry.npmjs.org/dependency-graph/-/dependency-graph-0.1.0.tgz", + "dependencies": { + "underscore": { + "version": "1.4.4", + "from": "underscore@1.4.4", + "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.4.4.tgz" + } + } + }, + "q": { + "version": "0.9.7", + "from": "https://registry.npmjs.org/q/-/q-0.9.7.tgz", + "resolved": "https://registry.npmjs.org/q/-/q-0.9.7.tgz" + }, + "di": { + "version": "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" + }, + "marked": { + "version": "0.2.10", + "from": "marked@0.2.10", + "resolved": "https://registry.npmjs.org/marked/-/marked-0.2.10.tgz" + }, + "glob": { + "version": "3.2.9", + "from": "https://registry.npmjs.org/glob/-/glob-3.2.9.tgz", + "resolved": "https://registry.npmjs.org/glob/-/glob-3.2.9.tgz", + "dependencies": { + "minimatch": { + "version": "0.2.14", + "from": "minimatch@0.2.14", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-0.2.14.tgz", + "dependencies": { + "lru-cache": { + "version": "2.5.0", + "from": "lru-cache@2.5.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-2.5.0.tgz" + }, + "sigmund": { + "version": "1.0.0", + "from": "sigmund@1.0.0", + "resolved": "https://registry.npmjs.org/sigmund/-/sigmund-1.0.0.tgz" + } + } + }, + "inherits": { + "version": "2.0.1", + "from": "inherits@2.0.1", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz" + } + } + } + } + }, + "dgeni-packages": { + "version": "0.6.0", + "from": "https://registry.npmjs.org/dgeni-packages/-/dgeni-packages-0.6.0.tgz", + "resolved": "https://registry.npmjs.org/dgeni-packages/-/dgeni-packages-0.6.0.tgz", + "dependencies": { + "lodash": { + "version": "2.4.1", + "from": "lodash@2.4.1", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-2.4.1.tgz" + }, + "graceful-fs": { + "version": "2.0.2", + "from": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-2.0.2.tgz", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-2.0.2.tgz" + }, + "glob": { + "version": "3.2.9", + "from": "https://registry.npmjs.org/glob/-/glob-3.2.9.tgz", + "resolved": "https://registry.npmjs.org/glob/-/glob-3.2.9.tgz", + "dependencies": { + "minimatch": { + "version": "0.2.14", + "from": "minimatch@0.2.14", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-0.2.14.tgz", + "dependencies": { + "lru-cache": { + "version": "2.5.0", + "from": "lru-cache@2.5.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-2.5.0.tgz" + }, + "sigmund": { + "version": "1.0.0", + "from": "sigmund@1.0.0", + "resolved": "https://registry.npmjs.org/sigmund/-/sigmund-1.0.0.tgz" + } + } + }, + "inherits": { + "version": "2.0.1", + "from": "inherits@2.0.1", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz" + } + } + }, + "nunjucks": { + "version": "1.0.1", + "from": "nunjucks@1.0.1", + "resolved": "https://registry.npmjs.org/nunjucks/-/nunjucks-1.0.1.tgz", + "dependencies": { + "optimist": { + "version": "0.6.1", + "from": "optimist@0.6.1", + "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz", + "dependencies": { + "wordwrap": { + "version": "0.0.2", + "from": "wordwrap@0.0.2", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz" + }, + "minimist": { + "version": "0.0.8", + "from": "minimist@0.0.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz" + } + } + } + } + }, + "catharsis": { + "version": "0.7.0", + "from": "https://registry.npmjs.org/catharsis/-/catharsis-0.7.0.tgz", + "resolved": "https://registry.npmjs.org/catharsis/-/catharsis-0.7.0.tgz" + }, + "esprima": { + "version": "1.0.4", + "from": "esprima@1.0.4", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-1.0.4.tgz" + } + } + }, + "event-stream": { + "version": "3.1.0", + "from": "https://registry.npmjs.org/event-stream/-/event-stream-3.1.0.tgz", + "resolved": "https://registry.npmjs.org/event-stream/-/event-stream-3.1.0.tgz", + "dependencies": { + "through": { + "version": "2.3.4", + "from": "https://registry.npmjs.org/through/-/through-2.3.4.tgz", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.4.tgz" + }, + "duplexer": { + "version": "0.1.1", + "from": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.1.tgz", + "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.1.tgz" + }, + "from": { + "version": "0.1.3", + "from": "https://registry.npmjs.org/from/-/from-0.1.3.tgz", + "resolved": "https://registry.npmjs.org/from/-/from-0.1.3.tgz" + }, + "map-stream": { + "version": "0.1.0", + "from": "https://registry.npmjs.org/map-stream/-/map-stream-0.1.0.tgz", + "resolved": "https://registry.npmjs.org/map-stream/-/map-stream-0.1.0.tgz" + }, + "pause-stream": { + "version": "0.0.11", + "from": "https://registry.npmjs.org/pause-stream/-/pause-stream-0.0.11.tgz", + "resolved": "https://registry.npmjs.org/pause-stream/-/pause-stream-0.0.11.tgz" + }, + "split": { + "version": "0.2.10", + "from": "https://registry.npmjs.org/split/-/split-0.2.10.tgz", + "resolved": "https://registry.npmjs.org/split/-/split-0.2.10.tgz" + }, + "stream-combiner": { + "version": "0.0.4", + "from": "https://registry.npmjs.org/stream-combiner/-/stream-combiner-0.0.4.tgz", + "resolved": "https://registry.npmjs.org/stream-combiner/-/stream-combiner-0.0.4.tgz" + } + } + }, + "grunt": { + "version": "0.4.2", + "from": "https://registry.npmjs.org/grunt/-/grunt-0.4.2.tgz", + "resolved": "https://registry.npmjs.org/grunt/-/grunt-0.4.2.tgz", + "dependencies": { + "async": { + "version": "0.1.22", + "from": "https://registry.npmjs.org/async/-/async-0.1.22.tgz", + "resolved": "https://registry.npmjs.org/async/-/async-0.1.22.tgz" + }, + "coffee-script": { + "version": "1.3.3", + "from": "https://registry.npmjs.org/coffee-script/-/coffee-script-1.3.3.tgz", + "resolved": "https://registry.npmjs.org/coffee-script/-/coffee-script-1.3.3.tgz" + }, + "colors": { + "version": "0.6.2", + "from": "https://registry.npmjs.org/colors/-/colors-0.6.2.tgz", + "resolved": "https://registry.npmjs.org/colors/-/colors-0.6.2.tgz" + }, + "dateformat": { + "version": "1.0.2-1.2.3", + "from": "https://registry.npmjs.org/dateformat/-/dateformat-1.0.2-1.2.3.tgz", + "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-1.0.2-1.2.3.tgz" + }, + "eventemitter2": { + "version": "0.4.13", + "from": "https://registry.npmjs.org/eventemitter2/-/eventemitter2-0.4.13.tgz", + "resolved": "https://registry.npmjs.org/eventemitter2/-/eventemitter2-0.4.13.tgz" + }, + "findup-sync": { + "version": "0.1.2", + "from": "findup-sync@0.1.2", + "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-0.1.2.tgz", + "dependencies": { + "lodash": { + "version": "1.0.1", + "from": "lodash@1.0.1", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-1.0.1.tgz" + } + } + }, + "glob": { + "version": "3.1.21", + "from": "glob@3.1.21", + "resolved": "https://registry.npmjs.org/glob/-/glob-3.1.21.tgz", + "dependencies": { + "graceful-fs": { + "version": "1.2.3", + "from": "graceful-fs@1.2.3", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-1.2.3.tgz" + }, + "inherits": { + "version": "1.0.0", + "from": "inherits@1.0.0", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-1.0.0.tgz" + } + } + }, + "hooker": { + "version": "0.2.3", + "from": "hooker@0.2.3", + "resolved": "https://registry.npmjs.org/hooker/-/hooker-0.2.3.tgz" + }, + "iconv-lite": { + "version": "0.2.11", + "from": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.2.11.tgz", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.2.11.tgz" + }, + "minimatch": { + "version": "0.2.14", + "from": "minimatch@0.2.14", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-0.2.14.tgz", + "dependencies": { + "lru-cache": { + "version": "2.5.0", + "from": "lru-cache@2.5.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-2.5.0.tgz" + }, + "sigmund": { + "version": "1.0.0", + "from": "sigmund@1.0.0", + "resolved": "https://registry.npmjs.org/sigmund/-/sigmund-1.0.0.tgz" + } + } + }, + "nopt": { + "version": "1.0.10", + "from": "nopt@1.0.10", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-1.0.10.tgz", + "dependencies": { + "abbrev": { + "version": "1.0.4", + "from": "abbrev@1.0.4", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.0.4.tgz" + } + } + }, + "rimraf": { + "version": "2.0.3", + "from": "https://registry.npmjs.org/rimraf/-/rimraf-2.0.3.tgz", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.0.3.tgz", + "dependencies": { + "graceful-fs": { + "version": "1.1.14", + "from": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-1.1.14.tgz", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-1.1.14.tgz" + } + } + }, + "lodash": { + "version": "0.9.2", + "from": "https://registry.npmjs.org/lodash/-/lodash-0.9.2.tgz", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-0.9.2.tgz" + }, + "underscore.string": { + "version": "2.2.1", + "from": "https://registry.npmjs.org/underscore.string/-/underscore.string-2.2.1.tgz", + "resolved": "https://registry.npmjs.org/underscore.string/-/underscore.string-2.2.1.tgz" + }, + "which": { + "version": "1.0.5", + "from": "https://registry.npmjs.org/which/-/which-1.0.5.tgz", + "resolved": "https://registry.npmjs.org/which/-/which-1.0.5.tgz" + }, + "js-yaml": { + "version": "2.0.5", + "from": "https://registry.npmjs.org/js-yaml/-/js-yaml-2.0.5.tgz", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-2.0.5.tgz", + "dependencies": { + "argparse": { + "version": "0.1.15", + "from": "https://registry.npmjs.org/argparse/-/argparse-0.1.15.tgz", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-0.1.15.tgz", + "dependencies": { + "underscore": { + "version": "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" + }, + "underscore.string": { + "version": "2.3.3", + "from": "https://registry.npmjs.org/underscore.string/-/underscore.string-2.3.3.tgz", + "resolved": "https://registry.npmjs.org/underscore.string/-/underscore.string-2.3.3.tgz" + } + } + }, + "esprima": { + "version": "1.0.4", + "from": "esprima@1.0.4", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-1.0.4.tgz" + } + } + }, + "exit": { + "version": "0.1.2", + "from": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", + "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz" + }, + "getobject": { + "version": "0.1.0", + "from": "https://registry.npmjs.org/getobject/-/getobject-0.1.0.tgz", + "resolved": "https://registry.npmjs.org/getobject/-/getobject-0.1.0.tgz" + } + } + }, + "grunt-bump": { + "version": "0.0.13", + "from": "https://registry.npmjs.org/grunt-bump/-/grunt-bump-0.0.13.tgz", + "resolved": "https://registry.npmjs.org/grunt-bump/-/grunt-bump-0.0.13.tgz", + "dependencies": { + "semver": { + "version": "1.1.4", + "from": "https://registry.npmjs.org/semver/-/semver-1.1.4.tgz", + "resolved": "https://registry.npmjs.org/semver/-/semver-1.1.4.tgz" + } + } + }, + "grunt-contrib-clean": { + "version": "0.5.0", + "from": "https://registry.npmjs.org/grunt-contrib-clean/-/grunt-contrib-clean-0.5.0.tgz", + "resolved": "https://registry.npmjs.org/grunt-contrib-clean/-/grunt-contrib-clean-0.5.0.tgz", + "dependencies": { + "rimraf": { + "version": "2.2.6", + "from": "rimraf@2.2.6", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.2.6.tgz" + } + } + }, + "grunt-contrib-compress": { + "version": "0.5.3", + "from": "https://registry.npmjs.org/grunt-contrib-compress/-/grunt-contrib-compress-0.5.3.tgz", + "resolved": "https://registry.npmjs.org/grunt-contrib-compress/-/grunt-contrib-compress-0.5.3.tgz", + "dependencies": { + "archiver": { + "version": "0.4.10", + "from": "https://registry.npmjs.org/archiver/-/archiver-0.4.10.tgz", + "resolved": "https://registry.npmjs.org/archiver/-/archiver-0.4.10.tgz", + "dependencies": { + "readable-stream": { + "version": "1.0.26", + "from": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.26.tgz", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.26.tgz", + "dependencies": { + "string_decoder": { + "version": "0.10.25-1", + "from": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.25-1.tgz", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.25-1.tgz" + } + } + }, + "iconv-lite": { + "version": "0.2.11", + "from": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.2.11.tgz", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.2.11.tgz" + } + } + }, + "lazystream": { + "version": "0.1.0", + "from": "https://registry.npmjs.org/lazystream/-/lazystream-0.1.0.tgz", + "resolved": "https://registry.npmjs.org/lazystream/-/lazystream-0.1.0.tgz", + "dependencies": { + "readable-stream": { + "version": "1.0.26", + "from": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.26.tgz", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.26.tgz", + "dependencies": { + "string_decoder": { + "version": "0.10.25-1", + "from": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.25-1.tgz", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.25-1.tgz" + } + } + } + } + }, + "prettysize": { + "version": "0.0.3", + "from": "https://registry.npmjs.org/prettysize/-/prettysize-0.0.3.tgz", + "resolved": "https://registry.npmjs.org/prettysize/-/prettysize-0.0.3.tgz" + } + } + }, + "grunt-contrib-connect": { + "version": "0.5.0", + "from": "https://registry.npmjs.org/grunt-contrib-connect/-/grunt-contrib-connect-0.5.0.tgz", + "resolved": "https://registry.npmjs.org/grunt-contrib-connect/-/grunt-contrib-connect-0.5.0.tgz", + "dependencies": { + "connect": { + "version": "2.7.11", + "from": "https://registry.npmjs.org/connect/-/connect-2.7.11.tgz", + "resolved": "https://registry.npmjs.org/connect/-/connect-2.7.11.tgz", + "dependencies": { + "qs": { + "version": "0.6.5", + "from": "https://registry.npmjs.org/qs/-/qs-0.6.5.tgz", + "resolved": "https://registry.npmjs.org/qs/-/qs-0.6.5.tgz" + }, + "formidable": { + "version": "1.0.14", + "from": "https://registry.npmjs.org/formidable/-/formidable-1.0.14.tgz", + "resolved": "https://registry.npmjs.org/formidable/-/formidable-1.0.14.tgz" + }, + "cookie-signature": { + "version": "1.0.1", + "from": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.1.tgz", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.1.tgz" + }, + "buffer-crc32": { + "version": "0.2.1", + "from": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.1.tgz", + "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.1.tgz" + }, + "cookie": { + "version": "0.0.5", + "from": "https://registry.npmjs.org/cookie/-/cookie-0.0.5.tgz", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.0.5.tgz" + }, + "send": { + "version": "0.1.1", + "from": "https://registry.npmjs.org/send/-/send-0.1.1.tgz", + "resolved": "https://registry.npmjs.org/send/-/send-0.1.1.tgz", + "dependencies": { + "mime": { + "version": "1.2.11", + "from": "https://registry.npmjs.org/mime/-/mime-1.2.11.tgz", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.2.11.tgz" + }, + "range-parser": { + "version": "0.0.4", + "from": "https://registry.npmjs.org/range-parser/-/range-parser-0.0.4.tgz", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-0.0.4.tgz" + } + } + }, + "bytes": { + "version": "0.2.0", + "from": "https://registry.npmjs.org/bytes/-/bytes-0.2.0.tgz", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-0.2.0.tgz" + }, + "fresh": { + "version": "0.1.0", + "from": "https://registry.npmjs.org/fresh/-/fresh-0.1.0.tgz", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.1.0.tgz" + }, + "pause": { + "version": "0.0.1", + "from": "https://registry.npmjs.org/pause/-/pause-0.0.1.tgz", + "resolved": "https://registry.npmjs.org/pause/-/pause-0.0.1.tgz" + }, + "debug": { + "version": "0.7.4", + "from": "https://registry.npmjs.org/debug/-/debug-0.7.4.tgz", + "resolved": "https://registry.npmjs.org/debug/-/debug-0.7.4.tgz" + } + } + }, + "connect-livereload": { + "version": "0.2.0", + "from": "https://registry.npmjs.org/connect-livereload/-/connect-livereload-0.2.0.tgz", + "resolved": "https://registry.npmjs.org/connect-livereload/-/connect-livereload-0.2.0.tgz" + }, + "open": { + "version": "0.0.4", + "from": "https://registry.npmjs.org/open/-/open-0.0.4.tgz", + "resolved": "https://registry.npmjs.org/open/-/open-0.0.4.tgz" + } + } + }, + "grunt-contrib-copy": { + "version": "0.4.1", + "from": "https://registry.npmjs.org/grunt-contrib-copy/-/grunt-contrib-copy-0.4.1.tgz", + "resolved": "https://registry.npmjs.org/grunt-contrib-copy/-/grunt-contrib-copy-0.4.1.tgz" + }, + "grunt-contrib-jshint": { + "version": "0.7.2", + "from": "https://registry.npmjs.org/grunt-contrib-jshint/-/grunt-contrib-jshint-0.7.2.tgz", + "resolved": "https://registry.npmjs.org/grunt-contrib-jshint/-/grunt-contrib-jshint-0.7.2.tgz", + "dependencies": { + "jshint": { + "version": "2.3.0", + "from": "https://registry.npmjs.org/jshint/-/jshint-2.3.0.tgz", + "resolved": "https://registry.npmjs.org/jshint/-/jshint-2.3.0.tgz", + "dependencies": { + "shelljs": { + "version": "0.1.4", + "from": "https://registry.npmjs.org/shelljs/-/shelljs-0.1.4.tgz", + "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.1.4.tgz" + }, + "underscore": { + "version": "1.4.4", + "from": "underscore@1.4.4", + "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.4.4.tgz" + }, + "cli": { + "version": "0.4.5", + "from": "https://registry.npmjs.org/cli/-/cli-0.4.5.tgz", + "resolved": "https://registry.npmjs.org/cli/-/cli-0.4.5.tgz", + "dependencies": { + "glob": { + "version": "3.2.9", + "from": "https://registry.npmjs.org/glob/-/glob-3.2.9.tgz", + "resolved": "https://registry.npmjs.org/glob/-/glob-3.2.9.tgz", + "dependencies": { + "inherits": { + "version": "2.0.1", + "from": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz" + } + } + } + } + }, + "minimatch": { + "version": "0.2.14", + "from": "minimatch@0.2.14", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-0.2.14.tgz", + "dependencies": { + "lru-cache": { + "version": "2.5.0", + "from": "lru-cache@2.5.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-2.5.0.tgz" + }, + "sigmund": { + "version": "1.0.0", + "from": "sigmund@1.0.0", + "resolved": "https://registry.npmjs.org/sigmund/-/sigmund-1.0.0.tgz" + } + } + }, + "console-browserify": { + "version": "0.1.6", + "from": "https://registry.npmjs.org/console-browserify/-/console-browserify-0.1.6.tgz", + "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-0.1.6.tgz" + } + } + } + } + }, + "grunt-ddescribe-iit": { + "version": "0.0.4", + "from": "https://registry.npmjs.org/grunt-ddescribe-iit/-/grunt-ddescribe-iit-0.0.4.tgz", + "resolved": "https://registry.npmjs.org/grunt-ddescribe-iit/-/grunt-ddescribe-iit-0.0.4.tgz" + }, + "grunt-jasmine-node": { + "version": "0.1.0", + "from": "grunt-jasmine-node@git://github.com/vojtajina/grunt-jasmine-node.git#ced17cbe52c1412b2ada53160432a5b681f37cd7", + "resolved": "git://github.com/vojtajina/grunt-jasmine-node.git#ced17cbe52c1412b2ada53160432a5b681f37cd7" + }, + "grunt-jscs-checker": { + "version": "0.4.0", + "from": "https://registry.npmjs.org/grunt-jscs-checker/-/grunt-jscs-checker-0.4.0.tgz", + "resolved": "https://registry.npmjs.org/grunt-jscs-checker/-/grunt-jscs-checker-0.4.0.tgz", + "dependencies": { + "hooker": { + "version": "0.2.3", + "from": "hooker@0.2.3", + "resolved": "https://registry.npmjs.org/hooker/-/hooker-0.2.3.tgz" + }, + "jscs": { + "version": "1.3.0", + "from": "https://registry.npmjs.org/jscs/-/jscs-1.3.0.tgz", + "resolved": "https://registry.npmjs.org/jscs/-/jscs-1.3.0.tgz", + "dependencies": { + "esprima": { + "version": "1.0.3", + "from": "https://registry.npmjs.org/esprima/-/esprima-1.0.3.tgz", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-1.0.3.tgz" + }, + "vow": { + "version": "0.3.9", + "from": "https://registry.npmjs.org/vow/-/vow-0.3.9.tgz", + "resolved": "https://registry.npmjs.org/vow/-/vow-0.3.9.tgz" + }, + "vow-fs": { + "version": "0.2.3", + "from": "https://registry.npmjs.org/vow-fs/-/vow-fs-0.2.3.tgz", + "resolved": "https://registry.npmjs.org/vow-fs/-/vow-fs-0.2.3.tgz", + "dependencies": { + "node-uuid": { + "version": "1.4.0", + "from": "https://registry.npmjs.org/node-uuid/-/node-uuid-1.4.0.tgz", + "resolved": "https://registry.npmjs.org/node-uuid/-/node-uuid-1.4.0.tgz" + }, + "vow-queue": { + "version": "0.0.2", + "from": "https://registry.npmjs.org/vow-queue/-/vow-queue-0.0.2.tgz", + "resolved": "https://registry.npmjs.org/vow-queue/-/vow-queue-0.0.2.tgz" + } + } + }, + "colors": { + "version": "0.6.0-1", + "from": "https://registry.npmjs.org/colors/-/colors-0.6.0-1.tgz", + "resolved": "https://registry.npmjs.org/colors/-/colors-0.6.0-1.tgz" + }, + "commander": { + "version": "1.2.0", + "from": "commander@1.2.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-1.2.0.tgz", + "dependencies": { + "keypress": { + "version": "0.1.0", + "from": "keypress@0.1.0", + "resolved": "https://registry.npmjs.org/keypress/-/keypress-0.1.0.tgz" + } + } + }, + "minimatch": { + "version": "0.2.12", + "from": "minimatch@0.2.12", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-0.2.12.tgz", + "dependencies": { + "lru-cache": { + "version": "2.5.0", + "from": "lru-cache@2.5.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-2.5.0.tgz" + }, + "sigmund": { + "version": "1.0.0", + "from": "sigmund@1.0.0", + "resolved": "https://registry.npmjs.org/sigmund/-/sigmund-1.0.0.tgz" + } + } + }, + "glob": { + "version": "3.2.7", + "from": "glob@3.2.7", + "resolved": "https://registry.npmjs.org/glob/-/glob-3.2.7.tgz", + "dependencies": { + "inherits": { + "version": "2.0.1", + "from": "inherits@2.0.1", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz" + } + } + }, + "xmlbuilder": { + "version": "1.1.2", + "from": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-1.1.2.tgz", + "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-1.1.2.tgz", + "dependencies": { + "underscore": { + "version": "1.6.0", + "from": "underscore@1.6.0", + "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.6.0.tgz" + } + } + }, + "strip-json-comments": { + "version": "0.1.1", + "from": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-0.1.1.tgz", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-0.1.1.tgz" + } + } + }, + "lodash.assign": { + "version": "2.4.1", + "from": "https://registry.npmjs.org/lodash.assign/-/lodash.assign-2.4.1.tgz", + "resolved": "https://registry.npmjs.org/lodash.assign/-/lodash.assign-2.4.1.tgz", + "dependencies": { + "lodash._basecreatecallback": { + "version": "2.4.1", + "from": "lodash._basecreatecallback@2.4.1", + "resolved": "https://registry.npmjs.org/lodash._basecreatecallback/-/lodash._basecreatecallback-2.4.1.tgz", + "dependencies": { + "lodash.bind": { + "version": "2.4.1", + "from": "lodash.bind@2.4.1", + "resolved": "https://registry.npmjs.org/lodash.bind/-/lodash.bind-2.4.1.tgz", + "dependencies": { + "lodash._createwrapper": { + "version": "2.4.1", + "from": "lodash._createwrapper@2.4.1", + "resolved": "https://registry.npmjs.org/lodash._createwrapper/-/lodash._createwrapper-2.4.1.tgz", + "dependencies": { + "lodash._basebind": { + "version": "2.4.1", + "from": "lodash._basebind@2.4.1", + "resolved": "https://registry.npmjs.org/lodash._basebind/-/lodash._basebind-2.4.1.tgz", + "dependencies": { + "lodash._basecreate": { + "version": "2.4.1", + "from": "lodash._basecreate@2.4.1", + "resolved": "https://registry.npmjs.org/lodash._basecreate/-/lodash._basecreate-2.4.1.tgz", + "dependencies": { + "lodash._isnative": { + "version": "2.4.1", + "from": "lodash._isnative@2.4.1", + "resolved": "https://registry.npmjs.org/lodash._isnative/-/lodash._isnative-2.4.1.tgz" + }, + "lodash.noop": { + "version": "2.4.1", + "from": "lodash.noop@2.4.1", + "resolved": "https://registry.npmjs.org/lodash.noop/-/lodash.noop-2.4.1.tgz" + } + } + }, + "lodash.isobject": { + "version": "2.4.1", + "from": "lodash.isobject@2.4.1", + "resolved": "https://registry.npmjs.org/lodash.isobject/-/lodash.isobject-2.4.1.tgz" + } + } + }, + "lodash._basecreatewrapper": { + "version": "2.4.1", + "from": "lodash._basecreatewrapper@2.4.1", + "resolved": "https://registry.npmjs.org/lodash._basecreatewrapper/-/lodash._basecreatewrapper-2.4.1.tgz", + "dependencies": { + "lodash._basecreate": { + "version": "2.4.1", + "from": "lodash._basecreate@2.4.1", + "resolved": "https://registry.npmjs.org/lodash._basecreate/-/lodash._basecreate-2.4.1.tgz", + "dependencies": { + "lodash._isnative": { + "version": "2.4.1", + "from": "lodash._isnative@2.4.1", + "resolved": "https://registry.npmjs.org/lodash._isnative/-/lodash._isnative-2.4.1.tgz" + }, + "lodash.noop": { + "version": "2.4.1", + "from": "lodash.noop@2.4.1", + "resolved": "https://registry.npmjs.org/lodash.noop/-/lodash.noop-2.4.1.tgz" + } + } + }, + "lodash.isobject": { + "version": "2.4.1", + "from": "lodash.isobject@2.4.1", + "resolved": "https://registry.npmjs.org/lodash.isobject/-/lodash.isobject-2.4.1.tgz" + } + } + }, + "lodash.isfunction": { + "version": "2.4.1", + "from": "lodash.isfunction@2.4.1", + "resolved": "https://registry.npmjs.org/lodash.isfunction/-/lodash.isfunction-2.4.1.tgz" + } + } + }, + "lodash._slice": { + "version": "2.4.1", + "from": "lodash._slice@2.4.1", + "resolved": "https://registry.npmjs.org/lodash._slice/-/lodash._slice-2.4.1.tgz" + } + } + }, + "lodash.identity": { + "version": "2.4.1", + "from": "lodash.identity@2.4.1", + "resolved": "https://registry.npmjs.org/lodash.identity/-/lodash.identity-2.4.1.tgz" + }, + "lodash._setbinddata": { + "version": "2.4.1", + "from": "lodash._setbinddata@2.4.1", + "resolved": "https://registry.npmjs.org/lodash._setbinddata/-/lodash._setbinddata-2.4.1.tgz", + "dependencies": { + "lodash._isnative": { + "version": "2.4.1", + "from": "lodash._isnative@2.4.1", + "resolved": "https://registry.npmjs.org/lodash._isnative/-/lodash._isnative-2.4.1.tgz" + }, + "lodash.noop": { + "version": "2.4.1", + "from": "lodash.noop@2.4.1", + "resolved": "https://registry.npmjs.org/lodash.noop/-/lodash.noop-2.4.1.tgz" + } + } + }, + "lodash.support": { + "version": "2.4.1", + "from": "lodash.support@2.4.1", + "resolved": "https://registry.npmjs.org/lodash.support/-/lodash.support-2.4.1.tgz", + "dependencies": { + "lodash._isnative": { + "version": "2.4.1", + "from": "lodash._isnative@2.4.1", + "resolved": "https://registry.npmjs.org/lodash._isnative/-/lodash._isnative-2.4.1.tgz" + } + } + } + } + }, + "lodash.keys": { + "version": "2.4.1", + "from": "lodash.keys@2.4.1", + "resolved": "https://registry.npmjs.org/lodash.keys/-/lodash.keys-2.4.1.tgz", + "dependencies": { + "lodash._isnative": { + "version": "2.4.1", + "from": "lodash._isnative@2.4.1", + "resolved": "https://registry.npmjs.org/lodash._isnative/-/lodash._isnative-2.4.1.tgz" + }, + "lodash.isobject": { + "version": "2.4.1", + "from": "lodash.isobject@2.4.1", + "resolved": "https://registry.npmjs.org/lodash.isobject/-/lodash.isobject-2.4.1.tgz" + }, + "lodash._shimkeys": { + "version": "2.4.1", + "from": "lodash._shimkeys@2.4.1", + "resolved": "https://registry.npmjs.org/lodash._shimkeys/-/lodash._shimkeys-2.4.1.tgz" + } + } + }, + "lodash._objecttypes": { + "version": "2.4.1", + "from": "lodash._objecttypes@2.4.1", + "resolved": "https://registry.npmjs.org/lodash._objecttypes/-/lodash._objecttypes-2.4.1.tgz" + } + } + }, + "vow": { + "version": "0.4.1", + "from": "https://registry.npmjs.org/vow/-/vow-0.4.1.tgz", + "resolved": "https://registry.npmjs.org/vow/-/vow-0.4.1.tgz" + } + } + }, + "grunt-merge-conflict": { + "version": "0.0.2", + "from": "https://registry.npmjs.org/grunt-merge-conflict/-/grunt-merge-conflict-0.0.2.tgz", + "resolved": "https://registry.npmjs.org/grunt-merge-conflict/-/grunt-merge-conflict-0.0.2.tgz" + }, + "grunt-parallel": { + "version": "0.3.1", + "from": "https://registry.npmjs.org/grunt-parallel/-/grunt-parallel-0.3.1.tgz", + "resolved": "https://registry.npmjs.org/grunt-parallel/-/grunt-parallel-0.3.1.tgz", + "dependencies": { + "q": { + "version": "0.8.12", + "from": "https://registry.npmjs.org/q/-/q-0.8.12.tgz", + "resolved": "https://registry.npmjs.org/q/-/q-0.8.12.tgz" + }, + "lpad": { + "version": "0.1.0", + "from": "https://registry.npmjs.org/lpad/-/lpad-0.1.0.tgz", + "resolved": "https://registry.npmjs.org/lpad/-/lpad-0.1.0.tgz" + } + } + }, + "grunt-shell": { + "version": "0.4.0", + "from": "https://registry.npmjs.org/grunt-shell/-/grunt-shell-0.4.0.tgz", + "resolved": "https://registry.npmjs.org/grunt-shell/-/grunt-shell-0.4.0.tgz", + "dependencies": { + "stripcolorcodes": { + "version": "0.1.0", + "from": "https://registry.npmjs.org/stripcolorcodes/-/stripcolorcodes-0.1.0.tgz", + "resolved": "https://registry.npmjs.org/stripcolorcodes/-/stripcolorcodes-0.1.0.tgz" + } + } + }, + "gulp": { + "version": "3.4.0", + "from": "https://registry.npmjs.org/gulp/-/gulp-3.4.0.tgz", + "resolved": "https://registry.npmjs.org/gulp/-/gulp-3.4.0.tgz", + "dependencies": { + "optimist": { + "version": "0.6.1", + "from": "optimist@0.6.1", + "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz", + "dependencies": { + "wordwrap": { + "version": "0.0.2", + "from": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz" + }, + "minimist": { + "version": "0.0.8", + "from": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz" + } + } + }, + "gulp-util": { + "version": "2.2.14", + "from": "https://registry.npmjs.org/gulp-util/-/gulp-util-2.2.14.tgz", + "resolved": "https://registry.npmjs.org/gulp-util/-/gulp-util-2.2.14.tgz", + "dependencies": { + "chalk": { + "version": "0.4.0", + "from": "https://registry.npmjs.org/chalk/-/chalk-0.4.0.tgz", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-0.4.0.tgz", + "dependencies": { + "has-color": { + "version": "0.1.4", + "from": "https://registry.npmjs.org/has-color/-/has-color-0.1.4.tgz", + "resolved": "https://registry.npmjs.org/has-color/-/has-color-0.1.4.tgz" + }, + "ansi-styles": { + "version": "1.0.0", + "from": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-1.0.0.tgz", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-1.0.0.tgz" + }, + "strip-ansi": { + "version": "0.1.1", + "from": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-0.1.1.tgz", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-0.1.1.tgz" + } + } + }, + "lodash.template": { + "version": "2.4.1", + "from": "https://registry.npmjs.org/lodash.template/-/lodash.template-2.4.1.tgz", + "resolved": "https://registry.npmjs.org/lodash.template/-/lodash.template-2.4.1.tgz", + "dependencies": { + "lodash.defaults": { + "version": "2.4.1", + "from": "https://registry.npmjs.org/lodash.defaults/-/lodash.defaults-2.4.1.tgz", + "resolved": "https://registry.npmjs.org/lodash.defaults/-/lodash.defaults-2.4.1.tgz", + "dependencies": { + "lodash._objecttypes": { + "version": "2.4.1", + "from": "https://registry.npmjs.org/lodash._objecttypes/-/lodash._objecttypes-2.4.1.tgz", + "resolved": "https://registry.npmjs.org/lodash._objecttypes/-/lodash._objecttypes-2.4.1.tgz" + } + } + }, + "lodash.escape": { + "version": "2.4.1", + "from": "https://registry.npmjs.org/lodash.escape/-/lodash.escape-2.4.1.tgz", + "resolved": "https://registry.npmjs.org/lodash.escape/-/lodash.escape-2.4.1.tgz", + "dependencies": { + "lodash._escapehtmlchar": { + "version": "2.4.1", + "from": "https://registry.npmjs.org/lodash._escapehtmlchar/-/lodash._escapehtmlchar-2.4.1.tgz", + "resolved": "https://registry.npmjs.org/lodash._escapehtmlchar/-/lodash._escapehtmlchar-2.4.1.tgz", + "dependencies": { + "lodash._htmlescapes": { + "version": "2.4.1", + "from": "https://registry.npmjs.org/lodash._htmlescapes/-/lodash._htmlescapes-2.4.1.tgz", + "resolved": "https://registry.npmjs.org/lodash._htmlescapes/-/lodash._htmlescapes-2.4.1.tgz" + } + } + }, + "lodash._reunescapedhtml": { + "version": "2.4.1", + "from": "https://registry.npmjs.org/lodash._reunescapedhtml/-/lodash._reunescapedhtml-2.4.1.tgz", + "resolved": "https://registry.npmjs.org/lodash._reunescapedhtml/-/lodash._reunescapedhtml-2.4.1.tgz", + "dependencies": { + "lodash._htmlescapes": { + "version": "2.4.1", + "from": "https://registry.npmjs.org/lodash._htmlescapes/-/lodash._htmlescapes-2.4.1.tgz", + "resolved": "https://registry.npmjs.org/lodash._htmlescapes/-/lodash._htmlescapes-2.4.1.tgz" + } + } + } + } + }, + "lodash._escapestringchar": { + "version": "2.4.1", + "from": "https://registry.npmjs.org/lodash._escapestringchar/-/lodash._escapestringchar-2.4.1.tgz", + "resolved": "https://registry.npmjs.org/lodash._escapestringchar/-/lodash._escapestringchar-2.4.1.tgz" + }, + "lodash.keys": { + "version": "2.4.1", + "from": "https://registry.npmjs.org/lodash.keys/-/lodash.keys-2.4.1.tgz", + "resolved": "https://registry.npmjs.org/lodash.keys/-/lodash.keys-2.4.1.tgz", + "dependencies": { + "lodash._isnative": { + "version": "2.4.1", + "from": "https://registry.npmjs.org/lodash._isnative/-/lodash._isnative-2.4.1.tgz", + "resolved": "https://registry.npmjs.org/lodash._isnative/-/lodash._isnative-2.4.1.tgz" + }, + "lodash.isobject": { + "version": "2.4.1", + "from": "https://registry.npmjs.org/lodash.isobject/-/lodash.isobject-2.4.1.tgz", + "resolved": "https://registry.npmjs.org/lodash.isobject/-/lodash.isobject-2.4.1.tgz", + "dependencies": { + "lodash._objecttypes": { + "version": "2.4.1", + "from": "https://registry.npmjs.org/lodash._objecttypes/-/lodash._objecttypes-2.4.1.tgz", + "resolved": "https://registry.npmjs.org/lodash._objecttypes/-/lodash._objecttypes-2.4.1.tgz" + } + } + }, + "lodash._shimkeys": { + "version": "2.4.1", + "from": "https://registry.npmjs.org/lodash._shimkeys/-/lodash._shimkeys-2.4.1.tgz", + "resolved": "https://registry.npmjs.org/lodash._shimkeys/-/lodash._shimkeys-2.4.1.tgz", + "dependencies": { + "lodash._objecttypes": { + "version": "2.4.1", + "from": "https://registry.npmjs.org/lodash._objecttypes/-/lodash._objecttypes-2.4.1.tgz", + "resolved": "https://registry.npmjs.org/lodash._objecttypes/-/lodash._objecttypes-2.4.1.tgz" + } + } + } + } + }, + "lodash.templatesettings": { + "version": "2.4.1", + "from": "https://registry.npmjs.org/lodash.templatesettings/-/lodash.templatesettings-2.4.1.tgz", + "resolved": "https://registry.npmjs.org/lodash.templatesettings/-/lodash.templatesettings-2.4.1.tgz" + }, + "lodash.values": { + "version": "2.4.1", + "from": "https://registry.npmjs.org/lodash.values/-/lodash.values-2.4.1.tgz", + "resolved": "https://registry.npmjs.org/lodash.values/-/lodash.values-2.4.1.tgz" + } + } + }, + "lodash._reinterpolate": { + "version": "2.4.1", + "from": "https://registry.npmjs.org/lodash._reinterpolate/-/lodash._reinterpolate-2.4.1.tgz", + "resolved": "https://registry.npmjs.org/lodash._reinterpolate/-/lodash._reinterpolate-2.4.1.tgz" + }, + "vinyl": { + "version": "0.2.3", + "from": "https://registry.npmjs.org/vinyl/-/vinyl-0.2.3.tgz", + "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-0.2.3.tgz", + "dependencies": { + "clone-stats": { + "version": "0.0.1", + "from": "https://registry.npmjs.org/clone-stats/-/clone-stats-0.0.1.tgz", + "resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-0.0.1.tgz" + } + } + }, + "through2": { + "version": "0.4.1", + "from": "https://registry.npmjs.org/through2/-/through2-0.4.1.tgz", + "resolved": "https://registry.npmjs.org/through2/-/through2-0.4.1.tgz", + "dependencies": { + "readable-stream": { + "version": "1.0.26", + "from": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.26.tgz", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.26.tgz", + "dependencies": { + "string_decoder": { + "version": "0.10.25-1", + "from": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.25-1.tgz", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.25-1.tgz" + } + } + }, + "xtend": { + "version": "2.1.2", + "from": "https://registry.npmjs.org/xtend/-/xtend-2.1.2.tgz", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-2.1.2.tgz", + "dependencies": { + "object-keys": { + "version": "0.4.0", + "from": "https://registry.npmjs.org/object-keys/-/object-keys-0.4.0.tgz", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-0.4.0.tgz" + } + } + } + } + }, + "dateformat": { + "version": "1.0.7-1.2.3", + "from": "https://registry.npmjs.org/dateformat/-/dateformat-1.0.7-1.2.3.tgz", + "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-1.0.7-1.2.3.tgz" + }, + "multipipe": { + "version": "0.0.2", + "from": "https://registry.npmjs.org/multipipe/-/multipipe-0.0.2.tgz", + "resolved": "https://registry.npmjs.org/multipipe/-/multipipe-0.0.2.tgz", + "dependencies": { + "duplexer2": { + "version": "0.0.1", + "from": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.0.1.tgz", + "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.0.1.tgz" + } + } + }, + "minimist": { + "version": "0.0.8", + "from": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz" + } + } + }, + "orchestrator": { + "version": "0.3.3", + "from": "https://registry.npmjs.org/orchestrator/-/orchestrator-0.3.3.tgz", + "resolved": "https://registry.npmjs.org/orchestrator/-/orchestrator-0.3.3.tgz", + "dependencies": { + "sequencify": { + "version": "0.0.7", + "from": "https://registry.npmjs.org/sequencify/-/sequencify-0.0.7.tgz", + "resolved": "https://registry.npmjs.org/sequencify/-/sequencify-0.0.7.tgz" + } + } + }, + "resolve": { + "version": "0.6.1", + "from": "https://registry.npmjs.org/resolve/-/resolve-0.6.1.tgz", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-0.6.1.tgz" + }, + "findup-sync": { + "version": "0.1.2", + "from": "findup-sync@0.1.2", + "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-0.1.2.tgz", + "dependencies": { + "glob": { + "version": "3.1.21", + "from": "glob@3.1.21", + "resolved": "https://registry.npmjs.org/glob/-/glob-3.1.21.tgz", + "dependencies": { + "minimatch": { + "version": "0.2.14", + "from": "minimatch@0.2.14", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-0.2.14.tgz", + "dependencies": { + "lru-cache": { + "version": "2.5.0", + "from": "lru-cache@2.5.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-2.5.0.tgz" + }, + "sigmund": { + "version": "1.0.0", + "from": "sigmund@1.0.0", + "resolved": "https://registry.npmjs.org/sigmund/-/sigmund-1.0.0.tgz" + } + } + }, + "graceful-fs": { + "version": "1.2.3", + "from": "graceful-fs@1.2.3", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-1.2.3.tgz" + }, + "inherits": { + "version": "1.0.0", + "from": "inherits@1.0.0", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-1.0.0.tgz" + } + } + }, + "lodash": { + "version": "1.0.1", + "from": "lodash@1.0.1", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-1.0.1.tgz" + } + } + }, + "pretty-hrtime": { + "version": "0.2.0", + "from": "https://registry.npmjs.org/pretty-hrtime/-/pretty-hrtime-0.2.0.tgz", + "resolved": "https://registry.npmjs.org/pretty-hrtime/-/pretty-hrtime-0.2.0.tgz" + }, + "vinyl-fs": { + "version": "0.0.1", + "from": "https://registry.npmjs.org/vinyl-fs/-/vinyl-fs-0.0.1.tgz", + "resolved": "https://registry.npmjs.org/vinyl-fs/-/vinyl-fs-0.0.1.tgz", + "dependencies": { + "vinyl": { + "version": "0.2.3", + "from": "https://registry.npmjs.org/vinyl/-/vinyl-0.2.3.tgz", + "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-0.2.3.tgz", + "dependencies": { + "clone-stats": { + "version": "0.0.1", + "from": "https://registry.npmjs.org/clone-stats/-/clone-stats-0.0.1.tgz", + "resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-0.0.1.tgz" + } + } + }, + "glob-stream": { + "version": "3.1.9", + "from": "https://registry.npmjs.org/glob-stream/-/glob-stream-3.1.9.tgz", + "resolved": "https://registry.npmjs.org/glob-stream/-/glob-stream-3.1.9.tgz", + "dependencies": { + "glob": { + "version": "3.2.9", + "from": "https://registry.npmjs.org/glob/-/glob-3.2.9.tgz", + "resolved": "https://registry.npmjs.org/glob/-/glob-3.2.9.tgz", + "dependencies": { + "inherits": { + "version": "2.0.1", + "from": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz" + } + } + }, + "minimatch": { + "version": "0.2.14", + "from": "minimatch@0.2.14", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-0.2.14.tgz", + "dependencies": { + "lru-cache": { + "version": "2.5.0", + "from": "lru-cache@2.5.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-2.5.0.tgz" + }, + "sigmund": { + "version": "1.0.0", + "from": "sigmund@1.0.0", + "resolved": "https://registry.npmjs.org/sigmund/-/sigmund-1.0.0.tgz" + } + } + }, + "ordered-read-streams": { + "version": "0.0.7", + "from": "https://registry.npmjs.org/ordered-read-streams/-/ordered-read-streams-0.0.7.tgz", + "resolved": "https://registry.npmjs.org/ordered-read-streams/-/ordered-read-streams-0.0.7.tgz" + }, + "glob2base": { + "version": "0.0.8", + "from": "https://registry.npmjs.org/glob2base/-/glob2base-0.0.8.tgz", + "resolved": "https://registry.npmjs.org/glob2base/-/glob2base-0.0.8.tgz" + }, + "unique-stream": { + "version": "0.0.3", + "from": "https://registry.npmjs.org/unique-stream/-/unique-stream-0.0.3.tgz", + "resolved": "https://registry.npmjs.org/unique-stream/-/unique-stream-0.0.3.tgz" + }, + "through": { + "version": "2.3.4", + "from": "https://registry.npmjs.org/through/-/through-2.3.4.tgz", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.4.tgz" + } + } + }, + "glob-watcher": { + "version": "0.0.3", + "from": "https://registry.npmjs.org/glob-watcher/-/glob-watcher-0.0.3.tgz", + "resolved": "https://registry.npmjs.org/glob-watcher/-/glob-watcher-0.0.3.tgz", + "dependencies": { + "gaze": { + "version": "0.4.3", + "from": "https://registry.npmjs.org/gaze/-/gaze-0.4.3.tgz", + "resolved": "https://registry.npmjs.org/gaze/-/gaze-0.4.3.tgz", + "dependencies": { + "globule": { + "version": "0.1.0", + "from": "https://registry.npmjs.org/globule/-/globule-0.1.0.tgz", + "resolved": "https://registry.npmjs.org/globule/-/globule-0.1.0.tgz", + "dependencies": { + "lodash": { + "version": "1.0.1", + "from": "lodash@1.0.1", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-1.0.1.tgz" + }, + "glob": { + "version": "3.1.21", + "from": "glob@3.1.21", + "resolved": "https://registry.npmjs.org/glob/-/glob-3.1.21.tgz", + "dependencies": { + "graceful-fs": { + "version": "1.2.3", + "from": "graceful-fs@1.2.3", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-1.2.3.tgz" + }, + "inherits": { + "version": "1.0.0", + "from": "inherits@1.0.0", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-1.0.0.tgz" + } + } + }, + "minimatch": { + "version": "0.2.14", + "from": "minimatch@0.2.14", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-0.2.14.tgz", + "dependencies": { + "lru-cache": { + "version": "2.5.0", + "from": "lru-cache@2.5.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-2.5.0.tgz" + }, + "sigmund": { + "version": "1.0.0", + "from": "sigmund@1.0.0", + "resolved": "https://registry.npmjs.org/sigmund/-/sigmund-1.0.0.tgz" + } + } + } + } + } + } + } + } + }, + "mkdirp": { + "version": "0.3.5", + "from": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.3.5.tgz", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.3.5.tgz" + }, + "graceful-fs": { + "version": "2.0.2", + "from": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-2.0.2.tgz", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-2.0.2.tgz" + }, + "map-stream": { + "version": "0.1.0", + "from": "https://registry.npmjs.org/map-stream/-/map-stream-0.1.0.tgz", + "resolved": "https://registry.npmjs.org/map-stream/-/map-stream-0.1.0.tgz" + } + } + }, + "semver": { + "version": "2.2.1", + "from": "https://registry.npmjs.org/semver/-/semver-2.2.1.tgz", + "resolved": "https://registry.npmjs.org/semver/-/semver-2.2.1.tgz" + }, + "archy": { + "version": "0.0.2", + "from": "https://registry.npmjs.org/archy/-/archy-0.0.2.tgz", + "resolved": "https://registry.npmjs.org/archy/-/archy-0.0.2.tgz" + } + } + }, + "gulp-concat": { + "version": "2.1.7", + "from": "https://registry.npmjs.org/gulp-concat/-/gulp-concat-2.1.7.tgz", + "resolved": "https://registry.npmjs.org/gulp-concat/-/gulp-concat-2.1.7.tgz", + "dependencies": { + "through": { + "version": "2.3.4", + "from": "https://registry.npmjs.org/through/-/through-2.3.4.tgz", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.4.tgz" + }, + "gulp-util": { + "version": "2.2.14", + "from": "https://registry.npmjs.org/gulp-util/-/gulp-util-2.2.14.tgz", + "resolved": "https://registry.npmjs.org/gulp-util/-/gulp-util-2.2.14.tgz", + "dependencies": { + "chalk": { + "version": "0.4.0", + "from": "https://registry.npmjs.org/chalk/-/chalk-0.4.0.tgz", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-0.4.0.tgz", + "dependencies": { + "has-color": { + "version": "0.1.4", + "from": "https://registry.npmjs.org/has-color/-/has-color-0.1.4.tgz", + "resolved": "https://registry.npmjs.org/has-color/-/has-color-0.1.4.tgz" + }, + "ansi-styles": { + "version": "1.0.0", + "from": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-1.0.0.tgz", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-1.0.0.tgz" + }, + "strip-ansi": { + "version": "0.1.1", + "from": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-0.1.1.tgz", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-0.1.1.tgz" + } + } + }, + "lodash.template": { + "version": "2.4.1", + "from": "https://registry.npmjs.org/lodash.template/-/lodash.template-2.4.1.tgz", + "resolved": "https://registry.npmjs.org/lodash.template/-/lodash.template-2.4.1.tgz", + "dependencies": { + "lodash.defaults": { + "version": "2.4.1", + "from": "https://registry.npmjs.org/lodash.defaults/-/lodash.defaults-2.4.1.tgz", + "resolved": "https://registry.npmjs.org/lodash.defaults/-/lodash.defaults-2.4.1.tgz", + "dependencies": { + "lodash._objecttypes": { + "version": "2.4.1", + "from": "https://registry.npmjs.org/lodash._objecttypes/-/lodash._objecttypes-2.4.1.tgz", + "resolved": "https://registry.npmjs.org/lodash._objecttypes/-/lodash._objecttypes-2.4.1.tgz" + } + } + }, + "lodash.escape": { + "version": "2.4.1", + "from": "https://registry.npmjs.org/lodash.escape/-/lodash.escape-2.4.1.tgz", + "resolved": "https://registry.npmjs.org/lodash.escape/-/lodash.escape-2.4.1.tgz", + "dependencies": { + "lodash._escapehtmlchar": { + "version": "2.4.1", + "from": "https://registry.npmjs.org/lodash._escapehtmlchar/-/lodash._escapehtmlchar-2.4.1.tgz", + "resolved": "https://registry.npmjs.org/lodash._escapehtmlchar/-/lodash._escapehtmlchar-2.4.1.tgz", + "dependencies": { + "lodash._htmlescapes": { + "version": "2.4.1", + "from": "https://registry.npmjs.org/lodash._htmlescapes/-/lodash._htmlescapes-2.4.1.tgz", + "resolved": "https://registry.npmjs.org/lodash._htmlescapes/-/lodash._htmlescapes-2.4.1.tgz" + } + } + }, + "lodash._reunescapedhtml": { + "version": "2.4.1", + "from": "https://registry.npmjs.org/lodash._reunescapedhtml/-/lodash._reunescapedhtml-2.4.1.tgz", + "resolved": "https://registry.npmjs.org/lodash._reunescapedhtml/-/lodash._reunescapedhtml-2.4.1.tgz", + "dependencies": { + "lodash._htmlescapes": { + "version": "2.4.1", + "from": "https://registry.npmjs.org/lodash._htmlescapes/-/lodash._htmlescapes-2.4.1.tgz", + "resolved": "https://registry.npmjs.org/lodash._htmlescapes/-/lodash._htmlescapes-2.4.1.tgz" + } + } + } + } + }, + "lodash._escapestringchar": { + "version": "2.4.1", + "from": "https://registry.npmjs.org/lodash._escapestringchar/-/lodash._escapestringchar-2.4.1.tgz", + "resolved": "https://registry.npmjs.org/lodash._escapestringchar/-/lodash._escapestringchar-2.4.1.tgz" + }, + "lodash.keys": { + "version": "2.4.1", + "from": "https://registry.npmjs.org/lodash.keys/-/lodash.keys-2.4.1.tgz", + "resolved": "https://registry.npmjs.org/lodash.keys/-/lodash.keys-2.4.1.tgz", + "dependencies": { + "lodash._isnative": { + "version": "2.4.1", + "from": "https://registry.npmjs.org/lodash._isnative/-/lodash._isnative-2.4.1.tgz", + "resolved": "https://registry.npmjs.org/lodash._isnative/-/lodash._isnative-2.4.1.tgz" + }, + "lodash.isobject": { + "version": "2.4.1", + "from": "https://registry.npmjs.org/lodash.isobject/-/lodash.isobject-2.4.1.tgz", + "resolved": "https://registry.npmjs.org/lodash.isobject/-/lodash.isobject-2.4.1.tgz", + "dependencies": { + "lodash._objecttypes": { + "version": "2.4.1", + "from": "https://registry.npmjs.org/lodash._objecttypes/-/lodash._objecttypes-2.4.1.tgz", + "resolved": "https://registry.npmjs.org/lodash._objecttypes/-/lodash._objecttypes-2.4.1.tgz" + } + } + }, + "lodash._shimkeys": { + "version": "2.4.1", + "from": "https://registry.npmjs.org/lodash._shimkeys/-/lodash._shimkeys-2.4.1.tgz", + "resolved": "https://registry.npmjs.org/lodash._shimkeys/-/lodash._shimkeys-2.4.1.tgz", + "dependencies": { + "lodash._objecttypes": { + "version": "2.4.1", + "from": "https://registry.npmjs.org/lodash._objecttypes/-/lodash._objecttypes-2.4.1.tgz", + "resolved": "https://registry.npmjs.org/lodash._objecttypes/-/lodash._objecttypes-2.4.1.tgz" + } + } + } + } + }, + "lodash.templatesettings": { + "version": "2.4.1", + "from": "https://registry.npmjs.org/lodash.templatesettings/-/lodash.templatesettings-2.4.1.tgz", + "resolved": "https://registry.npmjs.org/lodash.templatesettings/-/lodash.templatesettings-2.4.1.tgz" + }, + "lodash.values": { + "version": "2.4.1", + "from": "https://registry.npmjs.org/lodash.values/-/lodash.values-2.4.1.tgz", + "resolved": "https://registry.npmjs.org/lodash.values/-/lodash.values-2.4.1.tgz" + } + } + }, + "lodash._reinterpolate": { + "version": "2.4.1", + "from": "https://registry.npmjs.org/lodash._reinterpolate/-/lodash._reinterpolate-2.4.1.tgz", + "resolved": "https://registry.npmjs.org/lodash._reinterpolate/-/lodash._reinterpolate-2.4.1.tgz" + }, + "vinyl": { + "version": "0.2.3", + "from": "https://registry.npmjs.org/vinyl/-/vinyl-0.2.3.tgz", + "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-0.2.3.tgz", + "dependencies": { + "clone-stats": { + "version": "0.0.1", + "from": "https://registry.npmjs.org/clone-stats/-/clone-stats-0.0.1.tgz", + "resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-0.0.1.tgz" + } + } + }, + "through2": { + "version": "0.4.1", + "from": "https://registry.npmjs.org/through2/-/through2-0.4.1.tgz", + "resolved": "https://registry.npmjs.org/through2/-/through2-0.4.1.tgz", + "dependencies": { + "readable-stream": { + "version": "1.0.26", + "from": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.26.tgz", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.26.tgz", + "dependencies": { + "string_decoder": { + "version": "0.10.25-1", + "from": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.25-1.tgz", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.25-1.tgz" + } + } + }, + "xtend": { + "version": "2.1.2", + "from": "https://registry.npmjs.org/xtend/-/xtend-2.1.2.tgz", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-2.1.2.tgz", + "dependencies": { + "object-keys": { + "version": "0.4.0", + "from": "https://registry.npmjs.org/object-keys/-/object-keys-0.4.0.tgz", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-0.4.0.tgz" + } + } + } + } + }, + "dateformat": { + "version": "1.0.7-1.2.3", + "from": "https://registry.npmjs.org/dateformat/-/dateformat-1.0.7-1.2.3.tgz", + "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-1.0.7-1.2.3.tgz" + }, + "multipipe": { + "version": "0.0.2", + "from": "https://registry.npmjs.org/multipipe/-/multipipe-0.0.2.tgz", + "resolved": "https://registry.npmjs.org/multipipe/-/multipipe-0.0.2.tgz", + "dependencies": { + "duplexer2": { + "version": "0.0.1", + "from": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.0.1.tgz", + "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.0.1.tgz" + } + } + }, + "minimist": { + "version": "0.0.8", + "from": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz" + } + } + } + } + }, + "gulp-jshint": { + "version": "1.4.2", + "from": "https://registry.npmjs.org/gulp-jshint/-/gulp-jshint-1.4.2.tgz", + "resolved": "https://registry.npmjs.org/gulp-jshint/-/gulp-jshint-1.4.2.tgz", + "dependencies": { + "map-stream": { + "version": "0.1.0", + "from": "https://registry.npmjs.org/map-stream/-/map-stream-0.1.0.tgz", + "resolved": "https://registry.npmjs.org/map-stream/-/map-stream-0.1.0.tgz" + }, + "jshint": { + "version": "2.4.4", + "from": "https://registry.npmjs.org/jshint/-/jshint-2.4.4.tgz", + "resolved": "https://registry.npmjs.org/jshint/-/jshint-2.4.4.tgz", + "dependencies": { + "shelljs": { + "version": "0.1.4", + "from": "https://registry.npmjs.org/shelljs/-/shelljs-0.1.4.tgz", + "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.1.4.tgz" + }, + "underscore": { + "version": "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" + }, + "cli": { + "version": "0.4.5", + "from": "https://registry.npmjs.org/cli/-/cli-0.4.5.tgz", + "resolved": "https://registry.npmjs.org/cli/-/cli-0.4.5.tgz", + "dependencies": { + "glob": { + "version": "3.2.9", + "from": "https://registry.npmjs.org/glob/-/glob-3.2.9.tgz", + "resolved": "https://registry.npmjs.org/glob/-/glob-3.2.9.tgz", + "dependencies": { + "inherits": { + "version": "2.0.1", + "from": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz" + } + } + } + } + }, + "minimatch": { + "version": "0.2.14", + "from": "minimatch@0.2.14", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-0.2.14.tgz", + "dependencies": { + "lru-cache": { + "version": "2.5.0", + "from": "lru-cache@2.5.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-2.5.0.tgz" + }, + "sigmund": { + "version": "1.0.0", + "from": "sigmund@1.0.0", + "resolved": "https://registry.npmjs.org/sigmund/-/sigmund-1.0.0.tgz" + } + } + }, + "htmlparser2": { + "version": "3.3.0", + "from": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.3.0.tgz", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.3.0.tgz", + "dependencies": { + "domhandler": { + "version": "2.1.0", + "from": "https://registry.npmjs.org/domhandler/-/domhandler-2.1.0.tgz", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.1.0.tgz" + }, + "domutils": { + "version": "1.1.6", + "from": "https://registry.npmjs.org/domutils/-/domutils-1.1.6.tgz", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.1.6.tgz" + }, + "domelementtype": { + "version": "1.1.1", + "from": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.1.1.tgz", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.1.1.tgz" + }, + "readable-stream": { + "version": "1.0.26", + "from": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.26.tgz", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.26.tgz", + "dependencies": { + "string_decoder": { + "version": "0.10.25-1", + "from": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.25-1.tgz", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.25-1.tgz" + } + } + } + } + }, + "console-browserify": { + "version": "0.1.6", + "from": "https://registry.npmjs.org/console-browserify/-/console-browserify-0.1.6.tgz", + "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-0.1.6.tgz" + }, + "exit": { + "version": "0.1.2", + "from": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", + "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz" + } + } + }, + "gulp-util": { + "version": "2.2.14", + "from": "https://registry.npmjs.org/gulp-util/-/gulp-util-2.2.14.tgz", + "resolved": "https://registry.npmjs.org/gulp-util/-/gulp-util-2.2.14.tgz", + "dependencies": { + "chalk": { + "version": "0.4.0", + "from": "https://registry.npmjs.org/chalk/-/chalk-0.4.0.tgz", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-0.4.0.tgz", + "dependencies": { + "has-color": { + "version": "0.1.4", + "from": "https://registry.npmjs.org/has-color/-/has-color-0.1.4.tgz", + "resolved": "https://registry.npmjs.org/has-color/-/has-color-0.1.4.tgz" + }, + "ansi-styles": { + "version": "1.0.0", + "from": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-1.0.0.tgz", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-1.0.0.tgz" + }, + "strip-ansi": { + "version": "0.1.1", + "from": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-0.1.1.tgz", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-0.1.1.tgz" + } + } + }, + "lodash.template": { + "version": "2.4.1", + "from": "https://registry.npmjs.org/lodash.template/-/lodash.template-2.4.1.tgz", + "resolved": "https://registry.npmjs.org/lodash.template/-/lodash.template-2.4.1.tgz", + "dependencies": { + "lodash.defaults": { + "version": "2.4.1", + "from": "https://registry.npmjs.org/lodash.defaults/-/lodash.defaults-2.4.1.tgz", + "resolved": "https://registry.npmjs.org/lodash.defaults/-/lodash.defaults-2.4.1.tgz", + "dependencies": { + "lodash._objecttypes": { + "version": "2.4.1", + "from": "https://registry.npmjs.org/lodash._objecttypes/-/lodash._objecttypes-2.4.1.tgz", + "resolved": "https://registry.npmjs.org/lodash._objecttypes/-/lodash._objecttypes-2.4.1.tgz" + } + } + }, + "lodash.escape": { + "version": "2.4.1", + "from": "https://registry.npmjs.org/lodash.escape/-/lodash.escape-2.4.1.tgz", + "resolved": "https://registry.npmjs.org/lodash.escape/-/lodash.escape-2.4.1.tgz", + "dependencies": { + "lodash._escapehtmlchar": { + "version": "2.4.1", + "from": "https://registry.npmjs.org/lodash._escapehtmlchar/-/lodash._escapehtmlchar-2.4.1.tgz", + "resolved": "https://registry.npmjs.org/lodash._escapehtmlchar/-/lodash._escapehtmlchar-2.4.1.tgz", + "dependencies": { + "lodash._htmlescapes": { + "version": "2.4.1", + "from": "https://registry.npmjs.org/lodash._htmlescapes/-/lodash._htmlescapes-2.4.1.tgz", + "resolved": "https://registry.npmjs.org/lodash._htmlescapes/-/lodash._htmlescapes-2.4.1.tgz" + } + } + }, + "lodash._reunescapedhtml": { + "version": "2.4.1", + "from": "https://registry.npmjs.org/lodash._reunescapedhtml/-/lodash._reunescapedhtml-2.4.1.tgz", + "resolved": "https://registry.npmjs.org/lodash._reunescapedhtml/-/lodash._reunescapedhtml-2.4.1.tgz", + "dependencies": { + "lodash._htmlescapes": { + "version": "2.4.1", + "from": "https://registry.npmjs.org/lodash._htmlescapes/-/lodash._htmlescapes-2.4.1.tgz", + "resolved": "https://registry.npmjs.org/lodash._htmlescapes/-/lodash._htmlescapes-2.4.1.tgz" + } + } + } + } + }, + "lodash._escapestringchar": { + "version": "2.4.1", + "from": "https://registry.npmjs.org/lodash._escapestringchar/-/lodash._escapestringchar-2.4.1.tgz", + "resolved": "https://registry.npmjs.org/lodash._escapestringchar/-/lodash._escapestringchar-2.4.1.tgz" + }, + "lodash.keys": { + "version": "2.4.1", + "from": "https://registry.npmjs.org/lodash.keys/-/lodash.keys-2.4.1.tgz", + "resolved": "https://registry.npmjs.org/lodash.keys/-/lodash.keys-2.4.1.tgz", + "dependencies": { + "lodash._isnative": { + "version": "2.4.1", + "from": "https://registry.npmjs.org/lodash._isnative/-/lodash._isnative-2.4.1.tgz", + "resolved": "https://registry.npmjs.org/lodash._isnative/-/lodash._isnative-2.4.1.tgz" + }, + "lodash.isobject": { + "version": "2.4.1", + "from": "https://registry.npmjs.org/lodash.isobject/-/lodash.isobject-2.4.1.tgz", + "resolved": "https://registry.npmjs.org/lodash.isobject/-/lodash.isobject-2.4.1.tgz", + "dependencies": { + "lodash._objecttypes": { + "version": "2.4.1", + "from": "https://registry.npmjs.org/lodash._objecttypes/-/lodash._objecttypes-2.4.1.tgz", + "resolved": "https://registry.npmjs.org/lodash._objecttypes/-/lodash._objecttypes-2.4.1.tgz" + } + } + }, + "lodash._shimkeys": { + "version": "2.4.1", + "from": "https://registry.npmjs.org/lodash._shimkeys/-/lodash._shimkeys-2.4.1.tgz", + "resolved": "https://registry.npmjs.org/lodash._shimkeys/-/lodash._shimkeys-2.4.1.tgz", + "dependencies": { + "lodash._objecttypes": { + "version": "2.4.1", + "from": "https://registry.npmjs.org/lodash._objecttypes/-/lodash._objecttypes-2.4.1.tgz", + "resolved": "https://registry.npmjs.org/lodash._objecttypes/-/lodash._objecttypes-2.4.1.tgz" + } + } + } + } + }, + "lodash.templatesettings": { + "version": "2.4.1", + "from": "https://registry.npmjs.org/lodash.templatesettings/-/lodash.templatesettings-2.4.1.tgz", + "resolved": "https://registry.npmjs.org/lodash.templatesettings/-/lodash.templatesettings-2.4.1.tgz" + }, + "lodash.values": { + "version": "2.4.1", + "from": "https://registry.npmjs.org/lodash.values/-/lodash.values-2.4.1.tgz", + "resolved": "https://registry.npmjs.org/lodash.values/-/lodash.values-2.4.1.tgz" + } + } + }, + "lodash._reinterpolate": { + "version": "2.4.1", + "from": "https://registry.npmjs.org/lodash._reinterpolate/-/lodash._reinterpolate-2.4.1.tgz", + "resolved": "https://registry.npmjs.org/lodash._reinterpolate/-/lodash._reinterpolate-2.4.1.tgz" + }, + "vinyl": { + "version": "0.2.3", + "from": "https://registry.npmjs.org/vinyl/-/vinyl-0.2.3.tgz", + "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-0.2.3.tgz", + "dependencies": { + "clone-stats": { + "version": "0.0.1", + "from": "https://registry.npmjs.org/clone-stats/-/clone-stats-0.0.1.tgz", + "resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-0.0.1.tgz" + } + } + }, + "through2": { + "version": "0.4.1", + "from": "https://registry.npmjs.org/through2/-/through2-0.4.1.tgz", + "resolved": "https://registry.npmjs.org/through2/-/through2-0.4.1.tgz", + "dependencies": { + "readable-stream": { + "version": "1.0.26", + "from": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.26.tgz", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.26.tgz", + "dependencies": { + "string_decoder": { + "version": "0.10.25-1", + "from": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.25-1.tgz", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.25-1.tgz" + } + } + }, + "xtend": { + "version": "2.1.2", + "from": "https://registry.npmjs.org/xtend/-/xtend-2.1.2.tgz", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-2.1.2.tgz", + "dependencies": { + "object-keys": { + "version": "0.4.0", + "from": "https://registry.npmjs.org/object-keys/-/object-keys-0.4.0.tgz", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-0.4.0.tgz" + } + } + } + } + }, + "dateformat": { + "version": "1.0.7-1.2.3", + "from": "https://registry.npmjs.org/dateformat/-/dateformat-1.0.7-1.2.3.tgz", + "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-1.0.7-1.2.3.tgz" + }, + "multipipe": { + "version": "0.0.2", + "from": "https://registry.npmjs.org/multipipe/-/multipipe-0.0.2.tgz", + "resolved": "https://registry.npmjs.org/multipipe/-/multipipe-0.0.2.tgz", + "dependencies": { + "duplexer2": { + "version": "0.0.1", + "from": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.0.1.tgz", + "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.0.1.tgz" + } + } + }, + "minimist": { + "version": "0.0.8", + "from": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz" + } + } + }, + "lodash.clone": { + "version": "2.4.1", + "from": "https://registry.npmjs.org/lodash.clone/-/lodash.clone-2.4.1.tgz", + "resolved": "https://registry.npmjs.org/lodash.clone/-/lodash.clone-2.4.1.tgz", + "dependencies": { + "lodash._baseclone": { + "version": "2.4.1", + "from": "https://registry.npmjs.org/lodash._baseclone/-/lodash._baseclone-2.4.1.tgz", + "resolved": "https://registry.npmjs.org/lodash._baseclone/-/lodash._baseclone-2.4.1.tgz", + "dependencies": { + "lodash.assign": { + "version": "2.4.1", + "from": "https://registry.npmjs.org/lodash.assign/-/lodash.assign-2.4.1.tgz", + "resolved": "https://registry.npmjs.org/lodash.assign/-/lodash.assign-2.4.1.tgz", + "dependencies": { + "lodash.keys": { + "version": "2.4.1", + "from": "https://registry.npmjs.org/lodash.keys/-/lodash.keys-2.4.1.tgz", + "resolved": "https://registry.npmjs.org/lodash.keys/-/lodash.keys-2.4.1.tgz", + "dependencies": { + "lodash._isnative": { + "version": "2.4.1", + "from": "https://registry.npmjs.org/lodash._isnative/-/lodash._isnative-2.4.1.tgz", + "resolved": "https://registry.npmjs.org/lodash._isnative/-/lodash._isnative-2.4.1.tgz" + }, + "lodash._shimkeys": { + "version": "2.4.1", + "from": "https://registry.npmjs.org/lodash._shimkeys/-/lodash._shimkeys-2.4.1.tgz", + "resolved": "https://registry.npmjs.org/lodash._shimkeys/-/lodash._shimkeys-2.4.1.tgz" + } + } + }, + "lodash._objecttypes": { + "version": "2.4.1", + "from": "https://registry.npmjs.org/lodash._objecttypes/-/lodash._objecttypes-2.4.1.tgz", + "resolved": "https://registry.npmjs.org/lodash._objecttypes/-/lodash._objecttypes-2.4.1.tgz" + } + } + }, + "lodash.foreach": { + "version": "2.4.1", + "from": "https://registry.npmjs.org/lodash.foreach/-/lodash.foreach-2.4.1.tgz", + "resolved": "https://registry.npmjs.org/lodash.foreach/-/lodash.foreach-2.4.1.tgz" + }, + "lodash.forown": { + "version": "2.4.1", + "from": "https://registry.npmjs.org/lodash.forown/-/lodash.forown-2.4.1.tgz", + "resolved": "https://registry.npmjs.org/lodash.forown/-/lodash.forown-2.4.1.tgz", + "dependencies": { + "lodash.keys": { + "version": "2.4.1", + "from": "https://registry.npmjs.org/lodash.keys/-/lodash.keys-2.4.1.tgz", + "resolved": "https://registry.npmjs.org/lodash.keys/-/lodash.keys-2.4.1.tgz", + "dependencies": { + "lodash._isnative": { + "version": "2.4.1", + "from": "https://registry.npmjs.org/lodash._isnative/-/lodash._isnative-2.4.1.tgz", + "resolved": "https://registry.npmjs.org/lodash._isnative/-/lodash._isnative-2.4.1.tgz" + }, + "lodash._shimkeys": { + "version": "2.4.1", + "from": "https://registry.npmjs.org/lodash._shimkeys/-/lodash._shimkeys-2.4.1.tgz", + "resolved": "https://registry.npmjs.org/lodash._shimkeys/-/lodash._shimkeys-2.4.1.tgz" + } + } + }, + "lodash._objecttypes": { + "version": "2.4.1", + "from": "https://registry.npmjs.org/lodash._objecttypes/-/lodash._objecttypes-2.4.1.tgz", + "resolved": "https://registry.npmjs.org/lodash._objecttypes/-/lodash._objecttypes-2.4.1.tgz" + } + } + }, + "lodash._getarray": { + "version": "2.4.1", + "from": "https://registry.npmjs.org/lodash._getarray/-/lodash._getarray-2.4.1.tgz", + "resolved": "https://registry.npmjs.org/lodash._getarray/-/lodash._getarray-2.4.1.tgz", + "dependencies": { + "lodash._arraypool": { + "version": "2.4.1", + "from": "https://registry.npmjs.org/lodash._arraypool/-/lodash._arraypool-2.4.1.tgz", + "resolved": "https://registry.npmjs.org/lodash._arraypool/-/lodash._arraypool-2.4.1.tgz" + } + } + }, + "lodash.isarray": { + "version": "2.4.1", + "from": "https://registry.npmjs.org/lodash.isarray/-/lodash.isarray-2.4.1.tgz", + "resolved": "https://registry.npmjs.org/lodash.isarray/-/lodash.isarray-2.4.1.tgz", + "dependencies": { + "lodash._isnative": { + "version": "2.4.1", + "from": "https://registry.npmjs.org/lodash._isnative/-/lodash._isnative-2.4.1.tgz", + "resolved": "https://registry.npmjs.org/lodash._isnative/-/lodash._isnative-2.4.1.tgz" + } + } + }, + "lodash.isobject": { + "version": "2.4.1", + "from": "https://registry.npmjs.org/lodash.isobject/-/lodash.isobject-2.4.1.tgz", + "resolved": "https://registry.npmjs.org/lodash.isobject/-/lodash.isobject-2.4.1.tgz", + "dependencies": { + "lodash._objecttypes": { + "version": "2.4.1", + "from": "https://registry.npmjs.org/lodash._objecttypes/-/lodash._objecttypes-2.4.1.tgz", + "resolved": "https://registry.npmjs.org/lodash._objecttypes/-/lodash._objecttypes-2.4.1.tgz" + } + } + }, + "lodash._releasearray": { + "version": "2.4.1", + "from": "https://registry.npmjs.org/lodash._releasearray/-/lodash._releasearray-2.4.1.tgz", + "resolved": "https://registry.npmjs.org/lodash._releasearray/-/lodash._releasearray-2.4.1.tgz", + "dependencies": { + "lodash._arraypool": { + "version": "2.4.1", + "from": "https://registry.npmjs.org/lodash._arraypool/-/lodash._arraypool-2.4.1.tgz", + "resolved": "https://registry.npmjs.org/lodash._arraypool/-/lodash._arraypool-2.4.1.tgz" + }, + "lodash._maxpoolsize": { + "version": "2.4.1", + "from": "https://registry.npmjs.org/lodash._maxpoolsize/-/lodash._maxpoolsize-2.4.1.tgz", + "resolved": "https://registry.npmjs.org/lodash._maxpoolsize/-/lodash._maxpoolsize-2.4.1.tgz" + } + } + }, + "lodash._slice": { + "version": "2.4.1", + "from": "https://registry.npmjs.org/lodash._slice/-/lodash._slice-2.4.1.tgz", + "resolved": "https://registry.npmjs.org/lodash._slice/-/lodash._slice-2.4.1.tgz" + } + } + }, + "lodash._basecreatecallback": { + "version": "2.4.1", + "from": "https://registry.npmjs.org/lodash._basecreatecallback/-/lodash._basecreatecallback-2.4.1.tgz", + "resolved": "https://registry.npmjs.org/lodash._basecreatecallback/-/lodash._basecreatecallback-2.4.1.tgz", + "dependencies": { + "lodash.bind": { + "version": "2.4.1", + "from": "https://registry.npmjs.org/lodash.bind/-/lodash.bind-2.4.1.tgz", + "resolved": "https://registry.npmjs.org/lodash.bind/-/lodash.bind-2.4.1.tgz", + "dependencies": { + "lodash._createwrapper": { + "version": "2.4.1", + "from": "https://registry.npmjs.org/lodash._createwrapper/-/lodash._createwrapper-2.4.1.tgz", + "resolved": "https://registry.npmjs.org/lodash._createwrapper/-/lodash._createwrapper-2.4.1.tgz", + "dependencies": { + "lodash._basebind": { + "version": "2.4.1", + "from": "https://registry.npmjs.org/lodash._basebind/-/lodash._basebind-2.4.1.tgz", + "resolved": "https://registry.npmjs.org/lodash._basebind/-/lodash._basebind-2.4.1.tgz", + "dependencies": { + "lodash._basecreate": { + "version": "2.4.1", + "from": "https://registry.npmjs.org/lodash._basecreate/-/lodash._basecreate-2.4.1.tgz", + "resolved": "https://registry.npmjs.org/lodash._basecreate/-/lodash._basecreate-2.4.1.tgz", + "dependencies": { + "lodash._isnative": { + "version": "2.4.1", + "from": "https://registry.npmjs.org/lodash._isnative/-/lodash._isnative-2.4.1.tgz", + "resolved": "https://registry.npmjs.org/lodash._isnative/-/lodash._isnative-2.4.1.tgz" + }, + "lodash.noop": { + "version": "2.4.1", + "from": "https://registry.npmjs.org/lodash.noop/-/lodash.noop-2.4.1.tgz", + "resolved": "https://registry.npmjs.org/lodash.noop/-/lodash.noop-2.4.1.tgz" + } + } + }, + "lodash.isobject": { + "version": "2.4.1", + "from": "https://registry.npmjs.org/lodash.isobject/-/lodash.isobject-2.4.1.tgz", + "resolved": "https://registry.npmjs.org/lodash.isobject/-/lodash.isobject-2.4.1.tgz", + "dependencies": { + "lodash._objecttypes": { + "version": "2.4.1", + "from": "https://registry.npmjs.org/lodash._objecttypes/-/lodash._objecttypes-2.4.1.tgz", + "resolved": "https://registry.npmjs.org/lodash._objecttypes/-/lodash._objecttypes-2.4.1.tgz" + } + } + } + } + }, + "lodash._basecreatewrapper": { + "version": "2.4.1", + "from": "https://registry.npmjs.org/lodash._basecreatewrapper/-/lodash._basecreatewrapper-2.4.1.tgz", + "resolved": "https://registry.npmjs.org/lodash._basecreatewrapper/-/lodash._basecreatewrapper-2.4.1.tgz", + "dependencies": { + "lodash._basecreate": { + "version": "2.4.1", + "from": "https://registry.npmjs.org/lodash._basecreate/-/lodash._basecreate-2.4.1.tgz", + "resolved": "https://registry.npmjs.org/lodash._basecreate/-/lodash._basecreate-2.4.1.tgz", + "dependencies": { + "lodash._isnative": { + "version": "2.4.1", + "from": "https://registry.npmjs.org/lodash._isnative/-/lodash._isnative-2.4.1.tgz", + "resolved": "https://registry.npmjs.org/lodash._isnative/-/lodash._isnative-2.4.1.tgz" + }, + "lodash.noop": { + "version": "2.4.1", + "from": "https://registry.npmjs.org/lodash.noop/-/lodash.noop-2.4.1.tgz", + "resolved": "https://registry.npmjs.org/lodash.noop/-/lodash.noop-2.4.1.tgz" + } + } + }, + "lodash.isobject": { + "version": "2.4.1", + "from": "https://registry.npmjs.org/lodash.isobject/-/lodash.isobject-2.4.1.tgz", + "resolved": "https://registry.npmjs.org/lodash.isobject/-/lodash.isobject-2.4.1.tgz", + "dependencies": { + "lodash._objecttypes": { + "version": "2.4.1", + "from": "https://registry.npmjs.org/lodash._objecttypes/-/lodash._objecttypes-2.4.1.tgz", + "resolved": "https://registry.npmjs.org/lodash._objecttypes/-/lodash._objecttypes-2.4.1.tgz" + } + } + } + } + }, + "lodash.isfunction": { + "version": "2.4.1", + "from": "https://registry.npmjs.org/lodash.isfunction/-/lodash.isfunction-2.4.1.tgz", + "resolved": "https://registry.npmjs.org/lodash.isfunction/-/lodash.isfunction-2.4.1.tgz" + } + } + }, + "lodash._slice": { + "version": "2.4.1", + "from": "https://registry.npmjs.org/lodash._slice/-/lodash._slice-2.4.1.tgz", + "resolved": "https://registry.npmjs.org/lodash._slice/-/lodash._slice-2.4.1.tgz" + } + } + }, + "lodash.identity": { + "version": "2.4.1", + "from": "https://registry.npmjs.org/lodash.identity/-/lodash.identity-2.4.1.tgz", + "resolved": "https://registry.npmjs.org/lodash.identity/-/lodash.identity-2.4.1.tgz" + }, + "lodash._setbinddata": { + "version": "2.4.1", + "from": "https://registry.npmjs.org/lodash._setbinddata/-/lodash._setbinddata-2.4.1.tgz", + "resolved": "https://registry.npmjs.org/lodash._setbinddata/-/lodash._setbinddata-2.4.1.tgz", + "dependencies": { + "lodash._isnative": { + "version": "2.4.1", + "from": "https://registry.npmjs.org/lodash._isnative/-/lodash._isnative-2.4.1.tgz", + "resolved": "https://registry.npmjs.org/lodash._isnative/-/lodash._isnative-2.4.1.tgz" + }, + "lodash.noop": { + "version": "2.4.1", + "from": "https://registry.npmjs.org/lodash.noop/-/lodash.noop-2.4.1.tgz", + "resolved": "https://registry.npmjs.org/lodash.noop/-/lodash.noop-2.4.1.tgz" + } + } + }, + "lodash.support": { + "version": "2.4.1", + "from": "https://registry.npmjs.org/lodash.support/-/lodash.support-2.4.1.tgz", + "resolved": "https://registry.npmjs.org/lodash.support/-/lodash.support-2.4.1.tgz", + "dependencies": { + "lodash._isnative": { + "version": "2.4.1", + "from": "https://registry.npmjs.org/lodash._isnative/-/lodash._isnative-2.4.1.tgz", + "resolved": "https://registry.npmjs.org/lodash._isnative/-/lodash._isnative-2.4.1.tgz" + } + } + } + } + } + } + } + } + }, + "jasmine-node": { + "version": "1.11.0", + "from": "https://registry.npmjs.org/jasmine-node/-/jasmine-node-1.11.0.tgz", + "resolved": "https://registry.npmjs.org/jasmine-node/-/jasmine-node-1.11.0.tgz", + "dependencies": { + "coffee-script": { + "version": "1.7.1", + "from": "https://registry.npmjs.org/coffee-script/-/coffee-script-1.7.1.tgz", + "resolved": "https://registry.npmjs.org/coffee-script/-/coffee-script-1.7.1.tgz" + }, + "jasmine-growl-reporter": { + "version": "0.0.2", + "from": "https://registry.npmjs.org/jasmine-growl-reporter/-/jasmine-growl-reporter-0.0.2.tgz", + "resolved": "https://registry.npmjs.org/jasmine-growl-reporter/-/jasmine-growl-reporter-0.0.2.tgz", + "dependencies": { + "growl": { + "version": "1.7.0", + "from": "https://registry.npmjs.org/growl/-/growl-1.7.0.tgz", + "resolved": "https://registry.npmjs.org/growl/-/growl-1.7.0.tgz" + } + } + }, + "requirejs": { + "version": "2.1.11", + "from": "https://registry.npmjs.org/requirejs/-/requirejs-2.1.11.tgz", + "resolved": "https://registry.npmjs.org/requirejs/-/requirejs-2.1.11.tgz" + }, + "walkdir": { + "version": "0.0.7", + "from": "https://registry.npmjs.org/walkdir/-/walkdir-0.0.7.tgz", + "resolved": "https://registry.npmjs.org/walkdir/-/walkdir-0.0.7.tgz" + }, + "underscore": { + "version": "1.6.0", + "from": "https://registry.npmjs.org/underscore/-/underscore-1.6.0.tgz", + "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.6.0.tgz" + }, + "gaze": { + "version": "0.3.4", + "from": "https://registry.npmjs.org/gaze/-/gaze-0.3.4.tgz", + "resolved": "https://registry.npmjs.org/gaze/-/gaze-0.3.4.tgz", + "dependencies": { + "minimatch": { + "version": "0.2.14", + "from": "minimatch@0.2.14", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-0.2.14.tgz", + "dependencies": { + "lru-cache": { + "version": "2.5.0", + "from": "lru-cache@2.5.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-2.5.0.tgz" + }, + "sigmund": { + "version": "1.0.0", + "from": "sigmund@1.0.0", + "resolved": "https://registry.npmjs.org/sigmund/-/sigmund-1.0.0.tgz" + } + } + }, + "fileset": { + "version": "0.1.5", + "from": "https://registry.npmjs.org/fileset/-/fileset-0.1.5.tgz", + "resolved": "https://registry.npmjs.org/fileset/-/fileset-0.1.5.tgz", + "dependencies": { + "glob": { + "version": "3.2.9", + "from": "https://registry.npmjs.org/glob/-/glob-3.2.9.tgz", + "resolved": "https://registry.npmjs.org/glob/-/glob-3.2.9.tgz", + "dependencies": { + "inherits": { + "version": "2.0.1", + "from": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz" + } + } + } + } + } + } + }, + "mkdirp": { + "version": "0.3.5", + "from": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.3.5.tgz", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.3.5.tgz" + } + } + }, + "jasmine-reporters": { + "version": "0.2.1", + "from": "https://registry.npmjs.org/jasmine-reporters/-/jasmine-reporters-0.2.1.tgz", + "resolved": "https://registry.npmjs.org/jasmine-reporters/-/jasmine-reporters-0.2.1.tgz" + }, + "jshint-stylish": { + "version": "0.1.5", + "from": "https://registry.npmjs.org/jshint-stylish/-/jshint-stylish-0.1.5.tgz", + "resolved": "https://registry.npmjs.org/jshint-stylish/-/jshint-stylish-0.1.5.tgz", + "dependencies": { + "chalk": { + "version": "0.4.0", + "from": "https://registry.npmjs.org/chalk/-/chalk-0.4.0.tgz", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-0.4.0.tgz", + "dependencies": { + "has-color": { + "version": "0.1.4", + "from": "https://registry.npmjs.org/has-color/-/has-color-0.1.4.tgz", + "resolved": "https://registry.npmjs.org/has-color/-/has-color-0.1.4.tgz" + }, + "ansi-styles": { + "version": "1.0.0", + "from": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-1.0.0.tgz", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-1.0.0.tgz" + }, + "strip-ansi": { + "version": "0.1.1", + "from": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-0.1.1.tgz", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-0.1.1.tgz" + } + } + }, + "text-table": { + "version": "0.2.0", + "from": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz" + } + } + }, + "karma": { + "version": "0.11.12", + "from": "https://registry.npmjs.org/karma/-/karma-0.11.12.tgz", + "resolved": "https://registry.npmjs.org/karma/-/karma-0.11.12.tgz", + "dependencies": { + "di": { + "version": "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" + }, + "socket.io": { + "version": "0.9.16", + "from": "https://registry.npmjs.org/socket.io/-/socket.io-0.9.16.tgz", + "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-0.9.16.tgz", + "dependencies": { + "socket.io-client": { + "version": "0.9.16", + "from": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-0.9.16.tgz", + "resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-0.9.16.tgz", + "dependencies": { + "uglify-js": { + "version": "1.2.5", + "from": "https://registry.npmjs.org/uglify-js/-/uglify-js-1.2.5.tgz", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-1.2.5.tgz" + }, + "ws": { + "version": "0.4.31", + "from": "https://registry.npmjs.org/ws/-/ws-0.4.31.tgz", + "resolved": "https://registry.npmjs.org/ws/-/ws-0.4.31.tgz", + "dependencies": { + "commander": { + "version": "0.6.1", + "from": "https://registry.npmjs.org/commander/-/commander-0.6.1.tgz", + "resolved": "https://registry.npmjs.org/commander/-/commander-0.6.1.tgz" + }, + "nan": { + "version": "0.3.2", + "from": "https://registry.npmjs.org/nan/-/nan-0.3.2.tgz", + "resolved": "https://registry.npmjs.org/nan/-/nan-0.3.2.tgz" + }, + "tinycolor": { + "version": "0.0.1", + "from": "https://registry.npmjs.org/tinycolor/-/tinycolor-0.0.1.tgz", + "resolved": "https://registry.npmjs.org/tinycolor/-/tinycolor-0.0.1.tgz" + }, + "options": { + "version": "0.0.5", + "from": "https://registry.npmjs.org/options/-/options-0.0.5.tgz", + "resolved": "https://registry.npmjs.org/options/-/options-0.0.5.tgz" + } + } + }, + "xmlhttprequest": { + "version": "1.4.2", + "from": "https://registry.npmjs.org/xmlhttprequest/-/xmlhttprequest-1.4.2.tgz", + "resolved": "https://registry.npmjs.org/xmlhttprequest/-/xmlhttprequest-1.4.2.tgz" + }, + "active-x-obfuscator": { + "version": "0.0.1", + "from": "https://registry.npmjs.org/active-x-obfuscator/-/active-x-obfuscator-0.0.1.tgz", + "resolved": "https://registry.npmjs.org/active-x-obfuscator/-/active-x-obfuscator-0.0.1.tgz", + "dependencies": { + "zeparser": { + "version": "0.0.5", + "from": "https://registry.npmjs.org/zeparser/-/zeparser-0.0.5.tgz", + "resolved": "https://registry.npmjs.org/zeparser/-/zeparser-0.0.5.tgz" + } + } + } + } + }, + "policyfile": { + "version": "0.0.4", + "from": "https://registry.npmjs.org/policyfile/-/policyfile-0.0.4.tgz", + "resolved": "https://registry.npmjs.org/policyfile/-/policyfile-0.0.4.tgz" + }, + "base64id": { + "version": "0.1.0", + "from": "https://registry.npmjs.org/base64id/-/base64id-0.1.0.tgz", + "resolved": "https://registry.npmjs.org/base64id/-/base64id-0.1.0.tgz" + }, + "redis": { + "version": "0.7.3", + "from": "https://registry.npmjs.org/redis/-/redis-0.7.3.tgz", + "resolved": "https://registry.npmjs.org/redis/-/redis-0.7.3.tgz" + } + } + }, + "chokidar": { + "version": "0.8.1", + "from": "https://registry.npmjs.org/chokidar/-/chokidar-0.8.1.tgz", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-0.8.1.tgz" + }, + "glob": { + "version": "3.2.9", + "from": "https://registry.npmjs.org/glob/-/glob-3.2.9.tgz", + "resolved": "https://registry.npmjs.org/glob/-/glob-3.2.9.tgz", + "dependencies": { + "inherits": { + "version": "2.0.1", + "from": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz" + } + } + }, + "minimatch": { + "version": "0.2.14", + "from": "minimatch@0.2.14", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-0.2.14.tgz", + "dependencies": { + "lru-cache": { + "version": "2.5.0", + "from": "lru-cache@2.5.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-2.5.0.tgz" + }, + "sigmund": { + "version": "1.0.0", + "from": "sigmund@1.0.0", + "resolved": "https://registry.npmjs.org/sigmund/-/sigmund-1.0.0.tgz" + } + } + }, + "http-proxy": { + "version": "0.10.4", + "from": "https://registry.npmjs.org/http-proxy/-/http-proxy-0.10.4.tgz", + "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-0.10.4.tgz", + "dependencies": { + "pkginfo": { + "version": "0.3.0", + "from": "https://registry.npmjs.org/pkginfo/-/pkginfo-0.3.0.tgz", + "resolved": "https://registry.npmjs.org/pkginfo/-/pkginfo-0.3.0.tgz" + }, + "utile": { + "version": "0.2.1", + "from": "https://registry.npmjs.org/utile/-/utile-0.2.1.tgz", + "resolved": "https://registry.npmjs.org/utile/-/utile-0.2.1.tgz", + "dependencies": { + "async": { + "version": "0.2.10", + "from": "https://registry.npmjs.org/async/-/async-0.2.10.tgz", + "resolved": "https://registry.npmjs.org/async/-/async-0.2.10.tgz" + }, + "deep-equal": { + "version": "0.2.1", + "from": "https://registry.npmjs.org/deep-equal/-/deep-equal-0.2.1.tgz", + "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-0.2.1.tgz" + }, + "i": { + "version": "0.3.2", + "from": "https://registry.npmjs.org/i/-/i-0.3.2.tgz", + "resolved": "https://registry.npmjs.org/i/-/i-0.3.2.tgz" + }, + "mkdirp": { + "version": "0.3.5", + "from": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.3.5.tgz", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.3.5.tgz" + }, + "ncp": { + "version": "0.4.2", + "from": "https://registry.npmjs.org/ncp/-/ncp-0.4.2.tgz", + "resolved": "https://registry.npmjs.org/ncp/-/ncp-0.4.2.tgz" + } + } + } + } + }, + "optimist": { + "version": "0.6.1", + "from": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz", + "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz", + "dependencies": { + "wordwrap": { + "version": "0.0.2", + "from": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz" + }, + "minimist": { + "version": "0.0.8", + "from": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz" + } + } + }, + "coffee-script": { + "version": "1.6.3", + "from": "https://registry.npmjs.org/coffee-script/-/coffee-script-1.6.3.tgz", + "resolved": "https://registry.npmjs.org/coffee-script/-/coffee-script-1.6.3.tgz" + }, + "rimraf": { + "version": "2.2.6", + "from": "https://registry.npmjs.org/rimraf/-/rimraf-2.2.6.tgz", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.2.6.tgz" + }, + "q": { + "version": "0.9.7", + "from": "https://registry.npmjs.org/q/-/q-0.9.7.tgz", + "resolved": "https://registry.npmjs.org/q/-/q-0.9.7.tgz" + }, + "colors": { + "version": "0.6.2", + "from": "https://registry.npmjs.org/colors/-/colors-0.6.2.tgz", + "resolved": "https://registry.npmjs.org/colors/-/colors-0.6.2.tgz" + }, + "lodash": { + "version": "2.4.1", + "from": "lodash@2.4.1", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-2.4.1.tgz" + }, + "mime": { + "version": "1.2.11", + "from": "https://registry.npmjs.org/mime/-/mime-1.2.11.tgz", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.2.11.tgz" + }, + "log4js": { + "version": "0.6.10", + "from": "https://registry.npmjs.org/log4js/-/log4js-0.6.10.tgz", + "resolved": "https://registry.npmjs.org/log4js/-/log4js-0.6.10.tgz", + "dependencies": { + "async": { + "version": "0.1.15", + "from": "https://registry.npmjs.org/async/-/async-0.1.15.tgz", + "resolved": "https://registry.npmjs.org/async/-/async-0.1.15.tgz" + }, + "semver": { + "version": "1.1.4", + "from": "semver@1.1.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-1.1.4.tgz" + }, + "readable-stream": { + "version": "1.0.26", + "from": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.26.tgz", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.26.tgz", + "dependencies": { + "string_decoder": { + "version": "0.10.25-1", + "from": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.25-1.tgz", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.25-1.tgz" + } + } + } + } + }, + "useragent": { + "version": "2.0.7", + "from": "https://registry.npmjs.org/useragent/-/useragent-2.0.7.tgz", + "resolved": "https://registry.npmjs.org/useragent/-/useragent-2.0.7.tgz", + "dependencies": { + "lru-cache": { + "version": "2.2.4", + "from": "https://registry.npmjs.org/lru-cache/-/lru-cache-2.2.4.tgz", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-2.2.4.tgz" + } + } + }, + "graceful-fs": { + "version": "2.0.2", + "from": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-2.0.2.tgz", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-2.0.2.tgz" + }, + "connect": { + "version": "2.12.0", + "from": "https://registry.npmjs.org/connect/-/connect-2.12.0.tgz", + "resolved": "https://registry.npmjs.org/connect/-/connect-2.12.0.tgz", + "dependencies": { + "batch": { + "version": "0.5.0", + "from": "https://registry.npmjs.org/batch/-/batch-0.5.0.tgz", + "resolved": "https://registry.npmjs.org/batch/-/batch-0.5.0.tgz" + }, + "qs": { + "version": "0.6.6", + "from": "https://registry.npmjs.org/qs/-/qs-0.6.6.tgz", + "resolved": "https://registry.npmjs.org/qs/-/qs-0.6.6.tgz" + }, + "cookie-signature": { + "version": "1.0.1", + "from": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.1.tgz", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.1.tgz" + }, + "buffer-crc32": { + "version": "0.2.1", + "from": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.1.tgz", + "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.1.tgz" + }, + "cookie": { + "version": "0.1.0", + "from": "https://registry.npmjs.org/cookie/-/cookie-0.1.0.tgz", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.1.0.tgz" + }, + "send": { + "version": "0.1.4", + "from": "https://registry.npmjs.org/send/-/send-0.1.4.tgz", + "resolved": "https://registry.npmjs.org/send/-/send-0.1.4.tgz", + "dependencies": { + "range-parser": { + "version": "0.0.4", + "from": "https://registry.npmjs.org/range-parser/-/range-parser-0.0.4.tgz", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-0.0.4.tgz" + } + } + }, + "bytes": { + "version": "0.2.1", + "from": "https://registry.npmjs.org/bytes/-/bytes-0.2.1.tgz", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-0.2.1.tgz" + }, + "fresh": { + "version": "0.2.0", + "from": "https://registry.npmjs.org/fresh/-/fresh-0.2.0.tgz", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.2.0.tgz" + }, + "pause": { + "version": "0.0.1", + "from": "https://registry.npmjs.org/pause/-/pause-0.0.1.tgz", + "resolved": "https://registry.npmjs.org/pause/-/pause-0.0.1.tgz" + }, + "uid2": { + "version": "0.0.3", + "from": "https://registry.npmjs.org/uid2/-/uid2-0.0.3.tgz", + "resolved": "https://registry.npmjs.org/uid2/-/uid2-0.0.3.tgz" + }, + "debug": { + "version": "0.7.4", + "from": "https://registry.npmjs.org/debug/-/debug-0.7.4.tgz", + "resolved": "https://registry.npmjs.org/debug/-/debug-0.7.4.tgz" + }, + "methods": { + "version": "0.1.0", + "from": "https://registry.npmjs.org/methods/-/methods-0.1.0.tgz", + "resolved": "https://registry.npmjs.org/methods/-/methods-0.1.0.tgz" + }, + "raw-body": { + "version": "1.1.2", + "from": "https://registry.npmjs.org/raw-body/-/raw-body-1.1.2.tgz", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-1.1.2.tgz" + }, + "negotiator": { + "version": "0.3.0", + "from": "https://registry.npmjs.org/negotiator/-/negotiator-0.3.0.tgz", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.3.0.tgz" + }, + "multiparty": { + "version": "2.2.0", + "from": "https://registry.npmjs.org/multiparty/-/multiparty-2.2.0.tgz", + "resolved": "https://registry.npmjs.org/multiparty/-/multiparty-2.2.0.tgz", + "dependencies": { + "readable-stream": { + "version": "1.1.11", + "from": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.11.tgz", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.11.tgz", + "dependencies": { + "core-util-is": { + "version": "1.0.1", + "from": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.1.tgz", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.1.tgz" + }, + "string_decoder": { + "version": "0.10.25-1", + "from": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.25-1.tgz", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.25-1.tgz" + }, + "debuglog": { + "version": "0.0.2", + "from": "https://registry.npmjs.org/debuglog/-/debuglog-0.0.2.tgz", + "resolved": "https://registry.npmjs.org/debuglog/-/debuglog-0.0.2.tgz" + } + } + }, + "stream-counter": { + "version": "0.2.0", + "from": "https://registry.npmjs.org/stream-counter/-/stream-counter-0.2.0.tgz", + "resolved": "https://registry.npmjs.org/stream-counter/-/stream-counter-0.2.0.tgz" + } + } + } + } + }, + "source-map": { + "version": "0.1.32", + "from": "https://registry.npmjs.org/source-map/-/source-map-0.1.32.tgz", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.1.32.tgz", + "dependencies": { + "amdefine": { + "version": "0.1.0", + "from": "https://registry.npmjs.org/amdefine/-/amdefine-0.1.0.tgz", + "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-0.1.0.tgz" + } + } + } + } + }, + "karma-browserstack-launcher": { + "version": "0.0.7", + "from": "https://registry.npmjs.org/karma-browserstack-launcher/-/karma-browserstack-launcher-0.0.7.tgz", + "resolved": "https://registry.npmjs.org/karma-browserstack-launcher/-/karma-browserstack-launcher-0.0.7.tgz", + "dependencies": { + "browserstack": { + "version": "1.0.1", + "from": "https://registry.npmjs.org/browserstack/-/browserstack-1.0.1.tgz", + "resolved": "https://registry.npmjs.org/browserstack/-/browserstack-1.0.1.tgz" + }, + "q": { + "version": "0.9.7", + "from": "q@0.9.7", + "resolved": "https://registry.npmjs.org/q/-/q-0.9.7.tgz" + } + } + }, + "karma-chrome-launcher": { + "version": "0.1.2", + "from": "https://registry.npmjs.org/karma-chrome-launcher/-/karma-chrome-launcher-0.1.2.tgz", + "resolved": "https://registry.npmjs.org/karma-chrome-launcher/-/karma-chrome-launcher-0.1.2.tgz" + }, + "karma-firefox-launcher": { + "version": "0.1.3", + "from": "https://registry.npmjs.org/karma-firefox-launcher/-/karma-firefox-launcher-0.1.3.tgz", + "resolved": "https://registry.npmjs.org/karma-firefox-launcher/-/karma-firefox-launcher-0.1.3.tgz" + }, + "karma-jasmine": { + "version": "0.1.5", + "from": "https://registry.npmjs.org/karma-jasmine/-/karma-jasmine-0.1.5.tgz", + "resolved": "https://registry.npmjs.org/karma-jasmine/-/karma-jasmine-0.1.5.tgz" + }, + "karma-junit-reporter": { + "version": "0.2.1", + "from": "https://registry.npmjs.org/karma-junit-reporter/-/karma-junit-reporter-0.2.1.tgz", + "resolved": "https://registry.npmjs.org/karma-junit-reporter/-/karma-junit-reporter-0.2.1.tgz", + "dependencies": { + "xmlbuilder": { + "version": "0.4.2", + "from": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-0.4.2.tgz", + "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-0.4.2.tgz" + } + } + }, + "karma-ng-scenario": { + "version": "0.1.0", + "from": "https://registry.npmjs.org/karma-ng-scenario/-/karma-ng-scenario-0.1.0.tgz", + "resolved": "https://registry.npmjs.org/karma-ng-scenario/-/karma-ng-scenario-0.1.0.tgz" + }, + "karma-sauce-launcher": { + "version": "0.2.0", + "from": "https://registry.npmjs.org/karma-sauce-launcher/-/karma-sauce-launcher-0.2.0.tgz", + "resolved": "https://registry.npmjs.org/karma-sauce-launcher/-/karma-sauce-launcher-0.2.0.tgz", + "dependencies": { + "wd": { + "version": "0.2.10", + "from": "https://registry.npmjs.org/wd/-/wd-0.2.10.tgz", + "resolved": "https://registry.npmjs.org/wd/-/wd-0.2.10.tgz", + "dependencies": { + "async": { + "version": "0.2.10", + "from": "https://registry.npmjs.org/async/-/async-0.2.10.tgz", + "resolved": "https://registry.npmjs.org/async/-/async-0.2.10.tgz" + }, + "vargs": { + "version": "0.1.0", + "from": "https://registry.npmjs.org/vargs/-/vargs-0.1.0.tgz", + "resolved": "https://registry.npmjs.org/vargs/-/vargs-0.1.0.tgz" + }, + "q": { + "version": "1.0.0", + "from": "https://registry.npmjs.org/q/-/q-1.0.0.tgz", + "resolved": "https://registry.npmjs.org/q/-/q-1.0.0.tgz" + }, + "request": { + "version": "2.33.0", + "from": "https://registry.npmjs.org/request/-/request-2.33.0.tgz", + "resolved": "https://registry.npmjs.org/request/-/request-2.33.0.tgz", + "dependencies": { + "qs": { + "version": "0.6.6", + "from": "https://registry.npmjs.org/qs/-/qs-0.6.6.tgz", + "resolved": "https://registry.npmjs.org/qs/-/qs-0.6.6.tgz" + }, + "json-stringify-safe": { + "version": "5.0.0", + "from": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.0.tgz", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.0.tgz" + }, + "forever-agent": { + "version": "0.5.2", + "from": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.5.2.tgz", + "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.5.2.tgz" + }, + "node-uuid": { + "version": "1.4.1", + "from": "https://registry.npmjs.org/node-uuid/-/node-uuid-1.4.1.tgz", + "resolved": "https://registry.npmjs.org/node-uuid/-/node-uuid-1.4.1.tgz" + }, + "mime": { + "version": "1.2.11", + "from": "https://registry.npmjs.org/mime/-/mime-1.2.11.tgz", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.2.11.tgz" + }, + "tough-cookie": { + "version": "0.12.1", + "from": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-0.12.1.tgz", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-0.12.1.tgz", + "dependencies": { + "punycode": { + "version": "1.2.4", + "from": "https://registry.npmjs.org/punycode/-/punycode-1.2.4.tgz", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.2.4.tgz" + } + } + }, + "form-data": { + "version": "0.1.2", + "from": "https://registry.npmjs.org/form-data/-/form-data-0.1.2.tgz", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-0.1.2.tgz", + "dependencies": { + "combined-stream": { + "version": "0.0.4", + "from": "https://registry.npmjs.org/combined-stream/-/combined-stream-0.0.4.tgz", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-0.0.4.tgz", + "dependencies": { + "delayed-stream": { + "version": "0.0.5", + "from": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-0.0.5.tgz", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-0.0.5.tgz" + } + } + } + } + }, + "tunnel-agent": { + "version": "0.3.0", + "from": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.3.0.tgz", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.3.0.tgz" + }, + "http-signature": { + "version": "0.10.0", + "from": "https://registry.npmjs.org/http-signature/-/http-signature-0.10.0.tgz", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-0.10.0.tgz", + "dependencies": { + "assert-plus": { + "version": "0.1.2", + "from": "https://registry.npmjs.org/assert-plus/-/assert-plus-0.1.2.tgz", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-0.1.2.tgz" + }, + "asn1": { + "version": "0.1.11", + "from": "https://registry.npmjs.org/asn1/-/asn1-0.1.11.tgz", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.1.11.tgz" + }, + "ctype": { + "version": "0.5.2", + "from": "https://registry.npmjs.org/ctype/-/ctype-0.5.2.tgz", + "resolved": "https://registry.npmjs.org/ctype/-/ctype-0.5.2.tgz" + } + } + }, + "oauth-sign": { + "version": "0.3.0", + "from": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.3.0.tgz", + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.3.0.tgz" + }, + "hawk": { + "version": "1.0.0", + "from": "https://registry.npmjs.org/hawk/-/hawk-1.0.0.tgz", + "resolved": "https://registry.npmjs.org/hawk/-/hawk-1.0.0.tgz", + "dependencies": { + "hoek": { + "version": "0.9.1", + "from": "https://registry.npmjs.org/hoek/-/hoek-0.9.1.tgz", + "resolved": "https://registry.npmjs.org/hoek/-/hoek-0.9.1.tgz" + }, + "boom": { + "version": "0.4.2", + "from": "https://registry.npmjs.org/boom/-/boom-0.4.2.tgz", + "resolved": "https://registry.npmjs.org/boom/-/boom-0.4.2.tgz" + }, + "cryptiles": { + "version": "0.2.2", + "from": "https://registry.npmjs.org/cryptiles/-/cryptiles-0.2.2.tgz", + "resolved": "https://registry.npmjs.org/cryptiles/-/cryptiles-0.2.2.tgz" + }, + "sntp": { + "version": "0.2.4", + "from": "https://registry.npmjs.org/sntp/-/sntp-0.2.4.tgz", + "resolved": "https://registry.npmjs.org/sntp/-/sntp-0.2.4.tgz" + } + } + }, + "aws-sign2": { + "version": "0.5.0", + "from": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.5.0.tgz", + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.5.0.tgz" + } + } + }, + "archiver": { + "version": "0.5.2", + "from": "https://registry.npmjs.org/archiver/-/archiver-0.5.2.tgz", + "resolved": "https://registry.npmjs.org/archiver/-/archiver-0.5.2.tgz", + "dependencies": { + "readable-stream": { + "version": "1.0.26", + "from": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.26.tgz", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.26.tgz", + "dependencies": { + "string_decoder": { + "version": "0.10.25-1", + "from": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.25-1.tgz", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.25-1.tgz" + } + } + }, + "zip-stream": { + "version": "0.1.4", + "from": "https://registry.npmjs.org/zip-stream/-/zip-stream-0.1.4.tgz", + "resolved": "https://registry.npmjs.org/zip-stream/-/zip-stream-0.1.4.tgz", + "dependencies": { + "lodash.defaults": { + "version": "2.4.1", + "from": "https://registry.npmjs.org/lodash.defaults/-/lodash.defaults-2.4.1.tgz", + "resolved": "https://registry.npmjs.org/lodash.defaults/-/lodash.defaults-2.4.1.tgz", + "dependencies": { + "lodash.keys": { + "version": "2.4.1", + "from": "https://registry.npmjs.org/lodash.keys/-/lodash.keys-2.4.1.tgz", + "resolved": "https://registry.npmjs.org/lodash.keys/-/lodash.keys-2.4.1.tgz", + "dependencies": { + "lodash._isnative": { + "version": "2.4.1", + "from": "https://registry.npmjs.org/lodash._isnative/-/lodash._isnative-2.4.1.tgz", + "resolved": "https://registry.npmjs.org/lodash._isnative/-/lodash._isnative-2.4.1.tgz" + }, + "lodash.isobject": { + "version": "2.4.1", + "from": "https://registry.npmjs.org/lodash.isobject/-/lodash.isobject-2.4.1.tgz", + "resolved": "https://registry.npmjs.org/lodash.isobject/-/lodash.isobject-2.4.1.tgz" + }, + "lodash._shimkeys": { + "version": "2.4.1", + "from": "https://registry.npmjs.org/lodash._shimkeys/-/lodash._shimkeys-2.4.1.tgz", + "resolved": "https://registry.npmjs.org/lodash._shimkeys/-/lodash._shimkeys-2.4.1.tgz" + } + } + }, + "lodash._objecttypes": { + "version": "2.4.1", + "from": "https://registry.npmjs.org/lodash._objecttypes/-/lodash._objecttypes-2.4.1.tgz", + "resolved": "https://registry.npmjs.org/lodash._objecttypes/-/lodash._objecttypes-2.4.1.tgz" + } + } + } + } + }, + "lazystream": { + "version": "0.1.0", + "from": "https://registry.npmjs.org/lazystream/-/lazystream-0.1.0.tgz", + "resolved": "https://registry.npmjs.org/lazystream/-/lazystream-0.1.0.tgz" + }, + "file-utils": { + "version": "0.1.5", + "from": "https://registry.npmjs.org/file-utils/-/file-utils-0.1.5.tgz", + "resolved": "https://registry.npmjs.org/file-utils/-/file-utils-0.1.5.tgz", + "dependencies": { + "lodash": { + "version": "2.1.0", + "from": "lodash@2.1.0", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-2.1.0.tgz" + }, + "iconv-lite": { + "version": "0.2.11", + "from": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.2.11.tgz", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.2.11.tgz" + }, + "rimraf": { + "version": "2.2.6", + "from": "https://registry.npmjs.org/rimraf/-/rimraf-2.2.6.tgz", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.2.6.tgz" + }, + "glob": { + "version": "3.2.9", + "from": "https://registry.npmjs.org/glob/-/glob-3.2.9.tgz", + "resolved": "https://registry.npmjs.org/glob/-/glob-3.2.9.tgz", + "dependencies": { + "inherits": { + "version": "2.0.1", + "from": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz" + } + } + }, + "minimatch": { + "version": "0.2.14", + "from": "minimatch@0.2.14", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-0.2.14.tgz", + "dependencies": { + "lru-cache": { + "version": "2.5.0", + "from": "lru-cache@2.5.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-2.5.0.tgz" + }, + "sigmund": { + "version": "1.0.0", + "from": "sigmund@1.0.0", + "resolved": "https://registry.npmjs.org/sigmund/-/sigmund-1.0.0.tgz" + } + } + }, + "findup-sync": { + "version": "0.1.2", + "from": "findup-sync@0.1.2", + "dependencies": { + "glob": { + "version": "3.1.21", + "from": "glob@3.1.21", + "dependencies": { + "graceful-fs": { + "version": "1.2.3", + "from": "graceful-fs@1.2.3", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-1.2.3.tgz" + }, + "inherits": { + "version": "1.0.0", + "from": "inherits@1.0.0", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-1.0.0.tgz" + } + } + }, + "lodash": { + "version": "1.0.1", + "from": "lodash@1.0.1" + } + } + }, + "isbinaryfile": { + "version": "0.1.9", + "from": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-0.1.9.tgz", + "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-0.1.9.tgz" + } + } + } + } + }, + "lodash": { + "version": "2.4.1", + "from": "https://registry.npmjs.org/lodash/-/lodash-2.4.1.tgz", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-2.4.1.tgz" + }, + "underscore.string": { + "version": "2.3.3", + "from": "https://registry.npmjs.org/underscore.string/-/underscore.string-2.3.3.tgz", + "resolved": "https://registry.npmjs.org/underscore.string/-/underscore.string-2.3.3.tgz" + } + } + }, + "sauce-connect-launcher": { + "version": "0.2.2", + "from": "https://registry.npmjs.org/sauce-connect-launcher/-/sauce-connect-launcher-0.2.2.tgz", + "resolved": "https://registry.npmjs.org/sauce-connect-launcher/-/sauce-connect-launcher-0.2.2.tgz", + "dependencies": { + "lodash": { + "version": "1.3.1", + "from": "https://registry.npmjs.org/lodash/-/lodash-1.3.1.tgz", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-1.3.1.tgz" + }, + "async": { + "version": "0.2.10", + "from": "https://registry.npmjs.org/async/-/async-0.2.10.tgz", + "resolved": "https://registry.npmjs.org/async/-/async-0.2.10.tgz" + }, + "adm-zip": { + "version": "0.4.4", + "from": "https://registry.npmjs.org/adm-zip/-/adm-zip-0.4.4.tgz", + "resolved": "https://registry.npmjs.org/adm-zip/-/adm-zip-0.4.4.tgz" + } + } + }, + "q": { + "version": "0.9.7", + "from": "https://registry.npmjs.org/q/-/q-0.9.7.tgz", + "resolved": "https://registry.npmjs.org/q/-/q-0.9.7.tgz" + }, + "saucelabs": { + "version": "0.1.1", + "from": "https://registry.npmjs.org/saucelabs/-/saucelabs-0.1.1.tgz", + "resolved": "https://registry.npmjs.org/saucelabs/-/saucelabs-0.1.1.tgz" + } + } + }, + "karma-script-launcher": { + "version": "0.1.0", + "from": "https://registry.npmjs.org/karma-script-launcher/-/karma-script-launcher-0.1.0.tgz", + "resolved": "https://registry.npmjs.org/karma-script-launcher/-/karma-script-launcher-0.1.0.tgz" + }, + "load-grunt-tasks": { + "version": "0.3.0", + "from": "https://registry.npmjs.org/load-grunt-tasks/-/load-grunt-tasks-0.3.0.tgz", + "resolved": "https://registry.npmjs.org/load-grunt-tasks/-/load-grunt-tasks-0.3.0.tgz", + "dependencies": { + "globule": { + "version": "0.2.0", + "from": "https://registry.npmjs.org/globule/-/globule-0.2.0.tgz", + "resolved": "https://registry.npmjs.org/globule/-/globule-0.2.0.tgz", + "dependencies": { + "lodash": { + "version": "2.4.1", + "from": "lodash@2.4.1", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-2.4.1.tgz" + }, + "glob": { + "version": "3.2.9", + "from": "https://registry.npmjs.org/glob/-/glob-3.2.9.tgz", + "resolved": "https://registry.npmjs.org/glob/-/glob-3.2.9.tgz", + "dependencies": { + "inherits": { + "version": "2.0.1", + "from": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz" + } + } + }, + "minimatch": { + "version": "0.2.14", + "from": "minimatch@0.2.14", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-0.2.14.tgz", + "dependencies": { + "lru-cache": { + "version": "2.5.0", + "from": "lru-cache@2.5.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-2.5.0.tgz" + }, + "sigmund": { + "version": "1.0.0", + "from": "sigmund@1.0.0", + "resolved": "https://registry.npmjs.org/sigmund/-/sigmund-1.0.0.tgz" + } + } + } + } + }, + "findup-sync": { + "version": "0.1.2", + "from": "findup-sync@0.1.2", + "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-0.1.2.tgz", + "dependencies": { + "glob": { + "version": "3.1.21", + "from": "glob@3.1.21", + "resolved": "https://registry.npmjs.org/glob/-/glob-3.1.21.tgz", + "dependencies": { + "minimatch": { + "version": "0.2.14", + "from": "minimatch@0.2.14", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-0.2.14.tgz", + "dependencies": { + "lru-cache": { + "version": "2.5.0", + "from": "lru-cache@2.5.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-2.5.0.tgz" + }, + "sigmund": { + "version": "1.0.0", + "from": "sigmund@1.0.0", + "resolved": "https://registry.npmjs.org/sigmund/-/sigmund-1.0.0.tgz" + } + } + }, + "graceful-fs": { + "version": "1.2.3", + "from": "graceful-fs@1.2.3", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-1.2.3.tgz" + }, + "inherits": { + "version": "1.0.0", + "from": "inherits@1.0.0", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-1.0.0.tgz" + } + } + }, + "lodash": { + "version": "1.0.1", + "from": "lodash@1.0.1", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-1.0.1.tgz" + } + } + } + } + }, + "lodash": { + "version": "2.1.0", + "from": "https://registry.npmjs.org/lodash/-/lodash-2.1.0.tgz", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-2.1.0.tgz" + }, + "marked": { + "version": "0.3.1", + "from": "https://registry.npmjs.org/marked/-/marked-0.3.1.tgz", + "resolved": "https://registry.npmjs.org/marked/-/marked-0.3.1.tgz" + }, + "node-html-encoder": { + "version": "0.0.2", + "from": "node-html-encoder@0.0.2", + "resolved": "https://registry.npmjs.org/node-html-encoder/-/node-html-encoder-0.0.2.tgz" + }, + "promises-aplus-tests": { + "version": "1.3.2", + "from": "https://registry.npmjs.org/promises-aplus-tests/-/promises-aplus-tests-1.3.2.tgz", + "resolved": "https://registry.npmjs.org/promises-aplus-tests/-/promises-aplus-tests-1.3.2.tgz", + "dependencies": { + "mocha": { + "version": "1.11.0", + "from": "https://registry.npmjs.org/mocha/-/mocha-1.11.0.tgz", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-1.11.0.tgz", + "dependencies": { + "commander": { + "version": "0.6.1", + "from": "https://registry.npmjs.org/commander/-/commander-0.6.1.tgz", + "resolved": "https://registry.npmjs.org/commander/-/commander-0.6.1.tgz" + }, + "growl": { + "version": "1.7.0", + "from": "https://registry.npmjs.org/growl/-/growl-1.7.0.tgz", + "resolved": "https://registry.npmjs.org/growl/-/growl-1.7.0.tgz" + }, + "jade": { + "version": "0.26.3", + "from": "https://registry.npmjs.org/jade/-/jade-0.26.3.tgz", + "resolved": "https://registry.npmjs.org/jade/-/jade-0.26.3.tgz", + "dependencies": { + "mkdirp": { + "version": "0.3.0", + "from": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.3.0.tgz", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.3.0.tgz" + } + } + }, + "diff": { + "version": "1.0.2", + "from": "https://registry.npmjs.org/diff/-/diff-1.0.2.tgz", + "resolved": "https://registry.npmjs.org/diff/-/diff-1.0.2.tgz" + }, + "debug": { + "version": "0.7.4", + "from": "https://registry.npmjs.org/debug/-/debug-0.7.4.tgz", + "resolved": "https://registry.npmjs.org/debug/-/debug-0.7.4.tgz" + }, + "mkdirp": { + "version": "0.3.5", + "from": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.3.5.tgz", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.3.5.tgz" + }, + "ms": { + "version": "0.3.0", + "from": "https://registry.npmjs.org/ms/-/ms-0.3.0.tgz", + "resolved": "https://registry.npmjs.org/ms/-/ms-0.3.0.tgz" + }, + "glob": { + "version": "3.2.1", + "from": "https://registry.npmjs.org/glob/-/glob-3.2.1.tgz", + "resolved": "https://registry.npmjs.org/glob/-/glob-3.2.1.tgz", + "dependencies": { + "minimatch": { + "version": "0.2.14", + "from": "minimatch@0.2.14", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-0.2.14.tgz", + "dependencies": { + "lru-cache": { + "version": "2.5.0", + "from": "lru-cache@2.5.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-2.5.0.tgz" + }, + "sigmund": { + "version": "1.0.0", + "from": "sigmund@1.0.0", + "resolved": "https://registry.npmjs.org/sigmund/-/sigmund-1.0.0.tgz" + } + } + }, + "graceful-fs": { + "version": "1.2.3", + "from": "graceful-fs@1.2.3", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-1.2.3.tgz" + }, + "inherits": { + "version": "1.0.0", + "from": "inherits@1.0.0", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-1.0.0.tgz" + } + } + } + } + }, + "sinon": { + "version": "1.7.3", + "from": "https://registry.npmjs.org/sinon/-/sinon-1.7.3.tgz", + "resolved": "https://registry.npmjs.org/sinon/-/sinon-1.7.3.tgz", + "dependencies": { + "buster-format": { + "version": "0.5.6", + "from": "https://registry.npmjs.org/buster-format/-/buster-format-0.5.6.tgz", + "resolved": "https://registry.npmjs.org/buster-format/-/buster-format-0.5.6.tgz", + "dependencies": { + "buster-core": { + "version": "0.6.4", + "from": "https://registry.npmjs.org/buster-core/-/buster-core-0.6.4.tgz", + "resolved": "https://registry.npmjs.org/buster-core/-/buster-core-0.6.4.tgz" + } + } + } + } + }, + "underscore": { + "version": "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" + } + } + }, + "protractor": { + "version": "0.19.0", + "from": "https://registry.npmjs.org/protractor/-/protractor-0.19.0.tgz", + "resolved": "https://registry.npmjs.org/protractor/-/protractor-0.19.0.tgz", + "dependencies": { + "selenium-webdriver": { + "version": "2.39.0", + "from": "https://registry.npmjs.org/selenium-webdriver/-/selenium-webdriver-2.39.0.tgz", + "resolved": "https://registry.npmjs.org/selenium-webdriver/-/selenium-webdriver-2.39.0.tgz" + }, + "minijasminenode": { + "version": "0.2.7", + "from": "https://registry.npmjs.org/minijasminenode/-/minijasminenode-0.2.7.tgz", + "resolved": "https://registry.npmjs.org/minijasminenode/-/minijasminenode-0.2.7.tgz" + }, + "saucelabs": { + "version": "0.1.1", + "from": "https://registry.npmjs.org/saucelabs/-/saucelabs-0.1.1.tgz", + "resolved": "https://registry.npmjs.org/saucelabs/-/saucelabs-0.1.1.tgz" + }, + "glob": { + "version": "3.2.9", + "from": "https://registry.npmjs.org/glob/-/glob-3.2.9.tgz", + "resolved": "https://registry.npmjs.org/glob/-/glob-3.2.9.tgz", + "dependencies": { + "minimatch": { + "version": "0.2.14", + "from": "minimatch@0.2.14", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-0.2.14.tgz", + "dependencies": { + "lru-cache": { + "version": "2.5.0", + "from": "lru-cache@2.5.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-2.5.0.tgz" + }, + "sigmund": { + "version": "1.0.0", + "from": "sigmund@1.0.0", + "resolved": "https://registry.npmjs.org/sigmund/-/sigmund-1.0.0.tgz" + } + } + }, + "inherits": { + "version": "2.0.1", + "from": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz" + } + } + }, + "adm-zip": { + "version": "0.4.4", + "from": "https://registry.npmjs.org/adm-zip/-/adm-zip-0.4.4.tgz", + "resolved": "https://registry.npmjs.org/adm-zip/-/adm-zip-0.4.4.tgz" + }, + "optimist": { + "version": "0.6.1", + "from": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz", + "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz", + "dependencies": { + "wordwrap": { + "version": "0.0.2", + "from": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz" + }, + "minimist": { + "version": "0.0.8", + "from": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz" + } + } + } + } + }, + "q": { + "version": "1.0.0", + "from": "https://registry.npmjs.org/q/-/q-1.0.0.tgz", + "resolved": "https://registry.npmjs.org/q/-/q-1.0.0.tgz" + }, + "q-io": { + "version": "1.10.9", + "from": "https://registry.npmjs.org/q-io/-/q-io-1.10.9.tgz", + "resolved": "https://registry.npmjs.org/q-io/-/q-io-1.10.9.tgz", + "dependencies": { + "q": { + "version": "0.9.7", + "from": "https://registry.npmjs.org/q/-/q-0.9.7.tgz", + "resolved": "https://registry.npmjs.org/q/-/q-0.9.7.tgz" + }, + "qs": { + "version": "0.1.0", + "from": "https://registry.npmjs.org/qs/-/qs-0.1.0.tgz", + "resolved": "https://registry.npmjs.org/qs/-/qs-0.1.0.tgz" + }, + "url2": { + "version": "0.0.0", + "from": "https://registry.npmjs.org/url2/-/url2-0.0.0.tgz", + "resolved": "https://registry.npmjs.org/url2/-/url2-0.0.0.tgz" + }, + "mime": { + "version": "1.2.11", + "from": "https://registry.npmjs.org/mime/-/mime-1.2.11.tgz", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.2.11.tgz" + }, + "mimeparse": { + "version": "0.1.4", + "from": "https://registry.npmjs.org/mimeparse/-/mimeparse-0.1.4.tgz", + "resolved": "https://registry.npmjs.org/mimeparse/-/mimeparse-0.1.4.tgz" + }, + "collections": { + "version": "0.2.2", + "from": "https://registry.npmjs.org/collections/-/collections-0.2.2.tgz", + "resolved": "https://registry.npmjs.org/collections/-/collections-0.2.2.tgz", + "dependencies": { + "weak-map": { + "version": "1.0.0", + "from": "https://registry.npmjs.org/weak-map/-/weak-map-1.0.0.tgz", + "resolved": "https://registry.npmjs.org/weak-map/-/weak-map-1.0.0.tgz" + } + } + } + } + }, + "qq": { + "version": "0.3.5", + "from": "https://registry.npmjs.org/qq/-/qq-0.3.5.tgz", + "resolved": "https://registry.npmjs.org/qq/-/qq-0.3.5.tgz", + "dependencies": { + "q": { + "version": "0.8.4", + "from": "https://registry.npmjs.org/q/-/q-0.8.4.tgz", + "resolved": "https://registry.npmjs.org/q/-/q-0.8.4.tgz" + } + } + }, + "rewire": { + "version": "1.1.3", + "from": "https://registry.npmjs.org/rewire/-/rewire-1.1.3.tgz", + "resolved": "https://registry.npmjs.org/rewire/-/rewire-1.1.3.tgz" + }, + "semver": { + "version": "2.1.0", + "from": "https://registry.npmjs.org/semver/-/semver-2.1.0.tgz", + "resolved": "https://registry.npmjs.org/semver/-/semver-2.1.0.tgz" + }, + "shelljs": { + "version": "0.2.6", + "from": "https://registry.npmjs.org/shelljs/-/shelljs-0.2.6.tgz", + "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.2.6.tgz" + }, + "winston": { + "version": "0.7.2", + "from": "https://registry.npmjs.org/winston/-/winston-0.7.2.tgz", + "resolved": "https://registry.npmjs.org/winston/-/winston-0.7.2.tgz", + "dependencies": { + "async": { + "version": "0.2.10", + "from": "https://registry.npmjs.org/async/-/async-0.2.10.tgz", + "resolved": "https://registry.npmjs.org/async/-/async-0.2.10.tgz" + }, + "colors": { + "version": "0.6.2", + "from": "https://registry.npmjs.org/colors/-/colors-0.6.2.tgz", + "resolved": "https://registry.npmjs.org/colors/-/colors-0.6.2.tgz" + }, + "cycle": { + "version": "1.0.3", + "from": "https://registry.npmjs.org/cycle/-/cycle-1.0.3.tgz", + "resolved": "https://registry.npmjs.org/cycle/-/cycle-1.0.3.tgz" + }, + "eyes": { + "version": "0.1.8", + "from": "https://registry.npmjs.org/eyes/-/eyes-0.1.8.tgz", + "resolved": "https://registry.npmjs.org/eyes/-/eyes-0.1.8.tgz" + }, + "pkginfo": { + "version": "0.3.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": "https://registry.npmjs.org/request/-/request-2.16.6.tgz", + "resolved": "https://registry.npmjs.org/request/-/request-2.16.6.tgz", + "dependencies": { + "form-data": { + "version": "0.0.10", + "from": "https://registry.npmjs.org/form-data/-/form-data-0.0.10.tgz", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-0.0.10.tgz", + "dependencies": { + "combined-stream": { + "version": "0.0.4", + "from": "https://registry.npmjs.org/combined-stream/-/combined-stream-0.0.4.tgz", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-0.0.4.tgz", + "dependencies": { + "delayed-stream": { + "version": "0.0.5", + "from": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-0.0.5.tgz", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-0.0.5.tgz" + } + } + } + } + }, + "mime": { + "version": "1.2.11", + "from": "https://registry.npmjs.org/mime/-/mime-1.2.11.tgz", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.2.11.tgz" + }, + "hawk": { + "version": "0.10.2", + "from": "https://registry.npmjs.org/hawk/-/hawk-0.10.2.tgz", + "resolved": "https://registry.npmjs.org/hawk/-/hawk-0.10.2.tgz", + "dependencies": { + "hoek": { + "version": "0.7.6", + "from": "https://registry.npmjs.org/hoek/-/hoek-0.7.6.tgz", + "resolved": "https://registry.npmjs.org/hoek/-/hoek-0.7.6.tgz" + }, + "boom": { + "version": "0.3.8", + "from": "https://registry.npmjs.org/boom/-/boom-0.3.8.tgz", + "resolved": "https://registry.npmjs.org/boom/-/boom-0.3.8.tgz" + }, + "cryptiles": { + "version": "0.1.3", + "from": "https://registry.npmjs.org/cryptiles/-/cryptiles-0.1.3.tgz", + "resolved": "https://registry.npmjs.org/cryptiles/-/cryptiles-0.1.3.tgz" + }, + "sntp": { + "version": "0.1.4", + "from": "https://registry.npmjs.org/sntp/-/sntp-0.1.4.tgz", + "resolved": "https://registry.npmjs.org/sntp/-/sntp-0.1.4.tgz" + } + } + }, + "node-uuid": { + "version": "1.4.1", + "from": "https://registry.npmjs.org/node-uuid/-/node-uuid-1.4.1.tgz", + "resolved": "https://registry.npmjs.org/node-uuid/-/node-uuid-1.4.1.tgz" + }, + "cookie-jar": { + "version": "0.2.0", + "from": "https://registry.npmjs.org/cookie-jar/-/cookie-jar-0.2.0.tgz", + "resolved": "https://registry.npmjs.org/cookie-jar/-/cookie-jar-0.2.0.tgz" + }, + "aws-sign": { + "version": "0.2.0", + "from": "https://registry.npmjs.org/aws-sign/-/aws-sign-0.2.0.tgz", + "resolved": "https://registry.npmjs.org/aws-sign/-/aws-sign-0.2.0.tgz" + }, + "oauth-sign": { + "version": "0.2.0", + "from": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.2.0.tgz", + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.2.0.tgz" + }, + "forever-agent": { + "version": "0.2.0", + "from": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.2.0.tgz", + "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.2.0.tgz" + }, + "tunnel-agent": { + "version": "0.2.0", + "from": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.2.0.tgz", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.2.0.tgz" + }, + "json-stringify-safe": { + "version": "3.0.0", + "from": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-3.0.0.tgz", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-3.0.0.tgz" + }, + "qs": { + "version": "0.5.6", + "from": "https://registry.npmjs.org/qs/-/qs-0.5.6.tgz", + "resolved": "https://registry.npmjs.org/qs/-/qs-0.5.6.tgz" + } + } + }, + "stack-trace": { + "version": "0.0.9", + "from": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.9.tgz", + "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.9.tgz" + } + } + }, + "yaml-js": { + "version": "0.0.8", + "from": "https://registry.npmjs.org/yaml-js/-/yaml-js-0.0.8.tgz", + "resolved": "https://registry.npmjs.org/yaml-js/-/yaml-js-0.0.8.tgz" + } + } +} From f3444d495dc82e5a5877db34ebdbd9a0bbcc2067 Mon Sep 17 00:00:00 2001 From: Peter Bacon Darwin Date: Wed, 12 Mar 2014 19:22:32 +0000 Subject: [PATCH 042/837] chore(version-info): better error msg if not tags --- lib/versions/version-info.js | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/lib/versions/version-info.js b/lib/versions/version-info.js index 588f1865a6d3..90175fc96ba6 100644 --- a/lib/versions/version-info.js +++ b/lib/versions/version-info.js @@ -136,6 +136,12 @@ var getSnapshotVersion = function() { }) .last(); + if ( !version ) { + throw new Error("No valid versions can be found that match the current branch (" + + currentPackage.branchVersion + ").\n" + + "Try running `git fetch -t` to download the tags from the repository."); + } + // We need to clone to ensure that we are not modifying another version version = semver(version.raw); From 809d47ec7731050077063ec97511d38dca99954e Mon Sep 17 00:00:00 2001 From: Tobias Bosch Date: Wed, 12 Mar 2014 15:19:48 -0700 Subject: [PATCH 043/837] chore(version-info): use remote tags and increment patch version --- lib/grunt/utils.js | 1 - lib/versions/version-info.js | 24 +++++++++++++++++++----- 2 files changed, 19 insertions(+), 6 deletions(-) diff --git a/lib/grunt/utils.js b/lib/grunt/utils.js index 59b783812c8c..b25a455528d7 100644 --- a/lib/grunt/utils.js +++ b/lib/grunt/utils.js @@ -4,7 +4,6 @@ var shell = require('shelljs'); var grunt = require('grunt'); var spawn = require('child_process').spawn; var semver = require('semver'); -var versionInfo = require('../versions/version-info'); var _ = require('lodash'); diff --git a/lib/versions/version-info.js b/lib/versions/version-info.js index 90175fc96ba6..5bf0658575ae 100644 --- a/lib/versions/version-info.js +++ b/lib/versions/version-info.js @@ -100,7 +100,10 @@ var isStable = function(version) { * @return {Array.} The collection of previous versions */ var getPreviousVersions = function() { - var tagResults = shell.exec('git tag', {silent: true}); + // always use the remote tags as the local clone might + // not contain all commits when cloned with git clone --depth=... + // Needed e.g. for Travis + var tagResults = shell.exec('git ls-remote --tags | grep -o -e "v[0-9].*[0-9]$"', {silent: true}); if ( tagResults.code === 0 ) { return _(tagResults.output.trim().split('\n')) .map(function(tag) { @@ -129,7 +132,6 @@ var getPreviousVersions = function() { * @return {SemVer} The snapshot version */ var getSnapshotVersion = function() { - version = _(previousVersions) .filter(function(tag) { return semver.satisfies(tag, currentPackage.branchVersion); @@ -137,15 +139,27 @@ var getSnapshotVersion = function() { .last(); if ( !version ) { - throw new Error("No valid versions can be found that match the current branch (" + - currentPackage.branchVersion + ").\n" + - "Try running `git fetch -t` to download the tags from the repository."); + // a snapshot version before the first tag on the branch + version = semver(currentPackage.branchVersion.replace('*','0-beta.1')); } // We need to clone to ensure that we are not modifying another version version = semver(version.raw); var jenkinsBuild = process.env.TRAVIS_BUILD_NUMBER || process.env.BUILD_NUMBER; + if (!version.prerelease || !version.prerelease.length) { + // last release was a non beta release. Increment the patch level to + // indicate the next release that we will be doing. + // E.g. last release was 1.3.0, then the snapshot will be + // 1.3.1-build.1, which is lesser than 1.3.1 accorind the semver! + + // If the last release was a beta release we don't update the + // beta number by purpose, as otherwise the semver comparison + // does not work any more when the next beta is released. + // E.g. don't generate 1.3.0-beta.2.build.1 + // as this is bigger than 1.3.0-beta.2 according to semver + version.patch++; + } version.prerelease = jenkinsBuild ? ['build', jenkinsBuild] : ['local']; version.build = getBuild(); version.codeName = 'snapshot'; From 0b7fef3d947e79e7d571d1d5e83ffc9d2bb43a2e Mon Sep 17 00:00:00 2001 From: Peter Bacon Darwin Date: Thu, 13 Mar 2014 14:15:52 +0000 Subject: [PATCH 044/837] chore(shrinkwrap): re-run shrinkwrap locally This will make the following commit clearer when the update is run. --- npm-shrinkwrap.json | 277 ++++++++++++++++++++++---------------------- 1 file changed, 140 insertions(+), 137 deletions(-) diff --git a/npm-shrinkwrap.json b/npm-shrinkwrap.json index dc157ebaed31..34f682d89b8e 100644 --- a/npm-shrinkwrap.json +++ b/npm-shrinkwrap.json @@ -8,7 +8,7 @@ "dependencies": { "abbrev": { "version": "1.0.4", - "from": "abbrev@1.0.4", + "from": "https://registry.npmjs.org/abbrev/-/abbrev-1.0.4.tgz", "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.0.4.tgz" }, "archy": { @@ -205,7 +205,7 @@ "dependencies": { "nopt": { "version": "1.0.10", - "from": "nopt@1.0.10", + "from": "https://registry.npmjs.org/nopt/-/nopt-1.0.10.tgz", "resolved": "https://registry.npmjs.org/nopt/-/nopt-1.0.10.tgz" } } @@ -253,12 +253,12 @@ "dependencies": { "minimatch": { "version": "0.2.14", - "from": "minimatch@0.2.14", + "from": "https://registry.npmjs.org/minimatch/-/minimatch-0.2.14.tgz", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-0.2.14.tgz", "dependencies": { "sigmund": { "version": "1.0.0", - "from": "sigmund@1.0.0", + "from": "https://registry.npmjs.org/sigmund/-/sigmund-1.0.0.tgz", "resolved": "https://registry.npmjs.org/sigmund/-/sigmund-1.0.0.tgz" } } @@ -277,12 +277,12 @@ "dependencies": { "minimatch": { "version": "0.2.14", - "from": "minimatch@0.2.14", + "from": "https://registry.npmjs.org/minimatch/-/minimatch-0.2.14.tgz", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-0.2.14.tgz", "dependencies": { "sigmund": { "version": "1.0.0", - "from": "sigmund@1.0.0", + "from": "https://registry.npmjs.org/sigmund/-/sigmund-1.0.0.tgz", "resolved": "https://registry.npmjs.org/sigmund/-/sigmund-1.0.0.tgz" } } @@ -737,29 +737,29 @@ "dependencies": { "wordwrap": { "version": "0.0.2", - "from": "wordwrap@0.0.2", + "from": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz", "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz" }, "minimist": { "version": "0.0.8", - "from": "minimist@0.0.8", + "from": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz" } } }, "lodash": { "version": "2.4.1", - "from": "lodash@2.4.1", + "from": "https://registry.npmjs.org/lodash/-/lodash-2.4.1.tgz", "resolved": "https://registry.npmjs.org/lodash/-/lodash-2.4.1.tgz" }, "dependency-graph": { "version": "0.1.0", - "from": "dependency-graph@0.1.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" } } @@ -776,7 +776,7 @@ }, "marked": { "version": "0.2.10", - "from": "marked@0.2.10", + "from": "https://registry.npmjs.org/marked/-/marked-0.2.10.tgz", "resolved": "https://registry.npmjs.org/marked/-/marked-0.2.10.tgz" }, "glob": { @@ -786,24 +786,24 @@ "dependencies": { "minimatch": { "version": "0.2.14", - "from": "minimatch@0.2.14", + "from": "https://registry.npmjs.org/minimatch/-/minimatch-0.2.14.tgz", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-0.2.14.tgz", "dependencies": { "lru-cache": { "version": "2.5.0", - "from": "lru-cache@2.5.0", + "from": "https://registry.npmjs.org/lru-cache/-/lru-cache-2.5.0.tgz", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-2.5.0.tgz" }, "sigmund": { "version": "1.0.0", - "from": "sigmund@1.0.0", + "from": "https://registry.npmjs.org/sigmund/-/sigmund-1.0.0.tgz", "resolved": "https://registry.npmjs.org/sigmund/-/sigmund-1.0.0.tgz" } } }, "inherits": { "version": "2.0.1", - "from": "inherits@2.0.1", + "from": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz" } } @@ -817,7 +817,7 @@ "dependencies": { "lodash": { "version": "2.4.1", - "from": "lodash@2.4.1", + "from": "https://registry.npmjs.org/lodash/-/lodash-2.4.1.tgz", "resolved": "https://registry.npmjs.org/lodash/-/lodash-2.4.1.tgz" }, "graceful-fs": { @@ -832,46 +832,46 @@ "dependencies": { "minimatch": { "version": "0.2.14", - "from": "minimatch@0.2.14", + "from": "https://registry.npmjs.org/minimatch/-/minimatch-0.2.14.tgz", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-0.2.14.tgz", "dependencies": { "lru-cache": { "version": "2.5.0", - "from": "lru-cache@2.5.0", + "from": "https://registry.npmjs.org/lru-cache/-/lru-cache-2.5.0.tgz", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-2.5.0.tgz" }, "sigmund": { "version": "1.0.0", - "from": "sigmund@1.0.0", + "from": "https://registry.npmjs.org/sigmund/-/sigmund-1.0.0.tgz", "resolved": "https://registry.npmjs.org/sigmund/-/sigmund-1.0.0.tgz" } } }, "inherits": { "version": "2.0.1", - "from": "inherits@2.0.1", + "from": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz" } } }, "nunjucks": { "version": "1.0.1", - "from": "nunjucks@1.0.1", + "from": "https://registry.npmjs.org/nunjucks/-/nunjucks-1.0.1.tgz", "resolved": "https://registry.npmjs.org/nunjucks/-/nunjucks-1.0.1.tgz", "dependencies": { "optimist": { "version": "0.6.1", - "from": "optimist@0.6.1", + "from": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz", "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz", "dependencies": { "wordwrap": { "version": "0.0.2", - "from": "wordwrap@0.0.2", + "from": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz", "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz" }, "minimist": { "version": "0.0.8", - "from": "minimist@0.0.8", + "from": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz" } } @@ -885,7 +885,7 @@ }, "esprima": { "version": "1.0.4", - "from": "esprima@1.0.4", + "from": "https://registry.npmjs.org/esprima/-/esprima-1.0.4.tgz", "resolved": "https://registry.npmjs.org/esprima/-/esprima-1.0.4.tgz" } } @@ -964,36 +964,36 @@ }, "findup-sync": { "version": "0.1.2", - "from": "findup-sync@0.1.2", + "from": "https://registry.npmjs.org/findup-sync/-/findup-sync-0.1.2.tgz", "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-0.1.2.tgz", "dependencies": { "lodash": { "version": "1.0.1", - "from": "lodash@1.0.1", + "from": "https://registry.npmjs.org/lodash/-/lodash-1.0.1.tgz", "resolved": "https://registry.npmjs.org/lodash/-/lodash-1.0.1.tgz" } } }, "glob": { "version": "3.1.21", - "from": "glob@3.1.21", + "from": "https://registry.npmjs.org/glob/-/glob-3.1.21.tgz", "resolved": "https://registry.npmjs.org/glob/-/glob-3.1.21.tgz", "dependencies": { "graceful-fs": { "version": "1.2.3", - "from": "graceful-fs@1.2.3", + "from": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-1.2.3.tgz", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-1.2.3.tgz" }, "inherits": { "version": "1.0.0", - "from": "inherits@1.0.0", + "from": "https://registry.npmjs.org/inherits/-/inherits-1.0.0.tgz", "resolved": "https://registry.npmjs.org/inherits/-/inherits-1.0.0.tgz" } } }, "hooker": { "version": "0.2.3", - "from": "hooker@0.2.3", + "from": "https://registry.npmjs.org/hooker/-/hooker-0.2.3.tgz", "resolved": "https://registry.npmjs.org/hooker/-/hooker-0.2.3.tgz" }, "iconv-lite": { @@ -1003,29 +1003,29 @@ }, "minimatch": { "version": "0.2.14", - "from": "minimatch@0.2.14", + "from": "https://registry.npmjs.org/minimatch/-/minimatch-0.2.14.tgz", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-0.2.14.tgz", "dependencies": { "lru-cache": { "version": "2.5.0", - "from": "lru-cache@2.5.0", + "from": "https://registry.npmjs.org/lru-cache/-/lru-cache-2.5.0.tgz", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-2.5.0.tgz" }, "sigmund": { "version": "1.0.0", - "from": "sigmund@1.0.0", + "from": "https://registry.npmjs.org/sigmund/-/sigmund-1.0.0.tgz", "resolved": "https://registry.npmjs.org/sigmund/-/sigmund-1.0.0.tgz" } } }, "nopt": { "version": "1.0.10", - "from": "nopt@1.0.10", + "from": "https://registry.npmjs.org/nopt/-/nopt-1.0.10.tgz", "resolved": "https://registry.npmjs.org/nopt/-/nopt-1.0.10.tgz", "dependencies": { "abbrev": { "version": "1.0.4", - "from": "abbrev@1.0.4", + "from": "https://registry.npmjs.org/abbrev/-/abbrev-1.0.4.tgz", "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.0.4.tgz" } } @@ -1081,7 +1081,7 @@ }, "esprima": { "version": "1.0.4", - "from": "esprima@1.0.4", + "from": "https://registry.npmjs.org/esprima/-/esprima-1.0.4.tgz", "resolved": "https://registry.npmjs.org/esprima/-/esprima-1.0.4.tgz" } } @@ -1117,7 +1117,7 @@ "dependencies": { "rimraf": { "version": "2.2.6", - "from": "rimraf@2.2.6", + "from": "https://registry.npmjs.org/rimraf/-/rimraf-2.2.6.tgz", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.2.6.tgz" } } @@ -1285,7 +1285,7 @@ }, "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" }, "cli": { @@ -1309,17 +1309,17 @@ }, "minimatch": { "version": "0.2.14", - "from": "minimatch@0.2.14", + "from": "https://registry.npmjs.org/minimatch/-/minimatch-0.2.14.tgz", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-0.2.14.tgz", "dependencies": { "lru-cache": { "version": "2.5.0", - "from": "lru-cache@2.5.0", + "from": "https://registry.npmjs.org/lru-cache/-/lru-cache-2.5.0.tgz", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-2.5.0.tgz" }, "sigmund": { "version": "1.0.0", - "from": "sigmund@1.0.0", + "from": "https://registry.npmjs.org/sigmund/-/sigmund-1.0.0.tgz", "resolved": "https://registry.npmjs.org/sigmund/-/sigmund-1.0.0.tgz" } } @@ -1350,7 +1350,7 @@ "dependencies": { "hooker": { "version": "0.2.3", - "from": "hooker@0.2.3", + "from": "https://registry.npmjs.org/hooker/-/hooker-0.2.3.tgz", "resolved": "https://registry.npmjs.org/hooker/-/hooker-0.2.3.tgz" }, "jscs": { @@ -1392,41 +1392,41 @@ }, "commander": { "version": "1.2.0", - "from": "commander@1.2.0", + "from": "https://registry.npmjs.org/commander/-/commander-1.2.0.tgz", "resolved": "https://registry.npmjs.org/commander/-/commander-1.2.0.tgz", "dependencies": { "keypress": { "version": "0.1.0", - "from": "keypress@0.1.0", + "from": "https://registry.npmjs.org/keypress/-/keypress-0.1.0.tgz", "resolved": "https://registry.npmjs.org/keypress/-/keypress-0.1.0.tgz" } } }, "minimatch": { "version": "0.2.12", - "from": "minimatch@0.2.12", + "from": "https://registry.npmjs.org/minimatch/-/minimatch-0.2.12.tgz", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-0.2.12.tgz", "dependencies": { "lru-cache": { "version": "2.5.0", - "from": "lru-cache@2.5.0", + "from": "https://registry.npmjs.org/lru-cache/-/lru-cache-2.5.0.tgz", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-2.5.0.tgz" }, "sigmund": { "version": "1.0.0", - "from": "sigmund@1.0.0", + "from": "https://registry.npmjs.org/sigmund/-/sigmund-1.0.0.tgz", "resolved": "https://registry.npmjs.org/sigmund/-/sigmund-1.0.0.tgz" } } }, "glob": { "version": "3.2.7", - "from": "glob@3.2.7", + "from": "https://registry.npmjs.org/glob/-/glob-3.2.7.tgz", "resolved": "https://registry.npmjs.org/glob/-/glob-3.2.7.tgz", "dependencies": { "inherits": { "version": "2.0.1", - "from": "inherits@2.0.1", + "from": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz" } } @@ -1438,7 +1438,7 @@ "dependencies": { "underscore": { "version": "1.6.0", - "from": "underscore@1.6.0", + "from": "https://registry.npmjs.org/underscore/-/underscore-1.6.0.tgz", "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.6.0.tgz" } } @@ -1457,121 +1457,121 @@ "dependencies": { "lodash._basecreatecallback": { "version": "2.4.1", - "from": "lodash._basecreatecallback@2.4.1", + "from": "https://registry.npmjs.org/lodash._basecreatecallback/-/lodash._basecreatecallback-2.4.1.tgz", "resolved": "https://registry.npmjs.org/lodash._basecreatecallback/-/lodash._basecreatecallback-2.4.1.tgz", "dependencies": { "lodash.bind": { "version": "2.4.1", - "from": "lodash.bind@2.4.1", + "from": "https://registry.npmjs.org/lodash.bind/-/lodash.bind-2.4.1.tgz", "resolved": "https://registry.npmjs.org/lodash.bind/-/lodash.bind-2.4.1.tgz", "dependencies": { "lodash._createwrapper": { "version": "2.4.1", - "from": "lodash._createwrapper@2.4.1", + "from": "https://registry.npmjs.org/lodash._createwrapper/-/lodash._createwrapper-2.4.1.tgz", "resolved": "https://registry.npmjs.org/lodash._createwrapper/-/lodash._createwrapper-2.4.1.tgz", "dependencies": { "lodash._basebind": { "version": "2.4.1", - "from": "lodash._basebind@2.4.1", + "from": "https://registry.npmjs.org/lodash._basebind/-/lodash._basebind-2.4.1.tgz", "resolved": "https://registry.npmjs.org/lodash._basebind/-/lodash._basebind-2.4.1.tgz", "dependencies": { "lodash._basecreate": { "version": "2.4.1", - "from": "lodash._basecreate@2.4.1", + "from": "https://registry.npmjs.org/lodash._basecreate/-/lodash._basecreate-2.4.1.tgz", "resolved": "https://registry.npmjs.org/lodash._basecreate/-/lodash._basecreate-2.4.1.tgz", "dependencies": { "lodash._isnative": { "version": "2.4.1", - "from": "lodash._isnative@2.4.1", + "from": "https://registry.npmjs.org/lodash._isnative/-/lodash._isnative-2.4.1.tgz", "resolved": "https://registry.npmjs.org/lodash._isnative/-/lodash._isnative-2.4.1.tgz" }, "lodash.noop": { "version": "2.4.1", - "from": "lodash.noop@2.4.1", + "from": "https://registry.npmjs.org/lodash.noop/-/lodash.noop-2.4.1.tgz", "resolved": "https://registry.npmjs.org/lodash.noop/-/lodash.noop-2.4.1.tgz" } } }, "lodash.isobject": { "version": "2.4.1", - "from": "lodash.isobject@2.4.1", + "from": "https://registry.npmjs.org/lodash.isobject/-/lodash.isobject-2.4.1.tgz", "resolved": "https://registry.npmjs.org/lodash.isobject/-/lodash.isobject-2.4.1.tgz" } } }, "lodash._basecreatewrapper": { "version": "2.4.1", - "from": "lodash._basecreatewrapper@2.4.1", + "from": "https://registry.npmjs.org/lodash._basecreatewrapper/-/lodash._basecreatewrapper-2.4.1.tgz", "resolved": "https://registry.npmjs.org/lodash._basecreatewrapper/-/lodash._basecreatewrapper-2.4.1.tgz", "dependencies": { "lodash._basecreate": { "version": "2.4.1", - "from": "lodash._basecreate@2.4.1", + "from": "https://registry.npmjs.org/lodash._basecreate/-/lodash._basecreate-2.4.1.tgz", "resolved": "https://registry.npmjs.org/lodash._basecreate/-/lodash._basecreate-2.4.1.tgz", "dependencies": { "lodash._isnative": { "version": "2.4.1", - "from": "lodash._isnative@2.4.1", + "from": "https://registry.npmjs.org/lodash._isnative/-/lodash._isnative-2.4.1.tgz", "resolved": "https://registry.npmjs.org/lodash._isnative/-/lodash._isnative-2.4.1.tgz" }, "lodash.noop": { "version": "2.4.1", - "from": "lodash.noop@2.4.1", + "from": "https://registry.npmjs.org/lodash.noop/-/lodash.noop-2.4.1.tgz", "resolved": "https://registry.npmjs.org/lodash.noop/-/lodash.noop-2.4.1.tgz" } } }, "lodash.isobject": { "version": "2.4.1", - "from": "lodash.isobject@2.4.1", + "from": "https://registry.npmjs.org/lodash.isobject/-/lodash.isobject-2.4.1.tgz", "resolved": "https://registry.npmjs.org/lodash.isobject/-/lodash.isobject-2.4.1.tgz" } } }, "lodash.isfunction": { "version": "2.4.1", - "from": "lodash.isfunction@2.4.1", + "from": "https://registry.npmjs.org/lodash.isfunction/-/lodash.isfunction-2.4.1.tgz", "resolved": "https://registry.npmjs.org/lodash.isfunction/-/lodash.isfunction-2.4.1.tgz" } } }, "lodash._slice": { "version": "2.4.1", - "from": "lodash._slice@2.4.1", + "from": "https://registry.npmjs.org/lodash._slice/-/lodash._slice-2.4.1.tgz", "resolved": "https://registry.npmjs.org/lodash._slice/-/lodash._slice-2.4.1.tgz" } } }, "lodash.identity": { "version": "2.4.1", - "from": "lodash.identity@2.4.1", + "from": "https://registry.npmjs.org/lodash.identity/-/lodash.identity-2.4.1.tgz", "resolved": "https://registry.npmjs.org/lodash.identity/-/lodash.identity-2.4.1.tgz" }, "lodash._setbinddata": { "version": "2.4.1", - "from": "lodash._setbinddata@2.4.1", + "from": "https://registry.npmjs.org/lodash._setbinddata/-/lodash._setbinddata-2.4.1.tgz", "resolved": "https://registry.npmjs.org/lodash._setbinddata/-/lodash._setbinddata-2.4.1.tgz", "dependencies": { "lodash._isnative": { "version": "2.4.1", - "from": "lodash._isnative@2.4.1", + "from": "https://registry.npmjs.org/lodash._isnative/-/lodash._isnative-2.4.1.tgz", "resolved": "https://registry.npmjs.org/lodash._isnative/-/lodash._isnative-2.4.1.tgz" }, "lodash.noop": { "version": "2.4.1", - "from": "lodash.noop@2.4.1", + "from": "https://registry.npmjs.org/lodash.noop/-/lodash.noop-2.4.1.tgz", "resolved": "https://registry.npmjs.org/lodash.noop/-/lodash.noop-2.4.1.tgz" } } }, "lodash.support": { "version": "2.4.1", - "from": "lodash.support@2.4.1", + "from": "https://registry.npmjs.org/lodash.support/-/lodash.support-2.4.1.tgz", "resolved": "https://registry.npmjs.org/lodash.support/-/lodash.support-2.4.1.tgz", "dependencies": { "lodash._isnative": { "version": "2.4.1", - "from": "lodash._isnative@2.4.1", + "from": "https://registry.npmjs.org/lodash._isnative/-/lodash._isnative-2.4.1.tgz", "resolved": "https://registry.npmjs.org/lodash._isnative/-/lodash._isnative-2.4.1.tgz" } } @@ -1580,29 +1580,29 @@ }, "lodash.keys": { "version": "2.4.1", - "from": "lodash.keys@2.4.1", + "from": "https://registry.npmjs.org/lodash.keys/-/lodash.keys-2.4.1.tgz", "resolved": "https://registry.npmjs.org/lodash.keys/-/lodash.keys-2.4.1.tgz", "dependencies": { "lodash._isnative": { "version": "2.4.1", - "from": "lodash._isnative@2.4.1", + "from": "https://registry.npmjs.org/lodash._isnative/-/lodash._isnative-2.4.1.tgz", "resolved": "https://registry.npmjs.org/lodash._isnative/-/lodash._isnative-2.4.1.tgz" }, "lodash.isobject": { "version": "2.4.1", - "from": "lodash.isobject@2.4.1", + "from": "https://registry.npmjs.org/lodash.isobject/-/lodash.isobject-2.4.1.tgz", "resolved": "https://registry.npmjs.org/lodash.isobject/-/lodash.isobject-2.4.1.tgz" }, "lodash._shimkeys": { "version": "2.4.1", - "from": "lodash._shimkeys@2.4.1", + "from": "https://registry.npmjs.org/lodash._shimkeys/-/lodash._shimkeys-2.4.1.tgz", "resolved": "https://registry.npmjs.org/lodash._shimkeys/-/lodash._shimkeys-2.4.1.tgz" } } }, "lodash._objecttypes": { "version": "2.4.1", - "from": "lodash._objecttypes@2.4.1", + "from": "https://registry.npmjs.org/lodash._objecttypes/-/lodash._objecttypes-2.4.1.tgz", "resolved": "https://registry.npmjs.org/lodash._objecttypes/-/lodash._objecttypes-2.4.1.tgz" } } @@ -1655,7 +1655,7 @@ "dependencies": { "optimist": { "version": "0.6.1", - "from": "optimist@0.6.1", + "from": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz", "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz", "dependencies": { "wordwrap": { @@ -1889,46 +1889,46 @@ }, "findup-sync": { "version": "0.1.2", - "from": "findup-sync@0.1.2", + "from": "https://registry.npmjs.org/findup-sync/-/findup-sync-0.1.2.tgz", "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-0.1.2.tgz", "dependencies": { "glob": { "version": "3.1.21", - "from": "glob@3.1.21", + "from": "https://registry.npmjs.org/glob/-/glob-3.1.21.tgz", "resolved": "https://registry.npmjs.org/glob/-/glob-3.1.21.tgz", "dependencies": { "minimatch": { "version": "0.2.14", - "from": "minimatch@0.2.14", + "from": "https://registry.npmjs.org/minimatch/-/minimatch-0.2.14.tgz", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-0.2.14.tgz", "dependencies": { "lru-cache": { "version": "2.5.0", - "from": "lru-cache@2.5.0", + "from": "https://registry.npmjs.org/lru-cache/-/lru-cache-2.5.0.tgz", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-2.5.0.tgz" }, "sigmund": { "version": "1.0.0", - "from": "sigmund@1.0.0", + "from": "https://registry.npmjs.org/sigmund/-/sigmund-1.0.0.tgz", "resolved": "https://registry.npmjs.org/sigmund/-/sigmund-1.0.0.tgz" } } }, "graceful-fs": { "version": "1.2.3", - "from": "graceful-fs@1.2.3", + "from": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-1.2.3.tgz", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-1.2.3.tgz" }, "inherits": { "version": "1.0.0", - "from": "inherits@1.0.0", + "from": "https://registry.npmjs.org/inherits/-/inherits-1.0.0.tgz", "resolved": "https://registry.npmjs.org/inherits/-/inherits-1.0.0.tgz" } } }, "lodash": { "version": "1.0.1", - "from": "lodash@1.0.1", + "from": "https://registry.npmjs.org/lodash/-/lodash-1.0.1.tgz", "resolved": "https://registry.npmjs.org/lodash/-/lodash-1.0.1.tgz" } } @@ -1974,17 +1974,17 @@ }, "minimatch": { "version": "0.2.14", - "from": "minimatch@0.2.14", + "from": "https://registry.npmjs.org/minimatch/-/minimatch-0.2.14.tgz", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-0.2.14.tgz", "dependencies": { "lru-cache": { "version": "2.5.0", - "from": "lru-cache@2.5.0", + "from": "https://registry.npmjs.org/lru-cache/-/lru-cache-2.5.0.tgz", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-2.5.0.tgz" }, "sigmund": { "version": "1.0.0", - "from": "sigmund@1.0.0", + "from": "https://registry.npmjs.org/sigmund/-/sigmund-1.0.0.tgz", "resolved": "https://registry.npmjs.org/sigmund/-/sigmund-1.0.0.tgz" } } @@ -2028,39 +2028,39 @@ "dependencies": { "lodash": { "version": "1.0.1", - "from": "lodash@1.0.1", + "from": "https://registry.npmjs.org/lodash/-/lodash-1.0.1.tgz", "resolved": "https://registry.npmjs.org/lodash/-/lodash-1.0.1.tgz" }, "glob": { "version": "3.1.21", - "from": "glob@3.1.21", + "from": "https://registry.npmjs.org/glob/-/glob-3.1.21.tgz", "resolved": "https://registry.npmjs.org/glob/-/glob-3.1.21.tgz", "dependencies": { "graceful-fs": { "version": "1.2.3", - "from": "graceful-fs@1.2.3", + "from": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-1.2.3.tgz", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-1.2.3.tgz" }, "inherits": { "version": "1.0.0", - "from": "inherits@1.0.0", + "from": "https://registry.npmjs.org/inherits/-/inherits-1.0.0.tgz", "resolved": "https://registry.npmjs.org/inherits/-/inherits-1.0.0.tgz" } } }, "minimatch": { "version": "0.2.14", - "from": "minimatch@0.2.14", + "from": "https://registry.npmjs.org/minimatch/-/minimatch-0.2.14.tgz", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-0.2.14.tgz", "dependencies": { "lru-cache": { "version": "2.5.0", - "from": "lru-cache@2.5.0", + "from": "https://registry.npmjs.org/lru-cache/-/lru-cache-2.5.0.tgz", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-2.5.0.tgz" }, "sigmund": { "version": "1.0.0", - "from": "sigmund@1.0.0", + "from": "https://registry.npmjs.org/sigmund/-/sigmund-1.0.0.tgz", "resolved": "https://registry.npmjs.org/sigmund/-/sigmund-1.0.0.tgz" } } @@ -2358,17 +2358,17 @@ }, "minimatch": { "version": "0.2.14", - "from": "minimatch@0.2.14", + "from": "https://registry.npmjs.org/minimatch/-/minimatch-0.2.14.tgz", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-0.2.14.tgz", "dependencies": { "lru-cache": { "version": "2.5.0", - "from": "lru-cache@2.5.0", + "from": "https://registry.npmjs.org/lru-cache/-/lru-cache-2.5.0.tgz", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-2.5.0.tgz" }, "sigmund": { "version": "1.0.0", - "from": "sigmund@1.0.0", + "from": "https://registry.npmjs.org/sigmund/-/sigmund-1.0.0.tgz", "resolved": "https://registry.npmjs.org/sigmund/-/sigmund-1.0.0.tgz" } } @@ -2937,17 +2937,17 @@ "dependencies": { "minimatch": { "version": "0.2.14", - "from": "minimatch@0.2.14", + "from": "https://registry.npmjs.org/minimatch/-/minimatch-0.2.14.tgz", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-0.2.14.tgz", "dependencies": { "lru-cache": { "version": "2.5.0", - "from": "lru-cache@2.5.0", + "from": "https://registry.npmjs.org/lru-cache/-/lru-cache-2.5.0.tgz", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-2.5.0.tgz" }, "sigmund": { "version": "1.0.0", - "from": "sigmund@1.0.0", + "from": "https://registry.npmjs.org/sigmund/-/sigmund-1.0.0.tgz", "resolved": "https://registry.npmjs.org/sigmund/-/sigmund-1.0.0.tgz" } } @@ -3126,17 +3126,17 @@ }, "minimatch": { "version": "0.2.14", - "from": "minimatch@0.2.14", + "from": "https://registry.npmjs.org/minimatch/-/minimatch-0.2.14.tgz", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-0.2.14.tgz", "dependencies": { "lru-cache": { "version": "2.5.0", - "from": "lru-cache@2.5.0", + "from": "https://registry.npmjs.org/lru-cache/-/lru-cache-2.5.0.tgz", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-2.5.0.tgz" }, "sigmund": { "version": "1.0.0", - "from": "sigmund@1.0.0", + "from": "https://registry.npmjs.org/sigmund/-/sigmund-1.0.0.tgz", "resolved": "https://registry.npmjs.org/sigmund/-/sigmund-1.0.0.tgz" } } @@ -3224,7 +3224,7 @@ }, "lodash": { "version": "2.4.1", - "from": "lodash@2.4.1", + "from": "https://registry.npmjs.org/lodash/-/lodash-2.4.1.tgz", "resolved": "https://registry.npmjs.org/lodash/-/lodash-2.4.1.tgz" }, "mime": { @@ -3244,7 +3244,7 @@ }, "semver": { "version": "1.1.4", - "from": "semver@1.1.4", + "from": "https://registry.npmjs.org/semver/-/semver-1.1.4.tgz", "resolved": "https://registry.npmjs.org/semver/-/semver-1.1.4.tgz" }, "readable-stream": { @@ -3422,7 +3422,7 @@ }, "q": { "version": "0.9.7", - "from": "q@0.9.7", + "from": "https://registry.npmjs.org/q/-/q-0.9.7.tgz", "resolved": "https://registry.npmjs.org/q/-/q-0.9.7.tgz" } } @@ -3681,7 +3681,7 @@ "dependencies": { "lodash": { "version": "2.1.0", - "from": "lodash@2.1.0", + "from": "https://registry.npmjs.org/lodash/-/lodash-2.1.0.tgz", "resolved": "https://registry.npmjs.org/lodash/-/lodash-2.1.0.tgz" }, "iconv-lite": { @@ -3708,17 +3708,17 @@ }, "minimatch": { "version": "0.2.14", - "from": "minimatch@0.2.14", + "from": "https://registry.npmjs.org/minimatch/-/minimatch-0.2.14.tgz", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-0.2.14.tgz", "dependencies": { "lru-cache": { "version": "2.5.0", - "from": "lru-cache@2.5.0", + "from": "https://registry.npmjs.org/lru-cache/-/lru-cache-2.5.0.tgz", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-2.5.0.tgz" }, "sigmund": { "version": "1.0.0", - "from": "sigmund@1.0.0", + "from": "https://registry.npmjs.org/sigmund/-/sigmund-1.0.0.tgz", "resolved": "https://registry.npmjs.org/sigmund/-/sigmund-1.0.0.tgz" } } @@ -3726,26 +3726,29 @@ "findup-sync": { "version": "0.1.2", "from": "findup-sync@0.1.2", + "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-0.1.2.tgz", "dependencies": { "glob": { "version": "3.1.21", "from": "glob@3.1.21", + "resolved": "https://registry.npmjs.org/glob/-/glob-3.1.21.tgz", "dependencies": { "graceful-fs": { "version": "1.2.3", - "from": "graceful-fs@1.2.3", + "from": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-1.2.3.tgz", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-1.2.3.tgz" }, "inherits": { "version": "1.0.0", - "from": "inherits@1.0.0", + "from": "https://registry.npmjs.org/inherits/-/inherits-1.0.0.tgz", "resolved": "https://registry.npmjs.org/inherits/-/inherits-1.0.0.tgz" } } }, "lodash": { "version": "1.0.1", - "from": "lodash@1.0.1" + "from": "lodash@1.0.1", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-1.0.1.tgz" } } }, @@ -3821,7 +3824,7 @@ "dependencies": { "lodash": { "version": "2.4.1", - "from": "lodash@2.4.1", + "from": "https://registry.npmjs.org/lodash/-/lodash-2.4.1.tgz", "resolved": "https://registry.npmjs.org/lodash/-/lodash-2.4.1.tgz" }, "glob": { @@ -3838,17 +3841,17 @@ }, "minimatch": { "version": "0.2.14", - "from": "minimatch@0.2.14", + "from": "https://registry.npmjs.org/minimatch/-/minimatch-0.2.14.tgz", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-0.2.14.tgz", "dependencies": { "lru-cache": { "version": "2.5.0", - "from": "lru-cache@2.5.0", + "from": "https://registry.npmjs.org/lru-cache/-/lru-cache-2.5.0.tgz", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-2.5.0.tgz" }, "sigmund": { "version": "1.0.0", - "from": "sigmund@1.0.0", + "from": "https://registry.npmjs.org/sigmund/-/sigmund-1.0.0.tgz", "resolved": "https://registry.npmjs.org/sigmund/-/sigmund-1.0.0.tgz" } } @@ -3857,46 +3860,46 @@ }, "findup-sync": { "version": "0.1.2", - "from": "findup-sync@0.1.2", + "from": "https://registry.npmjs.org/findup-sync/-/findup-sync-0.1.2.tgz", "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-0.1.2.tgz", "dependencies": { "glob": { "version": "3.1.21", - "from": "glob@3.1.21", + "from": "https://registry.npmjs.org/glob/-/glob-3.1.21.tgz", "resolved": "https://registry.npmjs.org/glob/-/glob-3.1.21.tgz", "dependencies": { "minimatch": { "version": "0.2.14", - "from": "minimatch@0.2.14", + "from": "https://registry.npmjs.org/minimatch/-/minimatch-0.2.14.tgz", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-0.2.14.tgz", "dependencies": { "lru-cache": { "version": "2.5.0", - "from": "lru-cache@2.5.0", + "from": "https://registry.npmjs.org/lru-cache/-/lru-cache-2.5.0.tgz", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-2.5.0.tgz" }, "sigmund": { "version": "1.0.0", - "from": "sigmund@1.0.0", + "from": "https://registry.npmjs.org/sigmund/-/sigmund-1.0.0.tgz", "resolved": "https://registry.npmjs.org/sigmund/-/sigmund-1.0.0.tgz" } } }, "graceful-fs": { "version": "1.2.3", - "from": "graceful-fs@1.2.3", + "from": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-1.2.3.tgz", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-1.2.3.tgz" }, "inherits": { "version": "1.0.0", - "from": "inherits@1.0.0", + "from": "https://registry.npmjs.org/inherits/-/inherits-1.0.0.tgz", "resolved": "https://registry.npmjs.org/inherits/-/inherits-1.0.0.tgz" } } }, "lodash": { "version": "1.0.1", - "from": "lodash@1.0.1", + "from": "https://registry.npmjs.org/lodash/-/lodash-1.0.1.tgz", "resolved": "https://registry.npmjs.org/lodash/-/lodash-1.0.1.tgz" } } @@ -3915,7 +3918,7 @@ }, "node-html-encoder": { "version": "0.0.2", - "from": "node-html-encoder@0.0.2", + "from": "https://registry.npmjs.org/node-html-encoder/-/node-html-encoder-0.0.2.tgz", "resolved": "https://registry.npmjs.org/node-html-encoder/-/node-html-encoder-0.0.2.tgz" }, "promises-aplus-tests": { @@ -3977,29 +3980,29 @@ "dependencies": { "minimatch": { "version": "0.2.14", - "from": "minimatch@0.2.14", + "from": "https://registry.npmjs.org/minimatch/-/minimatch-0.2.14.tgz", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-0.2.14.tgz", "dependencies": { "lru-cache": { "version": "2.5.0", - "from": "lru-cache@2.5.0", + "from": "https://registry.npmjs.org/lru-cache/-/lru-cache-2.5.0.tgz", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-2.5.0.tgz" }, "sigmund": { "version": "1.0.0", - "from": "sigmund@1.0.0", + "from": "https://registry.npmjs.org/sigmund/-/sigmund-1.0.0.tgz", "resolved": "https://registry.npmjs.org/sigmund/-/sigmund-1.0.0.tgz" } } }, "graceful-fs": { "version": "1.2.3", - "from": "graceful-fs@1.2.3", + "from": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-1.2.3.tgz", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-1.2.3.tgz" }, "inherits": { "version": "1.0.0", - "from": "inherits@1.0.0", + "from": "https://registry.npmjs.org/inherits/-/inherits-1.0.0.tgz", "resolved": "https://registry.npmjs.org/inherits/-/inherits-1.0.0.tgz" } } @@ -4059,17 +4062,17 @@ "dependencies": { "minimatch": { "version": "0.2.14", - "from": "minimatch@0.2.14", + "from": "https://registry.npmjs.org/minimatch/-/minimatch-0.2.14.tgz", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-0.2.14.tgz", "dependencies": { "lru-cache": { "version": "2.5.0", - "from": "lru-cache@2.5.0", + "from": "https://registry.npmjs.org/lru-cache/-/lru-cache-2.5.0.tgz", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-2.5.0.tgz" }, "sigmund": { "version": "1.0.0", - "from": "sigmund@1.0.0", + "from": "https://registry.npmjs.org/sigmund/-/sigmund-1.0.0.tgz", "resolved": "https://registry.npmjs.org/sigmund/-/sigmund-1.0.0.tgz" } } From 602a1142e8ac802bc8513bc806ca4e82377a140f Mon Sep 17 00:00:00 2001 From: Peter Bacon Darwin Date: Thu, 13 Mar 2014 14:17:28 +0000 Subject: [PATCH 045/837] chore(shrinkwrap): update dgeni-packages --- npm-shrinkwrap.json | 44 +++++++++++++++----------------------------- 1 file changed, 15 insertions(+), 29 deletions(-) diff --git a/npm-shrinkwrap.json b/npm-shrinkwrap.json index 34f682d89b8e..e6bdabc2a5a2 100644 --- a/npm-shrinkwrap.json +++ b/npm-shrinkwrap.json @@ -811,68 +811,56 @@ } }, "dgeni-packages": { - "version": "0.6.0", - "from": "https://registry.npmjs.org/dgeni-packages/-/dgeni-packages-0.6.0.tgz", - "resolved": "https://registry.npmjs.org/dgeni-packages/-/dgeni-packages-0.6.0.tgz", + "version": "0.7.1", + "from": "dgeni-packages@0.7.1", "dependencies": { "lodash": { "version": "2.4.1", - "from": "https://registry.npmjs.org/lodash/-/lodash-2.4.1.tgz", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-2.4.1.tgz" + "from": "lodash@~2.4.1" }, "graceful-fs": { "version": "2.0.2", - "from": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-2.0.2.tgz", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-2.0.2.tgz" + "from": "graceful-fs@~2.0.1" }, "glob": { "version": "3.2.9", - "from": "https://registry.npmjs.org/glob/-/glob-3.2.9.tgz", - "resolved": "https://registry.npmjs.org/glob/-/glob-3.2.9.tgz", + "from": "glob@~3.2.8", "dependencies": { "minimatch": { "version": "0.2.14", - "from": "https://registry.npmjs.org/minimatch/-/minimatch-0.2.14.tgz", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-0.2.14.tgz", + "from": "minimatch@~0.2.11", "dependencies": { "lru-cache": { "version": "2.5.0", - "from": "https://registry.npmjs.org/lru-cache/-/lru-cache-2.5.0.tgz", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-2.5.0.tgz" + "from": "lru-cache@2" }, "sigmund": { "version": "1.0.0", - "from": "https://registry.npmjs.org/sigmund/-/sigmund-1.0.0.tgz", - "resolved": "https://registry.npmjs.org/sigmund/-/sigmund-1.0.0.tgz" + "from": "sigmund@~1.0.0" } } }, "inherits": { "version": "2.0.1", - "from": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz" + "from": "inherits@2" } } }, "nunjucks": { "version": "1.0.1", - "from": "https://registry.npmjs.org/nunjucks/-/nunjucks-1.0.1.tgz", - "resolved": "https://registry.npmjs.org/nunjucks/-/nunjucks-1.0.1.tgz", + "from": "nunjucks@~1.0.1", "dependencies": { "optimist": { "version": "0.6.1", - "from": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz", - "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz", + "from": "optimist@*", "dependencies": { "wordwrap": { "version": "0.0.2", - "from": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz", - "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz" + "from": "wordwrap@~0.0.2" }, "minimist": { "version": "0.0.8", - "from": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz" + "from": "minimist@~0.0.1" } } } @@ -880,13 +868,11 @@ }, "catharsis": { "version": "0.7.0", - "from": "https://registry.npmjs.org/catharsis/-/catharsis-0.7.0.tgz", - "resolved": "https://registry.npmjs.org/catharsis/-/catharsis-0.7.0.tgz" + "from": "catharsis@^0.7.0" }, "esprima": { "version": "1.0.4", - "from": "https://registry.npmjs.org/esprima/-/esprima-1.0.4.tgz", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-1.0.4.tgz" + "from": "esprima@^1.0.4" } } }, From eadd8d08d3ae67f4f774d14aaa160fe8c69b0da5 Mon Sep 17 00:00:00 2001 From: Peter Bacon Darwin Date: Fri, 14 Mar 2014 11:03:23 +0000 Subject: [PATCH 046/837] docs(scripts/utils.inc): clarify documentation --- scripts/utils.inc | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/scripts/utils.inc b/scripts/utils.inc index 71c3bc9bfc75..919f7df9799e 100644 --- a/scripts/utils.inc +++ b/scripts/utils.inc @@ -15,7 +15,7 @@ # 0. Set the current directory to the directory of the script. By this # the script can be called from anywhere. # 1. Parse the named arguments -# 2. If the parameter "git_push_dryrun" is set, all calls the `git push` in this script +# 2. If the parameter "git_push_dryrun" is set, all calls to `git push` in this script # or in child scripts will be intercepted so that the `--dry-run` and `--porcelain` is added # to show what the push would do but not actually do it. # 3. If the parameter "verbose" is set, the `-x` flag will be set in bash. @@ -36,7 +36,7 @@ # with the name of the parameter in upper case (with dash converted to underscore). # # Special arguments that are always available: -# - "--action=.*": This parameter will be used to dispatch to a function with that name when the +# - "--action=.*": This parameter will be used to execute a function with that name when the # script is started # - "--git_push_dryrun=true": This will intercept all calls to `git push` in this script # or in child scripts so that the `--dry-run` and `--porcelain` is added @@ -195,7 +195,7 @@ function isFunction { } # readJsonProp(jsonFile, property) -# - restriction: property needs to be on an own line! +# - restriction: property needs to be on a single line! function readJsonProp { echo $(sed -En 's/.*"'$2'"[ ]*:[ ]*"(.*)".*/\1/p' $1) } From a41a2a1d2ce20f86ac2709592e4ada527160e580 Mon Sep 17 00:00:00 2001 From: Tomer Chachamu Date: Tue, 4 Mar 2014 15:29:11 +0000 Subject: [PATCH 047/837] fix(ngAnimate): setting classNameFilter disables animation inside ng-if Closes #6539 --- src/ngAnimate/animate.js | 4 ++-- test/ngAnimate/animateSpec.js | 43 +++++++++++++++++++++++++++++++++++ 2 files changed, 45 insertions(+), 2 deletions(-) diff --git a/src/ngAnimate/animate.js b/src/ngAnimate/animate.js index 447dfa3a6bc1..542b678f8316 100644 --- a/src/ngAnimate/animate.js +++ b/src/ngAnimate/animate.js @@ -770,7 +770,7 @@ angular.module('ngAnimate', ['ng']) fireDOMOperation(); fireBeforeCallbackAsync(); fireAfterCallbackAsync(); - fireDoneCallbackAsync(); + closeAnimation(); return; } @@ -949,7 +949,7 @@ angular.module('ngAnimate', ['ng']) animation, but class-based animations don't. An example of this failing would be when a parent HTML tag has a ng-class attribute causing ALL directives below to skip animations during the digest */ - if(runner.isClassBased) { + if(runner && runner.isClassBased) { cleanup(element, className); } else { $$asyncCallback(function() { diff --git a/test/ngAnimate/animateSpec.js b/test/ngAnimate/animateSpec.js index fb9ba19e8f19..204ca9c32114 100644 --- a/test/ngAnimate/animateSpec.js +++ b/test/ngAnimate/animateSpec.js @@ -3356,6 +3356,49 @@ describe("ngAnimate", function() { }); }); + it('should animate only the specified CSS className inside ng-if', function() { + var captures = {}; + module(function($animateProvider) { + $animateProvider.classNameFilter(/prefixed-animation/); + $animateProvider.register('.capture', function() { + return { + enter : buildFn('enter'), + leave : buildFn('leave') + }; + + function buildFn(key) { + return function(element, className, done) { + captures[key] = true; + (done || className)(); + } + } + }); + }); + inject(function($rootScope, $compile, $rootElement, $document, $sniffer, $animate) { + if(!$sniffer.transitions) return; + + var upperElement = $compile('
    ')($rootScope); + $rootElement.append(upperElement); + jqLite($document[0].body).append($rootElement); + + $rootScope.$digest(); + $animate.triggerCallbacks(); + + var element = upperElement.find('span'); + + var leaveDone = false; + $animate.leave(element, function() { + leaveDone = true; + }); + + $rootScope.$digest(); + $animate.triggerCallbacks(); + + expect(captures['leave']).toBe(true); + expect(leaveDone).toBe(true); + }); + }); + it('should respect the most relevant CSS transition property if defined in multiple classes', inject(function($sniffer, $compile, $rootScope, $rootElement, $animate, $timeout) { From ee8e4a946ed8f943e00846b88d8d51c0b2cd1fab Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Matias=20Niemel=C3=A4?= Date: Fri, 14 Mar 2014 12:01:45 -0400 Subject: [PATCH 048/837] fix($$rAF): always fallback to a $timeout incase native rAF isn't supported Closes #6654 --- src/ng/raf.js | 24 ++++++++++++++++-------- test/ng/rafSpec.js | 32 ++++++++++++++++++++++++++++++++ 2 files changed, 48 insertions(+), 8 deletions(-) diff --git a/src/ng/raf.js b/src/ng/raf.js index f85ee12a4223..0bc43f34327e 100644 --- a/src/ng/raf.js +++ b/src/ng/raf.js @@ -1,21 +1,29 @@ 'use strict'; function $$RAFProvider(){ //rAF - this.$get = ['$window', function($window) { + this.$get = ['$window', '$timeout', function($window, $timeout) { var requestAnimationFrame = $window.requestAnimationFrame || $window.webkitRequestAnimationFrame; var cancelAnimationFrame = $window.cancelAnimationFrame || $window.webkitCancelAnimationFrame; - var raf = function(fn) { - var id = requestAnimationFrame(fn); - return function() { - cancelAnimationFrame(id); - }; - }; + var rafSupported = !!requestAnimationFrame; + var raf = rafSupported + ? function(fn) { + var id = requestAnimationFrame(fn); + return function() { + cancelAnimationFrame(id); + }; + } + : function(fn) { + var timer = $timeout(fn, 16.66, false); // 1000 / 60 = 16.666 + return function() { + $timeout.cancel(timer); + }; + }; - raf.supported = !!requestAnimationFrame; + raf.supported = rafSupported; return raf; }]; diff --git a/test/ng/rafSpec.js b/test/ng/rafSpec.js index 6c15e2d2984c..8bf76efd03b0 100644 --- a/test/ng/rafSpec.js +++ b/test/ng/rafSpec.js @@ -31,6 +31,38 @@ describe('$$rAF', function() { expect(present).toBe(true); })); + describe('$timeout fallback', function() { + it("it should use a $timeout incase native rAF isn't suppored", function() { + var timeoutSpy = jasmine.createSpy('callback'); + + //we need to create our own injector to work around the ngMock overrides + var injector = createInjector(['ng', function($provide) { + $provide.value('$timeout', timeoutSpy); + $provide.decorator('$window', function($delegate) { + $delegate.requestAnimationFrame = false; + $delegate.webkitRequestAnimationFrame = false; + $delegate.mozRequestAnimationFrame = false; + return $delegate; + }); + }]); + + var $$rAF = injector.get('$$rAF'); + expect($$rAF.supported).toBe(false); + + var message; + $$rAF(function() { + message = 'on'; + }); + + expect(message).toBeUndefined(); + expect(timeoutSpy).toHaveBeenCalled(); + + timeoutSpy.mostRecentCall.args[0](); + + expect(message).toBe('on'); + }); + }); + describe('mocks', function() { it('should throw an error if no frames are present', inject(function($$rAF) { if($$rAF.supported) { From 25e639b4748aefb9b74f2329b7d6d065a921e357 Mon Sep 17 00:00:00 2001 From: Peter Bacon Darwin Date: Tue, 11 Mar 2014 19:10:34 +0000 Subject: [PATCH 049/837] chore(package.json): update dgeni-packages dependency The new version of dgeni-packages/ngdoc generates a manifest for each example that can be used by plunker. --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 13aeadae7653..2b1d769a35ac 100644 --- a/package.json +++ b/package.json @@ -51,7 +51,7 @@ "canonical-path": "0.0.2", "winston": "~0.7.2", "dgeni": "^0.2.2", - "dgeni-packages": "^0.6.0", + "dgeni-packages": "^0.7.0", "gulp-jshint": "~1.4.2", "jshint-stylish": "~0.1.5", "node-html-encoder": "0.0.2" From aa4ba23350c20609f1cd5276153b30683b9fdde8 Mon Sep 17 00:00:00 2001 From: Peter Bacon Darwin Date: Tue, 11 Mar 2014 20:20:37 +0000 Subject: [PATCH 050/837] chore(doc-gen): fix dependencyPath --- docs/docs.config.js | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/docs/docs.config.js b/docs/docs.config.js index 883f80f0a1b6..fcd3f9d9ffc7 100644 --- a/docs/docs.config.js +++ b/docs/docs.config.js @@ -40,7 +40,7 @@ module.exports = function(config) { commonFiles: { scripts: [ '../../../angular.js' ] }, - dependencyPath: '../../..' + dependencyPath: '../../../' }, scripts: [ '../angular.js', @@ -75,7 +75,7 @@ module.exports = function(config) { commonFiles: { scripts: [ '../../../angular.min.js' ] }, - dependencyPath: '../../..' + dependencyPath: '../../../' }, scripts: [ '../angular.min.js', @@ -113,7 +113,7 @@ module.exports = function(config) { '../../../angular.js' ] }, - dependencyPath: '../../..' + dependencyPath: '../../../' }, scripts: [ 'components/jquery-' + getVersion('jquery') + '/jquery.js', @@ -149,7 +149,7 @@ module.exports = function(config) { commonFiles: { scripts: [ cdnUrl + '/angular.min.js' ] }, - dependencyPath: cdnUrl + dependencyPath: cdnUrl + '/' }, scripts: [ cdnUrl + '/angular.min.js', From ec16352579f80b0d96dc1fc5aa92720f52453ba5 Mon Sep 17 00:00:00 2001 From: Thomas Belin Date: Tue, 4 Mar 2014 17:22:02 +0100 Subject: [PATCH 051/837] fix (ngAnimate): fix requestAnimationFrame for old version of Firefox The recent $$RAFProvider which is a wrapper for the native requestAnimationFrame method doesn't use the mozRequestAnimationFrame. Old versions of FF (20 for example) crash if ngAnimate is included No breaking changes and fix issue https://github.com/angular/angular.js/issues/6535 Closes #6535 Closes #6540 --- src/ng/raf.js | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/ng/raf.js b/src/ng/raf.js index 0bc43f34327e..e07adbfed5ce 100644 --- a/src/ng/raf.js +++ b/src/ng/raf.js @@ -3,10 +3,12 @@ function $$RAFProvider(){ //rAF this.$get = ['$window', '$timeout', function($window, $timeout) { var requestAnimationFrame = $window.requestAnimationFrame || - $window.webkitRequestAnimationFrame; + $window.webkitRequestAnimationFrame || + $window.mozRequestAnimationFrame; var cancelAnimationFrame = $window.cancelAnimationFrame || - $window.webkitCancelAnimationFrame; + $window.webkitCancelAnimationFrame || + $window.mozCancelAnimationFrame; var rafSupported = !!requestAnimationFrame; var raf = rafSupported From b068c8b6054ae5d1ba51124ffd072d1f9a91e385 Mon Sep 17 00:00:00 2001 From: Wesley Cho Date: Mon, 27 Jan 2014 22:59:10 -0500 Subject: [PATCH 052/837] docs($resource): fix example using promise --- src/ngResource/resource.js | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/src/ngResource/resource.js b/src/ngResource/resource.js index 66433736b3c7..8927a2664c16 100644 --- a/src/ngResource/resource.js +++ b/src/ngResource/resource.js @@ -253,7 +253,7 @@ function shallowClearAndCopy(src, dst) { ```js var User = $resource('/user/:userId', {userId:'@id'}); - var user = User.get({userId:123}, function() { + User.get({userId:123}, function(user) { user.abc = true; user.$save(); }); @@ -273,6 +273,16 @@ function shallowClearAndCopy(src, dst) { }); }); ``` + * + * You can also access the raw `$http` promise via the `$promise` property on the object returned + * + ``` + var User = $resource('/user/:userId', {userId:'@id'}); + User.get({userId:123}) + .$promise.then(function(user) { + $scope.user = user; + }); + ``` * # Creating a custom 'PUT' request * In this example we create a custom method on our resource to make a PUT request From d69793d93c9b946c904bafed12983ef4459c4cd6 Mon Sep 17 00:00:00 2001 From: Nick Carter Date: Thu, 13 Mar 2014 11:42:48 -0400 Subject: [PATCH 053/837] docs(guide/unit-testing): fix typo --- docs/content/guide/unit-testing.ngdoc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/content/guide/unit-testing.ngdoc b/docs/content/guide/unit-testing.ngdoc index 8d41bedfb723..f4a608d8962d 100644 --- a/docs/content/guide/unit-testing.ngdoc +++ b/docs/content/guide/unit-testing.ngdoc @@ -258,7 +258,7 @@ expect($scope.strength).toEqual('weak'); ``` Notice that the test is not only much shorter, it is also easier to follow what is happening. We say -that such a test tells a story, rather then asserting random bits which don't seem to be related. +that such a test tells a story, rather than asserting random bits which don't seem to be related. ## Filters {@link ng.$filterProvider Filters} are functions which transform the data into a user readable From dfdb72559f4a4384f1f47196d224e929f759256f Mon Sep 17 00:00:00 2001 From: Sagie Maoz Date: Thu, 13 Mar 2014 14:47:13 +0200 Subject: [PATCH 054/837] docs(guide/compiler): add missing closing parenthesis --- docs/content/guide/compiler.ngdoc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/content/guide/compiler.ngdoc b/docs/content/guide/compiler.ngdoc index d4d7749839c2..44151a4c3a6b 100644 --- a/docs/content/guide/compiler.ngdoc +++ b/docs/content/guide/compiler.ngdoc @@ -325,7 +325,7 @@ This will not render properly, unless we do some scope magic. The first issue we have to solve is that the dialog box template expects `title` to be defined. But we would like the template's scope property `title` to be the result of interpolating the -`` element's `title` attribute (i.e. `"Hello {{username}}"`. Furthermore, the buttons expect +`` element's `title` attribute (i.e. `"Hello {{username}}"`). Furthermore, the buttons expect the `onOk` and `onCancel` functions to be present in the scope. This limits the usefulness of the widget. To solve the mapping issue we use the `locals` to create local variables which the template expects as follows: From 7cbf61cabb4f2072a1d29c88f018e4db1a7af43f Mon Sep 17 00:00:00 2001 From: Nick Heiner Date: Thu, 13 Mar 2014 19:41:19 -0400 Subject: [PATCH 055/837] docs(ngMock): grammar nitpick. --- src/ngMock/angular-mocks.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/ngMock/angular-mocks.js b/src/ngMock/angular-mocks.js index 6a60d9bbf49d..67decaceb33f 100644 --- a/src/ngMock/angular-mocks.js +++ b/src/ngMock/angular-mocks.js @@ -1821,8 +1821,8 @@ angular.module('ngMockE2E', ['ng']).config(['$provide', function($provide) { * an array containing response status (number), response data (string) and response headers * (Object). * - passThrough – `{function()}` – Any request matching a backend definition with `passThrough` - * handler, will be pass through to the real backend (an XHR request will be made to the - * server. + * handler will be passed through to the real backend (an XHR request will be made to the + * server.) */ /** From f108a2a994149ecc011e29f327bcb8e11adf72d9 Mon Sep 17 00:00:00 2001 From: Pawel Kozlowski Date: Sat, 1 Mar 2014 12:49:47 +0100 Subject: [PATCH 056/837] fix($http): don't covert 0 status codes to 404 for non-file protocols PR #5547 introduced conversion of all 0 status codes to 404 for cases where no response was recieved (previously this was done for the file:// protocol only). But this mechanism is too eager and masks legitimate cases where status 0 should be returned. This commits reverts to the previous mechanism of handling 0 status code for the file:// protocol (converting 0 to 404) while retaining the returned status code 0 for all the protocols other than file:// Fixes #6074 Fixes #6155 --- src/ng/httpBackend.js | 8 +++++--- test/ng/httpBackendSpec.js | 30 ++++++++++++++++++++++++------ 2 files changed, 29 insertions(+), 9 deletions(-) diff --git a/src/ng/httpBackend.js b/src/ng/httpBackend.js index ee2a37fe10a8..28107966f643 100644 --- a/src/ng/httpBackend.js +++ b/src/ng/httpBackend.js @@ -144,9 +144,11 @@ function createHttpBackend($browser, createXhr, $browserDefer, callbacks, rawDoc jsonpDone = xhr = null; // fix status code when it is 0 (0 status is undocumented). - // Occurs when accessing file resources. - // On Android 4.1 stock browser it occurs while retrieving files from application cache. - status = (status === 0) ? (response ? 200 : 404) : status; + // Occurs when accessing file resources or on Android 4.1 stock browser + // while retrieving files from application cache. + if (status === 0) { + status = response ? 200 : urlResolve(url).protocol == 'file' ? 404 : 0; + } // normalize IE bug (http://bugs.jquery.com/ticket/1450) status = status == 1223 ? 204 : status; diff --git a/test/ng/httpBackendSpec.js b/test/ng/httpBackendSpec.js index 2a3f60126737..5c9cbf586c36 100644 --- a/test/ng/httpBackendSpec.js +++ b/test/ng/httpBackendSpec.js @@ -456,27 +456,45 @@ describe('$httpBackend', function() { } - it('should convert 0 to 200 if content', function() { + it('should convert 0 to 200 if content and file protocol', function() { $backend = createHttpBackend($browser, createMockXhr); - $backend('GET', 'someProtocol:///whatever/index.html', null, callback); + $backend('GET', 'file:///whatever/index.html', null, callback); respond(0, 'SOME CONTENT'); expect(callback).toHaveBeenCalled(); expect(callback.mostRecentCall.args[0]).toBe(200); }); - - it('should convert 0 to 404 if no content', function() { + it('should convert 0 to 200 if content for protocols other than file', function() { $backend = createHttpBackend($browser, createMockXhr); $backend('GET', 'someProtocol:///whatever/index.html', null, callback); + respond(0, 'SOME CONTENT'); + + expect(callback).toHaveBeenCalled(); + expect(callback.mostRecentCall.args[0]).toBe(200); + }); + + it('should convert 0 to 404 if no content and file protocol', function() { + $backend = createHttpBackend($browser, createMockXhr); + + $backend('GET', 'file:///whatever/index.html', null, callback); respond(0, ''); expect(callback).toHaveBeenCalled(); expect(callback.mostRecentCall.args[0]).toBe(404); }); + it('should not convert 0 to 404 if no content for protocols other than file', function() { + $backend = createHttpBackend($browser, createMockXhr); + + $backend('GET', 'someProtocol:///whatever/index.html', null, callback); + respond(0, ''); + + expect(callback).toHaveBeenCalled(); + expect(callback.mostRecentCall.args[0]).toBe(0); + }); it('should convert 0 to 404 if no content - relative url', function() { var originalUrlParsingNode = urlParsingNode; @@ -486,10 +504,10 @@ describe('$httpBackend', function() { hash : "#/C:/", host : "", hostname : "", - href : "someProtocol:///C:/base#!/C:/foo", + href : "file:///C:/base#!/C:/foo", pathname : "/C:/foo", port : "", - protocol : "someProtocol:", + protocol : "file:", search : "", setAttribute: angular.noop }; From c794b96bdc25552ab9ad08d5b7c10c5e8dd5c403 Mon Sep 17 00:00:00 2001 From: Igor Minar Date: Fri, 14 Mar 2014 13:26:12 -0700 Subject: [PATCH 057/837] chore(npm): clean up shrinkwrap file, remove unused properties from our experiements it appears that the presense or absense of the from and resolved properties makes no difference on the behavior of but updates these properties with different values depending on different state of the cache and node_modules. So in order to get clean diffs during updates, we are just going to drop these properties and have a script to do this automatically. Long term this should be fixed in npm: https://github.com/npm/npm/issues/3581 --- npm-shrinkwrap.json | 2516 +++++++++---------------------------------- 1 file changed, 504 insertions(+), 2012 deletions(-) diff --git a/npm-shrinkwrap.json b/npm-shrinkwrap.json index e6bdabc2a5a2..2af6f725f5a1 100644 --- a/npm-shrinkwrap.json +++ b/npm-shrinkwrap.json @@ -1,234 +1,151 @@ { - "name": "angularjs", "dependencies": { "bower": { "version": "1.2.8", - "from": "https://registry.npmjs.org/bower/-/bower-1.2.8.tgz", - "resolved": "https://registry.npmjs.org/bower/-/bower-1.2.8.tgz", "dependencies": { "abbrev": { - "version": "1.0.4", - "from": "https://registry.npmjs.org/abbrev/-/abbrev-1.0.4.tgz", - "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.0.4.tgz" + "version": "1.0.4" }, "archy": { - "version": "0.0.2", - "from": "https://registry.npmjs.org/archy/-/archy-0.0.2.tgz", - "resolved": "https://registry.npmjs.org/archy/-/archy-0.0.2.tgz" + "version": "0.0.2" }, "bower-config": { "version": "0.5.0", - "from": "https://registry.npmjs.org/bower-config/-/bower-config-0.5.0.tgz", - "resolved": "https://registry.npmjs.org/bower-config/-/bower-config-0.5.0.tgz", "dependencies": { "mout": { - "version": "0.6.0", - "from": "https://registry.npmjs.org/mout/-/mout-0.6.0.tgz", - "resolved": "https://registry.npmjs.org/mout/-/mout-0.6.0.tgz" + "version": "0.6.0" }, "optimist": { "version": "0.6.1", - "from": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz", - "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz", "dependencies": { "wordwrap": { - "version": "0.0.2", - "from": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz", - "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz" + "version": "0.0.2" }, "minimist": { - "version": "0.0.8", - "from": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz" + "version": "0.0.8" } } } } }, "bower-endpoint-parser": { - "version": "0.2.1", - "from": "https://registry.npmjs.org/bower-endpoint-parser/-/bower-endpoint-parser-0.2.1.tgz", - "resolved": "https://registry.npmjs.org/bower-endpoint-parser/-/bower-endpoint-parser-0.2.1.tgz" + "version": "0.2.1" }, "bower-json": { "version": "0.4.0", - "from": "https://registry.npmjs.org/bower-json/-/bower-json-0.4.0.tgz", - "resolved": "https://registry.npmjs.org/bower-json/-/bower-json-0.4.0.tgz", "dependencies": { "deep-extend": { - "version": "0.2.8", - "from": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.2.8.tgz", - "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.2.8.tgz" + "version": "0.2.8" }, "intersect": { - "version": "0.0.3", - "from": "https://registry.npmjs.org/intersect/-/intersect-0.0.3.tgz", - "resolved": "https://registry.npmjs.org/intersect/-/intersect-0.0.3.tgz" + "version": "0.0.3" } } }, "bower-logger": { - "version": "0.2.2", - "from": "https://registry.npmjs.org/bower-logger/-/bower-logger-0.2.2.tgz", - "resolved": "https://registry.npmjs.org/bower-logger/-/bower-logger-0.2.2.tgz" + "version": "0.2.2" }, "bower-registry-client": { "version": "0.1.6", - "from": "https://registry.npmjs.org/bower-registry-client/-/bower-registry-client-0.1.6.tgz", - "resolved": "https://registry.npmjs.org/bower-registry-client/-/bower-registry-client-0.1.6.tgz", "dependencies": { "async": { - "version": "0.2.10", - "from": "https://registry.npmjs.org/async/-/async-0.2.10.tgz", - "resolved": "https://registry.npmjs.org/async/-/async-0.2.10.tgz" + "version": "0.2.10" }, "bower-config": { "version": "0.4.5", - "from": "https://registry.npmjs.org/bower-config/-/bower-config-0.4.5.tgz", - "resolved": "https://registry.npmjs.org/bower-config/-/bower-config-0.4.5.tgz", "dependencies": { "mout": { - "version": "0.6.0", - "from": "https://registry.npmjs.org/mout/-/mout-0.6.0.tgz", - "resolved": "https://registry.npmjs.org/mout/-/mout-0.6.0.tgz" + "version": "0.6.0" }, "optimist": { "version": "0.6.1", - "from": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz", - "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz", "dependencies": { "wordwrap": { - "version": "0.0.2", - "from": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz", - "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz" + "version": "0.0.2" }, "minimist": { - "version": "0.0.8", - "from": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz" + "version": "0.0.8" } } } } }, "request-replay": { - "version": "0.2.0", - "from": "https://registry.npmjs.org/request-replay/-/request-replay-0.2.0.tgz", - "resolved": "https://registry.npmjs.org/request-replay/-/request-replay-0.2.0.tgz" + "version": "0.2.0" } } }, "cardinal": { "version": "0.4.4", - "from": "https://registry.npmjs.org/cardinal/-/cardinal-0.4.4.tgz", - "resolved": "https://registry.npmjs.org/cardinal/-/cardinal-0.4.4.tgz", "dependencies": { "redeyed": { "version": "0.4.4", - "from": "https://registry.npmjs.org/redeyed/-/redeyed-0.4.4.tgz", - "resolved": "https://registry.npmjs.org/redeyed/-/redeyed-0.4.4.tgz", "dependencies": { "esprima": { - "version": "1.0.4", - "from": "https://registry.npmjs.org/esprima/-/esprima-1.0.4.tgz", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-1.0.4.tgz" + "version": "1.0.4" } } }, "ansicolors": { - "version": "0.2.1", - "from": "https://registry.npmjs.org/ansicolors/-/ansicolors-0.2.1.tgz", - "resolved": "https://registry.npmjs.org/ansicolors/-/ansicolors-0.2.1.tgz" + "version": "0.2.1" } } }, "chalk": { "version": "0.2.1", - "from": "https://registry.npmjs.org/chalk/-/chalk-0.2.1.tgz", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-0.2.1.tgz", "dependencies": { "has-color": { - "version": "0.1.4", - "from": "https://registry.npmjs.org/has-color/-/has-color-0.1.4.tgz", - "resolved": "https://registry.npmjs.org/has-color/-/has-color-0.1.4.tgz" + "version": "0.1.4" }, "ansi-styles": { - "version": "0.2.0", - "from": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-0.2.0.tgz", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-0.2.0.tgz" + "version": "0.2.0" } } }, "chmodr": { - "version": "0.1.0", - "from": "https://registry.npmjs.org/chmodr/-/chmodr-0.1.0.tgz", - "resolved": "https://registry.npmjs.org/chmodr/-/chmodr-0.1.0.tgz" + "version": "0.1.0" }, "decompress-zip": { "version": "0.0.4", - "from": "https://registry.npmjs.org/decompress-zip/-/decompress-zip-0.0.4.tgz", - "resolved": "https://registry.npmjs.org/decompress-zip/-/decompress-zip-0.0.4.tgz", "dependencies": { "mkpath": { - "version": "0.1.0", - "from": "https://registry.npmjs.org/mkpath/-/mkpath-0.1.0.tgz", - "resolved": "https://registry.npmjs.org/mkpath/-/mkpath-0.1.0.tgz" + "version": "0.1.0" }, "binary": { "version": "0.3.0", - "from": "https://registry.npmjs.org/binary/-/binary-0.3.0.tgz", - "resolved": "https://registry.npmjs.org/binary/-/binary-0.3.0.tgz", "dependencies": { "chainsaw": { "version": "0.1.0", - "from": "https://registry.npmjs.org/chainsaw/-/chainsaw-0.1.0.tgz", - "resolved": "https://registry.npmjs.org/chainsaw/-/chainsaw-0.1.0.tgz", "dependencies": { "traverse": { - "version": "0.3.9", - "from": "https://registry.npmjs.org/traverse/-/traverse-0.3.9.tgz", - "resolved": "https://registry.npmjs.org/traverse/-/traverse-0.3.9.tgz" + "version": "0.3.9" } } }, "buffers": { - "version": "0.1.1", - "from": "https://registry.npmjs.org/buffers/-/buffers-0.1.1.tgz", - "resolved": "https://registry.npmjs.org/buffers/-/buffers-0.1.1.tgz" + "version": "0.1.1" } } }, "touch": { "version": "0.0.2", - "from": "https://registry.npmjs.org/touch/-/touch-0.0.2.tgz", - "resolved": "https://registry.npmjs.org/touch/-/touch-0.0.2.tgz", "dependencies": { "nopt": { - "version": "1.0.10", - "from": "https://registry.npmjs.org/nopt/-/nopt-1.0.10.tgz", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-1.0.10.tgz" + "version": "1.0.10" } } }, "readable-stream": { "version": "1.1.11", - "from": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.11.tgz", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.11.tgz", "dependencies": { "core-util-is": { - "version": "1.0.1", - "from": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.1.tgz", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.1.tgz" + "version": "1.0.1" }, "string_decoder": { - "version": "0.10.25-1", - "from": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.25-1.tgz", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.25-1.tgz" + "version": "0.10.25-1" }, "debuglog": { - "version": "0.0.2", - "from": "https://registry.npmjs.org/debuglog/-/debuglog-0.0.2.tgz", - "resolved": "https://registry.npmjs.org/debuglog/-/debuglog-0.0.2.tgz" + "version": "0.0.2" } } } @@ -236,105 +153,69 @@ }, "fstream": { "version": "0.1.25", - "from": "https://registry.npmjs.org/fstream/-/fstream-0.1.25.tgz", - "resolved": "https://registry.npmjs.org/fstream/-/fstream-0.1.25.tgz", "dependencies": { "inherits": { - "version": "2.0.1", - "from": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz" + "version": "2.0.1" } } }, "fstream-ignore": { "version": "0.0.7", - "from": "https://registry.npmjs.org/fstream-ignore/-/fstream-ignore-0.0.7.tgz", - "resolved": "https://registry.npmjs.org/fstream-ignore/-/fstream-ignore-0.0.7.tgz", "dependencies": { "minimatch": { "version": "0.2.14", - "from": "https://registry.npmjs.org/minimatch/-/minimatch-0.2.14.tgz", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-0.2.14.tgz", "dependencies": { "sigmund": { - "version": "1.0.0", - "from": "https://registry.npmjs.org/sigmund/-/sigmund-1.0.0.tgz", - "resolved": "https://registry.npmjs.org/sigmund/-/sigmund-1.0.0.tgz" + "version": "1.0.0" } } }, "inherits": { - "version": "2.0.1", - "from": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz" + "version": "2.0.1" } } }, "glob": { "version": "3.2.9", - "from": "https://registry.npmjs.org/glob/-/glob-3.2.9.tgz", - "resolved": "https://registry.npmjs.org/glob/-/glob-3.2.9.tgz", "dependencies": { "minimatch": { "version": "0.2.14", - "from": "https://registry.npmjs.org/minimatch/-/minimatch-0.2.14.tgz", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-0.2.14.tgz", "dependencies": { "sigmund": { - "version": "1.0.0", - "from": "https://registry.npmjs.org/sigmund/-/sigmund-1.0.0.tgz", - "resolved": "https://registry.npmjs.org/sigmund/-/sigmund-1.0.0.tgz" + "version": "1.0.0" } } }, "inherits": { - "version": "2.0.1", - "from": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz" + "version": "2.0.1" } } }, "graceful-fs": { - "version": "2.0.2", - "from": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-2.0.2.tgz", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-2.0.2.tgz" + "version": "2.0.2" }, "handlebars": { "version": "1.0.12", - "from": "https://registry.npmjs.org/handlebars/-/handlebars-1.0.12.tgz", - "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-1.0.12.tgz", "dependencies": { "optimist": { "version": "0.3.7", - "from": "https://registry.npmjs.org/optimist/-/optimist-0.3.7.tgz", - "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.3.7.tgz", "dependencies": { "wordwrap": { - "version": "0.0.2", - "from": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz", - "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz" + "version": "0.0.2" } } }, "uglify-js": { "version": "2.3.6", - "from": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.3.6.tgz", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.3.6.tgz", "dependencies": { "async": { - "version": "0.2.10", - "from": "https://registry.npmjs.org/async/-/async-0.2.10.tgz", - "resolved": "https://registry.npmjs.org/async/-/async-0.2.10.tgz" + "version": "0.2.10" }, "source-map": { "version": "0.1.32", - "from": "https://registry.npmjs.org/source-map/-/source-map-0.1.32.tgz", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.1.32.tgz", "dependencies": { "amdefine": { - "version": "0.1.0", - "from": "https://registry.npmjs.org/amdefine/-/amdefine-0.1.0.tgz", - "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-0.1.0.tgz" + "version": "0.1.0" } } } @@ -344,234 +225,148 @@ }, "inquirer": { "version": "0.3.5", - "from": "https://registry.npmjs.org/inquirer/-/inquirer-0.3.5.tgz", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-0.3.5.tgz", "dependencies": { "lodash": { - "version": "1.2.1", - "from": "https://registry.npmjs.org/lodash/-/lodash-1.2.1.tgz", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-1.2.1.tgz" + "version": "1.2.1" }, "async": { - "version": "0.2.10", - "from": "https://registry.npmjs.org/async/-/async-0.2.10.tgz", - "resolved": "https://registry.npmjs.org/async/-/async-0.2.10.tgz" + "version": "0.2.10" }, "cli-color": { "version": "0.2.3", - "from": "https://registry.npmjs.org/cli-color/-/cli-color-0.2.3.tgz", - "resolved": "https://registry.npmjs.org/cli-color/-/cli-color-0.2.3.tgz", "dependencies": { "es5-ext": { - "version": "0.9.2", - "from": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.9.2.tgz", - "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.9.2.tgz" + "version": "0.9.2" }, "memoizee": { "version": "0.2.6", - "from": "https://registry.npmjs.org/memoizee/-/memoizee-0.2.6.tgz", - "resolved": "https://registry.npmjs.org/memoizee/-/memoizee-0.2.6.tgz", "dependencies": { "event-emitter": { - "version": "0.2.2", - "from": "https://registry.npmjs.org/event-emitter/-/event-emitter-0.2.2.tgz", - "resolved": "https://registry.npmjs.org/event-emitter/-/event-emitter-0.2.2.tgz" + "version": "0.2.2" }, "next-tick": { - "version": "0.1.0", - "from": "https://registry.npmjs.org/next-tick/-/next-tick-0.1.0.tgz", - "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-0.1.0.tgz" + "version": "0.1.0" } } } } }, "mute-stream": { - "version": "0.0.3", - "from": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.3.tgz", - "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.3.tgz" + "version": "0.0.3" } } }, "junk": { - "version": "0.2.2", - "from": "https://registry.npmjs.org/junk/-/junk-0.2.2.tgz", - "resolved": "https://registry.npmjs.org/junk/-/junk-0.2.2.tgz" + "version": "0.2.2" }, "mkdirp": { - "version": "0.3.5", - "from": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.3.5.tgz", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.3.5.tgz" + "version": "0.3.5" }, "mout": { - "version": "0.7.1", - "from": "https://registry.npmjs.org/mout/-/mout-0.7.1.tgz", - "resolved": "https://registry.npmjs.org/mout/-/mout-0.7.1.tgz" + "version": "0.7.1" }, "nopt": { - "version": "2.1.2", - "from": "https://registry.npmjs.org/nopt/-/nopt-2.1.2.tgz", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-2.1.2.tgz" + "version": "2.1.2" }, "lru-cache": { - "version": "2.3.1", - "from": "https://registry.npmjs.org/lru-cache/-/lru-cache-2.3.1.tgz", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-2.3.1.tgz" + "version": "2.3.1" }, "open": { - "version": "0.0.4", - "from": "https://registry.npmjs.org/open/-/open-0.0.4.tgz", - "resolved": "https://registry.npmjs.org/open/-/open-0.0.4.tgz" + "version": "0.0.4" }, "osenv": { - "version": "0.0.3", - "from": "https://registry.npmjs.org/osenv/-/osenv-0.0.3.tgz", - "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.0.3.tgz" + "version": "0.0.3" }, "promptly": { "version": "0.2.0", - "from": "https://registry.npmjs.org/promptly/-/promptly-0.2.0.tgz", - "resolved": "https://registry.npmjs.org/promptly/-/promptly-0.2.0.tgz", "dependencies": { "read": { "version": "1.0.5", - "from": "https://registry.npmjs.org/read/-/read-1.0.5.tgz", - "resolved": "https://registry.npmjs.org/read/-/read-1.0.5.tgz", "dependencies": { "mute-stream": { - "version": "0.0.4", - "from": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.4.tgz", - "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.4.tgz" + "version": "0.0.4" } } } } }, "q": { - "version": "0.9.7", - "from": "https://registry.npmjs.org/q/-/q-0.9.7.tgz", - "resolved": "https://registry.npmjs.org/q/-/q-0.9.7.tgz" + "version": "0.9.7" }, "request": { "version": "2.27.0", - "from": "https://registry.npmjs.org/request/-/request-2.27.0.tgz", - "resolved": "https://registry.npmjs.org/request/-/request-2.27.0.tgz", "dependencies": { "qs": { - "version": "0.6.6", - "from": "https://registry.npmjs.org/qs/-/qs-0.6.6.tgz", - "resolved": "https://registry.npmjs.org/qs/-/qs-0.6.6.tgz" + "version": "0.6.6" }, "json-stringify-safe": { - "version": "5.0.0", - "from": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.0.tgz", - "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.0.tgz" + "version": "5.0.0" }, "forever-agent": { - "version": "0.5.2", - "from": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.5.2.tgz", - "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.5.2.tgz" + "version": "0.5.2" }, "tunnel-agent": { - "version": "0.3.0", - "from": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.3.0.tgz", - "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.3.0.tgz" + "version": "0.3.0" }, "http-signature": { "version": "0.10.0", - "from": "https://registry.npmjs.org/http-signature/-/http-signature-0.10.0.tgz", - "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-0.10.0.tgz", "dependencies": { "assert-plus": { - "version": "0.1.2", - "from": "https://registry.npmjs.org/assert-plus/-/assert-plus-0.1.2.tgz", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-0.1.2.tgz" + "version": "0.1.2" }, "asn1": { - "version": "0.1.11", - "from": "https://registry.npmjs.org/asn1/-/asn1-0.1.11.tgz", - "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.1.11.tgz" + "version": "0.1.11" }, "ctype": { - "version": "0.5.2", - "from": "https://registry.npmjs.org/ctype/-/ctype-0.5.2.tgz", - "resolved": "https://registry.npmjs.org/ctype/-/ctype-0.5.2.tgz" + "version": "0.5.2" } } }, "hawk": { "version": "1.0.0", - "from": "https://registry.npmjs.org/hawk/-/hawk-1.0.0.tgz", - "resolved": "https://registry.npmjs.org/hawk/-/hawk-1.0.0.tgz", "dependencies": { "hoek": { - "version": "0.9.1", - "from": "https://registry.npmjs.org/hoek/-/hoek-0.9.1.tgz", - "resolved": "https://registry.npmjs.org/hoek/-/hoek-0.9.1.tgz" + "version": "0.9.1" }, "boom": { - "version": "0.4.2", - "from": "https://registry.npmjs.org/boom/-/boom-0.4.2.tgz", - "resolved": "https://registry.npmjs.org/boom/-/boom-0.4.2.tgz" + "version": "0.4.2" }, "cryptiles": { - "version": "0.2.2", - "from": "https://registry.npmjs.org/cryptiles/-/cryptiles-0.2.2.tgz", - "resolved": "https://registry.npmjs.org/cryptiles/-/cryptiles-0.2.2.tgz" + "version": "0.2.2" }, "sntp": { - "version": "0.2.4", - "from": "https://registry.npmjs.org/sntp/-/sntp-0.2.4.tgz", - "resolved": "https://registry.npmjs.org/sntp/-/sntp-0.2.4.tgz" + "version": "0.2.4" } } }, "aws-sign": { - "version": "0.3.0", - "from": "https://registry.npmjs.org/aws-sign/-/aws-sign-0.3.0.tgz", - "resolved": "https://registry.npmjs.org/aws-sign/-/aws-sign-0.3.0.tgz" + "version": "0.3.0" }, "oauth-sign": { - "version": "0.3.0", - "from": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.3.0.tgz", - "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.3.0.tgz" + "version": "0.3.0" }, "cookie-jar": { - "version": "0.3.0", - "from": "https://registry.npmjs.org/cookie-jar/-/cookie-jar-0.3.0.tgz", - "resolved": "https://registry.npmjs.org/cookie-jar/-/cookie-jar-0.3.0.tgz" + "version": "0.3.0" }, "node-uuid": { - "version": "1.4.1", - "from": "https://registry.npmjs.org/node-uuid/-/node-uuid-1.4.1.tgz", - "resolved": "https://registry.npmjs.org/node-uuid/-/node-uuid-1.4.1.tgz" + "version": "1.4.1" }, "mime": { - "version": "1.2.11", - "from": "https://registry.npmjs.org/mime/-/mime-1.2.11.tgz", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.2.11.tgz" + "version": "1.2.11" }, "form-data": { "version": "0.1.2", - "from": "https://registry.npmjs.org/form-data/-/form-data-0.1.2.tgz", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-0.1.2.tgz", "dependencies": { "combined-stream": { "version": "0.0.4", - "from": "https://registry.npmjs.org/combined-stream/-/combined-stream-0.0.4.tgz", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-0.0.4.tgz", "dependencies": { "delayed-stream": { - "version": "0.0.5", - "from": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-0.0.5.tgz", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-0.0.5.tgz" + "version": "0.0.5" } } }, "async": { - "version": "0.2.10", - "from": "https://registry.npmjs.org/async/-/async-0.2.10.tgz", - "resolved": "https://registry.npmjs.org/async/-/async-0.2.10.tgz" + "version": "0.2.10" } } } @@ -579,50 +374,32 @@ }, "request-progress": { "version": "0.3.1", - "from": "https://registry.npmjs.org/request-progress/-/request-progress-0.3.1.tgz", - "resolved": "https://registry.npmjs.org/request-progress/-/request-progress-0.3.1.tgz", "dependencies": { "throttleit": { - "version": "0.0.2", - "from": "https://registry.npmjs.org/throttleit/-/throttleit-0.0.2.tgz", - "resolved": "https://registry.npmjs.org/throttleit/-/throttleit-0.0.2.tgz" + "version": "0.0.2" } } }, "retry": { - "version": "0.6.0", - "from": "https://registry.npmjs.org/retry/-/retry-0.6.0.tgz", - "resolved": "https://registry.npmjs.org/retry/-/retry-0.6.0.tgz" + "version": "0.6.0" }, "rimraf": { - "version": "2.2.6", - "from": "https://registry.npmjs.org/rimraf/-/rimraf-2.2.6.tgz", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.2.6.tgz" + "version": "2.2.6" }, "stringify-object": { - "version": "0.1.8", - "from": "https://registry.npmjs.org/stringify-object/-/stringify-object-0.1.8.tgz", - "resolved": "https://registry.npmjs.org/stringify-object/-/stringify-object-0.1.8.tgz" + "version": "0.1.8" }, "sudo-block": { "version": "0.2.1", - "from": "https://registry.npmjs.org/sudo-block/-/sudo-block-0.2.1.tgz", - "resolved": "https://registry.npmjs.org/sudo-block/-/sudo-block-0.2.1.tgz", "dependencies": { "chalk": { "version": "0.1.1", - "from": "https://registry.npmjs.org/chalk/-/chalk-0.1.1.tgz", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-0.1.1.tgz", "dependencies": { "has-color": { - "version": "0.1.4", - "from": "https://registry.npmjs.org/has-color/-/has-color-0.1.4.tgz", - "resolved": "https://registry.npmjs.org/has-color/-/has-color-0.1.4.tgz" + "version": "0.1.4" }, "ansi-styles": { - "version": "0.1.2", - "from": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-0.1.2.tgz", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-0.1.2.tgz" + "version": "0.1.2" } } } @@ -630,67 +407,43 @@ }, "tar": { "version": "0.1.19", - "from": "https://registry.npmjs.org/tar/-/tar-0.1.19.tgz", - "resolved": "https://registry.npmjs.org/tar/-/tar-0.1.19.tgz", "dependencies": { "inherits": { - "version": "2.0.1", - "from": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz" + "version": "2.0.1" }, "block-stream": { - "version": "0.0.7", - "from": "https://registry.npmjs.org/block-stream/-/block-stream-0.0.7.tgz", - "resolved": "https://registry.npmjs.org/block-stream/-/block-stream-0.0.7.tgz" + "version": "0.0.7" } } }, "tmp": { - "version": "0.0.23", - "from": "https://registry.npmjs.org/tmp/-/tmp-0.0.23.tgz", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.23.tgz" + "version": "0.0.23" }, "update-notifier": { "version": "0.1.7", - "from": "https://registry.npmjs.org/update-notifier/-/update-notifier-0.1.7.tgz", - "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-0.1.7.tgz", "dependencies": { "configstore": { "version": "0.1.7", - "from": "https://registry.npmjs.org/configstore/-/configstore-0.1.7.tgz", - "resolved": "https://registry.npmjs.org/configstore/-/configstore-0.1.7.tgz", "dependencies": { "lodash": { - "version": "2.4.1", - "from": "https://registry.npmjs.org/lodash/-/lodash-2.4.1.tgz", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-2.4.1.tgz" + "version": "2.4.1" }, "js-yaml": { "version": "2.1.3", - "from": "https://registry.npmjs.org/js-yaml/-/js-yaml-2.1.3.tgz", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-2.1.3.tgz", "dependencies": { "argparse": { "version": "0.1.15", - "from": "https://registry.npmjs.org/argparse/-/argparse-0.1.15.tgz", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-0.1.15.tgz", "dependencies": { "underscore": { - "version": "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" + "version": "1.4.4" }, "underscore.string": { - "version": "2.3.3", - "from": "https://registry.npmjs.org/underscore.string/-/underscore.string-2.3.3.tgz", - "resolved": "https://registry.npmjs.org/underscore.string/-/underscore.string-2.3.3.tgz" + "version": "2.3.3" } } }, "esprima": { - "version": "1.0.4", - "from": "https://registry.npmjs.org/esprima/-/esprima-1.0.4.tgz", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-1.0.4.tgz" + "version": "1.0.4" } } } @@ -699,112 +452,72 @@ } }, "which": { - "version": "1.0.5", - "from": "https://registry.npmjs.org/which/-/which-1.0.5.tgz", - "resolved": "https://registry.npmjs.org/which/-/which-1.0.5.tgz" + "version": "1.0.5" }, "p-throttler": { - "version": "0.0.1", - "from": "https://registry.npmjs.org/p-throttler/-/p-throttler-0.0.1.tgz", - "resolved": "https://registry.npmjs.org/p-throttler/-/p-throttler-0.0.1.tgz" + "version": "0.0.1" } } }, "browserstacktunnel-wrapper": { - "version": "1.1.2", - "from": "https://registry.npmjs.org/browserstacktunnel-wrapper/-/browserstacktunnel-wrapper-1.1.2.tgz", - "resolved": "https://registry.npmjs.org/browserstacktunnel-wrapper/-/browserstacktunnel-wrapper-1.1.2.tgz" + "version": "1.1.2" }, "canonical-path": { - "version": "0.0.2", - "from": "https://registry.npmjs.org/canonical-path/-/canonical-path-0.0.2.tgz", - "resolved": "https://registry.npmjs.org/canonical-path/-/canonical-path-0.0.2.tgz" + "version": "0.0.2" }, "dgeni": { "version": "0.2.2", - "from": "https://registry.npmjs.org/dgeni/-/dgeni-0.2.2.tgz", - "resolved": "https://registry.npmjs.org/dgeni/-/dgeni-0.2.2.tgz", "dependencies": { "rimraf": { - "version": "2.2.6", - "from": "https://registry.npmjs.org/rimraf/-/rimraf-2.2.6.tgz", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.2.6.tgz" + "version": "2.2.6" }, "optimist": { "version": "0.6.1", - "from": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz", - "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz", "dependencies": { "wordwrap": { - "version": "0.0.2", - "from": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz", - "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz" + "version": "0.0.2" }, "minimist": { - "version": "0.0.8", - "from": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz" + "version": "0.0.8" } } }, "lodash": { - "version": "2.4.1", - "from": "https://registry.npmjs.org/lodash/-/lodash-2.4.1.tgz", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-2.4.1.tgz" + "version": "2.4.1" }, "dependency-graph": { "version": "0.1.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": "https://registry.npmjs.org/underscore/-/underscore-1.4.4.tgz", - "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.4.4.tgz" + "version": "1.4.4" } } }, "q": { - "version": "0.9.7", - "from": "https://registry.npmjs.org/q/-/q-0.9.7.tgz", - "resolved": "https://registry.npmjs.org/q/-/q-0.9.7.tgz" + "version": "0.9.7" }, "di": { - "version": "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" + "version": "0.0.1" }, "marked": { - "version": "0.2.10", - "from": "https://registry.npmjs.org/marked/-/marked-0.2.10.tgz", - "resolved": "https://registry.npmjs.org/marked/-/marked-0.2.10.tgz" + "version": "0.2.10" }, "glob": { "version": "3.2.9", - "from": "https://registry.npmjs.org/glob/-/glob-3.2.9.tgz", - "resolved": "https://registry.npmjs.org/glob/-/glob-3.2.9.tgz", "dependencies": { "minimatch": { "version": "0.2.14", - "from": "https://registry.npmjs.org/minimatch/-/minimatch-0.2.14.tgz", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-0.2.14.tgz", "dependencies": { "lru-cache": { - "version": "2.5.0", - "from": "https://registry.npmjs.org/lru-cache/-/lru-cache-2.5.0.tgz", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-2.5.0.tgz" + "version": "2.5.0" }, "sigmund": { - "version": "1.0.0", - "from": "https://registry.npmjs.org/sigmund/-/sigmund-1.0.0.tgz", - "resolved": "https://registry.npmjs.org/sigmund/-/sigmund-1.0.0.tgz" + "version": "1.0.0" } } }, "inherits": { - "version": "2.0.1", - "from": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz" + "version": "2.0.1" } } } @@ -812,482 +525,318 @@ }, "dgeni-packages": { "version": "0.7.1", - "from": "dgeni-packages@0.7.1", "dependencies": { "lodash": { - "version": "2.4.1", - "from": "lodash@~2.4.1" + "version": "2.4.1" }, "graceful-fs": { - "version": "2.0.2", - "from": "graceful-fs@~2.0.1" + "version": "2.0.2" }, "glob": { "version": "3.2.9", - "from": "glob@~3.2.8", "dependencies": { "minimatch": { "version": "0.2.14", - "from": "minimatch@~0.2.11", "dependencies": { "lru-cache": { - "version": "2.5.0", - "from": "lru-cache@2" + "version": "2.5.0" }, "sigmund": { - "version": "1.0.0", - "from": "sigmund@~1.0.0" + "version": "1.0.0" } } }, "inherits": { - "version": "2.0.1", - "from": "inherits@2" + "version": "2.0.1" } } }, "nunjucks": { "version": "1.0.1", - "from": "nunjucks@~1.0.1", "dependencies": { "optimist": { "version": "0.6.1", - "from": "optimist@*", "dependencies": { "wordwrap": { - "version": "0.0.2", - "from": "wordwrap@~0.0.2" + "version": "0.0.2" }, "minimist": { - "version": "0.0.8", - "from": "minimist@~0.0.1" + "version": "0.0.8" } } } } }, "catharsis": { - "version": "0.7.0", - "from": "catharsis@^0.7.0" + "version": "0.7.0" }, "esprima": { - "version": "1.0.4", - "from": "esprima@^1.0.4" + "version": "1.0.4" } } }, "event-stream": { "version": "3.1.0", - "from": "https://registry.npmjs.org/event-stream/-/event-stream-3.1.0.tgz", - "resolved": "https://registry.npmjs.org/event-stream/-/event-stream-3.1.0.tgz", "dependencies": { "through": { - "version": "2.3.4", - "from": "https://registry.npmjs.org/through/-/through-2.3.4.tgz", - "resolved": "https://registry.npmjs.org/through/-/through-2.3.4.tgz" + "version": "2.3.4" }, "duplexer": { - "version": "0.1.1", - "from": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.1.tgz", - "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.1.tgz" + "version": "0.1.1" }, "from": { - "version": "0.1.3", - "from": "https://registry.npmjs.org/from/-/from-0.1.3.tgz", - "resolved": "https://registry.npmjs.org/from/-/from-0.1.3.tgz" + "version": "0.1.3" }, "map-stream": { - "version": "0.1.0", - "from": "https://registry.npmjs.org/map-stream/-/map-stream-0.1.0.tgz", - "resolved": "https://registry.npmjs.org/map-stream/-/map-stream-0.1.0.tgz" + "version": "0.1.0" }, "pause-stream": { - "version": "0.0.11", - "from": "https://registry.npmjs.org/pause-stream/-/pause-stream-0.0.11.tgz", - "resolved": "https://registry.npmjs.org/pause-stream/-/pause-stream-0.0.11.tgz" + "version": "0.0.11" }, "split": { - "version": "0.2.10", - "from": "https://registry.npmjs.org/split/-/split-0.2.10.tgz", - "resolved": "https://registry.npmjs.org/split/-/split-0.2.10.tgz" + "version": "0.2.10" }, "stream-combiner": { - "version": "0.0.4", - "from": "https://registry.npmjs.org/stream-combiner/-/stream-combiner-0.0.4.tgz", - "resolved": "https://registry.npmjs.org/stream-combiner/-/stream-combiner-0.0.4.tgz" + "version": "0.0.4" } } }, "grunt": { "version": "0.4.2", - "from": "https://registry.npmjs.org/grunt/-/grunt-0.4.2.tgz", - "resolved": "https://registry.npmjs.org/grunt/-/grunt-0.4.2.tgz", "dependencies": { "async": { - "version": "0.1.22", - "from": "https://registry.npmjs.org/async/-/async-0.1.22.tgz", - "resolved": "https://registry.npmjs.org/async/-/async-0.1.22.tgz" + "version": "0.1.22" }, "coffee-script": { - "version": "1.3.3", - "from": "https://registry.npmjs.org/coffee-script/-/coffee-script-1.3.3.tgz", - "resolved": "https://registry.npmjs.org/coffee-script/-/coffee-script-1.3.3.tgz" + "version": "1.3.3" }, "colors": { - "version": "0.6.2", - "from": "https://registry.npmjs.org/colors/-/colors-0.6.2.tgz", - "resolved": "https://registry.npmjs.org/colors/-/colors-0.6.2.tgz" + "version": "0.6.2" }, "dateformat": { - "version": "1.0.2-1.2.3", - "from": "https://registry.npmjs.org/dateformat/-/dateformat-1.0.2-1.2.3.tgz", - "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-1.0.2-1.2.3.tgz" + "version": "1.0.2-1.2.3" }, "eventemitter2": { - "version": "0.4.13", - "from": "https://registry.npmjs.org/eventemitter2/-/eventemitter2-0.4.13.tgz", - "resolved": "https://registry.npmjs.org/eventemitter2/-/eventemitter2-0.4.13.tgz" + "version": "0.4.13" }, "findup-sync": { "version": "0.1.2", - "from": "https://registry.npmjs.org/findup-sync/-/findup-sync-0.1.2.tgz", - "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-0.1.2.tgz", "dependencies": { "lodash": { - "version": "1.0.1", - "from": "https://registry.npmjs.org/lodash/-/lodash-1.0.1.tgz", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-1.0.1.tgz" + "version": "1.0.1" } } }, "glob": { "version": "3.1.21", - "from": "https://registry.npmjs.org/glob/-/glob-3.1.21.tgz", - "resolved": "https://registry.npmjs.org/glob/-/glob-3.1.21.tgz", "dependencies": { "graceful-fs": { - "version": "1.2.3", - "from": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-1.2.3.tgz", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-1.2.3.tgz" + "version": "1.2.3" }, "inherits": { - "version": "1.0.0", - "from": "https://registry.npmjs.org/inherits/-/inherits-1.0.0.tgz", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-1.0.0.tgz" + "version": "1.0.0" } } }, "hooker": { - "version": "0.2.3", - "from": "https://registry.npmjs.org/hooker/-/hooker-0.2.3.tgz", - "resolved": "https://registry.npmjs.org/hooker/-/hooker-0.2.3.tgz" + "version": "0.2.3" }, "iconv-lite": { - "version": "0.2.11", - "from": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.2.11.tgz", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.2.11.tgz" + "version": "0.2.11" }, "minimatch": { "version": "0.2.14", - "from": "https://registry.npmjs.org/minimatch/-/minimatch-0.2.14.tgz", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-0.2.14.tgz", "dependencies": { "lru-cache": { - "version": "2.5.0", - "from": "https://registry.npmjs.org/lru-cache/-/lru-cache-2.5.0.tgz", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-2.5.0.tgz" + "version": "2.5.0" }, "sigmund": { - "version": "1.0.0", - "from": "https://registry.npmjs.org/sigmund/-/sigmund-1.0.0.tgz", - "resolved": "https://registry.npmjs.org/sigmund/-/sigmund-1.0.0.tgz" + "version": "1.0.0" } } }, "nopt": { "version": "1.0.10", - "from": "https://registry.npmjs.org/nopt/-/nopt-1.0.10.tgz", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-1.0.10.tgz", "dependencies": { "abbrev": { - "version": "1.0.4", - "from": "https://registry.npmjs.org/abbrev/-/abbrev-1.0.4.tgz", - "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.0.4.tgz" + "version": "1.0.4" } } }, "rimraf": { "version": "2.0.3", - "from": "https://registry.npmjs.org/rimraf/-/rimraf-2.0.3.tgz", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.0.3.tgz", "dependencies": { "graceful-fs": { - "version": "1.1.14", - "from": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-1.1.14.tgz", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-1.1.14.tgz" + "version": "1.1.14" } } }, "lodash": { - "version": "0.9.2", - "from": "https://registry.npmjs.org/lodash/-/lodash-0.9.2.tgz", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-0.9.2.tgz" + "version": "0.9.2" }, "underscore.string": { - "version": "2.2.1", - "from": "https://registry.npmjs.org/underscore.string/-/underscore.string-2.2.1.tgz", - "resolved": "https://registry.npmjs.org/underscore.string/-/underscore.string-2.2.1.tgz" + "version": "2.2.1" }, "which": { - "version": "1.0.5", - "from": "https://registry.npmjs.org/which/-/which-1.0.5.tgz", - "resolved": "https://registry.npmjs.org/which/-/which-1.0.5.tgz" + "version": "1.0.5" }, "js-yaml": { "version": "2.0.5", - "from": "https://registry.npmjs.org/js-yaml/-/js-yaml-2.0.5.tgz", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-2.0.5.tgz", "dependencies": { "argparse": { "version": "0.1.15", - "from": "https://registry.npmjs.org/argparse/-/argparse-0.1.15.tgz", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-0.1.15.tgz", "dependencies": { "underscore": { - "version": "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" + "version": "1.4.4" }, "underscore.string": { - "version": "2.3.3", - "from": "https://registry.npmjs.org/underscore.string/-/underscore.string-2.3.3.tgz", - "resolved": "https://registry.npmjs.org/underscore.string/-/underscore.string-2.3.3.tgz" + "version": "2.3.3" } } }, "esprima": { - "version": "1.0.4", - "from": "https://registry.npmjs.org/esprima/-/esprima-1.0.4.tgz", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-1.0.4.tgz" + "version": "1.0.4" } } }, "exit": { - "version": "0.1.2", - "from": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", - "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz" + "version": "0.1.2" }, "getobject": { - "version": "0.1.0", - "from": "https://registry.npmjs.org/getobject/-/getobject-0.1.0.tgz", - "resolved": "https://registry.npmjs.org/getobject/-/getobject-0.1.0.tgz" + "version": "0.1.0" } } }, "grunt-bump": { "version": "0.0.13", - "from": "https://registry.npmjs.org/grunt-bump/-/grunt-bump-0.0.13.tgz", - "resolved": "https://registry.npmjs.org/grunt-bump/-/grunt-bump-0.0.13.tgz", "dependencies": { "semver": { - "version": "1.1.4", - "from": "https://registry.npmjs.org/semver/-/semver-1.1.4.tgz", - "resolved": "https://registry.npmjs.org/semver/-/semver-1.1.4.tgz" + "version": "1.1.4" } } }, "grunt-contrib-clean": { "version": "0.5.0", - "from": "https://registry.npmjs.org/grunt-contrib-clean/-/grunt-contrib-clean-0.5.0.tgz", - "resolved": "https://registry.npmjs.org/grunt-contrib-clean/-/grunt-contrib-clean-0.5.0.tgz", "dependencies": { "rimraf": { - "version": "2.2.6", - "from": "https://registry.npmjs.org/rimraf/-/rimraf-2.2.6.tgz", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.2.6.tgz" + "version": "2.2.6" } } }, "grunt-contrib-compress": { "version": "0.5.3", - "from": "https://registry.npmjs.org/grunt-contrib-compress/-/grunt-contrib-compress-0.5.3.tgz", - "resolved": "https://registry.npmjs.org/grunt-contrib-compress/-/grunt-contrib-compress-0.5.3.tgz", "dependencies": { "archiver": { "version": "0.4.10", - "from": "https://registry.npmjs.org/archiver/-/archiver-0.4.10.tgz", - "resolved": "https://registry.npmjs.org/archiver/-/archiver-0.4.10.tgz", "dependencies": { "readable-stream": { "version": "1.0.26", - "from": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.26.tgz", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.26.tgz", "dependencies": { "string_decoder": { - "version": "0.10.25-1", - "from": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.25-1.tgz", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.25-1.tgz" + "version": "0.10.25-1" } } }, "iconv-lite": { - "version": "0.2.11", - "from": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.2.11.tgz", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.2.11.tgz" + "version": "0.2.11" } } }, "lazystream": { "version": "0.1.0", - "from": "https://registry.npmjs.org/lazystream/-/lazystream-0.1.0.tgz", - "resolved": "https://registry.npmjs.org/lazystream/-/lazystream-0.1.0.tgz", "dependencies": { "readable-stream": { "version": "1.0.26", - "from": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.26.tgz", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.26.tgz", "dependencies": { "string_decoder": { - "version": "0.10.25-1", - "from": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.25-1.tgz", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.25-1.tgz" + "version": "0.10.25-1" } } } } }, "prettysize": { - "version": "0.0.3", - "from": "https://registry.npmjs.org/prettysize/-/prettysize-0.0.3.tgz", - "resolved": "https://registry.npmjs.org/prettysize/-/prettysize-0.0.3.tgz" + "version": "0.0.3" } } }, "grunt-contrib-connect": { "version": "0.5.0", - "from": "https://registry.npmjs.org/grunt-contrib-connect/-/grunt-contrib-connect-0.5.0.tgz", - "resolved": "https://registry.npmjs.org/grunt-contrib-connect/-/grunt-contrib-connect-0.5.0.tgz", "dependencies": { "connect": { "version": "2.7.11", - "from": "https://registry.npmjs.org/connect/-/connect-2.7.11.tgz", - "resolved": "https://registry.npmjs.org/connect/-/connect-2.7.11.tgz", "dependencies": { "qs": { - "version": "0.6.5", - "from": "https://registry.npmjs.org/qs/-/qs-0.6.5.tgz", - "resolved": "https://registry.npmjs.org/qs/-/qs-0.6.5.tgz" + "version": "0.6.5" }, "formidable": { - "version": "1.0.14", - "from": "https://registry.npmjs.org/formidable/-/formidable-1.0.14.tgz", - "resolved": "https://registry.npmjs.org/formidable/-/formidable-1.0.14.tgz" + "version": "1.0.14" }, "cookie-signature": { - "version": "1.0.1", - "from": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.1.tgz", - "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.1.tgz" + "version": "1.0.1" }, "buffer-crc32": { - "version": "0.2.1", - "from": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.1.tgz", - "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.1.tgz" + "version": "0.2.1" }, "cookie": { - "version": "0.0.5", - "from": "https://registry.npmjs.org/cookie/-/cookie-0.0.5.tgz", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.0.5.tgz" + "version": "0.0.5" }, "send": { "version": "0.1.1", - "from": "https://registry.npmjs.org/send/-/send-0.1.1.tgz", - "resolved": "https://registry.npmjs.org/send/-/send-0.1.1.tgz", "dependencies": { "mime": { - "version": "1.2.11", - "from": "https://registry.npmjs.org/mime/-/mime-1.2.11.tgz", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.2.11.tgz" + "version": "1.2.11" }, "range-parser": { - "version": "0.0.4", - "from": "https://registry.npmjs.org/range-parser/-/range-parser-0.0.4.tgz", - "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-0.0.4.tgz" + "version": "0.0.4" } } }, "bytes": { - "version": "0.2.0", - "from": "https://registry.npmjs.org/bytes/-/bytes-0.2.0.tgz", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-0.2.0.tgz" + "version": "0.2.0" }, "fresh": { - "version": "0.1.0", - "from": "https://registry.npmjs.org/fresh/-/fresh-0.1.0.tgz", - "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.1.0.tgz" + "version": "0.1.0" }, "pause": { - "version": "0.0.1", - "from": "https://registry.npmjs.org/pause/-/pause-0.0.1.tgz", - "resolved": "https://registry.npmjs.org/pause/-/pause-0.0.1.tgz" + "version": "0.0.1" }, "debug": { - "version": "0.7.4", - "from": "https://registry.npmjs.org/debug/-/debug-0.7.4.tgz", - "resolved": "https://registry.npmjs.org/debug/-/debug-0.7.4.tgz" + "version": "0.7.4" } } }, "connect-livereload": { - "version": "0.2.0", - "from": "https://registry.npmjs.org/connect-livereload/-/connect-livereload-0.2.0.tgz", - "resolved": "https://registry.npmjs.org/connect-livereload/-/connect-livereload-0.2.0.tgz" + "version": "0.2.0" }, "open": { - "version": "0.0.4", - "from": "https://registry.npmjs.org/open/-/open-0.0.4.tgz", - "resolved": "https://registry.npmjs.org/open/-/open-0.0.4.tgz" + "version": "0.0.4" } } }, "grunt-contrib-copy": { - "version": "0.4.1", - "from": "https://registry.npmjs.org/grunt-contrib-copy/-/grunt-contrib-copy-0.4.1.tgz", - "resolved": "https://registry.npmjs.org/grunt-contrib-copy/-/grunt-contrib-copy-0.4.1.tgz" + "version": "0.4.1" }, "grunt-contrib-jshint": { "version": "0.7.2", - "from": "https://registry.npmjs.org/grunt-contrib-jshint/-/grunt-contrib-jshint-0.7.2.tgz", - "resolved": "https://registry.npmjs.org/grunt-contrib-jshint/-/grunt-contrib-jshint-0.7.2.tgz", "dependencies": { "jshint": { "version": "2.3.0", - "from": "https://registry.npmjs.org/jshint/-/jshint-2.3.0.tgz", - "resolved": "https://registry.npmjs.org/jshint/-/jshint-2.3.0.tgz", "dependencies": { "shelljs": { - "version": "0.1.4", - "from": "https://registry.npmjs.org/shelljs/-/shelljs-0.1.4.tgz", - "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.1.4.tgz" + "version": "0.1.4" }, "underscore": { - "version": "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" + "version": "1.4.4" }, "cli": { "version": "0.4.5", - "from": "https://registry.npmjs.org/cli/-/cli-0.4.5.tgz", - "resolved": "https://registry.npmjs.org/cli/-/cli-0.4.5.tgz", "dependencies": { "glob": { "version": "3.2.9", - "from": "https://registry.npmjs.org/glob/-/glob-3.2.9.tgz", - "resolved": "https://registry.npmjs.org/glob/-/glob-3.2.9.tgz", "dependencies": { "inherits": { - "version": "2.0.1", - "from": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz" + "version": "2.0.1" } } } @@ -1295,270 +844,176 @@ }, "minimatch": { "version": "0.2.14", - "from": "https://registry.npmjs.org/minimatch/-/minimatch-0.2.14.tgz", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-0.2.14.tgz", "dependencies": { "lru-cache": { - "version": "2.5.0", - "from": "https://registry.npmjs.org/lru-cache/-/lru-cache-2.5.0.tgz", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-2.5.0.tgz" + "version": "2.5.0" }, "sigmund": { - "version": "1.0.0", - "from": "https://registry.npmjs.org/sigmund/-/sigmund-1.0.0.tgz", - "resolved": "https://registry.npmjs.org/sigmund/-/sigmund-1.0.0.tgz" + "version": "1.0.0" } } }, "console-browserify": { - "version": "0.1.6", - "from": "https://registry.npmjs.org/console-browserify/-/console-browserify-0.1.6.tgz", - "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-0.1.6.tgz" + "version": "0.1.6" } } } } }, "grunt-ddescribe-iit": { - "version": "0.0.4", - "from": "https://registry.npmjs.org/grunt-ddescribe-iit/-/grunt-ddescribe-iit-0.0.4.tgz", - "resolved": "https://registry.npmjs.org/grunt-ddescribe-iit/-/grunt-ddescribe-iit-0.0.4.tgz" + "version": "0.0.4" }, "grunt-jasmine-node": { - "version": "0.1.0", - "from": "grunt-jasmine-node@git://github.com/vojtajina/grunt-jasmine-node.git#ced17cbe52c1412b2ada53160432a5b681f37cd7", - "resolved": "git://github.com/vojtajina/grunt-jasmine-node.git#ced17cbe52c1412b2ada53160432a5b681f37cd7" + "version": "0.1.0" }, "grunt-jscs-checker": { "version": "0.4.0", - "from": "https://registry.npmjs.org/grunt-jscs-checker/-/grunt-jscs-checker-0.4.0.tgz", - "resolved": "https://registry.npmjs.org/grunt-jscs-checker/-/grunt-jscs-checker-0.4.0.tgz", "dependencies": { "hooker": { - "version": "0.2.3", - "from": "https://registry.npmjs.org/hooker/-/hooker-0.2.3.tgz", - "resolved": "https://registry.npmjs.org/hooker/-/hooker-0.2.3.tgz" + "version": "0.2.3" }, "jscs": { "version": "1.3.0", - "from": "https://registry.npmjs.org/jscs/-/jscs-1.3.0.tgz", - "resolved": "https://registry.npmjs.org/jscs/-/jscs-1.3.0.tgz", "dependencies": { "esprima": { - "version": "1.0.3", - "from": "https://registry.npmjs.org/esprima/-/esprima-1.0.3.tgz", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-1.0.3.tgz" + "version": "1.0.3" }, "vow": { - "version": "0.3.9", - "from": "https://registry.npmjs.org/vow/-/vow-0.3.9.tgz", - "resolved": "https://registry.npmjs.org/vow/-/vow-0.3.9.tgz" + "version": "0.3.9" }, "vow-fs": { "version": "0.2.3", - "from": "https://registry.npmjs.org/vow-fs/-/vow-fs-0.2.3.tgz", - "resolved": "https://registry.npmjs.org/vow-fs/-/vow-fs-0.2.3.tgz", "dependencies": { "node-uuid": { - "version": "1.4.0", - "from": "https://registry.npmjs.org/node-uuid/-/node-uuid-1.4.0.tgz", - "resolved": "https://registry.npmjs.org/node-uuid/-/node-uuid-1.4.0.tgz" + "version": "1.4.0" }, "vow-queue": { - "version": "0.0.2", - "from": "https://registry.npmjs.org/vow-queue/-/vow-queue-0.0.2.tgz", - "resolved": "https://registry.npmjs.org/vow-queue/-/vow-queue-0.0.2.tgz" + "version": "0.0.2" } } }, "colors": { - "version": "0.6.0-1", - "from": "https://registry.npmjs.org/colors/-/colors-0.6.0-1.tgz", - "resolved": "https://registry.npmjs.org/colors/-/colors-0.6.0-1.tgz" + "version": "0.6.0-1" }, "commander": { "version": "1.2.0", - "from": "https://registry.npmjs.org/commander/-/commander-1.2.0.tgz", - "resolved": "https://registry.npmjs.org/commander/-/commander-1.2.0.tgz", "dependencies": { "keypress": { - "version": "0.1.0", - "from": "https://registry.npmjs.org/keypress/-/keypress-0.1.0.tgz", - "resolved": "https://registry.npmjs.org/keypress/-/keypress-0.1.0.tgz" + "version": "0.1.0" } } }, "minimatch": { "version": "0.2.12", - "from": "https://registry.npmjs.org/minimatch/-/minimatch-0.2.12.tgz", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-0.2.12.tgz", "dependencies": { "lru-cache": { - "version": "2.5.0", - "from": "https://registry.npmjs.org/lru-cache/-/lru-cache-2.5.0.tgz", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-2.5.0.tgz" + "version": "2.5.0" }, "sigmund": { - "version": "1.0.0", - "from": "https://registry.npmjs.org/sigmund/-/sigmund-1.0.0.tgz", - "resolved": "https://registry.npmjs.org/sigmund/-/sigmund-1.0.0.tgz" + "version": "1.0.0" } } }, "glob": { "version": "3.2.7", - "from": "https://registry.npmjs.org/glob/-/glob-3.2.7.tgz", - "resolved": "https://registry.npmjs.org/glob/-/glob-3.2.7.tgz", "dependencies": { "inherits": { - "version": "2.0.1", - "from": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz" + "version": "2.0.1" } } }, "xmlbuilder": { "version": "1.1.2", - "from": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-1.1.2.tgz", - "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-1.1.2.tgz", "dependencies": { "underscore": { - "version": "1.6.0", - "from": "https://registry.npmjs.org/underscore/-/underscore-1.6.0.tgz", - "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.6.0.tgz" + "version": "1.6.0" } } }, "strip-json-comments": { - "version": "0.1.1", - "from": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-0.1.1.tgz", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-0.1.1.tgz" + "version": "0.1.1" } } }, "lodash.assign": { "version": "2.4.1", - "from": "https://registry.npmjs.org/lodash.assign/-/lodash.assign-2.4.1.tgz", - "resolved": "https://registry.npmjs.org/lodash.assign/-/lodash.assign-2.4.1.tgz", "dependencies": { "lodash._basecreatecallback": { "version": "2.4.1", - "from": "https://registry.npmjs.org/lodash._basecreatecallback/-/lodash._basecreatecallback-2.4.1.tgz", - "resolved": "https://registry.npmjs.org/lodash._basecreatecallback/-/lodash._basecreatecallback-2.4.1.tgz", "dependencies": { "lodash.bind": { "version": "2.4.1", - "from": "https://registry.npmjs.org/lodash.bind/-/lodash.bind-2.4.1.tgz", - "resolved": "https://registry.npmjs.org/lodash.bind/-/lodash.bind-2.4.1.tgz", "dependencies": { "lodash._createwrapper": { "version": "2.4.1", - "from": "https://registry.npmjs.org/lodash._createwrapper/-/lodash._createwrapper-2.4.1.tgz", - "resolved": "https://registry.npmjs.org/lodash._createwrapper/-/lodash._createwrapper-2.4.1.tgz", "dependencies": { "lodash._basebind": { "version": "2.4.1", - "from": "https://registry.npmjs.org/lodash._basebind/-/lodash._basebind-2.4.1.tgz", - "resolved": "https://registry.npmjs.org/lodash._basebind/-/lodash._basebind-2.4.1.tgz", "dependencies": { "lodash._basecreate": { "version": "2.4.1", - "from": "https://registry.npmjs.org/lodash._basecreate/-/lodash._basecreate-2.4.1.tgz", - "resolved": "https://registry.npmjs.org/lodash._basecreate/-/lodash._basecreate-2.4.1.tgz", "dependencies": { "lodash._isnative": { - "version": "2.4.1", - "from": "https://registry.npmjs.org/lodash._isnative/-/lodash._isnative-2.4.1.tgz", - "resolved": "https://registry.npmjs.org/lodash._isnative/-/lodash._isnative-2.4.1.tgz" + "version": "2.4.1" }, "lodash.noop": { - "version": "2.4.1", - "from": "https://registry.npmjs.org/lodash.noop/-/lodash.noop-2.4.1.tgz", - "resolved": "https://registry.npmjs.org/lodash.noop/-/lodash.noop-2.4.1.tgz" + "version": "2.4.1" } } }, "lodash.isobject": { - "version": "2.4.1", - "from": "https://registry.npmjs.org/lodash.isobject/-/lodash.isobject-2.4.1.tgz", - "resolved": "https://registry.npmjs.org/lodash.isobject/-/lodash.isobject-2.4.1.tgz" + "version": "2.4.1" } } }, "lodash._basecreatewrapper": { "version": "2.4.1", - "from": "https://registry.npmjs.org/lodash._basecreatewrapper/-/lodash._basecreatewrapper-2.4.1.tgz", - "resolved": "https://registry.npmjs.org/lodash._basecreatewrapper/-/lodash._basecreatewrapper-2.4.1.tgz", "dependencies": { "lodash._basecreate": { "version": "2.4.1", - "from": "https://registry.npmjs.org/lodash._basecreate/-/lodash._basecreate-2.4.1.tgz", - "resolved": "https://registry.npmjs.org/lodash._basecreate/-/lodash._basecreate-2.4.1.tgz", "dependencies": { "lodash._isnative": { - "version": "2.4.1", - "from": "https://registry.npmjs.org/lodash._isnative/-/lodash._isnative-2.4.1.tgz", - "resolved": "https://registry.npmjs.org/lodash._isnative/-/lodash._isnative-2.4.1.tgz" + "version": "2.4.1" }, "lodash.noop": { - "version": "2.4.1", - "from": "https://registry.npmjs.org/lodash.noop/-/lodash.noop-2.4.1.tgz", - "resolved": "https://registry.npmjs.org/lodash.noop/-/lodash.noop-2.4.1.tgz" + "version": "2.4.1" } } }, "lodash.isobject": { - "version": "2.4.1", - "from": "https://registry.npmjs.org/lodash.isobject/-/lodash.isobject-2.4.1.tgz", - "resolved": "https://registry.npmjs.org/lodash.isobject/-/lodash.isobject-2.4.1.tgz" + "version": "2.4.1" } } }, "lodash.isfunction": { - "version": "2.4.1", - "from": "https://registry.npmjs.org/lodash.isfunction/-/lodash.isfunction-2.4.1.tgz", - "resolved": "https://registry.npmjs.org/lodash.isfunction/-/lodash.isfunction-2.4.1.tgz" + "version": "2.4.1" } } }, "lodash._slice": { - "version": "2.4.1", - "from": "https://registry.npmjs.org/lodash._slice/-/lodash._slice-2.4.1.tgz", - "resolved": "https://registry.npmjs.org/lodash._slice/-/lodash._slice-2.4.1.tgz" + "version": "2.4.1" } } }, "lodash.identity": { - "version": "2.4.1", - "from": "https://registry.npmjs.org/lodash.identity/-/lodash.identity-2.4.1.tgz", - "resolved": "https://registry.npmjs.org/lodash.identity/-/lodash.identity-2.4.1.tgz" + "version": "2.4.1" }, "lodash._setbinddata": { "version": "2.4.1", - "from": "https://registry.npmjs.org/lodash._setbinddata/-/lodash._setbinddata-2.4.1.tgz", - "resolved": "https://registry.npmjs.org/lodash._setbinddata/-/lodash._setbinddata-2.4.1.tgz", "dependencies": { "lodash._isnative": { - "version": "2.4.1", - "from": "https://registry.npmjs.org/lodash._isnative/-/lodash._isnative-2.4.1.tgz", - "resolved": "https://registry.npmjs.org/lodash._isnative/-/lodash._isnative-2.4.1.tgz" + "version": "2.4.1" }, "lodash.noop": { - "version": "2.4.1", - "from": "https://registry.npmjs.org/lodash.noop/-/lodash.noop-2.4.1.tgz", - "resolved": "https://registry.npmjs.org/lodash.noop/-/lodash.noop-2.4.1.tgz" + "version": "2.4.1" } } }, "lodash.support": { "version": "2.4.1", - "from": "https://registry.npmjs.org/lodash.support/-/lodash.support-2.4.1.tgz", - "resolved": "https://registry.npmjs.org/lodash.support/-/lodash.support-2.4.1.tgz", "dependencies": { "lodash._isnative": { - "version": "2.4.1", - "from": "https://registry.npmjs.org/lodash._isnative/-/lodash._isnative-2.4.1.tgz", - "resolved": "https://registry.npmjs.org/lodash._isnative/-/lodash._isnative-2.4.1.tgz" + "version": "2.4.1" } } } @@ -1566,488 +1021,318 @@ }, "lodash.keys": { "version": "2.4.1", - "from": "https://registry.npmjs.org/lodash.keys/-/lodash.keys-2.4.1.tgz", - "resolved": "https://registry.npmjs.org/lodash.keys/-/lodash.keys-2.4.1.tgz", "dependencies": { "lodash._isnative": { - "version": "2.4.1", - "from": "https://registry.npmjs.org/lodash._isnative/-/lodash._isnative-2.4.1.tgz", - "resolved": "https://registry.npmjs.org/lodash._isnative/-/lodash._isnative-2.4.1.tgz" + "version": "2.4.1" }, "lodash.isobject": { - "version": "2.4.1", - "from": "https://registry.npmjs.org/lodash.isobject/-/lodash.isobject-2.4.1.tgz", - "resolved": "https://registry.npmjs.org/lodash.isobject/-/lodash.isobject-2.4.1.tgz" + "version": "2.4.1" }, "lodash._shimkeys": { - "version": "2.4.1", - "from": "https://registry.npmjs.org/lodash._shimkeys/-/lodash._shimkeys-2.4.1.tgz", - "resolved": "https://registry.npmjs.org/lodash._shimkeys/-/lodash._shimkeys-2.4.1.tgz" + "version": "2.4.1" } } }, "lodash._objecttypes": { - "version": "2.4.1", - "from": "https://registry.npmjs.org/lodash._objecttypes/-/lodash._objecttypes-2.4.1.tgz", - "resolved": "https://registry.npmjs.org/lodash._objecttypes/-/lodash._objecttypes-2.4.1.tgz" + "version": "2.4.1" } } }, "vow": { - "version": "0.4.1", - "from": "https://registry.npmjs.org/vow/-/vow-0.4.1.tgz", - "resolved": "https://registry.npmjs.org/vow/-/vow-0.4.1.tgz" + "version": "0.4.1" } } }, "grunt-merge-conflict": { - "version": "0.0.2", - "from": "https://registry.npmjs.org/grunt-merge-conflict/-/grunt-merge-conflict-0.0.2.tgz", - "resolved": "https://registry.npmjs.org/grunt-merge-conflict/-/grunt-merge-conflict-0.0.2.tgz" + "version": "0.0.2" }, "grunt-parallel": { "version": "0.3.1", - "from": "https://registry.npmjs.org/grunt-parallel/-/grunt-parallel-0.3.1.tgz", - "resolved": "https://registry.npmjs.org/grunt-parallel/-/grunt-parallel-0.3.1.tgz", "dependencies": { "q": { - "version": "0.8.12", - "from": "https://registry.npmjs.org/q/-/q-0.8.12.tgz", - "resolved": "https://registry.npmjs.org/q/-/q-0.8.12.tgz" + "version": "0.8.12" }, "lpad": { - "version": "0.1.0", - "from": "https://registry.npmjs.org/lpad/-/lpad-0.1.0.tgz", - "resolved": "https://registry.npmjs.org/lpad/-/lpad-0.1.0.tgz" + "version": "0.1.0" } } }, "grunt-shell": { "version": "0.4.0", - "from": "https://registry.npmjs.org/grunt-shell/-/grunt-shell-0.4.0.tgz", - "resolved": "https://registry.npmjs.org/grunt-shell/-/grunt-shell-0.4.0.tgz", "dependencies": { "stripcolorcodes": { - "version": "0.1.0", - "from": "https://registry.npmjs.org/stripcolorcodes/-/stripcolorcodes-0.1.0.tgz", - "resolved": "https://registry.npmjs.org/stripcolorcodes/-/stripcolorcodes-0.1.0.tgz" + "version": "0.1.0" } } }, "gulp": { "version": "3.4.0", - "from": "https://registry.npmjs.org/gulp/-/gulp-3.4.0.tgz", - "resolved": "https://registry.npmjs.org/gulp/-/gulp-3.4.0.tgz", "dependencies": { "optimist": { "version": "0.6.1", - "from": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz", - "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz", "dependencies": { "wordwrap": { - "version": "0.0.2", - "from": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz", - "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz" + "version": "0.0.2" }, "minimist": { - "version": "0.0.8", - "from": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz" + "version": "0.0.8" } } }, "gulp-util": { "version": "2.2.14", - "from": "https://registry.npmjs.org/gulp-util/-/gulp-util-2.2.14.tgz", - "resolved": "https://registry.npmjs.org/gulp-util/-/gulp-util-2.2.14.tgz", "dependencies": { "chalk": { "version": "0.4.0", - "from": "https://registry.npmjs.org/chalk/-/chalk-0.4.0.tgz", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-0.4.0.tgz", "dependencies": { "has-color": { - "version": "0.1.4", - "from": "https://registry.npmjs.org/has-color/-/has-color-0.1.4.tgz", - "resolved": "https://registry.npmjs.org/has-color/-/has-color-0.1.4.tgz" + "version": "0.1.4" }, "ansi-styles": { - "version": "1.0.0", - "from": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-1.0.0.tgz", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-1.0.0.tgz" + "version": "1.0.0" }, "strip-ansi": { - "version": "0.1.1", - "from": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-0.1.1.tgz", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-0.1.1.tgz" + "version": "0.1.1" } } }, "lodash.template": { "version": "2.4.1", - "from": "https://registry.npmjs.org/lodash.template/-/lodash.template-2.4.1.tgz", - "resolved": "https://registry.npmjs.org/lodash.template/-/lodash.template-2.4.1.tgz", "dependencies": { "lodash.defaults": { "version": "2.4.1", - "from": "https://registry.npmjs.org/lodash.defaults/-/lodash.defaults-2.4.1.tgz", - "resolved": "https://registry.npmjs.org/lodash.defaults/-/lodash.defaults-2.4.1.tgz", "dependencies": { "lodash._objecttypes": { - "version": "2.4.1", - "from": "https://registry.npmjs.org/lodash._objecttypes/-/lodash._objecttypes-2.4.1.tgz", - "resolved": "https://registry.npmjs.org/lodash._objecttypes/-/lodash._objecttypes-2.4.1.tgz" + "version": "2.4.1" } } }, "lodash.escape": { "version": "2.4.1", - "from": "https://registry.npmjs.org/lodash.escape/-/lodash.escape-2.4.1.tgz", - "resolved": "https://registry.npmjs.org/lodash.escape/-/lodash.escape-2.4.1.tgz", "dependencies": { "lodash._escapehtmlchar": { "version": "2.4.1", - "from": "https://registry.npmjs.org/lodash._escapehtmlchar/-/lodash._escapehtmlchar-2.4.1.tgz", - "resolved": "https://registry.npmjs.org/lodash._escapehtmlchar/-/lodash._escapehtmlchar-2.4.1.tgz", "dependencies": { "lodash._htmlescapes": { - "version": "2.4.1", - "from": "https://registry.npmjs.org/lodash._htmlescapes/-/lodash._htmlescapes-2.4.1.tgz", - "resolved": "https://registry.npmjs.org/lodash._htmlescapes/-/lodash._htmlescapes-2.4.1.tgz" + "version": "2.4.1" } } }, "lodash._reunescapedhtml": { "version": "2.4.1", - "from": "https://registry.npmjs.org/lodash._reunescapedhtml/-/lodash._reunescapedhtml-2.4.1.tgz", - "resolved": "https://registry.npmjs.org/lodash._reunescapedhtml/-/lodash._reunescapedhtml-2.4.1.tgz", "dependencies": { "lodash._htmlescapes": { - "version": "2.4.1", - "from": "https://registry.npmjs.org/lodash._htmlescapes/-/lodash._htmlescapes-2.4.1.tgz", - "resolved": "https://registry.npmjs.org/lodash._htmlescapes/-/lodash._htmlescapes-2.4.1.tgz" + "version": "2.4.1" } } } } }, "lodash._escapestringchar": { - "version": "2.4.1", - "from": "https://registry.npmjs.org/lodash._escapestringchar/-/lodash._escapestringchar-2.4.1.tgz", - "resolved": "https://registry.npmjs.org/lodash._escapestringchar/-/lodash._escapestringchar-2.4.1.tgz" + "version": "2.4.1" }, "lodash.keys": { "version": "2.4.1", - "from": "https://registry.npmjs.org/lodash.keys/-/lodash.keys-2.4.1.tgz", - "resolved": "https://registry.npmjs.org/lodash.keys/-/lodash.keys-2.4.1.tgz", "dependencies": { "lodash._isnative": { - "version": "2.4.1", - "from": "https://registry.npmjs.org/lodash._isnative/-/lodash._isnative-2.4.1.tgz", - "resolved": "https://registry.npmjs.org/lodash._isnative/-/lodash._isnative-2.4.1.tgz" + "version": "2.4.1" }, "lodash.isobject": { "version": "2.4.1", - "from": "https://registry.npmjs.org/lodash.isobject/-/lodash.isobject-2.4.1.tgz", - "resolved": "https://registry.npmjs.org/lodash.isobject/-/lodash.isobject-2.4.1.tgz", "dependencies": { "lodash._objecttypes": { - "version": "2.4.1", - "from": "https://registry.npmjs.org/lodash._objecttypes/-/lodash._objecttypes-2.4.1.tgz", - "resolved": "https://registry.npmjs.org/lodash._objecttypes/-/lodash._objecttypes-2.4.1.tgz" + "version": "2.4.1" } } }, "lodash._shimkeys": { "version": "2.4.1", - "from": "https://registry.npmjs.org/lodash._shimkeys/-/lodash._shimkeys-2.4.1.tgz", - "resolved": "https://registry.npmjs.org/lodash._shimkeys/-/lodash._shimkeys-2.4.1.tgz", "dependencies": { "lodash._objecttypes": { - "version": "2.4.1", - "from": "https://registry.npmjs.org/lodash._objecttypes/-/lodash._objecttypes-2.4.1.tgz", - "resolved": "https://registry.npmjs.org/lodash._objecttypes/-/lodash._objecttypes-2.4.1.tgz" + "version": "2.4.1" } } } } }, "lodash.templatesettings": { - "version": "2.4.1", - "from": "https://registry.npmjs.org/lodash.templatesettings/-/lodash.templatesettings-2.4.1.tgz", - "resolved": "https://registry.npmjs.org/lodash.templatesettings/-/lodash.templatesettings-2.4.1.tgz" + "version": "2.4.1" }, "lodash.values": { - "version": "2.4.1", - "from": "https://registry.npmjs.org/lodash.values/-/lodash.values-2.4.1.tgz", - "resolved": "https://registry.npmjs.org/lodash.values/-/lodash.values-2.4.1.tgz" + "version": "2.4.1" } } }, "lodash._reinterpolate": { - "version": "2.4.1", - "from": "https://registry.npmjs.org/lodash._reinterpolate/-/lodash._reinterpolate-2.4.1.tgz", - "resolved": "https://registry.npmjs.org/lodash._reinterpolate/-/lodash._reinterpolate-2.4.1.tgz" + "version": "2.4.1" }, "vinyl": { "version": "0.2.3", - "from": "https://registry.npmjs.org/vinyl/-/vinyl-0.2.3.tgz", - "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-0.2.3.tgz", "dependencies": { "clone-stats": { - "version": "0.0.1", - "from": "https://registry.npmjs.org/clone-stats/-/clone-stats-0.0.1.tgz", - "resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-0.0.1.tgz" + "version": "0.0.1" } } }, "through2": { "version": "0.4.1", - "from": "https://registry.npmjs.org/through2/-/through2-0.4.1.tgz", - "resolved": "https://registry.npmjs.org/through2/-/through2-0.4.1.tgz", "dependencies": { "readable-stream": { "version": "1.0.26", - "from": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.26.tgz", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.26.tgz", "dependencies": { "string_decoder": { - "version": "0.10.25-1", - "from": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.25-1.tgz", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.25-1.tgz" + "version": "0.10.25-1" } } }, "xtend": { "version": "2.1.2", - "from": "https://registry.npmjs.org/xtend/-/xtend-2.1.2.tgz", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-2.1.2.tgz", "dependencies": { "object-keys": { - "version": "0.4.0", - "from": "https://registry.npmjs.org/object-keys/-/object-keys-0.4.0.tgz", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-0.4.0.tgz" + "version": "0.4.0" } } } } }, "dateformat": { - "version": "1.0.7-1.2.3", - "from": "https://registry.npmjs.org/dateformat/-/dateformat-1.0.7-1.2.3.tgz", - "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-1.0.7-1.2.3.tgz" + "version": "1.0.7-1.2.3" }, "multipipe": { "version": "0.0.2", - "from": "https://registry.npmjs.org/multipipe/-/multipipe-0.0.2.tgz", - "resolved": "https://registry.npmjs.org/multipipe/-/multipipe-0.0.2.tgz", "dependencies": { "duplexer2": { - "version": "0.0.1", - "from": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.0.1.tgz", - "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.0.1.tgz" + "version": "0.0.1" } } }, "minimist": { - "version": "0.0.8", - "from": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz" + "version": "0.0.8" } } }, "orchestrator": { "version": "0.3.3", - "from": "https://registry.npmjs.org/orchestrator/-/orchestrator-0.3.3.tgz", - "resolved": "https://registry.npmjs.org/orchestrator/-/orchestrator-0.3.3.tgz", "dependencies": { "sequencify": { - "version": "0.0.7", - "from": "https://registry.npmjs.org/sequencify/-/sequencify-0.0.7.tgz", - "resolved": "https://registry.npmjs.org/sequencify/-/sequencify-0.0.7.tgz" + "version": "0.0.7" } } }, "resolve": { - "version": "0.6.1", - "from": "https://registry.npmjs.org/resolve/-/resolve-0.6.1.tgz", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-0.6.1.tgz" + "version": "0.6.1" }, "findup-sync": { "version": "0.1.2", - "from": "https://registry.npmjs.org/findup-sync/-/findup-sync-0.1.2.tgz", - "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-0.1.2.tgz", "dependencies": { "glob": { "version": "3.1.21", - "from": "https://registry.npmjs.org/glob/-/glob-3.1.21.tgz", - "resolved": "https://registry.npmjs.org/glob/-/glob-3.1.21.tgz", "dependencies": { "minimatch": { "version": "0.2.14", - "from": "https://registry.npmjs.org/minimatch/-/minimatch-0.2.14.tgz", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-0.2.14.tgz", "dependencies": { "lru-cache": { - "version": "2.5.0", - "from": "https://registry.npmjs.org/lru-cache/-/lru-cache-2.5.0.tgz", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-2.5.0.tgz" + "version": "2.5.0" }, "sigmund": { - "version": "1.0.0", - "from": "https://registry.npmjs.org/sigmund/-/sigmund-1.0.0.tgz", - "resolved": "https://registry.npmjs.org/sigmund/-/sigmund-1.0.0.tgz" + "version": "1.0.0" } } }, "graceful-fs": { - "version": "1.2.3", - "from": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-1.2.3.tgz", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-1.2.3.tgz" + "version": "1.2.3" }, "inherits": { - "version": "1.0.0", - "from": "https://registry.npmjs.org/inherits/-/inherits-1.0.0.tgz", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-1.0.0.tgz" + "version": "1.0.0" } } }, "lodash": { - "version": "1.0.1", - "from": "https://registry.npmjs.org/lodash/-/lodash-1.0.1.tgz", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-1.0.1.tgz" + "version": "1.0.1" } } }, "pretty-hrtime": { - "version": "0.2.0", - "from": "https://registry.npmjs.org/pretty-hrtime/-/pretty-hrtime-0.2.0.tgz", - "resolved": "https://registry.npmjs.org/pretty-hrtime/-/pretty-hrtime-0.2.0.tgz" + "version": "0.2.0" }, "vinyl-fs": { "version": "0.0.1", - "from": "https://registry.npmjs.org/vinyl-fs/-/vinyl-fs-0.0.1.tgz", - "resolved": "https://registry.npmjs.org/vinyl-fs/-/vinyl-fs-0.0.1.tgz", "dependencies": { "vinyl": { "version": "0.2.3", - "from": "https://registry.npmjs.org/vinyl/-/vinyl-0.2.3.tgz", - "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-0.2.3.tgz", "dependencies": { "clone-stats": { - "version": "0.0.1", - "from": "https://registry.npmjs.org/clone-stats/-/clone-stats-0.0.1.tgz", - "resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-0.0.1.tgz" + "version": "0.0.1" } } }, "glob-stream": { "version": "3.1.9", - "from": "https://registry.npmjs.org/glob-stream/-/glob-stream-3.1.9.tgz", - "resolved": "https://registry.npmjs.org/glob-stream/-/glob-stream-3.1.9.tgz", "dependencies": { "glob": { "version": "3.2.9", - "from": "https://registry.npmjs.org/glob/-/glob-3.2.9.tgz", - "resolved": "https://registry.npmjs.org/glob/-/glob-3.2.9.tgz", "dependencies": { "inherits": { - "version": "2.0.1", - "from": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz" + "version": "2.0.1" } } }, "minimatch": { "version": "0.2.14", - "from": "https://registry.npmjs.org/minimatch/-/minimatch-0.2.14.tgz", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-0.2.14.tgz", "dependencies": { "lru-cache": { - "version": "2.5.0", - "from": "https://registry.npmjs.org/lru-cache/-/lru-cache-2.5.0.tgz", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-2.5.0.tgz" + "version": "2.5.0" }, "sigmund": { - "version": "1.0.0", - "from": "https://registry.npmjs.org/sigmund/-/sigmund-1.0.0.tgz", - "resolved": "https://registry.npmjs.org/sigmund/-/sigmund-1.0.0.tgz" + "version": "1.0.0" } } }, "ordered-read-streams": { - "version": "0.0.7", - "from": "https://registry.npmjs.org/ordered-read-streams/-/ordered-read-streams-0.0.7.tgz", - "resolved": "https://registry.npmjs.org/ordered-read-streams/-/ordered-read-streams-0.0.7.tgz" + "version": "0.0.7" }, "glob2base": { - "version": "0.0.8", - "from": "https://registry.npmjs.org/glob2base/-/glob2base-0.0.8.tgz", - "resolved": "https://registry.npmjs.org/glob2base/-/glob2base-0.0.8.tgz" + "version": "0.0.8" }, "unique-stream": { - "version": "0.0.3", - "from": "https://registry.npmjs.org/unique-stream/-/unique-stream-0.0.3.tgz", - "resolved": "https://registry.npmjs.org/unique-stream/-/unique-stream-0.0.3.tgz" + "version": "0.0.3" }, "through": { - "version": "2.3.4", - "from": "https://registry.npmjs.org/through/-/through-2.3.4.tgz", - "resolved": "https://registry.npmjs.org/through/-/through-2.3.4.tgz" + "version": "2.3.4" } } }, "glob-watcher": { "version": "0.0.3", - "from": "https://registry.npmjs.org/glob-watcher/-/glob-watcher-0.0.3.tgz", - "resolved": "https://registry.npmjs.org/glob-watcher/-/glob-watcher-0.0.3.tgz", "dependencies": { "gaze": { "version": "0.4.3", - "from": "https://registry.npmjs.org/gaze/-/gaze-0.4.3.tgz", - "resolved": "https://registry.npmjs.org/gaze/-/gaze-0.4.3.tgz", "dependencies": { "globule": { "version": "0.1.0", - "from": "https://registry.npmjs.org/globule/-/globule-0.1.0.tgz", - "resolved": "https://registry.npmjs.org/globule/-/globule-0.1.0.tgz", "dependencies": { "lodash": { - "version": "1.0.1", - "from": "https://registry.npmjs.org/lodash/-/lodash-1.0.1.tgz", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-1.0.1.tgz" + "version": "1.0.1" }, "glob": { "version": "3.1.21", - "from": "https://registry.npmjs.org/glob/-/glob-3.1.21.tgz", - "resolved": "https://registry.npmjs.org/glob/-/glob-3.1.21.tgz", "dependencies": { "graceful-fs": { - "version": "1.2.3", - "from": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-1.2.3.tgz", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-1.2.3.tgz" + "version": "1.2.3" }, "inherits": { - "version": "1.0.0", - "from": "https://registry.npmjs.org/inherits/-/inherits-1.0.0.tgz", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-1.0.0.tgz" + "version": "1.0.0" } } }, "minimatch": { "version": "0.2.14", - "from": "https://registry.npmjs.org/minimatch/-/minimatch-0.2.14.tgz", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-0.2.14.tgz", "dependencies": { "lru-cache": { - "version": "2.5.0", - "from": "https://registry.npmjs.org/lru-cache/-/lru-cache-2.5.0.tgz", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-2.5.0.tgz" + "version": "2.5.0" }, "sigmund": { - "version": "1.0.0", - "from": "https://registry.npmjs.org/sigmund/-/sigmund-1.0.0.tgz", - "resolved": "https://registry.npmjs.org/sigmund/-/sigmund-1.0.0.tgz" + "version": "1.0.0" } } } @@ -2058,241 +1343,159 @@ } }, "mkdirp": { - "version": "0.3.5", - "from": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.3.5.tgz", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.3.5.tgz" + "version": "0.3.5" }, "graceful-fs": { - "version": "2.0.2", - "from": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-2.0.2.tgz", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-2.0.2.tgz" + "version": "2.0.2" }, "map-stream": { - "version": "0.1.0", - "from": "https://registry.npmjs.org/map-stream/-/map-stream-0.1.0.tgz", - "resolved": "https://registry.npmjs.org/map-stream/-/map-stream-0.1.0.tgz" + "version": "0.1.0" } } }, "semver": { - "version": "2.2.1", - "from": "https://registry.npmjs.org/semver/-/semver-2.2.1.tgz", - "resolved": "https://registry.npmjs.org/semver/-/semver-2.2.1.tgz" + "version": "2.2.1" }, "archy": { - "version": "0.0.2", - "from": "https://registry.npmjs.org/archy/-/archy-0.0.2.tgz", - "resolved": "https://registry.npmjs.org/archy/-/archy-0.0.2.tgz" + "version": "0.0.2" } } }, "gulp-concat": { "version": "2.1.7", - "from": "https://registry.npmjs.org/gulp-concat/-/gulp-concat-2.1.7.tgz", - "resolved": "https://registry.npmjs.org/gulp-concat/-/gulp-concat-2.1.7.tgz", "dependencies": { "through": { - "version": "2.3.4", - "from": "https://registry.npmjs.org/through/-/through-2.3.4.tgz", - "resolved": "https://registry.npmjs.org/through/-/through-2.3.4.tgz" + "version": "2.3.4" }, "gulp-util": { "version": "2.2.14", - "from": "https://registry.npmjs.org/gulp-util/-/gulp-util-2.2.14.tgz", - "resolved": "https://registry.npmjs.org/gulp-util/-/gulp-util-2.2.14.tgz", "dependencies": { "chalk": { "version": "0.4.0", - "from": "https://registry.npmjs.org/chalk/-/chalk-0.4.0.tgz", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-0.4.0.tgz", "dependencies": { "has-color": { - "version": "0.1.4", - "from": "https://registry.npmjs.org/has-color/-/has-color-0.1.4.tgz", - "resolved": "https://registry.npmjs.org/has-color/-/has-color-0.1.4.tgz" + "version": "0.1.4" }, "ansi-styles": { - "version": "1.0.0", - "from": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-1.0.0.tgz", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-1.0.0.tgz" + "version": "1.0.0" }, "strip-ansi": { - "version": "0.1.1", - "from": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-0.1.1.tgz", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-0.1.1.tgz" + "version": "0.1.1" } } }, "lodash.template": { "version": "2.4.1", - "from": "https://registry.npmjs.org/lodash.template/-/lodash.template-2.4.1.tgz", - "resolved": "https://registry.npmjs.org/lodash.template/-/lodash.template-2.4.1.tgz", "dependencies": { "lodash.defaults": { "version": "2.4.1", - "from": "https://registry.npmjs.org/lodash.defaults/-/lodash.defaults-2.4.1.tgz", - "resolved": "https://registry.npmjs.org/lodash.defaults/-/lodash.defaults-2.4.1.tgz", "dependencies": { "lodash._objecttypes": { - "version": "2.4.1", - "from": "https://registry.npmjs.org/lodash._objecttypes/-/lodash._objecttypes-2.4.1.tgz", - "resolved": "https://registry.npmjs.org/lodash._objecttypes/-/lodash._objecttypes-2.4.1.tgz" + "version": "2.4.1" } } }, "lodash.escape": { "version": "2.4.1", - "from": "https://registry.npmjs.org/lodash.escape/-/lodash.escape-2.4.1.tgz", - "resolved": "https://registry.npmjs.org/lodash.escape/-/lodash.escape-2.4.1.tgz", "dependencies": { "lodash._escapehtmlchar": { "version": "2.4.1", - "from": "https://registry.npmjs.org/lodash._escapehtmlchar/-/lodash._escapehtmlchar-2.4.1.tgz", - "resolved": "https://registry.npmjs.org/lodash._escapehtmlchar/-/lodash._escapehtmlchar-2.4.1.tgz", "dependencies": { "lodash._htmlescapes": { - "version": "2.4.1", - "from": "https://registry.npmjs.org/lodash._htmlescapes/-/lodash._htmlescapes-2.4.1.tgz", - "resolved": "https://registry.npmjs.org/lodash._htmlescapes/-/lodash._htmlescapes-2.4.1.tgz" + "version": "2.4.1" } } }, "lodash._reunescapedhtml": { "version": "2.4.1", - "from": "https://registry.npmjs.org/lodash._reunescapedhtml/-/lodash._reunescapedhtml-2.4.1.tgz", - "resolved": "https://registry.npmjs.org/lodash._reunescapedhtml/-/lodash._reunescapedhtml-2.4.1.tgz", "dependencies": { "lodash._htmlescapes": { - "version": "2.4.1", - "from": "https://registry.npmjs.org/lodash._htmlescapes/-/lodash._htmlescapes-2.4.1.tgz", - "resolved": "https://registry.npmjs.org/lodash._htmlescapes/-/lodash._htmlescapes-2.4.1.tgz" + "version": "2.4.1" } } } } }, "lodash._escapestringchar": { - "version": "2.4.1", - "from": "https://registry.npmjs.org/lodash._escapestringchar/-/lodash._escapestringchar-2.4.1.tgz", - "resolved": "https://registry.npmjs.org/lodash._escapestringchar/-/lodash._escapestringchar-2.4.1.tgz" + "version": "2.4.1" }, "lodash.keys": { "version": "2.4.1", - "from": "https://registry.npmjs.org/lodash.keys/-/lodash.keys-2.4.1.tgz", - "resolved": "https://registry.npmjs.org/lodash.keys/-/lodash.keys-2.4.1.tgz", "dependencies": { "lodash._isnative": { - "version": "2.4.1", - "from": "https://registry.npmjs.org/lodash._isnative/-/lodash._isnative-2.4.1.tgz", - "resolved": "https://registry.npmjs.org/lodash._isnative/-/lodash._isnative-2.4.1.tgz" + "version": "2.4.1" }, "lodash.isobject": { "version": "2.4.1", - "from": "https://registry.npmjs.org/lodash.isobject/-/lodash.isobject-2.4.1.tgz", - "resolved": "https://registry.npmjs.org/lodash.isobject/-/lodash.isobject-2.4.1.tgz", "dependencies": { "lodash._objecttypes": { - "version": "2.4.1", - "from": "https://registry.npmjs.org/lodash._objecttypes/-/lodash._objecttypes-2.4.1.tgz", - "resolved": "https://registry.npmjs.org/lodash._objecttypes/-/lodash._objecttypes-2.4.1.tgz" + "version": "2.4.1" } } }, "lodash._shimkeys": { "version": "2.4.1", - "from": "https://registry.npmjs.org/lodash._shimkeys/-/lodash._shimkeys-2.4.1.tgz", - "resolved": "https://registry.npmjs.org/lodash._shimkeys/-/lodash._shimkeys-2.4.1.tgz", "dependencies": { "lodash._objecttypes": { - "version": "2.4.1", - "from": "https://registry.npmjs.org/lodash._objecttypes/-/lodash._objecttypes-2.4.1.tgz", - "resolved": "https://registry.npmjs.org/lodash._objecttypes/-/lodash._objecttypes-2.4.1.tgz" + "version": "2.4.1" } } } } }, "lodash.templatesettings": { - "version": "2.4.1", - "from": "https://registry.npmjs.org/lodash.templatesettings/-/lodash.templatesettings-2.4.1.tgz", - "resolved": "https://registry.npmjs.org/lodash.templatesettings/-/lodash.templatesettings-2.4.1.tgz" + "version": "2.4.1" }, "lodash.values": { - "version": "2.4.1", - "from": "https://registry.npmjs.org/lodash.values/-/lodash.values-2.4.1.tgz", - "resolved": "https://registry.npmjs.org/lodash.values/-/lodash.values-2.4.1.tgz" + "version": "2.4.1" } } }, "lodash._reinterpolate": { - "version": "2.4.1", - "from": "https://registry.npmjs.org/lodash._reinterpolate/-/lodash._reinterpolate-2.4.1.tgz", - "resolved": "https://registry.npmjs.org/lodash._reinterpolate/-/lodash._reinterpolate-2.4.1.tgz" + "version": "2.4.1" }, "vinyl": { "version": "0.2.3", - "from": "https://registry.npmjs.org/vinyl/-/vinyl-0.2.3.tgz", - "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-0.2.3.tgz", "dependencies": { "clone-stats": { - "version": "0.0.1", - "from": "https://registry.npmjs.org/clone-stats/-/clone-stats-0.0.1.tgz", - "resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-0.0.1.tgz" + "version": "0.0.1" } } }, "through2": { "version": "0.4.1", - "from": "https://registry.npmjs.org/through2/-/through2-0.4.1.tgz", - "resolved": "https://registry.npmjs.org/through2/-/through2-0.4.1.tgz", "dependencies": { "readable-stream": { "version": "1.0.26", - "from": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.26.tgz", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.26.tgz", "dependencies": { "string_decoder": { - "version": "0.10.25-1", - "from": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.25-1.tgz", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.25-1.tgz" + "version": "0.10.25-1" } } }, "xtend": { "version": "2.1.2", - "from": "https://registry.npmjs.org/xtend/-/xtend-2.1.2.tgz", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-2.1.2.tgz", "dependencies": { "object-keys": { - "version": "0.4.0", - "from": "https://registry.npmjs.org/object-keys/-/object-keys-0.4.0.tgz", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-0.4.0.tgz" + "version": "0.4.0" } } } } }, "dateformat": { - "version": "1.0.7-1.2.3", - "from": "https://registry.npmjs.org/dateformat/-/dateformat-1.0.7-1.2.3.tgz", - "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-1.0.7-1.2.3.tgz" + "version": "1.0.7-1.2.3" }, "multipipe": { "version": "0.0.2", - "from": "https://registry.npmjs.org/multipipe/-/multipipe-0.0.2.tgz", - "resolved": "https://registry.npmjs.org/multipipe/-/multipipe-0.0.2.tgz", "dependencies": { "duplexer2": { - "version": "0.0.1", - "from": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.0.1.tgz", - "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.0.1.tgz" + "version": "0.0.1" } } }, "minimist": { - "version": "0.0.8", - "from": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz" + "version": "0.0.8" } } } @@ -2300,43 +1503,27 @@ }, "gulp-jshint": { "version": "1.4.2", - "from": "https://registry.npmjs.org/gulp-jshint/-/gulp-jshint-1.4.2.tgz", - "resolved": "https://registry.npmjs.org/gulp-jshint/-/gulp-jshint-1.4.2.tgz", "dependencies": { "map-stream": { - "version": "0.1.0", - "from": "https://registry.npmjs.org/map-stream/-/map-stream-0.1.0.tgz", - "resolved": "https://registry.npmjs.org/map-stream/-/map-stream-0.1.0.tgz" + "version": "0.1.0" }, "jshint": { "version": "2.4.4", - "from": "https://registry.npmjs.org/jshint/-/jshint-2.4.4.tgz", - "resolved": "https://registry.npmjs.org/jshint/-/jshint-2.4.4.tgz", "dependencies": { "shelljs": { - "version": "0.1.4", - "from": "https://registry.npmjs.org/shelljs/-/shelljs-0.1.4.tgz", - "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.1.4.tgz" + "version": "0.1.4" }, "underscore": { - "version": "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" + "version": "1.4.4" }, "cli": { "version": "0.4.5", - "from": "https://registry.npmjs.org/cli/-/cli-0.4.5.tgz", - "resolved": "https://registry.npmjs.org/cli/-/cli-0.4.5.tgz", "dependencies": { "glob": { "version": "3.2.9", - "from": "https://registry.npmjs.org/glob/-/glob-3.2.9.tgz", - "resolved": "https://registry.npmjs.org/glob/-/glob-3.2.9.tgz", "dependencies": { "inherits": { - "version": "2.0.1", - "from": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz" + "version": "2.0.1" } } } @@ -2344,446 +1531,292 @@ }, "minimatch": { "version": "0.2.14", - "from": "https://registry.npmjs.org/minimatch/-/minimatch-0.2.14.tgz", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-0.2.14.tgz", "dependencies": { "lru-cache": { - "version": "2.5.0", - "from": "https://registry.npmjs.org/lru-cache/-/lru-cache-2.5.0.tgz", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-2.5.0.tgz" + "version": "2.5.0" }, "sigmund": { - "version": "1.0.0", - "from": "https://registry.npmjs.org/sigmund/-/sigmund-1.0.0.tgz", - "resolved": "https://registry.npmjs.org/sigmund/-/sigmund-1.0.0.tgz" + "version": "1.0.0" } } }, "htmlparser2": { "version": "3.3.0", - "from": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.3.0.tgz", - "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.3.0.tgz", "dependencies": { "domhandler": { - "version": "2.1.0", - "from": "https://registry.npmjs.org/domhandler/-/domhandler-2.1.0.tgz", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.1.0.tgz" + "version": "2.1.0" }, "domutils": { - "version": "1.1.6", - "from": "https://registry.npmjs.org/domutils/-/domutils-1.1.6.tgz", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.1.6.tgz" + "version": "1.1.6" }, "domelementtype": { - "version": "1.1.1", - "from": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.1.1.tgz", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.1.1.tgz" + "version": "1.1.1" }, "readable-stream": { "version": "1.0.26", - "from": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.26.tgz", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.26.tgz", "dependencies": { "string_decoder": { - "version": "0.10.25-1", - "from": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.25-1.tgz", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.25-1.tgz" + "version": "0.10.25-1" } } } } }, "console-browserify": { - "version": "0.1.6", - "from": "https://registry.npmjs.org/console-browserify/-/console-browserify-0.1.6.tgz", - "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-0.1.6.tgz" + "version": "0.1.6" }, "exit": { - "version": "0.1.2", - "from": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", - "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz" + "version": "0.1.2" } } }, "gulp-util": { "version": "2.2.14", - "from": "https://registry.npmjs.org/gulp-util/-/gulp-util-2.2.14.tgz", - "resolved": "https://registry.npmjs.org/gulp-util/-/gulp-util-2.2.14.tgz", "dependencies": { "chalk": { "version": "0.4.0", - "from": "https://registry.npmjs.org/chalk/-/chalk-0.4.0.tgz", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-0.4.0.tgz", "dependencies": { "has-color": { - "version": "0.1.4", - "from": "https://registry.npmjs.org/has-color/-/has-color-0.1.4.tgz", - "resolved": "https://registry.npmjs.org/has-color/-/has-color-0.1.4.tgz" + "version": "0.1.4" }, "ansi-styles": { - "version": "1.0.0", - "from": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-1.0.0.tgz", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-1.0.0.tgz" + "version": "1.0.0" }, "strip-ansi": { - "version": "0.1.1", - "from": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-0.1.1.tgz", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-0.1.1.tgz" + "version": "0.1.1" } } }, "lodash.template": { "version": "2.4.1", - "from": "https://registry.npmjs.org/lodash.template/-/lodash.template-2.4.1.tgz", - "resolved": "https://registry.npmjs.org/lodash.template/-/lodash.template-2.4.1.tgz", "dependencies": { "lodash.defaults": { "version": "2.4.1", - "from": "https://registry.npmjs.org/lodash.defaults/-/lodash.defaults-2.4.1.tgz", - "resolved": "https://registry.npmjs.org/lodash.defaults/-/lodash.defaults-2.4.1.tgz", "dependencies": { "lodash._objecttypes": { - "version": "2.4.1", - "from": "https://registry.npmjs.org/lodash._objecttypes/-/lodash._objecttypes-2.4.1.tgz", - "resolved": "https://registry.npmjs.org/lodash._objecttypes/-/lodash._objecttypes-2.4.1.tgz" + "version": "2.4.1" } } }, "lodash.escape": { "version": "2.4.1", - "from": "https://registry.npmjs.org/lodash.escape/-/lodash.escape-2.4.1.tgz", - "resolved": "https://registry.npmjs.org/lodash.escape/-/lodash.escape-2.4.1.tgz", "dependencies": { "lodash._escapehtmlchar": { "version": "2.4.1", - "from": "https://registry.npmjs.org/lodash._escapehtmlchar/-/lodash._escapehtmlchar-2.4.1.tgz", - "resolved": "https://registry.npmjs.org/lodash._escapehtmlchar/-/lodash._escapehtmlchar-2.4.1.tgz", "dependencies": { "lodash._htmlescapes": { - "version": "2.4.1", - "from": "https://registry.npmjs.org/lodash._htmlescapes/-/lodash._htmlescapes-2.4.1.tgz", - "resolved": "https://registry.npmjs.org/lodash._htmlescapes/-/lodash._htmlescapes-2.4.1.tgz" + "version": "2.4.1" } } }, "lodash._reunescapedhtml": { "version": "2.4.1", - "from": "https://registry.npmjs.org/lodash._reunescapedhtml/-/lodash._reunescapedhtml-2.4.1.tgz", - "resolved": "https://registry.npmjs.org/lodash._reunescapedhtml/-/lodash._reunescapedhtml-2.4.1.tgz", "dependencies": { "lodash._htmlescapes": { - "version": "2.4.1", - "from": "https://registry.npmjs.org/lodash._htmlescapes/-/lodash._htmlescapes-2.4.1.tgz", - "resolved": "https://registry.npmjs.org/lodash._htmlescapes/-/lodash._htmlescapes-2.4.1.tgz" + "version": "2.4.1" } } } } }, "lodash._escapestringchar": { - "version": "2.4.1", - "from": "https://registry.npmjs.org/lodash._escapestringchar/-/lodash._escapestringchar-2.4.1.tgz", - "resolved": "https://registry.npmjs.org/lodash._escapestringchar/-/lodash._escapestringchar-2.4.1.tgz" + "version": "2.4.1" }, "lodash.keys": { "version": "2.4.1", - "from": "https://registry.npmjs.org/lodash.keys/-/lodash.keys-2.4.1.tgz", - "resolved": "https://registry.npmjs.org/lodash.keys/-/lodash.keys-2.4.1.tgz", "dependencies": { "lodash._isnative": { - "version": "2.4.1", - "from": "https://registry.npmjs.org/lodash._isnative/-/lodash._isnative-2.4.1.tgz", - "resolved": "https://registry.npmjs.org/lodash._isnative/-/lodash._isnative-2.4.1.tgz" + "version": "2.4.1" }, "lodash.isobject": { "version": "2.4.1", - "from": "https://registry.npmjs.org/lodash.isobject/-/lodash.isobject-2.4.1.tgz", - "resolved": "https://registry.npmjs.org/lodash.isobject/-/lodash.isobject-2.4.1.tgz", "dependencies": { "lodash._objecttypes": { - "version": "2.4.1", - "from": "https://registry.npmjs.org/lodash._objecttypes/-/lodash._objecttypes-2.4.1.tgz", - "resolved": "https://registry.npmjs.org/lodash._objecttypes/-/lodash._objecttypes-2.4.1.tgz" + "version": "2.4.1" } } }, "lodash._shimkeys": { "version": "2.4.1", - "from": "https://registry.npmjs.org/lodash._shimkeys/-/lodash._shimkeys-2.4.1.tgz", - "resolved": "https://registry.npmjs.org/lodash._shimkeys/-/lodash._shimkeys-2.4.1.tgz", "dependencies": { "lodash._objecttypes": { - "version": "2.4.1", - "from": "https://registry.npmjs.org/lodash._objecttypes/-/lodash._objecttypes-2.4.1.tgz", - "resolved": "https://registry.npmjs.org/lodash._objecttypes/-/lodash._objecttypes-2.4.1.tgz" + "version": "2.4.1" } } } } }, "lodash.templatesettings": { - "version": "2.4.1", - "from": "https://registry.npmjs.org/lodash.templatesettings/-/lodash.templatesettings-2.4.1.tgz", - "resolved": "https://registry.npmjs.org/lodash.templatesettings/-/lodash.templatesettings-2.4.1.tgz" + "version": "2.4.1" }, "lodash.values": { - "version": "2.4.1", - "from": "https://registry.npmjs.org/lodash.values/-/lodash.values-2.4.1.tgz", - "resolved": "https://registry.npmjs.org/lodash.values/-/lodash.values-2.4.1.tgz" + "version": "2.4.1" } } }, "lodash._reinterpolate": { - "version": "2.4.1", - "from": "https://registry.npmjs.org/lodash._reinterpolate/-/lodash._reinterpolate-2.4.1.tgz", - "resolved": "https://registry.npmjs.org/lodash._reinterpolate/-/lodash._reinterpolate-2.4.1.tgz" + "version": "2.4.1" }, "vinyl": { "version": "0.2.3", - "from": "https://registry.npmjs.org/vinyl/-/vinyl-0.2.3.tgz", - "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-0.2.3.tgz", "dependencies": { "clone-stats": { - "version": "0.0.1", - "from": "https://registry.npmjs.org/clone-stats/-/clone-stats-0.0.1.tgz", - "resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-0.0.1.tgz" + "version": "0.0.1" } } }, "through2": { "version": "0.4.1", - "from": "https://registry.npmjs.org/through2/-/through2-0.4.1.tgz", - "resolved": "https://registry.npmjs.org/through2/-/through2-0.4.1.tgz", "dependencies": { "readable-stream": { "version": "1.0.26", - "from": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.26.tgz", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.26.tgz", "dependencies": { "string_decoder": { - "version": "0.10.25-1", - "from": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.25-1.tgz", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.25-1.tgz" + "version": "0.10.25-1" } } }, "xtend": { "version": "2.1.2", - "from": "https://registry.npmjs.org/xtend/-/xtend-2.1.2.tgz", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-2.1.2.tgz", "dependencies": { "object-keys": { - "version": "0.4.0", - "from": "https://registry.npmjs.org/object-keys/-/object-keys-0.4.0.tgz", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-0.4.0.tgz" + "version": "0.4.0" } } } } }, "dateformat": { - "version": "1.0.7-1.2.3", - "from": "https://registry.npmjs.org/dateformat/-/dateformat-1.0.7-1.2.3.tgz", - "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-1.0.7-1.2.3.tgz" + "version": "1.0.7-1.2.3" }, "multipipe": { "version": "0.0.2", - "from": "https://registry.npmjs.org/multipipe/-/multipipe-0.0.2.tgz", - "resolved": "https://registry.npmjs.org/multipipe/-/multipipe-0.0.2.tgz", "dependencies": { "duplexer2": { - "version": "0.0.1", - "from": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.0.1.tgz", - "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.0.1.tgz" + "version": "0.0.1" } } }, "minimist": { - "version": "0.0.8", - "from": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz" + "version": "0.0.8" } } }, "lodash.clone": { "version": "2.4.1", - "from": "https://registry.npmjs.org/lodash.clone/-/lodash.clone-2.4.1.tgz", - "resolved": "https://registry.npmjs.org/lodash.clone/-/lodash.clone-2.4.1.tgz", "dependencies": { "lodash._baseclone": { "version": "2.4.1", - "from": "https://registry.npmjs.org/lodash._baseclone/-/lodash._baseclone-2.4.1.tgz", - "resolved": "https://registry.npmjs.org/lodash._baseclone/-/lodash._baseclone-2.4.1.tgz", "dependencies": { "lodash.assign": { "version": "2.4.1", - "from": "https://registry.npmjs.org/lodash.assign/-/lodash.assign-2.4.1.tgz", - "resolved": "https://registry.npmjs.org/lodash.assign/-/lodash.assign-2.4.1.tgz", "dependencies": { "lodash.keys": { "version": "2.4.1", - "from": "https://registry.npmjs.org/lodash.keys/-/lodash.keys-2.4.1.tgz", - "resolved": "https://registry.npmjs.org/lodash.keys/-/lodash.keys-2.4.1.tgz", "dependencies": { "lodash._isnative": { - "version": "2.4.1", - "from": "https://registry.npmjs.org/lodash._isnative/-/lodash._isnative-2.4.1.tgz", - "resolved": "https://registry.npmjs.org/lodash._isnative/-/lodash._isnative-2.4.1.tgz" + "version": "2.4.1" }, "lodash._shimkeys": { - "version": "2.4.1", - "from": "https://registry.npmjs.org/lodash._shimkeys/-/lodash._shimkeys-2.4.1.tgz", - "resolved": "https://registry.npmjs.org/lodash._shimkeys/-/lodash._shimkeys-2.4.1.tgz" + "version": "2.4.1" } } }, "lodash._objecttypes": { - "version": "2.4.1", - "from": "https://registry.npmjs.org/lodash._objecttypes/-/lodash._objecttypes-2.4.1.tgz", - "resolved": "https://registry.npmjs.org/lodash._objecttypes/-/lodash._objecttypes-2.4.1.tgz" + "version": "2.4.1" } } }, "lodash.foreach": { - "version": "2.4.1", - "from": "https://registry.npmjs.org/lodash.foreach/-/lodash.foreach-2.4.1.tgz", - "resolved": "https://registry.npmjs.org/lodash.foreach/-/lodash.foreach-2.4.1.tgz" + "version": "2.4.1" }, "lodash.forown": { "version": "2.4.1", - "from": "https://registry.npmjs.org/lodash.forown/-/lodash.forown-2.4.1.tgz", - "resolved": "https://registry.npmjs.org/lodash.forown/-/lodash.forown-2.4.1.tgz", "dependencies": { "lodash.keys": { "version": "2.4.1", - "from": "https://registry.npmjs.org/lodash.keys/-/lodash.keys-2.4.1.tgz", - "resolved": "https://registry.npmjs.org/lodash.keys/-/lodash.keys-2.4.1.tgz", "dependencies": { "lodash._isnative": { - "version": "2.4.1", - "from": "https://registry.npmjs.org/lodash._isnative/-/lodash._isnative-2.4.1.tgz", - "resolved": "https://registry.npmjs.org/lodash._isnative/-/lodash._isnative-2.4.1.tgz" + "version": "2.4.1" }, "lodash._shimkeys": { - "version": "2.4.1", - "from": "https://registry.npmjs.org/lodash._shimkeys/-/lodash._shimkeys-2.4.1.tgz", - "resolved": "https://registry.npmjs.org/lodash._shimkeys/-/lodash._shimkeys-2.4.1.tgz" + "version": "2.4.1" } } }, "lodash._objecttypes": { - "version": "2.4.1", - "from": "https://registry.npmjs.org/lodash._objecttypes/-/lodash._objecttypes-2.4.1.tgz", - "resolved": "https://registry.npmjs.org/lodash._objecttypes/-/lodash._objecttypes-2.4.1.tgz" + "version": "2.4.1" } } }, "lodash._getarray": { "version": "2.4.1", - "from": "https://registry.npmjs.org/lodash._getarray/-/lodash._getarray-2.4.1.tgz", - "resolved": "https://registry.npmjs.org/lodash._getarray/-/lodash._getarray-2.4.1.tgz", "dependencies": { "lodash._arraypool": { - "version": "2.4.1", - "from": "https://registry.npmjs.org/lodash._arraypool/-/lodash._arraypool-2.4.1.tgz", - "resolved": "https://registry.npmjs.org/lodash._arraypool/-/lodash._arraypool-2.4.1.tgz" + "version": "2.4.1" } } }, "lodash.isarray": { "version": "2.4.1", - "from": "https://registry.npmjs.org/lodash.isarray/-/lodash.isarray-2.4.1.tgz", - "resolved": "https://registry.npmjs.org/lodash.isarray/-/lodash.isarray-2.4.1.tgz", "dependencies": { "lodash._isnative": { - "version": "2.4.1", - "from": "https://registry.npmjs.org/lodash._isnative/-/lodash._isnative-2.4.1.tgz", - "resolved": "https://registry.npmjs.org/lodash._isnative/-/lodash._isnative-2.4.1.tgz" + "version": "2.4.1" } } }, "lodash.isobject": { "version": "2.4.1", - "from": "https://registry.npmjs.org/lodash.isobject/-/lodash.isobject-2.4.1.tgz", - "resolved": "https://registry.npmjs.org/lodash.isobject/-/lodash.isobject-2.4.1.tgz", "dependencies": { "lodash._objecttypes": { - "version": "2.4.1", - "from": "https://registry.npmjs.org/lodash._objecttypes/-/lodash._objecttypes-2.4.1.tgz", - "resolved": "https://registry.npmjs.org/lodash._objecttypes/-/lodash._objecttypes-2.4.1.tgz" + "version": "2.4.1" } } }, "lodash._releasearray": { "version": "2.4.1", - "from": "https://registry.npmjs.org/lodash._releasearray/-/lodash._releasearray-2.4.1.tgz", - "resolved": "https://registry.npmjs.org/lodash._releasearray/-/lodash._releasearray-2.4.1.tgz", "dependencies": { "lodash._arraypool": { - "version": "2.4.1", - "from": "https://registry.npmjs.org/lodash._arraypool/-/lodash._arraypool-2.4.1.tgz", - "resolved": "https://registry.npmjs.org/lodash._arraypool/-/lodash._arraypool-2.4.1.tgz" + "version": "2.4.1" }, "lodash._maxpoolsize": { - "version": "2.4.1", - "from": "https://registry.npmjs.org/lodash._maxpoolsize/-/lodash._maxpoolsize-2.4.1.tgz", - "resolved": "https://registry.npmjs.org/lodash._maxpoolsize/-/lodash._maxpoolsize-2.4.1.tgz" + "version": "2.4.1" } } }, "lodash._slice": { - "version": "2.4.1", - "from": "https://registry.npmjs.org/lodash._slice/-/lodash._slice-2.4.1.tgz", - "resolved": "https://registry.npmjs.org/lodash._slice/-/lodash._slice-2.4.1.tgz" + "version": "2.4.1" } } }, "lodash._basecreatecallback": { "version": "2.4.1", - "from": "https://registry.npmjs.org/lodash._basecreatecallback/-/lodash._basecreatecallback-2.4.1.tgz", - "resolved": "https://registry.npmjs.org/lodash._basecreatecallback/-/lodash._basecreatecallback-2.4.1.tgz", "dependencies": { "lodash.bind": { "version": "2.4.1", - "from": "https://registry.npmjs.org/lodash.bind/-/lodash.bind-2.4.1.tgz", - "resolved": "https://registry.npmjs.org/lodash.bind/-/lodash.bind-2.4.1.tgz", "dependencies": { "lodash._createwrapper": { "version": "2.4.1", - "from": "https://registry.npmjs.org/lodash._createwrapper/-/lodash._createwrapper-2.4.1.tgz", - "resolved": "https://registry.npmjs.org/lodash._createwrapper/-/lodash._createwrapper-2.4.1.tgz", "dependencies": { "lodash._basebind": { "version": "2.4.1", - "from": "https://registry.npmjs.org/lodash._basebind/-/lodash._basebind-2.4.1.tgz", - "resolved": "https://registry.npmjs.org/lodash._basebind/-/lodash._basebind-2.4.1.tgz", "dependencies": { "lodash._basecreate": { "version": "2.4.1", - "from": "https://registry.npmjs.org/lodash._basecreate/-/lodash._basecreate-2.4.1.tgz", - "resolved": "https://registry.npmjs.org/lodash._basecreate/-/lodash._basecreate-2.4.1.tgz", "dependencies": { "lodash._isnative": { - "version": "2.4.1", - "from": "https://registry.npmjs.org/lodash._isnative/-/lodash._isnative-2.4.1.tgz", - "resolved": "https://registry.npmjs.org/lodash._isnative/-/lodash._isnative-2.4.1.tgz" + "version": "2.4.1" }, "lodash.noop": { - "version": "2.4.1", - "from": "https://registry.npmjs.org/lodash.noop/-/lodash.noop-2.4.1.tgz", - "resolved": "https://registry.npmjs.org/lodash.noop/-/lodash.noop-2.4.1.tgz" + "version": "2.4.1" } } }, "lodash.isobject": { "version": "2.4.1", - "from": "https://registry.npmjs.org/lodash.isobject/-/lodash.isobject-2.4.1.tgz", - "resolved": "https://registry.npmjs.org/lodash.isobject/-/lodash.isobject-2.4.1.tgz", "dependencies": { "lodash._objecttypes": { - "version": "2.4.1", - "from": "https://registry.npmjs.org/lodash._objecttypes/-/lodash._objecttypes-2.4.1.tgz", - "resolved": "https://registry.npmjs.org/lodash._objecttypes/-/lodash._objecttypes-2.4.1.tgz" + "version": "2.4.1" } } } @@ -2791,85 +1824,57 @@ }, "lodash._basecreatewrapper": { "version": "2.4.1", - "from": "https://registry.npmjs.org/lodash._basecreatewrapper/-/lodash._basecreatewrapper-2.4.1.tgz", - "resolved": "https://registry.npmjs.org/lodash._basecreatewrapper/-/lodash._basecreatewrapper-2.4.1.tgz", "dependencies": { "lodash._basecreate": { "version": "2.4.1", - "from": "https://registry.npmjs.org/lodash._basecreate/-/lodash._basecreate-2.4.1.tgz", - "resolved": "https://registry.npmjs.org/lodash._basecreate/-/lodash._basecreate-2.4.1.tgz", "dependencies": { "lodash._isnative": { - "version": "2.4.1", - "from": "https://registry.npmjs.org/lodash._isnative/-/lodash._isnative-2.4.1.tgz", - "resolved": "https://registry.npmjs.org/lodash._isnative/-/lodash._isnative-2.4.1.tgz" + "version": "2.4.1" }, "lodash.noop": { - "version": "2.4.1", - "from": "https://registry.npmjs.org/lodash.noop/-/lodash.noop-2.4.1.tgz", - "resolved": "https://registry.npmjs.org/lodash.noop/-/lodash.noop-2.4.1.tgz" + "version": "2.4.1" } } }, "lodash.isobject": { "version": "2.4.1", - "from": "https://registry.npmjs.org/lodash.isobject/-/lodash.isobject-2.4.1.tgz", - "resolved": "https://registry.npmjs.org/lodash.isobject/-/lodash.isobject-2.4.1.tgz", "dependencies": { "lodash._objecttypes": { - "version": "2.4.1", - "from": "https://registry.npmjs.org/lodash._objecttypes/-/lodash._objecttypes-2.4.1.tgz", - "resolved": "https://registry.npmjs.org/lodash._objecttypes/-/lodash._objecttypes-2.4.1.tgz" + "version": "2.4.1" } } } } }, "lodash.isfunction": { - "version": "2.4.1", - "from": "https://registry.npmjs.org/lodash.isfunction/-/lodash.isfunction-2.4.1.tgz", - "resolved": "https://registry.npmjs.org/lodash.isfunction/-/lodash.isfunction-2.4.1.tgz" + "version": "2.4.1" } } }, "lodash._slice": { - "version": "2.4.1", - "from": "https://registry.npmjs.org/lodash._slice/-/lodash._slice-2.4.1.tgz", - "resolved": "https://registry.npmjs.org/lodash._slice/-/lodash._slice-2.4.1.tgz" + "version": "2.4.1" } } }, "lodash.identity": { - "version": "2.4.1", - "from": "https://registry.npmjs.org/lodash.identity/-/lodash.identity-2.4.1.tgz", - "resolved": "https://registry.npmjs.org/lodash.identity/-/lodash.identity-2.4.1.tgz" + "version": "2.4.1" }, "lodash._setbinddata": { "version": "2.4.1", - "from": "https://registry.npmjs.org/lodash._setbinddata/-/lodash._setbinddata-2.4.1.tgz", - "resolved": "https://registry.npmjs.org/lodash._setbinddata/-/lodash._setbinddata-2.4.1.tgz", "dependencies": { "lodash._isnative": { - "version": "2.4.1", - "from": "https://registry.npmjs.org/lodash._isnative/-/lodash._isnative-2.4.1.tgz", - "resolved": "https://registry.npmjs.org/lodash._isnative/-/lodash._isnative-2.4.1.tgz" + "version": "2.4.1" }, "lodash.noop": { - "version": "2.4.1", - "from": "https://registry.npmjs.org/lodash.noop/-/lodash.noop-2.4.1.tgz", - "resolved": "https://registry.npmjs.org/lodash.noop/-/lodash.noop-2.4.1.tgz" + "version": "2.4.1" } } }, "lodash.support": { "version": "2.4.1", - "from": "https://registry.npmjs.org/lodash.support/-/lodash.support-2.4.1.tgz", - "resolved": "https://registry.npmjs.org/lodash.support/-/lodash.support-2.4.1.tgz", "dependencies": { "lodash._isnative": { - "version": "2.4.1", - "from": "https://registry.npmjs.org/lodash._isnative/-/lodash._isnative-2.4.1.tgz", - "resolved": "https://registry.npmjs.org/lodash._isnative/-/lodash._isnative-2.4.1.tgz" + "version": "2.4.1" } } } @@ -2881,77 +1886,49 @@ }, "jasmine-node": { "version": "1.11.0", - "from": "https://registry.npmjs.org/jasmine-node/-/jasmine-node-1.11.0.tgz", - "resolved": "https://registry.npmjs.org/jasmine-node/-/jasmine-node-1.11.0.tgz", "dependencies": { "coffee-script": { - "version": "1.7.1", - "from": "https://registry.npmjs.org/coffee-script/-/coffee-script-1.7.1.tgz", - "resolved": "https://registry.npmjs.org/coffee-script/-/coffee-script-1.7.1.tgz" + "version": "1.7.1" }, "jasmine-growl-reporter": { "version": "0.0.2", - "from": "https://registry.npmjs.org/jasmine-growl-reporter/-/jasmine-growl-reporter-0.0.2.tgz", - "resolved": "https://registry.npmjs.org/jasmine-growl-reporter/-/jasmine-growl-reporter-0.0.2.tgz", "dependencies": { "growl": { - "version": "1.7.0", - "from": "https://registry.npmjs.org/growl/-/growl-1.7.0.tgz", - "resolved": "https://registry.npmjs.org/growl/-/growl-1.7.0.tgz" + "version": "1.7.0" } } }, "requirejs": { - "version": "2.1.11", - "from": "https://registry.npmjs.org/requirejs/-/requirejs-2.1.11.tgz", - "resolved": "https://registry.npmjs.org/requirejs/-/requirejs-2.1.11.tgz" + "version": "2.1.11" }, "walkdir": { - "version": "0.0.7", - "from": "https://registry.npmjs.org/walkdir/-/walkdir-0.0.7.tgz", - "resolved": "https://registry.npmjs.org/walkdir/-/walkdir-0.0.7.tgz" + "version": "0.0.7" }, "underscore": { - "version": "1.6.0", - "from": "https://registry.npmjs.org/underscore/-/underscore-1.6.0.tgz", - "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.6.0.tgz" + "version": "1.6.0" }, "gaze": { "version": "0.3.4", - "from": "https://registry.npmjs.org/gaze/-/gaze-0.3.4.tgz", - "resolved": "https://registry.npmjs.org/gaze/-/gaze-0.3.4.tgz", "dependencies": { "minimatch": { "version": "0.2.14", - "from": "https://registry.npmjs.org/minimatch/-/minimatch-0.2.14.tgz", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-0.2.14.tgz", "dependencies": { "lru-cache": { - "version": "2.5.0", - "from": "https://registry.npmjs.org/lru-cache/-/lru-cache-2.5.0.tgz", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-2.5.0.tgz" + "version": "2.5.0" }, "sigmund": { - "version": "1.0.0", - "from": "https://registry.npmjs.org/sigmund/-/sigmund-1.0.0.tgz", - "resolved": "https://registry.npmjs.org/sigmund/-/sigmund-1.0.0.tgz" + "version": "1.0.0" } } }, "fileset": { "version": "0.1.5", - "from": "https://registry.npmjs.org/fileset/-/fileset-0.1.5.tgz", - "resolved": "https://registry.npmjs.org/fileset/-/fileset-0.1.5.tgz", "dependencies": { "glob": { "version": "3.2.9", - "from": "https://registry.npmjs.org/glob/-/glob-3.2.9.tgz", - "resolved": "https://registry.npmjs.org/glob/-/glob-3.2.9.tgz", "dependencies": { "inherits": { - "version": "2.0.1", - "from": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz" + "version": "2.0.1" } } } @@ -2960,212 +1937,136 @@ } }, "mkdirp": { - "version": "0.3.5", - "from": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.3.5.tgz", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.3.5.tgz" + "version": "0.3.5" } } }, "jasmine-reporters": { - "version": "0.2.1", - "from": "https://registry.npmjs.org/jasmine-reporters/-/jasmine-reporters-0.2.1.tgz", - "resolved": "https://registry.npmjs.org/jasmine-reporters/-/jasmine-reporters-0.2.1.tgz" + "version": "0.2.1" }, "jshint-stylish": { "version": "0.1.5", - "from": "https://registry.npmjs.org/jshint-stylish/-/jshint-stylish-0.1.5.tgz", - "resolved": "https://registry.npmjs.org/jshint-stylish/-/jshint-stylish-0.1.5.tgz", "dependencies": { "chalk": { "version": "0.4.0", - "from": "https://registry.npmjs.org/chalk/-/chalk-0.4.0.tgz", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-0.4.0.tgz", "dependencies": { "has-color": { - "version": "0.1.4", - "from": "https://registry.npmjs.org/has-color/-/has-color-0.1.4.tgz", - "resolved": "https://registry.npmjs.org/has-color/-/has-color-0.1.4.tgz" + "version": "0.1.4" }, "ansi-styles": { - "version": "1.0.0", - "from": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-1.0.0.tgz", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-1.0.0.tgz" + "version": "1.0.0" }, "strip-ansi": { - "version": "0.1.1", - "from": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-0.1.1.tgz", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-0.1.1.tgz" + "version": "0.1.1" } } }, "text-table": { - "version": "0.2.0", - "from": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz" + "version": "0.2.0" } } }, "karma": { "version": "0.11.12", - "from": "https://registry.npmjs.org/karma/-/karma-0.11.12.tgz", - "resolved": "https://registry.npmjs.org/karma/-/karma-0.11.12.tgz", "dependencies": { "di": { - "version": "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" + "version": "0.0.1" }, "socket.io": { "version": "0.9.16", - "from": "https://registry.npmjs.org/socket.io/-/socket.io-0.9.16.tgz", - "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-0.9.16.tgz", "dependencies": { "socket.io-client": { "version": "0.9.16", - "from": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-0.9.16.tgz", - "resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-0.9.16.tgz", "dependencies": { "uglify-js": { - "version": "1.2.5", - "from": "https://registry.npmjs.org/uglify-js/-/uglify-js-1.2.5.tgz", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-1.2.5.tgz" + "version": "1.2.5" }, "ws": { "version": "0.4.31", - "from": "https://registry.npmjs.org/ws/-/ws-0.4.31.tgz", - "resolved": "https://registry.npmjs.org/ws/-/ws-0.4.31.tgz", "dependencies": { "commander": { - "version": "0.6.1", - "from": "https://registry.npmjs.org/commander/-/commander-0.6.1.tgz", - "resolved": "https://registry.npmjs.org/commander/-/commander-0.6.1.tgz" + "version": "0.6.1" }, "nan": { - "version": "0.3.2", - "from": "https://registry.npmjs.org/nan/-/nan-0.3.2.tgz", - "resolved": "https://registry.npmjs.org/nan/-/nan-0.3.2.tgz" + "version": "0.3.2" }, "tinycolor": { - "version": "0.0.1", - "from": "https://registry.npmjs.org/tinycolor/-/tinycolor-0.0.1.tgz", - "resolved": "https://registry.npmjs.org/tinycolor/-/tinycolor-0.0.1.tgz" + "version": "0.0.1" }, "options": { - "version": "0.0.5", - "from": "https://registry.npmjs.org/options/-/options-0.0.5.tgz", - "resolved": "https://registry.npmjs.org/options/-/options-0.0.5.tgz" + "version": "0.0.5" } } }, "xmlhttprequest": { - "version": "1.4.2", - "from": "https://registry.npmjs.org/xmlhttprequest/-/xmlhttprequest-1.4.2.tgz", - "resolved": "https://registry.npmjs.org/xmlhttprequest/-/xmlhttprequest-1.4.2.tgz" + "version": "1.4.2" }, "active-x-obfuscator": { "version": "0.0.1", - "from": "https://registry.npmjs.org/active-x-obfuscator/-/active-x-obfuscator-0.0.1.tgz", - "resolved": "https://registry.npmjs.org/active-x-obfuscator/-/active-x-obfuscator-0.0.1.tgz", "dependencies": { "zeparser": { - "version": "0.0.5", - "from": "https://registry.npmjs.org/zeparser/-/zeparser-0.0.5.tgz", - "resolved": "https://registry.npmjs.org/zeparser/-/zeparser-0.0.5.tgz" + "version": "0.0.5" } } } } }, "policyfile": { - "version": "0.0.4", - "from": "https://registry.npmjs.org/policyfile/-/policyfile-0.0.4.tgz", - "resolved": "https://registry.npmjs.org/policyfile/-/policyfile-0.0.4.tgz" + "version": "0.0.4" }, "base64id": { - "version": "0.1.0", - "from": "https://registry.npmjs.org/base64id/-/base64id-0.1.0.tgz", - "resolved": "https://registry.npmjs.org/base64id/-/base64id-0.1.0.tgz" + "version": "0.1.0" }, "redis": { - "version": "0.7.3", - "from": "https://registry.npmjs.org/redis/-/redis-0.7.3.tgz", - "resolved": "https://registry.npmjs.org/redis/-/redis-0.7.3.tgz" + "version": "0.7.3" } } }, "chokidar": { - "version": "0.8.1", - "from": "https://registry.npmjs.org/chokidar/-/chokidar-0.8.1.tgz", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-0.8.1.tgz" + "version": "0.8.1" }, "glob": { "version": "3.2.9", - "from": "https://registry.npmjs.org/glob/-/glob-3.2.9.tgz", - "resolved": "https://registry.npmjs.org/glob/-/glob-3.2.9.tgz", "dependencies": { "inherits": { - "version": "2.0.1", - "from": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz" + "version": "2.0.1" } } }, "minimatch": { "version": "0.2.14", - "from": "https://registry.npmjs.org/minimatch/-/minimatch-0.2.14.tgz", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-0.2.14.tgz", "dependencies": { "lru-cache": { - "version": "2.5.0", - "from": "https://registry.npmjs.org/lru-cache/-/lru-cache-2.5.0.tgz", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-2.5.0.tgz" + "version": "2.5.0" }, "sigmund": { - "version": "1.0.0", - "from": "https://registry.npmjs.org/sigmund/-/sigmund-1.0.0.tgz", - "resolved": "https://registry.npmjs.org/sigmund/-/sigmund-1.0.0.tgz" + "version": "1.0.0" } } }, "http-proxy": { "version": "0.10.4", - "from": "https://registry.npmjs.org/http-proxy/-/http-proxy-0.10.4.tgz", - "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-0.10.4.tgz", "dependencies": { "pkginfo": { - "version": "0.3.0", - "from": "https://registry.npmjs.org/pkginfo/-/pkginfo-0.3.0.tgz", - "resolved": "https://registry.npmjs.org/pkginfo/-/pkginfo-0.3.0.tgz" + "version": "0.3.0" }, "utile": { "version": "0.2.1", - "from": "https://registry.npmjs.org/utile/-/utile-0.2.1.tgz", - "resolved": "https://registry.npmjs.org/utile/-/utile-0.2.1.tgz", "dependencies": { "async": { - "version": "0.2.10", - "from": "https://registry.npmjs.org/async/-/async-0.2.10.tgz", - "resolved": "https://registry.npmjs.org/async/-/async-0.2.10.tgz" + "version": "0.2.10" }, "deep-equal": { - "version": "0.2.1", - "from": "https://registry.npmjs.org/deep-equal/-/deep-equal-0.2.1.tgz", - "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-0.2.1.tgz" + "version": "0.2.1" }, "i": { - "version": "0.3.2", - "from": "https://registry.npmjs.org/i/-/i-0.3.2.tgz", - "resolved": "https://registry.npmjs.org/i/-/i-0.3.2.tgz" + "version": "0.3.2" }, "mkdirp": { - "version": "0.3.5", - "from": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.3.5.tgz", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.3.5.tgz" + "version": "0.3.5" }, "ncp": { - "version": "0.4.2", - "from": "https://registry.npmjs.org/ncp/-/ncp-0.4.2.tgz", - "resolved": "https://registry.npmjs.org/ncp/-/ncp-0.4.2.tgz" + "version": "0.4.2" } } } @@ -3173,75 +2074,47 @@ }, "optimist": { "version": "0.6.1", - "from": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz", - "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz", "dependencies": { "wordwrap": { - "version": "0.0.2", - "from": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz", - "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz" + "version": "0.0.2" }, "minimist": { - "version": "0.0.8", - "from": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz" + "version": "0.0.8" } } }, "coffee-script": { - "version": "1.6.3", - "from": "https://registry.npmjs.org/coffee-script/-/coffee-script-1.6.3.tgz", - "resolved": "https://registry.npmjs.org/coffee-script/-/coffee-script-1.6.3.tgz" + "version": "1.6.3" }, "rimraf": { - "version": "2.2.6", - "from": "https://registry.npmjs.org/rimraf/-/rimraf-2.2.6.tgz", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.2.6.tgz" + "version": "2.2.6" }, "q": { - "version": "0.9.7", - "from": "https://registry.npmjs.org/q/-/q-0.9.7.tgz", - "resolved": "https://registry.npmjs.org/q/-/q-0.9.7.tgz" + "version": "0.9.7" }, "colors": { - "version": "0.6.2", - "from": "https://registry.npmjs.org/colors/-/colors-0.6.2.tgz", - "resolved": "https://registry.npmjs.org/colors/-/colors-0.6.2.tgz" + "version": "0.6.2" }, "lodash": { - "version": "2.4.1", - "from": "https://registry.npmjs.org/lodash/-/lodash-2.4.1.tgz", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-2.4.1.tgz" + "version": "2.4.1" }, "mime": { - "version": "1.2.11", - "from": "https://registry.npmjs.org/mime/-/mime-1.2.11.tgz", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.2.11.tgz" + "version": "1.2.11" }, "log4js": { "version": "0.6.10", - "from": "https://registry.npmjs.org/log4js/-/log4js-0.6.10.tgz", - "resolved": "https://registry.npmjs.org/log4js/-/log4js-0.6.10.tgz", "dependencies": { "async": { - "version": "0.1.15", - "from": "https://registry.npmjs.org/async/-/async-0.1.15.tgz", - "resolved": "https://registry.npmjs.org/async/-/async-0.1.15.tgz" + "version": "0.1.15" }, "semver": { - "version": "1.1.4", - "from": "https://registry.npmjs.org/semver/-/semver-1.1.4.tgz", - "resolved": "https://registry.npmjs.org/semver/-/semver-1.1.4.tgz" + "version": "1.1.4" }, "readable-stream": { "version": "1.0.26", - "from": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.26.tgz", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.26.tgz", "dependencies": { "string_decoder": { - "version": "0.10.25-1", - "from": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.25-1.tgz", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.25-1.tgz" + "version": "0.10.25-1" } } } @@ -3249,134 +2122,84 @@ }, "useragent": { "version": "2.0.7", - "from": "https://registry.npmjs.org/useragent/-/useragent-2.0.7.tgz", - "resolved": "https://registry.npmjs.org/useragent/-/useragent-2.0.7.tgz", "dependencies": { "lru-cache": { - "version": "2.2.4", - "from": "https://registry.npmjs.org/lru-cache/-/lru-cache-2.2.4.tgz", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-2.2.4.tgz" + "version": "2.2.4" } } }, "graceful-fs": { - "version": "2.0.2", - "from": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-2.0.2.tgz", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-2.0.2.tgz" + "version": "2.0.2" }, "connect": { "version": "2.12.0", - "from": "https://registry.npmjs.org/connect/-/connect-2.12.0.tgz", - "resolved": "https://registry.npmjs.org/connect/-/connect-2.12.0.tgz", "dependencies": { "batch": { - "version": "0.5.0", - "from": "https://registry.npmjs.org/batch/-/batch-0.5.0.tgz", - "resolved": "https://registry.npmjs.org/batch/-/batch-0.5.0.tgz" + "version": "0.5.0" }, "qs": { - "version": "0.6.6", - "from": "https://registry.npmjs.org/qs/-/qs-0.6.6.tgz", - "resolved": "https://registry.npmjs.org/qs/-/qs-0.6.6.tgz" + "version": "0.6.6" }, "cookie-signature": { - "version": "1.0.1", - "from": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.1.tgz", - "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.1.tgz" + "version": "1.0.1" }, "buffer-crc32": { - "version": "0.2.1", - "from": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.1.tgz", - "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.1.tgz" + "version": "0.2.1" }, "cookie": { - "version": "0.1.0", - "from": "https://registry.npmjs.org/cookie/-/cookie-0.1.0.tgz", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.1.0.tgz" + "version": "0.1.0" }, "send": { "version": "0.1.4", - "from": "https://registry.npmjs.org/send/-/send-0.1.4.tgz", - "resolved": "https://registry.npmjs.org/send/-/send-0.1.4.tgz", "dependencies": { "range-parser": { - "version": "0.0.4", - "from": "https://registry.npmjs.org/range-parser/-/range-parser-0.0.4.tgz", - "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-0.0.4.tgz" + "version": "0.0.4" } } }, "bytes": { - "version": "0.2.1", - "from": "https://registry.npmjs.org/bytes/-/bytes-0.2.1.tgz", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-0.2.1.tgz" + "version": "0.2.1" }, "fresh": { - "version": "0.2.0", - "from": "https://registry.npmjs.org/fresh/-/fresh-0.2.0.tgz", - "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.2.0.tgz" + "version": "0.2.0" }, "pause": { - "version": "0.0.1", - "from": "https://registry.npmjs.org/pause/-/pause-0.0.1.tgz", - "resolved": "https://registry.npmjs.org/pause/-/pause-0.0.1.tgz" + "version": "0.0.1" }, "uid2": { - "version": "0.0.3", - "from": "https://registry.npmjs.org/uid2/-/uid2-0.0.3.tgz", - "resolved": "https://registry.npmjs.org/uid2/-/uid2-0.0.3.tgz" + "version": "0.0.3" }, "debug": { - "version": "0.7.4", - "from": "https://registry.npmjs.org/debug/-/debug-0.7.4.tgz", - "resolved": "https://registry.npmjs.org/debug/-/debug-0.7.4.tgz" + "version": "0.7.4" }, "methods": { - "version": "0.1.0", - "from": "https://registry.npmjs.org/methods/-/methods-0.1.0.tgz", - "resolved": "https://registry.npmjs.org/methods/-/methods-0.1.0.tgz" + "version": "0.1.0" }, "raw-body": { - "version": "1.1.2", - "from": "https://registry.npmjs.org/raw-body/-/raw-body-1.1.2.tgz", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-1.1.2.tgz" + "version": "1.1.2" }, "negotiator": { - "version": "0.3.0", - "from": "https://registry.npmjs.org/negotiator/-/negotiator-0.3.0.tgz", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.3.0.tgz" + "version": "0.3.0" }, "multiparty": { "version": "2.2.0", - "from": "https://registry.npmjs.org/multiparty/-/multiparty-2.2.0.tgz", - "resolved": "https://registry.npmjs.org/multiparty/-/multiparty-2.2.0.tgz", "dependencies": { "readable-stream": { "version": "1.1.11", - "from": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.11.tgz", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.11.tgz", "dependencies": { "core-util-is": { - "version": "1.0.1", - "from": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.1.tgz", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.1.tgz" + "version": "1.0.1" }, "string_decoder": { - "version": "0.10.25-1", - "from": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.25-1.tgz", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.25-1.tgz" + "version": "0.10.25-1" }, "debuglog": { - "version": "0.0.2", - "from": "https://registry.npmjs.org/debuglog/-/debuglog-0.0.2.tgz", - "resolved": "https://registry.npmjs.org/debuglog/-/debuglog-0.0.2.tgz" + "version": "0.0.2" } } }, "stream-counter": { - "version": "0.2.0", - "from": "https://registry.npmjs.org/stream-counter/-/stream-counter-0.2.0.tgz", - "resolved": "https://registry.npmjs.org/stream-counter/-/stream-counter-0.2.0.tgz" + "version": "0.2.0" } } } @@ -3384,13 +2207,9 @@ }, "source-map": { "version": "0.1.32", - "from": "https://registry.npmjs.org/source-map/-/source-map-0.1.32.tgz", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.1.32.tgz", "dependencies": { "amdefine": { - "version": "0.1.0", - "from": "https://registry.npmjs.org/amdefine/-/amdefine-0.1.0.tgz", - "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-0.1.0.tgz" + "version": "0.1.0" } } } @@ -3398,447 +2217,287 @@ }, "karma-browserstack-launcher": { "version": "0.0.7", - "from": "https://registry.npmjs.org/karma-browserstack-launcher/-/karma-browserstack-launcher-0.0.7.tgz", - "resolved": "https://registry.npmjs.org/karma-browserstack-launcher/-/karma-browserstack-launcher-0.0.7.tgz", "dependencies": { "browserstack": { - "version": "1.0.1", - "from": "https://registry.npmjs.org/browserstack/-/browserstack-1.0.1.tgz", - "resolved": "https://registry.npmjs.org/browserstack/-/browserstack-1.0.1.tgz" + "version": "1.0.1" }, "q": { - "version": "0.9.7", - "from": "https://registry.npmjs.org/q/-/q-0.9.7.tgz", - "resolved": "https://registry.npmjs.org/q/-/q-0.9.7.tgz" + "version": "0.9.7" } } }, "karma-chrome-launcher": { - "version": "0.1.2", - "from": "https://registry.npmjs.org/karma-chrome-launcher/-/karma-chrome-launcher-0.1.2.tgz", - "resolved": "https://registry.npmjs.org/karma-chrome-launcher/-/karma-chrome-launcher-0.1.2.tgz" + "version": "0.1.2" }, "karma-firefox-launcher": { - "version": "0.1.3", - "from": "https://registry.npmjs.org/karma-firefox-launcher/-/karma-firefox-launcher-0.1.3.tgz", - "resolved": "https://registry.npmjs.org/karma-firefox-launcher/-/karma-firefox-launcher-0.1.3.tgz" + "version": "0.1.3" }, "karma-jasmine": { - "version": "0.1.5", - "from": "https://registry.npmjs.org/karma-jasmine/-/karma-jasmine-0.1.5.tgz", - "resolved": "https://registry.npmjs.org/karma-jasmine/-/karma-jasmine-0.1.5.tgz" + "version": "0.1.5" }, "karma-junit-reporter": { "version": "0.2.1", - "from": "https://registry.npmjs.org/karma-junit-reporter/-/karma-junit-reporter-0.2.1.tgz", - "resolved": "https://registry.npmjs.org/karma-junit-reporter/-/karma-junit-reporter-0.2.1.tgz", "dependencies": { "xmlbuilder": { - "version": "0.4.2", - "from": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-0.4.2.tgz", - "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-0.4.2.tgz" + "version": "0.4.2" } } }, "karma-ng-scenario": { - "version": "0.1.0", - "from": "https://registry.npmjs.org/karma-ng-scenario/-/karma-ng-scenario-0.1.0.tgz", - "resolved": "https://registry.npmjs.org/karma-ng-scenario/-/karma-ng-scenario-0.1.0.tgz" + "version": "0.1.0" }, "karma-sauce-launcher": { "version": "0.2.0", - "from": "https://registry.npmjs.org/karma-sauce-launcher/-/karma-sauce-launcher-0.2.0.tgz", - "resolved": "https://registry.npmjs.org/karma-sauce-launcher/-/karma-sauce-launcher-0.2.0.tgz", "dependencies": { "wd": { "version": "0.2.10", - "from": "https://registry.npmjs.org/wd/-/wd-0.2.10.tgz", - "resolved": "https://registry.npmjs.org/wd/-/wd-0.2.10.tgz", "dependencies": { "async": { - "version": "0.2.10", - "from": "https://registry.npmjs.org/async/-/async-0.2.10.tgz", - "resolved": "https://registry.npmjs.org/async/-/async-0.2.10.tgz" + "version": "0.2.10" }, "vargs": { - "version": "0.1.0", - "from": "https://registry.npmjs.org/vargs/-/vargs-0.1.0.tgz", - "resolved": "https://registry.npmjs.org/vargs/-/vargs-0.1.0.tgz" + "version": "0.1.0" }, "q": { - "version": "1.0.0", - "from": "https://registry.npmjs.org/q/-/q-1.0.0.tgz", - "resolved": "https://registry.npmjs.org/q/-/q-1.0.0.tgz" + "version": "1.0.0" }, "request": { "version": "2.33.0", - "from": "https://registry.npmjs.org/request/-/request-2.33.0.tgz", - "resolved": "https://registry.npmjs.org/request/-/request-2.33.0.tgz", "dependencies": { "qs": { - "version": "0.6.6", - "from": "https://registry.npmjs.org/qs/-/qs-0.6.6.tgz", - "resolved": "https://registry.npmjs.org/qs/-/qs-0.6.6.tgz" + "version": "0.6.6" }, "json-stringify-safe": { - "version": "5.0.0", - "from": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.0.tgz", - "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.0.tgz" + "version": "5.0.0" }, "forever-agent": { - "version": "0.5.2", - "from": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.5.2.tgz", - "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.5.2.tgz" + "version": "0.5.2" }, "node-uuid": { - "version": "1.4.1", - "from": "https://registry.npmjs.org/node-uuid/-/node-uuid-1.4.1.tgz", - "resolved": "https://registry.npmjs.org/node-uuid/-/node-uuid-1.4.1.tgz" + "version": "1.4.1" }, "mime": { - "version": "1.2.11", - "from": "https://registry.npmjs.org/mime/-/mime-1.2.11.tgz", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.2.11.tgz" + "version": "1.2.11" }, "tough-cookie": { "version": "0.12.1", - "from": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-0.12.1.tgz", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-0.12.1.tgz", "dependencies": { "punycode": { - "version": "1.2.4", - "from": "https://registry.npmjs.org/punycode/-/punycode-1.2.4.tgz", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.2.4.tgz" + "version": "1.2.4" } } }, "form-data": { "version": "0.1.2", - "from": "https://registry.npmjs.org/form-data/-/form-data-0.1.2.tgz", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-0.1.2.tgz", "dependencies": { "combined-stream": { "version": "0.0.4", - "from": "https://registry.npmjs.org/combined-stream/-/combined-stream-0.0.4.tgz", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-0.0.4.tgz", "dependencies": { "delayed-stream": { - "version": "0.0.5", - "from": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-0.0.5.tgz", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-0.0.5.tgz" + "version": "0.0.5" } } } } }, "tunnel-agent": { - "version": "0.3.0", - "from": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.3.0.tgz", - "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.3.0.tgz" + "version": "0.3.0" }, "http-signature": { "version": "0.10.0", - "from": "https://registry.npmjs.org/http-signature/-/http-signature-0.10.0.tgz", - "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-0.10.0.tgz", "dependencies": { "assert-plus": { - "version": "0.1.2", - "from": "https://registry.npmjs.org/assert-plus/-/assert-plus-0.1.2.tgz", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-0.1.2.tgz" + "version": "0.1.2" }, "asn1": { - "version": "0.1.11", - "from": "https://registry.npmjs.org/asn1/-/asn1-0.1.11.tgz", - "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.1.11.tgz" + "version": "0.1.11" }, "ctype": { - "version": "0.5.2", - "from": "https://registry.npmjs.org/ctype/-/ctype-0.5.2.tgz", - "resolved": "https://registry.npmjs.org/ctype/-/ctype-0.5.2.tgz" + "version": "0.5.2" } } }, "oauth-sign": { - "version": "0.3.0", - "from": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.3.0.tgz", - "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.3.0.tgz" + "version": "0.3.0" }, "hawk": { "version": "1.0.0", - "from": "https://registry.npmjs.org/hawk/-/hawk-1.0.0.tgz", - "resolved": "https://registry.npmjs.org/hawk/-/hawk-1.0.0.tgz", "dependencies": { "hoek": { - "version": "0.9.1", - "from": "https://registry.npmjs.org/hoek/-/hoek-0.9.1.tgz", - "resolved": "https://registry.npmjs.org/hoek/-/hoek-0.9.1.tgz" + "version": "0.9.1" }, "boom": { - "version": "0.4.2", - "from": "https://registry.npmjs.org/boom/-/boom-0.4.2.tgz", - "resolved": "https://registry.npmjs.org/boom/-/boom-0.4.2.tgz" + "version": "0.4.2" }, "cryptiles": { - "version": "0.2.2", - "from": "https://registry.npmjs.org/cryptiles/-/cryptiles-0.2.2.tgz", - "resolved": "https://registry.npmjs.org/cryptiles/-/cryptiles-0.2.2.tgz" + "version": "0.2.2" }, "sntp": { - "version": "0.2.4", - "from": "https://registry.npmjs.org/sntp/-/sntp-0.2.4.tgz", - "resolved": "https://registry.npmjs.org/sntp/-/sntp-0.2.4.tgz" + "version": "0.2.4" } } }, "aws-sign2": { - "version": "0.5.0", - "from": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.5.0.tgz", - "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.5.0.tgz" + "version": "0.5.0" } } }, "archiver": { "version": "0.5.2", - "from": "https://registry.npmjs.org/archiver/-/archiver-0.5.2.tgz", - "resolved": "https://registry.npmjs.org/archiver/-/archiver-0.5.2.tgz", "dependencies": { "readable-stream": { "version": "1.0.26", - "from": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.26.tgz", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.26.tgz", "dependencies": { "string_decoder": { - "version": "0.10.25-1", - "from": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.25-1.tgz", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.25-1.tgz" + "version": "0.10.25-1" } } }, "zip-stream": { "version": "0.1.4", - "from": "https://registry.npmjs.org/zip-stream/-/zip-stream-0.1.4.tgz", - "resolved": "https://registry.npmjs.org/zip-stream/-/zip-stream-0.1.4.tgz", "dependencies": { "lodash.defaults": { "version": "2.4.1", - "from": "https://registry.npmjs.org/lodash.defaults/-/lodash.defaults-2.4.1.tgz", - "resolved": "https://registry.npmjs.org/lodash.defaults/-/lodash.defaults-2.4.1.tgz", "dependencies": { "lodash.keys": { "version": "2.4.1", - "from": "https://registry.npmjs.org/lodash.keys/-/lodash.keys-2.4.1.tgz", - "resolved": "https://registry.npmjs.org/lodash.keys/-/lodash.keys-2.4.1.tgz", "dependencies": { "lodash._isnative": { - "version": "2.4.1", - "from": "https://registry.npmjs.org/lodash._isnative/-/lodash._isnative-2.4.1.tgz", - "resolved": "https://registry.npmjs.org/lodash._isnative/-/lodash._isnative-2.4.1.tgz" + "version": "2.4.1" }, "lodash.isobject": { - "version": "2.4.1", - "from": "https://registry.npmjs.org/lodash.isobject/-/lodash.isobject-2.4.1.tgz", - "resolved": "https://registry.npmjs.org/lodash.isobject/-/lodash.isobject-2.4.1.tgz" + "version": "2.4.1" }, "lodash._shimkeys": { - "version": "2.4.1", - "from": "https://registry.npmjs.org/lodash._shimkeys/-/lodash._shimkeys-2.4.1.tgz", - "resolved": "https://registry.npmjs.org/lodash._shimkeys/-/lodash._shimkeys-2.4.1.tgz" + "version": "2.4.1" } } }, "lodash._objecttypes": { - "version": "2.4.1", - "from": "https://registry.npmjs.org/lodash._objecttypes/-/lodash._objecttypes-2.4.1.tgz", - "resolved": "https://registry.npmjs.org/lodash._objecttypes/-/lodash._objecttypes-2.4.1.tgz" + "version": "2.4.1" } } } } }, "lazystream": { - "version": "0.1.0", - "from": "https://registry.npmjs.org/lazystream/-/lazystream-0.1.0.tgz", - "resolved": "https://registry.npmjs.org/lazystream/-/lazystream-0.1.0.tgz" + "version": "0.1.0" }, "file-utils": { "version": "0.1.5", - "from": "https://registry.npmjs.org/file-utils/-/file-utils-0.1.5.tgz", - "resolved": "https://registry.npmjs.org/file-utils/-/file-utils-0.1.5.tgz", "dependencies": { "lodash": { - "version": "2.1.0", - "from": "https://registry.npmjs.org/lodash/-/lodash-2.1.0.tgz", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-2.1.0.tgz" + "version": "2.1.0" }, "iconv-lite": { - "version": "0.2.11", - "from": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.2.11.tgz", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.2.11.tgz" + "version": "0.2.11" }, "rimraf": { - "version": "2.2.6", - "from": "https://registry.npmjs.org/rimraf/-/rimraf-2.2.6.tgz", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.2.6.tgz" + "version": "2.2.6" }, "glob": { "version": "3.2.9", - "from": "https://registry.npmjs.org/glob/-/glob-3.2.9.tgz", - "resolved": "https://registry.npmjs.org/glob/-/glob-3.2.9.tgz", "dependencies": { "inherits": { - "version": "2.0.1", - "from": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz" + "version": "2.0.1" } } }, "minimatch": { "version": "0.2.14", - "from": "https://registry.npmjs.org/minimatch/-/minimatch-0.2.14.tgz", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-0.2.14.tgz", "dependencies": { "lru-cache": { - "version": "2.5.0", - "from": "https://registry.npmjs.org/lru-cache/-/lru-cache-2.5.0.tgz", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-2.5.0.tgz" + "version": "2.5.0" }, "sigmund": { - "version": "1.0.0", - "from": "https://registry.npmjs.org/sigmund/-/sigmund-1.0.0.tgz", - "resolved": "https://registry.npmjs.org/sigmund/-/sigmund-1.0.0.tgz" + "version": "1.0.0" } } }, "findup-sync": { "version": "0.1.2", - "from": "findup-sync@0.1.2", - "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-0.1.2.tgz", "dependencies": { "glob": { "version": "3.1.21", - "from": "glob@3.1.21", - "resolved": "https://registry.npmjs.org/glob/-/glob-3.1.21.tgz", "dependencies": { "graceful-fs": { - "version": "1.2.3", - "from": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-1.2.3.tgz", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-1.2.3.tgz" + "version": "1.2.3" }, "inherits": { - "version": "1.0.0", - "from": "https://registry.npmjs.org/inherits/-/inherits-1.0.0.tgz", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-1.0.0.tgz" + "version": "1.0.0" } } }, "lodash": { - "version": "1.0.1", - "from": "lodash@1.0.1", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-1.0.1.tgz" + "version": "1.0.1" } } }, "isbinaryfile": { - "version": "0.1.9", - "from": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-0.1.9.tgz", - "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-0.1.9.tgz" + "version": "0.1.9" } } } } }, "lodash": { - "version": "2.4.1", - "from": "https://registry.npmjs.org/lodash/-/lodash-2.4.1.tgz", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-2.4.1.tgz" + "version": "2.4.1" }, "underscore.string": { - "version": "2.3.3", - "from": "https://registry.npmjs.org/underscore.string/-/underscore.string-2.3.3.tgz", - "resolved": "https://registry.npmjs.org/underscore.string/-/underscore.string-2.3.3.tgz" + "version": "2.3.3" } } }, "sauce-connect-launcher": { "version": "0.2.2", - "from": "https://registry.npmjs.org/sauce-connect-launcher/-/sauce-connect-launcher-0.2.2.tgz", - "resolved": "https://registry.npmjs.org/sauce-connect-launcher/-/sauce-connect-launcher-0.2.2.tgz", "dependencies": { "lodash": { - "version": "1.3.1", - "from": "https://registry.npmjs.org/lodash/-/lodash-1.3.1.tgz", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-1.3.1.tgz" + "version": "1.3.1" }, "async": { - "version": "0.2.10", - "from": "https://registry.npmjs.org/async/-/async-0.2.10.tgz", - "resolved": "https://registry.npmjs.org/async/-/async-0.2.10.tgz" + "version": "0.2.10" }, "adm-zip": { - "version": "0.4.4", - "from": "https://registry.npmjs.org/adm-zip/-/adm-zip-0.4.4.tgz", - "resolved": "https://registry.npmjs.org/adm-zip/-/adm-zip-0.4.4.tgz" + "version": "0.4.4" } } }, "q": { - "version": "0.9.7", - "from": "https://registry.npmjs.org/q/-/q-0.9.7.tgz", - "resolved": "https://registry.npmjs.org/q/-/q-0.9.7.tgz" + "version": "0.9.7" }, "saucelabs": { - "version": "0.1.1", - "from": "https://registry.npmjs.org/saucelabs/-/saucelabs-0.1.1.tgz", - "resolved": "https://registry.npmjs.org/saucelabs/-/saucelabs-0.1.1.tgz" + "version": "0.1.1" } } }, "karma-script-launcher": { - "version": "0.1.0", - "from": "https://registry.npmjs.org/karma-script-launcher/-/karma-script-launcher-0.1.0.tgz", - "resolved": "https://registry.npmjs.org/karma-script-launcher/-/karma-script-launcher-0.1.0.tgz" + "version": "0.1.0" }, "load-grunt-tasks": { "version": "0.3.0", - "from": "https://registry.npmjs.org/load-grunt-tasks/-/load-grunt-tasks-0.3.0.tgz", - "resolved": "https://registry.npmjs.org/load-grunt-tasks/-/load-grunt-tasks-0.3.0.tgz", "dependencies": { "globule": { "version": "0.2.0", - "from": "https://registry.npmjs.org/globule/-/globule-0.2.0.tgz", - "resolved": "https://registry.npmjs.org/globule/-/globule-0.2.0.tgz", "dependencies": { "lodash": { - "version": "2.4.1", - "from": "https://registry.npmjs.org/lodash/-/lodash-2.4.1.tgz", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-2.4.1.tgz" + "version": "2.4.1" }, "glob": { "version": "3.2.9", - "from": "https://registry.npmjs.org/glob/-/glob-3.2.9.tgz", - "resolved": "https://registry.npmjs.org/glob/-/glob-3.2.9.tgz", "dependencies": { "inherits": { - "version": "2.0.1", - "from": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz" + "version": "2.0.1" } } }, "minimatch": { "version": "0.2.14", - "from": "https://registry.npmjs.org/minimatch/-/minimatch-0.2.14.tgz", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-0.2.14.tgz", "dependencies": { "lru-cache": { - "version": "2.5.0", - "from": "https://registry.npmjs.org/lru-cache/-/lru-cache-2.5.0.tgz", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-2.5.0.tgz" + "version": "2.5.0" }, "sigmund": { - "version": "1.0.0", - "from": "https://registry.npmjs.org/sigmund/-/sigmund-1.0.0.tgz", - "resolved": "https://registry.npmjs.org/sigmund/-/sigmund-1.0.0.tgz" + "version": "1.0.0" } } } @@ -3846,150 +2505,96 @@ }, "findup-sync": { "version": "0.1.2", - "from": "https://registry.npmjs.org/findup-sync/-/findup-sync-0.1.2.tgz", - "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-0.1.2.tgz", "dependencies": { "glob": { "version": "3.1.21", - "from": "https://registry.npmjs.org/glob/-/glob-3.1.21.tgz", - "resolved": "https://registry.npmjs.org/glob/-/glob-3.1.21.tgz", "dependencies": { "minimatch": { "version": "0.2.14", - "from": "https://registry.npmjs.org/minimatch/-/minimatch-0.2.14.tgz", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-0.2.14.tgz", "dependencies": { "lru-cache": { - "version": "2.5.0", - "from": "https://registry.npmjs.org/lru-cache/-/lru-cache-2.5.0.tgz", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-2.5.0.tgz" + "version": "2.5.0" }, "sigmund": { - "version": "1.0.0", - "from": "https://registry.npmjs.org/sigmund/-/sigmund-1.0.0.tgz", - "resolved": "https://registry.npmjs.org/sigmund/-/sigmund-1.0.0.tgz" + "version": "1.0.0" } } }, "graceful-fs": { - "version": "1.2.3", - "from": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-1.2.3.tgz", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-1.2.3.tgz" + "version": "1.2.3" }, "inherits": { - "version": "1.0.0", - "from": "https://registry.npmjs.org/inherits/-/inherits-1.0.0.tgz", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-1.0.0.tgz" + "version": "1.0.0" } } }, "lodash": { - "version": "1.0.1", - "from": "https://registry.npmjs.org/lodash/-/lodash-1.0.1.tgz", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-1.0.1.tgz" + "version": "1.0.1" } } } } }, "lodash": { - "version": "2.1.0", - "from": "https://registry.npmjs.org/lodash/-/lodash-2.1.0.tgz", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-2.1.0.tgz" + "version": "2.1.0" }, "marked": { - "version": "0.3.1", - "from": "https://registry.npmjs.org/marked/-/marked-0.3.1.tgz", - "resolved": "https://registry.npmjs.org/marked/-/marked-0.3.1.tgz" + "version": "0.3.1" }, "node-html-encoder": { - "version": "0.0.2", - "from": "https://registry.npmjs.org/node-html-encoder/-/node-html-encoder-0.0.2.tgz", - "resolved": "https://registry.npmjs.org/node-html-encoder/-/node-html-encoder-0.0.2.tgz" + "version": "0.0.2" }, "promises-aplus-tests": { "version": "1.3.2", - "from": "https://registry.npmjs.org/promises-aplus-tests/-/promises-aplus-tests-1.3.2.tgz", - "resolved": "https://registry.npmjs.org/promises-aplus-tests/-/promises-aplus-tests-1.3.2.tgz", "dependencies": { "mocha": { "version": "1.11.0", - "from": "https://registry.npmjs.org/mocha/-/mocha-1.11.0.tgz", - "resolved": "https://registry.npmjs.org/mocha/-/mocha-1.11.0.tgz", "dependencies": { "commander": { - "version": "0.6.1", - "from": "https://registry.npmjs.org/commander/-/commander-0.6.1.tgz", - "resolved": "https://registry.npmjs.org/commander/-/commander-0.6.1.tgz" + "version": "0.6.1" }, "growl": { - "version": "1.7.0", - "from": "https://registry.npmjs.org/growl/-/growl-1.7.0.tgz", - "resolved": "https://registry.npmjs.org/growl/-/growl-1.7.0.tgz" + "version": "1.7.0" }, "jade": { "version": "0.26.3", - "from": "https://registry.npmjs.org/jade/-/jade-0.26.3.tgz", - "resolved": "https://registry.npmjs.org/jade/-/jade-0.26.3.tgz", "dependencies": { "mkdirp": { - "version": "0.3.0", - "from": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.3.0.tgz", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.3.0.tgz" + "version": "0.3.0" } } }, "diff": { - "version": "1.0.2", - "from": "https://registry.npmjs.org/diff/-/diff-1.0.2.tgz", - "resolved": "https://registry.npmjs.org/diff/-/diff-1.0.2.tgz" + "version": "1.0.2" }, "debug": { - "version": "0.7.4", - "from": "https://registry.npmjs.org/debug/-/debug-0.7.4.tgz", - "resolved": "https://registry.npmjs.org/debug/-/debug-0.7.4.tgz" + "version": "0.7.4" }, "mkdirp": { - "version": "0.3.5", - "from": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.3.5.tgz", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.3.5.tgz" + "version": "0.3.5" }, "ms": { - "version": "0.3.0", - "from": "https://registry.npmjs.org/ms/-/ms-0.3.0.tgz", - "resolved": "https://registry.npmjs.org/ms/-/ms-0.3.0.tgz" + "version": "0.3.0" }, "glob": { "version": "3.2.1", - "from": "https://registry.npmjs.org/glob/-/glob-3.2.1.tgz", - "resolved": "https://registry.npmjs.org/glob/-/glob-3.2.1.tgz", "dependencies": { "minimatch": { "version": "0.2.14", - "from": "https://registry.npmjs.org/minimatch/-/minimatch-0.2.14.tgz", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-0.2.14.tgz", "dependencies": { "lru-cache": { - "version": "2.5.0", - "from": "https://registry.npmjs.org/lru-cache/-/lru-cache-2.5.0.tgz", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-2.5.0.tgz" + "version": "2.5.0" }, "sigmund": { - "version": "1.0.0", - "from": "https://registry.npmjs.org/sigmund/-/sigmund-1.0.0.tgz", - "resolved": "https://registry.npmjs.org/sigmund/-/sigmund-1.0.0.tgz" + "version": "1.0.0" } } }, "graceful-fs": { - "version": "1.2.3", - "from": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-1.2.3.tgz", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-1.2.3.tgz" + "version": "1.2.3" }, "inherits": { - "version": "1.0.0", - "from": "https://registry.npmjs.org/inherits/-/inherits-1.0.0.tgz", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-1.0.0.tgz" + "version": "1.0.0" } } } @@ -3997,147 +2602,95 @@ }, "sinon": { "version": "1.7.3", - "from": "https://registry.npmjs.org/sinon/-/sinon-1.7.3.tgz", - "resolved": "https://registry.npmjs.org/sinon/-/sinon-1.7.3.tgz", "dependencies": { "buster-format": { "version": "0.5.6", - "from": "https://registry.npmjs.org/buster-format/-/buster-format-0.5.6.tgz", - "resolved": "https://registry.npmjs.org/buster-format/-/buster-format-0.5.6.tgz", "dependencies": { "buster-core": { - "version": "0.6.4", - "from": "https://registry.npmjs.org/buster-core/-/buster-core-0.6.4.tgz", - "resolved": "https://registry.npmjs.org/buster-core/-/buster-core-0.6.4.tgz" + "version": "0.6.4" } } } } }, "underscore": { - "version": "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" + "version": "1.4.4" } } }, "protractor": { "version": "0.19.0", - "from": "https://registry.npmjs.org/protractor/-/protractor-0.19.0.tgz", - "resolved": "https://registry.npmjs.org/protractor/-/protractor-0.19.0.tgz", "dependencies": { "selenium-webdriver": { - "version": "2.39.0", - "from": "https://registry.npmjs.org/selenium-webdriver/-/selenium-webdriver-2.39.0.tgz", - "resolved": "https://registry.npmjs.org/selenium-webdriver/-/selenium-webdriver-2.39.0.tgz" + "version": "2.39.0" }, "minijasminenode": { - "version": "0.2.7", - "from": "https://registry.npmjs.org/minijasminenode/-/minijasminenode-0.2.7.tgz", - "resolved": "https://registry.npmjs.org/minijasminenode/-/minijasminenode-0.2.7.tgz" + "version": "0.2.7" }, "saucelabs": { - "version": "0.1.1", - "from": "https://registry.npmjs.org/saucelabs/-/saucelabs-0.1.1.tgz", - "resolved": "https://registry.npmjs.org/saucelabs/-/saucelabs-0.1.1.tgz" + "version": "0.1.1" }, "glob": { "version": "3.2.9", - "from": "https://registry.npmjs.org/glob/-/glob-3.2.9.tgz", - "resolved": "https://registry.npmjs.org/glob/-/glob-3.2.9.tgz", "dependencies": { "minimatch": { "version": "0.2.14", - "from": "https://registry.npmjs.org/minimatch/-/minimatch-0.2.14.tgz", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-0.2.14.tgz", "dependencies": { "lru-cache": { - "version": "2.5.0", - "from": "https://registry.npmjs.org/lru-cache/-/lru-cache-2.5.0.tgz", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-2.5.0.tgz" + "version": "2.5.0" }, "sigmund": { - "version": "1.0.0", - "from": "https://registry.npmjs.org/sigmund/-/sigmund-1.0.0.tgz", - "resolved": "https://registry.npmjs.org/sigmund/-/sigmund-1.0.0.tgz" + "version": "1.0.0" } } }, "inherits": { - "version": "2.0.1", - "from": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz" + "version": "2.0.1" } } }, "adm-zip": { - "version": "0.4.4", - "from": "https://registry.npmjs.org/adm-zip/-/adm-zip-0.4.4.tgz", - "resolved": "https://registry.npmjs.org/adm-zip/-/adm-zip-0.4.4.tgz" + "version": "0.4.4" }, "optimist": { "version": "0.6.1", - "from": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz", - "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz", "dependencies": { "wordwrap": { - "version": "0.0.2", - "from": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz", - "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz" + "version": "0.0.2" }, "minimist": { - "version": "0.0.8", - "from": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz" + "version": "0.0.8" } } } } }, "q": { - "version": "1.0.0", - "from": "https://registry.npmjs.org/q/-/q-1.0.0.tgz", - "resolved": "https://registry.npmjs.org/q/-/q-1.0.0.tgz" + "version": "1.0.0" }, "q-io": { "version": "1.10.9", - "from": "https://registry.npmjs.org/q-io/-/q-io-1.10.9.tgz", - "resolved": "https://registry.npmjs.org/q-io/-/q-io-1.10.9.tgz", "dependencies": { "q": { - "version": "0.9.7", - "from": "https://registry.npmjs.org/q/-/q-0.9.7.tgz", - "resolved": "https://registry.npmjs.org/q/-/q-0.9.7.tgz" + "version": "0.9.7" }, "qs": { - "version": "0.1.0", - "from": "https://registry.npmjs.org/qs/-/qs-0.1.0.tgz", - "resolved": "https://registry.npmjs.org/qs/-/qs-0.1.0.tgz" + "version": "0.1.0" }, "url2": { - "version": "0.0.0", - "from": "https://registry.npmjs.org/url2/-/url2-0.0.0.tgz", - "resolved": "https://registry.npmjs.org/url2/-/url2-0.0.0.tgz" + "version": "0.0.0" }, "mime": { - "version": "1.2.11", - "from": "https://registry.npmjs.org/mime/-/mime-1.2.11.tgz", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.2.11.tgz" + "version": "1.2.11" }, "mimeparse": { - "version": "0.1.4", - "from": "https://registry.npmjs.org/mimeparse/-/mimeparse-0.1.4.tgz", - "resolved": "https://registry.npmjs.org/mimeparse/-/mimeparse-0.1.4.tgz" + "version": "0.1.4" }, "collections": { "version": "0.2.2", - "from": "https://registry.npmjs.org/collections/-/collections-0.2.2.tgz", - "resolved": "https://registry.npmjs.org/collections/-/collections-0.2.2.tgz", "dependencies": { "weak-map": { - "version": "1.0.0", - "from": "https://registry.npmjs.org/weak-map/-/weak-map-1.0.0.tgz", - "resolved": "https://registry.npmjs.org/weak-map/-/weak-map-1.0.0.tgz" + "version": "1.0.0" } } } @@ -4145,170 +2698,109 @@ }, "qq": { "version": "0.3.5", - "from": "https://registry.npmjs.org/qq/-/qq-0.3.5.tgz", - "resolved": "https://registry.npmjs.org/qq/-/qq-0.3.5.tgz", "dependencies": { "q": { - "version": "0.8.4", - "from": "https://registry.npmjs.org/q/-/q-0.8.4.tgz", - "resolved": "https://registry.npmjs.org/q/-/q-0.8.4.tgz" + "version": "0.8.4" } } }, "rewire": { - "version": "1.1.3", - "from": "https://registry.npmjs.org/rewire/-/rewire-1.1.3.tgz", - "resolved": "https://registry.npmjs.org/rewire/-/rewire-1.1.3.tgz" + "version": "1.1.3" }, "semver": { - "version": "2.1.0", - "from": "https://registry.npmjs.org/semver/-/semver-2.1.0.tgz", - "resolved": "https://registry.npmjs.org/semver/-/semver-2.1.0.tgz" + "version": "2.1.0" }, "shelljs": { - "version": "0.2.6", - "from": "https://registry.npmjs.org/shelljs/-/shelljs-0.2.6.tgz", - "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.2.6.tgz" + "version": "0.2.6" }, "winston": { "version": "0.7.2", - "from": "https://registry.npmjs.org/winston/-/winston-0.7.2.tgz", - "resolved": "https://registry.npmjs.org/winston/-/winston-0.7.2.tgz", "dependencies": { "async": { - "version": "0.2.10", - "from": "https://registry.npmjs.org/async/-/async-0.2.10.tgz", - "resolved": "https://registry.npmjs.org/async/-/async-0.2.10.tgz" + "version": "0.2.10" }, "colors": { - "version": "0.6.2", - "from": "https://registry.npmjs.org/colors/-/colors-0.6.2.tgz", - "resolved": "https://registry.npmjs.org/colors/-/colors-0.6.2.tgz" + "version": "0.6.2" }, "cycle": { - "version": "1.0.3", - "from": "https://registry.npmjs.org/cycle/-/cycle-1.0.3.tgz", - "resolved": "https://registry.npmjs.org/cycle/-/cycle-1.0.3.tgz" + "version": "1.0.3" }, "eyes": { - "version": "0.1.8", - "from": "https://registry.npmjs.org/eyes/-/eyes-0.1.8.tgz", - "resolved": "https://registry.npmjs.org/eyes/-/eyes-0.1.8.tgz" + "version": "0.1.8" }, "pkginfo": { - "version": "0.3.0", - "from": "https://registry.npmjs.org/pkginfo/-/pkginfo-0.3.0.tgz", - "resolved": "https://registry.npmjs.org/pkginfo/-/pkginfo-0.3.0.tgz" + "version": "0.3.0" }, "request": { "version": "2.16.6", - "from": "https://registry.npmjs.org/request/-/request-2.16.6.tgz", - "resolved": "https://registry.npmjs.org/request/-/request-2.16.6.tgz", "dependencies": { "form-data": { "version": "0.0.10", - "from": "https://registry.npmjs.org/form-data/-/form-data-0.0.10.tgz", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-0.0.10.tgz", "dependencies": { "combined-stream": { "version": "0.0.4", - "from": "https://registry.npmjs.org/combined-stream/-/combined-stream-0.0.4.tgz", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-0.0.4.tgz", "dependencies": { "delayed-stream": { - "version": "0.0.5", - "from": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-0.0.5.tgz", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-0.0.5.tgz" + "version": "0.0.5" } } } } }, "mime": { - "version": "1.2.11", - "from": "https://registry.npmjs.org/mime/-/mime-1.2.11.tgz", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.2.11.tgz" + "version": "1.2.11" }, "hawk": { "version": "0.10.2", - "from": "https://registry.npmjs.org/hawk/-/hawk-0.10.2.tgz", - "resolved": "https://registry.npmjs.org/hawk/-/hawk-0.10.2.tgz", "dependencies": { "hoek": { - "version": "0.7.6", - "from": "https://registry.npmjs.org/hoek/-/hoek-0.7.6.tgz", - "resolved": "https://registry.npmjs.org/hoek/-/hoek-0.7.6.tgz" + "version": "0.7.6" }, "boom": { - "version": "0.3.8", - "from": "https://registry.npmjs.org/boom/-/boom-0.3.8.tgz", - "resolved": "https://registry.npmjs.org/boom/-/boom-0.3.8.tgz" + "version": "0.3.8" }, "cryptiles": { - "version": "0.1.3", - "from": "https://registry.npmjs.org/cryptiles/-/cryptiles-0.1.3.tgz", - "resolved": "https://registry.npmjs.org/cryptiles/-/cryptiles-0.1.3.tgz" + "version": "0.1.3" }, "sntp": { - "version": "0.1.4", - "from": "https://registry.npmjs.org/sntp/-/sntp-0.1.4.tgz", - "resolved": "https://registry.npmjs.org/sntp/-/sntp-0.1.4.tgz" + "version": "0.1.4" } } }, "node-uuid": { - "version": "1.4.1", - "from": "https://registry.npmjs.org/node-uuid/-/node-uuid-1.4.1.tgz", - "resolved": "https://registry.npmjs.org/node-uuid/-/node-uuid-1.4.1.tgz" + "version": "1.4.1" }, "cookie-jar": { - "version": "0.2.0", - "from": "https://registry.npmjs.org/cookie-jar/-/cookie-jar-0.2.0.tgz", - "resolved": "https://registry.npmjs.org/cookie-jar/-/cookie-jar-0.2.0.tgz" + "version": "0.2.0" }, "aws-sign": { - "version": "0.2.0", - "from": "https://registry.npmjs.org/aws-sign/-/aws-sign-0.2.0.tgz", - "resolved": "https://registry.npmjs.org/aws-sign/-/aws-sign-0.2.0.tgz" + "version": "0.2.0" }, "oauth-sign": { - "version": "0.2.0", - "from": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.2.0.tgz", - "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.2.0.tgz" + "version": "0.2.0" }, "forever-agent": { - "version": "0.2.0", - "from": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.2.0.tgz", - "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.2.0.tgz" + "version": "0.2.0" }, "tunnel-agent": { - "version": "0.2.0", - "from": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.2.0.tgz", - "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.2.0.tgz" + "version": "0.2.0" }, "json-stringify-safe": { - "version": "3.0.0", - "from": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-3.0.0.tgz", - "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-3.0.0.tgz" + "version": "3.0.0" }, "qs": { - "version": "0.5.6", - "from": "https://registry.npmjs.org/qs/-/qs-0.5.6.tgz", - "resolved": "https://registry.npmjs.org/qs/-/qs-0.5.6.tgz" + "version": "0.5.6" } } }, "stack-trace": { - "version": "0.0.9", - "from": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.9.tgz", - "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.9.tgz" + "version": "0.0.9" } } }, "yaml-js": { - "version": "0.0.8", - "from": "https://registry.npmjs.org/yaml-js/-/yaml-js-0.0.8.tgz", - "resolved": "https://registry.npmjs.org/yaml-js/-/yaml-js-0.0.8.tgz" + "version": "0.0.8" } - } + }, + "name": "angularjs" } From 771bccc35c6d8ce936a05135b8d67d767d4c7e70 Mon Sep 17 00:00:00 2001 From: Peter Bacon Darwin Date: Thu, 13 Mar 2014 18:30:17 +0000 Subject: [PATCH 058/837] chore(clean-shrinkwrap): add a utility to clean up the shrinkwrap file This is to deal with https://github.com/npm/npm/issues/3581 See the previous commit for more info. Closes #6672 --- npm-shrinkwrap.json | 3 +++ package.json | 3 ++- scripts/clean-shrinkwrap.js | 45 +++++++++++++++++++++++++++++++++++++ 3 files changed, 50 insertions(+), 1 deletion(-) create mode 100755 scripts/clean-shrinkwrap.js diff --git a/npm-shrinkwrap.json b/npm-shrinkwrap.json index 2af6f725f5a1..a72db7c9df40 100644 --- a/npm-shrinkwrap.json +++ b/npm-shrinkwrap.json @@ -2713,6 +2713,9 @@ "shelljs": { "version": "0.2.6" }, + "sorted-object": { + "version": "1.0.0" + }, "winston": { "version": "0.7.2", "dependencies": { diff --git a/package.json b/package.json index 2b1d769a35ac..c239bc2bfe8e 100644 --- a/package.json +++ b/package.json @@ -54,7 +54,8 @@ "dgeni-packages": "^0.7.0", "gulp-jshint": "~1.4.2", "jshint-stylish": "~0.1.5", - "node-html-encoder": "0.0.2" + "node-html-encoder": "0.0.2", + "sorted-object": "^1.0.0" }, "licenses": [ { diff --git a/scripts/clean-shrinkwrap.js b/scripts/clean-shrinkwrap.js new file mode 100755 index 000000000000..f3d6ebe587a1 --- /dev/null +++ b/scripts/clean-shrinkwrap.js @@ -0,0 +1,45 @@ +#!/usr/bin/env node + +/** + * this script is just a temporary solution to deal with the issue of npm outputting the npm + * shrinkwrap file in an unstable manner. + * + * See: https://github.com/npm/npm/issues/3581 + */ + +var _ = require('lodash'); +var sorted = require('sorted-object'); +var fs = require('fs'); + + +function cleanModule(module, name) { + + // keep `from` and `resolve` properties for git dependencies, delete otherwise + if (!(module.resolved && module.resolved.match(/^git:\/\//))) { + delete module.from; + delete module.resolved; + } + + if (name === 'chokidar') { + if (module.version === '0.8.1') { + delete module.dependencies; + } else { + throw new Error("Unfamiliar chokidar version (v" + module.version + + ") , please check status of https://github.com/paulmillr/chokidar/pull/106"); + } + } + + _.forEach(module.dependencies, function(mod, name) { + cleanModule(mod, name); + }); +} + + +console.log('Reading npm-shrinkwrap.json'); +var shrinkwrap = require('./../npm-shrinkwrap.json'); + +console.log('Cleaning shrinkwrap object'); +cleanModule(shrinkwrap, shrinkwrap.name); + +console.log('Writing cleaned npm-shrinkwrap.json'); +fs.writeFileSync('./npm-shrinkwrap.json', JSON.stringify(sorted(shrinkwrap), null, 2) + "\n"); From ca7336391aba0f1c76b89381742716e98df67576 Mon Sep 17 00:00:00 2001 From: Igor Minar Date: Fri, 14 Mar 2014 23:06:04 -0700 Subject: [PATCH 059/837] chore(package.json): update karma to 0.12.0 --- npm-shrinkwrap.json | 11 ++++------- package.json | 2 +- 2 files changed, 5 insertions(+), 8 deletions(-) diff --git a/npm-shrinkwrap.json b/npm-shrinkwrap.json index a72db7c9df40..a83767c438fd 100644 --- a/npm-shrinkwrap.json +++ b/npm-shrinkwrap.json @@ -1967,7 +1967,7 @@ } }, "karma": { - "version": "0.11.12", + "version": "0.12.0", "dependencies": { "di": { "version": "0.0.1" @@ -2083,9 +2083,6 @@ } } }, - "coffee-script": { - "version": "1.6.3" - }, "rimraf": { "version": "2.2.6" }, @@ -2102,7 +2099,7 @@ "version": "1.2.11" }, "log4js": { - "version": "0.6.10", + "version": "0.6.12", "dependencies": { "async": { "version": "0.1.15" @@ -2111,7 +2108,7 @@ "version": "1.1.4" }, "readable-stream": { - "version": "1.0.26", + "version": "1.0.26-2", "dependencies": { "string_decoder": { "version": "0.10.25-1" @@ -2206,7 +2203,7 @@ } }, "source-map": { - "version": "0.1.32", + "version": "0.1.33", "dependencies": { "amdefine": { "version": "0.1.0" diff --git a/package.json b/package.json index c239bc2bfe8e..7d430529061d 100644 --- a/package.json +++ b/package.json @@ -27,7 +27,7 @@ "q-io": "~1.10.6", "qq": "~0.3.5", "shelljs": "~0.2.6", - "karma": "0.11.12", + "karma": "^0.12.0", "karma-jasmine": "0.1.5", "karma-chrome-launcher": "0.1.2", "karma-firefox-launcher": "0.1.3", From fbb125a3af164e52af2f8119175b04cbbed2f331 Mon Sep 17 00:00:00 2001 From: Bruno Baia Date: Tue, 19 Nov 2013 00:30:36 +0100 Subject: [PATCH 060/837] fix($http): allow sending Blob data using $http Closes #5012 --- src/.jshintrc | 1 + src/Angular.js | 6 ++++++ src/ng/http.js | 2 +- test/ng/httpSpec.js | 10 ++++++++++ 4 files changed, 18 insertions(+), 1 deletion(-) diff --git a/src/.jshintrc b/src/.jshintrc index f32caa451ed6..35bba32e73ed 100644 --- a/src/.jshintrc +++ b/src/.jshintrc @@ -64,6 +64,7 @@ "isWindow": false, "isScope": false, "isFile": false, + "isBlob": false, "isBoolean": false, "trim": false, "isElement": false, diff --git a/src/Angular.js b/src/Angular.js index 68ae929539ce..96df13f4ff8d 100644 --- a/src/Angular.js +++ b/src/Angular.js @@ -45,6 +45,7 @@ -isWindow, -isScope, -isFile, + -isBlob, -isBoolean, -trim, -isElement, @@ -566,6 +567,11 @@ function isFile(obj) { } +function isBlob(obj) { + return toString.call(obj) === '[object Blob]'; +} + + function isBoolean(value) { return typeof value === 'boolean'; } diff --git a/src/ng/http.js b/src/ng/http.js index 0c54f5bb636e..c7dc64e2c4fd 100644 --- a/src/ng/http.js +++ b/src/ng/http.js @@ -103,7 +103,7 @@ function $HttpProvider() { // transform outgoing request data transformRequest: [function(d) { - return isObject(d) && !isFile(d) ? toJson(d) : d; + return isObject(d) && !isFile(d) && !isBlob(d) ? toJson(d) : d; }], // default headers diff --git a/test/ng/httpSpec.js b/test/ng/httpSpec.js index a7b244831f6f..86ab72ea8bd8 100644 --- a/test/ng/httpSpec.js +++ b/test/ng/httpSpec.js @@ -989,6 +989,16 @@ describe('$http', function() { }); + it('should ignore Blob objects', function () { + if (!window.Blob) return; + + var blob = new Blob(['blob!'], { type: 'text/plain' }); + + $httpBackend.expect('POST', '/url', '[object Blob]').respond(''); + $http({ method: 'POST', url: '/url', data: blob }); + }); + + it('should have access to request headers', function() { $httpBackend.expect('POST', '/url', 'header1').respond(200); $http.post('/url', 'req', { From 8d28d65b3688a406d03de2c1be60568e53a7862c Mon Sep 17 00:00:00 2001 From: Emile Silvis Date: Fri, 14 Mar 2014 11:57:21 +0200 Subject: [PATCH 061/837] docs(guide/tutorial): make capitalization of "Angular" consistent - step_05.ngdoc - step_06.ngdoc - step_07.ngdoc - step_08.ngdoc Closes #6686 Closes #6687 Closes #6688 Closes #6689 --- docs/content/tutorial/step_05.ngdoc | 14 +++++++------- docs/content/tutorial/step_06.ngdoc | 2 +- docs/content/tutorial/step_07.ngdoc | 2 +- docs/content/tutorial/step_08.ngdoc | 2 +- 4 files changed, 10 insertions(+), 10 deletions(-) diff --git a/docs/content/tutorial/step_05.ngdoc b/docs/content/tutorial/step_05.ngdoc index 8291eeb85992..e37de7a7f089 100644 --- a/docs/content/tutorial/step_05.ngdoc +++ b/docs/content/tutorial/step_05.ngdoc @@ -20,7 +20,7 @@ You should now see a list of 20 phones. The most important changes are listed below. You can see the full diff on [GitHub](https://github.com/angular/angular-phonecat/compare/step-4...step-5): ## Data - +a The `app/phones/phones.json` file in your project is a dataset that contains a larger list of phones stored in the JSON format. @@ -44,7 +44,7 @@ Following is a sample of the file: We'll use Angular's {@link ng.$http $http} service in our controller to make an HTTP request to your web server to fetch the data in the `app/phones/phones.json` file. `$http` is just -one of several built-in {@link guide/dev_guide.services angular services} that handle common operations +one of several built-in {@link guide/dev_guide.services Angular services} that handle common operations in web apps. Angular injects these services for you where you need them. Services are managed by Angular's {@link guide/di DI subsystem}. Dependency injection @@ -74,10 +74,10 @@ tutorial.) The `$http` service returns a {@link ng.$q promise object} with a `success` method. We call this method to handle the asynchronous response and assign the phone data to the -scope controlled by this controller, as a model called `phones`. Notice that angular detected the +scope controlled by this controller, as a model called `phones`. Notice that Angular detected the json response and parsed it for us! -To use a service in angular, you simply declare the names of the dependencies you need as arguments +To use a service in Angular, you simply declare the names of the dependencies you need as arguments to the controller's constructor function, as follows: phonecatApp.controller('PhoneListCtrl', function ($scope, $http) {...} @@ -96,7 +96,7 @@ dependencies. ### `$` Prefix Naming Convention You can create your own services, and in fact we will do exactly that in step 11. As a naming -convention, angular's built-in services, Scope methods and a few other Angular APIs have a `$` +convention, Angular's built-in services, Scope methods and a few other Angular APIs have a `$` prefix in front of the name. The `$` prefix is there to namespace Angular-provided services. @@ -167,7 +167,7 @@ __`test/unit/controllersSpec.js`:__ Because we started using dependency injection and our controller has dependencies, constructing the controller in our tests is a bit more complicated. We could use the `new` operator and provide the constructor with some kind of fake `$http` implementation. However, the recommended (and easier) way -is to create a controller in the test environment in the same way that angular does it in the +is to create a controller in the test environment in the same way that Angular does it in the production code behind the scenes, as follows: ```js @@ -269,7 +269,7 @@ to the first 5 in the list. Use the following code in the `$http` callback: # Summary -Now that you have learned how easy it is to use angular services (thanks to Angular's dependency +Now that you have learned how easy it is to use Angular services (thanks to Angular's dependency injection), go to {@link step_06 step 6}, where you will add some thumbnail images of phones and some links. diff --git a/docs/content/tutorial/step_06.ngdoc b/docs/content/tutorial/step_06.ngdoc index 04c19f663fc6..61586c79e4ca 100644 --- a/docs/content/tutorial/step_06.ngdoc +++ b/docs/content/tutorial/step_06.ngdoc @@ -63,7 +63,7 @@ the element attribute. We also added phone images next to each record using an image tag with the {@link ng.directive:ngSrc ngSrc} directive. That directive prevents the -browser from treating the angular `{{ expression }}` markup literally, and initiating a request to +browser from treating the Angular `{{ expression }}` markup literally, and initiating a request to invalid url `http://localhost:8000/app/{{phone.imageUrl}}`, which it would have done if we had only specified an attribute binding in a regular `src` attribute (``). Using the `ngSrc` directive prevents the browser from making an http request to an invalid location. diff --git a/docs/content/tutorial/step_07.ngdoc b/docs/content/tutorial/step_07.ngdoc index 4c45f2d4b273..f6fdac5c0a51 100644 --- a/docs/content/tutorial/step_07.ngdoc +++ b/docs/content/tutorial/step_07.ngdoc @@ -114,7 +114,7 @@ Our application routes are defined as follows: view, Angular will use the `phone-list.html` template and the `PhoneListCtrl` controller. * The phone details view will be shown when the URL hash fragment matches '/phone/:phoneId', where -`:phoneId` is a variable part of the URL. To construct the phone details view, angular will use the +`:phoneId` is a variable part of the URL. To construct the phone details view, Angular will use the `phone-detail.html` template and the `PhoneDetailCtrl` controller. We reused the `PhoneListCtrl` controller that we constructed in previous steps and we added a new, diff --git a/docs/content/tutorial/step_08.ngdoc b/docs/content/tutorial/step_08.ngdoc index ed085731d909..f432df74c512 100644 --- a/docs/content/tutorial/step_08.ngdoc +++ b/docs/content/tutorial/step_08.ngdoc @@ -79,7 +79,7 @@ route by the `$route` service. ## Template The TBD placeholder line has been replaced with lists and bindings that comprise the phone details. -Note where we use the angular `{{expression}}` markup and `ngRepeat` to project phone data from +Note where we use the Angular `{{expression}}` markup and `ngRepeat` to project phone data from our model into the view. From 1b46a7dcdf00efd9e1b83eec7a6d873ad5d6d30e Mon Sep 17 00:00:00 2001 From: Peter Bacon Darwin Date: Tue, 18 Mar 2014 07:11:59 +0000 Subject: [PATCH 062/837] chore(version-info): previousVersions should not return `undefined` Closes #6702 --- lib/versions/version-info.js | 2 ++ 1 file changed, 2 insertions(+) diff --git a/lib/versions/version-info.js b/lib/versions/version-info.js index 5bf0658575ae..4f7097ba57f8 100644 --- a/lib/versions/version-info.js +++ b/lib/versions/version-info.js @@ -123,6 +123,8 @@ var getPreviousVersions = function() { }) .sort(semver.compare) .value(); + } else { + return []; } }; From c24e4e4ed5fb066e55209c2225254be62abc190c Mon Sep 17 00:00:00 2001 From: Peter Bacon Darwin Date: Tue, 18 Mar 2014 07:07:02 +0000 Subject: [PATCH 063/837] chore(package.json): update dgeni-packages dependency --- npm-shrinkwrap.json | 2 +- package.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/npm-shrinkwrap.json b/npm-shrinkwrap.json index a83767c438fd..2742b1786b69 100644 --- a/npm-shrinkwrap.json +++ b/npm-shrinkwrap.json @@ -524,7 +524,7 @@ } }, "dgeni-packages": { - "version": "0.7.1", + "version": "0.8.1", "dependencies": { "lodash": { "version": "2.4.1" diff --git a/package.json b/package.json index 7d430529061d..ac7fab66c471 100644 --- a/package.json +++ b/package.json @@ -51,7 +51,7 @@ "canonical-path": "0.0.2", "winston": "~0.7.2", "dgeni": "^0.2.2", - "dgeni-packages": "^0.7.0", + "dgeni-packages": "^0.8.1", "gulp-jshint": "~1.4.2", "jshint-stylish": "~0.1.5", "node-html-encoder": "0.0.2", From 103cb513d93109e3af37268ea176e89d4883431b Mon Sep 17 00:00:00 2001 From: Peter Bacon Darwin Date: Tue, 18 Mar 2014 07:07:36 +0000 Subject: [PATCH 064/837] docs(guide/concepts): move ng-app into example text Closes #6639 --- docs/content/guide/concepts.ngdoc | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/docs/content/guide/concepts.ngdoc b/docs/content/guide/concepts.ngdoc index 63ec1bcfde4f..8d178aa7395c 100644 --- a/docs/content/guide/concepts.ngdoc +++ b/docs/content/guide/concepts.ngdoc @@ -32,9 +32,9 @@ In the following example we will build a form to calculate the costs of an invoi Let's start with input fields for quantity and cost whose values are multiplied to produce the total of the invoice: - + -
    +
    Invoice:
    Quantity: @@ -102,7 +102,7 @@ The concept behind this is "{@link databinding two-way dat Let's add some more logic to the example that allows us to enter and calculate the costs in different currencies and also pay the invoice. - + angular.module('invoice1', []) .controller('InvoiceController', function() { @@ -128,7 +128,7 @@ different currencies and also pay the invoice. }); -
    +
    Invoice:
    Quantity: @@ -191,7 +191,7 @@ from the web, e.g. by calling the Yahoo Finance API, without changing the contro Let's refactor our example and move the currency conversion into a service in another file: - + angular.module('finance2', []) .factory('currencyConverter', function() { @@ -228,7 +228,7 @@ Let's refactor our example and move the currency conversion into a service in an }]); -
    +
    Invoice:
    Quantity: @@ -302,7 +302,7 @@ to something shorter like `a`. Let's finish our example by fetching the exchange rates from the Yahoo Finance API. The following example shows how this is done with Angular: - + angular.module('invoice3', ['finance3']) .controller('InvoiceController', ['currencyConverter', function(currencyConverter) { @@ -356,7 +356,7 @@ The following example shows how this is done with Angular: }]); -
    +
    Invoice:
    Quantity: From 922cb7e42f1ff6c3f39342b96be472048ad9cb25 Mon Sep 17 00:00:00 2001 From: Igor Minar Date: Mon, 17 Mar 2014 15:50:24 -0700 Subject: [PATCH 065/837] chore(log): add `log.empty()` method to the testing logger `log.empty()` is the same as `log.reset()`, except thati `empty()` also returns the current array with messages instead of: ``` // do work expect(log).toEqual(['bar']); log.reset(); ``` do: ``` // do work expect(log.empty()).toEqual(['bar']); ``` --- test/helpers/testabilityPatch.js | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/test/helpers/testabilityPatch.js b/test/helpers/testabilityPatch.js index f61be4eeb13f..34b6b78a0141 100644 --- a/test/helpers/testabilityPatch.js +++ b/test/helpers/testabilityPatch.js @@ -269,21 +269,27 @@ function provideLog($provide) { log.toString = function() { return messages.join('; '); - } + }; log.toArray = function() { return messages; - } + }; log.reset = function() { messages = []; + }; + + log.empty = function() { + var currentMessages = messages; + messages = []; + return currentMessages; } log.fn = function(msg) { return function() { log(msg); - } - } + }; + }; log.$$log = true; From 3dd9572754c7bafec30dd625f5c611346959c969 Mon Sep 17 00:00:00 2001 From: Igor Minar Date: Mon, 17 Mar 2014 15:48:09 -0700 Subject: [PATCH 066/837] fix(Scope): $watchCollection should call listener with oldValue Originally we destroyed the oldValue by incrementaly copying over portions of the newValue into the oldValue during dirty-checking, this resulted in oldValue to be equal to newValue by the time we called the watchCollection listener. The fix creates a copy of the newValue each time a change is detected and then uses that copy *the next time* a change is detected. To make `$watchCollection` behave the same way as `$watch`, during the first iteration the listener is called with newValue and oldValue being identical. Since many of the corner-cases are already covered by existing tests, I refactored the test logging to include oldValue and made the tests more readable. Closes #2621 Closes #5661 Closes #5688 Closes #6736 --- src/ng/rootScope.js | 51 +++++++++++++++--- test/ng/rootScopeSpec.js | 114 ++++++++++++++++++++++++++------------- 2 files changed, 119 insertions(+), 46 deletions(-) diff --git a/src/ng/rootScope.js b/src/ng/rootScope.js index 2bb965bb7b6f..ce0f8ad54cb3 100644 --- a/src/ng/rootScope.js +++ b/src/ng/rootScope.js @@ -398,30 +398,40 @@ function $RootScopeProvider(){ * {@link ng.$rootScope.Scope#$digest $digest} cycle. Any shallow change within the * collection will trigger a call to the `listener`. * - * @param {function(newCollection, oldCollection, scope)} listener a callback function that is - * fired with both the `newCollection` and `oldCollection` as parameters. - * The `newCollection` object is the newly modified data obtained from the `obj` expression - * and the `oldCollection` object is a copy of the former collection data. - * The `scope` refers to the current scope. + * @param {function(newCollection, oldCollection, scope)} listener a callback function called + * when a change is detected. + * - The `newCollection` object is the newly modified data obtained from the `obj` expression + * - The `oldCollection` object is a copy of the former collection data. + * Due to performance considerations, the`oldCollection` value is computed only if the + * `listener` function declares two or more arguments. + * - The `scope` argument refers to the current scope. * * @returns {function()} Returns a de-registration function for this listener. When the * de-registration function is executed, the internal watch operation is terminated. */ $watchCollection: function(obj, listener) { var self = this; - var oldValue; + // the current value, updated on each dirty-check run var newValue; + // a shallow copy of the newValue from the last dirty-check run, + // updated to match newValue during dirty-check run + var oldValue; + // a shallow copy of the newValue from when the last change happened + var veryOldValue; + // only track veryOldValue if the listener is asking for it + var trackVeryOldValue = (listener.length > 1); var changeDetected = 0; var objGetter = $parse(obj); var internalArray = []; var internalObject = {}; + var initRun = true; var oldLength = 0; function $watchCollectionWatch() { newValue = objGetter(self); var newLength, key; - if (!isObject(newValue)) { + if (!isObject(newValue)) { // if primitive if (oldValue !== newValue) { oldValue = newValue; changeDetected++; @@ -487,7 +497,32 @@ function $RootScopeProvider(){ } function $watchCollectionAction() { - listener(newValue, oldValue, self); + if (initRun) { + initRun = false; + listener(newValue, newValue, self); + } else { + listener(newValue, veryOldValue, self); + } + + // make a copy for the next time a collection is changed + if (trackVeryOldValue) { + if (!isObject(newValue)) { + //primitive + veryOldValue = newValue; + } else if (isArrayLike(newValue)) { + veryOldValue = new Array(newValue.length); + for (var i = 0; i < newValue.length; i++) { + veryOldValue[i] = newValue[i]; + } + } else { // if object + veryOldValue = {}; + for (var key in newValue) { + if (hasOwnProperty.call(newValue, key)) { + veryOldValue[key] = newValue[key]; + } + } + } + } } return this.$watch($watchCollectionWatch, $watchCollectionAction); diff --git a/test/ng/rootScopeSpec.js b/test/ng/rootScopeSpec.js index f9cf9412c605..251a8ce882c4 100644 --- a/test/ng/rootScopeSpec.js +++ b/test/ng/rootScopeSpec.js @@ -483,104 +483,127 @@ describe('Scope', function() { describe('$watchCollection', function() { var log, $rootScope, deregister; - beforeEach(inject(function(_$rootScope_) { - log = []; + beforeEach(inject(function(_$rootScope_, _log_) { $rootScope = _$rootScope_; - deregister = $rootScope.$watchCollection('obj', function logger(obj) { - log.push(toJson(obj)); + log = _log_; + deregister = $rootScope.$watchCollection('obj', function logger(newVal, oldVal) { + var msg = {newVal: newVal, oldVal: oldVal}; + + if (newVal === oldVal) { + msg.identical = true; + } + + log(msg); }); })); it('should not trigger if nothing change', inject(function($rootScope) { $rootScope.$digest(); - expect(log).toEqual([undefined]); + expect(log).toEqual([{ newVal : undefined, oldVal : undefined, identical : true }]); + log.reset(); $rootScope.$digest(); - expect(log).toEqual([undefined]); + expect(log).toEqual([]); })); - it('should allow deregistration', inject(function($rootScope) { + it('should allow deregistration', function() { $rootScope.obj = []; $rootScope.$digest(); - - expect(log).toEqual(['[]']); + expect(log.toArray().length).toBe(1); + log.reset(); $rootScope.obj.push('a'); deregister(); $rootScope.$digest(); - expect(log).toEqual(['[]']); - })); + expect(log).toEqual([]); + }); describe('array', function() { + + it('should return oldCollection === newCollection only on the first listener call', + inject(function($rootScope, log) { + + // first time should be identical + $rootScope.obj = ['a', 'b']; + $rootScope.$digest(); + expect(log).toEqual([{newVal: ['a', 'b'], oldVal: ['a', 'b'], identical: true}]); + log.reset(); + + // second time should be different + $rootScope.obj[1] = 'c'; + $rootScope.$digest(); + expect(log).toEqual([{newVal: ['a', 'c'], oldVal: ['a', 'b']}]); + })); + + it('should trigger when property changes into array', function() { $rootScope.obj = 'test'; $rootScope.$digest(); - expect(log).toEqual(['"test"']); + expect(log.empty()).toEqual([{newVal: "test", oldVal: "test", identical: true}]); $rootScope.obj = []; $rootScope.$digest(); - expect(log).toEqual(['"test"', '[]']); + expect(log.empty()).toEqual([{newVal: [], oldVal: "test"}]); $rootScope.obj = {}; $rootScope.$digest(); - expect(log).toEqual(['"test"', '[]', '{}']); + expect(log.empty()).toEqual([{newVal: {}, oldVal: []}]); $rootScope.obj = []; $rootScope.$digest(); - expect(log).toEqual(['"test"', '[]', '{}', '[]']); + expect(log.empty()).toEqual([{newVal: [], oldVal: {}}]); $rootScope.obj = undefined; $rootScope.$digest(); - expect(log).toEqual(['"test"', '[]', '{}', '[]', undefined]); + expect(log.empty()).toEqual([{newVal: undefined, oldVal: []}]); }); it('should not trigger change when object in collection changes', function() { $rootScope.obj = [{}]; $rootScope.$digest(); - expect(log).toEqual(['[{}]']); + expect(log.empty()).toEqual([{newVal: [{}], oldVal: [{}], identical: true}]); $rootScope.obj[0].name = 'foo'; $rootScope.$digest(); - expect(log).toEqual(['[{}]']); + expect(log).toEqual([]); }); it('should watch array properties', function() { $rootScope.obj = []; $rootScope.$digest(); - expect(log).toEqual(['[]']); + expect(log.empty()).toEqual([{newVal: [], oldVal: [], identical: true}]); $rootScope.obj.push('a'); $rootScope.$digest(); - expect(log).toEqual(['[]', '["a"]']); + expect(log.empty()).toEqual([{newVal: ['a'], oldVal: []}]); $rootScope.obj[0] = 'b'; $rootScope.$digest(); - expect(log).toEqual(['[]', '["a"]', '["b"]']); + expect(log.empty()).toEqual([{newVal: ['b'], oldVal: ['a']}]); $rootScope.obj.push([]); $rootScope.obj.push({}); - log = []; $rootScope.$digest(); - expect(log).toEqual(['["b",[],{}]']); + expect(log.empty()).toEqual([{newVal: ['b', [], {}], oldVal: ['b']}]); var temp = $rootScope.obj[1]; $rootScope.obj[1] = $rootScope.obj[2]; $rootScope.obj[2] = temp; $rootScope.$digest(); - expect(log).toEqual([ '["b",[],{}]', '["b",{},[]]' ]); + expect(log.empty()).toEqual([{newVal: ['b', {}, []], oldVal: ['b', [], {}]}]); $rootScope.obj.shift(); - log = []; $rootScope.$digest(); - expect(log).toEqual([ '[{},[]]' ]); + expect(log.empty()).toEqual([{newVal: [{}, []], oldVal: ['b', {}, []]}]); }); + it('should watch array-like objects like arrays', function () { var arrayLikelog = []; $rootScope.$watchCollection('arrayLikeObject', function logger(obj) { @@ -601,57 +624,72 @@ describe('Scope', function() { describe('object', function() { + + it('should return oldCollection === newCollection only on the first listener call', + inject(function($rootScope, log) { + + $rootScope.obj = {'a': 'b'}; + // first time should be identical + $rootScope.$digest(); + expect(log.empty()).toEqual([{newVal: {'a': 'b'}, oldVal: {'a': 'b'}, identical: true}]); + + // second time not identical + $rootScope.obj.a = 'c'; + $rootScope.$digest(); + expect(log).toEqual([{newVal: {'a': 'c'}, oldVal: {'a': 'b'}}]); + })); + + it('should trigger when property changes into object', function() { $rootScope.obj = 'test'; $rootScope.$digest(); - expect(log).toEqual(['"test"']); + expect(log.empty()).toEqual([{newVal: 'test', oldVal: 'test', identical: true}]); $rootScope.obj = {}; $rootScope.$digest(); - expect(log).toEqual(['"test"', '{}']); + expect(log.empty()).toEqual([{newVal: {}, oldVal: 'test'}]); }); it('should not trigger change when object in collection changes', function() { $rootScope.obj = {name: {}}; $rootScope.$digest(); - expect(log).toEqual(['{"name":{}}']); + expect(log.empty()).toEqual([{newVal: {name: {}}, oldVal: {name: {}}, identical: true}]); $rootScope.obj.name.bar = 'foo'; $rootScope.$digest(); - expect(log).toEqual(['{"name":{}}']); + expect(log.empty()).toEqual([]); }); it('should watch object properties', function() { $rootScope.obj = {}; $rootScope.$digest(); - expect(log).toEqual(['{}']); + expect(log.empty()).toEqual([{newVal: {}, oldVal: {}, identical: true}]); $rootScope.obj.a= 'A'; $rootScope.$digest(); - expect(log).toEqual(['{}', '{"a":"A"}']); + expect(log.empty()).toEqual([{newVal: {a: 'A'}, oldVal: {}}]); $rootScope.obj.a = 'B'; $rootScope.$digest(); - expect(log).toEqual(['{}', '{"a":"A"}', '{"a":"B"}']); + expect(log.empty()).toEqual([{newVal: {a: 'B'}, oldVal: {a: 'A'}}]); $rootScope.obj.b = []; $rootScope.obj.c = {}; - log = []; $rootScope.$digest(); - expect(log).toEqual(['{"a":"B","b":[],"c":{}}']); + expect(log.empty()).toEqual([{newVal: {a: 'B', b: [], c: {}}, oldVal: {a: 'B'}}]); var temp = $rootScope.obj.a; $rootScope.obj.a = $rootScope.obj.b; $rootScope.obj.c = temp; $rootScope.$digest(); - expect(log).toEqual([ '{"a":"B","b":[],"c":{}}', '{"a":[],"b":[],"c":"B"}' ]); + expect(log.empty()). + toEqual([{newVal: {a: [], b: {}, c: 'B'}, oldVal: {a: 'B', b: [], c: {}}}]); delete $rootScope.obj.a; - log = []; $rootScope.$digest(); - expect(log).toEqual([ '{"b":[],"c":"B"}' ]); + expect(log.empty()).toEqual([{newVal: {b: {}, c: 'B'}, oldVal: {a: [], b: {}, c: 'B'}}]); }); }); }); From e84da2283c4e195be557f7b06c8783fe502acbbb Mon Sep 17 00:00:00 2001 From: Traxmaxx Date: Tue, 4 Mar 2014 18:54:08 +0100 Subject: [PATCH 067/837] fix($$RAFProvider): check for webkitCancelRequestAnimationFrame Android 4.3 only supports webkitCancelRequestAnimationFrame. Closes #6526 --- src/ng/raf.js | 3 ++- test/ng/rafSpec.js | 32 +++++++++++++++++++++++++++----- 2 files changed, 29 insertions(+), 6 deletions(-) diff --git a/src/ng/raf.js b/src/ng/raf.js index e07adbfed5ce..bb1f47ed5e65 100644 --- a/src/ng/raf.js +++ b/src/ng/raf.js @@ -8,7 +8,8 @@ function $$RAFProvider(){ //rAF var cancelAnimationFrame = $window.cancelAnimationFrame || $window.webkitCancelAnimationFrame || - $window.mozCancelAnimationFrame; + $window.mozCancelAnimationFrame || + $window.webkitCancelRequestAnimationFrame; var rafSupported = !!requestAnimationFrame; var raf = rafSupported diff --git a/test/ng/rafSpec.js b/test/ng/rafSpec.js index 8bf76efd03b0..7c67b8c9409f 100644 --- a/test/ng/rafSpec.js +++ b/test/ng/rafSpec.js @@ -38,11 +38,8 @@ describe('$$rAF', function() { //we need to create our own injector to work around the ngMock overrides var injector = createInjector(['ng', function($provide) { $provide.value('$timeout', timeoutSpy); - $provide.decorator('$window', function($delegate) { - $delegate.requestAnimationFrame = false; - $delegate.webkitRequestAnimationFrame = false; - $delegate.mozRequestAnimationFrame = false; - return $delegate; + $provide.value('$window', { + location : window.location, }); }]); @@ -76,4 +73,29 @@ describe('$$rAF', function() { } })); }); + + describe('mobile', function() { + it('should provide a cancellation method for an older version of Android', function() { + //we need to create our own injector to work around the ngMock overrides + var injector = createInjector(['ng', function($provide) { + $provide.value('$window', { + location : window.location, + webkitRequestAnimationFrame: jasmine.createSpy('$window.webkitRequestAnimationFrame'), + webkitCancelRequestAnimationFrame: jasmine.createSpy('$window.webkitCancelRequestAnimationFrame') + }); + }]); + + var $$rAF = injector.get('$$rAF'); + var $window = injector.get('$window'); + var cancel = $$rAF(function() {}); + + expect($$rAF.supported).toBe(true); + + try { + cancel(); + } catch(e) {} + + expect($window.webkitCancelRequestAnimationFrame).toHaveBeenCalled(); + }); + }); }); From d4ac25496aaace2b85aa9f5e5232e5eabeb40c63 Mon Sep 17 00:00:00 2001 From: Brett Porter Date: Tue, 18 Mar 2014 15:36:00 +1100 Subject: [PATCH 068/837] test(ngMock): workaround issue with negative timestamps In some specific timezones and operating systems, it seems that getTimezoneOffset() can return an incorrect value for negative timestamps, as described in #5017. While this isn't something easily fixed in the mock code, the tests can avoid that particular timeframe by using a positive timestamp. Closes #5017 Closes #6730 --- test/ngMock/angular-mocksSpec.js | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/test/ngMock/angular-mocksSpec.js b/test/ngMock/angular-mocksSpec.js index c2b6108dfb33..b78e9bbf207a 100644 --- a/test/ngMock/angular-mocksSpec.js +++ b/test/ngMock/angular-mocksSpec.js @@ -52,16 +52,19 @@ describe('ngMock', function() { it('should fake getHours method', function() { - //0 in -3h - var t0 = new angular.mock.TzDate(-3, 0); + // avoid going negative due to #5017, so use Jan 2, 1970 00:00 UTC + var jan2 = 24 * 60 * 60 * 1000; + + //0:00 in -3h + var t0 = new angular.mock.TzDate(-3, jan2); expect(t0.getHours()).toBe(3); - //0 in +0h - var t1 = new angular.mock.TzDate(0, 0); + //0:00 in +0h + var t1 = new angular.mock.TzDate(0, jan2); expect(t1.getHours()).toBe(0); - //0 in +3h - var t2 = new angular.mock.TzDate(3, 0); + //0:00 in +3h + var t2 = new angular.mock.TzDate(3, jan2); expect(t2.getHours()).toMatch(21); }); From 83f37d78ba2c948b717dac5635bb2eec43574bd0 Mon Sep 17 00:00:00 2001 From: Chirayu Krishnappa Date: Thu, 13 Mar 2014 17:42:43 -0700 Subject: [PATCH 069/837] fix(version-info): explicitly specify the remote `git ls-remote --tags` assumes that you have a remote set up for your current branch. That isn't the case, at least for me, when I'm working on local branches. `grunt write` doesn't do the right thing in that case (`git ls-remote --tags` bails out and the silent: true param makes this a pain to debug.) Prefer explicit to implicit. Closes #6678. --- lib/versions/version-info.js | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/lib/versions/version-info.js b/lib/versions/version-info.js index 4f7097ba57f8..70901fb7084d 100644 --- a/lib/versions/version-info.js +++ b/lib/versions/version-info.js @@ -103,7 +103,9 @@ var getPreviousVersions = function() { // always use the remote tags as the local clone might // not contain all commits when cloned with git clone --depth=... // Needed e.g. for Travis - var tagResults = shell.exec('git ls-remote --tags | grep -o -e "v[0-9].*[0-9]$"', {silent: true}); + var repo_url = currentPackage.repository.url; + var tagResults = shell.exec('git ls-remote --tags ' + repo_url + ' | grep -o -e "v[0-9].*[0-9]$"', + {silent: true}); if ( tagResults.code === 0 ) { return _(tagResults.output.trim().split('\n')) .map(function(tag) { @@ -174,6 +176,6 @@ var getSnapshotVersion = function() { exports.currentPackage = currentPackage = getPackage(); +exports.gitRepoInfo = gitRepoInfo = getGitRepoInfo(); exports.previousVersions = previousVersions = getPreviousVersions(); exports.currentVersion = getTaggedVersion() || getSnapshotVersion(); -exports.gitRepoInfo = getGitRepoInfo(); From 1da4e8938598b22373c8a252c7dc1f7e2334ed3f Mon Sep 17 00:00:00 2001 From: Vojta Jina Date: Fri, 14 Mar 2014 14:24:21 -0700 Subject: [PATCH 070/837] chore(scripts): make the release script more flexible Now the SHA can be short/long, whateva. --- scripts/jenkins/release.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/jenkins/release.sh b/scripts/jenkins/release.sh index 8c1e46bc09b0..bb512f7030bb 100755 --- a/scripts/jenkins/release.sh +++ b/scripts/jenkins/release.sh @@ -23,7 +23,7 @@ ARG_DEFS=( ) function init { - if [[ $(git rev-parse --short HEAD) != $COMMIT_SHA ]]; then + if [[ $(git rev-parse HEAD) != $(git rev-parse $COMMIT_SHA) ]]; then echo "HEAD is not at $COMMIT_SHA" usage fi From 505ead7e587c94e425634ff6bb97530ad25e7da3 Mon Sep 17 00:00:00 2001 From: Vojta Jina Date: Fri, 14 Mar 2014 14:24:43 -0700 Subject: [PATCH 071/837] chore(scripts): test seed and phonecat during a release --- scripts/jenkins/release.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/scripts/jenkins/release.sh b/scripts/jenkins/release.sh index bb512f7030bb..c02f253faaea 100755 --- a/scripts/jenkins/release.sh +++ b/scripts/jenkins/release.sh @@ -56,8 +56,8 @@ function phase { ../code.angularjs.org/publish.sh $ACTION_ARG $VERBOSE_ARG ../bower/publish.sh $ACTION_ARG $VERBOSE_ARG - ../angular-seed/publish.sh $ACTION_ARG $VERBOSE_ARG --no-test=true - ../angular-phonecat/publish.sh $ACTION_ARG $VERBOSE_ARG --no-test=true + ../angular-seed/publish.sh $ACTION_ARG $VERBOSE_ARG + ../angular-phonecat/publish.sh $ACTION_ARG $VERBOSE_ARG } function run { From 6bb17af2e383bab3cadad011fd0240c7e2800bdf Mon Sep 17 00:00:00 2001 From: Vojta Jina Date: Fri, 14 Mar 2014 14:48:56 -0700 Subject: [PATCH 072/837] chore(scripts): disable testing seed and phonecat during a release This reverts commit d5294ebfa0e762d4a891a17869b7a14f99113d5a. It turned out to be more work and I don't wanna deal with it right now. --- scripts/jenkins/release.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/scripts/jenkins/release.sh b/scripts/jenkins/release.sh index c02f253faaea..bb512f7030bb 100755 --- a/scripts/jenkins/release.sh +++ b/scripts/jenkins/release.sh @@ -56,8 +56,8 @@ function phase { ../code.angularjs.org/publish.sh $ACTION_ARG $VERBOSE_ARG ../bower/publish.sh $ACTION_ARG $VERBOSE_ARG - ../angular-seed/publish.sh $ACTION_ARG $VERBOSE_ARG - ../angular-phonecat/publish.sh $ACTION_ARG $VERBOSE_ARG + ../angular-seed/publish.sh $ACTION_ARG $VERBOSE_ARG --no-test=true + ../angular-phonecat/publish.sh $ACTION_ARG $VERBOSE_ARG --no-test=true } function run { From 1517d6d2f26225fdb3f468b42ad7dc7cabf1d962 Mon Sep 17 00:00:00 2001 From: Vojta Jina Date: Fri, 14 Mar 2014 15:59:23 -0700 Subject: [PATCH 073/837] chore(scripts): fix the versions script --- lib/versions/version-info.js | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/lib/versions/version-info.js b/lib/versions/version-info.js index 70901fb7084d..9ef130f05a50 100644 --- a/lib/versions/version-info.js +++ b/lib/versions/version-info.js @@ -74,16 +74,17 @@ var getTaggedVersion = function() { var gitTagResult = shell.exec('git describe --exact-match', {silent:true}); if ( gitTagResult.code === 0 ) { - var tag = gitTagResult.output; + var tag = gitTagResult.output.trim(); var version = semver.parse(tag); - if ( version ) { - if ( version.satisfies(currentPackage.branchVersion) ) { - version.codeName = getCodeName(tag); - } + + if ( version && semver.satisfies(version, currentPackage.branchVersion)) { + version.codeName = getCodeName(tag); version.full = version.version + '+' + version.build; return version; } } + + return null; }; /** From 320f6d1214a67fa337743af1c881c837a01629f4 Mon Sep 17 00:00:00 2001 From: Vojta Jina Date: Fri, 14 Mar 2014 16:26:40 -0700 Subject: [PATCH 074/837] chore(scripts): fix the versions script again --- lib/versions/version-info.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/versions/version-info.js b/lib/versions/version-info.js index 9ef130f05a50..3ee5e261549e 100644 --- a/lib/versions/version-info.js +++ b/lib/versions/version-info.js @@ -79,7 +79,7 @@ var getTaggedVersion = function() { if ( version && semver.satisfies(version, currentPackage.branchVersion)) { version.codeName = getCodeName(tag); - version.full = version.version + '+' + version.build; + version.full = version.version; return version; } } From dc149de9364c66b988f169f67cad39577ba43434 Mon Sep 17 00:00:00 2001 From: Jeff Balboni Date: Sun, 26 Jan 2014 16:17:36 -0500 Subject: [PATCH 075/837] fix(select): avoid checking option element selected properties in render In Firefox, hovering over an option in an open select menu updates the selected property of option elements. This means that when a render is triggered by the digest cycle, and the list of options is being rendered, the selected properties are reset to the values from the model and the option hovered over changes. This fix changes the code to only use DOM elements' selected properties in a comparison when a change event has been fired. Otherwise, the internal new and existing option arrays are used. Closes #2448 Closes #5994 Closes #6769 --- src/ng/directive/select.js | 8 +++++++- test/ng/directive/selectSpec.js | 21 +++++++++++++++++++++ 2 files changed, 28 insertions(+), 1 deletion(-) diff --git a/src/ng/directive/select.js b/src/ng/directive/select.js index 0b562cca686c..628d21776b85 100644 --- a/src/ng/directive/select.js +++ b/src/ng/directive/select.js @@ -394,6 +394,12 @@ var selectDirective = ['$compile', '$parse', function($compile, $parse) { value = valueFn(scope, locals); } } + // Update the null option's selected property here so $render cleans it up correctly + if (optionGroupsCache[0].length > 1) { + if (optionGroupsCache[0][1].id !== key) { + optionGroupsCache[0][1].selected = false; + } + } } ctrl.$setViewValue(value); }); @@ -531,7 +537,7 @@ var selectDirective = ['$compile', '$parse', function($compile, $parse) { lastElement.val(existingOption.id = option.id); } // lastElement.prop('selected') provided by jQuery has side-effects - if (lastElement[0].selected !== option.selected) { + if (existingOption.selected !== option.selected) { lastElement.prop('selected', (existingOption.selected = option.selected)); } } else { diff --git a/test/ng/directive/selectSpec.js b/test/ng/directive/selectSpec.js index 6fcd1fe05f82..d270f438704f 100644 --- a/test/ng/directive/selectSpec.js +++ b/test/ng/directive/selectSpec.js @@ -733,6 +733,27 @@ describe('select', function() { expect(sortedHtml(options[2])).toEqual(''); }); + it('should not update selected property of an option element on digest with no change event', + function() { + createSingleSelect(); + + scope.$apply(function() { + scope.values = [{name: 'A'}, {name: 'B'}, {name: 'C'}]; + scope.selected = scope.values[0]; + }); + + var options = element.find('option'); + var optionToSelect = options.eq(1); + + expect(optionToSelect.text()).toBe('B'); + + optionToSelect.prop('selected', true); + scope.$digest(); + + expect(optionToSelect.prop('selected')).toBe(true); + expect(scope.selected).toBe(scope.values[0]); + }); + describe('binding', function() { it('should bind to scope value', function() { From de07ddeac6b7cd39ffbfb8da310a7fea71861623 Mon Sep 17 00:00:00 2001 From: Peter Bacon Darwin Date: Fri, 14 Mar 2014 14:35:58 +0000 Subject: [PATCH 076/837] chore(angularjs.org/publish.sh): align release script with new website Closes #6690 --- scripts/angularjs.org/publish.sh | 28 +++++++++++++++++++--------- 1 file changed, 19 insertions(+), 9 deletions(-) diff --git a/scripts/angularjs.org/publish.sh b/scripts/angularjs.org/publish.sh index 1efb621b9012..3d78dc01c1ca 100755 --- a/scripts/angularjs.org/publish.sh +++ b/scripts/angularjs.org/publish.sh @@ -11,8 +11,12 @@ ARG_DEFS=( ) function init { - TMP_DIR=$(resolveDir ../../tmp) + BASE_DIR=$(resolveDir ../..) + TMP_DIR=$BASE_DIR/tmp REPO_DIR=$TMP_DIR/angularjs.org + BRANCH_PATTERN=$(readJsonProp "$BASE_DIR/package.json" "branchVersion") + BUILD_DIR=$BASE_DIR/build + NEW_VERSION=$(cat $BUILD_DIR/version.txt) } function prepare { @@ -24,18 +28,24 @@ function prepare { # echo "-- Updating angularjs.org" cd $REPO_DIR - VERSION_REGEX="[a-z0-9\-\.\+]+" + VERSION_REGEX="[-a-z0-9\.\+]+" - replaceInFile "index.html" "(ajax\/libs\/angularjs\/)$VERSION_REGEX" "\1$CDN_VERSION" - replaceInFile "index.html" "([^<]*)$VERSION_REGEX" "\1$CDN_VERSION" - replaceInFile "index.html" "(code.angularjs.org\/)$VERSION_REGEX" "\1$CDN_VERSION" + # Replace the version in the script links that reference the Google CDN + # e.g. + replaceInFile "index.html" "(http:\/\/ajax.googleapis.com\/ajax\/libs\/angularjs\/)$VERSION_REGEX" "\1$CDN_VERSION" - replaceInFile "js/homepage.js" "($scope.CURRENT_STABLE_VERSION[ ]*=[ ]*')$VERSION_REGEX" "\1$CDN_VERSION" - replaceInFile "js/homepage.js" "($scope.CURRENT_UNSTABLE_VERSION[ ]*=[ ]*')$VERSION_REGEX" "\1$CDN_VERSION" + # Replace the version in the script links that reference code.angularjs.org + # e.g. + replaceInFile "index.html" "(code\.angularjs\.org\/)$VERSION_REGEX" "\1$CDN_VERSION" + # Replace the version of the branch that we are updating + echo $BRANCH_PATTERN + echo $NEW_VERSION + replaceInFile "js/download-data.js" "branch:[ ]+'($BRANCH_PATTERN)',[ ]+version:[ ]+'$VERSION_REGEX'" "branch: '\1', version: '$NEW_VERSION'" + git add index.html - git add js/homepage.js - git commit -m "update(version): update angular version to $CDN_VERSION" + git add js/download-data.js + git commit -m "update(version): update angular version to $NEW_VERSION for branch $BRANCH_PATTERN" } function publish { From 86ab885fd960c5f48a5355c82dcf8e3bd7d1ab46 Mon Sep 17 00:00:00 2001 From: Tobias Bosch Date: Thu, 20 Mar 2014 14:28:01 -0700 Subject: [PATCH 077/837] chore(release): fix angularjs.org cdn script --- scripts/angularjs.org/publish.sh | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/scripts/angularjs.org/publish.sh b/scripts/angularjs.org/publish.sh index 3d78dc01c1ca..1e59335d57d5 100755 --- a/scripts/angularjs.org/publish.sh +++ b/scripts/angularjs.org/publish.sh @@ -16,7 +16,6 @@ function init { REPO_DIR=$TMP_DIR/angularjs.org BRANCH_PATTERN=$(readJsonProp "$BASE_DIR/package.json" "branchVersion") BUILD_DIR=$BASE_DIR/build - NEW_VERSION=$(cat $BUILD_DIR/version.txt) } function prepare { @@ -40,12 +39,12 @@ function prepare { # Replace the version of the branch that we are updating echo $BRANCH_PATTERN - echo $NEW_VERSION - replaceInFile "js/download-data.js" "branch:[ ]+'($BRANCH_PATTERN)',[ ]+version:[ ]+'$VERSION_REGEX'" "branch: '\1', version: '$NEW_VERSION'" - + echo $CDN_VERSION + replaceInFile "js/download-data.js" "branch:[ ]+'($BRANCH_PATTERN)',[ ]+version:[ ]+'$VERSION_REGEX'" "branch: '\1', version: '$CDN_VERSION'" + git add index.html git add js/download-data.js - git commit -m "update(version): update angular version to $NEW_VERSION for branch $BRANCH_PATTERN" + git commit -m "update(version): update angular version to $CDN_VERSION for branch $BRANCH_PATTERN" } function publish { From ef88a8a020864c46651add2d945c8480553ecaea Mon Sep 17 00:00:00 2001 From: Tobias Bosch Date: Thu, 13 Mar 2014 16:02:02 -0700 Subject: [PATCH 078/837] chore(CHANGELOG.md): add input type date PR as breaking change Related to #6630 --- CHANGELOG.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 4265c9bd6313..3e71d2a9df3c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -23,6 +23,9 @@ - **build:** due to [eaa1d00b](https://github.com/angular/angular.js/commit/eaa1d00b24008f590b95ad099241b4003688cdda), As communicated before, IE8 is no longer supported. +- **input:** types date, time, datetime-local, month, week now always + require a `Date` object as model ([46bd6dc8](https://github.com/angular/angular.js/commit/46bd6dc88de252886d75426efc2ce8107a5134e9), + [#5864](https://github.com/angular/angular.js/issues/5864)) For more info: http://blog.angularjs.org/2013/12/angularjs-13-new-release-approaches.html From eeb261bcd59d00d6f8b6b2c85abaf4452bd70fc7 Mon Sep 17 00:00:00 2001 From: Jeff Cross Date: Fri, 14 Mar 2014 14:02:35 -0700 Subject: [PATCH 079/837] chore: update changelog for 1.3.0-beta.2 --- CHANGELOG.md | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 3e71d2a9df3c..6f3150b0b482 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,28 @@ + +# 1.3.0-beta.2 silent-ventriloquism (2014-03-14) + + +## Bug Fixes + +- **$$rAF:** always fallback to a $timeout in case native rAF isn't supported + ([7b5e0199](https://github.com/angular/angular.js/commit/7b5e019981f352add88be2984de68e553d1bfa93), + [#6654](https://github.com/angular/angular.js/issues/6654)) +- **$http:** don't convert 0 status codes to 404 for non-file protocols + ([56e73ea3](https://github.com/angular/angular.js/commit/56e73ea355c851fdfd574d6d2a9e2fcb75677945), + [#6074](https://github.com/angular/angular.js/issues/6074), [#6155](https://github.com/angular/angular.js/issues/6155)) +- **ngAnimate:** setting classNameFilter disables animation inside ng-if + ([129e2e02](https://github.com/angular/angular.js/commit/129e2e021ab1d773874428cd1fb329eae72797c4), + [#6539](https://github.com/angular/angular.js/issues/6539)) + + +## Features + +- whitelist blob urls for sanitization of data-bound image urls + ([47ab8df4](https://github.com/angular/angular.js/commit/47ab8df455df1f1391b760e1fbcc5c21645512b8), + [#4623](https://github.com/angular/angular.js/issues/4623)) + + + # 1.3.0-beta.1 retractable-eyebrow (2014-03-07) From 7b5be9ee29b1d22c6847678320d829e6f9b1518c Mon Sep 17 00:00:00 2001 From: Tobias Bosch Date: Fri, 21 Mar 2014 11:16:35 -0700 Subject: [PATCH 080/837] chore(CHANGELOG.md): add changelog for 1.3.0-beta.3 --- CHANGELOG.md | 119 ++++++++++++++++++++++++++++++++++++++++++++------- 1 file changed, 104 insertions(+), 15 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 6f3150b0b482..cf0ff76ec4fc 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,92 @@ + +# 1.3.0-beta.3 emotional-waffles (2014-03-21) + + +## Bug Fixes + +- **ngAnimate:** support `webkitCancelRequestAnimationFrame` in addition to `webkitCancelAnimationFrame` + ([c839f78b](https://github.com/angular/angular.js/commit/c839f78b8f2d8d910bc2bfc9e41b3e3b67090ec1), + [#6526](https://github.com/angular/angular.js/issues/6526)) +- **$http:** allow sending Blob data using `$http` + ([b8cc71d4](https://github.com/angular/angular.js/commit/b8cc71d476f76ff51e719fb76fb2348027c858ce), + [#5012](https://github.com/angular/angular.js/issues/5012)) +- **$httpBackend:** don't error when JSONP callback is called with no parameter + ([6680b7b9](https://github.com/angular/angular.js/commit/6680b7b97c0326a80bdccaf0a35031e4af641e0e), + [#4987](https://github.com/angular/angular.js/issues/4987), [#6735](https://github.com/angular/angular.js/issues/6735)) +- **$rootScope:** ng-repeat can't handle `NaN` values. #4605 + ([fb6062fb](https://github.com/angular/angular.js/commit/fb6062fb9d83545730b993e94ac7482ffd43a62c), + [#4605](https://github.com/angular/angular.js/issues/4605)) +- **$rootScope:** `$watchCollection` should call listener with old value + ([78057a94](https://github.com/angular/angular.js/commit/78057a945ef84cbb05f9417fe884cb8c28e67b44), + [#2621](https://github.com/angular/angular.js/issues/2621), [#5661](https://github.com/angular/angular.js/issues/5661), [#5688](https://github.com/angular/angular.js/issues/5688), [#6736](https://github.com/angular/angular.js/issues/6736)) +- **angular.bootstrap:** allow angular to load only once + ([748a6c8d](https://github.com/angular/angular.js/commit/748a6c8d9d8d61c3ee18eec462abe8ff245d6a98), + [#5863](https://github.com/angular/angular.js/issues/5863), [#5587](https://github.com/angular/angular.js/issues/5587)) +- **jqLite:** `inheritedData()` now traverses Shadow DOM boundaries via the `host` property of `DocumentFragment` + ([8a96f317](https://github.com/angular/angular.js/commit/8a96f317e594a5096d4fa56ceae4c685eec8ac8b), + [#6637](https://github.com/angular/angular.js/issues/6637)) +- **ngCookie:** convert non-string values to string + ([36528310](https://github.com/angular/angular.js/commit/3652831084c3788f786046b907a7361d2e89c520), + [#6151](https://github.com/angular/angular.js/issues/6151), [#6220](https://github.com/angular/angular.js/issues/6220)) +- **ngTouch:** update workaround for Webkit quirk + ([bc42950b](https://github.com/angular/angular.js/commit/bc42950b514b60f319812eeb87aae2915e394237), + [#6302](https://github.com/angular/angular.js/issues/6302)) +- **orderBy:** support string predicates containing non-ident characters + ([37bc5ef4](https://github.com/angular/angular.js/commit/37bc5ef4d87f19da47d3ab454c43d1e532c4f924), + [#6143](https://github.com/angular/angular.js/issues/6143), [#6144](https://github.com/angular/angular.js/issues/6144)) +- **select:** avoid checking option element's `selected` property in render + ([f40f54c6](https://github.com/angular/angular.js/commit/f40f54c6da4a5399fe18a89d068634bb491e9f1a), + [#2448](https://github.com/angular/angular.js/issues/2448), [#5994](https://github.com/angular/angular.js/issues/5994)) + + +## Features + +- **$compile:** add support for `$observer` deregistration + ([299b220f](https://github.com/angular/angular.js/commit/299b220f5e05e1d4e26bfd58d0b2fd7329ca76b1), + [#5609](https://github.com/angular/angular.js/issues/5609)) +- **ngMock.$httpBackend:** added support for function as URL matcher + ([d6cfcace](https://github.com/angular/angular.js/commit/d6cfcacee101f2738e0a224a3377232ff85f78a4), + [#4580](https://github.com/angular/angular.js/issues/4580)) + + +## Breaking Changes + +- **$compile:** due to [299b220f](https://github.com/angular/angular.js/commit/299b220f5e05e1d4e26bfd58d0b2fd7329ca76b1), + calling `attr.$observe` no longer returns the observer function, but a + deregistration function instead. To migrate the code follow the example below: + +Before: + + directive('directiveName', function() { + return { + link: function(scope, elm, attr) { + var observer = attr.$observe('someAttr', function(value) { + console.log(value); + }); + } + }; + }); + +After: + + directive('directiveName', function() { + return { + link: function(scope, elm, attr) { + var observer = function(value) { + console.log(value); + }; + + attr.$observe('someAttr', observer); + } + }; + }); + +- **$httpBackend:** due to [6680b7b9](https://github.com/angular/angular.js/commit/6680b7b97c0326a80bdccaf0a35031e4af641e0e), the JSONP behavior for erroneous and empty responses changed: + Previously, a JSONP response was regarded as erroneous if it was empty. Now Angular is listening to the + correct events to detect errors, i.e. even empty responses can be successful. + + + # 1.3.0-beta.2 silent-ventriloquism (2014-03-14) @@ -333,26 +422,26 @@ The animation mock module has been renamed from `mock.animate` to `ngAnimateMock ## Breaking Changes - **$http:** due to [e1cfb195](https://github.com/angular/angular.js/commit/e1cfb1957feaf89408bccf48fae6f529e57a82fe), - it is now necessary to separately specify default HTTP headers for PUT, POST and PATCH requests, as these no longer share a single object. + it is now necessary to separately specify default HTTP headers for PUT, POST and PATCH requests, as these no longer share a single object. - To migrate your code, follow the example below: + To migrate your code, follow the example below: - Before: + Before: - // Will apply to POST, PUT and PATCH methods - $httpProvider.defaults.headers.post = { - "X-MY-CSRF-HEADER": "..." - }; + // Will apply to POST, PUT and PATCH methods + $httpProvider.defaults.headers.post = { + "X-MY-CSRF-HEADER": "..." + }; - After: + After: - // POST, PUT and PATCH default headers must be specified separately, - // as they do not share data. - $httpProvider.defaults.headers.post = - $httpProvider.defaults.headers.put = - $httpProviders.defaults.headers.patch = { - "X-MY-CSRF-HEADER": "..." - }; + // POST, PUT and PATCH default headers must be specified separately, + // as they do not share data. + $httpProvider.defaults.headers.post = + $httpProvider.defaults.headers.put = + $httpProviders.defaults.headers.patch = { + "X-MY-CSRF-HEADER": "..." + }; # 1.2.8 interdimensional-cartography (2014-01-10) From 4b291866965ec7768ed8985283d3003ea9cb9843 Mon Sep 17 00:00:00 2001 From: Brian Andersen Date: Mon, 17 Mar 2014 17:14:55 +0100 Subject: [PATCH 081/837] docs(tutorial): fix broken link On page http://docs.angularjs.org/tutorial/step_05 link is broken. Should point to http://docs.angularjs.org/guide/services NOT http://docs.angularjs.org/guide/dev_guide.services Closes #6714 --- docs/content/tutorial/step_05.ngdoc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/content/tutorial/step_05.ngdoc b/docs/content/tutorial/step_05.ngdoc index e37de7a7f089..17941cd14e14 100644 --- a/docs/content/tutorial/step_05.ngdoc +++ b/docs/content/tutorial/step_05.ngdoc @@ -44,7 +44,7 @@ Following is a sample of the file: We'll use Angular's {@link ng.$http $http} service in our controller to make an HTTP request to your web server to fetch the data in the `app/phones/phones.json` file. `$http` is just -one of several built-in {@link guide/dev_guide.services Angular services} that handle common operations +one of several built-in {@link guide/services Angular services} that handle common operations in web apps. Angular injects these services for you where you need them. Services are managed by Angular's {@link guide/di DI subsystem}. Dependency injection From 770fd5a91796a904ebce10b69d9518b320883170 Mon Sep 17 00:00:00 2001 From: Caitlin Potter Date: Mon, 17 Mar 2014 00:03:20 -0400 Subject: [PATCH 082/837] docs(misc/contribute): make anchor links work properly Closes #6706 --- docs/content/misc/contribute.ngdoc | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/docs/content/misc/contribute.ngdoc b/docs/content/misc/contribute.ngdoc index 9adeeee45a43..dd0a75f38983 100644 --- a/docs/content/misc/contribute.ngdoc +++ b/docs/content/misc/contribute.ngdoc @@ -11,12 +11,12 @@ See the [contributing guidelines](https://github.com/angular/angular.js/blob/mas for how to contribute your own code to AngularJS. -1. {@link #building-and-testing-angularjs_installing-dependencies Installing Dependencies} -2. {@link #building-and-testing-angularjs_forking-angular-on-github Forking Angular on Github} -3. {@link #building-and-testing-angularjs_building-angularjs Building AngularJS} -4. {@link #building-and-testing-angularjs_running-a-local-development-web-server Running a Local Development Web Server} -5. {@link #building-and-testing-angularjs_running-the-unit-test-suite Running the Unit Test Suite} -6. {@link #building-and-testing-angularjs_running-the-end-to-end-test-suite Running the End-to-end Test Suite} +1. {@link misc/contribute#installing-dependencies Installing Dependencies} +2. {@link misc/contribute#forking-angular-on-github Forking Angular on Github} +3. {@link misc/contribute#building-angularjs Building AngularJS} +4. {@link misc/contribute#running-a-local-development-web-server Running a Local Development Web Server} +5. {@link misc/contribute#running-the-unit-test-suite Running the Unit Test Suite} +6. {@link misc/contribute#running-the-end-to-end-test-suite Running the End-to-end Test Suite} ## Installing Dependencies From 5b93e5fcfc605add03fa4d49ffef0743c1ad3405 Mon Sep 17 00:00:00 2001 From: Peter Bacon Darwin Date: Mon, 17 Mar 2014 10:00:36 +0000 Subject: [PATCH 083/837] chore(shrinkwrap): grunt-jasmine-node is retrieved from github --- npm-shrinkwrap.json | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/npm-shrinkwrap.json b/npm-shrinkwrap.json index 2742b1786b69..726784e87224 100644 --- a/npm-shrinkwrap.json +++ b/npm-shrinkwrap.json @@ -864,7 +864,9 @@ "version": "0.0.4" }, "grunt-jasmine-node": { - "version": "0.1.0" + "version": "0.1.0", + "from": "git://github.com/vojtajina/grunt-jasmine-node.git#fix-grunt-exit-code", + "resolved": "git://github.com/vojtajina/grunt-jasmine-node.git#ced17cbe52c1412b2ada53160432a5b681f37cd7" }, "grunt-jscs-checker": { "version": "0.4.0", From 1f2750136e4a6356819a12a444536120d04865e2 Mon Sep 17 00:00:00 2001 From: Peter Bacon Darwin Date: Mon, 17 Mar 2014 12:43:10 +0000 Subject: [PATCH 084/837] docs(runnableExamples): add "edit in Plunker" button The "runnableExample.template.html" template overrides the one in the dgeni-packages "examples" package with a similar template that also has a link to a special Plunker URL that can pull in the example from our code.angularjs.org website. --- docs/app/src/docs.js | 2 ++ .../templates/runnableExample.template.html | 27 +++++++++++++++++++ 2 files changed, 29 insertions(+) create mode 100644 docs/config/templates/runnableExample.template.html diff --git a/docs/app/src/docs.js b/docs/app/src/docs.js index 74d78136fc15..5c6a76d4e29c 100644 --- a/docs/app/src/docs.js +++ b/docs/app/src/docs.js @@ -2,6 +2,8 @@ angular.module('DocsController', []) .controller('DocsController', function($scope, $rootScope, $location, $window, $cookies, NG_PAGES, NG_NAVIGATION, NG_VERSION) { + $scope.docsVersion = NG_VERSION.isSnapshot ? 'snapshot' : NG_VERSION.version; + $scope.fold = function(url) { if(url) { $scope.docs_fold = '/notes/' + url; diff --git a/docs/config/templates/runnableExample.template.html b/docs/config/templates/runnableExample.template.html new file mode 100644 index 000000000000..4fe2a38f9f64 --- /dev/null +++ b/docs/config/templates/runnableExample.template.html @@ -0,0 +1,27 @@ +{# Be aware that we need these extra new lines here or marked will not realise that the
    + is HTML and wrap each line in a

    - thus breaking the HTML #} + +

    + +   + Edit in Plunker +
    + + {% for fileName, file in doc.example.files %} +
    + {% code -%} + {$ file.fileContents $} + {%- endcode %} +
    + {% endfor %} + + +
    +
    + +{# Be aware that we need these extra new lines here or marked will not realise that the
    + above is HTML and wrap each line in a

    - thus breaking the HTML #} \ No newline at end of file From 78bc84c497225ae38d615cdf587a12fbd04c71b4 Mon Sep 17 00:00:00 2001 From: Denis Parchenko Date: Mon, 17 Mar 2014 12:37:57 +0200 Subject: [PATCH 085/837] docs(guide/module): remove duplicate word Closes #6709 --- docs/content/guide/module.ngdoc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/content/guide/module.ngdoc b/docs/content/guide/module.ngdoc index e2925584eacf..2d0a795deb79 100644 --- a/docs/content/guide/module.ngdoc +++ b/docs/content/guide/module.ngdoc @@ -172,7 +172,7 @@ angular.module('myModule', []).

    When bootstrapping, first Angular applies all constant definitions. -Then Angular applies configuration blocks in the order same order they were registered. +Then Angular applies configuration blocks in the same order they were registered.
    ## Run Blocks From cad307fa1f64bbbaaec752992bca84e85955fbc4 Mon Sep 17 00:00:00 2001 From: Igor Minar Date: Mon, 17 Mar 2014 10:35:21 -0700 Subject: [PATCH 086/837] docs(triaging): correct information about milestones --- TRIAGING.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/TRIAGING.md b/TRIAGING.md index 08641f845252..1f1060f65bac 100644 --- a/TRIAGING.md +++ b/TRIAGING.md @@ -61,9 +61,9 @@ This process based on the idea of minimizing user pain 1. Label `origin: google` for issues from Google 1. Assign a milestone: - * Current 1.x.y milestone - regressions and urgent bugs only - * Backlog - fixes; changes that should go into a patch release - * Ice Box - new features; changes that belong inß a major/minor release + * Backlog - triaged fixes and features, should be the default choice + * Current 1.x.y milestone (e.g. 1.3.0-beta-2) - regressions and urgent bugs only + 1. Unassign yourself from the issue From 39635fd0d7c21753fe754aa92b3c4352270064da Mon Sep 17 00:00:00 2001 From: bradwheel Date: Sat, 8 Mar 2014 20:23:31 -0500 Subject: [PATCH 087/837] docs(ngRoute): remove global controller syntax in the example --- src/ngRoute/route.js | 49 +++++++++++++++++++++++--------------------- 1 file changed, 26 insertions(+), 23 deletions(-) diff --git a/src/ngRoute/route.js b/src/ngRoute/route.js index 1319dd02cf7a..0f302e37b080 100644 --- a/src/ngRoute/route.js +++ b/src/ngRoute/route.js @@ -271,7 +271,7 @@ function $RouteProvider(){ * * - *
    + *
    * Choose: * Moby | * Moby: Ch1 | @@ -280,6 +280,7 @@ function $RouteProvider(){ * Scarlet Letter
    * *
    + * *
    * *
    $location.path() = {{$location.path()}}
    @@ -304,10 +305,27 @@ function $RouteProvider(){ * * angular.module('ngRouteExample', ['ngRoute']) * + * .controller('MainController', function($scope, $route, $routeParams, $location) { + * $scope.$route = $route; + * $scope.$location = $location; + * $scope.$routeParams = $routeParams; + * }) + * + * .controller('BookController', function($scope, $routeParams) { + * $scope.name = "BookController"; + * $scope.params = $routeParams; + * }) + * + * .controller('ChapterController', function($scope, $routeParams) { + * $scope.name = "ChapterController"; + * $scope.params = $routeParams; + * }) + * * .config(function($routeProvider, $locationProvider) { - * $routeProvider.when('/Book/:bookId', { + * $routeProvider + * .when('/Book/:bookId', { * templateUrl: 'book.html', - * controller: BookCntl, + * controller: 'BookController', * resolve: { * // I will cause a 1 second delay * delay: function($q, $timeout) { @@ -316,45 +334,30 @@ function $RouteProvider(){ * return delay.promise; * } * } - * }); - * $routeProvider.when('/Book/:bookId/ch/:chapterId', { + * }) + * .when('/Book/:bookId/ch/:chapterId', { * templateUrl: 'chapter.html', - * controller: ChapterCntl + * controller: 'ChapterController' * }); * * // configure html5 to get links working on jsfiddle * $locationProvider.html5Mode(true); * }); * - * function MainCntl($scope, $route, $routeParams, $location) { - * $scope.$route = $route; - * $scope.$location = $location; - * $scope.$routeParams = $routeParams; - * } - * - * function BookCntl($scope, $routeParams) { - * $scope.name = "BookCntl"; - * $scope.params = $routeParams; - * } - * - * function ChapterCntl($scope, $routeParams) { - * $scope.name = "ChapterCntl"; - * $scope.params = $routeParams; - * } * * * * it('should load and compile correct template', function() { * element(by.linkText('Moby: Ch1')).click(); * var content = element(by.css('[ng-view]')).getText(); - * expect(content).toMatch(/controller\: ChapterCntl/); + * expect(content).toMatch(/controller\: ChapterController/); * expect(content).toMatch(/Book Id\: Moby/); * expect(content).toMatch(/Chapter Id\: 1/); * * element(by.partialLinkText('Scarlet')).click(); * * content = element(by.css('[ng-view]')).getText(); - * expect(content).toMatch(/controller\: BookCntl/); + * expect(content).toMatch(/controller\: BookController/); * expect(content).toMatch(/Book Id\: Scarlet/); * }); * From 9226b3657203ea44d25507370c98d9aee5a3e018 Mon Sep 17 00:00:00 2001 From: linclark Date: Thu, 13 Mar 2014 18:50:42 -0700 Subject: [PATCH 088/837] docs($http): update shortcut method description Update docs to reflect that $http no longer requires passing in an HTTP method, as changed in #6401. --- src/ng/http.js | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/ng/http.js b/src/ng/http.js index c7dc64e2c4fd..9fcb45782f87 100644 --- a/src/ng/http.js +++ b/src/ng/http.js @@ -236,9 +236,8 @@ function $HttpProvider() { * * # Shortcut methods * - * Since all invocations of the $http service require passing in an HTTP method and URL, and - * POST/PUT requests require request data to be provided as well, shortcut methods - * were created: + * Shortcut methods are also available. All shortcut methods require passing in the URL, and + * request data must be passed in for POST/PUT requests. * * ```js * $http.get('/someUrl').success(successCallback); From 57b0d91fd88982ddcc002f038426685e85ce04b2 Mon Sep 17 00:00:00 2001 From: Mark Jones Date: Sat, 8 Mar 2014 13:15:37 -0600 Subject: [PATCH 089/837] docs(ngInclude): make the quote type explicit --- src/ng/directive/ngInclude.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ng/directive/ngInclude.js b/src/ng/directive/ngInclude.js index a41b78b20c4c..38a9e00568b4 100644 --- a/src/ng/directive/ngInclude.js +++ b/src/ng/directive/ngInclude.js @@ -32,7 +32,7 @@ * @priority 400 * * @param {string} ngInclude|src angular expression evaluating to URL. If the source is a string constant, - * make sure you wrap it in quotes, e.g. `src="'myPartialTemplate.html'"`. + * 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. * * @param {string=} autoscroll Whether `ngInclude` should call {@link ng.$anchorScroll From 98d825e10d3bf76f47e69abba857a8933c8cb7d9 Mon Sep 17 00:00:00 2001 From: Caitlin Potter Date: Mon, 10 Mar 2014 19:32:09 -0400 Subject: [PATCH 090/837] fix(jqLite): traverse `host` property for DocumentFragment in inheritedData() If dealing with a document fragment node with a host element, and no parent, use the host element as the parent. This enables directives within a Shadow DOM or polyfilled Shadow DOM to lookup parent controllers. Closes #6637 --- src/jqLite.js | 8 ++++++-- test/jqLiteSpec.js | 13 +++++++++++++ 2 files changed, 19 insertions(+), 2 deletions(-) diff --git a/src/jqLite.js b/src/jqLite.js index ba613f218f9e..738f47a9b167 100644 --- a/src/jqLite.js +++ b/src/jqLite.js @@ -364,11 +364,15 @@ function jqLiteInheritedData(element, name, value) { var names = isArray(name) ? name : [name]; while (element.length) { - + var node = element[0]; for (var i = 0, ii = names.length; i < ii; i++) { if ((value = element.data(names[i])) !== undefined) return value; } - element = element.parent(); + + // If dealing with a document fragment node with a host element, and no parent, use the host + // element as the parent. This enables directives within a Shadow DOM or polyfilled Shadow DOM + // to lookup parent controllers. + element = jqLite(node.parentNode || (node.nodeType === 11 && node.host)); } } diff --git a/test/jqLiteSpec.js b/test/jqLiteSpec.js index 482c05f4f730..faf1c98cbb8c 100644 --- a/test/jqLiteSpec.js +++ b/test/jqLiteSpec.js @@ -168,6 +168,19 @@ describe('jqLite', function() { dealoc(ul); }); + + it('should pass through DocumentFragment boundaries via host', function() { + var host = jqLite('
    '), + frag = document.createDocumentFragment(), + $frag = jqLite(frag); + frag.host = host[0]; + host.data("foo", 123); + host.append($frag); + expect($frag.inheritedData("foo")).toBe(123); + + dealoc(host); + dealoc($frag); + }); }); From 8f7f0d26eddc3d609303f9c2836f7dc42a55c3f2 Mon Sep 17 00:00:00 2001 From: David Rogers Date: Mon, 17 Mar 2014 16:44:53 -0400 Subject: [PATCH 091/837] docs(ngForm): remove duplicate @param annotation When the example for `ngAnimate` was added in commit:3344396, the `@param name` annotation was unintentionally duplicated. Remove this duplicate. Closes #6720 --- src/ng/directive/form.js | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/ng/directive/form.js b/src/ng/directive/form.js index 1424157c8751..9983d367f949 100644 --- a/src/ng/directive/form.js +++ b/src/ng/directive/form.js @@ -360,8 +360,6 @@ function FormController(element, attrs, $scope, $animate) { * - * @param {string=} name Name of the form. If specified, the form controller will be published into - * related scope, under this name. */ var formDirectiveFactory = function(isNgForm) { return ['$timeout', function($timeout) { From 8ba452544e44123401e79fd5ab40e0a8ed93ef17 Mon Sep 17 00:00:00 2001 From: Jan Hancic Date: Sun, 26 Jan 2014 15:14:09 +0000 Subject: [PATCH 092/837] docs(tutorial/step_12): link to API docs --- docs/content/tutorial/step_12.ngdoc | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/docs/content/tutorial/step_12.ngdoc b/docs/content/tutorial/step_12.ngdoc index fa1547e3ee10..060c7d0d3f2a 100644 --- a/docs/content/tutorial/step_12.ngdoc +++ b/docs/content/tutorial/step_12.ngdoc @@ -20,7 +20,8 @@ a dependency with the application module, will enable animations throughout the Common `ng` directives automatically trigger hooks for animations to tap into. When an animation is found then the animation will run in between the standard DOM operation that is being issued on the element at -the given time (e.g. inserting and removing nodes on ngRepeat or adding and removing classes on ngClass). +the given time (e.g. inserting and removing nodes on {@link api/ng.directive:ngRepeat `ngRepeat`} or adding +and removing classes on {@link api/ng.directive:ngClass `ngClass`}). The most important changes are listed below. You can see the full diff on [GitHub](https://github.com/angular/angular-phonecat/compare/step-11...step-12): @@ -34,9 +35,10 @@ To get an idea of how animations work with AngularJS, please read the ## Template -The changes required within the HTML template code is to link the asset files which define the animations as well -as the `angular-animate.js` file. The animation module, known as `ngAnimate`, is defined within -`angular-animate.js` and contains the code necessary to make your application become animation aware. +The changes required within the HTML template code is to link the asset files which define the animations as +well as the `angular-animate.js` file. The animation module, known as {@link api/ngAnimate `ngAnimate`}, is +defined within `angular-animate.js` and contains the code necessary to make your application become animation +aware. Here's what needs to changed in the index file: @@ -197,7 +199,7 @@ which are described in detail below. ## Animating `ngView` with CSS Keyframe Animations -Next let's add an animation for transitions between route changes in `ngView`. +Next let's add an animation for transitions between route changes in {@link api/ngRoute.directive:ngView `ngView`}. To start, let's add a new CSS class to our HTML like we did in the example above. This time, instead of the `ng-repeat` element, let's add it to the element containing the ng-view directive. From c0416866f597e489c6c332f3f53dd15d515baf31 Mon Sep 17 00:00:00 2001 From: Sekib Omazic Date: Sat, 8 Mar 2014 22:04:58 +0100 Subject: [PATCH 093/837] docs(booleanAttrs): fix typo --- src/ng/directive/booleanAttrs.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ng/directive/booleanAttrs.js b/src/ng/directive/booleanAttrs.js index 50f118d484af..e98a61034063 100644 --- a/src/ng/directive/booleanAttrs.js +++ b/src/ng/directive/booleanAttrs.js @@ -277,7 +277,7 @@ * such as selected. (Their presence means true and their absence means false.) * If we put an Angular interpolation expression into such an attribute then the * binding information would be lost when the browser removes the attribute. - * The `ngSelected` directive solves this problem for the `selected` atttribute. + * The `ngSelected` directive solves this problem for the `selected` attribute. * This complementary directive is not removed by the browser and so provides * a permanent reliable place to store the binding information. * From c7e60153a51ea424397fe06102c06e7c3849da56 Mon Sep 17 00:00:00 2001 From: Neil Johnston Date: Sat, 15 Mar 2014 10:55:02 -0700 Subject: [PATCH 094/837] docs(tutorial/step_02): add experiment to update controller test Add an experiment to update the controller unit test after modifying it with the new model property. --- docs/content/tutorial/step_02.ngdoc | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/docs/content/tutorial/step_02.ngdoc b/docs/content/tutorial/step_02.ngdoc index 83512e9ff882..56ec2dd2ad8a 100644 --- a/docs/content/tutorial/step_02.ngdoc +++ b/docs/content/tutorial/step_02.ngdoc @@ -226,6 +226,10 @@ To run the test, do the following: Refresh your browser and verify that it says "Hello, World!". +* Update the unit test for the controler in ./tests/unit/controlersSpec.js to refelct the previous change. For example by adding: + + expect(scope.name).toBe('World'); + * Create a repeater that constructs a simple table: From a86cb7d794523e11079c5ef47a72192bb885fe37 Mon Sep 17 00:00:00 2001 From: unicodesnowman Date: Sat, 8 Mar 2014 13:04:06 -0500 Subject: [PATCH 095/837] docs(ngView): remove global controller definitions instead use angular modules also fix formatting --- src/ngRoute/directive/ngView.js | 63 +++++++++++++++++---------------- 1 file changed, 32 insertions(+), 31 deletions(-) diff --git a/src/ngRoute/directive/ngView.js b/src/ngRoute/directive/ngView.js index a25563ae38bc..85049d4a3163 100644 --- a/src/ngRoute/directive/ngView.js +++ b/src/ngRoute/directive/ngView.js @@ -119,38 +119,39 @@ ngRouteModule.directive('ngView', ngViewFillContentFactory); - angular.module('ngViewExample', ['ngRoute', 'ngAnimate'], - function($routeProvider, $locationProvider) { - $routeProvider.when('/Book/:bookId', { - templateUrl: 'book.html', - controller: BookCtrl, - controllerAs: 'book' - }); - $routeProvider.when('/Book/:bookId/ch/:chapterId', { - templateUrl: 'chapter.html', - controller: ChapterCtrl, - controllerAs: 'chapter' - }); + angular.module('ngViewExample', ['ngRoute', 'ngAnimate']) + .config(['$routeProvider', '$locationProvider', + function($routeProvider, $locationProvider) { + $routeProvider + .when('/Book/:bookId', { + templateUrl: 'book.html', + controller: 'BookCtrl', + controllerAs: 'book' + }) + .when('/Book/:bookId/ch/:chapterId', { + templateUrl: 'chapter.html', + controller: 'ChapterCtrl', + controllerAs: 'chapter' + }); + + // configure html5 to get links working on jsfiddle + $locationProvider.html5Mode(true); + }]) + .controller('MainCtrl', ['$route', '$routeParams', '$location', + function($route, $routeParams, $location) { + this.$route = $route; + this.$location = $location; + this.$routeParams = $routeParams; + }]) + .controller('BookCtrl', ['$routeParams', function($routeParams) { + this.name = "BookCtrl"; + this.params = $routeParams; + }]) + .controller('ChapterCtrl', ['$routeParams', function($routeParams) { + this.name = "ChapterCtrl"; + this.params = $routeParams; + }]); - // configure html5 to get links working on jsfiddle - $locationProvider.html5Mode(true); - }); - - function MainCtrl($route, $routeParams, $location) { - this.$route = $route; - this.$location = $location; - this.$routeParams = $routeParams; - } - - function BookCtrl($routeParams) { - this.name = "BookCtrl"; - this.params = $routeParams; - } - - function ChapterCtrl($routeParams) { - this.name = "ChapterCtrl"; - this.params = $routeParams; - } From 483325a7b5836342949e55b550e5d138a8da59b7 Mon Sep 17 00:00:00 2001 From: Takashi Nakagawa Date: Sat, 8 Mar 2014 02:01:06 +0900 Subject: [PATCH 096/837] chore(formatting): removed unnecessary white spaces --- docs/config/processors/pages-data.js | 10 +++++----- docs/content/error/ng/btstrpd.ngdoc | 4 ++-- docs/content/guide/ie.ngdoc | 12 ++++++------ docs/content/tutorial/step_04.ngdoc | 4 ++-- docs/content/tutorial/step_11.ngdoc | 4 ++-- i18n/spec/converterSpec.js | 2 +- 6 files changed, 18 insertions(+), 18 deletions(-) diff --git a/docs/config/processors/pages-data.js b/docs/config/processors/pages-data.js index 1b93b021a2b7..95036a518db1 100644 --- a/docs/config/processors/pages-data.js +++ b/docs/config/processors/pages-data.js @@ -11,17 +11,17 @@ var AREA_NAMES = { }; function getNavGroup(pages, area, pageSorter, pageMapper) { - + var navItems = _(pages) // We don't want the child to include the index page as this is already catered for .omit(function(page) { return page.id === 'index'; }) - + // Apply the supplied sorting function .sortBy(pageSorter) - + // Apply the supplied mapping function .map(pageMapper) - + .value(); return { @@ -176,7 +176,7 @@ module.exports = { // - ngView // - section "service" // - $route - // + // var areas = {}; _(navPages) .groupBy('area') diff --git a/docs/content/error/ng/btstrpd.ngdoc b/docs/content/error/ng/btstrpd.ngdoc index 7eb66a1eb3f7..4efbaba533cb 100644 --- a/docs/content/error/ng/btstrpd.ngdoc +++ b/docs/content/error/ng/btstrpd.ngdoc @@ -38,12 +38,12 @@ You can also get this error if you accidentally load AngularJS itself more than - + ... - + ... diff --git a/docs/content/guide/ie.ngdoc b/docs/content/guide/ie.ngdoc index 414c058e1b32..2842a83e2979 100644 --- a/docs/content/guide/ie.ngdoc +++ b/docs/content/guide/ie.ngdoc @@ -26,7 +26,7 @@ To make your Angular application work on IE please make sure that: 1. You polyfill JSON.stringify for IE7 and below. You can use [JSON2](https://github.com/douglascrockford/JSON-js) or [JSON3](http://bestiejs.github.com/json3/) polyfills for this. - + ```html @@ -42,7 +42,7 @@ To make your Angular application work on IE please make sure that: ``` 2. add `id="ng-app"` to the root element in conjunction with `ng-app` attribute - + ```html @@ -54,7 +54,7 @@ To make your Angular application work on IE please make sure that: `
    ` instead), or 4. if you **do use** custom element tags, then you must take these steps to make IE 8 and below happy: - + ```html @@ -64,7 +64,7 @@ To make your Angular application work on IE please make sure that: document.createElement('ng-include'); document.createElement('ng-pluralize'); document.createElement('ng-view'); - + // Optionally these for CSS document.createElement('ng:include'); document.createElement('ng:pluralize'); @@ -79,7 +79,7 @@ To make your Angular application work on IE please make sure that: ``` 5. Use `ng-style` tags instead of `style="{{ someCss }}"`. The later works in Chrome and Firefox but does not work in Internet Explorer <= 11 (the most recent version at time of writing). - + The **important** parts are: @@ -165,7 +165,7 @@ In IE, the behavior is that the `BODY` element has three children: ## CSS Styling of Custom Tag Names -To make CSS selectors work with custom elements, the custom element name must be pre-created with +To make CSS selectors work with custom elements, the custom element name must be pre-created with `document.createElement('my-tag')` regardless of XML namespace. ```html diff --git a/docs/content/tutorial/step_04.ngdoc b/docs/content/tutorial/step_04.ngdoc index cffc6319ad4a..48b19f7a1dd0 100644 --- a/docs/content/tutorial/step_04.ngdoc +++ b/docs/content/tutorial/step_04.ngdoc @@ -91,7 +91,7 @@ phonecatApp.controller('PhoneListCtrl', function ($scope) { record. This property is used to order phones by age. * We added a line to the controller that sets the default value of `orderProp` to `age`. If we had -not set a default value here, the `orderBy` filter would remain uninitialized until our +not set a default value here, the `orderBy` filter would remain uninitialized until our user picked an option from the drop down menu. This is a good time to talk about two-way data-binding. Notice that when the app is loaded in the @@ -117,7 +117,7 @@ describe('PhoneCat controllers', function() { var scope, ctrl; beforeEach(module('phonecatApp')); - + beforeEach(inject(function($controller) { scope = {}; ctrl = $controller('PhoneListCtrl', {$scope:scope}); diff --git a/docs/content/tutorial/step_11.ngdoc b/docs/content/tutorial/step_11.ngdoc index 252795c11004..e85092c2580c 100644 --- a/docs/content/tutorial/step_11.ngdoc +++ b/docs/content/tutorial/step_11.ngdoc @@ -22,8 +22,8 @@ The most important changes are listed below. You can see the full diff on [GitHu ## Template The custom service is defined in `app/js/services.js` so we need to include this file in our layout -template. Additionally, we also need to load the `angular-resource.js` file, which contains the -{@link api/ngResource ngResource} module and in it the {@link api/ngResource.$resource $resource} +template. Additionally, we also need to load the `angular-resource.js` file, which contains the +{@link api/ngResource ngResource} module and in it the {@link api/ngResource.$resource $resource} service, that we'll soon use: __`app/index.html`.__ diff --git a/i18n/spec/converterSpec.js b/i18n/spec/converterSpec.js index a7879e6beacf..e02bde9f4155 100644 --- a/i18n/spec/converterSpec.js +++ b/i18n/spec/converterSpec.js @@ -33,7 +33,7 @@ describe("convertDatetimeData", function() { AMPMS: ['AM', 'PM'], DATEFORMATS: ['a', 'b', 'c', 'd'], TIMEFORMATS: ['e', 'f', 'g', 'h'] }; - + it('should convert empty datetime obj', function() { var processedData = convert(dataObj); expect(processedData.MONTH).toEqual(['Enero', 'Pebrero']); From 5fb298b90f8edc5d8975cae01e75329926773a19 Mon Sep 17 00:00:00 2001 From: wbyoko Date: Fri, 28 Feb 2014 20:04:44 -0600 Subject: [PATCH 097/837] docs(migration): note that services can now return functions This change mostly effects preprocessed javascript. --- docs/content/guide/migration.ngdoc | 37 ++++++++++++++++++++++++++++++ 1 file changed, 37 insertions(+) diff --git a/docs/content/guide/migration.ngdoc b/docs/content/guide/migration.ngdoc index 498b534579db..df042582b721 100644 --- a/docs/content/guide/migration.ngdoc +++ b/docs/content/guide/migration.ngdoc @@ -48,6 +48,7 @@ below should still apply, but you may want to consult the
  • {@link guide/migration#underscore-prefixed/suffixed-properties-are-non-bindable Underscore-prefixed/suffixed properties are non-bindable}
  • {@link guide/migration#you-cannot-bind-to-select[multiple] You cannot bind to select[multiple]}
  • {@link guide/migration#uncommon-region-specific-local-files-were-removed-from-i18n Uncommon region-specific local files were removed from i18n}
  • +
  • {@link guide/migration#services-can-now-return-functions Services can now return functions}
  • @@ -653,3 +654,39 @@ load and use your copy of the locale file provided that you maintain it yourself See [6382e21f](https://github.com/angular/angular.js/commit/6382e21fb28541a2484ac1a241d41cf9fbbe9d2c). +## Services can now return functions + +Previously, the service constructor only returned objects regardless of whether a function was returned. + +Now, `$injector.instantiate` (and thus `$provide.service`) behaves the same as the native +`new` operator and allows functions to be returned as a service. + +If using a JavaScript preprocessor it's quite possible when upgrading that services could start behaving incorrectly. +Make sure your services return the correct type wanted. + +**Coffeescript example** + +``` +myApp.service 'applicationSrvc', -> + @something = "value" + @someFunct = -> + "something else" +``` + +pre 1.2 this service would return the whole object as the service. + +post 1.2 this service returns `someFunct` as the value of the service + +you would need to change this services to + +``` +myApp.service 'applicationSrvc', -> + @something = "value" + @someFunct = -> + "something else" + return +``` + +to continue to return the complete instance. + +See [c22adbf1](https://github.com/angular/angular.js/commit/c22adbf160f32c1839fbb35382b7a8c6bcec2927). From 1c27e5fc37481237bfd4722cf67c43066a157ba3 Mon Sep 17 00:00:00 2001 From: Gias Kay Lee Date: Fri, 7 Mar 2014 08:57:29 +0800 Subject: [PATCH 098/837] docs(css): Fix word breaks issue in
    
    Closes #6586
    ---
     docs/app/assets/css/docs.css | 10 ++++++----
     1 file changed, 6 insertions(+), 4 deletions(-)
    
    diff --git a/docs/app/assets/css/docs.css b/docs/app/assets/css/docs.css
    index 98c0bec677f3..f9f0253ca4ad 100644
    --- a/docs/app/assets/css/docs.css
    +++ b/docs/app/assets/css/docs.css
    @@ -184,10 +184,12 @@ h1,h2,h3,h4,h5,h6 {
     }
     
     pre {
    -  padding:15px;
    -  border:1px solid #ddd;
    -  display:block;
    -  border-radius:5px;
    +  padding: 15px;
    +  border: 1px solid #ddd;
    +  border-radius: 5px;
    +  display: block;
    +  white-space: pre-wrap;
    +  word-break: normal;
     }
     
     .aside-nav a,
    
    From f0347d5efa193b6f59ac854798e90feaee727c77 Mon Sep 17 00:00:00 2001
    From: Gias Kay Lee 
    Date: Mon, 10 Mar 2014 14:50:21 +0800
    Subject: [PATCH 099/837] docs(module): add link to mentioned resource
    
    Closes #6628
    ---
     docs/content/guide/module.ngdoc | 5 +++--
     1 file changed, 3 insertions(+), 2 deletions(-)
    
    diff --git a/docs/content/guide/module.ngdoc b/docs/content/guide/module.ngdoc
    index 2d0a795deb79..bfd9ca5f5816 100644
    --- a/docs/content/guide/module.ngdoc
    +++ b/docs/content/guide/module.ngdoc
    @@ -66,8 +66,9 @@ that you break your application to multiple modules like this:
       * And an application level module which depends on the above modules and contains any
         initialization code.
     
    -We've also written a document on how we organize large apps at Google and on how to write
    -reusable components.
    +We've also
    +[written a document](http://blog.angularjs.org/2014/02/an-angularjs-style-guide-and-best.html)
    +on how we organize large apps at Google.
     
     The above is a suggestion. Tailor it to your needs.
     
    
    From 344cdce1365f99807453d9cad125a5d5a6564294 Mon Sep 17 00:00:00 2001
    From: Sekib Omazic 
    Date: Fri, 7 Mar 2014 19:08:20 +0100
    Subject: [PATCH 100/837] docs(css): RegExp doesn't have .type-hint-regexp
     class
    
    type-hint-regexp gets a nice color
    
    closes #6596
    ---
     docs/app/assets/css/docs.css | 4 ++++
     1 file changed, 4 insertions(+)
    
    diff --git a/docs/app/assets/css/docs.css b/docs/app/assets/css/docs.css
    index f9f0253ca4ad..2a012c0798d6 100644
    --- a/docs/app/assets/css/docs.css
    +++ b/docs/app/assets/css/docs.css
    @@ -466,6 +466,10 @@ iframe.example {
       background:rgb(189, 63, 66);
     }
     
    +.type-hint-regexp {
    +  background: rgb(90, 84, 189);
    +}
    +
     .runnable-example-frame {
       width:100%;
       height:300px;
    
    From dadce485a7a1d30fb5614188ebd8a361c9990060 Mon Sep 17 00:00:00 2001
    From: poshest 
    Date: Tue, 18 Mar 2014 00:02:15 +0100
    Subject: [PATCH 101/837] docs(errors/$compile/nonassing): update
     nonassign.ngdoc
    
    It might seem obvious that if you don't supply "bind" attribute in this case, you'll get an error,
    but I feel this is worth adding to the doc.
    
    Closes #6725
    ---
     docs/content/error/$compile/nonassign.ngdoc | 3 +++
     1 file changed, 3 insertions(+)
    
    diff --git a/docs/content/error/$compile/nonassign.ngdoc b/docs/content/error/$compile/nonassign.ngdoc
    index 3a7d996b647a..7486ba707985 100644
    --- a/docs/content/error/$compile/nonassign.ngdoc
    +++ b/docs/content/error/$compile/nonassign.ngdoc
    @@ -30,6 +30,9 @@ Following are invalid uses of this directive:
     
     
     
    +
    +
    +
     ```
     
     
    
    From df804406fb97644a4ea8e91847170ecb75aaf1ae Mon Sep 17 00:00:00 2001
    From: Tyler Kellogg 
    Date: Sun, 16 Mar 2014 16:53:00 -0700
    Subject: [PATCH 102/837] docs($cookies): cookies serializer only supports
     strings
    
    Closes #6705
    ---
     src/ngCookies/cookies.js | 5 +++--
     1 file changed, 3 insertions(+), 2 deletions(-)
    
    diff --git a/src/ngCookies/cookies.js b/src/ngCookies/cookies.js
    index b78fcd5aaf8b..ccfae23be86e 100644
    --- a/src/ngCookies/cookies.js
    +++ b/src/ngCookies/cookies.js
    @@ -25,8 +25,9 @@ angular.module('ngCookies', ['ng']).
        * @description
        * Provides read/write access to browser's cookies.
        *
    -   * Only a simple Object is exposed and by adding or removing properties to/from
    -   * this object, new cookies are created/deleted at the end of current $eval.
    +   * Only a simple Object is exposed and by adding or removing properties to/from this object, new
    +   * cookies are created/deleted at the end of current $eval.
    +   * The object's properties can only be strings.
        *
        * Requires the {@link ngCookies `ngCookies`} module to be installed.
        *
    
    From 6c82a497c678c2392d9902bad18640418fe1e745 Mon Sep 17 00:00:00 2001
    From: Edward Brey 
    Date: Fri, 14 Feb 2014 20:55:22 -0600
    Subject: [PATCH 103/837] docs(loader): add annotations to example
    
    ---
     src/loader.js | 4 ++--
     1 file changed, 2 insertions(+), 2 deletions(-)
    
    diff --git a/src/loader.js b/src/loader.js
    index 5c72a98222d6..32ce08ee0c28 100644
    --- a/src/loader.js
    +++ b/src/loader.js
    @@ -55,10 +55,10 @@ function setupModuleLoader(window) {
          * myModule.value('appName', 'MyCoolApp');
          *
          * // configure existing services inside initialization blocks.
    -     * myModule.config(function($locationProvider) {
    +     * myModule.config(['$locationProvider', function($locationProvider) {
          *   // Configure existing providers
          *   $locationProvider.hashPrefix('!');
    -     * });
    +     * }]);
          * ```
          *
          * Then you can create an injector and load your modules like this:
    
    From 9ab594a66c6385434132c8ffc1ed9ed17bae8298 Mon Sep 17 00:00:00 2001
    From: Jesse Palmer 
    Date: Thu, 30 Jan 2014 22:21:57 -0500
    Subject: [PATCH 104/837] docs($templateCache): use GFM example format rather
     than 
     tags
    
    Updated example formatting.
    
    Closes #6068
    ---
     src/ng/cacheFactory.js | 14 +++++---------
     1 file changed, 5 insertions(+), 9 deletions(-)
    
    diff --git a/src/ng/cacheFactory.js b/src/ng/cacheFactory.js
    index c16c1e1f0b4e..5d7c8c652d8f 100644
    --- a/src/ng/cacheFactory.js
    +++ b/src/ng/cacheFactory.js
    @@ -208,17 +208,13 @@ function $CacheFactoryProvider() {
      * `$templateCache` service directly.
      *
      * Adding via the `script` tag:
    + * 
      * ```html
    - * 
    - * 
    - * 
    - * 
    - *   ...
    - * 
    + *   
      * ```
    - *
    + * 
      * **Note:** the `script` tag containing the template does not need to be included in the `head` of
      * the document, but it must be below the `ng-app` definition.
      *
    
    From 5b7f1bcc009ac5574da39b25859de3ed3b48abf5 Mon Sep 17 00:00:00 2001
    From: Caitlin Potter 
    Date: Mon, 17 Mar 2014 21:47:25 -0400
    Subject: [PATCH 105/837] style($templateCache): remove trailing whitespace
    
    This was introduced by 2ca6d650e8a13cee28f11c38622cab231787325f, somewhat inexplicably as I had run
    grunt ci-checks locally. But regardless, this should fix this up.
    ---
     src/ng/cacheFactory.js | 4 ++--
     1 file changed, 2 insertions(+), 2 deletions(-)
    
    diff --git a/src/ng/cacheFactory.js b/src/ng/cacheFactory.js
    index 5d7c8c652d8f..69c4ed93a0e0 100644
    --- a/src/ng/cacheFactory.js
    +++ b/src/ng/cacheFactory.js
    @@ -208,13 +208,13 @@ function $CacheFactoryProvider() {
      * `$templateCache` service directly.
      *
      * Adding via the `script` tag:
    - * 
    + *
      * ```html
      *   
      * ```
    - * 
    + *
      * **Note:** the `script` tag containing the template does not need to be included in the `head` of
      * the document, but it must be below the `ng-app` definition.
      *
    
    From ca69dc6f1779221ffe01ac5542afc4433ab41a05 Mon Sep 17 00:00:00 2001
    From: Peter Bacon Darwin 
    Date: Tue, 18 Mar 2014 10:43:17 +0000
    Subject: [PATCH 106/837] chore(utils): fix version number processing
    
    The changes to version-info meant that the version being injected into
    the code at build time was missing the "dot" (patch) version and the
    release code-name.
    ---
     lib/grunt/utils.js | 4 ++--
     1 file changed, 2 insertions(+), 2 deletions(-)
    
    diff --git a/lib/grunt/utils.js b/lib/grunt/utils.js
    index b25a455528d7..c00147fe8dac 100644
    --- a/lib/grunt/utils.js
    +++ b/lib/grunt/utils.js
    @@ -149,9 +149,9 @@ module.exports = {
           .replace(/"NG_VERSION_FULL"/g, NG_VERSION.full)
           .replace(/"NG_VERSION_MAJOR"/, NG_VERSION.major)
           .replace(/"NG_VERSION_MINOR"/, NG_VERSION.minor)
    -      .replace(/"NG_VERSION_DOT"/, NG_VERSION.dot)
    +      .replace(/"NG_VERSION_DOT"/, NG_VERSION.patch)
           .replace(/"NG_VERSION_CDN"/, NG_VERSION.cdn)
    -      .replace(/"NG_VERSION_CODENAME"/, NG_VERSION.codename);
    +      .replace(/"NG_VERSION_CODENAME"/, NG_VERSION.codeName);
         if (strict !== false) processed = this.singleStrict(processed, '\n\n', true);
         return processed;
       },
    
    From 0d60f8d367e38224696749b0f7de04bd60649815 Mon Sep 17 00:00:00 2001
    From: Siddique Hameed 
    Date: Fri, 17 Jan 2014 12:17:22 -0600
    Subject: [PATCH 107/837] fix(angular.bootstrap): only allow angular to load
     once
    
    This is hard to test as a unit-test, since it involves the actual loading
    of angular, but it turns out that it is easy to test using a protractor
    e2e test.
    
    Closes #5863
    Closes #5587
    ---
     src/Angular.js     | 35 +++++++++++++++++++++++++++++++++++
     src/angular.suffix |  6 ++++++
     2 files changed, 41 insertions(+)
    
    diff --git a/src/Angular.js b/src/Angular.js
    index 96df13f4ff8d..ec69cc1a59a1 100644
    --- a/src/Angular.js
    +++ b/src/Angular.js
    @@ -1241,6 +1241,41 @@ function angularInit(element, bootstrap) {
      * Note that ngScenario-based end-to-end tests cannot use this function to bootstrap manually.
      * They must use {@link ng.directive:ngApp ngApp}.
      *
    + * Angular will detect if it has been loaded into the browser more than once and only allow the
    + * first loaded script to be bootstrapped and will report a warning to the browser console for
    + * each of the subsequent scripts.   This prevents strange results in applications, where otherwise
    + * multiple instances of Angular try to work on the DOM.
    + *
    + * 
    + * 
    + * 
    + * 
    + *
    + * + * + * + * + * + * + *
    {{heading}}
    {{fill}}
    + *
    + * + * + * var app = angular.module('multi-bootstrap', []) + * + * .controller('BrokenTable', function($scope) { + * $scope.headings = ['One', 'Two', 'Three']; + * $scope.fillings = [[1, 2, 3], ['A', 'B', 'C'], [7, 8, 9]]; + * }); + * + * + * it('should only insert one table cell for each item in $scope.fillings', function() { + * expect(element.all(by.css('td')).count()) + * .toBe(9); + * }); + * + * + * * @param {Element} element DOM element which is the root of angular application. * @param {Array=} modules an array of modules to load into the application. * Each item in the array should be the name of a predefined module or a (DI annotated) diff --git a/src/angular.suffix b/src/angular.suffix index c86200bb31f4..9429d4fcf3d2 100644 --- a/src/angular.suffix +++ b/src/angular.suffix @@ -1,3 +1,9 @@ + if (window.angular.bootstrap) { + //AngularJS is already loaded, so we can return here... + console.log('WARNING: Tried to load angular more than once.'); + return; + } + //try to bind to jquery now so that one can write angular.element().read() //but we will rebind on bootstrap again. bindJQuery(); From b91b3119a44d722aa83a0dbfe8817a5186ba9a99 Mon Sep 17 00:00:00 2001 From: frandroid Date: Tue, 18 Mar 2014 17:19:31 -0400 Subject: [PATCH 108/837] docs(tutorial/step_05): removed stray "a" --- docs/content/tutorial/step_05.ngdoc | 1 - 1 file changed, 1 deletion(-) diff --git a/docs/content/tutorial/step_05.ngdoc b/docs/content/tutorial/step_05.ngdoc index 17941cd14e14..dccd1d18849e 100644 --- a/docs/content/tutorial/step_05.ngdoc +++ b/docs/content/tutorial/step_05.ngdoc @@ -20,7 +20,6 @@ You should now see a list of 20 phones. The most important changes are listed below. You can see the full diff on [GitHub](https://github.com/angular/angular-phonecat/compare/step-4...step-5): ## Data -a The `app/phones/phones.json` file in your project is a dataset that contains a larger list of phones stored in the JSON format. From 916e53ce14ead459da14c935f95fc384cf1fe41c Mon Sep 17 00:00:00 2001 From: frandroid Date: Tue, 18 Mar 2014 17:22:20 -0400 Subject: [PATCH 109/837] docs(tutorial/step_05): fix services link --- docs/content/tutorial/step_05.ngdoc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/content/tutorial/step_05.ngdoc b/docs/content/tutorial/step_05.ngdoc index dccd1d18849e..031d97b751d8 100644 --- a/docs/content/tutorial/step_05.ngdoc +++ b/docs/content/tutorial/step_05.ngdoc @@ -7,7 +7,7 @@ Enough of building an app with three phones in a hard-coded dataset! Let's fetch a larger dataset -from our server using one of Angular's built-in {@link guide/dev_guide.services services} called {@link +from our server using one of Angular's built-in {@link guide/services services} called {@link ng.$http $http}. We will use Angular's {@link guide/di dependency injection (DI)} to provide the service to the `PhoneListCtrl` controller. From 01a34f513bb567ed6d4c81d00d7c2a777c0dae01 Mon Sep 17 00:00:00 2001 From: Chris Constantin Date: Mon, 17 Feb 2014 16:10:36 -0800 Subject: [PATCH 110/837] fix(ngTouch): update workaround for desktop Webkit quirk Fix click busting of input click triggered by a label click quickly following a touch event on a different element, in desktop and mobile WebKit To reproduce the issue fixed by this commit set up a page with - an element with ng-click - a radio button (with hg-model) and associated label In a quick sequence tap on the element and then on the label. The radio button will not be checked, unless PREVENT_DURATION has passed Closes #6302 --- src/ngTouch/directive/ngClick.js | 16 +++- test/ngTouch/directive/ngClickSpec.js | 106 ++++++++++++++++++++------ 2 files changed, 98 insertions(+), 24 deletions(-) diff --git a/src/ngTouch/directive/ngClick.js b/src/ngTouch/directive/ngClick.js index 6cd0ff763032..7e558defc9f5 100644 --- a/src/ngTouch/directive/ngClick.js +++ b/src/ngTouch/directive/ngClick.js @@ -53,6 +53,7 @@ ngTouch.directive('ngClick', ['$parse', '$timeout', '$rootElement', var ACTIVE_CLASS_NAME = 'ng-click-active'; var lastPreventedTime; var touchCoordinates; + var lastLabelClickCoordinates; // TAP EVENTS AND GHOST CLICKS @@ -124,10 +125,23 @@ ngTouch.directive('ngClick', ['$parse', '$timeout', '$rootElement', var y = touches[0].clientY; // Work around desktop Webkit quirk where clicking a label will fire two clicks (on the label // and on the input element). Depending on the exact browser, this second click we don't want - // to bust has either (0,0) or negative coordinates. + // to bust has either (0,0), negative coordinates, or coordinates equal to triggering label + // click event if (x < 1 && y < 1) { return; // offscreen } + if (lastLabelClickCoordinates && + lastLabelClickCoordinates[0] === x && lastLabelClickCoordinates[1] === y) { + return; // input click triggered by label click + } + // reset label click coordinates on first subsequent click + if (lastLabelClickCoordinates) { + lastLabelClickCoordinates = null; + } + // remember label click coordinates to prevent click busting of trigger click event on input + if (event.target.tagName.toLowerCase() === 'label') { + lastLabelClickCoordinates = [x, y]; + } // Look for an allowable region containing this click. // If we find one, that means it was created by touchstart and not removed by diff --git a/test/ngTouch/directive/ngClickSpec.js b/test/ngTouch/directive/ngClickSpec.js index 43735709abea..921c64578b2b 100644 --- a/test/ngTouch/directive/ngClickSpec.js +++ b/test/ngTouch/directive/ngClickSpec.js @@ -370,40 +370,100 @@ describe('ngClick (touch)', function() { })); - it('should not cancel clicks that come long after', inject(function($rootScope, $compile) { - element1 = $compile('
    ')($rootScope); + describe('when clicking on a label immediately following a touch event', function() { + var touch = function(element, x, y) { + time = 10; + browserTrigger(element, 'touchstart',{ + keys: [], + x: x, + y: y + }); - $rootScope.count = 0; + time = 50; + browserTrigger(element, 'touchend',{ + keys: [], + x: x, + y: y + }); + }; - $rootScope.$digest(); + var click = function(element, x, y) { + browserTrigger(element, 'click',{ + keys: [], + x: x, + y: y + }); + }; - expect($rootScope.count).toBe(0); + var $rootScope; + var container, otherElement, input, label; + beforeEach(inject(function(_$rootScope_, $compile, $rootElement) { + $rootScope = _$rootScope_; + var container = $compile('
    ' + + '' + + '
    ')($rootScope); + $rootElement.append(container); + otherElement = container.children()[0]; + input = container.children()[1]; + label = container.children()[2]; - time = 10; - browserTrigger(element1, 'touchstart',{ - keys: [], - x: 10, - y: 10 + $rootScope.selection = 'initial'; + + $rootScope.$digest(); + })); + + + afterEach(function() { + dealoc(label); + dealoc(input); + dealoc(otherElement); + dealoc(container); }); - time = 50; - browserTrigger(element1, 'touchend',{ - keys: [], - x: 10, - y: 10 + + it('should not cancel input clicks with (0,0) coordinates', function() { + touch(otherElement, 100, 100); + + time = 500; + click(label, 10, 10); + click(input, 0, 0); + + expect($rootScope.selection).toBe('radio1'); }); - expect($rootScope.count).toBe(1); - time = 2700; - browserTrigger(element1, 'click',{ - keys: [], - x: 10, - y: 10 + it('should not cancel input clicks with negative coordinates', function() { + touch(otherElement, 100, 100); + + time = 500; + click(label, 10, 10); + click(input, -1, -1); + + expect($rootScope.selection).toBe('radio1'); }); - expect($rootScope.count).toBe(2); - })); + + it('should not cancel input clicks with positive coordinates identical to label click', function() { + touch(otherElement, 100, 100); + + time = 500; + click(label, 10, 10); + click(input, 10, 10); + + expect($rootScope.selection).toBe('radio1'); + }); + + + it('should cancel input clicks with positive coordinates different than label click', function() { + touch(otherElement, 100, 100); + + time = 500; + click(label, 10, 10); + click(input, 11, 11); + + expect($rootScope.selection).toBe('initial'); + }); + }); }); From 93d1c95c61dbfa565333bb64527a103242175af7 Mon Sep 17 00:00:00 2001 From: Caitlin Potter Date: Tue, 18 Mar 2014 13:13:08 -0400 Subject: [PATCH 111/837] fix(ngCookie): convert non-string values to string Previously, non-string values stored in $cookies would be removed, without warning the user, and causing difficulty debugging. Now, the value is converted to string before being stored, and the value is not dropped. Serialization may be customized using the toString() method of an object's prototype. Closes #6151 Closes #6220 --- src/ngCookies/cookies.js | 10 ++++------ test/ngCookies/cookiesSpec.js | 18 ++++++++++++++---- 2 files changed, 18 insertions(+), 10 deletions(-) diff --git a/src/ngCookies/cookies.js b/src/ngCookies/cookies.js index ccfae23be86e..4f97c8dd17f3 100644 --- a/src/ngCookies/cookies.js +++ b/src/ngCookies/cookies.js @@ -95,12 +95,10 @@ angular.module('ngCookies', ['ng']). for(name in cookies) { value = cookies[name]; if (!angular.isString(value)) { - if (angular.isDefined(lastCookies[name])) { - cookies[name] = lastCookies[name]; - } else { - delete cookies[name]; - } - } else if (value !== lastCookies[name]) { + value = '' + value; + cookies[name] = value; + } + if (value !== lastCookies[name]) { $browser.cookies(name, value); updated = true; } diff --git a/test/ngCookies/cookiesSpec.js b/test/ngCookies/cookiesSpec.js index 674c27748f11..1d669c1c6b8a 100644 --- a/test/ngCookies/cookiesSpec.js +++ b/test/ngCookies/cookiesSpec.js @@ -45,15 +45,25 @@ describe('$cookies', function() { })); - it('should drop or reset any cookie that was set to a non-string value', + it('should convert non-string values to string', inject(function($cookies, $browser, $rootScope) { $cookies.nonString = [1, 2, 3]; $cookies.nullVal = null; $cookies.undefVal = undefined; - $cookies.preexisting = function() {}; + var preexisting = $cookies.preexisting = function() {}; $rootScope.$digest(); - expect($browser.cookies()).toEqual({'preexisting': 'oldCookie'}); - expect($cookies).toEqual({'preexisting': 'oldCookie'}); + expect($browser.cookies()).toEqual({ + 'preexisting': '' + preexisting, + 'nonString': '1,2,3', + 'nullVal': 'null', + 'undefVal': 'undefined' + }); + expect($cookies).toEqual({ + 'preexisting': '' + preexisting, + 'nonString': '1,2,3', + 'nullVal': 'null', + 'undefVal': 'undefined' + }); })); From 10d3e1e4472ab9f5cf4418b6438ec2e0f2b0b288 Mon Sep 17 00:00:00 2001 From: Caitlin Potter Date: Wed, 5 Feb 2014 23:50:58 -0500 Subject: [PATCH 112/837] fix(orderBy): support string predicates containing non-ident characters The orderBy filter now allows string predicates passed to the orderBy filter to make use property name predicates containing non-ident strings, such as spaces or percent signs, or non-latin characters. This behaviour requires the predicate string to be double-quoted. In markup, this might look like so: ```html
    ...
    ``` Or in JS: ```js var sorted = $filter('orderBy')(array, ['"Tip %"', '-"Subtotal $"'], false); ``` Closes #6143 Closes #6144 --- src/ng/filter/orderBy.js | 6 ++++++ test/ng/filter/orderBySpec.js | 12 ++++++++++++ 2 files changed, 18 insertions(+) diff --git a/src/ng/filter/orderBy.js b/src/ng/filter/orderBy.js index b62626988fc5..faeb8ed1e570 100644 --- a/src/ng/filter/orderBy.js +++ b/src/ng/filter/orderBy.js @@ -74,6 +74,12 @@ function orderByFilter($parse){ predicate = predicate.substring(1); } get = $parse(predicate); + if (get.constant) { + var key = get(); + return reverseComparator(function(a,b) { + return compare(a[key], b[key]); + }, descending); + } } return reverseComparator(function(a,b){ return compare(get(a),get(b)); diff --git a/test/ng/filter/orderBySpec.js b/test/ng/filter/orderBySpec.js index 5c1178910255..5dc966777419 100644 --- a/test/ng/filter/orderBySpec.js +++ b/test/ng/filter/orderBySpec.js @@ -31,4 +31,16 @@ describe('Filter: orderBy', function() { toEqual([{a:2, b:1},{a:15, b:1}]); }); + it('should support string predicates with names containing non-identifier characters', function() { + expect(orderBy([{"Tip %": .25}, {"Tip %": .15}, {"Tip %": .40}], '"Tip %"')) + .toEqualData([{"Tip %": .15}, {"Tip %": .25}, {"Tip %": .40}]); + expect(orderBy([{"원": 76000}, {"원": 31000}, {"원": 156000}], '"원"')) + .toEqualData([{"원": 31000}, {"원": 76000}, {"원": 156000}]) + }); + + it('should throw if quoted string predicate is quoted incorrectly', function() { + expect(function() { + return orderBy([{"Tip %": .15}, {"Tip %": .25}, {"Tip %": .40}], '"Tip %\''); + }).toThrow(); + }); }); From e48c28fe9292efe7af6205b2be116d2350990c73 Mon Sep 17 00:00:00 2001 From: Sekib Omazic Date: Sun, 9 Feb 2014 17:58:11 +0100 Subject: [PATCH 113/837] fix($rootScope): ng-repeat can't handle NaN values. #4605 $watchCollection checks if oldValue !== newValue which does not work for NaN. This was causing infinite digest errors, since comparing NaN to NaN in $watchCollection would always return false, indicating that a change was occuring on each loop. This fix adds a simple check to see if the current value and previous value are both NaN, and if so, does not count it as a change. Closes #4605 --- src/ng/rootScope.js | 4 +++- test/ng/rootScopeSpec.js | 4 ++++ 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/src/ng/rootScope.js b/src/ng/rootScope.js index ce0f8ad54cb3..dbb93000cd72 100644 --- a/src/ng/rootScope.js +++ b/src/ng/rootScope.js @@ -453,7 +453,9 @@ function $RootScopeProvider(){ } // copy the items to oldValue and look for changes. for (var i = 0; i < newLength; i++) { - if (oldValue[i] !== newValue[i]) { + var bothNaN = (oldValue[i] !== oldValue[i]) && + (newValue[i] !== newValue[i]); + if (!bothNaN && (oldValue[i] !== newValue[i])) { changeDetected++; oldValue[i] = newValue[i]; } diff --git a/test/ng/rootScopeSpec.js b/test/ng/rootScopeSpec.js index 251a8ce882c4..2ea414893032 100644 --- a/test/ng/rootScopeSpec.js +++ b/test/ng/rootScopeSpec.js @@ -603,6 +603,10 @@ describe('Scope', function() { expect(log.empty()).toEqual([{newVal: [{}, []], oldVal: ['b', {}, []]}]); }); + it('should not infinitely digest when current value is NaN', function() { + $rootScope.obj = [NaN]; + $rootScope.$digest(); + }); it('should watch array-like objects like arrays', function () { var arrayLikelog = []; From 8fd47a1cd54c6f8e7ba2cac8ad34fdf9bf4d74be Mon Sep 17 00:00:00 2001 From: thorn0 Date: Tue, 18 Feb 2014 11:52:13 +0200 Subject: [PATCH 114/837] docs($q): add mention of Antroid 2.x browser The Android 2.x browser is not ES5-compatible in that it does not allow use of reserved words as property names. This docs fix adds Android to the note to the `$q` docs which already make it known that string property notation should be used when using the `finally` method on `$q`. --- src/ng/q.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ng/q.js b/src/ng/q.js index eb3b2beda80a..76e00df02812 100644 --- a/src/ng/q.js +++ b/src/ng/q.js @@ -112,7 +112,7 @@ * * Because `finally` is a reserved word in JavaScript and reserved keywords are not supported as * property names by ES3, you'll need to invoke the method like `promise['finally'](callback)` to - * make your code IE8 compatible. + * make your code IE8 and Android 2.x compatible. * * # Chaining promises * From 375c47d0c080e9e10867b87264bad657717ecbc4 Mon Sep 17 00:00:00 2001 From: Trevor Ewen Date: Wed, 19 Mar 2014 21:06:50 -0400 Subject: [PATCH 115/837] docs($document): add a documentation example. The $document docs are pretty empty, and this fills them out a bit. The example itself may not be particularly useful, but it could be improved or removed later. Works for me. Closes #6757 --- src/ng/document.js | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/src/ng/document.js b/src/ng/document.js index cc7604773d61..321a36520805 100644 --- a/src/ng/document.js +++ b/src/ng/document.js @@ -7,6 +7,22 @@ * * @description * A {@link angular.element jQuery or jqLite} wrapper for the browser's `window.document` object. + * + * @example + + +
    +

    $document title:

    +

    window.document title:

    +
    +
    + + function MainCtrl($scope, $document) { + $scope.title = $document[0].title; + $scope.windowTitle = angular.element(window.document)[0].title; + } + +
    */ function $DocumentProvider(){ this.$get = ['$window', function(window){ From 187b4adbd2d2dce412e42aa9f99d35aca785479f Mon Sep 17 00:00:00 2001 From: alexgarrett Date: Thu, 20 Mar 2014 11:57:41 +0000 Subject: [PATCH 116/837] docs(tutorial): correct spelling mistake --- docs/content/tutorial/step_02.ngdoc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/content/tutorial/step_02.ngdoc b/docs/content/tutorial/step_02.ngdoc index 56ec2dd2ad8a..6ea936a90e26 100644 --- a/docs/content/tutorial/step_02.ngdoc +++ b/docs/content/tutorial/step_02.ngdoc @@ -226,7 +226,7 @@ To run the test, do the following: Refresh your browser and verify that it says "Hello, World!". -* Update the unit test for the controler in ./tests/unit/controlersSpec.js to refelct the previous change. For example by adding: +* Update the unit test for the controler in ./tests/unit/controlersSpec.js to reflect the previous change. For example by adding: expect(scope.name).toBe('World'); From ad128e09ff0f5837d659f0b9d0bf304446f46044 Mon Sep 17 00:00:00 2001 From: Caitlin Potter Date: Wed, 19 Mar 2014 23:48:47 -0400 Subject: [PATCH 117/837] test($rootScope): add assertion to test ensuring that NaN -> NaN does not throw https://github.com/angular/angular.js/commit/fb6062fb9d83545730b993e94ac7482ffd43a62c implements a fix for NaN values causing $watchCollection to throw an infdig error. This change updates the test by adding an assertion which explains what is actually being tested a bit better, and may also provide better information in the event that the test ever fails. Closes #6758 --- test/ng/rootScopeSpec.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/test/ng/rootScopeSpec.js b/test/ng/rootScopeSpec.js index 2ea414893032..86436ea81f81 100644 --- a/test/ng/rootScopeSpec.js +++ b/test/ng/rootScopeSpec.js @@ -605,7 +605,9 @@ describe('Scope', function() { it('should not infinitely digest when current value is NaN', function() { $rootScope.obj = [NaN]; - $rootScope.$digest(); + expect(function() { + $rootScope.$digest(); + }).not.toThrow(); }); it('should watch array-like objects like arrays', function () { From 87b18b9fbe3bd746f452c0263eec6b4002bd50e4 Mon Sep 17 00:00:00 2001 From: Vojta Jina Date: Fri, 21 Mar 2014 14:57:43 -0700 Subject: [PATCH 118/837] docs(changelog): remove 1.3 notes from 1.2 --- CHANGELOG.md | 147 --------------------------------------------------- 1 file changed, 147 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index cf0ff76ec4fc..5a2442fde4f8 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,150 +1,3 @@ - -# 1.3.0-beta.3 emotional-waffles (2014-03-21) - - -## Bug Fixes - -- **ngAnimate:** support `webkitCancelRequestAnimationFrame` in addition to `webkitCancelAnimationFrame` - ([c839f78b](https://github.com/angular/angular.js/commit/c839f78b8f2d8d910bc2bfc9e41b3e3b67090ec1), - [#6526](https://github.com/angular/angular.js/issues/6526)) -- **$http:** allow sending Blob data using `$http` - ([b8cc71d4](https://github.com/angular/angular.js/commit/b8cc71d476f76ff51e719fb76fb2348027c858ce), - [#5012](https://github.com/angular/angular.js/issues/5012)) -- **$httpBackend:** don't error when JSONP callback is called with no parameter - ([6680b7b9](https://github.com/angular/angular.js/commit/6680b7b97c0326a80bdccaf0a35031e4af641e0e), - [#4987](https://github.com/angular/angular.js/issues/4987), [#6735](https://github.com/angular/angular.js/issues/6735)) -- **$rootScope:** ng-repeat can't handle `NaN` values. #4605 - ([fb6062fb](https://github.com/angular/angular.js/commit/fb6062fb9d83545730b993e94ac7482ffd43a62c), - [#4605](https://github.com/angular/angular.js/issues/4605)) -- **$rootScope:** `$watchCollection` should call listener with old value - ([78057a94](https://github.com/angular/angular.js/commit/78057a945ef84cbb05f9417fe884cb8c28e67b44), - [#2621](https://github.com/angular/angular.js/issues/2621), [#5661](https://github.com/angular/angular.js/issues/5661), [#5688](https://github.com/angular/angular.js/issues/5688), [#6736](https://github.com/angular/angular.js/issues/6736)) -- **angular.bootstrap:** allow angular to load only once - ([748a6c8d](https://github.com/angular/angular.js/commit/748a6c8d9d8d61c3ee18eec462abe8ff245d6a98), - [#5863](https://github.com/angular/angular.js/issues/5863), [#5587](https://github.com/angular/angular.js/issues/5587)) -- **jqLite:** `inheritedData()` now traverses Shadow DOM boundaries via the `host` property of `DocumentFragment` - ([8a96f317](https://github.com/angular/angular.js/commit/8a96f317e594a5096d4fa56ceae4c685eec8ac8b), - [#6637](https://github.com/angular/angular.js/issues/6637)) -- **ngCookie:** convert non-string values to string - ([36528310](https://github.com/angular/angular.js/commit/3652831084c3788f786046b907a7361d2e89c520), - [#6151](https://github.com/angular/angular.js/issues/6151), [#6220](https://github.com/angular/angular.js/issues/6220)) -- **ngTouch:** update workaround for Webkit quirk - ([bc42950b](https://github.com/angular/angular.js/commit/bc42950b514b60f319812eeb87aae2915e394237), - [#6302](https://github.com/angular/angular.js/issues/6302)) -- **orderBy:** support string predicates containing non-ident characters - ([37bc5ef4](https://github.com/angular/angular.js/commit/37bc5ef4d87f19da47d3ab454c43d1e532c4f924), - [#6143](https://github.com/angular/angular.js/issues/6143), [#6144](https://github.com/angular/angular.js/issues/6144)) -- **select:** avoid checking option element's `selected` property in render - ([f40f54c6](https://github.com/angular/angular.js/commit/f40f54c6da4a5399fe18a89d068634bb491e9f1a), - [#2448](https://github.com/angular/angular.js/issues/2448), [#5994](https://github.com/angular/angular.js/issues/5994)) - - -## Features - -- **$compile:** add support for `$observer` deregistration - ([299b220f](https://github.com/angular/angular.js/commit/299b220f5e05e1d4e26bfd58d0b2fd7329ca76b1), - [#5609](https://github.com/angular/angular.js/issues/5609)) -- **ngMock.$httpBackend:** added support for function as URL matcher - ([d6cfcace](https://github.com/angular/angular.js/commit/d6cfcacee101f2738e0a224a3377232ff85f78a4), - [#4580](https://github.com/angular/angular.js/issues/4580)) - - -## Breaking Changes - -- **$compile:** due to [299b220f](https://github.com/angular/angular.js/commit/299b220f5e05e1d4e26bfd58d0b2fd7329ca76b1), - calling `attr.$observe` no longer returns the observer function, but a - deregistration function instead. To migrate the code follow the example below: - -Before: - - directive('directiveName', function() { - return { - link: function(scope, elm, attr) { - var observer = attr.$observe('someAttr', function(value) { - console.log(value); - }); - } - }; - }); - -After: - - directive('directiveName', function() { - return { - link: function(scope, elm, attr) { - var observer = function(value) { - console.log(value); - }; - - attr.$observe('someAttr', observer); - } - }; - }); - -- **$httpBackend:** due to [6680b7b9](https://github.com/angular/angular.js/commit/6680b7b97c0326a80bdccaf0a35031e4af641e0e), the JSONP behavior for erroneous and empty responses changed: - Previously, a JSONP response was regarded as erroneous if it was empty. Now Angular is listening to the - correct events to detect errors, i.e. even empty responses can be successful. - - - - -# 1.3.0-beta.2 silent-ventriloquism (2014-03-14) - - -## Bug Fixes - -- **$$rAF:** always fallback to a $timeout in case native rAF isn't supported - ([7b5e0199](https://github.com/angular/angular.js/commit/7b5e019981f352add88be2984de68e553d1bfa93), - [#6654](https://github.com/angular/angular.js/issues/6654)) -- **$http:** don't convert 0 status codes to 404 for non-file protocols - ([56e73ea3](https://github.com/angular/angular.js/commit/56e73ea355c851fdfd574d6d2a9e2fcb75677945), - [#6074](https://github.com/angular/angular.js/issues/6074), [#6155](https://github.com/angular/angular.js/issues/6155)) -- **ngAnimate:** setting classNameFilter disables animation inside ng-if - ([129e2e02](https://github.com/angular/angular.js/commit/129e2e021ab1d773874428cd1fb329eae72797c4), - [#6539](https://github.com/angular/angular.js/issues/6539)) - - -## Features - -- whitelist blob urls for sanitization of data-bound image urls - ([47ab8df4](https://github.com/angular/angular.js/commit/47ab8df455df1f1391b760e1fbcc5c21645512b8), - [#4623](https://github.com/angular/angular.js/issues/4623)) - - - - -# 1.3.0-beta.1 retractable-eyebrow (2014-03-07) - - -## Bug Fixes - -- **$compile:** support templates with thead and tfoot root elements - ([53ec5e13](https://github.com/angular/angular.js/commit/53ec5e13e5955830b6751019eef232bd2125c0b6), - [#6289](https://github.com/angular/angular.js/issues/6289)) -- **style:** expressions in style tags - ([0609453e](https://github.com/angular/angular.js/commit/0609453e1f9ae074f8d786df903096a6eadb6aa0), - [#2387](https://github.com/angular/angular.js/issues/2387), [#6492](https://github.com/angular/angular.js/issues/6492)) - - -## Features - -- **input:** support types date, time, datetime-local, month, week - ([46bd6dc8](https://github.com/angular/angular.js/commit/46bd6dc88de252886d75426efc2ce8107a5134e9), - [#5864](https://github.com/angular/angular.js/issues/5864)) - - -## Breaking Changes - -- **build:** due to [eaa1d00b](https://github.com/angular/angular.js/commit/eaa1d00b24008f590b95ad099241b4003688cdda), - As communicated before, IE8 is no longer supported. -- **input:** types date, time, datetime-local, month, week now always - require a `Date` object as model ([46bd6dc8](https://github.com/angular/angular.js/commit/46bd6dc88de252886d75426efc2ce8107a5134e9), - [#5864](https://github.com/angular/angular.js/issues/5864)) - -For more info: http://blog.angularjs.org/2013/12/angularjs-13-new-release-approaches.html - - - # 1.2.14 feisty-cryokinesis (2014-03-01) From a9b5a1087ddea10c95318981c20c386a56ca19f7 Mon Sep 17 00:00:00 2001 From: Vojta Jina Date: Fri, 21 Mar 2014 14:58:48 -0700 Subject: [PATCH 119/837] chore(CHANGELOG): add notes for 1.2.15 --- CHANGELOG.md | 53 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 53 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 5a2442fde4f8..3f043663e054 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,56 @@ + +# v1.2.15 beer-underestimating (2014-03-21) + + +## Bug Fixes + +- **$$RAFProvider:** check for webkitCancelRequestAnimationFrame + ([e84da228](https://github.com/angular/angular.js/commit/e84da2283c4e195be557f7b06c8783fe502acbbb), + [#6526](https://github.com/angular/angular.js/issues/6526)) +- **$$rAF:** always fallback to a $timeout incase native rAF isn't supported + ([ee8e4a94](https://github.com/angular/angular.js/commit/ee8e4a946ed8f943e00846b88d8d51c0b2cd1fab), + [#6654](https://github.com/angular/angular.js/issues/6654)) +- **$compile:** support templates with thead and tfoot root elements + ([ca0ac649](https://github.com/angular/angular.js/commit/ca0ac649971ae4fb50419b38f92a98d2226eb696), + [#6289](https://github.com/angular/angular.js/issues/6289)) +- **$http:** + - allow sending Blob data using $http + ([fbb125a3](https://github.com/angular/angular.js/commit/fbb125a3af164e52af2f8119175b04cbbed2f331), + [#5012](https://github.com/angular/angular.js/issues/5012)) + - don't covert 0 status codes to 404 for non-file protocols + ([f108a2a9](https://github.com/angular/angular.js/commit/f108a2a994149ecc011e29f327bcb8e11adf72d9), + [#6074](https://github.com/angular/angular.js/issues/6074), [#6155](https://github.com/angular/angular.js/issues/6155)) +- **$rootScope:** + - ng-repeat can't handle NaN values. #4605 + ([e48c28fe](https://github.com/angular/angular.js/commit/e48c28fe9292efe7af6205b2be116d2350990c73), + [#4605](https://github.com/angular/angular.js/issues/4605)) + - $watchCollection should call listener with oldValue + ([3dd95727](https://github.com/angular/angular.js/commit/3dd9572754c7bafec30dd625f5c611346959c969), + [#2621](https://github.com/angular/angular.js/issues/2621), [#5661](https://github.com/angular/angular.js/issues/5661), [#5688](https://github.com/angular/angular.js/issues/5688), [#6736](https://github.com/angular/angular.js/issues/6736)) +- **angular.bootstrap:** only allow angular to load once + ([0d60f8d3](https://github.com/angular/angular.js/commit/0d60f8d367e38224696749b0f7de04bd60649815), + [#5863](https://github.com/angular/angular.js/issues/5863), [#5587](https://github.com/angular/angular.js/issues/5587)) +- **jqLite:** traverse `host` property for DocumentFragment in inheritedData() + ([98d825e1](https://github.com/angular/angular.js/commit/98d825e10d3bf76f47e69abba857a8933c8cb7d9), + [#6637](https://github.com/angular/angular.js/issues/6637)) +- **ngAnimate:** setting classNameFilter disables animation inside ng-if + ([a41a2a1d](https://github.com/angular/angular.js/commit/a41a2a1d2ce20f86ac2709592e4ada527160e580), + [#6539](https://github.com/angular/angular.js/issues/6539)) +- **ngCookie:** convert non-string values to string + ([93d1c95c](https://github.com/angular/angular.js/commit/93d1c95c61dbfa565333bb64527a103242175af7), + [#6151](https://github.com/angular/angular.js/issues/6151), [#6220](https://github.com/angular/angular.js/issues/6220)) +- **ngTouch:** update workaround for desktop Webkit quirk + ([01a34f51](https://github.com/angular/angular.js/commit/01a34f513bb567ed6d4c81d00d7c2a777c0dae01), + [#6302](https://github.com/angular/angular.js/issues/6302)) +- **orderBy:** support string predicates containing non-ident characters + ([10d3e1e4](https://github.com/angular/angular.js/commit/10d3e1e4472ab9f5cf4418b6438ec2e0f2b0b288), + [#6143](https://github.com/angular/angular.js/issues/6143), [#6144](https://github.com/angular/angular.js/issues/6144)) +- **select:** avoid checking option element selected properties in render + ([dc149de9](https://github.com/angular/angular.js/commit/dc149de9364c66b988f169f67cad39577ba43434), + [#2448](https://github.com/angular/angular.js/issues/2448), [#5994](https://github.com/angular/angular.js/issues/5994), [#6769](https://github.com/angular/angular.js/issues/6769)) + + + # 1.2.14 feisty-cryokinesis (2014-03-01) From edfca4c769333ab4c313c4686d81875eae50bd56 Mon Sep 17 00:00:00 2001 From: Peter Bacon Darwin Date: Sat, 22 Mar 2014 22:34:47 +0000 Subject: [PATCH 120/837] chore(npm-shrinkwrap): update dgeni-packages dependency --- npm-shrinkwrap.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/npm-shrinkwrap.json b/npm-shrinkwrap.json index 726784e87224..bae3fdb36b62 100644 --- a/npm-shrinkwrap.json +++ b/npm-shrinkwrap.json @@ -524,7 +524,7 @@ } }, "dgeni-packages": { - "version": "0.8.1", + "version": "0.8.2", "dependencies": { "lodash": { "version": "2.4.1" From b2363e31023df8240113f68b4e01d942f8009b60 Mon Sep 17 00:00:00 2001 From: Caitlin Potter Date: Sat, 22 Mar 2014 22:39:47 -0400 Subject: [PATCH 121/837] fix(input): don't perform HTML5 validation on updated model-value Running html5-validation immediately after model-value is updated is incorrect, because the view has not updated, and HTML5 constraint validation has not adjusted. Closes #6796 Closes #6806 --- src/ng/directive/input.js | 1 - 1 file changed, 1 deletion(-) diff --git a/src/ng/directive/input.js b/src/ng/directive/input.js index c31bb4004947..b49b625e0a42 100644 --- a/src/ng/directive/input.js +++ b/src/ng/directive/input.js @@ -450,7 +450,6 @@ function addNativeHtml5Validators(ctrl, validatorName, element) { return value; }; ctrl.$parsers.push(validator); - ctrl.$formatters.push(validator); } } From 2c4b3573cc7ace60c74d10d7a0620c05f969aac1 Mon Sep 17 00:00:00 2001 From: cgwyllie Date: Thu, 13 Feb 2014 09:38:10 +0000 Subject: [PATCH 122/837] docs($http): fix auth default headers example --- src/ng/http.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ng/http.js b/src/ng/http.js index 9fcb45782f87..a7a15d7e982b 100644 --- a/src/ng/http.js +++ b/src/ng/http.js @@ -277,7 +277,7 @@ function $HttpProvider() { * * ``` * module.run(function($http) { - * $http.defaults.headers.common.Authentication = 'Basic YmVlcDpib29w' + * $http.defaults.headers.common.Authorization = 'Basic YmVlcDpib29w' * }); * ``` * From fb2ae5660e5da056ac6f7598169c5cbd91a1d25c Mon Sep 17 00:00:00 2001 From: Luke Eller Date: Fri, 20 Dec 2013 11:25:48 +1100 Subject: [PATCH 123/837] docs(guides/directive): add (') to contraction add apostrophe (') to contraction --- docs/content/guide/directive.ngdoc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/content/guide/directive.ngdoc b/docs/content/guide/directive.ngdoc index a6e839bde613..319eb945bc84 100644 --- a/docs/content/guide/directive.ngdoc +++ b/docs/content/guide/directive.ngdoc @@ -737,7 +737,7 @@ own behavior to it. We want to run the function we pass by invoking it from the directive's scope, but have it run -in the context of the scope where its registered. +in the context of the scope where it's registered. We saw earlier how to use `=attr` in the `scope` option, but in the above example, we're using `&attr` instead. The `&` binding allows a directive to trigger evaluation of an expression in From 17fa2468bc5223edcd7294ddfd9fc02003a80e94 Mon Sep 17 00:00:00 2001 From: Tobias Bosch Date: Fri, 21 Mar 2014 15:48:56 -0700 Subject: [PATCH 124/837] chore(release): update cdn version --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index ac7fab66c471..9e944595d74f 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "angularjs", "branchVersion": "1.2.*", - "cdnVersion": "1.2.14", + "cdnVersion": "1.2.15", "repository": { "type": "git", "url": "https://github.com/angular/angular.js.git" From a275d539f9631d6ec64d03814b3b09420e6cf1ee Mon Sep 17 00:00:00 2001 From: Renat Yakubov Date: Mon, 24 Mar 2014 22:44:08 +0300 Subject: [PATCH 125/837] fix(filter.ngdoc): Check if "input" variable is defined By default, "greeting" textfield in this example is prepopulated with "hello" text, but it's pretty easy to copy just filter code to use it in your app. If your textfield is empty while app loads, you'll get an error: "Error: [$interpolate:interr] Can't interpolate: Reverse: {{greeting|reverse}} TypeError: Cannot read property 'length' of undefined". To prevent this, we should check "input" variable, and proceed only in case it is defined. Closes #6819. --- docs/content/guide/filter.ngdoc | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/content/guide/filter.ngdoc b/docs/content/guide/filter.ngdoc index 8eedf14c81df..9ef8bcc0f99b 100644 --- a/docs/content/guide/filter.ngdoc +++ b/docs/content/guide/filter.ngdoc @@ -103,6 +103,7 @@ text upper-case. angular.module('MyReverseModule', []). filter('reverse', function() { return function(input, uppercase) { + input = input || ''; var out = ""; for (var i = 0; i < input.length; i++) { out = input.charAt(i) + out; From 7cccb8b77758c78ecd34f58dd2ceef048ec55e0f Mon Sep 17 00:00:00 2001 From: Teddy Wing Date: Mon, 24 Mar 2014 23:10:36 -0400 Subject: [PATCH 126/837] docs(ngAnimate): change "@" to "@" symbol Previously, we had problems with code that contained symbols that looked like jsdoc directives. This has now been fixed so we can convert these HTML character codes back to @ signs. Closes #6822 Closes #6826 --- src/ngAnimate/animate.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/ngAnimate/animate.js b/src/ngAnimate/animate.js index 542b678f8316..0466cecb1715 100644 --- a/src/ngAnimate/animate.js +++ b/src/ngAnimate/animate.js @@ -106,11 +106,11 @@ * -webkit-animation: enter_sequence 1s linear; /* Safari/Chrome */ * animation: enter_sequence 1s linear; /* IE10+ and Future Browsers */ * } - * @-webkit-keyframes enter_sequence { + * @-webkit-keyframes enter_sequence { * from { opacity:0; } * to { opacity:1; } * } - * @keyframes enter_sequence { + * @keyframes enter_sequence { * from { opacity:0; } * to { opacity:1; } * } From 6636f1d03f3a80e02467adb9ca0f259218b92608 Mon Sep 17 00:00:00 2001 From: Uri Goldshtein Date: Tue, 14 Jan 2014 16:03:32 +0200 Subject: [PATCH 127/837] docs(guide): add ui-router to complementary libraries --- docs/content/guide/index.ngdoc | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/content/guide/index.ngdoc b/docs/content/guide/index.ngdoc index 493134ce2573..8b615f4961ea 100644 --- a/docs/content/guide/index.ngdoc +++ b/docs/content/guide/index.ngdoc @@ -73,6 +73,7 @@ This is a short list of libraries with specific support and documentation for wo * **RESTful services:** [Restangular](https://github.com/mgonto/restangular) * **SQL and NoSQL backends:** [BreezeJS](http://www.breezejs.com/), [AngularFire](http://angularfire.com/) * **UI Widgets: **[KendoUI](http://kendo-labs.github.io/angular-kendo/#/), [UI Bootstrap](http://angular-ui.github.io/bootstrap/), [Wijmo](http://wijmo.com/tag/angularjs-2/) +* **Advanced Routing:** [UI-Router](https://github.com/angular-ui/ui-router) ## Deployment From 512ecf8f1b89c8113e0035ec53141836a2593748 Mon Sep 17 00:00:00 2001 From: Brian Ford Date: Tue, 25 Mar 2014 11:45:52 -0700 Subject: [PATCH 128/837] docs(guide/ie): note dropping IE8 in 1.3 --- docs/content/guide/ie.ngdoc | 23 ++++++++++++++--------- 1 file changed, 14 insertions(+), 9 deletions(-) diff --git a/docs/content/guide/ie.ngdoc b/docs/content/guide/ie.ngdoc index 2842a83e2979..106888c781fb 100644 --- a/docs/content/guide/ie.ngdoc +++ b/docs/content/guide/ie.ngdoc @@ -4,19 +4,24 @@ # Overview +
    +**Note:** AngularJS 1.3 is dropping support for IE8. Read more about it on +[our blog](http://blog.angularjs.org/2013/12/angularjs-13-new-release-approaches.html). +AngularJS 1.2 will continue to support IE8, but the core team does not plan to spend time +addressing issues specific to IE8 or earlier. +
    + This document describes the Internet Explorer (IE) idiosyncrasies when dealing with custom HTML attributes and tags. Read this document if you are planning on deploying your Angular application -on IE v8.0 or earlier. - -The project currently supports and will attempt to fix bugs for IE8 and above. The continuous -integration server runs all the tests against IE8. See http://ci.angularjs.org. +on IE8 or earlier. -IE7 and below are not tested and the project makes no guarantee that Angular will work on it. -A subset of the AngularJS functionality may work. It is up to you to test and decide whether -it works for your particular app. +The project currently supports and will attempt to fix bugs for IE9 and above. The continuous +integration server runs all the tests against IE9, IE10, and IE11. See +[Travis CI](https://travis-ci.org/angular/angular.js) and +[ci.angularjs.org](http://ci.angularjs.org). -It is very unlikely that issues specific to IE7 or earlier will be given any time by the core team. -[GitHub](https://github.com/angular/angular.js/issues/4974) +We do not run tests on IE8 and below. A subset of the AngularJS functionality may work on these +browesers, but it is up to you to test and decide whether it works for your particular app. # Short Version From 561ddc9ff1670f51752e53246fffd6ed0b7cbe92 Mon Sep 17 00:00:00 2001 From: Brian Ford Date: Tue, 25 Mar 2014 12:24:05 -0700 Subject: [PATCH 129/837] docs(guide/i18n): improve content and formatting --- docs/content/guide/i18n.ngdoc | 132 +++++++++++++++++++--------------- 1 file changed, 73 insertions(+), 59 deletions(-) diff --git a/docs/content/guide/i18n.ngdoc b/docs/content/guide/i18n.ngdoc index 6dec8fd2cd81..8628d809fc77 100644 --- a/docs/content/guide/i18n.ngdoc +++ b/docs/content/guide/i18n.ngdoc @@ -2,53 +2,54 @@ @name i18n and l10n @description -# I18n and L10n in AngularJS +# i18n and l10n -**What is i18n and l10n?** +Internationalization (i18n) is the process of developing products in such a way that they can be +localized for languages and cultures easily. Localization (l10n), is the process of adapting +applications and text to enable their usability in a particular cultural or linguistic market. For +application developers, internationalizing an application means abstracting all of the strings and +other locale-specific bits (such as date or currency formats) out of the application. Localizing an +application means providing translations and localized formats for the abstracted bits. -Internationalization, abbreviated i18n, is the process of developing products in such a way that -they can be localized for languages and cultures easily. Localization, abbreviated l10n, is the -process of adapting applications and text to enable their usability in a particular cultural or -linguistic market. For application developers, internationalizing an application means abstracting -all of the strings and other locale-specific bits (such as date or currency formats) out of the -application. Localizing an application means providing translations and localized formats for the -abstracted bits. -**What level of support for i18n/l10n is currently in Angular?** +## How does Angular support i18n/l10n? -Currently, Angular supports i18n/l10n for -[datetime](http://docs.angularjs.org/#!/api/ng.filter:date), -[number](http://docs.angularjs.org/#!/api/ng.filter:number) and -[currency](http://docs.angularjs.org/#!/api/ng.filter:currency) filters. +Angular supports i18n/l10n for {@link ng.filter:date date}, {@link ng.filter:number number} and +{@link ng.filter:currency currency} filters. -Additionally, Angular supports localizable pluralization support provided by the {@link -ng.directive:ngPluralize ngPluralize directive}. +Additionally, Angular supports localizable pluralization support through the {@link +ng.directive:ngPluralize `ngPluralize` directive}. All localizable Angular components depend on locale-specific rule sets managed by the {@link -ng.$locale $locale service}. +ng.$locale `$locale` service}. -For readers who want to jump straight into examples, we have a few web pages that showcase how to -use Angular filters with various locale rule sets. You can find these examples either on -[Github](https://github.com/angular/angular.js/tree/master/i18n/e2e) or in the i18n/e2e folder of -Angular development package. +There a few examples that showcase how to use Angular filters with various locale rule sets in the +[`i18n/e2e` directory](https://github.com/angular/angular.js/tree/master/i18n/e2e) of the Angular +source code. -**What is a locale id?** + +## What is a locale ID? A locale is a specific geographical, political, or cultural region. The most commonly used locale -ID consists of two parts: language code and country code. For example, en-US, en-AU, zh-CN are all -valid locale IDs that have both language codes and country codes. Because specifying a country code -in locale ID is optional, locale IDs such as en, zh, and sk are also valid. See the -[ICU ](http://userguide.icu-project.org/locale) website for more information about using locale IDs. +ID consists of two parts: language code and country code. For example, `en-US`, `en-AU`, and +`zh-CN` are all valid locale IDs that have both language codes and country codes. Because +specifying a country code in locale ID is optional, locale IDs such as `en`, `zh`, and `sk` are +also valid. See the [ICU](http://userguide.icu-project.org/locale) website for more information +about using locale IDs. + + +## Supported locales in Angular -**Supported locales in Angular** Angular separates number and datetime format rule sets into different files, each file for a particular locale. You can find a list of currently supported locales [here](https://github.com/angular/angular.js/tree/master/src/ngLocale) -# Providing locale rules to Angular + + +## Providing locale rules to Angular There are two approaches to providing locale rules to Angular: -**1. Pre-bundled rule sets** +### 1. Pre-bundled rule sets You can pre-bundle the desired locale file with Angular by concatenating the content of the locale-specific file to the end of `angular.js` or `angular.min.js` file. @@ -61,7 +62,7 @@ locale, you can do the following: When the application containing `angular_de-de.js` script instead of the generic angular.js script starts, Angular is automatically pre-configured with localization rules for the german locale. -**2. Including locale js script in index.html page** +### 2. Including a locale script in `index.html` You can also include the locale specific js file in the index.html page. For example, if one client requires German locale, you would serve index_de-de.html which will look something like this: @@ -77,48 +78,61 @@ requires German locale, you would serve index_de-de.html which will look somethi ``` -**Comparison of the two approaches** -Both approaches described above requires you to prepare different index.html pages or js files for -each locale that your app may be localized into. You also need to configure your server to serve +### Comparison of the two approaches + +Both approaches described above require you to prepare different `index.html` pages or JavaScript +files for each locale that your app may use. You also need to configure your server to serve the correct file that correspond to the desired locale. -However, the second approach (Including locale js script in index.html page) is likely to be slower -because an extra script needs to be loaded. +The second approach (including the locale JavaScript file in `index.html`) may be slower because +an extra script needs to be loaded. + +## Caveats -# "Gotchas" +Although Angular makes i18n convenient, there are several things you need to be conscious of as you +develop your app. -**Currency symbol "gotcha"** +### Currency symbol -Angular's [currency filter](http://docs.angularjs.org/#!/api/ng.filter:currency) allows -you to use the default currency symbol from the {@link ng.$locale locale service}, -or you can provide the filter with a custom currency symbol. If your app will be used only in one -locale, it is fine to rely on the default currency symbol. However, if you anticipate that viewers -in other locales might use your app, you should provide your own currency symbol to make sure the -actual value is understood. +Angular's {@link ng.filter:currency currency filter} allows you to use the default currency symbol +from the {@link ng.$locale locale service}, or you can provide the filter with a custom currency +symbol. -For example, if you want to display an account balance of 1000 dollars with the following binding -containing currency filter: `{{ 1000 | currency }}`, and your app is currently in en-US locale. -'$1000.00' will be shown. However, if someone in a different local (say, Japan) views your app, their -browser will specify the locale as ja, and the balance of '¥1000.00' will be shown instead. This -will really upset your client. +
    +**Best Practice:** If your app will be used only in one locale, it is fine to rely on the default +currency symbol. If you anticipate that viewers in other locales might use your app, you should +explicitly provide a currency symbol. +
    + +Let's say you are writing a banking app and you want to display an account balance of 1000 dollars. +You write the following binding using the currency filter: + +```html +{{ 1000 | currency }} +``` + +If your app is currently in the `en-US` locale, the browser will show `$1000.00`. If someone in the +Japanese locale (`ja`) views your app, their browser will show a balance of `¥1000.00` instead. +This is problematinc because $1000 is not the same as ¥1000. In this case, you need to override the default currency symbol by providing the -[currency filter](http://docs.angularjs.org/#!/api/ng.filter:currency) with a currency symbol as -a parameter when you configure the filter, for example, {{ 1000 | currency:"USD$"}}. This way, -Angular will always show a balance of 'USD$1000' and disregard any locale changes. +{@link ng.filter:currency} currency filter with a currency symbol as a parameter. + +If we change the above to `{{ 1000 | currency:"USD$"}}`, Angular will always show a balance of +`USD$1000` regardless of locale. -**Translation length "gotcha"** +### Translation length -Keep in mind that translated strings/datetime formats can vary greatly in length. For example, -`June 3, 1977` will be translated to Spanish as `3 de junio de 1977`. There are bound to be other -more extreme cases. Hence, when internationalizing your apps, you need to apply CSS rules -accordingly and do thorough testing to make sure UI components do not overlap. +Translated strings/datetime formats can vary greatly in length. For example, `June 3, 1977` will be +translated to Spanish as `3 de junio de 1977`. +When internationalizing your app, you need to do thorough testing to make sure UI components behave +as expected even when their contents vary greatly in content size. -**Timezones** +### Timezones -Keep in mind that Angular datetime filter uses the time zone settings of the browser. So the same +The Angular datetime filter uses the time zone settings of the browser. The same application will show different time information depending on the time zone settings of the -computer that the application is running on. Neither Javascript nor Angular currently supports +computer that the application is running on. Neither JavaScript nor Angular currently supports displaying the date with a timezone specified by the developer. From 3b09f1bf4eb8c929a894e68692b47801f34690d8 Mon Sep 17 00:00:00 2001 From: Brian Ford Date: Tue, 25 Mar 2014 12:28:13 -0700 Subject: [PATCH 130/837] docs(guide/ie): fix header formatting --- docs/content/guide/ie.ngdoc | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/docs/content/guide/ie.ngdoc b/docs/content/guide/ie.ngdoc index 106888c781fb..0f75342e1fe8 100644 --- a/docs/content/guide/ie.ngdoc +++ b/docs/content/guide/ie.ngdoc @@ -1,8 +1,8 @@ @ngdoc overview -@name Internet Explorer Compatibility +@name Internet Explorer Compatibility @description -# Overview +# Internet Explorer Compatibility
    **Note:** AngularJS 1.3 is dropping support for IE8. Read more about it on @@ -24,7 +24,7 @@ We do not run tests on IE8 and below. A subset of the AngularJS functionality ma browesers, but it is up to you to test and decide whether it works for your particular app. -# Short Version +## Short Version To make your Angular application work on IE please make sure that: @@ -97,7 +97,7 @@ The **important** parts are: happy. -# Long Version +## Long Version IE has issues with element tag names which are not standard HTML tag names. These fall into two categories, and each category has its own fix. From 1f842b1c63e0f00d64268ddc694ec63046aa38d4 Mon Sep 17 00:00:00 2001 From: Brian Ford Date: Tue, 25 Mar 2014 12:38:49 -0700 Subject: [PATCH 131/837] docs(guide/e2e-testing): improve formatting and clarity --- docs/content/guide/e2e-testing.ngdoc | 108 ++++++++++++++------------- 1 file changed, 58 insertions(+), 50 deletions(-) diff --git a/docs/content/guide/e2e-testing.ngdoc b/docs/content/guide/e2e-testing.ngdoc index 606759220eb8..290d80b4497f 100644 --- a/docs/content/guide/e2e-testing.ngdoc +++ b/docs/content/guide/e2e-testing.ngdoc @@ -3,10 +3,12 @@ @name E2E Testing @description -**Angular Scenario Runner is in maintenance mode - If you're starting a new Angular project, -consider using [Protractor](https://github.com/angular/protractor).** - +
    +**Note:** Angular Scenario Runner is depricated. If you're starting a new Angular project, +consider using [Protractor](https://github.com/angular/protractor). +
    +# E2E Testing with the Angular Scenario Runner As applications grow in size and complexity, it becomes unrealistic to rely on manual testing to verify the correctness of new features, catch bugs and notice regressions. @@ -14,16 +16,22 @@ verify the correctness of new features, catch bugs and notice regressions. To solve this problem, we have built an Angular Scenario Runner which simulates user interactions that will help you verify the health of your Angular application. -# Overview +## Overview + You write scenario tests in JavaScript. These tests describe how your application should behave -given a certain interaction in a specific state. A scenario is comprised of one or more `it` blocks -(you can think of these as the requirements of your application), which in turn are made of -**commands** and **expectations**. Commands tell the Runner to do something with the application -(such as navigate to a page or click on a button), and expectations tell the Runner to assert -something about the state (such as the value of a field or the current URL). If any expectation -fails, the runner marks the `it` as "failed" and continues on to the next one. Scenarios may also -have **beforeEach** and **afterEach** blocks, which will be run before (or after) each `it` block, -regardless of whether they pass or fail. +given a certain interaction in a specific state. + +A scenario is comprised of one or more `it` blocks that describe the requirements of your +application. `it` blocks are made of **commands** and **expectations**. Commands tell the Runner +to do something with the application such as navigate to a page or click on a button. Expectations +tell the Runner to assert something about the application's state, such as the value of a field or +the current URL. + +If any expectation within an `it` block fails, the runner marks the `it` as "failed" and continues +on to the next block. + +Scenarios may also have `beforeEach` and `afterEach` blocks, which will be run before or after +each `it` block regardless of whether the block passes or fails. @@ -54,136 +62,136 @@ the only button on the page, and then it verifies that there are 10 items listed The API section below lists the available commands and expectations for the Runner. -# API +## API Source: https://github.com/angular/angular.js/blob/master/src/ngScenario/dsl.js -## pause() +### `pause()` Pauses the execution of the tests until you call `resume()` in the console (or click the resume link in the Runner UI). -## sleep(seconds) +### `sleep(seconds)` Pauses the execution of the tests for the specified number of `seconds`. -## browser().navigateTo(url) +### `browser().navigateTo(url)` Loads the `url` into the test frame. -## browser().navigateTo(url, fn) +### `browser().navigateTo(url, fn)` Loads the URL returned by `fn` into the testing frame. The given `url` is only used for the test output. Use this when the destination URL is dynamic (that is, the destination is unknown when you write the test). -## browser().reload() +### `browser().reload()` Refreshes the currently loaded page in the test frame. -## browser().window().href() +### `browser().window().href()` Returns the window.location.href of the currently loaded page in the test frame. -## browser().window().path() +### `browser().window().path()` Returns the window.location.pathname of the currently loaded page in the test frame. -## browser().window().search() +### `browser().window().search()` Returns the window.location.search of the currently loaded page in the test frame. -## browser().window().hash() +### `browser().window().hash()` Returns the window.location.hash (without `#`) of the currently loaded page in the test frame. -## browser().location().url() +### `browser().location().url()` Returns the {@link ng.$location $location.url()} of the currently loaded page in the test frame. -## browser().location().path() +### `browser().location().path()` Returns the {@link ng.$location $location.path()} of the currently loaded page in the test frame. -## browser().location().search() +### `browser().location().search()` Returns the {@link ng.$location $location.search()} of the currently loaded page in the test frame. -## browser().location().hash() +### `browser().location().hash()` Returns the {@link ng.$location $location.hash()} of the currently loaded page in the test frame. -## expect(future).{matcher} +### `expect(future).{matcher}` Asserts the value of the given `future` satisfies the `matcher`. All API statements return a `future` object, which get a `value` assigned after they are executed. Matchers are defined using `angular.scenario.matcher`, and they use the value of futures to run the expectation. For example: `expect(browser().location().href()).toEqual('http://www.google.com')`. Available matchers are presented further down this document. -## expect(future).not().{matcher} +### `expect(future).not().{matcher}` Asserts the value of the given `future` satisfies the negation of the `matcher`. -## using(selector, label) +### `using(selector, label)` Scopes the next DSL element selection. -## binding(name) +### `binding(name)` Returns the value of the first binding matching the given `name`. -## input(name).enter(value) +### `input(name).enter(value)` Enters the given `value` in the text field with the corresponding ng-model `name`. -## input(name).check() +### `input(name).check()` Checks/unchecks the checkbox with the corresponding ng-model `name`. -## input(name).select(value) +### `input(name).select(value)` Selects the given `value` in the radio button with the corresponding ng-model `name`. -## input(name).val() +### `input(name).val()` Returns the current value of an input field with the corresponding ng-model `name`. -## repeater(selector, label).count() +### `repeater(selector, label).count()` Returns the number of rows in the repeater matching the given jQuery `selector`. The `label` is used for test output. -## repeater(selector, label).row(index) +### `repeater(selector, label).row(index)` Returns an array with the bindings in the row at the given `index` in the repeater matching the given jQuery `selector`. The `label` is used for test output. -## repeater(selector, label).column(binding) +### `repeater(selector, label).column(binding)` Returns an array with the values in the column with the given `binding` in the repeater matching the given jQuery `selector`. The `label` is used for test output. -## select(name).option(value) +### `select(name).option(value)` Picks the option with the given `value` on the select with the given ng-model `name`. -## select(name).options(value1, value2...) +### `select(name).options(value1, value2...)` Picks the options with the given `values` on the multi select with the given ng-model `name`. -## element(selector, label).count() +### `element(selector, label).count()` Returns the number of elements that match the given jQuery `selector`. The `label` is used for test output. -## element(selector, label).click() +### `element(selector, label).click()` Clicks on the element matching the given jQuery `selector`. The `label` is used for test output. -## element(selector, label).query(fn) +### `element(selector, label).query(fn)` Executes the function `fn(selectedElements, done)`, where selectedElements are the elements that match the given jQuery `selector` and `done` is a function that is called at the end of the `fn` function. The `label` is used for test output. -## element(selector, label).{method}() +### `element(selector, label).{method}()` Returns the result of calling `method` on the element matching the given jQuery `selector`, where `method` can be any of the following jQuery methods: `val`, `text`, `html`, `height`, `innerHeight`, `outerHeight`, `width`, `innerWidth`, `outerWidth`, `position`, `scrollLeft`, `scrollTop`, `offset`. The `label` is used for test output. -## element(selector, label).{method}(value) +### `element(selector, label).{method}(value)` Executes the `method` passing in `value` on the element matching the given jQuery `selector`, where `method` can be any of the following jQuery methods: `val`, `text`, `html`, `height`, `innerHeight`, `outerHeight`, `width`, `innerWidth`, `outerWidth`, `position`, `scrollLeft`, `scrollTop`, `offset`. The `label` is used for test output. -## element(selector, label).{method}(key) +### `element(selector, label).{method}(key)` Returns the result of calling `method` passing in `key` on the element matching the given jQuery `selector`, where `method` can be any of the following jQuery methods: `attr`, `prop`, `css`. The `label` is used for test output. -## element(selector, label).{method}(key, value) +### `element(selector, label).{method}(key, value)` Executes the `method` passing in `key` and `value` on the element matching the given jQuery `selector`, where `method` can be any of the following jQuery methods: `attr`, `prop`, `css`. The `label` is used for test output. -# Matchers +## Matchers Matchers are used in combination with the `expect(...)` function as described above and can be negated with `not()`. For instance: `expect(element('h1').text()).not().toEqual('Error')`. @@ -221,10 +229,10 @@ expect(value).toBeLessThan(expected) expect(value).toBeGreaterThan(expected) ``` -# Example +## Example See the [angular-seed](https://github.com/angular/angular-seed) project for more examples. -## Conditional actions with element(...).query(fn) +### Conditional actions with element(...).query(fn) E2E testing with angular scenario is highly asynchronous and hides a lot of complexity by queueing actions and expectations that can handle futures. From time to time, you might need @@ -308,6 +316,6 @@ element('.btn-danger').click(); element('.btn-danger').click(); ``` -# Caveats +## Caveats `ngScenario` does not work with apps that manually bootstrap using `angular.bootstrap`. You must use the `ng-app` directive. From a603330e7a7b821aa910627b303c176b6a9eaaec Mon Sep 17 00:00:00 2001 From: Brian Ford Date: Tue, 25 Mar 2014 12:46:04 -0700 Subject: [PATCH 132/837] docs(guide/concepts): improve formatting and clarity --- docs/content/guide/concepts.ngdoc | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/docs/content/guide/concepts.ngdoc b/docs/content/guide/concepts.ngdoc index 8d178aa7395c..740c49069403 100644 --- a/docs/content/guide/concepts.ngdoc +++ b/docs/content/guide/concepts.ngdoc @@ -2,10 +2,10 @@ @name Conceptual Overview @description -There are some concepts within Angular that you should understand before creating your first application. -This section touches all important parts of Angular really quickly using a simple example. -However, it won't explain all details. -For a more in-depth explanation, have a look at the {@link tutorial/ tutorial}. +# Conceptual Overview + +This section briefly touches on all of the important parts of AngularJS using a simple example. +For a more in-depth explanation, see the {@link tutorial/ tutorial}. | Concept | Description | |------------------|------------------------------------------| @@ -25,7 +25,7 @@ For a more in-depth explanation, have a look at the {@link tutorial/ tutorial}. |{@link concepts#service Service} | reusable business logic independent of views | -# A first example: Data binding +## A first example: Data binding In the following example we will build a form to calculate the costs of an invoice in different currencies. @@ -97,7 +97,7 @@ recalculated and the DOM is updated with their values. The concept behind this is "{@link databinding two-way data binding}". -# Adding UI logic: Controllers +## Adding UI logic: Controllers Let's add some more logic to the example that allows us to enter and calculate the costs in different currencies and also pay the invoice. @@ -181,7 +181,7 @@ The following graphic shows how everything works together after we introduced th -# View independent business logic: Services +## View independent business logic: Services Right now, the `InvoiceController` contains all logic of our example. When the application grows it is a good practice to move view independent logic from the controller into a so called @@ -297,7 +297,7 @@ Angular uses this array syntax to define the dependencies so that the DI also wo the code, which will most probably rename the argument name of the controller constructor function to something shorter like `a`. -# Accessing the backend +## Accessing the backend Let's finish our example by fetching the exchange rates from the Yahoo Finance API. The following example shows how this is done with Angular: @@ -379,8 +379,8 @@ The following example shows how this is done with Angular: What changed? -Our `currencyConverter` service of the `finance` module now uses the -{@link ng.$http $http} service, a builtin service provided by Angular -for accessing the backend. It is a wrapper around [`XMLHttpRequest`](https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest) -and [JSONP](http://en.wikipedia.org/wiki/JSONP) transports. Details can be found in the api docs of that service. +Our `currencyConverter` service of the `finance` module now uses the {@link ng.$http `$http`}, a +built-in service provided by Angular for accessing a server backend. `$http` is a wrapper around +[`XMLHttpRequest`](https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest) +and [JSONP](http://en.wikipedia.org/wiki/JSONP) transports. From 764a3beecce2d8585414628e02090c2ff6db9c50 Mon Sep 17 00:00:00 2001 From: Brian Ford Date: Tue, 25 Mar 2014 12:52:52 -0700 Subject: [PATCH 133/837] docs(guide/migration): add header --- docs/content/guide/migration.ngdoc | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/content/guide/migration.ngdoc b/docs/content/guide/migration.ngdoc index df042582b721..b290e75df654 100644 --- a/docs/content/guide/migration.ngdoc +++ b/docs/content/guide/migration.ngdoc @@ -2,6 +2,7 @@ @name Migrating from 1.0 to 1.2 @description +# Migrating from 1.0 to 1.2 AngularJS version 1.2 introduces several breaking changes that may require changes to your application's source code. From ea3b6310c92ee115833e144f68a54607d3e16eef Mon Sep 17 00:00:00 2001 From: Emma Guo Date: Thu, 20 Mar 2014 16:46:31 -0700 Subject: [PATCH 134/837] docs(README): use svg badge --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 5206614bf3cc..535fdccb8ab6 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -AngularJS [![Build Status](https://travis-ci.org/angular/angular.js.png?branch=master)](https://travis-ci.org/angular/angular.js) +AngularJS [![Build Status](https://travis-ci.org/angular/angular.js.svg?branch=master)](https://travis-ci.org/angular/angular.js) ========= AngularJS lets you write client-side web applications as if you had a smarter browser. It lets you From b0bcf188922f1d10c23953d1e5d30be3c579ccd1 Mon Sep 17 00:00:00 2001 From: Wesley Cho Date: Wed, 19 Mar 2014 23:54:58 -0400 Subject: [PATCH 135/837] docs($compile): add controllerAs example --- src/ng/compile.js | 1 + 1 file changed, 1 insertion(+) diff --git a/src/ng/compile.js b/src/ng/compile.js index c7cd08bce127..22bf9e24ad85 100644 --- a/src/ng/compile.js +++ b/src/ng/compile.js @@ -64,6 +64,7 @@ * restrict: 'A', * scope: false, * controller: function($scope, $element, $attrs, $transclude, otherInjectables) { ... }, + * controllerAs: 'stringAlias', * require: 'siblingDirectiveName', // or // ['^parentDirectiveName', '?optionalDirectiveName', '?^optionalParent'], * compile: function compile(tElement, tAttrs, transclude) { * return { From 300263abec0337b81d2384e9dbed7b7943500c1b Mon Sep 17 00:00:00 2001 From: Trevor Ewen Date: Wed, 5 Mar 2014 20:39:13 -0500 Subject: [PATCH 136/837] docs($cacheFactory): add example --- src/ng/cacheFactory.js | 40 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 40 insertions(+) diff --git a/src/ng/cacheFactory.js b/src/ng/cacheFactory.js index 69c4ed93a0e0..c542a43a25f9 100644 --- a/src/ng/cacheFactory.js +++ b/src/ng/cacheFactory.js @@ -37,6 +37,46 @@ * - `{void}` `removeAll()` — Removes all cached values. * - `{void}` `destroy()` — Removes references to this cache from $cacheFactory. * + * @example + + +
    + + + + +

    Cached Values

    +
    + + : + +
    + +

    Cache Info

    +
    + + : + +
    +
    +
    + + angular.module('cacheExampleApp', []). + controller('CacheController', ['$scope', '$cacheFactory', function($scope, $cacheFactory) { + $scope.keys = []; + $scope.cache = $cacheFactory('cacheId'); + $scope.put = function(key, value) { + $scope.cache.put(key, value); + $scope.keys.push(key); + }; + }]); + + + p { + margin: 10px 0 3px; + } + +
    */ function $CacheFactoryProvider() { From 99a2ad381b4a651be6c7a31526c6aad7a2127978 Mon Sep 17 00:00:00 2001 From: Patrice Chalin Date: Mon, 17 Mar 2014 18:52:45 -0500 Subject: [PATCH 137/837] chore(CONTRIBUTING): merge relevant updates from angular.dart Back port changes to angular.dart `CONTRIBUTING.md`, as suggested by @vicb. --- CONTRIBUTING.md | 56 +++++++++++++++++++++++++++---------------------- 1 file changed, 31 insertions(+), 25 deletions(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 3100643d7837..1ed73085a47d 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -50,7 +50,7 @@ Comment on an issue to let others know what you're working on, or create a new i doesn't fit within the scope of any of the existing doc fix projects. For large fixes, please build and test the documentation before submitting the PR to be sure you haven't -accidentally introduced any layout or formatting issues.You should also make sure that your commit message +accidentally introduced any layout or formatting issues. You should also make sure that your commit message is labeled "docs:" and follows the **Git Commit Guidelines** outlined below. If you're just making a small change, don't worry about filing an issue first. Use the friendly blue "Improve this doc" button at the top right of the doc page to fork the repository in-place and make a quick change on the fly. @@ -92,16 +92,19 @@ Before you submit your pull request consider the following guidelines: git checkout -b my-fix-branch master ``` -* Create your patch, including appropriate test cases. -* Follow our [Coding Rules](#coding-rules) -* Commit your changes and create a descriptive commit message (the - commit message is used to generate release notes, please check out our - [commit message conventions](#commit-message-format) and our commit message presubmit hook - `validate-commit-msg.js`): +* Create your patch, **including appropriate test cases**. +* Follow our [Coding Rules](#coding-rules). +* Run the full Angular test suite, as described in the [developer documentation][dev-doc], + and ensure that all tests pass. +* Commit your changes using a descriptive commit message that follows our + [commit message conventions](#commit-message-format) and passes our commit message presubmit hook + `validate-commit-msg.js`. Adherence to the [commit message conventions](#commit-message-format) + is required because release notes are automatically generated from these messages. ```shell git commit -a ``` + Note: the optional commit `-a` command line option will automatically "add" and "rm" edited files. * Build your changes locally to ensure all the tests pass @@ -109,15 +112,17 @@ Before you submit your pull request consider the following guidelines: grunt test ``` -* Push your branch to Github: +* Push your branch to GitHub: ```shell git push origin my-fix-branch ``` -* In Github, send a pull request to `angular:master`. -* If we suggest changes then you can modify your branch, rebase and force a new push to your GitHub - repository to update the Pull Request: +* In GitHub, send a pull request to `angular:master`. +* If we suggest changes then + * Make the required updates. + * Re-run the Angular test suite to ensure tests are still passing. + * Rebase your branch and force push to your GitHub repository (this will update your Pull Request): ```shell git rebase master -i @@ -126,10 +131,12 @@ Before you submit your pull request consider the following guidelines: That's it! Thank you for your contribution! -When the patch is reviewed and merged, you can safely delete your branch and pull the changes +#### After your pull request is merged + +After your pull request is merged, you can safely delete your branch and pull the changes from the main (upstream) repository: -* Delete the remote branch on Github: +* Delete the remote branch on GitHub either through the GitHub web UI or your local shell as follows: ```shell git push origin --delete my-fix-branch @@ -245,24 +252,23 @@ You can find out more detailed information about contributing in the -[github]: https://github.com/angular/angular.js [Google Closure I18N library]: https://code.google.com/p/closure-library/source/browse/closure/goog/i18n/ -[list]: https://groups.google.com/forum/?fromgroups#!forum/angular +[angular-dev]: https://groups.google.com/forum/?fromgroups#!forum/angular-dev +[coc]: https://github.com/angular/code-of-conduct/blob/master/CODE_OF_CONDUCT.md +[commit-message-format]: https://docs.google.com/document/d/1QrDFcIiPjSLDn3EL15IJygNPiHORgU1_OOAqWjiDU5Y/edit# [contribute]: http://docs.angularjs.org/misc/contribute -[stackoverflow]: http://stackoverflow.com/questions/tagged/angularjs +[contributing]: http://docs.angularjs.org/misc/contribute +[corporate-cla]: http://code.google.com/legal/corporate-cla-v1.0.html +[github]: https://github.com/angular/angular.js [groups]: https://groups.google.com/forum/?fromgroups#!forum/angular -[angular-dev]: https://groups.google.com/forum/?fromgroups#!forum/angular-dev +[individual-cla]: http://code.google.com/legal/individual-cla-v1.0.html [irc]: http://webchat.freenode.net/?channels=angularjs&uio=d4 -[plunker]: http://plnkr.co/edit +[js-style-guide]: http://google-styleguide.googlecode.com/svn/trunk/javascriptguide.xml [jsfiddle]: http://jsfiddle.net/ +[list]: https://groups.google.com/forum/?fromgroups#!forum/angular [ngDocs]: https://github.com/angular/angular.js/wiki/Writing-AngularJS-Documentation +[plunker]: http://plnkr.co/edit +[stackoverflow]: http://stackoverflow.com/questions/tagged/angularjs [unit-testing]: http://docs.angularjs.org/guide/dev_guide.unit-testing -[js-style-guide]: http://google-styleguide.googlecode.com/svn/trunk/javascriptguide.xml -[contributing]: http://docs.angularjs.org/misc/contribute -[individual-cla]: http://code.google.com/legal/individual-cla-v1.0.html -[corporate-cla]: http://code.google.com/legal/corporate-cla-v1.0.html -[commit-message-format]: https://docs.google.com/document/d/1QrDFcIiPjSLDn3EL15IJygNPiHORgU1_OOAqWjiDU5Y/edit# -[github-pr-helper]: https://chrome.google.com/webstore/detail/github-pr-helper/mokbklfnaddkkbolfldepnkfmanfhpen -[coc]: https://github.com/angular/code-of-conduct/blob/master/CODE_OF_CONDUCT.md [![Analytics](https://ga-beacon.appspot.com/UA-8594346-11/angular.js/CONTRIBUTING.md?pixel)](https://github.com/igrigorik/ga-beacon) From 5b1c89931ee0f5270462c4f3d2501d33dd60565b Mon Sep 17 00:00:00 2001 From: Caitlin Potter Date: Tue, 14 Jan 2014 16:31:30 -0500 Subject: [PATCH 138/837] docs($cacheFactory): document cache instance methods These were apparently entirely undocumented. I'm not sure if they're intended to be private, but in case they're not, I've written some initial docs for them --- src/ng/cacheFactory.js | 115 ++++++++++++++++++++++++++++++++++++++++- 1 file changed, 113 insertions(+), 2 deletions(-) diff --git a/src/ng/cacheFactory.js b/src/ng/cacheFactory.js index c542a43a25f9..25d187aee64e 100644 --- a/src/ng/cacheFactory.js +++ b/src/ng/cacheFactory.js @@ -5,7 +5,8 @@ * @name $cacheFactory * * @description - * Factory that constructs cache objects and gives access to them. + * Factory that constructs {@link $cacheFactory.Cache Cache} objects and gives access to + * them. * * ```js * @@ -96,8 +97,65 @@ function $CacheFactoryProvider() { freshEnd = null, staleEnd = null; + /** + * @ngdoc type + * @name $cacheFactory.Cache + * + * @description + * A cache object used to store and retrieve data, primarily used by + * {@link $http $http} and the {@link ng.directive:script script} directive to cache + * templates and other data. + * + * ```js + * angular.module('superCache') + * .factory('superCache', ['$cacheFactory', function($cacheFactory) { + * return $cacheFactory('super-cache'); + * }]); + * ``` + * + * Example test: + * + * ```js + * it('should behave like a cache', inject(function(superCache) { + * superCache.put('key', 'value'); + * superCache.put('another key', 'another value'); + * + * expect(superCache.info()).toEqual({ + * id: 'super-cache', + * size: 2 + * }); + * + * superCache.remove('another key'); + * expect(superCache.get('another key')).toBeUndefined(); + * + * superCache.removeAll(); + * expect(superCache.info()).toEqual({ + * id: 'super-cache', + * size: 0 + * }); + * })); + * ``` + */ return caches[cacheId] = { + /** + * @ngdoc method + * @name $cacheFactory.Cache#put + * @function + * + * @description + * Inserts a named entry into the {@link $cacheFactory.Cache Cache} object to be + * retrieved later, and incrementing the size of the cache if the key was not already + * present in the cache. If behaving like an LRU cache, it will also remove stale + * entries from the set. + * + * It will not insert undefined values into the cache. + * + * @param {string} key the key under which the cached data is stored. + * @param {*} value the value to store alongside the key. If it is undefined, the key + * will not be stored. + * @returns {*} the value stored. + */ put: function(key, value) { if (capacity < Number.MAX_VALUE) { var lruEntry = lruHash[key] || (lruHash[key] = {key: key}); @@ -116,7 +174,17 @@ function $CacheFactoryProvider() { return value; }, - + /** + * @ngdoc method + * @name $cacheFactory.Cache#get + * @function + * + * @description + * Retrieves named data stored in the {@link $cacheFactory.Cache Cache} object. + * + * @param {string} key the key of the data to be retrieved + * @returns {*} the value stored. + */ get: function(key) { if (capacity < Number.MAX_VALUE) { var lruEntry = lruHash[key]; @@ -130,6 +198,16 @@ function $CacheFactoryProvider() { }, + /** + * @ngdoc method + * @name $cacheFactory.Cache#remove + * @function + * + * @description + * Removes an entry from the {@link $cacheFactory.Cache Cache} object. + * + * @param {string} key the key of the entry to be removed + */ remove: function(key) { if (capacity < Number.MAX_VALUE) { var lruEntry = lruHash[key]; @@ -148,6 +226,14 @@ function $CacheFactoryProvider() { }, + /** + * @ngdoc method + * @name $cacheFactory.Cache#removeAll + * @function + * + * @description + * Clears the cache object of any entries. + */ removeAll: function() { data = {}; size = 0; @@ -156,6 +242,15 @@ function $CacheFactoryProvider() { }, + /** + * @ngdoc method + * @name $cacheFactory.Cache#destroy + * @function + * + * @description + * Destroys the {@link $cacheFactory.Cache Cache} object entirely, + * removing it from the {@link $cacheFactory $cacheFactory} set. + */ destroy: function() { data = null; stats = null; @@ -164,6 +259,22 @@ function $CacheFactoryProvider() { }, + /** + * @ngdoc method + * @name $cacheFactory.Cache#info + * @function + * + * @description + * Retrieve information regarding a particular {@link $cacheFactory.Cache Cache}. + * + * @returns {object} an object with the following properties: + *
      + *
    • **id**: the id of the cache instance
    • + *
    • **size**: the number of entries kept in the cache instance
    • + *
    • **...**: any additional properties from the options object when creating the + * cache.
    • + *
    + */ info: function() { return extend({}, stats, {size: size}); } From 2acc91098bd60c495d727701416e04d9755160d1 Mon Sep 17 00:00:00 2001 From: Igor Minar Date: Tue, 25 Mar 2014 14:11:40 -0700 Subject: [PATCH 139/837] docs(errors/$injector/nomod): add info about forgetting to load the module file Closes #3752 --- docs/content/error/$injector/nomod.ngdoc | 23 +++++++++++++++-------- 1 file changed, 15 insertions(+), 8 deletions(-) diff --git a/docs/content/error/$injector/nomod.ngdoc b/docs/content/error/$injector/nomod.ngdoc index 5f8fb1e65285..04ab19b91a92 100644 --- a/docs/content/error/$injector/nomod.ngdoc +++ b/docs/content/error/$injector/nomod.ngdoc @@ -3,24 +3,31 @@ @fullName Module Unavailable @description -This error occurs when trying to "re-open" a module that has not yet been defined. +This error occurs when you declare a dependency on a module that isn't defined anywhere or hasn't +been loaded in the current browser context. + +When you receive this error, check that the name of the module in question is correct and that the +file in which this module is defined has been loaded (either via ` - replaceInFile "index.html" "(http:\/\/ajax.googleapis.com\/ajax\/libs\/angularjs\/)$VERSION_REGEX" "\1$CDN_VERSION" - - # Replace the version in the script links that reference code.angularjs.org - # e.g. - replaceInFile "index.html" "(code\.angularjs\.org\/)$VERSION_REGEX" "\1$CDN_VERSION" - - # Replace the version of the branch that we are updating - echo $BRANCH_PATTERN - echo $CDN_VERSION - replaceInFile "js/download-data.js" "branch:[ ]+'($BRANCH_PATTERN)',[ ]+version:[ ]+'$VERSION_REGEX'" "branch: '\1', version: '$CDN_VERSION'" - - git add index.html - git add js/download-data.js - git commit -m "update(version): update angular version to $CDN_VERSION for branch $BRANCH_PATTERN" -} - -function publish { - cd $REPO_DIR - echo "-- Pushing angularjs.org" - git push origin master -} - -source $(dirname $0)/../utils.inc diff --git a/scripts/jenkins/release-after-cdn.sh b/scripts/jenkins/release-after-cdn.sh deleted file mode 100755 index 44436c048a25..000000000000 --- a/scripts/jenkins/release-after-cdn.sh +++ /dev/null @@ -1,41 +0,0 @@ -#!/bin/sh - -ARG_DEFS=( - # require the git dryrun flag so the script can't be run without - # thinking about this! - "--git-push-dryrun=(true|false)" - "--cdn-version=(.*)" -) - -function init { - NG_ARGS=("$@") - if [[ ! $VERBOSE ]]; then - VERBOSE=false - fi - VERBOSE_ARG="--verbose=$VERBOSE" -} - -function phase { - ACTION_ARG="--action=$1" - CDN_VERSION_ARG="--cdn-version=$CDN_VERSION" - ./scripts/angular.js/publish-cdn-version.sh $ACTION_ARG $CDN_VERSION_ARG $VERBOSE_ARG - ./scripts/angularjs.org/publish.sh $ACTION_ARG $CDN_VERSION_ARG $VERBOSE_ARG -} - -function checkCdn { - STATUS=$(curl http://ajax.googleapis.com/ajax/libs/angularjs/$CDN_VERSION/angular.min.js --write-out '%{http_code}' -o /dev/null -silent) - if [[ $STATUS != 200 ]]; then - echo "Could not find release $CDN_VERSION on CDN" - exit 1 - fi -} - -function run { - cd ../.. - checkCdn - - phase prepare - phase publish -} - -source $(dirname $0)/../utils.inc \ No newline at end of file From fedc4194d969ac83c6c7340ab760a6fe16421f86 Mon Sep 17 00:00:00 2001 From: Tobias Bosch Date: Wed, 26 Mar 2014 15:54:30 -0700 Subject: [PATCH 157/837] chore(release): simplify scripts so that they can be tested locally The `git fetch --all` resulted in an error if in the local `.gitconfig` a remote was configured that does not exist in the bower/code.anguarjs.org repositories (e.g. "remote "upstream-prs""). --- scripts/bower/publish.sh | 6 ------ scripts/code.angularjs.org/publish.sh | 6 ------ 2 files changed, 12 deletions(-) diff --git a/scripts/bower/publish.sh b/scripts/bower/publish.sh index ad77aadc41ad..24d79e04c63c 100755 --- a/scripts/bower/publish.sh +++ b/scripts/bower/publish.sh @@ -50,12 +50,6 @@ function prepare { if [ -f $BUILD_DIR/$repo.js ] # ignore i18l then echo "-- Updating files in bower-$repo" - cd $TMP_DIR/bower-$repo - git reset --hard HEAD - git checkout master - git fetch --all - git reset --hard origin/master - cd $SCRIPT_DIR cp $BUILD_DIR/$repo.* $TMP_DIR/bower-$repo/ fi done diff --git a/scripts/code.angularjs.org/publish.sh b/scripts/code.angularjs.org/publish.sh index fdbadf3b7908..fc4f8d2e92e4 100755 --- a/scripts/code.angularjs.org/publish.sh +++ b/scripts/code.angularjs.org/publish.sh @@ -38,12 +38,6 @@ function prepare { # echo "-- Updating code.angularjs.org" mkdir $REPO_DIR/$NEW_VERSION - cd $REPO_DIR - git reset --hard HEAD - git checkout master - git fetch --all - git reset --hard origin/master - cd $SCRIPT_DIR cp -r $BUILD_DIR/* $REPO_DIR/$NEW_VERSION/ # From 259003056d616dfba118178008a1dea1c98aa44e Mon Sep 17 00:00:00 2001 From: Narretz Date: Thu, 27 Mar 2014 00:02:56 +0100 Subject: [PATCH 158/837] docs($compile): add note about recursive compilation in templates Closes #3079 Closes #6869 --- src/ng/compile.js | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/src/ng/compile.js b/src/ng/compile.js index 22bf9e24ad85..a51ccd5a2677 100644 --- a/src/ng/compile.js +++ b/src/ng/compile.js @@ -282,6 +282,16 @@ * apply to all cloned DOM nodes within the compile function. Specifically, DOM listener registration * should be done in a linking function rather than in a compile function. *
    + + *
    + * **Note:** The compile function cannot handle directives that recursively use themselves in their + * own templates or compile functions. Compiling these directives results in an infinite loop and a + * stack overflow errors. + * + * This can be avoided by manually using $compile in the postLink function to imperatively compile + * a directive's template instead of relying on automatic template compilation via `template` or + * `templateUrl` declaration or manual compilation inside the compile function. + *
    * *
    * **Note:** The `transclude` function that is passed to the compile function is deprecated, as it From 950ffb5a842484a797bdede5fc341442213cc5e8 Mon Sep 17 00:00:00 2001 From: wbyoko Date: Tue, 25 Mar 2014 21:43:58 -0500 Subject: [PATCH 159/837] docs(misc/started): add header Closes #6851 --- docs/content/misc/started.ngdoc | 2 ++ 1 file changed, 2 insertions(+) diff --git a/docs/content/misc/started.ngdoc b/docs/content/misc/started.ngdoc index 3ea5530ded9b..31f5615f43ae 100644 --- a/docs/content/misc/started.ngdoc +++ b/docs/content/misc/started.ngdoc @@ -2,6 +2,8 @@ @name Getting Started @description +# Getting Started + We want you to have an easy time while starting to use Angular. We've put together the following steps on your path to becoming an Angular expert. From b87713687ecaa7a873eeb3b83952ebf95afdd853 Mon Sep 17 00:00:00 2001 From: wbyoko Date: Tue, 25 Mar 2014 21:46:19 -0500 Subject: [PATCH 160/837] docs(misc/index): add header; general links Closes #6850 --- docs/content/misc/index.ngdoc | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/docs/content/misc/index.ngdoc b/docs/content/misc/index.ngdoc index 5475d16864da..923fc9cd2fb2 100644 --- a/docs/content/misc/index.ngdoc +++ b/docs/content/misc/index.ngdoc @@ -1,3 +1,10 @@ @ngdoc overview @name Miscellaneous @description + +# Miscellaneous Links + +- {@link misc/started Getting Started} +- {@link misc/downloading Downloading AngularJS} +- {@link misc/faq Frequently Asked Questions} +- {@link misc/contribute Building AngularJS} From c0ccbb7b6affc317e2aef29526705ffc144661dd Mon Sep 17 00:00:00 2001 From: wbyoko Date: Tue, 25 Mar 2014 21:44:53 -0500 Subject: [PATCH 161/837] docs(error/index): add header Closes #6849 --- docs/content/error/index.ngdoc | 2 ++ 1 file changed, 2 insertions(+) diff --git a/docs/content/error/index.ngdoc b/docs/content/error/index.ngdoc index 9512dc9c9337..7414b977e684 100644 --- a/docs/content/error/index.ngdoc +++ b/docs/content/error/index.ngdoc @@ -2,6 +2,8 @@ @name Error Reference @description +# Error Reference + Use the Error Reference manual to find information about error conditions in your AngularJS app. Errors thrown in production builds of AngularJS will log links to this site on the console. From 69e5c369d74d9c26d6a849f0f117bffc19b49ae5 Mon Sep 17 00:00:00 2001 From: William Bagayoko Date: Tue, 25 Mar 2014 21:22:25 -0500 Subject: [PATCH 162/837] chore(docs): remove unneeded Bootstrap/jQuery files from distribution --- docs/docs.config.js | 8 ++++---- docs/gulpfile.js | 4 ++-- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/docs/docs.config.js b/docs/docs.config.js index 124720e0b53e..4853a3eefa25 100644 --- a/docs/docs.config.js +++ b/docs/docs.config.js @@ -62,7 +62,7 @@ module.exports = function(config) { 'js/docs.js' ], stylesheets: [ - 'components/bootstrap-' + getVersion('bootstrap') + '/dist/css/bootstrap.css', + 'components/bootstrap-' + getVersion('bootstrap') + '/css/bootstrap.css', 'components/open-sans-fontface-' + getVersion('open-sans-fontface') + '/open-sans.css', 'css/prettify-theme.css', 'css/docs.css', @@ -97,7 +97,7 @@ module.exports = function(config) { 'js/docs.js' ], stylesheets: [ - 'components/bootstrap-' + getVersion('bootstrap') + '/dist/css/bootstrap.min.css', + 'components/bootstrap-' + getVersion('bootstrap') + '/css/bootstrap.min.css', 'components/open-sans-fontface-' + getVersion('open-sans-fontface') + '/open-sans.css', 'css/prettify-theme.css', 'css/docs.css', @@ -136,7 +136,7 @@ module.exports = function(config) { 'js/docs.js' ], stylesheets: [ - 'components/bootstrap-' + getVersion('bootstrap') + '/dist/css/bootstrap.min.css', + 'components/bootstrap-' + getVersion('bootstrap') + '/css/bootstrap.min.css', 'components/open-sans-fontface-' + getVersion('open-sans-fontface') + '/open-sans.css', 'css/prettify-theme.css', 'css/docs.css', @@ -171,7 +171,7 @@ module.exports = function(config) { 'js/docs.js' ], stylesheets: [ - 'components/bootstrap-' + getVersion('bootstrap') + '/dist/css/bootstrap.min.css', + 'components/bootstrap-' + getVersion('bootstrap') + '/css/bootstrap.min.css', 'components/open-sans-fontface-' + getVersion('open-sans-fontface') + '/open-sans.css', 'css/prettify-theme.css', 'css/docs.css', diff --git a/docs/gulpfile.js b/docs/gulpfile.js index c47c04f5b606..daa32707bfa9 100644 --- a/docs/gulpfile.js +++ b/docs/gulpfile.js @@ -38,11 +38,11 @@ gulp.task('build-app', function() { gulp.task('assets', ['bower'], function() { return merge( gulp.src(['app/assets/**/*']).pipe(gulp.dest(outputFolder)), - copyComponent('bootstrap'), + copyComponent('bootstrap', '/dist/**/*'), copyComponent('open-sans-fontface'), copyComponent('lunr.js','/*.js'), copyComponent('google-code-prettify'), - copyComponent('jquery'), + copyComponent('jquery', '/jquery.*'), copyComponent('marked', '/**/*.js', '../node_modules', 'package.json') ); }); From 254dcee93dd9d0f89776f6d44f1e5bd02fb6d16f Mon Sep 17 00:00:00 2001 From: Narretz Date: Thu, 27 Mar 2014 19:11:20 +0100 Subject: [PATCH 163/837] docs(guide/scope): fix links to $interpolate Closes #6877 --- docs/content/guide/scope.ngdoc | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/content/guide/scope.ngdoc b/docs/content/guide/scope.ngdoc index ab869f8ec9f8..2aff6c2be100 100644 --- a/docs/content/guide/scope.ngdoc +++ b/docs/content/guide/scope.ngdoc @@ -388,7 +388,7 @@ user enters text into the text field. 1. the {@link ng.directive:ngModel ng-model} and {@link ng.directive:input input} {@link guide/directive directive} set up a `keydown` listener on the `` control. - 2. the {@link ng.$interpolate {{name}} } interpolation + 2. the {@link ng.$interpolate interpolation} sets up a {@link ng.$rootScope.Scope#$watch $watch} to be notified of `name` changes. 2. During the runtime phase: @@ -400,8 +400,8 @@ user enters text into the text field. 3. Angular applies the `name = 'X';` to the model. 4. The {@link ng.$rootScope.Scope#$digest $digest} loop begins 5. The {@link ng.$rootScope.Scope#$watch $watch} list detects a change - on the `name` property and notifies the {@link ng.$interpolate - {{name}} } interpolation, which in turn updates the DOM. + on the `name` property and notifies the {@link ng.$interpolate interpolation}, + 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. From fbab287ea25c5a3d4853c09a8f2dac37ea68d396 Mon Sep 17 00:00:00 2001 From: winkler1 Date: Thu, 27 Mar 2014 09:43:08 -0400 Subject: [PATCH 164/837] docs(ngShowHide): fix typo 'hrml' -> 'html' Typo 'hrml' Oops! Closes #6874 --- src/ng/directive/ngShowHide.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ng/directive/ngShowHide.js b/src/ng/directive/ngShowHide.js index 59312f0f65b5..00f697a34040 100644 --- a/src/ng/directive/ngShowHide.js +++ b/src/ng/directive/ngShowHide.js @@ -171,7 +171,7 @@ var ngShowDirective = ['$animate', function($animate) { * in AngularJS and sets the display style to none (using an !important flag). * For CSP mode please add `angular-csp.css` to your html file (see {@link ng.directive:ngCsp ngCsp}). * - * ```hrml + * ```html * *
    * From 7a294369ab00d2a6d0d273d09d26656a9d086eac Mon Sep 17 00:00:00 2001 From: Alex Sanford Date: Wed, 19 Mar 2014 15:37:50 -0300 Subject: [PATCH 165/837] docs(ngResource): clarify behaviour of $promise Closes #6753 --- src/ngResource/resource.js | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/ngResource/resource.js b/src/ngResource/resource.js index 8927a2664c16..a4a59283c215 100644 --- a/src/ngResource/resource.js +++ b/src/ngResource/resource.js @@ -199,6 +199,9 @@ function shallowClearAndCopy(src, dst) { * On failure, the promise is resolved with the {@link ng.$http http response} object, without * the `resource` property. * + * If an interceptor object was provided, the promise will instead be resolved with the value + * returned by the interceptor. + * * - `$resolved`: `true` after first server interaction is completed (either with success or * rejection), `false` before that. Knowing if the Resource has been resolved is useful in * data-binding. From 26064375ca3b03efdfaf3ddd93006f7da986fc85 Mon Sep 17 00:00:00 2001 From: ChrisRose Date: Thu, 27 Mar 2014 13:28:33 -0700 Subject: [PATCH 166/837] docs(filter/orderBy): fixed typo --- src/ng/filter/orderBy.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ng/filter/orderBy.js b/src/ng/filter/orderBy.js index faeb8ed1e570..27891835d17d 100644 --- a/src/ng/filter/orderBy.js +++ b/src/ng/filter/orderBy.js @@ -22,7 +22,7 @@ * - `Array`: An array of function or string predicates. The first predicate in the array * is used for sorting, but when two items are equivalent, the next predicate is used. * - * @param {boolean=} reverse Reverse the order the array. + * @param {boolean=} reverse Reverse the order of the array. * @returns {Array} Sorted copy of the source array. * * @example From 32c09c1d195fcb98f6e29fc7e554a867f4762301 Mon Sep 17 00:00:00 2001 From: jim lyndon Date: Thu, 18 Jul 2013 02:08:38 +1000 Subject: [PATCH 167/837] feat($http): add xhr statusText to completeRequest callback Makes xhr status text accessible is $http success/error callback. See www.w3.org/TR/XMLHttpRequest/#dom-xmlhttprequest-statustext Closes #2335 Closes #2665 Closes #6713 --- src/ng/http.js | 16 ++++++----- src/ng/httpBackend.js | 10 ++++--- src/ngMock/angular-mocks.js | 46 +++++++++++++++++--------------- test/ng/httpBackendSpec.js | 26 ++++++++++++++++++ test/ng/httpSpec.js | 24 +++++++++++++++++ test/ngMock/angular-mocksSpec.js | 20 +++++++------- 6 files changed, 100 insertions(+), 42 deletions(-) diff --git a/src/ng/http.js b/src/ng/http.js index a7a15d7e982b..0c86a0b7fe4b 100644 --- a/src/ng/http.js +++ b/src/ng/http.js @@ -571,6 +571,7 @@ function $HttpProvider() { * - **status** – `{number}` – HTTP status code of the response. * - **headers** – `{function([headerName])}` – Header getter function. * - **config** – `{Object}` – The configuration object that was used to generate the request. + * - **statusText** – `{string}` – HTTP status text of the response. * * @property {Array.} pendingRequests Array of config objects for currently pending * requests. This is primarily meant to be used for debugging purposes. @@ -945,9 +946,9 @@ function $HttpProvider() { } else { // serving from cache if (isArray(cachedResp)) { - resolvePromise(cachedResp[1], cachedResp[0], copy(cachedResp[2])); + resolvePromise(cachedResp[1], cachedResp[0], copy(cachedResp[2]), cachedResp[3]); } else { - resolvePromise(cachedResp, 200, {}); + resolvePromise(cachedResp, 200, {}, 'OK'); } } } else { @@ -971,17 +972,17 @@ function $HttpProvider() { * - resolves the raw $http promise * - calls $apply */ - function done(status, response, headersString) { + function done(status, response, headersString, statusText) { if (cache) { if (isSuccess(status)) { - cache.put(url, [status, response, parseHeaders(headersString)]); + cache.put(url, [status, response, parseHeaders(headersString), statusText]); } else { // remove promise from the cache cache.remove(url); } } - resolvePromise(response, status, headersString); + resolvePromise(response, status, headersString, statusText); if (!$rootScope.$$phase) $rootScope.$apply(); } @@ -989,7 +990,7 @@ function $HttpProvider() { /** * Resolves the raw $http promise. */ - function resolvePromise(response, status, headers) { + function resolvePromise(response, status, headers, statusText) { // normalize internal statuses to 0 status = Math.max(status, 0); @@ -997,7 +998,8 @@ function $HttpProvider() { data: response, status: status, headers: headersGetter(headers), - config: config + config: config, + statusText : statusText }); } diff --git a/src/ng/httpBackend.js b/src/ng/httpBackend.js index 28107966f643..63b0745658da 100644 --- a/src/ng/httpBackend.js +++ b/src/ng/httpBackend.js @@ -97,7 +97,8 @@ function createHttpBackend($browser, createXhr, $browserDefer, callbacks, rawDoc completeRequest(callback, status || xhr.status, response, - responseHeaders); + responseHeaders, + xhr.statusText || ''); } }; @@ -138,7 +139,7 @@ function createHttpBackend($browser, createXhr, $browserDefer, callbacks, rawDoc xhr && xhr.abort(); } - function completeRequest(callback, status, response, headersString) { + function completeRequest(callback, status, response, headersString, statusText) { // cancel timeout and subsequent timeout promise resolution timeoutId && $browserDefer.cancel(timeoutId); jsonpDone = xhr = null; @@ -151,9 +152,10 @@ function createHttpBackend($browser, createXhr, $browserDefer, callbacks, rawDoc } // normalize IE bug (http://bugs.jquery.com/ticket/1450) - status = status == 1223 ? 204 : status; + status = status === 1223 ? 204 : status; + statusText = statusText || ''; - callback(status, response, headersString); + callback(status, response, headersString, statusText); $browser.$$completeOutstandingRequest(noop); } }; diff --git a/src/ngMock/angular-mocks.js b/src/ngMock/angular-mocks.js index 67decaceb33f..cb10ba8100e7 100644 --- a/src/ngMock/angular-mocks.js +++ b/src/ngMock/angular-mocks.js @@ -1090,12 +1090,12 @@ function createHttpBackendMock($rootScope, $delegate, $browser) { responsesPush = angular.bind(responses, responses.push), copy = angular.copy; - function createResponse(status, data, headers) { + function createResponse(status, data, headers, statusText) { if (angular.isFunction(status)) return status; return function() { return angular.isNumber(status) - ? [status, data, headers] + ? [status, data, headers, statusText] : [200, status, data]; }; } @@ -1120,7 +1120,8 @@ function createHttpBackendMock($rootScope, $delegate, $browser) { function handleResponse() { var response = wrapped.response(method, url, data, headers); xhr.$$respHeaders = response[2]; - callback(copy(response[0]), copy(response[1]), xhr.getAllResponseHeaders()); + callback(copy(response[0]), copy(response[1]), xhr.getAllResponseHeaders(), + copy(response[3] || '')); } function handleTimeout() { @@ -1187,16 +1188,17 @@ function createHttpBackendMock($rootScope, $delegate, $browser) { * request is handled. * * - respond – - * `{function([status,] data[, headers])|function(function(method, url, data, headers)}` - * – The respond method takes a set of static data to be returned or a function that can return - * an array containing response status (number), response data (string) and response headers - * (Object). + * `{function([status,] data[, headers, statusText]) + * | function(function(method, url, data, headers)}` + * – The respond method takes a set of static data to be returned or a function that can + * return an array containing response status (number), response data (string), response + * headers (Object), and the text for the status (string). */ $httpBackend.when = function(method, url, data, headers) { var definition = new MockHttpExpectation(method, url, data, headers), chain = { - respond: function(status, data, headers) { - definition.response = createResponse(status, data, headers); + respond: function(status, data, headers, statusText) { + definition.response = createResponse(status, data, headers, statusText); } }; @@ -1304,17 +1306,18 @@ function createHttpBackendMock($rootScope, $delegate, $browser) { * request is handled. * * - respond – - * `{function([status,] data[, headers])|function(function(method, url, data, headers)}` - * – The respond method takes a set of static data to be returned or a function that can return - * an array containing response status (number), response data (string) and response headers - * (Object). + * `{function([status,] data[, headers, statusText]) + * | function(function(method, url, data, headers)}` + * – The respond method takes a set of static data to be returned or a function that can + * return an array containing response status (number), response data (string), response + * headers (Object), and the text for the status (string). */ $httpBackend.expect = function(method, url, data, headers) { var expectation = new MockHttpExpectation(method, url, data, headers); expectations.push(expectation); return { - respond: function(status, data, headers) { - expectation.response = createResponse(status, data, headers); + respond: function (status, data, headers, statusText) { + expectation.response = createResponse(status, data, headers, statusText); } }; }; @@ -1816,13 +1819,14 @@ angular.module('ngMockE2E', ['ng']).config(['$provide', function($provide) { * control how a matched request is handled. * * - respond – - * `{function([status,] data[, headers])|function(function(method, url, data, headers)}` + * `{function([status,] data[, headers, statusText]) + * | function(function(method, url, data, headers)}` * – The respond method takes a set of static data to be returned or a function that can return - * an array containing response status (number), response data (string) and response headers - * (Object). - * - passThrough – `{function()}` – Any request matching a backend definition with `passThrough` - * handler will be passed through to the real backend (an XHR request will be made to the - * server.) + * an array containing response status (number), response data (string), response headers + * (Object), and the text for the status (string). + * - passThrough – `{function()}` – Any request matching a backend definition with + * `passThrough` handler will be passed through to the real backend (an XHR request will be made + * to the server.) */ /** diff --git a/test/ng/httpBackendSpec.js b/test/ng/httpBackendSpec.js index 5c9cbf586c36..a549b6a894a3 100644 --- a/test/ng/httpBackendSpec.js +++ b/test/ng/httpBackendSpec.js @@ -75,6 +75,32 @@ describe('$httpBackend', function() { expect(xhr.$$data).toBe(null); }); + it('should call completion function with xhr.statusText if present', function() { + callback.andCallFake(function(status, response, headers, statusText) { + expect(statusText).toBe('OK'); + }); + + $backend('GET', '/some-url', null, callback); + xhr = MockXhr.$$lastInstance; + xhr.statusText = 'OK'; + xhr.readyState = 4; + xhr.onreadystatechange(); + expect(callback).toHaveBeenCalledOnce(); + }); + + it('should call completion function with empty string if not present', function() { + callback.andCallFake(function(status, response, headers, statusText) { + expect(statusText).toBe(''); + }); + + $backend('GET', '/some-url', null, callback); + xhr = MockXhr.$$lastInstance; + xhr.readyState = 4; + xhr.onreadystatechange(); + expect(callback).toHaveBeenCalledOnce(); + }); + + it('should normalize IE\'s 1223 status code into 204', function() { callback.andCallFake(function(status) { expect(status).toBe(204); diff --git a/test/ng/httpSpec.js b/test/ng/httpSpec.js index 86ab72ea8bd8..14ac8433437f 100644 --- a/test/ng/httpSpec.js +++ b/test/ng/httpSpec.js @@ -481,6 +481,30 @@ describe('$http', function() { }); + it('should pass statusText in response object when a request is successful', function() { + $httpBackend.expect('GET', '/url').respond(200, 'SUCCESS', {}, 'OK'); + $http({url: '/url', method: 'GET'}).then(function(response) { + expect(response.statusText).toBe('OK'); + callback(); + }); + + $httpBackend.flush(); + expect(callback).toHaveBeenCalledOnce(); + }); + + + it('should pass statusText in response object when a request fails', function() { + $httpBackend.expect('GET', '/url').respond(404, 'ERROR', {}, 'Not Found'); + $http({url: '/url', method: 'GET'}).then(null, function(response) { + expect(response.statusText).toBe('Not Found'); + callback(); + }); + + $httpBackend.flush(); + expect(callback).toHaveBeenCalledOnce(); + }); + + it('should pass in the response object when a request failed', function() { $httpBackend.expect('GET', '/url').respond(543, 'bad error', {'request-id': '123'}); $http({url: '/url', method: 'GET'}).then(null, function(response) { diff --git a/test/ngMock/angular-mocksSpec.js b/test/ngMock/angular-mocksSpec.js index b78e9bbf207a..c10bbc83e0fa 100644 --- a/test/ngMock/angular-mocksSpec.js +++ b/test/ngMock/angular-mocksSpec.js @@ -1068,29 +1068,29 @@ describe('ngMock', function() { hb.flush(); expect(callback.callCount).toBe(2); - expect(callback.argsForCall[0]).toEqual([201, 'second', '']); - expect(callback.argsForCall[1]).toEqual([200, 'first', '']); + expect(callback.argsForCall[0]).toEqual([201, 'second', '', '']); + expect(callback.argsForCall[1]).toEqual([200, 'first', '', '']); }); describe('respond()', function() { it('should take values', function() { - hb.expect('GET', '/url1').respond(200, 'first', {'header': 'val'}); + hb.expect('GET', '/url1').respond(200, 'first', {'header': 'val'}, 'OK'); hb('GET', '/url1', undefined, callback); hb.flush(); - expect(callback).toHaveBeenCalledOnceWith(200, 'first', 'header: val'); + expect(callback).toHaveBeenCalledOnceWith(200, 'first', 'header: val', 'OK'); }); it('should take function', function() { - hb.expect('GET', '/some').respond(function(m, u, d, h) { - return [301, m + u + ';' + d + ';a=' + h.a, {'Connection': 'keep-alive'}]; + hb.expect('GET', '/some').respond(function (m, u, d, h) { + return [301, m + u + ';' + d + ';a=' + h.a, {'Connection': 'keep-alive'}, 'Moved Permanently']; }); hb('GET', '/some', 'data', callback, {a: 'b'}); hb.flush(); - expect(callback).toHaveBeenCalledOnceWith(301, 'GET/some;data;a=b', 'Connection: keep-alive'); + expect(callback).toHaveBeenCalledOnceWith(301, 'GET/some;data;a=b', 'Connection: keep-alive', 'Moved Permanently'); }); it('should default status code to 200', function() { @@ -1119,8 +1119,8 @@ describe('ngMock', function() { hb.flush(); expect(callback.callCount).toBe(2); - expect(callback.argsForCall[0]).toEqual([200, 'first', '']); - expect(callback.argsForCall[1]).toEqual([200, 'second', '']); + expect(callback.argsForCall[0]).toEqual([200, 'first', '', '']); + expect(callback.argsForCall[1]).toEqual([200, 'second', '', '']); }); }); @@ -1415,7 +1415,7 @@ describe('ngMock', function() { hb[shortcut]('/foo').respond('bar'); hb(method, '/foo', undefined, callback); hb.flush(); - expect(callback).toHaveBeenCalledOnceWith(200, 'bar', ''); + expect(callback).toHaveBeenCalledOnceWith(200, 'bar', '', ''); }); }); }); From f911b84aefdc68ad9034b54e163b83837c57e25f Mon Sep 17 00:00:00 2001 From: Uri Goldshtein Date: Tue, 14 Jan 2014 16:21:52 +0200 Subject: [PATCH 168/837] docs(guide): add ngStorage to specific topics --- docs/content/guide/index.ngdoc | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/content/guide/index.ngdoc b/docs/content/guide/index.ngdoc index 8b615f4961ea..89806d9f139d 100644 --- a/docs/content/guide/index.ngdoc +++ b/docs/content/guide/index.ngdoc @@ -57,6 +57,7 @@ In Angular applications, you move the job of filling page templates with data fr * **Other Languages:** [CoffeeScript](http://www.coffeescriptlove.com/2013/08/angularjs-and-coffeescript-tutorials.html), [Dart](https://github.com/angular/angular.dart.tutorial/wiki) * **Realtime: **[Socket.io](http://www.creativebloq.com/javascript/angularjs-collaboration-board-socketio-2132885), [OmniBinder](https://github.com/jeffbcross/omnibinder) * **Visualization:** [SVG](http://gaslight.co/blog/angular-backed-svgs), [D3.js](http://www.ng-newsletter.com/posts/d3-on-angular.html) +* **Local Storage and session:** [ngStorage](https://github.com/gsklee/ngStorage) ## Tools From 0d62257c5f3a24d660cb25e839952adf1bbef46d Mon Sep 17 00:00:00 2001 From: tamakisquare Date: Thu, 13 Feb 2014 14:03:25 -0800 Subject: [PATCH 169/837] docs(guide/filter): mention that filters can be used in directives The doc mentions filters can be used in services and controllers but directives aren't mentioned. This could lead to confusion for beginners. --- docs/content/guide/filter.ngdoc | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/docs/content/guide/filter.ngdoc b/docs/content/guide/filter.ngdoc index 23363c605eab..45d9fc5b5463 100644 --- a/docs/content/guide/filter.ngdoc +++ b/docs/content/guide/filter.ngdoc @@ -29,12 +29,12 @@ E.g. the markup `{{ 1234 | number:2 }}` formats the number 1234 with 2 decimal p {@link ng.filter:number `number`} filter. The resulting value is `1,234.00`. -## Using filters in controllers and services +## Using filters in controllers, services, and directives -You can also use filters in controllers and services. For this, add a dependency with the name `Filter` -to your controller or service. E.g. using the dependency `numberFilter` will inject the number filter. -The injected argument is a function that takes the value to format as first argument and filter parameters -starting with the second argument. +You can also use filters in controllers, services, and directives. For this, inject a dependency +with the name `Filter` to your controller/service/directive. E.g. using the dependency +`numberFilter` will inject the number filter. The injected argument is a function that takes the +value to format as first argument and filter parameters starting with the second argument. The example below uses the filter called {@link ng.filter:filter `filter`}. This filter reduces arrays into sub arrays based on From db2a4c04d66a7882595d566fe873f3a700c50e65 Mon Sep 17 00:00:00 2001 From: "David I. Lehn" Date: Thu, 27 Mar 2014 20:15:22 -0400 Subject: [PATCH 170/837] docs($sce): fix typo. Closes #6882 --- src/ng/sce.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ng/sce.js b/src/ng/sce.js index 0f60521b26bd..059e4519718e 100644 --- a/src/ng/sce.js +++ b/src/ng/sce.js @@ -522,7 +522,7 @@ function $SceDelegateProvider() { * | `$sce.HTML` | For HTML that's safe to source into the application. The {@link ng.directive:ngBindHtml ngBindHtml} directive uses this context for bindings. | * | `$sce.CSS` | For CSS that's safe to source into the application. Currently unused. Feel free to use it in your own directives. | * | `$sce.URL` | For URLs that are safe to follow as links. Currently unused (`
    Note that `$sce.RESOURCE_URL` makes a stronger statement about the URL than `$sce.URL` does and therefore contexts requiring values trusted for `$sce.RESOURCE_URL` can be used anywhere that values trusted for `$sce.URL` are required. | + * | `$sce.RESOURCE_URL` | For URLs that are not only safe to follow as links, but whose contents are also safe to include in your application. Examples include `ng-include`, `src` / `ngSrc` bindings for tags other than `IMG` (e.g. `IFRAME`, `OBJECT`, etc.)

    Note that `$sce.RESOURCE_URL` makes a stronger statement about the URL than `$sce.URL` does and therefore contexts requiring values trusted for `$sce.RESOURCE_URL` can be used anywhere that values trusted for `$sce.URL` are required. | * | `$sce.JS` | For JavaScript that is safe to execute in your application's context. Currently unused. Feel free to use it in your own directives. | * * ## Format of items in {@link ng.$sceDelegateProvider#resourceUrlWhitelist resourceUrlWhitelist}/{@link ng.$sceDelegateProvider#resourceUrlBlacklist Blacklist}
    From 35d635cbcbdc20f304781655f3563111afa6567f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Matias=20Niemel=C3=A4?= Date: Fri, 21 Mar 2014 16:32:53 -0400 Subject: [PATCH 171/837] fix($animate): prevent cancellation timestamp from being too far in the future Closes #6748 --- src/ngAnimate/animate.js | 2 +- test/ngAnimate/animateSpec.js | 35 ++++++++++++++++++++++++++++------- 2 files changed, 29 insertions(+), 8 deletions(-) diff --git a/src/ngAnimate/animate.js b/src/ngAnimate/animate.js index 269db9227a3b..1716ee8a4151 100644 --- a/src/ngAnimate/animate.js +++ b/src/ngAnimate/animate.js @@ -1112,7 +1112,7 @@ angular.module('ngAnimate', ['ng']) //but it may not need to cancel out the existing timeout //if the timestamp is less than the previous one - var futureTimestamp = Date.now() + (totalTime * 1000); + var futureTimestamp = Date.now() + totalTime; if(futureTimestamp <= closingTimestamp) { return; } diff --git a/test/ngAnimate/animateSpec.js b/test/ngAnimate/animateSpec.js index 69cb657336fb..87e7620e1e23 100644 --- a/test/ngAnimate/animateSpec.js +++ b/test/ngAnimate/animateSpec.js @@ -1332,13 +1332,20 @@ describe("ngAnimate", function() { })); it("should intelligently cancel former timeouts and close off a series of elements a final timeout", function() { + var currentTimestamp = Date.now(); + spyOn(Date,'now').andCallFake(function() { + return currentTimestamp; + }); + var cancellations = 0; module(function($provide) { $provide.decorator('$timeout', function($delegate) { var _cancel = $delegate.cancel; - $delegate.cancel = function() { - cancellations++; - return _cancel.apply($delegate, arguments); + $delegate.cancel = function(timer) { + if(timer) { + cancellations++; + return _cancel.apply($delegate, arguments); + } }; return $delegate; }); @@ -1346,10 +1353,22 @@ describe("ngAnimate", function() { inject(function($animate, $rootScope, $compile, $sniffer, $timeout) { if (!$sniffer.transitions) return; - ss.addRule('.animate-me', '-webkit-transition:1s linear all;' + + ss.addRule('.animate-me div', '-webkit-transition:1s linear all;' + 'transition:1s linear all;'); - element = $compile(html('
    '))($rootScope); + ss.addRule('.animate-me-longer div', '-webkit-transition:1.5s linear all;' + + 'transition:1.5s linear all;'); + + element = $compile(html('
    ' + + '
    ' + + '
    '))($rootScope); + $rootScope.items = [0]; + $rootScope.$digest(); + $animate.triggerReflow(); + + currentTimestamp += 2250; //1.5 * 1500 = 2250 + + element[0].className = 'animate-me'; $rootScope.items = [1,2,3,4,5,6,7,8,9,10]; var totalOperations = $rootScope.items.length; @@ -1358,9 +1377,11 @@ describe("ngAnimate", function() { $rootScope.items = [0]; $animate.triggerReflow(); + + currentTimestamp += 1500; //1.5 * 1000 = 1500 $timeout.flush(1500); - expect(cancellations).toBeLessThan(totalOperations); + expect(cancellations).toBe(1); expect(element.children().length).toBe(10); cancellations = 0; @@ -1370,7 +1391,7 @@ describe("ngAnimate", function() { $animate.triggerReflow(); $timeout.flush(1500); expect(element.children().length).toBe(1); - expect(cancellations).toBeLessThan(totalOperations); + expect(cancellations).toBe(1); }); }); From 8a5972461c00c09aa92f7233287fca5845bb7925 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Matias=20Niemel=C3=A4?= Date: Fri, 28 Mar 2014 13:20:47 -0400 Subject: [PATCH 172/837] chore($animate): fix broken IE8 test --- test/ngAnimate/animateSpec.js | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/test/ngAnimate/animateSpec.js b/test/ngAnimate/animateSpec.js index 87e7620e1e23..3ab5cc4cecfa 100644 --- a/test/ngAnimate/animateSpec.js +++ b/test/ngAnimate/animateSpec.js @@ -1332,12 +1332,7 @@ describe("ngAnimate", function() { })); it("should intelligently cancel former timeouts and close off a series of elements a final timeout", function() { - var currentTimestamp = Date.now(); - spyOn(Date,'now').andCallFake(function() { - return currentTimestamp; - }); - - var cancellations = 0; + var currentTimestamp, cancellations = 0; module(function($provide) { $provide.decorator('$timeout', function($delegate) { var _cancel = $delegate.cancel; @@ -1349,6 +1344,15 @@ describe("ngAnimate", function() { }; return $delegate; }); + + return function($sniffer) { + if($sniffer.transitions) { + currentTimestamp = Date.now(); + spyOn(Date,'now').andCallFake(function() { + return currentTimestamp; + }); + } + } }) inject(function($animate, $rootScope, $compile, $sniffer, $timeout) { if (!$sniffer.transitions) return; From 9ae9c1c0daa66030a2f465170ba4660edf34ec0b Mon Sep 17 00:00:00 2001 From: Sekib Omazic Date: Sat, 22 Mar 2014 20:52:51 +0100 Subject: [PATCH 173/837] docs(error/ng/btstrpd): fix typo in error page Minimal typo fix Closes #6803 --- docs/content/error/ng/btstrpd.ngdoc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/content/error/ng/btstrpd.ngdoc b/docs/content/error/ng/btstrpd.ngdoc index 4efbaba533cb..a5455eb9bf55 100644 --- a/docs/content/error/ng/btstrpd.ngdoc +++ b/docs/content/error/ng/btstrpd.ngdoc @@ -20,7 +20,7 @@ application. ``` -Note that for bootrapping purposes, the `` element is the same as `document`, so the following +Note that for bootstrapping purposes, the `` element is the same as `document`, so the following will also throw an error. ``` From 20d926cc45dffbbeec5ef73c87c10495bf0bc92f Mon Sep 17 00:00:00 2001 From: "John K. Paul" Date: Sat, 22 Mar 2014 12:24:07 -0400 Subject: [PATCH 174/837] docs(guide/directive): fix broken link Fix broken internal link in directive documentation. Closes #6802 --- docs/content/guide/directive.ngdoc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/content/guide/directive.ngdoc b/docs/content/guide/directive.ngdoc index 07b9d8279eb5..e757589bd42d 100644 --- a/docs/content/guide/directive.ngdoc +++ b/docs/content/guide/directive.ngdoc @@ -510,7 +510,7 @@ that you explicitly pass in.
    **Note:** Normally, a scope prototypically inherits from its parent. An isolated scope does not. -See the {@link guide/directive#creating-custom-directives_demo_isolating-the-scope-of-a-directive +See the {@link guide/directive#isolating-the-scope-of-a-directive "Isolating the Scope of a Directive"} section for more information about isolate scopes.
    From eaf1f8546d59308a4bb2281e8277d18ae26dec0d Mon Sep 17 00:00:00 2001 From: Diego Algorta Date: Thu, 20 Mar 2014 13:17:02 -0600 Subject: [PATCH 175/837] docs(faq): fix link to Closure Library The previous link throws a 404. --- docs/content/misc/faq.ngdoc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/content/misc/faq.ngdoc b/docs/content/misc/faq.ngdoc index 157f2eac2223..1da9af06011a 100644 --- a/docs/content/misc/faq.ngdoc +++ b/docs/content/misc/faq.ngdoc @@ -72,7 +72,7 @@ The size of the file is < 36KB compressed and minified. ### Can I use the open-source Closure Library with Angular? -Yes, you can use widgets from the [Closure Library](http://code.google.com/closure/library) +Yes, you can use widgets from the [Closure Library](https://developers.google.com/closure/library/) in Angular. ### Does Angular use the jQuery library? From da88449f253100d51047e2a2f0ad7cf2b982422a Mon Sep 17 00:00:00 2001 From: sgrebnov Date: Wed, 26 Feb 2014 12:10:30 +0400 Subject: [PATCH 176/837] fix(doc-gen): Run Gulp on Windows too Using node_module/.bin/gulp will enable to gulp command to run both on Windows and Linux. In its current form, the default action of executing a Javascript file on Windows does not use node. Requires quotes around the command to correctly resolve path on Windows Closes #6346 --- lib/grunt/plugins.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/grunt/plugins.js b/lib/grunt/plugins.js index 87c4719b0d65..58455d48d988 100644 --- a/lib/grunt/plugins.js +++ b/lib/grunt/plugins.js @@ -35,7 +35,7 @@ module.exports = function(grunt) { grunt.registerTask('docs', 'create angular docs', function(){ - var gruntProc = shelljs.exec('node_modules/gulp/bin/gulp.js --gulpfile docs/gulpfile.js'); + var gruntProc = shelljs.exec('"node_modules/.bin/gulp" --gulpfile docs/gulpfile.js'); if (gruntProc.code !== 0) { throw new Error('doc generation failed'); } From 7287dbf71dc8cb44c9ebe91fc75e628288e57ecd Mon Sep 17 00:00:00 2001 From: mrmrs Date: Sun, 6 Oct 2013 20:28:19 -0700 Subject: [PATCH 177/837] chore(docs): remove px declaration from x,y coordinates in header svg --- docs/img/angularjs-for-header-only.svg | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/img/angularjs-for-header-only.svg b/docs/img/angularjs-for-header-only.svg index 68689b6bb1ba..5b729204ee24 100644 --- a/docs/img/angularjs-for-header-only.svg +++ b/docs/img/angularjs-for-header-only.svg @@ -5,7 +5,7 @@ ]> From 8d4d437e8cd8d7cebab5d9ae5c8bcfeef2118ce9 Mon Sep 17 00:00:00 2001 From: Igor Minar Date: Tue, 25 Mar 2014 23:04:21 -0700 Subject: [PATCH 178/837] fix(Scope): aggressively clean up scope on $destroy to minimize leaks Due to a known V8 memory leak[1] we need to perform extra cleanup to make it easier for GC to collect this scope object. The theory is that the V8 leaks are due to inline caches which are caches built on the fly to speed up property access for javascript objects. By cleaning the scope object and removing all properties, we clean up ICs as well and so no leaks occur. I was able to manually verify that this fixes the problem for the following example app: http://plnkr.co/edit/FrSw6SCEVODk02Ljo8se?p=preview Given the nature of the problem I'm not 100% sure that this will work around the V8 problem in scenarios common for Angular apps, but I guess it's better than nothing. [1] V8 bug: https://code.google.com/p/v8/issues/detail?id=2073 Closes #6794 Closes #6856 --- src/ng/rootScope.js | 19 +++++++++++++++---- 1 file changed, 15 insertions(+), 4 deletions(-) diff --git a/src/ng/rootScope.js b/src/ng/rootScope.js index e09e2202b78d..aec16298679b 100644 --- a/src/ng/rootScope.js +++ b/src/ng/rootScope.js @@ -731,15 +731,26 @@ function $RootScopeProvider(){ forEach(this.$$listenerCount, bind(null, decrementListenerCount, this)); + // sever all the references to parent scopes (after this cleanup, the current scope should + // not be retained by any of our references and should be eligible for garbage collection) if (parent.$$childHead == this) parent.$$childHead = this.$$nextSibling; if (parent.$$childTail == this) parent.$$childTail = this.$$prevSibling; if (this.$$prevSibling) this.$$prevSibling.$$nextSibling = this.$$nextSibling; if (this.$$nextSibling) this.$$nextSibling.$$prevSibling = this.$$prevSibling; - // This is bogus code that works around Chrome's GC leak - // see: https://github.com/angular/angular.js/issues/1313#issuecomment-10378451 - this.$parent = this.$$nextSibling = this.$$prevSibling = this.$$childHead = - this.$$childTail = null; + // This is bogus code that works around V8's memory leak coming from ICs + // see: https://code.google.com/p/v8/issues/detail?id=2073#c26 + // + // for more info also see: + // - https://github.com/angular/angular.js/issues/6794#issuecomment-38648909 + // - https://github.com/angular/angular.js/issues/1313#issuecomment-10378451 + for (var prop in this) { + if (hasOwnProperty.call(this, prop)) { + this[prop] = null; + } + } + // recreate the $$destroyed flag + this.$$destroyed = true; }, /** From 245de33c00450b3e885f666ea2dee1f050414eea Mon Sep 17 00:00:00 2001 From: Joseph Orbegoso Pea Date: Mon, 31 Mar 2014 06:04:35 -0700 Subject: [PATCH 179/837] docs(guide/bootstrap): add note about ngApp and manual bootstrap --- docs/content/guide/bootstrap.ngdoc | 40 ++++++++++++++++++++---------- 1 file changed, 27 insertions(+), 13 deletions(-) diff --git a/docs/content/guide/bootstrap.ngdoc b/docs/content/guide/bootstrap.ngdoc index ae1c7949ff27..aa3535a3d0e8 100644 --- a/docs/content/guide/bootstrap.ngdoc +++ b/docs/content/guide/bootstrap.ngdoc @@ -7,6 +7,7 @@ This page explains the Angular initialization process and how you can manually initialize Angular if necessary. + ## Angular ` - Hello {{'World'}}! - - - + + + Hello {{'World'}}! + + + + ``` -Note that we have provided the name of our application module to be loaded into the injector as the second +Note that we provided the name of our application module to be loaded into the injector as the second parameter of the {@link angular.bootstrap} function. Notice that `angular.bootstrap` will not create modules on the fly. You must create any custom {@link guide/module modules} before you pass them as a parameter. +You should call `angular.bootstrap()` *after* you've loaded or defined your modules. +You cannot add controllers, services, directives, etc after an application bootstraps. + +
    +**Note:** You should not use the ng-app directive when manually bootstrapping your app. +
    + This is the sequence that your code should follow: 1. After the page and all of the code is loaded, find the root element of your AngularJS @@ -114,6 +127,7 @@ This is the sequence that your code should follow: 2. Call {@link angular.bootstrap} to {@link compiler compile} the element into an executable, bi-directionally bound application. + ## Deferred Bootstrap This feature enables tools like Batarang and test runners to From 97b171ecb224768a107a997430957ee448e48de3 Mon Sep 17 00:00:00 2001 From: Peter Bacon Darwin Date: Tue, 1 Apr 2014 11:52:23 +0100 Subject: [PATCH 180/837] chore(grunt): add jscs task to test task It is too easy to forget to check jscs for things like trailing whitespace before pushing commits, such as simple doc changes. This then breaks the build and is messy. Adding jscs to the test task gives people a slightly better chance of catching these before pushing. --- Gruntfile.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Gruntfile.js b/Gruntfile.js index d059a2a79f2b..95c5167dbde2 100644 --- a/Gruntfile.js +++ b/Gruntfile.js @@ -279,7 +279,7 @@ module.exports = function(grunt) { //alias tasks - grunt.registerTask('test', 'Run unit, docs and e2e tests with Karma', ['jshint', 'package','test:unit','test:promises-aplus', 'tests:docs', 'test:protractor']); + grunt.registerTask('test', 'Run unit, docs and e2e tests with Karma', ['jshint', 'jscs', 'package','test:unit','test:promises-aplus', 'tests:docs', 'test:protractor']); grunt.registerTask('test:jqlite', 'Run the unit tests with Karma' , ['tests:jqlite']); grunt.registerTask('test:jquery', 'Run the jQuery unit tests with Karma', ['tests:jquery']); grunt.registerTask('test:modules', 'Run the Karma module tests with Karma', ['tests:modules']); From b49d0cc6e726bb160f6ef8aac42c18ed5bd93a51 Mon Sep 17 00:00:00 2001 From: Peter Bacon Darwin Date: Tue, 1 Apr 2014 12:00:37 +0100 Subject: [PATCH 181/837] docs(css): ensure all type-hints have a background color If the type of a type-hint was not recognized, say a "Promise", then the background color was left as white. Given that the default foreground color is also white, this meant that such type-hints were invisible. Closes #6934 --- docs/app/assets/css/docs.css | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/docs/app/assets/css/docs.css b/docs/app/assets/css/docs.css index 7f0f83e9e262..8a645302bb39 100644 --- a/docs/app/assets/css/docs.css +++ b/docs/app/assets/css/docs.css @@ -422,6 +422,7 @@ iframe.example { .type-hint { display:inline-block; + background: gray; } .variables-matrix .type-hint { @@ -567,7 +568,7 @@ h4 { } .return-arguments td:first-child { - width:100px; + width:100px; } ul.methods > li, From e145a8df72f309d5fb80eaa6469a6148b532c821 Mon Sep 17 00:00:00 2001 From: Peter Bacon Darwin Date: Tue, 1 Apr 2014 09:40:44 +0100 Subject: [PATCH 182/837] docs(tutorial): update to match changes to phonecat --- docs/content/tutorial/index.ngdoc | 227 +++++++++++++++++++----------- 1 file changed, 143 insertions(+), 84 deletions(-) diff --git a/docs/content/tutorial/index.ngdoc b/docs/content/tutorial/index.ngdoc index 67a1f50161e5..e960dc2b66a8 100644 --- a/docs/content/tutorial/index.ngdoc +++ b/docs/content/tutorial/index.ngdoc @@ -3,6 +3,7 @@ @step -1 @description +# PhoneCat Tutorial App A great way to get introduced to AngularJS is to work through this tutorial, which walks you through the construction of an AngularJS web app. The app you will build is a catalog that displays a list @@ -12,8 +13,8 @@ details for any device. demo
 application running in the browser -Work through the tutorial to see how Angular makes browsers smarter — without the use of extensions -or plug-ins. As you work through the tutorial, you will: +Work through the tutorial to see how Angular makes browsers smarter — without the use of native +extensions or plug-ins. As you work through the tutorial, you will: * See examples of how to use client-side data binding and dependency injection to build dynamic views of data that change immediately in response to user actions. @@ -22,15 +23,13 @@ views of data that change immediately in response to user actions. * Learn how to use Angular services to make common web tasks, such as getting data into your app, easier. -And all of this works in any browser without modification to the browser! - When you finish the tutorial you will be able to: -* Create a dynamic application that works in any browser. +* Create a dynamic application that works in all modern browsers. * Define the differences between Angular and common JavaScript frameworks. * Understand how data binding works in AngularJS. -* Use the angular-seed project to quickly boot-strap your own projects. -* Create and run tests. +* Create and run unit tests. +* Create and run end to end tests. * Identify resources for learning more about AngularJS. The tutorial guides you through the entire process of building a simple application, including @@ -43,86 +42,146 @@ really digging into it. If you're looking for a shorter introduction to AngularJ +# Working with the code +You can follow along with this tutorial and hack on the code in either the Mac/Linux or the Windows +environment. The tutorial relies on the use of the [Git][git] versioning system for source code +management. +You don't need to know anything about Git to follow the tutorial. Select one of the tabs below +and follow the instructions for setting up your computer. -# Working with the code +## Install Git + +You'll need Git, which you can get from [the Git site][git]. + +Clone the [angular-phonecat repository][angular-phonecat] located at GitHub by running the following +command: + +``` +git clone https://github.com/angular/angular-phonecat.git +``` + +This command creates the `angular-phonecat` directory in your current directory. + +Change your current directory to `angular-phonecat`. + +``` +cd angular-phonecat +``` + +The tutorial instructions, from now on, assume you are running all commands from the +`angular-phonecat` directory. + + +## Install Node.js + +If you want to run the built-in web-server and the test tools then you will also need +Node.js v0.10, or later. + +You can download Node.js from the [node.js website][node]. + + +You can check the version of Node.js that you have installed by running the following command: + +``` +node --version +``` + +
    Helpful note: If you need to run a different versions of node.js + in your local environment, consider installing + + Node Version Manager (nvm) + . +
    + +Once you have Node.js installed you can install the tool dependencies by running: + +``` +npm install +``` + +This command will download the following tools, into the `node_modules` directive: + +- [Bower][bower] - client-side code package manager +- [http-server][http-server] - simple local static web server +- [Karma][karma] - unit test runner +- [protractor][protractor] - end 2 end test runner + +Running `npm install` will also automatically run `bower install`, which will download the Angular +framework into the `bower_components` directory. + +The project is preconfigured with a number of npm helper scripts to make it easy to run the common +tasks that you will need while developing. + +## Running Development Web Server + +The project is preconfigured to provide a simple static web server for hosting the application. +Start the web server by running: + +``` +npm start +``` + +Now you can browse to the application at: + +``` +http://localhost:8000/app/index.html +``` + +## Running Unit Tests + +The project is preconfigured to use [Karma][karma] to run the unit tests for the application. Start +Karma by running: + +``` +npm test +``` + +This will start the Karma unit test runner, open up a Chrome browser and execute all the unit tests +in this browser. Karma will then sit and watch all the source and test JavaScript files. +Whenever one of these files changes Karma re-runs all the unit tests. + +It is good to leave this running all the time as you will get immediate feedback from Karma as you +are working on the code. + + +## Running End to End Tests + +The project is preconfigured to use [Protractor][protractor] to run the end to end tests for the +application. Execute the Protractor test scripts against your application by running: + +``` +npm run protractor +``` + +This will start the Protractor end to end test runner, open up a Chrome browser and execute all the +end to end test scripts in this browser. Once the test scripts finish, the browser will close down +and Protractor will exit. + +It is good to run the end to end tests whenever you make changes to the HTML views or want to check +that the application as a whole is executing correctly. + +
    Helpful note: Protractor requires that a web server is running + and serving up the application at the default URL: `http://localhost:8000/app/index.html`. You can + start the provided development server by running `npm start`. +
    + + +# Get Started + +Now your environment is ready, it is time to get started developing the Angular PhoneCat +application. + +Step 0 - Bootstrapping + -You can follow this tutorial and hack on the code in either the Mac/Linux or the Windows -environment. The tutorial relies on the use of Git versioning system for source code management. -You don't need to know anything about Git to follow the tutorial. Select one of the tabs below -and follow the instructions for setting up your computer. -
    -
    -
      -
    1. You'll need Git, which you can get from - the Git site.

    2. -
    3. Clone the angular-phonecat repository located at - Github by - running the following command:

      -
      git clone https://github.com/angular/angular-phonecat.git
      -

      This command creates the angular-phonecat directory in your current directory.

    4. -
    5. Change your current directory to angular-phonecat:

      -
      cd angular-phonecat
      -

      The tutorial instructions, from now on, assume you are running all commands from the - angular-phonecat directory.

    6. -
    7. You will also need Node.js and Karma to run unit tests, so please verify that you have - Node.js v0.10 or better installed - and that the node executable is on your PATH by running the following - command in a terminal window:

    8. -
      node --version
      -
      **Helpful note:** If you need to run a different version of - node.js in your local environment, consider installing - - Node Version Manager (nvm).
      -

      Additionally install Karma and - its plugins if you don't have it already:

      -
      -      npm install
      -      
      -
    9. You will need an http server running on your system. Mac and Linux machines typically - have Apache pre-installed, but If you don't already have one installed, you can use node - to run scripts/web-server.js, a simple bundled http server.

    10. -
    -
    - -
    -
      -
    1. You will need Node.js and Karma to run unit tests, so please verify that you have - Node.js v0.10 or better installed - and that the node executable is on your PATH by running the following - command in a terminal window:

      -
      node --version
      -
      **Helpful note:** If you need to run a different version of - node.js in your local environment, consider installing - - Node Version Manager (nvm).
      -

      Additionally install Karma - if you don't have it already:

      -
      npm install -g karma
      -
    2. -
    3. You'll also need Git, which you can get from - the Git site.

    4. -
    5. Clone the angular-phonecat repository located at Github by running - the following command:

      git clone https://github.com/angular/angular-phonecat.git
      -

      This command creates the angular-phonecat directory in your current directory.

    6. -
    7. Change your current directory to angular-phonecat:

      -
      cd angular-phonecat
      -

      The tutorial instructions assume you are running all commands from the angular-phonecat - directory.

      -

      You should run all git commands from Git bash.

      -

      Other commands like test.bat or e2e-test.bat should be executed from the - Windows command line.

    8. -
    9. You need an http server running on your system, but if you don't already have one already - installed, you can use node to run scripts\web-server.js, a simple bundled - http server.

    10. -
    -
    - -The last thing to do is to make sure your computer has a web browser and a good text editor installed. Now, -let's get some cool stuff done! - -Get Started! +[git]: http://git-scm.com/download +[angular-phonecat]: https://github.com/angular/angular-phonecat +[node]: http://nodejs.org/ +[protractor]: https://github.com/angular/protractor +[bower]: http://bower.io/ +[http-server]: https://github.com/nodeapps/http-server +[karma]: https://github.com/karma-runner/karma \ No newline at end of file From 553c252d5ce1a56756df29ded7cce0b48b536fc5 Mon Sep 17 00:00:00 2001 From: Igor Minar Date: Tue, 1 Apr 2014 16:43:25 -0700 Subject: [PATCH 183/837] revert: fix(Scope): aggressively clean up scope on $destroy to minimize leaks This reverts commit f552f25171390e726ad7246ed18b994970bcf764. The commit is causing regressions. Closes #6897 --- src/ng/rootScope.js | 19 ++++--------------- 1 file changed, 4 insertions(+), 15 deletions(-) diff --git a/src/ng/rootScope.js b/src/ng/rootScope.js index aec16298679b..e09e2202b78d 100644 --- a/src/ng/rootScope.js +++ b/src/ng/rootScope.js @@ -731,26 +731,15 @@ function $RootScopeProvider(){ forEach(this.$$listenerCount, bind(null, decrementListenerCount, this)); - // sever all the references to parent scopes (after this cleanup, the current scope should - // not be retained by any of our references and should be eligible for garbage collection) if (parent.$$childHead == this) parent.$$childHead = this.$$nextSibling; if (parent.$$childTail == this) parent.$$childTail = this.$$prevSibling; if (this.$$prevSibling) this.$$prevSibling.$$nextSibling = this.$$nextSibling; if (this.$$nextSibling) this.$$nextSibling.$$prevSibling = this.$$prevSibling; - // This is bogus code that works around V8's memory leak coming from ICs - // see: https://code.google.com/p/v8/issues/detail?id=2073#c26 - // - // for more info also see: - // - https://github.com/angular/angular.js/issues/6794#issuecomment-38648909 - // - https://github.com/angular/angular.js/issues/1313#issuecomment-10378451 - for (var prop in this) { - if (hasOwnProperty.call(this, prop)) { - this[prop] = null; - } - } - // recreate the $$destroyed flag - this.$$destroyed = true; + // This is bogus code that works around Chrome's GC leak + // see: https://github.com/angular/angular.js/issues/1313#issuecomment-10378451 + this.$parent = this.$$nextSibling = this.$$prevSibling = this.$$childHead = + this.$$childTail = null; }, /** From fab59e7515c80a36ca62454fe65ed6b930454b38 Mon Sep 17 00:00:00 2001 From: b9chris Date: Tue, 1 Apr 2014 18:02:49 -0700 Subject: [PATCH 184/837] docs($location): fix link to Developer Guide for "Using $location" Closes #6946 --- src/ng/location.js | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/ng/location.js b/src/ng/location.js index 9bb4d417cfe2..cd3548455a9e 100644 --- a/src/ng/location.js +++ b/src/ng/location.js @@ -508,8 +508,7 @@ function locationGetterSetter(property, preprocess) { * - Clicks on a link. * - Represents the URL object as a set of methods (protocol, host, port, path, search, hash). * - * For more information see {@link guide/dev_guide.services.$location Developer Guide: Angular - * Services: Using $location} + * For more information see {@link guide/$location Developer Guide: Using $location} */ /** From 5393814756f5836ef2d3f5a30c9e5d6ed2ed6945 Mon Sep 17 00:00:00 2001 From: Julie Date: Tue, 1 Apr 2014 11:13:22 -0700 Subject: [PATCH 185/837] docs(tutorial): update tutorial steps to discuss protractor Closes #6940 --- docs/content/tutorial/index.ngdoc | 8 +++- docs/content/tutorial/step_03.ngdoc | 57 +++++++++++++---------------- docs/content/tutorial/step_04.ngdoc | 38 +++++++++++-------- docs/content/tutorial/step_06.ngdoc | 12 +++--- docs/content/tutorial/step_07.ngdoc | 11 +++--- docs/content/tutorial/step_08.ngdoc | 7 ++-- docs/content/tutorial/step_10.ngdoc | 15 ++++---- 7 files changed, 78 insertions(+), 70 deletions(-) diff --git a/docs/content/tutorial/index.ngdoc b/docs/content/tutorial/index.ngdoc index e960dc2b66a8..53040f2549e7 100644 --- a/docs/content/tutorial/index.ngdoc +++ b/docs/content/tutorial/index.ngdoc @@ -150,7 +150,13 @@ are working on the code. ## Running End to End Tests The project is preconfigured to use [Protractor][protractor] to run the end to end tests for the -application. Execute the Protractor test scripts against your application by running: +application. Set up the binaries protractor needs to run by running: + +``` +npm run update-webdriver +``` +(You will only need to do this once) Execute the Protractor test scripts against your application +by running: ``` npm run protractor diff --git a/docs/content/tutorial/step_03.ngdoc b/docs/content/tutorial/step_03.ngdoc index 1203527d417f..5a44dfa0141e 100644 --- a/docs/content/tutorial/step_03.ngdoc +++ b/docs/content/tutorial/step_03.ngdoc @@ -96,18 +96,23 @@ describe('PhoneCat App', function() { describe('Phone list view', function() { beforeEach(function() { - browser().navigateTo('../../app/index.html'); + browser.get('app/index.html'); }); it('should filter the phone list as user types into the search box', function() { - expect(repeater('.phones li').count()).toBe(3); - input('query').enter('nexus'); - expect(repeater('.phones li').count()).toBe(1); + var phoneList = element.all(by.repeater('phone in phones')); + var query = element(by.model('query')); - input('query').enter('motorola'); - expect(repeater('.phones li').count()).toBe(2); + expect(phoneList.count()).toBe(3); + + query.sendKeys('nexus'); + expect(phoneList.count()).toBe(1); + + query.clear(); + query.sendKeys('motorola'); + expect(phoneList.count()).toBe(2); }); }); }); @@ -117,20 +122,14 @@ Even though the syntax of this test looks very much like our controller unit tes Jasmine, the end-to-end test uses APIs of {@link guide/dev_guide.e2e-testing Angular's end-to-end test runner}. -To run the end-to-end test, open one of the following in a new browser tab: - -* node.js users: http://localhost:8000/test/e2e/runner.html -* users with other http servers: -`http://localhost:[port-number]/[context-path]/test/e2e/runner.html` -* casual reader: http://angular.github.com/angular-phonecat/step-3/test/e2e/runner.html +Much like Karma is the test runner for unit tests, we use Protractor to run end-to-end tests. +Try it with `npm run protractor`. End-to-end tests are slow, so unlike with unit tests, Protractor +will exit after the test run and will not automatically rerun the test suite on every file change. +To rerun the test suite, execute `npm run protractor` again. -Previously we've seen how Karma can be used to execute unit tests. Well, it can also run the -end-to-end tests! Use `./scripts/e2e-test.sh` (if you are on Windows, run `scripts\e2e-test.bat`) script for that. End-to-end tests are slow, so unlike -with unit tests, Karma will exit after the test run and will not automatically rerun the test -suite on every file change. To rerun the test suite, execute the `e2e-test.sh` or `e2e-test.bat` script again. - -Note: You must ensure you've installed the karma-ng-scenario framework plugin prior to running the -`e2e-test.sh` script. You can do this by issuing `npm install` into your terminal. +Note: You must ensure you've installed the protractor and updated webdriver prior to running the +`npm run protractor`. You can do this by issuing `npm install` and `npm run update-webdriver` into +your terminal. This test verifies that the search box and the repeater are correctly wired together. Notice how easy it is to write end-to-end tests in Angular. Although this example is for a simple test, it @@ -173,28 +172,24 @@ ngBindTemplate} directives, which are invisible to the user while the page is lo ```js it('should display the current filter value within an element with id "status"', function() { - expect(element('#status').text()).toMatch(/Current filter: \s*$/); + var statusElement = element(by.id('status')); + expect(statusElement.getText()).toMatch(/Current filter: \s*$/); - input('query').enter('nexus'); + element(by.model('query')).sendKeys('nexus'); - expect(element('#status').text()).toMatch(/Current filter: nexus\s*$/); + expect(statusElement.getText()).toMatch(/Current filter: nexus\s*$/); //alternative version of the last assertion that tests just the value of the binding - using('#status').expect(binding('query')).toBe('nexus'); + expect(statusElement.element(by.binding('query'))).toBe('nexus'); }); ``` - Refresh the browser tab with the end-to-end test runner to see the test fail. To make the test -pass, edit the `index.html` template to add a `div` or `p` element with `id` `"status"` and content -with the `query` binding, prefixed by "Current filter:". For instance: + Re-run `npm run protractor` to see the test fail. To make the test pass, edit the `index.html` +template to add a `div` or `p` element with `id` `"status"` and content with the `query` binding, +prefixed by "Current filter:". For instance:
    Current filter: {{query}}
    -* Add a `pause()` statement inside of an end-to-end test and rerun it. You'll see the runner pause; -this gives you the opportunity to explore the state of your application while it is displayed in -the browser. The app is live! You can change the search query to prove it. Notice how useful this -is for troubleshooting end-to-end tests. - # Summary diff --git a/docs/content/tutorial/step_04.ngdoc b/docs/content/tutorial/step_04.ngdoc index 48b19f7a1dd0..76f7e4756393 100644 --- a/docs/content/tutorial/step_04.ngdoc +++ b/docs/content/tutorial/step_04.ngdoc @@ -152,28 +152,36 @@ __`test/e2e/scenarios.js`:__ ```js ... - it('should be possible to control phone order via the drop down select box', - function() { - //let's narrow the dataset to make the test assertions shorter - input('query').enter('tablet'); + it('should be possible to control phone order via the drop down select box', function() { - expect(repeater('.phones li', 'Phone List').column('phone.name')). - toEqual(["Motorola XOOM\u2122 with Wi-Fi", - "MOTOROLA XOOM\u2122"]); + var phoneNameColumn = element.all(by.repeater('phone in phones').column('{{phone.name}}')); + var query = element(by.model('query')); - select('orderProp').option('Alphabetical'); + function getNames() { + return phoneNameColumn.map(function(elm) { + return elm.getText(); + }); + } - expect(repeater('.phones li', 'Phone List').column('phone.name')). - toEqual(["MOTOROLA XOOM\u2122", - "Motorola XOOM\u2122 with Wi-Fi"]); - }); -... + query.sendKeys('tablet'); //let's narrow the dataset to make the test assertions shorter + + expect(getNames()).toEqual([ + "Motorola XOOM\u2122 with Wi-Fi", + "MOTOROLA XOOM\u2122" + ]); + + element(by.model('orderProp')).findElement(by.css('option[value="name"]')).click(); + + expect(getNames()).toEqual([ + "MOTOROLA XOOM\u2122", + "Motorola XOOM\u2122 with Wi-Fi" + ]); + });... ``` The end-to-end test verifies that the ordering mechanism of the select box is working correctly. -You can now rerun `./scripts/e2e-test.sh` or refresh the browser tab with the end-to-end test -`runner.html` to see the tests run, or you can see them running on [Angular's server](http://angular.github.com/angular-phonecat/step-4/test/e2e/runner.html). +You can now rerun `npm run protractor` to see the tests run. # Experiments diff --git a/docs/content/tutorial/step_06.ngdoc b/docs/content/tutorial/step_06.ngdoc index 61586c79e4ca..7981210b5714 100644 --- a/docs/content/tutorial/step_06.ngdoc +++ b/docs/content/tutorial/step_06.ngdoc @@ -76,9 +76,12 @@ __`test/e2e/scenarios.js`__: ```js ... it('should render phone specific links', function() { - input('query').enter('nexus'); - element('.phones li a').click(); - expect(browser().location().url()).toBe('/phones/nexus-s'); + var query = element(by.model('query')); + query.sendKeys('nexus'); + element(by.css('.phones li a')).click(); + browser.getLocationAbsUrl().then(function(url) { + expect(url.split('#')[1]).toBe('/phones/nexus-s'); + }); }); ... ``` @@ -86,8 +89,7 @@ __`test/e2e/scenarios.js`__: We added a new end-to-end test to verify that the app is generating correct links to the phone views that we will implement in the upcoming steps. -You can now rerun `./scripts/e2e-test.sh` or refresh the browser tab with the end-to-end test -runner to see the tests run, or you can see them running on [Angular's server](http://angular.github.com/angular-phonecat/step-6/test/e2e/runner.html). +You can now rerun `npm run protractor` to see the tests run. # Experiments diff --git a/docs/content/tutorial/step_07.ngdoc b/docs/content/tutorial/step_07.ngdoc index f6fdac5c0a51..b93c301e8ee5 100644 --- a/docs/content/tutorial/step_07.ngdoc +++ b/docs/content/tutorial/step_07.ngdoc @@ -267,22 +267,21 @@ to various URLs and verify that the correct view was rendered. }); ... - describe('Phone detail view', function() { + describe('Phone detail view', function() { beforeEach(function() { - browser().navigateTo('app/index.html#/phones/nexus-s'); + browser.get('app/index.html#/phones/nexus-s'); }); it('should display placeholder page with phoneId', function() { - expect(binding('phoneId')).toBe('nexus-s'); + expect(element(by.binding('phoneId')).getText()).toBe('nexus-s'); }); - }); + }); ``` -You can now rerun `./scripts/e2e-test.sh` or refresh the browser tab with the end-to-end test -runner to see the tests run, or you can see them running on [Angular's server](http://angular.github.com/angular-phonecat/step-7/test/e2e/runner.html). +You can now rerun `npm run protractor` to see the tests run. # Experiments diff --git a/docs/content/tutorial/step_08.ngdoc b/docs/content/tutorial/step_08.ngdoc index f432df74c512..cb42d1643e31 100644 --- a/docs/content/tutorial/step_08.ngdoc +++ b/docs/content/tutorial/step_08.ngdoc @@ -166,20 +166,19 @@ __`test/e2e/scenarios.js`:__ describe('Phone detail view', function() { beforeEach(function() { - browser().navigateTo('../../app/index.html#/phones/nexus-s'); + browser.get('app/index.html#/phones/nexus-s'); }); it('should display nexus-s page', function() { - expect(binding('phone.name')).toBe('Nexus S'); + expect(element(by.binding('phone.name')).getText()).toBe('Nexus S'); }); }); ... ``` -You can now rerun `./scripts/e2e-test.sh` or refresh the browser tab with the end-to-end test -runner to see the tests run, or you can see them running on [Angular's server](http://angular.github.com/angular-phonecat/step-8/test/e2e/runner.html). +You can now rerun `npm run protractor` to see the tests run. # Experiments diff --git a/docs/content/tutorial/step_10.ngdoc b/docs/content/tutorial/step_10.ngdoc index d1d3f9c47b4f..7d04eb3a3c8e 100644 --- a/docs/content/tutorial/step_10.ngdoc +++ b/docs/content/tutorial/step_10.ngdoc @@ -90,23 +90,22 @@ __`test/e2e/scenarios.js`:__ ... it('should display the first phone image as the main phone image', function() { - expect(element('img.phone').attr('src')).toBe('img/phones/nexus-s.0.jpg'); + expect(element(by.css('img.phone')).getAttribute('src')).toMatch(/img\/phones\/nexus-s.0.jpg/); }); it('should swap main image if a thumbnail image is clicked on', function() { - element('.phone-thumbs li:nth-child(3) img').click(); - expect(element('img.phone').attr('src')).toBe('img/phones/nexus-s.2.jpg'); + element(by.css('.phone-thumbs li:nth-child(3) img')).click(); + expect(element(by.css('img.phone')).getAttribute('src')).toMatch(/img\/phones\/nexus-s.2.jpg/); - element('.phone-thumbs li:nth-child(1) img').click(); - expect(element('img.phone').attr('src')).toBe('img/phones/nexus-s.0.jpg'); + element(by.css('.phone-thumbs li:nth-child(1) img')).click(); + expect(element(by.css('img.phone')).getAttribute('src')).toMatch(/img\/phones\/nexus-s.0.jpg/); }); }); -}); ``` -You can now rerun `./scripts/e2e-test.sh` or refresh the browser tab with the end-to-end test -runner to see the tests run, or you can see them running on [Angular's server](http://angular.github.com/angular-phonecat/step-10/test/e2e/runner.html). +You can now rerun `npm run protractor` to see the tests run. + # Experiments From 6e420ff28d9b3e76ac2c3598bf3797540ef8a1d3 Mon Sep 17 00:00:00 2001 From: Tero Parviainen Date: Tue, 1 Apr 2014 06:53:35 +0300 Subject: [PATCH 186/837] fix($parse): mark constant unary minus expressions as constant Previously, constant numbers with a unary minus sign were not treated as constants. This fix corrects this behaviour, and may provide a small performance boost for certain applications, due to constant watches being automatically unregistered after their first listener call. Closes #6932 --- src/ng/parse.js | 6 +++++- test/ng/parseSpec.js | 1 + 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/src/ng/parse.js b/src/ng/parse.js index 885dc50afab9..50da14fa0770 100644 --- a/src/ng/parse.js +++ b/src/ng/parse.js @@ -393,7 +393,11 @@ var Parser = function (lexer, $filter, options) { this.options = options; }; -Parser.ZERO = function () { return 0; }; +Parser.ZERO = extend(function () { + return 0; +}, { + constant: true +}); Parser.prototype = { constructor: Parser, diff --git a/test/ng/parseSpec.js b/test/ng/parseSpec.js index 6a6bb4a1182d..a76fa86b6de4 100644 --- a/test/ng/parseSpec.js +++ b/test/ng/parseSpec.js @@ -1031,6 +1031,7 @@ describe('parser', function() { it('should mark complex expressions involving constant values as constant', inject(function($parse) { expect($parse('!true').constant).toBe(true); + expect($parse('-42').constant).toBe(true); expect($parse('1 - 1').constant).toBe(true); expect($parse('"foo" + "bar"').constant).toBe(true); expect($parse('5 != null').constant).toBe(true); From 4ea57e7e96dab79efebf5f6479b7c6b2992b4d2f Mon Sep 17 00:00:00 2001 From: Caitlin Potter Date: Wed, 2 Apr 2014 12:05:22 -0400 Subject: [PATCH 187/837] refactor(jqLite): make HTML-parsing constructor more robust Previously, the jqLite constructor was limited and would be unable to circumvent many of the HTML5 spec's "allowed content" policies for various nodes. This led to complicated and gross hacks around this in the HTML compiler. This change refactors these hacks by simplifying them, and placing them in jqLite rather than in $compile, in order to better support these things, and simplify code. While the new jqLite constructor is still not even close to as robust as jQuery, it should be more than suitable enough for the needs of the framework, while adding minimal code. Closes #6941 Closes #6958 --- src/.jshintrc | 1 + src/jqLite.js | 84 +++++++++++++++++++++++++++++++++++++++++----- src/ng/compile.js | 36 ++++++-------------- test/jqLiteSpec.js | 30 +++++++++++++++++ 4 files changed, 118 insertions(+), 33 deletions(-) diff --git a/src/.jshintrc b/src/.jshintrc index 35bba32e73ed..5a7fe876e497 100644 --- a/src/.jshintrc +++ b/src/.jshintrc @@ -135,6 +135,7 @@ "JQLitePrototype": false, "addEventListenerFn": false, "removeEventListenerFn": false, + "jqLiteIsTextNode": false, /* apis.js */ "hashKey": false, diff --git a/src/jqLite.js b/src/jqLite.js index 738f47a9b167..d03ea67b4676 100644 --- a/src/jqLite.js +++ b/src/jqLite.js @@ -179,6 +179,81 @@ function jqLitePatchJQueryRemove(name, dispatchThis, filterElems, getterIfNoArgu } } +var SINGLE_TAG_REGEXP = /^<(\w+)\s*\/?>(?:<\/\1>|)$/; +var HTML_REGEXP = /<|&#?\w+;/; +var TAG_NAME_REGEXP = /<([\w:]+)/; +var XHTML_TAG_REGEXP = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi; + +var wrapMap = { + 'option': [1, ''], + + 'thead': [1, '', '
    '], + 'col': [2, '', '
    '], + 'tr': [2, '', '
    '], + 'td': [3, '', '
    '], + '_default': [0, "", ""] +}; + +wrapMap.optgroup = wrapMap.option; +wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead; +wrapMap.th = wrapMap.td; + +function jqLiteIsTextNode(html) { + return !HTML_REGEXP.test(html); +} + +function jqLiteBuildFragment(html, context) { + var elem, tmp, tag, wrap, + fragment = context.createDocumentFragment(), + nodes = [], i; + + if (jqLiteIsTextNode(html)) { + // Convert non-html into a text node + nodes.push(context.createTextNode(html)); + } else { + // Convert html into DOM nodes + tmp = tmp || fragment.appendChild(context.createElement("div")); + tag = (TAG_NAME_REGEXP.exec(html) || ["", ""])[1].toLowerCase(); + wrap = wrapMap[tag] || wrapMap._default; + tmp.innerHTML = wrap[1] + html.replace(XHTML_TAG_REGEXP, "<$1>") + wrap[2]; + + // Descend through wrappers to the right content + i = wrap[0]; + while (i--) { + tmp = tmp.lastChild; + } + + nodes = concat(nodes, tmp.childNodes); + + tmp = fragment.firstChild; + tmp.textContent = ""; + } + + // Remove wrapper from fragment + fragment.textContent = ""; + fragment.innerHTML = ""; // Clear inner HTML + forEach(nodes, function(node) { + fragment.appendChild(node); + }); + + return fragment; +} + +function jqLiteParseHTML(html, context) { + context = context || document; + var parsed; + + if ((parsed = SINGLE_TAG_REGEXP.exec(html))) { + return [context.createElement(parsed[1])]; + } + + if ((parsed = jqLiteBuildFragment(html, context))) { + return parsed.childNodes; + } + + return []; +} + ///////////////////////////////////////////// function JQLite(element) { if (element instanceof JQLite) { @@ -195,14 +270,7 @@ function JQLite(element) { } if (isString(element)) { - var div = document.createElement('div'); - // Read about the NoScope elements here: - // http://msdn.microsoft.com/en-us/library/ms533897(VS.85).aspx - div.innerHTML = '
     
    ' + element; // IE insanity to make NoScope elements work! - div.removeChild(div.firstChild); // remove the superfluous div - jqLiteAddNodes(this, div.childNodes); - var fragment = jqLite(document.createDocumentFragment()); - fragment.append(this); // detach the elements from the temporary DOM div. + jqLiteAddNodes(this, jqLiteParseHTML(element)); } else { jqLiteAddNodes(this, element); } diff --git a/src/ng/compile.js b/src/ng/compile.js index a51ccd5a2677..bb2179a3fbd6 100644 --- a/src/ng/compile.js +++ b/src/ng/compile.js @@ -513,8 +513,7 @@ function $CompileProvider($provide, $$sanitizeUriProvider) { var hasDirectives = {}, Suffix = 'Directive', COMMENT_DIRECTIVE_REGEXP = /^\s*directive\:\s*([\d\w\-_]+)\s+(.*)$/, - CLASS_DIRECTIVE_REGEXP = /(([\d\w\-_]+)(?:\:([^;]+))?;?)/, - TABLE_CONTENT_REGEXP = /^<\s*(tr|th|td|thead|tbody|tfoot)(\s+[^>]*)?>/i; + CLASS_DIRECTIVE_REGEXP = /(([\d\w\-_]+)(?:\:([^;]+))?;?)/; // Ref: http://developers.whatwg.org/webappapis.html#event-handler-idl-attributes // The assumption is that future DOM event attribute names will begin with @@ -1256,7 +1255,11 @@ function $CompileProvider($provide, $$sanitizeUriProvider) { if (directive.replace) { replaceDirective = directive; - $template = directiveTemplateContents(directiveValue); + if (jqLiteIsTextNode(directiveValue)) { + $template = []; + } else { + $template = jqLite(directiveValue); + } compileNode = $template[0]; if ($template.length != 1 || compileNode.nodeType !== 1) { @@ -1655,27 +1658,6 @@ function $CompileProvider($provide, $$sanitizeUriProvider) { } - function directiveTemplateContents(template) { - var type; - template = trim(template); - if ((type = TABLE_CONTENT_REGEXP.exec(template))) { - type = type[1].toLowerCase(); - var table = jqLite('' + template + '
    '); - if (/(thead|tbody|tfoot)/.test(type)) { - return table.children(type); - } - table = table.children('tbody'); - if (type === 'tr') { - return table.children('tr'); - } - return table.children('tr').contents(); - } - return jqLite('
    ' + - template + - '
    ').contents(); - } - - function compileTemplateUrl(directives, $compileNode, tAttrs, $rootElement, childTranscludeFn, preLinkFns, postLinkFns, previousCompileContext) { var linkQueue = [], @@ -1700,7 +1682,11 @@ function $CompileProvider($provide, $$sanitizeUriProvider) { content = denormalizeTemplate(content); if (origAsyncDirective.replace) { - $template = directiveTemplateContents(content); + if (jqLiteIsTextNode(content)) { + $template = []; + } else { + $template = jqLite(content); + } compileNode = $template[0]; if ($template.length != 1 || compileNode.nodeType !== 1) { diff --git a/test/jqLiteSpec.js b/test/jqLiteSpec.js index faf1c98cbb8c..f9c6f3a2b55f 100644 --- a/test/jqLiteSpec.js +++ b/test/jqLiteSpec.js @@ -95,6 +95,36 @@ describe('jqLite', function() { expect(fragment.length).toBe(1); expect(fragment[0].nodeType).toBe(11); }); + + + it('should allow construction of
    \n' }; }); diff --git a/docs/content/tutorial/step_00.ngdoc b/docs/content/tutorial/step_00.ngdoc index 1503622f59dc..e06ff40a4f29 100644 --- a/docs/content/tutorial/step_00.ngdoc +++ b/docs/content/tutorial/step_00.ngdoc @@ -11,65 +11,27 @@ with the most important source code files, learn how to start the development se angular-seed, and run the application in the browser. -
    -
    -
      -
    1. In angular-phonecat directory, run this command:

      -
      git checkout -f step-0
      -

      This resets your workspace to step 0 of the tutorial app.

      -

      You must repeat this for every future step in the tutorial and change the number to - the number of the step you are on. This will cause any changes you made within - your working directory to be lost.

    2. - -
    3. To see the app running in a browser, do one of the following: -
        -
      • For node.js users: -
          -
        1. In a separate terminal tab or window, run npm start to start the web server.
        2. -
        3. Open a browser window for the app and navigate to `http://localhost:8000/app/index.html`
        4. -
        -
      • -
      • For other http servers: -
          -
        1. Configure the server to serve the files in the angular-phonecat directory.
        2. -
        3. Navigate in your browser to http://localhost:[port-number]/[context-path]/app/index.html.
        4. -
        -
      • -
      -
    4. -
    -
    - - -
    -
      -
    1. Open Git bash and run this command (in angular-phonecat directory):

      -
      git checkout -f step-0
      -

      This resets your workspace to step 0 of the tutorial app.

      -

      You must repeat this for every future step in the tutorial and change the number to - the number of the step you are on. This will cause any changes you made within - your working directory to be lost.

    2. -
    3. To see the app running in a browser, do one of the following: -
        -
      • For node.js users: -
          -
        1. In a separate terminal tab or window, run node scripts\web-server.js to start the web server.
        2. -
        3. Open a browser window for the app and navigate to `http://localhost:8000/app/index.html`
        4. -
        -
      • -
      • For other http servers: -
          -
        1. Configure the server to serve the files in the angular-phonecat directory.
        2. -
        3. Navigate in your browser to http://localhost:[port-number]/[context-path]/app/index.html.
        4. -
        -
      • -
      -
    4. -
    -
    -
    +In `angular-phonecat` directory, run this command: +``` +git checkout -f step-0 +``` + + +This resets your workspace to step 0 of the tutorial app. + +You must repeat this for every future step in the tutorial and change the number to the number of +the step you are on. This will cause any changes you made within your working directory to be lost. + +If you haven't already done so you need to install the dependencies by running: + +``` +npm install +``` + +To see the app running in a browser, open a *separate* terminal/command line tab or window, then +run `npm start` to start the web server. Now, open a browser window for the app and navigate to +`http://localhost:8000/app/index.html` You can now see the page in your browser. It's not very exciting, but that's OK. @@ -114,7 +76,7 @@ __`app/index.html`:__ * AngularJS script tag: - + + @@ -53,21 +49,21 @@ __`app/index.html`:__ ``` -We replaced the hard-coded phone list with the -{@link ng.directive:ngRepeat ngRepeat directive} and two -{@link guide/expression Angular expressions} enclosed in curly braces: -`{{phone.name}}` and `{{phone.snippet}}`: +We replaced the hard-coded phone list with the {@link ng.directive:ngRepeat ngRepeat directive} +and two {@link guide/expression Angular expressions}: -* The `ng-repeat="phone in phones"` statement in the `
  • ` tag is an Angular repeater. The -repeater tells Angular to create a `
  • ` element for each phone in the list using the first `
  • ` +* The `ng-repeat="phone in phones"` attribute in the `
  • ` tag is an Angular repeater directive. +The repeater tells Angular to create a `
  • ` element for each phone in the list using the `
  • ` tag as the template. +* The expressions wrapped in curly braces (`{{phone.name}}` and `{{phone.snippet}}`) will be replaced +by the value of the expressions. We have added a new directive, called `ng-controller`, which attaches a `PhoneListCtrl` -__controller__ to the DOM at this point. +__controller__ to the DOM at this point: -* As we've learned in {@link step_00 step 0}, the curly braces around `phone.name` and `phone.snippet` denote -bindings. As opposed to evaluating constants, these expressions are referring to our application -model, which was set up in our `PhoneListCtrl` controller. +* 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. @@ -128,23 +124,19 @@ To learn more about Angular scopes, see the {@link ng.$rootScope.Scope angular s ## Tests The "Angular way" of separating controller from the view, makes it easy to test code as it is being -developed. If our controller is available on the global namespace then we can simply instantiate it -with a mock `scope` object. Take a look at the following unit test for our controller: - -__`test/unit/controllersSpec.js`:__ +developed. If our controller is available on the global namespace then we could simply instantiate it +with a mock `scope` object: ```js -describe('PhoneCat controllers', function() { +describe('PhoneListCtrl', function(){ - describe('PhoneListCtrl', function(){ + it('should create "phones" model with 3 phones', function() { + var scope = {}, + ctrl = new PhoneListCtrl(scope); - it('should create "phones" model with 3 phones', function() { - var scope = {}, - ctrl = new PhoneListCtrl(scope); - - expect(scope.phones.length).toBe(3); - }); + expect(scope.phones.length).toBe(3); }); + }); ``` @@ -154,67 +146,72 @@ Angular. Since testing is such a critical part of software development, we make tests in Angular so that developers are encouraged to write them. ### Testing non-Global Controllers -In practice, you will not want to have your controller functions in the global namespace. Instead, -we have registered our controllers in the `phonecatApp` module. In this case Angular provides a -service, `$controller`, which will retrieve your controller by name. Here is the same test using -`$controller`: + +In practice, you will not want to have your controller functions in the global namespace. Instead, +you can see that we have registered it via an anonymous constructor function on the `phoneCatApp` +module. + +In this case Angular provides a service, `$controller`, which will retrieve your controller by name. +Here is the same test using `$controller`: __`test/unit/controllersSpec.js`:__ ```js -describe('PhoneCat controllers', function() { +describe('PhoneListCtrl', function(){ + beforeEach(module('phonecatApp')); - describe('PhoneListCtrl', function(){ + it('should create "phones" model with 3 phones', inject(function($controller) { + var scope = {}, + ctrl = $controller('PhoneListCtrl', {$scope:scope}); - it('should create "phones" model with 3 phones', inject(function($controller) { - var scope = {}, - ctrl = $controller('PhoneListCtrl', { $scope: scope }); + expect(scope.phones.length).toBe(3); + })); - expect(scope.phones.length).toBe(3); - })); - }); }); ``` -Don't forget that we need to load up the `phonecatApp` module into the test so that the controller -is available to be injected. +* Before each test we tell Angular to load the `phonecatApp` module. +* We ask Angular to `inject` the `$controller` service into our test function +* We use `$controller` to create an instance of the `PhoneListCtrl` +* With this instance, we verify that the phones array property on the scope contains three records. + ### Writing and Running Tests + Angular developers prefer the syntax of Jasmine's Behavior-driven Development (BDD) framework when writing tests. Although Angular does not require you to use Jasmine, we wrote all of the tests in -this tutorial in Jasmine. You can learn about Jasmine on the [Jasmine home page](http://jasmine.github.io/) and at the [Jasmine docs](http://jasmine.github.io/). - -The angular-seed project is pre-configured to run all unit tests using [Karma](http://karma-runner.github.io/). Ensure that the necessary karma plugins are installed. -You can do this by issuing `npm install` into your terminal. +this tutorial in Jasmine v1.3. You can learn about Jasmine on the [Jasmine home page][jasmine] and +at the [Jasmine docs][jasmine-docs]. +The angular-seed project is pre-configured to run unit tests using [Karma][karma] but you will need +to ensure that Karma and its necessary plugins are installed. You can do this by running +`npm install`. -To run the test, do the following: +To run the tests, and then watch the files for changes: `npm test`. -1. In a _separate_ terminal window or tab, go to the `angular-phonecat` directory and run - `npm test` to start the Karma server (the config file necessary to start the server is - located at `./test/karma.conf.js`). - -2. Karma will start a new instance of Chrome browser automatically. Just ignore it and let it run in +* 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. +* You should see the following or similar output in the terminal: -3. You should see the following or similar output in the terminal: - - info: Karma server started at http://localhost:9876/ - info (launcher): Starting browser "Chrome" - info (Chrome 22.0): Connected on socket id tPUm9DXcLHtZTKbAEO-n - Chrome 22.0: Executed 1 of 1 SUCCESS (0.093 secs / 0.004 secs) +
    +    info: Karma server started at http://localhost:9876/
    +    info (launcher): Starting  browser "Chrome"
    +    info (Chrome 22.0): Connected on socket id tPUm9DXcLHtZTKbAEO-n
    +    Chrome 22.0: Executed 1 of 1 SUCCESS (0.093 secs / 0.004 secs)
    +  
    Yay! The test passed! Or not... - -4. To rerun the tests, just change any of the source or test .js files. Karma will notice the change +* To rerun the tests, just change any of the source or test .js files. Karma will notice the change and will rerun the tests for you. Now isn't that sweet? # Experiments * Add another binding to `index.html`. For example: -

    Total number of phones: {{phones.length}}

    + ```html +

    Total number of phones: {{phones.length}}

    + ``` * Create a new model property in the controller and bind to it from the template. For example: @@ -255,3 +252,7 @@ to the app.
      + +[jasmine]: http://jasmine.github.io/ +[jasmine-docs]: http://jasmine.github.io/1.3/introduction.html +[karma]: http://karma-runner.github.io/ \ No newline at end of file diff --git a/docs/content/tutorial/step_03.ngdoc b/docs/content/tutorial/step_03.ngdoc index 5a44dfa0141e..1348aefbcbae 100644 --- a/docs/content/tutorial/step_03.ngdoc +++ b/docs/content/tutorial/step_03.ngdoc @@ -11,15 +11,10 @@ simple; we will add full text search (yes, it will be simple!). We will also wri test, because a good end-to-end test is a good friend. It stays with your app, keeps an eye on it, and quickly detects regressions. - -
      - - -The app now has a search box. Notice that the phone list on the page changes depending on what a +* The app now has a search box. Notice that the phone list on the page changes depending on what a user types into the search box. -The most important differences between Steps 2 and 3 are listed below. You can see the full diff on -[GitHub](https://github.com/angular/angular-phonecat/compare/step-2...step-3): +
      ## Controller @@ -118,22 +113,26 @@ describe('PhoneCat App', function() { }); ``` +This test verifies that the search box and the repeater are correctly wired together. Notice how +easy it is to write end-to-end tests in Angular. Although this example is for a simple test, it +really is that easy to set up any functional, readable, end-to-end test. + +### Running End to End Tests with Protractor Even though the syntax of this test looks very much like our controller unit test written with -Jasmine, the end-to-end test uses APIs of {@link guide/dev_guide.e2e-testing Angular's end-to-end -test runner}. +Jasmine, the end-to-end test uses APIs of [Protractor](https://github.com/angular/protractor). Read +about the Protractor APIs at https://github.com/angular/protractor/blob/master/docs/api.md. Much like Karma is the test runner for unit tests, we use Protractor to run end-to-end tests. Try it with `npm run protractor`. End-to-end tests are slow, so unlike with unit tests, Protractor will exit after the test run and will not automatically rerun the test suite on every file change. To rerun the test suite, execute `npm run protractor` again. -Note: You must ensure you've installed the protractor and updated webdriver prior to running the -`npm run protractor`. You can do this by issuing `npm install` and `npm run update-webdriver` into -your terminal. +
      + Note: You must ensure you've installed the protractor and updated webdriver prior to running the + `npm run protractor`. You can do this by issuing `npm install` and `npm run update-webdriver` into + your terminal. +
      -This test verifies that the search box and the repeater are correctly wired together. Notice how -easy it is to write end-to-end tests in Angular. Although this example is for a simple test, it -really is that easy to set up any functional, readable, end-to-end test. # Experiments diff --git a/docs/content/tutorial/step_04.ngdoc b/docs/content/tutorial/step_04.ngdoc index 76f7e4756393..7e381ecadd82 100644 --- a/docs/content/tutorial/step_04.ngdoc +++ b/docs/content/tutorial/step_04.ngdoc @@ -10,15 +10,11 @@ In this step, you will add a feature to let your users control the order of the list. The dynamic ordering is implemented by creating a new model property, wiring it together with the repeater, and letting the data binding magic do the rest of the work. - -
      +* In addition to the search box, the app displays a drop down menu that allows users to control the + order in which the phones are listed. -You should see that in addition to the search box, the app displays a drop down menu that allows -users to control the order in which the phones are listed. - -The most important differences between Steps 3 and 4 are listed below. You can see the full diff on -[GitHub](https://github.com/angular/angular-phonecat/compare/step-3...step-4): +
      ## Template @@ -143,7 +139,7 @@ shared by all tests in the parent `describe` block. You should now see the following output in the Karma tab: - Chrome 22.0: Executed 2 of 2 SUCCESS (0.021 secs / 0.001 secs) +
      Chrome 22.0: Executed 2 of 2 SUCCESS (0.021 secs / 0.001 secs)
      Let's turn our attention to the end-to-end test. diff --git a/docs/content/tutorial/step_05.ngdoc b/docs/content/tutorial/step_05.ngdoc index 031d97b751d8..5702a43899c1 100644 --- a/docs/content/tutorial/step_05.ngdoc +++ b/docs/content/tutorial/step_05.ngdoc @@ -11,14 +11,11 @@ from our server using one of Angular's built-in {@link guide/services services} ng.$http $http}. We will use Angular's {@link guide/di dependency injection (DI)} to provide the service to the `PhoneListCtrl` controller. +* There are now a list of 20 phones, loaded from the server.
      -You should now see a list of 20 phones. - -The most important changes are listed below. You can see the full diff on [GitHub](https://github.com/angular/angular-phonecat/compare/step-4...step-5): - ## Data The `app/phones/phones.json` file in your project is a dataset that contains a larger list of phones stored in the JSON format. @@ -165,9 +162,9 @@ __`test/unit/controllersSpec.js`:__ Because we started using dependency injection and our controller has dependencies, constructing the controller in our tests is a bit more complicated. We could use the `new` operator and provide the -constructor with some kind of fake `$http` implementation. However, the recommended (and easier) way -is to create a controller in the test environment in the same way that Angular does it in the -production code behind the scenes, as follows: +constructor with some kind of fake `$http` implementation. However, Angular provides a mock `$http` +service that we can use in unit tests. We configure "fake" responses to server requests by calling +methods on a service called $httpBackend: ```js describe('PhoneCat controllers', function() { @@ -251,7 +248,7 @@ Finally, we verify that the default value of `orderProp` is set correctly: You should now see the following output in the Karma tab: - Chrome 22.0: Executed 2 of 2 SUCCESS (0.028 secs / 0.007 secs) +
      Chrome 22.0: Executed 2 of 2 SUCCESS (0.028 secs / 0.007 secs)
      diff --git a/docs/content/tutorial/step_06.ngdoc b/docs/content/tutorial/step_06.ngdoc index 7981210b5714..5b509a8e068f 100644 --- a/docs/content/tutorial/step_06.ngdoc +++ b/docs/content/tutorial/step_06.ngdoc @@ -10,15 +10,10 @@ In this step, you will add thumbnail images for the phones in the phone list, an now, will go nowhere. In subsequent steps you will use the links to display additional information about the phones in the catalog. +* There are now links and images of the phones in the list.
      - -You should now see links and images of the phones in the list. - -The most important changes are listed below. You can see the full diff on [GitHub](https://github.com/angular/angular-phonecat/compare/step-5...step-6): - - ## Data Note that the `phones.json` file contains unique ids and image urls for each of the phones. The diff --git a/docs/content/tutorial/step_07.ngdoc b/docs/content/tutorial/step_07.ngdoc index b93c301e8ee5..8ccc15022460 100644 --- a/docs/content/tutorial/step_07.ngdoc +++ b/docs/content/tutorial/step_07.ngdoc @@ -7,18 +7,49 @@ In this step, you will learn how to create a layout template and how to build an app that has -multiple views by adding routing. +multiple views by adding routing, using an Angular module called 'ngRoute'. +* When you now navigate to `app/index.html`, you are redirected to `app/index.html#/phones` + and the phone list appears in the browser. +* When you click on a phone link the stub of a phone detail page is displayed.
      +## Dependencies + +The routing functionality added by this step is provided by angular in the `ngRoute` module, which +is distributed separately from the core Angular framework. + +We are using [Bower][bower] to install client side dependencies. This step updates the +`bower.json` configuration file to include the new dependency: + +```json +{ + "name": "angular-seed", + "description": "A starter project for AngularJS", + "version": "0.0.0", + "homepage": "https://github.com/angular/angular-seed", + "license": "MIT", + "private": true, + "dependencies": { + "angular": "1.2.x", + "angular-mocks": "~1.2.15", + "bootstrap": "~3.1.1", + "angular-route": "~1.2.15" + } +} +``` -Note that when you now navigate to `app/index.html`, you are redirected to `app/index.html#/phones` -and the same phone list appears in the browser. When you click on a phone link the stub of a phone -detail page is displayed. +The new dependency `"angular-route": "~1.2.15"` tells bower to install a version of the +angular-route component that is compatible with version 1.2.15. We must tell bower to download +and install this dependency. +If you have bower installed globally then you can run `bower install` but for this project we have +preconfigured npm to run bower install for us: -The most important changes are listed below. You can see the full diff on [GitHub](https://github.com/angular/angular-phonecat/compare/step-6...step-7). +``` +npm install +``` ## Multiple Views, Routing and Layout Template @@ -34,12 +65,11 @@ template into what we call a "layout template". This is a template that is commo our application. Other "partial templates" are then included into this layout template depending on the current "route" — the view that is currently displayed to the user. -Application routes in Angular are declared via the -{@link ngRoute.$routeProvider $routeProvider}, which is the provider of the -{@link ngRoute.$route $route service}. This service makes it easy to wire together -controllers, view templates, and the current -URL location in the browser. Using this feature we can implement [deep linking](http://en.wikipedia.org/wiki/Deep_linking), which lets us utilize the browser's -history (back and forward navigation) and bookmarks. +Application routes in Angular are declared via the {@link ngRoute.$routeProvider $routeProvider}, +which is the provider of the {@link ngRoute.$route $route service}. This service makes it easy to +wire together controllers, view templates, and the current URL location in the browser. Using this +feature we can implement [deep linking](http://en.wikipedia.org/wiki/Deep_linking), which lets us +utilize the browser's history (back and forward navigation) and bookmarks. ### A Note About DI, Injector and Providers @@ -68,6 +98,94 @@ of configuring the injector. As opposed to AMD or require.js modules, Angular mo solve the problem of script load ordering or lazy script fetching. These goals are totally independent and both module systems can live side by side and fulfil their goals. +## Template + +The `$route` service is usually used in conjunction with the {@link ngRoute.directive:ngView +ngView} directive. The role of the `ngView` directive is to include the view template for the current +route into the layout template. This makes it a perfect fit for our `index.html` template. + +
      +**Note:** Starting with AngularJS version 1.2, `ngRoute` is in its own module and must be loaded by +loading the additional `angular-route.js` file, which we download via Bower above. +
      + +__`app/index.html`:__ + +```html + + + +... + + + + + + + +
      + + + +``` + +We have added to extra ` - - - - - - -
      - - - -``` - -Note that we removed most of the code in the `index.html` template and replaced it with a single -line containing a div with the `ng-view` attribute. The code that we removed was placed into the -`phone-list.html` template: - -__`app/partials/phone-list.html`:__ - -```html -
      -
      -
      - - - Search: - Sort by: - - -
      -
      - - - - -
      -
      -
      -``` - -
      -TODO! - -
      - -We also added a placeholder template for the phone details view: - -__`app/partials/phone-detail.html`:__ - -```html -TBD: detail view for {{phoneId}} -``` - -Note how we are using `phoneId` model defined in the `PhoneDetailCtrl` controller. ## Test @@ -307,3 +328,6 @@ step 8} to implement the phone details view.
        + + +[bower]: http://bower.io \ No newline at end of file diff --git a/docs/content/tutorial/step_08.ngdoc b/docs/content/tutorial/step_08.ngdoc index cb42d1643e31..3df3a30e61c2 100644 --- a/docs/content/tutorial/step_08.ngdoc +++ b/docs/content/tutorial/step_08.ngdoc @@ -9,17 +9,14 @@ In this step, you will implement the phone details view, which is displayed when a user clicks on a phone in the phone list. - -
        - - -Now when you click on a phone on the list, the phone details page with phone-specific information +* 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 will use {@link ng.$http $http} to fetch -our data, and we'll flesh out the `phone-detail.html` view template. +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. + +
        -The most important changes are listed below. You can see the full diff on [GitHub](https://github.com/angular/angular-phonecat/compare/step-7...step-8): ## Data @@ -153,7 +150,7 @@ __`test/unit/controllersSpec.js`:__ You should now see the following output in the Karma tab: - Chrome 22.0: Executed 3 of 3 SUCCESS (0.039 secs / 0.012 secs) +
        Chrome 22.0: Executed 3 of 3 SUCCESS (0.039 secs / 0.012 secs)
        We also added a new end-to-end test that navigates to the Nexus S detail page and verifies that the diff --git a/docs/content/tutorial/step_09.ngdoc b/docs/content/tutorial/step_09.ngdoc index a3c6c6adabcf..c6df1f9a246f 100644 --- a/docs/content/tutorial/step_09.ngdoc +++ b/docs/content/tutorial/step_09.ngdoc @@ -5,20 +5,13 @@
          - In this step you will learn how to create your own custom display filter. - -
          - - -Navigate to one of the detail pages. - -In the previous step, the details page displayed either "true" or "false" to indicate whether +* In the previous step, the details page displayed either "true" or "false" to indicate whether certain phone features were present or not. We have used a custom filter to convert those text strings into glyphs: ✓ for "true", and ✘ for "false". Let's see what the filter code looks like. -The most important changes are listed below. You can see the full diff on [GitHub](https://github.com/angular/angular-phonecat/compare/step-8...step-9): +
          ## Custom Filter @@ -118,7 +111,7 @@ access to the filter that we want to test. See {@link angular.mock.inject angul You should now see the following output in the Karma tab: - Chrome 22.0: Executed 4 of 4 SUCCESS (0.034 secs / 0.012 secs) +
          Chrome 22.0: Executed 4 of 4 SUCCESS (0.034 secs / 0.012 secs)
          # Experiments @@ -131,9 +124,11 @@ following bindings to `index.html`: * `{{ 1304375948024 | date:"MM/dd/yyyy @ h:mma" }}` * We can also create a model with an input element, and combine it with a filtered binding. Add -the following to index.html: + the following to index.html: - Uppercased: {{ userInput | uppercase }} + ```html + Uppercased: {{ userInput | uppercase }} + ``` # Summary diff --git a/docs/content/tutorial/step_10.ngdoc b/docs/content/tutorial/step_10.ngdoc index 7d04eb3a3c8e..ec96f92f7509 100644 --- a/docs/content/tutorial/step_10.ngdoc +++ b/docs/content/tutorial/step_10.ngdoc @@ -8,16 +8,11 @@ In this step, you will add a clickable phone image swapper to the phone details page. - -
          - - -The phone details view displays one large image of the current phone and several smaller thumbnail +* The phone details view displays one large image of the current phone and several smaller thumbnail images. It would be great if we could replace the large image with any of the thumbnails just by clicking on the desired thumbnail image. Let's have a look at how we can do this with Angular. -The most important changes are listed below. You can see the full diff on [GitHub](https://github.com/angular/angular-phonecat/compare/step-9...step-10): - +
          ## Controller diff --git a/docs/content/tutorial/step_11.ngdoc b/docs/content/tutorial/step_11.ngdoc index e85092c2580c..2cae0e1874ae 100644 --- a/docs/content/tutorial/step_11.ngdoc +++ b/docs/content/tutorial/step_11.ngdoc @@ -6,37 +6,72 @@
            -In this step, you will improve the way our app fetches data. +In this step, you will change the way our app fetches data. + +* We defined a custom service that represents a [RESTful][restful] client. Using this client we +can make requests to the server for data in an easier way, without having to deal with the +lower-level {@link ng.$http $http} API, HTTP methods and URLs.
            +## Dependencies + +The RESTful functionality is provided by Angular in the `ngResource` module, which is distributed +separately from the core Angular framework. + +We are using [Bower][bower] to install client side dependencies. This step updates the +`bower.json` configuration file to include the new dependency: + +``` +{ + "name": "angular-seed", + "description": "A starter project for AngularJS", + "version": "0.0.0", + "homepage": "https://github.com/angular/angular-seed", + "license": "MIT", + "private": true, + "dependencies": { + "angular": "1.2.x", + "angular-mocks": "~1.2.15", + "bootstrap": "~3.1.1", + "angular-route": "~1.2.15", + "angular-resource": "~1.2.15" + } +} +``` + +The new dependency `"angular-resource": "~1.2.15"` tells bower to install a version of the +angular-resource component that is compatible with version 1.2.15. We must tell bower to download +and install this dependency. -The next improvement we will make to our app is to define a custom service that represents a [RESTful](http://en.wikipedia.org/wiki/Representational_State_Transfer) client. Using this client we -can make XHR requests for data in an easier way, without having to deal with the lower-level {@link -ng.$http $http} API, HTTP methods and URLs. +If you have bower installed globally then you can run `bower install` but for this project we have +preconfigured npm to run bower install for us: -The most important changes are listed below. You can see the full diff on [GitHub](https://github.com/angular/angular-phonecat/compare/step-10...step-11): +``` +npm install +``` ## Template -The custom service is defined in `app/js/services.js` so we need to include this file in our layout -template. Additionally, we also need to load the `angular-resource.js` file, which contains the -{@link api/ngResource ngResource} module and in it the {@link api/ngResource.$resource $resource} -service, that we'll soon use: +Our custom resource service will be defined in `app/js/services.js` so we need to include this file +in our layout template. Additionally, we also need to load the `angular-resource.js` file, which +contains the {@link api/ngResource ngResource} module: __`app/index.html`.__ ```html ... + - ... ``` ## Service +We create our own service to provide access to the phone data on the server: + __`app/js/services.js`.__ ```js @@ -52,13 +87,12 @@ phonecatServices.factory('Phone', ['$resource', We used the module API to register a custom service using a factory function. We passed in the name of the service - 'Phone' - and the factory function. The factory function is similar to a -controller's constructor in that both can declare dependencies via function arguments. The Phone -service declared a dependency on the `$resource` service. +controller's constructor in that both can declare dependencies to be injected via function +arguments. The Phone service declared a dependency on the `$resource` service. The {@link ngResource.$resource `$resource`} service makes it easy to create a -[RESTful](http://en.wikipedia.org/wiki/Representational_State_Transfer) client with just a few -lines of code. This client can then be used in our application, instead of the lower-level {@link -ng.$http $http} service. +[RESTful][restful] client with just a few lines of code. This client can then be used in our +application, instead of the lower-level {@link ng.$http $http} service. __`app/js/app.js`.__ @@ -135,8 +169,8 @@ service correctly. The {@link ngResource.$resource $resource} service augments the response object with methods for updating and deleting the resource. If we were to use the standard `toEqual` matcher, our tests would fail because the test values would not match the responses exactly. To -solve the problem, we use a newly-defined `toEqualData` [Jasmine matcher](https://github.com/pivotal/jasmine/wiki/Matchers). When the -`toEqualData` matcher compares two objects, it takes only object properties into account and +solve the problem, we use a newly-defined `toEqualData` [Jasmine matcher][jasmine-matchers]. When +the `toEqualData` matcher compares two objects, it takes only object properties into account and ignores methods. @@ -217,7 +251,7 @@ describe('PhoneCat controllers', function() { You should now see the following output in the Karma tab: - Chrome 22.0: Executed 4 of 4 SUCCESS (0.038 secs / 0.01 secs) +
            Chrome 22.0: Executed 4 of 4 SUCCESS (0.038 secs / 0.01 secs)
            # Summary @@ -227,3 +261,6 @@ learn how to improve this application with animations.
              + +[restful]: http://en.wikipedia.org/wiki/Representational_State_Transfer +[jasmine-matchers]: https://github.com/pivotal/jasmine/wiki/Matchers \ No newline at end of file diff --git a/docs/content/tutorial/step_12.ngdoc b/docs/content/tutorial/step_12.ngdoc index 060c7d0d3f2a..10e0a8fe9b23 100644 --- a/docs/content/tutorial/step_12.ngdoc +++ b/docs/content/tutorial/step_12.ngdoc @@ -9,22 +9,57 @@ In this final step, we will enhance our phonecat web application by attaching CSS and JavaScript animations on top of the template code we created before. +* Used the `ngAnimate` to enable animations throughout the application. +* Common `ng` directives automatically trigger hooks for animations to tap into. +* When an animation is found then the animation will run in between the standard DOM operation that + is being issued on the element at the given time (e.g. inserting and removing nodes on + {@link api/ng.directive:ngRepeat `ngRepeat`} or adding and removing classes on + {@link api/ng.directive:ngClass `ngClass`}).
              +## Dependencies -Now that everything is set in place for a fully functional web application, we can attach CSS and JavaScript -animations to common directives that are used to render our application. AngularJS comes bundled with an -additional JavaScript file called `angular-animate.js` which, when included into the website and set as -a dependency with the application module, will enable animations throughout the application. +The animation functionality is provided by Angular in the `ngAnimate` module, which is distributed +separately from the core Angular framework. In addition we will use `JQuery` in this project to do +extra JavaScript animations. -Common `ng` directives automatically trigger hooks for animations to tap into. When an animation is found -then the animation will run in between the standard DOM operation that is being issued on the element at -the given time (e.g. inserting and removing nodes on {@link api/ng.directive:ngRepeat `ngRepeat`} or adding -and removing classes on {@link api/ng.directive:ngClass `ngClass`}). +We are using [Bower][bower] to install client side dependencies. This step updates the +`bower.json` configuration file to include the new dependency: -The most important changes are listed below. You can see the full diff on -[GitHub](https://github.com/angular/angular-phonecat/compare/step-11...step-12): +``` +{ + "name": "angular-seed", + "description": "A starter project for AngularJS", + "version": "0.0.0", + "homepage": "https://github.com/angular/angular-seed", + "license": "MIT", + "private": true, + "dependencies": { + "angular": "1.2.x", + "angular-mocks": "~1.2.15", + "bootstrap": "~3.1.1", + "angular-route": "~1.2.15", + "angular-resource": "~1.2.15", + "jquery": "1.10.2", + "angular-animate": "~1.2.15" + } +} +``` + +* `"angular-animate": "~1.2.15"` tells bower to install a version of the +angular-animate component that is compatible with version 1.2.15. +* `"jquery": "1.10.2"` tells bower to install the 1.1.2 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. + +We must tell bower to download and install these dependencies. If you have bower installed globally +then you can run `bower install` but for this project we have preconfigured npm to run bower install +for us: + +``` +npm install +``` ## How Animations work with `ngAnimate` @@ -46,17 +81,22 @@ __`app/index.html`.__ ```html ... + + + + ... + - + + + ... - + - - ... ``` From 4d9efa2f765528a97223a67f60eac7fec65bf77d Mon Sep 17 00:00:00 2001 From: Choi YoonSung Date: Tue, 1 Apr 2014 07:47:51 +0900 Subject: [PATCH 209/837] docs(tutorial/step-8): module must be loaded in test Closes #6930 --- docs/content/tutorial/step_08.ngdoc | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/docs/content/tutorial/step_08.ngdoc b/docs/content/tutorial/step_08.ngdoc index 3df3a30e61c2..b5d36e79ca99 100644 --- a/docs/content/tutorial/step_08.ngdoc +++ b/docs/content/tutorial/step_08.ngdoc @@ -124,7 +124,11 @@ step 5. __`test/unit/controllersSpec.js`:__ ```js -... + + beforeEach(module('phonecatApp')); + + ... + describe('PhoneDetailCtrl', function(){ var scope, $httpBackend, ctrl; From 34d0740350a50ff2c3a076eaad1e8122283448c3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Matias=20Niemel=C3=A4?= Date: Wed, 2 Apr 2014 23:57:28 -0400 Subject: [PATCH 210/837] fix($animate): ensure class-based animations always perform a domOperation if skipped Closes #6957 --- src/ngAnimate/animate.js | 1 + test/ngAnimate/animateSpec.js | 42 +++++++++++++++++++++++++++++++++++ 2 files changed, 43 insertions(+) diff --git a/src/ngAnimate/animate.js b/src/ngAnimate/animate.js index 080a58f9b197..80544fc0f99d 100644 --- a/src/ngAnimate/animate.js +++ b/src/ngAnimate/animate.js @@ -849,6 +849,7 @@ angular.module('ngAnimate', ['ng']) } if(skipAnimation) { + fireDOMOperation(); fireBeforeCallbackAsync(); fireAfterCallbackAsync(); fireDoneCallbackAsync(); diff --git a/test/ngAnimate/animateSpec.js b/test/ngAnimate/animateSpec.js index b94f92b74da6..e18496bd8fa6 100644 --- a/test/ngAnimate/animateSpec.js +++ b/test/ngAnimate/animateSpec.js @@ -3014,6 +3014,48 @@ describe("ngAnimate", function() { expect(element.hasClass('red')).toBe(true); })); + it("should properly add and remove CSS classes when multiple classes are applied", + inject(function($compile, $rootScope, $animate) { + + $animate.enabled(); + + var exp = "{{ className ? 'before ' + className + ' after' : '' }}"; + var element = $compile('
              ')($rootScope); + $rootElement.append(element); + jqLite($document[0].body).append($rootElement); + + function assertClasses(str) { + var className = element.attr('class'); + str.length == 0 + ? className.length == 0 + : expect(className.split(/\s+/)).toEqual(str.split(' ')); + } + + $rootScope.className = ''; + $rootScope.$digest(); + $animate.triggerReflow(); + + assertClasses(''); + + $rootScope.className = 'one'; + $rootScope.$digest(); + $animate.triggerReflow(); + + assertClasses('before one after'); + + $rootScope.className = 'two'; + $rootScope.$digest(); + $animate.triggerReflow(); + + assertClasses('before after two'); + + $rootScope.className = ''; + $rootScope.$digest(); + //intentionally avoiding the triggerReflow operation + + assertClasses(''); + })); + it("should avoid mixing up substring classes during add and remove operations", function() { var currentAnimation, currentFn; module(function($animateProvider) { From 9682bd0c4ed6a1d544c3734f5287f30dc9dde842 Mon Sep 17 00:00:00 2001 From: Yiling Lu Date: Thu, 3 Apr 2014 16:50:01 -0700 Subject: [PATCH 211/837] docs(guide/tutorial): make added assertion one which will actually work. Update the by.binding usage to make the test case work. Closes #6987 --- docs/content/tutorial/step_03.ngdoc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/content/tutorial/step_03.ngdoc b/docs/content/tutorial/step_03.ngdoc index 1348aefbcbae..d3148fac4a1f 100644 --- a/docs/content/tutorial/step_03.ngdoc +++ b/docs/content/tutorial/step_03.ngdoc @@ -179,7 +179,7 @@ ngBindTemplate} directives, which are invisible to the user while the page is lo expect(statusElement.getText()).toMatch(/Current filter: nexus\s*$/); //alternative version of the last assertion that tests just the value of the binding - expect(statusElement.element(by.binding('query'))).toBe('nexus'); + expect(element(by.binding('query')).getText()).toMatch(/Current filter: nexus\s*$/); }); ``` From d53a787f0d0d5aacb65ef98c9e819e148287ab2c Mon Sep 17 00:00:00 2001 From: Yiling Lu Date: Thu, 3 Apr 2014 16:18:33 -0700 Subject: [PATCH 212/837] docs(tutorial): change regexp so that assertion works Need to remove this single space for the regex to work here. Apparently `getText()` is trimming the text content or something, because there is no good reason why that space should not be there. Closes #6985 --- docs/content/tutorial/step_03.ngdoc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/content/tutorial/step_03.ngdoc b/docs/content/tutorial/step_03.ngdoc index d3148fac4a1f..0dd3473ca248 100644 --- a/docs/content/tutorial/step_03.ngdoc +++ b/docs/content/tutorial/step_03.ngdoc @@ -172,7 +172,7 @@ ngBindTemplate} directives, which are invisible to the user while the page is lo it('should display the current filter value within an element with id "status"', function() { var statusElement = element(by.id('status')); - expect(statusElement.getText()).toMatch(/Current filter: \s*$/); + expect(statusElement.getText()).toMatch(/Current filter:\s*$/); element(by.model('query')).sendKeys('nexus'); From a97a172ee9f9bcff4d4d84854ded0c72fa0f7e9a Mon Sep 17 00:00:00 2001 From: Caitlin Potter Date: Sat, 5 Apr 2014 08:58:16 -0400 Subject: [PATCH 213/837] fix($compile): fix regression which affected old jQuery releases ddb8081 and 4ea57e7 removed the calls which trimmed leading and trailing whitespace from templates in the HTML compiler. This broke old versions of jQuery (such as 1.9.1), which do not trim whitespace in their constructors. Naturally, this would not appear in the jQuery tests, as we are testing against a version which does trim whitespace in the constructor. This fix re-adds calls to `trim()` when compiling templates in $compile, in order to avoid breaking old versions of jQuery. --- src/ng/compile.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/ng/compile.js b/src/ng/compile.js index bb2179a3fbd6..71c7b89158eb 100644 --- a/src/ng/compile.js +++ b/src/ng/compile.js @@ -1258,7 +1258,7 @@ function $CompileProvider($provide, $$sanitizeUriProvider) { if (jqLiteIsTextNode(directiveValue)) { $template = []; } else { - $template = jqLite(directiveValue); + $template = jqLite(trim(directiveValue)); } compileNode = $template[0]; @@ -1685,7 +1685,7 @@ function $CompileProvider($provide, $$sanitizeUriProvider) { if (jqLiteIsTextNode(content)) { $template = []; } else { - $template = jqLite(content); + $template = jqLite(trim(content)); } compileNode = $template[0]; From d7615351df14375f7ad4078ee81edfde66e32e90 Mon Sep 17 00:00:00 2001 From: Yiling Lu Date: Sat, 5 Apr 2014 00:03:17 -0700 Subject: [PATCH 214/837] docs(tutorial): fix links to bower in Step 11 Minor change: add missing bower reference link. Closes #7005 --- docs/content/tutorial/step_11.ngdoc | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/docs/content/tutorial/step_11.ngdoc b/docs/content/tutorial/step_11.ngdoc index 2cae0e1874ae..f54acb643c1f 100644 --- a/docs/content/tutorial/step_11.ngdoc +++ b/docs/content/tutorial/step_11.ngdoc @@ -263,4 +263,5 @@ learn how to improve this application with animations.
                [restful]: http://en.wikipedia.org/wiki/Representational_State_Transfer -[jasmine-matchers]: https://github.com/pivotal/jasmine/wiki/Matchers \ No newline at end of file +[jasmine-matchers]: https://github.com/pivotal/jasmine/wiki/Matchers +[bower]: http://bower.io/ From 291684c29c5694650ddf9ff8bf616f6831f02b6f Mon Sep 17 00:00:00 2001 From: Jason Carver Date: Fri, 4 Apr 2014 22:27:16 -0700 Subject: [PATCH 215/837] docs(CONTRIBUTING.md): typo fix "submitting and issue" should be "submitting an issue" Closes #7002 --- CONTRIBUTING.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 1ed73085a47d..9ddc3c5fea08 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -23,7 +23,7 @@ discussion list or [StackOverflow][stackoverflow]. We are also available on [IRC ## Found an Issue? If you find a bug in the source code or a mistake in the documentation, you can help us by -submitting and issue to our [GitHub Repository][github]. Even better you can submit a Pull Request +submitting an issue to our [GitHub Repository][github]. Even better you can submit a Pull Request with a fix. ***Localization Issue:*** *Angular.js uses the [Google Closure I18N library], to generate its own I18N files. This means that From c3ec6ea2264ffb641e2f6f5371af4ef289cfe812 Mon Sep 17 00:00:00 2001 From: martco Date: Fri, 28 Mar 2014 11:49:36 -0500 Subject: [PATCH 216/837] docs(guide/directive): grammatical fixup The 'to' in 'end-to-end' is directional, not numeric Closes #6895 --- docs/content/guide/directive.ngdoc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/content/guide/directive.ngdoc b/docs/content/guide/directive.ngdoc index e757589bd42d..84ef53470076 100644 --- a/docs/content/guide/directive.ngdoc +++ b/docs/content/guide/directive.ngdoc @@ -537,7 +537,7 @@ where: 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 to call a handler on a regular basis. This is easier than using `$timeout` but also works better with -end 2 end testing, where we want to ensure that all $timeouts have completed before completing the test. +end-to-end testing, where we want to ensure that all $timeouts have completed before completing the test. We also want to remove the `$interval` if the directive is deleted so we don't introduce a memory leak. From 369145467ca0e152f4a2d42b1efd0fb002d6a38f Mon Sep 17 00:00:00 2001 From: Thiago Colares Date: Sat, 5 Apr 2014 14:32:01 -0300 Subject: [PATCH 217/837] docs(tutorial): added a link to Wiki page on DI in Step 7 This article is fantastic and really helped on understanding how DI works on Angular. It may be useful to other beginners -- because, at first glance, this topic (DI on Angular) ended a little bit hazy for me. Closes #7010 --- docs/content/tutorial/step_07.ngdoc | 3 +++ 1 file changed, 3 insertions(+) diff --git a/docs/content/tutorial/step_07.ngdoc b/docs/content/tutorial/step_07.ngdoc index 8ccc15022460..5906e23f0527 100644 --- a/docs/content/tutorial/step_07.ngdoc +++ b/docs/content/tutorial/step_07.ngdoc @@ -98,6 +98,9 @@ of configuring the injector. As opposed to AMD or require.js modules, Angular mo solve the problem of script load ordering or lazy script fetching. These goals are totally independent and both module systems can live side by side and fulfil their goals. +For deepen your understanding of DI on Angular, see +[Understanding Dependency Injection](https://github.com/angular/angular.js/wiki/Understanding-Dependency-Injection). + ## Template The `$route` service is usually used in conjunction with the {@link ngRoute.directive:ngView From c352b92c4037c5de3fd404e0f68bea51fab009a8 Mon Sep 17 00:00:00 2001 From: Peter Bacon Darwin Date: Sun, 6 Apr 2014 14:56:45 +0100 Subject: [PATCH 218/837] docs(tutorial/step-7): clarify the new files & modules Closes #6996 --- docs/content/tutorial/step_07.ngdoc | 71 ++++++++++++++++++----------- 1 file changed, 45 insertions(+), 26 deletions(-) diff --git a/docs/content/tutorial/step_07.ngdoc b/docs/content/tutorial/step_07.ngdoc index 5906e23f0527..0f3d57aa2dc9 100644 --- a/docs/content/tutorial/step_07.ngdoc +++ b/docs/content/tutorial/step_07.ngdoc @@ -11,7 +11,8 @@ multiple views by adding routing, using an Angular module called 'ngRoute'. * When you now navigate to `app/index.html`, you are redirected to `app/index.html#/phones` and the phone list appears in the browser. -* When you click on a phone link the stub of a phone detail page is displayed. +* When you click on a phone link the url changes to one specific to that phone and the stub of a + phone detail page is displayed.
                @@ -132,11 +133,11 @@ __`app/index.html`:__ ``` -We have added to extra ` + From 85ea376da25aa802b62f863fd6c8dfa03b48b3f1 Mon Sep 17 00:00:00 2001 From: nnennajohn Date: Tue, 22 Apr 2014 09:10:36 -0700 Subject: [PATCH 260/837] docs(tutorial/index): add directions for installing bower --- docs/content/tutorial/index.ngdoc | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/docs/content/tutorial/index.ngdoc b/docs/content/tutorial/index.ngdoc index 95c697cce06c..8e70b32ccb37 100644 --- a/docs/content/tutorial/index.ngdoc +++ b/docs/content/tutorial/index.ngdoc @@ -112,7 +112,12 @@ node --version . -Once you have Node.js installed on your machine you can download the tool dependencies by running: +To install bower: +``` +npm install -g bower +``` + +Once you have Node.js and Bower installed on your machine you can download the tool dependencies by running: ``` npm install From e7e56fe9bf3526cebcc5b72060ecae83439681e0 Mon Sep 17 00:00:00 2001 From: Caitlin Potter Date: Tue, 22 Apr 2014 01:05:34 -0400 Subject: [PATCH 261/837] chore(package.json): remove dependencies which are no longer required Based on https://github.com/angular/angular.js/issues/3244#issuecomment-41003086, I don't believe we actually use either of these now that dgeni has replaced the old docs app. These should be removed if Travis is green. The i18n scripts still rely on q, so unfortunately it can't be gotten rid of just yet. --- package.json | 2 -- 1 file changed, 2 deletions(-) diff --git a/package.json b/package.json index 9790ce0f9f0b..fff783637012 100644 --- a/package.json +++ b/package.json @@ -23,8 +23,6 @@ "bower": "~1.2.2", "jasmine-node": "~1.11.0", "q": "~1.0.0", - "q-io": "~1.10.6", - "qq": "~0.3.5", "shelljs": "~0.2.6", "karma": "^0.12.0", "karma-jasmine": "0.1.5", From 9ab9bf6b415aa216cfbfda040286e5ec99f56ee0 Mon Sep 17 00:00:00 2001 From: James deBoer Date: Sun, 20 Apr 2014 08:24:01 -0700 Subject: [PATCH 262/837] perf(scope): 10x. Share the child scope class. This change causes Scope.$destory to run 10x faster. I suspect Scope.$new is significantly faster as well, but I didn't measure it. --- src/ng/rootScope.js | 23 ++++++++++++++--------- 1 file changed, 14 insertions(+), 9 deletions(-) diff --git a/src/ng/rootScope.js b/src/ng/rootScope.js index e7bdc4142923..fec86749eef3 100644 --- a/src/ng/rootScope.js +++ b/src/ng/rootScope.js @@ -181,18 +181,23 @@ function $RootScopeProvider(){ child.$$asyncQueue = this.$$asyncQueue; child.$$postDigestQueue = this.$$postDigestQueue; } else { - ChildScope = function() {}; // should be anonymous; This is so that when the minifier munges - // the name it does not become random set of chars. This will then show up as class - // name in the web inspector. - ChildScope.prototype = this; - child = new ChildScope(); - child.$id = nextUid(); + // Only create a child scope class if somebody asks for one, + // but cache it to allow the VM to optimize lookups. + if (!this.$$childScopeClass) { + this.$$childScopeClass = function() { + this.$$watchers = this.$$nextSibling = + this.$$childHead = this.$$childTail = null; + this.$$listeners = {}; + this.$$listenerCount = {}; + this.$id = nextUid(); + this.$$childScopeClass = null; + }; + this.$$childScopeClass.prototype = this; + } + child = new this.$$childScopeClass(); } child['this'] = child; - child.$$listeners = {}; - child.$$listenerCount = {}; child.$parent = this; - child.$$watchers = child.$$nextSibling = child.$$childHead = child.$$childTail = null; child.$$prevSibling = this.$$childTail; if (this.$$childHead) { this.$$childTail.$$nextSibling = child; From 6a26b2c38c9118800ba4c292b1ff59739b7240e9 Mon Sep 17 00:00:00 2001 From: Peter Bacon Darwin Date: Wed, 23 Apr 2014 11:57:14 +0100 Subject: [PATCH 263/837] chore(clean-shrinkwrap): chokidar is now fixed at v0.8.2 --- scripts/clean-shrinkwrap.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/clean-shrinkwrap.js b/scripts/clean-shrinkwrap.js index f3d6ebe587a1..66326f4f2fca 100755 --- a/scripts/clean-shrinkwrap.js +++ b/scripts/clean-shrinkwrap.js @@ -23,7 +23,7 @@ function cleanModule(module, name) { if (name === 'chokidar') { if (module.version === '0.8.1') { delete module.dependencies; - } else { + } else if ( module.version !== '0.8.2') { throw new Error("Unfamiliar chokidar version (v" + module.version + ") , please check status of https://github.com/paulmillr/chokidar/pull/106"); } From 1362a9b456086335b35045e9c85686e73fc55131 Mon Sep 17 00:00:00 2001 From: Peter Bacon Darwin Date: Wed, 23 Apr 2014 11:59:18 +0100 Subject: [PATCH 264/837] chore(npm-shrinkwrap): update dependencies Dgeni-packages is updated to v0.8.3 to fix a bug in the docs (#7184) Karma is updated to get us the fixed version of chokidar (v0.8.2) Closes #7184 --- npm-shrinkwrap.json | 83 +++++++++++++++++++++++++++++++-------------- 1 file changed, 58 insertions(+), 25 deletions(-) diff --git a/npm-shrinkwrap.json b/npm-shrinkwrap.json index bae3fdb36b62..c7b264acd30f 100644 --- a/npm-shrinkwrap.json +++ b/npm-shrinkwrap.json @@ -524,13 +524,13 @@ } }, "dgeni-packages": { - "version": "0.8.2", + "version": "0.8.3", "dependencies": { "lodash": { "version": "2.4.1" }, "graceful-fs": { - "version": "2.0.2" + "version": "2.0.3" }, "glob": { "version": "3.2.9", @@ -552,7 +552,7 @@ } }, "nunjucks": { - "version": "1.0.1", + "version": "1.0.4", "dependencies": { "optimist": { "version": "0.6.1", @@ -564,14 +564,30 @@ "version": "0.0.8" } } + }, + "chokidar": { + "version": "0.8.2", + "dependencies": { + "fsevents": { + "version": "0.2.0", + "dependencies": { + "nan": { + "version": "0.8.0" + } + } + }, + "recursive-readdir": { + "version": "0.0.2" + } + } } } }, "catharsis": { - "version": "0.7.0" + "version": "0.7.1" }, "esprima": { - "version": "1.0.4" + "version": "1.1.1" } } }, @@ -865,7 +881,7 @@ }, "grunt-jasmine-node": { "version": "0.1.0", - "from": "git://github.com/vojtajina/grunt-jasmine-node.git#fix-grunt-exit-code", + "from": "grunt-jasmine-node@git://github.com/vojtajina/grunt-jasmine-node.git#ced17cbe52c1412b2ada53160432a5b681f37cd7", "resolved": "git://github.com/vojtajina/grunt-jasmine-node.git#ced17cbe52c1412b2ada53160432a5b681f37cd7" }, "grunt-jscs-checker": { @@ -1969,7 +1985,7 @@ } }, "karma": { - "version": "0.12.0", + "version": "0.12.9", "dependencies": { "di": { "version": "0.0.1" @@ -2025,7 +2041,20 @@ } }, "chokidar": { - "version": "0.8.1" + "version": "0.8.2", + "dependencies": { + "fsevents": { + "version": "0.2.0", + "dependencies": { + "nan": { + "version": "0.8.0" + } + } + }, + "recursive-readdir": { + "version": "0.0.2" + } + } }, "glob": { "version": "3.2.9", @@ -2065,7 +2094,7 @@ "version": "0.3.2" }, "mkdirp": { - "version": "0.3.5" + "version": "0.4.0" }, "ncp": { "version": "0.4.2" @@ -2101,7 +2130,7 @@ "version": "1.2.11" }, "log4js": { - "version": "0.6.12", + "version": "0.6.14", "dependencies": { "async": { "version": "0.1.15" @@ -2110,17 +2139,26 @@ "version": "1.1.4" }, "readable-stream": { - "version": "1.0.26-2", + "version": "1.0.27-1", "dependencies": { + "core-util-is": { + "version": "1.0.1" + }, + "isarray": { + "version": "0.0.1" + }, "string_decoder": { "version": "0.10.25-1" + }, + "inherits": { + "version": "2.0.1" } } } } }, "useragent": { - "version": "2.0.7", + "version": "2.0.8", "dependencies": { "lru-cache": { "version": "2.2.4" @@ -2128,7 +2166,7 @@ } }, "graceful-fs": { - "version": "2.0.2" + "version": "2.0.3" }, "connect": { "version": "2.12.0", @@ -2169,7 +2207,7 @@ "version": "0.0.3" }, "debug": { - "version": "0.7.4" + "version": "0.8.0" }, "methods": { "version": "0.1.0" @@ -2184,16 +2222,19 @@ "version": "2.2.0", "dependencies": { "readable-stream": { - "version": "1.1.11", + "version": "1.1.13-1", "dependencies": { "core-util-is": { "version": "1.0.1" }, + "isarray": { + "version": "0.0.1" + }, "string_decoder": { "version": "0.10.25-1" }, - "debuglog": { - "version": "0.0.2" + "inherits": { + "version": "2.0.1" } } }, @@ -2695,14 +2736,6 @@ } } }, - "qq": { - "version": "0.3.5", - "dependencies": { - "q": { - "version": "0.8.4" - } - } - }, "rewire": { "version": "1.1.3" }, From 1b1f94d8fef29363dc1d8475f5165635f51c1911 Mon Sep 17 00:00:00 2001 From: Peter Bacon Darwin Date: Tue, 22 Apr 2014 12:35:07 +0100 Subject: [PATCH 265/837] docs(examples): use form POST to create Plunkers The previous solution for opening Plunkers from the docs relied on tight coupling between the docs site and the plunkr site, in particular the URL to the example code on the docs server was hard coded in the Plunker site. This change goes back to the old POST method of creating a Plunker, but with a subtle difference: In the very old docs, the content was injected directly into the example HTML at build time. This was easy enough to do as the example actually ran in the current page but also increased the size of the doc page. The new examples are run in completely separate iframes. This new version of showing a Plunker loads the file content for the Plunker from the server by accessing the example's manifest.json file using $http requests. This also has the additional benefit that you can now generate plunkers from examples that are running locally or, frankly, in any folder on any server, such as personal builds on the Jenkins CI server. Closes #7186 Closes #7198 --- docs/app/src/docs.js | 13 +- docs/app/src/examples.js | 292 +++--------------- docs/app/test/docsSpec.js | 1 + .../templates/runnableExample.template.html | 4 +- 4 files changed, 62 insertions(+), 248 deletions(-) diff --git a/docs/app/src/docs.js b/docs/app/src/docs.js index 5c6a76d4e29c..fc1a3e561544 100644 --- a/docs/app/src/docs.js +++ b/docs/app/src/docs.js @@ -1,9 +1,16 @@ angular.module('DocsController', []) -.controller('DocsController', function($scope, $rootScope, $location, $window, $cookies, NG_PAGES, NG_NAVIGATION, NG_VERSION) { +.controller('DocsController', [ + '$scope', '$rootScope', '$location', '$window', '$cookies', 'openPlunkr', + 'NG_PAGES', 'NG_NAVIGATION', 'NG_VERSION', + function($scope, $rootScope, $location, $window, $cookies, openPlunkr, + NG_PAGES, NG_NAVIGATION, NG_VERSION) { + + + $scope.openPlunkr = openPlunkr; $scope.docsVersion = NG_VERSION.isSnapshot ? 'snapshot' : NG_VERSION.version; - + $scope.fold = function(url) { if(url) { $scope.docs_fold = '/notes/' + url; @@ -120,4 +127,4 @@ angular.module('DocsController', []) }); } }); -}); +}]); diff --git a/docs/app/src/examples.js b/docs/app/src/examples.js index 0ad981c957ea..314905601ebf 100644 --- a/docs/app/src/examples.js +++ b/docs/app/src/examples.js @@ -1,65 +1,6 @@ angular.module('examples', []) -.directive('sourceEdit', function(getEmbeddedTemplate) { - return { - template: '
                ' + - '' + - ' Edit' + - '' + - '' + - '
                ', - scope: true, - controller: function($scope, $attrs, openJsFiddle, openPlunkr) { - var sources = { - module: $attrs.sourceEdit, - deps: read($attrs.sourceEditDeps), - html: read($attrs.sourceEditHtml), - css: read($attrs.sourceEditCss), - js: read($attrs.sourceEditJs), - json: read($attrs.sourceEditJson), - unit: read($attrs.sourceEditUnit), - scenario: read($attrs.sourceEditScenario) - }; - $scope.fiddle = function(e) { - e.stopPropagation(); - openJsFiddle(sources); - }; - $scope.plunkr = function(e) { - e.stopPropagation(); - openPlunkr(sources); - }; - } - }; - - function read(text) { - var files = []; - angular.forEach(text ? text.split(' ') : [], function(refId) { - // refId is index.html-343, so we need to strip the unique ID when exporting the name - files.push({name: refId.replace(/-\d+$/, ''), content: getEmbeddedTemplate(refId)}); - }); - return files; - } -}) - - -.factory('angularUrls', function($document) { - var urls = {}; - - angular.forEach($document.find('script'), function(script) { - var match = script.src.match(/^.*\/(angular[^\/]*\.js)$/); - if (match) { - urls[match[1].replace(/(\-\d.*)?(\.min)?\.js$/, '.js')] = match[0]; - } - }); - - return urls; -}) - - -.factory('formPostData', function($document) { +.factory('formPostData', ['$document', function($document) { return function(url, fields) { var form = angular.element(''); angular.forEach(fields, function(value, name) { @@ -71,196 +12,61 @@ angular.module('examples', []) form[0].submit(); form.remove(); }; -}) - +}]) -.factory('prepareDefaultAppModule', function() { - return function(content) { - var deps = []; - angular.forEach(content.deps, function(file) { - if(file.name == 'angular-animate.js') { - deps.push('ngAnimate'); - } - }); - - var moduleName = 'App'; - return { - module : moduleName, - script : "angular.module('" + moduleName + "', [" + - (deps.length ? "'" + deps.join("','") + "'" : "") + "]);\n\n" - }; - }; -}) -.factory('prepareEditorAssetTags', function(angularUrls) { - return function(content, options) { - options = options || {}; - var includeLocalFiles = options.includeLocalFiles; - var html = makeScriptTag(angularUrls['angular.js']); - - var allFiles = [].concat(content.js, content.css, content.html, content.json); - angular.forEach(content.deps, function(file) { - if (file.name !== 'angular.js') { - var isLocal = false; - for(var i=0;i\n'; - } - - function makeCssLinkTag(src) { - return '\n'; - } - }; -}) - - -.factory('openPlunkr', function(templateMerge, formPostData, prepareEditorAssetTags, prepareDefaultAppModule) { - return function(content) { - var hasRouting = false; - angular.forEach(content.deps, function(file) { - hasRouting = hasRouting || file.name == 'angular-route.js'; - }); - var indexHtmlContent = '\n' + - '\n' + - ' \n' + - '{{scriptDeps}}'; +.factory('openPlunkr', ['formPostData', '$http', '$q', function(formPostData, $http, $q) { + return function(exampleFolder) { - if(hasRouting) { - indexHtmlContent += '\n'; - } + var exampleName = 'AngularJS Example'; - indexHtmlContent += '\n' + - ' \n\n' + - '{{indexContents}}\n\n' + - ' \n' + - '\n'; + // Load the manifest for the example + $http.get(exampleFolder + '/manifest.json') + .then(function(response) { + return response.data; + }) + .then(function(manifest) { + var filePromises = []; - indexProp = { - module: content.module, - scriptDeps: prepareEditorAssetTags(content, { includeLocalFiles : true }), - indexContents: content.html[0].content - }; - - var allFiles = [].concat(content.js, content.css, content.html, content.json); - - if(!content.module) { - var moduleData = prepareDefaultAppModule(content); - indexProp.module = moduleData.module; - - var found = false; - angular.forEach(content.js, function(file) { - if(file.name == 'script.js') { - file.content = moduleData.script + file.content; - found = true; - } - }); - if(!found) { - indexProp.scriptDeps += '\n'; - allFiles.push({ - name : 'script.js', - content : moduleData.script + // Build a pretty title for the Plunkr + var exampleNameParts = manifest.name.split('-'); + exampleNameParts.unshift('AngularJS'); + angular.forEach(exampleNameParts, function(part, index) { + exampleNameParts[index] = part.charAt(0).toUpperCase() + part.substr(1); }); - } - } - - var postData = {}; - - angular.forEach(allFiles, function(file, index) { - if (file.content && file.name != 'index.html') { - postData['files[' + file.name + ']'] = file.content; - } - }); - - postData['files[index.html]'] = templateMerge(indexHtmlContent, indexProp); - postData['tags[]'] = "angularjs"; - - postData.private = true; - postData.description = 'AngularJS Example Plunkr'; - - formPostData('http://plnkr.co/edit/?p=preview', postData); - }; -}) - -.factory('openJsFiddle', function(templateMerge, formPostData, prepareEditorAssetTags, prepareDefaultAppModule) { - var HTML = '
                \n{{html:2}}
                ', - CSS = ' \n' + - '{{head:0}}');"; + js = "!window.angular.$$csp() && window.angular.element(document).find('head').prepend('');"; state.js.push(js); return state; From 9599234baefc941d4e4beb7bd0ac9bd8a9d10104 Mon Sep 17 00:00:00 2001 From: marcin-wosinek Date: Wed, 23 Apr 2014 11:51:31 +0200 Subject: [PATCH 277/837] docs(select): improve naming of `c` variable in example It was felt that `c` did not make it clear what the variable held. This has been changed to `color` to match the ng-repeat expression above. In turn the model value has been changed to `myColor` to prevent a name collision. Closes #7210 --- src/ng/directive/select.js | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/src/ng/directive/select.js b/src/ng/directive/select.js index 628d21776b85..dec7cf3a9fbc 100644 --- a/src/ng/directive/select.js +++ b/src/ng/directive/select.js @@ -83,7 +83,7 @@ var ngOptionsMinErr = minErr('ngOptions'); {name:'blue', shade:'dark'}, {name:'yellow', shade:'light'} ]; - $scope.color = $scope.colors[2]; // red + $scope.myColor = $scope.colors[2]; // red }
                @@ -98,37 +98,37 @@ var ngOptionsMinErr = minErr('ngOptions');
                Color (null not allowed): -
                +
                Color (null allowed): -
                Color grouped by shade: -
                - Select bogus.
                + Select bogus.

                - Currently selected: {{ {selected_color:color} }} + Currently selected: {{ {selected_color:myColor} }}
                + ng-style="{'background-color':myColor.name}">
                it('should check ng-options', function() { - expect(element(by.binding('{selected_color:color}')).getText()).toMatch('red'); - element.all(by.select('color')).first().click(); - element.all(by.css('select[ng-model="color"] option')).first().click(); - expect(element(by.binding('{selected_color:color}')).getText()).toMatch('black'); - element(by.css('.nullable select[ng-model="color"]')).click(); - element.all(by.css('.nullable select[ng-model="color"] option')).first().click(); - expect(element(by.binding('{selected_color:color}')).getText()).toMatch('null'); + expect(element(by.binding('{selected_color:myColor}')).getText()).toMatch('red'); + element.all(by.select('myColor')).first().click(); + element.all(by.css('select[ng-model="myColor"] option')).first().click(); + expect(element(by.binding('{selected_color:myColor}')).getText()).toMatch('black'); + element(by.css('.nullable select[ng-model="myColor"]')).click(); + element.all(by.css('.nullable select[ng-model="myColor"] option')).first().click(); + expect(element(by.binding('{selected_color:myColor}')).getText()).toMatch('null'); });
                From 0069f87007df892514fa747a1fc7504327047551 Mon Sep 17 00:00:00 2001 From: Thomas Tuts Date: Sun, 15 Dec 2013 00:18:44 +0100 Subject: [PATCH 278/837] docs(guide/unit-testing): remove unwanted whitespaces Closes #5395 --- docs/content/guide/unit-testing.ngdoc | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/content/guide/unit-testing.ngdoc b/docs/content/guide/unit-testing.ngdoc index 8cef719a8a9b..06d00cc749e4 100644 --- a/docs/content/guide/unit-testing.ngdoc +++ b/docs/content/guide/unit-testing.ngdoc @@ -65,7 +65,7 @@ function MyClass() { A problem surfaces in tests when we would like to instantiate a `MockXHR` that would allow us to return fake data and simulate network failures. By calling `new XHR()` we are -permanently bound to the actual XHR and there is no way to replace it. Yes, we could monkey +permanently bound to the actual XHR and there is no way to replace it. Yes, we could monkey patch, but that is a bad idea for many reasons which are outside the scope of this document. Here's an example of how the class above becomes hard to test when resorting to monkey patching: @@ -133,7 +133,7 @@ function MyClass() { However, where does the serviceRegistry come from? If it is: * `new`-ed up, the test has no chance to reset the services for testing. -* a global look-up then the service returned is global as well (but resetting is easier, since +* a global look-up then the service returned is global as well (but resetting is easier, since only one global variable exists to be reset). The class above is hard to test since we have to change the global state: @@ -296,7 +296,7 @@ Now we can add a directive to our app. app.directive('aGreatEye', function () { return { restrict: 'E', - replace: true, + replace: true, template: '

                lidless, wreathed in flame, {{1 + 1}} times

                ' }; }); From cfccb8f64a6ac7f8fe0095c89f21338a535606ad Mon Sep 17 00:00:00 2001 From: Ryan Hall Date: Mon, 16 Dec 2013 11:18:45 -0800 Subject: [PATCH 279/837] docs(orderBy): clarify how sorting is processed An API was passing me numbers as strings (ex. '8.25'), and I was noticing weird sorting behavior with `orderBy` because it was trying to sort the numbers alphabetically. Closes #5436 --- src/ng/filter/orderBy.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/ng/filter/orderBy.js b/src/ng/filter/orderBy.js index 27891835d17d..319950a1a8af 100644 --- a/src/ng/filter/orderBy.js +++ b/src/ng/filter/orderBy.js @@ -6,7 +6,9 @@ * @function * * @description - * Orders a specified `array` by the `expression` predicate. + * Orders a specified `array` by the `expression` predicate. It is ordered alphabetically + * for strings and numerically for numbers. Note: if you notice numbers are not being sorted + * correctly, make sure they are actually being saved as numbers and not strings. * * @param {Array} array The array to sort. * @param {function(*)|string|Array.<(function(*)|string)>} expression A predicate to be From 0cb276f7ac500ccdeacbaa93b49236edd5abfcb5 Mon Sep 17 00:00:00 2001 From: Edward Brey Date: Fri, 14 Feb 2014 20:52:26 -0600 Subject: [PATCH 280/837] docs(angular.Module): add link to `module.config()` docs Add a link on where to find more info about how to use `module.config()` Closes #6270 --- src/loader.js | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/loader.js b/src/loader.js index e20183f08007..61b55afe3ec8 100644 --- a/src/loader.js +++ b/src/loader.js @@ -266,6 +266,8 @@ function setupModuleLoader(window) { * configuration. * @description * Use this method to register work which needs to be performed on module loading. + * For more about how to configure services, see + * {@link providers#providers_provider-recipe Provider Recipe}. */ config: config, From ed18b8c9da147506c43d5b6d64985481ec46a943 Mon Sep 17 00:00:00 2001 From: Uri Goldshtein Date: Tue, 14 Jan 2014 16:28:54 +0200 Subject: [PATCH 281/837] docs(guide): add another analytics library --- docs/content/guide/index.ngdoc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/content/guide/index.ngdoc b/docs/content/guide/index.ngdoc index dfe32d9ba19c..98a46fc6c1a3 100644 --- a/docs/content/guide/index.ngdoc +++ b/docs/content/guide/index.ngdoc @@ -81,7 +81,7 @@ This is a short list of libraries with specific support and documentation for wo ### General * **Javascript minification: **[Background](http://thegreenpizza.github.io/2013/05/25/building-minification-safe-angular.js-applications/), [ngmin automation tool](http://www.thinkster.io/pick/XlWneEZCqY/angularjs-ngmin) -* **Tracking:** [Angularyitcs (Google Analytics)](http://ngmodules.org/modules/angularytics), [Logging Client-Side Errors](http://www.bennadel.com/blog/2542-Logging-Client-Side-Errors-With-AngularJS-And-Stacktrace-js.htm) +* **Analytics and Logging:** [Angularyitcs (Google Analytics)](http://ngmodules.org/modules/angularytics), [Angulartics (Analytics)](https://github.com/luisfarzati/angulartics), [Logging Client-Side Errors](http://www.bennadel.com/blog/2542-Logging-Client-Side-Errors-With-AngularJS-And-Stacktrace-js.htm) * **SEO:** [By hand](http://www.yearofmoo.com/2012/11/angularjs-and-seo.html), [prerender.io](http://prerender.io/), [Brombone](http://www.brombone.com/), [SEO.js](http://getseojs.com/), [SEO4Ajax](http://www.seo4ajax.com/) ### Server-Specific From c3fe170b8bbffbc6756cffd250da1d3428d3f9c0 Mon Sep 17 00:00:00 2001 From: Peter Bacon Darwin Date: Mon, 28 Apr 2014 22:18:46 +0100 Subject: [PATCH 282/837] docs(examples): don't attempt to convert example content from JSON There are some files in the examples that look like JSON and the default $http transformResponse handler was trying to convert these from strings to object. An example was the style.css file in the https://docs.angularjs.org/api/ng/type/ngModel.NgModelController docs. This commit fixes this by simply removing this transform when loading these files. --- docs/app/src/examples.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/app/src/examples.js b/docs/app/src/examples.js index 314905601ebf..ee762eba4093 100644 --- a/docs/app/src/examples.js +++ b/docs/app/src/examples.js @@ -37,7 +37,7 @@ angular.module('examples', []) exampleName = exampleNameParts.join(' - '); angular.forEach(manifest.files, function(filename) { - filePromises.push($http.get(exampleFolder + '/' + filename) + filePromises.push($http.get(exampleFolder + '/' + filename, { transformResponse: [] }) .then(function(response) { // The manifests provide the production index file but Plunkr wants From 72421b2acfdfc186a754a81b10c341cc8dfe5145 Mon Sep 17 00:00:00 2001 From: Peter Bacon Darwin Date: Tue, 29 Apr 2014 12:33:20 +0100 Subject: [PATCH 283/837] docs(directives): remove line numbers from code blocks --- docs/app/assets/css/docs.css | 4 ---- docs/app/src/directives.js | 2 +- 2 files changed, 1 insertion(+), 5 deletions(-) diff --git a/docs/app/assets/css/docs.css b/docs/app/assets/css/docs.css index 8a645302bb39..7ba9a30d64d8 100644 --- a/docs/app/assets/css/docs.css +++ b/docs/app/assets/css/docs.css @@ -184,10 +184,6 @@ h1,h2,h3,h4,h5,h6 { } pre { - padding: 15px; - border: 1px solid #ddd; - border-radius: 5px; - display: block; white-space: pre-wrap; word-break: normal; } diff --git a/docs/app/src/directives.js b/docs/app/src/directives.js index 5c45d71557ae..1a876c12a564 100644 --- a/docs/app/src/directives.js +++ b/docs/app/src/directives.js @@ -21,7 +21,7 @@ angular.module('directives', []) restrict: 'E', terminal: true, compile: function(element) { - var linenums = element.hasClass('linenum') || element.parent()[0].nodeName === 'PRE'; + var linenums = element.hasClass('linenum');// || element.parent()[0].nodeName === 'PRE'; var match = /lang-(\S)+/.exec(element.className); var lang = match && match[1]; var html = element.html(); From 9321a5f14c27f77c1be466db9078ad0c52b4b996 Mon Sep 17 00:00:00 2001 From: Vojta Jina Date: Tue, 29 Apr 2014 13:24:22 +0200 Subject: [PATCH 284/837] chore(travis): update Chrome on SL to 34 For some reason, SL gives us Chrome 28 when no version is specified. --- karma-shared.conf.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/karma-shared.conf.js b/karma-shared.conf.js index e9a5a5e32b0c..dec897480a3e 100644 --- a/karma-shared.conf.js +++ b/karma-shared.conf.js @@ -32,7 +32,8 @@ module.exports = function(config, specificOptions) { customLaunchers: { 'SL_Chrome': { base: 'SauceLabs', - browserName: 'chrome' + browserName: 'chrome', + version: '34' }, 'SL_Firefox': { base: 'SauceLabs', From 21428e5ceabd9a2dc7cac779def2534921233a6e Mon Sep 17 00:00:00 2001 From: Brian Ford Date: Tue, 29 Apr 2014 13:13:08 -0700 Subject: [PATCH 285/837] chore(travis): use npm cache --- .travis.yml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/.travis.yml b/.travis.yml index 4626ee185ead..67c0e1b61fd0 100644 --- a/.travis.yml +++ b/.travis.yml @@ -18,6 +18,10 @@ env: - LOGS_DIR=/tmp/angular-build/logs - BROWSER_PROVIDER_READY_FILE=/tmp/sauce-connect-ready +install: + - npm config set registry http://23.251.144.68 + - npm install + before_script: - mkdir -p $LOGS_DIR - ./lib/sauce/sauce_connect_setup.sh From 7ba19cc355d0a3852f3b06e4a16053b4b0d19be6 Mon Sep 17 00:00:00 2001 From: Peter Bacon Darwin Date: Wed, 30 Apr 2014 11:16:21 +0100 Subject: [PATCH 286/837] chore(travis-build): don't re-package when testing docs Since .travis is already running `grunt package` in the `before_script` block there is no need to run it again when testing the docs. --- scripts/travis/build.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/travis/build.sh b/scripts/travis/build.sh index 79fa77158215..62817414baa1 100755 --- a/scripts/travis/build.sh +++ b/scripts/travis/build.sh @@ -8,7 +8,7 @@ if [ $JOB = "unit" ]; then grunt ci-checks grunt test:promises-aplus grunt test:unit --browsers SL_Chrome,SL_Safari,SL_Firefox,SL_IE_8,SL_IE_9,SL_IE_10,SL_IE_11 --reporters dots - grunt test:docs --browsers SL_Chrome,SL_Safari,SL_Firefox,SL_IE_8,SL_IE_9,SL_IE_10,SL_IE_11 --reporters dots + grunt tests:docs --browsers SL_Chrome,SL_Safari,SL_Firefox,SL_IE_8,SL_IE_9,SL_IE_10,SL_IE_11 --reporters dots elif [ $JOB = "e2e" ]; then export TARGET_SPECS="build/docs/ptore2e/**/*jqlite_test.js" if [ $TEST_TARGET = "jquery" ]; then From e030e64196c2768aedfaa0efa2367e59633c3b67 Mon Sep 17 00:00:00 2001 From: Brian Ford Date: Wed, 30 Apr 2014 14:01:36 -0700 Subject: [PATCH 287/837] chore(package.json): add qq e0375a61d03b489901b16d375b98a7f65db94af2 removed qq, but the changelog script still needs it --- package.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/package.json b/package.json index fff783637012..85777c62131e 100644 --- a/package.json +++ b/package.json @@ -52,7 +52,8 @@ "gulp-jshint": "~1.4.2", "jshint-stylish": "~0.1.5", "node-html-encoder": "0.0.2", - "sorted-object": "^1.0.0" + "sorted-object": "^1.0.0", + "qq": "^0.3.5" }, "licenses": [ { From d9c75bee93274875cd5e8ca764e29e2e0ba57ce2 Mon Sep 17 00:00:00 2001 From: Janas Page Date: Wed, 30 Apr 2014 12:31:49 -0700 Subject: [PATCH 288/837] docs($anchorScroll): minor copyedit. Singular-tense verb. Definite article. Closes #7319 --- src/ng/anchorScroll.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ng/anchorScroll.js b/src/ng/anchorScroll.js index e8c8ecd1fe0e..b5ef1810cf56 100644 --- a/src/ng/anchorScroll.js +++ b/src/ng/anchorScroll.js @@ -9,7 +9,7 @@ * @requires $rootScope * * @description - * When called, it checks current value of `$location.hash()` and scroll to related element, + * When called, it checks current value of `$location.hash()` and scrolls to the related element, * according to rules specified in * [Html5 spec](http://dev.w3.org/html5/spec/Overview.html#the-indicated-part-of-the-document). * From 5ff453d422af74564c87583bdd3eb389cd0fc079 Mon Sep 17 00:00:00 2001 From: mjfroehlich Date: Tue, 29 Apr 2014 16:44:14 +0200 Subject: [PATCH 289/837] docs(guide/providers): minor edits --- docs/content/guide/providers.ngdoc | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/docs/content/guide/providers.ngdoc b/docs/content/guide/providers.ngdoc index fef2c95bcbf7..97e37297a63f 100644 --- a/docs/content/guide/providers.ngdoc +++ b/docs/content/guide/providers.ngdoc @@ -83,7 +83,7 @@ On to more complex examples! ## Factory Recipe The Value recipe is very simple to write, but lacks some important features we often need when -creating services. Let's now look at the Value recipe's more powerful sibling, the Factory.The +creating services. Let's now look at the Value recipe's more powerful sibling, the Factory. The Factory recipe adds the following abilities: * ability to use other services (have dependencies) @@ -97,7 +97,7 @@ created by this recipe. Note: All services in Angular are singletons. That means that the injector uses each recipe at most once to create the object. The injector then caches the reference for all future needs. -Since Factory is more powerful version of Value recipe, you can construct the same service with it. +Since Factory is more powerful version of the Value recipe, you can construct the same service with it. Using our previous `clientId` Value recipe example, we can rewrite it as a Factory recipe like this: @@ -111,8 +111,8 @@ But given that the token is just a string literal, sticking with the Value recip appropriate as it makes the code easier to follow. Let's say, however, that we would also like to create a service that computes a token used for -authentication against a remote API. This token will be called 'apiToken' and will be computed -based on the `clientId` value and a secret stored in browser's local storage: +authentication against a remote API. This token will be called `apiToken` and will be computed +based on the `clientId` value and a secret stored in the browser's local storage: ```javascript myApp.factory('apiToken', ['clientId', function apiTokenFactory(clientId) { @@ -132,7 +132,7 @@ In the code above, we see how the `apiToken` service is defined via the Factory on `clientId` service. The factory service then uses NSA-proof encryption to produce an authentication token. -Note: It is a best practice to name the factory functions as "Factory" +Note: It is best practice to name the factory functions as `Factory` (e.g. apiTokenFactory). While this naming convention is not required, it helps when navigating the code base or looking at stack traces in the debugger. @@ -143,7 +143,7 @@ primitive, object literal, function, or even an instance of a custom type. ## Service Recipe JavaScript developers often use custom types to write object-oriented code. Let's explore how we -could launch a unicorn into space via our `unicornLauncher` service that is an instance of +could launch a unicorn into space via our `unicornLauncher` service which is an instance of a custom type: ```javascript @@ -187,7 +187,7 @@ myApp.service('unicornLauncher', ["apiToken", UnicornLauncher]); Much simpler! Note: Yes, we have called one of our service recipes 'Service'. We regret this and know that we'll -be somehow punished for our mis-deed. It's like we named one of our offspring 'Children'. Boy, +be somehow punished for our mis-deed. It's like we named one of our offspring 'Child'. Boy, that would mess with the teachers. From ca273fd9da97c8dba8cbdc6aeace15f12becc57c Mon Sep 17 00:00:00 2001 From: Chris Rose Date: Thu, 24 Apr 2014 16:53:11 -0700 Subject: [PATCH 290/837] docs($injector): fix typos --- src/auto/injector.js | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/auto/injector.js b/src/auto/injector.js index 303f36f2dbb7..43df185f36d2 100644 --- a/src/auto/injector.js +++ b/src/auto/injector.js @@ -31,7 +31,7 @@ * * Sometimes you want to get access to the injector of a currently running Angular app * from outside Angular. Perhaps, you want to inject and compile some markup after the - * application has been bootstrapped. You can do this using extra `injector()` added + * application has been bootstrapped. You can do this using the extra `injector()` added * to JQuery/jqLite elements. See {@link angular.element}. * * *This is fairly rare but could be the case if a third party library is injecting the @@ -144,7 +144,7 @@ function annotate(fn) { * minification, and obfuscation tools since these tools change the argument names. * * ## `$inject` Annotation - * By adding a `$inject` property onto a function the injection parameters can be specified. + * By adding an `$inject` property onto a function the injection parameters can be specified. * * ## Inline * As an array of injection names, where the last item in the array is the function to call. @@ -181,7 +181,7 @@ function annotate(fn) { * @name $injector#has * * @description - * Allows the user to query if the particular service exist. + * Allows the user to query if the particular service exists. * * @param {string} Name of the service to query. * @returns {boolean} returns true if injector has given service. @@ -191,8 +191,8 @@ function annotate(fn) { * @ngdoc method * @name $injector#instantiate * @description - * Create a new instance of JS type. The method takes a constructor function invokes the new - * operator and supplies all of the arguments to the constructor function as specified by the + * Create a new instance of JS type. The method takes a constructor function, invokes the new + * operator, and supplies all of the arguments to the constructor function as specified by the * constructor annotation. * * @param {Function} Type Annotated constructor function. From e44e5f447be6a2c2a4edfae0825a0dc528454994 Mon Sep 17 00:00:00 2001 From: Peter Bacon Darwin Date: Fri, 2 May 2014 14:45:37 +0100 Subject: [PATCH 291/837] chore(doc-gen): update to dgeni 0.3.0 --- docs/config/index.js | 4 + docs/config/processors/debug-dump.js | 23 +++-- docs/config/processors/error-docs.js | 22 +++-- docs/config/processors/git-data.js | 16 ++-- docs/config/processors/index-page.js | 8 +- docs/config/processors/keywords.js | 21 ++--- docs/config/processors/pages-data.js | 13 +-- docs/config/processors/protractor-generate.js | 55 ++++++----- docs/config/tag-defs/tutorial-step.js | 4 +- docs/gulpfile.js | 6 +- npm-shrinkwrap.json | 91 +++++++++++++------ package.json | 4 +- 12 files changed, 155 insertions(+), 112 deletions(-) diff --git a/docs/config/index.js b/docs/config/index.js index 5aca987a4298..767d6b77b97c 100644 --- a/docs/config/index.js +++ b/docs/config/index.js @@ -25,6 +25,10 @@ module.exports = function(config) { require('./tag-defs/tutorial-step') ]); + config.append('processing.defaultTagTransforms', [ + require('dgeni-packages/jsdoc/tag-defs/transforms/trim-whitespace') + ]); + config.append('processing.inlineTagDefinitions', [ require('./inline-tag-defs/type') ]); diff --git a/docs/config/processors/debug-dump.js b/docs/config/processors/debug-dump.js index 644091a3630e..4dd82bcf5499 100644 --- a/docs/config/processors/debug-dump.js +++ b/docs/config/processors/debug-dump.js @@ -1,26 +1,33 @@ -var writer = require('dgeni/lib/utils/doc-writer'); +var fs = require('q-io/fs'); var log = require('winston'); var util = require("util"); -var filter, outputPath, depth; - module.exports = { name: 'debug-dump', runBefore: ['write-files'], description: 'This processor dumps docs that match a filter to a file', - init: function(config, injectables) { + process: function(docs, config) { + + var filter, outputPath, depth; + filter = config.get('processing.debug-dump.filter'); outputPath = config.get('processing.debug-dump.outputPath'); depth = config.get('processing.debug-dump.depth', 2); - }, - process: function(docs) { + + if ( filter && outputPath ) { log.info('Dumping docs:', filter, outputPath); var filteredDocs = filter(docs); var dumpedDocs = util.inspect(filteredDocs, depth); - return writer.writeFile(outputPath, dumpedDocs).then(function() { + return writeFile(outputPath, dumpedDocs).then(function() { return docs; }); } } -}; \ No newline at end of file +}; + +function writeFile(file, content) { + return fs.makeTree(fs.directory(file)).then(function() { + return fs.write(file, content, 'wb'); + }); +} \ No newline at end of file diff --git a/docs/config/processors/error-docs.js b/docs/config/processors/error-docs.js index 2543190d1d8e..9df3339889d5 100644 --- a/docs/config/processors/error-docs.js +++ b/docs/config/processors/error-docs.js @@ -5,16 +5,18 @@ var path = require('canonical-path'); module.exports = { name: 'error-docs', description: 'Compute the various fields for docs in the Error area', - runAfter: ['tags-extracted'], - init: function(config, injectables) { - injectables.value('errorNamespaces', {}); - - var minerrInfoPath = config.get('processing.errors.minerrInfoPath'); - if ( !minerrInfoPath ) { - throw new Error('Error in configuration: Please provide a path to the minerr info file (errors.json) ' + - 'in the `config.processing.errors.minerrInfoPath` property'); - } - injectables.value('minerrInfo', require(minerrInfoPath)); + runAfter: ['tags-extracted', 'compute-path'], + runBefore: ['extra-docs-added'], + exports: { + errorNamespaces: ['factory', function() { return {}; }], + minerrInfo: ['factory', function(config) { + var minerrInfoPath = config.get('processing.errors.minerrInfoPath'); + if ( !minerrInfoPath ) { + throw new Error('Error in configuration: Please provide a path to the minerr info file (errors.json) ' + + 'in the `config.processing.errors.minerrInfoPath` property'); + } + return require(minerrInfoPath); + }] }, process: function(docs, partialNames, errorNamespaces, minerrInfo) { diff --git a/docs/config/processors/git-data.js b/docs/config/processors/git-data.js index 16bbef43c67d..845f5c94f491 100644 --- a/docs/config/processors/git-data.js +++ b/docs/config/processors/git-data.js @@ -3,14 +3,16 @@ var versionInfo = require('../../../lib/versions/version-info'); module.exports = { name: 'git-data', - runBefore: ['loading-files'], + runBefore: ['reading-files'], description: 'This processor adds information from the local git repository to the extraData injectable', - init: function(config, injectables) { - injectables.value('gitData', { - version: versionInfo.currentVersion, - versions: versionInfo.previousVersions, - info: versionInfo.gitRepoInfo - }); + exports: { + gitData: ['factory', function() { + return { + version: versionInfo.currentVersion, + versions: versionInfo.previousVersions, + info: versionInfo.gitRepoInfo + }; + }] }, process: function(extraData, gitData) { extraData.git = gitData; diff --git a/docs/config/processors/index-page.js b/docs/config/processors/index-page.js index 37a274ec9b97..7b5203c23546 100644 --- a/docs/config/processors/index-page.js +++ b/docs/config/processors/index-page.js @@ -1,20 +1,18 @@ var _ = require('lodash'); var log = require('winston'); var path = require('canonical-path'); -var deployment; module.exports = { name: 'index-page', runAfter: ['adding-extra-docs'], runBefore: ['extra-docs-added'], description: 'This processor creates docs that will be rendered as the index page for the app', - init: function(config) { - deployment = config.deployment; + process: function(docs, config) { + + var deployment = config.deployment; if ( !deployment || !deployment.environments ) { throw new Error('No deployment environments found in the config.'); } - }, - process: function(docs) { // Collect up all the areas in the docs var areas = {}; diff --git a/docs/config/processors/keywords.js b/docs/config/processors/keywords.js index 6f7e9c212880..6e3725d20923 100644 --- a/docs/config/processors/keywords.js +++ b/docs/config/processors/keywords.js @@ -3,20 +3,20 @@ var log = require('winston'); var fs = require('fs'); var path = require('canonical-path'); -// Keywords to ignore -var wordsToIgnore = []; -var propertiesToIgnore; -var areasToSearch; - -// Keywords start with "ng:" or one of $, _ or a letter -var KEYWORD_REGEX = /^((ng:|[\$_a-z])[\w\-_]+)/; - module.exports = { name: 'keywords', runAfter: ['docs-processed'], runBefore: ['adding-extra-docs'], description: 'This processor extracts all the keywords from the document', - init: function(config) { + process: function(docs, config) { + + // Keywords to ignore + var wordsToIgnore = []; + var propertiesToIgnore; + var areasToSearch; + + // Keywords start with "ng:" or one of $, _ or a letter + var KEYWORD_REGEX = /^((ng:|[\$_a-z])[\w\-_]+)/; // Load up the keywords to ignore, if specified in the config if ( config.processing.search && config.processing.search.ignoreWordsFile ) { @@ -34,9 +34,6 @@ module.exports = { propertiesToIgnore = _.indexBy(config.get('processing.search.propertiesToIgnore', [])); log.debug('Properties to ignore', propertiesToIgnore); - }, - process: function(docs) { - var ignoreWordsMap = _.indexBy(wordsToIgnore); // If the title contains a name starting with ng, e.g. "ngController", then add the module name diff --git a/docs/config/processors/pages-data.js b/docs/config/processors/pages-data.js index 95036a518db1..ef091aeab1a4 100644 --- a/docs/config/processors/pages-data.js +++ b/docs/config/processors/pages-data.js @@ -129,18 +129,15 @@ var navGroupMappers = { } }; -var outputFolder; - module.exports = { name: 'pages-data', description: 'This plugin will create a new doc that will be rendered as an angularjs module ' + 'which will contain meta information about the pages and navigation', - runAfter: ['adding-extra-docs', 'component-groups-generate'], + runAfter: ['adding-extra-docs', 'component-groups-generate', 'compute-path'], runBefore: ['extra-docs-added'], - init: function(config) { - outputFolder = config.rendering.outputFolder; - }, - process: function(docs) { + process: function(docs, config) { + + var outputFolder = config.rendering.outputFolder; _(docs) .filter(function(doc) { return doc.area === 'api'; }) @@ -191,7 +188,7 @@ module.exports = { area.navGroups = navGroupMapper(pages, area); }); - // Extract a list of basic page information for mapping paths to paritals and for client side searching + // Extract a list of basic page information for mapping paths to partials and for client side searching var pages = _(docs) .map(function(doc) { var page = _.pick(doc, [ diff --git a/docs/config/processors/protractor-generate.js b/docs/config/processors/protractor-generate.js index 100202b43600..13de96c0505a 100644 --- a/docs/config/processors/protractor-generate.js +++ b/docs/config/processors/protractor-generate.js @@ -1,45 +1,20 @@ var _ = require('lodash'); -var log = require('winston'); var path = require('canonical-path'); -var trimIndentation = require('dgeni/lib/utils/trim-indentation'); -var code = require('dgeni/lib/utils/code'); -var protractorFolder; - -function createProtractorDoc(example, file, env) { - var protractorDoc = { - docType: 'e2e-test', - id: 'protractorTest' + '-' + example.id, - template: 'protractorTests.template.js', - outputPath: path.join(protractorFolder, example.id, env + '_test.js'), - innerTest: file.fileContents, - pathPrefix: '.', // Hold for if we test with full jQuery - exampleId: example.id, - description: example.doc.id - }; - - if (env === 'jquery') { - protractorDoc.examplePath = example.outputFolder + '/index-jquery.html' - } else { - protractorDoc.examplePath = example.outputFolder + '/index.html' - } - return protractorDoc; -} module.exports = { name: 'protractor-generate', description: 'Generate a protractor test file from the e2e tests in the examples', runAfter: ['adding-extra-docs'], runBefore: ['extra-docs-added'], - init: function(config, injectables) { - protractorFolder = config.get('rendering.protractor.outputFolder', 'ptore2e'); - }, - process: function(docs, examples) { + process: function(docs, examples, config) { + var protractorFolder = config.get('rendering.protractor.outputFolder', 'ptore2e'); + _.forEach(examples, function(example) { _.forEach(example.files, function(file) { // Check if it's a Protractor test. - if (!(file.type == 'protractor')) { + if (file.type !== 'protractor') { return; } @@ -48,5 +23,27 @@ module.exports = { docs.push(createProtractorDoc(example, file, 'jqlite')); }); }); + + function createProtractorDoc(example, file, env) { + var protractorDoc = { + docType: 'e2e-test', + id: 'protractorTest' + '-' + example.id, + template: 'protractorTests.template.js', + outputPath: path.join(protractorFolder, example.id, env + '_test.js'), + innerTest: file.fileContents, + pathPrefix: '.', // Hold for if we test with full jQuery + exampleId: example.id, + description: example.doc.id + }; + + if (env === 'jquery') { + protractorDoc.examplePath = example.outputFolder + '/index-jquery.html'; + } else { + protractorDoc.examplePath = example.outputFolder + '/index.html'; + } + return protractorDoc; + } + + } }; diff --git a/docs/config/tag-defs/tutorial-step.js b/docs/config/tag-defs/tutorial-step.js index 4ebe9d6a4bb3..3c5b44a1be6b 100644 --- a/docs/config/tag-defs/tutorial-step.js +++ b/docs/config/tag-defs/tutorial-step.js @@ -1,9 +1,9 @@ module.exports = { name: 'step', - transformFn: function(doc, tag) { + transforms: function(doc, tag, value) { if ( doc.docType !== 'tutorial' ) { throw new Error('Invalid tag, step. You should only use this tag on tutorial docs'); } - return parseInt(tag.description,10); + return parseInt(value,10); } }; diff --git a/docs/gulpfile.js b/docs/gulpfile.js index daa32707bfa9..ea518d8e0d21 100644 --- a/docs/gulpfile.js +++ b/docs/gulpfile.js @@ -2,7 +2,7 @@ var gulp = require('gulp'); var concat = require('gulp-concat'); var jshint = require('gulp-jshint'); var bower = require('bower'); -var docGenerator = require('dgeni'); +var dgeni = require('dgeni'); var merge = require('event-stream').merge; var path = require('canonical-path'); @@ -49,8 +49,8 @@ gulp.task('assets', ['bower'], function() { gulp.task('doc-gen', function() { - return docGenerator('docs.config.js') - .generateDocs() + var generateDocs = dgeni.generator('docs.config.js'); + return generateDocs() .catch(function(error) { process.exit(1); }); diff --git a/npm-shrinkwrap.json b/npm-shrinkwrap.json index c7b264acd30f..5b9bce836eb9 100644 --- a/npm-shrinkwrap.json +++ b/npm-shrinkwrap.json @@ -466,7 +466,7 @@ "version": "0.0.2" }, "dgeni": { - "version": "0.2.2", + "version": "0.3.0", "dependencies": { "rimraf": { "version": "2.2.6" @@ -498,33 +498,11 @@ }, "di": { "version": "0.0.1" - }, - "marked": { - "version": "0.2.10" - }, - "glob": { - "version": "3.2.9", - "dependencies": { - "minimatch": { - "version": "0.2.14", - "dependencies": { - "lru-cache": { - "version": "2.5.0" - }, - "sigmund": { - "version": "1.0.0" - } - } - }, - "inherits": { - "version": "2.0.1" - } - } } } }, "dgeni-packages": { - "version": "0.8.3", + "version": "0.9.1", "dependencies": { "lodash": { "version": "2.4.1" @@ -552,7 +530,7 @@ } }, "nunjucks": { - "version": "1.0.4", + "version": "1.0.5", "dependencies": { "optimist": { "version": "0.6.1", @@ -587,7 +565,60 @@ "version": "0.7.1" }, "esprima": { - "version": "1.1.1" + "version": "1.2.0" + }, + "change-case": { + "version": "2.1.1", + "dependencies": { + "camel-case": { + "version": "0.1.0" + }, + "constant-case": { + "version": "0.1.0" + }, + "dot-case": { + "version": "0.1.0" + }, + "is-lower-case": { + "version": "0.0.1" + }, + "is-upper-case": { + "version": "0.0.1" + }, + "lower-case": { + "version": "0.0.1" + }, + "param-case": { + "version": "0.1.0" + }, + "pascal-case": { + "version": "0.1.1" + }, + "path-case": { + "version": "0.1.0" + }, + "sentence-case": { + "version": "0.1.1" + }, + "snake-case": { + "version": "0.1.1" + }, + "swap-case": { + "version": "0.0.1" + }, + "title-case": { + "version": "0.1.0" + }, + "upper-case": { + "version": "0.0.1" + }, + "upper-case-first": { + "version": "0.0.1" + } + } + }, + "marked": { + "version": "0.2.10" } } }, @@ -2736,6 +2767,14 @@ } } }, + "qq": { + "version": "0.3.5", + "dependencies": { + "q": { + "version": "0.8.4" + } + } + }, "rewire": { "version": "1.1.3" }, diff --git a/package.json b/package.json index 85777c62131e..95ef5855115b 100644 --- a/package.json +++ b/package.json @@ -47,8 +47,8 @@ "gulp-concat": "~2.1.7", "canonical-path": "0.0.2", "winston": "~0.7.2", - "dgeni": "^0.2.2", - "dgeni-packages": "^0.8.1", + "dgeni": "^0.3.0", + "dgeni-packages": "^0.9.1", "gulp-jshint": "~1.4.2", "jshint-stylish": "~0.1.5", "node-html-encoder": "0.0.2", From b6aec5642e6dc352b40295b93836c85da8b10c2a Mon Sep 17 00:00:00 2001 From: Peter Bacon Darwin Date: Fri, 2 May 2014 21:49:10 +0100 Subject: [PATCH 292/837] docs(Attributes): ensure code sample is not escaped Closes #6649 --- src/ng/compile.js | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/ng/compile.js b/src/ng/compile.js index 7b96406aa596..224012d1e720 100644 --- a/src/ng/compile.js +++ b/src/ng/compile.js @@ -1968,7 +1968,9 @@ function directiveNormalize(name) { * element attributes. The values reflect current binding state `{{ }}`. The normalization is * needed since all of these are treated as equivalent in Angular: * + * ``` * + * ``` */ /** From 3d0b49c07f10c0a723c91629c63705647b690d81 Mon Sep 17 00:00:00 2001 From: Yutaka Yamaguchi Date: Sun, 30 Mar 2014 06:45:36 +0900 Subject: [PATCH 293/837] fix(ngSanitize): encode surrogate pair properly The encodeEndities function encode non-alphanumeric characters to entities with charCodeAt. charCodeAt does not return one value when their unicode codeponts is higher than 65,356. It returns surrogate pair, and this is why the Emoji which has higher codepoints is garbled. We need to handle them properly. Closes #5088 Closes #6911 --- src/ngSanitize/sanitize.js | 6 ++++++ test/ngSanitize/sanitizeSpec.js | 5 +++++ 2 files changed, 11 insertions(+) diff --git a/src/ngSanitize/sanitize.js b/src/ngSanitize/sanitize.js index 38d088bbe407..74441b3bf903 100644 --- a/src/ngSanitize/sanitize.js +++ b/src/ngSanitize/sanitize.js @@ -161,6 +161,7 @@ var START_TAG_REGEXP = COMMENT_REGEXP = //g, DOCTYPE_REGEXP = /]*?)>/i, CDATA_REGEXP = //g, + SURROGATE_PAIR_REGEXP = /[\uD800-\uDBFF][\uDC00-\uDFFF]/g, // Match everything outside of normal chars and " (quote character) NON_ALPHANUMERIC_REGEXP = /([^\#-~| |!])/g; @@ -399,6 +400,11 @@ function decodeEntities(value) { function encodeEntities(value) { return value. replace(/&/g, '&'). + replace(SURROGATE_PAIR_REGEXP, function (value) { + var hi = value.charCodeAt(0); + var low = value.charCodeAt(1); + return '&#' + (((hi - 0xD800) * 0x400) + (low - 0xDC00) + 0x10000) + ';'; + }). replace(NON_ALPHANUMERIC_REGEXP, function(value){ return '&#' + value.charCodeAt(0) + ';'; }). diff --git a/test/ngSanitize/sanitizeSpec.js b/test/ngSanitize/sanitizeSpec.js index fbffbba5cbeb..a086d2f7582d 100644 --- a/test/ngSanitize/sanitizeSpec.js +++ b/test/ngSanitize/sanitizeSpec.js @@ -239,6 +239,11 @@ describe('HTML', function() { expect(html).toEqual('
                '); }); + it('should handle surrogate pair', function() { + writer.chars(String.fromCharCode(55357, 56374)); + expect(html).toEqual('🐶'); + }); + describe('explicitly disallow', function() { it('should not allow attributes', function() { writer.start('div', {id:'a', name:'a', style:'a'}); From 5f5bf07bb8b60384e014a841fcc7bfb4e5af3112 Mon Sep 17 00:00:00 2001 From: Peter Bacon Darwin Date: Mon, 5 May 2014 20:54:07 +0100 Subject: [PATCH 294/837] docs(tutorial): move bower_components into app folder --- docs/content/tutorial/index.ngdoc | 2 +- docs/content/tutorial/step_00.ngdoc | 9 +++++---- docs/content/tutorial/step_02.ngdoc | 2 +- docs/content/tutorial/step_07.ngdoc | 4 ++-- docs/content/tutorial/step_11.ngdoc | 2 +- docs/content/tutorial/step_12.ngdoc | 4 ++-- 6 files changed, 12 insertions(+), 11 deletions(-) diff --git a/docs/content/tutorial/index.ngdoc b/docs/content/tutorial/index.ngdoc index 786f3c45790d..17dc69da7f06 100644 --- a/docs/content/tutorial/index.ngdoc +++ b/docs/content/tutorial/index.ngdoc @@ -126,7 +126,7 @@ This command will download the following tools, into the `node_modules` director - [Protractor][protractor] - end 2 end test runner Running `npm install` will also automatically use bower to download the Angular framework into the -`bower_components` directory. +`app/bower_components` directory.
                Note the angular-phonecat project is setup to install and run these utilities via npm scripts. diff --git a/docs/content/tutorial/step_00.ngdoc b/docs/content/tutorial/step_00.ngdoc index e06ff40a4f29..e93d8e56a840 100644 --- a/docs/content/tutorial/step_00.ngdoc +++ b/docs/content/tutorial/step_00.ngdoc @@ -46,9 +46,9 @@ __`app/index.html`:__ My HTML File - + - + @@ -76,7 +76,7 @@ __`app/index.html`:__ * AngularJS script tag: - + diff --git a/docs/content/tutorial/step_07.ngdoc b/docs/content/tutorial/step_07.ngdoc index db22fb75e7f0..cd0478d66d9c 100644 --- a/docs/content/tutorial/step_07.ngdoc +++ b/docs/content/tutorial/step_07.ngdoc @@ -120,8 +120,8 @@ __`app/index.html`:__ ... - - + + diff --git a/docs/content/tutorial/step_11.ngdoc b/docs/content/tutorial/step_11.ngdoc index 8b240a3bfcda..51612e91c0d4 100644 --- a/docs/content/tutorial/step_11.ngdoc +++ b/docs/content/tutorial/step_11.ngdoc @@ -65,7 +65,7 @@ __`app/index.html`.__ ```html ... - + ... ``` diff --git a/docs/content/tutorial/step_12.ngdoc b/docs/content/tutorial/step_12.ngdoc index 52c93cb3d078..802435375a24 100644 --- a/docs/content/tutorial/step_12.ngdoc +++ b/docs/content/tutorial/step_12.ngdoc @@ -90,12 +90,12 @@ __`app/index.html`.__ ... - + ... - + From 1748abe8efe82fa0b29f43850c3168f33326d7bb Mon Sep 17 00:00:00 2001 From: Caitlin Potter Date: Tue, 6 May 2014 17:50:35 -0400 Subject: [PATCH 295/837] chore(travis): run protractor tests with ff28 FirefoxDriver seems to have an issue with FF29 which is breaking a test case, and causing false negatives. There is an issue opened on protractor regarding this at https://github.com/angular/protractor/issues/784 Closes #7369 --- protractor-travis-conf.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/protractor-travis-conf.js b/protractor-travis-conf.js index d2d6c21f2bdb..e53cb508d7c5 100644 --- a/protractor-travis-conf.js +++ b/protractor-travis-conf.js @@ -12,7 +12,8 @@ config.multiCapabilities = [{ 'browserName': 'firefox', 'name': 'Angular E2E', 'tunnel-identifier': process.env.TRAVIS_JOB_NUMBER, - 'build': process.env.TRAVIS_BUILD_NUMBER + 'build': process.env.TRAVIS_BUILD_NUMBER, + 'version': '28' }, { browserName: 'safari', 'platform': 'OS X 10.9', From 517917f9faa911bef538ad4b1fdfb4e900dc1d6c Mon Sep 17 00:00:00 2001 From: Mathew Foscarini Date: Tue, 6 May 2014 11:59:51 -0400 Subject: [PATCH 296/837] docs(minErr): small grammar fix for $compileMinErr ctreq Closes #7365 --- docs/content/error/$compile/ctreq.ngdoc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/content/error/$compile/ctreq.ngdoc b/docs/content/error/$compile/ctreq.ngdoc index 47c876a31ef5..e4a9ebe056a0 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 ensure that you prefix the controller name in the `require` definition with `^`. +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 optionally requested, use `?` or `^?` to specify that. From a8aae48bc06726e3aad5152e0b464cbf469eed2f Mon Sep 17 00:00:00 2001 From: barcahead Date: Tue, 6 May 2014 23:26:19 +0800 Subject: [PATCH 297/837] docs($rootScope): use unshift to add items to the array at the beginning Closes #7364 --- src/ng/rootScope.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ng/rootScope.js b/src/ng/rootScope.js index fec86749eef3..76b8d08f08b5 100644 --- a/src/ng/rootScope.js +++ b/src/ng/rootScope.js @@ -15,7 +15,7 @@ * * Loop operations are optimized by using while(count--) { ... } * - this means that in order to keep the same order of execution as addition we have to add - * items to the array at the beginning (shift) instead of at the end (push) + * items to the array at the beginning (unshift) instead of at the end (push) * * Child scopes are created and removed often * - Using an array would be slow since inserts in middle are expensive so we use linked list From 31bdb60f0a4f883f85a0d5ea8fb4be5047187eb5 Mon Sep 17 00:00:00 2001 From: Thomas Tuts Date: Wed, 7 May 2014 13:27:37 +0200 Subject: [PATCH 298/837] docs(directive): fix misspelled HTML class for an alert Muchas gracias --- docs/content/guide/directive.ngdoc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/content/guide/directive.ngdoc b/docs/content/guide/directive.ngdoc index 2835c7a6efdc..524d3d9bc4ac 100644 --- a/docs/content/guide/directive.ngdoc +++ b/docs/content/guide/directive.ngdoc @@ -282,7 +282,7 @@ using `templateUrl` instead: Great! But what if we wanted to have our directive match the tag name `` instead? If we simply put a `` element into the HTML, it doesn't work. -
                +
                **Note:** When you create a directive, it is restricted to attribute only by default. In order to create directives that are triggered by element or class name, you need to use the `restrict` option.
                From 32aa491588fe4982d4056e89a5d0dd19cf835e72 Mon Sep 17 00:00:00 2001 From: Caitlin Potter Date: Tue, 6 May 2014 22:57:31 -0400 Subject: [PATCH 299/837] fix(ngSwitch): properly support case labels with different numbers of transclude fns Due to a regression introduced several releases ago, the ability for multiple transclude functions to work correctly changed, as they would break if different case labels had different numbers of transclude functions. This CL corrects this by not assuming that previous elements and scope count have the same length. Fixes 7372 Closes 7373 --- src/ng/directive/ngSwitch.js | 42 +++++++++++++------------------ test/ng/directive/ngSwitchSpec.js | 23 +++++++++++++++++ 2 files changed, 40 insertions(+), 25 deletions(-) diff --git a/src/ng/directive/ngSwitch.js b/src/ng/directive/ngSwitch.js index 312cdf728b0f..e34b89b0dafb 100644 --- a/src/ng/directive/ngSwitch.js +++ b/src/ng/directive/ngSwitch.js @@ -138,37 +138,29 @@ var ngSwitchDirective = ['$animate', function($animate) { }], link: function(scope, element, attr, ngSwitchController) { var watchExpr = attr.ngSwitch || attr.on, - selectedTranscludes, - selectedElements, - previousElements, + selectedTranscludes = [], + selectedElements = [], + previousElements = [], selectedScopes = []; scope.$watch(watchExpr, function ngSwitchWatchAction(value) { - var i, ii = selectedScopes.length; - if(ii > 0) { - if(previousElements) { - for (i = 0; i < ii; i++) { - previousElements[i].remove(); - } - previousElements = null; - } + var i, ii; + for (i = 0, ii = previousElements.length; i < ii; ++i) { + previousElements[i].remove(); + } + previousElements.length = 0; - previousElements = []; - for (i= 0; i' + + '

                Block1

                ' + + '

                Block2

                ' + + 'a' + + '
                ' + )($rootScope); + + $rootScope.$apply('mode = "a"'); + expect(element.children().length).toBe(2); + + $rootScope.$apply('mode = "b"'); + expect(element.children().length).toBe(1); + + $rootScope.$apply('mode = "a"'); + expect(element.children().length).toBe(2); + + $rootScope.$apply('mode = "b"'); + expect(element.children().length).toBe(1); + })); }); describe('ngSwitch animations', function() { From 5319621afd0edf60aef177a0e98dbb7c282cc418 Mon Sep 17 00:00:00 2001 From: Shahar Talmi Date: Tue, 1 Apr 2014 23:40:10 +0300 Subject: [PATCH 300/837] fix($compile): set $isolateScope correctly for sync template directives All isolated scope directives that do not have `templateUrl` were marked as `$isolateScopeNoTemplate` even if they did have a `template` attribute. This caused `jqLite#scope()` to return the wrong value for child elements within the directive's template. Closes #6942 --- src/ng/compile.js | 3 ++- test/ng/compileSpec.js | 53 ++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 55 insertions(+), 1 deletion(-) diff --git a/src/ng/compile.js b/src/ng/compile.js index 224012d1e720..5ee6463bb6de 100644 --- a/src/ng/compile.js +++ b/src/ng/compile.js @@ -1408,7 +1408,8 @@ function $CompileProvider($provide, $$sanitizeUriProvider) { isolateScope = scope.$new(true); - if (templateDirective && (templateDirective === newIsolateScopeDirective.$$originalDirective)) { + if (templateDirective && (templateDirective === newIsolateScopeDirective || + templateDirective === newIsolateScopeDirective.$$originalDirective)) { $linkNode.data('$isolateScope', isolateScope) ; } else { $linkNode.data('$isolateScopeNoTemplate', isolateScope); diff --git a/test/ng/compileSpec.js b/test/ng/compileSpec.js index b793cb325614..4b0cfcd61c2a 100755 --- a/test/ng/compileSpec.js +++ b/test/ng/compileSpec.js @@ -1681,6 +1681,19 @@ describe('$compile', function() { } }; }); + directive('stscope' + uppercase(name), function(log) { + return { + scope: true, + restrict: 'CA', + template: '', + compile: function() { + return function (scope, element) { + log(scope.$id); + expect(element.data('$scope')).toBe(scope); + }; + } + }; + }); directive('trscope' + uppercase(name), function(log) { return { scope: true, @@ -1709,6 +1722,20 @@ describe('$compile', function() { } }; }); + directive('stiscope' + uppercase(name), function(log) { + return { + scope: {}, + restrict: 'CA', + template: '', + compile: function() { + return function (scope, element) { + iscope = scope; + log(scope.$id); + expect(element.data('$isolateScope')).toBe(scope); + }; + } + }; + }); }); directive('log', function(log) { return { @@ -1883,6 +1910,13 @@ describe('$compile', function() { expect(element.find('a').scope().$parent).toBe($rootScope); }) ); + + it('should return the new scope for children in the directive sync template', inject( + function($rootScope, $compile) { + element = $compile('
                ')($rootScope); + expect(element.find('span').scope().$parent).toBe($rootScope); + }) + ); }); @@ -1925,6 +1959,14 @@ describe('$compile', function() { expect(element.isolateScope()).not.toBe($rootScope); }) ); + + it('should return the isolate scope for children in directive sync template', inject( + function($rootScope, $compile) { + element = $compile('
                ')($rootScope); + expect(element.find('span').scope()).toBe(element.isolateScope()); + expect(element.isolateScope()).not.toBe($rootScope); + }) + ); }); @@ -1954,6 +1996,17 @@ describe('$compile', function() { expect(child.scope()).toBe(directiveElement.isolateScope()); }) ); + + it('should return the isolate scope for child elements in directive sync template', inject( + function($rootScope, $compile) { + var directiveElement, child; + element = $compile('
                ')($rootScope); + $rootScope.$apply(); + directiveElement = element.find('a'); + child = directiveElement.find('span'); + expect(child.scope()).toBe(directiveElement.isolateScope()); + }) + ); }); }); }); From fafcd6285a6799c4e377ea33011ae3a01aac49a6 Mon Sep 17 00:00:00 2001 From: Rich Snapp Date: Thu, 20 Feb 2014 16:49:27 -0700 Subject: [PATCH 301/837] fix(jqLite): use jQuery only if jQuery.fn.on present Make Angular not bind to jQuery versions older than 1.7 since older versions of jQuery do not support necessary on()/off() methods. --- src/Angular.js | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/Angular.js b/src/Angular.js index f71670665e56..5d5cc2fe7da7 100644 --- a/src/Angular.js +++ b/src/Angular.js @@ -1332,8 +1332,9 @@ function snake_case(name, separator){ function bindJQuery() { // bind to jQuery if present; jQuery = window.jQuery; - // reset to jQuery or default to us. - if (jQuery) { + // Use jQuery if it exists with proper functionality, otherwise default to us. + // Angular 1.2+ requires jQuery 1.7.1+ for on()/off() support. + if (jQuery && jQuery.fn.on) { jqLite = jQuery; extend(jQuery.fn, { scope: JQLitePrototype.scope, From 82448b86b54ad1a7f56256a3f32c64a53452dd66 Mon Sep 17 00:00:00 2001 From: Christopher Rose Date: Thu, 15 May 2014 12:18:22 -0700 Subject: [PATCH 302/837] docs(guide/di): fix typos Closes #7480 --- docs/content/guide/di.ngdoc | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/docs/content/guide/di.ngdoc b/docs/content/guide/di.ngdoc index 06a4353282d3..150b29b18110 100644 --- a/docs/content/guide/di.ngdoc +++ b/docs/content/guide/di.ngdoc @@ -154,7 +154,7 @@ rename the method parameter names. This makes this way of annotating only useful ### `$inject` Property Annotation -To allow the minifers to rename the function parameters and still be able to inject right services, +To allow the minifiers to rename the function parameters and still be able to inject right services, the function needs to be annotated with the `$inject` property. The `$inject` property is an array of service names to inject. @@ -224,7 +224,7 @@ dependencies. - The `run` and `config` methods accept a function, which can also be injected with "service" components as dependencies. -- Controllers are defined by an constructor function, which can be injected with any of the "service" +- Controllers are defined by a constructor function, which can be injected with any of the "service" components as dependencies, but they can also be provided with special dependencies. See "DI in Controllers" below. @@ -288,7 +288,7 @@ application. For example, there would be one instance for every `ng-controller` Moreover, additional dependencies are made available to Controllers: * {@link scope `$scope`}: Controllers are always associated with a point in the DOM and so are provided with - access to the {@link scope scope} at that point. Other components, such as servies only have access to the + access to the {@link scope scope} at that point. Other components, such as services only have access to the singleton {@link $rootScope} service. * {@link $route} resolves: If a controller is instantiated as part of a route, then any values that - are resolved as part of the route are made available for injection into the controller. \ No newline at end of file + are resolved as part of the route are made available for injection into the controller. From 0388eed7e52fdbb832a5b4ef466420a128a43800 Mon Sep 17 00:00:00 2001 From: Lucas Galfaso Date: Thu, 15 May 2014 14:20:47 -0300 Subject: [PATCH 303/837] fix(numberFilter): fix rounding error edge case Fix a number rounding error. Closes #7453 Closes #7478 --- src/ng/filter/filters.js | 4 ++-- test/ng/filter/filtersSpec.js | 4 ++++ 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/src/ng/filter/filters.js b/src/ng/filter/filters.js index 6f9cc48b702f..44543a868a71 100644 --- a/src/ng/filter/filters.js +++ b/src/ng/filter/filters.js @@ -145,8 +145,8 @@ function formatNumber(number, pattern, groupSep, decimalSep, fractionSize) { fractionSize = Math.min(Math.max(pattern.minFrac, fractionLen), pattern.maxFrac); } - var pow = Math.pow(10, fractionSize); - number = Math.round(number * pow) / pow; + var pow = Math.pow(10, fractionSize + 1); + number = Math.floor(number * pow + 5) / pow; var fraction = ('' + number).split(DECIMAL_SEP); var whole = fraction[0]; fraction = fraction[1] || ''; diff --git a/test/ng/filter/filtersSpec.js b/test/ng/filter/filtersSpec.js index 8e6ec1f128f4..b99f65e12afa 100644 --- a/test/ng/filter/filtersSpec.js +++ b/test/ng/filter/filtersSpec.js @@ -148,6 +148,10 @@ describe('filters', function() { expect(number(1234.567, 0)).toEqual("1,235"); expect(number(1234.567, 1)).toEqual("1,234.6"); expect(number(1234.567, 2)).toEqual("1,234.57"); + expect(number(1.255, 0)).toEqual("1"); + expect(number(1.255, 1)).toEqual("1.3"); + expect(number(1.255, 2)).toEqual("1.26"); + expect(number(1.255, 3)).toEqual("1.255"); }); it('should filter exponentially large numbers', function() { From 766b962eac23a9af72870b63e9b086efb3fac080 Mon Sep 17 00:00:00 2001 From: Peter Bacon Darwin Date: Fri, 16 May 2014 12:13:19 +0100 Subject: [PATCH 304/837] docs(guide/services): add reference to ngmin tool Closes #5908 --- docs/content/guide/services.ngdoc | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/docs/content/guide/services.ngdoc b/docs/content/guide/services.ngdoc index bc2a4f85d143..5abede31d818 100644 --- a/docs/content/guide/services.ngdoc +++ b/docs/content/guide/services.ngdoc @@ -130,8 +130,14 @@ injection of `$window`, `$scope`, and our `notify` service:
                -**Careful:** If you plan to [minify](http://en.wikipedia.org/wiki/Minification_(programming) your code, -your variable names will get renamed unless you use one of the annotation techniques above. +**Careful:** If you plan to [minify](http://en.wikipedia.org/wiki/Minification_(programming) your +code, your variable names will get renamed unless you use one of the annotation techniques above. +
                + +
                + If you use a tool like [ngmin](https://github.com/btford/ngmin#ngmin) in your workflow you can + use implicit dependency notation within your codebase and let **ngmin** automatically convert such + injectable functions to the array notation prior to minifying.
                From d566c4bc61b8442b71541ce9b042fe28309b3c7f Mon Sep 17 00:00:00 2001 From: linclark Date: Mon, 24 Mar 2014 18:08:26 -0400 Subject: [PATCH 305/837] docs($resource): clarify paramDefaults usage --- src/ngResource/resource.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/ngResource/resource.js b/src/ngResource/resource.js index a4a59283c215..472531dc4355 100644 --- a/src/ngResource/resource.js +++ b/src/ngResource/resource.js @@ -94,8 +94,8 @@ function shallowClearAndCopy(src, dst) { * Given a template `/path/:verb` and parameter `{verb:'greet', salutation:'Hello'}` results in * URL `/path/greet?salutation=Hello`. * - * If the parameter value is prefixed with `@` then the value of that parameter is extracted from - * the data object (useful for non-GET operations). + * If the parameter value is prefixed with `@` then the value of that parameter will be taken + * from the corresponding key on the data object (useful for non-GET operations). * * @param {Object.=} actions Hash with declaration of custom action that should extend * the default set of resource actions. The declaration should be created in the format of {@link From f440ac7492a76d5a451be15801a62cdc80c8cb1e Mon Sep 17 00:00:00 2001 From: Narretz Date: Thu, 27 Feb 2014 12:33:51 +0100 Subject: [PATCH 306/837] chore(docs): fix layout between 769px and 991px Left nav and main content were tucked slightly under the version picker / breadcrumb navbar Closes #6474 Closes #7079 --- docs/app/assets/css/docs.css | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/docs/app/assets/css/docs.css b/docs/app/assets/css/docs.css index 7ba9a30d64d8..d84b55efe2cc 100644 --- a/docs/app/assets/css/docs.css +++ b/docs/app/assets/css/docs.css @@ -572,6 +572,15 @@ ul.events > li { margin-bottom:40px; } +@media only screen and (min-width: 769px) and (max-width: 991px) { + .main-body-grid { + margin-top: 160px; + } + .main-body-grid > .grid-left { + top: 160px; + } +} + @media only screen and (max-width : 768px) { .picker, .picker select { width:auto; From eaaf4967f9998399e5bea5b87f7b34e4f699ae2e Mon Sep 17 00:00:00 2001 From: nderoche Date: Thu, 27 Feb 2014 17:32:10 +0100 Subject: [PATCH 307/837] docs(ngController): clarify that `this` is `$scope` in example Replace `this` with `$scope` in second example to highlight the fact that we are working with the `$scope` instead of an instance of the controller in this example. Closes #6478 --- src/ng/directive/ngController.js | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/ng/directive/ngController.js b/src/ng/directive/ngController.js index cbe7e833b41d..7130214ce61e 100644 --- a/src/ng/directive/ngController.js +++ b/src/ng/directive/ngController.js @@ -123,16 +123,16 @@ {type:'email', value:'john.smith@example.org'} ]; $scope.greet = function() { - alert(this.name); + alert($scope.name); }; $scope.addContact = function() { - this.contacts.push({type:'email', value:'yourname@example.org'}); + $scope.contacts.push({type:'email', value:'yourname@example.org'}); }; $scope.removeContact = function(contactToRemove) { - var index = this.contacts.indexOf(contactToRemove); - this.contacts.splice(index, 1); + var index = $scope.contacts.indexOf(contactToRemove); + $scope.contacts.splice(index, 1); }; $scope.clearContact = function(contact) { From 497ba08775f3eaeca22df80ca8c7421bef21fe68 Mon Sep 17 00:00:00 2001 From: Peter Bacon Darwin Date: Fri, 16 May 2014 14:23:35 +0100 Subject: [PATCH 308/837] docs(search): set minimum length to 2 With the minimum search length set to 3, it was not possible to search for `$q`. Changing this to 2 fixes that without really upsetting the search display, since we only display the first 40 API and 14 non-API items anyway. Closes #3078 --- docs/app/src/search.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/app/src/search.js b/docs/app/src/search.js index 49d73343bab6..822979531fc5 100644 --- a/docs/app/src/search.js +++ b/docs/app/src/search.js @@ -8,7 +8,7 @@ angular.module('search', []) } $scope.search = function(q) { - var MIN_SEARCH_LENGTH = 3; + var MIN_SEARCH_LENGTH = 2; if(q.length >= MIN_SEARCH_LENGTH) { var results = docsSearch(q); var totalAreas = 0; From dd5215eceb5a08f42cd46c9a9d586cee0fcfaa5c Mon Sep 17 00:00:00 2001 From: Peter Bacon Darwin Date: Fri, 16 May 2014 14:33:09 +0100 Subject: [PATCH 309/837] docs(search): fix search submit functionality When the search input box was submitted (i.e. by pressing enter) the app was supposed to take you to the first item but this was not happening. It turns out the app was just reading the wrong property for the path to the item. Closes #3078 --- docs/app/src/search.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/app/src/search.js b/docs/app/src/search.js index 822979531fc5..237558714011 100644 --- a/docs/app/src/search.js +++ b/docs/app/src/search.js @@ -35,7 +35,7 @@ angular.module('search', []) } } if(result) { - $location.path(result.url); + $location.path(result.path); $scope.hideResults(); } }; From 14e9be202adfb9ce972f2ef3604bb82dac10ded8 Mon Sep 17 00:00:00 2001 From: Zachary Babtkis Date: Mon, 16 Dec 2013 15:42:55 -0800 Subject: [PATCH 310/837] docs(guide/css-styling): tiny grammar fix Closes #5443 --- docs/content/guide/css-styling.ngdoc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/content/guide/css-styling.ngdoc b/docs/content/guide/css-styling.ngdoc index 3ca7a00d99d5..c96620b36b8f 100644 --- a/docs/content/guide/css-styling.ngdoc +++ b/docs/content/guide/css-styling.ngdoc @@ -8,7 +8,7 @@ Angular sets these CSS classes. It is up to your application to provide useful s # CSS classes used by angular * `ng-scope` - - **Usage:** angular applies this class to any element that where a new {@link ng.$rootScope.Scope scope} + - **Usage:** angular applies this class to any element for which a new {@link api/ng.$rootScope.Scope scope} is defined. (see {@link guide/scope scope} guide for more information about scopes) * `ng-binding` From e76105a320a0e0db38a4edb3e94e86ac849cb13d Mon Sep 17 00:00:00 2001 From: Jonathan Gotti Date: Fri, 16 May 2014 11:38:45 +0200 Subject: [PATCH 311/837] docs(guide/directives): improve links to isolate scope docs Link "isolate scope" to "Directive Definition object" section Closes #7484 --- docs/content/guide/directive.ngdoc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/content/guide/directive.ngdoc b/docs/content/guide/directive.ngdoc index 524d3d9bc4ac..7af76742492c 100644 --- a/docs/content/guide/directive.ngdoc +++ b/docs/content/guide/directive.ngdoc @@ -510,8 +510,8 @@ that you explicitly pass in.
                **Note:** Normally, a scope prototypically inherits from its parent. An isolated scope does not. -See the {@link guide/directive#isolating-the-scope-of-a-directive -"Isolating the Scope of a Directive"} section for more information about isolate scopes. +See the {@link api/ng/service/$compile#directive-definition-object +"Directive Definition Object - scope"} section for more information about isolate scopes.
                From 113850602de2f8bc396df4ffd54bb0f1be565b17 Mon Sep 17 00:00:00 2001 From: Vojta Jina Date: Wed, 14 May 2014 14:25:54 +0200 Subject: [PATCH 312/837] fix($compile): pass transcludeFn down to nested transclude directives If you have two directives that both expect to receive transcluded content the outer directive works but the inner directive never receives a transclusion function. This only failed if the first transclude directive was not the first directive found in compilation. Fixes #7240 Closes #7387 --- src/ng/compile.js | 23 ++++++++------ test/ng/compileSpec.js | 72 ++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 86 insertions(+), 9 deletions(-) diff --git a/src/ng/compile.js b/src/ng/compile.js index 5ee6463bb6de..2f5eadfc5919 100644 --- a/src/ng/compile.js +++ b/src/ng/compile.js @@ -924,7 +924,7 @@ function $CompileProvider($provide, $$sanitizeUriProvider) { return linkFnFound ? compositeLinkFn : null; function compositeLinkFn(scope, nodeList, $rootElement, boundTranscludeFn) { - var nodeLinkFn, childLinkFn, node, $node, childScope, childTranscludeFn, i, ii, n; + var nodeLinkFn, childLinkFn, node, $node, childScope, i, ii, n; // copy nodeList so that linking doesn't break due to live list updates. var nodeListLength = nodeList.length, @@ -946,14 +946,17 @@ function $CompileProvider($provide, $$sanitizeUriProvider) { } else { childScope = scope; } - childTranscludeFn = nodeLinkFn.transclude; - if (childTranscludeFn || (!boundTranscludeFn && transcludeFn)) { - nodeLinkFn(childLinkFn, childScope, node, $rootElement, - createBoundTranscludeFn(scope, childTranscludeFn || transcludeFn) - ); - } else { - nodeLinkFn(childLinkFn, childScope, node, $rootElement, boundTranscludeFn); + + // We need to create a new boundTranscludeFn if + // - a directive on this element wants to transclude + // or + // - there is no boundTranscludeFn already and a transcludeFn was passed in + if ( nodeLinkFn.transcludeOnThisElement || (!boundTranscludeFn && transcludeFn) ) { + boundTranscludeFn = createBoundTranscludeFn(scope, nodeLinkFn.transclude || transcludeFn); } + + nodeLinkFn(childLinkFn, childScope, node, $rootElement, boundTranscludeFn); + } else if (childLinkFn) { childLinkFn(scope, node.childNodes, undefined, boundTranscludeFn); } @@ -1329,7 +1332,9 @@ function $CompileProvider($provide, $$sanitizeUriProvider) { } nodeLinkFn.scope = newScopeDirective && newScopeDirective.scope === true; - nodeLinkFn.transclude = hasTranscludeDirective && childTranscludeFn; + nodeLinkFn.transcludeOnThisElement = hasTranscludeDirective; + nodeLinkFn.transclude = childTranscludeFn; + previousCompileContext.hasElementTranscludeDirective = hasElementTranscludeDirective; // might be normal or delayed nodeLinkFn depending on if templateUrl is present diff --git a/test/ng/compileSpec.js b/test/ng/compileSpec.js index 4b0cfcd61c2a..01c82066e608 100755 --- a/test/ng/compileSpec.js +++ b/test/ng/compileSpec.js @@ -1436,6 +1436,78 @@ describe('$compile', function() { )); + describe('nested transcludes', function() { + + beforeEach(module(function($compileProvider) { + + $compileProvider.directive('noop', valueFn({})); + + $compileProvider.directive('sync', valueFn({ + template: '
                ', + transclude: true + })); + + $compileProvider.directive('async', valueFn({ + templateUrl: 'async', + transclude: true + })); + + $compileProvider.directive('syncSync', valueFn({ + template: '
                ', + transclude: true + })); + + $compileProvider.directive('syncAsync', valueFn({ + template: '
                ', + transclude: true + })); + + $compileProvider.directive('asyncSync', valueFn({ + templateUrl: 'asyncSync', + transclude: true + })); + + $compileProvider.directive('asyncAsync', valueFn({ + templateUrl: 'asyncAsync', + transclude: true + })); + + })); + + beforeEach(inject(function($templateCache) { + $templateCache.put('async', '
                '); + $templateCache.put('asyncSync', '
                '); + $templateCache.put('asyncAsync', '
                '); + })); + + + it('should allow nested transclude directives with sync template containing sync template', inject(function($compile, $rootScope) { + element = $compile('
                transcluded content
                ')($rootScope); + $rootScope.$digest(); + expect(element.text().trim()).toEqual('transcluded content'); + })); + + it('should allow nested transclude directives with sync template containing async template', inject(function($compile, $rootScope) { + element = $compile('
                transcluded content
                ')($rootScope); + $rootScope.$digest(); + expect(element.text().trim()).toEqual('transcluded content'); + })); + + it('should allow nested transclude directives with async template containing sync template', inject(function($compile, $rootScope) { + element = $compile('
                transcluded content
                ')($rootScope); + $rootScope.$digest(); + expect(element.text().trim()).toEqual('transcluded content'); + })); + + it('should allow nested transclude directives with async template containing asynch template', inject(function($compile, $rootScope) { + element = $compile('
                transcluded content
                ')($rootScope); + $rootScope.$digest(); + expect(element.text().trim()).toEqual('transcluded content'); + })); + }); + + + it("should fail if replacing and template doesn't have a single root element", function() { module(function($exceptionHandlerProvider) { $exceptionHandlerProvider.mode('log'); From f8a1c56cadc2a8426aabd0598fa69be4e67c2d04 Mon Sep 17 00:00:00 2001 From: M Alix Date: Fri, 11 Apr 2014 16:09:28 -0400 Subject: [PATCH 313/837] chore($compile): make webstorm's regexp parser happy Minor change puts \- at end of character pattern In CLASS_DIRECTIVE_REGEXP and COMMENT_DIRECTIVE_REGEXP, putting the \- character at the end of the character patter speeds up many IDE parsers and alleviates some errors in certain IDE's. (WebStorm 8) Functionally absolutely equivalent. No test change needed. Closes #7093 --- src/ng/compile.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/ng/compile.js b/src/ng/compile.js index 2f5eadfc5919..a1002b1cc627 100644 --- a/src/ng/compile.js +++ b/src/ng/compile.js @@ -512,8 +512,8 @@ $CompileProvider.$inject = ['$provide', '$$sanitizeUriProvider']; function $CompileProvider($provide, $$sanitizeUriProvider) { var hasDirectives = {}, Suffix = 'Directive', - COMMENT_DIRECTIVE_REGEXP = /^\s*directive\:\s*([\d\w\-_]+)\s+(.*)$/, - CLASS_DIRECTIVE_REGEXP = /(([\d\w\-_]+)(?:\:([^;]+))?;?)/; + COMMENT_DIRECTIVE_REGEXP = /^\s*directive\:\s*([\d\w_\-]+)\s+(.*)$/, + CLASS_DIRECTIVE_REGEXP = /(([\d\w_\-]+)(?:\:([^;]+))?;?)/; // Ref: http://developers.whatwg.org/webappapis.html#event-handler-idl-attributes // The assumption is that future DOM event attribute names will begin with From a4cc9e194468573bae5232f63044459d0de6638f Mon Sep 17 00:00:00 2001 From: Shahar Talmi Date: Sat, 26 Apr 2014 17:17:50 +0300 Subject: [PATCH 314/837] fix(ngClass): handle index changes when an item is unshifted Closes #7256 --- src/ng/directive/ngClass.js | 2 +- test/ng/directive/ngClassSpec.js | 22 ++++++++++++++++++++++ 2 files changed, 23 insertions(+), 1 deletion(-) diff --git a/src/ng/directive/ngClass.js b/src/ng/directive/ngClass.js index b00dbc666406..82aaad893497 100644 --- a/src/ng/directive/ngClass.js +++ b/src/ng/directive/ngClass.js @@ -19,7 +19,7 @@ function classDirective(name, selector) { scope.$watch('$index', function($index, old$index) { // jshint bitwise: false var mod = $index & 1; - if (mod !== old$index & 1) { + if (mod !== (old$index & 1)) { var classes = arrayClasses(scope.$eval(attr[name])); mod === selector ? addClasses(classes) : diff --git a/test/ng/directive/ngClassSpec.js b/test/ng/directive/ngClassSpec.js index 3b485ba24894..e12c89fc9f99 100644 --- a/test/ng/directive/ngClassSpec.js +++ b/test/ng/directive/ngClassSpec.js @@ -274,6 +274,28 @@ describe('ngClass', function() { })); + it('should update ngClassOdd/Even when an item is added to the model', inject(function($rootScope, $compile) { + element = $compile('
                  ' + + '
                • i
                • ' + + '
                    ')($rootScope); + $rootScope.items = ['b','c','d']; + $rootScope.$digest(); + + $rootScope.items.unshift('a'); + $rootScope.$digest(); + + var e1 = jqLite(element[0].childNodes[1]); + var e4 = jqLite(element[0].childNodes[7]); + + expect(e1.hasClass('odd')).toBeTruthy(); + expect(e1.hasClass('even')).toBeFalsy(); + + expect(e4.hasClass('even')).toBeTruthy(); + expect(e4.hasClass('odd')).toBeFalsy(); + })); + + it('should update ngClassOdd/Even when model is changed by filtering', inject(function($rootScope, $compile) { element = $compile('
                      ' + '
                    • Date: Fri, 16 May 2014 18:18:26 -0700 Subject: [PATCH 315/837] test($compile): use `trim` helper --- test/ng/compileSpec.js | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/test/ng/compileSpec.js b/test/ng/compileSpec.js index 01c82066e608..2c23e6d9db5e 100755 --- a/test/ng/compileSpec.js +++ b/test/ng/compileSpec.js @@ -1484,25 +1484,25 @@ describe('$compile', function() { it('should allow nested transclude directives with sync template containing sync template', inject(function($compile, $rootScope) { element = $compile('
                      transcluded content
                      ')($rootScope); $rootScope.$digest(); - expect(element.text().trim()).toEqual('transcluded content'); + expect(trim(element.text())).toEqual('transcluded content'); })); it('should allow nested transclude directives with sync template containing async template', inject(function($compile, $rootScope) { element = $compile('
                      transcluded content
                      ')($rootScope); $rootScope.$digest(); - expect(element.text().trim()).toEqual('transcluded content'); + expect(trim(element.text())).toEqual('transcluded content'); })); it('should allow nested transclude directives with async template containing sync template', inject(function($compile, $rootScope) { element = $compile('
                      transcluded content
                      ')($rootScope); $rootScope.$digest(); - expect(element.text().trim()).toEqual('transcluded content'); + expect(trim(element.text())).toEqual('transcluded content'); })); it('should allow nested transclude directives with async template containing asynch template', inject(function($compile, $rootScope) { element = $compile('
                      transcluded content
                      ')($rootScope); $rootScope.$digest(); - expect(element.text().trim()).toEqual('transcluded content'); + expect(trim(element.text())).toEqual('transcluded content'); })); }); From 2866daf7d66ce6742385d6692df82555abbb36b8 Mon Sep 17 00:00:00 2001 From: Kebabpizza Date: Mon, 19 May 2014 02:42:30 +0200 Subject: [PATCH 316/837] docs(tutorial): fix link to bower in step 12 Muchas gracias! \o/ --- docs/content/tutorial/step_12.ngdoc | 2 ++ 1 file changed, 2 insertions(+) diff --git a/docs/content/tutorial/step_12.ngdoc b/docs/content/tutorial/step_12.ngdoc index 802435375a24..6f7b45e2f18a 100644 --- a/docs/content/tutorial/step_12.ngdoc +++ b/docs/content/tutorial/step_12.ngdoc @@ -523,3 +523,5 @@ There you have it! We have created a web app in a relatively short amount of ti the_end closing notes} we'll cover where to go from here.
                        + +[bower]: http://bower.io/ From de1461da7863209f9fde1ff61470edb83d446cf2 Mon Sep 17 00:00:00 2001 From: Diego Plentz Date: Thu, 24 Apr 2014 21:17:17 -0300 Subject: [PATCH 317/837] docs(guide/$location) remove duplicate 'Crawling your app' section The "Crawling your app" section was duplicated. I just removed the duplication and moved the section to the 'Caveats' section. Closes #7244 --- docs/content/guide/$location.ngdoc | 42 ++++++++++-------------------- 1 file changed, 14 insertions(+), 28 deletions(-) diff --git a/docs/content/guide/$location.ngdoc b/docs/content/guide/$location.ngdoc index a025aa47c562..468e503f4f80 100644 --- a/docs/content/guide/$location.ngdoc +++ b/docs/content/guide/$location.ngdoc @@ -237,20 +237,6 @@ it('should show example', inject( )); ``` -### Crawling your app - -To allow indexing of your AJAX application, you have to add special meta tag in the head section of -your document: - -```html - -``` - -This will cause crawler bot to request links with `_escaped_fragment_` param so that your server -can recognize the crawler and serve a HTML snapshots. For more information about this technique, -see [Making AJAX Applications -Crawlable](http://code.google.com/web/ajaxcrawling/docs/specification.html). - ## HTML5 mode In HTML5 mode, the `$location` service getters and setters interact with the browser URL address @@ -344,20 +330,6 @@ are not prefixed with `.` and will not be intercepted by the `otherwise` rule in Using this mode requires URL rewriting on server side, basically you have to rewrite all your links to entry point of your application (e.g. index.html) -### Crawling your app - -If you want your AJAX application to be indexed by web crawlers, you will need to add the following -meta tag to the HEAD section of your document: - -```html - -``` - -This statement causes a crawler to request links with an empty `_escaped_fragment_` parameter so that -your server can recognize the crawler and serve it HTML snapshots. For more information about this -technique, see [Making AJAX -Applications Crawlable](http://code.google.com/web/ajaxcrawling/docs/specification.html). - ### Relative links Be sure to check all relative links, images, scripts etc. You must either specify the url base in @@ -525,6 +497,20 @@ forward slash if it is missing. Note that the `!` prefix in the hashbang mode is not part of `$location.path()`; it is actually hashPrefix. +## Crawling your app + +To allow indexing of your AJAX application, you have to add special meta tag in the head section of +your document: + +```html + +``` + +This will cause crawler bot to request links with `_escaped_fragment_` param so that your server +can recognize the crawler and serve a HTML snapshots. For more information about this technique, +see [Making AJAX Applications +Crawlable](http://code.google.com/web/ajaxcrawling/docs/specification.html). + # Testing with the $location service From 9d4fa33e35d73ab28a8a187e20dfbe1f77055825 Mon Sep 17 00:00:00 2001 From: Igor Minar Date: Sat, 17 May 2014 16:04:37 -0700 Subject: [PATCH 318/837] perf($interpolate): optimize value stringification previously we stringified numbers via toJson which was expensive, I optimized the code so that toJson is invoked only if really necessary Closes #7501 --- src/ng/interpolate.js | 20 +++++++++++++++++--- 1 file changed, 17 insertions(+), 3 deletions(-) diff --git a/src/ng/interpolate.js b/src/ng/interpolate.js index 6b61e56f2a70..05b1cf2f90c6 100644 --- a/src/ng/interpolate.js +++ b/src/ng/interpolate.js @@ -178,10 +178,24 @@ function $InterpolateProvider() { } else { part = $sce.valueOf(part); } - if (part === null || isUndefined(part)) { + if (part == null) { // null || undefined part = ''; - } else if (typeof part != 'string') { - part = toJson(part); + } else { + switch (typeof part) { + case 'string': + { + break; + } + case 'number': + { + part = '' + part; + break; + } + default: + { + part = toJson(part); + } + } } } concat[i] = part; From bcb53deda85777d1a89cefae0b6c7fd1ac561cc1 Mon Sep 17 00:00:00 2001 From: Slava Fomin Date: Sun, 18 May 2014 12:37:26 +0400 Subject: [PATCH 319/837] docs(NgAnimate): update the list of supported animations Closes #7502 --- docs/content/guide/animations.ngdoc | 21 ++++++++++++--------- 1 file changed, 12 insertions(+), 9 deletions(-) diff --git a/docs/content/guide/animations.ngdoc b/docs/content/guide/animations.ngdoc index 1699c275b36f..7c8612d9732c 100644 --- a/docs/content/guide/animations.ngdoc +++ b/docs/content/guide/animations.ngdoc @@ -251,15 +251,18 @@ Although the CSS is a little different then what we saw before, the idea is the A handful of common AngularJS directives support and trigger animation hooks whenever any major event occurs during its life cycle. The table below explains in detail which animation events are triggered -| Directive | Supported Animations | -|-------------------------------------------------------------------------------------|------------------------------------------| -| {@link ng.directive:ngRepeat#usage_animations ngRepeat} | enter, leave, and move | -| {@link ngRoute.directive:ngView#usage_animations ngView} | enter and leave | -| {@link ng.directive:ngInclude#usage_animations ngInclude} | enter and leave | -| {@link ng.directive:ngSwitch#usage_animations ngSwitch} | enter and leave | -| {@link ng.directive:ngIf#usage_animations ngIf} | enter and leave | -| {@link ng.directive:ngClass#usage_animations ngClass or {{class}}} | add and remove | -| {@link ng.directive:ngShow#usage_animations ngShow & ngHide} | add and remove (the ng-hide class value) | + -| Directive | Supported Animations | + -|-----------------------------------------------------------------|--------------------------------------------------------------------------| + -| {@link ng.directive:ngRepeat#usage_animations ngRepeat} | enter, leave and move | + -| {@link ngRoute.directive:ngView#usage_animations ngView} | enter and leave | + -| {@link ng.directive:ngInclude#usage_animations ngInclude} | enter and leave | + -| {@link ng.directive:ngSwitch#usage_animations ngSwitch} | enter and leave | + -| {@link ng.directive:ngIf#usage_animations ngIf} | enter and leave | + -| {@link ng.directive:ngClass#usage_animations ngClass} | add and remove | + -| {@link ng.directive:ngShow#usage_animations ngShow & ngHide} | add and remove (the ng-hide class value) | + -| {@link ng.directive:form#usage_animations form} | add and remove (dirty, pristine, valid, invalid & all other validations) | + -| {@link ng.directive:ngModel#usage_animations ngModel} | add and remove (dirty, pristine, valid, invalid & all other validations) | + For a full breakdown of the steps involved during each animation event, refer to the {@link ngAnimate.$animate API docs}. From 240608447a8b8587fc85541589fd72e354f8fb04 Mon Sep 17 00:00:00 2001 From: Igor Minar Date: Mon, 19 May 2014 14:57:03 -0700 Subject: [PATCH 320/837] revert: fix($compile): pass transcludeFn down to nested transclude directives This reverts commit 113850602de2f8bc396df4ffd54bb0f1be565b17. This change introduced regressions for several scenarios. reduction: http://jsfiddle.net/5242N/4/ --- src/ng/compile.js | 23 ++++++-------- test/ng/compileSpec.js | 72 ------------------------------------------ 2 files changed, 9 insertions(+), 86 deletions(-) diff --git a/src/ng/compile.js b/src/ng/compile.js index a1002b1cc627..958d2eb2bb65 100644 --- a/src/ng/compile.js +++ b/src/ng/compile.js @@ -924,7 +924,7 @@ function $CompileProvider($provide, $$sanitizeUriProvider) { return linkFnFound ? compositeLinkFn : null; function compositeLinkFn(scope, nodeList, $rootElement, boundTranscludeFn) { - var nodeLinkFn, childLinkFn, node, $node, childScope, i, ii, n; + var nodeLinkFn, childLinkFn, node, $node, childScope, childTranscludeFn, i, ii, n; // copy nodeList so that linking doesn't break due to live list updates. var nodeListLength = nodeList.length, @@ -946,17 +946,14 @@ function $CompileProvider($provide, $$sanitizeUriProvider) { } else { childScope = scope; } - - // We need to create a new boundTranscludeFn if - // - a directive on this element wants to transclude - // or - // - there is no boundTranscludeFn already and a transcludeFn was passed in - if ( nodeLinkFn.transcludeOnThisElement || (!boundTranscludeFn && transcludeFn) ) { - boundTranscludeFn = createBoundTranscludeFn(scope, nodeLinkFn.transclude || transcludeFn); + childTranscludeFn = nodeLinkFn.transclude; + if (childTranscludeFn || (!boundTranscludeFn && transcludeFn)) { + nodeLinkFn(childLinkFn, childScope, node, $rootElement, + createBoundTranscludeFn(scope, childTranscludeFn || transcludeFn) + ); + } else { + nodeLinkFn(childLinkFn, childScope, node, $rootElement, boundTranscludeFn); } - - nodeLinkFn(childLinkFn, childScope, node, $rootElement, boundTranscludeFn); - } else if (childLinkFn) { childLinkFn(scope, node.childNodes, undefined, boundTranscludeFn); } @@ -1332,9 +1329,7 @@ function $CompileProvider($provide, $$sanitizeUriProvider) { } nodeLinkFn.scope = newScopeDirective && newScopeDirective.scope === true; - nodeLinkFn.transcludeOnThisElement = hasTranscludeDirective; - nodeLinkFn.transclude = childTranscludeFn; - + nodeLinkFn.transclude = hasTranscludeDirective && childTranscludeFn; previousCompileContext.hasElementTranscludeDirective = hasElementTranscludeDirective; // might be normal or delayed nodeLinkFn depending on if templateUrl is present diff --git a/test/ng/compileSpec.js b/test/ng/compileSpec.js index 2c23e6d9db5e..4b0cfcd61c2a 100755 --- a/test/ng/compileSpec.js +++ b/test/ng/compileSpec.js @@ -1436,78 +1436,6 @@ describe('$compile', function() { )); - describe('nested transcludes', function() { - - beforeEach(module(function($compileProvider) { - - $compileProvider.directive('noop', valueFn({})); - - $compileProvider.directive('sync', valueFn({ - template: '
                        ', - transclude: true - })); - - $compileProvider.directive('async', valueFn({ - templateUrl: 'async', - transclude: true - })); - - $compileProvider.directive('syncSync', valueFn({ - template: '
                        ', - transclude: true - })); - - $compileProvider.directive('syncAsync', valueFn({ - template: '
                        ', - transclude: true - })); - - $compileProvider.directive('asyncSync', valueFn({ - templateUrl: 'asyncSync', - transclude: true - })); - - $compileProvider.directive('asyncAsync', valueFn({ - templateUrl: 'asyncAsync', - transclude: true - })); - - })); - - beforeEach(inject(function($templateCache) { - $templateCache.put('async', '
                        '); - $templateCache.put('asyncSync', '
                        '); - $templateCache.put('asyncAsync', '
                        '); - })); - - - it('should allow nested transclude directives with sync template containing sync template', inject(function($compile, $rootScope) { - element = $compile('
                        transcluded content
                        ')($rootScope); - $rootScope.$digest(); - expect(trim(element.text())).toEqual('transcluded content'); - })); - - it('should allow nested transclude directives with sync template containing async template', inject(function($compile, $rootScope) { - element = $compile('
                        transcluded content
                        ')($rootScope); - $rootScope.$digest(); - expect(trim(element.text())).toEqual('transcluded content'); - })); - - it('should allow nested transclude directives with async template containing sync template', inject(function($compile, $rootScope) { - element = $compile('
                        transcluded content
                        ')($rootScope); - $rootScope.$digest(); - expect(trim(element.text())).toEqual('transcluded content'); - })); - - it('should allow nested transclude directives with async template containing asynch template', inject(function($compile, $rootScope) { - element = $compile('
                        transcluded content
                        ')($rootScope); - $rootScope.$digest(); - expect(trim(element.text())).toEqual('transcluded content'); - })); - }); - - - it("should fail if replacing and template doesn't have a single root element", function() { module(function($exceptionHandlerProvider) { $exceptionHandlerProvider.mode('log'); From c5e39c688bb48d5c3b3fbc74018ba6785f74704e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ga=C3=ABtan=20PRIOUR?= Date: Sun, 18 May 2014 17:44:32 +0000 Subject: [PATCH 321/837] docs(tutorial): fixed path to controllersSpec.js file MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ☆.。.:*・゜☆ DOMO ARIGATO MR ROBOTO ☆.。.:*・゜☆ --- docs/content/tutorial/step_02.ngdoc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/content/tutorial/step_02.ngdoc b/docs/content/tutorial/step_02.ngdoc index 2396b2416c51..09c7fc2dc471 100644 --- a/docs/content/tutorial/step_02.ngdoc +++ b/docs/content/tutorial/step_02.ngdoc @@ -223,7 +223,7 @@ To run the tests, and then watch the files for changes: `npm test`. Refresh your browser and verify that it says "Hello, World!". -* Update the unit test for the controller in ./tests/unit/controllersSpec.js to reflect the previous change. For example by adding: +* Update the unit test for the controller in ./test/unit/controllersSpec.js to reflect the previous change. For example by adding: expect(scope.name).toBe('World'); From cecd5214dff5de94c4812030d4ca77651e372aad Mon Sep 17 00:00:00 2001 From: Ralph Giles Date: Tue, 20 May 2014 14:36:00 -0700 Subject: [PATCH 322/837] docs(*): fix its vs it's typos. Only use the apostrophe if you can expand "it's" to "it is" and still have a grammatical phrase. --- src/ngAnimate/animate.js | 2 +- src/ngScenario/Future.js | 6 +++--- test/ngRoute/directive/ngViewSpec.js | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/ngAnimate/animate.js b/src/ngAnimate/animate.js index 80544fc0f99d..c4fbef7f2238 100644 --- a/src/ngAnimate/animate.js +++ b/src/ngAnimate/animate.js @@ -708,7 +708,7 @@ angular.module('ngAnimate', ['ng']) * @function * @description Adds and/or removes the given CSS classes to and from the element. * Once complete, the done() callback will be fired (if provided). - * @param {DOMElement} element the element which will it's CSS classes changed + * @param {DOMElement} element the element which will its CSS classes changed * removed from it * @param {string} add the CSS classes which will be added to the element * @param {string} remove the CSS class which will be removed from the element diff --git a/src/ngScenario/Future.js b/src/ngScenario/Future.js index 4161bef7a123..7da2ae1249e9 100644 --- a/src/ngScenario/Future.js +++ b/src/ngScenario/Future.js @@ -38,7 +38,7 @@ angular.scenario.Future.prototype.execute = function(doneFn) { }; /** - * Configures the future to convert it's final with a function fn(value) + * Configures the future to convert its final with a function fn(value) * * @param {function()} fn function(value) that returns the parsed value */ @@ -48,7 +48,7 @@ angular.scenario.Future.prototype.parsedWith = function(fn) { }; /** - * Configures the future to parse it's final value from JSON + * Configures the future to parse its final value from JSON * into objects. */ angular.scenario.Future.prototype.fromJson = function() { @@ -56,7 +56,7 @@ angular.scenario.Future.prototype.fromJson = function() { }; /** - * Configures the future to convert it's final value from objects + * Configures the future to convert its final value from objects * into JSON. */ angular.scenario.Future.prototype.toJson = function() { diff --git a/test/ngRoute/directive/ngViewSpec.js b/test/ngRoute/directive/ngViewSpec.js index 11a13e408cd4..aa06fe13a09d 100644 --- a/test/ngRoute/directive/ngViewSpec.js +++ b/test/ngRoute/directive/ngViewSpec.js @@ -584,7 +584,7 @@ describe('ngView and transcludes', function() { }); }); - it("should compile it's content correctly (although we remove it later)", function() { + it("should compile its content correctly (although we remove it later)", function() { var testElement; module(function($compileProvider, $routeProvider) { $routeProvider.when('/view', {template: ' '}); From fd49d6634c9a398539b1bc9244b52b4fb2b4164f Mon Sep 17 00:00:00 2001 From: Wes Alvaro Date: Wed, 7 May 2014 13:01:19 -0700 Subject: [PATCH 323/837] docs(ngRoute): $routeParams is Object. Closes #7386 --- src/ngRoute/routeParams.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ngRoute/routeParams.js b/src/ngRoute/routeParams.js index c9c4a48f85cc..7e8e0d01ccbc 100644 --- a/src/ngRoute/routeParams.js +++ b/src/ngRoute/routeParams.js @@ -33,7 +33,7 @@ ngRouteModule.provider('$routeParams', $RouteParamsProvider); * // Route: /Chapter/:chapterId/Section/:sectionId * // * // Then - * $routeParams ==> {chapterId:1, sectionId:2, search:'moby'} + * $routeParams ==> {chapterId:'1', sectionId:'2', search:'moby'} * ``` */ function $RouteParamsProvider() { From 6d8abaedd8c690cc663942924ba7fa1d90ae8cd9 Mon Sep 17 00:00:00 2001 From: Eli Dalbey Date: Tue, 20 May 2014 20:46:18 -0400 Subject: [PATCH 324/837] docs(guide/concepts-module-service.png): Typo in image The ng-app was called ng=app in diagram image. Closes #6473 Closes #7528 --- docs/img/guide/concepts-module-service.png | Bin 63452 -> 57281 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/docs/img/guide/concepts-module-service.png b/docs/img/guide/concepts-module-service.png index b7580be21b87627990f8d132ebbb1830d99ce50d..b2b361b202265123cfac80575aa3a07233d094b3 100644 GIT binary patch literal 57281 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 literal 63452 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¥dyA)AdMR=r-?5uQ^nM$)!pz1u^$h&E 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 From ccc8ec869b213ae524a596109aa0b730454f937c Mon Sep 17 00:00:00 2001 From: Peter Bacon Darwin Date: Wed, 21 May 2014 13:58:36 +0100 Subject: [PATCH 325/837] docs(tutorial/step-5): update image to match code Closes #2753 --- docs/app/assets/img/tutorial/tutorial_05.png | Bin 0 -> 40911 bytes docs/app/assets/img/tutorial/tutorial_05.pptx | Bin 0 -> 62896 bytes .../assets/img/tutorial/xhr_service_final.png | Bin 144043 -> 0 bytes docs/content/tutorial/step_05.ngdoc | 2 +- 4 files changed, 1 insertion(+), 1 deletion(-) create mode 100644 docs/app/assets/img/tutorial/tutorial_05.png create mode 100644 docs/app/assets/img/tutorial/tutorial_05.pptx delete mode 100644 docs/app/assets/img/tutorial/xhr_service_final.png diff --git a/docs/app/assets/img/tutorial/tutorial_05.png b/docs/app/assets/img/tutorial/tutorial_05.png new file mode 100644 index 0000000000000000000000000000000000000000..be30217427319635fbe0881d8e9814d4122d1cf9 GIT binary patch literal 40911 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 QEoJ}$Pgg&ebxsLQ02)7ULI3~& literal 0 HcmV?d00001 diff --git a/docs/app/assets/img/tutorial/tutorial_05.pptx b/docs/app/assets/img/tutorial/tutorial_05.pptx new file mode 100644 index 0000000000000000000000000000000000000000..1afe4c3df5b163f8b9c9652c77b3debef9499f6f GIT binary patch literal 62896 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%0DW^?nUq~&Jc=c}dnSVNuI&+! z(#U7(GBpPLEbDU!ZX!W(Awj~d$|f~mr96)kXM$9(&KrnSM=ew<+fPp618`=M z9k@Y9ROi-M*J5S~ai)qys}q*W%-{+@$U6GI?o*j>VpmzFH^NUhp|?q`$%#g0O)9$( zG=JXVV%ZpT(M4rEB5I*r1Es{$0ae)^?KHbNtO;No60EcS`}mID?T()T_tQ!@I5>x9(EC> z>8Y@Mp)9WwXh$JJQhT&Eh)n|uP?;2loswh}m<;F{Yp*f1SGB1{254wbh}ZowvbNz^@Ie z>G*g%x~*Y9G|Ge$IW(jtD#})Za0s!Q&+a~dIg!%Nws|o%vUew1bsQUc2@7^PO*)=; zLBksJUAD@>Fxrtui@E39@j%RjMLW!x>&fElX_0!M&&yoJgX-PKN(HCVJp6;j0(LgN z~b6b9(HPblJ}R9+0@$li)M++XueEEQ{vD+0xZkTzlC% zy}+i#I6CC(+1gwPZN*tsrR5|8_tz)eCfxehopMMbKKPszEME<1wAGd&V1}Fxe6PNt zARAinkgX*v%>FaArfGmy+@bZlIVKue<=Q!%{;y_A_?zX~Wvf1>;{AXZ+pXzh19!Dm63aF={+_5VxV?)q+;VQ}`;) z)S+wo^af*&RiNp+3FsiJ2u28Xi{bvhu5Fl1lXmd=968$OKOg-o+-Ccu#j#TLLT>%D z3dC=IrRUx)oWS-jv4Gy>e+yyO)CZC_U`>q6-LP4$pD|!*9owIHz9#7hl(>?@UuC%M z={4Op{CNBv$J|(=WE>D%=ew^j;!ZRdWjplzYHV?qWMUkuCx(-s zP_^=EG@@Di4EDy~Fk9*8 z*x``F;VskU#Yli@XY`};jf-A_Nswm)#UxqNc_zu$2XX2~AMc~hT2=v6ZW{}=<(Qqt z^XA7YT+gwUW;Lv1B^_#cDL(Y2l45 z1GYQcatUFSopYoGYKRn>A^>=P0)FD5TBm}Loul5E_8W$gA~#h2^f)inF5&a zEXgD7068Fm7=bTvlVyaI@~I*T)6?yeJ@u%LQbGtD8Tg;hQiGZppXSQi(c41`pP|a7cfG!(VW59e=%#{akE9Bcw z8K**|zj+I<;CxOS;t={Y&VqG;pe1buy!R>+6gP{k1-uLlM83ADM>G+2N)f8|RZ43q*q*s=4WD$i+G07Td+QYTgi@+)bvKQb` zp6P0g!LacU)+R~3#Lgpr@J_>QLQ4rEJlwKAIOn8Na#zgD4hGo>lKjl8^HoiXKAp)} z&SOoW460k~ZYg|%tM5D@xTL5vcZdYam5X<8-@`&u(AP6zmQi43Phf07UWZw&%qVJX zQ(rG4F*dP4U|rzt;3!-b_cw2~%T2D~CJA$Gt1LDQQv|NhRB*De^{In2Xr3pr4m?q2 zp{>>(k&V2=sNb{!Ip48Y?k_jKC(qUqKZ0c;mWHRKw#Z?Wd=n3_Mk5$A&fcOVvM97l zGD|O3Ux#0wVdrKAGcTHEf#1SlL2{E*}Os#haSw8GHt6l$xA@nElL=$ze0|FA|h zsJ@rF;%xXzNF3(qG?RAw;DwkyU9dZIGF=dlGJ!Ik4yLmQs>p$0qEo|v``xzD61wcP z-XPMUGydG8z#f+%#f%{a2=7zuMPfZ_pKzM`L7eKzuj3AQtleqb`Wc=<7^-|DhFOn% zP%x5?yWYjhh=(??!hUhtw_C-&bM<`9=8bG$G8?M_e~8gns5U;EDS?yN$Y(BNZgIZv zmN5`lB{@dbykRojw@}{Xn=kT()xQ2Ja*R<_*RCZR!``ir2p4F_Xos#}Zx_H!@037t z${lF8g7YHj%Lkn>{GuAt)^qvW*$V%%yW6w%!#*gzsbGC8sg;GjtP{4)3t{pBJ(hLg z`J~4^V_hK-KeFHWCdq)IJ$Cw@{BKG8EC@IFug}~79`e6-^go}No6s0{*b_tDETQ_C zDXPR;@Q7rR(YG>THv9p62Nb=aG1iC|j}4w6wfLrX%XvrI)>1SC$qZygUk^kmm)kY% zsMYS#JqoIMS1uRnWj5nlEa--ZW}m?iA3c3%PR}4gtBJ>~xbJ0VSt?^z>;ST>n8%bq|?4uU@-fE!h&yC_e&eG{KG`C^4 ztbSBUpEAy}$1d79=0=B;5CKEh`jlWpcWd=zLshbv!Po^#GcfCby z8wEqq9C2o(#4KYwL#2IW%#mdkGNV4JMq&L^2OayEW3TsoD$@huqLi&Fe5!;YiA5#M z_s3ZDVxL1mVC3)KTk**O@J!?6=;{>!kr10O2y)Ayyv6{y7qR5RMpVwF*yuZwRni8Y z;L`)RUayVvi2JJB{l*vRAI$PaJ3*Hn7J0BKJ~ZFySw~^6Q8sNiA}^ORV7eE3uIBE}Q zMI8fo5!%zlCICY_&kkrVIFPjf&rN_E&{ANEq`3vjAuE7dA>JL-*j4;CH1m_xn-}8l z>KBgL^@xQangB@-tze9p$QkbOyF0mhOGizLY^&hck4$VV;$iI&s};0^^oMDkphv>>xF8L z-*hy9%wZoYBKP0+*Q>7#gzB(jjJJ!DfWMD+;k2>^EA>b%7#D8XoGOS5nd&wz`IN6E z;Tx?Domx^n0qo419@=%$dim5q0G9Z@T)#Bn0F{oQk&Dd@f*^pioIVSHUZ?UOlfKXu zKz?v?`mBK3T}mqujwRvR1VDearp~HzX<2#EshoW8RJma$LT3@x2F#kLvr zRGxaLGtfJaWX0X8s_?fSK3X+2nQq5u*IEYpeEC%IRsD(1vJB3zlZR=i-jvEf?rlk| z{jlVa5*+^@H}4(QRM+*31`&~FKzfm=NJk<9Qbh7t009B%MIZuF0wN+H5kewTLKUSd z0+A*{fQU3jAVMgQAVqpnLV`#WNfdAkNjUp?@A}{t#jPoXfgnSMQ81zQCu@9RtW80OHnqC0RjreDu`d^iZ{`ZHdvGUEBT=Dz&;Iy;DHwTu^2Hy0z zMUAa(#$3L8_ktluK7jn~m;0XY9{~4}cll;a{#9Nc!i9P&45EucaE)9>zn3?1TY zOAZTmyL&wmC%x{9INC2B~7^ssoPePMF%T?>74J7 z5F<1n5i7DDYEWUkX+x;F%iSVb4cj?cC1R0v{C5NJJm*5?+E18=$ciA%ZYYgB$$ID5 z1g7NwmI#g2JM>qKj*jwy6~*G|ane$J`-0V%xiMLr=)v@rt)7M9A8(67c*1Ym?DKCW zQf1B!br@DRTlQ`5Hj{CGIO_zxm#*a+1J`)pbmfUviJ5FA=ll-RO`z2Xj*VXWqDDI> z*u_(9Bm8xEBf@kKbOio)7oj)XLAnZ@In)0Otm?mZR93spX3psUPx|Bc)A`++19pPi zUwuzs^i_f#y{Yx)IC4T_|K0!OKW@41Gs=rUhUHRlGmAO*5*zNnZKeh0nH| z;+0kHV*M=Ax0@dbah)&_XVhcmUg)yG&?hBFPk&`Gkvqt zDSU%ZJ?ZAz_*S0&FT$@sV(8*SLNSsOd^ILKPETZo>P+@tPj*^)5Y> z_)ryp#bf@E%rDc=sYmeolwXP0o{JQ-L@bgoN(}4!_S?J~W9gngN~Qgs(1d|Q&;Ov` zPelnnybqn~Q*}D7et@u1d^k*NF>PP#Y4fxSBg=MS+rznj4=`ov*L5F1jBDW;5cc?6 z`@{+L5rZ04wMH|LuKkG5>bM(RAI{ygu=V_`;c|=Mw*sY`jz7h+Ux|pPnD7GCV)yxV zp1U8-i|8!KJJ{~a8#{Tx%GpdA>fYaZ!?q|Ob&WTf5x5!VM*TbRV~W^I9+*~k>efj{ z#pj4@(L*N^3~ha(eVwK0$zvDZdfvDDDrU5MJ$9chdXNkL+Wjd@nO1y4C0)9OcCdu; znY(ClzeMg7ir-u0JC}$FSCrZPV-6el?kAN%*xW~7ajBql6T$O1h4=4s9-pP$xMX{u z#wGm88fwvt2fr^>_=_qqD9B&Z`q7+y2Ty#vz_rGFqA&OH5mNEc*Px?Uj?RfMT6Q1H z%zR!ov>-eb>-1?m2O{;-{C-pey5AlP^|Vr+f3-t=v|^yBx8;Ae;~h zo)m_!$6hQcQZ0*{+x}$P>!?)Ug(8Y=|b+^Ja?bJZ3K+A6;ef@tR*eq;KWl z8Ed`uO|@tAO1KHn+NsC0yrSiFX{c+kC?+TA#NLX*m7$^|Esqdi%ihGlJ2<;>x#~Y(g#0BLztU_A7#h{T?xJnKar`^^hx4^=yRqPSj{B&L^)UC6 zjnZKA{z_!V{uzbeMwZfVJ(g0HvCQ4e?r-L~H&bi>m@CAj25tXYduKbpqaAYUmvVh< zwC_&bhZA=W6v3v7bwghipPgO`iOZFI{^i;zIMLzu0M0sD{*Ke!p&3hKBl=k`gGR=V zLd}menRD}s2fvOwXgV@xxLFTMctyH~Nwz&;{nLLl(f#*JEBuQ!_@AX6|Npa*{?8Df zK^%w&-9f(lKkDy=2lxj2!vFRAU-^08U2Q^U&xnzsQ;|o*LwuC)%J4>{Ow~QBv6Ah& zg_lPq=epRJ{54`81M>6txhO4Od0g+-Pu)}>-uEt?pmYsi!@VQEec9r*RR86X1GBHX z@t2O{FniPmg$Q;}>67A%$4@Mp&k~U}_mWN+Ljw*swMA1nIYLnLge-`5(W53kg^_o4 zTb$@g=8KfeSA?r=zAD{{er&h$tuJNMORAq}q{#O%{cTd+180%i{rg~CU!K%dPXw;1 zYrROuAC}{uez%~t#U~S(Ip<{E+B>gnYX=3c2XaxusWsjaw0hg?{Q;-G_CL z?oPS94;h<~oh2TcyRXsy_I^ls)4MMbydi%{klXKXAcJc3+*`R!(v-4z8tw*=3AXT~ zK7)7FX|fRNOJ9Zoe@StY=79G{(MF94Z`Pw!V~EZpFB8!+KUHZTSjn4I=_7nq((_gi zEVb|cohNWHUox}(d1YWU?1j{6Z|jYL{tap?=HXl`<}M59W-bsO5{wM6tkUvDjnCcY zE}p>7>=1{w}s5k z;Sw+7M~CeUi=c&*EBoAk1l(0mIWjN5R827{7r%w_RMdu6n7a(PU+I6todzYMBSYyx zvz}FP_=sBOmn41fAKC>fV7jkL*%A={h(G$=^Rc=$`7NG2O!Y8#is2Kd{2Q0etaSz? z*GHsSr-_G!S?g1N8^)`*oyxZk8H7K6B>u$lAmYSFtpzJ1NB!F423=a}vaB;swmFaD zo-+F16gkYVJUaC-itF*~zyS}go!kPfK$ThJ?C&X!yN@q?G8Z41ee&z{9lTA8$iq>! z@As8#rFUZs{z~$07;+THWW19up>{y^T~~kXX6yejZjyxyPqBt%G*-ime)ABJ2W}x`v)_T zau)vjDlUTHBYR_1v)A(7qL%N?=YDCQb6`6(fqMkMTO3T-s<;f-(0<3 ze}J#nxI|6nl752UyC10I#UC%@50|@l9vc#L9+^M~Oy!(AerAi-F~OZYE)V_A$d?}+ zI>;kkzaIbXXuh`F=>EaJo9k|-Vq;iYzlf7#Pv4HG2fP?F_{^WvflsaKxb9`Od`Wl{ zetj`QpBOZ8`*KIx{+S&Zba!=m2Uqz%7VB`iG0qpvA-&>z?ET?^ z4}IjB{q>&N`_7C|FQhaI9ZbYs;eS=S=5|_M6q!@#A@ixJp5&^!Xm8SWl>gyyl2td? zf!}Lad1Cgd(egVT_Otgz2F}d*^_?7a9mxrKEjaklC)ZS8z1h&@*OjK*S-lB@-)c_C zFFUEev;D!UdXh~(>e%PSLfD&ZDBt#dB@qAxZkMZ{8u>G`{pP9&UM<^nY(pSG?#lZ8 zfY@l)CyCD=r276sKDx-Jek&;V8j-QauHH|)e03_r;l#md{OcPf8)DvDH#c6Na5eq= zl7qSXQ@1*^ua908*T$|zh5Wv{zxY;_xzho`A2(QUH(U>-U-<8}4*#1u%Uv~ZnZLeO%n!`}TA5@azYX8dnVXcgTJbp2Nqq&L0r9_2NAq zDt0>daq&Tg3w0ghcApq0w7u^<;NzE&l#-TFR8m$^RnyTuqo;3Rc=3{nso7<73wsAg zCubK|H=i56e*OWdz_9R$yOHR7QE~AJiTI@Cl+3K`oZP%8PxDJk%gSF=fE>f?`i91) z<~MI!Iw@V~idJbXXTh5h(S4jy9VQc^?yU{!^3!WcMJ4*S1M}kfl+xf1{dwztSG$IcsPSBBYPx#PBu@AeNzA zdl0;a*&f6&qxdDM2uFK@mBkJB?_R{wJ+R|@5Y|q>|BJByt6;(KR}emhV8ZWjIG@%iJ1 z#;^VpueHw}j_G@=g}&#dg|0sFwL(Mlc$2(+`k1epxS~~`>S}huHRp*T`wAgX{Q_f{ zh}4^25z`!WkJGobz)oE;kA@bz`lh@o@I6~P!>>|u|KBy^dyGj|A+Cq8t4El|??Iew z)+3O5U-lp!h7DiL=!7KWQ(v%C$mU!Eoh-~k4;yO_lmbE9`ApAb#_A9SE5>~Bn7%H# zjd=}(o@=V4xp26@n3dEf(-C})S%ED@&*(O=S(FTDis0zW1<8c&T%;g>M(jakaNp-} zelWHxqH#P%$g{|Qw|a;#75^@YviKBMSJkeDc_Wx7^)@7&gyg}8jsDIqwTIe2gL<~9 zwMs$fu7^t9+Z_x1CS6}?#nKLu&G%|s3;cufCf@Pb&2d+!S>o~vO zFbk7s`7wT^GJ7_!f1d(CgRx*b< zHF2B?d)R&!4YQrZ(d3wt>Ftu;>?2qFTzrGVAG&tky8aO5cJRg%Rjso6GCio^tzE}O z%X>4riWAb84}RV*j9B2a%G+*Apb-@_S1*lO7t#mp9nR$Xn5P8PY9tKB>4d)YFmCZ5 zEo&%j_`7t(C)MrRbcj;SKB&5oxJ9j@B?syI1f%gsuF~>zZ)YpAfvEO~c)oW{xCqK8 zBUKcb9V(UPc;%e*aMxXL1yxHvyVL}P*HcT_!SVPye%+;98=mA!s|)4Qb~SExj;fPg z(NSV5Ln3h$+9=Vw2HF*1WU|Z0vSYv!T7%|oW_daM(sZ04I+CW>^U|9c@}OM{J27|o z-9!T-5hus;eF5zDwrd0FbRl@>ognNP0M3L_5W+}`@xe(WH)J;fiaA#agk1)%G0kWZ zO>wjj+U+vvUmU)zC5&b?Zq|8Wj4ZYVpBCt7VZR{LgAwns>HwR>(rIO<86j(7=|vjA zpLy#2_Tx-sYP-@Zl{frdM$()zkW33nl^IN~WmyBRG%JD2(O-wFSptRkpBHB)eAC!xIU>#0?@bL=K!S)hnXm|XIa?VKvt=~cIg8I?D6zp#F`_2+OHc_+3Rb06y|vJ+FxCwB(x`eUkrsL<<28Q#_4nE$2~D)&n4+g`ceRFs z3~sR$Sh=&zgO--c=*|`u-a=;&hM|i8;iD8^BD9=Uc^pqMq&LpI2HWKhNsr#qn53>fhyX@> zScfEs?nMr_p0CpD1ix9`@ytR{hW24jHosz!yQMa5pvdK!T;gt?9)45y8Slss9joIp zr>!mr9Y&3!n(U^GYjq#fwW`{lbxy2TLWN^%Q@^Es5xOB{Kd^gSbdrl1N4I31Vt{Kz zqh+wMkn>fhSvM@6dPrwiAT{~qf%<`O@R zwEBK2JxwcilQK+yX~tuwv%T67)1YXCl{GAvo?jW>seTnoaU2MkEVX$iu41HXp>Hrx zyT->ZthGs~W@b``Q;0~}hlXn}gNlA~i zlweXHMTI0Gylv!Ici7K3awu{We0{VAW5YD-*xb|J`Rn zn`U*9PNHNa8S_ja{McTkcDX5Fl3v?ZwYH;2$zj5K)3tm6LMUCf5Jr&~c)fF$miIl5 z(K*`n7#(Q>jPC{v(MTx>$fOH-xK)p-Z4U4;7OsqJAw)4sV<(t8A-iXQ==q1FG8Tr} zH7D6>Wl4v{!8I{nKD2cox<_pVJwu?EPTJoavkcp3e3AtY@vc2~6eomLXK9TDw;w@Y zmcq&hI$sU=733+)D5~C$5_FSqkM+%R7;e|a7B*MP^BzXwdu+S?3?7D<=0qVpiRlyvm!yi6BJq*IWkd0b?=S7Diq6U= zcD1}JHWiImzXnaLL0ewwKh}N2;b&T@WXgMQ;{2V0EKy659J<)6x`KrqKYatZS5l1* z15hziG}2)nar z9jnn|K}UUO2d{pc!ZY--Z{-Zn)LmXm3EI+;Q2=WMtJUBBO*llL4W=)sXCx609S3q~ z`o5D!BJ|V@sTG6>xa`L}8Ea0o-g^mTbu{Pqw9%pRf$dru-S7qQf_Bwc6Aj9Yo*df4 z=!@XI70fak)**|nOyFSTKyoAStj80=499Av(((8PQc9FKiBc2N>sFgOe-@e+#d|+I zBh_$;B00)A7Q~TCeUCL{l2SL}g3FobsQ0fka4EVWqUbD7ws=Wn6}$P>c3pxEam*2= zIvVG`cB=B3frIs#nssfpMyp~ zl-+hLQdIlw3Mvfx>YTd=nK}U7gV?Slh}n92&57BXK>l6B z{GyTm816yR5!)e%dMKxwFtgeQHw98@13}#_)Y#IXHJI44-Kx@(WqTuR#Sr@pnpk^c zd>vk0-Zq-wgT{C~Z)=s*%bls)^{L*u0SyX&1<1c!2!bUd8hX1zgwX^FLhQ#TTmmBi z2$U{^oCik$g9J*;-B;%hgYvGcN7GN9{ssc6yx3M`Q2DBiFCooHJ5sTz=45);#7uYf zMBNZ9|I_jmCKQk^50c~@8#R`}_>D%eos{qnlNt!`p_!;5m$BmLN_deh+nPFmGqU;d zx$mQ%I+3D(r$=by?UybrU?0#v`7zYxqvr8MZrPOgHp=fihJ+GG&IA#`XFS&NFDELj z!!wIhD^$Eo;i#y zVU<^vY5D$QUbXg4Qj>#%-9zQlG2{K+G0cT4z)VXO#TCKlT!Z$aC1vJGSMKw6+nUj_c;6?fIH}x@!frilVCvL2z!(N zT-}2--XZTuUq>+NL7VD_784h3W~757hLWkTVGsQ7etF5dH^vGM<6l@BZI{6u0SKfH z^+V-e%;4Vm)7aI#{e`oREl2>h0iv*zSP+FJk^ezq27!MFpnK6^LkSVaPLL1Q!YJe; zo})BshfP}4*H<6_#EvXD;oX^&DOhoI^k1#=atJ=&q(cODIt>IQZiOhFo=@E$>D?O( zZK}a=B|W8qakbD~$ER>qO2=plTF!2%T`enHd?oOU{=l0Wcl+Vr=xFVJr?aB2eo_*z zrqAG92fUXNzPgzUm9*6}RmM(r5vNuUN2z5dzWfb`+JuyHW?|wwZ)h&mo;^ste+N#u z{-MzHpD z!z6S_I{k*d{=I$@Rrw{*5cv=*2$cRMb2mAHk$WV>tvS^uM9Tc7$BJRZR#A${lX2xb z!M?Bpm9j`O<$|3kAd$lv3pjm+~2=n<(=#EA?+(o zp&vpsKi*bfo0i}q(iyAF{y^_LV&kiUHQ8>ft1D~Kgp0QSJtOnLO}+gOBg6eH?c|L2 z?Ln4(K`7t(5wQo+_&>5ST;L*Z^YnWh%@4K*$ps`D%bzg#6O^Sds?6rHT-~!%+oo-he$DC*4JB<|q=XvTrbV#?%p+bL#tS#fl z&hDzAW_vz+@TqY#{e#X+-SqS8*FWXOk1ck&eGvs(5aw{KoDb>Vywg_ zBZ7r^?HH5zTk8#klon1KlWGe*rGIS#9>4rh8`!QrycvR@@c;qTQQ)Ez@Ytu6rTrFM z>h6<_v_XL5KG80-isfNEBvzrZvf>#wWOkAf-$IBin(6`$K^d;&LgO>U6tdfH8WY9v zPv+>e{KyQ6QeywYhj!Q$5J?w$_>57~ZwnNnO3)OKSBxw-mhPlxKHcGyKQp3-q#$Im zM0*u60T;19RH&3|wMHfzh28mt z9H4e@WFQ$=Vqn{a>{26hrT~W@wHtvsH^Dl#5JXDAiD8A&qIBh6!~u*1!zT5_cnLD?A_a89q|lR|X@Rzw^FNiD$Ah948@tD3_*W+!YuZoYI<$;bnf9~{d_&0W zmn+OP|q;XTjv?+pr;*`SO7X0`y~-0$yOA#_4ozE`llNArmHn+z95 zS$!Z*{7}8{Mb8&^5BU;%hK&-_atK@{2Nf($Tik zT7+n5-KK*xZ*ZpJyAU85S7)|fd5^ia{qz&=7H&2Vq&f;2OI^(z)rod~;5U8fJE;mI z%E;(EhoH1XcHxH)5g1wTsbU*PN8zm}g{UdU@~jKsdl1lK_7K+HYvR9acIpye43kEi)6t%P7_PL1}xI^$eVmP)oXx{1Y>d)QNd~lRSEmWs6 zBk@pkb9%A0OVYfWV`s;l{;F2@*n7wBiy9xx6Z)!Yym;H}z-Wx=Spmh5rTR|&G(7rE zkI-937q=(*`j{{aICl~$t~@DC{;a^d@efiqi$_QPD4Vng2`F@bZ;6J{kndrMO_RK5 z?N)#MrjxpYLwyX?WWEh`&xwk@ge258c^_akkLUc%`#zvQiLu>v1g4)~!iiu<SBwMvh1i`nw0nU*Z|M|B-D^|;RW5^onm3(N=v-ZeFq-8X4BqWa1~0(1NO zvV95p=S?GWnRLd+orgzi+hz3KDH?g~7|ORN1wEb_)Ba*Qn=uzs)c-tT_OiqlwtIoK zg`t!=Rd%i>>)d=s>>lKRPOyIu?>crLzDKWJmEnYsk(1b&Olu5Uhq)VCO{SD2uGx)- z4;*1B`jiK(>*h=*!*ylh>(LpnXtkmPZ(h7OV-Puxvh80s6G`u02x21z@CoMnw(+Yf z4q26+q1mVlI$ysosJ|(jX1v`HS^SI;lx>!6ElI;zg7?v($`Twg>Se&E{<@e==6$OyHn0Dj06&oe)8E3hV&p>}0!2VEaB` zmPXz`x4NU3(JqXV`G?bDs+&)08XcjpMQ;eK$qRmJgv+B%cf0CWobubo8*?_2YTL1` z!0sMo|J*2xhltUDF|HzKwYzqjQeOlTj?6P*X}YkPH98`tRg3YPu9-e>uzA)-ZcPS8 zseyO3Y`ljG%%J3D30?BMOmb3U#%*XCzQ^jK-FO)@W}P(Xr$h9We(06s_qgIgukTdf zlfVYGiIlKJaj&3-a%(%=wAGRRiO`3Xo`S0DYZsM?a;6Aw{!wD$_U*)bei4%to_Z$`+#a_07xcsJBgWbzg3ih zpJ#JQnIV>d;sRMh`5~!+BtXJr!scQ3jgJ9B3o)W}cq)7=nr-RQ2z;Uw@N?=RV#v8w zJ=7`35zvt|HUdc7dW?|uyGE`H)LG^2Rv?C%WzJlRBQ=J^Ar7(pnX7BGyEPT8(+ubX zqgzHIHDHI~?;DxXEcYM@Zn=-?R6(G(yZKS;-QQsEBx7ugd+GfmwE*ZXPqqwLKPb1C z{Qi>G{uarb+TBTNpj<^8*t&q*D)p}>D!K4Sta#TsI8^@ANv7q6Zo|(n1zu=weki}C z&US{TcF-#N`GF@sDm^cRoGPp%=EQx}dfH`$9AmuG-5MN9?WZjwRI%@Ek?~{+>@m*Y zRN+RdI6A14+KgL=gTaops9SAJ1U0Ube77G!b&i%gMq~Wggg-DHbVBd5oSS| z(A0K0kmxsVt7@hU@qT7`HIErdmH?$4Eyn4=%E^OyAhX%GRb#d-EH4b4-?b#M#3&s8 zn3ot{fK0BgQf?EQNTbO7K)PB1wt81G)_(s+GIj7vE3U@9u?J#E~@aDnRWDE$Z?+y^5}- zg|F9mAH3MuwSy&9pmxf$U+Xp%`vygd4V#TQ$GADFI98fA z8jRGKmaRCJI~}e7AAjd|p<(v7Y?{8g{@`H?+sx2RE1f%^i2R!YljZsj6>d3(4NDef zfujX#=dDF6oP;{d6s48RpjJy(85N{r~7?o}%*>piY7sQ0o$+TwIt zsj{?5rKxSO#cAtR+rR;x5mZI^)&-Qg{s&c4^GcJlQ7hLMMd`YwHl`Wh2-iU0^dxq) z1)dZ^#Zv{z0f_x(yM{pCwGp_kHa$3!e&8AX?Iv68UfGBe6Hb9a(YHeO0ZUz;;)&k^ z8ot;q^t8*w*|lg>XWh__A)Ymury{3ZiZ#2#S`vT+H_90-6(N9xO#0vG+WF$r5 zdNvZA5#kM?wboPzMakENvdh^CBtXxTk^Zf;8j0TR&L6C#g@{bWlx#TK2u`DNg;(!- zsxX|F2gJAJF7{wdx}`7@lKQ=Bo3|a8>CY>#7ULtB4#!Nhwe+bz)&kOw!^MI|?3My$ z{L*vU_bO}X`w#la6SSSFls|sZX&X`Na%r_3qEouYIk%i38)%}VnmMh~aJzElU6>fnbA#RNu+>T4!>A`jp63=Z=8@I%`wQHT!PF=vlOHAM+S@iU#ua;jm{Ng&b|YQ+Wre|jDd0D7qle}mQ40b zw=@L^K0XT#%*mv7IZ7pqXOir(Hq>ecvfNn7iD#6S2SC-XYldarM6CwqBx9G(n?5&m zWn6R1^2nKut9czoQj_bOi{zG1x&b#A+H>cEvMM|pv|28FG=_^NbzaXTrFD;V+J+my zC{h-e5%aaP%{%F6Sf9>J5y{gS19v^!cG_nc{w~N?b&Si$H$TxT>cVFKNKj{8t#ZDT8*WE=H0?nae>=^_ z%!b^xuQ6{{c6yfm_TICC5KXYsrRGLtzqN3MEbA0l3`?r4?Rvq!7%oH(rearg$hdOX z05I!rwmtZxT>;3WS9H4){CWzFRanl<=8WnkpZo5{1iI{b0m7e17e`3Ct;tXtt^t|Y zdW?}uC!}iV45di?=12iy3pn9vcTbiG@actXM`S75-+nCk#k;Xa7?TqNC_(x&WpS6+iZH@rf-ov8&5oaw4&0_UaoR2u+ z#x?JLy|@TC9wuyOLMs8yCK3$eVGU3nOCgVnV5n4iF;nxS`^+Yee&t@}Vs&GJcdc1w z3_>c|ZzF>vfxiTl{gyul2DlNXjgp9coHK6ko1-!wG`_oLe&XFbAX=!Vq&rN*j$KO+ z@M=;~&J4)aKE4B`P-kGBShat=2HP`P%nRnNW;CeK+Q5+o4kB`0Atd^vaCl~;_2R9>S?W`6NY90D*d*Yi# z^$}9^*_jTv8db(1vfoa~>(}RnnO$ZB_HEu*Ealn;;w2r&@XVW_UYh)MkJ-;TSk4T^ zs-olE*iVg*V@{74O93zTAkOU>6sm9pSr(1-WSq=M(o_z%>2z~w7iUDKtz&#>M3-B& z!JDLY%OSxz+zs8P1mY3vpr8!lKtvnzzhul?1$uNhnvu1FXlAIA4L(;BKhAVmT{z7$ z;or=N3 z2+g-!%+Lw(Tadn%FA_w{IK=59$Rqrb(`PBT{bcWc zgWhuj?VNs~47Q>gJ=ql+pofJqZK&k`QeVx}-;`?fEQCINsGjtbWvT~DD?*66wfo1C z22v}H1PT_c8!fUcKjj!n*6kD=lM{5(KH{k#u%ONkly5wE{neYBN>HfWIl(gm0)q1L zIjXz*Jqfz0U+upZc(~P7raHuUbm$l^boD}6Lha`f$?|gGYX9Lgp`N9|Z2qq0 z16o99aP8W}Pc+FEsDP!`7@fTr8e9#Sb-Iz0zH1xmd!Vtn!?_`;HJjq;87whn3wD9Ayqje$=Y#x7b`7F2VwRj5)l=~TZ_s{P!Qa>a#J1U4d9ILFa)^8`M1U+s^9DC(Xul z7e>ZxjBFeF2H$Rjsj_|N_wPISRoL`A?;C~3ju)k4KL*g3=R-HOgmblpQnMK@EiNf< z6s_&DPlc~_Mg&s$l0x%|HX??N>LwOyB#pxvCaT?*Q2jpLA{bv%=Lhr33-7w#v4cdV z?)0Er5Wj@%)CvM>6s#u^n($U#5UIqCnNikiEdOz;e2~=XK+d5tjH8A;gk63!0)9a8 zM^S}Z>*Mpo!o>&4Q(ksD5x1IZs7>ew3wj~gx(-`aDx{_UZ7?K}2;K-E3uJJ_kt{tbONl&9 ze#Ohu)?=xWfj}F;2dco4%;>fOZe{=;1TWCPl;4H2R1x2Y081P#0@vODlS~6)aRM0A z7GGj11O}&-*|H|kJ`eC3m|=K!_B{dG3-P5(CXXwna;hW zI4TcTsOjmh8%7EcXV_SdAbg;JsxlZIlL9O|5Mu2bz%SYsr-DAj>xmAcMJDb+ZW6>- z+%zB4kRr>GuvgUX42b~aW0Lm0p}{2`^bGz1k6sFNc9O%tNZ&{&?8ls2$e32A;VFm& ztO`3TxLpaLk0RLxdytT88_Av;Kz|tH9o;6yC$6I%&WMb~`0k#=92{L>Mkcb9%U5yr zz3T|(*-n^TLr1kG4Kzttre`CKj40Aivfukw}uj%fNj@I#2pDH}tPL`X7_B!={rPqn6RA2d1R&2TYb5J?6r#f&b_i$>rJ<%!D zrs$!3e$jEUzzK>iX(w;@9!nRPWcqAlCNRYQ!xgqP#FMJTzaCnE)2j3pVO#+~v zL;XIw5OOdOao|U*BvY9#5f|-K!a@SNy9cl{bDCoqMQGR1)X+tMNV7?lk?h>SBV>)t zn35oCq61BzJ27c2MCFV}XGZ6@Bc88WLR$FK1IN$mo81<{E@R8-7q<SFjTF(iD;L6Oo@!IsjW@};6L7xCz!^Kq>BS(XgV7-JvMb8(mL;UUiQ;r|Kau?LD zmZrHxP2HOhow{=KHu}3JoX;||=}hgRL^!-g4=hEn;Nf<-VsOuk-b%)izhWy%Jv3 ziD^9OHj4QU(4eRVPP(s;5a~1mqkXn@S_%H5_lL>APr5YyYla$3*9~Bc{yy|NN zGh#hmF#Hv6;mnA@#fEXWh+oxJiSQk>67s%QkzFubzQdt4q8cDloCsV-TC_EArA_%K zX_705gl^uJWY@4x(l(}-(W46$=^S~Wh}ty@yj#E}>QHClly-5z;|1VD?| zD<5QRhJLfa3=pDhr|#Cd3RaZc9%Ql=v2!wLF=IB4V--yg+2!zpc}eLsnVq6h&bgDg zwK*7DqVemeJ;>u9AV=$60Op+9Ycr7D1a@@!9;Dn!0}O$$$^2W7;6FTtf9n|#+LbWs zVB8fdo*{)%13oBswpoK{f5#?~WhvAfi_u$1J>o~9v}7ddBB1>t5>3YlmM!&fn4ay; zcIU%RI1hhzQ}2+SPFDO`Zy53U=VvRyb61?l>V9=O7Mq42a|>VfeVYjVZ6kUOdcIFL zG<;FfaG3qsZ(%@J%F-}-?y&8hMS`|@+05;N@Nc2lKHQqf+cb_XY5xm!8%%b=ZuvAf zjibdgKsQ1O%-G>i-EQ22l(xMFCFGljbFP%LOVhy2o&&)kZ~ht%?)oqyFAdnVgPn8I zxDX`ljg%Lp8j_4WXdvVM0ty9EFEO!k(4NDaU4F&ldxW#cnMSQ0p?ukz;l!ErpcCSPo7bX|4ZHV zubJlMF2IBLv+wcFqLZUI#!GS#a_8(UoOP;b-yY;^Ur#P7y`ZXp7pjw^t7n~`?w<7} zoW$Sy!?h~}akE0=`4W$m>Bv%8T8w*7f{{E-z3ipq&LW1tci~#$+0mUv*CFnUSu;OX zT3e*9VEkcN%TuAx*q?o1RYvEZ2NrT3QJ56J@8{zrS?9oAIV z^@}ZZA5l-WNVHnoD?JL8$VsEifq4EREk=|V1)-UN5USoUhovN|KXS?uZyABb}gjHH#(xj z&p1x(UTi;nC%8nvGfhceGI4(Z<8?t1>+Pc;?-_RAHj$gygLgXg6F)^W4?gqr2)%r+ z_k6E`%Y9T+TA`Pv#u>-6!>r4M9HgwvtTVEJisyPH zb1NH4dzO!>x;44WCf(o{g}n;=^m|zE33lR{&JwGi)oO!^`rDcfm1I0)3Qg=#gQbhp z>Uag036f{Xne5xXAB$iyNLU3X{2{}>0g#RKW6CWs1^Syg$}lF8BoQe%e9(X|e<5^i z^2g~V<979ts@N)wV&S5GQDNEqq{QO^&pxG)BSve?u@{PEPvXwMEqet6ZISq@4e_OP z=3dKfxc8otTe`-m*CEPY%6Z}1TYA5oD?4whzM3lQT&%zxtDUW|E_51I@ky1{bF;aF zwaLmVlr_yyd8}73AuAuIe<|Pc-nt9H)ONlvYW#Jv1-JdJbLqn$9e&!%;~N9gdj>Ig zEE6~V*|{_KShwmgA8eMPnX%Ix_P0|i9d?W8MI1Xw(~VJW7M&rEWemFkIaMlIW9@f@ zT9It?8g9l#K3A@_ly*Fvzm|<(DWinD`|3Aq?(~W^)-d1E$(b8yD4EJ{bpd_`C2{S- zxu_S1F9;V#B*|2|CwADk4!7ErMRr!#&!6*gmvy#j8~%CGF1s3?ZD~Skqezg{uK(<=_oQSa@lld*xV})**aw?Iyx!R+ zeXp1zpLD>{C)9pu&2zTTj_$CuvMy)7?#}EUp5oF<^y(xrbs&{3u0A;yxo5@v%uB9q z7-XK4&zk87I;y;)ayhS0n+QY4kVV8kt?CRrIDbEuN~q1imNx~>3o(m~Ictjo(`;V& zSftq)ToKVrG{ro>)TUo!_bQ7o!&K-^3SX8-mz=EDkF#%TJ4i|$-HJCAywuwq(%1!* zJC#g}Wli8-55}_}+m1!1ri>+AWIP8Qp#A=B@Q%lf<&H@#v<`9*1icYEv9b#qPTrI1 zAaX`~Xk|GjZT_Ll=u0H{$sB%wF8Y#-(?lgtOOL^`3y{oI zjORuvRs+LDUyd!uSB=cjK8x|@^D!|AHhRa~XQ2=ikB(2n4y*baKE^cJwp>0ij2e<2 zskM&d^|>?GWcTR?;UL2u6+A8r1<@>FI3AoRH+z5;!W@APB+g*Raz&bLfMsg&63=ut zj2h4?8DsxRUwk-@I>_XlSjfn|@s4pUumT-PV(yjXtXc^W@Ld~@QwhN9Ru2)R4ZXDX zm$@xeNqv$V+m*lmn0{hfXvv+Xdg}@k4w|nAEl%xbin#jf%aqU%5h7JjC8H30A4SK* zg-m)rb|xy4ax{iBP3cupN*GI-%!iX;&Y=}$JLg5Kh?%x|s@Ysf*c5koRUF!ayVXnh zBHE&1S7Uu~qSH-{a=SBLu0}TlOP%aI-S8&QyaX<<`KQ5C6;dDek_S@;cdI!6_=^QA znXV(dEg5sdOw=N9?Uq_lhxSr5zmY z*XxeQHCp5W>Fw9jZ-yX8Sy!9swWDr}X=7d$Kqj>zj?MxZ<5&c~aJ;vnDs`|#0W-iIr z+#S9Wx&!#!Sjlbm6CB3$b(Fnx>PPq<@W_#>WNkBIJX~+c#==o6oTDwxq2^iG!}*5L z;UOWu=RbIWGpqg^k3%+)6cJ)1Vme=l2*csAGGH>9Al3)z8J>unZt}ebhk>Sd{il(v z4C&@NxT_;kz5O?!CwOoBT_amu7l%Ps}n7uWMkZ(r|m2>fm7t z0->ssg?q)$`387B%S&|+rn4B6V@0-!No%eWr6QWF^F`w*SM zrArRQ@oF!+T9O)uoVjvWXJ0!y(n`j{LU9wyb;!$nq=HDE;DDVujq1~5IZX8y@DC)l5wtlUMs7=TV zrLKPj4XM6UEDJq*@nN|zapMkW2QrsYf7>UK0{!n-*9f_ls2(3T(Sf1EPUR~c=Dw}Y z=?N|Nu(5?tR$xE@df9XX^0fEeUyhFW)IMgP4lI);*``R7YPHZoz(twqI%(^Wz!iGAScI%Y9fESO6pNPFsr zR`+PtbWB?~2U%VxvK;kcY|*(W*^_1|Nb%eCxYQXPV+xm`@3|2QH7?t`n1Y4SYlB&Y zgE*c*H>HicME``$BUgs0vkd+!vKzNPbS4({u3ndJ{IrR@d6qmwcwDqHT)+q}T& zl`c95#9geacj|)biAVB-Wv7NQ@QieZRO8x}iW2Y3!N%D`tGw2UBJWyivU+Y+pH6hv z$QRnlJ~@UzrBuW3;p$%6o1~L1W`2tQQasxE<^1zQD4L(%aK2HZ_q3S&hjR-XNFjDG zMB6P}0k>q;W*?>JA!q15tAtq1Dz$LDrK=Bx^ja(|SPTDj-I znRRD$H&rGMxL^ZxzrC}5lHoc8SIR7VGPMJgY}*}1!)=>y3IYR{%Q49E5wkJ|blqaY zYz_Uprs$|b#z`<8_|&G~1_qFuoah_Lv3^=hqIU0*yv*mhz-f-S$^rn%5I9J7=6TdK zs3JH+LDs^a!uC#3{B*Js?$4F%y35=Re7t56S!r3iz&qiBzA{D0+1FPY+{NKcw?QRb`{O96EKJ2$(^}IINm(KpPs*7LRGSMk)>l zM!?3Fr;C0BYC9G8pxOI~{kVv9MV^jR|34$7=iU&Y5RGqTmVPueGayO?;4>@~my zRWM}d_8cXbx~IFgZ2}Q20)C)laIv?t-B3) z9bFDo`VfA>ktyDzmCFv|P5^|+3lh0`V32Wtu((K@_@sGKYJt;<;`!Ad{iU0q_?n^J z&B@shHB8<#$h*($YoYoAGOXffb6&1Uw%F%?D6x7T@ZywHrH)>-$F26`ds0OP3s;=E zidQa*Yn7a>E~(H{dvwx@)HZ%R<+Q^yWc}5E?dZi-47jrGwj$)CdmI^+15cHX<_H9a zXUG{BA`2jG`iC8>${e)t;jq|F zzJ+rHMZhxlW7ve(%1r#!(RHKrpj8}?*869iSNhP`md*~{e}c+ems;g{8RwzSY8PLu zkfLBDxEiOBl6l1xFRW01CbK`)?xxtC-uC&q(MprJ!kb-cA?jkw9M(atGpUCj52hiL z3k~+Ti&!}~^|hW;ELHXuspNG)N#rBBu@kt4s%XgM7oA}orxLtl#!?bJW82h2kN{QJ zzefo+CBDe@6Q69X^1W6(S|wczEJrW-D~+wcwGYjRTFoo*UbCyW?_CfQsk}D_86B!R zy7*=~+PYy2lH)oKL>`QGo_B^WWl5x07)io$S9m<>Gca-28KG1sx#CU?71cOOUC~G5 zb52rSVp9o7NSn%HlCjbo)o?MiqAeH@UeroQQg`Lij+|&4vv`6IUJ|8buqG&LJ#2QM zUKzNlDf456+Zl8a=~~i_lF1zf8+E4PvUYy(ZinzN!!;Gy)jfv|p1FlN_5T#OHzPpQ zUL(c&!Hg{1V76|zMP_+PKlufhMXIj7sa1*!A?#N5Ri;^Fx0<7vrW13!ws&uywUB?k zEdQ*jfUSo^Mr7(mRgFtk*Q`xXXArw{>sT2AW;9qFQw!vqZd@`1K2SSuz5&~s)Is+d zNW09DPasR|)sKmD^F?rYWA`^ik_kEyP8h@T@os9tfYuZb1$Q5;b^*i4aKReY5+8lU z+y%P)(5716YI3hpGr1D3Q9dd&g{_B!0HWZ?k;qU&ETsD68*{Qc}TDr>Q^=O%gTK22ryIfpz z`kh;9>O{=(sjo637n%?YG0?G{*RL#N3+og&nE`?%b24L=gkxLC(NAyJSB)}$YPkbr zIH2@aI~!HmY&N|S2AOC0nvH2CD$RPn_hW;rVy?JtgDmJLrn@Zo$``BA@B3)8$I@TY z6G^e{1o?t=4WRe#Kkg*t4Y>1wH3~3LNJj>L#2bHasgAv@{84XOSKOslKS#Y z2g+z3ma~rz3gp;5R~I-G!xf+H>71h0saD9j=Yl?ak_5WxhhoE0{)Og?il(j34<2gRdZjtiuQWADoJG4k8Zr$IzSKtFFYlv zKHh-Ns!#}C?@4U{8Od-D3!pBufmde8Se9nG>Cdy&*+ho6Zv2BmX|Q;;sE;9g9~6CR z1%9v^hVS!r4vkrs>d`Whq$FelxYe+YDgyz!&Nv0hPYg)r!MK8c9=>PygC?-IOF-z; zhPC#GW3q8d48weOC1QNjzZq7H_6p#f&ylE$UuiB1gq z8ST63yixfP>K!7OZMgMtU#2RZH8G?`!!j~QnXcP)mrg*M^}GaJJ%0GsAgWn7yQ`>)8SX~aQfav@O7>>Tys^M>s}yx^ z(ms?9!I1Z)a1(1rGl98c(~NpKNRP;~^sWS7rB zgE1R;r}dM8In8o(+^~lMn@+3EJ>5VgfT^_3sW|yUQ1w(prlm(f*u$TC7caS?J`qGk z22)>!YR?n*A}%IK-o$Fr5jXB{Kxu0(;^N1Wqw1A)U2>g4#QG61hJxi7DjEuCR`e{K zgYTs`X%bN1Ud;rd$m2l48nPYw$GIGF`chP3 z(&L~Y+WLm28-XtK`107EOzOnB0RG0uY_f#X~J(}+fMAtxtcE^w<`BmWx zK9fqlST(bCX^d>Yiy`Q)dtDk}#sFynERN_n1HIB`#c05pabmC;C$-x2u8x}kgl8v3 z7P&ejQ5olC1{JjB`X0WT(;FxhG8qht_ApZlel3E}Gfk5zk|;dI%vHWN;yA4~h-N3*0kJv~y9Tf@w}p(W^zS=n z2BWgu^JY$BMdz+r5Os>F%F1{b^V8!(0qBN>%^+jMwZ_J=F46!*Dy=^!MQby9EyB!mXz_HGpUu0cd7@#4pcb75ftD9{8*Sj_<5+@M3pq@hcmLha^3?QqG* z{TSVcXy54zQCP0IDXx%&%qoG$Lm1_vIjkIAHZFjgU^!%<>#;LA-XNgTtyT4A{=k8u z+l$VG_p@pBaJ+zhDyn>!isRK6e1*py=e*Fwvf~EvcKsz0B{y&Fch0yEpq+-Q;`8p& zBt$Y(^0h78UbM))AndZ+Z`hN44Sj7u&6XaVzf}BI48TA12-GeOGg%**>uoa@w&Y+% z6lsY&AHkjI#gCM)aOo@in)c(p>o=T7oE93?7j!O7O6L@NOWk!|5G+%RSRFBwi+C*+ zdy*O|?mUB)n1c-Dvk?ZW_rdk{68gb*XQO0PF__R%M$JaFcF~rMMh!|r7Lz$qLb}dI z30EH~6nq-GW=1Nkn6X$3Ny|PDIJ#W1s|&ny`IfAOhF^QOiBX6=Wg$N)qrmotL-GOseBtUy1s#mn8_ z{?|7_bqJc8k+EaO5zPGzmjQ!=>xV$m=_(RY5aR%>;^~qzmP^K!48{JBiLz8#GLoO6 zGmNpD**&|FV_--{u+9tVSKV9=Ve@=KFI>SlWCnQ+r&qtM?>Vs=g^_>25bDQy<3`P9 zV6E9M6s8iu6_X6t!wxy0CujlE>7?~#5%f7T9a?+Zte`j^o4oE=(wmSY zpQ0$!uTgewJ=Q6uaAypo<_#(<$hz#_S+&}BhgSE}KJp-WkVJy%H`n`4%TI)RaK*d5 zHZXLOW)Dq)vJjPTIGE6gPI`=qN64$!zSC;cI2^4Z~ zvjLGGfkN&?ht3#NkdRZU;7YdcQz!;PnY!da63K1lx&+3wN^k(_WLA(boNf;18(VmG zp_Brpb&=4g8%G99@;MQcF#?5X2bxL^%~EL5r5w9+M&2gPEd9hz`$I64n|58spxT`( zC8;_AYnb+ZI(MhLfv17N!*-1>h2DH!&W3C!xu9kl?X$&pUg(9pBes->)Rr6v3+?%y zXm$7VMeo;sxKCg4xSnZU=CYtwN~2nxyI^!{k(n|##Y05Fcqrk4)a7VI-JU1A?v?ux zBnFCliM~)KiXTyH%*Zg6%u4UjK1b%WJB39x`95lv?xpkTT;lJt!#Eone>hErGpgb1pKx8idgY8gBTdz-)Rh$86MfeAFrgeLpKna2$8VYnPXS#GGTq!zd~Q?d zfJof*By0rPnxiztFh|iO6VjXf@xY7)cn&Vnk%#SMa)a(g-Wh@=^c`n_NxbJYE}B?p ze4{=S^3wEm0e`Gm)YnZ685qJC3RZYN@Nozo4$TNN59|_igYj{SD_wxS=83Y4O4GBb z40PM;(^HsGVIK@-81li@8>MN&(v2egd3}Z43JP+NtjWv8O2dle8FeQkT&5M-irJH& zeopQE)3as6ZRb$dZDIO@C9etn>~yq}7XlXd%FaWI{6(KKrg0Vxd*%1d~DqSv>-Y4U=7f{27xnO7uuV4C9La=ffqX9M+QR7 z!r@1dG}-u%<}U3-Zb{R==413w7cgPQWiQ5>Shj}0U%l}V``t*~>&Jq~y3i#>Zxw&R zQQ1d=kV67Ay5zq9Af4S(_`po1Tf-2KZ)kAv;&vf%I}Q_fIIt!c-(n^@s_J|Duq`W^$D(8Bp^*nHZepPBXJ zdf-jn6{QMUGgmk*G|{)!VJ3hQz>8j_NPfrHhO4P;p=*8*! zJJ1h&D^yMCu(;;!#M*+%{r%1IG~uP?;3b5^pw`{sL}zc63gt=_sd&fXUTDPpA~OjY zBsG2880lBg7>NgHgZ%j7M1n^Dz=)=>+p(t6%b-82mAh3F`XnxF+lx_30$v@Y_ zFCbNzI_G{lZm{#x-BR?=i=t6K*W8VN1P-*m9;m(=mgvK;cK4-$x`5gW-J)@DLfgRh zNFi$+DafY6%(;`#f#;r4(qX>iMM8>g=Pn)c;ck6@t_H7;e)K%ibR6o&8-g2~>PVXprES=d zuJm?5p$V+Yzp}i&!!`I)eLjbOU?I*C_@eyDxoR!wTWDaB}ik(;L?Cf)I+e2+=z4sW}}rtph)ZIYi_xrG*xal$hBZD zL%D^VkyaMMOm_D(AWCCG=(0?<$n^uz@#d9W&d-TA_8RP`mR)TYDs>(Q-3hxV9dr3X zpVfCCC^;%a4EdSl2scfDHE{)zv>O%~yquh&OIBq=H$vWsA92x>Jbn0Xb`HgEG1836 zEVY}#E4g|F45SOq2$4G_;}P}Dib~AIjeIySwx1wVmp;P|>YnOp4g*|T;rjqsrEip+AI?2NnWgzB3lX&BE^GqT(*cdV>+$>Z=)=^^XDbSt!Ck^5%Y13?hZP-=byL zJaxgVzfei)gHl6|OpdV9WU|Tuy^u3g;v%W2z6UjjF3RlDS~TXd;j?VizFMTq=OW~S z=&C#AiBWbiaMN+Zl-aiTb$;0GE+K=z*i`78@;Wx}j^_$*P(~ug>)@h9H_XIt4e~Rk zcPt&wA2lz5ynA*Ny;>A48s9T}aV6M6N$!gm?|&#tnv~RESX?!UXKNmP9nbdZC&KwY zW0BVrwnKy1gV;V1{w8h0W1wTzy|QC# zv>lS^uWzwnDr-(=RhM;68UB<>K=ZM?KXZ}7+#Ft)o($6cca*c8-1cpC&QSu%s)Ol zw@T#0?4RkSB6gZkE0OI)z`yFP6P=YB137BDNr7eS7B}bt4(T>S&EeFg&}nGJJm}rf z2>1vRqq&*N^s4QwuD55pbFD$(`1-f4tp_N zNAb|lXXI(Vy-x?%2=;`!7~2QH$U;3c?;5*Z){F~lmwud0MAVfs(@M#eMkX(EjL3{_ zeER{i^&X+iLLFYPMU<+Wd=M-K>Zrx!x!{i8b6_H5cWEUUBpBUZ3V7A$LC3{tO>xWI zlYT!wro1?!@<7>b$&)%kNyLM$MrmEe0!@fx?`^94m(x1QdxhjdgLQ zHkL7eBEI*Ltb=W2cDDv>*iVX7oe-=Rs9hTb9-TQN+)MW44v`DL2Fn#qpYff!^u9Qu zW5z>{T7$;9n>HWGtYUW?zs=rQ8zU$%gQCs#k%ud^oufT;P0QMBtsKvI@umru`#{mx zMujdgm$89DX>C)xBezo~5GX|6!w2y|^4b4M)%(}9y?^|!I142XWtud`;oee-zEvAg zcTd#*sEzsXImgs99lGj9mhKYNycI}#QHwtEy-dfiEF;}e^v%GTxoJpwICx5O&vo}5>zeC3y8`{{8ggmAi zg`x;bs2mZx>QnD#R{+X_L7_Py zPcWHAWFrgewUl+p;z_lS?Y6Cke5|m>lS4GpkA@A~LXi|0o-o#Bi z;bD8wF_7zN+j49!3<^~rm`~5;eE=m_L`33|d*>uHMJ_%osVu2L!-sA0=B(|0P=6Bz z%_zwY(J&6{41&s4H{Qfk@PoJO^5dgJW6I<`yt2Fp$irwnrTTY>O2u-D-YOcGrj?Q-TL$se=ivQaKGic*rq-&*V~wBeCcO3Tr+D~TfG8ofdu zmRjXG48vs^mK*v0A&61cGoUn(Pu9h9g7+$X)?zxccTgq;fR>nBguQ50EATK4!Hu>L z;OU~lZb@(@ld$`Gm{P>3U{xOQgi$Xh=;7igULSp1_I7wJin>4- zBH`+oca+kId&Z&E8L~I{Xl^YbP^Lck9%4UXAI2~M${PS>Yas46EHjy23T?g3?1hVM z6fu0ME-i?5k>y($8+uTOgf#Fe!GLS&R~9iQ7seNy0DP&c(SDGJb{N%|lFJE&9POlQ zc0gG>qZ-LBQ>;^N3~jnYOtUMUwT&PFCDx3E?-WG1Ue#SSK>ob zI1Rz>tKXhm-0eBilA@keAvha_F-fyalN1nqdD+{;cRK4pU&LC)DP;pAzxYDamNV8t zogT^MdDd6WB}_gHDul8G%*ZJ`3YBXUuAfnIu9ACfk8^1oPUF~ZT22E7tLfyP zHY$D3-g5hcbI9#r8%9H`h>-e!>67+&a`ZJpA03<3}Vm^X5B#4O!jukctN<%pa+k%MNM+;bF233MNJQ%=msl=QH z&W!EK)TLzNcA=abGV{>J?Q7k!^)1KWD~21ls?YcP=;!*aTjHMS0K?EE{Mk9I0tq-j z&K=X87D~oyqdTW}HBu!LuBEqaa8LtoVL~cECh24|m>BSoaTMsjh2;lH)IKo461R(C z4#>nnR+ezcFv-sPKvWw7nS@r$bGS@`k;3vKWz$WblWX4;58Q@PZ~#a$xhOjeE3ACt$gC zLs^MocA=DUoX&cah+1FbGB8`mpu_BX-)SwgInE&j48#i;Gc-GZ4L<2?uTG}H>9A)U^+>;wZ==k^U+~# zZbG@M6#BkChTgR5b;ubcAh=6tMk0@v%L5(IKv_LS1BB7Vr|CEfVl0S8jFq$m9|zI` zc1?f@rY$W4%~rCEeO?G5%u(=$YAlpCbQaFC0a=>-l4Gt#`ljUqR$a&rXDGw5YT1(D zEUlvzLhCqQI{;V4oF5>_f;Pt?XU8IJKa`;%APz2x-f=9~5X7d5G$hDUpmSW{tqAgI z_pRKzsq6S|eun=^qZTh2P|U@lh#vol&mTQ)jPc(9#Xl}7b> zen?41h%W=0N?!;lyr#D;qby-24S8{Ie)4{P_*fSj)w}8SMHv`r zYOdkWs0gCZ@S*R1oJvFj)~`U%3Z(hEMr9S91zOSSOM0E4G*@mf^t6e4p!`)YBG(NT zIHnVQSLcC?*5lxlY5NLVuFx}J$_C8MKT*EuwkM*4f~*&6^Q{Q8s3&}^8Vy~243g-+ z9k~LSo%GCAPmluKu>m?d!ab-LZU*=>c`)Di8}J1}QJxItMtXEUeK%799X+YK9bBir zDWioc8@EjgfpOF0o!ctVbuP7lYw?YuJ_8-NJUBi`^vb=75M}P1!%BhyGnR2{4(&KL z)GCobWFm-$gffoa(od#@`?gD{fGIf#0sC7Gkcp2egE<$bx*H0_N?&`EP#AdH zXq_oi##CDsD??F&YuLc=0Rug_tWw{#$6S`2qu&VV`E{DR;X(Q?`KF^Efz)c84TY*6 zqOKL*AiFcJ*oG^*5E_CZg~^47ECd447H$ERMph{o5D_L6SItO1Gl7+IxGa|?%wg1> z9xThgvf%zJ%cR2D1tY6e10C7S^o2g_gj-mt{wv-eJCkEFb`DldWI>61?L{XvJM>R= z2S6t-uGxK%32MlFIOG>U)d~Zbo$qo>=08UV#tqib1UOSWB z^?!6{glui{@CUf#hsz!7vK-zYUf9WcZZvv!TL+aWVr;SsmgRN2|Gd*6DNg!V7LCd{ z>ABmRIU4`rMHm0OyBnaSv~jpsi%bsOXfv~aYONM`-Wjp=whG^T0Qoc^CT9oz3|6-{ zmnK+7OTfW=B?RgQ4Z`S|Gm?~pMRV|d1IV*;ChLCIiJ>$ zo^EVZ8}AYwt*W#fQ<6fJw#O^kdpH+VqZvo^Lp0uM@71FLhi*xoS?JKNk~8A1ES43q z@iQ!_d{V!r3(N~XBt>AG6FU`~TG4rEXR9qjOf z7)6@6A|*#`P>aX|TH5s*80Y&q>p~G9iVoGpK5ZAphyLXc4!CCaGRnSj#YJ7QjdE35 zZ|jVrhrDg!tqyyiBvx2LzIBo+EWOVvrS#2S6M1=eg_7336fx;tMdK+RA@VaNGo>`O zkJWh8U>jAAxh~`av({Eysj0hTRUAR4w07|AaSCcb^W20YmDLh+6v#=Z*6r?xJRgEy zK^`htK}$&G6$VKZ_xf)3MDyUzl9+hyiL+YsjiMnq-_M9@e?xA z5m){{=;EjHQlNP24`O}RcP^(Crn-B|n>=Zh`Oq*PU_bsOEPY8+yWzjSC8hB1ZxJC} zh0ZBo4IsQEAypCzMXqSp{?^4UVY)Y)74L&WZ3JP!IO^iAR4R@Y9cBnrMSrXbx{B7C zU?q+DHT;-A!qIY^_KrE{G(U7@l?DZ%zj+@hnHdzQ_49jeyRz$r*DD~qf4f5oQaF-q z>Uc|BOld!-vRJszo#Nzn)5}>kKcWt`8Xj91Kba9sPgPH;*&FZZqm~~{u`-2x^$!H) z9H`ub!W&2k8>u^@WCjYxZ}&=#_CQfpuO(uw4Eb69FTS_^I=Y?Z`bY2YuA7QF{c&&8 zZ$DU}+b5xmj98AYY^AaNL1S6nO56Ph?ddmY?0?X%f7)7(W0N1amBzWr@0YDKu1$X5 zpzYb@x3;w$Y?I&mRvPyvKgL!X&nCZb(0DibZEP*ax5~o=)YfuhoBX7=(!@9U$!w)b zZ1VdCO>&c;?ACJoHu=eIrS0G3C%=_;V3XfBXa_g>DQqn#waHI$D@}TnpVC&E%qG8Y z&}29HDQ_(&x5-asD@}frpXyec!Y1v~R+{1;w5Q*oDg8ma9=Nrf^6#{5M=x)ssciDI zui1Y8^q2FC?k27O{C8i|4*fxU`VE@iAGGTOTg&PHK|4CQm3DZO-_TZ?!6v_N(2i{K z8{S$DzR7Q7D-E&9Z*(i|=qA5!(2jkk{rmb?0{=?jUkUsxfqy0NuLS;;z`qjsR|5Y^ z;9m*+D}jF{@UH~^pO?UCvmM{@v+QDFgPwFhi(}>wZKcp}&`tC#JkZZemx5IQ{`Z4Y;$zo>lRfx`@cOR{l9MZRat z>}=DMFxkqZ7kB7fc1^Kn$>?zr6TJ!-w?8a@2=x}v!Ip?&>8x~BS#UJmzU!2}=f{%= z5`Ive_({IdQJ&(pz3MR=kJ@tdQMY1)zK7TP8Zl1~nwRZeEy^Xg?d!m4KS8`aS$I+p{i9l5S*=lxt~$z=*V5Cxuq2^tCxO{ISZhG*Zx$g8?)kZv^%>7;&NJbOC$C@sDE1A`8pPL za>to#TJ3?5SLoxC4Fx6a(OLvl^{o##EHt_p3ALChbe^->YFAL6p?|iTb&Y?U8ux_a zilox=58ruTk9}$#a_-@GOa7x4)vrd<{EkmUiOEm$jd7k@o%p3CZ23i|tKCW4%ZoSd z<&%o`8=bN0y7}CO5yH4zu68*`&ZxlNfa35D@Lyl6RX33bU-uu_cUon?Jp5|F?R}R% zk~wHaW0!W~PmM>Q+59Bb%v6q^`RS}+bl_?3JU~1kw{=m8FNNrPP36&h<+#_k(cH@x zZI6<=3`kx|p-21gOG^2*W|ew&F1Mc(C%IH9UkJ;&`pRFev=J>xJL`DZr$1#V;gG*+ zD^5ao=gbl1BPVrY#}pOfj+{Q={*tFs^pXCE|4EvHZGe1)vic!X5l2DQL6kSP@Q5y}ifbQN`iJdWRo!k4;Yg(&QUt%o4S~)d1h(e!kv}uH>^6VmbE8XOO-k zb>DriI_={e64gENqXQvb?evFXT~PeP#$Aa|6W8AHGgq&79OS*MIMT|^juWujJ9e3n zMQXSa**1+m=m?+gTuo+tv&Ay?c-_uGEtbChbBnQUJ0IZjTVttu1YGv~JkIt#_->or zeHQ3n{{Md6y4@Pkwr?+G*=!Y|_0q-EwaaKMuN9)CAAaa! zjQB5;GaX?^bq<$m9J*dp+oyNH>elw2W?t*%%O4w@qLbySlTfYCO;03Qob4@tMC?SH zU-dleS1NMr&ej?Wk*oYmzZ!y5;3QMbc%Kf8<6HLAb1{a^otRT&A>! z*I!oCG3V31qY~Y133M#H#+QkhPD~20+MbWFk#*fo@s;2CofL^wF!*TO8wH#4)?;c& zD1YG4q~Ei0mtQW7m~wyUA6#|unb@_bHoWyf7l59(TrmCAaf1!RHI`10TfQ?(@rsL= zl7YErMeiQvKHe{H{?mob1uvXSndHNu1{^P6Mth1uVyw{7UTMOHDFyb;E_uVGAruC6 z$KdZ+Sh)Y%CEYJw`nN~^ISLDGpZSlgakmJ~A-MJNteLgG-$fnMloKmZIX%3qyx@Yp znA7+2xAzIlz8emea(2tOAM<^&Q;yeF%@bEP2E1!`NTz7lUDWznb9+&}^}QvfCyM^8 zxthEW)U3UI&!#QyKR?XaINY#0bR(I4dn>oh&$aqSx`kRP+FA!Vd;NNBoTg%9OQ)<| z>`HHny1=#09uS}XMIfq}%_u_bk;hXd!>o5S-$+xJhLx!GbIa9dU$Bctso3to+}6C- zH)6TyIi1gl@0F@meSxxzkG%;LDztDl#GfBbwHR9EVT>v82_IoSAkJM~{H}4l(vzSO zdHNd52_1a6l%!0*rKE89wx5RD5-Nl$_h1Z;{bb@PS|N4z#w`h{Rg#g`Ss|0N9MaNv zBZazz^j%bDogeR+O1Nml&K2}3#^E^Y(;nj;F4w&;5CxyJzPJ+D6sh5C8L<}GpL_mQ zI$KYze&>}oMfU@><88P5o{dG#UA^IZy{0$)qlH0CcBfBYL#!h|ljBrPlfOycgJ@ut z-*0k2<_$q=U!kMjq1)hg$(bN{Qy;Hr$#c>RgM+k_CO!wXu@=_GdPDCmS0DRjsf97S z3i8{yq|MyPf^j-OVpdjL)yMKjLOroDhaE;ldGaJz3V-zTp&p|dt}^f3P`>ost?}3! zyqe1oN8UWnKa#QjF&5}W-<=trFb?n?Cg4;+FX2P18-Uh)ib{XDKtn|%r34F>1!gaByJSmgMkv>-Gxk(WI$2C1ri z{{D4A%{>y|wL%4Sp~CyVD0qtXcZDbDBI>+nkm~OkzkN{uT!U|-iK=L`@}Fxv4rgHz_yXYo*B1}>=VN^hG1z;XPJoJjmXFdG5RU}^0&&XyYCuTv7gGBDPrCo{ z@%}UNQ=xx?eCQt`D}PbvpZ5L}WOcRw0=ifDA3^`;zVn~uF(&d)p!NPyrN3-Ln&>}4 z{%`8MAofp?HU5h_zZd@}$eRBJ@|wgyLDu>&khkyqC&=3W5gGLWxnBYrfgRAC^koaO z@Ba(3xqDEs=jAU(;qQO?&n?Kw?PZFGW~<%MBy-@4v2q#u_<6?qZEn~c-+%d_{u}7m z^M&uTwyKK|o;)-Qe~EWN=6{3t+o<~*@2ca|tUJ&Yj_3Zo)Bfv=PvP(Je(M2W!^O+` zj#@+2dk@W^U&6gs`FptEy6V?(WwMKb$DrD|Z>ilCjlYNcrtqpI#5IbcCe~E_x^}BN ze}UU<=HD9QFAe;4?dFwn%6p;Ok)iGFmk;|AS`hxOZGY?IU&Coh_@-ao$-;66nl!$I z(>(F_aKClzui-pWmF~WVmNx-tW&9Fu@#Npb>3kk1U&CF0WkV^2;7Gf^hJ&5@d$`}0 zsITFAcO2fe4#`e}_iH%N;_u;pTbI6u>qxN`E`{I{w={)@?cc-wHm!dR_n+5_&ptd` zTJ|rx%kKmEHwk`IgZZU3+Np9Q$- zNN2eYeSqH3LjIT6$XOPa|Jkz#dx!X)^LIyGRPnjwdEx5^{Q5}kPZTcd@74I?fbHwz zUmslkS^Ui(#lJen`WoQt!=XO`NVMPie{odwb@4AxD*i0Y!V>c8FEZFXxA?mFm%GZp g7H6CNOYuMUn5WHlLJh{kA`N|+L({JL!sk!_3rCK^WB>pF literal 0 HcmV?d00001 diff --git a/docs/app/assets/img/tutorial/xhr_service_final.png b/docs/app/assets/img/tutorial/xhr_service_final.png deleted file mode 100644 index b7250e3e304607217b8dea1dea6be0a07350a4ca..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 144043 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
                          )GYBA+T+qx!$1S~Q3Gv1Kh$|8_rG z%m758RcP|5GR^l97k!HWe}6nY-5(HbgNwU{-`6kXosX6{AHDYl2X}nOXIl@7-Fyog^m`nQ-auTs z4{iHCL5qNRe%P{+tKNQQ&?XRUUbe+PU9wHj%RwuCs}(4=?3Xt2_PiDRv3)5s)*cpc z&>fw#7r{O$cY^jbH69^b3IVCr%M-SCL@@A|7gdN#mzfsbJ!-$H`7p1)sBQ zo296^ttxPnHFS_o!g!xCV!V5N6`9tgWK$9VT#Wto3%=&ax&!p@-=A{jL*#cu3el)G z1u2*vM|qbXwv>e1FDVaS9Kv~K!B=7jSEOG-&8DgSX$sd%SK3#6jzmO!NxPDqkY zD%skSlar}lyC&%wnQWNzH99*Tt^0P6lp%5eaWJXEz?c_rNqS^wkpNj!-O18XDd@OK zjvuYDc>CUq)+TjQ0%B{eDoTwKCdLvX#!g%}Eg=+T0_2>o2i2h|GuZn73 z?Q8S$XY+ZbO(=O;!9uDlFNO38x43CR=Jd#rZ-_ z^MCA}2YeJo+ra;qOYfZ!5+D#Dp@v?h_l_VPL_`IYB1jPhsnS8EiHKN0I)WlnMG%$V zdy$?1Nr3cvxw~&??>5;SLD5%vef{?NvD{{FXWPu}{O6gc6jU}Z#E>~RBOd0w=~7D> zOZXRIJDw2xfWm=6Qs?jd=O8=0BOCTsB_%x@gUIxvlK{dyn2Hg>@}S?*r7*+hETuu` zLtKf=z&kXY8a1NuwofD``UZs5XX&!(ly*wN=v^xDM(^v0da`mTD z_1YBomr$_%SdJcll_I5`Xb&Rr$LF^B+fC+zK9C|)`U zUypXo-+Y|jr=rO)>Ip4bi>l>(F(&oqz|n@-hgxjEJZiko_eZh|^fWgVq9lA4ghs@b1%cGq#*wQeg7nkt~T*XK(pqd4P; zMXjAwJ4b68N?Wfk0v(DkMNK*KAOLRA0Ix$>WQ`g zF^}QU>gmj0dW>H8HfY8iV?Kupi*hlq zbI-MaG^>MJ=g)9bP+8^syrAg0?i=~bS~H#G2yM}yj0Y&}!^@QO{q22R{Hffi4VCk4 z%)~A;MSAgvQlwfP>OXP_2Z}}2la~Bj-F=HtRaz7Y2q`TsdEW;WuOKf4iBCvnT7=}k z3cXhV<*Ekc{p}ts{T-ZF-`>Tj)m&QgmC9z*iwzmJ^&EPK#tdv<`af@2((^YOO-lOq z->7G^Qj?YeMy^)+kF}9M+P>@@>@j3!@y(L;9NF|UeO~B8v9RLufXdy?JzsW0;e;cm zyVZfr6{niNO8#9yDUCRfd^(=p-nICoR|9b3O_srky`!^y{mP3{Gy-FG zwul6ePP!MpD$1!z`T+!$uT9(T#qc#+YgxMQ4B^ozjkuguCooITCM(-0{Q$*zb&vd* zPVd{s?jwl|_+c#JGEADtmYz$F^jsaKk&e2EQM%7;>D-oUg*&%?rsMMyS%2Ul5svoO zXOSW8qr*XZ77o^s{^IeA0g^$wKJosvmkqV^?#C$7U+L}8m{b!@H2E#4RA*}w9jD^) zt$?KXR6M}NQodq&++1DwZpSuu75s`~urJ%&-l zZH|v4uxO|pBw1(9SM91Z|3>?GqBdfe@2J1qzI2w*QX<6O*B`Fs_|}7T@6ny&CBiJZ z>?M%&^76`;-rCl7QVF;9R|4g~%H+-P>o>fy>O7fyH*x03SuXARh_`3VV9cPJOxkiC zL&_zl59vZ=xw2HP*OE1dV`ZD#Q=69Z&d4!Le7yq|qoNqHcq2Q%oJFImWvJ9<2z#%l zs2Y!nn0=cVJ8BjOkH5?3yUq|=%!{16KQQ*KPLwTGf<7a@COOBl@12vI=wC02$jB-@ zKkjp`r`o(A%toS*tfqgbs+2EVj;0+x;9{~RYfpO2LB@4@hO*N2HtsWnqp?}?C~U*K zV|jPlWL~aXm5Gx^&}ZsKlB{9*ukPK*J40r2CMAcA_y-t8f}M=(Ea=x>8nKq6dfm>f z+;>}!QJEckidjSJP%a{Zt}jpGm+PtdgRLiAWbHZ599dQuwpdWYP+$a#x7FUBC`#v;s}vNY#y zdu-W!PB=PMesEQ6Luml*>+j3`2lvS~7@qRe^PpO*z6|NxhT{KoW=sxLe|{)q#tf%j zt>S-)0zxDdiI;%V)6d(YMO4+Z-6QqRF$0 ze(y;-wC_Mz$r5r~7wuYsNoA^A(M&4IWW@4!gl_y-0i{E+$~1KM#3{TjRVtOneD5#| z=YGH@w|+D&lEBho-TCxbAvW*(o`H?r8PKUa-`qE1cl|JPKU~Q5pzeG==VcC!??aEz zZqfh4Pw8-P3vYb9jkxT*M;2J28g09_AuzZtZR(c8#dv~q*H)2SWinglx8UbBW0>!=Fz4H_9?wrgEQ#O;3ori5XF^8Ewv_A);7IRtxuJYMS89i>R&4xL`+boIWh z+3*>~k9^Ma%g<7}^N0FVJ?{Usita5(kkt7T4)0z{p#yKyq4yXvatd?h#|6Ce z&L>1Z)0Kg*=vXrMQ;u8`;dqVg{Ae}@u*XTS*Lq4#G|}XDwUqK(T9rXZ@%k21ehN^k zp;BxwR=hYZnl|Ht)H#1Lb|LY%?^$B==~NCDRxezgDGwSfUb#w^6Wt^60`tmRZR4yS zxp`%=mL<2W$!H`nB#79!Skh8cpWeeW8Ay!3L+pd3$E(wT-%GfEoxCSq7Zt!EDAMy zm&5N3C6X)b{5FAi)-0i7NJ$2d8%NJt{%lx&l=~Tp5}0-1&39hlnYN8_@Tfq)9zE#W zpecjjsDhW99R`(R(a}GQT8%2>8(D|K?mk4{v!_^%Ud-!Jm2w@&P^&~3H?JMy(4ys} z6lqAq#x+RGbmNU~Q5@fKl3NLR2QwL^msX|=NeRDlEzytu(^j!`R$nfyn#bvcP@4AY zM*N**hV*Vg_L<8ZxELe-h|}pbatU)M4x?Su_H=T+%JyS-$i8`nqd)DZ>G*C0q^C$1 z>dO7ITRC~%M7KBQ)3jJ9oj;n#oL8Ho-?f-;&xO#sc0JsUI-+{^A?4yC4qR1b3$pVg zs#0|t7Ai@Uy8}hqwqfF;iF64};N1Oebk5Q!$H|T4pB517+n%?F4x)DTCcORSY~CnW zgs5j~QQxOHjjI;t_^~5gFW!w!L!01Nq5(5r?TzcLGkksHF6ptZG<EfDM)w7T z#$V+0r7P0Ixy-u#j=bF_3OCJtOcPBsc|xdE2V7Q%5fYuN=wy`+SFOzn36b81EnAZv zpU%SJv-tJoC0TpuUIO7L@4W)&r6p5<6}d5~c(D>Rhe zzTWr+`E%mbsXv`p`43CdMMgC*LWNF)x%HbnX0z$-rqrr2kYjOwW=h_~iLD#>?8{$B z&i-e&rQ^qsj-RZJs6!9s9@D0*fI$&H>BPRHEP3;N+;y(B zZq-`OSFa3|M0-|%Qh`bJRQF$%5$AF8uj{6>rJ6Ej8|5%qMw6b>b;=<$_qQ{%h|@XZ zt)%RB4Agtz?Ng=Br{lB8?nV7y(X= ztFRCPjPA}_sS)X%T_|4SS;B)|IhbuCsEDVW{Xpj~jjUg-M*lDO(y>nh zd*dScp_&(0j~j7vw&TXR3uHQ&sngJE&>UEYSNfPq`SAjJ-_x_EtJ>jxMA<$f9&%56GnB$ZHW< z+`sX&R1bPN2(7{Bg}ZZ9ZjfEyU{8FD8Og{oNH0w3&V?yn#L|Hls@#iqzJUaIS`Z@h{vB@Kyo=5^ zgplHeaLr{E19z`o=Rvjv$^M~)_`70AzsI7thO+E*MS{wGN{hX;{LBTBZL z-1a4FE2ULC5wP5q`}gj%chgRGuiQ?R%9V+Vijsj*fk*`;#Q;eFraFMRIz-T4Z8!Pv z)ljO{$hjIoll-TnlLU>X2i#1sei3_u<0nqy)}ShW*_mWZ5SUlxW)zD(gV|hwVqQ4D zAgAsVvHQ(N;rOF^l+v-XbyDRz+#r$6zo@FC2sAy6l{ZYStUK zZ)Y>}i|x3#pH3kGywb}vD+@x(6y?731KxM=zU7oB*D-X$3ie*VL84uK=54WD+r^Wc z8QSkH>X-6<^qJ~iBMLK1`ViJ`x!RPU(Lr8 z7ZG#ymfT4@IyhQj!KBK^tqwMAGUrZr=GnvPRDsZ~+f6okyvbkIXvm>*-D(^-e1Mxb zZazg4m!6rU2maFP#(5*@+`BI?zS^65QDte^@+FoZxGf=~)aRu?#PA?Nj?nPk&UZJivwPW0He9$X?XZK1AACV< zMjAh?oK1&XkyMqAQ8BU^6F=QenzTpEfz|YTt}}xM_osfto=jZx>r;Ca@o{nN{b?_e zH7e%i(f+M^Hj{sw>CvF|k8dN^!HJ@|wze;4XQ{oqICJ&v6_!qz&)(HLY2LIM)uiVn z;8C)5C!BvhP#V(Xc#xhhW(_c=C-5L8OM*g?j<70i>-qCmmm#cJ zv4UAIzRQkVfi&w-g3RmDq&-ZuLS#1au}LH=0aY^+rDJ50-&DjNy#%Kh&#qzLk;|B! zvbb-|${mp<#NX%oO(&WS>5S>xS_ThU%<|>S=>E(Lytg}A1ZK$n^=3b~!GeArs5fFU zD_3vkPJ$yPgX+<=XLCXW&ojK^EUD~r-l*P*Q6C=WR)z=qhjF9{ShF4@pj0(_ls?I( z)u$Og$`VMyn3h7~jcfQ-=|sPXk{lf0RX)zhX0Nhj#})h=4y04jOMEb4u)KYAw`NRO zv_pcx{LU}g>1opaB*^C~T_hO)#QUuKaye_~_h<8|t*qMdGdbl)(KF*X@4YpQFP48m zpB~dVYVg9%Ndo3u>v{i+T}0HYO)1kRo}alwdj3mzdEpKM>vp4AunWK5xX;7XJmYiM zsxQ+xXE!^J1kkE>MO?M%ZcQ}NzD>-|8T5W*Hg_VPrBA;ur0xEgo&#nP>rjSTes17Wgi<9VNIkcn zCcVdS)weohr%$I#r39u8?7@P=DY!^|`JrEaX8C7paPcWg)#Cn7?K#YuJD1SN;uJ3x z_Skwx(Sw*QeX%l~ov)6csEz3ILIYXhQWMl6~b}Oh$r1Iin^r&uy^sNR;@Z@ zZ2O3hw(R1(Lj)sMe9Eh#PCST?!KYXSYBZ{e8yQ63GE=*89V&$RVNQ)F$*Vl|B12SQ zBf%0|+tX=j@GC$eST7kspB@t^p;fSj~^`KUu)HJAUAycXdY2nnvyLGBha@#Obd;X3ef2xmWQeR;`&#ZGT6S zuU;p#VGGKY2$F3Ubb2>@iw2SH)rwbpRFbucrsPB%?Y)R<+e#W)Rwv`!HWshm&YjX7 z`FQC&G!74?dHoRSCAo@qTXqwp3uD>0pHej-|I|umYBDChC(pF1O4V{6B%R#DhhOdD zrbh!_?^B8Er(+3k@**Sq6l3d`E7-XGI9|Ob@b&l(6!Neq?e4Gqd?t$*-xx04lLIS1 zc%SV*9HL~ifqb!GI36T&^JW(1Yt^Q91trdy2Zi=6=7*ry7&V|3evVq_sEH>3W)ahb zwu_U|iLaeb;cRxGm7yG2`s_#SBY#ihqMp`PL#DdC`grP3F-0!GGoow+$q$m)x=I@G zN8cqVB#2Ov(oQ;FPF7By*LOaxqs@A*CX)P~;)+(MfU>3>BOxV=vFwA7sa>PC?0E6F zN@g72ezBMfZc-ogd~3d6K9&7RE%|BRC-m=Dhb^l%_uu5LwI>+YqY3Tn7h>6h)x_va(xxhW^7&564Vb~vO*5z#?*3HT!h8N zBuV-wpvDEqUJKpM59c{u}6HWfzFsTF|R|1fW#WUNJzMfy;WpZI& zS{ITXQgXG8>Z$A})w(F>Q39Nc7>`+5S!85n$V+;9I;p9tq@<+eekLa;%ioEzV(NMG zrf;zKaG=fe9ckL3Ievu$NV=bhF~?v*Lu;Tyv*O8XNy=wM4TW+c*X&M!hw!*C>mDg9 zO4>U*vSaNQ&h9zE=FOY&^Yi=rDk9+w{To+gW5BE2+qsZYtwZ=AwhbqLUP>jG6VxnI zkGSeHIQ;oweixkXa5j*kQ|o)q#AqH%+2TspOa8LM5{cWo>6 z+%43cmTHuMDV=#WDl;s(9Vd=`K*|Tr={WZw9~@7icX7zNy`4%$TjADZ3LlPgqFKvn zv|n?XFS`XimG*e&&K-Jm?@36-Vm$j&7mMe;;m3;L|tVwlvpg(Fe zSx_F^lD#CgGo&^ z(c~`^HH@llDwU8ziVdY$e0+Rl?UdLiI?Q6li}A{<{Rs~#$(r}RVA|^w`F`VeS)=45 zfu8J;VKnD@=UT+h>h+tay%N)#kY|6Xo;FpN6%(VvmaueTf{<^DNF zHZ4ndmv@Q95j$avdjAfI57G&XisC^+Dw{sq$lV8V{JeP+*QLV;)@@0sE>k+XiR_$* zPpysg=+d1Ob1Kii*jaW`Rq8a~{hMqu9Vye@kE>(bvetT*Qz_c%2?z?r*~ytLtG;2{ z&`E4uw3?{$m3X0FUkVovlH0118fgM}7vvl$zj_y4~^G>a( zR<{NQgMpO96bTee)*R1PNATRFi#nC(w*@{-R^T*S_aiqyv_&&!mR4SQ^EIZAm`u-Z zJ@|6fN?hGs|M~|bkz?#lc$giJUb=v|m^%=2k4*VujYQu_<4#zD>}w#Bt%-P<&OwzJ z`F0Clm^qu0<-RB5+6nGwmSx_`9=tU0Ev9|aocDTEV@C;J&Ru&*(`hvjE}kxh5@7!Z zx-_Z8&s)0FxA|5+pZOezHxwiK>P_704q)sXQ5e=N!$2~3lb%j|q1Ohy#?AO>CVf0z z2DHrd%v|qllhq?Xudc|=Vxu#waXfz=+Z9mOEXS18;pgusgXk|i_pxi^HctP1g5ZF{ z^nK|?0s{l(GU7TE&7=~XU$K=`;;Y(%S6&^t-+6F`$@O=%KQgiCAZ@%8Z_x{nz^ zlXe}c6sjXF(~-y;t$2ORLI!jzilbLa>eYzA-PIchzcO@reFlqOZzYG0D-<3`k>E&z z1IyFAb5nY^uZ@EQ_ipZmsNJ$Vlc!9eQDG-?^zQhEl%-Ac29z!2`nR>e^XJd=@{2EX z_`)&9%zcMKg@a_6v{PrdQP+z#Bv5W$Ds9ZBjteR)g5`U8d*SZk&fy;q^7*_^*tT*r ziO~;f(Xs^%8aI^Nm1ukFSgGppKnheUFsV43sm(y1#AfnIeutV3=+9NIw#L{=*bk(yECEoLwv?|@k<^q_GK7}P8rxBUMzf;H5*C&^%eR&( zQ>)6$tkQN_=SrPiT%_}+^2wZ!xOX*%7LA)TZsK^nJfCik#KZ5sOy7~qxZwCY7w*j= z!ux-BqEn={oIHLa-+cEC-bMWBKk8Kq1qaFXCZ?t>7O=WJOIT~1Nges?DzB!@`RZ7g zTl1E>cXfA@2O~#+ImFft-*M&CMa&sSs#L2&xeDcF8%TLSYiKLAjilmmqi7}tNQy;m zFR6ySKO_IC4W%~a{U4*1k+cltxLseboW?IPp3ELS_%A(2=A21%{^(om!NMjNtsabDaJ8B$rQ}Co-xW9eO@T z>GEYrPD&y>BiqV}X4!tuM4nTIT`s6#4Zd!*$J6CauL_NsyQ>>-OdQ4Tt>5$0jvr~+ zq9vihMd;YM6AkJ&z(2rWzRo8R0mzdkO`<}D3iRpI=ZT-2r+Xj`hmK`b=ePdnU{XNR z{rLO*vi}#>uUW^9TQ|s&9#_NXn$xON8}vFm(h^g0@z5^MP$3r%728L3UD@d@0BM)& zY?W75)UAL>7k5|A96iP6)tk6-_A+FdsZ_oKk!8!u+DbWGlNA`1PxYc`BgJ=Odi!xO z`Ct7_{kt@jnH=2wEookUoL=$~p+jfVxmFklS50KphkGf~c^FHEJ&PB~Tsm=%tG83R zcwi~(_d7E7cz)bGUTsu@ z``1r$?s_Kv&bJxTp(}fmLYec`UPiPlLGr2Py!yssuGv-Lt@(3lAL$GaPqE=pHlgkp znKk1qojaDGSeqBAQ&?)%rU&fX{v$Uj&-1NITdw87X+|_|%6q3%d3NUKtQg%D_j^Cl zYrrI~KQJQ)mvS$}cO1B@q{bOF4{3#h> z&#+|4TmsK8rCQDY#Q40>i7mR<(f#)zLpM^{IuRs z6HPP?=Z*M2VONMkm!r`b{vu517b&Gv_ezcxf^(+;; zKwZ9vMOJ1ynFbw&f_yM!WMMQ>@HCa#wru`u$#;)WQWhS0E>Bceb?ORQ3Agc zhmW)Co9$daa{-+JN|z}^8EFwy-$InsplWzjw3JF1ASH#O;>9gK)utGK1x#uh%6yW= zuJ>m#_t+W2O4nhOqnVu(+B0BN4$YfX;L6t{X?^M-KYTWobKB?e(zFv)etj5iiY(y8 zW(}F~$st~9{xjVh_Ta2{Bl@%rW$de6IF`7I4>|=fwcik8!|TyRcb$)#wBW?oJ9vxT zELeDu0UwT(exTv#OvNZs#+Q4aOry!$%kb~omo}Vaz_WEo`(iB}gMMYypf`CK7eu4x zAO7%%+5w8?Lh+;0!hE4Sq8fuo0;+*rN6O5zax742J$;6dpYG^!R) zzh0dXzR^`5nvGNLE@ z<3DHhpmJ<@XB=PNyi4bPy>Ps|mlyl@<@;}zaAWxl#w@(W(2*VZbk@66PDx|Uuv&x^ zDn^`Baf${x^Yg5EjN7`0fWnn{^TixiOrAjHMO9>=OuBWP1(T-o#&car+BJ(F{pV2e z>mI%f5>p{+foq8Sp4=;XyBpi+D))8Jy?TD5CYx^!u-T)xctLuX{oR6tMwtva=% zR)adyarC4}?^2@#paM)}&m8e-Hs?8b+L0I_aIYh7kjpT&-dT%B;jEq zjwX9bhn1#ecu5)NMH^G145;(WtF@F$7$CI=cR`tN{@a?#TrK~~W3674d8>b+a$i@nlI?iygZFv6S2#a^n!<{pd-ySroHx%fu!7c(X+* zJoT0rz>Qt&S-JEiLpPq}t)?N=b2G3h@fPn7*}=J_QY_y51ua5csqGR?gQY)ku3ce_ znFbp4|A6T;2a$H-3p%!%$YtqSp4|2=ckEteaR0%)(!3F${&0&Dku7OlO#;F2rqn1D z#O^ES2&&YbdD1o24N2jCpP5u_BR61!z!>4Fq z6fKPC%tZ%p3ziC0DjG}iStzIwzJ9)hmny~W+qa2{j^?uuma=lma_Tm&E5T)38EjHg zQpw3NSTd*N+D{e$m5L_N>I7nt-q{J659MntSt^_|Wg{&REFi;9W!opMy12P=>c}a! zt^bxUKVQLf9iQXyp+oe3p*K|<)uKVmM)G}`jiy|Uo7r42%jMb!s_Y5Ps{NGfmbdZf zv7V?bdFRT{k@;;-|4>~syV8X}4n+m1N5nLo#jw7m=P$&?o)=a9swv_>k(%zKiKXts( zfbtJWid3_8+qS1xVPCS&KIBTOj-^AIuv|s&%DwfP;LzmM^`4*MjePsP9OhA#Hi1brc^41yi#7Fuv>*!lhGUlp&2G zqWW4 z-hE=vCSeR5Mn@ZFviGsaJHUkidlS1aKBQ=$I)uu~JSTcQ-;K!~E)thz!qe5_v2*v% zU6NfxXwlS?S)uO0>D0_lV@9iIFom_ILWsp%uEt9*QgrG%Zr^)Irn?&rIz5MC_c_O0`|3qES-dQfLmvBK8-y zjp5=q+`OHV5vAzdyDJeDBIK#+9D_lE9#cN3w7^gvxTycOq<}P$ zosmUWde$RKJE4^mA#0Yrw-~!D7(H|(Wy_Xj%H%0rx_O1Bom)~Wq70d-Qr~1uedN5k zFi61)!QWCA+A1W~$ND2>f9vl*TUHT^JtVpJ{d><^@!*!N6hs_*=|2Z2M;YSJ9zV^7 zmFr}nba!#5XizA@!NCL;3X~yHX*WtcQ5FR%m1%AD)OJDPfYe&_f13R3fYK<`&e^G? zOY7NLnRvRF=Z$Hzs1fK$dR8j;5)9O-ww0PlOsFn2uBlV32jre5^|6KAkiot z+fI%>B^q!>atio*Qm9l}8ube0^-)u3XLp2VBi?)Dp0cGEjUh`qa*ouVoutNPXF$og zeec#~^dUibsJ)-{_Lv>X-6!G71#V>}6K5wiUMExTy>azCS$>{)dAQ1{rE)S7rH#ST z=-h;ZtC93HJweravt(ymQWIm?Ic_}f^csfC=@ocOFdS?Br5Po-Bqts5G@XoQId)o_ z$@&YG?pOFY3On(1k92OO2$NlJ>89>+;J`(Ks+7jgK};1G3#d(LL@BZem<(hY%<{`t z6HPSHO8jcAe@vEw5p-1(ZZiXq{P}x)s-Uu|q^$aR z;Bf^A)f&fwAX52G$-k{Q+^DCw|EXHZe>G4dj7f7$a&z$riKL!Bj_YZzyjHt9d)7|n z?FC2ps?}HcI-KO#=|dbzdxr84w(#Z7II2#Z$?z)g(PHj))^&S{eiaOS_Uh*(MZJwv z;$C|6UCfl#KhVBsaqgcv&!Xe^F-uR-EJ9C6=X12X$?eSUN zc!IaK+@b2YaDqLP$TZ}jglX0Jgi*D59WHg8f@9tKtnKRk$SpZ!=}EqKm#Y~@+B7T7 zvm3snW$R|N47|aoBiCc<`XSzqdBd)970Xb_{R$Hoonmvp5=$}S&ft)LLiAPyHtvBELu4mWG)`ax`j;-^L z6DM(}tHWh(-1fs@d`<#tbM7<8P8yj>4gcJ^E5z1v;G2)9a3I@`5hbcpJ){iZ%oxvu z7BfklH;Hbuf90LaTPfyxnPay+h|lRsfEtX&bqFw(KFx_a#6Gwyfq!{i^_rSe6HPRE zy4p&mGgp98t*unFNeUncfK)s4D2v!8%7}eLQ0t<_ijtI=L|l9v7fznz$DMm{m!Pxe zGc~E*;2DB~3uA9RpXJ?bAw1cs$GWaF=Y_Aaz>i*@+Wl(fdg7zwm^5}GQI(@u{Lx|# z9Y0L{){O`&8HS^?6WQsRR)|z!OTtJcg`fg!Cbhbb0?&&T@|4)@sHcTZ`C<5p%G!Xa zTFt04+jt8-QP~2n+Y0LW%sf?P`HU&z~=yE3a&W#%}T z$tc!_m2Y>UTxc>qqCVw?`W2+gw!_IggsCe(B3TdGP3*26xr|^ zg9m-g-uKrr=5RNLHLoN!E(xBi^keV>z9qqWi6<1USuJwvNfxqfe!4r@=?S_kQ8 z|%)$;q*6{hd(L9`$78a0$@|dN3GoZaCCCV%gG)mkHS=H--xLn zjbU`jNESXDs`Yl7Xrjqe)mEyZQgr&lfkgpJTc}i~yahn2HI@ositWmGLX#z?MN6cY zkf+OqbIsW!r}=*C_xSqyP@`@ws@JZ8ub-cEE_>;{D8Y(!egQ(l16R%kEkTu--WF&j zv}Rwe*g%tpjhQ-j3NbM;vQ{!Qytq8QF3u;%-OS3dKy&Vtl{wFrQ2tY=VmY149x^Yu zx4Nv7Q3h-7>OAN5{Kt8svS#v~Pk~djsUXellawv!+!ifo-c+`od=8;~6q227ke*St zRL?oY-i_tpPy0Et|B&q16kIr%auH<-@b{OUe1!d@s24{E3rMPAQTbGZrP59m4W>H( zwymAyKV2)C@AvX=3v8Z~m5Es|jU4S2GBc5KKaSX>Y&;~`4DfTuj+;y!y@-wX8u8ynbL!#5-tKQ{|#nGBiSk$#+M*>?E&7b4Kt6|>PGH8>Lv z(r8a-$|gBA1D)Ol52=hHHG#WQL(I~95)x7v7okNo8_CQv$%){FJ)kionKR#f%A{95 zqUF&G3@B4@9E8;5WU}oX@pgAXmz63VH;(ii2LeKaCFm-ELZ$PhCd6_-$%LnWAif^f z*ksZ@#K+wuA=!kFbZ-G3&hqgMnOW!@ov^pF7>(p)XQOj+mSEUK^258_zLSKDbk9Yk zQMGjG(&4kDd(D*YTlyjCjF|20ktva-(WSMaJS&8e;7jRp( zt`50l>rkV7_nT$annD{V?_90#A1Rw}n=)N){=;R}*R50Cpnyo(=}Lk~g9MP7nL?AC zNpeyOzh1t~xl?DkbpDcDAHhL|DN>{eg$fmV#PeD`m{7j6)j}#7$ln7=o9r`BwS8-0 zgKSlr64#l4BE_X8|M4B1RnJZOk>x%|Y2DMW2<7~W*c{#oFE6LZD7q!!mPT+s z1zeV+s~1I!dHu$*)Y~0#RIU5?IBLDGCYosSU)5NuwU#oR$suX%WuR2&{uW@UK!pO0 z>O~Ee$~I*`0i|Ny$Hzx@<`LWC;^Md)eV5b6PsuizAw@%}RHYK-Dwe}R0+b)Ne^2$O zYRvy?9@nm2*5fN_?ODQx8})4Jx|soebQ>MT79_K~;E^gCtM`?PimCCR_x!}FFIG~$T6I2N`Y}a|7G>tlnJiqifakh* zrD2ms^3=A2-Xv$)QEQ!K4Xa6LTaCFkj%Je*(nlT4Tc`4>wuU3hojNw>I_>0@HRn3Y zG3UDosK277qljtXrjsgTvuY%Bq`yA)EY|#LTKfCV{2U{t8DLp?&P!rHgD*pf;(njXP=!k_An5s~2_b zNChC(;eXVD$rXtHU(`x!K&go)nrNblCVv4?=2H<^K|u|c0w|SF0UBysOJ!ZHjVwq* zslcQ-&dr-QIeGG=>`nas`|ne!QYGfjoy*dtO9=@HVaSjnvL;SUk;mS<$AvTJ<$29#-Y@-R0$v@cuY(pAt8~64<7K~{sUs7V@OI$!rRMR4&@^<)HH3(}lCpbX;6rWX+`jF5yisKvO_v zuGhM-0TdAB?1ZZ-D7TYpT37~Xy+s2jpwO}|E!Jsh5wP8?IA7(MWR0i*)BFw~M$*$W zWapUl^i26vOjl=SWy&Ba!t`WG>jI7w9wx}pDDFYrvv^is(mi;2d*k8mftQyT;SIuN zJ4gY>wwgc%_|&$Hwm@l{8L6P{wpnb{UfSvyl4@<_|Ei6o29%m;qKPJ&X!4Xrv4vAR z@hCv40Hz$i#|o6I$iE2Ye|I`QAGHV9bWW#nm7THVk+8ROi%0eGEkaw^59VbrHJh)&TsK7&XEB# zJzZ!X({jNwE7Jm#Vt+YJp{tt=%tEUw0Jubn5^^Xc0g(1`I3@EVp>~vKuRz{!fn-6j zsQj(oS6yB?wp#0H3z4?%;om44P->!yCYorX$x{GJMPsRkOC`6n0)EP;*k1tP_U+r* zx^*i-K|#!(J)29HF44PpZyERo4<0N}a|_@UP$fW10a5j*?XeZ79I-CW9~c-YFKSW1 zOq3CznkjOWTl17>W@O6FEvd<=Kwm_(?t6|diyMm^%m2)Vc$~D+R z?Y|i$HK5c)6HPSHM3bi^Y6l(#E(C-r(4kC;i|++UifP?>^XAFv65F(CL+8$&Wn0N( z$BxN%lOmO(a5xc*unAN&oVFmT)_AJpeJb13aH;kHR~B)tLi;DC#LYH|vu*#j74faT z5e)7UVC8^b0!x#<&YGdd{K#`D2)@+MOzp^`hEQd@EljFEZ9S}Q!}i!hqq@B9G`9NO z>T6N1_y2=7QUgj&G|@y8O*HujfTa+{)>2s)+A#qq!cKDW;>EI7ZtB#j@|5&|0R!ak zhYcG>#flZ>JmBJQF~zOGpkkY;fTRM7kK3*WOm#>hv91m{uLN{g)|G2kwkt5GY|n*F z>7SF)%&{gO*hybi-<~3;c0{ks_bk-5jp{`WkjlDxQQ%JPS+CX{sy{#4jHifLfAcF}g)*%lzxnn~MiDC+%{>_2KPrLtc^nSz8Ujz7xZ zW^15G=S+zAgX=ZyNpUn&{f09kcOb(hfB#>QcF)!$T0My##l6i&8Twbf9nfzDQIX=~4D3yQYdP4&LE z0I7yuTQ1S$Zvskn15!6Yd6XlqI|w6VVN)UgHk*i-6T|BWl*8yt6(nL)+3Cp=;RQt4 z0UMi%KLVCFcfZS&IlDL?pF)Ooc)h(7&%ZUF*E?31zt6gNp0DOjBcsP+UaIKv6dvti z`gPhz{odW^+ew|1$IO+jGx`ruJ)so9ek8 zSUH7P-(7(*up%=)`kXeAo{v4whEcC@HLN-PU+Yp}ZgNdD(L|F!J*-VmX5`3`^7^=O z;|L86<+aydlkFl04H_gn->CaRwU@Ik#67M*E(jXcQ`NS8x2;0Rc6!_PJLP)RTp+~T z;J_j81kMDc<0|$04%qQyp#(Z56{BpTFG&tLk30|CSdD5HD9D4_*4DBhIJ5;v_5Nyb zR0HI{HBRI|5-9W8Nsy-=&#{7}OLjJ?(&uIg6n}Pf;DoaasZxV-lq2ecL8>S>X{~Zj z4$l~}X_=LYx4i>tLJh65U$9MU^;;7E!&fXjpH1i9eQ4mXC+64vEbP~rZ!UepwlU2x zr^oZtwsqX8KIbU`r3d9J2T(ZJ!DhRT%$Ni0im%B#?fw&>wBulxp3LkplkG1QCHmrz z>HpF@mOd4@JFk5ev7X0UI0 z2VPm^L7lo4i9U0m2~C^x)!OZRTGzY4;~dz!jw`jo8KS)_G|@zpzfjh#TgQqOE9lgz zlN^+M!-fsanl+2IZQII=@brG{E87Nm3UZ9Gg+ApwTOhQB%g2FfK}$g}DZ{Q%9OXE3 zGa!!hj!F3AEcY!bIwLpy4b-)B!&mCljhG6&A6w@fTY!Ar_JY=b3sjYB*QT-m8u`Qg zpl(F!K&-;9!<>;pQhGWQ_4YJ$_hhQOJ9}N-$Pm%>ogHy;5mELn>zUHFA6;FUChgP6 z!<(^o_9RN>&6%0G#}jrQ1vT1&#E@-IRJ{(29`h!HhmU0Xf-hO|eh+?JIE-Dlvm|tO z!p++sKfC;mCgI}Gto(c-OBc?db@>PyJpT@tQ{|r*JC@96`N|cHY1Dw_KmCd!<2oOW zZcju+c^VB_LbNo%N;O^CL{qkEAb~!X5#_D@YiL}vBAo_K z;Jc&e3H7qaQQ&;mEtb65MLuTxnQMs4vOeed6O8E9oYJKu=sI#XF*bv_xcy%+e8)C+ zkLtjO-<_9kFNo-)-!bjgmXxj7h=p4(=kA+zdoTT4l&4HY9p2h>9CHE9ASk#9o{oC% zU){(257)B#<8efmEl2z3ml12-EB4qbdN+-rv~-*|7haIIWboy{v8>-Yfj8zY;z|l+ zUj2zT>Qs~NCz4)oeah_&vD8+J!(-lss)P=MCYFU+O~PLE?b6(njM(G z_gCxI91gB~mugYvsPNJ__Fhdbu-+5SZKQ7_aZNQDy!3#)E#=U1R{d~>tCwzYJvJ*> z<7&)GiABC$DU>5;>o-=_giGkp3EzJFnS7WemYKQR233# zoo4c|j#Q5<$J?LoK~zQ7-Tlm4_6=)3pGxBvlewe4OEl3$lP3@nKT-rI-?3u{)2C0T zW5{jQWR&r8{VBz9Z1Sz*&JIf34}eWvtxh9m9Pe@N@J0-Qy_dbF&6fSFfv=+{``J zl!)qBlIo!3>JUJ-Hj|n>WuUZ$NyTH#AW}tTW$}yj_j4XzY!E?6og4{sbRa?kxN=gN z($Z4gx`=hLEmHcfgjBf#Fu#_{bdt&*7RSxXB*&1Q8$ZidmNyqZknb0fXW#>w* zUi}!H9mk$S(egM*+^nNbyUD(Hkokj0GkME3US2eZVrQ1ou;)~+=VWqW{c>I#_$sG@ z%M<9G&fK~knSQx66W$#|#NB1I>-aLar2UTWn8Van7C=h)<|F2;+rVAlEY{CC$S-G| z$UHWUP8~<#QL`(}!|$`;>$`Hp&Plk$>@JO&eWnzXCJ(`R`$*cpFiL`&G^P!kz^<4Y ztX@5n+goSSdDMs8Q(d=9;lh;n^TxSMBf^UoLZ6Y!jj!G(u~H9Stm(mfFZJV#yV8y) zm(ad`7tVzbW5LAMY#!R0f%Dd4P(K7?A{#zExkT2gJ#njXHIlN#JGgtmXP{q=e z^>*gq-VNMwsVj8?tyw<4Cm;WKf#iqRc=yeL3?6xax>9*(?OmdYCYt)7<)1r>-#}UpnM$Vy0kmBGHf3rb=io0lNXtp0;qz0OKYIY4SJ(6EO=sq<8PBt& zJZW0QNdFfnur6UVO={F)%Gb-_^$D!sc9c+`I`pklhOeT3qMBn0duOhrWQQS4pFNV| zx>Q{6Y-7DSgG)!gWA338-ur$8&z5!}{O(1DkN=T1$4_wo`Zdg6?WkC#HEX`yz=c!~ zoU%kvFU!4qgf*cCco^w7XgXz^G^UJ4GMT4VvgyP<%sItL zaq^{D&o_DNg|;|XO6S)PwsPsz9S-f-fN#SNEE(P!cT;JuMz6&^Zac3n-AD5QpEL5s z=9ptbxV^M9YxiEIez(%ri%#UL-QRQFza=Ne^&-##7VQ6;zTa-=`1n_7Qz8o2Hm#@~ znr9!Wv-hFP+;vMJu{YZ_jWvK(qZlGi!yuD$8@V1qy==t2vQy$9nFFT z3*`Q6%9JT`e zRI?AlB=z}@R)eI1uEo}2=W)=i$^RfwDxm-rqu$(P_7Y5Pkt%zf1d}D~^%NB`OI0BG zn~MN40z{?8Hq_6L(FqB3l#XpuHD3GQar&?{FxBz1?s57;4h!F<5LN&QHsJ&b`oTJ5>=%J>l5{u4JKkA zrZB!s9VX0P6mZ*fQPYuRT@5G7zlPObj8iB>CF=)zM+#J+D9v#wP4;Sf~*-1~^ z&e?&8Dp9zLN95v#f04qZWM!gv4J7f#9=g`8guy61pR{D0>xSTxZwg%+#fnj!PO4wC zBVO)3X%OTh*N&5iJBEih@ToePiLdNo=-Z7b`HqgTs(qOKQDb@7V2+l`XG+&*azTIh zXL>e%i)@pbth5ZAn@ATawG$^_KPpzNiL1B;4`2L(f*?JH`0NHmMm~$X{MHEP4GCmT zi9eB+>B`1A!})%`^qizJ+1`G%H>fWz zH`0K^!M6(UEL%m}U29l==r;HFPNCP(()_%rF$4SdX6?Lh__aZMUhf?tx8vAMg9OpR z1iISG&&kfoMSekwb!X=yl#L9+K^ygIqKPI2h%ntcc<>-gmMoFAkOKz}l>c77e7T%H zQEU@ayZ;n<5@*;a0ZJkM(p$Y9W#o6|VO=ansegG^7a_kt&32ZsLiWFLE)5p{+*J$%w&`YDF4Cx#RiiuwAaqg!VA;dp~ z1igW5LzZkaCsR$6z1>^yV%@G3L8z@ZP-`jkCh75>l@muPYM$RBuQ3_yV6i{w75E=>w65u=i5 zGbCa);xtNxwjO~ilZwIg=r~$5ZH7VPTybVmJt)X?N(qTI-I|K;XGUS_*8ON#-2;El z8;-%3%@E1R`=cxG_13!>Y57RI5ZM!A8;hh&-k$O~wk|(_u;Lmr8Suj3*-J2_MR{n` zV{rWFNqAKZ6qHf{xhVE{eF>@sXEqd-Hw|c-Vlf1!J-4tF#EFrNC{y#nsnBQj|m2=!(P79 z^g6wDI>f-hz>tl&xHxX%4RuORrI8d=8cC&;R(wcMu6zAA)4f z^~QW&%9&iH63lmUhDN30?!|lif0@W#E;HlO%~RO0Z3p&l-;5dRqIUxmFLKrA7bPFtj3hpN` zYtbfLy?PP9E? zxO#Xw#!NUyo=1$3;uTTXArebB|A|}o?_>j6rOryz%|>W5Q;}vLgnE@q!|ve`{C4UVZr!?q!9%{m z!o$~LlIOgZF*6eeBb7kwk!jRg--Q`^Eg@5O4tR2WBYHG$i8&{3fUN zuELh9S8-+2cNjW)HKG;e(5I3e_V3<;J`w z@=lIm=-PAeELIaW$pj=JDIGdp&Xr6Odrt&A%ka~J-|^?=ySRE_9rmBThwAMc;_13^ z_+jc5jQ;a7=618goZdZgGa((05=z{4S#6WnlTL4h$*4z0rZ%T7Dgy%plS=AzICbh2 z#*G`t+5P?W(@(g5{W?aC8pXK*qGZzB+xsJvz*$@dGB62c4lzro!WCTZ))kLVr@+xi40X63KHn`ujY-YnU@w6o7g9+J6+*6g%g!E`$bJ>8 zlv3!h)HYtGTb0^qdgu`L%^Hb6%p!=$Ip0k972ow~!r5x7<<2Ntt||%!=3G8u&`S{* z=!jc)7NA4>IWS2p;+LN$qMD-{ZWS#Lb&y3BF7d5_xr@i4ML&`j>fjPs9KZgy73JiX zYHVDqHa`6%1?8JJvyvt^lxrFScTY2lv|Ee0hgxCUkoH(CQNXEqY19w(gm=+Wn6PRr zTK67|=Ce(33af~vi+@7NLK5`tdJA9A{~AsHFhK5990SJ=MuUKybG}M_2f+D<4OprXBS3oD2xA_WTeoQZD}l=!h%3oJB=5&FqDSoXsJc;%$ks9L!yLcCnz zAoD||FL+h41o?ssp+rmos(#)X{RSMzjNZ+#+9)Q^&BdNG7ldwGf5Q3JgE44xG*t3@sL`MwRt*lo*5Og8&}#(7mJK3} zZ!FH7n1L<(Z=h7gdN6tfLuQqVR;pALc0TSadWcNSF|dqACQ;{zx8xo8;U>YBCEi;uziCRS`k%{&Xi7OcFleaunY9~|3U;k!iBYC*o-G)

                          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 + ### `$` Prefix Naming Convention From 4195b04072a8c9d8d966523e866f8e3e99174dfe Mon Sep 17 00:00:00 2001 From: Peter Bacon Darwin Date: Wed, 21 May 2014 14:27:06 +0100 Subject: [PATCH 326/837] docs($compile): remove reference to ngRepeat providing compile function ngRepeat no longer has the compile function in its directive definition object, since it retrieves its transclusion via the link function. Closes 5638 --- src/ng/compile.js | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/src/ng/compile.js b/src/ng/compile.js index 958d2eb2bb65..bd29261e3fb1 100644 --- a/src/ng/compile.js +++ b/src/ng/compile.js @@ -262,11 +262,7 @@ * ``` * * The compile function deals with transforming the template DOM. Since most directives do not do - * template transformation, it is not used often. Examples that require compile functions are - * directives that transform template DOM, such as {@link - * api/ng.directive:ngRepeat ngRepeat}, or load the contents - * asynchronously, such as {@link ngRoute.directive:ngView ngView}. The - * compile function takes the following arguments. + * template transformation, it is not used often. The compile function takes the following arguments: * * * `tElement` - template element - The element where the directive has been declared. It is * safe to do template transformation on the element and child elements only. From a3f1cba8eca207b203758d75bb8604780fb4e12c Mon Sep 17 00:00:00 2001 From: Peter Bacon Darwin Date: Wed, 21 May 2014 14:46:05 +0100 Subject: [PATCH 327/837] docs(guide/expression): mention the ternary operator Closes #6498 --- docs/content/guide/expression.ngdoc | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/docs/content/guide/expression.ngdoc b/docs/content/guide/expression.ngdoc index 43291f9a21c7..f92a91b24a88 100644 --- a/docs/content/guide/expression.ngdoc +++ b/docs/content/guide/expression.ngdoc @@ -152,9 +152,10 @@ Similarly, invoking a function `a.b.c()` on `undefined` or `null` simply returns ## No Control Flow Statements -You cannot write a control flow statement in an expression. The reason behind this is core to the -Angular philosophy that application logic should be in controllers, not the views. If you need a -conditional, loop, or to throw from a view expression, delegate to a JavaScript method instead. +Apart from the ternary operator (`a ? b : c`), you cannot write a control flow statement in an +expression. The reason behind this is core to the Angular philosophy that application logic should +be in controllers, not the views. If you need a real conditional, loop, or to throw from a view +expression, delegate to a JavaScript method instead. ## `$event` From bdd75c97adf459549955e9828de92f0af72efecf Mon Sep 17 00:00:00 2001 From: GSC Leticia Date: Tue, 20 May 2014 12:56:39 -0700 Subject: [PATCH 328/837] docs(tutorial): add instructions for running node in Debian-based distributions MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Specifying command for Debian based distributions, like Ubuntu, Mint, etc. ☆.。.:*・゜☆ Fantastique! ☆.。.:*・゜☆ --- docs/content/tutorial/index.ngdoc | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/docs/content/tutorial/index.ngdoc b/docs/content/tutorial/index.ngdoc index 17dc69da7f06..c4fde0bdbf0c 100644 --- a/docs/content/tutorial/index.ngdoc +++ b/docs/content/tutorial/index.ngdoc @@ -105,6 +105,13 @@ Check the version of Node.js that you have installed by running the following co node --version ``` +Or in Debian based distributions: + +``` +nodejs --version +``` + +

                          If you need to run a different versions of node.js in your local environment, consider installing From acaf9be685b34a56a7dc70d5646d0f7dc62cad96 Mon Sep 17 00:00:00 2001 From: Firexion Date: Tue, 20 May 2014 10:04:43 -0400 Subject: [PATCH 329/837] docs(tutorial): add to index.html to match phonecat step4 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Add missing to app/index.html to match actual code on github ☆.。.:*・゜☆ Merci beaucoup! ☆.。.:*・゜☆ --- docs/content/tutorial/step_04.ngdoc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/content/tutorial/step_04.ngdoc b/docs/content/tutorial/step_04.ngdoc index 7e381ecadd82..035fd6cc905c 100644 --- a/docs/content/tutorial/step_04.ngdoc +++ b/docs/content/tutorial/step_04.ngdoc @@ -32,7 +32,7 @@ __`app/index.html`:__
                          • - {{phone.name}} + {{phone.name}}

                            {{phone.snippet}}

                          From 5e548edf672c7dd2889d0b7c39778223e6caea96 Mon Sep 17 00:00:00 2001 From: Caitlin Potter Date: Wed, 21 May 2014 11:58:52 -0400 Subject: [PATCH 330/837] docs(guide/$location): clarify "$watchers" / "$observers" terminology with links Add links to API docs for Scope#$watch and Attributes#$observe in $location in order to clarify the meaning of that terminology. Closes #7497 --- docs/content/guide/$location.ngdoc | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/docs/content/guide/$location.ngdoc b/docs/content/guide/$location.ngdoc index 468e503f4f80..e93e1e5259ea 100644 --- a/docs/content/guide/$location.ngdoc +++ b/docs/content/guide/$location.ngdoc @@ -49,7 +49,7 @@ changes to $location are reflected into the browser address bar. integration with angular application life-cycle none - knows about all internal life-cycle phases, integrates with $watch, ... + knows about all internal life-cycle phases, integrates with {@link ng.$rootScope.Scope#$watch $watch}, ... @@ -482,10 +482,12 @@ use a lower level API, {@link ng.$window $window.location.href}. ## Using $location outside of the scope life-cycle `$location` knows about Angular's {@link ng.$rootScope.Scope scope} life-cycle. When a URL changes in -the browser it updates the `$location` and calls `$apply` so that all $watchers / $observers are -notified. +the browser it updates the `$location` and calls `$apply` so that all +{@link ng.$rootScope.Scope#$watch $watchers} / +{@link ng.$compile.directive.Attributes#$observe $observers} are notified. When you change the `$location` inside the `$digest` phase everything is ok; `$location` will -propagate this change into browser and will notify all the $watchers / $observers. +propagate this change into browser and will notify all the {@link ng.$rootScope.Scope#$watch $watchers} / +{@link ng.$compile.directive.Attributes#$observe $observers}. When you want to change the `$location` from outside Angular (for example, through a DOM Event or during testing) - you must call `$apply` to propagate the changes. @@ -618,7 +620,7 @@ then uses the information it obtains to compose hashbang URLs (such as The Angular's compiler currently does not support two-way binding for methods (see [issue](https://github.com/angular/angular.js/issues/404)). If you should require two-way binding to the $location object (using {@link input[text] ngModel} directive on an input -field), you will need to specify an extra model property (e.g. `locationPath`) with two watchers +field), you will need to specify an extra model property (e.g. `locationPath`) with two {@link ng.$rootScope.Scope#$watch $watchers} which push $location updates in both directions. For example: From 279f98c4e3f26d8309f7d20c78df1ef9bb76d1be Mon Sep 17 00:00:00 2001 From: Takashi Nakagawa Date: Wed, 12 Mar 2014 21:46:10 +0900 Subject: [PATCH 331/837] docs(ngModelController): fix indentation code block Closes #6660 --- src/ng/directive/input.js | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/src/ng/directive/input.js b/src/ng/directive/input.js index 40f2a9d43b59..b4d1caa53d3b 100644 --- a/src/ng/directive/input.js +++ b/src/ng/directive/input.js @@ -898,14 +898,14 @@ var VALID_CLASS = 'ng-valid', * @property {Array.} $formatters Array of functions to execute, as a pipeline, whenever the model value changes. Each function is called, in turn, passing the value through to the next. Used to format / convert values for display in the control and validation. - * ```js - * function formatter(value) { - * if (value) { - * return value.toUpperCase(); - * } - * } - * ngModel.$formatters.push(formatter); - * ``` + * ```js + * function formatter(value) { + * if (value) { + * return value.toUpperCase(); + * } + * } + * ngModel.$formatters.push(formatter); + * ``` * * @property {Array.} $viewChangeListeners Array of functions to execute whenever the * view value has changed. It is called with no arguments, and its return value is ignored. From d4c3d5caafd3fb09f8f6366bdc7b6e78ec709048 Mon Sep 17 00:00:00 2001 From: Yaron Uliel Date: Mon, 12 May 2014 22:15:26 +0300 Subject: [PATCH 332/837] docs(ngRepeat): fix formatting --- src/ng/directive/ngRepeat.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ng/directive/ngRepeat.js b/src/ng/directive/ngRepeat.js index 11f35c56e84c..5f977ae694e9 100644 --- a/src/ng/directive/ngRepeat.js +++ b/src/ng/directive/ngRepeat.js @@ -97,7 +97,7 @@ * mapped to the same DOM element, which is not possible.) Filters should be applied to the expression, * before specifying a tracking expression. * - * For example: `item in items` is equivalent to `item in items track by $id(item)'. This implies that the DOM elements + * For example: `item in items` is equivalent to `item in items track by $id(item)`. This implies that the DOM elements * will be associated by item identity in the array. * * For example: `item in items track by $id(item)`. A built in `$id()` function can be used to assign a unique From 02a3c31c23e5a8e9faafce05ebccb01a1e7eb1e8 Mon Sep 17 00:00:00 2001 From: Sam Dornan Date: Fri, 16 May 2014 13:44:27 -0500 Subject: [PATCH 333/837] docs(guide/services): fix link to minify Wikipedia page Closes #7488 --- docs/content/guide/services.ngdoc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/content/guide/services.ngdoc b/docs/content/guide/services.ngdoc index 5abede31d818..542777b595a0 100644 --- a/docs/content/guide/services.ngdoc +++ b/docs/content/guide/services.ngdoc @@ -130,7 +130,7 @@ injection of `$window`, `$scope`, and our `notify` service:
                          -**Careful:** If you plan to [minify](http://en.wikipedia.org/wiki/Minification_(programming) your +**Careful:** If you plan to [minify](http://en.wikipedia.org/wiki/Minification_(programming)) your code, your variable names will get renamed unless you use one of the annotation techniques above.
                          From 8ba78f08b9dc3da8c7984c46cca9d3089ac426d5 Mon Sep 17 00:00:00 2001 From: Erich Date: Fri, 16 May 2014 19:15:49 +1000 Subject: [PATCH 334/837] docs(guide/concepts): clarify definitions Closes #7483 --- docs/content/guide/concepts.ngdoc | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/content/guide/concepts.ngdoc b/docs/content/guide/concepts.ngdoc index 740c49069403..f3ac4774d938 100644 --- a/docs/content/guide/concepts.ngdoc +++ b/docs/content/guide/concepts.ngdoc @@ -11,7 +11,7 @@ For a more in-depth explanation, see the {@link tutorial/ tutorial}. |------------------|------------------------------------------| |{@link concepts#template Template} | HTML with additional markup | |{@link concepts#directive Directives} | extend HTML with custom attributes and elements | -|{@link concepts#model Model} | the data that is shown to the user and with which the user interacts | +|{@link concepts#model Model} | the data shown to the user in the view and with which the user interacts | |{@link concepts#scope Scope} | context where the model is stored so that controllers, directives and expressions can access it | |{@link concepts#expression Expressions} | access variables and functions from the scope | |{@link concepts#compiler Compiler} | parses the template and instantiates directives and expressions | @@ -19,9 +19,9 @@ For a more in-depth explanation, see the {@link tutorial/ tutorial}. |{@link concepts#view View} | what the user sees (the DOM) | |{@link concepts#databinding Data Binding} | sync data between the model and the view | |{@link concepts#controller Controller} | the business logic behind views | -|{@link concepts#di Dependency Injection} | Creates and wires objects / functions | +|{@link concepts#di Dependency Injection} | Creates and wires objects and functions | |{@link concepts#injector Injector} | dependency injection container | -|{@link concepts#module Module} | configures the Injector | +|{@link concepts#module Module} | a container for the different parts of an app including controllers, services, filters, directivess which configures the Injector | |{@link concepts#service Service} | reusable business logic independent of views | From 6d1c67727ab872c44addc783ef1406952142d89e Mon Sep 17 00:00:00 2001 From: Sergei Z Date: Fri, 16 May 2014 21:18:19 +0200 Subject: [PATCH 335/837] feat(ngMock): add support of mocha tdd interface Closes #7489 --- src/ngMock/.jshintrc | 4 +--- src/ngMock/angular-mocks.js | 4 ++-- 2 files changed, 3 insertions(+), 5 deletions(-) diff --git a/src/ngMock/.jshintrc b/src/ngMock/.jshintrc index 46d8799bfc25..9d19c8f496ef 100644 --- a/src/ngMock/.jshintrc +++ b/src/ngMock/.jshintrc @@ -18,8 +18,6 @@ "browser": true, "globals": { "angular": false, - "expect": false, - "beforeEach": false, - "afterEach": false + "expect": false } } \ No newline at end of file diff --git a/src/ngMock/angular-mocks.js b/src/ngMock/angular-mocks.js index 850b91a1c2d3..9a7d62446749 100644 --- a/src/ngMock/angular-mocks.js +++ b/src/ngMock/angular-mocks.js @@ -1951,11 +1951,11 @@ if(window.jasmine || window.mocha) { }; - beforeEach(function() { + (window.beforeEach || window.setup)(function() { currentSpec = this; }); - afterEach(function() { + (window.afterEach || window.teardown)(function() { var injector = currentSpec.$injector; currentSpec.$injector = null; From 97fc47f39e3ae66324441ac0e279159eb8f75b32 Mon Sep 17 00:00:00 2001 From: Tobias Bosch Date: Wed, 21 May 2014 10:47:09 -0700 Subject: [PATCH 336/837] docs(guide/concepts): clarify definitions --- docs/content/guide/concepts.ngdoc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/content/guide/concepts.ngdoc b/docs/content/guide/concepts.ngdoc index f3ac4774d938..a2ffebc1e597 100644 --- a/docs/content/guide/concepts.ngdoc +++ b/docs/content/guide/concepts.ngdoc @@ -21,7 +21,7 @@ For a more in-depth explanation, see the {@link tutorial/ tutorial}. |{@link concepts#controller Controller} | the business logic behind views | |{@link concepts#di Dependency Injection} | Creates and wires objects and functions | |{@link concepts#injector Injector} | dependency injection container | -|{@link concepts#module Module} | a container for the different parts of an app including controllers, services, filters, directivess which configures the Injector | +|{@link concepts#module Module} | a container for the different parts of an app including controllers, services, filters, directives which configures the Injector | |{@link concepts#service Service} | reusable business logic independent of views | From e7eab501dbb43429404bf6a0a66a9668543c136e Mon Sep 17 00:00:00 2001 From: markau <20metresbelow@gmail.com> Date: Thu, 15 May 2014 14:29:29 +0930 Subject: [PATCH 337/837] docs(guide/concepts): The service is `finance2.js` Closes #7470 --- docs/content/guide/concepts.ngdoc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/content/guide/concepts.ngdoc b/docs/content/guide/concepts.ngdoc index a2ffebc1e597..7060ec89772b 100644 --- a/docs/content/guide/concepts.ngdoc +++ b/docs/content/guide/concepts.ngdoc @@ -254,7 +254,7 @@ Let's refactor our example and move the currency conversion into a service in an What changed? We moved the `convertCurrency` function and the definition of the existing currencies -into the new file `finance.js`. But how does the controller +into the new file `finance2.js`. But how does the controller get a hold of the now separated function? This is where
                          "{@link di Dependency Injection}" comes into play. From f107ef8bd8f38af930ca0669ed2192f2ff8a1a20 Mon Sep 17 00:00:00 2001 From: Tobias Bosch Date: Wed, 21 May 2014 11:23:38 -0700 Subject: [PATCH 338/837] docs(): mention implicit usage of --- src/ng/sce.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ng/sce.js b/src/ng/sce.js index 059e4519718e..e65b290b546d 100644 --- a/src/ng/sce.js +++ b/src/ng/sce.js @@ -519,7 +519,7 @@ function $SceDelegateProvider() { * * | Context | Notes | * |---------------------|----------------| - * | `$sce.HTML` | For HTML that's safe to source into the application. The {@link ng.directive:ngBindHtml ngBindHtml} directive uses this context for bindings. | + * | `$sce.HTML` | For HTML that's safe to source into the application. The {@link ng.directive:ngBindHtml ngBindHtml} directive uses this context for bindings. If an unsafe value is encountered and the {@link ngSanitize $sanitize} module is present this will sanitize the value instead of throwing an error. | * | `$sce.CSS` | For CSS that's safe to source into the application. Currently unused. Feel free to use it in your own directives. | * | `$sce.URL` | For URLs that are safe to follow as links. Currently unused (`
                          Note that `$sce.RESOURCE_URL` makes a stronger statement about the URL than `$sce.URL` does and therefore contexts requiring values trusted for `$sce.RESOURCE_URL` can be used anywhere that values trusted for `$sce.URL` are required. | From e9ecd56dca773688139d765be0aa7975d4a7fc86 Mon Sep 17 00:00:00 2001 From: Tobias Bosch Date: Wed, 21 May 2014 11:35:59 -0700 Subject: [PATCH 339/837] docs(ngModelController): use `$sce` and `$sanitize` in the `contenteditable` example. Closes #7464 --- src/ng/directive/input.js | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/src/ng/directive/input.js b/src/ng/directive/input.js index b4d1caa53d3b..16b256a4abd5 100644 --- a/src/ng/directive/input.js +++ b/src/ng/directive/input.js @@ -934,7 +934,12 @@ var VALID_CLASS = 'ng-valid', * Note that `contenteditable` is an HTML5 attribute, which tells the browser to let the element * contents be edited in place by the user. This will not work on older browsers. * - * + * We are using the {@link ng.service:$sce $sce} service here and include the {@link ngSanitize $sanitize} + * module to automatically remove "bad" content like inline event listener (e.g. ``). + * However, as we are using `$sce` the model can still decide to to provide unsafe content if it marks + * that content using the `$sce` service. + * + * [contenteditable] { border: 1px solid black; @@ -948,8 +953,8 @@ var VALID_CLASS = 'ng-valid', - angular.module('customControl', []). - directive('contenteditable', function() { + angular.module('customControl', ['ngSanitize']). + directive('contenteditable', ['$sce', function($sce) { return { restrict: 'A', // only activate on element attribute require: '?ngModel', // get a hold of NgModelController @@ -958,7 +963,7 @@ var VALID_CLASS = 'ng-valid', // Specify how UI should be updated ngModel.$render = function() { - element.html(ngModel.$viewValue || ''); + element.html($sce.getTrustedHtml(ngModel.$viewValue || '')); }; // Listen for change events to enable binding @@ -979,7 +984,7 @@ var VALID_CLASS = 'ng-valid', } } }; - }); + }]);
                          From cf3f70988928ef3bcb33fcd463fe9db532d32844 Mon Sep 17 00:00:00 2001 From: Kristof Mattei Date: Wed, 14 May 2014 10:00:47 +0200 Subject: [PATCH 340/837] docs(shallowCopy): fixed typo Closes #7456 --- src/Angular.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Angular.js b/src/Angular.js index 5d5cc2fe7da7..c104a9611c91 100644 --- a/src/Angular.js +++ b/src/Angular.js @@ -832,7 +832,7 @@ function shallowCopy(src, dst) { * * Both objects or values are of the same type and all of their properties are equal by * comparing them with `angular.equals`. * * Both values are NaN. (In JavaScript, NaN == NaN => false. But we consider two NaN as equal) - * * Both values represent the same regular expression (In JavasScript, + * * Both values represent the same regular expression (In JavaScript, * /abc/ == /abc/ => false. But we consider two regular expressions as equal when their textual * representation matches). * From f4bb006e457e6dddb550e8093c05114f3baf5cfa Mon Sep 17 00:00:00 2001 From: Andrew Mortimer Date: Thu, 8 May 2014 11:28:16 -0400 Subject: [PATCH 341/837] docs(guide/controller): fix typo --- docs/content/guide/controller.ngdoc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/content/guide/controller.ngdoc b/docs/content/guide/controller.ngdoc index 85403496167e..f0fc7b10d9a8 100644 --- a/docs/content/guide/controller.ngdoc +++ b/docs/content/guide/controller.ngdoc @@ -243,7 +243,7 @@ more information about scope inheritance. }]); myApp.controller('GrandChildController', ['$scope', function($scope) { $scope.timeOfDay = 'evening'; - $scope.name = 'Gingerbreak Baby'; + $scope.name = 'Gingerbread Baby'; }]); From edab80cddb88516e53f6d4f99f18d985da1ad529 Mon Sep 17 00:00:00 2001 From: ABitTooCalm Date: Wed, 21 May 2014 19:44:35 +0100 Subject: [PATCH 342/837] docs(ngStyle): clarify using styles that are not valid property names Closes #6838 --- src/ng/directive/ngStyle.js | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/src/ng/directive/ngStyle.js b/src/ng/directive/ngStyle.js index 3a627f8fa2fa..499eac6702a4 100644 --- a/src/ng/directive/ngStyle.js +++ b/src/ng/directive/ngStyle.js @@ -9,14 +9,20 @@ * The `ngStyle` directive allows you to set CSS style on an HTML element conditionally. * * @element ANY - * @param {expression} ngStyle {@link guide/expression Expression} which evals to an - * object whose keys are CSS style names and values are corresponding values for those CSS - * keys. + * @param {expression} ngStyle + * + * {@link guide/expression Expression} which evals to an + * object whose keys are CSS style names and values are corresponding values for those CSS + * keys. + * + * Since some CSS style names are not valid keys for an object, they must be quoted. + * See the 'background-color' style in the example below. * * @example - + +
                          Sample Text @@ -30,9 +36,9 @@ var colorSpan = element(by.css('span')); - it('should check ng-style', function() { + iit('should check ng-style', function() { expect(colorSpan.getCssValue('color')).toBe('rgba(0, 0, 0, 1)'); - element(by.css('input[value=set]')).click(); + element(by.css('input[value=\'set color\']')).click(); expect(colorSpan.getCssValue('color')).toBe('rgba(255, 0, 0, 1)'); element(by.css('input[value=clear]')).click(); expect(colorSpan.getCssValue('color')).toBe('rgba(0, 0, 0, 1)'); From 23723298f903adb30725c78f41b901fa1f28c421 Mon Sep 17 00:00:00 2001 From: James Vanneman Date: Wed, 26 Mar 2014 21:08:45 -0400 Subject: [PATCH 343/837] docs($filter): add runnable example Closes #6871 --- src/ng/filter.js | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/src/ng/filter.js b/src/ng/filter.js index 090b32ca6ead..991fdcbe7e4a 100644 --- a/src/ng/filter.js +++ b/src/ng/filter.js @@ -73,7 +73,24 @@ * * @param {String} name Name of the filter function to retrieve * @return {Function} the filter function - */ + * @example + + +
                          +

                          {{ originalText }}

                          +

                          {{ filteredText }}

                          +
                          +
                          + + + angular.module('filterExample', []) + .controller('MainCtrl', function($scope, $filter) { + $scope.originalText = 'hello'; + $scope.filteredText = $filter('uppercase')($scope.originalText); + }); + +
                          + */ $FilterProvider.$inject = ['$provide']; function $FilterProvider($provide) { var suffix = 'Filter'; From 32bd990edaa96df08e722a956996cbb7a5650ff1 Mon Sep 17 00:00:00 2001 From: kalvn Date: Tue, 13 May 2014 09:26:28 +0200 Subject: [PATCH 344/837] docs(tutorial): corrected version of jquery installed via bower (step 12) Corrected the version of jquery in the text content. --- docs/content/tutorial/step_12.ngdoc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/content/tutorial/step_12.ngdoc b/docs/content/tutorial/step_12.ngdoc index 6f7b45e2f18a..cebff564a068 100644 --- a/docs/content/tutorial/step_12.ngdoc +++ b/docs/content/tutorial/step_12.ngdoc @@ -49,7 +49,7 @@ We are using [Bower][bower] to install client side dependencies. This step upda * `"angular-animate": "~1.2.x"` tells bower to install a version of the angular-animate component that is compatible with version 1.2.x. -* `"jquery": "1.10.2"` tells bower to install the 1.1.2 version of JQuery. Note that this is not an +* `"jquery": "1.10.2"` tells bower to install the 1.10.2 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. From 4896a0b4d412b79233dc4e170d19c23fa95fc88c Mon Sep 17 00:00:00 2001 From: Adam Bradley Date: Thu, 27 Mar 2014 14:40:07 -0500 Subject: [PATCH 345/837] docs(css): remove Firefox select element drop-down icon In firefox the version picker's dropdown icon from the default `select` element is still showing. This CSS forces FF to hide the ugly default. Closes #6878 --- docs/app/assets/css/docs.css | 3 +++ 1 file changed, 3 insertions(+) diff --git a/docs/app/assets/css/docs.css b/docs/app/assets/css/docs.css index d84b55efe2cc..ea7821d1c61e 100644 --- a/docs/app/assets/css/docs.css +++ b/docs/app/assets/css/docs.css @@ -253,6 +253,9 @@ code.highlighted { z-index: 99; cursor: pointer; font-size: 16px; + -moz-appearance: none; + text-indent: 0.01px; + text-overflow: ''; } .picker:after { From c94190139d7fa889184e8fc6c54eb6eed602c171 Mon Sep 17 00:00:00 2001 From: Tim van den Eijnden Date: Sat, 10 May 2014 17:09:52 +0200 Subject: [PATCH 346/837] docs(tutorial): fix controller unit tests to match phonecat / avoid ReferenceError fix 'ReferenceError: PhoneDetailCtrl is not defined' & 'ReferenceError: PhoneListCtrl is not defined' in Karma unit tests Closes #7421 --- docs/content/tutorial/step_11.ngdoc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/content/tutorial/step_11.ngdoc b/docs/content/tutorial/step_11.ngdoc index 51612e91c0d4..2935355bfd59 100644 --- a/docs/content/tutorial/step_11.ngdoc +++ b/docs/content/tutorial/step_11.ngdoc @@ -202,7 +202,7 @@ describe('PhoneCat controllers', function() { respond([{name: 'Nexus S'}, {name: 'Motorola DROID'}]); scope = $rootScope.$new(); - ctrl = $controller(PhoneListCtrl, {$scope: scope}); + ctrl = $controller('PhoneListCtrl', {$scope: scope}); })); @@ -237,7 +237,7 @@ describe('PhoneCat controllers', function() { $routeParams.phoneId = 'xyz'; scope = $rootScope.$new(); - ctrl = $controller(PhoneDetailCtrl, {$scope: scope}); + ctrl = $controller('PhoneDetailCtrl', {$scope: scope}); })); From ec1f4a8c9b7ec09c9bccc9ce9ae07351c81f440b Mon Sep 17 00:00:00 2001 From: Richard Littauer Date: Sun, 27 Apr 2014 14:34:15 -0400 Subject: [PATCH 347/837] test(ngClass): add missing assertions --- test/ng/directive/ngClassSpec.js | 2 ++ 1 file changed, 2 insertions(+) diff --git a/test/ng/directive/ngClassSpec.js b/test/ng/directive/ngClassSpec.js index e12c89fc9f99..cea58d2bdffc 100644 --- a/test/ng/directive/ngClassSpec.js +++ b/test/ng/directive/ngClassSpec.js @@ -152,6 +152,7 @@ describe('ngClass', function() { element.addClass('foo'); $rootScope.dynCls = ''; $rootScope.$digest(); + expect(element[0].className).toBe('ng-scope'); })); @@ -159,6 +160,7 @@ describe('ngClass', function() { element = $compile('
                          ')($rootScope); $rootScope.dynCls = [undefined, null]; $rootScope.$digest(); + expect(element[0].className).toBe('ng-scope'); })); From 866057233cad368772e7955d537af2b66d901e7f Mon Sep 17 00:00:00 2001 From: Edward Brey Date: Mon, 28 Apr 2014 06:53:44 -0500 Subject: [PATCH 348/837] docs(filter): description formatting fix as it was, the third parameter's description was displayed as a code block, rather than a bulletted list. --- src/ng/filter/filter.js | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/src/ng/filter/filter.js b/src/ng/filter/filter.js index 5c6bf2d79e7e..2e42b11ef86c 100644 --- a/src/ng/filter/filter.js +++ b/src/ng/filter/filter.js @@ -35,15 +35,15 @@ * * Can be one of: * - * - `function(actual, expected)`: - * The function will be given the object value and the predicate value to compare and - * should return true if the item should be included in filtered result. + * - `function(actual, expected)`: + * The function will be given the object value and the predicate value to compare and + * should return true if the item should be included in filtered result. * - * - `true`: A shorthand for `function(actual, expected) { return angular.equals(expected, actual)}`. - * this is essentially strict comparison of expected and actual. + * - `true`: A shorthand for `function(actual, expected) { return angular.equals(expected, actual)}`. + * this is essentially strict comparison of expected and actual. * - * - `false|undefined`: A short hand for a function which will look for a substring match in case - * insensitive way. + * - `false|undefined`: A short hand for a function which will look for a substring match in case + * insensitive way. * * @example From 3b30a4b64ae3b6ccdc33885aeda0113e6b998bcd Mon Sep 17 00:00:00 2001 From: specialorange Date: Sun, 6 Apr 2014 15:28:56 -0400 Subject: [PATCH 349/837] docs(error/$injector/unpr): clarify which code is being referred to in the text Closes #7020 --- docs/content/error/$injector/unpr.ngdoc | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/docs/content/error/$injector/unpr.ngdoc b/docs/content/error/$injector/unpr.ngdoc index 95344f6694f4..0442be25bb58 100644 --- a/docs/content/error/$injector/unpr.ngdoc +++ b/docs/content/error/$injector/unpr.ngdoc @@ -14,8 +14,9 @@ angular.module('myApp', []) }]); ``` -This code will fail with `$injector:unpr` if `myService` is not defined. Making -sure each dependency is defined will fix the problem. +The above code will fail with `$injector:unpr` if `myService` is not defined. + +Making sure each dependency is defined will fix the problem, as noted below. ``` angular.module('myApp', []) @@ -23,4 +24,4 @@ angular.module('myApp', []) .controller('MyController', ['myService', function (myService) { // Do something with myService }]); -``` \ No newline at end of file +``` From 78954ffcde6c89e8d081d9235ad1a31b736f801e Mon Sep 17 00:00:00 2001 From: Brice Date: Tue, 1 Apr 2014 17:08:16 -0400 Subject: [PATCH 350/837] docs(tutorial): improve instructions for causing test failure (step 2) Increase readability for test fail line Closes #6943 --- docs/content/tutorial/step_02.ngdoc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/content/tutorial/step_02.ngdoc b/docs/content/tutorial/step_02.ngdoc index 09c7fc2dc471..5017ba688ce0 100644 --- a/docs/content/tutorial/step_02.ngdoc +++ b/docs/content/tutorial/step_02.ngdoc @@ -241,7 +241,7 @@ To run the tests, and then watch the files for changes: `npm test`. {{i+1}} -* Make the unit test fail by changing the `toBe(3)` statement to `toBe(4)`. +* Make the unit test fail by changing `expect(scope.phones.length).toBe(3)` to instead use `toBe(4)`. # Summary From adb5ee2e0a7d96b724e3dc859804ac392fd3c2df Mon Sep 17 00:00:00 2001 From: NateRedding Date: Mon, 12 May 2014 17:17:43 -0400 Subject: [PATCH 351/837] docs(ngHide): corrected logic in example Closes #7436 --- src/ng/directive/ngShowHide.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/ng/directive/ngShowHide.js b/src/ng/directive/ngShowHide.js index 00f697a34040..b8ae698288c3 100644 --- a/src/ng/directive/ngShowHide.js +++ b/src/ng/directive/ngShowHide.js @@ -173,10 +173,10 @@ var ngShowDirective = ['$animate', function($animate) { * * ```html * - *
                          + *
                          * * - *
                          + *
                          * ``` * * When the ngHide expression evaluates to true then the .ng-hide CSS class is added to the class attribute From 25ae98ca7720f07b295159a272638f17a83cbd56 Mon Sep 17 00:00:00 2001 From: Freek Wielstra Date: Wed, 14 May 2014 13:25:08 +0200 Subject: [PATCH 352/837] docs($http): clear up Interceptor docs and code The documentation and code example of $http interceptors is unclear about whether config can be null or not, and whether the result should always be a promise or not. This pr clears up the documentation a bit and removes the literal 'or a promise' interpretation of the docs in the code example. Closes #7431 Closes #7460 --- src/ng/http.js | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/src/ng/http.js b/src/ng/http.js index 0c86a0b7fe4b..96f99df6f0a3 100644 --- a/src/ng/http.js +++ b/src/ng/http.js @@ -355,14 +355,14 @@ function $HttpProvider() { * * There are two kinds of interceptors (and two kinds of rejection interceptors): * - * * `request`: interceptors get called with http `config` object. The function is free to - * modify the `config` or create a new one. The function needs to return the `config` - * directly or as a promise. + * * `request`: interceptors get called with a http `config` object. The function is free to + * modify the `config` object or create a new one. The function needs to return the `config` + * object directly, or a promise containing the `config` or a new `config` object. * * `requestError`: interceptor gets called when a previous interceptor threw an error or * resolved with a rejection. * * `response`: interceptors get called with http `response` object. The function is free to - * modify the `response` or create a new one. The function needs to return the `response` - * directly or as a promise. + * modify the `response` object or create a new one. The function needs to return the `response` + * object directly, or as a promise containing the `response` or a new `response` object. * * `responseError`: interceptor gets called when a previous interceptor threw an error or * resolved with a rejection. * @@ -374,7 +374,7 @@ function $HttpProvider() { * // optional method * 'request': function(config) { * // do something on success - * return config || $q.when(config); + * return config; * }, * * // optional method @@ -391,7 +391,7 @@ function $HttpProvider() { * // optional method * 'response': function(response) { * // do something on success - * return response || $q.when(response); + * return response; * }, * * // optional method From c9ee20b64bde9715a3e020ee34b9f4872493ae32 Mon Sep 17 00:00:00 2001 From: Jesse Palmer Date: Mon, 5 May 2014 16:56:33 -0400 Subject: [PATCH 353/837] docs($interpolate): removed function name to match other examples --- src/ng/interpolate.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ng/interpolate.js b/src/ng/interpolate.js index 05b1cf2f90c6..da161d2359f0 100644 --- a/src/ng/interpolate.js +++ b/src/ng/interpolate.js @@ -23,7 +23,7 @@ var $interpolateMinErr = minErr('$interpolate'); }); - customInterpolationApp.controller('DemoController', function DemoController() { + customInterpolationApp.controller('DemoController', function() { this.label = "This binding is brought you by // interpolation symbols."; }); From b635903ec435ea355b0f3688c7372627d01e23e2 Mon Sep 17 00:00:00 2001 From: Jeff Whelpley Date: Wed, 14 May 2014 10:18:17 -0400 Subject: [PATCH 354/837] fix($compile): do not merge attrs that are the same for replace directives If a directives specifies `replace:true` and the template of the directive contains a root element with an attribute which already exists at the place where the directive is used with the same value, don't duplicate the value. Closes #7463 --- src/ng/compile.js | 2 +- test/ng/compileSpec.js | 19 +++++++++++++++++++ 2 files changed, 20 insertions(+), 1 deletion(-) diff --git a/src/ng/compile.js b/src/ng/compile.js index bd29261e3fb1..49e785017400 100644 --- a/src/ng/compile.js +++ b/src/ng/compile.js @@ -1631,7 +1631,7 @@ function $CompileProvider($provide, $$sanitizeUriProvider) { // reapply the old attributes to the new element forEach(dst, function(value, key) { if (key.charAt(0) != '$') { - if (src[key]) { + if (src[key] && src[key] !== value) { value += (key === 'style' ? ';' : ' ') + src[key]; } dst.$set(key, value, true, srcAttr[key]); diff --git a/test/ng/compileSpec.js b/test/ng/compileSpec.js index 4b0cfcd61c2a..762b33d27cbc 100755 --- a/test/ng/compileSpec.js +++ b/test/ng/compileSpec.js @@ -493,6 +493,15 @@ describe('$compile', function() { expect(element).toBe(attr.$$element); } })); + directive('nomerge', valueFn({ + restrict: 'CAM', + replace: true, + template: '
                          No Merge!
                          ', + compile: function(element, attr) { + attr.$set('compiled', 'COMPILED'); + expect(element).toBe(attr.$$element); + } + })); directive('append', valueFn({ restrict: 'CAM', template: '
                          Append!
                          ', @@ -597,6 +606,16 @@ describe('$compile', function() { expect(div.attr('high-log')).toEqual(''); })); + it('should not merge attributes if they are the same', inject(function($compile, $rootScope) { + element = $compile( + '
                          ') + ($rootScope); + var div = element.find('div'); + expect(div.hasClass('medium-log')).toBe(true); + expect(div.hasClass('log')).toBe(true); + expect(div.attr('id')).toEqual('myid'); + })); + it('should prevent multiple templates per element', inject(function($compile) { try { $compile('
                          '); From b5391fae8f5e0f22bc6f5f21f7a36ec628343167 Mon Sep 17 00:00:00 2001 From: Max Tobias Weber Date: Mon, 12 May 2014 14:41:51 +0200 Subject: [PATCH 355/837] docs(tutorial): update code snippet for step 7 replaced bootstrap 2 with bootstrap 3 classes Closes #7433 --- docs/content/tutorial/step_07.ngdoc | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/content/tutorial/step_07.ngdoc b/docs/content/tutorial/step_07.ngdoc index cd0478d66d9c..f5bdf88b6eef 100644 --- a/docs/content/tutorial/step_07.ngdoc +++ b/docs/content/tutorial/step_07.ngdoc @@ -147,8 +147,8 @@ __`app/partials/phone-list.html`:__ ```html
                          -
                          -
                          +
                          +
                          Search: @@ -159,7 +159,7 @@ __`app/partials/phone-list.html`:__
                          -
                          +
                          + * + * It's also possible to call the orderBy filter manually, by injecting `$filter`, retrieving the + * filter routine with `$filter('orderBy')`, and calling the returned filter routine with the + * desired parameters. + * + * Example: + * + * @example + + +
                          + + + + + + + + + + + +
                          Name + (^)Phone NumberAge
                          {{friend.name}}{{friend.phone}}{{friend.age}}
                          +
                          +
                          + + + function Ctrl($scope, $filter) { + var orderBy = $filter('orderBy'); + $scope.friends = [ + { name: 'John', phone: '555-1212', age: 10 }, + { name: 'Mary', phone: '555-9876', age: 19 }, + { name: 'Mike', phone: '555-4321', age: 21 }, + { name: 'Adam', phone: '555-5678', age: 35 }, + { name: 'Julie', phone: '555-8765', age: 29 } + ]; + + $scope.order = function(predicate, reverse) { + $scope.friends = orderBy($scope.friends, predicate, reverse); + }; + $scope.order('-age',false); + } + +
                          */ orderByFilter.$inject = ['$parse']; function orderByFilter($parse){ From d18d5f57c2684b536891e614c00238230e8f305f Mon Sep 17 00:00:00 2001 From: Phil Westwell Date: Sat, 24 May 2014 13:41:39 +0100 Subject: [PATCH 386/837] docs(*): fix its/it's grammar --- CHANGELOG.md | 4 ++-- src/ng/animate.js | 2 +- src/ng/directive/ngIf.js | 2 +- src/ng/directive/ngRepeat.js | 2 +- src/ng/sce.js | 2 +- test/jqLiteSpec.js | 4 ++-- test/ng/compileSpec.js | 2 +- test/ng/directive/ngIncludeSpec.js | 2 +- test/ng/locationSpec.js | 2 +- 9 files changed, 11 insertions(+), 11 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index de7f9c33968f..76a780803dbb 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3708,7 +3708,7 @@ behavior and migrate your controllers one at a time: Date: Mon, 2 Jun 2014 13:07:22 -0400 Subject: [PATCH 387/837] chore(ngLocale): change update-closure script to pull from github, not code.google.com The closure-library migrated a while ago, so the script would fail. This is change should allow us to update these more frequently. --- i18n/update-closure.sh | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/i18n/update-closure.sh b/i18n/update-closure.sh index e8f7cb5c2ce3..4a9290d2db4e 100755 --- a/i18n/update-closure.sh +++ b/i18n/update-closure.sh @@ -7,9 +7,11 @@ cd $BASE_DIR set -x # Trace commands as they're executed. +I18N_BASE="https://raw.githubusercontent.com/google/closure-library/master/closure/goog/i18n" + # use the github repo as it is more up to date than the svn repo -curl https://closure-library.googlecode.com/git/closure/goog/i18n/currency.js > closure/currencySymbols.js -curl https://closure-library.googlecode.com/git/closure/goog/i18n/datetimesymbols.js > closure/datetimeSymbols.js -curl https://closure-library.googlecode.com/git/closure/goog/i18n/datetimesymbolsext.js > closure/datetimeSymbolsExt.js -curl https://closure-library.googlecode.com/git/closure/goog/i18n/numberformatsymbols.js > closure/numberSymbols.js -curl https://closure-library.googlecode.com/git/closure/goog/i18n/pluralrules.js > closure/pluralRules.js +curl "$I18N_BASE/currency.js" > closure/currencySymbols.js +curl "$I18N_BASE/datetimesymbols.js" > closure/datetimeSymbols.js +curl "$I18N_BASE/datetimesymbolsext.js" > closure/datetimeSymbolsExt.js +curl "$I18N_BASE/numberformatsymbols.js" > closure/numberSymbols.js +curl "$I18N_BASE/pluralrules.js" > closure/pluralRules.js From 96a314766c41bbb18bcddeddd25c8e566ab76acd Mon Sep 17 00:00:00 2001 From: Caitlin Potter Date: Mon, 2 Jun 2014 14:17:51 -0400 Subject: [PATCH 388/837] fix(ngLocale): fix i18n code-generation to support get_vf_, decimals_, and get_wt_ The updated Closure I18N code relies on these methods to enhance the localization quality. This fix prevents ngLocale files from referencing undefined values. In the short term, this means adding references to versions of these methods in locales where they are necessary. --- i18n/src/closureI18nExtractor.js | 68 +++++++++++++++++++++++++++----- 1 file changed, 58 insertions(+), 10 deletions(-) diff --git a/i18n/src/closureI18nExtractor.js b/i18n/src/closureI18nExtractor.js index 83146d07d7f3..67ea5ff76313 100644 --- a/i18n/src/closureI18nExtractor.js +++ b/i18n/src/closureI18nExtractor.js @@ -87,7 +87,11 @@ function pluralExtractor(content, localeInfo) { continue; } var temp = goog.i18n.pluralRules.select.toString(). - replace(/goog.i18n.pluralRules.Keyword/g, 'PLURAL_CATEGORY').replace(/\n/g, ''); + replace(/goog\.i18n\.pluralRules\.Keyword/g, 'PLURAL_CATEGORY'). + replace(/goog\.i18n\.pluralRules\.get_vf_/g, 'getVF'). + replace(/goog\.i18n\.pluralRules\.get_wt_/g, 'getWT'). + replace(/goog\.i18n\.pluralRules\.decimals_/g, 'getDecimals'). + replace(/\n/g, ''); ///@@ is a crazy place holder to be replaced before writing to file localeInfo[localeIds[i]].pluralCat = "@@" + temp + "@@"; @@ -158,15 +162,39 @@ function outputLocale(localeInfo, localeID) { } localeObj.id = correctedLocaleId(localeID); - var prefix = - "'use strict';\n" + - 'angular.module("ngLocale", [], ["$provide", function($provide) {\n' + - 'var PLURAL_CATEGORY = {' + - 'ZERO: "zero", ONE: "one", TWO: "two", FEW: "few", MANY: "many", OTHER: "other"' + - '};\n' + - '$provide.value("$locale", '; - - var suffix = ');\n}]);'; + var getDecimals = [ + 'function getDecimals(n) {', + ' n = n + \'\';', + ' var i = n.indexOf(\'.\');', + ' return (i == -1) ? 0 : n.length - i - 1;', + '}', '', '' + ].join('\n'); + + var getVF = [ + 'function getVF(n, opt_precision) {', + ' var v = opt_precision;', '', + ' if (undefined === v) {', + ' v = Math.min(getDecimals(n), 3);', + ' }', '', + ' var base = Math.pow(10, v);', + ' var f = ((n * base) | 0) % base;', + ' return {v: v, f: f};', + '}', '', '' + ].join('\n'); + + var getWT = + [ + 'function getWT(v, f) {', + ' if (f === 0) {', + ' return {w: 0, t: 0};', + ' }', '', + ' while ((f % 10) === 0) {', + ' f /= 10;', + ' v--;', + ' }', '', + ' return {w: v, t: f};', + '}', '', '' + ].join('\n'); localeObj = { DATETIME_FORMATS: localeObj.DATETIME_FORMATS, @@ -176,6 +204,26 @@ function outputLocale(localeInfo, localeID) { }; var content = serializeContent(localeInfo[localeID]); + if (content.indexOf('getVF(') < 0) { + getVF = ''; + } + if (content.indexOf('getWT(') < 0) { + getWT = ''; + } + if (!getVF && content.indexOf('getDecimals(') < 0) { + getDecimals = ''; + } + + var prefix = + "'use strict';\n" + + 'angular.module("ngLocale", [], ["$provide", function($provide) {\n' + + 'var PLURAL_CATEGORY = {' + + 'ZERO: "zero", ONE: "one", TWO: "two", FEW: "few", MANY: "many", OTHER: "other"' + + '};\n' + + getDecimals + getVF + getWT + + '$provide.value("$locale", '; + + var suffix = ');\n}]);'; return prefix + content + suffix; } From fc6ce59cd247d129f8215fcdb34ea8ab6061b6ba Mon Sep 17 00:00:00 2001 From: Caitlin Potter Date: Mon, 2 Jun 2014 16:22:33 -0400 Subject: [PATCH 389/837] chore(ngLocale): update ngLocale scripts --- src/ngLocale/angular-locale_fr-rw.js | 99 +++++++++++++++++++++++ src/ngLocale/angular-locale_fr-sn.js | 99 +++++++++++++++++++++++ src/ngLocale/angular-locale_fr-td.js | 99 +++++++++++++++++++++++ src/ngLocale/angular-locale_fr-tg.js | 99 +++++++++++++++++++++++ src/ngLocale/angular-locale_it-ch.js | 99 +++++++++++++++++++++++ src/ngLocale/angular-locale_ln-cg.js | 99 +++++++++++++++++++++++ src/ngLocale/angular-locale_lt-lt.js | 4 +- src/ngLocale/angular-locale_lt.js | 4 +- src/ngLocale/angular-locale_ms-bn.js | 99 +++++++++++++++++++++++ src/ngLocale/angular-locale_nl-aw.js | 99 +++++++++++++++++++++++ src/ngLocale/angular-locale_nl-be.js | 99 +++++++++++++++++++++++ src/ngLocale/angular-locale_pt-ao.js | 99 +++++++++++++++++++++++ src/ngLocale/angular-locale_pt-gw.js | 99 +++++++++++++++++++++++ src/ngLocale/angular-locale_pt-mz.js | 99 +++++++++++++++++++++++ src/ngLocale/angular-locale_pt-st.js | 99 +++++++++++++++++++++++ src/ngLocale/angular-locale_ro-md.js | 99 +++++++++++++++++++++++ src/ngLocale/angular-locale_ru-md.js | 99 +++++++++++++++++++++++ src/ngLocale/angular-locale_ru-ua.js | 99 +++++++++++++++++++++++ src/ngLocale/angular-locale_sr-cyrl-ba.js | 99 +++++++++++++++++++++++ src/ngLocale/angular-locale_sr-cyrl-me.js | 99 +++++++++++++++++++++++ src/ngLocale/angular-locale_sr-cyrl.js | 99 +++++++++++++++++++++++ src/ngLocale/angular-locale_sr-latn-ba.js | 99 +++++++++++++++++++++++ src/ngLocale/angular-locale_sr-latn-me.js | 99 +++++++++++++++++++++++ src/ngLocale/angular-locale_sr-latn.js | 99 +++++++++++++++++++++++ src/ngLocale/angular-locale_sv-fi.js | 99 +++++++++++++++++++++++ src/ngLocale/angular-locale_sw-ke.js | 99 +++++++++++++++++++++++ src/ngLocale/angular-locale_ta-lk.js | 99 +++++++++++++++++++++++ src/ngLocale/angular-locale_ur-in.js | 99 +++++++++++++++++++++++ src/ngLocale/angular-locale_zh-hans-hk.js | 99 +++++++++++++++++++++++ src/ngLocale/angular-locale_zh-hans-mo.js | 99 +++++++++++++++++++++++ src/ngLocale/angular-locale_zh-hans-sg.js | 99 +++++++++++++++++++++++ src/ngLocale/angular-locale_zh-hans.js | 99 +++++++++++++++++++++++ src/ngLocale/angular-locale_zh-hant-hk.js | 99 +++++++++++++++++++++++ src/ngLocale/angular-locale_zh-hant-mo.js | 99 +++++++++++++++++++++++ src/ngLocale/angular-locale_zh-hant-tw.js | 99 +++++++++++++++++++++++ src/ngLocale/angular-locale_zh-hant.js | 99 +++++++++++++++++++++++ 36 files changed, 3370 insertions(+), 4 deletions(-) create mode 100644 src/ngLocale/angular-locale_fr-rw.js create mode 100644 src/ngLocale/angular-locale_fr-sn.js create mode 100644 src/ngLocale/angular-locale_fr-td.js create mode 100644 src/ngLocale/angular-locale_fr-tg.js create mode 100644 src/ngLocale/angular-locale_it-ch.js create mode 100644 src/ngLocale/angular-locale_ln-cg.js create mode 100644 src/ngLocale/angular-locale_ms-bn.js create mode 100644 src/ngLocale/angular-locale_nl-aw.js create mode 100644 src/ngLocale/angular-locale_nl-be.js create mode 100644 src/ngLocale/angular-locale_pt-ao.js create mode 100644 src/ngLocale/angular-locale_pt-gw.js create mode 100644 src/ngLocale/angular-locale_pt-mz.js create mode 100644 src/ngLocale/angular-locale_pt-st.js create mode 100644 src/ngLocale/angular-locale_ro-md.js create mode 100644 src/ngLocale/angular-locale_ru-md.js create mode 100644 src/ngLocale/angular-locale_ru-ua.js create mode 100644 src/ngLocale/angular-locale_sr-cyrl-ba.js create mode 100644 src/ngLocale/angular-locale_sr-cyrl-me.js create mode 100644 src/ngLocale/angular-locale_sr-cyrl.js create mode 100644 src/ngLocale/angular-locale_sr-latn-ba.js create mode 100644 src/ngLocale/angular-locale_sr-latn-me.js create mode 100644 src/ngLocale/angular-locale_sr-latn.js create mode 100644 src/ngLocale/angular-locale_sv-fi.js create mode 100644 src/ngLocale/angular-locale_sw-ke.js create mode 100644 src/ngLocale/angular-locale_ta-lk.js create mode 100644 src/ngLocale/angular-locale_ur-in.js create mode 100644 src/ngLocale/angular-locale_zh-hans-hk.js create mode 100644 src/ngLocale/angular-locale_zh-hans-mo.js create mode 100644 src/ngLocale/angular-locale_zh-hans-sg.js create mode 100644 src/ngLocale/angular-locale_zh-hans.js create mode 100644 src/ngLocale/angular-locale_zh-hant-hk.js create mode 100644 src/ngLocale/angular-locale_zh-hant-mo.js create mode 100644 src/ngLocale/angular-locale_zh-hant-tw.js create mode 100644 src/ngLocale/angular-locale_zh-hant.js diff --git a/src/ngLocale/angular-locale_fr-rw.js b/src/ngLocale/angular-locale_fr-rw.js new file mode 100644 index 000000000000..f3688b2c1f0a --- /dev/null +++ b/src/ngLocale/angular-locale_fr-rw.js @@ -0,0 +1,99 @@ +'use strict'; +angular.module("ngLocale", [], ["$provide", function($provide) { +var PLURAL_CATEGORY = {ZERO: "zero", ONE: "one", TWO: "two", FEW: "few", MANY: "many", OTHER: "other"}; +$provide.value("$locale", { + "DATETIME_FORMATS": { + "AMPMS": [ + "AM", + "PM" + ], + "DAY": [ + "dimanche", + "lundi", + "mardi", + "mercredi", + "jeudi", + "vendredi", + "samedi" + ], + "MONTH": [ + "janvier", + "f\u00e9vrier", + "mars", + "avril", + "mai", + "juin", + "juillet", + "ao\u00fbt", + "septembre", + "octobre", + "novembre", + "d\u00e9cembre" + ], + "SHORTDAY": [ + "dim.", + "lun.", + "mar.", + "mer.", + "jeu.", + "ven.", + "sam." + ], + "SHORTMONTH": [ + "janv.", + "f\u00e9vr.", + "mars", + "avr.", + "mai", + "juin", + "juil.", + "ao\u00fbt", + "sept.", + "oct.", + "nov.", + "d\u00e9c." + ], + "fullDate": "EEEE d MMMM y", + "longDate": "d MMMM y", + "medium": "d MMM y HH:mm:ss", + "mediumDate": "d MMM y", + "mediumTime": "HH:mm:ss", + "short": "dd/MM/yy HH:mm", + "shortDate": "dd/MM/yy", + "shortTime": "HH:mm" + }, + "NUMBER_FORMATS": { + "CURRENCY_SYM": "\u20ac", + "DECIMAL_SEP": ",", + "GROUP_SEP": "\u00a0", + "PATTERNS": [ + { + "gSize": 3, + "lgSize": 3, + "macFrac": 0, + "maxFrac": 3, + "minFrac": 0, + "minInt": 1, + "negPre": "-", + "negSuf": "", + "posPre": "", + "posSuf": "" + }, + { + "gSize": 3, + "lgSize": 3, + "macFrac": 0, + "maxFrac": 2, + "minFrac": 2, + "minInt": 1, + "negPre": "(", + "negSuf": "\u00a0\u00a4)", + "posPre": "", + "posSuf": "\u00a0\u00a4" + } + ] + }, + "id": "fr-rw", + "pluralCat": function (n) { if (n >= 0 && n <= 2 && n != 2) { return PLURAL_CATEGORY.ONE; } return PLURAL_CATEGORY.OTHER;} +}); +}]); \ No newline at end of file diff --git a/src/ngLocale/angular-locale_fr-sn.js b/src/ngLocale/angular-locale_fr-sn.js new file mode 100644 index 000000000000..1ac1399faac3 --- /dev/null +++ b/src/ngLocale/angular-locale_fr-sn.js @@ -0,0 +1,99 @@ +'use strict'; +angular.module("ngLocale", [], ["$provide", function($provide) { +var PLURAL_CATEGORY = {ZERO: "zero", ONE: "one", TWO: "two", FEW: "few", MANY: "many", OTHER: "other"}; +$provide.value("$locale", { + "DATETIME_FORMATS": { + "AMPMS": [ + "AM", + "PM" + ], + "DAY": [ + "dimanche", + "lundi", + "mardi", + "mercredi", + "jeudi", + "vendredi", + "samedi" + ], + "MONTH": [ + "janvier", + "f\u00e9vrier", + "mars", + "avril", + "mai", + "juin", + "juillet", + "ao\u00fbt", + "septembre", + "octobre", + "novembre", + "d\u00e9cembre" + ], + "SHORTDAY": [ + "dim.", + "lun.", + "mar.", + "mer.", + "jeu.", + "ven.", + "sam." + ], + "SHORTMONTH": [ + "janv.", + "f\u00e9vr.", + "mars", + "avr.", + "mai", + "juin", + "juil.", + "ao\u00fbt", + "sept.", + "oct.", + "nov.", + "d\u00e9c." + ], + "fullDate": "EEEE d MMMM y", + "longDate": "d MMMM y", + "medium": "d MMM y HH:mm:ss", + "mediumDate": "d MMM y", + "mediumTime": "HH:mm:ss", + "short": "dd/MM/yy HH:mm", + "shortDate": "dd/MM/yy", + "shortTime": "HH:mm" + }, + "NUMBER_FORMATS": { + "CURRENCY_SYM": "\u20ac", + "DECIMAL_SEP": ",", + "GROUP_SEP": "\u00a0", + "PATTERNS": [ + { + "gSize": 3, + "lgSize": 3, + "macFrac": 0, + "maxFrac": 3, + "minFrac": 0, + "minInt": 1, + "negPre": "-", + "negSuf": "", + "posPre": "", + "posSuf": "" + }, + { + "gSize": 3, + "lgSize": 3, + "macFrac": 0, + "maxFrac": 2, + "minFrac": 2, + "minInt": 1, + "negPre": "(", + "negSuf": "\u00a0\u00a4)", + "posPre": "", + "posSuf": "\u00a0\u00a4" + } + ] + }, + "id": "fr-sn", + "pluralCat": function (n) { if (n >= 0 && n <= 2 && n != 2) { return PLURAL_CATEGORY.ONE; } return PLURAL_CATEGORY.OTHER;} +}); +}]); \ No newline at end of file diff --git a/src/ngLocale/angular-locale_fr-td.js b/src/ngLocale/angular-locale_fr-td.js new file mode 100644 index 000000000000..7e447eba1d0e --- /dev/null +++ b/src/ngLocale/angular-locale_fr-td.js @@ -0,0 +1,99 @@ +'use strict'; +angular.module("ngLocale", [], ["$provide", function($provide) { +var PLURAL_CATEGORY = {ZERO: "zero", ONE: "one", TWO: "two", FEW: "few", MANY: "many", OTHER: "other"}; +$provide.value("$locale", { + "DATETIME_FORMATS": { + "AMPMS": [ + "AM", + "PM" + ], + "DAY": [ + "dimanche", + "lundi", + "mardi", + "mercredi", + "jeudi", + "vendredi", + "samedi" + ], + "MONTH": [ + "janvier", + "f\u00e9vrier", + "mars", + "avril", + "mai", + "juin", + "juillet", + "ao\u00fbt", + "septembre", + "octobre", + "novembre", + "d\u00e9cembre" + ], + "SHORTDAY": [ + "dim.", + "lun.", + "mar.", + "mer.", + "jeu.", + "ven.", + "sam." + ], + "SHORTMONTH": [ + "janv.", + "f\u00e9vr.", + "mars", + "avr.", + "mai", + "juin", + "juil.", + "ao\u00fbt", + "sept.", + "oct.", + "nov.", + "d\u00e9c." + ], + "fullDate": "EEEE d MMMM y", + "longDate": "d MMMM y", + "medium": "d MMM y HH:mm:ss", + "mediumDate": "d MMM y", + "mediumTime": "HH:mm:ss", + "short": "dd/MM/yy HH:mm", + "shortDate": "dd/MM/yy", + "shortTime": "HH:mm" + }, + "NUMBER_FORMATS": { + "CURRENCY_SYM": "\u20ac", + "DECIMAL_SEP": ",", + "GROUP_SEP": "\u00a0", + "PATTERNS": [ + { + "gSize": 3, + "lgSize": 3, + "macFrac": 0, + "maxFrac": 3, + "minFrac": 0, + "minInt": 1, + "negPre": "-", + "negSuf": "", + "posPre": "", + "posSuf": "" + }, + { + "gSize": 3, + "lgSize": 3, + "macFrac": 0, + "maxFrac": 2, + "minFrac": 2, + "minInt": 1, + "negPre": "(", + "negSuf": "\u00a0\u00a4)", + "posPre": "", + "posSuf": "\u00a0\u00a4" + } + ] + }, + "id": "fr-td", + "pluralCat": function (n) { if (n >= 0 && n <= 2 && n != 2) { return PLURAL_CATEGORY.ONE; } return PLURAL_CATEGORY.OTHER;} +}); +}]); \ No newline at end of file diff --git a/src/ngLocale/angular-locale_fr-tg.js b/src/ngLocale/angular-locale_fr-tg.js new file mode 100644 index 000000000000..9189a4496cc1 --- /dev/null +++ b/src/ngLocale/angular-locale_fr-tg.js @@ -0,0 +1,99 @@ +'use strict'; +angular.module("ngLocale", [], ["$provide", function($provide) { +var PLURAL_CATEGORY = {ZERO: "zero", ONE: "one", TWO: "two", FEW: "few", MANY: "many", OTHER: "other"}; +$provide.value("$locale", { + "DATETIME_FORMATS": { + "AMPMS": [ + "AM", + "PM" + ], + "DAY": [ + "dimanche", + "lundi", + "mardi", + "mercredi", + "jeudi", + "vendredi", + "samedi" + ], + "MONTH": [ + "janvier", + "f\u00e9vrier", + "mars", + "avril", + "mai", + "juin", + "juillet", + "ao\u00fbt", + "septembre", + "octobre", + "novembre", + "d\u00e9cembre" + ], + "SHORTDAY": [ + "dim.", + "lun.", + "mar.", + "mer.", + "jeu.", + "ven.", + "sam." + ], + "SHORTMONTH": [ + "janv.", + "f\u00e9vr.", + "mars", + "avr.", + "mai", + "juin", + "juil.", + "ao\u00fbt", + "sept.", + "oct.", + "nov.", + "d\u00e9c." + ], + "fullDate": "EEEE d MMMM y", + "longDate": "d MMMM y", + "medium": "d MMM y HH:mm:ss", + "mediumDate": "d MMM y", + "mediumTime": "HH:mm:ss", + "short": "dd/MM/yy HH:mm", + "shortDate": "dd/MM/yy", + "shortTime": "HH:mm" + }, + "NUMBER_FORMATS": { + "CURRENCY_SYM": "\u20ac", + "DECIMAL_SEP": ",", + "GROUP_SEP": "\u00a0", + "PATTERNS": [ + { + "gSize": 3, + "lgSize": 3, + "macFrac": 0, + "maxFrac": 3, + "minFrac": 0, + "minInt": 1, + "negPre": "-", + "negSuf": "", + "posPre": "", + "posSuf": "" + }, + { + "gSize": 3, + "lgSize": 3, + "macFrac": 0, + "maxFrac": 2, + "minFrac": 2, + "minInt": 1, + "negPre": "(", + "negSuf": "\u00a0\u00a4)", + "posPre": "", + "posSuf": "\u00a0\u00a4" + } + ] + }, + "id": "fr-tg", + "pluralCat": function (n) { if (n >= 0 && n <= 2 && n != 2) { return PLURAL_CATEGORY.ONE; } return PLURAL_CATEGORY.OTHER;} +}); +}]); \ No newline at end of file diff --git a/src/ngLocale/angular-locale_it-ch.js b/src/ngLocale/angular-locale_it-ch.js new file mode 100644 index 000000000000..653cd8927852 --- /dev/null +++ b/src/ngLocale/angular-locale_it-ch.js @@ -0,0 +1,99 @@ +'use strict'; +angular.module("ngLocale", [], ["$provide", function($provide) { +var PLURAL_CATEGORY = {ZERO: "zero", ONE: "one", TWO: "two", FEW: "few", MANY: "many", OTHER: "other"}; +$provide.value("$locale", { + "DATETIME_FORMATS": { + "AMPMS": [ + "m.", + "p." + ], + "DAY": [ + "domenica", + "luned\u00ec", + "marted\u00ec", + "mercoled\u00ec", + "gioved\u00ec", + "venerd\u00ec", + "sabato" + ], + "MONTH": [ + "gennaio", + "febbraio", + "marzo", + "aprile", + "maggio", + "giugno", + "luglio", + "agosto", + "settembre", + "ottobre", + "novembre", + "dicembre" + ], + "SHORTDAY": [ + "dom", + "lun", + "mar", + "mer", + "gio", + "ven", + "sab" + ], + "SHORTMONTH": [ + "gen", + "feb", + "mar", + "apr", + "mag", + "giu", + "lug", + "ago", + "set", + "ott", + "nov", + "dic" + ], + "fullDate": "EEEE, d MMMM y", + "longDate": "d MMMM y", + "medium": "d-MMM-y HH:mm:ss", + "mediumDate": "d-MMM-y", + "mediumTime": "HH:mm:ss", + "short": "dd.MM.yy HH:mm", + "shortDate": "dd.MM.yy", + "shortTime": "HH:mm" + }, + "NUMBER_FORMATS": { + "CURRENCY_SYM": "\u20ac", + "DECIMAL_SEP": ",", + "GROUP_SEP": ".", + "PATTERNS": [ + { + "gSize": 3, + "lgSize": 3, + "macFrac": 0, + "maxFrac": 3, + "minFrac": 0, + "minInt": 1, + "negPre": "-", + "negSuf": "", + "posPre": "", + "posSuf": "" + }, + { + "gSize": 3, + "lgSize": 3, + "macFrac": 0, + "maxFrac": 2, + "minFrac": 2, + "minInt": 1, + "negPre": "\u00a4\u00a0-", + "negSuf": "", + "posPre": "\u00a4\u00a0", + "posSuf": "" + } + ] + }, + "id": "it-ch", + "pluralCat": function (n) { if (n == 1) { return PLURAL_CATEGORY.ONE; } return PLURAL_CATEGORY.OTHER;} +}); +}]); \ No newline at end of file diff --git a/src/ngLocale/angular-locale_ln-cg.js b/src/ngLocale/angular-locale_ln-cg.js new file mode 100644 index 000000000000..6095d33cb93c --- /dev/null +++ b/src/ngLocale/angular-locale_ln-cg.js @@ -0,0 +1,99 @@ +'use strict'; +angular.module("ngLocale", [], ["$provide", function($provide) { +var PLURAL_CATEGORY = {ZERO: "zero", ONE: "one", TWO: "two", FEW: "few", MANY: "many", OTHER: "other"}; +$provide.value("$locale", { + "DATETIME_FORMATS": { + "AMPMS": [ + "nt\u0254\u0301ng\u0254\u0301", + "mp\u00f3kwa" + ], + "DAY": [ + "eyenga", + "mok\u0254l\u0254 mwa yambo", + "mok\u0254l\u0254 mwa m\u00edbal\u00e9", + "mok\u0254l\u0254 mwa m\u00eds\u00e1to", + "mok\u0254l\u0254 ya m\u00edn\u00e9i", + "mok\u0254l\u0254 ya m\u00edt\u00e1no", + "mp\u0254\u0301s\u0254" + ], + "MONTH": [ + "s\u00e1nz\u00e1 ya yambo", + "s\u00e1nz\u00e1 ya m\u00edbal\u00e9", + "s\u00e1nz\u00e1 ya m\u00eds\u00e1to", + "s\u00e1nz\u00e1 ya m\u00ednei", + "s\u00e1nz\u00e1 ya m\u00edt\u00e1no", + "s\u00e1nz\u00e1 ya mot\u00f3b\u00e1", + "s\u00e1nz\u00e1 ya nsambo", + "s\u00e1nz\u00e1 ya mwambe", + "s\u00e1nz\u00e1 ya libwa", + "s\u00e1nz\u00e1 ya z\u00f3mi", + "s\u00e1nz\u00e1 ya z\u00f3mi na m\u0254\u030ck\u0254\u0301", + "s\u00e1nz\u00e1 ya z\u00f3mi na m\u00edbal\u00e9" + ], + "SHORTDAY": [ + "eye", + "ybo", + "mbl", + "mst", + "min", + "mtn", + "mps" + ], + "SHORTMONTH": [ + "yan", + "fbl", + "msi", + "apl", + "mai", + "yun", + "yul", + "agt", + "stb", + "\u0254tb", + "nvb", + "dsb" + ], + "fullDate": "EEEE d MMMM y", + "longDate": "d MMMM y", + "medium": "d MMM y HH:mm:ss", + "mediumDate": "d MMM y", + "mediumTime": "HH:mm:ss", + "short": "d/M/yyyy HH:mm", + "shortDate": "d/M/yyyy", + "shortTime": "HH:mm" + }, + "NUMBER_FORMATS": { + "CURRENCY_SYM": "FrCD", + "DECIMAL_SEP": ",", + "GROUP_SEP": ".", + "PATTERNS": [ + { + "gSize": 3, + "lgSize": 3, + "macFrac": 0, + "maxFrac": 3, + "minFrac": 0, + "minInt": 1, + "negPre": "-", + "negSuf": "", + "posPre": "", + "posSuf": "" + }, + { + "gSize": 3, + "lgSize": 3, + "macFrac": 0, + "maxFrac": 2, + "minFrac": 2, + "minInt": 1, + "negPre": "-", + "negSuf": "\u00a0\u00a4", + "posPre": "", + "posSuf": "\u00a0\u00a4" + } + ] + }, + "id": "ln-cg", + "pluralCat": function (n) { if (n == 0 || n == 1) { return PLURAL_CATEGORY.ONE; } return PLURAL_CATEGORY.OTHER;} +}); +}]); \ No newline at end of file diff --git a/src/ngLocale/angular-locale_lt-lt.js b/src/ngLocale/angular-locale_lt-lt.js index 17691c4c4a4c..0b84931ab0cb 100644 --- a/src/ngLocale/angular-locale_lt-lt.js +++ b/src/ngLocale/angular-locale_lt-lt.js @@ -17,7 +17,7 @@ $provide.value("$locale", { "\u0161e\u0161tadienis" ], "MONTH": [ - "sausis", + "sausio", "vasaris", "kovas", "balandis", @@ -41,7 +41,7 @@ $provide.value("$locale", { ], "SHORTMONTH": [ "Saus.", - "Vas.", + "Vas", "Kov.", "Bal.", "Geg.", diff --git a/src/ngLocale/angular-locale_lt.js b/src/ngLocale/angular-locale_lt.js index 1cb171c80d30..c0d3c0a10c3c 100644 --- a/src/ngLocale/angular-locale_lt.js +++ b/src/ngLocale/angular-locale_lt.js @@ -17,7 +17,7 @@ $provide.value("$locale", { "\u0161e\u0161tadienis" ], "MONTH": [ - "sausis", + "sausio", "vasaris", "kovas", "balandis", @@ -41,7 +41,7 @@ $provide.value("$locale", { ], "SHORTMONTH": [ "Saus.", - "Vas.", + "Vas", "Kov.", "Bal.", "Geg.", diff --git a/src/ngLocale/angular-locale_ms-bn.js b/src/ngLocale/angular-locale_ms-bn.js new file mode 100644 index 000000000000..cd32b5607aff --- /dev/null +++ b/src/ngLocale/angular-locale_ms-bn.js @@ -0,0 +1,99 @@ +'use strict'; +angular.module("ngLocale", [], ["$provide", function($provide) { +var PLURAL_CATEGORY = {ZERO: "zero", ONE: "one", TWO: "two", FEW: "few", MANY: "many", OTHER: "other"}; +$provide.value("$locale", { + "DATETIME_FORMATS": { + "AMPMS": [ + "PG", + "PTG" + ], + "DAY": [ + "Ahad", + "Isnin", + "Selasa", + "Rabu", + "Khamis", + "Jumaat", + "Sabtu" + ], + "MONTH": [ + "Januari", + "Februari", + "Mac", + "April", + "Mei", + "Jun", + "Julai", + "Ogos", + "September", + "Oktober", + "November", + "Disember" + ], + "SHORTDAY": [ + "Ahd", + "Isn", + "Sel", + "Rab", + "Kha", + "Jum", + "Sab" + ], + "SHORTMONTH": [ + "Jan", + "Feb", + "Mac", + "Apr", + "Mei", + "Jun", + "Jul", + "Ogos", + "Sep", + "Okt", + "Nov", + "Dis" + ], + "fullDate": "dd MMMM y", + "longDate": "d MMMM y", + "medium": "dd/MM/yyyy h:mm:ss a", + "mediumDate": "dd/MM/yyyy", + "mediumTime": "h:mm:ss a", + "short": "d/MM/yy h:mm a", + "shortDate": "d/MM/yy", + "shortTime": "h:mm a" + }, + "NUMBER_FORMATS": { + "CURRENCY_SYM": "RM", + "DECIMAL_SEP": ".", + "GROUP_SEP": ",", + "PATTERNS": [ + { + "gSize": 3, + "lgSize": 3, + "macFrac": 0, + "maxFrac": 3, + "minFrac": 0, + "minInt": 1, + "negPre": "-", + "negSuf": "", + "posPre": "", + "posSuf": "" + }, + { + "gSize": 3, + "lgSize": 3, + "macFrac": 0, + "maxFrac": 2, + "minFrac": 2, + "minInt": 1, + "negPre": "(\u00a4", + "negSuf": ")", + "posPre": "\u00a4", + "posSuf": "" + } + ] + }, + "id": "ms-bn", + "pluralCat": function (n) { return PLURAL_CATEGORY.OTHER;} +}); +}]); \ No newline at end of file diff --git a/src/ngLocale/angular-locale_nl-aw.js b/src/ngLocale/angular-locale_nl-aw.js new file mode 100644 index 000000000000..171035b31ba5 --- /dev/null +++ b/src/ngLocale/angular-locale_nl-aw.js @@ -0,0 +1,99 @@ +'use strict'; +angular.module("ngLocale", [], ["$provide", function($provide) { +var PLURAL_CATEGORY = {ZERO: "zero", ONE: "one", TWO: "two", FEW: "few", MANY: "many", OTHER: "other"}; +$provide.value("$locale", { + "DATETIME_FORMATS": { + "AMPMS": [ + "AM", + "PM" + ], + "DAY": [ + "zondag", + "maandag", + "dinsdag", + "woensdag", + "donderdag", + "vrijdag", + "zaterdag" + ], + "MONTH": [ + "januari", + "februari", + "maart", + "april", + "mei", + "juni", + "juli", + "augustus", + "september", + "oktober", + "november", + "december" + ], + "SHORTDAY": [ + "zo", + "ma", + "di", + "wo", + "do", + "vr", + "za" + ], + "SHORTMONTH": [ + "jan.", + "feb.", + "mrt.", + "apr.", + "mei", + "jun.", + "jul.", + "aug.", + "sep.", + "okt.", + "nov.", + "dec." + ], + "fullDate": "EEEE d MMMM y", + "longDate": "d MMMM y", + "medium": "d MMM y HH:mm:ss", + "mediumDate": "d MMM y", + "mediumTime": "HH:mm:ss", + "short": "dd-MM-yy HH:mm", + "shortDate": "dd-MM-yy", + "shortTime": "HH:mm" + }, + "NUMBER_FORMATS": { + "CURRENCY_SYM": "\u20ac", + "DECIMAL_SEP": ",", + "GROUP_SEP": ".", + "PATTERNS": [ + { + "gSize": 3, + "lgSize": 3, + "macFrac": 0, + "maxFrac": 3, + "minFrac": 0, + "minInt": 1, + "negPre": "-", + "negSuf": "", + "posPre": "", + "posSuf": "" + }, + { + "gSize": 3, + "lgSize": 3, + "macFrac": 0, + "maxFrac": 2, + "minFrac": 2, + "minInt": 1, + "negPre": "\u00a4\u00a0", + "negSuf": "-", + "posPre": "\u00a4\u00a0", + "posSuf": "" + } + ] + }, + "id": "nl-aw", + "pluralCat": function (n) { if (n == 1) { return PLURAL_CATEGORY.ONE; } return PLURAL_CATEGORY.OTHER;} +}); +}]); \ No newline at end of file diff --git a/src/ngLocale/angular-locale_nl-be.js b/src/ngLocale/angular-locale_nl-be.js new file mode 100644 index 000000000000..86158ab32098 --- /dev/null +++ b/src/ngLocale/angular-locale_nl-be.js @@ -0,0 +1,99 @@ +'use strict'; +angular.module("ngLocale", [], ["$provide", function($provide) { +var PLURAL_CATEGORY = {ZERO: "zero", ONE: "one", TWO: "two", FEW: "few", MANY: "many", OTHER: "other"}; +$provide.value("$locale", { + "DATETIME_FORMATS": { + "AMPMS": [ + "AM", + "PM" + ], + "DAY": [ + "zondag", + "maandag", + "dinsdag", + "woensdag", + "donderdag", + "vrijdag", + "zaterdag" + ], + "MONTH": [ + "januari", + "februari", + "maart", + "april", + "mei", + "juni", + "juli", + "augustus", + "september", + "oktober", + "november", + "december" + ], + "SHORTDAY": [ + "zo", + "ma", + "di", + "wo", + "do", + "vr", + "za" + ], + "SHORTMONTH": [ + "jan.", + "feb.", + "mrt.", + "apr.", + "mei", + "jun.", + "jul.", + "aug.", + "sep.", + "okt.", + "nov.", + "dec." + ], + "fullDate": "EEEE d MMMM y", + "longDate": "d MMMM y", + "medium": "d-MMM-y HH:mm:ss", + "mediumDate": "d-MMM-y", + "mediumTime": "HH:mm:ss", + "short": "d/MM/yy HH:mm", + "shortDate": "d/MM/yy", + "shortTime": "HH:mm" + }, + "NUMBER_FORMATS": { + "CURRENCY_SYM": "\u20ac", + "DECIMAL_SEP": ",", + "GROUP_SEP": ".", + "PATTERNS": [ + { + "gSize": 3, + "lgSize": 3, + "macFrac": 0, + "maxFrac": 3, + "minFrac": 0, + "minInt": 1, + "negPre": "-", + "negSuf": "", + "posPre": "", + "posSuf": "" + }, + { + "gSize": 3, + "lgSize": 3, + "macFrac": 0, + "maxFrac": 2, + "minFrac": 2, + "minInt": 1, + "negPre": "\u00a4\u00a0", + "negSuf": "-", + "posPre": "\u00a4\u00a0", + "posSuf": "" + } + ] + }, + "id": "nl-be", + "pluralCat": function (n) { if (n == 1) { return PLURAL_CATEGORY.ONE; } return PLURAL_CATEGORY.OTHER;} +}); +}]); \ No newline at end of file diff --git a/src/ngLocale/angular-locale_pt-ao.js b/src/ngLocale/angular-locale_pt-ao.js new file mode 100644 index 000000000000..e08e21e851b2 --- /dev/null +++ b/src/ngLocale/angular-locale_pt-ao.js @@ -0,0 +1,99 @@ +'use strict'; +angular.module("ngLocale", [], ["$provide", function($provide) { +var PLURAL_CATEGORY = {ZERO: "zero", ONE: "one", TWO: "two", FEW: "few", MANY: "many", OTHER: "other"}; +$provide.value("$locale", { + "DATETIME_FORMATS": { + "AMPMS": [ + "AM", + "PM" + ], + "DAY": [ + "domingo", + "segunda-feira", + "ter\u00e7a-feira", + "quarta-feira", + "quinta-feira", + "sexta-feira", + "s\u00e1bado" + ], + "MONTH": [ + "janeiro", + "fevereiro", + "mar\u00e7o", + "abril", + "maio", + "junho", + "julho", + "agosto", + "setembro", + "outubro", + "novembro", + "dezembro" + ], + "SHORTDAY": [ + "dom", + "seg", + "ter", + "qua", + "qui", + "sex", + "s\u00e1b" + ], + "SHORTMONTH": [ + "jan", + "fev", + "mar", + "abr", + "mai", + "jun", + "jul", + "ago", + "set", + "out", + "nov", + "dez" + ], + "fullDate": "EEEE, d 'de' MMMM 'de' y", + "longDate": "d 'de' MMMM 'de' y", + "medium": "dd/MM/yyyy HH:mm:ss", + "mediumDate": "dd/MM/yyyy", + "mediumTime": "HH:mm:ss", + "short": "dd/MM/yy HH:mm", + "shortDate": "dd/MM/yy", + "shortTime": "HH:mm" + }, + "NUMBER_FORMATS": { + "CURRENCY_SYM": "R$", + "DECIMAL_SEP": ",", + "GROUP_SEP": ".", + "PATTERNS": [ + { + "gSize": 3, + "lgSize": 3, + "macFrac": 0, + "maxFrac": 3, + "minFrac": 0, + "minInt": 1, + "negPre": "-", + "negSuf": "", + "posPre": "", + "posSuf": "" + }, + { + "gSize": 3, + "lgSize": 3, + "macFrac": 0, + "maxFrac": 2, + "minFrac": 2, + "minInt": 1, + "negPre": "(\u00a4", + "negSuf": ")", + "posPre": "\u00a4", + "posSuf": "" + } + ] + }, + "id": "pt-ao", + "pluralCat": function (n) { if (n == 1) { return PLURAL_CATEGORY.ONE; } return PLURAL_CATEGORY.OTHER;} +}); +}]); \ No newline at end of file diff --git a/src/ngLocale/angular-locale_pt-gw.js b/src/ngLocale/angular-locale_pt-gw.js new file mode 100644 index 000000000000..bfbd30ccbc32 --- /dev/null +++ b/src/ngLocale/angular-locale_pt-gw.js @@ -0,0 +1,99 @@ +'use strict'; +angular.module("ngLocale", [], ["$provide", function($provide) { +var PLURAL_CATEGORY = {ZERO: "zero", ONE: "one", TWO: "two", FEW: "few", MANY: "many", OTHER: "other"}; +$provide.value("$locale", { + "DATETIME_FORMATS": { + "AMPMS": [ + "AM", + "PM" + ], + "DAY": [ + "domingo", + "segunda-feira", + "ter\u00e7a-feira", + "quarta-feira", + "quinta-feira", + "sexta-feira", + "s\u00e1bado" + ], + "MONTH": [ + "janeiro", + "fevereiro", + "mar\u00e7o", + "abril", + "maio", + "junho", + "julho", + "agosto", + "setembro", + "outubro", + "novembro", + "dezembro" + ], + "SHORTDAY": [ + "dom", + "seg", + "ter", + "qua", + "qui", + "sex", + "s\u00e1b" + ], + "SHORTMONTH": [ + "jan", + "fev", + "mar", + "abr", + "mai", + "jun", + "jul", + "ago", + "set", + "out", + "nov", + "dez" + ], + "fullDate": "EEEE, d 'de' MMMM 'de' y", + "longDate": "d 'de' MMMM 'de' y", + "medium": "dd/MM/yyyy HH:mm:ss", + "mediumDate": "dd/MM/yyyy", + "mediumTime": "HH:mm:ss", + "short": "dd/MM/yy HH:mm", + "shortDate": "dd/MM/yy", + "shortTime": "HH:mm" + }, + "NUMBER_FORMATS": { + "CURRENCY_SYM": "R$", + "DECIMAL_SEP": ",", + "GROUP_SEP": ".", + "PATTERNS": [ + { + "gSize": 3, + "lgSize": 3, + "macFrac": 0, + "maxFrac": 3, + "minFrac": 0, + "minInt": 1, + "negPre": "-", + "negSuf": "", + "posPre": "", + "posSuf": "" + }, + { + "gSize": 3, + "lgSize": 3, + "macFrac": 0, + "maxFrac": 2, + "minFrac": 2, + "minInt": 1, + "negPre": "(\u00a4", + "negSuf": ")", + "posPre": "\u00a4", + "posSuf": "" + } + ] + }, + "id": "pt-gw", + "pluralCat": function (n) { if (n == 1) { return PLURAL_CATEGORY.ONE; } return PLURAL_CATEGORY.OTHER;} +}); +}]); \ No newline at end of file diff --git a/src/ngLocale/angular-locale_pt-mz.js b/src/ngLocale/angular-locale_pt-mz.js new file mode 100644 index 000000000000..35a712a28852 --- /dev/null +++ b/src/ngLocale/angular-locale_pt-mz.js @@ -0,0 +1,99 @@ +'use strict'; +angular.module("ngLocale", [], ["$provide", function($provide) { +var PLURAL_CATEGORY = {ZERO: "zero", ONE: "one", TWO: "two", FEW: "few", MANY: "many", OTHER: "other"}; +$provide.value("$locale", { + "DATETIME_FORMATS": { + "AMPMS": [ + "AM", + "PM" + ], + "DAY": [ + "domingo", + "segunda-feira", + "ter\u00e7a-feira", + "quarta-feira", + "quinta-feira", + "sexta-feira", + "s\u00e1bado" + ], + "MONTH": [ + "janeiro", + "fevereiro", + "mar\u00e7o", + "abril", + "maio", + "junho", + "julho", + "agosto", + "setembro", + "outubro", + "novembro", + "dezembro" + ], + "SHORTDAY": [ + "dom", + "seg", + "ter", + "qua", + "qui", + "sex", + "s\u00e1b" + ], + "SHORTMONTH": [ + "jan", + "fev", + "mar", + "abr", + "mai", + "jun", + "jul", + "ago", + "set", + "out", + "nov", + "dez" + ], + "fullDate": "EEEE, d 'de' MMMM 'de' y", + "longDate": "d 'de' MMMM 'de' y", + "medium": "dd/MM/yyyy HH:mm:ss", + "mediumDate": "dd/MM/yyyy", + "mediumTime": "HH:mm:ss", + "short": "dd/MM/yy HH:mm", + "shortDate": "dd/MM/yy", + "shortTime": "HH:mm" + }, + "NUMBER_FORMATS": { + "CURRENCY_SYM": "R$", + "DECIMAL_SEP": ",", + "GROUP_SEP": ".", + "PATTERNS": [ + { + "gSize": 3, + "lgSize": 3, + "macFrac": 0, + "maxFrac": 3, + "minFrac": 0, + "minInt": 1, + "negPre": "-", + "negSuf": "", + "posPre": "", + "posSuf": "" + }, + { + "gSize": 3, + "lgSize": 3, + "macFrac": 0, + "maxFrac": 2, + "minFrac": 2, + "minInt": 1, + "negPre": "(\u00a4", + "negSuf": ")", + "posPre": "\u00a4", + "posSuf": "" + } + ] + }, + "id": "pt-mz", + "pluralCat": function (n) { if (n == 1) { return PLURAL_CATEGORY.ONE; } return PLURAL_CATEGORY.OTHER;} +}); +}]); \ No newline at end of file diff --git a/src/ngLocale/angular-locale_pt-st.js b/src/ngLocale/angular-locale_pt-st.js new file mode 100644 index 000000000000..728505a97caa --- /dev/null +++ b/src/ngLocale/angular-locale_pt-st.js @@ -0,0 +1,99 @@ +'use strict'; +angular.module("ngLocale", [], ["$provide", function($provide) { +var PLURAL_CATEGORY = {ZERO: "zero", ONE: "one", TWO: "two", FEW: "few", MANY: "many", OTHER: "other"}; +$provide.value("$locale", { + "DATETIME_FORMATS": { + "AMPMS": [ + "AM", + "PM" + ], + "DAY": [ + "domingo", + "segunda-feira", + "ter\u00e7a-feira", + "quarta-feira", + "quinta-feira", + "sexta-feira", + "s\u00e1bado" + ], + "MONTH": [ + "janeiro", + "fevereiro", + "mar\u00e7o", + "abril", + "maio", + "junho", + "julho", + "agosto", + "setembro", + "outubro", + "novembro", + "dezembro" + ], + "SHORTDAY": [ + "dom", + "seg", + "ter", + "qua", + "qui", + "sex", + "s\u00e1b" + ], + "SHORTMONTH": [ + "jan", + "fev", + "mar", + "abr", + "mai", + "jun", + "jul", + "ago", + "set", + "out", + "nov", + "dez" + ], + "fullDate": "EEEE, d 'de' MMMM 'de' y", + "longDate": "d 'de' MMMM 'de' y", + "medium": "dd/MM/yyyy HH:mm:ss", + "mediumDate": "dd/MM/yyyy", + "mediumTime": "HH:mm:ss", + "short": "dd/MM/yy HH:mm", + "shortDate": "dd/MM/yy", + "shortTime": "HH:mm" + }, + "NUMBER_FORMATS": { + "CURRENCY_SYM": "R$", + "DECIMAL_SEP": ",", + "GROUP_SEP": ".", + "PATTERNS": [ + { + "gSize": 3, + "lgSize": 3, + "macFrac": 0, + "maxFrac": 3, + "minFrac": 0, + "minInt": 1, + "negPre": "-", + "negSuf": "", + "posPre": "", + "posSuf": "" + }, + { + "gSize": 3, + "lgSize": 3, + "macFrac": 0, + "maxFrac": 2, + "minFrac": 2, + "minInt": 1, + "negPre": "(\u00a4", + "negSuf": ")", + "posPre": "\u00a4", + "posSuf": "" + } + ] + }, + "id": "pt-st", + "pluralCat": function (n) { if (n == 1) { return PLURAL_CATEGORY.ONE; } return PLURAL_CATEGORY.OTHER;} +}); +}]); \ No newline at end of file diff --git a/src/ngLocale/angular-locale_ro-md.js b/src/ngLocale/angular-locale_ro-md.js new file mode 100644 index 000000000000..b378da17ba5c --- /dev/null +++ b/src/ngLocale/angular-locale_ro-md.js @@ -0,0 +1,99 @@ +'use strict'; +angular.module("ngLocale", [], ["$provide", function($provide) { +var PLURAL_CATEGORY = {ZERO: "zero", ONE: "one", TWO: "two", FEW: "few", MANY: "many", OTHER: "other"}; +$provide.value("$locale", { + "DATETIME_FORMATS": { + "AMPMS": [ + "AM", + "PM" + ], + "DAY": [ + "duminic\u0103", + "luni", + "mar\u021bi", + "miercuri", + "joi", + "vineri", + "s\u00e2mb\u0103t\u0103" + ], + "MONTH": [ + "ianuarie", + "februarie", + "martie", + "aprilie", + "mai", + "iunie", + "iulie", + "august", + "septembrie", + "octombrie", + "noiembrie", + "decembrie" + ], + "SHORTDAY": [ + "Du", + "Lu", + "Ma", + "Mi", + "Jo", + "Vi", + "S\u00e2" + ], + "SHORTMONTH": [ + "ian.", + "feb.", + "mar.", + "apr.", + "mai", + "iun.", + "iul.", + "aug.", + "sept.", + "oct.", + "nov.", + "dec." + ], + "fullDate": "EEEE, d MMMM y", + "longDate": "d MMMM y", + "medium": "dd.MM.yyyy HH:mm:ss", + "mediumDate": "dd.MM.yyyy", + "mediumTime": "HH:mm:ss", + "short": "dd.MM.yyyy HH:mm", + "shortDate": "dd.MM.yyyy", + "shortTime": "HH:mm" + }, + "NUMBER_FORMATS": { + "CURRENCY_SYM": "RON", + "DECIMAL_SEP": ",", + "GROUP_SEP": ".", + "PATTERNS": [ + { + "gSize": 3, + "lgSize": 3, + "macFrac": 0, + "maxFrac": 3, + "minFrac": 0, + "minInt": 1, + "negPre": "-", + "negSuf": "", + "posPre": "", + "posSuf": "" + }, + { + "gSize": 3, + "lgSize": 3, + "macFrac": 0, + "maxFrac": 2, + "minFrac": 2, + "minInt": 1, + "negPre": "-", + "negSuf": "\u00a0\u00a4", + "posPre": "", + "posSuf": "\u00a0\u00a4" + } + ] + }, + "id": "ro-md", + "pluralCat": function (n) { if (n == 1) { return PLURAL_CATEGORY.ONE; } if (n == 0 || n != 1 && n == (n | 0) && n % 100 >= 1 && n % 100 <= 19) { return PLURAL_CATEGORY.FEW; } return PLURAL_CATEGORY.OTHER;} +}); +}]); \ No newline at end of file diff --git a/src/ngLocale/angular-locale_ru-md.js b/src/ngLocale/angular-locale_ru-md.js new file mode 100644 index 000000000000..b366ede02a42 --- /dev/null +++ b/src/ngLocale/angular-locale_ru-md.js @@ -0,0 +1,99 @@ +'use strict'; +angular.module("ngLocale", [], ["$provide", function($provide) { +var PLURAL_CATEGORY = {ZERO: "zero", ONE: "one", TWO: "two", FEW: "few", MANY: "many", OTHER: "other"}; +$provide.value("$locale", { + "DATETIME_FORMATS": { + "AMPMS": [ + "\u0434\u043e \u043f\u043e\u043b\u0443\u0434\u043d\u044f", + "\u043f\u043e\u0441\u043b\u0435 \u043f\u043e\u043b\u0443\u0434\u043d\u044f" + ], + "DAY": [ + "\u0432\u043e\u0441\u043a\u0440\u0435\u0441\u0435\u043d\u044c\u0435", + "\u043f\u043e\u043d\u0435\u0434\u0435\u043b\u044c\u043d\u0438\u043a", + "\u0432\u0442\u043e\u0440\u043d\u0438\u043a", + "\u0441\u0440\u0435\u0434\u0430", + "\u0447\u0435\u0442\u0432\u0435\u0440\u0433", + "\u043f\u044f\u0442\u043d\u0438\u0446\u0430", + "\u0441\u0443\u0431\u0431\u043e\u0442\u0430" + ], + "MONTH": [ + "\u044f\u043d\u0432\u0430\u0440\u044f", + "\u0444\u0435\u0432\u0440\u0430\u043b\u044f", + "\u043c\u0430\u0440\u0442\u0430", + "\u0430\u043f\u0440\u0435\u043b\u044f", + "\u043c\u0430\u044f", + "\u0438\u044e\u043d\u044f", + "\u0438\u044e\u043b\u044f", + "\u0430\u0432\u0433\u0443\u0441\u0442\u0430", + "\u0441\u0435\u043d\u0442\u044f\u0431\u0440\u044f", + "\u043e\u043a\u0442\u044f\u0431\u0440\u044f", + "\u043d\u043e\u044f\u0431\u0440\u044f", + "\u0434\u0435\u043a\u0430\u0431\u0440\u044f" + ], + "SHORTDAY": [ + "\u0432\u0441", + "\u043f\u043d", + "\u0432\u0442", + "\u0441\u0440", + "\u0447\u0442", + "\u043f\u0442", + "\u0441\u0431" + ], + "SHORTMONTH": [ + "\u044f\u043d\u0432.", + "\u0444\u0435\u0432\u0440.", + "\u043c\u0430\u0440\u0442\u0430", + "\u0430\u043f\u0440.", + "\u043c\u0430\u044f", + "\u0438\u044e\u043d\u044f", + "\u0438\u044e\u043b\u044f", + "\u0430\u0432\u0433.", + "\u0441\u0435\u043d\u0442.", + "\u043e\u043a\u0442.", + "\u043d\u043e\u044f\u0431.", + "\u0434\u0435\u043a." + ], + "fullDate": "EEEE, d MMMM y\u00a0'\u0433'.", + "longDate": "d MMMM y\u00a0'\u0433'.", + "medium": "dd.MM.yyyy H:mm:ss", + "mediumDate": "dd.MM.yyyy", + "mediumTime": "H:mm:ss", + "short": "dd.MM.yy H:mm", + "shortDate": "dd.MM.yy", + "shortTime": "H:mm" + }, + "NUMBER_FORMATS": { + "CURRENCY_SYM": "\u0440\u0443\u0431.", + "DECIMAL_SEP": ",", + "GROUP_SEP": "\u00a0", + "PATTERNS": [ + { + "gSize": 3, + "lgSize": 3, + "macFrac": 0, + "maxFrac": 3, + "minFrac": 0, + "minInt": 1, + "negPre": "-", + "negSuf": "", + "posPre": "", + "posSuf": "" + }, + { + "gSize": 3, + "lgSize": 3, + "macFrac": 0, + "maxFrac": 2, + "minFrac": 2, + "minInt": 1, + "negPre": "-", + "negSuf": "\u00a0\u00a4", + "posPre": "", + "posSuf": "\u00a0\u00a4" + } + ] + }, + "id": "ru-md", + "pluralCat": function (n) { if (n % 10 == 1 && n % 100 != 11) { return PLURAL_CATEGORY.ONE; } if (n == (n | 0) && n % 10 >= 2 && n % 10 <= 4 && (n % 100 < 12 || n % 100 > 14)) { return PLURAL_CATEGORY.FEW; } if (n % 10 == 0 || n == (n | 0) && n % 10 >= 5 && n % 10 <= 9 || n == (n | 0) && n % 100 >= 11 && n % 100 <= 14) { return PLURAL_CATEGORY.MANY; } return PLURAL_CATEGORY.OTHER;} +}); +}]); \ No newline at end of file diff --git a/src/ngLocale/angular-locale_ru-ua.js b/src/ngLocale/angular-locale_ru-ua.js new file mode 100644 index 000000000000..64a035dd80e4 --- /dev/null +++ b/src/ngLocale/angular-locale_ru-ua.js @@ -0,0 +1,99 @@ +'use strict'; +angular.module("ngLocale", [], ["$provide", function($provide) { +var PLURAL_CATEGORY = {ZERO: "zero", ONE: "one", TWO: "two", FEW: "few", MANY: "many", OTHER: "other"}; +$provide.value("$locale", { + "DATETIME_FORMATS": { + "AMPMS": [ + "\u0434\u043e \u043f\u043e\u043b\u0443\u0434\u043d\u044f", + "\u043f\u043e\u0441\u043b\u0435 \u043f\u043e\u043b\u0443\u0434\u043d\u044f" + ], + "DAY": [ + "\u0432\u043e\u0441\u043a\u0440\u0435\u0441\u0435\u043d\u044c\u0435", + "\u043f\u043e\u043d\u0435\u0434\u0435\u043b\u044c\u043d\u0438\u043a", + "\u0432\u0442\u043e\u0440\u043d\u0438\u043a", + "\u0441\u0440\u0435\u0434\u0430", + "\u0447\u0435\u0442\u0432\u0435\u0440\u0433", + "\u043f\u044f\u0442\u043d\u0438\u0446\u0430", + "\u0441\u0443\u0431\u0431\u043e\u0442\u0430" + ], + "MONTH": [ + "\u044f\u043d\u0432\u0430\u0440\u044f", + "\u0444\u0435\u0432\u0440\u0430\u043b\u044f", + "\u043c\u0430\u0440\u0442\u0430", + "\u0430\u043f\u0440\u0435\u043b\u044f", + "\u043c\u0430\u044f", + "\u0438\u044e\u043d\u044f", + "\u0438\u044e\u043b\u044f", + "\u0430\u0432\u0433\u0443\u0441\u0442\u0430", + "\u0441\u0435\u043d\u0442\u044f\u0431\u0440\u044f", + "\u043e\u043a\u0442\u044f\u0431\u0440\u044f", + "\u043d\u043e\u044f\u0431\u0440\u044f", + "\u0434\u0435\u043a\u0430\u0431\u0440\u044f" + ], + "SHORTDAY": [ + "\u0432\u0441", + "\u043f\u043d", + "\u0432\u0442", + "\u0441\u0440", + "\u0447\u0442", + "\u043f\u0442", + "\u0441\u0431" + ], + "SHORTMONTH": [ + "\u044f\u043d\u0432.", + "\u0444\u0435\u0432\u0440.", + "\u043c\u0430\u0440\u0442\u0430", + "\u0430\u043f\u0440.", + "\u043c\u0430\u044f", + "\u0438\u044e\u043d\u044f", + "\u0438\u044e\u043b\u044f", + "\u0430\u0432\u0433.", + "\u0441\u0435\u043d\u0442.", + "\u043e\u043a\u0442.", + "\u043d\u043e\u044f\u0431.", + "\u0434\u0435\u043a." + ], + "fullDate": "EEEE, d MMMM y\u00a0'\u0433'.", + "longDate": "d MMMM y", + "medium": "d MMM y HH:mm:ss", + "mediumDate": "d MMM y", + "mediumTime": "HH:mm:ss", + "short": "dd.MM.yy HH:mm", + "shortDate": "dd.MM.yy", + "shortTime": "HH:mm" + }, + "NUMBER_FORMATS": { + "CURRENCY_SYM": "\u0440\u0443\u0431.", + "DECIMAL_SEP": ",", + "GROUP_SEP": "\u00a0", + "PATTERNS": [ + { + "gSize": 3, + "lgSize": 3, + "macFrac": 0, + "maxFrac": 3, + "minFrac": 0, + "minInt": 1, + "negPre": "-", + "negSuf": "", + "posPre": "", + "posSuf": "" + }, + { + "gSize": 3, + "lgSize": 3, + "macFrac": 0, + "maxFrac": 2, + "minFrac": 2, + "minInt": 1, + "negPre": "-", + "negSuf": "\u00a0\u00a4", + "posPre": "", + "posSuf": "\u00a0\u00a4" + } + ] + }, + "id": "ru-ua", + "pluralCat": function (n) { if (n % 10 == 1 && n % 100 != 11) { return PLURAL_CATEGORY.ONE; } if (n == (n | 0) && n % 10 >= 2 && n % 10 <= 4 && (n % 100 < 12 || n % 100 > 14)) { return PLURAL_CATEGORY.FEW; } if (n % 10 == 0 || n == (n | 0) && n % 10 >= 5 && n % 10 <= 9 || n == (n | 0) && n % 100 >= 11 && n % 100 <= 14) { return PLURAL_CATEGORY.MANY; } return PLURAL_CATEGORY.OTHER;} +}); +}]); \ No newline at end of file diff --git a/src/ngLocale/angular-locale_sr-cyrl-ba.js b/src/ngLocale/angular-locale_sr-cyrl-ba.js new file mode 100644 index 000000000000..9f9cf3c14b8a --- /dev/null +++ b/src/ngLocale/angular-locale_sr-cyrl-ba.js @@ -0,0 +1,99 @@ +'use strict'; +angular.module("ngLocale", [], ["$provide", function($provide) { +var PLURAL_CATEGORY = {ZERO: "zero", ONE: "one", TWO: "two", FEW: "few", MANY: "many", OTHER: "other"}; +$provide.value("$locale", { + "DATETIME_FORMATS": { + "AMPMS": [ + "\u043f\u0440\u0435 \u043f\u043e\u0434\u043d\u0435", + "\u043f\u043e\u043f\u043e\u0434\u043d\u0435" + ], + "DAY": [ + "\u043d\u0435\u0434\u0435\u0459\u0430", + "\u043f\u043e\u043d\u0435\u0434\u0435\u0459\u0430\u043a", + "\u0443\u0442\u043e\u0440\u0430\u043a", + "\u0441\u0440\u0438\u0458\u0435\u0434\u0430", + "\u0447\u0435\u0442\u0432\u0440\u0442\u0430\u043a", + "\u043f\u0435\u0442\u0430\u043a", + "\u0441\u0443\u0431\u043e\u0442\u0430" + ], + "MONTH": [ + "\u0458\u0430\u043d\u0443\u0430\u0440", + "\u0444\u0435\u0431\u0440\u0443\u0430\u0440", + "\u043c\u0430\u0440\u0442", + "\u0430\u043f\u0440\u0438\u043b", + "\u043c\u0430\u0458", + "\u0458\u0443\u043d\u0438", + "\u0458\u0443\u043b\u0438", + "\u0430\u0432\u0433\u0443\u0441\u0442", + "\u0441\u0435\u043f\u0442\u0435\u043c\u0431\u0430\u0440", + "\u043e\u043a\u0442\u043e\u0431\u0430\u0440", + "\u043d\u043e\u0432\u0435\u043c\u0431\u0430\u0440", + "\u0434\u0435\u0446\u0435\u043c\u0431\u0430\u0440" + ], + "SHORTDAY": [ + "\u043d\u0435\u0434", + "\u043f\u043e\u043d", + "\u0443\u0442\u043e", + "\u0441\u0440\u0438", + "\u0447\u0435\u0442", + "\u043f\u0435\u0442", + "\u0441\u0443\u0431" + ], + "SHORTMONTH": [ + "\u0458\u0430\u043d", + "\u0444\u0435\u0431", + "\u043c\u0430\u0440", + "\u0430\u043f\u0440", + "\u043c\u0430\u0458", + "\u0458\u0443\u043d", + "\u0458\u0443\u043b", + "\u0430\u0432\u0433", + "\u0441\u0435\u043f", + "\u043e\u043a\u0442", + "\u043d\u043e\u0432", + "\u0434\u0435\u0446" + ], + "fullDate": "EEEE, dd. MMMM y.", + "longDate": "dd. MMMM y.", + "medium": "yyyy-MM-dd HH:mm:ss", + "mediumDate": "yyyy-MM-dd", + "mediumTime": "HH:mm:ss", + "short": "yy-MM-dd HH:mm", + "shortDate": "yy-MM-dd", + "shortTime": "HH:mm" + }, + "NUMBER_FORMATS": { + "CURRENCY_SYM": "din", + "DECIMAL_SEP": ",", + "GROUP_SEP": ".", + "PATTERNS": [ + { + "gSize": 3, + "lgSize": 3, + "macFrac": 0, + "maxFrac": 3, + "minFrac": 0, + "minInt": 1, + "negPre": "-", + "negSuf": "", + "posPre": "", + "posSuf": "" + }, + { + "gSize": 3, + "lgSize": 3, + "macFrac": 0, + "maxFrac": 2, + "minFrac": 2, + "minInt": 1, + "negPre": "-", + "negSuf": "\u00a0\u00a4", + "posPre": "", + "posSuf": "\u00a0\u00a4" + } + ] + }, + "id": "sr-cyrl-ba", + "pluralCat": function (n) { if (n % 10 == 1 && n % 100 != 11) { return PLURAL_CATEGORY.ONE; } if (n == (n | 0) && n % 10 >= 2 && n % 10 <= 4 && (n % 100 < 12 || n % 100 > 14)) { return PLURAL_CATEGORY.FEW; } if (n % 10 == 0 || n == (n | 0) && n % 10 >= 5 && n % 10 <= 9 || n == (n | 0) && n % 100 >= 11 && n % 100 <= 14) { return PLURAL_CATEGORY.MANY; } return PLURAL_CATEGORY.OTHER;} +}); +}]); \ No newline at end of file diff --git a/src/ngLocale/angular-locale_sr-cyrl-me.js b/src/ngLocale/angular-locale_sr-cyrl-me.js new file mode 100644 index 000000000000..bf5d9e062d6c --- /dev/null +++ b/src/ngLocale/angular-locale_sr-cyrl-me.js @@ -0,0 +1,99 @@ +'use strict'; +angular.module("ngLocale", [], ["$provide", function($provide) { +var PLURAL_CATEGORY = {ZERO: "zero", ONE: "one", TWO: "two", FEW: "few", MANY: "many", OTHER: "other"}; +$provide.value("$locale", { + "DATETIME_FORMATS": { + "AMPMS": [ + "\u043f\u0440\u0435 \u043f\u043e\u0434\u043d\u0435", + "\u043f\u043e\u043f\u043e\u0434\u043d\u0435" + ], + "DAY": [ + "\u043d\u0435\u0434\u0435\u0459\u0430", + "\u043f\u043e\u043d\u0435\u0434\u0435\u0459\u0430\u043a", + "\u0443\u0442\u043e\u0440\u0430\u043a", + "\u0441\u0440\u0435\u0434\u0430", + "\u0447\u0435\u0442\u0432\u0440\u0442\u0430\u043a", + "\u043f\u0435\u0442\u0430\u043a", + "\u0441\u0443\u0431\u043e\u0442\u0430" + ], + "MONTH": [ + "\u0458\u0430\u043d\u0443\u0430\u0440", + "\u0444\u0435\u0431\u0440\u0443\u0430\u0440", + "\u043c\u0430\u0440\u0442", + "\u0430\u043f\u0440\u0438\u043b", + "\u043c\u0430\u0458", + "\u0458\u0443\u043d", + "\u0458\u0443\u043b", + "\u0430\u0432\u0433\u0443\u0441\u0442", + "\u0441\u0435\u043f\u0442\u0435\u043c\u0431\u0430\u0440", + "\u043e\u043a\u0442\u043e\u0431\u0430\u0440", + "\u043d\u043e\u0432\u0435\u043c\u0431\u0430\u0440", + "\u0434\u0435\u0446\u0435\u043c\u0431\u0430\u0440" + ], + "SHORTDAY": [ + "\u043d\u0435\u0434", + "\u043f\u043e\u043d", + "\u0443\u0442\u043e", + "\u0441\u0440\u0435", + "\u0447\u0435\u0442", + "\u043f\u0435\u0442", + "\u0441\u0443\u0431" + ], + "SHORTMONTH": [ + "\u0458\u0430\u043d", + "\u0444\u0435\u0431", + "\u043c\u0430\u0440", + "\u0430\u043f\u0440", + "\u043c\u0430\u0458", + "\u0458\u0443\u043d", + "\u0458\u0443\u043b", + "\u0430\u0432\u0433", + "\u0441\u0435\u043f", + "\u043e\u043a\u0442", + "\u043d\u043e\u0432", + "\u0434\u0435\u0446" + ], + "fullDate": "EEEE, dd. MMMM y.", + "longDate": "dd. MMMM y.", + "medium": "dd.MM.y. HH.mm.ss", + "mediumDate": "dd.MM.y.", + "mediumTime": "HH.mm.ss", + "short": "d.M.yy. HH.mm", + "shortDate": "d.M.yy.", + "shortTime": "HH.mm" + }, + "NUMBER_FORMATS": { + "CURRENCY_SYM": "din", + "DECIMAL_SEP": ",", + "GROUP_SEP": ".", + "PATTERNS": [ + { + "gSize": 3, + "lgSize": 3, + "macFrac": 0, + "maxFrac": 3, + "minFrac": 0, + "minInt": 1, + "negPre": "-", + "negSuf": "", + "posPre": "", + "posSuf": "" + }, + { + "gSize": 3, + "lgSize": 3, + "macFrac": 0, + "maxFrac": 2, + "minFrac": 2, + "minInt": 1, + "negPre": "-", + "negSuf": "\u00a0\u00a4", + "posPre": "", + "posSuf": "\u00a0\u00a4" + } + ] + }, + "id": "sr-cyrl-me", + "pluralCat": function (n) { if (n % 10 == 1 && n % 100 != 11) { return PLURAL_CATEGORY.ONE; } if (n == (n | 0) && n % 10 >= 2 && n % 10 <= 4 && (n % 100 < 12 || n % 100 > 14)) { return PLURAL_CATEGORY.FEW; } if (n % 10 == 0 || n == (n | 0) && n % 10 >= 5 && n % 10 <= 9 || n == (n | 0) && n % 100 >= 11 && n % 100 <= 14) { return PLURAL_CATEGORY.MANY; } return PLURAL_CATEGORY.OTHER;} +}); +}]); \ No newline at end of file diff --git a/src/ngLocale/angular-locale_sr-cyrl.js b/src/ngLocale/angular-locale_sr-cyrl.js new file mode 100644 index 000000000000..df0cd5879787 --- /dev/null +++ b/src/ngLocale/angular-locale_sr-cyrl.js @@ -0,0 +1,99 @@ +'use strict'; +angular.module("ngLocale", [], ["$provide", function($provide) { +var PLURAL_CATEGORY = {ZERO: "zero", ONE: "one", TWO: "two", FEW: "few", MANY: "many", OTHER: "other"}; +$provide.value("$locale", { + "DATETIME_FORMATS": { + "AMPMS": [ + "\u043f\u0440\u0435 \u043f\u043e\u0434\u043d\u0435", + "\u043f\u043e\u043f\u043e\u0434\u043d\u0435" + ], + "DAY": [ + "\u043d\u0435\u0434\u0435\u0459\u0430", + "\u043f\u043e\u043d\u0435\u0434\u0435\u0459\u0430\u043a", + "\u0443\u0442\u043e\u0440\u0430\u043a", + "\u0441\u0440\u0435\u0434\u0430", + "\u0447\u0435\u0442\u0432\u0440\u0442\u0430\u043a", + "\u043f\u0435\u0442\u0430\u043a", + "\u0441\u0443\u0431\u043e\u0442\u0430" + ], + "MONTH": [ + "\u0458\u0430\u043d\u0443\u0430\u0440", + "\u0444\u0435\u0431\u0440\u0443\u0430\u0440", + "\u043c\u0430\u0440\u0442", + "\u0430\u043f\u0440\u0438\u043b", + "\u043c\u0430\u0458", + "\u0458\u0443\u043d", + "\u0458\u0443\u043b", + "\u0430\u0432\u0433\u0443\u0441\u0442", + "\u0441\u0435\u043f\u0442\u0435\u043c\u0431\u0430\u0440", + "\u043e\u043a\u0442\u043e\u0431\u0430\u0440", + "\u043d\u043e\u0432\u0435\u043c\u0431\u0430\u0440", + "\u0434\u0435\u0446\u0435\u043c\u0431\u0430\u0440" + ], + "SHORTDAY": [ + "\u043d\u0435\u0434", + "\u043f\u043e\u043d", + "\u0443\u0442\u043e", + "\u0441\u0440\u0435", + "\u0447\u0435\u0442", + "\u043f\u0435\u0442", + "\u0441\u0443\u0431" + ], + "SHORTMONTH": [ + "\u0458\u0430\u043d", + "\u0444\u0435\u0431", + "\u043c\u0430\u0440", + "\u0430\u043f\u0440", + "\u043c\u0430\u0458", + "\u0458\u0443\u043d", + "\u0458\u0443\u043b", + "\u0430\u0432\u0433", + "\u0441\u0435\u043f", + "\u043e\u043a\u0442", + "\u043d\u043e\u0432", + "\u0434\u0435\u0446" + ], + "fullDate": "EEEE, dd. MMMM y.", + "longDate": "dd. MMMM y.", + "medium": "dd.MM.y. HH.mm.ss", + "mediumDate": "dd.MM.y.", + "mediumTime": "HH.mm.ss", + "short": "d.M.yy. HH.mm", + "shortDate": "d.M.yy.", + "shortTime": "HH.mm" + }, + "NUMBER_FORMATS": { + "CURRENCY_SYM": "din", + "DECIMAL_SEP": ",", + "GROUP_SEP": ".", + "PATTERNS": [ + { + "gSize": 3, + "lgSize": 3, + "macFrac": 0, + "maxFrac": 3, + "minFrac": 0, + "minInt": 1, + "negPre": "-", + "negSuf": "", + "posPre": "", + "posSuf": "" + }, + { + "gSize": 3, + "lgSize": 3, + "macFrac": 0, + "maxFrac": 2, + "minFrac": 2, + "minInt": 1, + "negPre": "-", + "negSuf": "\u00a0\u00a4", + "posPre": "", + "posSuf": "\u00a0\u00a4" + } + ] + }, + "id": "sr-cyrl", + "pluralCat": function (n) { if (n % 10 == 1 && n % 100 != 11) { return PLURAL_CATEGORY.ONE; } if (n == (n | 0) && n % 10 >= 2 && n % 10 <= 4 && (n % 100 < 12 || n % 100 > 14)) { return PLURAL_CATEGORY.FEW; } if (n % 10 == 0 || n == (n | 0) && n % 10 >= 5 && n % 10 <= 9 || n == (n | 0) && n % 100 >= 11 && n % 100 <= 14) { return PLURAL_CATEGORY.MANY; } return PLURAL_CATEGORY.OTHER;} +}); +}]); \ No newline at end of file diff --git a/src/ngLocale/angular-locale_sr-latn-ba.js b/src/ngLocale/angular-locale_sr-latn-ba.js new file mode 100644 index 000000000000..dae6550d63e4 --- /dev/null +++ b/src/ngLocale/angular-locale_sr-latn-ba.js @@ -0,0 +1,99 @@ +'use strict'; +angular.module("ngLocale", [], ["$provide", function($provide) { +var PLURAL_CATEGORY = {ZERO: "zero", ONE: "one", TWO: "two", FEW: "few", MANY: "many", OTHER: "other"}; +$provide.value("$locale", { + "DATETIME_FORMATS": { + "AMPMS": [ + "pre podne", + "popodne" + ], + "DAY": [ + "nedelja", + "ponedeljak", + "utorak", + "sreda", + "\u010detvrtak", + "petak", + "subota" + ], + "MONTH": [ + "januar", + "februar", + "mart", + "april", + "maj", + "jun", + "jul", + "avgust", + "septembar", + "oktobar", + "novembar", + "decembar" + ], + "SHORTDAY": [ + "ned", + "pon", + "uto", + "sre", + "\u010det", + "pet", + "sub" + ], + "SHORTMONTH": [ + "jan", + "feb", + "mar", + "apr", + "maj", + "jun", + "jul", + "avg", + "sep", + "okt", + "nov", + "dec" + ], + "fullDate": "EEEE, dd. MMMM y.", + "longDate": "dd. MMMM y.", + "medium": "dd.MM.y. HH.mm.ss", + "mediumDate": "dd.MM.y.", + "mediumTime": "HH.mm.ss", + "short": "d.M.yy. HH.mm", + "shortDate": "d.M.yy.", + "shortTime": "HH.mm" + }, + "NUMBER_FORMATS": { + "CURRENCY_SYM": "din", + "DECIMAL_SEP": ",", + "GROUP_SEP": ".", + "PATTERNS": [ + { + "gSize": 3, + "lgSize": 3, + "macFrac": 0, + "maxFrac": 3, + "minFrac": 0, + "minInt": 1, + "negPre": "-", + "negSuf": "", + "posPre": "", + "posSuf": "" + }, + { + "gSize": 3, + "lgSize": 3, + "macFrac": 0, + "maxFrac": 2, + "minFrac": 2, + "minInt": 1, + "negPre": "-", + "negSuf": "\u00a0\u00a4", + "posPre": "", + "posSuf": "\u00a0\u00a4" + } + ] + }, + "id": "sr-latn-ba", + "pluralCat": function (n) { if (n % 10 == 1 && n % 100 != 11) { return PLURAL_CATEGORY.ONE; } if (n == (n | 0) && n % 10 >= 2 && n % 10 <= 4 && (n % 100 < 12 || n % 100 > 14)) { return PLURAL_CATEGORY.FEW; } if (n % 10 == 0 || n == (n | 0) && n % 10 >= 5 && n % 10 <= 9 || n == (n | 0) && n % 100 >= 11 && n % 100 <= 14) { return PLURAL_CATEGORY.MANY; } return PLURAL_CATEGORY.OTHER;} +}); +}]); \ No newline at end of file diff --git a/src/ngLocale/angular-locale_sr-latn-me.js b/src/ngLocale/angular-locale_sr-latn-me.js new file mode 100644 index 000000000000..fad834056ec3 --- /dev/null +++ b/src/ngLocale/angular-locale_sr-latn-me.js @@ -0,0 +1,99 @@ +'use strict'; +angular.module("ngLocale", [], ["$provide", function($provide) { +var PLURAL_CATEGORY = {ZERO: "zero", ONE: "one", TWO: "two", FEW: "few", MANY: "many", OTHER: "other"}; +$provide.value("$locale", { + "DATETIME_FORMATS": { + "AMPMS": [ + "pre podne", + "popodne" + ], + "DAY": [ + "nedelja", + "ponedeljak", + "utorak", + "sreda", + "\u010detvrtak", + "petak", + "subota" + ], + "MONTH": [ + "januar", + "februar", + "mart", + "april", + "maj", + "jun", + "jul", + "avgust", + "septembar", + "oktobar", + "novembar", + "decembar" + ], + "SHORTDAY": [ + "ned", + "pon", + "uto", + "sre", + "\u010det", + "pet", + "sub" + ], + "SHORTMONTH": [ + "jan", + "feb", + "mar", + "apr", + "maj", + "jun", + "jul", + "avg", + "sep", + "okt", + "nov", + "dec" + ], + "fullDate": "EEEE, dd. MMMM y.", + "longDate": "d.MM.yyyy.", + "medium": "dd.MM.y. HH.mm.ss", + "mediumDate": "dd.MM.y.", + "mediumTime": "HH.mm.ss", + "short": "d.M.yy. HH.mm", + "shortDate": "d.M.yy.", + "shortTime": "HH.mm" + }, + "NUMBER_FORMATS": { + "CURRENCY_SYM": "din", + "DECIMAL_SEP": ",", + "GROUP_SEP": ".", + "PATTERNS": [ + { + "gSize": 3, + "lgSize": 3, + "macFrac": 0, + "maxFrac": 3, + "minFrac": 0, + "minInt": 1, + "negPre": "-", + "negSuf": "", + "posPre": "", + "posSuf": "" + }, + { + "gSize": 3, + "lgSize": 3, + "macFrac": 0, + "maxFrac": 2, + "minFrac": 2, + "minInt": 1, + "negPre": "-", + "negSuf": "\u00a0\u00a4", + "posPre": "", + "posSuf": "\u00a0\u00a4" + } + ] + }, + "id": "sr-latn-me", + "pluralCat": function (n) { if (n % 10 == 1 && n % 100 != 11) { return PLURAL_CATEGORY.ONE; } if (n == (n | 0) && n % 10 >= 2 && n % 10 <= 4 && (n % 100 < 12 || n % 100 > 14)) { return PLURAL_CATEGORY.FEW; } if (n % 10 == 0 || n == (n | 0) && n % 10 >= 5 && n % 10 <= 9 || n == (n | 0) && n % 100 >= 11 && n % 100 <= 14) { return PLURAL_CATEGORY.MANY; } return PLURAL_CATEGORY.OTHER;} +}); +}]); \ No newline at end of file diff --git a/src/ngLocale/angular-locale_sr-latn.js b/src/ngLocale/angular-locale_sr-latn.js new file mode 100644 index 000000000000..c2cf55a4eeb4 --- /dev/null +++ b/src/ngLocale/angular-locale_sr-latn.js @@ -0,0 +1,99 @@ +'use strict'; +angular.module("ngLocale", [], ["$provide", function($provide) { +var PLURAL_CATEGORY = {ZERO: "zero", ONE: "one", TWO: "two", FEW: "few", MANY: "many", OTHER: "other"}; +$provide.value("$locale", { + "DATETIME_FORMATS": { + "AMPMS": [ + "pre podne", + "popodne" + ], + "DAY": [ + "nedelja", + "ponedeljak", + "utorak", + "sreda", + "\u010detvrtak", + "petak", + "subota" + ], + "MONTH": [ + "januar", + "februar", + "mart", + "april", + "maj", + "jun", + "jul", + "avgust", + "septembar", + "oktobar", + "novembar", + "decembar" + ], + "SHORTDAY": [ + "ned", + "pon", + "uto", + "sre", + "\u010det", + "pet", + "sub" + ], + "SHORTMONTH": [ + "jan", + "feb", + "mar", + "apr", + "maj", + "jun", + "jul", + "avg", + "sep", + "okt", + "nov", + "dec" + ], + "fullDate": "EEEE, dd. MMMM y.", + "longDate": "dd. MMMM y.", + "medium": "dd.MM.y. HH.mm.ss", + "mediumDate": "dd.MM.y.", + "mediumTime": "HH.mm.ss", + "short": "d.M.yy. HH.mm", + "shortDate": "d.M.yy.", + "shortTime": "HH.mm" + }, + "NUMBER_FORMATS": { + "CURRENCY_SYM": "din", + "DECIMAL_SEP": ",", + "GROUP_SEP": ".", + "PATTERNS": [ + { + "gSize": 3, + "lgSize": 3, + "macFrac": 0, + "maxFrac": 3, + "minFrac": 0, + "minInt": 1, + "negPre": "-", + "negSuf": "", + "posPre": "", + "posSuf": "" + }, + { + "gSize": 3, + "lgSize": 3, + "macFrac": 0, + "maxFrac": 2, + "minFrac": 2, + "minInt": 1, + "negPre": "-", + "negSuf": "\u00a0\u00a4", + "posPre": "", + "posSuf": "\u00a0\u00a4" + } + ] + }, + "id": "sr-latn", + "pluralCat": function (n) { if (n % 10 == 1 && n % 100 != 11) { return PLURAL_CATEGORY.ONE; } if (n == (n | 0) && n % 10 >= 2 && n % 10 <= 4 && (n % 100 < 12 || n % 100 > 14)) { return PLURAL_CATEGORY.FEW; } if (n % 10 == 0 || n == (n | 0) && n % 10 >= 5 && n % 10 <= 9 || n == (n | 0) && n % 100 >= 11 && n % 100 <= 14) { return PLURAL_CATEGORY.MANY; } return PLURAL_CATEGORY.OTHER;} +}); +}]); \ No newline at end of file diff --git a/src/ngLocale/angular-locale_sv-fi.js b/src/ngLocale/angular-locale_sv-fi.js new file mode 100644 index 000000000000..cbf71953793c --- /dev/null +++ b/src/ngLocale/angular-locale_sv-fi.js @@ -0,0 +1,99 @@ +'use strict'; +angular.module("ngLocale", [], ["$provide", function($provide) { +var PLURAL_CATEGORY = {ZERO: "zero", ONE: "one", TWO: "two", FEW: "few", MANY: "many", OTHER: "other"}; +$provide.value("$locale", { + "DATETIME_FORMATS": { + "AMPMS": [ + "fm", + "em" + ], + "DAY": [ + "s\u00f6ndag", + "m\u00e5ndag", + "tisdag", + "onsdag", + "torsdag", + "fredag", + "l\u00f6rdag" + ], + "MONTH": [ + "januari", + "februari", + "mars", + "april", + "maj", + "juni", + "juli", + "augusti", + "september", + "oktober", + "november", + "december" + ], + "SHORTDAY": [ + "s\u00f6n", + "m\u00e5n", + "tis", + "ons", + "tors", + "fre", + "l\u00f6r" + ], + "SHORTMONTH": [ + "jan", + "feb", + "mar", + "apr", + "maj", + "jun", + "jul", + "aug", + "sep", + "okt", + "nov", + "dec" + ], + "fullDate": "EEEE'en' 'den' d:'e' MMMM y", + "longDate": "d MMMM y", + "medium": "d MMM y HH:mm:ss", + "mediumDate": "d MMM y", + "mediumTime": "HH:mm:ss", + "short": "yyyy-MM-dd HH:mm", + "shortDate": "yyyy-MM-dd", + "shortTime": "HH:mm" + }, + "NUMBER_FORMATS": { + "CURRENCY_SYM": "kr", + "DECIMAL_SEP": ",", + "GROUP_SEP": "\u00a0", + "PATTERNS": [ + { + "gSize": 3, + "lgSize": 3, + "macFrac": 0, + "maxFrac": 3, + "minFrac": 0, + "minInt": 1, + "negPre": "-", + "negSuf": "", + "posPre": "", + "posSuf": "" + }, + { + "gSize": 3, + "lgSize": 3, + "macFrac": 0, + "maxFrac": 2, + "minFrac": 2, + "minInt": 1, + "negPre": "-", + "negSuf": "\u00a0\u00a4", + "posPre": "", + "posSuf": "\u00a0\u00a4" + } + ] + }, + "id": "sv-fi", + "pluralCat": function (n) { if (n == 1) { return PLURAL_CATEGORY.ONE; } return PLURAL_CATEGORY.OTHER;} +}); +}]); \ No newline at end of file diff --git a/src/ngLocale/angular-locale_sw-ke.js b/src/ngLocale/angular-locale_sw-ke.js new file mode 100644 index 000000000000..0d4ad4d8fba8 --- /dev/null +++ b/src/ngLocale/angular-locale_sw-ke.js @@ -0,0 +1,99 @@ +'use strict'; +angular.module("ngLocale", [], ["$provide", function($provide) { +var PLURAL_CATEGORY = {ZERO: "zero", ONE: "one", TWO: "two", FEW: "few", MANY: "many", OTHER: "other"}; +$provide.value("$locale", { + "DATETIME_FORMATS": { + "AMPMS": [ + "asubuhi", + "alasiri" + ], + "DAY": [ + "Jumapili", + "Jumatatu", + "Jumanne", + "Jumatano", + "Alhamisi", + "Ijumaa", + "Jumamosi" + ], + "MONTH": [ + "Januari", + "Februari", + "Machi", + "Aprili", + "Mei", + "Juni", + "Julai", + "Agosti", + "Septemba", + "Oktoba", + "Novemba", + "Desemba" + ], + "SHORTDAY": [ + "J2", + "J3", + "J4", + "J5", + "Alh", + "Ij", + "J1" + ], + "SHORTMONTH": [ + "Jan", + "Feb", + "Mac", + "Apr", + "Mei", + "Jun", + "Jul", + "Ago", + "Sep", + "Okt", + "Nov", + "Des" + ], + "fullDate": "EEEE, d MMMM y", + "longDate": "d MMMM y", + "medium": "d MMM y h:mm:ss a", + "mediumDate": "d MMM y", + "mediumTime": "h:mm:ss a", + "short": "dd/MM/yyyy h:mm a", + "shortDate": "dd/MM/yyyy", + "shortTime": "h:mm a" + }, + "NUMBER_FORMATS": { + "CURRENCY_SYM": "TSh", + "DECIMAL_SEP": ".", + "GROUP_SEP": ",", + "PATTERNS": [ + { + "gSize": 3, + "lgSize": 3, + "macFrac": 0, + "maxFrac": 3, + "minFrac": 0, + "minInt": 1, + "negPre": "-", + "negSuf": "", + "posPre": "", + "posSuf": "" + }, + { + "gSize": 3, + "lgSize": 3, + "macFrac": 0, + "maxFrac": 2, + "minFrac": 2, + "minInt": 1, + "negPre": "(\u00a4", + "negSuf": ")", + "posPre": "\u00a4", + "posSuf": "" + } + ] + }, + "id": "sw-ke", + "pluralCat": function (n) { if (n == 1) { return PLURAL_CATEGORY.ONE; } return PLURAL_CATEGORY.OTHER;} +}); +}]); \ No newline at end of file diff --git a/src/ngLocale/angular-locale_ta-lk.js b/src/ngLocale/angular-locale_ta-lk.js new file mode 100644 index 000000000000..2d661c837031 --- /dev/null +++ b/src/ngLocale/angular-locale_ta-lk.js @@ -0,0 +1,99 @@ +'use strict'; +angular.module("ngLocale", [], ["$provide", function($provide) { +var PLURAL_CATEGORY = {ZERO: "zero", ONE: "one", TWO: "two", FEW: "few", MANY: "many", OTHER: "other"}; +$provide.value("$locale", { + "DATETIME_FORMATS": { + "AMPMS": [ + "am", + "pm" + ], + "DAY": [ + "\u0b9e\u0bbe\u0baf\u0bbf\u0bb1\u0bc1", + "\u0ba4\u0bbf\u0b99\u0bcd\u0b95\u0bb3\u0bcd", + "\u0b9a\u0bc6\u0bb5\u0bcd\u0bb5\u0bbe\u0baf\u0bcd", + "\u0baa\u0bc1\u0ba4\u0ba9\u0bcd", + "\u0bb5\u0bbf\u0baf\u0bbe\u0bb4\u0ba9\u0bcd", + "\u0bb5\u0bc6\u0bb3\u0bcd\u0bb3\u0bbf", + "\u0b9a\u0ba9\u0bbf" + ], + "MONTH": [ + "\u0b9c\u0ba9\u0bb5\u0bb0\u0bbf", + "\u0baa\u0bbf\u0baa\u0bcd\u0bb0\u0bb5\u0bb0\u0bbf", + "\u0bae\u0bbe\u0bb0\u0bcd\u0b9a\u0bcd", + "\u0b8f\u0baa\u0bcd\u0bb0\u0bb2\u0bcd", + "\u0bae\u0bc7", + "\u0b9c\u0bc2\u0ba9\u0bcd", + "\u0b9c\u0bc2\u0bb2\u0bc8", + "\u0b86\u0b95\u0bb8\u0bcd\u0b9f\u0bcd", + "\u0b9a\u0bc6\u0baa\u0bcd\u0b9f\u0bae\u0bcd\u0baa\u0bb0\u0bcd", + "\u0b85\u0b95\u0bcd\u0b9f\u0bcb\u0baa\u0bb0\u0bcd", + "\u0ba8\u0bb5\u0bae\u0bcd\u0baa\u0bb0\u0bcd", + "\u0b9f\u0bbf\u0b9a\u0bae\u0bcd\u0baa\u0bb0\u0bcd" + ], + "SHORTDAY": [ + "\u0b9e\u0bbe", + "\u0ba4\u0bbf", + "\u0b9a\u0bc6", + "\u0baa\u0bc1", + "\u0bb5\u0bbf", + "\u0bb5\u0bc6", + "\u0b9a" + ], + "SHORTMONTH": [ + "\u0b9c\u0ba9.", + "\u0baa\u0bbf\u0baa\u0bcd.", + "\u0bae\u0bbe\u0bb0\u0bcd.", + "\u0b8f\u0baa\u0bcd.", + "\u0bae\u0bc7", + "\u0b9c\u0bc2\u0ba9\u0bcd", + "\u0b9c\u0bc2\u0bb2\u0bc8", + "\u0b86\u0b95.", + "\u0b9a\u0bc6\u0baa\u0bcd.", + "\u0b85\u0b95\u0bcd.", + "\u0ba8\u0bb5.", + "\u0b9f\u0bbf\u0b9a." + ], + "fullDate": "EEEE, d MMMM, y", + "longDate": "d MMMM, y", + "medium": "d MMM, y h:mm:ss a", + "mediumDate": "d MMM, y", + "mediumTime": "h:mm:ss a", + "short": "d-M-yy h:mm a", + "shortDate": "d-M-yy", + "shortTime": "h:mm a" + }, + "NUMBER_FORMATS": { + "CURRENCY_SYM": "\u20b9", + "DECIMAL_SEP": ".", + "GROUP_SEP": ",", + "PATTERNS": [ + { + "gSize": 2, + "lgSize": 3, + "macFrac": 0, + "maxFrac": 3, + "minFrac": 0, + "minInt": 1, + "negPre": "-", + "negSuf": "", + "posPre": "", + "posSuf": "" + }, + { + "gSize": 2, + "lgSize": 3, + "macFrac": 0, + "maxFrac": 2, + "minFrac": 2, + "minInt": 1, + "negPre": "\u00a4\u00a0-", + "negSuf": "", + "posPre": "\u00a4\u00a0", + "posSuf": "" + } + ] + }, + "id": "ta-lk", + "pluralCat": function (n) { if (n == 1) { return PLURAL_CATEGORY.ONE; } return PLURAL_CATEGORY.OTHER;} +}); +}]); \ No newline at end of file diff --git a/src/ngLocale/angular-locale_ur-in.js b/src/ngLocale/angular-locale_ur-in.js new file mode 100644 index 000000000000..c501be6fc7a6 --- /dev/null +++ b/src/ngLocale/angular-locale_ur-in.js @@ -0,0 +1,99 @@ +'use strict'; +angular.module("ngLocale", [], ["$provide", function($provide) { +var PLURAL_CATEGORY = {ZERO: "zero", ONE: "one", TWO: "two", FEW: "few", MANY: "many", OTHER: "other"}; +$provide.value("$locale", { + "DATETIME_FORMATS": { + "AMPMS": [ + "\u062f\u0646", + "\u0631\u0627\u062a" + ], + "DAY": [ + "\u0627\u062a\u0648\u0627\u0631", + "\u067e\u064a\u0631", + "\u0645\u0646\u06af\u0644", + "\u0628\u062f\u0647", + "\u062c\u0645\u0639\u0631\u0627\u062a", + "\u062c\u0645\u0639\u06c1", + "\u06c1\u0641\u062a\u06c1" + ], + "MONTH": [ + "\u062c\u0646\u0648\u0631\u06cc", + "\u0641\u0631\u0648\u0631\u06cc", + "\u0645\u0627\u0631\u0686", + "\u0627\u067e\u0631\u064a\u0644", + "\u0645\u0626", + "\u062c\u0648\u0646", + "\u062c\u0648\u0644\u0627\u0626", + "\u0627\u06af\u0633\u062a", + "\u0633\u062a\u0645\u0628\u0631", + "\u0627\u06a9\u062a\u0648\u0628\u0631", + "\u0646\u0648\u0645\u0628\u0631", + "\u062f\u0633\u0645\u0628\u0631" + ], + "SHORTDAY": [ + "\u0627\u062a\u0648\u0627\u0631", + "\u067e\u064a\u0631", + "\u0645\u0646\u06af\u0644", + "\u0628\u062f\u0647", + "\u062c\u0645\u0639\u0631\u0627\u062a", + "\u062c\u0645\u0639\u06c1", + "\u06c1\u0641\u062a\u06c1" + ], + "SHORTMONTH": [ + "\u062c\u0646\u0648\u0631\u06cc", + "\u0641\u0631\u0648\u0631\u06cc", + "\u0645\u0627\u0631\u0686", + "\u0627\u067e\u0631\u064a\u0644", + "\u0645\u0626", + "\u062c\u0648\u0646", + "\u062c\u0648\u0644\u0627\u0626", + "\u0627\u06af\u0633\u062a", + "\u0633\u062a\u0645\u0628\u0631", + "\u0627\u06a9\u062a\u0648\u0628\u0631", + "\u0646\u0648\u0645\u0628\u0631", + "\u062f\u0633\u0645\u0628\u0631" + ], + "fullDate": "EEEE\u060d d\u060d MMMM y", + "longDate": "d\u060d MMMM y", + "medium": "d\u060d MMM y h:mm:ss a", + "mediumDate": "d\u060d MMM y", + "mediumTime": "h:mm:ss a", + "short": "d/M/yy h:mm a", + "shortDate": "d/M/yy", + "shortTime": "h:mm a" + }, + "NUMBER_FORMATS": { + "CURRENCY_SYM": "Rs", + "DECIMAL_SEP": ".", + "GROUP_SEP": ",", + "PATTERNS": [ + { + "gSize": 3, + "lgSize": 3, + "macFrac": 0, + "maxFrac": 3, + "minFrac": 0, + "minInt": 1, + "negPre": "-", + "negSuf": "", + "posPre": "", + "posSuf": "" + }, + { + "gSize": 3, + "lgSize": 3, + "macFrac": 0, + "maxFrac": 2, + "minFrac": 2, + "minInt": 1, + "negPre": "\u00a4-", + "negSuf": "", + "posPre": "\u00a4", + "posSuf": "" + } + ] + }, + "id": "ur-in", + "pluralCat": function (n) { if (n == 1) { return PLURAL_CATEGORY.ONE; } return PLURAL_CATEGORY.OTHER;} +}); +}]); \ No newline at end of file diff --git a/src/ngLocale/angular-locale_zh-hans-hk.js b/src/ngLocale/angular-locale_zh-hans-hk.js new file mode 100644 index 000000000000..079fddea09a2 --- /dev/null +++ b/src/ngLocale/angular-locale_zh-hans-hk.js @@ -0,0 +1,99 @@ +'use strict'; +angular.module("ngLocale", [], ["$provide", function($provide) { +var PLURAL_CATEGORY = {ZERO: "zero", ONE: "one", TWO: "two", FEW: "few", MANY: "many", OTHER: "other"}; +$provide.value("$locale", { + "DATETIME_FORMATS": { + "AMPMS": [ + "\u4e0a\u5348", + "\u4e0b\u5348" + ], + "DAY": [ + "\u661f\u671f\u65e5", + "\u661f\u671f\u4e00", + "\u661f\u671f\u4e8c", + "\u661f\u671f\u4e09", + "\u661f\u671f\u56db", + "\u661f\u671f\u4e94", + "\u661f\u671f\u516d" + ], + "MONTH": [ + "\u4e00\u6708", + "\u4e8c\u6708", + "\u4e09\u6708", + "\u56db\u6708", + "\u4e94\u6708", + "\u516d\u6708", + "\u4e03\u6708", + "\u516b\u6708", + "\u4e5d\u6708", + "\u5341\u6708", + "\u5341\u4e00\u6708", + "\u5341\u4e8c\u6708" + ], + "SHORTDAY": [ + "\u5468\u65e5", + "\u5468\u4e00", + "\u5468\u4e8c", + "\u5468\u4e09", + "\u5468\u56db", + "\u5468\u4e94", + "\u5468\u516d" + ], + "SHORTMONTH": [ + "1\u6708", + "2\u6708", + "3\u6708", + "4\u6708", + "5\u6708", + "6\u6708", + "7\u6708", + "8\u6708", + "9\u6708", + "10\u6708", + "11\u6708", + "12\u6708" + ], + "fullDate": "y\u5e74M\u6708d\u65e5EEEE", + "longDate": "y\u5e74M\u6708d\u65e5", + "medium": "y\u5e74M\u6708d\u65e5 ah:mm:ss", + "mediumDate": "y\u5e74M\u6708d\u65e5", + "mediumTime": "ah:mm:ss", + "short": "d/M/yy ah:mm", + "shortDate": "d/M/yy", + "shortTime": "ah:mm" + }, + "NUMBER_FORMATS": { + "CURRENCY_SYM": "\u00a5", + "DECIMAL_SEP": ".", + "GROUP_SEP": ",", + "PATTERNS": [ + { + "gSize": 3, + "lgSize": 3, + "macFrac": 0, + "maxFrac": 3, + "minFrac": 0, + "minInt": 1, + "negPre": "-", + "negSuf": "", + "posPre": "", + "posSuf": "" + }, + { + "gSize": 3, + "lgSize": 3, + "macFrac": 0, + "maxFrac": 2, + "minFrac": 2, + "minInt": 1, + "negPre": "(\u00a4", + "negSuf": ")", + "posPre": "\u00a4", + "posSuf": "" + } + ] + }, + "id": "zh-hans-hk", + "pluralCat": function (n) { return PLURAL_CATEGORY.OTHER;} +}); +}]); \ No newline at end of file diff --git a/src/ngLocale/angular-locale_zh-hans-mo.js b/src/ngLocale/angular-locale_zh-hans-mo.js new file mode 100644 index 000000000000..4e93003d11bf --- /dev/null +++ b/src/ngLocale/angular-locale_zh-hans-mo.js @@ -0,0 +1,99 @@ +'use strict'; +angular.module("ngLocale", [], ["$provide", function($provide) { +var PLURAL_CATEGORY = {ZERO: "zero", ONE: "one", TWO: "two", FEW: "few", MANY: "many", OTHER: "other"}; +$provide.value("$locale", { + "DATETIME_FORMATS": { + "AMPMS": [ + "\u4e0a\u5348", + "\u4e0b\u5348" + ], + "DAY": [ + "\u661f\u671f\u65e5", + "\u661f\u671f\u4e00", + "\u661f\u671f\u4e8c", + "\u661f\u671f\u4e09", + "\u661f\u671f\u56db", + "\u661f\u671f\u4e94", + "\u661f\u671f\u516d" + ], + "MONTH": [ + "\u4e00\u6708", + "\u4e8c\u6708", + "\u4e09\u6708", + "\u56db\u6708", + "\u4e94\u6708", + "\u516d\u6708", + "\u4e03\u6708", + "\u516b\u6708", + "\u4e5d\u6708", + "\u5341\u6708", + "\u5341\u4e00\u6708", + "\u5341\u4e8c\u6708" + ], + "SHORTDAY": [ + "\u5468\u65e5", + "\u5468\u4e00", + "\u5468\u4e8c", + "\u5468\u4e09", + "\u5468\u56db", + "\u5468\u4e94", + "\u5468\u516d" + ], + "SHORTMONTH": [ + "1\u6708", + "2\u6708", + "3\u6708", + "4\u6708", + "5\u6708", + "6\u6708", + "7\u6708", + "8\u6708", + "9\u6708", + "10\u6708", + "11\u6708", + "12\u6708" + ], + "fullDate": "y\u5e74M\u6708d\u65e5EEEE", + "longDate": "y\u5e74M\u6708d\u65e5", + "medium": "y\u5e74M\u6708d\u65e5 ah:mm:ss", + "mediumDate": "y\u5e74M\u6708d\u65e5", + "mediumTime": "ah:mm:ss", + "short": "d/M/yy ah:mm", + "shortDate": "d/M/yy", + "shortTime": "ah:mm" + }, + "NUMBER_FORMATS": { + "CURRENCY_SYM": "\u00a5", + "DECIMAL_SEP": ".", + "GROUP_SEP": ",", + "PATTERNS": [ + { + "gSize": 3, + "lgSize": 3, + "macFrac": 0, + "maxFrac": 3, + "minFrac": 0, + "minInt": 1, + "negPre": "-", + "negSuf": "", + "posPre": "", + "posSuf": "" + }, + { + "gSize": 3, + "lgSize": 3, + "macFrac": 0, + "maxFrac": 2, + "minFrac": 2, + "minInt": 1, + "negPre": "(\u00a4", + "negSuf": ")", + "posPre": "\u00a4", + "posSuf": "" + } + ] + }, + "id": "zh-hans-mo", + "pluralCat": function (n) { return PLURAL_CATEGORY.OTHER;} +}); +}]); \ No newline at end of file diff --git a/src/ngLocale/angular-locale_zh-hans-sg.js b/src/ngLocale/angular-locale_zh-hans-sg.js new file mode 100644 index 000000000000..2c2ea98b381e --- /dev/null +++ b/src/ngLocale/angular-locale_zh-hans-sg.js @@ -0,0 +1,99 @@ +'use strict'; +angular.module("ngLocale", [], ["$provide", function($provide) { +var PLURAL_CATEGORY = {ZERO: "zero", ONE: "one", TWO: "two", FEW: "few", MANY: "many", OTHER: "other"}; +$provide.value("$locale", { + "DATETIME_FORMATS": { + "AMPMS": [ + "\u4e0a\u5348", + "\u4e0b\u5348" + ], + "DAY": [ + "\u661f\u671f\u65e5", + "\u661f\u671f\u4e00", + "\u661f\u671f\u4e8c", + "\u661f\u671f\u4e09", + "\u661f\u671f\u56db", + "\u661f\u671f\u4e94", + "\u661f\u671f\u516d" + ], + "MONTH": [ + "\u4e00\u6708", + "\u4e8c\u6708", + "\u4e09\u6708", + "\u56db\u6708", + "\u4e94\u6708", + "\u516d\u6708", + "\u4e03\u6708", + "\u516b\u6708", + "\u4e5d\u6708", + "\u5341\u6708", + "\u5341\u4e00\u6708", + "\u5341\u4e8c\u6708" + ], + "SHORTDAY": [ + "\u5468\u65e5", + "\u5468\u4e00", + "\u5468\u4e8c", + "\u5468\u4e09", + "\u5468\u56db", + "\u5468\u4e94", + "\u5468\u516d" + ], + "SHORTMONTH": [ + "1\u6708", + "2\u6708", + "3\u6708", + "4\u6708", + "5\u6708", + "6\u6708", + "7\u6708", + "8\u6708", + "9\u6708", + "10\u6708", + "11\u6708", + "12\u6708" + ], + "fullDate": "y\u5e74M\u6708d\u65e5EEEE", + "longDate": "y\u5e74M\u6708d\u65e5", + "medium": "y\u5e74M\u6708d\u65e5 ah:mm:ss", + "mediumDate": "y\u5e74M\u6708d\u65e5", + "mediumTime": "ah:mm:ss", + "short": "dd/MM/yy ahh:mm", + "shortDate": "dd/MM/yy", + "shortTime": "ahh:mm" + }, + "NUMBER_FORMATS": { + "CURRENCY_SYM": "\u00a5", + "DECIMAL_SEP": ".", + "GROUP_SEP": ",", + "PATTERNS": [ + { + "gSize": 3, + "lgSize": 3, + "macFrac": 0, + "maxFrac": 3, + "minFrac": 0, + "minInt": 1, + "negPre": "-", + "negSuf": "", + "posPre": "", + "posSuf": "" + }, + { + "gSize": 3, + "lgSize": 3, + "macFrac": 0, + "maxFrac": 2, + "minFrac": 2, + "minInt": 1, + "negPre": "(\u00a4", + "negSuf": ")", + "posPre": "\u00a4", + "posSuf": "" + } + ] + }, + "id": "zh-hans-sg", + "pluralCat": function (n) { return PLURAL_CATEGORY.OTHER;} +}); +}]); \ No newline at end of file diff --git a/src/ngLocale/angular-locale_zh-hans.js b/src/ngLocale/angular-locale_zh-hans.js new file mode 100644 index 000000000000..5c76da0ed05a --- /dev/null +++ b/src/ngLocale/angular-locale_zh-hans.js @@ -0,0 +1,99 @@ +'use strict'; +angular.module("ngLocale", [], ["$provide", function($provide) { +var PLURAL_CATEGORY = {ZERO: "zero", ONE: "one", TWO: "two", FEW: "few", MANY: "many", OTHER: "other"}; +$provide.value("$locale", { + "DATETIME_FORMATS": { + "AMPMS": [ + "\u4e0a\u5348", + "\u4e0b\u5348" + ], + "DAY": [ + "\u661f\u671f\u65e5", + "\u661f\u671f\u4e00", + "\u661f\u671f\u4e8c", + "\u661f\u671f\u4e09", + "\u661f\u671f\u56db", + "\u661f\u671f\u4e94", + "\u661f\u671f\u516d" + ], + "MONTH": [ + "1\u6708", + "2\u6708", + "3\u6708", + "4\u6708", + "5\u6708", + "6\u6708", + "7\u6708", + "8\u6708", + "9\u6708", + "10\u6708", + "11\u6708", + "12\u6708" + ], + "SHORTDAY": [ + "\u5468\u65e5", + "\u5468\u4e00", + "\u5468\u4e8c", + "\u5468\u4e09", + "\u5468\u56db", + "\u5468\u4e94", + "\u5468\u516d" + ], + "SHORTMONTH": [ + "1\u6708", + "2\u6708", + "3\u6708", + "4\u6708", + "5\u6708", + "6\u6708", + "7\u6708", + "8\u6708", + "9\u6708", + "10\u6708", + "11\u6708", + "12\u6708" + ], + "fullDate": "y\u5e74M\u6708d\u65e5EEEE", + "longDate": "y\u5e74M\u6708d\u65e5", + "medium": "yyyy-M-d ah:mm:ss", + "mediumDate": "yyyy-M-d", + "mediumTime": "ah:mm:ss", + "short": "yy-M-d ah:mm", + "shortDate": "yy-M-d", + "shortTime": "ah:mm" + }, + "NUMBER_FORMATS": { + "CURRENCY_SYM": "\u00a5", + "DECIMAL_SEP": ".", + "GROUP_SEP": ",", + "PATTERNS": [ + { + "gSize": 3, + "lgSize": 3, + "macFrac": 0, + "maxFrac": 3, + "minFrac": 0, + "minInt": 1, + "negPre": "-", + "negSuf": "", + "posPre": "", + "posSuf": "" + }, + { + "gSize": 3, + "lgSize": 3, + "macFrac": 0, + "maxFrac": 2, + "minFrac": 2, + "minInt": 1, + "negPre": "(\u00a4", + "negSuf": ")", + "posPre": "\u00a4", + "posSuf": "" + } + ] + }, + "id": "zh-hans", + "pluralCat": function (n) { return PLURAL_CATEGORY.OTHER;} +}); +}]); \ No newline at end of file diff --git a/src/ngLocale/angular-locale_zh-hant-hk.js b/src/ngLocale/angular-locale_zh-hant-hk.js new file mode 100644 index 000000000000..822a17ba9233 --- /dev/null +++ b/src/ngLocale/angular-locale_zh-hant-hk.js @@ -0,0 +1,99 @@ +'use strict'; +angular.module("ngLocale", [], ["$provide", function($provide) { +var PLURAL_CATEGORY = {ZERO: "zero", ONE: "one", TWO: "two", FEW: "few", MANY: "many", OTHER: "other"}; +$provide.value("$locale", { + "DATETIME_FORMATS": { + "AMPMS": [ + "\u4e0a\u5348", + "\u4e0b\u5348" + ], + "DAY": [ + "\u661f\u671f\u65e5", + "\u661f\u671f\u4e00", + "\u661f\u671f\u4e8c", + "\u661f\u671f\u4e09", + "\u661f\u671f\u56db", + "\u661f\u671f\u4e94", + "\u661f\u671f\u516d" + ], + "MONTH": [ + "1\u6708", + "2\u6708", + "3\u6708", + "4\u6708", + "5\u6708", + "6\u6708", + "7\u6708", + "8\u6708", + "9\u6708", + "10\u6708", + "11\u6708", + "12\u6708" + ], + "SHORTDAY": [ + "\u9031\u65e5", + "\u9031\u4e00", + "\u9031\u4e8c", + "\u9031\u4e09", + "\u9031\u56db", + "\u9031\u4e94", + "\u9031\u516d" + ], + "SHORTMONTH": [ + "1\u6708", + "2\u6708", + "3\u6708", + "4\u6708", + "5\u6708", + "6\u6708", + "7\u6708", + "8\u6708", + "9\u6708", + "10\u6708", + "11\u6708", + "12\u6708" + ], + "fullDate": "y\u5e74M\u6708d\u65e5EEEE", + "longDate": "y\u5e74M\u6708d\u65e5", + "medium": "y\u5e74M\u6708d\u65e5 ahh:mm:ss", + "mediumDate": "y\u5e74M\u6708d\u65e5", + "mediumTime": "ahh:mm:ss", + "short": "yy\u5e74M\u6708d\u65e5 ah:mm", + "shortDate": "yy\u5e74M\u6708d\u65e5", + "shortTime": "ah:mm" + }, + "NUMBER_FORMATS": { + "CURRENCY_SYM": "\u00a5", + "DECIMAL_SEP": ".", + "GROUP_SEP": ",", + "PATTERNS": [ + { + "gSize": 3, + "lgSize": 3, + "macFrac": 0, + "maxFrac": 3, + "minFrac": 0, + "minInt": 1, + "negPre": "-", + "negSuf": "", + "posPre": "", + "posSuf": "" + }, + { + "gSize": 3, + "lgSize": 3, + "macFrac": 0, + "maxFrac": 2, + "minFrac": 2, + "minInt": 1, + "negPre": "(\u00a4", + "negSuf": ")", + "posPre": "\u00a4", + "posSuf": "" + } + ] + }, + "id": "zh-hant-hk", + "pluralCat": function (n) { return PLURAL_CATEGORY.OTHER;} +}); +}]); \ No newline at end of file diff --git a/src/ngLocale/angular-locale_zh-hant-mo.js b/src/ngLocale/angular-locale_zh-hant-mo.js new file mode 100644 index 000000000000..c23d3bc43fb6 --- /dev/null +++ b/src/ngLocale/angular-locale_zh-hant-mo.js @@ -0,0 +1,99 @@ +'use strict'; +angular.module("ngLocale", [], ["$provide", function($provide) { +var PLURAL_CATEGORY = {ZERO: "zero", ONE: "one", TWO: "two", FEW: "few", MANY: "many", OTHER: "other"}; +$provide.value("$locale", { + "DATETIME_FORMATS": { + "AMPMS": [ + "\u4e0a\u5348", + "\u4e0b\u5348" + ], + "DAY": [ + "\u661f\u671f\u65e5", + "\u661f\u671f\u4e00", + "\u661f\u671f\u4e8c", + "\u661f\u671f\u4e09", + "\u661f\u671f\u56db", + "\u661f\u671f\u4e94", + "\u661f\u671f\u516d" + ], + "MONTH": [ + "1\u6708", + "2\u6708", + "3\u6708", + "4\u6708", + "5\u6708", + "6\u6708", + "7\u6708", + "8\u6708", + "9\u6708", + "10\u6708", + "11\u6708", + "12\u6708" + ], + "SHORTDAY": [ + "\u9031\u65e5", + "\u9031\u4e00", + "\u9031\u4e8c", + "\u9031\u4e09", + "\u9031\u56db", + "\u9031\u4e94", + "\u9031\u516d" + ], + "SHORTMONTH": [ + "1\u6708", + "2\u6708", + "3\u6708", + "4\u6708", + "5\u6708", + "6\u6708", + "7\u6708", + "8\u6708", + "9\u6708", + "10\u6708", + "11\u6708", + "12\u6708" + ], + "fullDate": "y\u5e74MM\u6708dd\u65e5EEEE", + "longDate": "y\u5e74MM\u6708dd\u65e5", + "medium": "y\u5e74M\u6708d\u65e5 ahh:mm:ss", + "mediumDate": "y\u5e74M\u6708d\u65e5", + "mediumTime": "ahh:mm:ss", + "short": "yy\u5e74M\u6708d\u65e5 ah:mm", + "shortDate": "yy\u5e74M\u6708d\u65e5", + "shortTime": "ah:mm" + }, + "NUMBER_FORMATS": { + "CURRENCY_SYM": "\u00a5", + "DECIMAL_SEP": ".", + "GROUP_SEP": ",", + "PATTERNS": [ + { + "gSize": 3, + "lgSize": 3, + "macFrac": 0, + "maxFrac": 3, + "minFrac": 0, + "minInt": 1, + "negPre": "-", + "negSuf": "", + "posPre": "", + "posSuf": "" + }, + { + "gSize": 3, + "lgSize": 3, + "macFrac": 0, + "maxFrac": 2, + "minFrac": 2, + "minInt": 1, + "negPre": "(\u00a4", + "negSuf": ")", + "posPre": "\u00a4", + "posSuf": "" + } + ] + }, + "id": "zh-hant-mo", + "pluralCat": function (n) { return PLURAL_CATEGORY.OTHER;} +}); +}]); \ No newline at end of file diff --git a/src/ngLocale/angular-locale_zh-hant-tw.js b/src/ngLocale/angular-locale_zh-hant-tw.js new file mode 100644 index 000000000000..d242f7f179c7 --- /dev/null +++ b/src/ngLocale/angular-locale_zh-hant-tw.js @@ -0,0 +1,99 @@ +'use strict'; +angular.module("ngLocale", [], ["$provide", function($provide) { +var PLURAL_CATEGORY = {ZERO: "zero", ONE: "one", TWO: "two", FEW: "few", MANY: "many", OTHER: "other"}; +$provide.value("$locale", { + "DATETIME_FORMATS": { + "AMPMS": [ + "\u4e0a\u5348", + "\u4e0b\u5348" + ], + "DAY": [ + "\u661f\u671f\u65e5", + "\u661f\u671f\u4e00", + "\u661f\u671f\u4e8c", + "\u661f\u671f\u4e09", + "\u661f\u671f\u56db", + "\u661f\u671f\u4e94", + "\u661f\u671f\u516d" + ], + "MONTH": [ + "1\u6708", + "2\u6708", + "3\u6708", + "4\u6708", + "5\u6708", + "6\u6708", + "7\u6708", + "8\u6708", + "9\u6708", + "10\u6708", + "11\u6708", + "12\u6708" + ], + "SHORTDAY": [ + "\u9031\u65e5", + "\u9031\u4e00", + "\u9031\u4e8c", + "\u9031\u4e09", + "\u9031\u56db", + "\u9031\u4e94", + "\u9031\u516d" + ], + "SHORTMONTH": [ + "1\u6708", + "2\u6708", + "3\u6708", + "4\u6708", + "5\u6708", + "6\u6708", + "7\u6708", + "8\u6708", + "9\u6708", + "10\u6708", + "11\u6708", + "12\u6708" + ], + "fullDate": "y\u5e74M\u6708d\u65e5EEEE", + "longDate": "y\u5e74M\u6708d\u65e5", + "medium": "yyyy/M/d ah:mm:ss", + "mediumDate": "yyyy/M/d", + "mediumTime": "ah:mm:ss", + "short": "y/M/d ah:mm", + "shortDate": "y/M/d", + "shortTime": "ah:mm" + }, + "NUMBER_FORMATS": { + "CURRENCY_SYM": "\u00a5", + "DECIMAL_SEP": ".", + "GROUP_SEP": ",", + "PATTERNS": [ + { + "gSize": 3, + "lgSize": 3, + "macFrac": 0, + "maxFrac": 3, + "minFrac": 0, + "minInt": 1, + "negPre": "-", + "negSuf": "", + "posPre": "", + "posSuf": "" + }, + { + "gSize": 3, + "lgSize": 3, + "macFrac": 0, + "maxFrac": 2, + "minFrac": 2, + "minInt": 1, + "negPre": "(\u00a4", + "negSuf": ")", + "posPre": "\u00a4", + "posSuf": "" + } + ] + }, + "id": "zh-hant-tw", + "pluralCat": function (n) { return PLURAL_CATEGORY.OTHER;} +}); +}]); \ No newline at end of file diff --git a/src/ngLocale/angular-locale_zh-hant.js b/src/ngLocale/angular-locale_zh-hant.js new file mode 100644 index 000000000000..f721f684b6f4 --- /dev/null +++ b/src/ngLocale/angular-locale_zh-hant.js @@ -0,0 +1,99 @@ +'use strict'; +angular.module("ngLocale", [], ["$provide", function($provide) { +var PLURAL_CATEGORY = {ZERO: "zero", ONE: "one", TWO: "two", FEW: "few", MANY: "many", OTHER: "other"}; +$provide.value("$locale", { + "DATETIME_FORMATS": { + "AMPMS": [ + "\u4e0a\u5348", + "\u4e0b\u5348" + ], + "DAY": [ + "\u661f\u671f\u65e5", + "\u661f\u671f\u4e00", + "\u661f\u671f\u4e8c", + "\u661f\u671f\u4e09", + "\u661f\u671f\u56db", + "\u661f\u671f\u4e94", + "\u661f\u671f\u516d" + ], + "MONTH": [ + "1\u6708", + "2\u6708", + "3\u6708", + "4\u6708", + "5\u6708", + "6\u6708", + "7\u6708", + "8\u6708", + "9\u6708", + "10\u6708", + "11\u6708", + "12\u6708" + ], + "SHORTDAY": [ + "\u9031\u65e5", + "\u9031\u4e00", + "\u9031\u4e8c", + "\u9031\u4e09", + "\u9031\u56db", + "\u9031\u4e94", + "\u9031\u516d" + ], + "SHORTMONTH": [ + "1\u6708", + "2\u6708", + "3\u6708", + "4\u6708", + "5\u6708", + "6\u6708", + "7\u6708", + "8\u6708", + "9\u6708", + "10\u6708", + "11\u6708", + "12\u6708" + ], + "fullDate": "y\u5e74M\u6708d\u65e5EEEE", + "longDate": "y\u5e74M\u6708d\u65e5", + "medium": "yyyy/M/d ah:mm:ss", + "mediumDate": "yyyy/M/d", + "mediumTime": "ah:mm:ss", + "short": "y/M/d ah:mm", + "shortDate": "y/M/d", + "shortTime": "ah:mm" + }, + "NUMBER_FORMATS": { + "CURRENCY_SYM": "\u00a5", + "DECIMAL_SEP": ".", + "GROUP_SEP": ",", + "PATTERNS": [ + { + "gSize": 3, + "lgSize": 3, + "macFrac": 0, + "maxFrac": 3, + "minFrac": 0, + "minInt": 1, + "negPre": "-", + "negSuf": "", + "posPre": "", + "posSuf": "" + }, + { + "gSize": 3, + "lgSize": 3, + "macFrac": 0, + "maxFrac": 2, + "minFrac": 2, + "minInt": 1, + "negPre": "(\u00a4", + "negSuf": ")", + "posPre": "\u00a4", + "posSuf": "" + } + ] + }, + "id": "zh-hant", + "pluralCat": function (n) { return PLURAL_CATEGORY.OTHER;} +}); +}]); \ No newline at end of file From 9227a5db947a78e3dbe8b91d5dac5d67444c855c Mon Sep 17 00:00:00 2001 From: Isaac Shapira Date: Thu, 1 May 2014 22:33:11 -0600 Subject: [PATCH 390/837] fix(ngAnimate): $animate methods should accept native dom elements --- src/ngAnimate/animate.js | 18 +++- test/ngAnimate/animateSpec.js | 154 +++++++++++++++++++++++++++++++++- 2 files changed, 170 insertions(+), 2 deletions(-) diff --git a/src/ngAnimate/animate.js b/src/ngAnimate/animate.js index 7a6add782359..ca4eed98f04b 100644 --- a/src/ngAnimate/animate.js +++ b/src/ngAnimate/animate.js @@ -289,6 +289,10 @@ angular.module('ngAnimate', ['ng']) } } + function prepareElement(element) { + return element && angular.element(element); + } + function stripCommentsFromElement(element) { return angular.element(extractElementNode(element)); } @@ -544,6 +548,10 @@ angular.module('ngAnimate', ['ng']) * @param {function()=} doneCallback the callback function that will be called once the animation is complete */ enter : function(element, parentElement, afterElement, doneCallback) { + element = angular.element(element); + parentElement = prepareElement(parentElement); + afterElement = prepareElement(afterElement); + this.enabled(false, element); $delegate.enter(element, parentElement, afterElement); $rootScope.$$postDigest(function() { @@ -580,6 +588,7 @@ angular.module('ngAnimate', ['ng']) * @param {function()=} doneCallback the callback function that will be called once the animation is complete */ leave : function(element, doneCallback) { + element = angular.element(element); cancelChildAnimations(element); this.enabled(false, element); $rootScope.$$postDigest(function() { @@ -620,6 +629,10 @@ angular.module('ngAnimate', ['ng']) * @param {function()=} doneCallback the callback function that will be called once the animation is complete */ move : function(element, parentElement, afterElement, doneCallback) { + element = angular.element(element); + parentElement = prepareElement(parentElement); + afterElement = prepareElement(afterElement); + cancelChildAnimations(element); this.enabled(false, element); $delegate.move(element, parentElement, afterElement); @@ -659,6 +672,7 @@ angular.module('ngAnimate', ['ng']) * @param {function()=} doneCallback the callback function that will be called once the animation is complete */ addClass : function(element, className, doneCallback) { + element = angular.element(element); element = stripCommentsFromElement(element); performAnimation('addClass', className, element, null, null, function() { $delegate.addClass(element, className); @@ -695,6 +709,7 @@ angular.module('ngAnimate', ['ng']) * @param {function()=} doneCallback the callback function that will be called once the animation is complete */ removeClass : function(element, className, doneCallback) { + element = angular.element(element); element = stripCommentsFromElement(element); performAnimation('removeClass', className, element, null, null, function() { $delegate.removeClass(element, className); @@ -716,6 +731,7 @@ angular.module('ngAnimate', ['ng']) * CSS classes have been set on the element */ setClass : function(element, add, remove, doneCallback) { + element = angular.element(element); element = stripCommentsFromElement(element); performAnimation('setClass', [add, remove], element, null, null, function() { $delegate.setClass(element, add, remove); @@ -728,7 +744,7 @@ angular.module('ngAnimate', ['ng']) * @function * * @param {boolean=} value If provided then set the animation on or off. - * @param {DOMElement=} element If provided then the element will be used to represent the enable/disable operation + * @param {DOMElement} element If provided then the element will be used to represent the enable/disable operation * @return {boolean} Current animation state. * * @description diff --git a/test/ngAnimate/animateSpec.js b/test/ngAnimate/animateSpec.js index aeb24dcd562a..8785c563bf14 100644 --- a/test/ngAnimate/animateSpec.js +++ b/test/ngAnimate/animateSpec.js @@ -290,6 +290,24 @@ describe("ngAnimate", function() { expect(element.contents().length).toBe(1); })); + it("should animate the enter animation event with native dom elements", + inject(function($animate, $rootScope, $sniffer, $timeout) { + element[0].removeChild(child[0]); + + expect(element.contents().length).toBe(0); + $animate.enter(child[0], element[0]); + $rootScope.$digest(); + + if($sniffer.transitions) { + $animate.triggerReflow(); + expect(child.hasClass('ng-enter')).toBe(true); + expect(child.hasClass('ng-enter-active')).toBe(true); + browserTrigger(element, 'transitionend', { timeStamp: Date.now() + 1000, elapsedTime: 1 }); + } + + expect(element.contents().length).toBe(1); + })); + it("should animate the leave animation event", inject(function($animate, $rootScope, $sniffer, $timeout) { @@ -308,6 +326,22 @@ describe("ngAnimate", function() { expect(element.contents().length).toBe(0); })); + it("should animate the leave animation event with native dom elements", + inject(function($animate, $rootScope, $sniffer, $timeout) { + + expect(element.contents().length).toBe(1); + $animate.leave(child[0]); + $rootScope.$digest(); + + if($sniffer.transitions) { + $animate.triggerReflow(); + expect(child.hasClass('ng-leave')).toBe(true); + expect(child.hasClass('ng-leave-active')).toBe(true); + browserTrigger(child,'transitionend', { timeStamp: Date.now() + 1000, elapsedTime: 1 }); + } + + expect(element.contents().length).toBe(0); + })); it("should animate the move animation event", inject(function($animate, $compile, $rootScope, $timeout, $sniffer) { @@ -328,6 +362,24 @@ describe("ngAnimate", function() { expect(element.text()).toBe('21'); })); + it("should animate the move animation event with native dom elements", + inject(function($animate, $compile, $rootScope, $timeout, $sniffer) { + + $rootScope.$digest(); + element.empty(); + + var child1 = $compile('
                          1
                          ')($rootScope); + var child2 = $compile('
                          2
                          ')($rootScope); + element.append(child1); + element.append(child2); + expect(element.text()).toBe('12'); + $animate.move(child1[0], element[0], child2[0]); + $rootScope.$digest(); + if($sniffer.transitions) { + $animate.triggerReflow(); + } + expect(element.text()).toBe('21'); + })); it("should animate the show animation event", inject(function($animate, $rootScope, $sniffer, $timeout) { @@ -347,7 +399,6 @@ describe("ngAnimate", function() { expect(child).toBeShown(); })); - it("should animate the hide animation event", inject(function($animate, $rootScope, $sniffer, $timeout) { @@ -401,6 +452,43 @@ describe("ngAnimate", function() { }); }); + it("should exclusively animate the setClass animation event with native dom elements", function() { + var count = 0, fallback = jasmine.createSpy('callback'); + module(function($animateProvider) { + $animateProvider.register('.classify', function() { + return { + beforeAddClass : fallback, + addClass : fallback, + beforeRemoveClass : fallback, + removeClass : fallback, + + beforeSetClass : function(element, add, remove, done) { + count++; + expect(add).toBe('yes'); + expect(remove).toBe('no'); + done(); + }, + setClass : function(element, add, remove, done) { + count++; + expect(add).toBe('yes'); + expect(remove).toBe('no'); + done(); + } + }; + }); + }); + inject(function($animate, $rootScope, $sniffer, $timeout) { + child.attr('class','classify no'); + $animate.setClass(child[0], 'yes', 'no'); + $animate.triggerReflow(); + + expect(child.hasClass('yes')).toBe(true); + expect(child.hasClass('no')).toBe(false); + expect(count).toBe(2); + + expect(fallback).not.toHaveBeenCalled(); + }); + }); it("should delegate down to addClass/removeClass if a setClass animation is not found", function() { var count = 0; @@ -2003,6 +2091,39 @@ describe("ngAnimate", function() { expect(captured).toBe('addClass-some-class'); })); + it("should perform the animation if passed native dom element", + inject(function($animate, $rootScope, $sniffer, $rootElement, $timeout, $browser) { + + var element = jqLite('
                          '); + $rootElement.append(element); + body.append($rootElement); + + //skipped animations + captured = 'none'; + $animate.removeClass(element[0], 'some-class'); + expect(element.hasClass('some-class')).toBe(false); + expect(captured).toBe('none'); + + element.addClass('some-class'); + + captured = 'nothing'; + $animate.addClass(element[0], 'some-class'); + expect(captured).toBe('nothing'); + expect(element.hasClass('some-class')).toBe(true); + + //actual animations + captured = 'none'; + $animate.removeClass(element[0], 'some-class'); + $animate.triggerReflow(); + expect(element.hasClass('some-class')).toBe(false); + expect(captured).toBe('removeClass-some-class'); + + captured = 'nothing'; + $animate.addClass(element[0], 'some-class'); + $animate.triggerReflow(); + expect(element.hasClass('some-class')).toBe(true); + expect(captured).toBe('addClass-some-class'); + })); it("should add and remove CSS classes after an animation even if no animation is present", inject(function($animate, $rootScope, $sniffer, $rootElement) { @@ -2132,6 +2253,37 @@ describe("ngAnimate", function() { expect(signature).toBe('XY'); })); + it("should properly execute JS animations if passed native dom element", + inject(function($animate, $rootScope, $sniffer, $rootElement, $timeout) { + + var parent = jqLite('
                          '); + $rootElement.append(parent); + body.append($rootElement); + var element = jqLite(parent.find('span')); + + var signature = ''; + + $animate.addClass(element[0],'klassy', function() { + signature += 'X'; + }); + $animate.triggerReflow(); + + $timeout.flush(500); + + expect(element.hasClass('klassy')).toBe(true); + + $animate.removeClass(element[0],'klassy', function() { + signature += 'Y'; + }); + $animate.triggerReflow(); + + $timeout.flush(3000); + + expect(element.hasClass('klassy')).toBe(false); + + $animate.triggerCallbacks(); + expect(signature).toBe('XY'); + })); it("should properly execute CSS animations/transitions and use callbacks when using addClass / removeClass", inject(function($animate, $rootScope, $sniffer, $rootElement, $timeout) { From 08e6b88fb2577ef8b9bd076e6d308de880644d4e Mon Sep 17 00:00:00 2001 From: Oivvio Polite Date: Tue, 3 Jun 2014 15:50:16 +0200 Subject: [PATCH 391/837] docs(guide/providers): fix grammar --- docs/content/guide/providers.ngdoc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/content/guide/providers.ngdoc b/docs/content/guide/providers.ngdoc index 97e37297a63f..b7f493cdb55c 100644 --- a/docs/content/guide/providers.ngdoc +++ b/docs/content/guide/providers.ngdoc @@ -129,7 +129,7 @@ myApp.factory('apiToken', ['clientId', function apiTokenFactory(clientId) { ``` In the code above, we see how the `apiToken` service is defined via the Factory recipe that depends -on `clientId` service. The factory service then uses NSA-proof encryption to produce an authentication +on the `clientId` service. The factory service then uses NSA-proof encryption to produce an authentication token. Note: It is best practice to name the factory functions as `Factory` From 9f43d02af8bf26c7b7a0d17941faf8b090ac3b17 Mon Sep 17 00:00:00 2001 From: Oivvio Polite Date: Tue, 3 Jun 2014 15:45:10 +0200 Subject: [PATCH 392/837] docs(guide/providers): fix typo --- docs/content/guide/providers.ngdoc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/content/guide/providers.ngdoc b/docs/content/guide/providers.ngdoc index b7f493cdb55c..830763c829c8 100644 --- a/docs/content/guide/providers.ngdoc +++ b/docs/content/guide/providers.ngdoc @@ -97,7 +97,7 @@ created by this recipe. Note: All services in Angular are singletons. That means that the injector uses each recipe at most once to create the object. The injector then caches the reference for all future needs. -Since Factory is more powerful version of the Value recipe, you can construct the same service with it. +Since Factory is more a powerful version of the Value recipe, you can construct the same service with it. Using our previous `clientId` Value recipe example, we can rewrite it as a Factory recipe like this: From 369f69d67ae8ceaad884c3d6c7a0688ee1e87419 Mon Sep 17 00:00:00 2001 From: Anuj More Date: Tue, 3 Jun 2014 15:15:49 +0530 Subject: [PATCH 393/837] docs(tutorial/index): fix typo --- docs/content/tutorial/index.ngdoc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/content/tutorial/index.ngdoc b/docs/content/tutorial/index.ngdoc index b9f8e69946e8..423bba1300bf 100644 --- a/docs/content/tutorial/index.ngdoc +++ b/docs/content/tutorial/index.ngdoc @@ -18,7 +18,7 @@ extensions or plug-ins: * See examples of how to use client-side data binding to build dynamic views of data that change immediately in response to user actions. -* See how Angular keeps your views in synch with your data without the need for DOM manipulation. +* See how Angular keeps your views in sync with your data without the need for DOM manipulation. * Learn a better, easier way to test your web apps, with Karma and Protractor. * Learn how to use dependency injection and services to make common web tasks, such as getting data into your app, easier. From 09367d88c218a3c3480aec1d647dc8fe1d3d6d82 Mon Sep 17 00:00:00 2001 From: Tim Ruffles Date: Tue, 3 Jun 2014 12:07:51 +0100 Subject: [PATCH 394/837] docs(guide/expression): fix docs re $window The documentation on context is incorrect and misleading: 1. "Angular expressions must use $window explicitly to refer to the global `window` object": expressions cannot access `$window` 1. The example doesn't actually attempt to use $window in a expression. It's in a function called from an expression, which incorrectly implies to readers that: 1. functions ARE expressions 1. functions called by expressions can't access `window` Here's [a plunkr](http://plnkr.co/edit/Gd4xAV?p=preview) to make both these issues clear. This change fixes the errors and informs the reader about Angular's `$window` etc services, and adds an explicit example of an expression not being able to access `window`. --- docs/content/guide/expression.ngdoc | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/docs/content/guide/expression.ngdoc b/docs/content/guide/expression.ngdoc index f92a91b24a88..3129ca7ef165 100644 --- a/docs/content/guide/expression.ngdoc +++ b/docs/content/guide/expression.ngdoc @@ -95,16 +95,18 @@ You can try evaluating different expressions here: Angular does not use JavaScript's `eval()` to evaluate expressions. Instead Angular's {@link ng.$parse $parse} service processes these expressions. -Unlike JavaScript, where names default to global `window` properties, Angular expressions must use -{@link ng.$window `$window`} explicitly to refer to the global `window` object. For example, if you -want to call `alert()` in an expression you must use `$window.alert()`. This restriction is -intentional. It prevents accidental access to the global state – a common source of subtle bugs. +Angular expressions do not have access to global variables like `window`, `document` or `location`. +This restriction is intentional. It prevents accidental access to the global state – a common source of subtle bugs. + +Instead use services like `$window` and `$location` in functions called from expressions. Such services +provide mockable access to globals.
                          Name: +
                          From 3ffbf202ce354a963732473bd3efc1af5316c427 Mon Sep 17 00:00:00 2001 From: JMRodriguez24 Date: Sun, 1 Jun 2014 08:21:55 -0400 Subject: [PATCH 395/837] docs(index/api): fix link o templates Link points to templates. Modified the link label templates instead of types. --- docs/content/api/index.ngdoc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/content/api/index.ngdoc b/docs/content/api/index.ngdoc index fcce1aeb507f..e66b8f4aea4c 100644 --- a/docs/content/api/index.ngdoc +++ b/docs/content/api/index.ngdoc @@ -6,7 +6,7 @@ Welcome to the AngularJS API docs page. These pages contain the AngularJS reference materials for version . The documentation is organized into **{@link guide/module modules}** which contain various components of an AngularJS application. -These components are {@link guide/directive directives}, {@link guide/services services}, {@link guide/filter filters}, {@link guide/providers providers}, {@link guide/templates types}, global APIs and testing mocks. +These components are {@link guide/directive directives}, {@link guide/services services}, {@link guide/filter filters}, {@link guide/providers providers}, {@link guide/templates templates}, global APIs and testing mocks.
                          **Angular Namespaces `$` and `$$`** From 2fcbd39d0be97dba8a592b2040924abc4c1ecb59 Mon Sep 17 00:00:00 2001 From: Richard Littauer Date: Sat, 31 May 2014 14:55:33 -0700 Subject: [PATCH 396/837] docs(misc/faq): note that jQuery 2.x currently doesn't work with angular --- docs/content/misc/faq.ngdoc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/content/misc/faq.ngdoc b/docs/content/misc/faq.ngdoc index 1da9af06011a..9b14d1c96529 100644 --- a/docs/content/misc/faq.ngdoc +++ b/docs/content/misc/faq.ngdoc @@ -82,7 +82,7 @@ application is being bootstrapped. If jQuery is not present in your script path, to its own implementation of the subset of jQuery that we call {@link angular.element jQLite}. Due to a change to use `on()`/`off()` rather than `bind()`/`unbind()`, Angular 1.2 only operates with -jQuery 1.7.1 or above. +jQuery 1.7.1 or above. However, Angular does not currently support jQuery 2.x or above. ### What is testability like in Angular? From 23c8af232fd0c90dd7b19e4bfa8b475e0012d2cc Mon Sep 17 00:00:00 2001 From: Dken Date: Mon, 26 May 2014 21:35:09 +0800 Subject: [PATCH 397/837] docs(tutorial/index): update requisite version of node Not all 0.10.x support `^` in versions in `package.json` --- docs/content/tutorial/index.ngdoc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/content/tutorial/index.ngdoc b/docs/content/tutorial/index.ngdoc index 423bba1300bf..fd3e7a2d4fac 100644 --- a/docs/content/tutorial/index.ngdoc +++ b/docs/content/tutorial/index.ngdoc @@ -95,7 +95,7 @@ The tutorial instructions, from now on, assume you are running all commands from ### Install Node.js If you want to run the preconfigured local web-server and the test tools then you will also need -[Node.js v0.10+][node]. +[Node.js v0.10.27+][node]. You can download a Node.js installer for your operating system from http://nodejs.org/download/. From d9317cde4fd48d3f44572179e69500e47cc14f4a Mon Sep 17 00:00:00 2001 From: Jake Buob Date: Fri, 23 May 2014 14:29:16 -0400 Subject: [PATCH 398/837] docs(tutorial/step_07): fix typo --- docs/content/tutorial/step_07.ngdoc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/content/tutorial/step_07.ngdoc b/docs/content/tutorial/step_07.ngdoc index 5d505a78c336..7f21aca66899 100644 --- a/docs/content/tutorial/step_07.ngdoc +++ b/docs/content/tutorial/step_07.ngdoc @@ -97,7 +97,7 @@ service, the `$routeProvider` exposes APIs that allow you to define routes for y Angular modules solve the problem of removing global state from the application and provide a way of configuring the injector. As opposed to AMD or require.js modules, Angular modules don't try to solve the problem of script load ordering or lazy script fetching. These goals are totally independent and -both module systems can live side by side and fulfil their goals. +both module systems can live side by side and fulfill their goals. To deepen your understanding of DI on Angular, see [Understanding Dependency Injection](https://github.com/angular/angular.js/wiki/Understanding-Dependency-Injection). From b306babe2919c18851ff04ea324bbec68e09fef5 Mon Sep 17 00:00:00 2001 From: Juan Manuel Palacios Date: Sun, 1 Jun 2014 16:49:54 -0430 Subject: [PATCH 399/837] docs(tutorial/step_12): clarify that jQuery should be loaded first jQuery needs to be loaded before *all* AngularJS modules in the app, because otherwise AngularJS will not detect the presence of jQuery and animations will not work as expected. --- docs/content/tutorial/step_12.ngdoc | 2 ++ 1 file changed, 2 insertions(+) diff --git a/docs/content/tutorial/step_12.ngdoc b/docs/content/tutorial/step_12.ngdoc index 58bc5f9c4c02..0d1646a43a48 100644 --- a/docs/content/tutorial/step_12.ngdoc +++ b/docs/content/tutorial/step_12.ngdoc @@ -105,6 +105,8 @@ __`app/index.html`.__
                          **Important:** Be sure to use jQuery version `1.10.x`. AngularJS does not yet support jQuery `2.x`. + Be sure to load jQuery before all AngularJS scripts, otherwise AngularJS won't detect jQuery and + animations will not work as expected.
                          Animations can now be created within the CSS code (`animations.css`) as well as the JavaScript code (`animations.js`). From ca566d8d8126215f9be688a22f07f2ce043b7964 Mon Sep 17 00:00:00 2001 From: Richard Littauer Date: Sat, 24 May 2014 15:02:17 -0700 Subject: [PATCH 400/837] docs(guide/directive): explain controllerAs option There was nothing about controllerAs in the developer guide. Helps #6710 and #6759 --- docs/content/guide/directive.ngdoc | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/docs/content/guide/directive.ngdoc b/docs/content/guide/directive.ngdoc index 7af76742492c..7a2fd8a50036 100644 --- a/docs/content/guide/directive.ngdoc +++ b/docs/content/guide/directive.ngdoc @@ -901,6 +901,11 @@ So where does this `myTabs` controller come from? Directives can specify control the unsurprisingly named `controller` option. As you can see, the `myTabs` directive uses this option. Just like `ngController`, this option attaches a controller to the template of the directive. +If it is necessary to reference the controller or any functions bound to the controller's scope in +the template, you can use the option `controllerAs` to specify the name of the controller as an alias. +The directive needs to define a scope for this configuration to be used. This is particularly useful +in the case when the directive is used as a component. + Looking back at `myPane`'s definition, notice the last argument in its `link` function: `tabsCtrl`. When a directive requires a controller, it receives that controller as the fourth argument of its `link` function. Taking advantage of this, `myPane` can call the `addPane` function of `myTabs`. From 55b2f0e8620465559016b424967d90a86af597c0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Matias=20Niemel=C3=A4?= Date: Fri, 30 May 2014 01:16:26 -0400 Subject: [PATCH 401/837] fix($animate): remove the need to add display:block!important for ngShow/ngHide Since ngShow/ngHide animations add and remove the .ng-hide class, having to remember to write display:block on your own is a hassle and leads to problematic animation code. This fix places a default on the animation for you instead. Closes #3813 --- css/angular.css | 6 ++++++ src/ng/directive/ngShowHide.js | 19 +------------------ 2 files changed, 7 insertions(+), 18 deletions(-) diff --git a/css/angular.css b/css/angular.css index 2566640ebb2f..4b54198b56a5 100644 --- a/css/angular.css +++ b/css/angular.css @@ -14,3 +14,9 @@ ng\:form { transition:0s all!important; -webkit-transition:0s all!important; } + +/* show the element during a show/hide animation when the + * animation is ongoing, but the .ng-hide class is active */ +.ng-hide-add-active, .ng-hide-remove { + display: block!important; +} diff --git a/src/ng/directive/ngShowHide.js b/src/ng/directive/ngShowHide.js index b8ae698288c3..00103d74a548 100644 --- a/src/ng/directive/ngShowHide.js +++ b/src/ng/directive/ngShowHide.js @@ -40,10 +40,8 @@ * restating the styles for the .ng-hide class in CSS: * ```css * .ng-hide { - * //!annotate CSS Specificity|Not to worry, this will override the AngularJS default... + * /* this is just another form of hiding an element */ * display:block!important; - * - * //this is just another form of hiding an element * position:absolute; * top:-9999px; * left:-9999px; @@ -70,7 +68,6 @@ * // * .my-element.ng-hide-add, .my-element.ng-hide-remove { * transition:0.5s linear all; - * display:block!important; * } * * .my-element.ng-hide-add { ... } @@ -118,11 +115,6 @@ background:white; } - .animate-show.ng-hide-add, - .animate-show.ng-hide-remove { - display:block!important; - } - .animate-show.ng-hide { line-height:0; opacity:0; @@ -200,9 +192,6 @@ var ngShowDirective = ['$animate', function($animate) { * restating the styles for the .ng-hide class in CSS: * ```css * .ng-hide { - * //!annotate CSS Specificity|Not to worry, this will override the AngularJS default... - * display:block!important; - * * //this is just another form of hiding an element * position:absolute; * top:-9999px; @@ -230,7 +219,6 @@ var ngShowDirective = ['$animate', function($animate) { * // * .my-element.ng-hide-add, .my-element.ng-hide-remove { * transition:0.5s linear all; - * display:block!important; * } * * .my-element.ng-hide-add { ... } @@ -278,11 +266,6 @@ var ngShowDirective = ['$animate', function($animate) { background:white; } - .animate-hide.ng-hide-add, - .animate-hide.ng-hide-remove { - display:block!important; - } - .animate-hide.ng-hide { line-height:0; opacity:0; From 669e3aeaa8552343c09f9ce86bb9c8c09ad1ba4a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Matias=20Niemel=C3=A4?= Date: Wed, 4 Jun 2014 15:14:44 -0400 Subject: [PATCH 402/837] docs(ngShow): calirfy info about the .ng-hide class and the display style --- src/ng/directive/ngShowHide.js | 50 ++++++++++++++++++++-------------- 1 file changed, 30 insertions(+), 20 deletions(-) diff --git a/src/ng/directive/ngShowHide.js b/src/ng/directive/ngShowHide.js index 00103d74a548..a35fceee7aea 100644 --- a/src/ng/directive/ngShowHide.js +++ b/src/ng/directive/ngShowHide.js @@ -23,6 +23,11 @@ * on the element causing it to become hidden. When true, the ng-hide CSS class is removed * from the element causing the element not to appear hidden. * + *
                          + * **Note:** Here is a list of values that ngShow will consider as a falsy value (case insensitive):
                          + * "f" / "0" / "false" / "no" / "n" / "[]" + *
                          + * * ## Why is !important used? * * You may be wondering why !important is used for the .ng-hide CSS class. This is because the `.ng-hide` selector @@ -36,11 +41,13 @@ * * ### Overriding .ng-hide * - * If you wish to change the hide behavior with ngShow/ngHide then this can be achieved by - * restating the styles for the .ng-hide class in CSS: + * By default, the `.ng-hide` class will style the element with `display:none!important`. If you wish to change + * the hide behavior with ngShow/ngHide then this can be achieved by restating the styles for the `.ng-hide` + * class in CSS: + * * ```css * .ng-hide { - * /* this is just another form of hiding an element */ + * //this is just another form of hiding an element * display:block!important; * position:absolute; * top:-9999px; @@ -48,12 +55,7 @@ * } * ``` * - * Just remember to include the important flag so the CSS override will function. - * - *
                          - * **Note:** Here is a list of values that ngShow will consider as a falsy value (case insensitive):
                          - * "f" / "0" / "false" / "no" / "n" / "[]" - *
                          + * By default you don't need to override in CSS anything and the animations will work around the display style. * * ## A note about animations with ngShow * @@ -76,6 +78,9 @@ * .my-element.ng-hide-remove.ng-hide-remove-active { ... } * ``` * + * Keep in mind that, as of AngularJS version 1.2.17 (and 1.3.0-beta.11), there is no need to change the display + * property to block during animation states--ngAnimate will handle the style toggling automatically for you. + * * @animations * addClass: .ng-hide - happens after the ngShow expression evaluates to a truthy value and the just before contents are set to visible * removeClass: .ng-hide - happens after the ngShow expression evaluates to a non truthy value and just before the contents are set to hidden @@ -175,6 +180,11 @@ var ngShowDirective = ['$animate', function($animate) { * on the element causing it to become hidden. When false, the ng-hide CSS class is removed * from the element causing the element not to appear hidden. * + *
                          + * **Note:** Here is a list of values that ngHide will consider as a falsy value (case insensitive):
                          + * "f" / "0" / "false" / "no" / "n" / "[]" + *
                          + * * ## Why is !important used? * * You may be wondering why !important is used for the .ng-hide CSS class. This is because the `.ng-hide` selector @@ -188,30 +198,27 @@ var ngShowDirective = ['$animate', function($animate) { * * ### Overriding .ng-hide * - * If you wish to change the hide behavior with ngShow/ngHide then this can be achieved by - * restating the styles for the .ng-hide class in CSS: + * By default, the `.ng-hide` class will style the element with `display:none!important`. If you wish to change + * the hide behavior with ngShow/ngHide then this can be achieved by restating the styles for the `.ng-hide` + * class in CSS: + * * ```css * .ng-hide { * //this is just another form of hiding an element + * display:block!important; * position:absolute; * top:-9999px; * left:-9999px; * } * ``` * - * Just remember to include the important flag so the CSS override will function. - * - *
                          - * **Note:** Here is a list of values that ngHide will consider as a falsy value (case insensitive):
                          - * "f" / "0" / "false" / "no" / "n" / "[]" - *
                          + * By default you don't need to override in CSS anything and the animations will work around the display style. * * ## A note about animations with ngHide * * Animations in ngShow/ngHide work with the show and hide events that are triggered when the directive expression - * is true and false. This system works like the animation system present with ngClass, except that - * you must also include the !important flag to override the display property so - * that you can perform an animation when the element is hidden during the time of the animation. + * is true and false. This system works like the animation system present with ngClass, except that the `.ng-hide` + * CSS class is added and removed for you instead of your own CSS class. * * ```css * // @@ -227,6 +234,9 @@ var ngShowDirective = ['$animate', function($animate) { * .my-element.ng-hide-remove.ng-hide-remove-active { ... } * ``` * + * Keep in mind that, as of AngularJS version 1.2.17 (and 1.3.0-beta.11), there is no need to change the display + * property to block during animation states--ngAnimate will handle the style toggling automatically for you. + * * @animations * removeClass: .ng-hide - happens after the ngHide expression evaluates to a truthy value and just before the contents are set to hidden * addClass: .ng-hide - happens after the ngHide expression evaluates to a non truthy value and just before the contents are set to visible From b6388b3f1d6cd1341a02491ef29c4760f4508cf3 Mon Sep 17 00:00:00 2001 From: Wes Alvaro Date: Thu, 22 May 2014 07:55:10 +0000 Subject: [PATCH 403/837] docs(misc core): use `@kind function` instead of `@function` --- src/Angular.js | 40 +++++++++++++++++----------------- src/auto/injector.js | 4 ++-- src/jqLite.js | 2 +- src/ng/animate.js | 12 +++++----- src/ng/cacheFactory.js | 12 +++++----- src/ng/compile.js | 20 ++++++++--------- src/ng/filter.js | 2 +- src/ng/filter/filter.js | 2 +- src/ng/filter/filters.js | 12 +++++----- src/ng/filter/limitTo.js | 2 +- src/ng/filter/orderBy.js | 2 +- src/ng/interpolate.js | 4 ++-- src/ng/parse.js | 2 +- src/ng/q.js | 8 +++---- src/ng/rootScope.js | 22 +++++++++---------- src/ng/sce.js | 12 +++++----- src/ng/urlUtils.js | 2 +- src/ngAnimate/animate.js | 10 ++++----- src/ngRoute/route.js | 2 +- src/ngSanitize/filter/linky.js | 2 +- src/ngSanitize/sanitize.js | 2 +- 21 files changed, 88 insertions(+), 88 deletions(-) diff --git a/src/Angular.js b/src/Angular.js index 3b632a75bb98..f648a0348cf8 100644 --- a/src/Angular.js +++ b/src/Angular.js @@ -106,7 +106,7 @@ * @ngdoc function * @name angular.lowercase * @module ng - * @function + * @kind function * * @description Converts the specified string to lowercase. * @param {string} string String to be converted to lowercase. @@ -119,7 +119,7 @@ var hasOwnProperty = Object.prototype.hasOwnProperty; * @ngdoc function * @name angular.uppercase * @module ng - * @function + * @kind function * * @description Converts the specified string to uppercase. * @param {string} string String to be converted to uppercase. @@ -201,7 +201,7 @@ function isArrayLike(obj) { * @ngdoc function * @name angular.forEach * @module ng - * @function + * @kind function * * @description * Invokes the `iterator` function once for each item in `obj` collection, which can be either an @@ -330,7 +330,7 @@ function setHashKey(obj, h) { * @ngdoc function * @name angular.extend * @module ng - * @function + * @kind function * * @description * Extends the destination object `dst` by copying all of the properties from the `src` object(s) @@ -367,7 +367,7 @@ function inherit(parent, extra) { * @ngdoc function * @name angular.noop * @module ng - * @function + * @kind function * * @description * A function that performs no operations. This function can be useful when writing code in the @@ -387,7 +387,7 @@ noop.$inject = []; * @ngdoc function * @name angular.identity * @module ng - * @function + * @kind function * * @description * A function that returns its first argument. This function is useful when writing code in the @@ -409,7 +409,7 @@ function valueFn(value) {return function() {return value;};} * @ngdoc function * @name angular.isUndefined * @module ng - * @function + * @kind function * * @description * Determines if a reference is undefined. @@ -424,7 +424,7 @@ function isUndefined(value){return typeof value === 'undefined';} * @ngdoc function * @name angular.isDefined * @module ng - * @function + * @kind function * * @description * Determines if a reference is defined. @@ -439,7 +439,7 @@ function isDefined(value){return typeof value !== 'undefined';} * @ngdoc function * @name angular.isObject * @module ng - * @function + * @kind function * * @description * Determines if a reference is an `Object`. Unlike `typeof` in JavaScript, `null`s are not @@ -455,7 +455,7 @@ function isObject(value){return value != null && typeof value === 'object';} * @ngdoc function * @name angular.isString * @module ng - * @function + * @kind function * * @description * Determines if a reference is a `String`. @@ -470,7 +470,7 @@ function isString(value){return typeof value === 'string';} * @ngdoc function * @name angular.isNumber * @module ng - * @function + * @kind function * * @description * Determines if a reference is a `Number`. @@ -485,7 +485,7 @@ function isNumber(value){return typeof value === 'number';} * @ngdoc function * @name angular.isDate * @module ng - * @function + * @kind function * * @description * Determines if a value is a date. @@ -502,7 +502,7 @@ function isDate(value) { * @ngdoc function * @name angular.isArray * @module ng - * @function + * @kind function * * @description * Determines if a reference is an `Array`. @@ -519,7 +519,7 @@ function isArray(value) { * @ngdoc function * @name angular.isFunction * @module ng - * @function + * @kind function * * @description * Determines if a reference is a `Function`. @@ -593,7 +593,7 @@ var trim = (function() { * @ngdoc function * @name angular.isElement * @module ng - * @function + * @kind function * * @description * Determines if a reference is a DOM element (or wrapped jQuery element). @@ -704,7 +704,7 @@ function isLeafNode (node) { * @ngdoc function * @name angular.copy * @module ng - * @function + * @kind function * * @description * Creates a deep copy of `source`, which should be an object or an array. @@ -850,7 +850,7 @@ function shallowCopy(src, dst) { * @ngdoc function * @name angular.equals * @module ng - * @function + * @kind function * * @description * Determines if two objects or two values are equivalent. Supports value types, regular @@ -937,7 +937,7 @@ function sliceArgs(args, startIndex) { * @ngdoc function * @name angular.bind * @module ng - * @function + * @kind function * * @description * Returns a function which calls function `fn` bound to `self` (`self` becomes the `this` for @@ -993,7 +993,7 @@ function toJsonReplacer(key, value) { * @ngdoc function * @name angular.toJson * @module ng - * @function + * @kind function * * @description * Serializes input into a JSON-formatted string. Properties with leading $ characters will be @@ -1013,7 +1013,7 @@ function toJson(obj, pretty) { * @ngdoc function * @name angular.fromJson * @module ng - * @function + * @kind function * * @description * Deserializes a JSON string. diff --git a/src/auto/injector.js b/src/auto/injector.js index 43df185f36d2..ec56daac7752 100644 --- a/src/auto/injector.js +++ b/src/auto/injector.js @@ -4,7 +4,7 @@ * @ngdoc function * @module ng * @name angular.injector - * @function + * @kind function * * @description * Creates an injector function that can be used for retrieving services as well as for @@ -101,7 +101,7 @@ function annotate(fn) { /** * @ngdoc service * @name $injector - * @function + * @kind function * * @description * diff --git a/src/jqLite.js b/src/jqLite.js index a471d3742bc0..696f695e737d 100644 --- a/src/jqLite.js +++ b/src/jqLite.js @@ -16,7 +16,7 @@ * @ngdoc function * @name angular.element * @module ng - * @function + * @kind function * * @description * Wraps a raw DOM element or HTML string as a [jQuery](http://jquery.com) element. diff --git a/src/ng/animate.js b/src/ng/animate.js index 298044643ece..f9f6a62c8f40 100644 --- a/src/ng/animate.js +++ b/src/ng/animate.js @@ -110,7 +110,7 @@ var $AnimateProvider = ['$provide', function($provide) { * * @ngdoc method * @name $animate#enter - * @function + * @kind function * @description Inserts the element into the DOM either after the `after` element or within * the `parent` element. Once complete, the done() callback will be fired (if provided). * @param {DOMElement} element the element which will be inserted into the DOM @@ -137,7 +137,7 @@ var $AnimateProvider = ['$provide', function($provide) { * * @ngdoc method * @name $animate#leave - * @function + * @kind function * @description Removes the element from the DOM. Once complete, the done() callback will be * fired (if provided). * @param {DOMElement} element the element which will be removed from the DOM @@ -153,7 +153,7 @@ var $AnimateProvider = ['$provide', function($provide) { * * @ngdoc method * @name $animate#move - * @function + * @kind function * @description Moves the position of the provided element within the DOM to be placed * either after the `after` element or inside of the `parent` element. Once complete, the * done() callback will be fired (if provided). @@ -177,7 +177,7 @@ var $AnimateProvider = ['$provide', function($provide) { * * @ngdoc method * @name $animate#addClass - * @function + * @kind function * @description Adds the provided className CSS class value to the provided element. Once * complete, the done() callback will be fired (if provided). * @param {DOMElement} element the element which will have the className value @@ -200,7 +200,7 @@ var $AnimateProvider = ['$provide', function($provide) { * * @ngdoc method * @name $animate#removeClass - * @function + * @kind function * @description Removes the provided className CSS class value from the provided element. * Once complete, the done() callback will be fired (if provided). * @param {DOMElement} element the element which will have the className value @@ -223,7 +223,7 @@ var $AnimateProvider = ['$provide', function($provide) { * * @ngdoc method * @name $animate#setClass - * @function + * @kind function * @description Adds and/or removes the given CSS classes to and from the element. * Once complete, the done() callback will be fired (if provided). * @param {DOMElement} element the element which will have its CSS classes changed diff --git a/src/ng/cacheFactory.js b/src/ng/cacheFactory.js index ca07aa765c8f..a6fcf23351da 100644 --- a/src/ng/cacheFactory.js +++ b/src/ng/cacheFactory.js @@ -141,7 +141,7 @@ function $CacheFactoryProvider() { /** * @ngdoc method * @name $cacheFactory.Cache#put - * @function + * @kind function * * @description * Inserts a named entry into the {@link $cacheFactory.Cache Cache} object to be @@ -177,7 +177,7 @@ function $CacheFactoryProvider() { /** * @ngdoc method * @name $cacheFactory.Cache#get - * @function + * @kind function * * @description * Retrieves named data stored in the {@link $cacheFactory.Cache Cache} object. @@ -201,7 +201,7 @@ function $CacheFactoryProvider() { /** * @ngdoc method * @name $cacheFactory.Cache#remove - * @function + * @kind function * * @description * Removes an entry from the {@link $cacheFactory.Cache Cache} object. @@ -229,7 +229,7 @@ function $CacheFactoryProvider() { /** * @ngdoc method * @name $cacheFactory.Cache#removeAll - * @function + * @kind function * * @description * Clears the cache object of any entries. @@ -245,7 +245,7 @@ function $CacheFactoryProvider() { /** * @ngdoc method * @name $cacheFactory.Cache#destroy - * @function + * @kind function * * @description * Destroys the {@link $cacheFactory.Cache Cache} object entirely, @@ -262,7 +262,7 @@ function $CacheFactoryProvider() { /** * @ngdoc method * @name $cacheFactory.Cache#info - * @function + * @kind function * * @description * Retrieve information regarding a particular {@link $cacheFactory.Cache Cache}. diff --git a/src/ng/compile.js b/src/ng/compile.js index 8a4e16cb71a4..e783307615cf 100644 --- a/src/ng/compile.js +++ b/src/ng/compile.js @@ -21,7 +21,7 @@ /** * @ngdoc service * @name $compile - * @function + * @kind function * * @description * Compiles an HTML string or DOM into a template and produces a template function, which @@ -499,7 +499,7 @@ var $compileMinErr = minErr('$compile'); /** * @ngdoc provider * @name $compileProvider - * @function + * @kind function * * @description */ @@ -518,7 +518,7 @@ function $CompileProvider($provide, $$sanitizeUriProvider) { /** * @ngdoc method * @name $compileProvider#directive - * @function + * @kind function * * @description * Register a new directive with the compiler. @@ -571,7 +571,7 @@ function $CompileProvider($provide, $$sanitizeUriProvider) { /** * @ngdoc method * @name $compileProvider#aHrefSanitizationWhitelist - * @function + * @kind function * * @description * Retrieves or overrides the default regular expression that is used for whitelisting of safe @@ -601,7 +601,7 @@ function $CompileProvider($provide, $$sanitizeUriProvider) { /** * @ngdoc method * @name $compileProvider#imgSrcSanitizationWhitelist - * @function + * @kind function * * @description * Retrieves or overrides the default regular expression that is used for whitelisting of safe @@ -645,7 +645,7 @@ function $CompileProvider($provide, $$sanitizeUriProvider) { /** * @ngdoc method * @name $compile.directive.Attributes#$addClass - * @function + * @kind function * * @description * Adds the CSS class value specified by the classVal parameter to the element. If animations @@ -662,7 +662,7 @@ function $CompileProvider($provide, $$sanitizeUriProvider) { /** * @ngdoc method * @name $compile.directive.Attributes#$removeClass - * @function + * @kind function * * @description * Removes the CSS class value specified by the classVal parameter from the element. If @@ -679,7 +679,7 @@ function $CompileProvider($provide, $$sanitizeUriProvider) { /** * @ngdoc method * @name $compile.directive.Attributes#$updateClass - * @function + * @kind function * * @description * Adds and removes the appropriate CSS class values to the element based on the difference @@ -767,7 +767,7 @@ function $CompileProvider($provide, $$sanitizeUriProvider) { /** * @ngdoc method * @name $compile.directive.Attributes#$observe - * @function + * @kind function * * @description * Observes an interpolated attribute. @@ -1980,7 +1980,7 @@ function directiveNormalize(name) { /** * @ngdoc method * @name $compile.directive.Attributes#$set - * @function + * @kind function * * @description * Set DOM element attribute value. diff --git a/src/ng/filter.js b/src/ng/filter.js index 991fdcbe7e4a..b7fdc8ff2a00 100644 --- a/src/ng/filter.js +++ b/src/ng/filter.js @@ -63,7 +63,7 @@ /** * @ngdoc service * @name $filter - * @function + * @kind function * @description * Filters are used for formatting data displayed to the user. * diff --git a/src/ng/filter/filter.js b/src/ng/filter/filter.js index 2e42b11ef86c..e662392d8dbf 100644 --- a/src/ng/filter/filter.js +++ b/src/ng/filter/filter.js @@ -3,7 +3,7 @@ /** * @ngdoc filter * @name filter - * @function + * @kind function * * @description * Selects a subset of items from `array` and returns it as a new array. diff --git a/src/ng/filter/filters.js b/src/ng/filter/filters.js index 44543a868a71..62d73c16c46a 100644 --- a/src/ng/filter/filters.js +++ b/src/ng/filter/filters.js @@ -3,7 +3,7 @@ /** * @ngdoc filter * @name currency - * @function + * @kind function * * @description * Formats a number as a currency (ie $1,234.56). When no currency symbol is provided, default @@ -60,7 +60,7 @@ function currencyFilter($locale) { /** * @ngdoc filter * @name number - * @function + * @kind function * * @description * Formats a number as text. @@ -272,7 +272,7 @@ var DATE_FORMATS_SPLIT = /((?:[^yMdHhmsaZE']+)|(?:'(?:[^']|'')*')|(?:E+|y+|M+|d+ /** * @ngdoc filter * @name date - * @function + * @kind function * * @description * Formats `date` to a string based on the requested `format`. @@ -429,7 +429,7 @@ function dateFilter($locale) { /** * @ngdoc filter * @name json - * @function + * @kind function * * @description * Allows you to convert a JavaScript object into JSON string. @@ -464,7 +464,7 @@ function jsonFilter() { /** * @ngdoc filter * @name lowercase - * @function + * @kind function * @description * Converts string to lowercase. * @see angular.lowercase @@ -475,7 +475,7 @@ var lowercaseFilter = valueFn(lowercase); /** * @ngdoc filter * @name uppercase - * @function + * @kind function * @description * Converts string to uppercase. * @see angular.uppercase diff --git a/src/ng/filter/limitTo.js b/src/ng/filter/limitTo.js index 4f87b9964159..019a630dce31 100644 --- a/src/ng/filter/limitTo.js +++ b/src/ng/filter/limitTo.js @@ -3,7 +3,7 @@ /** * @ngdoc filter * @name limitTo - * @function + * @kind function * * @description * Creates a new array or string containing only a specified number of elements. The elements diff --git a/src/ng/filter/orderBy.js b/src/ng/filter/orderBy.js index 9a48ebae7f61..c20add53dc5d 100644 --- a/src/ng/filter/orderBy.js +++ b/src/ng/filter/orderBy.js @@ -3,7 +3,7 @@ /** * @ngdoc filter * @name orderBy - * @function + * @kind function * * @description * Orders a specified `array` by the `expression` predicate. It is ordered alphabetically diff --git a/src/ng/interpolate.js b/src/ng/interpolate.js index da161d2359f0..916191f2f269 100644 --- a/src/ng/interpolate.js +++ b/src/ng/interpolate.js @@ -5,7 +5,7 @@ var $interpolateMinErr = minErr('$interpolate'); /** * @ngdoc provider * @name $interpolateProvider - * @function + * @kind function * * @description * @@ -86,7 +86,7 @@ function $InterpolateProvider() { /** * @ngdoc service * @name $interpolate - * @function + * @kind function * * @requires $parse * @requires $sce diff --git a/src/ng/parse.js b/src/ng/parse.js index 51eed0376fa7..4184368dafcd 100644 --- a/src/ng/parse.js +++ b/src/ng/parse.js @@ -1106,7 +1106,7 @@ function getterFn(path, options, fullExp) { /** * @ngdoc provider * @name $parseProvider - * @function + * @kind function * * @description * `$parseProvider` can be used for configuring the default behavior of the {@link ng.$parse $parse} diff --git a/src/ng/q.js b/src/ng/q.js index 76e00df02812..4ac55423e6e8 100644 --- a/src/ng/q.js +++ b/src/ng/q.js @@ -191,7 +191,7 @@ function qFactory(nextTick, exceptionHandler) { /** * @ngdoc method * @name $q#defer - * @function + * @kind function * * @description * Creates a `Deferred` object which represents a task which will finish in the future. @@ -348,7 +348,7 @@ function qFactory(nextTick, exceptionHandler) { /** * @ngdoc method * @name $q#reject - * @function + * @kind function * * @description * Creates a promise that is resolved as rejected with the specified `reason`. This api should be @@ -408,7 +408,7 @@ function qFactory(nextTick, exceptionHandler) { /** * @ngdoc method * @name $q#when - * @function + * @kind function * * @description * Wraps an object that might be a value or a (3rd party) then-able promise into a $q promise. @@ -480,7 +480,7 @@ function qFactory(nextTick, exceptionHandler) { /** * @ngdoc method * @name $q#all - * @function + * @kind function * * @description * Combines multiple promises into a single promise that is resolved when all of the input diff --git a/src/ng/rootScope.js b/src/ng/rootScope.js index d31ba3d24806..6c5d6ca52a11 100644 --- a/src/ng/rootScope.js +++ b/src/ng/rootScope.js @@ -149,7 +149,7 @@ function $RootScopeProvider(){ /** * @ngdoc method * @name $rootScope.Scope#$new - * @function + * @kind function * * @description * Creates a new child {@link ng.$rootScope.Scope scope}. @@ -211,7 +211,7 @@ function $RootScopeProvider(){ /** * @ngdoc method * @name $rootScope.Scope#$watch - * @function + * @kind function * * @description * Registers a `listener` callback to be executed whenever the `watchExpression` changes. @@ -371,7 +371,7 @@ function $RootScopeProvider(){ /** * @ngdoc method * @name $rootScope.Scope#$watchCollection - * @function + * @kind function * * @description * Shallow watches the properties of an object and fires whenever any of the properties change @@ -547,7 +547,7 @@ function $RootScopeProvider(){ /** * @ngdoc method * @name $rootScope.Scope#$digest - * @function + * @kind function * * @description * Processes all of the {@link ng.$rootScope.Scope#$watch watchers} of the current scope and @@ -718,7 +718,7 @@ function $RootScopeProvider(){ /** * @ngdoc method * @name $rootScope.Scope#$destroy - * @function + * @kind function * * @description * Removes the current scope (and all of its children) from the parent scope. Removal implies @@ -779,7 +779,7 @@ function $RootScopeProvider(){ /** * @ngdoc method * @name $rootScope.Scope#$eval - * @function + * @kind function * * @description * Executes the `expression` on the current scope and returns the result. Any exceptions in @@ -811,7 +811,7 @@ function $RootScopeProvider(){ /** * @ngdoc method * @name $rootScope.Scope#$evalAsync - * @function + * @kind function * * @description * Executes the expression on the current scope at a later point in time. @@ -858,7 +858,7 @@ function $RootScopeProvider(){ /** * @ngdoc method * @name $rootScope.Scope#$apply - * @function + * @kind function * * @description * `$apply()` is used to execute an expression in angular from outside of the angular @@ -920,7 +920,7 @@ function $RootScopeProvider(){ /** * @ngdoc method * @name $rootScope.Scope#$on - * @function + * @kind function * * @description * Listens on events of a given type. See {@link ng.$rootScope.Scope#$emit $emit} for @@ -969,7 +969,7 @@ function $RootScopeProvider(){ /** * @ngdoc method * @name $rootScope.Scope#$emit - * @function + * @kind function * * @description * Dispatches an event `name` upwards through the scope hierarchy notifying the @@ -1037,7 +1037,7 @@ function $RootScopeProvider(){ /** * @ngdoc method * @name $rootScope.Scope#$broadcast - * @function + * @kind function * * @description * Dispatches an event `name` downwards to all child scopes (and their children) notifying the diff --git a/src/ng/sce.js b/src/ng/sce.js index 031967ffddad..42bf61551fb4 100644 --- a/src/ng/sce.js +++ b/src/ng/sce.js @@ -65,7 +65,7 @@ function adjustMatchers(matchers) { /** * @ngdoc service * @name $sceDelegate - * @function + * @kind function * * @description * @@ -137,7 +137,7 @@ function $SceDelegateProvider() { /** * @ngdoc method * @name $sceDelegateProvider#resourceUrlWhitelist - * @function + * @kind function * * @param {Array=} whitelist When provided, replaces the resourceUrlWhitelist with the value * provided. This must be an array or null. A snapshot of this array is used so further @@ -166,7 +166,7 @@ function $SceDelegateProvider() { /** * @ngdoc method * @name $sceDelegateProvider#resourceUrlBlacklist - * @function + * @kind function * * @param {Array=} blacklist When provided, replaces the resourceUrlBlacklist with the value * provided. This must be an array or null. A snapshot of this array is used so further @@ -393,7 +393,7 @@ function $SceDelegateProvider() { /** * @ngdoc service * @name $sce - * @function + * @kind function * * @description * @@ -664,7 +664,7 @@ function $SceProvider() { /** * @ngdoc method * @name $sceProvider#enabled - * @function + * @kind function * * @param {boolean=} value If provided, then enables/disables SCE. * @return {boolean} true if SCE is enabled, false otherwise. @@ -742,7 +742,7 @@ function $SceProvider() { /** * @ngdoc method * @name $sce#isEnabled - * @function + * @kind function * * @return {Boolean} true if SCE is enabled, false otherwise. If you want to set the value, you * have to do it at module config time on {@link ng.$sceProvider $sceProvider}. diff --git a/src/ng/urlUtils.js b/src/ng/urlUtils.js index 3169248fc672..dfd3c5db989c 100644 --- a/src/ng/urlUtils.js +++ b/src/ng/urlUtils.js @@ -45,7 +45,7 @@ var originUrl = urlResolve(window.location.href, true); * https://github.com/angular/angular.js/pull/2902 * http://james.padolsey.com/javascript/parsing-urls-with-the-dom/ * - * @function + * @kind function * @param {string} url The URL to be parsed. * @description Normalizes and parses a URL. * @returns {object} Returns the normalized URL as a dictionary. diff --git a/src/ngAnimate/animate.js b/src/ngAnimate/animate.js index ca4eed98f04b..90172c18b0ed 100644 --- a/src/ngAnimate/animate.js +++ b/src/ngAnimate/animate.js @@ -501,7 +501,7 @@ angular.module('ngAnimate', ['ng']) /** * @ngdoc service * @name $animate - * @function + * @kind function * * @description * The `$animate` service provides animation detection support while performing DOM operations (enter, leave and move) as well as during addClass and removeClass operations. @@ -521,7 +521,7 @@ angular.module('ngAnimate', ['ng']) /** * @ngdoc method * @name $animate#enter - * @function + * @kind function * * @description * Appends the element to the parentElement element that resides in the document and then runs the enter animation. Once @@ -563,7 +563,7 @@ angular.module('ngAnimate', ['ng']) /** * @ngdoc method * @name $animate#leave - * @function + * @kind function * * @description * Runs the leave animation operation and, upon completion, removes the element from the DOM. Once @@ -601,7 +601,7 @@ angular.module('ngAnimate', ['ng']) /** * @ngdoc method * @name $animate#move - * @function + * @kind function * * @description * Fires the move DOM operation. Just before the animation starts, the animate service will either append it into the parentElement container or @@ -741,7 +741,7 @@ angular.module('ngAnimate', ['ng']) /** * @ngdoc method * @name $animate#enabled - * @function + * @kind function * * @param {boolean=} value If provided then set the animation on or off. * @param {DOMElement} element If provided then the element will be used to represent the enable/disable operation diff --git a/src/ngRoute/route.js b/src/ngRoute/route.js index 0f302e37b080..0b1814f132c8 100644 --- a/src/ngRoute/route.js +++ b/src/ngRoute/route.js @@ -22,7 +22,7 @@ var ngRouteModule = angular.module('ngRoute', ['ng']). /** * @ngdoc provider * @name $routeProvider - * @function + * @kind function * * @description * diff --git a/src/ngSanitize/filter/linky.js b/src/ngSanitize/filter/linky.js index 15d5afa2a8d2..bd100dcda4eb 100644 --- a/src/ngSanitize/filter/linky.js +++ b/src/ngSanitize/filter/linky.js @@ -5,7 +5,7 @@ /** * @ngdoc filter * @name linky - * @function + * @kind function * * @description * Finds links in text input and turns them into html links. Supports http/https/ftp/mailto and diff --git a/src/ngSanitize/sanitize.js b/src/ngSanitize/sanitize.js index 74441b3bf903..8f2e0ee96d7f 100644 --- a/src/ngSanitize/sanitize.js +++ b/src/ngSanitize/sanitize.js @@ -37,7 +37,7 @@ var $sanitizeMinErr = angular.$$minErr('$sanitize'); /** * @ngdoc service * @name $sanitize - * @function + * @kind function * * @description * The input is sanitized by parsing the html into tokens. All safe tokens (from a whitelist) are From 2e5fe846e370f7426eae2edce0b4bb7c7260412a Mon Sep 17 00:00:00 2001 From: rodyhaddad Date: Wed, 4 Jun 2014 17:28:59 -0700 Subject: [PATCH 404/837] chore(jqLite): remove special characters from the expando property Having special characters in the expando property created a memory bloat. See https://code.google.com/p/chromium/issues/detail?id=378607#c6 to reproduce Closes #7701 --- src/jqLite.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/jqLite.js b/src/jqLite.js index 696f695e737d..d235b277a81a 100644 --- a/src/jqLite.js +++ b/src/jqLite.js @@ -99,7 +99,7 @@ */ var jqCache = JQLite.cache = {}, - jqName = JQLite.expando = 'ng-' + new Date().getTime(), + jqName = JQLite.expando = 'ng' + new Date().getTime(), jqId = 1, addEventListenerFn = (window.document.addEventListener ? function(element, type, fn) {element.addEventListener(type, fn, false);} From 2395bf604df5d665a73dce4f143e35bf9493040c Mon Sep 17 00:00:00 2001 From: rodyhaddad Date: Thu, 5 Jun 2014 14:14:48 -0700 Subject: [PATCH 405/837] test(jqLite): adapt tests to new expando name --- test/AngularSpec.js | 2 +- test/helpers/testabilityPatch.js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/test/AngularSpec.js b/test/AngularSpec.js index ea7204660f6f..2a266820eac1 100644 --- a/test/AngularSpec.js +++ b/test/AngularSpec.js @@ -795,7 +795,7 @@ describe('angular', function() { expect(function () { angular.bootstrap(element); }).toThrowMatching( - /\[ng:btstrpd\] App Already Bootstrapped with this Element '
                          '/i + /\[ng:btstrpd\] App Already Bootstrapped with this Element '
                          '/i ); dealoc(element); diff --git a/test/helpers/testabilityPatch.js b/test/helpers/testabilityPatch.js index 34b6b78a0141..ef7fc150b999 100644 --- a/test/helpers/testabilityPatch.js +++ b/test/helpers/testabilityPatch.js @@ -166,7 +166,7 @@ function sortedHtml(element, showNgClass) { attr.name !='style' && attr.name.substr(0, 6) != 'jQuery') { // in IE we need to check for all of these. - if (/ng-\d+/.exec(attr.name) || + if (/ng\d+/.exec(attr.name) || attr.name == 'getElementById' || // IE7 has `selected` in attributes attr.name == 'selected' || From 6ffd53ee3c69dee430d52991fd1317489765af0d Mon Sep 17 00:00:00 2001 From: rodyhaddad Date: Thu, 5 Jun 2014 14:45:26 -0700 Subject: [PATCH 406/837] test(jqLite): adapt missed test to new expando name --- test/ng/compileSpec.js | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/test/ng/compileSpec.js b/test/ng/compileSpec.js index daeae7ac65fc..496ff8dada3d 100755 --- a/test/ng/compileSpec.js +++ b/test/ng/compileSpec.js @@ -330,9 +330,8 @@ describe('$compile', function() { elementName = parts.shift(); parts.sort(); parts.unshift(elementName); - forEach(parts, function(value, key){ - if (value.substring(0,3) == 'ng-') { - } else { + forEach(parts, function(value){ + if (value.substring(0,2) !== 'ng') { value = value.replace('=""', ''); var match = value.match(/=(.*)/); if (match && match[1].charAt(0) != '"') { From 2e0464fba4ced5e561e26ee604ebf7671b955363 Mon Sep 17 00:00:00 2001 From: Caitlin Potter Date: Tue, 3 Jun 2014 21:30:48 -0400 Subject: [PATCH 407/837] test($http): test that timed out $http request rejects promise Closes #7688 Closes #7686 --- test/ng/httpSpec.js | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/test/ng/httpSpec.js b/test/ng/httpSpec.js index 14ac8433437f..e996c6dff48c 100644 --- a/test/ng/httpSpec.js +++ b/test/ng/httpSpec.js @@ -1427,6 +1427,20 @@ describe('$http', function() { $httpBackend.verifyNoOutstandingExpectation(); $httpBackend.verifyNoOutstandingRequest(); })); + + + it('should reject promise when timeout promise resolves', inject(function($timeout) { + var onFulfilled = jasmine.createSpy('onFulfilled'); + var onRejected = jasmine.createSpy('onRejected'); + $httpBackend.expect('GET', '/some').respond(200); + + $http({method: 'GET', url: '/some', timeout: $timeout(noop, 10)}).then(onFulfilled, onRejected); + + $timeout.flush(100); + + expect(onFulfilled).not.toHaveBeenCalled(); + expect(onRejected).toHaveBeenCalledOnce(); + })); }); From a4367ab00dce144853ffb733809ab6b0124317fc Mon Sep 17 00:00:00 2001 From: Samuel Rats Date: Fri, 6 Jun 2014 16:43:17 +0200 Subject: [PATCH 408/837] docs($http): remove duplicate 'to' in withCredentials description Typo in $http config documentation Closes #7731 --- src/ng/http.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ng/http.js b/src/ng/http.js index 350a81049d89..fff8871764a2 100644 --- a/src/ng/http.js +++ b/src/ng/http.js @@ -552,7 +552,7 @@ function $HttpProvider() { * caching. * - **timeout** – `{number|Promise}` – timeout in milliseconds, or {@link ng.$q promise} * that should abort the request when resolved. - * - **withCredentials** - `{boolean}` - whether to to set the `withCredentials` flag on the + * - **withCredentials** - `{boolean}` - whether to set the `withCredentials` flag on the * XHR object. See [requests with credentials]https://developer.mozilla.org/en/http_access_control#section_5 * for more information. * - **responseType** - `{string}` - see From 6acc73f3e04cf7fed5faaaac75bbef4e805e8c1e Mon Sep 17 00:00:00 2001 From: Peter Bacon Darwin Date: Fri, 6 Jun 2014 20:12:46 +0100 Subject: [PATCH 409/837] chore(CHANGELOG.md): add changes for 1.2.17 --- CHANGELOG.md | 100 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 100 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 76a780803dbb..d865d0d135f6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,103 @@ + +# 1.2.17 - quantum disentanglement (2014-06-06) + + +## Bug Fixes + +- **$animate:** + - remove the need to add `display:block!important` for `ngShow`/`ngHide` + ([55b2f0e8](https://github.com/angular/angular.js/commit/55b2f0e8620465559016b424967d90a86af597c0), + [#3813](https://github.com/angular/angular.js/issues/3813)) + - retain inline styles for property-specific transitions + ([ad08638c](https://github.com/angular/angular.js/commit/ad08638c0ae61a22ce43d0b40e1220065b867672), + [#7503](https://github.com/angular/angular.js/issues/7503)) + - ensure class-based animations always perform a DOM operation if skipped + ([34d07403](https://github.com/angular/angular.js/commit/34d0740350a50ff2c3a076eaad1e8122283448c3), + [#6957](https://github.com/angular/angular.js/issues/6957)) +- **$compile:** + - do not merge attrs that are the same for replace directives + ([b635903e](https://github.com/angular/angular.js/commit/b635903ec435ea355b0f3688c7372627d01e23e2), + [#7463](https://github.com/angular/angular.js/issues/7463)) + - pass `transcludeFn` down to nested transclude directives + ([11385060](https://github.com/angular/angular.js/commit/113850602de2f8bc396df4ffd54bb0f1be565b17), + [#7240](https://github.com/angular/angular.js/issues/7240), [#7387](https://github.com/angular/angular.js/issues/7387)) + - set `$isolateScope` correctly for sync template directives + ([5319621a](https://github.com/angular/angular.js/commit/5319621afd0edf60aef177a0e98dbb7c282cc418), + [#6942](https://github.com/angular/angular.js/issues/6942)) + - reference correct directive name in `ctreq` error + ([6bea0591](https://github.com/angular/angular.js/commit/6bea0591095c19f747c08ef24cc60b34d28b2824), + [#7062](https://github.com/angular/angular.js/issues/7062), [#7067](https://github.com/angular/angular.js/issues/7067)) + - fix regression which affected old jQuery releases + ([a97a172e](https://github.com/angular/angular.js/commit/a97a172ee9f9bcff4d4d84854ded0c72fa0f7e9a)) +- **$httpBackend:** don't error when JSONP callback is called with no parameter + ([a7ccb753](https://github.com/angular/angular.js/commit/a7ccb7531c92fb976c6058aef2bb18316075efb2), + [#7031](https://github.com/angular/angular.js/issues/7031)) +- **$location:** + - don't clobber path during parsing of path + ([02058bfb](https://github.com/angular/angular.js/commit/02058bfbe27296c5441fc247e5a451da83c74134), + [#7199](https://github.com/angular/angular.js/issues/7199)) + - fix and test html5Mode url-parsing algorithm for legacy browsers + ([24f7999b](https://github.com/angular/angular.js/commit/24f7999bc16e347208aa18c418da85489286674b)) + - make legacy browsers behave like modern ones in html5Mode + ([e0203660](https://github.com/angular/angular.js/commit/e0203660d3af56c5a94e0a9b69c10fd5dabcf577), + [#6162](https://github.com/angular/angular.js/issues/6162), [#6421](https://github.com/angular/angular.js/issues/6421), [#6899](https://github.com/angular/angular.js/issues/6899), [#6832](https://github.com/angular/angular.js/issues/6832), [#6834](https://github.com/angular/angular.js/issues/6834)) +- **angular.copy:** support circular references in the value being copied + ([5c997209](https://github.com/angular/angular.js/commit/5c99720934edc35dd462b1ad02c4d0205683d917), + [#7618](https://github.com/angular/angular.js/issues/7618)) +- **grunt-utils:** ensure special inline CSS works when `angular` is not a global + ([d4231171](https://github.com/angular/angular.js/commit/d4231171582eb41d37bbb908eed23f074ab12f3f), + [#7176](https://github.com/angular/angular.js/issues/7176)) +- **input:** + - fix `ReferenceError` in event listener + ([2d7cb14a](https://github.com/angular/angular.js/commit/2d7cb14a167560edc1356dcec6f9e100ed7ac691)) + - don't dirty model when input event is triggered due to a placeholder change + ([109e5d1d](https://github.com/angular/angular.js/commit/109e5d1d39015af8ade1dc2aff31a2355fbab0a6), + [#2614](https://github.com/angular/angular.js/issues/2614), [#5960](https://github.com/angular/angular.js/issues/5960)) +- **jqLite:** use jQuery only if `jQuery.fn.on` is present + ([fafcd628](https://github.com/angular/angular.js/commit/fafcd6285a6799c4e377ea33011ae3a01aac49a6)) +- **limitTo:** do not convert `Infinity` to `NaN` + ([fcdac65a](https://github.com/angular/angular.js/commit/fcdac65aedfdf48dd2e11d6e5850e03ec188f068), + [#6771](https://github.com/angular/angular.js/issues/6771), [#7118](https://github.com/angular/angular.js/issues/7118)) +- **ngAnimate:** `$animate` methods should accept native DOM elements + ([9227a5db](https://github.com/angular/angular.js/commit/9227a5db947a78e3dbe8b91d5dac5d67444c855c)) +- **ngClass:** + - support multiple classes in key + ([85ce5d0d](https://github.com/angular/angular.js/commit/85ce5d0db9fc4ee5636015fc042224785f9aa997)) + - handle index changes when an item is unshifted + ([a4cc9e19](https://github.com/angular/angular.js/commit/a4cc9e194468573bae5232f63044459d0de6638f), + [#7256](https://github.com/angular/angular.js/issues/7256)) +- **ngLocale:** fix i18n code-generation to support `get_vf_`, `decimals_`, and `get_wt_` + ([96a31476](https://github.com/angular/angular.js/commit/96a314766c41bbb18bcddeddd25c8e566ab76acd)) +- **ngSanitize:** encode surrogate pair properly + ([3d0b49c0](https://github.com/angular/angular.js/commit/3d0b49c07f10c0a723c91629c63705647b690d81), + [#5088](https://github.com/angular/angular.js/issues/5088), [#6911](https://github.com/angular/angular.js/issues/6911)) +- **ngSwitch:** properly support case labels with different numbers of transclude fns + ([32aa4915](https://github.com/angular/angular.js/commit/32aa491588fe4982d4056e89a5d0dd19cf835e72)) +- **numberFilter:** fix rounding error edge case + ([0388eed7](https://github.com/angular/angular.js/commit/0388eed7e52fdbb832a5b4ef466420a128a43800), + [#7453](https://github.com/angular/angular.js/issues/7453), [#7478](https://github.com/angular/angular.js/issues/7478)) + + +## Features + +- **injector:** "strict-DI" mode which disables "automatic" function annotation + ([f5a04f59](https://github.com/angular/angular.js/commit/f5a04f59cf8e8dd6d1806059e3d7fe440aa1613e), + [#6719](https://github.com/angular/angular.js/issues/6719), [#6717](https://github.com/angular/angular.js/issues/6717), [#4504](https://github.com/angular/angular.js/issues/4504), [#6069](https://github.com/angular/angular.js/issues/6069), [#3611](https://github.com/angular/angular.js/issues/3611)) +- **ngMock:** add support of mocha tdd interface + ([6d1c6772](https://github.com/angular/angular.js/commit/6d1c67727ab872c44addc783ef1406952142d89e), + [#7489](https://github.com/angular/angular.js/issues/7489)) + + +## Performance Improvements + +- **$interpolate:** optimize value stringification + ([9d4fa33e](https://github.com/angular/angular.js/commit/9d4fa33e35d73ab28a8a187e20dfbe1f77055825), + [#7501](https://github.com/angular/angular.js/issues/7501)) +- **scope:** 10x. Share the child scope class. + ([9ab9bf6b](https://github.com/angular/angular.js/commit/9ab9bf6b415aa216cfbfda040286e5ec99f56ee0)) + + + # 1.2.16 badger-enumeration (2014-04-03) From e906aafb0ae30db3e26c0d1286f0eff54da3be14 Mon Sep 17 00:00:00 2001 From: Peter Bacon Darwin Date: Fri, 6 Jun 2014 10:43:02 +0100 Subject: [PATCH 410/837] docs(tutorial): mention additional Debian install step Thanks to GSC Leticia (gsc-leticia) for identifying this problem. Closes #7665 --- docs/content/tutorial/index.ngdoc | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/docs/content/tutorial/index.ngdoc b/docs/content/tutorial/index.ngdoc index fd3e7a2d4fac..018ef6b5b491 100644 --- a/docs/content/tutorial/index.ngdoc +++ b/docs/content/tutorial/index.ngdoc @@ -105,9 +105,12 @@ Check the version of Node.js that you have installed by running the following co node --version ``` -Or in Debian based distributions: +In Debian based distributions, there is a name clash with another utility called `node`. The +suggested solution is to also install the `nodejs-legacy` apt package, which renames `node` to +`nodejs`. ``` +apt-get install nodejs-legacy nodejs --version ``` From 6c14fb1eb61dc0a0552fbcb2ca3ace11c9a2f6a5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebastian=20M=C3=BCller?= Date: Fri, 6 Jun 2014 21:37:28 +0200 Subject: [PATCH 411/837] perf(isArray): use native Array.isArray see benchmark: http://jsperf.com/isarray-performance --- src/Angular.js | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/src/Angular.js b/src/Angular.js index f648a0348cf8..e09351d9b583 100644 --- a/src/Angular.js +++ b/src/Angular.js @@ -510,10 +510,14 @@ function isDate(value) { * @param {*} value Reference to check. * @returns {boolean} True if `value` is an `Array`. */ -function isArray(value) { - return toString.call(value) === '[object Array]'; -} - +var isArray = (function() { + if (!isFunction(Array.isArray)) { + return function(value) { + return toString.call(value) === '[object Array]'; + }; + } + return Array.isArray; +})(); /** * @ngdoc function From 66cb161221d4cd47eeccc30630fe53e1914d9d51 Mon Sep 17 00:00:00 2001 From: Caitlin Potter Date: Sun, 8 Jun 2014 02:05:35 -0400 Subject: [PATCH 412/837] docs(CHANGELOG.md): remove mention of strict-DI Strict-DI feature was originally merged into v1.2.x, but was reverted by https://github.com/angular/angular.js/commit/373078a94cf3d525b9ae11a2f2876acb6e26f6a3 --- CHANGELOG.md | 3 --- 1 file changed, 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index d865d0d135f6..4ab92563ca0b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -80,9 +80,6 @@ ## Features -- **injector:** "strict-DI" mode which disables "automatic" function annotation - ([f5a04f59](https://github.com/angular/angular.js/commit/f5a04f59cf8e8dd6d1806059e3d7fe440aa1613e), - [#6719](https://github.com/angular/angular.js/issues/6719), [#6717](https://github.com/angular/angular.js/issues/6717), [#4504](https://github.com/angular/angular.js/issues/4504), [#6069](https://github.com/angular/angular.js/issues/6069), [#3611](https://github.com/angular/angular.js/issues/3611)) - **ngMock:** add support of mocha tdd interface ([6d1c6772](https://github.com/angular/angular.js/commit/6d1c67727ab872c44addc783ef1406952142d89e), [#7489](https://github.com/angular/angular.js/issues/7489)) From d8521224427de1becec1a0ca9ec10c77362a276e Mon Sep 17 00:00:00 2001 From: Peter Bacon Darwin Date: Sun, 8 Jun 2014 19:29:31 +0100 Subject: [PATCH 413/837] docs(error/$rootScope/inprog): improve understanding and diagnosis of the error See #5549 --- docs/content/error/$rootScope/inprog.ngdoc | 308 ++++++++++++++++++--- 1 file changed, 273 insertions(+), 35 deletions(-) diff --git a/docs/content/error/$rootScope/inprog.ngdoc b/docs/content/error/$rootScope/inprog.ngdoc index 375f8fe803f2..2249a14e5e2a 100644 --- a/docs/content/error/$rootScope/inprog.ngdoc +++ b/docs/content/error/$rootScope/inprog.ngdoc @@ -3,72 +3,310 @@ @fullName Action Already In Progress @description -At any point in time there can be only one `$digest` or $apply operation in progress. -The stack trace of this error allows you to trace the origin of the currently executing $apply or $digest call. +At any point in time there can be only one `$digest` or `$apply` operation in progress. This is to +prevent very hard to detect bugs from entering your application. The stack trace of this error +allows you to trace the origin of the currently executing `$apply` or `$digest` call, which caused +the error. -`$digest` or `$apply` are processing operational states of the Scope - data-structure in Angular that provides context for models and enables model mutation observation. +## Background -Trying to reenter a `$digest` or `$apply` while one of them is already in progress is typically a sign of programming error that needs to be fixed. +Angular uses a dirty-checking digest mechanism to monitor and update values of the scope during +the processing of your application. The digest works by checking all the values that are being +watched against their previous value and running any watch handlers that have been defined for those +values that have changed. + +This digest mechanism is triggered by calling `$digest` on a scope object. Normally you do not need +to trigger a digest manually, because every external action that can trigger changes in your +application, such as mouse events, timeouts or server responses, wrap the Angular application code +in a block of code that will run `$digest` when the code completes. + +You wrap Angular code in a block that will be followed by a `$digest` by calling `$apply` on a scope +object. So, in pseudo-code, the process looks like this: + +``` +element.on('mouseup', function() { + scope.$apply(function() { + $scope.doStuff(); + }); +}); +``` + +where `$apply()` looks something like: + +``` +$apply = function(fn) { + try { + fn(); + } finally() { + $digest(); + } +} +``` + +## Digest Phases + +Angular keeps track of what phase of processing we are in, the relevant ones being `$apply` and +`$digest`. Trying to reenter a `$digest` or `$apply` while one of them is already in progress is +typically a sign of programming error that needs to be fixed. So Angular will throw this error when +that occurs. + +In most situations it should be well defined whether a piece of code will be run inside an `$apply`, +in which case you should not be calling `$apply` or `$digest`, or it will be run outside, in which +case you should wrap any code that will be interacting with Angular scope or services, in a call to +`$apply`. + +As an example, all Controller code should expect to be run within Angular, so it should have no need +to call `$apply` or `$digest`. Conversely, code that is being trigger directly as a call back to +some external event, from the DOM or 3rd party library, should expect that it is never called from +within Angular, and so any Angular application code that it calls should first be wrapped in a call +to $apply. + +## Common Causes + +Apart from simply incorrect calls to `$apply` or `$digest` there are some cases when you may get +this error through no fault of your own. + +### Inconsistent API (Sync/Async) This error is often seen when interacting with an API that is sometimes sync and sometimes async. -For example: +For example, imagine a 3rd party library that has a method which will retrieve data for us. Since it +may be making an asynchronous call to a server, it accepts a callback function, which will be called +when the data arrives. ``` -function MyController() { +function MyController($scope, thirdPartyComponent) { thirdPartyComponent.getData(function(someData) { - scope.$apply(function() { - scope.someData = someData; + $scope.$apply(function() { + $scope.someData = someData; }); }); } ``` -The controller constructor is always instantiated from within an $apply cycle, so if the third-party component called our callback synchronously, we'd be trying to enter the $apply again. +We expect that our callback will be called asynchronously, and so from outside Angular. Therefore, we +correctly wrap our application code that interacts with Angular in a call to `$apply`. -To resolve this type of issue, either fix the api to be always synchronous or asynchronous or wrap the call to the api with setTimeout call to make it always asynchronous. +The problem comes if `getData()` decides to call the callback handler synchronously; perhaps it has +the data already cached in memory and so it immediately calls the callback to return the data, +synchronously. +Since, the `MyController` constructor is always instantiated from within an `$apply` call, our +handler is trying to enter a new `$apply` block from within one. -Other situation that leads to this error is when you are trying to reuse a function to by using it as a callback for code that is called by various apis inside and outside of $apply. +This is not an ideal design choice on the part of the 3rd party library. -For example: +To resolve this type of issue, either fix the api to be always synchronous or asynchronous or force +your callback handler to always run asynchronously by using the `$timeout` service. ``` -myApp.directive('myDirective', function() { +function MyController($scope, thirdPartyComponent) { + thirdPartyComponent.getData(function(someData) { + $timeout(function() { + $scope.someData = someData; + }, 0); + }); +} +``` + +Here we have used `$timeout` to schedule the changes to the scope in a future call stack. +By providing a timeout period of 0ms, this will occur as soon as possible and `$timeout` will ensure +that the code will be called in a single `$apply` block. + +### Triggering Events Programmatically + +The other situation that often leads to this error is when you trigger code (such as a DOM event) +programmatically (from within Angular), which is normally called by an external trigger. + +For example, consider a directive that will set focus on an input control when a value in the scope +is true: + +``` +myApp.directive('setFocusIf', function() { return { - link: function($scope, $element) { - function doSomeWork() { - $scope.$apply(function() { - // do work here, and update the model - }; - } - - $element.on('click', doSomeWork); - doSomeWork(); // << this will throw an exception because templates are compiled within $apply + link: function($scope, $element, $attr) { + $scope.$watch($attr.setFocusIf, function(value) { + if ( value ) { $element[0].focus(); } + }); } - } + }; }); +``` +If we applied this directive to an input which also used the `ngFocus` directive to trigger some +work when the element receives focus we will have a problem: + +``` + + ``` -The fix for the example above looks like this: +In this setup, there are two ways to trigger ngFocus. First from a user interaction: + +* Click on the input control +* The input control gets focus +* The `ngFocus` directive is triggered, setting `$scope.msg='has focus'` from within a new call to +`$apply()` + +Second programmatically: + +* Click the button +* The `ngClick` directive sets the value of `$scope.hasFocus` to true inside a call to `$apply` +* The `$digest` runs, which triggers the watch inside the `setFocusIf` directive +* The watch's handle runs, which gives the focus to the input +* The `ngFocus` directive is triggered, setting `$scope.msg='has focus'` from within a new call to +`$apply()` + +In this second scenario, we are already inside a `$digest` when the ngFocus directive makes another +call to `$apply()`, causing this error to be thrown. + +It is possible to workaround this problem by moving the call to set the focus outside of the digest, +by using `$timeOut(fn, 0, false)`, where the `false` value tells Angular not to wrap this `fn` in a +`$apply` block: + ``` -myApp.directive('myDirective', function() { +myApp.directive('setFocusIf', function($timeout) { return { - link: function($scope, $element) { - function doSomeWork() { - // do work here, and update the model - } - - $element.on('click', function() { - $scope.$apply(doSomeWork); // <<< the $apply call was moved to the callsite that doesn't execute in $apply call already + link: function($scope, $element, $attr) { + $scope.$watch($attr.setFocusIf, function(value) { + if ( value ) { + $timeout(function() { + // We must reevaluate the value in case it was changed by a subsequent + // watch handler in the digest. + if ( $scope.$eval($attr.setFocusIf) ) { + $element[0].focus(); + } + }, 0, false); + } }); - - doSomeWork(); } } }); +``` + +## Diagnosing This Error + +When you get this error it can be rather daunting to diagnose the cause of the issue. The best +course of action is to investigate the stack trace from the error. You need to look for places +where `$apply` or `$digest` have been called and find the context in which this occurred. + +There should be two calls: + +* The first call is the good `$apply`/`$digest` and would normally be triggered by some event near +the top of the call stack. + +* The second call is the bad `$apply`/`$digest` and this is the one to investigate. + +Once you have identified this call you work your way up the stack to see what the problem is. + +* If the second call was made in your application code then you should look at why this code has been +called from within a `$apply`/`$digest`. It may be a simple oversight or maybe it fits with the +sync/async scenario described earlier. + +* If the second call was made inside an Angular directive then it is likely that it matches the second +programmatic event trigger scenario described earlier. In this case you may need to look further up +the tree to what triggered the event in the first place. + +### Example Problem + +Let's look at how to investigate this error using the `setFocusIf` example from above. This example +defines a new `setFocusIf` directive that sets the focus on the element where it is defined when the +value of its attribute becomes true. + + + + + + + + angular.module('app', []).directive('setFocusIf', function() { + return function link($scope, $element, $attr) { + $scope.$watch($attr.setFocusIf, function(value) { + if ( value ) { $element[0].focus(); } + }); + }; + }); + + + +When you click on the button to cause the focus to occur we get our `$rootScope:inprog` error. The +stacktrace looks like this: + +``` +Error: [$rootScope:inprog] + at Error (native) + at angular.min.js:6:467 + at n (angular.min.js:105:60) + at g.$get.g.$apply (angular.min.js:113:195) + at HTMLInputElement. (angular.min.js:198:401) + at angular.min.js:32:32 + at Array.forEach (native) + at q (angular.min.js:7:295) + at HTMLInputElement.c (angular.min.js:32:14) + at Object.fn (app.js:12:38) angular.js:10111 +(anonymous function) angular.js:10111 +$get angular.js:7412 +$get.g.$apply angular.js:12738 <--- $apply +(anonymous function) angular.js:19833 <--- called here +(anonymous function) angular.js:2890 +q angular.js:320 +c angular.js:2889 +(anonymous function) app.js:12 +$get.g.$digest angular.js:12469 +$get.g.$apply angular.js:12742 <--- $apply +(anonymous function) angular.js:19833 <--- called here +(anonymous function) angular.js:2890 +q angular.js:320 +``` + +We can see (even though the Angular code is minified) that there were two calls to `$apply`, first +on line `19833`, then on line `12738` of `angular.js`. + +It is this second call that caused the error. If we look at the angular.js code, we can see that +this call is made by an Angular directive. ``` +var ngEventDirectives = {}; +forEach( + 'click dblclick mousedown mouseup mouseover mouseout mousemove mouseenter mouseleave keydown keyup keypress submit focus blur copy cut paste'.split(' '), + function(name) { + var directiveName = directiveNormalize('ng-' + name); + ngEventDirectives[directiveName] = ['$parse', function($parse) { + return { + compile: function($element, attr) { + var fn = $parse(attr[directiveName]); + return function(scope, element, attr) { + element.on(lowercase(name), function(event) { + scope.$apply(function() { + fn(scope, {$event:event}); + }); + }); + }; + } + }; + }]; + } +); +``` + +It is not possible to tell which from the stack trace, but we happen to know in this case that it is +the `ngFocus` directive. + +Now look up the stack to see that our application code is only entered once in `app.js` at line `12`. +This is where our problem is: + +``` +10: link: function($scope, $element, $attr) { +11: $scope.$watch($attr.setFocusIf, function(value) { +12: if ( value ) { $element[0].focus(); } <---- This is the source of the problem +13: }); +14: } +``` + +We can now see that the second `$apply` was caused by us programmatically triggering a DOM event +(i.e. focus) to occur. We must fix this by moving the code outside of the $apply block using +`$timeout` as described above. -To learn more about Angular processing model please check out the {@link guide/concepts concepts doc} as well as the {@link ng.$rootScope.Scope api} doc. +## Further Reading +To learn more about Angular processing model please check out the +{@link guide/concepts concepts doc} as well as the {@link ng.$rootScope.Scope api} doc. From 6f6f7e82a4f5799e5c1eef02206a870b23989151 Mon Sep 17 00:00:00 2001 From: Nikita Vasilyev Date: Sun, 8 Jun 2014 19:01:06 -0700 Subject: [PATCH 414/837] docs(guide/databinding): add line breaks after images This looks much better, thanks a bunch @NV --- docs/content/guide/databinding.ngdoc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/content/guide/databinding.ngdoc b/docs/content/guide/databinding.ngdoc index c7ce3358ddf5..3362b8a80394 100644 --- a/docs/content/guide/databinding.ngdoc +++ b/docs/content/guide/databinding.ngdoc @@ -9,7 +9,7 @@ When the model changes, the view reflects the change, and vice versa. ## Data Binding in Classical Template Systems - +
                          Most templating systems bind data in only one direction: they merge template and model components together into a view. After the merge occurs, changes to the model or related sections of the view are NOT automatically reflected in the view. Worse, any changes @@ -18,7 +18,7 @@ to write code that constantly syncs the view with the model and the model with t ## Data Binding in Angular Templates - +
                          Angular templates work differently. First the template (which is the uncompiled HTML along with any additional markup or directives) is compiled on the browser. The compilation step produces a live view. Any changes to the view are immediately reflected in the model, and any changes in From 1e069532fca27234c537b4744ba89c09b017cb38 Mon Sep 17 00:00:00 2001 From: Joseph Orbegoso Pea Date: Sun, 30 Mar 2014 14:23:57 -0700 Subject: [PATCH 415/837] docs(ngController): improve wording --- src/ng/directive/ngController.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ng/directive/ngController.js b/src/ng/directive/ngController.js index 3ad2cfbee032..68a82709bc3a 100644 --- a/src/ng/directive/ngController.js +++ b/src/ng/directive/ngController.js @@ -10,7 +10,7 @@ * * MVC components in angular: * - * * Model — The Model is scope properties; scopes are attached to the DOM where scope properties + * * Model — Models are the properties of a scope; scopes are attached to the DOM where scope properties * are accessed through bindings. * * View — The template (HTML with data bindings) that is rendered into the View. * * Controller — The `ngController` directive specifies a Controller class; the class contains business From 8c02122837c3f338b1331b5bb8dbf9e1d8214463 Mon Sep 17 00:00:00 2001 From: Uri Goldshtein Date: Tue, 14 Jan 2014 16:42:26 +0200 Subject: [PATCH 416/837] docs(guide): add ngTagsInput to UI Widgets --- docs/content/guide/index.ngdoc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/content/guide/index.ngdoc b/docs/content/guide/index.ngdoc index 98a46fc6c1a3..98bf31304de9 100644 --- a/docs/content/guide/index.ngdoc +++ b/docs/content/guide/index.ngdoc @@ -73,7 +73,7 @@ This is a short list of libraries with specific support and documentation for wo * **Internationalization:** [angular-translate](http://angular-translate.github.io), [angular-gettext](http://angular-gettext.rocketeer.be/) * **RESTful services:** [Restangular](https://github.com/mgonto/restangular) * **SQL and NoSQL backends:** [BreezeJS](http://www.breezejs.com/), [AngularFire](http://angularfire.com/) -* **UI Widgets: **[KendoUI](http://kendo-labs.github.io/angular-kendo/#/), [UI Bootstrap](http://angular-ui.github.io/bootstrap/), [Wijmo](http://wijmo.com/tag/angularjs-2/) +* **UI Widgets: **[KendoUI](http://kendo-labs.github.io/angular-kendo/#/), [UI Bootstrap](http://angular-ui.github.io/bootstrap/), [Wijmo](http://wijmo.com/tag/angularjs-2/), [ngTagsInput](https://github.com/mbenford/ngTagsInput) * **Advanced Routing:** [UI-Router](https://github.com/angular-ui/ui-router) ## Deployment From 98a2563ec406890f0485cb44a130c4a98d2741a6 Mon Sep 17 00:00:00 2001 From: Uri Goldshtein Date: Tue, 14 Jan 2014 16:38:45 +0200 Subject: [PATCH 417/837] docs(guide): add UI-Map to Complementary Libraries --- docs/content/guide/index.ngdoc | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/content/guide/index.ngdoc b/docs/content/guide/index.ngdoc index 98bf31304de9..e79d73b393bd 100644 --- a/docs/content/guide/index.ngdoc +++ b/docs/content/guide/index.ngdoc @@ -75,6 +75,7 @@ This is a short list of libraries with specific support and documentation for wo * **SQL and NoSQL backends:** [BreezeJS](http://www.breezejs.com/), [AngularFire](http://angularfire.com/) * **UI Widgets: **[KendoUI](http://kendo-labs.github.io/angular-kendo/#/), [UI Bootstrap](http://angular-ui.github.io/bootstrap/), [Wijmo](http://wijmo.com/tag/angularjs-2/), [ngTagsInput](https://github.com/mbenford/ngTagsInput) * **Advanced Routing:** [UI-Router](https://github.com/angular-ui/ui-router) +* **Maps:** [UI-Map (Google Maps)](https://github.com/angular-ui/ui-map) ## Deployment From 2dc55ff5c2e4da058cff93d5cac5da554c1656ba Mon Sep 17 00:00:00 2001 From: Arjunkumar Date: Thu, 5 Jun 2014 12:43:40 +0530 Subject: [PATCH 418/837] docs(guide/index): add codeschool link --- docs/content/guide/index.ngdoc | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/content/guide/index.ngdoc b/docs/content/guide/index.ngdoc index e79d73b393bd..2865621cc605 100644 --- a/docs/content/guide/index.ngdoc +++ b/docs/content/guide/index.ngdoc @@ -113,6 +113,7 @@ This is a short list of libraries with specific support and documentation for wo * **Free online:** [thinkster.io](http://thinkster.io), [CodeAcademy](http://www.codecademy.com/courses/javascript-advanced-en-2hJ3J/0/1) + [CodeSchool](https://www.codeschool.com/courses/shaping-up-with-angular-js) * **Paid online:** [Pluralsite (3 courses)](http://www.pluralsight.com/training/Courses/Find?highlight=true&searchTerm=angularjs), [Tuts+](https://tutsplus.com/course/easier-js-apps-with-angular/), From 73640a6b7cdeca9fb592d85727d1d23a89a082d7 Mon Sep 17 00:00:00 2001 From: Stephen Nancekivell Date: Thu, 10 Apr 2014 10:58:42 +1000 Subject: [PATCH 419/837] docs(error/$sce/unsafe): suggest including ngSanatize --- docs/content/error/$sce/unsafe.ngdoc | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/content/error/$sce/unsafe.ngdoc b/docs/content/error/$sce/unsafe.ngdoc index fdddf61bf6b9..bdde4e6a776c 100644 --- a/docs/content/error/$sce/unsafe.ngdoc +++ b/docs/content/error/$sce/unsafe.ngdoc @@ -13,3 +13,4 @@ Angular template from a URL requires that the URL is one considered safe for loa This helps prevent XSS and other security issues. Read more at {@link api/ng.$sce Strict Contextual Escaping (SCE)} +You may want to include the ngSanitize module to use the automatic sanitizing. From 286f2697530492de08a61d0da64c5fa83ec6f516 Mon Sep 17 00:00:00 2001 From: Matt Johansen Date: Mon, 9 Jun 2014 22:41:50 -0500 Subject: [PATCH 420/837] docs(tutorial/step_09): note about 'Filter' suffix Reminder that 'Filter' is appended to filter names when injected. Link to Filter guide where this is mentioned. --- docs/content/tutorial/step_09.ngdoc | 3 +++ 1 file changed, 3 insertions(+) diff --git a/docs/content/tutorial/step_09.ngdoc b/docs/content/tutorial/step_09.ngdoc index c6df1f9a246f..6ed5d9cae95d 100644 --- a/docs/content/tutorial/step_09.ngdoc +++ b/docs/content/tutorial/step_09.ngdoc @@ -109,6 +109,9 @@ for this test run. Note that we call the helper function, `inject(function(checkmarkFilter) { ... })`, to get access to the filter that we want to test. See {@link angular.mock.inject angular.mock.inject()}. +Notice that the suffix 'Filter' is appended to your filter name when injected. +See the {@link Filters Filter Guide} - 'Using filters in controllers and services' section where this is outlined. + You should now see the following output in the Karma tab:
                          Chrome 22.0: Executed 4 of 4 SUCCESS (0.034 secs / 0.012 secs)
                          From eae658fd9673656dfd6abc777c7031e6eb2470ca Mon Sep 17 00:00:00 2001 From: Carl Sutherland Date: Thu, 13 Feb 2014 14:04:44 -0800 Subject: [PATCH 421/837] docs(directive/input): document ngTrim for textarea --- src/ng/directive/input.js | 1 + 1 file changed, 1 insertion(+) diff --git a/src/ng/directive/input.js b/src/ng/directive/input.js index 16b256a4abd5..7b0412bd80e8 100644 --- a/src/ng/directive/input.js +++ b/src/ng/directive/input.js @@ -749,6 +749,7 @@ function checkboxInputType(scope, element, attr, ctrl) { * patterns defined as scope expressions. * @param {string=} ngChange Angular expression to be executed when input changes due to user * interaction with the input element. + * @param {boolean=} [ngTrim=true] If set to false Angular will not automatically trim the input. */ From f37c6f9f732bf5106249c43a0c6eb392e897ffd1 Mon Sep 17 00:00:00 2001 From: Dylan Semler Date: Tue, 3 Jun 2014 20:36:04 -0400 Subject: [PATCH 422/837] docs(error/$compile/tplrt): note that html comments can cause this --- docs/content/error/$compile/tplrt.ngdoc | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/docs/content/error/$compile/tplrt.ngdoc b/docs/content/error/$compile/tplrt.ngdoc index 3c29dbdcdc7e..5cc6fafbc905 100644 --- a/docs/content/error/$compile/tplrt.ngdoc +++ b/docs/content/error/$compile/tplrt.ngdoc @@ -37,3 +37,17 @@ elements. For example: ``` Hello World! ``` + +Watch out for html comments at the beginning or end of templates, as these can cause this error as +well. Consider the following template: + +``` +
                          + * - + -
                          +


                          From a5b6444324b81176782786e9e693c062104f7eac Mon Sep 17 00:00:00 2001 From: Brian Ford Date: Mon, 7 Jul 2014 14:16:47 -0700 Subject: [PATCH 524/837] docs(formDirective): update example to use a module --- src/ng/directive/form.js | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/src/ng/directive/form.js b/src/ng/directive/form.js index 23fa8d8b91e8..6115bb0bb947 100644 --- a/src/ng/directive/form.js +++ b/src/ng/directive/form.js @@ -314,12 +314,13 @@ function FormController(element, attrs, $scope, $animate) { * * * @example - + -
                          + userType: Required!
                          userType = {{userType}}
                          From ef1c352bc9ba5057711c432618f3c2d6009f4539 Mon Sep 17 00:00:00 2001 From: Brian Ford Date: Mon, 7 Jul 2014 14:22:46 -0700 Subject: [PATCH 525/837] docs(ngModel): update examples to use modules --- src/ng/directive/input.js | 100 ++++++++++++++++++++------------------ 1 file changed, 54 insertions(+), 46 deletions(-) diff --git a/src/ng/directive/input.js b/src/ng/directive/input.js index 0aaa6a51d9ad..257e2931ded3 100644 --- a/src/ng/directive/input.js +++ b/src/ng/directive/input.js @@ -39,15 +39,16 @@ var inputType = { * @param {boolean=} [ngTrim=true] If set to false Angular will not automatically trim the input. * * @example - + - + Single word: @@ -119,14 +120,15 @@ var inputType = { * interaction with the input element. * * @example - + - + Number: @@ -194,14 +196,15 @@ var inputType = { * interaction with the input element. * * @example - + - + URL: Required! @@ -270,14 +273,15 @@ var inputType = { * interaction with the input element. * * @example - + - + Email: Required! @@ -336,18 +340,19 @@ var inputType = { * be set when selected. * * @example - + - + Red
                          Green
                          Blue
                          @@ -386,15 +391,16 @@ var inputType = { * interaction with the input element. * * @example - + - + Value1:
                          Value2:
                          @@ -794,14 +800,15 @@ function checkboxInputType(scope, element, attr, ctrl) { * interaction with the input element. * * @example - + -
                          +
                          User name: @@ -1319,12 +1326,13 @@ var NgModelController = ['$scope', '$exceptionHandler', '$attrs', '$element', '$ * * * @example - * + * Update input to see transitions when valid/invalid. Integer is a valid value. - + From e3dc85841ddcd948a8f1269894a5fc4a2e853728 Mon Sep 17 00:00:00 2001 From: Brian Ford Date: Mon, 7 Jul 2014 14:23:02 -0700 Subject: [PATCH 526/837] docs(ngChange): update example to use a module --- src/ng/directive/input.js | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/src/ng/directive/input.js b/src/ng/directive/input.js index 257e2931ded3..d63d2f0d6979 100644 --- a/src/ng/directive/input.js +++ b/src/ng/directive/input.js @@ -1391,17 +1391,18 @@ var ngModelDirective = function() { * in input value. * * @example - * + * * * - *
                          + *
                          * * *
                          From 112da45c076e967b0cba86871852151f26804a77 Mon Sep 17 00:00:00 2001 From: Brian Ford Date: Mon, 7 Jul 2014 23:03:59 -0700 Subject: [PATCH 527/837] docs($document): update example to use a module --- src/ng/document.js | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/src/ng/document.js b/src/ng/document.js index 321a36520805..90daaae2de6a 100644 --- a/src/ng/document.js +++ b/src/ng/document.js @@ -9,18 +9,19 @@ * A {@link angular.element jQuery or jqLite} wrapper for the browser's `window.document` object. * * @example - + -
                          +

                          $document title:

                          window.document title:

                          - function MainCtrl($scope, $document) { - $scope.title = $document[0].title; - $scope.windowTitle = angular.element(window.document)[0].title; - } + angular.module('documentExample', []) + .controller('ExampleController', ['$scope', '$document', function($scope, $document) { + $scope.title = $document[0].title; + $scope.windowTitle = angular.element(window.document)[0].title; + }]); */ From 09731750581b5a70cff5566f3f33661a6a9e7ac9 Mon Sep 17 00:00:00 2001 From: Brian Ford Date: Mon, 7 Jul 2014 23:05:28 -0700 Subject: [PATCH 528/837] docs($http): update example to use a module --- src/ng/http.js | 52 ++++++++++++++++++++++++++------------------------ 1 file changed, 27 insertions(+), 25 deletions(-) diff --git a/src/ng/http.js b/src/ng/http.js index ff2512bb4387..1f2415628712 100644 --- a/src/ng/http.js +++ b/src/ng/http.js @@ -605,9 +605,9 @@ function $HttpProvider() { * * * @example - + -
                          +

                          Hello !
                          @@ -84,15 +85,16 @@ var ngBindDirective = ngDirective({ * * @example * Try it here: enter text in text box and watch the greeting change. - + -
                          +
                          Salutation:
                          Name:
                          
                          @@ -150,20 +152,20 @@ var ngBindTemplateDirective = ['$interpolate', function($interpolate) {
                            * @example
                              Try it here: enter text in text box and watch the greeting change.
                           
                          -   
                          +   
                                
                          -       
                          +

                          - angular.module('ngBindHtmlExample', ['ngSanitize']) - - .controller('ngBindHtmlCtrl', ['$scope', function ngBindHtmlCtrl($scope) { - $scope.myHTML = - 'I am an HTMLstring with links! and other stuff'; - }]); + angular.module('bindHtmlExample', ['ngSanitize']) + .controller('ExampleController', ['$scope', function($scope) { + $scope.myHTML = + 'I am an HTMLstring with ' + + 'links! and other stuff'; + }]); From 3b5f3463149863c4d8f8bec5ad0e2656fa998284 Mon Sep 17 00:00:00 2001 From: Brian Ford Date: Mon, 7 Jul 2014 23:07:04 -0700 Subject: [PATCH 530/837] docs(ngSubmit): update example to use a module --- src/ng/directive/ngEventDirs.js | 25 +++++++++++++------------ 1 file changed, 13 insertions(+), 12 deletions(-) diff --git a/src/ng/directive/ngEventDirs.js b/src/ng/directive/ngEventDirs.js index 27c1828c8253..ed8ddd6ba167 100644 --- a/src/ng/directive/ngEventDirs.js +++ b/src/ng/directive/ngEventDirs.js @@ -313,21 +313,22 @@ forEach( * ({@link guide/expression#-event- Event object is available as `$event`}) * * @example - + -
                          + Enter text and hit enter: From df545d7eed374a908da7e04c27618d6d9d3a1079 Mon Sep 17 00:00:00 2001 From: Brian Ford Date: Mon, 7 Jul 2014 23:10:03 -0700 Subject: [PATCH 531/837] docs($window): update example to use a module --- src/ng/window.js | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/src/ng/window.js b/src/ng/window.js index 091a51a0becb..a9bebb1cbd4e 100644 --- a/src/ng/window.js +++ b/src/ng/window.js @@ -16,17 +16,18 @@ * expression. * * @example - + -
                          +
                          From 4349de3d419095e253583c269bf584e57be215b3 Mon Sep 17 00:00:00 2001 From: Brian Ford Date: Mon, 7 Jul 2014 23:12:39 -0700 Subject: [PATCH 532/837] docs(ngController): update examples to use modules --- src/ng/directive/ngController.js | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/src/ng/directive/ngController.js b/src/ng/directive/ngController.js index 73019857b24d..eb4fc8bdd4ee 100644 --- a/src/ng/directive/ngController.js +++ b/src/ng/directive/ngController.js @@ -54,7 +54,7 @@ * * This example demonstrates the `controller as` syntax. * - * + * * *
                          * Name: @@ -75,6 +75,9 @@ *
                          *
                          * + * angular.module('controllerAsExample', []) + * .controller('SettingsController1', SettingsController1); + * * function SettingsController1() { * this.name = "John Smith"; * this.contacts = [ @@ -134,7 +137,7 @@ * * This example demonstrates the "attach to `$scope`" style of controller. * - * + * * *
                          * Name: @@ -155,6 +158,9 @@ *
                          *
                          * + * angular.module('controllerExample', []) + * .controller('SettingsController2', ['$scope', SettingsController2]); + * * function SettingsController2($scope) { * $scope.name = "John Smith"; * $scope.contacts = [ From f75f4bce82ffaedbe3c96974ac22a4d99f6bb625 Mon Sep 17 00:00:00 2001 From: Brian Ford Date: Mon, 7 Jul 2014 23:15:17 -0700 Subject: [PATCH 533/837] docs(filters): update examples to use modules --- src/ng/filter/filters.js | 22 ++++++++++++---------- 1 file changed, 12 insertions(+), 10 deletions(-) diff --git a/src/ng/filter/filters.js b/src/ng/filter/filters.js index 0bd2d5c65df6..0b98f58833ce 100644 --- a/src/ng/filter/filters.js +++ b/src/ng/filter/filters.js @@ -15,14 +15,15 @@ * * * @example - + -
                          +

                          default currency symbol ($): {{amount | currency}}
                          custom currency identifier (USD$): {{amount | currency:"USD$"}} @@ -74,14 +75,15 @@ function currencyFilter($locale) { * @returns {string} Number rounded to decimalPlaces and places a “,” after each third digit. * * @example - + -
                          +
                          Enter number:
                          Default formatting: {{val | number}}
                          No fractions: {{val | number:0}}
                          From cdefbe342540536f13ab2cad7aa191423769c50e Mon Sep 17 00:00:00 2001 From: Brian Ford Date: Mon, 7 Jul 2014 23:18:52 -0700 Subject: [PATCH 534/837] docs($interval): update example to use a module --- src/ng/interval.js | 79 +++++++++++++++++++++++----------------------- 1 file changed, 40 insertions(+), 39 deletions(-) diff --git a/src/ng/interval.js b/src/ng/interval.js index 723b40bcfdff..ebfcea89d44e 100644 --- a/src/ng/interval.js +++ b/src/ng/interval.js @@ -42,25 +42,27 @@ function $IntervalProvider() { * @returns {promise} A promise which will be notified on each iteration. * * @example - * - * - * - * - *
                          - *
                          - * Date format:
                          - * Current time is: - *
                          - * Blood 1 : {{blood_1}} - * Blood 2 : {{blood_2}} - * - * - * - *
                          + * + * + *
                          + *
                          + * Date format:
                          + * Current time is: + *
                          + * Blood 1 : {{blood_1}} + * Blood 2 : {{blood_2}} + * + * + * *
                          + *
                          * - * + * * */ function interval(fn, delay, count, invokeApply) { From bfedafdede0f3a315a1281764d38813e7d2fc5cf Mon Sep 17 00:00:00 2001 From: Brian Ford Date: Mon, 7 Jul 2014 23:19:52 -0700 Subject: [PATCH 535/837] docs(ngInclude): update example to use a module --- src/ng/directive/ngInclude.js | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/src/ng/directive/ngInclude.js b/src/ng/directive/ngInclude.js index 5f29e6fc917d..296ce3f18a97 100644 --- a/src/ng/directive/ngInclude.js +++ b/src/ng/directive/ngInclude.js @@ -43,9 +43,9 @@ * - Otherwise enable scrolling only if the expression evaluates to truthy value. * * @example - + -
                          +
                          @@ -57,12 +57,13 @@
                          - function Ctrl($scope) { - $scope.templates = - [ { name: 'template1.html', url: 'template1.html'}, - { name: 'template2.html', url: 'template2.html'} ]; - $scope.template = $scope.templates[0]; - } + angular.module('includeExample', ['ngAnimate']) + .controller('ExampleController', ['$scope', function($scope) { + $scope.templates = + [ { name: 'template1.html', url: 'template1.html'}, + { name: 'template2.html', url: 'template2.html'} ]; + $scope.template = $scope.templates[0]; + }]); Content of template1.html From 32b507890ee27f3aa71fada4efe36cff80630050 Mon Sep 17 00:00:00 2001 From: Brian Ford Date: Mon, 7 Jul 2014 23:28:44 -0700 Subject: [PATCH 536/837] docs(ngList): update example to use a module --- src/ng/directive/input.js | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/src/ng/directive/input.js b/src/ng/directive/input.js index d63d2f0d6979..697d583fcb54 100644 --- a/src/ng/directive/input.js +++ b/src/ng/directive/input.js @@ -1483,14 +1483,15 @@ var requiredDirective = function() { * specified in form `/something/` then the value will be converted into a regular expression. * * @example - + - + List: Required! From 5bd8613168a7859c6b3d45b00404572c4010ee2b Mon Sep 17 00:00:00 2001 From: Brian Ford Date: Mon, 7 Jul 2014 23:30:02 -0700 Subject: [PATCH 537/837] docs(ngValue): update example to use a module --- src/ng/directive/input.js | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/src/ng/directive/input.js b/src/ng/directive/input.js index 697d583fcb54..afeab15cdfbe 100644 --- a/src/ng/directive/input.js +++ b/src/ng/directive/input.js @@ -1583,15 +1583,16 @@ var CONSTANT_VALUE_REGEXP = /^(true|false|\d+)$/; * of the `input` element * * @example - + - +

                          Which is your favorite?