├── .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 | [![Build Status](https://travis-ci.org/tagged/infinite-scroll.png)](https://travis-ci.org/tagged/infinite-scroll) 2 | [![Coverage Status](https://coveralls.io/repos/tagged/infinite-scroll/badge.png)](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 | 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 | 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 | 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 | [![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/tagged/infinite-scroll/trend.png)](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 | 61 | 62 |
63 | 64 |
Distance:
65 |
66 | 67 | {{ distance }} 68 |
69 | 70 |
Reset:
71 |
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 | --------------------------------------------------------------------------------