├── .gitignore ├── CHANGELOG.md ├── CODE_OF_CONDUCT.md ├── LICENSE ├── README.md ├── config ├── rollup-demo.config.js ├── rollup.config.js ├── tsconfig-demo.es2015.json ├── tsconfig.es2015.json └── tsconfig.es5.json ├── demo ├── demo-aot.html ├── demo.html ├── src │ ├── app.component.ts │ ├── app.module.ts │ ├── main-aot.ts │ └── main.ts └── systemjs.config.js ├── package-lock.json ├── package.json ├── src ├── api.ts ├── basic.ts ├── cmd.ts ├── enumerate.ts ├── measurement.ts ├── scrollItem.ts ├── service.ts ├── set.ts ├── userCmd.ts ├── virtualRow.component.ts ├── virtualScroll.component.ts └── virtualScroll.module.ts ├── tools └── browserSync.js ├── tsconfig.json └── tslint.json /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | build 3 | buildTmp 4 | dist 5 | npm-debug.log 6 | -------------------------------------------------------------------------------- /CHANGELOG.md: -------------------------------------------------------------------------------- 1 | # Changelog 2 | 3 | # 1.1.0 (2018-06-16) 4 | 5 | * Angular6/RxJS6 upgrade 6 | 7 | # 1.0.2 (2017-12-02) 8 | 9 | * Fixes issue [#6](https://github.com/dinony/od-virtualscroll/pull/6) 10 | 11 | # 1.0.1 (2017-08-18) 12 | 13 | * Fixes issues [14](https://github.com/dinony/od-virtualscroll/issues/14) 14 | 15 | # 1.0.0 (2017-07-03) 16 | 17 | * Added support to focus row/item index (see [#7](https://github.com/dinony/od-virtualscroll/issues/7)) 18 | * Added readme note on how to use focus row/item feature 19 | * Added readme note on how to use multiple instances ([#8](https://github.com/dinony/od-virtualscroll/issues/8)) 20 | 21 | ## Breaking Changes 22 | 23 | * Removed component input `vsScrollTop` 24 | * Added single component input `vsUserCmd` to define an observable sequence of `IUserCmd` commands 25 | 26 | # 0.2.0 (2017-04-22) 27 | 28 | * Initial public release 29 | -------------------------------------------------------------------------------- /CODE_OF_CONDUCT.md: -------------------------------------------------------------------------------- 1 | # Contributor Covenant Code of Conduct 2 | 3 | ## Our Pledge 4 | 5 | In the interest of fostering an open and welcoming environment, we as contributors and maintainers pledge to making participation in our project and our community a harassment-free experience for everyone, regardless of age, body size, disability, ethnicity, gender identity and expression, level of experience, nationality, personal appearance, race, religion, or sexual identity and orientation. 6 | 7 | ## Our Standards 8 | 9 | Examples of behavior that contributes to creating a positive environment include: 10 | 11 | * Using welcoming and inclusive language 12 | * Being respectful of differing viewpoints and experiences 13 | * Gracefully accepting constructive criticism 14 | * Focusing on what is best for the community 15 | * Showing empathy towards other community members 16 | 17 | Examples of unacceptable behavior by participants include: 18 | 19 | * The use of sexualized language or imagery and unwelcome sexual attention or advances 20 | * Trolling, insulting/derogatory comments, and personal or political attacks 21 | * Public or private harassment 22 | * Publishing others' private information, such as a physical or electronic address, without explicit permission 23 | * Other conduct which could reasonably be considered inappropriate in a professional setting 24 | 25 | ## Our Responsibilities 26 | 27 | Project maintainers are responsible for clarifying the standards of acceptable behavior and are expected to take appropriate and fair corrective action in response to any instances of unacceptable behavior. 28 | 29 | Project maintainers have the right and responsibility to remove, edit, or reject comments, commits, code, wiki edits, issues, and other contributions that are not aligned to this Code of Conduct, or to ban temporarily or permanently any contributor for other behaviors that they deem inappropriate, threatening, offensive, or harmful. 30 | 31 | ## Scope 32 | 33 | This Code of Conduct applies both within project spaces and in public spaces when an individual is representing the project or its community. Examples of representing a project or community include using an official project e-mail address, posting via an official social media account, or acting as an appointed representative at an online or offline event. Representation of a project may be further defined and clarified by project maintainers. 34 | 35 | ## Enforcement 36 | 37 | Instances of abusive, harassing, or otherwise unacceptable behavior may be reported by contacting the project team at contact@dinony.com. The project team will review and investigate all complaints, and will respond in a way that it deems appropriate to the circumstances. The project team is obligated to maintain confidentiality with regard to the reporter of an incident. Further details of specific enforcement policies may be posted separately. 38 | 39 | Project maintainers who do not follow or enforce the Code of Conduct in good faith may face temporary or permanent repercussions as determined by other members of the project's leadership. 40 | 41 | ## Attribution 42 | 43 | This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4, available at [http://contributor-covenant.org/version/1/4][version] 44 | 45 | [homepage]: http://contributor-covenant.org 46 | [version]: http://contributor-covenant.org/version/1/4/ 47 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | The MIT License 2 | 3 | Copyright (c) 2017 Onur Dogangönül 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: 6 | 7 | The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. 8 | 9 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # od-virtualscroll 2 | 3 | [![GitHub license](https://img.shields.io/badge/license-MIT-blue.svg)](https://raw.githubusercontent.com/dinony/od-virtualscroll/master/LICENSE) [![Module format](https://img.shields.io/badge/module%20formats-umd%2Fes2015%2Ffesm5%2Ffesm15-blue.svg)](https://github.com/dinony/od-virtualscroll#module-format) [![Module format](https://img.shields.io/badge/supports-AoT-red.svg)](https://github.com/dinony/od-virtualscroll#module-format) 4 | ![gzip size](http://img.badgesize.io/https://unpkg.com/od-virtualscroll/dist/bundle/od-virtualscroll.min.umd.js?label=gzip%20size&compression=gzip) 5 | 6 | > Observable-based virtual scroll implementation in Angular. 7 | 8 | ## Installation 9 | 10 | ``` 11 | npm i -S od-virtualscroll 12 | ``` 13 | 14 | ## Features 15 | 16 | Let's you scroll efficiently through a humongous list/grid of items (with single predefined height) by recycling components and minimizing component updates. 17 | 18 | - Handles resizing 19 | - Efficient 20 | - Displays necessary amount of rows 21 | - Optimal updates on data change or resize 22 | - Supports tiling 23 | - Supports fixed number of columns 24 | - Reactive component 25 | - Observable interface for most parts 26 | - Supports AoT 27 | - API 28 | - Subscribe to key component observables 29 | - Plus 30 | - Debounce scrolling / resizing 31 | - Set scroll position, focus row or item via index 32 | - Customizable equality checking 33 | - A lot of code samples 34 | - Module formats 35 | - Ships FESM5 and FESM15 36 | - Ships ES5/UMD, ES5/ES2015 and ES2015/ES2015 exports (`{{target}}/{{module}}`) 37 | 38 | ## Demo 39 | 40 | All examples are written in Angular 4 and provided in separate repositories to keep this repository simple. 41 | 42 | | Name | Description 43 | |----------------|------------------------------------- 44 | | [od-vsstatic](https://github.com/dinony/od-vsstatic) / [Demo](https://dinony.github.io/od-vsstatic/) | Static example with 100k cells. Ideal for performance analysis and GC testing 45 | | [od-vsdynamic](https://github.com/dinony/od-vsdynamic) / [Demo](https://dinony.github.io/od-vsdynamic/) | Scroll through GIFs, without the risk of a CPU meltdown ([GIPHY API](https://api.giphy.com/)) 46 | | [od-vslist](https://github.com/dinony/od-vslist) / [Demo](https://dinony.github.io/od-vslist/) | Render only 1 cell per row with dynamic width ([randomuser API](https://randomuser.me/documentation)) 47 | | [od-vsadvanced](https://github.com/dinony/od-vsadvanced) / [Demo](https://dinony.github.io/od-vsadvanced/) | Shows more advanced API features and utilizes the auxiliary debug module 48 | | [od-vscolors](https://github.com/dinony/od-vscolors) / [Demo](https://dinony.github.io/od-vscolors/) | Just for fun 49 | 50 | However, this repository also holds a minimalistic demo, to allow local development and AoT compilation. 51 | 52 | ## Usage 53 | 54 | Import the module and specify the cell and container styling (traditional layout or flexbox/... your choice). 55 | 56 | ```typescript 57 | // app.module.ts 58 | import {NgModule} from '@angular/core'; 59 | import {BrowserModule} from '@angular/platform-browser'; 60 | import {VirtualScrollModule} from 'od-virtualscroll'; 61 | import {AppComponent} from './app.component'; 62 | 63 | @NgModule({ 64 | bootstrap: [AppComponent], 65 | declarations: [AppComponent], 66 | imports: [ 67 | BrowserModule, 68 | VirtualScrollModule 69 | ] 70 | }) 71 | export class AppModule {} 72 | 73 | // app.component.ts 74 | import {Component} from '@angular/core'; 75 | import {Observable} from 'rxjs'; 76 | import {IVirtualScrollOptions} from 'od-virtualscroll'; 77 | 78 | @Component({ 79 | selector: 'app-shell', 80 | styles: [`...`], // <-- Style your cell and container 81 | template: ` 82 | 83 | 84 | Row: {{row}}
85 | Column: {{column}} 86 | {{item}} 87 |
88 |
` 89 | }) 90 | export class AppComponent { 91 | data$: Observable = ... ; // <-- Define data 92 | options$: Observable = ... ; // <-- Define options 93 | } 94 | ``` 95 | 96 | If you want to apply a traditional layout and wonder about the space between inline block elements - read [this](https://css-tricks.com/fighting-the-space-between-inline-block-elements/). 97 | 98 | ## Inputs 99 | 100 | | Name | Type | Description 101 | |------------------|---------------------------------------------------|------------------------------------------------------------------------------------------------------- 102 | | vsData | `Observable` | Stream of data 103 | | vsOptions | `Observable` | Stream of options 104 | | vsResize | `Observable` | Stream of resize commands (optional, default: `-\->`) 105 | | vsUserCmd | `Observable` | Stream of user specific commands (optional, default: `-\->`) 106 | | vsDebounceTime | `number` | Debounce scroll and resize events [ms] (optional, default: 0) 107 | | vsEqualsFunc | `(prevIndex: number, curIndex:number) => boolean` | Function to determine equality, given two indicies in the array (optional, default: `(p,c) => p === c)`) 108 | 109 | ### IVirtualScrollOptions 110 | 111 | ```typescript 112 | export interface IVirtualScrollOptions { 113 | itemWidth?: number; 114 | itemHeight: number; 115 | numAdditionalRows?: number; 116 | numLimitColumns?: number; 117 | } 118 | ``` 119 | 120 | The component requires either fixed-size cells (itemWidth, itemHeight) or a fixed number of cells per row (itemHeight, numLimitColumns). 121 | 122 | Further, to improve scrolling, additional rows may be requested. 123 | 124 | ### IUserCmd 125 | 126 | Currently, the supported user specific commands are: 127 | 128 | * `SetScrollTopCmd`: Set scroll top to specific value 129 | * `FocusRowCmd`: Focus specific row index 130 | * `FocusItemCmd`: Focus specific item index 131 | 132 | E.g. Focus row index 42. 133 | 134 | ```typescript 135 | data$ = // Data...; 136 | userCmd$ = of(new FocusRowCmd(42)).pipe(delay(2000)); 137 | ``` 138 | 139 | ```html 140 | 141 | 142 | 143 | ``` 144 | 145 | ## API 146 | 147 | ### ScrollObservableService 148 | Inject the *ScrollObservableService* to subscribe to key component observables. 149 | 150 | | Name | Type | Description 151 | |------------------|------------------------------------------------------------|------------------------------------------------------- 152 | | scrollWin$ | `[IVirtualScrollWindow]` | Stream of the most important inner data structure 153 | | createRow$ | `[CreateRowCmd, ComponentRef]` | Create row command and ComponentRef 154 | | removeRow$ | `[RemoveRowCmd, ComponentRef]` | Remove row command and ComponentRef 155 | | shiftRow$ | `[ShiftRowCmd, ComponentRef]` | Shift row command and ComponentRef 156 | | createItem$ | `[CreateItemCmd, ScrollItem, EmbeddedViewRef]` | Create item command, scroll item and EmbeddedViewRef 157 | | updateItem$ | `[UpdateItemCmd, ScrollItem, EmbeddedViewRef]` | Update item command, scroll item and EmbeddedViewRef 158 | | removeItem$ | `[RemoveItemCmd]` | Remove item command 159 | 160 | The [od-vsdynamic](https://github.com/dinony/od-vsdynamic) and [od-vsadvanced](https://github.com/dinony/od-vsadvanced) examples show how the API may be used. 161 | 162 | ### IVirtualScrollWindow 163 | 164 | This interface provides pretty much all needed information. 165 | 166 | ```typescript 167 | export interface IVirtualScrollWindow { 168 | dataTimestamp: number; 169 | containerWidth: number; 170 | containerHeight: number; 171 | itemWidth?: number; 172 | itemHeight: number; 173 | numVirtualItems: number; 174 | numVirtualRows: number; 175 | virtualHeight: number; 176 | numAdditionalRows: number; 177 | scrollTop: number; 178 | scrollPercentage: number; 179 | numActualRows: number; 180 | numActualColumns: number; 181 | actualHeight: number; 182 | numActualItems: number; 183 | visibleStartRow: number; 184 | visibleEndRow: number; 185 | } 186 | ``` 187 | It is used internally and may also be useful in consuming application components. 188 | 189 | E.g.: The [od-vsdynamic](https://github.com/dinony/od-vsdynamic) example. 190 | 191 | ### Multiple Instances 192 | 193 | The `ScrollObservableService` is registered on the VirtualScrollModule by default, so it is available on the root injector. 194 | However, if you have multiple instances of the scroll component, a singleton instance of the `ScrollObservableService` is not enough. 195 | Register the service on the wrapping component, via the providers property in the `@Component` decorator, so that the injector bubbling will stop on the Component level and will serve the right instance of the ScrollObservableService. 196 | 197 | Check the [feature/testMultiInstances](https://github.com/dinony/od-virtualscroll/tree/feature/testMultiInstances) branch for a simple example. 198 | 199 | ### Further information 200 | 201 | [api.ts](https://github.com/dinony/od-virtualscroll/blob/master/src/api.ts) reveals the current API surface. 202 | 203 | ## Module Format 204 | 205 | The lib is AoT compatible and ships with FESM5 and FESM15 exports. 206 | 207 | See [Angular Package Format v4.0](https://docs.google.com/document/d/1CZC2rcpxffTDfRDs6p1cfbmKNLA6x5O-NtkJglDaBVs/preview) for more info. 208 | 209 | ES5/UMD, ES5/ES2015 and ES2015/ES2015 exports are also provided. 210 | 211 | ## Upgrade 212 | 213 | ### 1.0.x -> 1.1.x 214 | 215 | 1.1.x uses Angular6/RxJS6. 216 | 217 | ### 0.2.x -> 1.x 218 | 219 | Rename component input `vsScrollTop` to `vsUserCmd`. 220 | 221 | ## NPM Scripts 222 | 223 | ``` 224 | npm run {{scriptName}} 225 | ``` 226 | 227 | | Name | Description 228 | |---------------|------------------------------------------- 229 | | buildAll | Build lib and demo 230 | | cleanAll | Remove generated directories 231 | | buildDemo | Build demo bundle with AoT compilation 232 | | tslint | Lint lib and demo 233 | | serve | Starts browser-sync for local development 234 | | explore | Source map explorer of AoT compiled demo 235 | 236 | ## Contribution & Contact 237 | 238 | Contribution and feedback is highly appreciated. 239 | 240 | [GitHub](https://github.com/dinony) 241 | 242 | [Twitter](https://twitter.com/dinonysaur) 243 | 244 | ## License 245 | 246 | MIT 247 | -------------------------------------------------------------------------------- /config/rollup-demo.config.js: -------------------------------------------------------------------------------- 1 | import nodeResolve from 'rollup-plugin-node-resolve' 2 | import commonjs from 'rollup-plugin-commonjs'; 3 | import {uglify} from 'rollup-plugin-uglify' 4 | import {minify} from 'uglify-js-harmony'; 5 | 6 | export default { 7 | input: 'buildTmp/demo/src/main-aot.js', 8 | output: { 9 | file: 'build/build.gen.js', // output a single application bundle 10 | sourcemap: true, 11 | format: 'iife' 12 | }, 13 | plugins: [ 14 | nodeResolve({jsnext: true, module: true}), 15 | commonjs({ 16 | include: 'node_modules/rxjs/**', 17 | }), 18 | uglify({}, minify) 19 | ] 20 | } 21 | -------------------------------------------------------------------------------- /config/rollup.config.js: -------------------------------------------------------------------------------- 1 | import {uglify} from 'rollup-plugin-uglify' 2 | import filesize from 'rollup-plugin-filesize' 3 | 4 | export default [ 5 | { 6 | input: 'dist/es5/api.js', 7 | external: ['@angular/core', '@angular/common', 'rxjs', 'rxjs/operators'], 8 | output: { 9 | name: 'od.virtualscroll', 10 | format: 'umd', 11 | file: 'dist/bundle/od-virtualscroll.umd.js', 12 | sourcemap: true, 13 | globals: { 14 | '@angular/core': 'ng.core', 15 | '@angular/common': 'ng.common', 16 | 'rxjs': 'rxjs', 17 | 'rxjs/operators': 'rxjs.operators', 18 | } 19 | }, 20 | }, 21 | { 22 | input: 'dist/es5/api.js', 23 | external: ['@angular/core', '@angular/common', 'rxjs', 'rxjs/operators'], 24 | plugins: [ 25 | uglify(), 26 | filesize() 27 | ], 28 | output: { 29 | name: 'od.virtualscroll', 30 | format: 'umd', 31 | file: 'dist/bundle/od-virtualscroll.min.umd.js', 32 | sourcemap: true, 33 | globals: { 34 | '@angular/core': 'ng.core', 35 | '@angular/common': 'ng.common', 36 | 'rxjs': 'rxjs', 37 | 'rxjs/operators': 'rxjs.operators', 38 | } 39 | } 40 | }] 41 | -------------------------------------------------------------------------------- /config/tsconfig-demo.es2015.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "target": "es2015", 4 | "module": "es2015", 5 | "moduleResolution": "node", 6 | "lib": ["es2015", "dom"], 7 | "noImplicitAny": true, 8 | "sourceMap": true, 9 | "declaration": true, 10 | "removeComments": true, 11 | "strictNullChecks": false, 12 | "emitDecoratorMetadata": true, 13 | "experimentalDecorators": true, 14 | "alwaysStrict": true, 15 | "noUnusedParameters": false, 16 | "noImplicitReturns": true, 17 | "noFallthroughCasesInSwitch": true, 18 | "suppressImplicitAnyIndexErrors": true, 19 | "outDir": "buildTmp" 20 | }, 21 | "include": ["demo/src/app.module.ts", "demo/src/main-aot.ts"], 22 | "angularCompilerOptions": { 23 | "genDir": "buildTmp/aot", 24 | "skipMetadataEmit" : true 25 | } 26 | } -------------------------------------------------------------------------------- /config/tsconfig.es2015.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "target": "es2015", 4 | "module": "es2015", 5 | "moduleResolution": "node", 6 | "lib": ["es2015", "dom"], 7 | "noImplicitAny": true, 8 | "sourceMap": true, 9 | "declaration": true, 10 | "removeComments": false, 11 | "strictNullChecks": false, 12 | "experimentalDecorators": true, 13 | "emitDecoratorMetadata": true, 14 | "stripInternal": true, 15 | "alwaysStrict": true, 16 | "noUnusedParameters": false, 17 | "noImplicitReturns": true, 18 | "noFallthroughCasesInSwitch": true, 19 | "suppressImplicitAnyIndexErrors": true, 20 | "outDir": "../dist/es2015" 21 | }, 22 | "files": ["../src/api.ts"], 23 | "angularCompilerOptions": { 24 | "strictMetaDataEmit": true, 25 | "skipTemplateCodegen": true, 26 | "flatModuleOutFile": "od-virtualscroll.js", 27 | "flatModuleId": "od-virtualscroll", 28 | "annotateForClosureCompiler": true 29 | } 30 | } -------------------------------------------------------------------------------- /config/tsconfig.es5.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "target": "es5", 4 | "module": "es2015", 5 | "moduleResolution": "node", 6 | "lib": ["es2015", "dom"], 7 | "noImplicitAny": true, 8 | "sourceMap": true, 9 | "declaration": true, 10 | "removeComments": false, 11 | "strictNullChecks": false, 12 | "experimentalDecorators": true, 13 | "emitDecoratorMetadata": true, 14 | "stripInternal": true, 15 | "alwaysStrict": true, 16 | "noUnusedParameters": false, 17 | "noImplicitReturns": true, 18 | "noFallthroughCasesInSwitch": true, 19 | "suppressImplicitAnyIndexErrors": true, 20 | "outDir": "../dist/es5" 21 | }, 22 | "files": ["../src/api.ts"], 23 | "angularCompilerOptions": { 24 | "strictMetaDataEmit": true, 25 | "skipTemplateCodegen": true, 26 | "flatModuleOutFile": "od-virtualscroll.js", 27 | "flatModuleId": "od-virtualscroll", 28 | "annotateForClosureCompiler": true 29 | } 30 | } -------------------------------------------------------------------------------- /demo/demo-aot.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | od-virtualscroll: dev example (AoT) 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | loading... 14 | 15 | 16 | -------------------------------------------------------------------------------- /demo/demo.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | od-virtualscroll: dev example 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | loading... 20 | 21 | 22 | -------------------------------------------------------------------------------- /demo/src/app.component.ts: -------------------------------------------------------------------------------- 1 | import {Component} from '@angular/core' 2 | 3 | import {Observable, of, range} from 'rxjs' 4 | import {reduce} from 'rxjs/operators' 5 | 6 | import {IVirtualScrollOptions} from '../../src/api' 7 | 8 | @Component({ 9 | selector: 'app-shell', 10 | styles: [` 11 | .outer-container { 12 | display: flex; 13 | height: 100vh; 14 | align-items: center; 15 | justify-content: center; 16 | } 17 | 18 | .inner-container { 19 | display: flex; 20 | flex-direction: column; 21 | height: 90vh; 22 | width: 92%; 23 | } 24 | 25 | .header { 26 | color: pink; 27 | display: flex; 28 | justify-content: space-between; 29 | align-items: baseline; 30 | } 31 | 32 | .border-wrapper { 33 | border: 4px dashed pink; 34 | flex: 1; 35 | overflow: hidden; 36 | height: 100%; 37 | } 38 | 39 | a { 40 | font-size: 14px; 41 | font-style: normal; 42 | text-decoration: none; 43 | } 44 | 45 | @media only screen and (max-width : 447px) { 46 | .header { 47 | display: none; 48 | } 49 | } 50 | 51 | .cell { 52 | align-items: center; 53 | border: 4px #b3eaff solid; 54 | box-sizing: border-box; 55 | display: inline-flex; 56 | height: 200px; 57 | justify-content: center; 58 | margin-right: -2px; 59 | position: relative; 60 | width: 200px; 61 | } 62 | 63 | .cell-info { 64 | font-size: 10px; 65 | position: absolute; 66 | right: 5px; 67 | text-align: right; 68 | top: 5px; 69 | } 70 | 71 | /deep/ .od-scroll-container { 72 | margin: 0 auto; 73 | } 74 | `], 75 | template: ` 76 |
77 |
78 |
79 |

od-virtualscroll

80 | 81 |
82 |
83 | 84 | 85 |
86 |
87 | Row: {{row}}
88 | Column: {{column}} 89 |
90 | {{item}} 91 |
92 |
93 |
94 |
95 |
96 |
` 97 | }) 98 | export class AppComponent { 99 | data$ = range(0, 100000).pipe(reduce((acc: number[], cur: number) => { 100 | acc.push(cur) 101 | return acc 102 | }, [])) 103 | 104 | options$ = of({itemWidth: 202, itemHeight: 202, numAdditionalRows: 1}) 105 | } 106 | -------------------------------------------------------------------------------- /demo/src/app.module.ts: -------------------------------------------------------------------------------- 1 | import {NgModule} from '@angular/core' 2 | import {BrowserModule} from '@angular/platform-browser' 3 | 4 | import {VirtualScrollModule} from '../../src/api' 5 | 6 | import {AppComponent} from './app.component' 7 | 8 | @NgModule({ 9 | bootstrap: [AppComponent], 10 | declarations: [AppComponent], 11 | imports: [ 12 | BrowserModule, 13 | 14 | VirtualScrollModule 15 | ] 16 | }) 17 | export class AppModule {} 18 | -------------------------------------------------------------------------------- /demo/src/main-aot.ts: -------------------------------------------------------------------------------- 1 | import {enableProdMode} from '@angular/core' 2 | import {platformBrowser} from '@angular/platform-browser' 3 | import {AppModuleNgFactory} from '../../buildTmp/aot/demo/src/app.module.ngfactory' 4 | 5 | enableProdMode() 6 | 7 | platformBrowser().bootstrapModuleFactory(AppModuleNgFactory) 8 | -------------------------------------------------------------------------------- /demo/src/main.ts: -------------------------------------------------------------------------------- 1 | import {platformBrowserDynamic} from '@angular/platform-browser-dynamic' 2 | 3 | import {AppModule} from './app.module' 4 | 5 | platformBrowserDynamic().bootstrapModule(AppModule) 6 | -------------------------------------------------------------------------------- /demo/systemjs.config.js: -------------------------------------------------------------------------------- 1 | SystemJS.config({ 2 | paths: { 3 | 'npm:': '../node_modules/', 4 | //'npm:': 'https://unpkg.com/' 5 | }, 6 | map: { 7 | ts: 'npm:plugin-typescript/lib', 8 | typescript: 'npm:typescript', 9 | 10 | '@angular/common': 'npm:@angular/common/bundles/common.umd.js', 11 | '@angular/core': 'npm:@angular/core/bundles/core.umd.js', 12 | '@angular/compiler': 'npm:@angular/compiler/bundles/compiler.umd.js', 13 | '@angular/platform-browser': 'npm:@angular/platform-browser/bundles/platform-browser.umd.js', 14 | '@angular/platform-browser-dynamic': 'npm:@angular/platform-browser-dynamic/bundles/platform-browser-dynamic.umd.js', 15 | 16 | 'rxjs': 'npm:rxjs' 17 | }, 18 | packages: { 19 | ts: {main: 'plugin.js'}, 20 | typescript: { 21 | main: 'lib/typescript.js', 22 | meta: { 23 | 'lib/typescript.js': { 24 | 'exports': 'ts' 25 | } 26 | } 27 | }, 28 | src: { 29 | main: 'main.ts', 30 | defaultExtension: 'ts', 31 | meta: {'*.ts': {loader:'ts'}} 32 | }, 33 | '../../src': { 34 | defaultExtension: 'ts', 35 | meta: {'*.ts': {loader:'ts'}} 36 | }, 37 | 'rxjs': {main: 'index.js', defaultExtension: 'js' }, 38 | 'rxjs/operators': {main: 'index.js', defaultExtension: 'js' } 39 | }, 40 | transpiler: 'ts', 41 | typescriptOptions: { 42 | "target": "es5", 43 | "module": "System", 44 | "moduleResolution": "node", 45 | "lib": ["es2015", "dom"], 46 | "noImplicitAny": true, 47 | "sourceMap": true, 48 | "declaration": true, 49 | "removeComments": false, 50 | "strictNullChecks": false, 51 | "experimentalDecorators": true, 52 | "emitDecoratorMetadata": true, 53 | "stripInternal": true, 54 | "alwaysStrict": true, 55 | "noUnusedParameters": false, 56 | "noImplicitReturns": true, 57 | "noFallthroughCasesInSwitch": true, 58 | "suppressImplicitAnyIndexErrors": true 59 | } 60 | }) 61 | -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "od-virtualscroll", 3 | "version": "1.0.2", 4 | "lockfileVersion": 1, 5 | "requires": true, 6 | "dependencies": { 7 | "@angular/common": { 8 | "version": "6.0.5", 9 | "resolved": "https://registry.npmjs.org/@angular/common/-/common-6.0.5.tgz", 10 | "integrity": "sha512-xL4Aq+uGQcmHYs90WSKsS9vBC1XO042hM5lSVz+zyYtYzYHdt/Qg1CIuR3zkP+8DG+mf1QZqbg5YtQx5XykmgA==", 11 | "dev": true, 12 | "requires": { 13 | "tslib": "^1.9.0" 14 | } 15 | }, 16 | "@angular/compiler": { 17 | "version": "6.0.5", 18 | "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-6.0.5.tgz", 19 | "integrity": "sha512-Oe0VRCyKfHLatalRuXjCdgaY6hhiMXEL/ueknMJFC0+xA73mEchmLYXj64/1ed753cjnLOM2qbVVwqhc26tmEg==", 20 | "dev": true, 21 | "requires": { 22 | "tslib": "^1.9.0" 23 | } 24 | }, 25 | "@angular/compiler-cli": { 26 | "version": "6.0.5", 27 | "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-6.0.5.tgz", 28 | "integrity": "sha512-onRlVLWo1mTdyxLMRtW4iPntTUglJl9T0hacRlscKKlAUT8jaSfqIyknCF3jEXJrTnfKdypen053U7g2ajifrA==", 29 | "dev": true, 30 | "requires": { 31 | "chokidar": "^1.4.2", 32 | "minimist": "^1.2.0", 33 | "reflect-metadata": "^0.1.2", 34 | "tsickle": "^0.29.0" 35 | } 36 | }, 37 | "@angular/core": { 38 | "version": "6.0.5", 39 | "resolved": "https://registry.npmjs.org/@angular/core/-/core-6.0.5.tgz", 40 | "integrity": "sha512-yG4Qz5wHWgFYOCtX62F8MmJ1wZwZA1ALbyQC+WAZfi7Y8Asx8TShJ+3QKUDYwO1jj530pqNbfauDTCmPzzPvaQ==", 41 | "dev": true, 42 | "requires": { 43 | "tslib": "^1.9.0" 44 | } 45 | }, 46 | "@angular/platform-browser": { 47 | "version": "6.0.5", 48 | "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-6.0.5.tgz", 49 | "integrity": "sha512-FSsA9C3cJa7S4SPUAhypKlTQf4uA4hiqx/h65v7frDiyRVHv22oWKX7aKmyyb9oP5FHN/TDeQiRn4m8XNqG6AQ==", 50 | "dev": true, 51 | "requires": { 52 | "tslib": "^1.9.0" 53 | } 54 | }, 55 | "@angular/platform-browser-dynamic": { 56 | "version": "6.0.5", 57 | "resolved": "https://registry.npmjs.org/@angular/platform-browser-dynamic/-/platform-browser-dynamic-6.0.5.tgz", 58 | "integrity": "sha512-TTSLOMVrgRXI29xmBWsnSp8187vbWnbj0YEehuyup2FmltUl+H5Vms7poWV9/6fI3RnW3Yg9Ziv3T5iKqsiADQ==", 59 | "dev": true, 60 | "requires": { 61 | "tslib": "^1.9.0" 62 | } 63 | }, 64 | "@babel/code-frame": { 65 | "version": "7.0.0-beta.51", 66 | "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.0.0-beta.51.tgz", 67 | "integrity": "sha1-vXHZsZKvl435FYKdOdQJRFZDmgw=", 68 | "dev": true, 69 | "requires": { 70 | "@babel/highlight": "7.0.0-beta.51" 71 | } 72 | }, 73 | "@babel/highlight": { 74 | "version": "7.0.0-beta.51", 75 | "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.0.0-beta.51.tgz", 76 | "integrity": "sha1-6IRK4loVlcz9QriWI7Q3bKBtIl0=", 77 | "dev": true, 78 | "requires": { 79 | "chalk": "^2.0.0", 80 | "esutils": "^2.0.2", 81 | "js-tokens": "^3.0.0" 82 | }, 83 | "dependencies": { 84 | "ansi-styles": { 85 | "version": "3.2.1", 86 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", 87 | "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", 88 | "dev": true, 89 | "requires": { 90 | "color-convert": "^1.9.0" 91 | } 92 | }, 93 | "chalk": { 94 | "version": "2.4.1", 95 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", 96 | "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", 97 | "dev": true, 98 | "requires": { 99 | "ansi-styles": "^3.2.1", 100 | "escape-string-regexp": "^1.0.5", 101 | "supports-color": "^5.3.0" 102 | } 103 | }, 104 | "supports-color": { 105 | "version": "5.4.0", 106 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz", 107 | "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==", 108 | "dev": true, 109 | "requires": { 110 | "has-flag": "^3.0.0" 111 | } 112 | } 113 | } 114 | }, 115 | "@types/estree": { 116 | "version": "0.0.39", 117 | "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.39.tgz", 118 | "integrity": "sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw==", 119 | "dev": true 120 | }, 121 | "@types/node": { 122 | "version": "10.1.3", 123 | "resolved": "https://registry.npmjs.org/@types/node/-/node-10.1.3.tgz", 124 | "integrity": "sha512-GiCx7dRvta0hbxXoJFAUxz+CKX6bZSCKjM5slq2vPp/5zwK01T4ibYZkGr6EN4F2QmxDQR76/ZHg6q+7iFWCWw==", 125 | "dev": true 126 | }, 127 | "accepts": { 128 | "version": "1.3.5", 129 | "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.5.tgz", 130 | "integrity": "sha1-63d99gEXI6OxTopywIBcjoZ0a9I=", 131 | "dev": true, 132 | "requires": { 133 | "mime-types": "~2.1.18", 134 | "negotiator": "0.6.1" 135 | } 136 | }, 137 | "after": { 138 | "version": "0.8.2", 139 | "resolved": "https://registry.npmjs.org/after/-/after-0.8.2.tgz", 140 | "integrity": "sha1-/ts5T58OAqqXaOcCvaI7UF+ufh8=", 141 | "dev": true 142 | }, 143 | "align-text": { 144 | "version": "0.1.4", 145 | "resolved": "https://registry.npmjs.org/align-text/-/align-text-0.1.4.tgz", 146 | "integrity": "sha1-DNkKVhCT810KmSVsIrcGlDP60Rc=", 147 | "dev": true, 148 | "requires": { 149 | "kind-of": "^3.0.2", 150 | "longest": "^1.0.1", 151 | "repeat-string": "^1.5.2" 152 | } 153 | }, 154 | "ansi-align": { 155 | "version": "2.0.0", 156 | "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-2.0.0.tgz", 157 | "integrity": "sha1-w2rsy6VjuJzrVW82kPCx2eNUf38=", 158 | "dev": true, 159 | "requires": { 160 | "string-width": "^2.0.0" 161 | }, 162 | "dependencies": { 163 | "ansi-regex": { 164 | "version": "3.0.0", 165 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", 166 | "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", 167 | "dev": true 168 | }, 169 | "is-fullwidth-code-point": { 170 | "version": "2.0.0", 171 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", 172 | "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", 173 | "dev": true 174 | }, 175 | "string-width": { 176 | "version": "2.1.1", 177 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", 178 | "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", 179 | "dev": true, 180 | "requires": { 181 | "is-fullwidth-code-point": "^2.0.0", 182 | "strip-ansi": "^4.0.0" 183 | } 184 | }, 185 | "strip-ansi": { 186 | "version": "4.0.0", 187 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", 188 | "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", 189 | "dev": true, 190 | "requires": { 191 | "ansi-regex": "^3.0.0" 192 | } 193 | } 194 | } 195 | }, 196 | "ansi-regex": { 197 | "version": "2.1.1", 198 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", 199 | "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", 200 | "dev": true 201 | }, 202 | "ansi-styles": { 203 | "version": "2.2.1", 204 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", 205 | "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", 206 | "dev": true 207 | }, 208 | "anymatch": { 209 | "version": "1.3.2", 210 | "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-1.3.2.tgz", 211 | "integrity": "sha512-0XNayC8lTHQ2OI8aljNCN3sSx6hsr/1+rlcDAotXJR7C1oZZHCNsfpbKwMjRA3Uqb5tF1Rae2oloTr4xpq+WjA==", 212 | "dev": true, 213 | "requires": { 214 | "micromatch": "^2.1.5", 215 | "normalize-path": "^2.0.0" 216 | } 217 | }, 218 | "argparse": { 219 | "version": "1.0.10", 220 | "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", 221 | "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", 222 | "dev": true, 223 | "requires": { 224 | "sprintf-js": "~1.0.2" 225 | } 226 | }, 227 | "arr-diff": { 228 | "version": "2.0.0", 229 | "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz", 230 | "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=", 231 | "dev": true, 232 | "requires": { 233 | "arr-flatten": "^1.0.1" 234 | } 235 | }, 236 | "arr-flatten": { 237 | "version": "1.1.0", 238 | "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", 239 | "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==", 240 | "dev": true 241 | }, 242 | "array-filter": { 243 | "version": "0.0.1", 244 | "resolved": "https://registry.npmjs.org/array-filter/-/array-filter-0.0.1.tgz", 245 | "integrity": "sha1-fajPLiZijtcygDWB/SH2fKzS7uw=", 246 | "dev": true 247 | }, 248 | "array-find-index": { 249 | "version": "1.0.2", 250 | "resolved": "https://registry.npmjs.org/array-find-index/-/array-find-index-1.0.2.tgz", 251 | "integrity": "sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E=", 252 | "dev": true 253 | }, 254 | "array-map": { 255 | "version": "0.0.0", 256 | "resolved": "https://registry.npmjs.org/array-map/-/array-map-0.0.0.tgz", 257 | "integrity": "sha1-iKK6tz0c97zVwbEYoAP2b2ZfpmI=", 258 | "dev": true 259 | }, 260 | "array-reduce": { 261 | "version": "0.0.0", 262 | "resolved": "https://registry.npmjs.org/array-reduce/-/array-reduce-0.0.0.tgz", 263 | "integrity": "sha1-FziZ0//Rx9k4PkR5Ul2+J4yrXys=", 264 | "dev": true 265 | }, 266 | "array-union": { 267 | "version": "1.0.2", 268 | "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", 269 | "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", 270 | "dev": true, 271 | "requires": { 272 | "array-uniq": "^1.0.1" 273 | } 274 | }, 275 | "array-uniq": { 276 | "version": "1.0.3", 277 | "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", 278 | "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=", 279 | "dev": true 280 | }, 281 | "array-unique": { 282 | "version": "0.2.1", 283 | "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz", 284 | "integrity": "sha1-odl8yvy8JiXMcPrc6zalDFiwGlM=", 285 | "dev": true 286 | }, 287 | "arraybuffer.slice": { 288 | "version": "0.0.7", 289 | "resolved": "https://registry.npmjs.org/arraybuffer.slice/-/arraybuffer.slice-0.0.7.tgz", 290 | "integrity": "sha512-wGUIVQXuehL5TCqQun8OW81jGzAWycqzFF8lFp+GOM5BXLYj3bKNsYC4daB7n6XjCqxQA/qgTJ+8ANR3acjrog==", 291 | "dev": true 292 | }, 293 | "async": { 294 | "version": "1.5.2", 295 | "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", 296 | "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=", 297 | "dev": true 298 | }, 299 | "async-each": { 300 | "version": "1.0.1", 301 | "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.1.tgz", 302 | "integrity": "sha1-GdOGodntxufByF04iu28xW0zYC0=", 303 | "dev": true 304 | }, 305 | "async-each-series": { 306 | "version": "0.1.1", 307 | "resolved": "https://registry.npmjs.org/async-each-series/-/async-each-series-0.1.1.tgz", 308 | "integrity": "sha1-dhfBkXQB/Yykooqtzj266Yr+tDI=", 309 | "dev": true 310 | }, 311 | "async-limiter": { 312 | "version": "1.0.0", 313 | "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.0.tgz", 314 | "integrity": "sha512-jp/uFnooOiO+L211eZOoSyzpOITMXx1rBITauYykG3BRYPu8h0UcxsPNB04RR5vo4Tyz3+ay17tR6JVf9qzYWg==", 315 | "dev": true 316 | }, 317 | "axios": { 318 | "version": "0.17.1", 319 | "resolved": "https://registry.npmjs.org/axios/-/axios-0.17.1.tgz", 320 | "integrity": "sha1-LY4+XQvb1zJ/kbyBT1xXZg+Bgk0=", 321 | "dev": true, 322 | "requires": { 323 | "follow-redirects": "^1.2.5", 324 | "is-buffer": "^1.1.5" 325 | } 326 | }, 327 | "babel-code-frame": { 328 | "version": "6.26.0", 329 | "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz", 330 | "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=", 331 | "dev": true, 332 | "requires": { 333 | "chalk": "^1.1.3", 334 | "esutils": "^2.0.2", 335 | "js-tokens": "^3.0.2" 336 | } 337 | }, 338 | "babel-runtime": { 339 | "version": "6.26.0", 340 | "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", 341 | "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", 342 | "dev": true, 343 | "requires": { 344 | "core-js": "^2.4.0", 345 | "regenerator-runtime": "^0.11.0" 346 | } 347 | }, 348 | "backo2": { 349 | "version": "1.0.2", 350 | "resolved": "https://registry.npmjs.org/backo2/-/backo2-1.0.2.tgz", 351 | "integrity": "sha1-MasayLEpNjRj41s+u2n038+6eUc=", 352 | "dev": true 353 | }, 354 | "balanced-match": { 355 | "version": "1.0.0", 356 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", 357 | "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", 358 | "dev": true 359 | }, 360 | "base64-arraybuffer": { 361 | "version": "0.1.5", 362 | "resolved": "https://registry.npmjs.org/base64-arraybuffer/-/base64-arraybuffer-0.1.5.tgz", 363 | "integrity": "sha1-c5JncZI7Whl0etZmqlzUv5xunOg=", 364 | "dev": true 365 | }, 366 | "base64id": { 367 | "version": "1.0.0", 368 | "resolved": "https://registry.npmjs.org/base64id/-/base64id-1.0.0.tgz", 369 | "integrity": "sha1-R2iMuZu2gE8OBtPnY7HDLlfY5rY=", 370 | "dev": true 371 | }, 372 | "batch": { 373 | "version": "0.5.3", 374 | "resolved": "https://registry.npmjs.org/batch/-/batch-0.5.3.tgz", 375 | "integrity": "sha1-PzQU84AyF0O/wQQvmoP/HVgk1GQ=", 376 | "dev": true 377 | }, 378 | "better-assert": { 379 | "version": "1.0.2", 380 | "resolved": "https://registry.npmjs.org/better-assert/-/better-assert-1.0.2.tgz", 381 | "integrity": "sha1-QIZrnhueC1W0gYlDEeaPr/rrxSI=", 382 | "dev": true, 383 | "requires": { 384 | "callsite": "1.0.0" 385 | } 386 | }, 387 | "binary-extensions": { 388 | "version": "1.11.0", 389 | "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.11.0.tgz", 390 | "integrity": "sha1-RqoXUftqL5PuXmibsQh9SxTGwgU=", 391 | "dev": true 392 | }, 393 | "blob": { 394 | "version": "0.0.4", 395 | "resolved": "https://registry.npmjs.org/blob/-/blob-0.0.4.tgz", 396 | "integrity": "sha1-vPEwUspURj8w+fx+lbmkdjCpSSE=", 397 | "dev": true 398 | }, 399 | "boxen": { 400 | "version": "1.3.0", 401 | "resolved": "https://registry.npmjs.org/boxen/-/boxen-1.3.0.tgz", 402 | "integrity": "sha512-TNPjfTr432qx7yOjQyaXm3dSR0MH9vXp7eT1BFSl/C51g+EFnOR9hTg1IreahGBmDNCehscshe45f+C1TBZbLw==", 403 | "dev": true, 404 | "requires": { 405 | "ansi-align": "^2.0.0", 406 | "camelcase": "^4.0.0", 407 | "chalk": "^2.0.1", 408 | "cli-boxes": "^1.0.0", 409 | "string-width": "^2.0.0", 410 | "term-size": "^1.2.0", 411 | "widest-line": "^2.0.0" 412 | }, 413 | "dependencies": { 414 | "ansi-regex": { 415 | "version": "3.0.0", 416 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", 417 | "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", 418 | "dev": true 419 | }, 420 | "ansi-styles": { 421 | "version": "3.2.1", 422 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", 423 | "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", 424 | "dev": true, 425 | "requires": { 426 | "color-convert": "^1.9.0" 427 | } 428 | }, 429 | "camelcase": { 430 | "version": "4.1.0", 431 | "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", 432 | "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=", 433 | "dev": true 434 | }, 435 | "chalk": { 436 | "version": "2.4.1", 437 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", 438 | "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", 439 | "dev": true, 440 | "requires": { 441 | "ansi-styles": "^3.2.1", 442 | "escape-string-regexp": "^1.0.5", 443 | "supports-color": "^5.3.0" 444 | } 445 | }, 446 | "is-fullwidth-code-point": { 447 | "version": "2.0.0", 448 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", 449 | "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", 450 | "dev": true 451 | }, 452 | "string-width": { 453 | "version": "2.1.1", 454 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", 455 | "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", 456 | "dev": true, 457 | "requires": { 458 | "is-fullwidth-code-point": "^2.0.0", 459 | "strip-ansi": "^4.0.0" 460 | } 461 | }, 462 | "strip-ansi": { 463 | "version": "4.0.0", 464 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", 465 | "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", 466 | "dev": true, 467 | "requires": { 468 | "ansi-regex": "^3.0.0" 469 | } 470 | }, 471 | "supports-color": { 472 | "version": "5.4.0", 473 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz", 474 | "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==", 475 | "dev": true, 476 | "requires": { 477 | "has-flag": "^3.0.0" 478 | } 479 | } 480 | } 481 | }, 482 | "brace-expansion": { 483 | "version": "1.1.8", 484 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.8.tgz", 485 | "integrity": "sha1-wHshHHyVLsH479Uad+8NHTmQopI=", 486 | "dev": true, 487 | "requires": { 488 | "balanced-match": "^1.0.0", 489 | "concat-map": "0.0.1" 490 | } 491 | }, 492 | "braces": { 493 | "version": "1.8.5", 494 | "resolved": "https://registry.npmjs.org/braces/-/braces-1.8.5.tgz", 495 | "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=", 496 | "dev": true, 497 | "requires": { 498 | "expand-range": "^1.8.1", 499 | "preserve": "^0.2.0", 500 | "repeat-element": "^1.1.2" 501 | } 502 | }, 503 | "browser-sync": { 504 | "version": "2.24.4", 505 | "resolved": "https://registry.npmjs.org/browser-sync/-/browser-sync-2.24.4.tgz", 506 | "integrity": "sha512-qfXv8vQA/Dctub2v44v/vPuvfC4XNd6bn+W5vWZVuhuy6w91lPsdY6qhalT2s2PjnJ3FR6kWq5wkTQgN26eKzA==", 507 | "dev": true, 508 | "requires": { 509 | "browser-sync-ui": "v1.0.1", 510 | "bs-recipes": "1.3.4", 511 | "chokidar": "1.7.0", 512 | "connect": "3.5.0", 513 | "connect-history-api-fallback": "^1.5.0", 514 | "dev-ip": "^1.0.1", 515 | "easy-extender": "2.3.2", 516 | "eazy-logger": "3.0.2", 517 | "etag": "^1.8.1", 518 | "fresh": "^0.5.2", 519 | "fs-extra": "3.0.1", 520 | "http-proxy": "1.15.2", 521 | "immutable": "3.8.2", 522 | "localtunnel": "1.9.0", 523 | "micromatch": "2.3.11", 524 | "opn": "4.0.2", 525 | "portscanner": "2.1.1", 526 | "qs": "6.2.3", 527 | "raw-body": "^2.3.2", 528 | "resp-modifier": "6.0.2", 529 | "rx": "4.1.0", 530 | "serve-index": "1.8.0", 531 | "serve-static": "1.13.2", 532 | "server-destroy": "1.0.1", 533 | "socket.io": "2.0.4", 534 | "ua-parser-js": "0.7.17", 535 | "yargs": "6.4.0" 536 | } 537 | }, 538 | "browser-sync-ui": { 539 | "version": "1.0.1", 540 | "resolved": "https://registry.npmjs.org/browser-sync-ui/-/browser-sync-ui-1.0.1.tgz", 541 | "integrity": "sha512-RIxmwVVcUFhRd1zxp7m2FfLnXHf59x4Gtj8HFwTA//3VgYI3AKkaQAuDL8KDJnE59XqCshxZa13JYuIWtZlKQg==", 542 | "dev": true, 543 | "requires": { 544 | "async-each-series": "0.1.1", 545 | "connect-history-api-fallback": "^1.1.0", 546 | "immutable": "^3.7.6", 547 | "server-destroy": "1.0.1", 548 | "socket.io-client": "2.0.4", 549 | "stream-throttle": "^0.1.3" 550 | } 551 | }, 552 | "bs-recipes": { 553 | "version": "1.3.4", 554 | "resolved": "https://registry.npmjs.org/bs-recipes/-/bs-recipes-1.3.4.tgz", 555 | "integrity": "sha1-DS1NSKcYyMBEdp/cT4lZLci2lYU=", 556 | "dev": true 557 | }, 558 | "btoa": { 559 | "version": "1.1.2", 560 | "resolved": "https://registry.npmjs.org/btoa/-/btoa-1.1.2.tgz", 561 | "integrity": "sha1-PkC4FmP4HS3WWWpMtxSo3BbPq+A=", 562 | "dev": true 563 | }, 564 | "buffer-from": { 565 | "version": "1.1.0", 566 | "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.0.tgz", 567 | "integrity": "sha512-c5mRlguI/Pe2dSZmpER62rSCu0ryKmWddzRYsuXc50U2/g8jMOulc31VZMa4mYx31U5xsmSOpDCgH88Vl9cDGQ==", 568 | "dev": true 569 | }, 570 | "builtin-modules": { 571 | "version": "1.1.1", 572 | "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", 573 | "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=", 574 | "dev": true 575 | }, 576 | "bytes": { 577 | "version": "3.0.0", 578 | "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", 579 | "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=", 580 | "dev": true 581 | }, 582 | "callsite": { 583 | "version": "1.0.0", 584 | "resolved": "https://registry.npmjs.org/callsite/-/callsite-1.0.0.tgz", 585 | "integrity": "sha1-KAOY5dZkvXQDi28JBRU+borxvCA=", 586 | "dev": true 587 | }, 588 | "camelcase": { 589 | "version": "1.2.1", 590 | "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz", 591 | "integrity": "sha1-m7UwTS4LVmmLLHWLCKPqqdqlijk=", 592 | "dev": true 593 | }, 594 | "camelcase-keys": { 595 | "version": "2.1.0", 596 | "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-2.1.0.tgz", 597 | "integrity": "sha1-MIvur/3ygRkFHvodkyITyRuPkuc=", 598 | "dev": true, 599 | "requires": { 600 | "camelcase": "^2.0.0", 601 | "map-obj": "^1.0.0" 602 | }, 603 | "dependencies": { 604 | "camelcase": { 605 | "version": "2.1.1", 606 | "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz", 607 | "integrity": "sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8=", 608 | "dev": true 609 | } 610 | } 611 | }, 612 | "capture-stack-trace": { 613 | "version": "1.0.0", 614 | "resolved": "https://registry.npmjs.org/capture-stack-trace/-/capture-stack-trace-1.0.0.tgz", 615 | "integrity": "sha1-Sm+gc5nCa7pH8LJJa00PtAjFVQ0=", 616 | "dev": true 617 | }, 618 | "center-align": { 619 | "version": "0.1.3", 620 | "resolved": "https://registry.npmjs.org/center-align/-/center-align-0.1.3.tgz", 621 | "integrity": "sha1-qg0yYptu6XIgBBHL1EYckHvCt60=", 622 | "dev": true, 623 | "requires": { 624 | "align-text": "^0.1.3", 625 | "lazy-cache": "^1.0.3" 626 | } 627 | }, 628 | "chalk": { 629 | "version": "1.1.3", 630 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", 631 | "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", 632 | "dev": true, 633 | "requires": { 634 | "ansi-styles": "^2.2.1", 635 | "escape-string-regexp": "^1.0.2", 636 | "has-ansi": "^2.0.0", 637 | "strip-ansi": "^3.0.0", 638 | "supports-color": "^2.0.0" 639 | } 640 | }, 641 | "chokidar": { 642 | "version": "1.7.0", 643 | "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-1.7.0.tgz", 644 | "integrity": "sha1-eY5ol3gVHIB2tLNg5e3SjNortGg=", 645 | "dev": true, 646 | "requires": { 647 | "anymatch": "^1.3.0", 648 | "async-each": "^1.0.0", 649 | "fsevents": "^1.0.0", 650 | "glob-parent": "^2.0.0", 651 | "inherits": "^2.0.1", 652 | "is-binary-path": "^1.0.0", 653 | "is-glob": "^2.0.0", 654 | "path-is-absolute": "^1.0.0", 655 | "readdirp": "^2.0.0" 656 | } 657 | }, 658 | "ci-info": { 659 | "version": "1.1.3", 660 | "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-1.1.3.tgz", 661 | "integrity": "sha512-SK/846h/Rcy8q9Z9CAwGBLfCJ6EkjJWdpelWDufQpqVDYq2Wnnv8zlSO6AMQap02jvhVruKKpEtQOufo3pFhLg==", 662 | "dev": true 663 | }, 664 | "cli-boxes": { 665 | "version": "1.0.0", 666 | "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-1.0.0.tgz", 667 | "integrity": "sha1-T6kXw+WclKAEzWH47lCdplFocUM=", 668 | "dev": true 669 | }, 670 | "cliui": { 671 | "version": "3.2.0", 672 | "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", 673 | "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=", 674 | "dev": true, 675 | "requires": { 676 | "string-width": "^1.0.1", 677 | "strip-ansi": "^3.0.1", 678 | "wrap-ansi": "^2.0.0" 679 | } 680 | }, 681 | "code-point-at": { 682 | "version": "1.1.0", 683 | "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", 684 | "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", 685 | "dev": true 686 | }, 687 | "color-convert": { 688 | "version": "1.9.1", 689 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.1.tgz", 690 | "integrity": "sha512-mjGanIiwQJskCC18rPR6OmrZ6fm2Lc7PeGFYwCmy5J34wC6F1PzdGL6xeMfmgicfYcNLGuVFA3WzXtIDCQSZxQ==", 691 | "dev": true, 692 | "requires": { 693 | "color-name": "^1.1.1" 694 | } 695 | }, 696 | "color-name": { 697 | "version": "1.1.3", 698 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", 699 | "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", 700 | "dev": true 701 | }, 702 | "colors": { 703 | "version": "1.3.0", 704 | "resolved": "https://registry.npmjs.org/colors/-/colors-1.3.0.tgz", 705 | "integrity": "sha512-EDpX3a7wHMWFA7PUHWPHNWqOxIIRSJetuwl0AS5Oi/5FMV8kWm69RTlgm00GKjBO1xFHMtBbL49yRtMMdticBw==", 706 | "dev": true 707 | }, 708 | "commander": { 709 | "version": "2.15.1", 710 | "resolved": "https://registry.npmjs.org/commander/-/commander-2.15.1.tgz", 711 | "integrity": "sha512-VlfT9F3V0v+jr4yxPc5gg9s62/fIVWsd2Bk2iD435um1NlGMYdVCq+MjcXnhYq2icNOizHr1kK+5TI6H0Hy0ag==", 712 | "dev": true 713 | }, 714 | "component-bind": { 715 | "version": "1.0.0", 716 | "resolved": "https://registry.npmjs.org/component-bind/-/component-bind-1.0.0.tgz", 717 | "integrity": "sha1-AMYIq33Nk4l8AAllGx06jh5zu9E=", 718 | "dev": true 719 | }, 720 | "component-emitter": { 721 | "version": "1.2.1", 722 | "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz", 723 | "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=", 724 | "dev": true 725 | }, 726 | "component-inherit": { 727 | "version": "0.0.3", 728 | "resolved": "https://registry.npmjs.org/component-inherit/-/component-inherit-0.0.3.tgz", 729 | "integrity": "sha1-ZF/ErfWLcrZJ1crmUTVhnbJv8UM=", 730 | "dev": true 731 | }, 732 | "concat-map": { 733 | "version": "0.0.1", 734 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", 735 | "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", 736 | "dev": true 737 | }, 738 | "configstore": { 739 | "version": "3.1.2", 740 | "resolved": "https://registry.npmjs.org/configstore/-/configstore-3.1.2.tgz", 741 | "integrity": "sha512-vtv5HtGjcYUgFrXc6Kx747B83MRRVS5R1VTEQoXvuP+kMI+if6uywV0nDGoiydJRy4yk7h9od5Og0kxx4zUXmw==", 742 | "dev": true, 743 | "requires": { 744 | "dot-prop": "^4.1.0", 745 | "graceful-fs": "^4.1.2", 746 | "make-dir": "^1.0.0", 747 | "unique-string": "^1.0.0", 748 | "write-file-atomic": "^2.0.0", 749 | "xdg-basedir": "^3.0.0" 750 | } 751 | }, 752 | "connect": { 753 | "version": "3.5.0", 754 | "resolved": "https://registry.npmjs.org/connect/-/connect-3.5.0.tgz", 755 | "integrity": "sha1-s1dSWgtMH1BZnNmD4dnv7qlncZg=", 756 | "dev": true, 757 | "requires": { 758 | "debug": "~2.2.0", 759 | "finalhandler": "0.5.0", 760 | "parseurl": "~1.3.1", 761 | "utils-merge": "1.0.0" 762 | }, 763 | "dependencies": { 764 | "debug": { 765 | "version": "2.2.0", 766 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.2.0.tgz", 767 | "integrity": "sha1-+HBX6ZWxofauaklgZkE3vFbwOdo=", 768 | "dev": true, 769 | "requires": { 770 | "ms": "0.7.1" 771 | } 772 | }, 773 | "ms": { 774 | "version": "0.7.1", 775 | "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.1.tgz", 776 | "integrity": "sha1-nNE8A62/8ltl7/3nzoZO6VIBcJg=", 777 | "dev": true 778 | } 779 | } 780 | }, 781 | "connect-history-api-fallback": { 782 | "version": "1.5.0", 783 | "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-1.5.0.tgz", 784 | "integrity": "sha1-sGhzk0vF40T+9hGhlqb6rgruAVo=", 785 | "dev": true 786 | }, 787 | "convert-source-map": { 788 | "version": "1.5.1", 789 | "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.5.1.tgz", 790 | "integrity": "sha1-uCeAl7m8IpNl3lxiz1/K7YtVmeU=", 791 | "dev": true 792 | }, 793 | "cookie": { 794 | "version": "0.3.1", 795 | "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.3.1.tgz", 796 | "integrity": "sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s=", 797 | "dev": true 798 | }, 799 | "core-js": { 800 | "version": "2.5.7", 801 | "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.5.7.tgz", 802 | "integrity": "sha512-RszJCAxg/PP6uzXVXL6BsxSXx/B05oJAQ2vkJRjyjrEcNVycaqOmNb5OTxZPE3xa5gwZduqza6L9JOCenh/Ecw==", 803 | "dev": true 804 | }, 805 | "core-util-is": { 806 | "version": "1.0.2", 807 | "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", 808 | "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", 809 | "dev": true 810 | }, 811 | "cpx": { 812 | "version": "1.5.0", 813 | "resolved": "https://registry.npmjs.org/cpx/-/cpx-1.5.0.tgz", 814 | "integrity": "sha1-GFvgGFEdhycN7czCkxceN2VauI8=", 815 | "dev": true, 816 | "requires": { 817 | "babel-runtime": "^6.9.2", 818 | "chokidar": "^1.6.0", 819 | "duplexer": "^0.1.1", 820 | "glob": "^7.0.5", 821 | "glob2base": "^0.0.12", 822 | "minimatch": "^3.0.2", 823 | "mkdirp": "^0.5.1", 824 | "resolve": "^1.1.7", 825 | "safe-buffer": "^5.0.1", 826 | "shell-quote": "^1.6.1", 827 | "subarg": "^1.0.0" 828 | } 829 | }, 830 | "create-error-class": { 831 | "version": "3.0.2", 832 | "resolved": "https://registry.npmjs.org/create-error-class/-/create-error-class-3.0.2.tgz", 833 | "integrity": "sha1-Br56vvlHo/FKMP1hBnHUAbyot7Y=", 834 | "dev": true, 835 | "requires": { 836 | "capture-stack-trace": "^1.0.0" 837 | } 838 | }, 839 | "cross-spawn": { 840 | "version": "5.1.0", 841 | "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", 842 | "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=", 843 | "dev": true, 844 | "requires": { 845 | "lru-cache": "^4.0.1", 846 | "shebang-command": "^1.2.0", 847 | "which": "^1.2.9" 848 | } 849 | }, 850 | "crypto-random-string": { 851 | "version": "1.0.0", 852 | "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-1.0.0.tgz", 853 | "integrity": "sha1-ojD2T1aDEOFJgAmUB5DsmVRbyn4=", 854 | "dev": true 855 | }, 856 | "currently-unhandled": { 857 | "version": "0.4.1", 858 | "resolved": "https://registry.npmjs.org/currently-unhandled/-/currently-unhandled-0.4.1.tgz", 859 | "integrity": "sha1-mI3zP+qxke95mmE2nddsF635V+o=", 860 | "dev": true, 861 | "requires": { 862 | "array-find-index": "^1.0.1" 863 | } 864 | }, 865 | "debug": { 866 | "version": "2.6.9", 867 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", 868 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", 869 | "dev": true, 870 | "requires": { 871 | "ms": "2.0.0" 872 | } 873 | }, 874 | "decamelize": { 875 | "version": "1.2.0", 876 | "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", 877 | "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", 878 | "dev": true 879 | }, 880 | "deep-assign": { 881 | "version": "2.0.0", 882 | "resolved": "https://registry.npmjs.org/deep-assign/-/deep-assign-2.0.0.tgz", 883 | "integrity": "sha1-6+BrHwfwja5ZdiDj3RYi83GhxXI=", 884 | "dev": true, 885 | "requires": { 886 | "is-obj": "^1.0.0" 887 | } 888 | }, 889 | "deep-extend": { 890 | "version": "0.6.0", 891 | "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", 892 | "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", 893 | "dev": true 894 | }, 895 | "del": { 896 | "version": "3.0.0", 897 | "resolved": "https://registry.npmjs.org/del/-/del-3.0.0.tgz", 898 | "integrity": "sha1-U+z2mf/LyzljdpGrE7rxYIGXZuU=", 899 | "dev": true, 900 | "requires": { 901 | "globby": "^6.1.0", 902 | "is-path-cwd": "^1.0.0", 903 | "is-path-in-cwd": "^1.0.0", 904 | "p-map": "^1.1.1", 905 | "pify": "^3.0.0", 906 | "rimraf": "^2.2.8" 907 | }, 908 | "dependencies": { 909 | "pify": { 910 | "version": "3.0.0", 911 | "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", 912 | "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", 913 | "dev": true 914 | } 915 | } 916 | }, 917 | "del-cli": { 918 | "version": "1.1.0", 919 | "resolved": "https://registry.npmjs.org/del-cli/-/del-cli-1.1.0.tgz", 920 | "integrity": "sha1-J1V9aaC335ncuqHjSgnmrGWR0sQ=", 921 | "dev": true, 922 | "requires": { 923 | "del": "^3.0.0", 924 | "meow": "^3.6.0", 925 | "update-notifier": "^2.1.0" 926 | } 927 | }, 928 | "depd": { 929 | "version": "1.1.2", 930 | "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", 931 | "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=", 932 | "dev": true 933 | }, 934 | "destroy": { 935 | "version": "1.0.4", 936 | "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", 937 | "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=", 938 | "dev": true 939 | }, 940 | "dev-ip": { 941 | "version": "1.0.1", 942 | "resolved": "https://registry.npmjs.org/dev-ip/-/dev-ip-1.0.1.tgz", 943 | "integrity": "sha1-p2o+0YVb56ASu4rBbLgPPADcKPA=", 944 | "dev": true 945 | }, 946 | "diff": { 947 | "version": "3.5.0", 948 | "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", 949 | "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==", 950 | "dev": true 951 | }, 952 | "docopt": { 953 | "version": "0.6.2", 954 | "resolved": "https://registry.npmjs.org/docopt/-/docopt-0.6.2.tgz", 955 | "integrity": "sha1-so6eIiDaXsSffqW7JKR3h0Be6xE=", 956 | "dev": true 957 | }, 958 | "dot-prop": { 959 | "version": "4.2.0", 960 | "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-4.2.0.tgz", 961 | "integrity": "sha512-tUMXrxlExSW6U2EXiiKGSBVdYgtV8qlHL+C10TsW4PURY/ic+eaysnSkwB4kA/mBlCyy/IKDJ+Lc3wbWeaXtuQ==", 962 | "dev": true, 963 | "requires": { 964 | "is-obj": "^1.0.0" 965 | } 966 | }, 967 | "duplexer": { 968 | "version": "0.1.1", 969 | "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.1.tgz", 970 | "integrity": "sha1-rOb/gIwc5mtX0ev5eXessCM0z8E=", 971 | "dev": true 972 | }, 973 | "duplexer3": { 974 | "version": "0.1.4", 975 | "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.4.tgz", 976 | "integrity": "sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=", 977 | "dev": true 978 | }, 979 | "easy-extender": { 980 | "version": "2.3.2", 981 | "resolved": "https://registry.npmjs.org/easy-extender/-/easy-extender-2.3.2.tgz", 982 | "integrity": "sha1-PTJI/r4rFZYHMW2PnPSRwWZIIh0=", 983 | "dev": true, 984 | "requires": { 985 | "lodash": "^3.10.1" 986 | } 987 | }, 988 | "eazy-logger": { 989 | "version": "3.0.2", 990 | "resolved": "https://registry.npmjs.org/eazy-logger/-/eazy-logger-3.0.2.tgz", 991 | "integrity": "sha1-oyWqXlPROiIliJsqxBE7K5Y29Pw=", 992 | "dev": true, 993 | "requires": { 994 | "tfunk": "^3.0.1" 995 | } 996 | }, 997 | "ee-first": { 998 | "version": "1.1.1", 999 | "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", 1000 | "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=", 1001 | "dev": true 1002 | }, 1003 | "encodeurl": { 1004 | "version": "1.0.2", 1005 | "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", 1006 | "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=", 1007 | "dev": true 1008 | }, 1009 | "engine.io": { 1010 | "version": "3.1.5", 1011 | "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-3.1.5.tgz", 1012 | "integrity": "sha512-D06ivJkYxyRrcEe0bTpNnBQNgP9d3xog+qZlLbui8EsMr/DouQpf5o9FzJnWYHEYE0YsFHllUv2R1dkgYZXHcA==", 1013 | "dev": true, 1014 | "requires": { 1015 | "accepts": "~1.3.4", 1016 | "base64id": "1.0.0", 1017 | "cookie": "0.3.1", 1018 | "debug": "~3.1.0", 1019 | "engine.io-parser": "~2.1.0", 1020 | "uws": "~9.14.0", 1021 | "ws": "~3.3.1" 1022 | }, 1023 | "dependencies": { 1024 | "debug": { 1025 | "version": "3.1.0", 1026 | "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", 1027 | "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", 1028 | "dev": true, 1029 | "requires": { 1030 | "ms": "2.0.0" 1031 | } 1032 | } 1033 | } 1034 | }, 1035 | "engine.io-client": { 1036 | "version": "3.1.6", 1037 | "resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-3.1.6.tgz", 1038 | "integrity": "sha512-hnuHsFluXnsKOndS4Hv6SvUrgdYx1pk2NqfaDMW+GWdgfU3+/V25Cj7I8a0x92idSpa5PIhJRKxPvp9mnoLsfg==", 1039 | "dev": true, 1040 | "requires": { 1041 | "component-emitter": "1.2.1", 1042 | "component-inherit": "0.0.3", 1043 | "debug": "~3.1.0", 1044 | "engine.io-parser": "~2.1.1", 1045 | "has-cors": "1.1.0", 1046 | "indexof": "0.0.1", 1047 | "parseqs": "0.0.5", 1048 | "parseuri": "0.0.5", 1049 | "ws": "~3.3.1", 1050 | "xmlhttprequest-ssl": "~1.5.4", 1051 | "yeast": "0.1.2" 1052 | }, 1053 | "dependencies": { 1054 | "debug": { 1055 | "version": "3.1.0", 1056 | "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", 1057 | "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", 1058 | "dev": true, 1059 | "requires": { 1060 | "ms": "2.0.0" 1061 | } 1062 | } 1063 | } 1064 | }, 1065 | "engine.io-parser": { 1066 | "version": "2.1.2", 1067 | "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-2.1.2.tgz", 1068 | "integrity": "sha512-dInLFzr80RijZ1rGpx1+56/uFoH7/7InhH3kZt+Ms6hT8tNx3NGW/WNSA/f8As1WkOfkuyb3tnRyuXGxusclMw==", 1069 | "dev": true, 1070 | "requires": { 1071 | "after": "0.8.2", 1072 | "arraybuffer.slice": "~0.0.7", 1073 | "base64-arraybuffer": "0.1.5", 1074 | "blob": "0.0.4", 1075 | "has-binary2": "~1.0.2" 1076 | } 1077 | }, 1078 | "error-ex": { 1079 | "version": "1.3.1", 1080 | "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.1.tgz", 1081 | "integrity": "sha1-+FWobOYa3E6GIcPNoh56dhLDqNw=", 1082 | "dev": true, 1083 | "requires": { 1084 | "is-arrayish": "^0.2.1" 1085 | } 1086 | }, 1087 | "escape-html": { 1088 | "version": "1.0.3", 1089 | "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", 1090 | "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=", 1091 | "dev": true 1092 | }, 1093 | "escape-string-regexp": { 1094 | "version": "1.0.5", 1095 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", 1096 | "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", 1097 | "dev": true 1098 | }, 1099 | "esprima": { 1100 | "version": "4.0.0", 1101 | "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.0.tgz", 1102 | "integrity": "sha512-oftTcaMu/EGrEIu904mWteKIv8vMuOgGYo7EhVJJN00R/EED9DCua/xxHRdYnKtcECzVg7xOWhflvJMnqcFZjw==", 1103 | "dev": true 1104 | }, 1105 | "estree-walker": { 1106 | "version": "0.5.2", 1107 | "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-0.5.2.tgz", 1108 | "integrity": "sha512-XpCnW/AE10ws/kDAs37cngSkvgIR8aN3G0MS85m7dUpuK2EREo9VJ00uvw6Dg/hXEpfsE1I1TvJOJr+Z+TL+ig==", 1109 | "dev": true 1110 | }, 1111 | "esutils": { 1112 | "version": "2.0.2", 1113 | "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", 1114 | "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=", 1115 | "dev": true 1116 | }, 1117 | "etag": { 1118 | "version": "1.8.1", 1119 | "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", 1120 | "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=", 1121 | "dev": true 1122 | }, 1123 | "eventemitter3": { 1124 | "version": "1.2.0", 1125 | "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-1.2.0.tgz", 1126 | "integrity": "sha1-HIaZHYFq0eUEdQ5zh0Ik7PO+xQg=", 1127 | "dev": true 1128 | }, 1129 | "execa": { 1130 | "version": "0.7.0", 1131 | "resolved": "https://registry.npmjs.org/execa/-/execa-0.7.0.tgz", 1132 | "integrity": "sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c=", 1133 | "dev": true, 1134 | "requires": { 1135 | "cross-spawn": "^5.0.1", 1136 | "get-stream": "^3.0.0", 1137 | "is-stream": "^1.1.0", 1138 | "npm-run-path": "^2.0.0", 1139 | "p-finally": "^1.0.0", 1140 | "signal-exit": "^3.0.0", 1141 | "strip-eof": "^1.0.0" 1142 | } 1143 | }, 1144 | "expand-brackets": { 1145 | "version": "0.1.5", 1146 | "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz", 1147 | "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=", 1148 | "dev": true, 1149 | "requires": { 1150 | "is-posix-bracket": "^0.1.0" 1151 | } 1152 | }, 1153 | "expand-range": { 1154 | "version": "1.8.2", 1155 | "resolved": "https://registry.npmjs.org/expand-range/-/expand-range-1.8.2.tgz", 1156 | "integrity": "sha1-opnv/TNf4nIeuujiV+x5ZE/IUzc=", 1157 | "dev": true, 1158 | "requires": { 1159 | "fill-range": "^2.1.0" 1160 | } 1161 | }, 1162 | "extglob": { 1163 | "version": "0.3.2", 1164 | "resolved": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz", 1165 | "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=", 1166 | "dev": true, 1167 | "requires": { 1168 | "is-extglob": "^1.0.0" 1169 | } 1170 | }, 1171 | "filename-regex": { 1172 | "version": "2.0.1", 1173 | "resolved": "https://registry.npmjs.org/filename-regex/-/filename-regex-2.0.1.tgz", 1174 | "integrity": "sha1-wcS5vuPglyXdsQa3XB4wH+LxiyY=", 1175 | "dev": true 1176 | }, 1177 | "filesize": { 1178 | "version": "3.6.1", 1179 | "resolved": "https://registry.npmjs.org/filesize/-/filesize-3.6.1.tgz", 1180 | "integrity": "sha512-7KjR1vv6qnicaPMi1iiTcI85CyYwRO/PSFCu6SvqL8jN2Wjt/NIYQTFtFs7fSDCYOstUkEWIQGFUg5YZQfjlcg==", 1181 | "dev": true 1182 | }, 1183 | "fill-range": { 1184 | "version": "2.2.4", 1185 | "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-2.2.4.tgz", 1186 | "integrity": "sha512-cnrcCbj01+j2gTG921VZPnHbjmdAf8oQV/iGeV2kZxGSyfYjjTyY79ErsK1WJWMpw6DaApEX72binqJE+/d+5Q==", 1187 | "dev": true, 1188 | "requires": { 1189 | "is-number": "^2.1.0", 1190 | "isobject": "^2.0.0", 1191 | "randomatic": "^3.0.0", 1192 | "repeat-element": "^1.1.2", 1193 | "repeat-string": "^1.5.2" 1194 | } 1195 | }, 1196 | "finalhandler": { 1197 | "version": "0.5.0", 1198 | "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-0.5.0.tgz", 1199 | "integrity": "sha1-6VCKvs6bbbqHGmlCodeRG5GRGsc=", 1200 | "dev": true, 1201 | "requires": { 1202 | "debug": "~2.2.0", 1203 | "escape-html": "~1.0.3", 1204 | "on-finished": "~2.3.0", 1205 | "statuses": "~1.3.0", 1206 | "unpipe": "~1.0.0" 1207 | }, 1208 | "dependencies": { 1209 | "debug": { 1210 | "version": "2.2.0", 1211 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.2.0.tgz", 1212 | "integrity": "sha1-+HBX6ZWxofauaklgZkE3vFbwOdo=", 1213 | "dev": true, 1214 | "requires": { 1215 | "ms": "0.7.1" 1216 | } 1217 | }, 1218 | "ms": { 1219 | "version": "0.7.1", 1220 | "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.1.tgz", 1221 | "integrity": "sha1-nNE8A62/8ltl7/3nzoZO6VIBcJg=", 1222 | "dev": true 1223 | } 1224 | } 1225 | }, 1226 | "find-index": { 1227 | "version": "0.1.1", 1228 | "resolved": "https://registry.npmjs.org/find-index/-/find-index-0.1.1.tgz", 1229 | "integrity": "sha1-Z101iyyjiS15Whq0cjL4tuLg3eQ=", 1230 | "dev": true 1231 | }, 1232 | "find-up": { 1233 | "version": "1.1.2", 1234 | "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", 1235 | "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", 1236 | "dev": true, 1237 | "requires": { 1238 | "path-exists": "^2.0.0", 1239 | "pinkie-promise": "^2.0.0" 1240 | } 1241 | }, 1242 | "follow-redirects": { 1243 | "version": "1.5.0", 1244 | "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.5.0.tgz", 1245 | "integrity": "sha512-fdrt472/9qQ6Kgjvb935ig6vJCuofpBUD14f9Vb+SLlm7xIe4Qva5gey8EKtv8lp7ahE1wilg3xL1znpVGtZIA==", 1246 | "dev": true, 1247 | "requires": { 1248 | "debug": "^3.1.0" 1249 | }, 1250 | "dependencies": { 1251 | "debug": { 1252 | "version": "3.1.0", 1253 | "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", 1254 | "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", 1255 | "dev": true, 1256 | "requires": { 1257 | "ms": "2.0.0" 1258 | } 1259 | } 1260 | } 1261 | }, 1262 | "for-in": { 1263 | "version": "1.0.2", 1264 | "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", 1265 | "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", 1266 | "dev": true 1267 | }, 1268 | "for-own": { 1269 | "version": "0.1.5", 1270 | "resolved": "https://registry.npmjs.org/for-own/-/for-own-0.1.5.tgz", 1271 | "integrity": "sha1-UmXGgaTylNq78XyVCbZ2OqhFEM4=", 1272 | "dev": true, 1273 | "requires": { 1274 | "for-in": "^1.0.1" 1275 | } 1276 | }, 1277 | "fresh": { 1278 | "version": "0.5.2", 1279 | "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", 1280 | "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=", 1281 | "dev": true 1282 | }, 1283 | "fs-extra": { 1284 | "version": "3.0.1", 1285 | "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-3.0.1.tgz", 1286 | "integrity": "sha1-N5TzeMWLNC6n27sjCVEJxLO2IpE=", 1287 | "dev": true, 1288 | "requires": { 1289 | "graceful-fs": "^4.1.2", 1290 | "jsonfile": "^3.0.0", 1291 | "universalify": "^0.1.0" 1292 | } 1293 | }, 1294 | "fs.realpath": { 1295 | "version": "1.0.0", 1296 | "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", 1297 | "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", 1298 | "dev": true 1299 | }, 1300 | "fsevents": { 1301 | "version": "1.2.4", 1302 | "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.4.tgz", 1303 | "integrity": "sha512-z8H8/diyk76B7q5wg+Ud0+CqzcAF3mBBI/bA5ne5zrRUUIvNkJY//D3BqyH571KuAC4Nr7Rw7CjWX4r0y9DvNg==", 1304 | "dev": true, 1305 | "optional": true, 1306 | "requires": { 1307 | "nan": "^2.9.2", 1308 | "node-pre-gyp": "^0.10.0" 1309 | }, 1310 | "dependencies": { 1311 | "abbrev": { 1312 | "version": "1.1.1", 1313 | "bundled": true, 1314 | "dev": true, 1315 | "optional": true 1316 | }, 1317 | "ansi-regex": { 1318 | "version": "2.1.1", 1319 | "bundled": true, 1320 | "dev": true 1321 | }, 1322 | "aproba": { 1323 | "version": "1.2.0", 1324 | "bundled": true, 1325 | "dev": true, 1326 | "optional": true 1327 | }, 1328 | "are-we-there-yet": { 1329 | "version": "1.1.4", 1330 | "bundled": true, 1331 | "dev": true, 1332 | "optional": true, 1333 | "requires": { 1334 | "delegates": "^1.0.0", 1335 | "readable-stream": "^2.0.6" 1336 | } 1337 | }, 1338 | "balanced-match": { 1339 | "version": "1.0.0", 1340 | "bundled": true, 1341 | "dev": true 1342 | }, 1343 | "brace-expansion": { 1344 | "version": "1.1.11", 1345 | "bundled": true, 1346 | "dev": true, 1347 | "requires": { 1348 | "balanced-match": "^1.0.0", 1349 | "concat-map": "0.0.1" 1350 | } 1351 | }, 1352 | "chownr": { 1353 | "version": "1.0.1", 1354 | "bundled": true, 1355 | "dev": true, 1356 | "optional": true 1357 | }, 1358 | "code-point-at": { 1359 | "version": "1.1.0", 1360 | "bundled": true, 1361 | "dev": true 1362 | }, 1363 | "concat-map": { 1364 | "version": "0.0.1", 1365 | "bundled": true, 1366 | "dev": true 1367 | }, 1368 | "console-control-strings": { 1369 | "version": "1.1.0", 1370 | "bundled": true, 1371 | "dev": true 1372 | }, 1373 | "core-util-is": { 1374 | "version": "1.0.2", 1375 | "bundled": true, 1376 | "dev": true, 1377 | "optional": true 1378 | }, 1379 | "debug": { 1380 | "version": "2.6.9", 1381 | "bundled": true, 1382 | "dev": true, 1383 | "optional": true, 1384 | "requires": { 1385 | "ms": "2.0.0" 1386 | } 1387 | }, 1388 | "deep-extend": { 1389 | "version": "0.5.1", 1390 | "bundled": true, 1391 | "dev": true, 1392 | "optional": true 1393 | }, 1394 | "delegates": { 1395 | "version": "1.0.0", 1396 | "bundled": true, 1397 | "dev": true, 1398 | "optional": true 1399 | }, 1400 | "detect-libc": { 1401 | "version": "1.0.3", 1402 | "bundled": true, 1403 | "dev": true, 1404 | "optional": true 1405 | }, 1406 | "fs-minipass": { 1407 | "version": "1.2.5", 1408 | "bundled": true, 1409 | "dev": true, 1410 | "optional": true, 1411 | "requires": { 1412 | "minipass": "^2.2.1" 1413 | } 1414 | }, 1415 | "fs.realpath": { 1416 | "version": "1.0.0", 1417 | "bundled": true, 1418 | "dev": true, 1419 | "optional": true 1420 | }, 1421 | "gauge": { 1422 | "version": "2.7.4", 1423 | "bundled": true, 1424 | "dev": true, 1425 | "optional": true, 1426 | "requires": { 1427 | "aproba": "^1.0.3", 1428 | "console-control-strings": "^1.0.0", 1429 | "has-unicode": "^2.0.0", 1430 | "object-assign": "^4.1.0", 1431 | "signal-exit": "^3.0.0", 1432 | "string-width": "^1.0.1", 1433 | "strip-ansi": "^3.0.1", 1434 | "wide-align": "^1.1.0" 1435 | } 1436 | }, 1437 | "glob": { 1438 | "version": "7.1.2", 1439 | "bundled": true, 1440 | "dev": true, 1441 | "optional": true, 1442 | "requires": { 1443 | "fs.realpath": "^1.0.0", 1444 | "inflight": "^1.0.4", 1445 | "inherits": "2", 1446 | "minimatch": "^3.0.4", 1447 | "once": "^1.3.0", 1448 | "path-is-absolute": "^1.0.0" 1449 | } 1450 | }, 1451 | "has-unicode": { 1452 | "version": "2.0.1", 1453 | "bundled": true, 1454 | "dev": true, 1455 | "optional": true 1456 | }, 1457 | "iconv-lite": { 1458 | "version": "0.4.21", 1459 | "bundled": true, 1460 | "dev": true, 1461 | "optional": true, 1462 | "requires": { 1463 | "safer-buffer": "^2.1.0" 1464 | } 1465 | }, 1466 | "ignore-walk": { 1467 | "version": "3.0.1", 1468 | "bundled": true, 1469 | "dev": true, 1470 | "optional": true, 1471 | "requires": { 1472 | "minimatch": "^3.0.4" 1473 | } 1474 | }, 1475 | "inflight": { 1476 | "version": "1.0.6", 1477 | "bundled": true, 1478 | "dev": true, 1479 | "optional": true, 1480 | "requires": { 1481 | "once": "^1.3.0", 1482 | "wrappy": "1" 1483 | } 1484 | }, 1485 | "inherits": { 1486 | "version": "2.0.3", 1487 | "bundled": true, 1488 | "dev": true 1489 | }, 1490 | "ini": { 1491 | "version": "1.3.5", 1492 | "bundled": true, 1493 | "dev": true, 1494 | "optional": true 1495 | }, 1496 | "is-fullwidth-code-point": { 1497 | "version": "1.0.0", 1498 | "bundled": true, 1499 | "dev": true, 1500 | "requires": { 1501 | "number-is-nan": "^1.0.0" 1502 | } 1503 | }, 1504 | "isarray": { 1505 | "version": "1.0.0", 1506 | "bundled": true, 1507 | "dev": true, 1508 | "optional": true 1509 | }, 1510 | "minimatch": { 1511 | "version": "3.0.4", 1512 | "bundled": true, 1513 | "dev": true, 1514 | "requires": { 1515 | "brace-expansion": "^1.1.7" 1516 | } 1517 | }, 1518 | "minimist": { 1519 | "version": "0.0.8", 1520 | "bundled": true, 1521 | "dev": true 1522 | }, 1523 | "minipass": { 1524 | "version": "2.2.4", 1525 | "bundled": true, 1526 | "dev": true, 1527 | "requires": { 1528 | "safe-buffer": "^5.1.1", 1529 | "yallist": "^3.0.0" 1530 | } 1531 | }, 1532 | "minizlib": { 1533 | "version": "1.1.0", 1534 | "bundled": true, 1535 | "dev": true, 1536 | "optional": true, 1537 | "requires": { 1538 | "minipass": "^2.2.1" 1539 | } 1540 | }, 1541 | "mkdirp": { 1542 | "version": "0.5.1", 1543 | "bundled": true, 1544 | "dev": true, 1545 | "requires": { 1546 | "minimist": "0.0.8" 1547 | } 1548 | }, 1549 | "ms": { 1550 | "version": "2.0.0", 1551 | "bundled": true, 1552 | "dev": true, 1553 | "optional": true 1554 | }, 1555 | "needle": { 1556 | "version": "2.2.0", 1557 | "bundled": true, 1558 | "dev": true, 1559 | "optional": true, 1560 | "requires": { 1561 | "debug": "^2.1.2", 1562 | "iconv-lite": "^0.4.4", 1563 | "sax": "^1.2.4" 1564 | } 1565 | }, 1566 | "node-pre-gyp": { 1567 | "version": "0.10.0", 1568 | "bundled": true, 1569 | "dev": true, 1570 | "optional": true, 1571 | "requires": { 1572 | "detect-libc": "^1.0.2", 1573 | "mkdirp": "^0.5.1", 1574 | "needle": "^2.2.0", 1575 | "nopt": "^4.0.1", 1576 | "npm-packlist": "^1.1.6", 1577 | "npmlog": "^4.0.2", 1578 | "rc": "^1.1.7", 1579 | "rimraf": "^2.6.1", 1580 | "semver": "^5.3.0", 1581 | "tar": "^4" 1582 | } 1583 | }, 1584 | "nopt": { 1585 | "version": "4.0.1", 1586 | "bundled": true, 1587 | "dev": true, 1588 | "optional": true, 1589 | "requires": { 1590 | "abbrev": "1", 1591 | "osenv": "^0.1.4" 1592 | } 1593 | }, 1594 | "npm-bundled": { 1595 | "version": "1.0.3", 1596 | "bundled": true, 1597 | "dev": true, 1598 | "optional": true 1599 | }, 1600 | "npm-packlist": { 1601 | "version": "1.1.10", 1602 | "bundled": true, 1603 | "dev": true, 1604 | "optional": true, 1605 | "requires": { 1606 | "ignore-walk": "^3.0.1", 1607 | "npm-bundled": "^1.0.1" 1608 | } 1609 | }, 1610 | "npmlog": { 1611 | "version": "4.1.2", 1612 | "bundled": true, 1613 | "dev": true, 1614 | "optional": true, 1615 | "requires": { 1616 | "are-we-there-yet": "~1.1.2", 1617 | "console-control-strings": "~1.1.0", 1618 | "gauge": "~2.7.3", 1619 | "set-blocking": "~2.0.0" 1620 | } 1621 | }, 1622 | "number-is-nan": { 1623 | "version": "1.0.1", 1624 | "bundled": true, 1625 | "dev": true 1626 | }, 1627 | "object-assign": { 1628 | "version": "4.1.1", 1629 | "bundled": true, 1630 | "dev": true, 1631 | "optional": true 1632 | }, 1633 | "once": { 1634 | "version": "1.4.0", 1635 | "bundled": true, 1636 | "dev": true, 1637 | "requires": { 1638 | "wrappy": "1" 1639 | } 1640 | }, 1641 | "os-homedir": { 1642 | "version": "1.0.2", 1643 | "bundled": true, 1644 | "dev": true, 1645 | "optional": true 1646 | }, 1647 | "os-tmpdir": { 1648 | "version": "1.0.2", 1649 | "bundled": true, 1650 | "dev": true, 1651 | "optional": true 1652 | }, 1653 | "osenv": { 1654 | "version": "0.1.5", 1655 | "bundled": true, 1656 | "dev": true, 1657 | "optional": true, 1658 | "requires": { 1659 | "os-homedir": "^1.0.0", 1660 | "os-tmpdir": "^1.0.0" 1661 | } 1662 | }, 1663 | "path-is-absolute": { 1664 | "version": "1.0.1", 1665 | "bundled": true, 1666 | "dev": true, 1667 | "optional": true 1668 | }, 1669 | "process-nextick-args": { 1670 | "version": "2.0.0", 1671 | "bundled": true, 1672 | "dev": true, 1673 | "optional": true 1674 | }, 1675 | "rc": { 1676 | "version": "1.2.7", 1677 | "bundled": true, 1678 | "dev": true, 1679 | "optional": true, 1680 | "requires": { 1681 | "deep-extend": "^0.5.1", 1682 | "ini": "~1.3.0", 1683 | "minimist": "^1.2.0", 1684 | "strip-json-comments": "~2.0.1" 1685 | }, 1686 | "dependencies": { 1687 | "minimist": { 1688 | "version": "1.2.0", 1689 | "bundled": true, 1690 | "dev": true, 1691 | "optional": true 1692 | } 1693 | } 1694 | }, 1695 | "readable-stream": { 1696 | "version": "2.3.6", 1697 | "bundled": true, 1698 | "dev": true, 1699 | "optional": true, 1700 | "requires": { 1701 | "core-util-is": "~1.0.0", 1702 | "inherits": "~2.0.3", 1703 | "isarray": "~1.0.0", 1704 | "process-nextick-args": "~2.0.0", 1705 | "safe-buffer": "~5.1.1", 1706 | "string_decoder": "~1.1.1", 1707 | "util-deprecate": "~1.0.1" 1708 | } 1709 | }, 1710 | "rimraf": { 1711 | "version": "2.6.2", 1712 | "bundled": true, 1713 | "dev": true, 1714 | "optional": true, 1715 | "requires": { 1716 | "glob": "^7.0.5" 1717 | } 1718 | }, 1719 | "safe-buffer": { 1720 | "version": "5.1.1", 1721 | "bundled": true, 1722 | "dev": true 1723 | }, 1724 | "safer-buffer": { 1725 | "version": "2.1.2", 1726 | "bundled": true, 1727 | "dev": true, 1728 | "optional": true 1729 | }, 1730 | "sax": { 1731 | "version": "1.2.4", 1732 | "bundled": true, 1733 | "dev": true, 1734 | "optional": true 1735 | }, 1736 | "semver": { 1737 | "version": "5.5.0", 1738 | "bundled": true, 1739 | "dev": true, 1740 | "optional": true 1741 | }, 1742 | "set-blocking": { 1743 | "version": "2.0.0", 1744 | "bundled": true, 1745 | "dev": true, 1746 | "optional": true 1747 | }, 1748 | "signal-exit": { 1749 | "version": "3.0.2", 1750 | "bundled": true, 1751 | "dev": true, 1752 | "optional": true 1753 | }, 1754 | "string-width": { 1755 | "version": "1.0.2", 1756 | "bundled": true, 1757 | "dev": true, 1758 | "requires": { 1759 | "code-point-at": "^1.0.0", 1760 | "is-fullwidth-code-point": "^1.0.0", 1761 | "strip-ansi": "^3.0.0" 1762 | } 1763 | }, 1764 | "string_decoder": { 1765 | "version": "1.1.1", 1766 | "bundled": true, 1767 | "dev": true, 1768 | "optional": true, 1769 | "requires": { 1770 | "safe-buffer": "~5.1.0" 1771 | } 1772 | }, 1773 | "strip-ansi": { 1774 | "version": "3.0.1", 1775 | "bundled": true, 1776 | "dev": true, 1777 | "requires": { 1778 | "ansi-regex": "^2.0.0" 1779 | } 1780 | }, 1781 | "strip-json-comments": { 1782 | "version": "2.0.1", 1783 | "bundled": true, 1784 | "dev": true, 1785 | "optional": true 1786 | }, 1787 | "tar": { 1788 | "version": "4.4.1", 1789 | "bundled": true, 1790 | "dev": true, 1791 | "optional": true, 1792 | "requires": { 1793 | "chownr": "^1.0.1", 1794 | "fs-minipass": "^1.2.5", 1795 | "minipass": "^2.2.4", 1796 | "minizlib": "^1.1.0", 1797 | "mkdirp": "^0.5.0", 1798 | "safe-buffer": "^5.1.1", 1799 | "yallist": "^3.0.2" 1800 | } 1801 | }, 1802 | "util-deprecate": { 1803 | "version": "1.0.2", 1804 | "bundled": true, 1805 | "dev": true, 1806 | "optional": true 1807 | }, 1808 | "wide-align": { 1809 | "version": "1.1.2", 1810 | "bundled": true, 1811 | "dev": true, 1812 | "optional": true, 1813 | "requires": { 1814 | "string-width": "^1.0.2" 1815 | } 1816 | }, 1817 | "wrappy": { 1818 | "version": "1.0.2", 1819 | "bundled": true, 1820 | "dev": true 1821 | }, 1822 | "yallist": { 1823 | "version": "3.0.2", 1824 | "bundled": true, 1825 | "dev": true 1826 | } 1827 | } 1828 | }, 1829 | "get-caller-file": { 1830 | "version": "1.0.2", 1831 | "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.2.tgz", 1832 | "integrity": "sha1-9wLmMSfn4jHBYKgMFVSstw1QR+U=", 1833 | "dev": true 1834 | }, 1835 | "get-stdin": { 1836 | "version": "4.0.1", 1837 | "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz", 1838 | "integrity": "sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4=", 1839 | "dev": true 1840 | }, 1841 | "get-stream": { 1842 | "version": "3.0.0", 1843 | "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", 1844 | "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=", 1845 | "dev": true 1846 | }, 1847 | "glob": { 1848 | "version": "7.1.2", 1849 | "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", 1850 | "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", 1851 | "dev": true, 1852 | "requires": { 1853 | "fs.realpath": "^1.0.0", 1854 | "inflight": "^1.0.4", 1855 | "inherits": "2", 1856 | "minimatch": "^3.0.4", 1857 | "once": "^1.3.0", 1858 | "path-is-absolute": "^1.0.0" 1859 | } 1860 | }, 1861 | "glob-base": { 1862 | "version": "0.3.0", 1863 | "resolved": "https://registry.npmjs.org/glob-base/-/glob-base-0.3.0.tgz", 1864 | "integrity": "sha1-27Fk9iIbHAscz4Kuoyi0l98Oo8Q=", 1865 | "dev": true, 1866 | "requires": { 1867 | "glob-parent": "^2.0.0", 1868 | "is-glob": "^2.0.0" 1869 | } 1870 | }, 1871 | "glob-parent": { 1872 | "version": "2.0.0", 1873 | "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-2.0.0.tgz", 1874 | "integrity": "sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg=", 1875 | "dev": true, 1876 | "requires": { 1877 | "is-glob": "^2.0.0" 1878 | } 1879 | }, 1880 | "glob2base": { 1881 | "version": "0.0.12", 1882 | "resolved": "https://registry.npmjs.org/glob2base/-/glob2base-0.0.12.tgz", 1883 | "integrity": "sha1-nUGbPijxLoOjYhZKJ3BVkiycDVY=", 1884 | "dev": true, 1885 | "requires": { 1886 | "find-index": "^0.1.1" 1887 | } 1888 | }, 1889 | "global-dirs": { 1890 | "version": "0.1.1", 1891 | "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-0.1.1.tgz", 1892 | "integrity": "sha1-sxnA3UYH81PzvpzKTHL8FIxJ9EU=", 1893 | "dev": true, 1894 | "requires": { 1895 | "ini": "^1.3.4" 1896 | } 1897 | }, 1898 | "globby": { 1899 | "version": "6.1.0", 1900 | "resolved": "https://registry.npmjs.org/globby/-/globby-6.1.0.tgz", 1901 | "integrity": "sha1-9abXDoOV4hyFj7BInWTfAkJNUGw=", 1902 | "dev": true, 1903 | "requires": { 1904 | "array-union": "^1.0.1", 1905 | "glob": "^7.0.3", 1906 | "object-assign": "^4.0.1", 1907 | "pify": "^2.0.0", 1908 | "pinkie-promise": "^2.0.0" 1909 | } 1910 | }, 1911 | "got": { 1912 | "version": "6.7.1", 1913 | "resolved": "https://registry.npmjs.org/got/-/got-6.7.1.tgz", 1914 | "integrity": "sha1-JAzQV4WpoY5WHcG0S0HHY+8ejbA=", 1915 | "dev": true, 1916 | "requires": { 1917 | "create-error-class": "^3.0.0", 1918 | "duplexer3": "^0.1.4", 1919 | "get-stream": "^3.0.0", 1920 | "is-redirect": "^1.0.0", 1921 | "is-retry-allowed": "^1.0.0", 1922 | "is-stream": "^1.0.0", 1923 | "lowercase-keys": "^1.0.0", 1924 | "safe-buffer": "^5.0.1", 1925 | "timed-out": "^4.0.0", 1926 | "unzip-response": "^2.0.1", 1927 | "url-parse-lax": "^1.0.0" 1928 | } 1929 | }, 1930 | "graceful-fs": { 1931 | "version": "4.1.11", 1932 | "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", 1933 | "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=", 1934 | "dev": true 1935 | }, 1936 | "gzip-size": { 1937 | "version": "3.0.0", 1938 | "resolved": "https://registry.npmjs.org/gzip-size/-/gzip-size-3.0.0.tgz", 1939 | "integrity": "sha1-VGGI6b3DN/Zzdy+BZgRks4nc5SA=", 1940 | "dev": true, 1941 | "requires": { 1942 | "duplexer": "^0.1.1" 1943 | } 1944 | }, 1945 | "has-ansi": { 1946 | "version": "2.0.0", 1947 | "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", 1948 | "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", 1949 | "dev": true, 1950 | "requires": { 1951 | "ansi-regex": "^2.0.0" 1952 | } 1953 | }, 1954 | "has-binary2": { 1955 | "version": "1.0.3", 1956 | "resolved": "https://registry.npmjs.org/has-binary2/-/has-binary2-1.0.3.tgz", 1957 | "integrity": "sha512-G1LWKhDSvhGeAQ8mPVQlqNcOB2sJdwATtZKl2pDKKHfpf/rYj24lkinxf69blJbnsvtqqNU+L3SL50vzZhXOnw==", 1958 | "dev": true, 1959 | "requires": { 1960 | "isarray": "2.0.1" 1961 | }, 1962 | "dependencies": { 1963 | "isarray": { 1964 | "version": "2.0.1", 1965 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.1.tgz", 1966 | "integrity": "sha1-o32U7ZzaLVmGXJ92/llu4fM4dB4=", 1967 | "dev": true 1968 | } 1969 | } 1970 | }, 1971 | "has-cors": { 1972 | "version": "1.1.0", 1973 | "resolved": "https://registry.npmjs.org/has-cors/-/has-cors-1.1.0.tgz", 1974 | "integrity": "sha1-XkdHk/fqmEPRu5nCPu9J/xJv/zk=", 1975 | "dev": true 1976 | }, 1977 | "has-flag": { 1978 | "version": "3.0.0", 1979 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", 1980 | "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", 1981 | "dev": true 1982 | }, 1983 | "hosted-git-info": { 1984 | "version": "2.5.0", 1985 | "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.5.0.tgz", 1986 | "integrity": "sha512-pNgbURSuab90KbTqvRPsseaTxOJCZBD0a7t+haSN33piP9cCM4l0CqdzAif2hUqm716UovKB2ROmiabGAKVXyg==", 1987 | "dev": true 1988 | }, 1989 | "http-errors": { 1990 | "version": "1.6.3", 1991 | "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", 1992 | "integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=", 1993 | "dev": true, 1994 | "requires": { 1995 | "depd": "~1.1.2", 1996 | "inherits": "2.0.3", 1997 | "setprototypeof": "1.1.0", 1998 | "statuses": ">= 1.4.0 < 2" 1999 | }, 2000 | "dependencies": { 2001 | "statuses": { 2002 | "version": "1.5.0", 2003 | "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", 2004 | "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=", 2005 | "dev": true 2006 | } 2007 | } 2008 | }, 2009 | "http-proxy": { 2010 | "version": "1.15.2", 2011 | "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.15.2.tgz", 2012 | "integrity": "sha1-ZC/cr/5S00SNK9o7AHnpQJBk2jE=", 2013 | "dev": true, 2014 | "requires": { 2015 | "eventemitter3": "1.x.x", 2016 | "requires-port": "1.x.x" 2017 | } 2018 | }, 2019 | "iconv-lite": { 2020 | "version": "0.4.23", 2021 | "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.23.tgz", 2022 | "integrity": "sha512-neyTUVFtahjf0mB3dZT77u+8O0QB89jFdnBkd5P1JgYPbPaia3gXXOVL2fq8VyU2gMMD7SaN7QukTB/pmXYvDA==", 2023 | "dev": true, 2024 | "requires": { 2025 | "safer-buffer": ">= 2.1.2 < 3" 2026 | } 2027 | }, 2028 | "immutable": { 2029 | "version": "3.8.2", 2030 | "resolved": "https://registry.npmjs.org/immutable/-/immutable-3.8.2.tgz", 2031 | "integrity": "sha1-wkOZUUVbs5kT2vKBN28VMOEErfM=", 2032 | "dev": true 2033 | }, 2034 | "import-lazy": { 2035 | "version": "2.1.0", 2036 | "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-2.1.0.tgz", 2037 | "integrity": "sha1-BWmOPUXIjo1+nZLLBYTnfwlvPkM=", 2038 | "dev": true 2039 | }, 2040 | "imurmurhash": { 2041 | "version": "0.1.4", 2042 | "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", 2043 | "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", 2044 | "dev": true 2045 | }, 2046 | "indent-string": { 2047 | "version": "2.1.0", 2048 | "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-2.1.0.tgz", 2049 | "integrity": "sha1-ji1INIdCEhtKghi3oTfppSBJ3IA=", 2050 | "dev": true, 2051 | "requires": { 2052 | "repeating": "^2.0.0" 2053 | } 2054 | }, 2055 | "indexof": { 2056 | "version": "0.0.1", 2057 | "resolved": "https://registry.npmjs.org/indexof/-/indexof-0.0.1.tgz", 2058 | "integrity": "sha1-gtwzbSMrkGIXnQWrMpOmYFn9Q10=", 2059 | "dev": true 2060 | }, 2061 | "inflight": { 2062 | "version": "1.0.6", 2063 | "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", 2064 | "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", 2065 | "dev": true, 2066 | "requires": { 2067 | "once": "^1.3.0", 2068 | "wrappy": "1" 2069 | } 2070 | }, 2071 | "inherits": { 2072 | "version": "2.0.3", 2073 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", 2074 | "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", 2075 | "dev": true 2076 | }, 2077 | "ini": { 2078 | "version": "1.3.5", 2079 | "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz", 2080 | "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==", 2081 | "dev": true 2082 | }, 2083 | "invert-kv": { 2084 | "version": "1.0.0", 2085 | "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz", 2086 | "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY=", 2087 | "dev": true 2088 | }, 2089 | "is-arrayish": { 2090 | "version": "0.2.1", 2091 | "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", 2092 | "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", 2093 | "dev": true 2094 | }, 2095 | "is-binary-path": { 2096 | "version": "1.0.1", 2097 | "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", 2098 | "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", 2099 | "dev": true, 2100 | "requires": { 2101 | "binary-extensions": "^1.0.0" 2102 | } 2103 | }, 2104 | "is-buffer": { 2105 | "version": "1.1.6", 2106 | "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", 2107 | "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", 2108 | "dev": true 2109 | }, 2110 | "is-builtin-module": { 2111 | "version": "1.0.0", 2112 | "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-1.0.0.tgz", 2113 | "integrity": "sha1-VAVy0096wxGfj3bDDLwbHgN6/74=", 2114 | "dev": true, 2115 | "requires": { 2116 | "builtin-modules": "^1.0.0" 2117 | } 2118 | }, 2119 | "is-ci": { 2120 | "version": "1.1.0", 2121 | "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-1.1.0.tgz", 2122 | "integrity": "sha512-c7TnwxLePuqIlxHgr7xtxzycJPegNHFuIrBkwbf8hc58//+Op1CqFkyS+xnIMkwn9UsJIwc174BIjkyBmSpjKg==", 2123 | "dev": true, 2124 | "requires": { 2125 | "ci-info": "^1.0.0" 2126 | } 2127 | }, 2128 | "is-dotfile": { 2129 | "version": "1.0.3", 2130 | "resolved": "https://registry.npmjs.org/is-dotfile/-/is-dotfile-1.0.3.tgz", 2131 | "integrity": "sha1-pqLzL/0t+wT1yiXs0Pa4PPeYoeE=", 2132 | "dev": true 2133 | }, 2134 | "is-equal-shallow": { 2135 | "version": "0.1.3", 2136 | "resolved": "https://registry.npmjs.org/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz", 2137 | "integrity": "sha1-IjgJj8Ih3gvPpdnqxMRdY4qhxTQ=", 2138 | "dev": true, 2139 | "requires": { 2140 | "is-primitive": "^2.0.0" 2141 | } 2142 | }, 2143 | "is-extendable": { 2144 | "version": "0.1.1", 2145 | "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", 2146 | "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", 2147 | "dev": true 2148 | }, 2149 | "is-extglob": { 2150 | "version": "1.0.0", 2151 | "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", 2152 | "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", 2153 | "dev": true 2154 | }, 2155 | "is-finite": { 2156 | "version": "1.0.2", 2157 | "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.0.2.tgz", 2158 | "integrity": "sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko=", 2159 | "dev": true, 2160 | "requires": { 2161 | "number-is-nan": "^1.0.0" 2162 | } 2163 | }, 2164 | "is-fullwidth-code-point": { 2165 | "version": "1.0.0", 2166 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", 2167 | "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", 2168 | "dev": true, 2169 | "requires": { 2170 | "number-is-nan": "^1.0.0" 2171 | } 2172 | }, 2173 | "is-glob": { 2174 | "version": "2.0.1", 2175 | "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", 2176 | "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", 2177 | "dev": true, 2178 | "requires": { 2179 | "is-extglob": "^1.0.0" 2180 | } 2181 | }, 2182 | "is-installed-globally": { 2183 | "version": "0.1.0", 2184 | "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.1.0.tgz", 2185 | "integrity": "sha1-Df2Y9akRFxbdU13aZJL2e/PSWoA=", 2186 | "dev": true, 2187 | "requires": { 2188 | "global-dirs": "^0.1.0", 2189 | "is-path-inside": "^1.0.0" 2190 | } 2191 | }, 2192 | "is-module": { 2193 | "version": "1.0.0", 2194 | "resolved": "https://registry.npmjs.org/is-module/-/is-module-1.0.0.tgz", 2195 | "integrity": "sha1-Mlj7afeMFNW4FdZkM2tM/7ZEFZE=", 2196 | "dev": true 2197 | }, 2198 | "is-npm": { 2199 | "version": "1.0.0", 2200 | "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-1.0.0.tgz", 2201 | "integrity": "sha1-8vtjpl5JBbQGyGBydloaTceTufQ=", 2202 | "dev": true 2203 | }, 2204 | "is-number": { 2205 | "version": "2.1.0", 2206 | "resolved": "https://registry.npmjs.org/is-number/-/is-number-2.1.0.tgz", 2207 | "integrity": "sha1-Afy7s5NGOlSPL0ZszhbezknbkI8=", 2208 | "dev": true, 2209 | "requires": { 2210 | "kind-of": "^3.0.2" 2211 | } 2212 | }, 2213 | "is-number-like": { 2214 | "version": "1.0.8", 2215 | "resolved": "https://registry.npmjs.org/is-number-like/-/is-number-like-1.0.8.tgz", 2216 | "integrity": "sha512-6rZi3ezCyFcn5L71ywzz2bS5b2Igl1En3eTlZlvKjpz1n3IZLAYMbKYAIQgFmEu0GENg92ziU/faEOA/aixjbA==", 2217 | "dev": true, 2218 | "requires": { 2219 | "lodash.isfinite": "^3.3.2" 2220 | } 2221 | }, 2222 | "is-obj": { 2223 | "version": "1.0.1", 2224 | "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", 2225 | "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=", 2226 | "dev": true 2227 | }, 2228 | "is-path-cwd": { 2229 | "version": "1.0.0", 2230 | "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-1.0.0.tgz", 2231 | "integrity": "sha1-0iXsIxMuie3Tj9p2dHLmLmXxEG0=", 2232 | "dev": true 2233 | }, 2234 | "is-path-in-cwd": { 2235 | "version": "1.0.1", 2236 | "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-1.0.1.tgz", 2237 | "integrity": "sha512-FjV1RTW48E7CWM7eE/J2NJvAEEVektecDBVBE5Hh3nM1Jd0kvhHtX68Pr3xsDf857xt3Y4AkwVULK1Vku62aaQ==", 2238 | "dev": true, 2239 | "requires": { 2240 | "is-path-inside": "^1.0.0" 2241 | } 2242 | }, 2243 | "is-path-inside": { 2244 | "version": "1.0.1", 2245 | "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-1.0.1.tgz", 2246 | "integrity": "sha1-jvW33lBDej/cprToZe96pVy0gDY=", 2247 | "dev": true, 2248 | "requires": { 2249 | "path-is-inside": "^1.0.1" 2250 | } 2251 | }, 2252 | "is-posix-bracket": { 2253 | "version": "0.1.1", 2254 | "resolved": "https://registry.npmjs.org/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz", 2255 | "integrity": "sha1-MzTceXdDaOkvAW5vvAqI9c1ua8Q=", 2256 | "dev": true 2257 | }, 2258 | "is-primitive": { 2259 | "version": "2.0.0", 2260 | "resolved": "https://registry.npmjs.org/is-primitive/-/is-primitive-2.0.0.tgz", 2261 | "integrity": "sha1-IHurkWOEmcB7Kt8kCkGochADRXU=", 2262 | "dev": true 2263 | }, 2264 | "is-redirect": { 2265 | "version": "1.0.0", 2266 | "resolved": "https://registry.npmjs.org/is-redirect/-/is-redirect-1.0.0.tgz", 2267 | "integrity": "sha1-HQPd7VO9jbDzDCbk+V02/HyH3CQ=", 2268 | "dev": true 2269 | }, 2270 | "is-retry-allowed": { 2271 | "version": "1.1.0", 2272 | "resolved": "https://registry.npmjs.org/is-retry-allowed/-/is-retry-allowed-1.1.0.tgz", 2273 | "integrity": "sha1-EaBgVotnM5REAz0BJaYaINVk+zQ=", 2274 | "dev": true 2275 | }, 2276 | "is-stream": { 2277 | "version": "1.1.0", 2278 | "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", 2279 | "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", 2280 | "dev": true 2281 | }, 2282 | "is-utf8": { 2283 | "version": "0.2.1", 2284 | "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", 2285 | "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=", 2286 | "dev": true 2287 | }, 2288 | "isarray": { 2289 | "version": "1.0.0", 2290 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", 2291 | "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", 2292 | "dev": true 2293 | }, 2294 | "isexe": { 2295 | "version": "2.0.0", 2296 | "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", 2297 | "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", 2298 | "dev": true 2299 | }, 2300 | "isobject": { 2301 | "version": "2.1.0", 2302 | "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", 2303 | "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", 2304 | "dev": true, 2305 | "requires": { 2306 | "isarray": "1.0.0" 2307 | } 2308 | }, 2309 | "js-tokens": { 2310 | "version": "3.0.2", 2311 | "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz", 2312 | "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=", 2313 | "dev": true 2314 | }, 2315 | "js-yaml": { 2316 | "version": "3.11.0", 2317 | "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.11.0.tgz", 2318 | "integrity": "sha512-saJstZWv7oNeOyBh3+Dx1qWzhW0+e6/8eDzo7p5rDFqxntSztloLtuKu+Ejhtq82jsilwOIZYsCz+lIjthg1Hw==", 2319 | "dev": true, 2320 | "requires": { 2321 | "argparse": "^1.0.7", 2322 | "esprima": "^4.0.0" 2323 | } 2324 | }, 2325 | "jsonfile": { 2326 | "version": "3.0.1", 2327 | "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-3.0.1.tgz", 2328 | "integrity": "sha1-pezG9l9T9mLEQVx2daAzHQmS7GY=", 2329 | "dev": true, 2330 | "requires": { 2331 | "graceful-fs": "^4.1.6" 2332 | } 2333 | }, 2334 | "jsonify": { 2335 | "version": "0.0.0", 2336 | "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz", 2337 | "integrity": "sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM=", 2338 | "dev": true 2339 | }, 2340 | "kind-of": { 2341 | "version": "3.2.2", 2342 | "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", 2343 | "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", 2344 | "dev": true, 2345 | "requires": { 2346 | "is-buffer": "^1.1.5" 2347 | } 2348 | }, 2349 | "latest-version": { 2350 | "version": "3.1.0", 2351 | "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-3.1.0.tgz", 2352 | "integrity": "sha1-ogU4P+oyKzO1rjsYq+4NwvNW7hU=", 2353 | "dev": true, 2354 | "requires": { 2355 | "package-json": "^4.0.0" 2356 | } 2357 | }, 2358 | "lazy-cache": { 2359 | "version": "1.0.4", 2360 | "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-1.0.4.tgz", 2361 | "integrity": "sha1-odePw6UEdMuAhF07O24dpJpEbo4=", 2362 | "dev": true 2363 | }, 2364 | "lcid": { 2365 | "version": "1.0.0", 2366 | "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz", 2367 | "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=", 2368 | "dev": true, 2369 | "requires": { 2370 | "invert-kv": "^1.0.0" 2371 | } 2372 | }, 2373 | "limiter": { 2374 | "version": "1.1.3", 2375 | "resolved": "https://registry.npmjs.org/limiter/-/limiter-1.1.3.tgz", 2376 | "integrity": "sha512-zrycnIMsLw/3ZxTbW7HCez56rcFGecWTx5OZNplzcXUUmJLmoYArC6qdJzmAN5BWiNXGcpjhF9RQ1HSv5zebEw==", 2377 | "dev": true 2378 | }, 2379 | "load-json-file": { 2380 | "version": "1.1.0", 2381 | "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", 2382 | "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=", 2383 | "dev": true, 2384 | "requires": { 2385 | "graceful-fs": "^4.1.2", 2386 | "parse-json": "^2.2.0", 2387 | "pify": "^2.0.0", 2388 | "pinkie-promise": "^2.0.0", 2389 | "strip-bom": "^2.0.0" 2390 | } 2391 | }, 2392 | "localtunnel": { 2393 | "version": "1.9.0", 2394 | "resolved": "https://registry.npmjs.org/localtunnel/-/localtunnel-1.9.0.tgz", 2395 | "integrity": "sha512-wCIiIHJ8kKIcWkTQE3m1VRABvsH2ZuOkiOpZUofUCf6Q42v3VIZ+Q0YfX1Z4sYDRj0muiKL1bLvz1FeoxsPO0w==", 2396 | "dev": true, 2397 | "requires": { 2398 | "axios": "0.17.1", 2399 | "debug": "2.6.8", 2400 | "openurl": "1.1.1", 2401 | "yargs": "6.6.0" 2402 | }, 2403 | "dependencies": { 2404 | "camelcase": { 2405 | "version": "3.0.0", 2406 | "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz", 2407 | "integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo=", 2408 | "dev": true 2409 | }, 2410 | "debug": { 2411 | "version": "2.6.8", 2412 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.8.tgz", 2413 | "integrity": "sha1-5zFTHKLt4n0YgiJCfaF4IdaP9Pw=", 2414 | "dev": true, 2415 | "requires": { 2416 | "ms": "2.0.0" 2417 | } 2418 | }, 2419 | "yargs": { 2420 | "version": "6.6.0", 2421 | "resolved": "https://registry.npmjs.org/yargs/-/yargs-6.6.0.tgz", 2422 | "integrity": "sha1-eC7CHvQDNF+DCoCMo9UTr1YGUgg=", 2423 | "dev": true, 2424 | "requires": { 2425 | "camelcase": "^3.0.0", 2426 | "cliui": "^3.2.0", 2427 | "decamelize": "^1.1.1", 2428 | "get-caller-file": "^1.0.1", 2429 | "os-locale": "^1.4.0", 2430 | "read-pkg-up": "^1.0.1", 2431 | "require-directory": "^2.1.1", 2432 | "require-main-filename": "^1.0.1", 2433 | "set-blocking": "^2.0.0", 2434 | "string-width": "^1.0.2", 2435 | "which-module": "^1.0.0", 2436 | "y18n": "^3.2.1", 2437 | "yargs-parser": "^4.2.0" 2438 | } 2439 | } 2440 | } 2441 | }, 2442 | "lodash": { 2443 | "version": "3.10.1", 2444 | "resolved": "https://registry.npmjs.org/lodash/-/lodash-3.10.1.tgz", 2445 | "integrity": "sha1-W/Rejkm6QYnhfUgnid/RW9FAt7Y=", 2446 | "dev": true 2447 | }, 2448 | "lodash.isfinite": { 2449 | "version": "3.3.2", 2450 | "resolved": "https://registry.npmjs.org/lodash.isfinite/-/lodash.isfinite-3.3.2.tgz", 2451 | "integrity": "sha1-+4m2WpqAKBgz8LdHizpRBPiY67M=", 2452 | "dev": true 2453 | }, 2454 | "longest": { 2455 | "version": "1.0.1", 2456 | "resolved": "https://registry.npmjs.org/longest/-/longest-1.0.1.tgz", 2457 | "integrity": "sha1-MKCy2jj3N3DoKUoNIuZiXtd9AJc=", 2458 | "dev": true 2459 | }, 2460 | "loud-rejection": { 2461 | "version": "1.6.0", 2462 | "resolved": "https://registry.npmjs.org/loud-rejection/-/loud-rejection-1.6.0.tgz", 2463 | "integrity": "sha1-W0b4AUft7leIcPCG0Eghz5mOVR8=", 2464 | "dev": true, 2465 | "requires": { 2466 | "currently-unhandled": "^0.4.1", 2467 | "signal-exit": "^3.0.0" 2468 | } 2469 | }, 2470 | "lowercase-keys": { 2471 | "version": "1.0.1", 2472 | "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz", 2473 | "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==", 2474 | "dev": true 2475 | }, 2476 | "lru-cache": { 2477 | "version": "4.1.3", 2478 | "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.3.tgz", 2479 | "integrity": "sha512-fFEhvcgzuIoJVUF8fYr5KR0YqxD238zgObTps31YdADwPPAp82a4M8TrckkWyx7ekNlf9aBcVn81cFwwXngrJA==", 2480 | "dev": true, 2481 | "requires": { 2482 | "pseudomap": "^1.0.2", 2483 | "yallist": "^2.1.2" 2484 | } 2485 | }, 2486 | "magic-string": { 2487 | "version": "0.22.5", 2488 | "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.22.5.tgz", 2489 | "integrity": "sha512-oreip9rJZkzvA8Qzk9HFs8fZGF/u7H/gtrE8EN6RjKJ9kh2HlC+yQ2QezifqTZfGyiuAV0dRv5a+y/8gBb1m9w==", 2490 | "dev": true, 2491 | "requires": { 2492 | "vlq": "^0.2.2" 2493 | } 2494 | }, 2495 | "make-dir": { 2496 | "version": "1.3.0", 2497 | "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.3.0.tgz", 2498 | "integrity": "sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==", 2499 | "dev": true, 2500 | "requires": { 2501 | "pify": "^3.0.0" 2502 | }, 2503 | "dependencies": { 2504 | "pify": { 2505 | "version": "3.0.0", 2506 | "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", 2507 | "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", 2508 | "dev": true 2509 | } 2510 | } 2511 | }, 2512 | "map-obj": { 2513 | "version": "1.0.1", 2514 | "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", 2515 | "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=", 2516 | "dev": true 2517 | }, 2518 | "math-random": { 2519 | "version": "1.0.1", 2520 | "resolved": "https://registry.npmjs.org/math-random/-/math-random-1.0.1.tgz", 2521 | "integrity": "sha1-izqsWIuKZuSXXjzepn97sylgH6w=", 2522 | "dev": true 2523 | }, 2524 | "meow": { 2525 | "version": "3.7.0", 2526 | "resolved": "https://registry.npmjs.org/meow/-/meow-3.7.0.tgz", 2527 | "integrity": "sha1-cstmi0JSKCkKu/qFaJJYcwioAfs=", 2528 | "dev": true, 2529 | "requires": { 2530 | "camelcase-keys": "^2.0.0", 2531 | "decamelize": "^1.1.2", 2532 | "loud-rejection": "^1.0.0", 2533 | "map-obj": "^1.0.1", 2534 | "minimist": "^1.1.3", 2535 | "normalize-package-data": "^2.3.4", 2536 | "object-assign": "^4.0.1", 2537 | "read-pkg-up": "^1.0.1", 2538 | "redent": "^1.0.0", 2539 | "trim-newlines": "^1.0.0" 2540 | } 2541 | }, 2542 | "micromatch": { 2543 | "version": "2.3.11", 2544 | "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz", 2545 | "integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=", 2546 | "dev": true, 2547 | "requires": { 2548 | "arr-diff": "^2.0.0", 2549 | "array-unique": "^0.2.1", 2550 | "braces": "^1.8.2", 2551 | "expand-brackets": "^0.1.4", 2552 | "extglob": "^0.3.1", 2553 | "filename-regex": "^2.0.0", 2554 | "is-extglob": "^1.0.0", 2555 | "is-glob": "^2.0.1", 2556 | "kind-of": "^3.0.2", 2557 | "normalize-path": "^2.0.1", 2558 | "object.omit": "^2.0.0", 2559 | "parse-glob": "^3.0.4", 2560 | "regex-cache": "^0.4.2" 2561 | } 2562 | }, 2563 | "mime": { 2564 | "version": "1.4.1", 2565 | "resolved": "https://registry.npmjs.org/mime/-/mime-1.4.1.tgz", 2566 | "integrity": "sha512-KI1+qOZu5DcW6wayYHSzR/tXKCDC5Om4s1z2QJjDULzLcmf3DvzS7oluY4HCTrc+9FiKmWUgeNLg7W3uIQvxtQ==", 2567 | "dev": true 2568 | }, 2569 | "mime-db": { 2570 | "version": "1.33.0", 2571 | "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.33.0.tgz", 2572 | "integrity": "sha512-BHJ/EKruNIqJf/QahvxwQZXKygOQ256myeN/Ew+THcAa5q+PjyTTMMeNQC4DZw5AwfvelsUrA6B67NKMqXDbzQ==", 2573 | "dev": true 2574 | }, 2575 | "mime-types": { 2576 | "version": "2.1.18", 2577 | "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.18.tgz", 2578 | "integrity": "sha512-lc/aahn+t4/SWV/qcmumYjymLsWfN3ELhpmVuUFjgsORruuZPVSwAQryq+HHGvO/SI2KVX26bx+En+zhM8g8hQ==", 2579 | "dev": true, 2580 | "requires": { 2581 | "mime-db": "~1.33.0" 2582 | } 2583 | }, 2584 | "minimatch": { 2585 | "version": "3.0.4", 2586 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", 2587 | "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", 2588 | "dev": true, 2589 | "requires": { 2590 | "brace-expansion": "^1.1.7" 2591 | } 2592 | }, 2593 | "minimist": { 2594 | "version": "1.2.0", 2595 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", 2596 | "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", 2597 | "dev": true 2598 | }, 2599 | "mkdirp": { 2600 | "version": "0.5.1", 2601 | "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", 2602 | "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", 2603 | "dev": true, 2604 | "requires": { 2605 | "minimist": "0.0.8" 2606 | }, 2607 | "dependencies": { 2608 | "minimist": { 2609 | "version": "0.0.8", 2610 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", 2611 | "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", 2612 | "dev": true 2613 | } 2614 | } 2615 | }, 2616 | "ms": { 2617 | "version": "2.0.0", 2618 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", 2619 | "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", 2620 | "dev": true 2621 | }, 2622 | "nan": { 2623 | "version": "2.10.0", 2624 | "resolved": "https://registry.npmjs.org/nan/-/nan-2.10.0.tgz", 2625 | "integrity": "sha512-bAdJv7fBLhWC+/Bls0Oza+mvTaNQtP+1RyhhhvD95pgUJz6XM5IzgmxOkItJ9tkoCiplvAnXI1tNmmUD/eScyA==", 2626 | "dev": true, 2627 | "optional": true 2628 | }, 2629 | "negotiator": { 2630 | "version": "0.6.1", 2631 | "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.1.tgz", 2632 | "integrity": "sha1-KzJxhOiZIQEXeyhWP7XnECrNDKk=", 2633 | "dev": true 2634 | }, 2635 | "normalize-package-data": { 2636 | "version": "2.4.0", 2637 | "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.4.0.tgz", 2638 | "integrity": "sha512-9jjUFbTPfEy3R/ad/2oNbKtW9Hgovl5O1FvFWKkKblNXoN/Oou6+9+KKohPK13Yc3/TyunyWhJp6gvRNR/PPAw==", 2639 | "dev": true, 2640 | "requires": { 2641 | "hosted-git-info": "^2.1.4", 2642 | "is-builtin-module": "^1.0.0", 2643 | "semver": "2 || 3 || 4 || 5", 2644 | "validate-npm-package-license": "^3.0.1" 2645 | } 2646 | }, 2647 | "normalize-path": { 2648 | "version": "2.1.1", 2649 | "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", 2650 | "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", 2651 | "dev": true, 2652 | "requires": { 2653 | "remove-trailing-separator": "^1.0.1" 2654 | } 2655 | }, 2656 | "npm-run-path": { 2657 | "version": "2.0.2", 2658 | "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", 2659 | "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", 2660 | "dev": true, 2661 | "requires": { 2662 | "path-key": "^2.0.0" 2663 | } 2664 | }, 2665 | "number-is-nan": { 2666 | "version": "1.0.1", 2667 | "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", 2668 | "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", 2669 | "dev": true 2670 | }, 2671 | "object-assign": { 2672 | "version": "4.1.1", 2673 | "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", 2674 | "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", 2675 | "dev": true 2676 | }, 2677 | "object-component": { 2678 | "version": "0.0.3", 2679 | "resolved": "https://registry.npmjs.org/object-component/-/object-component-0.0.3.tgz", 2680 | "integrity": "sha1-8MaapQ78lbhmwYb0AKM3acsvEpE=", 2681 | "dev": true 2682 | }, 2683 | "object-path": { 2684 | "version": "0.9.2", 2685 | "resolved": "https://registry.npmjs.org/object-path/-/object-path-0.9.2.tgz", 2686 | "integrity": "sha1-D9mnT8X60a45aLWGvaXGMr1sBaU=", 2687 | "dev": true 2688 | }, 2689 | "object.omit": { 2690 | "version": "2.0.1", 2691 | "resolved": "https://registry.npmjs.org/object.omit/-/object.omit-2.0.1.tgz", 2692 | "integrity": "sha1-Gpx0SCnznbuFjHbKNXmuKlTr0fo=", 2693 | "dev": true, 2694 | "requires": { 2695 | "for-own": "^0.1.4", 2696 | "is-extendable": "^0.1.1" 2697 | } 2698 | }, 2699 | "on-finished": { 2700 | "version": "2.3.0", 2701 | "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", 2702 | "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", 2703 | "dev": true, 2704 | "requires": { 2705 | "ee-first": "1.1.1" 2706 | } 2707 | }, 2708 | "once": { 2709 | "version": "1.4.0", 2710 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", 2711 | "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", 2712 | "dev": true, 2713 | "requires": { 2714 | "wrappy": "1" 2715 | } 2716 | }, 2717 | "open": { 2718 | "version": "0.0.5", 2719 | "resolved": "https://registry.npmjs.org/open/-/open-0.0.5.tgz", 2720 | "integrity": "sha1-QsPhjslUZra/DcQvOilFw/DK2Pw=", 2721 | "dev": true 2722 | }, 2723 | "openurl": { 2724 | "version": "1.1.1", 2725 | "resolved": "https://registry.npmjs.org/openurl/-/openurl-1.1.1.tgz", 2726 | "integrity": "sha1-OHW0sO96UsFW8NtB1GCduw+Us4c=", 2727 | "dev": true 2728 | }, 2729 | "opn": { 2730 | "version": "4.0.2", 2731 | "resolved": "https://registry.npmjs.org/opn/-/opn-4.0.2.tgz", 2732 | "integrity": "sha1-erwi5kTf9jsKltWrfyeQwPAavJU=", 2733 | "dev": true, 2734 | "requires": { 2735 | "object-assign": "^4.0.1", 2736 | "pinkie-promise": "^2.0.0" 2737 | } 2738 | }, 2739 | "os-locale": { 2740 | "version": "1.4.0", 2741 | "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz", 2742 | "integrity": "sha1-IPnxeuKe00XoveWDsT0gCYA8FNk=", 2743 | "dev": true, 2744 | "requires": { 2745 | "lcid": "^1.0.0" 2746 | } 2747 | }, 2748 | "os-tmpdir": { 2749 | "version": "1.0.2", 2750 | "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", 2751 | "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", 2752 | "dev": true 2753 | }, 2754 | "p-finally": { 2755 | "version": "1.0.0", 2756 | "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", 2757 | "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=", 2758 | "dev": true 2759 | }, 2760 | "p-map": { 2761 | "version": "1.2.0", 2762 | "resolved": "https://registry.npmjs.org/p-map/-/p-map-1.2.0.tgz", 2763 | "integrity": "sha512-r6zKACMNhjPJMTl8KcFH4li//gkrXWfbD6feV8l6doRHlzljFWGJ2AP6iKaCJXyZmAUMOPtvbW7EXkbWO/pLEA==", 2764 | "dev": true 2765 | }, 2766 | "package-json": { 2767 | "version": "4.0.1", 2768 | "resolved": "https://registry.npmjs.org/package-json/-/package-json-4.0.1.tgz", 2769 | "integrity": "sha1-iGmgQBJTZhxMTKPabCEh7VVfXu0=", 2770 | "dev": true, 2771 | "requires": { 2772 | "got": "^6.7.1", 2773 | "registry-auth-token": "^3.0.1", 2774 | "registry-url": "^3.0.3", 2775 | "semver": "^5.1.0" 2776 | } 2777 | }, 2778 | "parse-glob": { 2779 | "version": "3.0.4", 2780 | "resolved": "https://registry.npmjs.org/parse-glob/-/parse-glob-3.0.4.tgz", 2781 | "integrity": "sha1-ssN2z7EfNVE7rdFz7wu246OIORw=", 2782 | "dev": true, 2783 | "requires": { 2784 | "glob-base": "^0.3.0", 2785 | "is-dotfile": "^1.0.0", 2786 | "is-extglob": "^1.0.0", 2787 | "is-glob": "^2.0.0" 2788 | } 2789 | }, 2790 | "parse-json": { 2791 | "version": "2.2.0", 2792 | "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", 2793 | "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", 2794 | "dev": true, 2795 | "requires": { 2796 | "error-ex": "^1.2.0" 2797 | } 2798 | }, 2799 | "parseqs": { 2800 | "version": "0.0.5", 2801 | "resolved": "https://registry.npmjs.org/parseqs/-/parseqs-0.0.5.tgz", 2802 | "integrity": "sha1-1SCKNzjkZ2bikbouoXNoSSGouJ0=", 2803 | "dev": true, 2804 | "requires": { 2805 | "better-assert": "~1.0.0" 2806 | } 2807 | }, 2808 | "parseuri": { 2809 | "version": "0.0.5", 2810 | "resolved": "https://registry.npmjs.org/parseuri/-/parseuri-0.0.5.tgz", 2811 | "integrity": "sha1-gCBKUNTbt3m/3G6+J3jZDkvOMgo=", 2812 | "dev": true, 2813 | "requires": { 2814 | "better-assert": "~1.0.0" 2815 | } 2816 | }, 2817 | "parseurl": { 2818 | "version": "1.3.2", 2819 | "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.2.tgz", 2820 | "integrity": "sha1-/CidTtiZMRlGDBViUyYs3I3mW/M=", 2821 | "dev": true 2822 | }, 2823 | "path-exists": { 2824 | "version": "2.1.0", 2825 | "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", 2826 | "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", 2827 | "dev": true, 2828 | "requires": { 2829 | "pinkie-promise": "^2.0.0" 2830 | } 2831 | }, 2832 | "path-is-absolute": { 2833 | "version": "1.0.1", 2834 | "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", 2835 | "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", 2836 | "dev": true 2837 | }, 2838 | "path-is-inside": { 2839 | "version": "1.0.2", 2840 | "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", 2841 | "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=", 2842 | "dev": true 2843 | }, 2844 | "path-key": { 2845 | "version": "2.0.1", 2846 | "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", 2847 | "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", 2848 | "dev": true 2849 | }, 2850 | "path-parse": { 2851 | "version": "1.0.5", 2852 | "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.5.tgz", 2853 | "integrity": "sha1-PBrfhx6pzWyUMbbqK9dKD/BVxME=", 2854 | "dev": true 2855 | }, 2856 | "path-type": { 2857 | "version": "1.1.0", 2858 | "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", 2859 | "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=", 2860 | "dev": true, 2861 | "requires": { 2862 | "graceful-fs": "^4.1.2", 2863 | "pify": "^2.0.0", 2864 | "pinkie-promise": "^2.0.0" 2865 | } 2866 | }, 2867 | "pify": { 2868 | "version": "2.3.0", 2869 | "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", 2870 | "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", 2871 | "dev": true 2872 | }, 2873 | "pinkie": { 2874 | "version": "2.0.4", 2875 | "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", 2876 | "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", 2877 | "dev": true 2878 | }, 2879 | "pinkie-promise": { 2880 | "version": "2.0.1", 2881 | "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", 2882 | "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", 2883 | "dev": true, 2884 | "requires": { 2885 | "pinkie": "^2.0.0" 2886 | } 2887 | }, 2888 | "plugin-typescript": { 2889 | "version": "8.0.0", 2890 | "resolved": "https://registry.npmjs.org/plugin-typescript/-/plugin-typescript-8.0.0.tgz", 2891 | "integrity": "sha512-9P25tRwjKgk1J1U1VMVJxHhL4OxouurN9otoQ2DJHDoZ8urxKS7G+e9rpiag3pbYpT7EcWqELEYAk/ssOOfQeg==", 2892 | "dev": true 2893 | }, 2894 | "portscanner": { 2895 | "version": "2.1.1", 2896 | "resolved": "https://registry.npmjs.org/portscanner/-/portscanner-2.1.1.tgz", 2897 | "integrity": "sha1-6rtAnk3iSVD1oqUW01rnaTQ/u5Y=", 2898 | "dev": true, 2899 | "requires": { 2900 | "async": "1.5.2", 2901 | "is-number-like": "^1.0.3" 2902 | } 2903 | }, 2904 | "prepend-http": { 2905 | "version": "1.0.4", 2906 | "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz", 2907 | "integrity": "sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw=", 2908 | "dev": true 2909 | }, 2910 | "preserve": { 2911 | "version": "0.2.0", 2912 | "resolved": "https://registry.npmjs.org/preserve/-/preserve-0.2.0.tgz", 2913 | "integrity": "sha1-gV7R9uvGWSb4ZbMQwHE7yzMVzks=", 2914 | "dev": true 2915 | }, 2916 | "process-nextick-args": { 2917 | "version": "1.0.7", 2918 | "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz", 2919 | "integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M=", 2920 | "dev": true 2921 | }, 2922 | "pseudomap": { 2923 | "version": "1.0.2", 2924 | "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", 2925 | "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=", 2926 | "dev": true 2927 | }, 2928 | "qs": { 2929 | "version": "6.2.3", 2930 | "resolved": "https://registry.npmjs.org/qs/-/qs-6.2.3.tgz", 2931 | "integrity": "sha1-HPyyXBCpsrSDBT/zn138kjOQjP4=", 2932 | "dev": true 2933 | }, 2934 | "randomatic": { 2935 | "version": "3.0.0", 2936 | "resolved": "https://registry.npmjs.org/randomatic/-/randomatic-3.0.0.tgz", 2937 | "integrity": "sha512-VdxFOIEY3mNO5PtSRkkle/hPJDHvQhK21oa73K4yAc9qmp6N429gAyF1gZMOTMeS0/AYzaV/2Trcef+NaIonSA==", 2938 | "dev": true, 2939 | "requires": { 2940 | "is-number": "^4.0.0", 2941 | "kind-of": "^6.0.0", 2942 | "math-random": "^1.0.1" 2943 | }, 2944 | "dependencies": { 2945 | "is-number": { 2946 | "version": "4.0.0", 2947 | "resolved": "https://registry.npmjs.org/is-number/-/is-number-4.0.0.tgz", 2948 | "integrity": "sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ==", 2949 | "dev": true 2950 | }, 2951 | "kind-of": { 2952 | "version": "6.0.2", 2953 | "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", 2954 | "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", 2955 | "dev": true 2956 | } 2957 | } 2958 | }, 2959 | "range-parser": { 2960 | "version": "1.2.0", 2961 | "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.0.tgz", 2962 | "integrity": "sha1-9JvmtIeJTdxA3MlKMi9hEJLgDV4=", 2963 | "dev": true 2964 | }, 2965 | "raw-body": { 2966 | "version": "2.3.3", 2967 | "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.3.3.tgz", 2968 | "integrity": "sha512-9esiElv1BrZoI3rCDuOuKCBRbuApGGaDPQfjSflGxdy4oyzqghxu6klEkkVIvBje+FF0BX9coEv8KqW6X/7njw==", 2969 | "dev": true, 2970 | "requires": { 2971 | "bytes": "3.0.0", 2972 | "http-errors": "1.6.3", 2973 | "iconv-lite": "0.4.23", 2974 | "unpipe": "1.0.0" 2975 | } 2976 | }, 2977 | "rc": { 2978 | "version": "1.2.8", 2979 | "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", 2980 | "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", 2981 | "dev": true, 2982 | "requires": { 2983 | "deep-extend": "^0.6.0", 2984 | "ini": "~1.3.0", 2985 | "minimist": "^1.2.0", 2986 | "strip-json-comments": "~2.0.1" 2987 | } 2988 | }, 2989 | "read-pkg": { 2990 | "version": "1.1.0", 2991 | "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", 2992 | "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=", 2993 | "dev": true, 2994 | "requires": { 2995 | "load-json-file": "^1.0.0", 2996 | "normalize-package-data": "^2.3.2", 2997 | "path-type": "^1.0.0" 2998 | } 2999 | }, 3000 | "read-pkg-up": { 3001 | "version": "1.0.1", 3002 | "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", 3003 | "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=", 3004 | "dev": true, 3005 | "requires": { 3006 | "find-up": "^1.0.0", 3007 | "read-pkg": "^1.0.0" 3008 | } 3009 | }, 3010 | "readable-stream": { 3011 | "version": "2.3.3", 3012 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.3.tgz", 3013 | "integrity": "sha512-m+qzzcn7KUxEmd1gMbchF+Y2eIUbieUaxkWtptyHywrX0rE8QEYqPC07Vuy4Wm32/xE16NcdBctb8S0Xe/5IeQ==", 3014 | "dev": true, 3015 | "requires": { 3016 | "core-util-is": "~1.0.0", 3017 | "inherits": "~2.0.3", 3018 | "isarray": "~1.0.0", 3019 | "process-nextick-args": "~1.0.6", 3020 | "safe-buffer": "~5.1.1", 3021 | "string_decoder": "~1.0.3", 3022 | "util-deprecate": "~1.0.1" 3023 | } 3024 | }, 3025 | "readdirp": { 3026 | "version": "2.1.0", 3027 | "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.1.0.tgz", 3028 | "integrity": "sha1-TtCtBg3zBzMAxIRANz9y0cxkLXg=", 3029 | "dev": true, 3030 | "requires": { 3031 | "graceful-fs": "^4.1.2", 3032 | "minimatch": "^3.0.2", 3033 | "readable-stream": "^2.0.2", 3034 | "set-immediate-shim": "^1.0.1" 3035 | } 3036 | }, 3037 | "redent": { 3038 | "version": "1.0.0", 3039 | "resolved": "https://registry.npmjs.org/redent/-/redent-1.0.0.tgz", 3040 | "integrity": "sha1-z5Fqsf1fHxbfsggi3W7H9zDCr94=", 3041 | "dev": true, 3042 | "requires": { 3043 | "indent-string": "^2.1.0", 3044 | "strip-indent": "^1.0.1" 3045 | } 3046 | }, 3047 | "reflect-metadata": { 3048 | "version": "0.1.12", 3049 | "resolved": "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.1.12.tgz", 3050 | "integrity": "sha512-n+IyV+nGz3+0q3/Yf1ra12KpCyi001bi4XFxSjbiWWjfqb52iTTtpGXmCCAOWWIAn9KEuFZKGqBERHmrtScZ3A==", 3051 | "dev": true 3052 | }, 3053 | "regenerator-runtime": { 3054 | "version": "0.11.0", 3055 | "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.0.tgz", 3056 | "integrity": "sha512-/aA0kLeRb5N9K0d4fw7ooEbI+xDe+DKD499EQqygGqeS8N3xto15p09uY2xj7ixP81sNPXvRLnAQIqdVStgb1A==", 3057 | "dev": true 3058 | }, 3059 | "regex-cache": { 3060 | "version": "0.4.4", 3061 | "resolved": "https://registry.npmjs.org/regex-cache/-/regex-cache-0.4.4.tgz", 3062 | "integrity": "sha512-nVIZwtCjkC9YgvWkpM55B5rBhBYRZhAaJbgcFYXXsHnbZ9UZI9nnVWYZpBlCqv9ho2eZryPnWrZGsOdPwVWXWQ==", 3063 | "dev": true, 3064 | "requires": { 3065 | "is-equal-shallow": "^0.1.3" 3066 | } 3067 | }, 3068 | "registry-auth-token": { 3069 | "version": "3.3.2", 3070 | "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-3.3.2.tgz", 3071 | "integrity": "sha512-JL39c60XlzCVgNrO+qq68FoNb56w/m7JYvGR2jT5iR1xBrUA3Mfx5Twk5rqTThPmQKMWydGmq8oFtDlxfrmxnQ==", 3072 | "dev": true, 3073 | "requires": { 3074 | "rc": "^1.1.6", 3075 | "safe-buffer": "^5.0.1" 3076 | } 3077 | }, 3078 | "registry-url": { 3079 | "version": "3.1.0", 3080 | "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-3.1.0.tgz", 3081 | "integrity": "sha1-PU74cPc93h138M+aOBQyRE4XSUI=", 3082 | "dev": true, 3083 | "requires": { 3084 | "rc": "^1.0.1" 3085 | } 3086 | }, 3087 | "remove-trailing-separator": { 3088 | "version": "1.1.0", 3089 | "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", 3090 | "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=", 3091 | "dev": true 3092 | }, 3093 | "repeat-element": { 3094 | "version": "1.1.2", 3095 | "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.2.tgz", 3096 | "integrity": "sha1-7wiaF40Ug7quTZPrmLT55OEdmQo=", 3097 | "dev": true 3098 | }, 3099 | "repeat-string": { 3100 | "version": "1.6.1", 3101 | "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", 3102 | "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", 3103 | "dev": true 3104 | }, 3105 | "repeating": { 3106 | "version": "2.0.1", 3107 | "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz", 3108 | "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=", 3109 | "dev": true, 3110 | "requires": { 3111 | "is-finite": "^1.0.0" 3112 | } 3113 | }, 3114 | "require-directory": { 3115 | "version": "2.1.1", 3116 | "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", 3117 | "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", 3118 | "dev": true 3119 | }, 3120 | "require-main-filename": { 3121 | "version": "1.0.1", 3122 | "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", 3123 | "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=", 3124 | "dev": true 3125 | }, 3126 | "requires-port": { 3127 | "version": "1.0.0", 3128 | "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", 3129 | "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=", 3130 | "dev": true 3131 | }, 3132 | "resolve": { 3133 | "version": "1.5.0", 3134 | "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.5.0.tgz", 3135 | "integrity": "sha512-hgoSGrc3pjzAPHNBg+KnFcK2HwlHTs/YrAGUr6qgTVUZmXv1UEXXl0bZNBKMA9fud6lRYFdPGz0xXxycPzmmiw==", 3136 | "dev": true, 3137 | "requires": { 3138 | "path-parse": "^1.0.5" 3139 | } 3140 | }, 3141 | "resp-modifier": { 3142 | "version": "6.0.2", 3143 | "resolved": "https://registry.npmjs.org/resp-modifier/-/resp-modifier-6.0.2.tgz", 3144 | "integrity": "sha1-sSTeXE+6/LpUH0j/pzlw9KpFa08=", 3145 | "dev": true, 3146 | "requires": { 3147 | "debug": "^2.2.0", 3148 | "minimatch": "^3.0.2" 3149 | } 3150 | }, 3151 | "right-align": { 3152 | "version": "0.1.3", 3153 | "resolved": "https://registry.npmjs.org/right-align/-/right-align-0.1.3.tgz", 3154 | "integrity": "sha1-YTObci/mo1FWiSENJOFMlhSGE+8=", 3155 | "dev": true, 3156 | "requires": { 3157 | "align-text": "^0.1.1" 3158 | } 3159 | }, 3160 | "rimraf": { 3161 | "version": "2.6.2", 3162 | "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz", 3163 | "integrity": "sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w==", 3164 | "dev": true, 3165 | "requires": { 3166 | "glob": "^7.0.5" 3167 | } 3168 | }, 3169 | "rollup": { 3170 | "version": "0.59.4", 3171 | "resolved": "https://registry.npmjs.org/rollup/-/rollup-0.59.4.tgz", 3172 | "integrity": "sha512-ISiMqq/aJa+57QxX2MRcvLESHdJ7wSavmr6U1euMr+6UgFe6KM+3QANrYy8LQofwhTC1I7BcAdlLnDiaODs1BA==", 3173 | "dev": true, 3174 | "requires": { 3175 | "@types/estree": "0.0.39", 3176 | "@types/node": "*" 3177 | } 3178 | }, 3179 | "rollup-plugin-commonjs": { 3180 | "version": "9.1.3", 3181 | "resolved": "https://registry.npmjs.org/rollup-plugin-commonjs/-/rollup-plugin-commonjs-9.1.3.tgz", 3182 | "integrity": "sha512-g91ZZKZwTW7F7vL6jMee38I8coj/Q9GBdTmXXeFL7ldgC1Ky5WJvHgbKlAiXXTh762qvohhExwUgeQGFh9suGg==", 3183 | "dev": true, 3184 | "requires": { 3185 | "estree-walker": "^0.5.1", 3186 | "magic-string": "^0.22.4", 3187 | "resolve": "^1.5.0", 3188 | "rollup-pluginutils": "^2.0.1" 3189 | } 3190 | }, 3191 | "rollup-plugin-filesize": { 3192 | "version": "2.0.0", 3193 | "resolved": "https://registry.npmjs.org/rollup-plugin-filesize/-/rollup-plugin-filesize-2.0.0.tgz", 3194 | "integrity": "sha512-ZFwmrHvfAXLyYLK9mgiFDCDg3wncX/Dx5XLA9KDBqVu+Gi3zH7hvpjho36QZyyAmYm8iEwv1KGOCMdCernzo7A==", 3195 | "dev": true, 3196 | "requires": { 3197 | "boxen": "^1.1.0", 3198 | "colors": "^1.1.2", 3199 | "deep-assign": "^2.0.0", 3200 | "filesize": "^3.5.6", 3201 | "gzip-size": "^3.0.0" 3202 | } 3203 | }, 3204 | "rollup-plugin-node-resolve": { 3205 | "version": "3.3.0", 3206 | "resolved": "https://registry.npmjs.org/rollup-plugin-node-resolve/-/rollup-plugin-node-resolve-3.3.0.tgz", 3207 | "integrity": "sha512-9zHGr3oUJq6G+X0oRMYlzid9fXicBdiydhwGChdyeNRGPcN/majtegApRKHLR5drboUvEWU+QeUmGTyEZQs3WA==", 3208 | "dev": true, 3209 | "requires": { 3210 | "builtin-modules": "^2.0.0", 3211 | "is-module": "^1.0.0", 3212 | "resolve": "^1.1.6" 3213 | }, 3214 | "dependencies": { 3215 | "builtin-modules": { 3216 | "version": "2.0.0", 3217 | "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-2.0.0.tgz", 3218 | "integrity": "sha512-3U5kUA5VPsRUA3nofm/BXX7GVHKfxz0hOBAPxXrIvHzlDRkQVqEn6yi8QJegxl4LzOHLdvb7XF5dVawa/VVYBg==", 3219 | "dev": true 3220 | } 3221 | } 3222 | }, 3223 | "rollup-plugin-uglify": { 3224 | "version": "4.0.0", 3225 | "resolved": "https://registry.npmjs.org/rollup-plugin-uglify/-/rollup-plugin-uglify-4.0.0.tgz", 3226 | "integrity": "sha512-f6W31EQLzxSEYfN3x6/lyljHqXSoCjXKcTsnwz3evQvHgU1+qTzU2SE0SIG7tbAvaCewp2UaZ5x3k6nYsxOP9A==", 3227 | "dev": true, 3228 | "requires": { 3229 | "@babel/code-frame": "^7.0.0-beta.47", 3230 | "uglify-js": "^3.3.25" 3231 | }, 3232 | "dependencies": { 3233 | "source-map": { 3234 | "version": "0.6.1", 3235 | "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", 3236 | "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", 3237 | "dev": true 3238 | }, 3239 | "uglify-js": { 3240 | "version": "3.4.0", 3241 | "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.4.0.tgz", 3242 | "integrity": "sha512-Jcf5naPkX3rVPSQpRn9Vm6Rr572I1gTtR9LnqKgXjmOgfYQ/QS0V2WRStFR53Bdj520M66aCZqt9uzYXgtGrJQ==", 3243 | "dev": true, 3244 | "requires": { 3245 | "commander": "~2.15.0", 3246 | "source-map": "~0.6.1" 3247 | } 3248 | } 3249 | } 3250 | }, 3251 | "rollup-pluginutils": { 3252 | "version": "2.3.0", 3253 | "resolved": "https://registry.npmjs.org/rollup-pluginutils/-/rollup-pluginutils-2.3.0.tgz", 3254 | "integrity": "sha512-xB6hsRsjdJdIYWEyYUJy/3ki5g69wrf0luHPGNK3ZSocV6HLNfio59l3dZ3TL4xUwEKgROhFi9jOCt6c5gfUWw==", 3255 | "dev": true, 3256 | "requires": { 3257 | "estree-walker": "^0.5.2", 3258 | "micromatch": "^2.3.11" 3259 | } 3260 | }, 3261 | "rx": { 3262 | "version": "4.1.0", 3263 | "resolved": "https://registry.npmjs.org/rx/-/rx-4.1.0.tgz", 3264 | "integrity": "sha1-pfE/957zt0D+MKqAP7CfmIBdR4I=", 3265 | "dev": true 3266 | }, 3267 | "rxjs": { 3268 | "version": "6.2.1", 3269 | "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.2.1.tgz", 3270 | "integrity": "sha512-OwMxHxmnmHTUpgO+V7dZChf3Tixf4ih95cmXjzzadULziVl/FKhHScGLj4goEw9weePVOH2Q0+GcCBUhKCZc/g==", 3271 | "dev": true, 3272 | "requires": { 3273 | "tslib": "^1.9.0" 3274 | } 3275 | }, 3276 | "safe-buffer": { 3277 | "version": "5.1.1", 3278 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz", 3279 | "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==", 3280 | "dev": true 3281 | }, 3282 | "safer-buffer": { 3283 | "version": "2.1.2", 3284 | "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", 3285 | "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", 3286 | "dev": true 3287 | }, 3288 | "semver": { 3289 | "version": "5.4.1", 3290 | "resolved": "https://registry.npmjs.org/semver/-/semver-5.4.1.tgz", 3291 | "integrity": "sha512-WfG/X9+oATh81XtllIo/I8gOiY9EXRdv1cQdyykeXK17YcUW3EXUAi2To4pcH6nZtJPr7ZOpM5OMyWJZm+8Rsg==", 3292 | "dev": true 3293 | }, 3294 | "semver-diff": { 3295 | "version": "2.1.0", 3296 | "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-2.1.0.tgz", 3297 | "integrity": "sha1-S7uEN8jTfksM8aaP1ybsbWRdbTY=", 3298 | "dev": true, 3299 | "requires": { 3300 | "semver": "^5.0.3" 3301 | } 3302 | }, 3303 | "send": { 3304 | "version": "0.16.2", 3305 | "resolved": "https://registry.npmjs.org/send/-/send-0.16.2.tgz", 3306 | "integrity": "sha512-E64YFPUssFHEFBvpbbjr44NCLtI1AohxQ8ZSiJjQLskAdKuriYEP6VyGEsRDH8ScozGpkaX1BGvhanqCwkcEZw==", 3307 | "dev": true, 3308 | "requires": { 3309 | "debug": "2.6.9", 3310 | "depd": "~1.1.2", 3311 | "destroy": "~1.0.4", 3312 | "encodeurl": "~1.0.2", 3313 | "escape-html": "~1.0.3", 3314 | "etag": "~1.8.1", 3315 | "fresh": "0.5.2", 3316 | "http-errors": "~1.6.2", 3317 | "mime": "1.4.1", 3318 | "ms": "2.0.0", 3319 | "on-finished": "~2.3.0", 3320 | "range-parser": "~1.2.0", 3321 | "statuses": "~1.4.0" 3322 | }, 3323 | "dependencies": { 3324 | "statuses": { 3325 | "version": "1.4.0", 3326 | "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.4.0.tgz", 3327 | "integrity": "sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew==", 3328 | "dev": true 3329 | } 3330 | } 3331 | }, 3332 | "serve-index": { 3333 | "version": "1.8.0", 3334 | "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.8.0.tgz", 3335 | "integrity": "sha1-fF2WwT+xMRAfk8HFd0+FFqHnjTs=", 3336 | "dev": true, 3337 | "requires": { 3338 | "accepts": "~1.3.3", 3339 | "batch": "0.5.3", 3340 | "debug": "~2.2.0", 3341 | "escape-html": "~1.0.3", 3342 | "http-errors": "~1.5.0", 3343 | "mime-types": "~2.1.11", 3344 | "parseurl": "~1.3.1" 3345 | }, 3346 | "dependencies": { 3347 | "debug": { 3348 | "version": "2.2.0", 3349 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.2.0.tgz", 3350 | "integrity": "sha1-+HBX6ZWxofauaklgZkE3vFbwOdo=", 3351 | "dev": true, 3352 | "requires": { 3353 | "ms": "0.7.1" 3354 | } 3355 | }, 3356 | "http-errors": { 3357 | "version": "1.5.1", 3358 | "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.5.1.tgz", 3359 | "integrity": "sha1-eIwNLB3iyBuebowBhDtrl+uSB1A=", 3360 | "dev": true, 3361 | "requires": { 3362 | "inherits": "2.0.3", 3363 | "setprototypeof": "1.0.2", 3364 | "statuses": ">= 1.3.1 < 2" 3365 | } 3366 | }, 3367 | "ms": { 3368 | "version": "0.7.1", 3369 | "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.1.tgz", 3370 | "integrity": "sha1-nNE8A62/8ltl7/3nzoZO6VIBcJg=", 3371 | "dev": true 3372 | }, 3373 | "setprototypeof": { 3374 | "version": "1.0.2", 3375 | "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.0.2.tgz", 3376 | "integrity": "sha1-gaVSFB7BBLiOic44MQOtXGZWTQg=", 3377 | "dev": true 3378 | } 3379 | } 3380 | }, 3381 | "serve-static": { 3382 | "version": "1.13.2", 3383 | "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.13.2.tgz", 3384 | "integrity": "sha512-p/tdJrO4U387R9oMjb1oj7qSMaMfmOyd4j9hOFoxZe2baQszgHcSWjuya/CiT5kgZZKRudHNOA0pYXOl8rQ5nw==", 3385 | "dev": true, 3386 | "requires": { 3387 | "encodeurl": "~1.0.2", 3388 | "escape-html": "~1.0.3", 3389 | "parseurl": "~1.3.2", 3390 | "send": "0.16.2" 3391 | } 3392 | }, 3393 | "server-destroy": { 3394 | "version": "1.0.1", 3395 | "resolved": "https://registry.npmjs.org/server-destroy/-/server-destroy-1.0.1.tgz", 3396 | "integrity": "sha1-8Tv5KOQrnD55OD5hzDmYtdFObN0=", 3397 | "dev": true 3398 | }, 3399 | "set-blocking": { 3400 | "version": "2.0.0", 3401 | "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", 3402 | "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", 3403 | "dev": true 3404 | }, 3405 | "set-immediate-shim": { 3406 | "version": "1.0.1", 3407 | "resolved": "https://registry.npmjs.org/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz", 3408 | "integrity": "sha1-SysbJ+uAip+NzEgaWOXlb1mfP2E=", 3409 | "dev": true 3410 | }, 3411 | "setprototypeof": { 3412 | "version": "1.1.0", 3413 | "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", 3414 | "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==", 3415 | "dev": true 3416 | }, 3417 | "shebang-command": { 3418 | "version": "1.2.0", 3419 | "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", 3420 | "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", 3421 | "dev": true, 3422 | "requires": { 3423 | "shebang-regex": "^1.0.0" 3424 | } 3425 | }, 3426 | "shebang-regex": { 3427 | "version": "1.0.0", 3428 | "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", 3429 | "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", 3430 | "dev": true 3431 | }, 3432 | "shell-quote": { 3433 | "version": "1.6.1", 3434 | "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.6.1.tgz", 3435 | "integrity": "sha1-9HgZSczkAmlxJ0MOo7PFR29IF2c=", 3436 | "dev": true, 3437 | "requires": { 3438 | "array-filter": "~0.0.0", 3439 | "array-map": "~0.0.0", 3440 | "array-reduce": "~0.0.0", 3441 | "jsonify": "~0.0.0" 3442 | } 3443 | }, 3444 | "signal-exit": { 3445 | "version": "3.0.2", 3446 | "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", 3447 | "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", 3448 | "dev": true 3449 | }, 3450 | "socket.io": { 3451 | "version": "2.0.4", 3452 | "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-2.0.4.tgz", 3453 | "integrity": "sha1-waRZDO/4fs8TxyZS8Eb3FrKeYBQ=", 3454 | "dev": true, 3455 | "requires": { 3456 | "debug": "~2.6.6", 3457 | "engine.io": "~3.1.0", 3458 | "socket.io-adapter": "~1.1.0", 3459 | "socket.io-client": "2.0.4", 3460 | "socket.io-parser": "~3.1.1" 3461 | } 3462 | }, 3463 | "socket.io-adapter": { 3464 | "version": "1.1.1", 3465 | "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-1.1.1.tgz", 3466 | "integrity": "sha1-KoBeihTWNyEk3ZFZrUUC+MsH8Gs=", 3467 | "dev": true 3468 | }, 3469 | "socket.io-client": { 3470 | "version": "2.0.4", 3471 | "resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-2.0.4.tgz", 3472 | "integrity": "sha1-CRilUkBtxeVAs4Dc2Xr8SmQzL44=", 3473 | "dev": true, 3474 | "requires": { 3475 | "backo2": "1.0.2", 3476 | "base64-arraybuffer": "0.1.5", 3477 | "component-bind": "1.0.0", 3478 | "component-emitter": "1.2.1", 3479 | "debug": "~2.6.4", 3480 | "engine.io-client": "~3.1.0", 3481 | "has-cors": "1.1.0", 3482 | "indexof": "0.0.1", 3483 | "object-component": "0.0.3", 3484 | "parseqs": "0.0.5", 3485 | "parseuri": "0.0.5", 3486 | "socket.io-parser": "~3.1.1", 3487 | "to-array": "0.1.4" 3488 | } 3489 | }, 3490 | "socket.io-parser": { 3491 | "version": "3.1.3", 3492 | "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-3.1.3.tgz", 3493 | "integrity": "sha512-g0a2HPqLguqAczs3dMECuA1RgoGFPyvDqcbaDEdCWY9g59kdUAz3YRmaJBNKXflrHNwB7Q12Gkf/0CZXfdHR7g==", 3494 | "dev": true, 3495 | "requires": { 3496 | "component-emitter": "1.2.1", 3497 | "debug": "~3.1.0", 3498 | "has-binary2": "~1.0.2", 3499 | "isarray": "2.0.1" 3500 | }, 3501 | "dependencies": { 3502 | "debug": { 3503 | "version": "3.1.0", 3504 | "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", 3505 | "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", 3506 | "dev": true, 3507 | "requires": { 3508 | "ms": "2.0.0" 3509 | } 3510 | }, 3511 | "isarray": { 3512 | "version": "2.0.1", 3513 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.1.tgz", 3514 | "integrity": "sha1-o32U7ZzaLVmGXJ92/llu4fM4dB4=", 3515 | "dev": true 3516 | } 3517 | } 3518 | }, 3519 | "source-map": { 3520 | "version": "0.5.7", 3521 | "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", 3522 | "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", 3523 | "dev": true 3524 | }, 3525 | "source-map-explorer": { 3526 | "version": "1.5.0", 3527 | "resolved": "https://registry.npmjs.org/source-map-explorer/-/source-map-explorer-1.5.0.tgz", 3528 | "integrity": "sha512-skfca9IJvJKsI+J3sWFQ+hCqUDmZxhGgM20/L7PpNGRnQSVyXPYi7U0TDw0eNj5Yhtsm//psmNkxQmHuEJJ6FA==", 3529 | "dev": true, 3530 | "requires": { 3531 | "btoa": "^1.1.2", 3532 | "convert-source-map": "^1.1.1", 3533 | "docopt": "^0.6.2", 3534 | "glob": "^7.1.2", 3535 | "open": "0.0.5", 3536 | "source-map": "^0.5.1", 3537 | "temp": "^0.8.3", 3538 | "underscore": "^1.8.3" 3539 | }, 3540 | "dependencies": { 3541 | "underscore": { 3542 | "version": "1.8.3", 3543 | "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.8.3.tgz", 3544 | "integrity": "sha1-Tz+1OxBuYJf8+ctBCfKl6b36UCI=", 3545 | "dev": true 3546 | } 3547 | } 3548 | }, 3549 | "source-map-support": { 3550 | "version": "0.5.6", 3551 | "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.6.tgz", 3552 | "integrity": "sha512-N4KXEz7jcKqPf2b2vZF11lQIz9W5ZMuUcIOGj243lduidkf2fjkVKJS9vNxVWn3u/uxX38AcE8U9nnH9FPcq+g==", 3553 | "dev": true, 3554 | "requires": { 3555 | "buffer-from": "^1.0.0", 3556 | "source-map": "^0.6.0" 3557 | }, 3558 | "dependencies": { 3559 | "source-map": { 3560 | "version": "0.6.1", 3561 | "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", 3562 | "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", 3563 | "dev": true 3564 | } 3565 | } 3566 | }, 3567 | "spdx-correct": { 3568 | "version": "1.0.2", 3569 | "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-1.0.2.tgz", 3570 | "integrity": "sha1-SzBz2TP/UfORLwOsVRlJikFQ20A=", 3571 | "dev": true, 3572 | "requires": { 3573 | "spdx-license-ids": "^1.0.2" 3574 | } 3575 | }, 3576 | "spdx-expression-parse": { 3577 | "version": "1.0.4", 3578 | "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-1.0.4.tgz", 3579 | "integrity": "sha1-m98vIOH0DtRH++JzJmGR/O1RYmw=", 3580 | "dev": true 3581 | }, 3582 | "spdx-license-ids": { 3583 | "version": "1.2.2", 3584 | "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-1.2.2.tgz", 3585 | "integrity": "sha1-yd96NCRZSt5r0RkA1ZZpbcBrrFc=", 3586 | "dev": true 3587 | }, 3588 | "sprintf-js": { 3589 | "version": "1.0.3", 3590 | "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", 3591 | "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", 3592 | "dev": true 3593 | }, 3594 | "statuses": { 3595 | "version": "1.3.1", 3596 | "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.3.1.tgz", 3597 | "integrity": "sha1-+vUbnrdKrvOzrPStX2Gr8ky3uT4=", 3598 | "dev": true 3599 | }, 3600 | "stream-throttle": { 3601 | "version": "0.1.3", 3602 | "resolved": "https://registry.npmjs.org/stream-throttle/-/stream-throttle-0.1.3.tgz", 3603 | "integrity": "sha1-rdV8jXzHOoFjDTHNVdOWHPr7qcM=", 3604 | "dev": true, 3605 | "requires": { 3606 | "commander": "^2.2.0", 3607 | "limiter": "^1.0.5" 3608 | } 3609 | }, 3610 | "string-width": { 3611 | "version": "1.0.2", 3612 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", 3613 | "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", 3614 | "dev": true, 3615 | "requires": { 3616 | "code-point-at": "^1.0.0", 3617 | "is-fullwidth-code-point": "^1.0.0", 3618 | "strip-ansi": "^3.0.0" 3619 | } 3620 | }, 3621 | "string_decoder": { 3622 | "version": "1.0.3", 3623 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", 3624 | "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==", 3625 | "dev": true, 3626 | "requires": { 3627 | "safe-buffer": "~5.1.0" 3628 | } 3629 | }, 3630 | "strip-ansi": { 3631 | "version": "3.0.1", 3632 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", 3633 | "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", 3634 | "dev": true, 3635 | "requires": { 3636 | "ansi-regex": "^2.0.0" 3637 | } 3638 | }, 3639 | "strip-bom": { 3640 | "version": "2.0.0", 3641 | "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", 3642 | "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", 3643 | "dev": true, 3644 | "requires": { 3645 | "is-utf8": "^0.2.0" 3646 | } 3647 | }, 3648 | "strip-eof": { 3649 | "version": "1.0.0", 3650 | "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", 3651 | "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=", 3652 | "dev": true 3653 | }, 3654 | "strip-indent": { 3655 | "version": "1.0.1", 3656 | "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-1.0.1.tgz", 3657 | "integrity": "sha1-DHlipq3vp7vUrDZkYKY4VSrhoKI=", 3658 | "dev": true, 3659 | "requires": { 3660 | "get-stdin": "^4.0.1" 3661 | } 3662 | }, 3663 | "strip-json-comments": { 3664 | "version": "2.0.1", 3665 | "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", 3666 | "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", 3667 | "dev": true 3668 | }, 3669 | "subarg": { 3670 | "version": "1.0.0", 3671 | "resolved": "https://registry.npmjs.org/subarg/-/subarg-1.0.0.tgz", 3672 | "integrity": "sha1-9izxdYHplrSPyWVpn1TAauJouNI=", 3673 | "dev": true, 3674 | "requires": { 3675 | "minimist": "^1.1.0" 3676 | } 3677 | }, 3678 | "supports-color": { 3679 | "version": "2.0.0", 3680 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", 3681 | "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", 3682 | "dev": true 3683 | }, 3684 | "systemjs": { 3685 | "version": "0.21.4", 3686 | "resolved": "https://registry.npmjs.org/systemjs/-/systemjs-0.21.4.tgz", 3687 | "integrity": "sha512-l1O8boHjAIY5UG74Xk4B63LK9QbFxv/FkQa//GGGWaTeQoMhTsWnFrYwPWBScSF4xQFMO/+v9QB4i633h8Oytw==", 3688 | "dev": true 3689 | }, 3690 | "temp": { 3691 | "version": "0.8.3", 3692 | "resolved": "https://registry.npmjs.org/temp/-/temp-0.8.3.tgz", 3693 | "integrity": "sha1-4Ma8TSa5AxJEEOT+2BEDAU38H1k=", 3694 | "dev": true, 3695 | "requires": { 3696 | "os-tmpdir": "^1.0.0", 3697 | "rimraf": "~2.2.6" 3698 | }, 3699 | "dependencies": { 3700 | "rimraf": { 3701 | "version": "2.2.8", 3702 | "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.2.8.tgz", 3703 | "integrity": "sha1-5Dm+Kq7jJzIZUnMPmaiSnk/FBYI=", 3704 | "dev": true 3705 | } 3706 | } 3707 | }, 3708 | "term-size": { 3709 | "version": "1.2.0", 3710 | "resolved": "https://registry.npmjs.org/term-size/-/term-size-1.2.0.tgz", 3711 | "integrity": "sha1-RYuDiH8oj8Vtb/+/rSYuJmOO+mk=", 3712 | "dev": true, 3713 | "requires": { 3714 | "execa": "^0.7.0" 3715 | } 3716 | }, 3717 | "tfunk": { 3718 | "version": "3.1.0", 3719 | "resolved": "https://registry.npmjs.org/tfunk/-/tfunk-3.1.0.tgz", 3720 | "integrity": "sha1-OORBT8ZJd9h6/apy+sttKfgve1s=", 3721 | "dev": true, 3722 | "requires": { 3723 | "chalk": "^1.1.1", 3724 | "object-path": "^0.9.0" 3725 | } 3726 | }, 3727 | "timed-out": { 3728 | "version": "4.0.1", 3729 | "resolved": "https://registry.npmjs.org/timed-out/-/timed-out-4.0.1.tgz", 3730 | "integrity": "sha1-8y6srFoXW+ol1/q1Zas+2HQe9W8=", 3731 | "dev": true 3732 | }, 3733 | "to-array": { 3734 | "version": "0.1.4", 3735 | "resolved": "https://registry.npmjs.org/to-array/-/to-array-0.1.4.tgz", 3736 | "integrity": "sha1-F+bBH3PdTz10zaek/zI46a2b+JA=", 3737 | "dev": true 3738 | }, 3739 | "trim-newlines": { 3740 | "version": "1.0.0", 3741 | "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-1.0.0.tgz", 3742 | "integrity": "sha1-WIeWa7WCpFA6QetST301ARgVphM=", 3743 | "dev": true 3744 | }, 3745 | "tsickle": { 3746 | "version": "0.29.0", 3747 | "resolved": "https://registry.npmjs.org/tsickle/-/tsickle-0.29.0.tgz", 3748 | "integrity": "sha512-JpID0Lv8/irRtPmqJJxb5fCwfZhjZeKmav9Zna7UjqVuJoSbI49Wue/c2PPybX1SbRrjl7bbI/JsCl0dSUJygA==", 3749 | "dev": true, 3750 | "requires": { 3751 | "minimist": "^1.2.0", 3752 | "mkdirp": "^0.5.1", 3753 | "source-map": "^0.6.0", 3754 | "source-map-support": "^0.5.0" 3755 | }, 3756 | "dependencies": { 3757 | "source-map": { 3758 | "version": "0.6.1", 3759 | "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", 3760 | "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", 3761 | "dev": true 3762 | } 3763 | } 3764 | }, 3765 | "tslib": { 3766 | "version": "1.9.1", 3767 | "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.9.1.tgz", 3768 | "integrity": "sha512-avfPS28HmGLLc2o4elcc2EIq2FcH++Yo5YxpBZi9Yw93BCTGFthI4HPE4Rpep6vSYQaK8e69PelM44tPj+RaQg==", 3769 | "dev": true 3770 | }, 3771 | "tslint": { 3772 | "version": "5.10.0", 3773 | "resolved": "https://registry.npmjs.org/tslint/-/tslint-5.10.0.tgz", 3774 | "integrity": "sha1-EeJrzLiK+gLdDZlWyuPUVAtfVMM=", 3775 | "dev": true, 3776 | "requires": { 3777 | "babel-code-frame": "^6.22.0", 3778 | "builtin-modules": "^1.1.1", 3779 | "chalk": "^2.3.0", 3780 | "commander": "^2.12.1", 3781 | "diff": "^3.2.0", 3782 | "glob": "^7.1.1", 3783 | "js-yaml": "^3.7.0", 3784 | "minimatch": "^3.0.4", 3785 | "resolve": "^1.3.2", 3786 | "semver": "^5.3.0", 3787 | "tslib": "^1.8.0", 3788 | "tsutils": "^2.12.1" 3789 | }, 3790 | "dependencies": { 3791 | "ansi-styles": { 3792 | "version": "3.2.1", 3793 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", 3794 | "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", 3795 | "dev": true, 3796 | "requires": { 3797 | "color-convert": "^1.9.0" 3798 | } 3799 | }, 3800 | "chalk": { 3801 | "version": "2.4.1", 3802 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", 3803 | "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", 3804 | "dev": true, 3805 | "requires": { 3806 | "ansi-styles": "^3.2.1", 3807 | "escape-string-regexp": "^1.0.5", 3808 | "supports-color": "^5.3.0" 3809 | } 3810 | }, 3811 | "supports-color": { 3812 | "version": "5.4.0", 3813 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz", 3814 | "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==", 3815 | "dev": true, 3816 | "requires": { 3817 | "has-flag": "^3.0.0" 3818 | } 3819 | } 3820 | } 3821 | }, 3822 | "tsutils": { 3823 | "version": "2.27.1", 3824 | "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-2.27.1.tgz", 3825 | "integrity": "sha512-AE/7uzp32MmaHvNNFES85hhUDHFdFZp6OAiZcd6y4ZKKIg6orJTm8keYWBhIhrJQH3a4LzNKat7ZPXZt5aTf6w==", 3826 | "dev": true, 3827 | "requires": { 3828 | "tslib": "^1.8.1" 3829 | } 3830 | }, 3831 | "typescript": { 3832 | "version": "2.7.2", 3833 | "resolved": "https://registry.npmjs.org/typescript/-/typescript-2.7.2.tgz", 3834 | "integrity": "sha512-p5TCYZDAO0m4G344hD+wx/LATebLWZNkkh2asWUFqSsD2OrDNhbAHuSjobrmsUmdzjJjEeZVU9g1h3O6vpstnw==", 3835 | "dev": true 3836 | }, 3837 | "ua-parser-js": { 3838 | "version": "0.7.17", 3839 | "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.17.tgz", 3840 | "integrity": "sha512-uRdSdu1oA1rncCQL7sCj8vSyZkgtL7faaw9Tc9rZ3mGgraQ7+Pdx7w5mnOSF3gw9ZNG6oc+KXfkon3bKuROm0g==", 3841 | "dev": true 3842 | }, 3843 | "uglify-js-harmony": { 3844 | "version": "2.7.7", 3845 | "resolved": "https://registry.npmjs.org/uglify-js-harmony/-/uglify-js-harmony-2.7.7.tgz", 3846 | "integrity": "sha1-akOZMhH6XaLx5YQW1h8ykyfu8zU=", 3847 | "dev": true, 3848 | "requires": { 3849 | "async": "~0.2.6", 3850 | "source-map": "~0.5.1", 3851 | "uglify-to-browserify": "~1.0.0", 3852 | "yargs": "~3.10.0" 3853 | }, 3854 | "dependencies": { 3855 | "async": { 3856 | "version": "0.2.10", 3857 | "resolved": "https://registry.npmjs.org/async/-/async-0.2.10.tgz", 3858 | "integrity": "sha1-trvgsGdLnXGXCMo43owjfLUmw9E=", 3859 | "dev": true 3860 | }, 3861 | "cliui": { 3862 | "version": "2.1.0", 3863 | "resolved": "https://registry.npmjs.org/cliui/-/cliui-2.1.0.tgz", 3864 | "integrity": "sha1-S0dXYP+AJkx2LDoXGQMukcf+oNE=", 3865 | "dev": true, 3866 | "requires": { 3867 | "center-align": "^0.1.1", 3868 | "right-align": "^0.1.1", 3869 | "wordwrap": "0.0.2" 3870 | } 3871 | }, 3872 | "window-size": { 3873 | "version": "0.1.0", 3874 | "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.1.0.tgz", 3875 | "integrity": "sha1-VDjNLqk7IC76Ohn+iIeu58lPnJ0=", 3876 | "dev": true 3877 | }, 3878 | "yargs": { 3879 | "version": "3.10.0", 3880 | "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.10.0.tgz", 3881 | "integrity": "sha1-9+572FfdfB0tOMDnTvvWgdFDH9E=", 3882 | "dev": true, 3883 | "requires": { 3884 | "camelcase": "^1.0.2", 3885 | "cliui": "^2.1.0", 3886 | "decamelize": "^1.0.0", 3887 | "window-size": "0.1.0" 3888 | } 3889 | } 3890 | } 3891 | }, 3892 | "uglify-to-browserify": { 3893 | "version": "1.0.2", 3894 | "resolved": "https://registry.npmjs.org/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz", 3895 | "integrity": "sha1-bgkk1r2mta/jSeOabWMoUKD4grc=", 3896 | "dev": true 3897 | }, 3898 | "ultron": { 3899 | "version": "1.1.1", 3900 | "resolved": "https://registry.npmjs.org/ultron/-/ultron-1.1.1.tgz", 3901 | "integrity": "sha512-UIEXBNeYmKptWH6z8ZnqTeS8fV74zG0/eRU9VGkpzz+LIJNs8W/zM/L+7ctCkRrgbNnnR0xxw4bKOr0cW0N0Og==", 3902 | "dev": true 3903 | }, 3904 | "unique-string": { 3905 | "version": "1.0.0", 3906 | "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-1.0.0.tgz", 3907 | "integrity": "sha1-nhBXzKhRq7kzmPizOuGHuZyuwRo=", 3908 | "dev": true, 3909 | "requires": { 3910 | "crypto-random-string": "^1.0.0" 3911 | } 3912 | }, 3913 | "universalify": { 3914 | "version": "0.1.1", 3915 | "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.1.tgz", 3916 | "integrity": "sha1-+nG63UQ3r0wUiEHjs7Fl+enlkLc=", 3917 | "dev": true 3918 | }, 3919 | "unpipe": { 3920 | "version": "1.0.0", 3921 | "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", 3922 | "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=", 3923 | "dev": true 3924 | }, 3925 | "unzip-response": { 3926 | "version": "2.0.1", 3927 | "resolved": "https://registry.npmjs.org/unzip-response/-/unzip-response-2.0.1.tgz", 3928 | "integrity": "sha1-0vD3N9FrBhXnKmk17QQhRXLVb5c=", 3929 | "dev": true 3930 | }, 3931 | "update-notifier": { 3932 | "version": "2.5.0", 3933 | "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-2.5.0.tgz", 3934 | "integrity": "sha512-gwMdhgJHGuj/+wHJJs9e6PcCszpxR1b236igrOkUofGhqJuG+amlIKwApH1IW1WWl7ovZxsX49lMBWLxSdm5Dw==", 3935 | "dev": true, 3936 | "requires": { 3937 | "boxen": "^1.2.1", 3938 | "chalk": "^2.0.1", 3939 | "configstore": "^3.0.0", 3940 | "import-lazy": "^2.1.0", 3941 | "is-ci": "^1.0.10", 3942 | "is-installed-globally": "^0.1.0", 3943 | "is-npm": "^1.0.0", 3944 | "latest-version": "^3.0.0", 3945 | "semver-diff": "^2.0.0", 3946 | "xdg-basedir": "^3.0.0" 3947 | }, 3948 | "dependencies": { 3949 | "ansi-styles": { 3950 | "version": "3.2.1", 3951 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", 3952 | "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", 3953 | "dev": true, 3954 | "requires": { 3955 | "color-convert": "^1.9.0" 3956 | } 3957 | }, 3958 | "chalk": { 3959 | "version": "2.4.1", 3960 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", 3961 | "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", 3962 | "dev": true, 3963 | "requires": { 3964 | "ansi-styles": "^3.2.1", 3965 | "escape-string-regexp": "^1.0.5", 3966 | "supports-color": "^5.3.0" 3967 | } 3968 | }, 3969 | "supports-color": { 3970 | "version": "5.4.0", 3971 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz", 3972 | "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==", 3973 | "dev": true, 3974 | "requires": { 3975 | "has-flag": "^3.0.0" 3976 | } 3977 | } 3978 | } 3979 | }, 3980 | "url-parse-lax": { 3981 | "version": "1.0.0", 3982 | "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-1.0.0.tgz", 3983 | "integrity": "sha1-evjzA2Rem9eaJy56FKxovAYJ2nM=", 3984 | "dev": true, 3985 | "requires": { 3986 | "prepend-http": "^1.0.1" 3987 | } 3988 | }, 3989 | "util-deprecate": { 3990 | "version": "1.0.2", 3991 | "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", 3992 | "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", 3993 | "dev": true 3994 | }, 3995 | "utils-merge": { 3996 | "version": "1.0.0", 3997 | "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.0.tgz", 3998 | "integrity": "sha1-ApT7kiu5N1FTVBxPcJYjHyh8ivg=", 3999 | "dev": true 4000 | }, 4001 | "uws": { 4002 | "version": "9.14.0", 4003 | "resolved": "https://registry.npmjs.org/uws/-/uws-9.14.0.tgz", 4004 | "integrity": "sha512-HNMztPP5A1sKuVFmdZ6BPVpBQd5bUjNC8EFMFiICK+oho/OQsAJy5hnIx4btMHiOk8j04f/DbIlqnEZ9d72dqg==", 4005 | "dev": true, 4006 | "optional": true 4007 | }, 4008 | "validate-npm-package-license": { 4009 | "version": "3.0.1", 4010 | "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.1.tgz", 4011 | "integrity": "sha1-KAS6vnEq0zeUWaz74kdGqywwP7w=", 4012 | "dev": true, 4013 | "requires": { 4014 | "spdx-correct": "~1.0.0", 4015 | "spdx-expression-parse": "~1.0.0" 4016 | } 4017 | }, 4018 | "vlq": { 4019 | "version": "0.2.3", 4020 | "resolved": "https://registry.npmjs.org/vlq/-/vlq-0.2.3.tgz", 4021 | "integrity": "sha512-DRibZL6DsNhIgYQ+wNdWDL2SL3bKPlVrRiBqV5yuMm++op8W4kGFtaQfCs4KEJn0wBZcHVHJ3eoywX8983k1ow==", 4022 | "dev": true 4023 | }, 4024 | "which": { 4025 | "version": "1.3.1", 4026 | "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", 4027 | "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", 4028 | "dev": true, 4029 | "requires": { 4030 | "isexe": "^2.0.0" 4031 | } 4032 | }, 4033 | "which-module": { 4034 | "version": "1.0.0", 4035 | "resolved": "https://registry.npmjs.org/which-module/-/which-module-1.0.0.tgz", 4036 | "integrity": "sha1-u6Y8qGGUiZT/MHc2CJ47lgJsKk8=", 4037 | "dev": true 4038 | }, 4039 | "widest-line": { 4040 | "version": "2.0.0", 4041 | "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-2.0.0.tgz", 4042 | "integrity": "sha1-AUKk6KJD+IgsAjOqDgKBqnYVInM=", 4043 | "dev": true, 4044 | "requires": { 4045 | "string-width": "^2.1.1" 4046 | }, 4047 | "dependencies": { 4048 | "ansi-regex": { 4049 | "version": "3.0.0", 4050 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", 4051 | "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", 4052 | "dev": true 4053 | }, 4054 | "is-fullwidth-code-point": { 4055 | "version": "2.0.0", 4056 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", 4057 | "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", 4058 | "dev": true 4059 | }, 4060 | "string-width": { 4061 | "version": "2.1.1", 4062 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", 4063 | "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", 4064 | "dev": true, 4065 | "requires": { 4066 | "is-fullwidth-code-point": "^2.0.0", 4067 | "strip-ansi": "^4.0.0" 4068 | } 4069 | }, 4070 | "strip-ansi": { 4071 | "version": "4.0.0", 4072 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", 4073 | "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", 4074 | "dev": true, 4075 | "requires": { 4076 | "ansi-regex": "^3.0.0" 4077 | } 4078 | } 4079 | } 4080 | }, 4081 | "window-size": { 4082 | "version": "0.2.0", 4083 | "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.2.0.tgz", 4084 | "integrity": "sha1-tDFbtCFKPXBY6+7okuE/ok2YsHU=", 4085 | "dev": true 4086 | }, 4087 | "wordwrap": { 4088 | "version": "0.0.2", 4089 | "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz", 4090 | "integrity": "sha1-t5Zpu0LstAn4PVg8rVLKF+qhZD8=", 4091 | "dev": true 4092 | }, 4093 | "wrap-ansi": { 4094 | "version": "2.1.0", 4095 | "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", 4096 | "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", 4097 | "dev": true, 4098 | "requires": { 4099 | "string-width": "^1.0.1", 4100 | "strip-ansi": "^3.0.1" 4101 | } 4102 | }, 4103 | "wrappy": { 4104 | "version": "1.0.2", 4105 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", 4106 | "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", 4107 | "dev": true 4108 | }, 4109 | "write-file-atomic": { 4110 | "version": "2.3.0", 4111 | "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.3.0.tgz", 4112 | "integrity": "sha512-xuPeK4OdjWqtfi59ylvVL0Yn35SF3zgcAcv7rBPFHVaEapaDr4GdGgm3j7ckTwH9wHL7fGmgfAnb0+THrHb8tA==", 4113 | "dev": true, 4114 | "requires": { 4115 | "graceful-fs": "^4.1.11", 4116 | "imurmurhash": "^0.1.4", 4117 | "signal-exit": "^3.0.2" 4118 | } 4119 | }, 4120 | "ws": { 4121 | "version": "3.3.3", 4122 | "resolved": "https://registry.npmjs.org/ws/-/ws-3.3.3.tgz", 4123 | "integrity": "sha512-nnWLa/NwZSt4KQJu51MYlCcSQ5g7INpOrOMt4XV8j4dqTXdmlUmSHQ8/oLC069ckre0fRsgfvsKwbTdtKLCDkA==", 4124 | "dev": true, 4125 | "requires": { 4126 | "async-limiter": "~1.0.0", 4127 | "safe-buffer": "~5.1.0", 4128 | "ultron": "~1.1.0" 4129 | } 4130 | }, 4131 | "xdg-basedir": { 4132 | "version": "3.0.0", 4133 | "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-3.0.0.tgz", 4134 | "integrity": "sha1-SWsswQnsqNus/i3HK2A8F8WHCtQ=", 4135 | "dev": true 4136 | }, 4137 | "xmlhttprequest-ssl": { 4138 | "version": "1.5.5", 4139 | "resolved": "https://registry.npmjs.org/xmlhttprequest-ssl/-/xmlhttprequest-ssl-1.5.5.tgz", 4140 | "integrity": "sha1-wodrBhaKrcQOV9l+gRkayPQ5iz4=", 4141 | "dev": true 4142 | }, 4143 | "y18n": { 4144 | "version": "3.2.1", 4145 | "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz", 4146 | "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=", 4147 | "dev": true 4148 | }, 4149 | "yallist": { 4150 | "version": "2.1.2", 4151 | "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", 4152 | "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=", 4153 | "dev": true 4154 | }, 4155 | "yargs": { 4156 | "version": "6.4.0", 4157 | "resolved": "https://registry.npmjs.org/yargs/-/yargs-6.4.0.tgz", 4158 | "integrity": "sha1-gW4ahm1VmMzzTlWW3c4i2S2kkNQ=", 4159 | "dev": true, 4160 | "requires": { 4161 | "camelcase": "^3.0.0", 4162 | "cliui": "^3.2.0", 4163 | "decamelize": "^1.1.1", 4164 | "get-caller-file": "^1.0.1", 4165 | "os-locale": "^1.4.0", 4166 | "read-pkg-up": "^1.0.1", 4167 | "require-directory": "^2.1.1", 4168 | "require-main-filename": "^1.0.1", 4169 | "set-blocking": "^2.0.0", 4170 | "string-width": "^1.0.2", 4171 | "which-module": "^1.0.0", 4172 | "window-size": "^0.2.0", 4173 | "y18n": "^3.2.1", 4174 | "yargs-parser": "^4.1.0" 4175 | }, 4176 | "dependencies": { 4177 | "camelcase": { 4178 | "version": "3.0.0", 4179 | "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz", 4180 | "integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo=", 4181 | "dev": true 4182 | } 4183 | } 4184 | }, 4185 | "yargs-parser": { 4186 | "version": "4.2.1", 4187 | "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-4.2.1.tgz", 4188 | "integrity": "sha1-KczqwNxPA8bIe0qfIX3RjJ90hxw=", 4189 | "dev": true, 4190 | "requires": { 4191 | "camelcase": "^3.0.0" 4192 | }, 4193 | "dependencies": { 4194 | "camelcase": { 4195 | "version": "3.0.0", 4196 | "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz", 4197 | "integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo=", 4198 | "dev": true 4199 | } 4200 | } 4201 | }, 4202 | "yeast": { 4203 | "version": "0.1.2", 4204 | "resolved": "https://registry.npmjs.org/yeast/-/yeast-0.1.2.tgz", 4205 | "integrity": "sha1-AI4G2AlDIMNy28L47XagymyKxBk=", 4206 | "dev": true 4207 | }, 4208 | "zone.js": { 4209 | "version": "0.8.26", 4210 | "resolved": "https://registry.npmjs.org/zone.js/-/zone.js-0.8.26.tgz", 4211 | "integrity": "sha512-W9Nj+UmBJG251wkCacIkETgra4QgBo/vgoEkb4a2uoLzpQG7qF9nzwoLXWU5xj3Fg2mxGvEDh47mg24vXccYjA==", 4212 | "dev": true 4213 | } 4214 | } 4215 | } 4216 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "od-virtualscroll", 3 | "version": "1.1.0", 4 | "description": "Observable-based virtual scroll implementation in Angular", 5 | "homepage": "https://dinony.github.io/od-vsstatic/", 6 | "main": "dist/bundles/od-virtualscroll.umd.js", 7 | "typings": "dist/fesm15/od-virtualscroll.d.ts", 8 | "module": "dist/fesm5/od-virtualscroll.js", 9 | "es2015": "dist/fesm15/od-virtualscroll.js", 10 | "scripts": { 11 | "build:es5": "ngc -p config/tsconfig.es5.json && npm run build:fesm5", 12 | "build:fesm5": "rollup dist/es5/od-virtualscroll.js -o dist/fesm5/od-virtualscroll.js -f es && cpx 'dist/es5/*.d.ts' 'dist/fesm5' && cpx 'dist/es5/*.metadata.json' 'dist/fesm5'", 13 | "build:es2015": "ngc -p config/tsconfig.es2015.json && npm run build:fesm15", 14 | "build:fesm15": "rollup dist/es2015/od-virtualscroll.js -o dist/fesm15/od-virtualscroll.js -f es && cpx 'dist/es2015/*.d.ts' 'dist/fesm15' && cpx 'dist/es2015/*.metadata.json' 'dist/fesm15'", 15 | "build:bundle": "rollup -c config/rollup.config.js", 16 | "build": "npm run build:es5 && npm run build:es2015 && npm run build:bundle", 17 | "buildDemo:es2015": "cpx config/tsconfig-demo.es2015.json ./ && ngc -p tsconfig-demo.es2015.json && del-cli ./tsconfig-demo.es2015.json", 18 | "buildDemo:bundle": "rollup -c config/rollup-demo.config.js", 19 | "buildDemo": "npm run buildDemo:es2015 && npm run buildDemo:bundle && rimraf buildTmp", 20 | "buildAll": "npm run build && npm run buildDemo", 21 | "cleanAll": "rimraf dist && rimraf build && rimraf buildTmp", 22 | "serve": "node tools/browserSync.js", 23 | "tslint": "tslint -c tslint.json -p tsconfig.json -t stylish", 24 | "explore": "source-map-explorer build/build.gen.js" 25 | }, 26 | "keywords": [ 27 | "angular", 28 | "rxjs", 29 | "observable", 30 | "scroll", 31 | "scroll component", 32 | "scrolling", 33 | "virtual scroll", 34 | "virtual scrolling", 35 | "infinite scroll", 36 | "infinite scrolling", 37 | "efficient scroll", 38 | "efficient scrolling", 39 | "tiles", 40 | "tiling", 41 | "tile view" 42 | ], 43 | "repository": { 44 | "type": "git", 45 | "url": "https://github.com/dinony/od-virtualscroll.git" 46 | }, 47 | "bugs": { 48 | "url": "https://github.com/dinony/od-virtualscroll/issues" 49 | }, 50 | "author": "Onur Dogangönül ", 51 | "maintainers": [ 52 | { 53 | "name": "Onur Dogangönül", 54 | "email": "contact@dinony.com" 55 | } 56 | ], 57 | "files": [ 58 | "dist" 59 | ], 60 | "engines": { 61 | "node": ">= 6.10.3" 62 | }, 63 | "license": "MIT", 64 | "peerDependencies": { 65 | "@angular/core": ">= 6", 66 | "@angular/common": ">= 6", 67 | "core-js": "^2.5.4", 68 | "rxjs": "^6.0.0", 69 | "zone.js": "^0.8.26" 70 | }, 71 | "devDependencies": { 72 | "@angular/common": "^6.0.5", 73 | "@angular/compiler": "^6.0.5", 74 | "@angular/compiler-cli": "^6.0.5", 75 | "@angular/core": "^6.0.5", 76 | "@angular/platform-browser": "^6.0.5", 77 | "@angular/platform-browser-dynamic": "^6.0.5", 78 | "browser-sync": "^2.24.4", 79 | "core-js": "^2.5.4", 80 | "cpx": "^1.5.0", 81 | "del-cli": "^1.1.0", 82 | "plugin-typescript": "^8.0.0", 83 | "rimraf": "^2.6.1", 84 | "rollup": "^0.60.7", 85 | "rollup-plugin-commonjs": "^9.1.3", 86 | "rollup-plugin-filesize": "^2.0.0", 87 | "rollup-plugin-node-resolve": "^3.3.0", 88 | "rollup-plugin-uglify": "^4.0.0", 89 | "rxjs": "^6.2.1", 90 | "source-map-explorer": "^1.3.3", 91 | "systemjs": "^0.21.4", 92 | "tslint": "^5.10.0", 93 | "typescript": "~2.7.2", 94 | "uglify-js-harmony": "^2.7.5", 95 | "zone.js": "^0.8.26" 96 | } 97 | } 98 | -------------------------------------------------------------------------------- /src/api.ts: -------------------------------------------------------------------------------- 1 | export {VirtualScrollModule} from './virtualScroll.module' 2 | 3 | // Re-export some types that consumers might need 4 | export {IVirtualScrollOptions, IVirtualScrollWindow} from './basic' 5 | 6 | export {ScrollObservableService} from './service' 7 | 8 | export {VirtualRowComponent} from './virtualRow.component' 9 | 10 | export {ScrollItem} from './scrollItem' 11 | 12 | export { 13 | ICmd, IRowRenderCmd, ItemRenderCmd, 14 | CreateRowCmd, RemoveRowCmd, ShiftRowCmd, 15 | CreateItemCmd, UpdateItemCmd, RemoveItemCmd, 16 | CmdOption 17 | } from './cmd' 18 | 19 | export { 20 | FocusItemCmd, FocusRowCmd, IUserCmd, 21 | SetScrollTopCmd, UserCmdOption 22 | } from './userCmd' 23 | -------------------------------------------------------------------------------- /src/basic.ts: -------------------------------------------------------------------------------- 1 | export interface IVirtualScrollOptions { 2 | itemWidth?: number 3 | itemHeight: number 4 | numAdditionalRows?: number 5 | numLimitColumns?: number 6 | } 7 | 8 | export interface IVirtualScrollContainer { 9 | width: number 10 | height: number 11 | } 12 | 13 | export interface IVirtualScrollMeasurement { 14 | containerWidth: number 15 | containerHeight: number 16 | itemWidth?: number 17 | itemHeight: number 18 | numPossibleRows: number 19 | numPossibleColumns: number 20 | numPossibleItems: number 21 | } 22 | 23 | export interface IVirtualScrollWindow { 24 | dataTimestamp: number 25 | containerWidth: number 26 | containerHeight: number 27 | itemWidth?: number 28 | itemHeight: number 29 | numVirtualItems: number 30 | numVirtualRows: number 31 | virtualHeight: number 32 | numAdditionalRows: number 33 | scrollTop: number 34 | scrollPercentage: number 35 | numActualRows: number 36 | numActualColumns: number 37 | actualHeight: number 38 | numActualItems: number 39 | visibleStartRow: number 40 | visibleEndRow: number 41 | } 42 | 43 | export interface IVirtualScrollState { 44 | measurement: IVirtualScrollMeasurement|null 45 | scrollWindow: IVirtualScrollWindow|null 46 | rows: {} 47 | needsCheck: boolean 48 | } 49 | -------------------------------------------------------------------------------- /src/cmd.ts: -------------------------------------------------------------------------------- 1 | /* tslint:disable:max-classes-per-file */ 2 | import {IVirtualScrollWindow} from './basic' 3 | 4 | export enum CmdOption { 5 | Noop, 6 | CreateRow, 7 | ShiftRow, 8 | RemoveRow, 9 | CreateItem, 10 | UpdateItem, 11 | RemoveItem 12 | } 13 | 14 | export interface ICmd { 15 | cmdType: CmdOption 16 | } 17 | 18 | export interface IRowRenderCmd extends ICmd { 19 | virtualIndex: number 20 | actualIndex: number 21 | } 22 | 23 | export interface ItemRenderCmd extends IRowRenderCmd { 24 | columnIndex: number 25 | dataIndex: number 26 | } 27 | 28 | export class NoopCmd implements ICmd { 29 | cmdType = CmdOption.Noop 30 | } 31 | 32 | export class CreateRowCmd implements IRowRenderCmd { 33 | cmdType = CmdOption.CreateRow 34 | constructor( 35 | public virtualIndex: number, 36 | public actualIndex: number, 37 | public initShift: number) {} 38 | } 39 | 40 | export class RemoveRowCmd implements IRowRenderCmd { 41 | cmdType = CmdOption.RemoveRow 42 | constructor( 43 | public virtualIndex: number, 44 | public actualIndex: number) {} 45 | } 46 | 47 | export class ShiftRowCmd implements IRowRenderCmd { 48 | cmdType = CmdOption.ShiftRow 49 | constructor( 50 | public virtualIndex: number, 51 | public actualIndex: number, 52 | public shift: number) {} 53 | } 54 | 55 | export class CreateItemCmd implements ItemRenderCmd { 56 | cmdType = CmdOption.CreateItem 57 | constructor( 58 | public virtualIndex: number, 59 | public actualIndex: number, 60 | public columnIndex: number, 61 | public dataIndex: number) {} 62 | } 63 | 64 | export class UpdateItemCmd implements ItemRenderCmd { 65 | cmdType = CmdOption.UpdateItem 66 | constructor( 67 | public virtualIndex: number, 68 | public actualIndex: number, 69 | public columnIndex: number, 70 | public dataIndex: number) {} 71 | } 72 | 73 | export class RemoveItemCmd implements ItemRenderCmd { 74 | cmdType = CmdOption.RemoveItem 75 | constructor( 76 | public virtualIndex: number, 77 | public actualIndex: number, 78 | public columnIndex: number, 79 | public dataIndex: number) {} 80 | } 81 | -------------------------------------------------------------------------------- /src/enumerate.ts: -------------------------------------------------------------------------------- 1 | export function forRowsIn(start: number, end: number, numActualRows: number, iteratee: (virtualRowIndex: number, actualRowIndex: number) => void) { 2 | for(let r = start; r <= end; r++) { 3 | iteratee(r, r % numActualRows) 4 | } 5 | } 6 | 7 | export function forColumnsIn(start: number, end: number, row: number, numColumns: number, numTotalItems: number, iteratee: (columnIndex: number, dataIndex: number) => void) { 8 | const getDataIndex = (c: number) => row * numColumns + c 9 | 10 | for(let c = start, dataIndx = getDataIndex(c); c <= end && dataIndx < numTotalItems; c++, dataIndx = getDataIndex(c)) { 11 | iteratee(c, dataIndx) 12 | } 13 | } 14 | 15 | export function forColumnsInWithPrev(start: number, end: number, row: number, numColumns: number, prevRow: number, numPrevColumns: number, iteratee: (columnIndex: number, dataIndex: number, prevDataIndex: number) => void) { 16 | for(let c = start; c <= end; c++) { 17 | iteratee(c, row * numColumns + c, prevRow * numPrevColumns + c) 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /src/measurement.ts: -------------------------------------------------------------------------------- 1 | import {IVirtualScrollContainer, IVirtualScrollMeasurement, IVirtualScrollOptions, IVirtualScrollWindow} from './basic' 2 | 3 | export function calcMeasure(rect: IVirtualScrollContainer, options: IVirtualScrollOptions): IVirtualScrollMeasurement { 4 | const numPossibleRows = Math.ceil(rect.height / options.itemHeight) 5 | const numPossibleColumns = options.itemWidth !== undefined ? Math.floor(rect.width / options.itemWidth) : 0 6 | 7 | return { 8 | containerHeight: rect.height, 9 | containerWidth: rect.width, 10 | itemHeight: options.itemHeight, 11 | itemWidth: options.itemWidth, 12 | numPossibleColumns, 13 | numPossibleItems: numPossibleRows * numPossibleColumns, 14 | numPossibleRows, 15 | } 16 | } 17 | 18 | const clamp = (min: number, max: number, value: number) => Math.min(max, Math.max(min, value)) 19 | 20 | export function calcScrollWindow(scrollTop: number, measure: IVirtualScrollMeasurement, numItems: number, dataTimestamp: number, options: IVirtualScrollOptions): IVirtualScrollWindow { 21 | const numVirtualItems = numItems 22 | 23 | const requestedColumns = options.numLimitColumns !== undefined ? options.numLimitColumns : measure.numPossibleColumns 24 | const numActualColumns = Math.min(numVirtualItems, requestedColumns) 25 | 26 | const numVirtualRows = Math.ceil(numVirtualItems / Math.max(1, numActualColumns)) 27 | const virtualHeight = numVirtualRows * measure.itemHeight 28 | const numAdditionalRows = options.numAdditionalRows !== undefined ? options.numAdditionalRows : 1 29 | const requestedRows = measure.numPossibleRows + numAdditionalRows 30 | const numActualRows = numActualColumns > 0 ? Math.min(requestedRows, numVirtualRows) : 0 31 | 32 | const actualHeight = numActualRows * measure.itemHeight 33 | 34 | const visibleEndRow = numActualColumns > 0 && numActualRows > 0 ? clamp(0, numVirtualRows - 1, Math.floor((scrollTop + actualHeight) / measure.itemHeight) - 1) : -1 35 | 36 | return { 37 | actualHeight, 38 | containerHeight: measure.containerHeight, 39 | containerWidth: measure.containerWidth, 40 | dataTimestamp, 41 | itemHeight: measure.itemHeight, 42 | itemWidth: measure.itemWidth, 43 | numActualColumns, 44 | numActualItems: Math.min(numActualRows * numActualColumns, numVirtualItems), 45 | numActualRows, 46 | numAdditionalRows, 47 | numVirtualItems, 48 | numVirtualRows, 49 | scrollPercentage: clamp(0, 100, scrollTop / (virtualHeight - measure.containerHeight)), 50 | scrollTop, 51 | virtualHeight, 52 | visibleEndRow, 53 | visibleStartRow: visibleEndRow !== -1 ? Math.max(0, visibleEndRow - numActualRows + 1) : -1 54 | } 55 | } 56 | 57 | export function getMaxIndex(scrollWin: IVirtualScrollWindow) { 58 | return scrollWin.visibleEndRow * scrollWin.numActualColumns + scrollWin.numActualColumns - 1 59 | } 60 | -------------------------------------------------------------------------------- /src/scrollItem.ts: -------------------------------------------------------------------------------- 1 | export class ScrollItem { 2 | constructor(public $implicit: any, public row: number, public column: number) {} 3 | } 4 | -------------------------------------------------------------------------------- /src/service.ts: -------------------------------------------------------------------------------- 1 | import {ComponentRef, EmbeddedViewRef, Injectable} from '@angular/core' 2 | 3 | import {Observable, ReplaySubject, Subject} from 'rxjs' 4 | 5 | import {IVirtualScrollWindow} from './basic' 6 | 7 | import { 8 | CreateItemCmd, CreateRowCmd, RemoveItemCmd, 9 | RemoveRowCmd, ShiftRowCmd, UpdateItemCmd 10 | } from './cmd' 11 | 12 | import {ScrollItem} from './scrollItem' 13 | import {VirtualRowComponent} from './virtualRow.component' 14 | 15 | @Injectable() 16 | export class ScrollObservableService { 17 | private _scrollWin = new ReplaySubject<[IVirtualScrollWindow]>(1) 18 | scrollWin$ = this._scrollWin.asObservable() 19 | emitScrollWin = (e: [IVirtualScrollWindow]) => this._scrollWin.next(e) 20 | 21 | private _createRow = new Subject<[CreateRowCmd, ComponentRef]>() 22 | createRow$ = this._createRow.asObservable() 23 | emitCreateRow = (e: [CreateRowCmd, ComponentRef]) => this._createRow.next(e) 24 | 25 | private _removeRow = new Subject<[RemoveRowCmd, ComponentRef]>() 26 | removeRow$ = this._removeRow.asObservable() 27 | emitRemoveRow = (e: [RemoveRowCmd, ComponentRef]) => this._removeRow.next(e) 28 | 29 | private _shiftRow = new Subject<[ShiftRowCmd, ComponentRef]>() 30 | shiftRow$ = this._shiftRow.asObservable() 31 | emitShiftRow = (e: [ShiftRowCmd, ComponentRef]) => this._shiftRow.next(e) 32 | 33 | private _createItem = new Subject<[CreateItemCmd, ScrollItem, EmbeddedViewRef]>() 34 | createItem$ = this._createItem.asObservable() 35 | emitCreateItem = (e: [CreateItemCmd, ScrollItem, EmbeddedViewRef]) => this._createItem.next(e) 36 | 37 | private _updateItem = new Subject<[UpdateItemCmd, ScrollItem, EmbeddedViewRef]>() 38 | updateItem$ = this._updateItem.asObservable() 39 | emitUpdateItem = (e: [UpdateItemCmd, ScrollItem, EmbeddedViewRef]) => this._updateItem.next(e) 40 | 41 | private _removeItem = new Subject<[RemoveItemCmd]>() 42 | removeItem$ = this._removeItem.asObservable() 43 | emitRemoveItem = (e: [RemoveItemCmd]) => this._removeItem.next(e) 44 | } 45 | -------------------------------------------------------------------------------- /src/set.ts: -------------------------------------------------------------------------------- 1 | export function isEmpty(obj: {}) { 2 | return Object.keys(obj).length === 0 3 | } 4 | 5 | export function intersection(a: {}, b: {}) { 6 | const result = {} 7 | for(const key in a) { 8 | if(b[key] !== undefined) { 9 | result[key] = {left: a[key], right: b[key]} 10 | } 11 | } 12 | return result 13 | } 14 | 15 | export function difference(a: {}, b: {}) { 16 | const result = {} 17 | for(const key in a) { 18 | if(b[key] === undefined) { 19 | result[key] = a[key] 20 | } 21 | } 22 | return result 23 | } 24 | -------------------------------------------------------------------------------- /src/userCmd.ts: -------------------------------------------------------------------------------- 1 | /* tslint:disable:max-classes-per-file */ 2 | export enum UserCmdOption { 3 | SetScrollTop, 4 | FocusRow, 5 | FocusItem 6 | } 7 | 8 | export interface IUserCmd { 9 | cmdType: UserCmdOption 10 | } 11 | 12 | export class SetScrollTopCmd implements IUserCmd { 13 | cmdType = UserCmdOption.SetScrollTop 14 | constructor(public value: number) {} 15 | } 16 | 17 | export class FocusRowCmd implements IUserCmd { 18 | cmdType = UserCmdOption.FocusRow 19 | constructor(public rowIndex: number) {} 20 | } 21 | 22 | export class FocusItemCmd implements IUserCmd { 23 | cmdType = UserCmdOption.FocusItem 24 | constructor(public itemIndex: number) {} 25 | } 26 | -------------------------------------------------------------------------------- /src/virtualRow.component.ts: -------------------------------------------------------------------------------- 1 | import { 2 | ChangeDetectionStrategy, ChangeDetectorRef, Component, 3 | EmbeddedViewRef, HostBinding, TemplateRef, 4 | ViewChild, ViewContainerRef 5 | } from '@angular/core' 6 | 7 | import {ScrollItem} from './scrollItem' 8 | 9 | @Component({ 10 | changeDetection: ChangeDetectionStrategy.OnPush, 11 | selector: 'od-virtualrow', 12 | styles: [`:host { display: block; position: absolute }`], 13 | template: `
` 14 | }) 15 | export class VirtualRowComponent { 16 | @ViewChild('viewRef', {read: ViewContainerRef}) private _viewContainer: ViewContainerRef 17 | @HostBinding('style.transform') get getTransform() { 18 | return `translateY(${this._translateY}px)` 19 | } 20 | 21 | private _translateY = 0 22 | 23 | constructor(private _cdr: ChangeDetectorRef) {} 24 | 25 | addItem(template: TemplateRef, context: ScrollItem, index?: number): EmbeddedViewRef { 26 | this._cdr.markForCheck() 27 | return this._viewContainer.createEmbeddedView(template, context, index) 28 | } 29 | 30 | setTransform(translateY: number) { 31 | this._translateY = translateY 32 | } 33 | 34 | updateItem(column: number, context: ScrollItem): EmbeddedViewRef { 35 | this._cdr.markForCheck() 36 | const viewRef = this._viewContainer.get(column) as EmbeddedViewRef 37 | viewRef.context.$implicit = context 38 | return viewRef 39 | } 40 | 41 | removeItem(column: number): void { 42 | this._cdr.markForCheck() 43 | this._viewContainer.remove(column) 44 | } 45 | 46 | updateRow(row: number): void { 47 | for(let c = 0; c < this._viewContainer.length; c++) { 48 | const viewRef = this._viewContainer.get(c) as EmbeddedViewRef 49 | viewRef.context.row = row 50 | } 51 | this._cdr.markForCheck() 52 | } 53 | } 54 | -------------------------------------------------------------------------------- /src/virtualScroll.component.ts: -------------------------------------------------------------------------------- 1 | import { 2 | ChangeDetectionStrategy, ChangeDetectorRef, Component, 3 | ComponentFactory, ComponentFactoryResolver, ContentChild, 4 | ElementRef, Input, NgZone, OnDestroy, OnInit, 5 | TemplateRef, ViewChild, ViewContainerRef 6 | } from '@angular/core' 7 | 8 | import { 9 | animationFrameScheduler as animationScheduler, 10 | combineLatest, concat, ConnectableObservable, 11 | empty, from, fromEvent, merge, Observable, of, 12 | Subject, Subscription 13 | } from 'rxjs' 14 | 15 | import { 16 | concatMap, debounceTime, distinctUntilChanged, filter, 17 | map, pairwise, partition, publish, scan, share, startWith, 18 | withLatestFrom 19 | } from 'rxjs/operators' 20 | 21 | import {IVirtualScrollOptions, IVirtualScrollState} from './basic' 22 | import {IVirtualScrollMeasurement, IVirtualScrollWindow} from './basic' 23 | import { 24 | CmdOption, CreateItemCmd, CreateRowCmd, 25 | ICmd, NoopCmd, RemoveItemCmd, RemoveRowCmd, 26 | ShiftRowCmd, UpdateItemCmd 27 | } from './cmd' 28 | import {forColumnsIn, forColumnsInWithPrev, forRowsIn} from './enumerate' 29 | import {calcMeasure, calcScrollWindow, getMaxIndex} from './measurement' 30 | import {ScrollItem} from './scrollItem' 31 | import {ScrollObservableService} from './service' 32 | import {difference, intersection, isEmpty} from './set' 33 | import { 34 | FocusItemCmd, FocusRowCmd, IUserCmd, 35 | SetScrollTopCmd, UserCmdOption 36 | } from './userCmd' 37 | import {VirtualRowComponent} from './virtualRow.component' 38 | 39 | @Component({ 40 | changeDetection: ChangeDetectionStrategy.OnPush, 41 | selector: 'od-virtualscroll', 42 | styles: [` 43 | :host { 44 | display: block; 45 | height: 100%; 46 | overflow-y: scroll; 47 | } 48 | 49 | .od-scroll-container { 50 | position: relative; 51 | width: 100%; 52 | } 53 | `], 54 | template: ` 55 |
56 |
57 |
`, 58 | }) 59 | export class VirtualScrollComponent implements OnInit, OnDestroy { 60 | @ContentChild(TemplateRef) private _templateRef: TemplateRef 61 | @ViewChild('viewRef', {read: ViewContainerRef}) private _viewContainer: ViewContainerRef 62 | 63 | @Input() vsData: Observable = empty() 64 | @Input() vsOptions: Observable = empty() 65 | @Input() vsResize: Observable = empty() 66 | @Input() vsUserCmd: Observable = empty() 67 | @Input() vsDebounceTime: number = 0 68 | @Input() vsEqualsFunc: (prevIndex: number, curIndex: number) => boolean = (prevIndex, curIndex) => prevIndex === curIndex 69 | 70 | height = 0 71 | width = '0px' 72 | 73 | private _rowFactory: ComponentFactory = this._componentFactoryResolver.resolveComponentFactory(VirtualRowComponent) 74 | 75 | private _subs: Subscription[] = [] 76 | 77 | constructor( 78 | private _elem: ElementRef, private _cdr: ChangeDetectorRef, 79 | private _componentFactoryResolver: ComponentFactoryResolver, private _obsService: ScrollObservableService, 80 | private _zone: NgZone) {} 81 | 82 | ngOnInit() { 83 | const getContainerRect = () => this._elem.nativeElement.getBoundingClientRect() 84 | 85 | const getScrollTop = () => this._elem.nativeElement.scrollTop 86 | 87 | const setScrollTop = (scrollTop: number) => { this._elem.nativeElement.scrollTop = scrollTop } 88 | 89 | const initData: any[] = [] 90 | 91 | const data$ = this.vsData.pipe(startWith(initData), publish()) as ConnectableObservable 92 | 93 | const dataMeta$ = data$.pipe(map(data => [(new Date()).getTime(), data.length])) 94 | 95 | const defaultOptions = {itemWidth: 100, itemHeight: 100, numAdditionalRows: 1} 96 | 97 | const options$ = this.vsOptions.pipe(startWith(defaultOptions), publish()) as ConnectableObservable 98 | 99 | const rect$ = merge(fromEvent(window, 'resize'), this.vsResize).pipe( 100 | debounceTime(this.vsDebounceTime, animationScheduler), 101 | map(() => getContainerRect()), 102 | startWith(getContainerRect()), 103 | map(({width, height}) => ({width, height}))) 104 | 105 | const scroll$ = new Subject() 106 | this._zone.runOutsideAngular(() => { 107 | this._subs.push( 108 | fromEvent(this._elem.nativeElement, 'scroll') 109 | .pipe(debounceTime(this.vsDebounceTime, animationScheduler)) 110 | .subscribe(() => { 111 | this._zone.run(() => scroll$.next()) 112 | })) 113 | }) 114 | 115 | const scrollTop$ = scroll$.pipe( 116 | map(() => getScrollTop()), 117 | startWith(0)) 118 | 119 | const measure$ = combineLatest(rect$, options$).pipe( 120 | map(([rect, options]) => calcMeasure(rect, options)), 121 | publish()) as ConnectableObservable 122 | 123 | const scrollWin$ = combineLatest(scrollTop$, measure$, dataMeta$, options$).pipe( 124 | map(([scrollTop, measurement, [dataTimestamp, dataLength], options]) => calcScrollWindow(scrollTop, measurement, dataLength, dataTimestamp, options)), 125 | distinctUntilChanged((prevWin, curWin) => { 126 | return prevWin.visibleStartRow === curWin.visibleStartRow && 127 | prevWin.visibleEndRow === curWin.visibleEndRow && 128 | prevWin.numActualColumns === curWin.numActualColumns && 129 | prevWin.numVirtualItems === curWin.numVirtualItems && 130 | prevWin.dataTimestamp === curWin.dataTimestamp 131 | }), 132 | publish()) as ConnectableObservable 133 | 134 | const dScrollWin$ = scrollWin$.pipe(pairwise()) 135 | 136 | const renderCmd$ = dScrollWin$.pipe(concatMap(([prevWin, curWin]) => { 137 | let rowsDiffCmd$ = of(new NoopCmd()) 138 | let rowsUpdateCmd$ = of(new NoopCmd()) 139 | 140 | const prevIndexMap = {} 141 | const curIndexMap = {} 142 | 143 | // abs: prevent iterating when prevWin has -1 -> -1 144 | forRowsIn(Math.abs(prevWin.visibleStartRow), prevWin.visibleEndRow, prevWin.numActualRows, (row, index) => { 145 | prevIndexMap[index] = row 146 | }) 147 | 148 | // abs: prevent iterating when curWin has -1 -> -1 149 | forRowsIn(Math.abs(curWin.visibleStartRow), curWin.visibleEndRow, curWin.numActualRows, (row, index) => { 150 | curIndexMap[index] = row 151 | }) 152 | 153 | const removeRowsMap = difference(prevIndexMap, curIndexMap) 154 | const createRowsMap = difference(curIndexMap, prevIndexMap) 155 | 156 | if(!isEmpty(removeRowsMap)) { 157 | const removeRowCmds: RemoveRowCmd[] = [] 158 | const removeItemCmds: RemoveItemCmd[] = [] 159 | 160 | for(const key in removeRowsMap) { 161 | const rowIndex = parseInt(key, 10) 162 | const row = removeRowsMap[key] 163 | removeRowCmds.push(new RemoveRowCmd(row, rowIndex)) 164 | 165 | forColumnsIn(0, prevWin.numActualColumns - 1, row, prevWin.numActualColumns, prevWin.numVirtualItems, (c, dataIndex) => { 166 | removeItemCmds.push(new RemoveItemCmd(row, rowIndex, c, dataIndex)) 167 | }) 168 | } 169 | 170 | rowsDiffCmd$ = concat(from(removeItemCmds.reverse()), from(removeRowCmds)) 171 | } else if(!isEmpty(createRowsMap)) { 172 | const createRowCmds: CreateRowCmd[] = [] 173 | const createItemCmds: CreateItemCmd[] = [] 174 | 175 | for(const key in createRowsMap) { 176 | const rowIndex = parseInt(key, 10) 177 | const row = createRowsMap[key] 178 | 179 | createRowCmds.push(new CreateRowCmd(row, rowIndex, row * curWin.itemHeight)) 180 | 181 | forColumnsIn(0, curWin.numActualColumns - 1, row, curWin.numActualColumns, curWin.numVirtualItems, (c, dataIndex) => { 182 | createItemCmds.push(new CreateItemCmd(row, rowIndex, c, dataIndex)) 183 | }) 184 | } 185 | 186 | rowsDiffCmd$ = concat(from(createRowCmds), from(createItemCmds)) 187 | } 188 | 189 | const existingRows = intersection(prevIndexMap, curIndexMap) 190 | 191 | if(!isEmpty(existingRows)) { 192 | const shiftRowCmds: ShiftRowCmd[] = [] 193 | const createItemCmds: CreateItemCmd[] = [] 194 | const removeItemCmds: RemoveItemCmd[] = [] 195 | const updateItemCmds: UpdateItemCmd[] = [] 196 | const columnDiffCreateItemCmds: CreateItemCmd[] = [] 197 | const columnDiffRemoveItemCmds: RemoveItemCmd[] = [] 198 | 199 | const columnsDiffStart = Math.min(prevWin.numActualColumns, curWin.numActualColumns) 200 | const numColumns = curWin.numActualColumns - prevWin.numActualColumns 201 | 202 | for(const key in existingRows) { 203 | const rowIndex = parseInt(key, 10) 204 | const prevRow = existingRows[key].left 205 | const row = existingRows[key].right 206 | 207 | if(row !== prevRow) { 208 | shiftRowCmds.push(new ShiftRowCmd(row, rowIndex, row * curWin.itemHeight)) 209 | } 210 | 211 | if(row !== prevRow || numColumns !== 0 || prevWin.numVirtualItems <= getMaxIndex(prevWin) || curWin.numVirtualItems <= getMaxIndex(curWin) || prevWin.dataTimestamp !== curWin.dataTimestamp) { 212 | forColumnsInWithPrev(0, columnsDiffStart - 1, row, curWin.numActualColumns, prevRow, prevWin.numActualColumns, (c, dataIndex, prevDataIndex) => { 213 | if(dataIndex >= curWin.numVirtualItems && prevDataIndex < prevWin.numVirtualItems) { 214 | removeItemCmds.push(new RemoveItemCmd(row, rowIndex, c, prevDataIndex)) 215 | } else if(dataIndex < curWin.numVirtualItems && prevDataIndex >= prevWin.numVirtualItems) { 216 | createItemCmds.push(new CreateItemCmd(row, rowIndex, c, dataIndex)) 217 | } else if(dataIndex < curWin.numVirtualItems && prevDataIndex < prevWin.numVirtualItems && !this.vsEqualsFunc(prevDataIndex, dataIndex)) { 218 | updateItemCmds.push(new UpdateItemCmd(row, rowIndex, c, dataIndex)) 219 | } 220 | }) 221 | } 222 | 223 | if(numColumns > 0) { 224 | forColumnsIn(columnsDiffStart, curWin.numActualColumns - 1, row, curWin.numActualColumns, curWin.numVirtualItems, (c, dataIndex) => { 225 | columnDiffCreateItemCmds.push(new CreateItemCmd(row, rowIndex, c, dataIndex)) 226 | }) 227 | } else if(numColumns < 0) { 228 | forColumnsIn(columnsDiffStart, prevWin.numActualColumns - 1, prevRow, prevWin.numActualColumns, prevWin.numVirtualItems, (c, dataIndex) => { 229 | columnDiffRemoveItemCmds.push(new RemoveItemCmd(prevRow, rowIndex, c, dataIndex)) 230 | }) 231 | } 232 | } 233 | 234 | rowsUpdateCmd$ = concat( 235 | merge(from(removeItemCmds.reverse()), from(createItemCmds), from(updateItemCmds), from(shiftRowCmds)), 236 | merge(from(columnDiffRemoveItemCmds.reverse()), from(columnDiffCreateItemCmds))) 237 | } 238 | 239 | return merge(rowsDiffCmd$, rowsUpdateCmd$) 240 | }), publish()) as ConnectableObservable 241 | 242 | const updateScrollWinFunc$ = scrollWin$.pipe(map(scrollWindow => (state: IVirtualScrollState) => { 243 | state.scrollWindow = scrollWindow 244 | 245 | this._obsService.emitScrollWin([scrollWindow]) 246 | 247 | state.needsCheck = true 248 | return state 249 | })) 250 | 251 | const createRowFunc$ = renderCmd$.pipe( 252 | filter(cmd => cmd.cmdType === CmdOption.CreateRow), 253 | map((cmd: CreateRowCmd) => (state: IVirtualScrollState) => { 254 | const newRow = this._viewContainer.createComponent(this._rowFactory) 255 | newRow.instance.setTransform(cmd.initShift) 256 | state.rows[cmd.actualIndex] = newRow 257 | 258 | this._obsService.emitCreateRow([cmd, newRow]) 259 | 260 | state.needsCheck = false 261 | return state 262 | })) 263 | 264 | const removeRowFunc$ = renderCmd$.pipe( 265 | filter(cmd => cmd.cmdType === CmdOption.RemoveRow), 266 | map((cmd: RemoveRowCmd) => (state: IVirtualScrollState) => { 267 | const rowComp = state.rows[cmd.actualIndex] 268 | rowComp.destroy() 269 | delete state.rows[cmd.actualIndex] 270 | 271 | this._obsService.emitRemoveRow([cmd, rowComp]) 272 | 273 | state.needsCheck = false 274 | return state 275 | })) 276 | 277 | const shiftRowFunc$ = renderCmd$.pipe( 278 | filter(cmd => cmd.cmdType === CmdOption.ShiftRow), 279 | map(cmd => (state: IVirtualScrollState) => { 280 | const shift = cmd as ShiftRowCmd 281 | const row = state.rows[shift.actualIndex] 282 | row.instance.updateRow(shift.virtualIndex) 283 | row.instance.setTransform(shift.shift) 284 | 285 | this._obsService.emitShiftRow([shift, row]) 286 | 287 | state.needsCheck = false 288 | return state 289 | })) 290 | 291 | const createItemFunc$ = renderCmd$.pipe( 292 | filter(cmd => cmd.cmdType === CmdOption.CreateItem), 293 | withLatestFrom(data$), 294 | map(([cmd, data]) => (state: IVirtualScrollState) => { 295 | const createItem = cmd as CreateItemCmd 296 | const item = new ScrollItem(data[createItem.dataIndex], createItem.virtualIndex, createItem.columnIndex) 297 | const viewRef = state.rows[createItem.actualIndex].instance.addItem(this._templateRef, item) 298 | 299 | this._obsService.emitCreateItem([createItem, item, viewRef]) 300 | 301 | state.needsCheck = false 302 | return state 303 | })) 304 | 305 | const updateItemFunc$ = renderCmd$.pipe( 306 | filter(cmd => cmd.cmdType === CmdOption.UpdateItem), 307 | withLatestFrom(data$), 308 | map(([cmd, data]) => (state: IVirtualScrollState) => { 309 | const update = cmd as UpdateItemCmd 310 | const item = data[update.dataIndex] 311 | const viewRef = state.rows[update.actualIndex].instance.updateItem(update.columnIndex, item) 312 | 313 | this._obsService.emitUpdateItem([update, item, viewRef]) 314 | 315 | state.needsCheck = false 316 | return state 317 | })) 318 | 319 | const removeItemFunc$ = renderCmd$.pipe( 320 | filter(cmd => cmd.cmdType === CmdOption.RemoveItem), 321 | map((cmd: RemoveItemCmd) => (state: IVirtualScrollState) => { 322 | const comp = state.rows[cmd.actualIndex] 323 | comp.instance.removeItem(cmd.columnIndex) 324 | 325 | this._obsService.emitRemoveItem([cmd]) 326 | 327 | state.needsCheck = false 328 | return state 329 | })) 330 | 331 | const userCmd$ = this.vsUserCmd.pipe(publish()) as ConnectableObservable 332 | 333 | const userSetScrollTop$ = userCmd$.pipe(filter(cmd => cmd.cmdType === UserCmdOption.SetScrollTop)) 334 | 335 | const focusRowSetScrollTop$ = userCmd$.pipe( 336 | filter(cmd => cmd.cmdType === UserCmdOption.FocusRow), 337 | withLatestFrom(scrollWin$), 338 | map(([cmd, scrollWin]) => { 339 | const focusRow = cmd as FocusRowCmd 340 | return new SetScrollTopCmd(focusRow.rowIndex * scrollWin.itemHeight) 341 | })) 342 | 343 | const focusItemSetScrollTop$ = userCmd$.pipe( 344 | filter(cmd => cmd.cmdType === UserCmdOption.FocusItem), 345 | withLatestFrom(scrollWin$), 346 | map(([cmd, scrollWin]) => { 347 | const focusItem = cmd as FocusItemCmd 348 | return new SetScrollTopCmd(Math.floor(focusItem.itemIndex / scrollWin.numActualColumns) * scrollWin.itemHeight) 349 | })) 350 | 351 | const setScrollTopFunc$ = merge(userSetScrollTop$, focusRowSetScrollTop$, focusItemSetScrollTop$) 352 | .pipe(map((cmd: SetScrollTopCmd) => (state: IVirtualScrollState) => { 353 | setScrollTop(cmd.value) 354 | 355 | state.needsCheck = false 356 | return state 357 | })) 358 | 359 | const scanFunc = (state: IVirtualScrollState, changeFn: (state: IVirtualScrollState) => IVirtualScrollState): IVirtualScrollState => changeFn(state) 360 | 361 | // Update store 362 | const main$: Observable = merge( 363 | createRowFunc$, removeRowFunc$, shiftRowFunc$, 364 | createItemFunc$, removeItemFunc$, updateItemFunc$, 365 | updateScrollWinFunc$, setScrollTopFunc$) 366 | .pipe(scan(scanFunc, {measurement: null, scrollWindow: null, rows: {}, needsCheck: false})) 367 | 368 | this._subs.push(main$ 369 | .pipe(filter(state => state.needsCheck && state.scrollWindow !== null)) 370 | .subscribe(state => { 371 | this.height = state.scrollWindow.virtualHeight 372 | 373 | if(state.scrollWindow.itemWidth === undefined) { 374 | this.width = '100%' 375 | } else { 376 | this.width = `${state.scrollWindow.itemWidth * state.scrollWindow.numActualColumns}px` 377 | } 378 | 379 | this._cdr.markForCheck() 380 | })) 381 | 382 | // Order is important 383 | this._subs.push(userCmd$.connect()) 384 | this._subs.push(renderCmd$.connect()) 385 | this._subs.push(scrollWin$.connect()) 386 | this._subs.push(measure$.connect()) 387 | this._subs.push(options$.connect()) 388 | this._subs.push(data$.connect()) 389 | } 390 | 391 | ngOnDestroy() { 392 | this._subs.forEach(sub => sub.unsubscribe()) 393 | } 394 | } 395 | -------------------------------------------------------------------------------- /src/virtualScroll.module.ts: -------------------------------------------------------------------------------- 1 | import {CommonModule} from '@angular/common' 2 | import {NgModule} from '@angular/core' 3 | 4 | import {ScrollObservableService} from './service' 5 | import {VirtualRowComponent} from './virtualRow.component' 6 | import {VirtualScrollComponent} from './virtualScroll.component' 7 | 8 | @NgModule({ 9 | declarations: [VirtualRowComponent, VirtualScrollComponent], 10 | entryComponents: [VirtualRowComponent], 11 | exports: [VirtualScrollComponent], 12 | imports: [CommonModule], 13 | providers: [ScrollObservableService], 14 | }) 15 | export class VirtualScrollModule { } 16 | -------------------------------------------------------------------------------- /tools/browserSync.js: -------------------------------------------------------------------------------- 1 | var browserSync = require('browser-sync'); 2 | 3 | browserSync({ 4 | open: false, 5 | logLevel: "debug", 6 | logFileChanges: true, 7 | reloadDelay: 200, 8 | reloadDebounce: 500, 9 | files: [ 10 | 'demo/systemjs.config.js', 11 | 'demo/src/*.ts', 'demo/*.html', 12 | 'src/*.ts', 13 | ], 14 | watchOptions: {ignored: 'node_modules'}, 15 | server: {baseDir: './',directory: true} 16 | }); 17 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "target": "es5", 4 | "module": "es2015", 5 | "moduleResolution": "node", 6 | "lib": ["es2015", "dom"], 7 | "noImplicitAny": true, 8 | "sourceMap": true, 9 | "declaration": true, 10 | "removeComments": false, 11 | "strictNullChecks": false, 12 | "experimentalDecorators": true, 13 | "emitDecoratorMetadata": true, 14 | "stripInternal": true, 15 | "alwaysStrict": true, 16 | "noUnusedParameters": false, 17 | "noImplicitReturns": true, 18 | "noFallthroughCasesInSwitch": true, 19 | "suppressImplicitAnyIndexErrors": true, 20 | "outDir": "./dist/es5" 21 | }, 22 | "include": ["src/*.ts", "demo/src/*.ts"], 23 | "exclude": ["demo/src/main-aot.ts"] 24 | } -------------------------------------------------------------------------------- /tslint.json: -------------------------------------------------------------------------------- 1 | { 2 | "defaultSeverity": "error", 3 | "extends": [ 4 | "tslint:recommended" 5 | ], 6 | "jsRules": {}, 7 | "rules": { 8 | "semicolon": [true, "never"], 9 | "arrow-parens": [true, "ban-single-arg-parens"], 10 | "forin": false, 11 | "max-line-length": false, 12 | "member-access": [true, "no-public"], 13 | "member-ordering": false, 14 | "quotemark": [true, "single", "avoid-escape"], 15 | "trailing-comma": false, 16 | "no-angle-bracket-type-assertion": false, 17 | "variable-name": [ 18 | true, 19 | "check-format", 20 | "allow-leading-underscore", 21 | "allow-pascal-case", 22 | "allow-snake-case", 23 | "ban-keywords" 24 | ], 25 | "whitespace": [ 26 | true, 27 | "check-operator", 28 | "check-typecast", 29 | "check-separator", 30 | "check-type", 31 | "check-typecast", 32 | "check-preblock" 33 | ] 34 | }, 35 | "rulesDirectory": [] 36 | } 37 | --------------------------------------------------------------------------------