├── .bowerrc
├── .coveralls.yml
├── .gitignore
├── .travis.yml
├── Gruntfile.js
├── README.md
├── bower.json
├── config
├── karma.conf.js
└── require.conf.js
├── demo
└── index.html
├── npm-shrinkwrap.json
├── package.json
├── src
└── taggedInfiniteScroll.js
├── taggedInfiniteScroll.js
├── taggedInfiniteScroll.min.js
└── tests
└── taggedInfiniteScrollSpec.js
/.bowerrc:
--------------------------------------------------------------------------------
1 | {
2 | "directory": "bower_components"
3 | }
4 |
--------------------------------------------------------------------------------
/.coveralls.yml:
--------------------------------------------------------------------------------
1 | service_name: travis-ci
2 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | bower_components
2 | node_modules
3 | coverage
4 |
--------------------------------------------------------------------------------
/.travis.yml:
--------------------------------------------------------------------------------
1 | language: node_js
2 | node_js:
3 | - "0.10"
4 | before_script:
5 | - npm install -g grunt-cli
6 | - npm install -g bower
7 | - bower install
8 |
--------------------------------------------------------------------------------
/Gruntfile.js:
--------------------------------------------------------------------------------
1 | module.exports = function(grunt) {
2 | grunt.loadNpmTasks('grunt-contrib-concat');
3 | grunt.loadNpmTasks('grunt-contrib-requirejs');
4 | grunt.loadNpmTasks('grunt-contrib-uglify');
5 | grunt.loadNpmTasks('grunt-karma');
6 | grunt.loadNpmTasks('grunt-karma-coveralls');
7 |
8 | grunt.initConfig({
9 | pkg: grunt.file.readJSON('package.json'),
10 |
11 | concat: {
12 | options: {
13 | banner: '/*! <%= pkg.name %> - v<%= pkg.version %> - ' +
14 | '<%= grunt.template.today("yyyy-mm-dd") %> */\n',
15 | },
16 | build: {
17 | src: ['src/taggedInfiniteScroll.js'],
18 | dest: 'taggedInfiniteScroll.js'
19 | },
20 | },
21 |
22 | coveralls: {
23 | options: {
24 | coverage_dir: 'coverage/'
25 | }
26 | },
27 |
28 | karma: {
29 | options: {
30 | configFile: 'config/karma.conf.js'
31 | },
32 | test: {
33 | // Use defaults
34 | },
35 | dev: {
36 | singleRun: false
37 | },
38 | bdd: {
39 | reporters: ['story', 'coverage']
40 | },
41 | cobertura: {
42 | reporters: ['dots', 'coverage'],
43 | browsers: ['PhantomJS'],
44 | coverageReporter: {
45 | type : 'cobertura',
46 | dir : 'coverage/'
47 | }
48 | },
49 | travis: {
50 | singleRun: true,
51 | reporters: ['dots', 'coverage'],
52 | browsers: ['PhantomJS'],
53 | preprocessors: {
54 | 'src/*.js': 'coverage'
55 | },
56 | coverageReporter: {
57 | type : 'lcov',
58 | dir : 'coverage/'
59 | }
60 | }
61 | },
62 |
63 | uglify: {
64 | build: {
65 | files: {
66 | 'taggedInfiniteScroll.min.js': ['taggedInfiniteScroll.js']
67 | }
68 | }
69 | }
70 | });
71 |
72 | // Run tests, single pass
73 | grunt.registerTask('test', 'Run unit tests', ['karma:test']);
74 |
75 | // Run tests continously for development mode
76 | grunt.registerTask('dev', 'Run unit tests in watch mode', ['karma:dev']);
77 |
78 | // Generate a coverage report in Cobertura format
79 | grunt.registerTask('cobertura', 'Generate Cobertura coverage report', ['karma:cobertura']);
80 |
81 | // Build files for production
82 | grunt.registerTask('build', 'Builds files for production', ['concat:build', 'uglify:build']);
83 |
84 | // Travis CI task
85 | grunt.registerTask('travis', 'Travis CI task', ['karma:travis', 'coveralls']);
86 | };
87 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | [](https://travis-ci.org/tagged/infinite-scroll)
2 | [](https://coveralls.io/r/tagged/infinite-scroll)
3 |
4 | # Infinite Scroll for AngularJS
5 | A simple, yet powerful angular directive for adding infinite scroll support to any container. The `tagged-infinite-scroll` directive has support for fetching more items in a list, disabling subsequent fetches until the current fetch completes, and optimistically fetching the next set of results before the user even reaches the bottom of the container.
6 |
7 | [View the demo!](http://htmlpreview.github.io/?https://github.com/tagged/infinite-scroll/blob/master/demo/index.html)
8 |
9 | The `tagged-infinite-scroll` directive uses your callback to fetch more results. In this example, the callback is `getMore()` which simply fetches the next page and appends the new items.
10 | ```js
11 | var app = angular.module('MyApp', ['tagged.directives.infiniteScroll']);
12 | app.controller('MainController', ['$scope', '$http', function($scope, $http) {
13 | $scope.page = 1;
14 | $scope.items = [];
15 | $scope.fetching = false;
16 |
17 | // Fetch more items
18 | $scope.getMore = function() {
19 | $scope.page++;
20 | $scope.fetching = true;
21 | $http.get('/my/endpoint', { page : $scope.page }).then(function(items) {
22 | $scope.fetching = false;
23 | // Append the items to the list
24 | $scope.items = $scope.items.concat(items);
25 | });
26 | };
27 | }]);
28 | ```
29 | ```html
30 |
31 |
32 |
33 |
34 | {{ item.title }}
35 |
36 |
37 |
38 |
39 | ```
40 |
41 | ### Disable During Fetch
42 | During an AJAX event, you probably want to avoid triggering `getMore()` until the current request finishes. Otherwise, the directive may fire your callback too many times during the async action. The `tagged-infinite-scroll-disabled` attribute can help you block subsequent fetches.
43 |
44 | **Note:** This is also useful for disabling infinite-scroll when/if the user has reached the end of all available items.
45 |
46 | ```js
47 | var app = angular.module('MyApp', ['tagged.directives.infiniteScroll']);
48 | app.controller('MainController', ['$scope', '$http', function($scope, $http) {
49 | $scope.page = 1;
50 | $scope.items = [];
51 | $scope.fetching = false;
52 | $scope.disabled = false;
53 | $scope.getMore = function() {
54 | $scope.page++;
55 | $scope.fetching = true; // Block fetching until the AJAX call returns
56 | $http.get('/my/endpoint', { page : $scope.page }).then(function(items) {
57 | $scope.fetching = false;
58 | if (items.length) {
59 | $scope.items = $scope.items.concat(items);
60 | } else {
61 | $scope.disabled = true; // Disable further calls if there are no more items
62 | }
63 | });
64 | };
65 | }]);
66 | ```
67 | ```html
68 |
69 |
70 |
71 |
72 | {{ item.title }}
73 |
74 |
75 |
76 |
77 | ```
78 |
79 | ### Optimistic Fetching
80 | Before the user actually reaches the bottom of the page your callback can be triggered optimistically to help improve perceived performance. Optimistic fetching is enabled using the `tagged-infinite-scroll-distance` attribute. The callback will fire once the user has reached that number of pixels from the bottom of the container.
81 |
82 | ```html
83 |
84 |
85 |
86 |
87 | {{ item.title }}
88 |
89 |
90 |
91 |
92 | ```
93 |
94 |
95 | ## Getting Started
96 |
97 | To get started, add `taggedInfiniteScroll-min.js` to your webpage:
98 | ```html
99 |
100 | ```
101 |
102 | And add the module `tagged.directives.infiniteScroll` to your app's dependencies:
103 | ```js
104 | var app = angular.module('MyApp', ['tagged.directives.infiniteScroll']);
105 | ```
106 |
107 | Then simply add the `tagged-infinite-scroll` attribute to any element that will contain a list of items and provide a callback function to fetch more items. Each time the user scrolls to the bottom of that container, the callback function will be called. The callback function should fetch more items and append them to existing items.
108 |
109 | ### Requirements
110 |
111 | * AngularJS 1.1.5 - 1.3.0
112 | * RequireJS (Optional)
113 |
114 | ### Using RequireJS
115 | This directive can be loaded as an AMD module if you're using RequireJS. There are a few requirements:
116 |
117 | 1. You must add paths to `angular` in your RequireJS config.
118 | 2. You must shim `angular` to export `angular`.
119 |
120 | At minimum, your requirejs config must include this:
121 | ```js
122 | requirejs.config({
123 | paths: {
124 | 'angular': 'path/to/angular'
125 | },
126 | shim: {
127 | 'angular': {
128 | 'exports': 'angular'
129 | }
130 | }
131 | });
132 | ```
133 |
134 | Once configured, you can `require()` the original source file `src/taggedInfiniteScroll` in your app:
135 | ```js
136 | define(['angular', 'path/to/src/taggedInfiniteScroll'], function(angular) {
137 | var app = angular.module('MyApp', ['tagged.directives.infiniteScroll']);
138 |
139 | // ...
140 |
141 | });
142 | ```
143 |
144 | ## Development
145 |
146 | **Requirements**
147 | * nodejs 1.10.x
148 | * npm 1.2.32
149 |
150 | To set up the development environment, run these commands once:
151 |
152 | ```bash
153 | # Global dependencies
154 | $ npm install --global grunt-cli bower
155 |
156 | # Local node dependencies (karma, etc.)
157 | $ npm install
158 |
159 | # 3rd-party libraries (Angular)
160 | $ bower install
161 | ```
162 |
163 | **Running Tests**
164 | Once the development environment has been set up, tests can be run in a number of ways:
165 |
166 | ```bash
167 | # Run all tests once
168 | $ grunt test
169 |
170 | # Run tests in development mode (enables file watcher to automatically rerun tests)
171 | $ grunt dev
172 | ```
173 |
174 | **Building Production Files**
175 | ```bash
176 | # Build production files in `./`
177 | $ grunt build
178 | ```
179 |
180 | ## Contributing
181 | Contributions welcome! All we ask is that pull requests include unit tests. Thanks!
182 |
183 | Copyright 2013 Tagged, Inc.
184 |
185 | [](https://bitdeli.com/free "Bitdeli Badge")
186 |
187 |
--------------------------------------------------------------------------------
/bower.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "tagged-infinite-scroll",
3 | "version": "1.1.1",
4 | "authors": [
5 | "Hector Virgen "
6 | ],
7 | "description": "Infinite Scroll for AngularJS",
8 | "main": "taggedInfiniteScroll.js",
9 | "keywords": [
10 | "Angular",
11 | "Directive",
12 | "Infinite Scroll"
13 | ],
14 | "license": "MIT",
15 | "ignore": [
16 | "**/.*",
17 | "node_modules",
18 | "bower_components",
19 | "tests"
20 | ],
21 | "dependencies": {
22 | "angular": "~1.3.0"
23 | },
24 | "devDependencies": {
25 | "angular-mocks": "~1.3.0"
26 | }
27 | }
28 |
--------------------------------------------------------------------------------
/config/karma.conf.js:
--------------------------------------------------------------------------------
1 | // Karma configuration
2 | // Generated on Sat Sep 07 2013 11:02:19 GMT-0700 (PDT)
3 | module.exports = function(config) {
4 | config.set({
5 | // base path, that will be used to resolve files and exclude
6 | basePath: '../',
7 | urlRoot: '/base/',
8 |
9 | // frameworks to use
10 | frameworks: ['mocha', 'requirejs', 'sinon-chai'],
11 |
12 | // list of files / patterns to load in the browser
13 | files: [
14 | {pattern: 'src/**/**.js', included: false},
15 | {pattern: 'bower_components/**/**.js', included: false},
16 | {pattern: 'tests/**/**.js', included: false},
17 | 'config/require.conf.js'
18 | ],
19 |
20 | preprocessors: {
21 | 'src/taggedInfiniteScroll.js': ['coverage']
22 | },
23 |
24 | // list of files to exclude
25 | exclude: [],
26 |
27 | // test results reporter to use
28 | // possible values: 'dots', 'progress', 'junit', 'growl', 'coverage'
29 | reporters: ['dots', 'coverage'],
30 |
31 | hostname: '0.0.0.0',
32 |
33 | // web server port
34 | port: 3000,
35 |
36 | // enable / disable colors in the output (reporters and logs)
37 | colors: true,
38 |
39 | // level of logging
40 | // possible values: config.LOG_DISABLE || config.LOG_ERROR || config.LOG_WARN || config.LOG_INFO || config.LOG_DEBUG
41 | logLevel: config.LOG_INFO,
42 |
43 | // enable / disable watching file and executing tests whenever any file changes
44 | autoWatch: true,
45 |
46 | // Start these browsers, currently available:
47 | // - Chrome
48 | // - ChromeCanary
49 | // - Firefox
50 | // - Opera
51 | // - Safari (only Mac)
52 | // - PhantomJS
53 | // - IE (only Windows)
54 | browsers: ['Chrome', 'Firefox', 'PhantomJS', 'Safari'],
55 |
56 | // If browser does not capture in given timeout [ms], kill it
57 | captureTimeout: 90000,
58 |
59 | // Continuous Integration mode
60 | // if true, it capture browsers, run tests and exit
61 | singleRun: true,
62 |
63 | plugins: [
64 | // these plugins will be require() by Karma
65 | 'karma-requirejs',
66 | 'karma-mocha',
67 | 'karma-sinon-chai',
68 |
69 | // Launchers
70 | 'karma-chrome-launcher',
71 | 'karma-firefox-launcher',
72 | 'karma-phantomjs-launcher',
73 | 'karma-safari-launcher',
74 |
75 | // Reporters
76 | 'karma-coverage',
77 | 'karma-junit-reporter',
78 | 'karma-story-reporter'
79 | ],
80 |
81 | // optionally, configure the reporter
82 | coverageReporter: {
83 | type : 'html',
84 | dir : 'coverage/'
85 | }
86 | });
87 | };
88 |
--------------------------------------------------------------------------------
/config/require.conf.js:
--------------------------------------------------------------------------------
1 | window.googletag = { cmd: { push: function(){ } } };
2 |
3 | var tests = Object.keys(window.__karma__.files).filter(function (file) {
4 | return (/Spec\.js$/).test(file);
5 | });
6 |
7 | requirejs.config({
8 | baseUrl: '/base',
9 | paths: {
10 | 'angular': 'bower_components/angular/angular',
11 | 'angular/mocks': 'bower_components/angular-mocks/angular-mocks'
12 | },
13 | shim: {
14 | 'angular': {
15 | 'exports': 'angular'
16 | },
17 | 'angular/mocks': {
18 | 'deps': ['angular']
19 | }
20 | },
21 | deps: tests,
22 | callback: window.__karma__.start
23 | });
24 |
--------------------------------------------------------------------------------
/demo/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | Infinite Scroll for AngularJS by Tagged
5 |
6 |
7 |
8 |
9 |
10 |
43 |
44 |
45 |
Infinite Scroll
46 |
47 | Easily add infinite-scroll support to any container. When
48 | the user has scrolled to the bottom, your custom callback
49 | function will fire to get more results. You can choose to
50 | get more items sooner by specifying the tagged-infinite-scroll-distance
51 | attribute, and you can disable infinite scroll by setting
52 | the tagged-infinite-scroll-disabled
attribute.
53 |
54 |
55 |
56 |
57 |
58 | Enabled:
59 |
60 | Enable
61 | Disable
62 |
63 |
64 | Distance:
65 |
66 |
67 | {{ distance }}
68 |
69 |
70 | Reset:
71 | Reset Content
72 |
73 |
74 |
75 |
76 |
77 | {{ item.title }}
78 | {{ item.description }}
79 |
80 |
81 |
82 |
83 |
84 |
85 |
133 |
134 |
135 |
136 |
--------------------------------------------------------------------------------
/npm-shrinkwrap.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "tagged-infinite-scroll",
3 | "version": "1.1.0",
4 | "dependencies": {
5 | "chai": {
6 | "version": "1.9.2",
7 | "from": "https://registry.npmjs.org/chai/-/chai-1.9.2.tgz",
8 | "resolved": "https://registry.npmjs.org/chai/-/chai-1.9.2.tgz",
9 | "dependencies": {
10 | "assertion-error": {
11 | "version": "1.0.0",
12 | "from": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.0.0.tgz",
13 | "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.0.0.tgz"
14 | },
15 | "deep-eql": {
16 | "version": "0.1.3",
17 | "from": "https://registry.npmjs.org/deep-eql/-/deep-eql-0.1.3.tgz",
18 | "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-0.1.3.tgz",
19 | "dependencies": {
20 | "type-detect": {
21 | "version": "0.1.1",
22 | "from": "https://registry.npmjs.org/type-detect/-/type-detect-0.1.1.tgz",
23 | "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-0.1.1.tgz"
24 | }
25 | }
26 | }
27 | }
28 | },
29 | "grunt": {
30 | "version": "0.4.5",
31 | "from": "https://registry.npmjs.org/grunt/-/grunt-0.4.5.tgz",
32 | "resolved": "https://registry.npmjs.org/grunt/-/grunt-0.4.5.tgz",
33 | "dependencies": {
34 | "async": {
35 | "version": "0.1.22",
36 | "from": "async@0.1.22",
37 | "resolved": "https://registry.npmjs.org/async/-/async-0.1.22.tgz"
38 | },
39 | "coffee-script": {
40 | "version": "1.3.3",
41 | "from": "coffee-script@1.3.3",
42 | "resolved": "https://registry.npmjs.org/coffee-script/-/coffee-script-1.3.3.tgz"
43 | },
44 | "colors": {
45 | "version": "0.6.2",
46 | "from": "colors@0.6.2",
47 | "resolved": "https://registry.npmjs.org/colors/-/colors-0.6.2.tgz"
48 | },
49 | "dateformat": {
50 | "version": "1.0.2-1.2.3",
51 | "from": "dateformat@1.0.2-1.2.3",
52 | "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-1.0.2-1.2.3.tgz"
53 | },
54 | "eventemitter2": {
55 | "version": "0.4.14",
56 | "from": "https://registry.npmjs.org/eventemitter2/-/eventemitter2-0.4.14.tgz",
57 | "resolved": "https://registry.npmjs.org/eventemitter2/-/eventemitter2-0.4.14.tgz"
58 | },
59 | "findup-sync": {
60 | "version": "0.1.3",
61 | "from": "https://registry.npmjs.org/findup-sync/-/findup-sync-0.1.3.tgz",
62 | "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-0.1.3.tgz",
63 | "dependencies": {
64 | "glob": {
65 | "version": "3.2.11",
66 | "from": "glob@3.2.11",
67 | "resolved": "https://registry.npmjs.org/glob/-/glob-3.2.11.tgz",
68 | "dependencies": {
69 | "inherits": {
70 | "version": "2.0.1",
71 | "from": "inherits@2",
72 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz"
73 | },
74 | "minimatch": {
75 | "version": "0.3.0",
76 | "from": "minimatch@0.3",
77 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-0.3.0.tgz",
78 | "dependencies": {
79 | "lru-cache": {
80 | "version": "2.5.0",
81 | "from": "lru-cache@2",
82 | "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-2.5.0.tgz"
83 | },
84 | "sigmund": {
85 | "version": "1.0.0",
86 | "from": "sigmund@~1.0.0",
87 | "resolved": "https://registry.npmjs.org/sigmund/-/sigmund-1.0.0.tgz"
88 | }
89 | }
90 | }
91 | }
92 | },
93 | "lodash": {
94 | "version": "2.4.1",
95 | "from": "https://registry.npmjs.org/lodash/-/lodash-2.4.1.tgz",
96 | "resolved": "https://registry.npmjs.org/lodash/-/lodash-2.4.1.tgz"
97 | }
98 | }
99 | },
100 | "glob": {
101 | "version": "3.1.21",
102 | "from": "glob@3.1.21",
103 | "resolved": "https://registry.npmjs.org/glob/-/glob-3.1.21.tgz",
104 | "dependencies": {
105 | "graceful-fs": {
106 | "version": "1.2.3",
107 | "from": "graceful-fs@~1.2.0",
108 | "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-1.2.3.tgz"
109 | },
110 | "inherits": {
111 | "version": "1.0.0",
112 | "from": "inherits@1",
113 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-1.0.0.tgz"
114 | }
115 | }
116 | },
117 | "hooker": {
118 | "version": "0.2.3",
119 | "from": "https://registry.npmjs.org/hooker/-/hooker-0.2.3.tgz",
120 | "resolved": "https://registry.npmjs.org/hooker/-/hooker-0.2.3.tgz"
121 | },
122 | "iconv-lite": {
123 | "version": "0.2.11",
124 | "from": "iconv-lite@0.2.11",
125 | "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.2.11.tgz"
126 | },
127 | "minimatch": {
128 | "version": "0.2.14",
129 | "from": "minimatch@0.2.14",
130 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-0.2.14.tgz",
131 | "dependencies": {
132 | "lru-cache": {
133 | "version": "2.5.0",
134 | "from": "lru-cache@2",
135 | "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-2.5.0.tgz"
136 | },
137 | "sigmund": {
138 | "version": "1.0.0",
139 | "from": "sigmund@~1.0.0",
140 | "resolved": "https://registry.npmjs.org/sigmund/-/sigmund-1.0.0.tgz"
141 | }
142 | }
143 | },
144 | "nopt": {
145 | "version": "1.0.10",
146 | "from": "nopt@1.0.10",
147 | "resolved": "https://registry.npmjs.org/nopt/-/nopt-1.0.10.tgz",
148 | "dependencies": {
149 | "abbrev": {
150 | "version": "1.0.5",
151 | "from": "abbrev@1",
152 | "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.0.5.tgz"
153 | }
154 | }
155 | },
156 | "rimraf": {
157 | "version": "2.2.8",
158 | "from": "https://registry.npmjs.org/rimraf/-/rimraf-2.2.8.tgz",
159 | "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.2.8.tgz"
160 | },
161 | "lodash": {
162 | "version": "0.9.2",
163 | "from": "lodash@0.9.2",
164 | "resolved": "https://registry.npmjs.org/lodash/-/lodash-0.9.2.tgz"
165 | },
166 | "underscore.string": {
167 | "version": "2.2.1",
168 | "from": "underscore.string@2.2.1",
169 | "resolved": "https://registry.npmjs.org/underscore.string/-/underscore.string-2.2.1.tgz"
170 | },
171 | "which": {
172 | "version": "1.0.5",
173 | "from": "https://registry.npmjs.org/which/-/which-1.0.5.tgz",
174 | "resolved": "https://registry.npmjs.org/which/-/which-1.0.5.tgz"
175 | },
176 | "js-yaml": {
177 | "version": "2.0.5",
178 | "from": "js-yaml@2.0.5",
179 | "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-2.0.5.tgz",
180 | "dependencies": {
181 | "argparse": {
182 | "version": "0.1.15",
183 | "from": "argparse@~ 0.1.11",
184 | "resolved": "https://registry.npmjs.org/argparse/-/argparse-0.1.15.tgz",
185 | "dependencies": {
186 | "underscore": {
187 | "version": "1.4.4",
188 | "from": "underscore@~1.4.3",
189 | "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.4.4.tgz"
190 | },
191 | "underscore.string": {
192 | "version": "2.3.3",
193 | "from": "underscore.string@~2.3.1",
194 | "resolved": "https://registry.npmjs.org/underscore.string/-/underscore.string-2.3.3.tgz"
195 | }
196 | }
197 | },
198 | "esprima": {
199 | "version": "1.0.4",
200 | "from": "esprima@~ 1.0.2",
201 | "resolved": "https://registry.npmjs.org/esprima/-/esprima-1.0.4.tgz"
202 | }
203 | }
204 | },
205 | "exit": {
206 | "version": "0.1.2",
207 | "from": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz",
208 | "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz"
209 | },
210 | "getobject": {
211 | "version": "0.1.0",
212 | "from": "https://registry.npmjs.org/getobject/-/getobject-0.1.0.tgz",
213 | "resolved": "https://registry.npmjs.org/getobject/-/getobject-0.1.0.tgz"
214 | },
215 | "grunt-legacy-util": {
216 | "version": "0.2.0",
217 | "from": "https://registry.npmjs.org/grunt-legacy-util/-/grunt-legacy-util-0.2.0.tgz",
218 | "resolved": "https://registry.npmjs.org/grunt-legacy-util/-/grunt-legacy-util-0.2.0.tgz",
219 | "dependencies": {
220 | "async": {
221 | "version": "0.1.22",
222 | "from": "async@0.1.22",
223 | "resolved": "https://registry.npmjs.org/async/-/async-0.1.22.tgz"
224 | },
225 | "lodash": {
226 | "version": "0.9.2",
227 | "from": "lodash@0.9.2",
228 | "resolved": "https://registry.npmjs.org/lodash/-/lodash-0.9.2.tgz"
229 | },
230 | "underscore.string": {
231 | "version": "2.2.1",
232 | "from": "underscore.string@2.2.1",
233 | "resolved": "https://registry.npmjs.org/underscore.string/-/underscore.string-2.2.1.tgz"
234 | }
235 | }
236 | },
237 | "grunt-legacy-log": {
238 | "version": "0.1.1",
239 | "from": "https://registry.npmjs.org/grunt-legacy-log/-/grunt-legacy-log-0.1.1.tgz",
240 | "resolved": "https://registry.npmjs.org/grunt-legacy-log/-/grunt-legacy-log-0.1.1.tgz",
241 | "dependencies": {
242 | "lodash": {
243 | "version": "2.4.1",
244 | "from": "https://registry.npmjs.org/lodash/-/lodash-2.4.1.tgz",
245 | "resolved": "https://registry.npmjs.org/lodash/-/lodash-2.4.1.tgz"
246 | },
247 | "underscore.string": {
248 | "version": "2.3.3",
249 | "from": "https://registry.npmjs.org/underscore.string/-/underscore.string-2.3.3.tgz",
250 | "resolved": "https://registry.npmjs.org/underscore.string/-/underscore.string-2.3.3.tgz"
251 | },
252 | "colors": {
253 | "version": "0.6.2",
254 | "from": "colors@0.6.2",
255 | "resolved": "https://registry.npmjs.org/colors/-/colors-0.6.2.tgz"
256 | }
257 | }
258 | }
259 | }
260 | },
261 | "grunt-contrib-concat": {
262 | "version": "0.3.0",
263 | "from": "grunt-contrib-concat@0.3.0",
264 | "resolved": "https://registry.npmjs.org/grunt-contrib-concat/-/grunt-contrib-concat-0.3.0.tgz"
265 | },
266 | "grunt-contrib-requirejs": {
267 | "version": "0.4.4",
268 | "from": "https://registry.npmjs.org/grunt-contrib-requirejs/-/grunt-contrib-requirejs-0.4.4.tgz",
269 | "resolved": "https://registry.npmjs.org/grunt-contrib-requirejs/-/grunt-contrib-requirejs-0.4.4.tgz"
270 | },
271 | "grunt-contrib-uglify": {
272 | "version": "0.2.7",
273 | "from": "grunt-contrib-uglify@0.2.7",
274 | "resolved": "https://registry.npmjs.org/grunt-contrib-uglify/-/grunt-contrib-uglify-0.2.7.tgz",
275 | "dependencies": {
276 | "uglify-js": {
277 | "version": "2.4.15",
278 | "from": "uglify-js@~2.4.0",
279 | "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.4.15.tgz",
280 | "dependencies": {
281 | "async": {
282 | "version": "0.2.10",
283 | "from": "async@~0.2.6",
284 | "resolved": "https://registry.npmjs.org/async/-/async-0.2.10.tgz"
285 | },
286 | "source-map": {
287 | "version": "0.1.34",
288 | "from": "source-map@0.1.34",
289 | "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.1.34.tgz",
290 | "dependencies": {
291 | "amdefine": {
292 | "version": "0.1.0",
293 | "from": "amdefine@>=0.0.4",
294 | "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-0.1.0.tgz"
295 | }
296 | }
297 | },
298 | "optimist": {
299 | "version": "0.3.7",
300 | "from": "optimist@~0.3.5",
301 | "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.3.7.tgz",
302 | "dependencies": {
303 | "wordwrap": {
304 | "version": "0.0.2",
305 | "from": "wordwrap@~0.0.2",
306 | "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz"
307 | }
308 | }
309 | },
310 | "uglify-to-browserify": {
311 | "version": "1.0.2",
312 | "from": "uglify-to-browserify@~1.0.0",
313 | "resolved": "https://registry.npmjs.org/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz"
314 | }
315 | }
316 | },
317 | "grunt-lib-contrib": {
318 | "version": "0.6.1",
319 | "from": "grunt-lib-contrib@~0.6.1",
320 | "resolved": "https://registry.npmjs.org/grunt-lib-contrib/-/grunt-lib-contrib-0.6.1.tgz",
321 | "dependencies": {
322 | "zlib-browserify": {
323 | "version": "0.0.1",
324 | "from": "zlib-browserify@0.0.1",
325 | "resolved": "https://registry.npmjs.org/zlib-browserify/-/zlib-browserify-0.0.1.tgz"
326 | }
327 | }
328 | }
329 | }
330 | },
331 | "grunt-karma": {
332 | "version": "0.8.3",
333 | "from": "grunt-karma@0.8.3",
334 | "resolved": "https://registry.npmjs.org/grunt-karma/-/grunt-karma-0.8.3.tgz",
335 | "dependencies": {
336 | "lodash": {
337 | "version": "2.4.1",
338 | "from": "lodash@~2.4.1",
339 | "resolved": "https://registry.npmjs.org/lodash/-/lodash-2.4.1.tgz"
340 | }
341 | }
342 | },
343 | "grunt-karma-coveralls": {
344 | "version": "2.0.2",
345 | "from": "grunt-karma-coveralls@2.0.2",
346 | "resolved": "https://registry.npmjs.org/grunt-karma-coveralls/-/grunt-karma-coveralls-2.0.2.tgz",
347 | "dependencies": {
348 | "coveralls": {
349 | "version": "2.3.0",
350 | "from": "coveralls@~2.3.0",
351 | "resolved": "https://registry.npmjs.org/coveralls/-/coveralls-2.3.0.tgz",
352 | "dependencies": {
353 | "yaml": {
354 | "version": "0.2.3",
355 | "from": "yaml@0.2.3",
356 | "resolved": "https://registry.npmjs.org/yaml/-/yaml-0.2.3.tgz"
357 | },
358 | "request": {
359 | "version": "2.16.2",
360 | "from": "request@2.16.2",
361 | "resolved": "https://registry.npmjs.org/request/-/request-2.16.2.tgz",
362 | "dependencies": {
363 | "form-data": {
364 | "version": "0.0.10",
365 | "from": "form-data@~0.0.3",
366 | "resolved": "https://registry.npmjs.org/form-data/-/form-data-0.0.10.tgz",
367 | "dependencies": {
368 | "combined-stream": {
369 | "version": "0.0.5",
370 | "from": "combined-stream@~0.0.4",
371 | "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-0.0.5.tgz",
372 | "dependencies": {
373 | "delayed-stream": {
374 | "version": "0.0.5",
375 | "from": "delayed-stream@0.0.5",
376 | "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-0.0.5.tgz"
377 | }
378 | }
379 | },
380 | "async": {
381 | "version": "0.2.10",
382 | "from": "async@~0.2.7",
383 | "resolved": "https://registry.npmjs.org/async/-/async-0.2.10.tgz"
384 | }
385 | }
386 | },
387 | "mime": {
388 | "version": "1.2.11",
389 | "from": "mime@~1.2.7",
390 | "resolved": "https://registry.npmjs.org/mime/-/mime-1.2.11.tgz"
391 | },
392 | "hawk": {
393 | "version": "0.10.2",
394 | "from": "hawk@~0.10.0",
395 | "resolved": "https://registry.npmjs.org/hawk/-/hawk-0.10.2.tgz",
396 | "dependencies": {
397 | "hoek": {
398 | "version": "0.7.6",
399 | "from": "hoek@0.7.x",
400 | "resolved": "https://registry.npmjs.org/hoek/-/hoek-0.7.6.tgz"
401 | },
402 | "boom": {
403 | "version": "0.3.8",
404 | "from": "boom@0.3.x",
405 | "resolved": "https://registry.npmjs.org/boom/-/boom-0.3.8.tgz"
406 | },
407 | "cryptiles": {
408 | "version": "0.1.3",
409 | "from": "cryptiles@0.1.x",
410 | "resolved": "https://registry.npmjs.org/cryptiles/-/cryptiles-0.1.3.tgz"
411 | },
412 | "sntp": {
413 | "version": "0.1.4",
414 | "from": "sntp@0.1.x",
415 | "resolved": "https://registry.npmjs.org/sntp/-/sntp-0.1.4.tgz"
416 | }
417 | }
418 | },
419 | "node-uuid": {
420 | "version": "1.4.1",
421 | "from": "node-uuid@~1.4.0",
422 | "resolved": "https://registry.npmjs.org/node-uuid/-/node-uuid-1.4.1.tgz"
423 | },
424 | "cookie-jar": {
425 | "version": "0.2.0",
426 | "from": "cookie-jar@~0.2.0",
427 | "resolved": "https://registry.npmjs.org/cookie-jar/-/cookie-jar-0.2.0.tgz"
428 | },
429 | "aws-sign": {
430 | "version": "0.2.0",
431 | "from": "aws-sign@~0.2.0",
432 | "resolved": "https://registry.npmjs.org/aws-sign/-/aws-sign-0.2.0.tgz"
433 | },
434 | "oauth-sign": {
435 | "version": "0.2.0",
436 | "from": "oauth-sign@~0.2.0",
437 | "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.2.0.tgz"
438 | },
439 | "forever-agent": {
440 | "version": "0.2.0",
441 | "from": "forever-agent@~0.2.0",
442 | "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.2.0.tgz"
443 | },
444 | "tunnel-agent": {
445 | "version": "0.2.0",
446 | "from": "tunnel-agent@~0.2.0",
447 | "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.2.0.tgz"
448 | },
449 | "json-stringify-safe": {
450 | "version": "3.0.0",
451 | "from": "json-stringify-safe@~3.0.0",
452 | "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-3.0.0.tgz"
453 | },
454 | "qs": {
455 | "version": "0.5.6",
456 | "from": "qs@~0.5.0",
457 | "resolved": "https://registry.npmjs.org/qs/-/qs-0.5.6.tgz"
458 | }
459 | }
460 | },
461 | "lcov-parse": {
462 | "version": "0.0.4",
463 | "from": "lcov-parse@0.0.4",
464 | "resolved": "https://registry.npmjs.org/lcov-parse/-/lcov-parse-0.0.4.tgz"
465 | },
466 | "log-driver": {
467 | "version": "1.2.1",
468 | "from": "log-driver@1.2.1",
469 | "resolved": "https://registry.npmjs.org/log-driver/-/log-driver-1.2.1.tgz"
470 | }
471 | }
472 | },
473 | "karma-coverage": {
474 | "version": "0.1.5",
475 | "from": "karma-coverage@~0.1.0",
476 | "resolved": "https://registry.npmjs.org/karma-coverage/-/karma-coverage-0.1.5.tgz",
477 | "dependencies": {
478 | "istanbul": {
479 | "version": "0.1.46",
480 | "from": "istanbul@~0.1.45",
481 | "resolved": "https://registry.npmjs.org/istanbul/-/istanbul-0.1.46.tgz",
482 | "dependencies": {
483 | "esprima": {
484 | "version": "1.0.4",
485 | "from": "esprima@1.0.x",
486 | "resolved": "https://registry.npmjs.org/esprima/-/esprima-1.0.4.tgz"
487 | },
488 | "escodegen": {
489 | "version": "0.0.23",
490 | "from": "escodegen@0.0.23",
491 | "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-0.0.23.tgz",
492 | "dependencies": {
493 | "estraverse": {
494 | "version": "0.0.4",
495 | "from": "estraverse@~0.0.4",
496 | "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-0.0.4.tgz"
497 | },
498 | "source-map": {
499 | "version": "0.1.40",
500 | "from": "source-map@>= 0.1.2",
501 | "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.1.40.tgz",
502 | "dependencies": {
503 | "amdefine": {
504 | "version": "0.1.0",
505 | "from": "amdefine@>=0.0.4",
506 | "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-0.1.0.tgz"
507 | }
508 | }
509 | }
510 | }
511 | },
512 | "handlebars": {
513 | "version": "1.0.12",
514 | "from": "handlebars@1.0.x",
515 | "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-1.0.12.tgz",
516 | "dependencies": {
517 | "optimist": {
518 | "version": "0.3.7",
519 | "from": "optimist@~0.3",
520 | "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.3.7.tgz"
521 | },
522 | "uglify-js": {
523 | "version": "2.3.6",
524 | "from": "uglify-js@~2.3",
525 | "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.3.6.tgz",
526 | "dependencies": {
527 | "source-map": {
528 | "version": "0.1.40",
529 | "from": "source-map@~0.1.7",
530 | "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.1.40.tgz",
531 | "dependencies": {
532 | "amdefine": {
533 | "version": "0.1.0",
534 | "from": "amdefine@>=0.0.4",
535 | "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-0.1.0.tgz"
536 | }
537 | }
538 | }
539 | }
540 | }
541 | }
542 | },
543 | "mkdirp": {
544 | "version": "0.3.5",
545 | "from": "mkdirp@0.3.x",
546 | "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.3.5.tgz"
547 | },
548 | "nopt": {
549 | "version": "2.1.2",
550 | "from": "nopt@2.1.x",
551 | "resolved": "https://registry.npmjs.org/nopt/-/nopt-2.1.2.tgz"
552 | },
553 | "fileset": {
554 | "version": "0.1.5",
555 | "from": "fileset@0.1.x",
556 | "resolved": "https://registry.npmjs.org/fileset/-/fileset-0.1.5.tgz",
557 | "dependencies": {
558 | "minimatch": {
559 | "version": "0.4.0",
560 | "from": "minimatch@0.x",
561 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-0.4.0.tgz",
562 | "dependencies": {
563 | "lru-cache": {
564 | "version": "2.5.0",
565 | "from": "lru-cache@2",
566 | "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-2.5.0.tgz"
567 | },
568 | "sigmund": {
569 | "version": "1.0.0",
570 | "from": "sigmund@~1.0.0",
571 | "resolved": "https://registry.npmjs.org/sigmund/-/sigmund-1.0.0.tgz"
572 | }
573 | }
574 | },
575 | "glob": {
576 | "version": "3.2.11",
577 | "from": "glob@3.x",
578 | "resolved": "https://registry.npmjs.org/glob/-/glob-3.2.11.tgz",
579 | "dependencies": {
580 | "inherits": {
581 | "version": "2.0.1",
582 | "from": "inherits@2",
583 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz"
584 | },
585 | "minimatch": {
586 | "version": "0.3.0",
587 | "from": "minimatch@0.3",
588 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-0.3.0.tgz",
589 | "dependencies": {
590 | "lru-cache": {
591 | "version": "2.5.0",
592 | "from": "lru-cache@2",
593 | "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-2.5.0.tgz"
594 | },
595 | "sigmund": {
596 | "version": "1.0.0",
597 | "from": "sigmund@~1.0.0",
598 | "resolved": "https://registry.npmjs.org/sigmund/-/sigmund-1.0.0.tgz"
599 | }
600 | }
601 | }
602 | }
603 | }
604 | }
605 | },
606 | "which": {
607 | "version": "1.0.5",
608 | "from": "which@1.0.x",
609 | "resolved": "https://registry.npmjs.org/which/-/which-1.0.5.tgz"
610 | },
611 | "async": {
612 | "version": "0.2.10",
613 | "from": "async@0.2.x",
614 | "resolved": "https://registry.npmjs.org/async/-/async-0.2.10.tgz"
615 | },
616 | "abbrev": {
617 | "version": "1.0.5",
618 | "from": "abbrev@1.0.x",
619 | "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.0.5.tgz"
620 | },
621 | "wordwrap": {
622 | "version": "0.0.2",
623 | "from": "wordwrap@0.0.x",
624 | "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz"
625 | },
626 | "resolve": {
627 | "version": "0.5.1",
628 | "from": "resolve@0.5.x",
629 | "resolved": "https://registry.npmjs.org/resolve/-/resolve-0.5.1.tgz"
630 | }
631 | }
632 | },
633 | "ibrik": {
634 | "version": "1.0.1",
635 | "from": "ibrik@~1.0.1",
636 | "resolved": "https://registry.npmjs.org/ibrik/-/ibrik-1.0.1.tgz",
637 | "dependencies": {
638 | "coffee-script-redux": {
639 | "version": "2.0.0-beta4",
640 | "from": "coffee-script-redux@git+https://github.com/michaelficarra/CoffeeScriptRedux.git#9895cd1641fdf3a2424e662ab7583726bb0e35b3",
641 | "resolved": "git+https://github.com/michaelficarra/CoffeeScriptRedux.git#9895cd1641fdf3a2424e662ab7583726bb0e35b3",
642 | "dependencies": {
643 | "StringScanner": {
644 | "version": "0.0.3",
645 | "from": "StringScanner@~0.0.3",
646 | "resolved": "https://registry.npmjs.org/StringScanner/-/StringScanner-0.0.3.tgz"
647 | },
648 | "jedediah": {
649 | "version": "0.1.1",
650 | "from": "jedediah@~0.1.0",
651 | "resolved": "https://registry.npmjs.org/jedediah/-/jedediah-0.1.1.tgz"
652 | },
653 | "esmangle": {
654 | "version": "0.0.17",
655 | "from": "esmangle@~0.0.8",
656 | "resolved": "https://registry.npmjs.org/esmangle/-/esmangle-0.0.17.tgz",
657 | "dependencies": {
658 | "esprima": {
659 | "version": "1.0.4",
660 | "from": "esprima@~ 1.0.2",
661 | "resolved": "https://registry.npmjs.org/esprima/-/esprima-1.0.4.tgz"
662 | },
663 | "escope": {
664 | "version": "1.0.1",
665 | "from": "escope@~ 1.0.0",
666 | "resolved": "https://registry.npmjs.org/escope/-/escope-1.0.1.tgz"
667 | },
668 | "estraverse": {
669 | "version": "1.3.2",
670 | "from": "estraverse@~ 1.3.2",
671 | "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-1.3.2.tgz"
672 | },
673 | "esshorten": {
674 | "version": "0.0.2",
675 | "from": "esshorten@~ 0.0.2",
676 | "resolved": "https://registry.npmjs.org/esshorten/-/esshorten-0.0.2.tgz",
677 | "dependencies": {
678 | "estraverse": {
679 | "version": "1.2.0",
680 | "from": "estraverse@~ 1.2.0",
681 | "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-1.2.0.tgz"
682 | }
683 | }
684 | }
685 | }
686 | },
687 | "source-map": {
688 | "version": "0.1.40",
689 | "from": "source-map@~0.1.7",
690 | "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.1.40.tgz",
691 | "dependencies": {
692 | "amdefine": {
693 | "version": "0.1.0",
694 | "from": "amdefine@>=0.0.4",
695 | "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-0.1.0.tgz"
696 | }
697 | }
698 | },
699 | "escodegen": {
700 | "version": "0.0.28",
701 | "from": "escodegen@~0.0.12",
702 | "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-0.0.28.tgz",
703 | "dependencies": {
704 | "esprima": {
705 | "version": "1.0.4",
706 | "from": "esprima@~1.0.2",
707 | "resolved": "https://registry.npmjs.org/esprima/-/esprima-1.0.4.tgz"
708 | },
709 | "estraverse": {
710 | "version": "1.3.2",
711 | "from": "estraverse@~1.3.0",
712 | "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-1.3.2.tgz"
713 | }
714 | }
715 | },
716 | "cscodegen": {
717 | "version": "0.1.0",
718 | "from": "cscodegen@git://github.com/michaelficarra/cscodegen.git#73fd7202ac086c26f18c9d56f025b18b3c6f5383",
719 | "resolved": "git://github.com/michaelficarra/cscodegen.git#73fd7202ac086c26f18c9d56f025b18b3c6f5383"
720 | }
721 | }
722 | },
723 | "optimist": {
724 | "version": "0.6.1",
725 | "from": "optimist@*",
726 | "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz",
727 | "dependencies": {
728 | "wordwrap": {
729 | "version": "0.0.2",
730 | "from": "wordwrap@~0.0.2",
731 | "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz"
732 | },
733 | "minimist": {
734 | "version": "0.0.10",
735 | "from": "minimist@~0.0.1",
736 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.10.tgz"
737 | }
738 | }
739 | },
740 | "escodegen": {
741 | "version": "1.4.1",
742 | "from": "escodegen@*",
743 | "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.4.1.tgz",
744 | "dependencies": {
745 | "esutils": {
746 | "version": "1.1.4",
747 | "from": "esutils@^1.1.4",
748 | "resolved": "https://registry.npmjs.org/esutils/-/esutils-1.1.4.tgz"
749 | },
750 | "esprima": {
751 | "version": "1.2.2",
752 | "from": "esprima@^1.2.2",
753 | "resolved": "https://registry.npmjs.org/esprima/-/esprima-1.2.2.tgz"
754 | },
755 | "source-map": {
756 | "version": "0.1.40",
757 | "from": "source-map@~0.1.37",
758 | "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.1.40.tgz",
759 | "dependencies": {
760 | "amdefine": {
761 | "version": "0.1.0",
762 | "from": "amdefine@>=0.0.4",
763 | "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-0.1.0.tgz"
764 | }
765 | }
766 | }
767 | }
768 | },
769 | "mkdirp": {
770 | "version": "0.5.0",
771 | "from": "mkdirp@0.x.x",
772 | "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.0.tgz",
773 | "dependencies": {
774 | "minimist": {
775 | "version": "0.0.8",
776 | "from": "minimist@0.0.8",
777 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz"
778 | }
779 | }
780 | },
781 | "which": {
782 | "version": "1.0.5",
783 | "from": "which@1.0.x",
784 | "resolved": "https://registry.npmjs.org/which/-/which-1.0.5.tgz"
785 | },
786 | "estraverse": {
787 | "version": "1.7.0",
788 | "from": "estraverse@*",
789 | "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-1.7.0.tgz"
790 | }
791 | }
792 | },
793 | "dateformat": {
794 | "version": "1.0.8",
795 | "from": "dateformat@~1.0.6",
796 | "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-1.0.8.tgz"
797 | }
798 | }
799 | },
800 | "glob": {
801 | "version": "4.0.6",
802 | "from": "glob@*",
803 | "resolved": "https://registry.npmjs.org/glob/-/glob-4.0.6.tgz",
804 | "dependencies": {
805 | "graceful-fs": {
806 | "version": "3.0.4",
807 | "from": "graceful-fs@^3.0.2",
808 | "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-3.0.4.tgz"
809 | },
810 | "inherits": {
811 | "version": "2.0.1",
812 | "from": "inherits@2",
813 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz"
814 | },
815 | "minimatch": {
816 | "version": "1.0.0",
817 | "from": "minimatch@^1.0.0",
818 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-1.0.0.tgz",
819 | "dependencies": {
820 | "lru-cache": {
821 | "version": "2.5.0",
822 | "from": "lru-cache@2",
823 | "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-2.5.0.tgz"
824 | },
825 | "sigmund": {
826 | "version": "1.0.0",
827 | "from": "sigmund@~1.0.0",
828 | "resolved": "https://registry.npmjs.org/sigmund/-/sigmund-1.0.0.tgz"
829 | }
830 | }
831 | },
832 | "once": {
833 | "version": "1.3.1",
834 | "from": "once@^1.3.0",
835 | "resolved": "https://registry.npmjs.org/once/-/once-1.3.1.tgz",
836 | "dependencies": {
837 | "wrappy": {
838 | "version": "1.0.1",
839 | "from": "wrappy@1",
840 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.1.tgz"
841 | }
842 | }
843 | }
844 | }
845 | }
846 | }
847 | },
848 | "karma": {
849 | "version": "0.12.24",
850 | "from": "https://registry.npmjs.org/karma/-/karma-0.12.24.tgz",
851 | "resolved": "https://registry.npmjs.org/karma/-/karma-0.12.24.tgz",
852 | "dependencies": {
853 | "di": {
854 | "version": "0.0.1",
855 | "from": "https://registry.npmjs.org/di/-/di-0.0.1.tgz",
856 | "resolved": "https://registry.npmjs.org/di/-/di-0.0.1.tgz"
857 | },
858 | "socket.io": {
859 | "version": "0.9.17",
860 | "from": "socket.io@0.9.17",
861 | "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-0.9.17.tgz",
862 | "dependencies": {
863 | "socket.io-client": {
864 | "version": "0.9.16",
865 | "from": "socket.io-client@0.9.16",
866 | "resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-0.9.16.tgz",
867 | "dependencies": {
868 | "uglify-js": {
869 | "version": "1.2.5",
870 | "from": "uglify-js@1.2.5",
871 | "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-1.2.5.tgz"
872 | },
873 | "ws": {
874 | "version": "0.4.32",
875 | "from": "ws@0.4.x",
876 | "resolved": "https://registry.npmjs.org/ws/-/ws-0.4.32.tgz",
877 | "dependencies": {
878 | "commander": {
879 | "version": "2.1.0",
880 | "from": "commander@~2.1.0",
881 | "resolved": "https://registry.npmjs.org/commander/-/commander-2.1.0.tgz"
882 | },
883 | "nan": {
884 | "version": "1.0.0",
885 | "from": "nan@~1.0.0",
886 | "resolved": "https://registry.npmjs.org/nan/-/nan-1.0.0.tgz"
887 | },
888 | "tinycolor": {
889 | "version": "0.0.1",
890 | "from": "tinycolor@0.x",
891 | "resolved": "https://registry.npmjs.org/tinycolor/-/tinycolor-0.0.1.tgz"
892 | },
893 | "options": {
894 | "version": "0.0.6",
895 | "from": "options@>=0.0.5",
896 | "resolved": "https://registry.npmjs.org/options/-/options-0.0.6.tgz"
897 | }
898 | }
899 | },
900 | "xmlhttprequest": {
901 | "version": "1.4.2",
902 | "from": "xmlhttprequest@1.4.2",
903 | "resolved": "https://registry.npmjs.org/xmlhttprequest/-/xmlhttprequest-1.4.2.tgz"
904 | },
905 | "active-x-obfuscator": {
906 | "version": "0.0.1",
907 | "from": "active-x-obfuscator@0.0.1",
908 | "resolved": "https://registry.npmjs.org/active-x-obfuscator/-/active-x-obfuscator-0.0.1.tgz",
909 | "dependencies": {
910 | "zeparser": {
911 | "version": "0.0.5",
912 | "from": "zeparser@0.0.5",
913 | "resolved": "https://registry.npmjs.org/zeparser/-/zeparser-0.0.5.tgz"
914 | }
915 | }
916 | }
917 | }
918 | },
919 | "policyfile": {
920 | "version": "0.0.4",
921 | "from": "policyfile@0.0.4",
922 | "resolved": "https://registry.npmjs.org/policyfile/-/policyfile-0.0.4.tgz"
923 | },
924 | "base64id": {
925 | "version": "0.1.0",
926 | "from": "base64id@0.1.0",
927 | "resolved": "https://registry.npmjs.org/base64id/-/base64id-0.1.0.tgz"
928 | },
929 | "redis": {
930 | "version": "0.7.3",
931 | "from": "redis@0.7.3",
932 | "resolved": "https://registry.npmjs.org/redis/-/redis-0.7.3.tgz"
933 | }
934 | }
935 | },
936 | "chokidar": {
937 | "version": "0.10.2",
938 | "from": "https://registry.npmjs.org/chokidar/-/chokidar-0.10.2.tgz",
939 | "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-0.10.2.tgz",
940 | "dependencies": {
941 | "async-each": {
942 | "version": "0.1.5",
943 | "from": "https://registry.npmjs.org/async-each/-/async-each-0.1.5.tgz",
944 | "resolved": "https://registry.npmjs.org/async-each/-/async-each-0.1.5.tgz"
945 | },
946 | "fsevents": {
947 | "version": "0.3.0",
948 | "from": "https://registry.npmjs.org/fsevents/-/fsevents-0.3.0.tgz",
949 | "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-0.3.0.tgz",
950 | "dependencies": {
951 | "nan": {
952 | "version": "1.2.0",
953 | "from": "nan@1.2.0",
954 | "resolved": "https://registry.npmjs.org/nan/-/nan-1.2.0.tgz"
955 | }
956 | }
957 | },
958 | "readdirp": {
959 | "version": "1.1.0",
960 | "from": "https://registry.npmjs.org/readdirp/-/readdirp-1.1.0.tgz",
961 | "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-1.1.0.tgz",
962 | "dependencies": {
963 | "graceful-fs": {
964 | "version": "2.0.3",
965 | "from": "graceful-fs@2.0.3",
966 | "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-2.0.3.tgz"
967 | },
968 | "minimatch": {
969 | "version": "0.2.14",
970 | "from": "minimatch@0.2.14",
971 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-0.2.14.tgz",
972 | "dependencies": {
973 | "lru-cache": {
974 | "version": "2.5.0",
975 | "from": "lru-cache@2",
976 | "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-2.5.0.tgz"
977 | },
978 | "sigmund": {
979 | "version": "1.0.0",
980 | "from": "sigmund@~1.0.0",
981 | "resolved": "https://registry.npmjs.org/sigmund/-/sigmund-1.0.0.tgz"
982 | }
983 | }
984 | },
985 | "readable-stream": {
986 | "version": "1.0.33",
987 | "from": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.33.tgz",
988 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.33.tgz",
989 | "dependencies": {
990 | "core-util-is": {
991 | "version": "1.0.1",
992 | "from": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.1.tgz",
993 | "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.1.tgz"
994 | },
995 | "isarray": {
996 | "version": "0.0.1",
997 | "from": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz",
998 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz"
999 | },
1000 | "string_decoder": {
1001 | "version": "0.10.31",
1002 | "from": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz",
1003 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz"
1004 | },
1005 | "inherits": {
1006 | "version": "2.0.1",
1007 | "from": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz",
1008 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz"
1009 | }
1010 | }
1011 | }
1012 | }
1013 | }
1014 | }
1015 | },
1016 | "glob": {
1017 | "version": "3.2.11",
1018 | "from": "glob@3.2.11",
1019 | "resolved": "https://registry.npmjs.org/glob/-/glob-3.2.11.tgz",
1020 | "dependencies": {
1021 | "inherits": {
1022 | "version": "2.0.1",
1023 | "from": "inherits@2",
1024 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz"
1025 | },
1026 | "minimatch": {
1027 | "version": "0.3.0",
1028 | "from": "minimatch@0.3",
1029 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-0.3.0.tgz",
1030 | "dependencies": {
1031 | "lru-cache": {
1032 | "version": "2.5.0",
1033 | "from": "lru-cache@2",
1034 | "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-2.5.0.tgz"
1035 | },
1036 | "sigmund": {
1037 | "version": "1.0.0",
1038 | "from": "sigmund@~1.0.0",
1039 | "resolved": "https://registry.npmjs.org/sigmund/-/sigmund-1.0.0.tgz"
1040 | }
1041 | }
1042 | }
1043 | }
1044 | },
1045 | "minimatch": {
1046 | "version": "0.2.14",
1047 | "from": "minimatch@0.2.14",
1048 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-0.2.14.tgz",
1049 | "dependencies": {
1050 | "lru-cache": {
1051 | "version": "2.5.0",
1052 | "from": "lru-cache@2",
1053 | "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-2.5.0.tgz"
1054 | },
1055 | "sigmund": {
1056 | "version": "1.0.0",
1057 | "from": "sigmund@~1.0.0",
1058 | "resolved": "https://registry.npmjs.org/sigmund/-/sigmund-1.0.0.tgz"
1059 | }
1060 | }
1061 | },
1062 | "http-proxy": {
1063 | "version": "0.10.4",
1064 | "from": "http-proxy@0.10.4",
1065 | "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-0.10.4.tgz",
1066 | "dependencies": {
1067 | "pkginfo": {
1068 | "version": "0.3.0",
1069 | "from": "pkginfo@0.3.x",
1070 | "resolved": "https://registry.npmjs.org/pkginfo/-/pkginfo-0.3.0.tgz"
1071 | },
1072 | "utile": {
1073 | "version": "0.2.1",
1074 | "from": "utile@~0.2.1",
1075 | "resolved": "https://registry.npmjs.org/utile/-/utile-0.2.1.tgz",
1076 | "dependencies": {
1077 | "async": {
1078 | "version": "0.2.10",
1079 | "from": "async@~0.2.9",
1080 | "resolved": "https://registry.npmjs.org/async/-/async-0.2.10.tgz"
1081 | },
1082 | "deep-equal": {
1083 | "version": "0.2.1",
1084 | "from": "deep-equal@*",
1085 | "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-0.2.1.tgz"
1086 | },
1087 | "i": {
1088 | "version": "0.3.3",
1089 | "from": "i@0.3.x",
1090 | "resolved": "https://registry.npmjs.org/i/-/i-0.3.3.tgz"
1091 | },
1092 | "mkdirp": {
1093 | "version": "0.5.0",
1094 | "from": "mkdirp@0.x.x",
1095 | "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.0.tgz",
1096 | "dependencies": {
1097 | "minimist": {
1098 | "version": "0.0.8",
1099 | "from": "minimist@0.0.8",
1100 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz"
1101 | }
1102 | }
1103 | },
1104 | "ncp": {
1105 | "version": "0.4.2",
1106 | "from": "ncp@0.4.x",
1107 | "resolved": "https://registry.npmjs.org/ncp/-/ncp-0.4.2.tgz"
1108 | }
1109 | }
1110 | }
1111 | }
1112 | },
1113 | "optimist": {
1114 | "version": "0.6.1",
1115 | "from": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz",
1116 | "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz",
1117 | "dependencies": {
1118 | "wordwrap": {
1119 | "version": "0.0.2",
1120 | "from": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz",
1121 | "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz"
1122 | },
1123 | "minimist": {
1124 | "version": "0.0.10",
1125 | "from": "minimist@0.0.10",
1126 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.10.tgz"
1127 | }
1128 | }
1129 | },
1130 | "rimraf": {
1131 | "version": "2.2.8",
1132 | "from": "https://registry.npmjs.org/rimraf/-/rimraf-2.2.8.tgz",
1133 | "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.2.8.tgz"
1134 | },
1135 | "q": {
1136 | "version": "0.9.7",
1137 | "from": "q@0.9.7",
1138 | "resolved": "https://registry.npmjs.org/q/-/q-0.9.7.tgz"
1139 | },
1140 | "colors": {
1141 | "version": "0.6.2",
1142 | "from": "colors@0.6.2",
1143 | "resolved": "https://registry.npmjs.org/colors/-/colors-0.6.2.tgz"
1144 | },
1145 | "lodash": {
1146 | "version": "2.4.1",
1147 | "from": "https://registry.npmjs.org/lodash/-/lodash-2.4.1.tgz",
1148 | "resolved": "https://registry.npmjs.org/lodash/-/lodash-2.4.1.tgz"
1149 | },
1150 | "mime": {
1151 | "version": "1.2.11",
1152 | "from": "https://registry.npmjs.org/mime/-/mime-1.2.11.tgz",
1153 | "resolved": "https://registry.npmjs.org/mime/-/mime-1.2.11.tgz"
1154 | },
1155 | "log4js": {
1156 | "version": "0.6.21",
1157 | "from": "https://registry.npmjs.org/log4js/-/log4js-0.6.21.tgz",
1158 | "resolved": "https://registry.npmjs.org/log4js/-/log4js-0.6.21.tgz",
1159 | "dependencies": {
1160 | "async": {
1161 | "version": "0.2.10",
1162 | "from": "async@0.2.10",
1163 | "resolved": "https://registry.npmjs.org/async/-/async-0.2.10.tgz"
1164 | },
1165 | "readable-stream": {
1166 | "version": "1.0.33",
1167 | "from": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.33.tgz",
1168 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.33.tgz",
1169 | "dependencies": {
1170 | "core-util-is": {
1171 | "version": "1.0.1",
1172 | "from": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.1.tgz",
1173 | "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.1.tgz"
1174 | },
1175 | "isarray": {
1176 | "version": "0.0.1",
1177 | "from": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz",
1178 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz"
1179 | },
1180 | "string_decoder": {
1181 | "version": "0.10.31",
1182 | "from": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz",
1183 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz"
1184 | },
1185 | "inherits": {
1186 | "version": "2.0.1",
1187 | "from": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz",
1188 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz"
1189 | }
1190 | }
1191 | },
1192 | "semver": {
1193 | "version": "1.1.4",
1194 | "from": "semver@1.1.4",
1195 | "resolved": "https://registry.npmjs.org/semver/-/semver-1.1.4.tgz"
1196 | }
1197 | }
1198 | },
1199 | "useragent": {
1200 | "version": "2.0.10",
1201 | "from": "useragent@2.0.10",
1202 | "resolved": "https://registry.npmjs.org/useragent/-/useragent-2.0.10.tgz",
1203 | "dependencies": {
1204 | "lru-cache": {
1205 | "version": "2.2.4",
1206 | "from": "lru-cache@2.2.x",
1207 | "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-2.2.4.tgz"
1208 | }
1209 | }
1210 | },
1211 | "graceful-fs": {
1212 | "version": "2.0.3",
1213 | "from": "graceful-fs@2.0.3",
1214 | "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-2.0.3.tgz"
1215 | },
1216 | "connect": {
1217 | "version": "2.12.0",
1218 | "from": "connect@2.12.0",
1219 | "resolved": "https://registry.npmjs.org/connect/-/connect-2.12.0.tgz",
1220 | "dependencies": {
1221 | "batch": {
1222 | "version": "0.5.0",
1223 | "from": "batch@0.5.0",
1224 | "resolved": "https://registry.npmjs.org/batch/-/batch-0.5.0.tgz"
1225 | },
1226 | "qs": {
1227 | "version": "0.6.6",
1228 | "from": "qs@0.6.6",
1229 | "resolved": "https://registry.npmjs.org/qs/-/qs-0.6.6.tgz"
1230 | },
1231 | "cookie-signature": {
1232 | "version": "1.0.1",
1233 | "from": "cookie-signature@1.0.1",
1234 | "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.1.tgz"
1235 | },
1236 | "buffer-crc32": {
1237 | "version": "0.2.1",
1238 | "from": "buffer-crc32@0.2.1",
1239 | "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.1.tgz"
1240 | },
1241 | "cookie": {
1242 | "version": "0.1.0",
1243 | "from": "cookie@0.1.0",
1244 | "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.1.0.tgz"
1245 | },
1246 | "send": {
1247 | "version": "0.1.4",
1248 | "from": "send@0.1.4",
1249 | "resolved": "https://registry.npmjs.org/send/-/send-0.1.4.tgz",
1250 | "dependencies": {
1251 | "range-parser": {
1252 | "version": "0.0.4",
1253 | "from": "range-parser@0.0.4",
1254 | "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-0.0.4.tgz"
1255 | }
1256 | }
1257 | },
1258 | "bytes": {
1259 | "version": "0.2.1",
1260 | "from": "bytes@0.2.1",
1261 | "resolved": "https://registry.npmjs.org/bytes/-/bytes-0.2.1.tgz"
1262 | },
1263 | "fresh": {
1264 | "version": "0.2.0",
1265 | "from": "fresh@0.2.0",
1266 | "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.2.0.tgz"
1267 | },
1268 | "pause": {
1269 | "version": "0.0.1",
1270 | "from": "pause@0.0.1",
1271 | "resolved": "https://registry.npmjs.org/pause/-/pause-0.0.1.tgz"
1272 | },
1273 | "uid2": {
1274 | "version": "0.0.3",
1275 | "from": "uid2@0.0.3",
1276 | "resolved": "https://registry.npmjs.org/uid2/-/uid2-0.0.3.tgz"
1277 | },
1278 | "debug": {
1279 | "version": "0.8.1",
1280 | "from": "debug@>= 0.7.3 < 1",
1281 | "resolved": "https://registry.npmjs.org/debug/-/debug-0.8.1.tgz"
1282 | },
1283 | "methods": {
1284 | "version": "0.1.0",
1285 | "from": "methods@0.1.0",
1286 | "resolved": "https://registry.npmjs.org/methods/-/methods-0.1.0.tgz"
1287 | },
1288 | "raw-body": {
1289 | "version": "1.1.2",
1290 | "from": "raw-body@1.1.2",
1291 | "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-1.1.2.tgz"
1292 | },
1293 | "negotiator": {
1294 | "version": "0.3.0",
1295 | "from": "negotiator@0.3.0",
1296 | "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.3.0.tgz"
1297 | },
1298 | "multiparty": {
1299 | "version": "2.2.0",
1300 | "from": "multiparty@2.2.0",
1301 | "resolved": "https://registry.npmjs.org/multiparty/-/multiparty-2.2.0.tgz",
1302 | "dependencies": {
1303 | "readable-stream": {
1304 | "version": "1.1.13",
1305 | "from": "readable-stream@~1.1.9",
1306 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.13.tgz",
1307 | "dependencies": {
1308 | "core-util-is": {
1309 | "version": "1.0.1",
1310 | "from": "core-util-is@~1.0.0",
1311 | "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.1.tgz"
1312 | },
1313 | "isarray": {
1314 | "version": "0.0.1",
1315 | "from": "isarray@0.0.1",
1316 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz"
1317 | },
1318 | "string_decoder": {
1319 | "version": "0.10.31",
1320 | "from": "string_decoder@~0.10.x",
1321 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz"
1322 | },
1323 | "inherits": {
1324 | "version": "2.0.1",
1325 | "from": "inherits@~2.0.1",
1326 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz"
1327 | }
1328 | }
1329 | },
1330 | "stream-counter": {
1331 | "version": "0.2.0",
1332 | "from": "stream-counter@~0.2.0",
1333 | "resolved": "https://registry.npmjs.org/stream-counter/-/stream-counter-0.2.0.tgz"
1334 | }
1335 | }
1336 | }
1337 | }
1338 | },
1339 | "source-map": {
1340 | "version": "0.1.40",
1341 | "from": "https://registry.npmjs.org/source-map/-/source-map-0.1.40.tgz",
1342 | "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.1.40.tgz",
1343 | "dependencies": {
1344 | "amdefine": {
1345 | "version": "0.1.0",
1346 | "from": "https://registry.npmjs.org/amdefine/-/amdefine-0.1.0.tgz",
1347 | "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-0.1.0.tgz"
1348 | }
1349 | }
1350 | }
1351 | }
1352 | },
1353 | "karma-chai": {
1354 | "version": "0.1.0",
1355 | "from": "https://registry.npmjs.org/karma-chai/-/karma-chai-0.1.0.tgz",
1356 | "resolved": "https://registry.npmjs.org/karma-chai/-/karma-chai-0.1.0.tgz"
1357 | },
1358 | "karma-chrome-launcher": {
1359 | "version": "0.1.5",
1360 | "from": "https://registry.npmjs.org/karma-chrome-launcher/-/karma-chrome-launcher-0.1.5.tgz",
1361 | "resolved": "https://registry.npmjs.org/karma-chrome-launcher/-/karma-chrome-launcher-0.1.5.tgz"
1362 | },
1363 | "karma-coffee-preprocessor": {
1364 | "version": "0.1.3",
1365 | "from": "karma-coffee-preprocessor@0.1.3",
1366 | "resolved": "https://registry.npmjs.org/karma-coffee-preprocessor/-/karma-coffee-preprocessor-0.1.3.tgz",
1367 | "dependencies": {
1368 | "coffee-script": {
1369 | "version": "1.7.1",
1370 | "from": "coffee-script@~1.7",
1371 | "resolved": "https://registry.npmjs.org/coffee-script/-/coffee-script-1.7.1.tgz",
1372 | "dependencies": {
1373 | "mkdirp": {
1374 | "version": "0.3.5",
1375 | "from": "mkdirp@~0.3.5",
1376 | "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.3.5.tgz"
1377 | }
1378 | }
1379 | }
1380 | }
1381 | },
1382 | "karma-coverage": {
1383 | "version": "0.2.6",
1384 | "from": "https://registry.npmjs.org/karma-coverage/-/karma-coverage-0.2.6.tgz",
1385 | "resolved": "https://registry.npmjs.org/karma-coverage/-/karma-coverage-0.2.6.tgz",
1386 | "dependencies": {
1387 | "istanbul": {
1388 | "version": "0.3.2",
1389 | "from": "https://registry.npmjs.org/istanbul/-/istanbul-0.3.2.tgz",
1390 | "resolved": "https://registry.npmjs.org/istanbul/-/istanbul-0.3.2.tgz",
1391 | "dependencies": {
1392 | "esprima": {
1393 | "version": "1.2.2",
1394 | "from": "https://registry.npmjs.org/esprima/-/esprima-1.2.2.tgz",
1395 | "resolved": "https://registry.npmjs.org/esprima/-/esprima-1.2.2.tgz"
1396 | },
1397 | "escodegen": {
1398 | "version": "1.3.3",
1399 | "from": "escodegen@1.3.3",
1400 | "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.3.3.tgz",
1401 | "dependencies": {
1402 | "esutils": {
1403 | "version": "1.0.0",
1404 | "from": "esutils@~1.0.0",
1405 | "resolved": "https://registry.npmjs.org/esutils/-/esutils-1.0.0.tgz"
1406 | },
1407 | "estraverse": {
1408 | "version": "1.5.1",
1409 | "from": "estraverse@~1.5.0",
1410 | "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-1.5.1.tgz"
1411 | },
1412 | "esprima": {
1413 | "version": "1.1.1",
1414 | "from": "esprima@~1.1.1",
1415 | "resolved": "https://registry.npmjs.org/esprima/-/esprima-1.1.1.tgz"
1416 | },
1417 | "source-map": {
1418 | "version": "0.1.40",
1419 | "from": "source-map@~0.1.33",
1420 | "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.1.40.tgz",
1421 | "dependencies": {
1422 | "amdefine": {
1423 | "version": "0.1.0",
1424 | "from": "amdefine@>=0.0.4",
1425 | "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-0.1.0.tgz"
1426 | }
1427 | }
1428 | }
1429 | }
1430 | },
1431 | "handlebars": {
1432 | "version": "1.3.0",
1433 | "from": "handlebars@1.3.0",
1434 | "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-1.3.0.tgz",
1435 | "dependencies": {
1436 | "optimist": {
1437 | "version": "0.3.7",
1438 | "from": "optimist@~0.3",
1439 | "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.3.7.tgz"
1440 | },
1441 | "uglify-js": {
1442 | "version": "2.3.6",
1443 | "from": "uglify-js@~2.3",
1444 | "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.3.6.tgz",
1445 | "dependencies": {
1446 | "async": {
1447 | "version": "0.2.10",
1448 | "from": "async@~0.2.6",
1449 | "resolved": "https://registry.npmjs.org/async/-/async-0.2.10.tgz"
1450 | },
1451 | "source-map": {
1452 | "version": "0.1.40",
1453 | "from": "source-map@~0.1.7",
1454 | "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.1.40.tgz",
1455 | "dependencies": {
1456 | "amdefine": {
1457 | "version": "0.1.0",
1458 | "from": "amdefine@>=0.0.4",
1459 | "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-0.1.0.tgz"
1460 | }
1461 | }
1462 | }
1463 | }
1464 | }
1465 | }
1466 | },
1467 | "mkdirp": {
1468 | "version": "0.5.0",
1469 | "from": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.0.tgz",
1470 | "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.0.tgz",
1471 | "dependencies": {
1472 | "minimist": {
1473 | "version": "0.0.8",
1474 | "from": "minimist@0.0.8",
1475 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz"
1476 | }
1477 | }
1478 | },
1479 | "nopt": {
1480 | "version": "3.0.1",
1481 | "from": "https://registry.npmjs.org/nopt/-/nopt-3.0.1.tgz",
1482 | "resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.1.tgz"
1483 | },
1484 | "fileset": {
1485 | "version": "0.1.5",
1486 | "from": "https://registry.npmjs.org/fileset/-/fileset-0.1.5.tgz",
1487 | "resolved": "https://registry.npmjs.org/fileset/-/fileset-0.1.5.tgz",
1488 | "dependencies": {
1489 | "minimatch": {
1490 | "version": "0.4.0",
1491 | "from": "minimatch@0.4.0",
1492 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-0.4.0.tgz",
1493 | "dependencies": {
1494 | "lru-cache": {
1495 | "version": "2.5.0",
1496 | "from": "lru-cache@2",
1497 | "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-2.5.0.tgz"
1498 | },
1499 | "sigmund": {
1500 | "version": "1.0.0",
1501 | "from": "sigmund@~1.0.0",
1502 | "resolved": "https://registry.npmjs.org/sigmund/-/sigmund-1.0.0.tgz"
1503 | }
1504 | }
1505 | },
1506 | "glob": {
1507 | "version": "3.2.11",
1508 | "from": "glob@3.2.11",
1509 | "resolved": "https://registry.npmjs.org/glob/-/glob-3.2.11.tgz",
1510 | "dependencies": {
1511 | "inherits": {
1512 | "version": "2.0.1",
1513 | "from": "inherits@2",
1514 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz"
1515 | },
1516 | "minimatch": {
1517 | "version": "0.3.0",
1518 | "from": "minimatch@0.3",
1519 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-0.3.0.tgz",
1520 | "dependencies": {
1521 | "lru-cache": {
1522 | "version": "2.5.0",
1523 | "from": "lru-cache@2",
1524 | "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-2.5.0.tgz"
1525 | },
1526 | "sigmund": {
1527 | "version": "1.0.0",
1528 | "from": "sigmund@~1.0.0",
1529 | "resolved": "https://registry.npmjs.org/sigmund/-/sigmund-1.0.0.tgz"
1530 | }
1531 | }
1532 | }
1533 | }
1534 | }
1535 | }
1536 | },
1537 | "which": {
1538 | "version": "1.0.5",
1539 | "from": "https://registry.npmjs.org/which/-/which-1.0.5.tgz",
1540 | "resolved": "https://registry.npmjs.org/which/-/which-1.0.5.tgz"
1541 | },
1542 | "async": {
1543 | "version": "0.9.0",
1544 | "from": "https://registry.npmjs.org/async/-/async-0.9.0.tgz",
1545 | "resolved": "https://registry.npmjs.org/async/-/async-0.9.0.tgz"
1546 | },
1547 | "abbrev": {
1548 | "version": "1.0.5",
1549 | "from": "https://registry.npmjs.org/abbrev/-/abbrev-1.0.5.tgz",
1550 | "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.0.5.tgz"
1551 | },
1552 | "wordwrap": {
1553 | "version": "0.0.2",
1554 | "from": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz",
1555 | "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz"
1556 | },
1557 | "resolve": {
1558 | "version": "0.7.4",
1559 | "from": "resolve@0.7.4",
1560 | "resolved": "https://registry.npmjs.org/resolve/-/resolve-0.7.4.tgz"
1561 | },
1562 | "js-yaml": {
1563 | "version": "3.2.2",
1564 | "from": "js-yaml@3.2.2",
1565 | "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.2.2.tgz",
1566 | "dependencies": {
1567 | "argparse": {
1568 | "version": "0.1.15",
1569 | "from": "argparse@~ 0.1.11",
1570 | "resolved": "https://registry.npmjs.org/argparse/-/argparse-0.1.15.tgz",
1571 | "dependencies": {
1572 | "underscore": {
1573 | "version": "1.4.4",
1574 | "from": "underscore@~1.4.3",
1575 | "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.4.4.tgz"
1576 | },
1577 | "underscore.string": {
1578 | "version": "2.3.3",
1579 | "from": "underscore.string@~2.3.1",
1580 | "resolved": "https://registry.npmjs.org/underscore.string/-/underscore.string-2.3.3.tgz"
1581 | }
1582 | }
1583 | },
1584 | "esprima": {
1585 | "version": "1.0.4",
1586 | "from": "esprima@~ 1.0.2",
1587 | "resolved": "https://registry.npmjs.org/esprima/-/esprima-1.0.4.tgz"
1588 | }
1589 | }
1590 | },
1591 | "once": {
1592 | "version": "1.3.1",
1593 | "from": "https://registry.npmjs.org/once/-/once-1.3.1.tgz",
1594 | "resolved": "https://registry.npmjs.org/once/-/once-1.3.1.tgz",
1595 | "dependencies": {
1596 | "wrappy": {
1597 | "version": "1.0.1",
1598 | "from": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.1.tgz",
1599 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.1.tgz"
1600 | }
1601 | }
1602 | }
1603 | }
1604 | },
1605 | "ibrik": {
1606 | "version": "1.1.1",
1607 | "from": "https://registry.npmjs.org/ibrik/-/ibrik-1.1.1.tgz",
1608 | "resolved": "https://registry.npmjs.org/ibrik/-/ibrik-1.1.1.tgz",
1609 | "dependencies": {
1610 | "lodash": {
1611 | "version": "2.4.1",
1612 | "from": "https://registry.npmjs.org/lodash/-/lodash-2.4.1.tgz",
1613 | "resolved": "https://registry.npmjs.org/lodash/-/lodash-2.4.1.tgz"
1614 | },
1615 | "coffee-script-redux": {
1616 | "version": "2.0.0-beta8",
1617 | "from": "https://registry.npmjs.org/coffee-script-redux/-/coffee-script-redux-2.0.0-beta8.tgz",
1618 | "resolved": "https://registry.npmjs.org/coffee-script-redux/-/coffee-script-redux-2.0.0-beta8.tgz",
1619 | "dependencies": {
1620 | "StringScanner": {
1621 | "version": "0.0.3",
1622 | "from": "https://registry.npmjs.org/StringScanner/-/StringScanner-0.0.3.tgz",
1623 | "resolved": "https://registry.npmjs.org/StringScanner/-/StringScanner-0.0.3.tgz"
1624 | },
1625 | "nopt": {
1626 | "version": "2.1.2",
1627 | "from": "nopt@2.1.2",
1628 | "resolved": "https://registry.npmjs.org/nopt/-/nopt-2.1.2.tgz",
1629 | "dependencies": {
1630 | "abbrev": {
1631 | "version": "1.0.5",
1632 | "from": "abbrev@1",
1633 | "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.0.5.tgz"
1634 | }
1635 | }
1636 | },
1637 | "esmangle": {
1638 | "version": "0.0.17",
1639 | "from": "esmangle@0.0.17",
1640 | "resolved": "https://registry.npmjs.org/esmangle/-/esmangle-0.0.17.tgz",
1641 | "dependencies": {
1642 | "esprima": {
1643 | "version": "1.0.4",
1644 | "from": "esprima@~ 1.0.2",
1645 | "resolved": "https://registry.npmjs.org/esprima/-/esprima-1.0.4.tgz"
1646 | },
1647 | "escope": {
1648 | "version": "1.0.1",
1649 | "from": "escope@~ 1.0.0",
1650 | "resolved": "https://registry.npmjs.org/escope/-/escope-1.0.1.tgz"
1651 | },
1652 | "estraverse": {
1653 | "version": "1.3.2",
1654 | "from": "estraverse@~ 1.3.2",
1655 | "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-1.3.2.tgz"
1656 | },
1657 | "esshorten": {
1658 | "version": "0.0.2",
1659 | "from": "esshorten@~ 0.0.2",
1660 | "resolved": "https://registry.npmjs.org/esshorten/-/esshorten-0.0.2.tgz",
1661 | "dependencies": {
1662 | "estraverse": {
1663 | "version": "1.2.0",
1664 | "from": "estraverse@~ 1.2.0",
1665 | "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-1.2.0.tgz"
1666 | }
1667 | }
1668 | },
1669 | "optimist": {
1670 | "version": "0.6.1",
1671 | "from": "optimist@*",
1672 | "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz",
1673 | "dependencies": {
1674 | "wordwrap": {
1675 | "version": "0.0.2",
1676 | "from": "wordwrap@~0.0.2",
1677 | "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz"
1678 | },
1679 | "minimist": {
1680 | "version": "0.0.10",
1681 | "from": "minimist@~0.0.1",
1682 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.10.tgz"
1683 | }
1684 | }
1685 | }
1686 | }
1687 | },
1688 | "source-map": {
1689 | "version": "0.1.11",
1690 | "from": "source-map@0.1.11",
1691 | "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.1.11.tgz",
1692 | "dependencies": {
1693 | "amdefine": {
1694 | "version": "0.1.0",
1695 | "from": "amdefine@>=0.0.4",
1696 | "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-0.1.0.tgz"
1697 | }
1698 | }
1699 | },
1700 | "escodegen": {
1701 | "version": "0.0.28",
1702 | "from": "escodegen@0.0.28",
1703 | "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-0.0.28.tgz",
1704 | "dependencies": {
1705 | "esprima": {
1706 | "version": "1.0.4",
1707 | "from": "esprima@~1.0.2",
1708 | "resolved": "https://registry.npmjs.org/esprima/-/esprima-1.0.4.tgz"
1709 | },
1710 | "estraverse": {
1711 | "version": "1.3.2",
1712 | "from": "estraverse@~1.3.0",
1713 | "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-1.3.2.tgz"
1714 | }
1715 | }
1716 | },
1717 | "cscodegen": {
1718 | "version": "0.1.0",
1719 | "from": "git://github.com/michaelficarra/cscodegen.git#73fd7202ac086c26f18c9d56f025b18b3c6f5383",
1720 | "resolved": "git://github.com/michaelficarra/cscodegen.git#73fd7202ac086c26f18c9d56f025b18b3c6f5383"
1721 | }
1722 | }
1723 | },
1724 | "istanbul": {
1725 | "version": "0.2.16",
1726 | "from": "istanbul@0.2.16",
1727 | "resolved": "https://registry.npmjs.org/istanbul/-/istanbul-0.2.16.tgz",
1728 | "dependencies": {
1729 | "esprima": {
1730 | "version": "1.2.2",
1731 | "from": "esprima@1.2.x",
1732 | "resolved": "https://registry.npmjs.org/esprima/-/esprima-1.2.2.tgz"
1733 | },
1734 | "escodegen": {
1735 | "version": "1.3.3",
1736 | "from": "escodegen@1.3.x",
1737 | "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.3.3.tgz",
1738 | "dependencies": {
1739 | "esutils": {
1740 | "version": "1.0.0",
1741 | "from": "esutils@~1.0.0",
1742 | "resolved": "https://registry.npmjs.org/esutils/-/esutils-1.0.0.tgz"
1743 | },
1744 | "esprima": {
1745 | "version": "1.1.1",
1746 | "from": "esprima@~1.1.1",
1747 | "resolved": "https://registry.npmjs.org/esprima/-/esprima-1.1.1.tgz"
1748 | },
1749 | "source-map": {
1750 | "version": "0.1.40",
1751 | "from": "source-map@~0.1.33",
1752 | "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.1.40.tgz",
1753 | "dependencies": {
1754 | "amdefine": {
1755 | "version": "0.1.0",
1756 | "from": "amdefine@>=0.0.4",
1757 | "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-0.1.0.tgz"
1758 | }
1759 | }
1760 | }
1761 | }
1762 | },
1763 | "handlebars": {
1764 | "version": "1.3.0",
1765 | "from": "handlebars@1.3.x",
1766 | "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-1.3.0.tgz",
1767 | "dependencies": {
1768 | "optimist": {
1769 | "version": "0.3.7",
1770 | "from": "optimist@~0.3",
1771 | "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.3.7.tgz"
1772 | },
1773 | "uglify-js": {
1774 | "version": "2.3.6",
1775 | "from": "uglify-js@~2.3",
1776 | "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.3.6.tgz",
1777 | "dependencies": {
1778 | "async": {
1779 | "version": "0.2.10",
1780 | "from": "async@~0.2.6",
1781 | "resolved": "https://registry.npmjs.org/async/-/async-0.2.10.tgz"
1782 | },
1783 | "source-map": {
1784 | "version": "0.1.40",
1785 | "from": "source-map@~0.1.7",
1786 | "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.1.40.tgz",
1787 | "dependencies": {
1788 | "amdefine": {
1789 | "version": "0.1.0",
1790 | "from": "amdefine@>=0.0.4",
1791 | "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-0.1.0.tgz"
1792 | }
1793 | }
1794 | }
1795 | }
1796 | }
1797 | }
1798 | },
1799 | "mkdirp": {
1800 | "version": "0.5.0",
1801 | "from": "mkdirp@0.5.x",
1802 | "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.0.tgz",
1803 | "dependencies": {
1804 | "minimist": {
1805 | "version": "0.0.8",
1806 | "from": "minimist@0.0.8",
1807 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz"
1808 | }
1809 | }
1810 | },
1811 | "nopt": {
1812 | "version": "3.0.1",
1813 | "from": "nopt@3.x",
1814 | "resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.1.tgz"
1815 | },
1816 | "fileset": {
1817 | "version": "0.1.5",
1818 | "from": "fileset@0.1.x",
1819 | "resolved": "https://registry.npmjs.org/fileset/-/fileset-0.1.5.tgz",
1820 | "dependencies": {
1821 | "minimatch": {
1822 | "version": "0.4.0",
1823 | "from": "minimatch@0.x",
1824 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-0.4.0.tgz",
1825 | "dependencies": {
1826 | "lru-cache": {
1827 | "version": "2.5.0",
1828 | "from": "lru-cache@2",
1829 | "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-2.5.0.tgz"
1830 | },
1831 | "sigmund": {
1832 | "version": "1.0.0",
1833 | "from": "sigmund@~1.0.0",
1834 | "resolved": "https://registry.npmjs.org/sigmund/-/sigmund-1.0.0.tgz"
1835 | }
1836 | }
1837 | },
1838 | "glob": {
1839 | "version": "3.2.11",
1840 | "from": "glob@3.x",
1841 | "resolved": "https://registry.npmjs.org/glob/-/glob-3.2.11.tgz",
1842 | "dependencies": {
1843 | "inherits": {
1844 | "version": "2.0.1",
1845 | "from": "inherits@2",
1846 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz"
1847 | },
1848 | "minimatch": {
1849 | "version": "0.3.0",
1850 | "from": "minimatch@0.3",
1851 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-0.3.0.tgz",
1852 | "dependencies": {
1853 | "lru-cache": {
1854 | "version": "2.5.0",
1855 | "from": "lru-cache@2",
1856 | "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-2.5.0.tgz"
1857 | },
1858 | "sigmund": {
1859 | "version": "1.0.0",
1860 | "from": "sigmund@~1.0.0",
1861 | "resolved": "https://registry.npmjs.org/sigmund/-/sigmund-1.0.0.tgz"
1862 | }
1863 | }
1864 | }
1865 | }
1866 | }
1867 | }
1868 | },
1869 | "async": {
1870 | "version": "0.9.0",
1871 | "from": "async@0.9.x",
1872 | "resolved": "https://registry.npmjs.org/async/-/async-0.9.0.tgz"
1873 | },
1874 | "abbrev": {
1875 | "version": "1.0.5",
1876 | "from": "abbrev@1",
1877 | "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.0.5.tgz"
1878 | },
1879 | "wordwrap": {
1880 | "version": "0.0.2",
1881 | "from": "wordwrap@0.0.x",
1882 | "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz"
1883 | },
1884 | "resolve": {
1885 | "version": "0.7.4",
1886 | "from": "resolve@0.7.x",
1887 | "resolved": "https://registry.npmjs.org/resolve/-/resolve-0.7.4.tgz"
1888 | },
1889 | "js-yaml": {
1890 | "version": "3.2.2",
1891 | "from": "js-yaml@3.x",
1892 | "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.2.2.tgz",
1893 | "dependencies": {
1894 | "argparse": {
1895 | "version": "0.1.15",
1896 | "from": "argparse@~ 0.1.11",
1897 | "resolved": "https://registry.npmjs.org/argparse/-/argparse-0.1.15.tgz",
1898 | "dependencies": {
1899 | "underscore": {
1900 | "version": "1.4.4",
1901 | "from": "underscore@~1.4.3",
1902 | "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.4.4.tgz"
1903 | },
1904 | "underscore.string": {
1905 | "version": "2.3.3",
1906 | "from": "underscore.string@~2.3.1",
1907 | "resolved": "https://registry.npmjs.org/underscore.string/-/underscore.string-2.3.3.tgz"
1908 | }
1909 | }
1910 | },
1911 | "esprima": {
1912 | "version": "1.0.4",
1913 | "from": "esprima@~ 1.0.2",
1914 | "resolved": "https://registry.npmjs.org/esprima/-/esprima-1.0.4.tgz"
1915 | }
1916 | }
1917 | }
1918 | }
1919 | },
1920 | "estraverse": {
1921 | "version": "1.5.1",
1922 | "from": "estraverse@1.5.1",
1923 | "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-1.5.1.tgz"
1924 | },
1925 | "escodegen": {
1926 | "version": "1.1.0",
1927 | "from": "escodegen@1.1.0",
1928 | "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.1.0.tgz",
1929 | "dependencies": {
1930 | "esprima": {
1931 | "version": "1.0.4",
1932 | "from": "esprima@~1.0.4",
1933 | "resolved": "https://registry.npmjs.org/esprima/-/esprima-1.0.4.tgz"
1934 | },
1935 | "esutils": {
1936 | "version": "1.0.0",
1937 | "from": "esutils@~1.0.0",
1938 | "resolved": "https://registry.npmjs.org/esutils/-/esutils-1.0.0.tgz"
1939 | },
1940 | "source-map": {
1941 | "version": "0.1.40",
1942 | "from": "source-map@~0.1.33",
1943 | "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.1.40.tgz",
1944 | "dependencies": {
1945 | "amdefine": {
1946 | "version": "0.1.0",
1947 | "from": "amdefine@>=0.0.4",
1948 | "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-0.1.0.tgz"
1949 | }
1950 | }
1951 | }
1952 | }
1953 | },
1954 | "which": {
1955 | "version": "1.0.5",
1956 | "from": "https://registry.npmjs.org/which/-/which-1.0.5.tgz",
1957 | "resolved": "https://registry.npmjs.org/which/-/which-1.0.5.tgz"
1958 | },
1959 | "mkdirp": {
1960 | "version": "0.3.5",
1961 | "from": "mkdirp@0.3.5",
1962 | "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.3.5.tgz"
1963 | },
1964 | "optimist": {
1965 | "version": "0.6.1",
1966 | "from": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz",
1967 | "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz",
1968 | "dependencies": {
1969 | "wordwrap": {
1970 | "version": "0.0.2",
1971 | "from": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz",
1972 | "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz"
1973 | },
1974 | "minimist": {
1975 | "version": "0.0.10",
1976 | "from": "minimist@0.0.10",
1977 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.10.tgz"
1978 | }
1979 | }
1980 | }
1981 | }
1982 | },
1983 | "dateformat": {
1984 | "version": "1.0.8",
1985 | "from": "https://registry.npmjs.org/dateformat/-/dateformat-1.0.8.tgz",
1986 | "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-1.0.8.tgz"
1987 | },
1988 | "minimatch": {
1989 | "version": "0.3.0",
1990 | "from": "minimatch@0.3.0",
1991 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-0.3.0.tgz",
1992 | "dependencies": {
1993 | "lru-cache": {
1994 | "version": "2.5.0",
1995 | "from": "lru-cache@2",
1996 | "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-2.5.0.tgz"
1997 | },
1998 | "sigmund": {
1999 | "version": "1.0.0",
2000 | "from": "sigmund@~1.0.0",
2001 | "resolved": "https://registry.npmjs.org/sigmund/-/sigmund-1.0.0.tgz"
2002 | }
2003 | }
2004 | }
2005 | }
2006 | },
2007 | "karma-firefox-launcher": {
2008 | "version": "0.1.3",
2009 | "from": "https://registry.npmjs.org/karma-firefox-launcher/-/karma-firefox-launcher-0.1.3.tgz",
2010 | "resolved": "https://registry.npmjs.org/karma-firefox-launcher/-/karma-firefox-launcher-0.1.3.tgz"
2011 | },
2012 | "karma-html2js-preprocessor": {
2013 | "version": "0.1.0",
2014 | "from": "https://registry.npmjs.org/karma-html2js-preprocessor/-/karma-html2js-preprocessor-0.1.0.tgz",
2015 | "resolved": "https://registry.npmjs.org/karma-html2js-preprocessor/-/karma-html2js-preprocessor-0.1.0.tgz"
2016 | },
2017 | "karma-jasmine": {
2018 | "version": "0.1.5",
2019 | "from": "https://registry.npmjs.org/karma-jasmine/-/karma-jasmine-0.1.5.tgz",
2020 | "resolved": "https://registry.npmjs.org/karma-jasmine/-/karma-jasmine-0.1.5.tgz"
2021 | },
2022 | "karma-junit-reporter": {
2023 | "version": "0.2.2",
2024 | "from": "https://registry.npmjs.org/karma-junit-reporter/-/karma-junit-reporter-0.2.2.tgz",
2025 | "resolved": "https://registry.npmjs.org/karma-junit-reporter/-/karma-junit-reporter-0.2.2.tgz",
2026 | "dependencies": {
2027 | "xmlbuilder": {
2028 | "version": "0.4.2",
2029 | "from": "xmlbuilder@0.4.2",
2030 | "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-0.4.2.tgz"
2031 | }
2032 | }
2033 | },
2034 | "karma-mocha": {
2035 | "version": "0.1.9",
2036 | "from": "https://registry.npmjs.org/karma-mocha/-/karma-mocha-0.1.9.tgz",
2037 | "resolved": "https://registry.npmjs.org/karma-mocha/-/karma-mocha-0.1.9.tgz"
2038 | },
2039 | "karma-phantomjs-launcher": {
2040 | "version": "0.1.4",
2041 | "from": "https://registry.npmjs.org/karma-phantomjs-launcher/-/karma-phantomjs-launcher-0.1.4.tgz",
2042 | "resolved": "https://registry.npmjs.org/karma-phantomjs-launcher/-/karma-phantomjs-launcher-0.1.4.tgz",
2043 | "dependencies": {
2044 | "phantomjs": {
2045 | "version": "1.9.12",
2046 | "from": "phantomjs@1.9.12",
2047 | "resolved": "https://registry.npmjs.org/phantomjs/-/phantomjs-1.9.12.tgz",
2048 | "dependencies": {
2049 | "adm-zip": {
2050 | "version": "0.4.4",
2051 | "from": "adm-zip@0.4.4",
2052 | "resolved": "https://registry.npmjs.org/adm-zip/-/adm-zip-0.4.4.tgz"
2053 | },
2054 | "kew": {
2055 | "version": "0.4.0",
2056 | "from": "kew@0.4.0",
2057 | "resolved": "https://registry.npmjs.org/kew/-/kew-0.4.0.tgz"
2058 | },
2059 | "ncp": {
2060 | "version": "1.0.1",
2061 | "from": "ncp@~1.0.1",
2062 | "resolved": "https://registry.npmjs.org/ncp/-/ncp-1.0.1.tgz"
2063 | },
2064 | "npmconf": {
2065 | "version": "2.0.9",
2066 | "from": "npmconf@2.0.9",
2067 | "resolved": "https://registry.npmjs.org/npmconf/-/npmconf-2.0.9.tgz",
2068 | "dependencies": {
2069 | "config-chain": {
2070 | "version": "1.1.8",
2071 | "from": "config-chain@~1.1.8",
2072 | "resolved": "https://registry.npmjs.org/config-chain/-/config-chain-1.1.8.tgz",
2073 | "dependencies": {
2074 | "proto-list": {
2075 | "version": "1.2.3",
2076 | "from": "proto-list@~1.2.1",
2077 | "resolved": "https://registry.npmjs.org/proto-list/-/proto-list-1.2.3.tgz"
2078 | }
2079 | }
2080 | },
2081 | "inherits": {
2082 | "version": "2.0.1",
2083 | "from": "inherits@2",
2084 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz"
2085 | },
2086 | "ini": {
2087 | "version": "1.3.0",
2088 | "from": "ini@^1.2.0",
2089 | "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.0.tgz"
2090 | },
2091 | "nopt": {
2092 | "version": "3.0.1",
2093 | "from": "nopt@~3.0.1",
2094 | "resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.1.tgz",
2095 | "dependencies": {
2096 | "abbrev": {
2097 | "version": "1.0.5",
2098 | "from": "abbrev@1",
2099 | "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.0.5.tgz"
2100 | }
2101 | }
2102 | },
2103 | "once": {
2104 | "version": "1.3.1",
2105 | "from": "once@~1.3.0",
2106 | "resolved": "https://registry.npmjs.org/once/-/once-1.3.1.tgz",
2107 | "dependencies": {
2108 | "wrappy": {
2109 | "version": "1.0.1",
2110 | "from": "wrappy@1",
2111 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.1.tgz"
2112 | }
2113 | }
2114 | },
2115 | "osenv": {
2116 | "version": "0.1.0",
2117 | "from": "osenv@^0.1.0",
2118 | "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.0.tgz"
2119 | },
2120 | "semver": {
2121 | "version": "4.1.0",
2122 | "from": "semver@2 || 3 || 4",
2123 | "resolved": "https://registry.npmjs.org/semver/-/semver-4.1.0.tgz"
2124 | },
2125 | "uid-number": {
2126 | "version": "0.0.5",
2127 | "from": "uid-number@0.0.5",
2128 | "resolved": "https://registry.npmjs.org/uid-number/-/uid-number-0.0.5.tgz"
2129 | }
2130 | }
2131 | },
2132 | "mkdirp": {
2133 | "version": "0.5.0",
2134 | "from": "mkdirp@0.5.0",
2135 | "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.0.tgz",
2136 | "dependencies": {
2137 | "minimist": {
2138 | "version": "0.0.8",
2139 | "from": "minimist@0.0.8",
2140 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz"
2141 | }
2142 | }
2143 | },
2144 | "progress": {
2145 | "version": "1.1.8",
2146 | "from": "progress@1.1.8",
2147 | "resolved": "https://registry.npmjs.org/progress/-/progress-1.1.8.tgz"
2148 | },
2149 | "request": {
2150 | "version": "2.42.0",
2151 | "from": "request@2.42.0",
2152 | "resolved": "https://registry.npmjs.org/request/-/request-2.42.0.tgz",
2153 | "dependencies": {
2154 | "bl": {
2155 | "version": "0.9.3",
2156 | "from": "bl@~0.9.0",
2157 | "resolved": "https://registry.npmjs.org/bl/-/bl-0.9.3.tgz",
2158 | "dependencies": {
2159 | "readable-stream": {
2160 | "version": "1.0.33",
2161 | "from": "readable-stream@~1.0.26",
2162 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.33.tgz",
2163 | "dependencies": {
2164 | "core-util-is": {
2165 | "version": "1.0.1",
2166 | "from": "core-util-is@~1.0.0",
2167 | "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.1.tgz"
2168 | },
2169 | "isarray": {
2170 | "version": "0.0.1",
2171 | "from": "isarray@0.0.1",
2172 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz"
2173 | },
2174 | "string_decoder": {
2175 | "version": "0.10.31",
2176 | "from": "string_decoder@~0.10.x",
2177 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz"
2178 | },
2179 | "inherits": {
2180 | "version": "2.0.1",
2181 | "from": "inherits@2",
2182 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz"
2183 | }
2184 | }
2185 | }
2186 | }
2187 | },
2188 | "caseless": {
2189 | "version": "0.6.0",
2190 | "from": "caseless@~0.6.0",
2191 | "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.6.0.tgz"
2192 | },
2193 | "forever-agent": {
2194 | "version": "0.5.2",
2195 | "from": "forever-agent@~0.5.0",
2196 | "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.5.2.tgz"
2197 | },
2198 | "qs": {
2199 | "version": "1.2.2",
2200 | "from": "qs@~1.2.0",
2201 | "resolved": "https://registry.npmjs.org/qs/-/qs-1.2.2.tgz"
2202 | },
2203 | "json-stringify-safe": {
2204 | "version": "5.0.0",
2205 | "from": "json-stringify-safe@~5.0.0",
2206 | "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.0.tgz"
2207 | },
2208 | "mime-types": {
2209 | "version": "1.0.2",
2210 | "from": "mime-types@~1.0.1",
2211 | "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-1.0.2.tgz"
2212 | },
2213 | "node-uuid": {
2214 | "version": "1.4.1",
2215 | "from": "node-uuid@~1.4.0",
2216 | "resolved": "https://registry.npmjs.org/node-uuid/-/node-uuid-1.4.1.tgz"
2217 | },
2218 | "tunnel-agent": {
2219 | "version": "0.4.0",
2220 | "from": "tunnel-agent@~0.4.0",
2221 | "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.4.0.tgz"
2222 | },
2223 | "tough-cookie": {
2224 | "version": "0.12.1",
2225 | "from": "tough-cookie@>=0.12.0",
2226 | "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-0.12.1.tgz",
2227 | "dependencies": {
2228 | "punycode": {
2229 | "version": "1.3.2",
2230 | "from": "punycode@>=0.2.0",
2231 | "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz"
2232 | }
2233 | }
2234 | },
2235 | "form-data": {
2236 | "version": "0.1.4",
2237 | "from": "form-data@~0.1.0",
2238 | "resolved": "https://registry.npmjs.org/form-data/-/form-data-0.1.4.tgz",
2239 | "dependencies": {
2240 | "combined-stream": {
2241 | "version": "0.0.5",
2242 | "from": "combined-stream@~0.0.4",
2243 | "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-0.0.5.tgz",
2244 | "dependencies": {
2245 | "delayed-stream": {
2246 | "version": "0.0.5",
2247 | "from": "delayed-stream@0.0.5",
2248 | "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-0.0.5.tgz"
2249 | }
2250 | }
2251 | },
2252 | "mime": {
2253 | "version": "1.2.11",
2254 | "from": "mime@~1.2.11",
2255 | "resolved": "https://registry.npmjs.org/mime/-/mime-1.2.11.tgz"
2256 | },
2257 | "async": {
2258 | "version": "0.9.0",
2259 | "from": "async@~0.9.0",
2260 | "resolved": "https://registry.npmjs.org/async/-/async-0.9.0.tgz"
2261 | }
2262 | }
2263 | },
2264 | "http-signature": {
2265 | "version": "0.10.0",
2266 | "from": "http-signature@~0.10.0",
2267 | "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-0.10.0.tgz",
2268 | "dependencies": {
2269 | "assert-plus": {
2270 | "version": "0.1.2",
2271 | "from": "assert-plus@0.1.2",
2272 | "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-0.1.2.tgz"
2273 | },
2274 | "asn1": {
2275 | "version": "0.1.11",
2276 | "from": "asn1@0.1.11",
2277 | "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.1.11.tgz"
2278 | },
2279 | "ctype": {
2280 | "version": "0.5.2",
2281 | "from": "ctype@0.5.2",
2282 | "resolved": "https://registry.npmjs.org/ctype/-/ctype-0.5.2.tgz"
2283 | }
2284 | }
2285 | },
2286 | "oauth-sign": {
2287 | "version": "0.4.0",
2288 | "from": "oauth-sign@~0.4.0",
2289 | "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.4.0.tgz"
2290 | },
2291 | "hawk": {
2292 | "version": "1.1.1",
2293 | "from": "hawk@1.1.1",
2294 | "resolved": "https://registry.npmjs.org/hawk/-/hawk-1.1.1.tgz",
2295 | "dependencies": {
2296 | "hoek": {
2297 | "version": "0.9.1",
2298 | "from": "hoek@0.9.x",
2299 | "resolved": "https://registry.npmjs.org/hoek/-/hoek-0.9.1.tgz"
2300 | },
2301 | "boom": {
2302 | "version": "0.4.2",
2303 | "from": "boom@0.4.x",
2304 | "resolved": "https://registry.npmjs.org/boom/-/boom-0.4.2.tgz"
2305 | },
2306 | "cryptiles": {
2307 | "version": "0.2.2",
2308 | "from": "cryptiles@0.2.x",
2309 | "resolved": "https://registry.npmjs.org/cryptiles/-/cryptiles-0.2.2.tgz"
2310 | },
2311 | "sntp": {
2312 | "version": "0.2.4",
2313 | "from": "sntp@0.2.x",
2314 | "resolved": "https://registry.npmjs.org/sntp/-/sntp-0.2.4.tgz"
2315 | }
2316 | }
2317 | },
2318 | "aws-sign2": {
2319 | "version": "0.5.0",
2320 | "from": "aws-sign2@~0.5.0",
2321 | "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.5.0.tgz"
2322 | },
2323 | "stringstream": {
2324 | "version": "0.0.4",
2325 | "from": "stringstream@~0.0.4",
2326 | "resolved": "https://registry.npmjs.org/stringstream/-/stringstream-0.0.4.tgz"
2327 | }
2328 | }
2329 | },
2330 | "request-progress": {
2331 | "version": "0.3.1",
2332 | "from": "request-progress@0.3.1",
2333 | "resolved": "https://registry.npmjs.org/request-progress/-/request-progress-0.3.1.tgz",
2334 | "dependencies": {
2335 | "throttleit": {
2336 | "version": "0.0.2",
2337 | "from": "throttleit@~0.0.2",
2338 | "resolved": "https://registry.npmjs.org/throttleit/-/throttleit-0.0.2.tgz"
2339 | }
2340 | }
2341 | },
2342 | "rimraf": {
2343 | "version": "2.2.8",
2344 | "from": "rimraf@~2.2.8",
2345 | "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.2.8.tgz"
2346 | },
2347 | "which": {
2348 | "version": "1.0.5",
2349 | "from": "which@~1.0.5",
2350 | "resolved": "https://registry.npmjs.org/which/-/which-1.0.5.tgz"
2351 | }
2352 | }
2353 | }
2354 | }
2355 | },
2356 | "karma-requirejs": {
2357 | "version": "0.2.2",
2358 | "from": "https://registry.npmjs.org/karma-requirejs/-/karma-requirejs-0.2.2.tgz",
2359 | "resolved": "https://registry.npmjs.org/karma-requirejs/-/karma-requirejs-0.2.2.tgz"
2360 | },
2361 | "karma-safari-launcher": {
2362 | "version": "0.1.1",
2363 | "from": "https://registry.npmjs.org/karma-safari-launcher/-/karma-safari-launcher-0.1.1.tgz",
2364 | "resolved": "https://registry.npmjs.org/karma-safari-launcher/-/karma-safari-launcher-0.1.1.tgz"
2365 | },
2366 | "karma-script-launcher": {
2367 | "version": "0.1.0",
2368 | "from": "https://registry.npmjs.org/karma-script-launcher/-/karma-script-launcher-0.1.0.tgz",
2369 | "resolved": "https://registry.npmjs.org/karma-script-launcher/-/karma-script-launcher-0.1.0.tgz"
2370 | },
2371 | "karma-sinon": {
2372 | "version": "1.0.3",
2373 | "from": "https://registry.npmjs.org/karma-sinon/-/karma-sinon-1.0.3.tgz",
2374 | "resolved": "https://registry.npmjs.org/karma-sinon/-/karma-sinon-1.0.3.tgz"
2375 | },
2376 | "karma-sinon-chai": {
2377 | "version": "0.1.6",
2378 | "from": "karma-sinon-chai@0.1.6",
2379 | "resolved": "https://registry.npmjs.org/karma-sinon-chai/-/karma-sinon-chai-0.1.6.tgz",
2380 | "dependencies": {
2381 | "sinon-chai": {
2382 | "version": "2.5.0",
2383 | "from": "sinon-chai@~2.5",
2384 | "resolved": "https://registry.npmjs.org/sinon-chai/-/sinon-chai-2.5.0.tgz"
2385 | }
2386 | }
2387 | },
2388 | "karma-story-reporter": {
2389 | "version": "0.2.2",
2390 | "from": "https://registry.npmjs.org/karma-story-reporter/-/karma-story-reporter-0.2.2.tgz",
2391 | "resolved": "https://registry.npmjs.org/karma-story-reporter/-/karma-story-reporter-0.2.2.tgz",
2392 | "dependencies": {
2393 | "colors": {
2394 | "version": "0.6.0-1",
2395 | "from": "colors@0.6.0-1",
2396 | "resolved": "https://registry.npmjs.org/colors/-/colors-0.6.0-1.tgz"
2397 | }
2398 | }
2399 | },
2400 | "mocha": {
2401 | "version": "1.14.0",
2402 | "from": "mocha@1.14.0",
2403 | "resolved": "https://registry.npmjs.org/mocha/-/mocha-1.14.0.tgz",
2404 | "dependencies": {
2405 | "commander": {
2406 | "version": "2.0.0",
2407 | "from": "commander@2.0.0",
2408 | "resolved": "https://registry.npmjs.org/commander/-/commander-2.0.0.tgz"
2409 | },
2410 | "growl": {
2411 | "version": "1.7.0",
2412 | "from": "growl@1.7.x",
2413 | "resolved": "https://registry.npmjs.org/growl/-/growl-1.7.0.tgz"
2414 | },
2415 | "jade": {
2416 | "version": "0.26.3",
2417 | "from": "jade@0.26.3",
2418 | "resolved": "https://registry.npmjs.org/jade/-/jade-0.26.3.tgz",
2419 | "dependencies": {
2420 | "commander": {
2421 | "version": "0.6.1",
2422 | "from": "commander@0.6.1",
2423 | "resolved": "https://registry.npmjs.org/commander/-/commander-0.6.1.tgz"
2424 | },
2425 | "mkdirp": {
2426 | "version": "0.3.0",
2427 | "from": "mkdirp@0.3.0",
2428 | "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.3.0.tgz"
2429 | }
2430 | }
2431 | },
2432 | "diff": {
2433 | "version": "1.0.7",
2434 | "from": "diff@1.0.7",
2435 | "resolved": "https://registry.npmjs.org/diff/-/diff-1.0.7.tgz"
2436 | },
2437 | "debug": {
2438 | "version": "2.1.0",
2439 | "from": "debug@*",
2440 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.1.0.tgz",
2441 | "dependencies": {
2442 | "ms": {
2443 | "version": "0.6.2",
2444 | "from": "ms@0.6.2",
2445 | "resolved": "https://registry.npmjs.org/ms/-/ms-0.6.2.tgz"
2446 | }
2447 | }
2448 | },
2449 | "mkdirp": {
2450 | "version": "0.3.5",
2451 | "from": "mkdirp@0.3.5",
2452 | "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.3.5.tgz"
2453 | },
2454 | "glob": {
2455 | "version": "3.2.3",
2456 | "from": "glob@3.2.3",
2457 | "resolved": "https://registry.npmjs.org/glob/-/glob-3.2.3.tgz",
2458 | "dependencies": {
2459 | "minimatch": {
2460 | "version": "0.2.14",
2461 | "from": "minimatch@~0.2.11",
2462 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-0.2.14.tgz",
2463 | "dependencies": {
2464 | "lru-cache": {
2465 | "version": "2.5.0",
2466 | "from": "lru-cache@2",
2467 | "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-2.5.0.tgz"
2468 | },
2469 | "sigmund": {
2470 | "version": "1.0.0",
2471 | "from": "sigmund@~1.0.0",
2472 | "resolved": "https://registry.npmjs.org/sigmund/-/sigmund-1.0.0.tgz"
2473 | }
2474 | }
2475 | },
2476 | "graceful-fs": {
2477 | "version": "2.0.3",
2478 | "from": "graceful-fs@~2.0.0",
2479 | "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-2.0.3.tgz"
2480 | },
2481 | "inherits": {
2482 | "version": "2.0.1",
2483 | "from": "inherits@2",
2484 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz"
2485 | }
2486 | }
2487 | }
2488 | }
2489 | },
2490 | "requirejs": {
2491 | "version": "2.1.15",
2492 | "from": "https://registry.npmjs.org/requirejs/-/requirejs-2.1.15.tgz",
2493 | "resolved": "https://registry.npmjs.org/requirejs/-/requirejs-2.1.15.tgz"
2494 | },
2495 | "sinon": {
2496 | "version": "1.10.3",
2497 | "from": "https://registry.npmjs.org/sinon/-/sinon-1.10.3.tgz",
2498 | "resolved": "https://registry.npmjs.org/sinon/-/sinon-1.10.3.tgz",
2499 | "dependencies": {
2500 | "formatio": {
2501 | "version": "1.0.2",
2502 | "from": "http://registry.npmjs.org/formatio/-/formatio-1.0.2.tgz",
2503 | "resolved": "http://registry.npmjs.org/formatio/-/formatio-1.0.2.tgz",
2504 | "dependencies": {
2505 | "samsam": {
2506 | "version": "1.1.1",
2507 | "from": "http://registry.npmjs.org/samsam/-/samsam-1.1.1.tgz",
2508 | "resolved": "http://registry.npmjs.org/samsam/-/samsam-1.1.1.tgz"
2509 | }
2510 | }
2511 | },
2512 | "util": {
2513 | "version": "0.10.3",
2514 | "from": "http://registry.npmjs.org/util/-/util-0.10.3.tgz",
2515 | "resolved": "http://registry.npmjs.org/util/-/util-0.10.3.tgz",
2516 | "dependencies": {
2517 | "inherits": {
2518 | "version": "2.0.1",
2519 | "from": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz",
2520 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz"
2521 | }
2522 | }
2523 | }
2524 | }
2525 | }
2526 | }
2527 | }
2528 |
--------------------------------------------------------------------------------
/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "tagged-infinite-scroll",
3 | "version": "1.1.1",
4 | "scripts": {
5 | "test": "grunt travis"
6 | },
7 | "devDependencies": {
8 | "grunt": "~0.4.2",
9 | "grunt-contrib-concat": "~0.3.0",
10 | "grunt-contrib-requirejs": "~0.4.1",
11 | "grunt-contrib-uglify": "~0.2.7",
12 | "grunt-karma": "^0.8.3",
13 | "grunt-karma-coveralls": "~2.0.2",
14 | "karma": "^0.12.23",
15 | "karma-chai": "^0.1.0",
16 | "karma-chrome-launcher": "^0.1.4",
17 | "karma-coffee-preprocessor": "~0.1.1",
18 | "karma-coverage": "^0.2.5",
19 | "karma-firefox-launcher": "^0.1.3",
20 | "karma-html2js-preprocessor": "~0.1.0",
21 | "karma-jasmine": "~0.1.3",
22 | "karma-junit-reporter": "^0.2.2",
23 | "karma-mocha": "^0.1.6",
24 | "karma-phantomjs-launcher": "~0.1.1",
25 | "karma-requirejs": "~0.2.0",
26 | "karma-safari-launcher": "~0.1.1",
27 | "karma-script-launcher": "~0.1.0",
28 | "karma-sinon": "~1.0.0",
29 | "karma-sinon-chai": "~0.1.1",
30 | "karma-story-reporter": "~0.2.0",
31 | "mocha": "~1.14.0",
32 | "requirejs": "~2.1.9"
33 | }
34 | }
35 |
--------------------------------------------------------------------------------
/src/taggedInfiniteScroll.js:
--------------------------------------------------------------------------------
1 | (function (root, factory) {
2 | if (typeof define === 'function' && define.amd) {
3 | // AMD. Register as an anonymous module.
4 | define(['angular'], factory);
5 | } else {
6 | // Browser globals
7 | root.taggedInfiniteScroll = factory(root.angular);
8 | }
9 | }(this, function (angular) {
10 | "use strict";
11 |
12 | // Allows a container to support infinite scroll
13 | // Based on: http://binarymuse.github.io/ngInfiniteScroll/
14 | var module = angular.module('tagged.directives.infiniteScroll', []);
15 |
16 | module.directive('taggedInfiniteScroll', ['$window', '$timeout', function($window, $timeout) {
17 | return {
18 | scope: {
19 | callback: '&taggedInfiniteScroll',
20 | distance: '=taggedInfiniteScrollDistance',
21 | disabled: '=taggedInfiniteScrollDisabled'
22 | },
23 | link: function(scope, elem, attrs) {
24 | var win = angular.element($window);
25 |
26 | var onScroll = function(oldValue, newValue) {
27 | // Do nothing if infinite scroll has been disabled
28 | if (scope.disabled) {
29 | return;
30 | }
31 | var windowHeight = win[0].innerHeight;
32 | var elementBottom = elem[0].offsetTop + elem[0].offsetHeight;
33 | var windowBottom = windowHeight + (win[0].scrollY || win[0].pageYOffset);
34 | var remaining = elementBottom - windowBottom;
35 | var shouldGetMore = (remaining - parseInt(scope.distance || 0, 10) <= 0);
36 |
37 | if (shouldGetMore) {
38 | $timeout(scope.callback);
39 | }
40 | };
41 |
42 | // Check immediately if we need more items upon reenabling.
43 | scope.$watch('disabled', function(isDisabled){
44 | if (false === isDisabled) onScroll();
45 | });
46 |
47 | win.bind('scroll', onScroll);
48 |
49 | // Remove window scroll handler when this element is removed.
50 | scope.$on('$destroy', function() {
51 | win.unbind('scroll', onScroll);
52 | });
53 |
54 | // Check on next event loop to give the browser a moment to paint.
55 | // Otherwise, the calculations may be off.
56 | $timeout(onScroll);
57 | }
58 | };
59 | }]);
60 |
61 | // Just return a value to define the module export.
62 | // This example returns an object, but the module
63 | // can return a function as the exported value.
64 | return module;
65 | }));
66 |
--------------------------------------------------------------------------------
/taggedInfiniteScroll.js:
--------------------------------------------------------------------------------
1 | /*! tagged-infinite-scroll - v1.1.1 - 2015-07-17 */
2 | (function (root, factory) {
3 | if (typeof define === 'function' && define.amd) {
4 | // AMD. Register as an anonymous module.
5 | define(['angular'], factory);
6 | } else {
7 | // Browser globals
8 | root.taggedInfiniteScroll = factory(root.angular);
9 | }
10 | }(this, function (angular) {
11 | "use strict";
12 |
13 | // Allows a container to support infinite scroll
14 | // Based on: http://binarymuse.github.io/ngInfiniteScroll/
15 | var module = angular.module('tagged.directives.infiniteScroll', []);
16 |
17 | module.directive('taggedInfiniteScroll', ['$window', '$timeout', function($window, $timeout) {
18 | return {
19 | scope: {
20 | callback: '&taggedInfiniteScroll',
21 | distance: '=taggedInfiniteScrollDistance',
22 | disabled: '=taggedInfiniteScrollDisabled'
23 | },
24 | link: function(scope, elem, attrs) {
25 | var win = angular.element($window);
26 |
27 | var onScroll = function(oldValue, newValue) {
28 | // Do nothing if infinite scroll has been disabled
29 | if (scope.disabled) {
30 | return;
31 | }
32 | var windowHeight = win[0].innerHeight;
33 | var elementBottom = elem[0].offsetTop + elem[0].offsetHeight;
34 | var windowBottom = windowHeight + (win[0].scrollY || win[0].pageYOffset);
35 | var remaining = elementBottom - windowBottom;
36 | var shouldGetMore = (remaining - parseInt(scope.distance || 0, 10) <= 0);
37 |
38 | if (shouldGetMore) {
39 | $timeout(scope.callback);
40 | }
41 | };
42 |
43 | // Check immediately if we need more items upon reenabling.
44 | scope.$watch('disabled', function(isDisabled){
45 | if (false === isDisabled) onScroll();
46 | });
47 |
48 | win.bind('scroll', onScroll);
49 |
50 | // Remove window scroll handler when this element is removed.
51 | scope.$on('$destroy', function() {
52 | win.unbind('scroll', onScroll);
53 | });
54 |
55 | // Check on next event loop to give the browser a moment to paint.
56 | // Otherwise, the calculations may be off.
57 | $timeout(onScroll);
58 | }
59 | };
60 | }]);
61 |
62 | // Just return a value to define the module export.
63 | // This example returns an object, but the module
64 | // can return a function as the exported value.
65 | return module;
66 | }));
67 |
--------------------------------------------------------------------------------
/taggedInfiniteScroll.min.js:
--------------------------------------------------------------------------------
1 | !function(a,b){"function"==typeof define&&define.amd?define(["angular"],b):a.taggedInfiniteScroll=b(a.angular)}(this,function(a){"use strict";var b=a.module("tagged.directives.infiniteScroll",[]);return b.directive("taggedInfiniteScroll",["$window","$timeout",function(b,c){return{scope:{callback:"&taggedInfiniteScroll",distance:"=taggedInfiniteScrollDistance",disabled:"=taggedInfiniteScrollDisabled"},link:function(d,e){var f=a.element(b),g=function(){if(!d.disabled){var a=f[0].innerHeight,b=e[0].offsetTop+e[0].offsetHeight,g=a+(f[0].scrollY||f[0].pageYOffset),h=b-g,i=h-parseInt(d.distance||0,10)<=0;i&&c(d.callback)}};d.$watch("disabled",function(a){!1===a&&g()}),f.bind("scroll",g),d.$on("$destroy",function(){f.unbind("scroll",g)}),c(g)}}}]),b});
--------------------------------------------------------------------------------
/tests/taggedInfiniteScrollSpec.js:
--------------------------------------------------------------------------------
1 | /*jshint expr: true*/
2 | define(['src/taggedInfiniteScroll', 'angular/mocks'], function() {
3 | describe('Module: tagged.directives.infiniteScroll', function() {
4 | beforeEach(module('tagged.directives.infiniteScroll', function($provide){
5 | $document = angular.element(document);
6 | $provide.decorator('$window', function($delegate){
7 | return {
8 | triggerHandler: function(evt){
9 | $delegate.triggerHandler(evt);
10 | },
11 | scrollY: 0,
12 | innerHeight: 0,
13 | addEventListener: function(type, fn, useCapture){
14 | $delegate.addEventListener(type, fn, useCapture);
15 | },
16 | removeEventListener: function(type, fn, useCapture){
17 | $delegate.removeEventListener(type, fn, useCapture);
18 | },
19 | attachEvent: function(type, fn){
20 | $delegate.attachEvent('on' + type, fn);
21 | },
22 | detachEvent: function(type, fn){
23 | $delegate.detachEvent('on' + type, fn);
24 | }
25 | };
26 | });
27 | $provide.value('$document', $document);
28 | }));
29 |
30 | var testDoesNotGetMore = function(scroll) {
31 | return function() {
32 | this.stubWindow[0].scrollY = scroll;
33 | this.stubWindow.triggerHandler('scroll');
34 | this.timeout.flush();
35 | this.scope.$apply();
36 | // 2nd timer, if any
37 | try { this.timeout.flush(); } catch (e) { }
38 | this.timeout.verifyNoPendingTasks();
39 | this.scope.more.called.should.be.false;
40 | };
41 | };
42 |
43 | var testDoesNotGetMoreInterwebExploder = function(scroll) {
44 | return function() {
45 | this.stubWindow[0].pageYOffset = scroll;
46 | this.stubWindow.triggerHandler('scroll');
47 | this.timeout.flush();
48 | this.scope.$apply();
49 | // 2nd timer, if any
50 | try { this.timeout.flush(); } catch (e) { }
51 | this.timeout.verifyNoPendingTasks();
52 | this.scope.more.called.should.be.false;
53 | };
54 | };
55 |
56 | var testDoesGetMore = function(scroll) {
57 | return function() {
58 | this.stubWindow[0].scrollY = scroll;
59 | this.stubWindow.triggerHandler('scroll');
60 | this.timeout.flush();
61 | this.scope.$apply();
62 | // 2nd timer, if any
63 | try { this.timeout.flush(); } catch (e) { }
64 | this.timeout.verifyNoPendingTasks();
65 | this.scope.more.called.should.be.true;
66 | };
67 | };
68 |
69 | var testDoesGetMoreInterwebExploder = function(scroll) {
70 | return function() {
71 | this.stubWindow[0].pageYOffset = scroll;
72 | this.stubWindow.triggerHandler('scroll');
73 | this.timeout.flush();
74 | this.scope.$apply();
75 | // 2nd timer, if any
76 | try { this.timeout.flush(); } catch (e) { }
77 | this.timeout.verifyNoPendingTasks();
78 | this.scope.more.called.should.be.true;
79 | };
80 | };
81 |
82 | describe('basic functionality', function() {
83 | beforeEach(inject(function($rootScope, $compile, $window, $document, $timeout) {
84 | this.elem = angular.element('content
');
85 | this.elem.css({
86 | height: '1000px',
87 | });
88 | this.scope = $rootScope.$new();
89 | this.scope.more = angular.noop;
90 | sinon.spy(this.scope, 'more');
91 | this.compile = $compile;
92 | this.document = $document;
93 | this.timeout = $timeout;
94 | this.window = $window;
95 |
96 | this.stubWindow = angular.element(this.window);
97 | this.stubWindow[0].innerHeight = 300;
98 | this.document.find('body').append(this.elem);
99 | this.document.find('body').css({
100 | 'margin': '0',
101 | 'padding': '0'
102 | });
103 | sinon.stub(angular, 'element');
104 | angular.element.withArgs(this.window).returns(this.stubWindow);
105 | this.compile(this.elem)(this.scope);
106 | this.scope.$apply();
107 | }));
108 |
109 | afterEach(function() {
110 | angular.element.restore();
111 | this.elem.remove();
112 | });
113 |
114 | angular.forEach([0, 100, 200, 300, 400, 500, 600], function(scroll) {
115 | it('does not get more if scrolled to ' + scroll + ' / 1000', testDoesNotGetMore(scroll));
116 | });
117 |
118 | angular.forEach([700, 800, 900, 1000], function(scroll) {
119 | it('gets more when scrolled to ' + scroll + ' / 1000', testDoesGetMore(scroll));
120 | });
121 |
122 | describe('Interweb Exploder support', function() {
123 | angular.forEach([0, 100, 200, 300, 400, 500, 600], function(scroll) {
124 | it('does not get more if scrolled to ' + scroll + ' / 1000', testDoesNotGetMoreInterwebExploder(scroll));
125 | });
126 |
127 | angular.forEach([700, 800, 900, 1000], function(scroll) {
128 | it('gets more when scrolled to ' + scroll + ' / 1000', testDoesGetMoreInterwebExploder(scroll));
129 | });
130 | });
131 |
132 | it('removes window scroll handler when element is removed', function() {
133 | sinon.spy(this.stubWindow, 'unbind');
134 | this.scope.$broadcast('$destroy');
135 | this.stubWindow.unbind.called.should.be.true;
136 | });
137 | });
138 |
139 | describe('page section offset from top by 500px', function() {
140 | beforeEach(inject(function($rootScope, $compile, $window, $document, $timeout) {
141 | this.elem = angular.element('content
');
142 | this.elem.css({
143 | height: '1000px'
144 | });
145 | this.scope = $rootScope.$new();
146 | this.scope.more = angular.noop;
147 | sinon.spy(this.scope, 'more');
148 | this.compile = $compile;
149 | this.document = $document;
150 | this.timeout = $timeout;
151 | this.window = $window;
152 | this.stubWindow = angular.element(this.window);
153 | this.stubWindow[0].innerHeight = 300;
154 | this.document.find('body').append(this.elem);
155 | this.document.find('body').css({
156 | 'margin-top': '500px',
157 | 'padding': '0'
158 | });
159 | sinon.stub(angular, 'element');
160 | angular.element.withArgs(this.window).returns(this.stubWindow);
161 | this.compile(this.elem)(this.scope);
162 | this.scope.$apply();
163 | }));
164 |
165 | afterEach(function() {
166 | angular.element.restore();
167 | this.elem.remove();
168 | });
169 |
170 | angular.forEach([600, 700, 800, 900, 1000], function(scroll) {
171 | it('does not get more if scrolled to ' + scroll + ' / 1500', testDoesNotGetMore(scroll));
172 | });
173 |
174 | angular.forEach([1200, 1300], function(scroll) {
175 | it('gets more when scrolled to ' + scroll + ' / 1500', testDoesGetMore(scroll));
176 | });
177 | });
178 |
179 | describe('scroll distance offset of 100px', function() {
180 | beforeEach(inject(function($rootScope, $compile, $window, $document, $timeout) {
181 | this.elem = angular.element('content
');
182 | this.elem.css({
183 | height: '1000px'
184 | });
185 | this.scope = $rootScope.$new();
186 | this.scope.more = angular.noop;
187 | sinon.spy(this.scope, 'more');
188 | this.compile = $compile;
189 | this.document = $document;
190 | this.timeout = $timeout;
191 | this.window = $window;
192 | this.stubWindow = angular.element(this.window);
193 | this.stubWindow[0].innerHeight = 300;
194 | this.document.find('body').append(this.elem);
195 | this.document.find('body').css({
196 | 'margin': '0',
197 | 'padding': '0'
198 | });
199 | sinon.stub(angular, 'element');
200 | angular.element.withArgs(this.window).returns(this.stubWindow);
201 | this.compile(this.elem)(this.scope);
202 | this.scope.$apply();
203 | }));
204 |
205 | afterEach(function() {
206 | angular.element.restore();
207 | this.elem.remove();
208 | });
209 |
210 | angular.forEach([400, 500], function(scroll) {
211 | it('does not get more if scrolled to ' + scroll + ' / 1000', testDoesNotGetMore(scroll));
212 | });
213 |
214 | angular.forEach([600, 700], function(scroll) {
215 | it('gets more when scrolled to ' + scroll + ' / 1000', testDoesGetMore(scroll));
216 | });
217 | });
218 |
219 | describe('disabled', function() {
220 | beforeEach(inject(function($rootScope, $compile, $window, $document, $timeout) {
221 | this.elem = angular.element('content
');
222 | this.elem.css({
223 | height: '1000px'
224 | });
225 | this.scope = $rootScope.$new();
226 | this.scope.more = angular.noop;
227 | sinon.spy(this.scope, 'more');
228 | this.scope.obj = { isDisabled: true };
229 | this.compile = $compile;
230 | this.document = $document;
231 | this.timeout = $timeout;
232 | this.window = $window;
233 | this.stubWindow = angular.element(this.window);
234 | this.stubWindow[0].innerHeight = 300;
235 | this.document.find('body').append(this.elem);
236 | this.document.find('body').css({
237 | 'margin': '0',
238 | 'padding': '0'
239 | });
240 | sinon.stub(angular, 'element');
241 | angular.element.withArgs(this.window).returns(this.stubWindow);
242 | this.compile(this.elem)(this.scope);
243 | this.scope.$apply();
244 | }));
245 |
246 | afterEach(function() {
247 | angular.element.restore();
248 | this.elem.remove();
249 | });
250 |
251 | angular.forEach([600, 700, 800, 900, 1000], function(scroll) {
252 | it('does not get more if infinite scroll is disabled when scrolled to ' + scroll + ' / 1000px', testDoesNotGetMore(scroll));
253 | });
254 |
255 | var testDoesGetMoreWhenReenabled = function(scroll) {
256 | return function() {
257 | this.stubWindow[0].scrollY = scroll;
258 | this.stubWindow.triggerHandler('scroll');
259 | this.timeout.flush();
260 | this.scope.$apply();
261 | this.scope.more.called.should.be.false;
262 | this.scope.obj.isDisabled = false;
263 | this.scope.$apply();
264 | // 2nd timer, if any
265 | try { this.timeout.flush(); } catch (e) { }
266 | this.timeout.verifyNoPendingTasks();
267 | this.scope.more.called.should.be.true;
268 | };
269 | };
270 |
271 | var testDoesNotGetMoreWhenReenabled = function(scroll) {
272 | return function() {
273 | this.stubWindow[0].scrollY = scroll;
274 | this.stubWindow.triggerHandler('scroll');
275 | this.timeout.flush();
276 | this.scope.$apply();
277 | this.scope.more.called.should.be.false;
278 | this.scope.obj.isDisabled = false;
279 | this.scope.$apply();
280 | // 2nd timer, if any
281 | try { this.timeout.flush(); } catch (e) { }
282 | this.timeout.verifyNoPendingTasks();
283 | this.scope.more.called.should.be.false;
284 | };
285 | };
286 |
287 | angular.forEach([300, 400, 500, 600], function(scroll) {
288 | it('does not get more if infinite scroll is reenabled when scrolled to ' + scroll + ' / 1000px', testDoesNotGetMoreWhenReenabled(scroll));
289 | });
290 |
291 | angular.forEach([700, 800, 900, 1000], function(scroll) {
292 | it('gets more if infinite scroll is reenabled when scrolled to ' + scroll + ' / 1000px', testDoesGetMoreWhenReenabled(scroll));
293 | });
294 | });
295 |
296 | ('enabled', function() {
297 | beforeEach(inject(function($rootScope, $compile, $window, $document, $timeout) {
298 | this.elem = angular.element('content
');
299 | this.elem.css({
300 | height: '1000px'
301 | });
302 | this.scope = $rootScope.$new();
303 | this.scope.more = angular.noop;
304 | sinon.spy(this.scope, 'more');
305 | this.scope.isDisabled = false;
306 | this.compile = $compile;
307 | this.document = $document;
308 | this.timeout = $timeout;
309 | this.window = $window;
310 | this.stubWindow = angular.element(this.window);
311 | this.stubWindow[0].innerHeight = 300;
312 | this.document.find('body').append(this.elem);
313 | this.document.find('body').css({
314 | 'margin': '0',
315 | 'padding': '0'
316 | });
317 | sinon.stub(angular, 'element');
318 | angular.element.withArgs(this.window).returns(this.stubWindow);
319 | this.compile(this.elem)(this.scope);
320 | this.scope.$apply();
321 | }));
322 |
323 | afterEach(function() {
324 | angular.element.restore();
325 | this.elem.remove();
326 | });
327 |
328 | angular.forEach([700, 800, 900, 1000], function(scroll) {
329 | it('gets more if infinite scroll is enabled and scrolled to ' + scroll + ' / 1000px', testDoesGetMore(scroll));
330 | });
331 | });
332 | });
333 | });
334 |
--------------------------------------------------------------------------------