├── .editorconfig ├── .gitignore ├── LICENSE ├── README.md ├── demo ├── package-lock.json ├── package.json ├── public │ ├── img │ │ └── favicon.ico │ └── index.html ├── src │ ├── bootstrap.ts │ ├── demo │ │ ├── demo.component.ts │ │ └── demo.module.ts │ ├── polyfills.ts │ └── styles │ │ ├── styles.scss │ │ └── utils │ │ ├── _core.scss │ │ └── _variables.scss ├── tsconfig.json └── webpack.config.js ├── package-lock.json ├── package.json ├── src ├── close.directive.ts ├── index.ts ├── sidebar-container.component.ts ├── sidebar.component.ts ├── sidebar.module.ts └── utils.ts ├── tsconfig.json ├── tsconfig.module.json └── tslint.json /.editorconfig: -------------------------------------------------------------------------------- 1 | root = true 2 | 3 | [*] 4 | charset = utf-8 5 | end_of_line = lf 6 | indent_size = 2 7 | indent_style = space 8 | insert_final_newline = true 9 | trim_trailing_whitespace = true 10 | 11 | [*.md] 12 | trim_trailing_whitespace = false 13 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # OS generated files 2 | .DS_Store 3 | ehthumbs.db 4 | Icon? 5 | Thumbs.db 6 | 7 | # Logs 8 | logs 9 | *.log 10 | 11 | # Node files 12 | node_modules 13 | 14 | # Built files 15 | lib_commonjs/ 16 | lib_esmodule/ 17 | 18 | # Built demo files 19 | demo/dist 20 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2016 - present Eugene Cheung 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in 13 | all copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 21 | THE SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # ng-sidebar 2 | 3 | ⚠️ **This package is deprecated and not maintained.** ⚠️ 4 | 5 | --- 6 | 7 | [![NPM](https://nodei.co/npm/ng-sidebar.png?compact=true)](https://nodei.co/npm/ng-sidebar) 8 | 9 | **[Demo](https://echeung.me/ng-sidebar)** 10 | 11 | *Formerly called [ng2-sidebar](https://github.com/arkon/ng2-sidebar)* 12 | 13 | An Angular sidebar component. 14 | 15 | 16 | ## Installation 17 | 18 | ```shell 19 | npm install --save ng-sidebar 20 | ``` 21 | 22 | ### SystemJS configuration 23 | 24 | If you're using SystemJS, be sure to add the appropriate settings to your SystemJS config: 25 | 26 | ```js 27 | const map = { 28 | // ... 29 | 'ng-sidebar': 'node_modules/ng-sidebar', 30 | // ... 31 | }; 32 | 33 | const packages = { 34 | // ... 35 | 'ng-sidebar': { 36 | main: 'lib/index', 37 | defaultExtension: 'js' 38 | }, 39 | // ... 40 | }; 41 | ``` 42 | 43 | 44 | ## Changelog 45 | 46 | See the [releases page](https://github.com/arkon/ng-sidebar/releases) on GitHub. 47 | 48 | 49 | ## Usage 50 | 51 | Add `SidebarModule` to your app module: 52 | 53 | ```typescript 54 | import { SidebarModule } from 'ng-sidebar'; 55 | 56 | @NgModule({ 57 | declarations: [AppComponent], 58 | imports: [BrowserModule, SidebarModule.forRoot()], 59 | bootstrap: [AppComponent], 60 | }) 61 | class AppModule {} 62 | ``` 63 | 64 | In your app component, simply use add a `` wrapper, then place your ``(s) and content within it. 65 | Your page content should be in some container with a `ng-sidebar-content` attribute. 66 | 67 | ```typescript 68 | @Component({ 69 | selector: 'app', 70 | template: ` 71 | 72 | 73 | 74 | 75 | 76 |

Sidebar contents

77 |
78 | 79 | 80 |
81 | 82 |
83 | 84 |
85 | ` 86 | }) 87 | class AppComponent { 88 | private _opened: boolean = false; 89 | 90 | private _toggleSidebar() { 91 | this._opened = !this._opened; 92 | } 93 | } 94 | ``` 95 | 96 | If nothing seems to show up, your wrappers' heights may be collapsing. Try adding a height (e.g. `height: 100vh;`) to the wrapper `` or other wrapper elements you may have. (See [issue #100](https://github.com/arkon/ng-sidebar/issues/100) for more info.) 97 | 98 | A directive is also provided to easily close the sidebar by clicking something inside it: 99 | 100 | ```html 101 | 102 | Closes the sidebar 103 | 104 | ``` 105 | 106 | You can also use the `open()` and `close()` functions: 107 | 108 | ```html 109 | 110 | 111 | 112 | 113 | 114 | ``` 115 | 116 | 117 | ## Functions 118 | 119 | The sidebar has a few public functions: 120 | 121 | | Function | Description | 122 | | -------- | ----------- | 123 | | `open()` | Opens the sidebar. | 124 | | `close()` | Closes the sidebar. | 125 | | `triggerRerender()` | Manually trigger a re-render of the container. Useful if the sidebar contents might change. | 126 | 127 | 128 | ## Styling 129 | 130 | Various class names are attached to the sidebar and container for easier styling. 131 | 132 | If you are using Angular's default emulated view encapsulation, you may have to use the `>>>` selector to target the sidebar's classes. Check out [Angular's documentation](https://angular.io/guide/component-styles#deep) for more details. Note that the `/deep/` selector [will soon be deprecated](https://groups.google.com/a/chromium.org/forum/#!msg/blink-dev/68qSZM5QMRQ/pT2YCqZSomAJ). 133 | 134 | ### Sidebar 135 | 136 | | Class name | Description | 137 | | ---------- | ----------- | 138 | | `ng-sidebar` | Always on the sidebar element. | 139 | | `ng-sidebar--opened` | When `opened` is `true`. | 140 | | `ng-sidebar--closed` | When `opened` is `false`. | 141 | | `ng-sidebar--left` | When `position` is `'left'` (or the `'start'`/`'end'` aliases are equivalent to `'left'`). | 142 | | `ng-sidebar--right` | When `position` is `'right'` (or the `'start'`/`'end'` aliases are equivalent to `'right'`). | 143 | | `ng-sidebar--top` | When `position` is `'top'`. | 144 | | `ng-sidebar--bottom` | When `position` is `'bottom'`. | 145 | | `ng-sidebar--over` | When `mode` is `'over'`. | 146 | | `ng-sidebar--push` | When `mode` is `'push'`. | 147 | | `ng-sidebar--slide` | When `mode` is `'slide'`. | 148 | | `ng-sidebar--docked` | When the sidebar is docked (i.e. it is "closed" and `dock` is `true`). | 149 | | `ng-sidebar--inert` | Ignores pointer clicks. Class is applied when the sidebar is closed. | 150 | | `ng-sidebar--animate` | When `animate` is `true` for a sidebar. | 151 | 152 | ### Backdrop 153 | 154 | | Class name | Description | 155 | | ---------- | ----------- | 156 | | `ng-sidebar__backdrop` | Class of the backdrop `div`. Note that the `div` is only in the DOM when the backdrop is shown. | 157 | 158 | ### Page content 159 | 160 | | Class name | Description | 161 | | ---------- | ----------- | 162 | | `ng-sidebar__content` | Class of the wrapper `div` for the page content. | 163 | | `ng-sidebar__content--animate` | When `animate` is `true` for the container. | 164 | 165 | 166 | 167 | ## Options 168 | 169 | ### `` 170 | 171 | ### Inputs 172 | 173 | | Property name | Type | Default | Description | 174 | | ------------- | ---- | ------- | ----------- | 175 | | contentClass | string | | Additional class name on the `div` wrapping the page contents. | 176 | | backdropClass | string | | Additional class name on the overlay element. | 177 | | showBackdrop | boolean | `false` | Controls the backdrop state of the sidebar container. This should be two-way bound. | 178 | | allowSidebarBackdropControl | boolean | `true` | Determines if the container component respects the sidebar's `showBackdrop` input option. | 179 | | animate | boolean | `true` | Animates the container sliding. | 180 | 181 | #### Outputs 182 | 183 | | Property name | Callback arguments | Description | 184 | | ------------- | ------------------ | ----------- | 185 | | showBackdropChange | `showBackdrop: boolean` | Emitted when `showBackdrop` is modified. This allows for you to do "two-way binding" (i.e. `[(showBackdrop)]`). | 186 | | onBackdropClicked | | Emitted when a backdrop is clicked. | 187 | 188 | 189 | ### `` 190 | 191 | #### Inputs 192 | 193 | | Property name | Type | Default | Description | 194 | | ------------- | ---- | ------- | ----------- | 195 | | opened | boolean | `false` | Controls the opened state of the sidebar. This should be two-way bound. | 196 | | mode | `'over'`, `'push'`, `'slide'` | `'over'` | See the "Modes" section. | 197 | | dock | boolean | `false` | Show the sidebar as docked when closed. | 198 | | dockedSize | string | `'0px'` | When `mode` is set to `'dock'`, this value indicates how much of the sidebar is still visible when "closed". | 199 | | position | `'left'`, `'right'`, `'top'`, `'bottom'`, `'start'`, `'end'` | `'start'` | What side the sidebar should be docked to. `'start'` and `'end'` are aliases that respect the page's language (e.g. `start` is the same as `left` for English, but would be `right` for Hebrew. | 200 | | autoCollapseHeight | number | | Window height in pixels in which to automatically close the sidebar. | 201 | | autoCollapseWidth | number | | Window width in pixels in which to automatically close the sidebar. | 202 | | autoCollapseOnInit | boolean | `true` | Collapse sidebar based on `autoCollapseHeight` and/or `autoCollapseWidth` on initial render as needed. | 203 | | animate | boolean | `true` | Animate the opening/closing of the sidebar. | 204 | | sidebarClass | string | | Additional class name on the sidebar element. | 205 | | ariaLabel | string | | Value for the sidebar's `aria-label` attribute. | 206 | | trapFocus | boolean | `false` | Keeps focus within the sidebar when open. Note that this only works if there's one sidebar open at a time. | 207 | | autoFocus | boolean | `true` | Automatically focus the first focusable element in the sidebar when opened. | 208 | | showBackdrop | boolean | `false` | If a translucent black backdrop overlay should appear over the page contents when the sidebar is opened. This is ignored if the sidebar's parent container has its `allowSidebarBackdropControl` property set to `true`. | 209 | | closeOnClickBackdrop | boolean | `false` | Whether clicking on the backdrop of the open sidebar will close it. | 210 | | closeOnClickOutside | boolean | `false` | Whether clicking outside of the open sidebar will close it. | 211 | | keyClose | boolean | `false` | Close the sidebar when a keyboard button is pressed. | 212 | | keyCode | number | `27` | The [key code](http://keycode.info/) for `keyClose`. | 213 | 214 | #### Outputs 215 | 216 | | Property name | Callback arguments | Description | 217 | | ------------- | ------------------ | ----------- | 218 | | onContentInit | | Corresponds with `ngAfterContentInit` lifecycle event of the sidebar component. | 219 | | openedChange | `opened: boolean` | Emitted when `opened` is modified. This allows for you to do "two-way binding" (i.e. `[(opened)]`). | 220 | | onOpenStart | | Emitted when the sidebar is opening. | 221 | | onOpened | | Emitted when the sidebar is opened. | 222 | | onCloseStart | | Emitted when the sidebar is closing. | 223 | | onClosed | | Emitted when the sidebar is closed. | 224 | | onTransitionEnd | | Emitted when the animation for opening or closing ends. | 225 | | onModeChange | `mode: string` | Emitted when `mode` is changed. | 226 | | onPositionChange | `position: string` | Emitted when `position` is changed. | 227 | 228 | #### Modes 229 | 230 | ##### `over` 231 | 232 | This is the default mode. The sidebar slides in over the page contents. 233 | 234 | ##### `push` 235 | 236 | The page contents is pushed to make space for the sidebar. 237 | 238 | ##### `slide` 239 | 240 | The entire page slides over to show the sidebar. Note that this only works if you have one sidebar open at a time. 241 | -------------------------------------------------------------------------------- /demo/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "ng-sidebar-demo", 3 | "version": "0.0.0", 4 | "description": "Demo of ng-sidebar.", 5 | "repository": { 6 | "type": "git", 7 | "url": "https://github.com/arkon/ng-sidebar.git" 8 | }, 9 | "author": "Eugene Cheung", 10 | "license": "MIT", 11 | "scripts": { 12 | "install-lib": "npm i -f ng-sidebar", 13 | "start": "webpack-dev-server --progress --colors", 14 | "build": "webpack -p --progress --colors", 15 | "deploy": "npm run build && gh-pages -d dist" 16 | }, 17 | "engines": { 18 | "node": ">=10" 19 | }, 20 | "dependencies": { 21 | "@angular/common": "^8.2.14", 22 | "@angular/compiler": "^8.2.14", 23 | "@angular/core": "^8.2.14", 24 | "@angular/platform-browser": "^8.2.14", 25 | "@angular/platform-browser-dynamic": "^8.2.14", 26 | "es6-shim": "^0.35.5", 27 | "ng-sidebar": "file:..", 28 | "reflect-metadata": "^0.1.13", 29 | "rxjs": "^6.5.5", 30 | "zone.js": "~0.9.1" 31 | }, 32 | "devDependencies": { 33 | "copy-webpack-plugin": "^5.0.5", 34 | "css-loader": "^3.5.3", 35 | "extract-text-webpack-plugin": "^4.0.0-beta.0", 36 | "gh-pages": "^2.2.0", 37 | "html-webpack-plugin": "^4.2.0", 38 | "node-sass": "^4.14.1", 39 | "sass-loader": "^8.0.2", 40 | "style-loader": "^1.2.0", 41 | "ts-loader": "^6.2.1", 42 | "typescript": "~3.4.0", 43 | "webpack": "^4.43.0", 44 | "webpack-cli": "^3.3.11", 45 | "webpack-dev-server": "^3.11.0" 46 | } 47 | } 48 | -------------------------------------------------------------------------------- /demo/public/img/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/arkon/ng-sidebar/a3ba51dfcb08afc161fe46bffe32e0b2e5514f3b/demo/public/img/favicon.ico -------------------------------------------------------------------------------- /demo/public/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | ng-sidebar 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 |

Loading demo...

16 |
17 | 18 | 19 | -------------------------------------------------------------------------------- /demo/src/bootstrap.ts: -------------------------------------------------------------------------------- 1 | import { enableProdMode } from '@angular/core'; 2 | import { platformBrowserDynamic } from '@angular/platform-browser-dynamic'; 3 | 4 | import { DemoAppModule } from './demo/demo.module'; 5 | 6 | import './styles/styles.scss'; 7 | 8 | enableProdMode(); 9 | 10 | platformBrowserDynamic() 11 | .bootstrapModule(DemoAppModule) 12 | .catch(err => console.log(err)); 13 | -------------------------------------------------------------------------------- /demo/src/demo/demo.component.ts: -------------------------------------------------------------------------------- 1 | import { Component } from '@angular/core'; 2 | 3 | @Component({ 4 | selector: 'demo', 5 | template: ` 6 | 8 | 30 |

Sidebar contents

31 | 32 | 33 |

This will close the sidebar too

34 | 35 |
36 | 37 |

Throwup on your pillow.

38 |

Steal the warm chair right after you get up.

39 |

Use lap as chair hide head under blanket.

40 |

Walk on car leaving trail of paw prints on hood.

41 |

Steal the warm chair right after you get up.

42 |
43 | 44 |
45 |
46 | 47 | ng-sidebar 48 |
49 | 50 |
51 |

Options

52 | 53 |

Sidebar

54 | 55 |
56 | 57 | 58 | 59 | 60 |
61 | 62 |
63 | 64 | 65 |
66 | 67 |
68 | 69 | 70 | 71 | 72 |
73 | 74 |
75 | 76 | 77 | 78 |
79 | 80 | 81 |

Documentation

82 | 83 |

See the README on GitHub for more options and info.

84 | 85 | 86 |

Download

87 | 88 |

Download from NPM.

89 |

Source code available on GitHub.

90 |

Source code for this demo is also on GitHub.

91 | 92 | 93 |

Some filler content

94 | 95 |

Lie on your belly and purr when you are asleep attack feet spit up on light gray carpet instead of adjacent linoleum but scream at teh bath. Throwup on your pillow steal the warm chair right after you get up for cat slap dog in face. Scratch leg; meow for can opener to feed me. Jump off balcony, onto stranger's head sleep on dog bed, force dog to sleep on floor so jump around on couch, meow constantly until given food, . Use lap as chair hide head under blanket so no one can see sleep on keyboard, for lick plastic bags intently sniff hand burrow under covers. Lick butt and make a weird face. Purr for no reason kitty loves pigs but intrigued by the shower, but scratch the furniture. Lay on arms while you're using the keyboard hate dog get video posted to internet for chasing red dot. If it smells like fish eat as much as you wish chase ball of string and favor packaging over toy. Hide head under blanket so no one can see. Kitty power! purr while eating yet lick the other cats behind the couch. Walk on car leaving trail of paw prints on hood and windshield you call this cat food? ears back wide eyed poop on grasses. Scratch the furniture flop over russian blue or eat grass, throw it back up for hide at bottom of staircase to trip human. Tuxedo cats always looking dapper scratch leg; meow for can opener to feed me. Under the bed need to chase tail claws in your leg, and loves cheeseburgers and intently stare at the same spot chase dog then run away. Nap all day lick sellotape pooping rainbow while flying in a toasted bread costume in space ignore the squirrels, you'll never catch them anyway but destroy couch. Lick yarn hanging out of own butt knock dish off table head butt cant eat out of my own dish lick plastic bags pee in the shoe. Hopped up on catnip chirp at birds kitty power! sleep nap. Climb leg damn that dog . Flee in terror at cucumber discovered on floor. Stare at ceiling light sun bathe. Dream about hunting birds when in doubt, wash or intently stare at the same spot, yet shove bum in owner's face like camera lens. Cat slap dog in face. Need to chase tail meowwww.

96 | 97 |

Brown cats with pink ears stares at human while pushing stuff off a table i like big cats and i can not lie or chase laser scamper have secret plans, but fall asleep on the washing machine. Stare at ceiling destroy couch as revenge russian blue for leave fur on owners clothes slap owner's face at 5am until human fills food dish for claws in your leg stare at wall turn and meow stare at wall some more meow again continue staring . Steal the warm chair right after you get up use lap as chair howl uncontrollably for no reason for kitty scratches couch bad kitty so poop in the plant pot, wake up wander around the house making large amounts of noise jump on top of your human's bed and fall asleep again. Paw at beetle and eat it before it gets away chase dog then run away. Sleep on dog bed, force dog to sleep on floor i am the best refuse to leave cardboard box yet lounge in doorway but Gate keepers of hell. My left donut is missing, as is my right destroy the blinds refuse to leave cardboard box. Ears back wide eyed shake treat bag. Lick butt present belly, scratch hand when stroked, eat the fat cats food, why must they do that favor packaging over toy. Scratch leg; meow for can opener to feed me shove bum in owner's face like camera lens. Missing until dinner time meow. Attack the dog then pretend like nothing happened run in circles, and steal the warm chair right after you get up and inspect anything brought into the house, yet poop in litter box, scratch the walls. Sit in window and stare ooo, a bird! yum hide when guests come over rub face on everything, so knock dish off table head butt cant eat out of my own dish pee in the shoe sit in box. Pelt around the house and up and down stairs chasing phantoms bleghbleghvomit my furball really tie the room together yet all of a sudden cat goes crazy, and get video posted to internet for chasing red dot. Inspect anything brought into the house scratch leg; meow for can opener to feed me but bathe private parts with tongue then lick owner's face kitty power! . Hola te quiero use lap as chair. Intently sniff hand eat a plant, kill a hand or lick the other cats but climb a tree, wait for a fireman jump to fireman then scratch his face yet meowing non stop for food. Thug cat immediately regret falling into bathtub so sit on human kitty scratches couch bad kitty. Please stop looking at your phone and pet me. Lounge in doorway destroy couch, and if it fits, i sits wake up human for food at 4am. Instantly break out into full speed gallop across the house for no reason chew on cable leave fur on owners clothes yet chase mice, so gnaw the corn cob so throwup on your pillow. Intrigued by the shower scratch the furniture but shove bum in owner's face like camera lens so wake up wander around the house making large amounts of noise jump on top of your human's bed and fall asleep again yet sit on the laptop. Love to play with owner's hair tie thug cat drink water out of the faucet. I am the best kick up litter yet hide from vacuum cleaner and behind the couch, attack feet gnaw the corn cob. Howl uncontrollably for no reason human give me attention meow for hola te quiero.

98 | 99 |

Sit on human gnaw the corn cob but lounge in doorway yet ears back wide eyed. Hide when guests come over rub face on everything, fall asleep on the washing machine you call this cat food? for wake up wander around the house making large amounts of noise jump on top of your human's bed and fall asleep again for spread kitty litter all over house. If it fits, i sits eat grass, throw it back up stick butt in face. Peer out window, chatter at birds, lure them to mouth. Put toy mouse in food bowl run out of litter box at full speed inspect anything brought into the house, for eat prawns daintily with a claw then lick paws clean wash down prawns with a lap of carnation milk then retire to the warmest spot on the couch to claw at the fabric before taking a catnap chase laser. Human give me attention meow spit up on light gray carpet instead of adjacent linoleum for hunt by meowing loudly at 5am next to human slave food dispenser thinking longingly about tuna brine. Asdflkjaertvlkjasntvkjn (sits on keyboard) stare at the wall, play with food and get confused by dust flop over need to chase tail damn that dog so mew get video posted to internet for chasing red dot. Groom yourself 4 hours - checked, have your beauty sleep 18 hours - checked, be fabulous for the rest of the day - checked! cats go for world domination for stare at ceiling, or purr while eating yet kitty loves pigs.

100 | 101 |

Text from Cat Ipsum.

102 |
103 |
104 |
105 | ` 106 | }) 107 | export class DemoComponent { 108 | private _opened: boolean = false; 109 | private _modeNum: number = 0; 110 | private _positionNum: number = 0; 111 | private _dock: boolean = false; 112 | private _closeOnClickOutside: boolean = false; 113 | private _closeOnClickBackdrop: boolean = false; 114 | private _showBackdrop: boolean = false; 115 | private _animate: boolean = true; 116 | private _trapFocus: boolean = true; 117 | private _autoFocus: boolean = true; 118 | private _keyClose: boolean = false; 119 | private _autoCollapseHeight: number = null; 120 | private _autoCollapseWidth: number = null; 121 | 122 | private _MODES: Array = ['over', 'push', 'slide']; 123 | private _POSITIONS: Array = ['left', 'right', 'top', 'bottom']; 124 | 125 | private _toggleOpened(): void { 126 | this._opened = !this._opened; 127 | } 128 | 129 | private _toggleMode(): void { 130 | this._modeNum++; 131 | 132 | if (this._modeNum === this._MODES.length) { 133 | this._modeNum = 0; 134 | } 135 | } 136 | 137 | private _toggleAutoCollapseHeight(): void { 138 | this._autoCollapseHeight = this._autoCollapseHeight ? null : 500; 139 | } 140 | 141 | private _toggleAutoCollapseWidth(): void { 142 | this._autoCollapseWidth = this._autoCollapseWidth ? null : 500; 143 | } 144 | 145 | private _togglePosition(): void { 146 | this._positionNum++; 147 | 148 | if (this._positionNum === this._POSITIONS.length) { 149 | this._positionNum = 0; 150 | } 151 | } 152 | 153 | private _toggleDock(): void { 154 | this._dock = !this._dock; 155 | } 156 | 157 | private _toggleCloseOnClickOutside(): void { 158 | this._closeOnClickOutside = !this._closeOnClickOutside; 159 | } 160 | 161 | private _toggleCloseOnClickBackdrop(): void { 162 | this._closeOnClickBackdrop = !this._closeOnClickBackdrop; 163 | } 164 | 165 | private _toggleShowBackdrop(): void { 166 | this._showBackdrop = !this._showBackdrop; 167 | } 168 | 169 | private _toggleAnimate(): void { 170 | this._animate = !this._animate; 171 | } 172 | 173 | private _toggleTrapFocus(): void { 174 | this._trapFocus = !this._trapFocus; 175 | } 176 | 177 | private _toggleAutoFocus(): void { 178 | this._autoFocus = !this._autoFocus; 179 | } 180 | 181 | private _toggleKeyClose(): void { 182 | this._keyClose = !this._keyClose; 183 | } 184 | 185 | private _onOpenStart(): void { 186 | console.info('Sidebar opening'); 187 | } 188 | 189 | private _onOpened(): void { 190 | console.info('Sidebar opened'); 191 | } 192 | 193 | private _onCloseStart(): void { 194 | console.info('Sidebar closing'); 195 | } 196 | 197 | private _onClosed(): void { 198 | console.info('Sidebar closed'); 199 | } 200 | 201 | private _onTransitionEnd(): void { 202 | console.info('Transition ended'); 203 | } 204 | 205 | private _onBackdropClicked(): void { 206 | console.info('Backdrop clicked'); 207 | } 208 | } 209 | -------------------------------------------------------------------------------- /demo/src/demo/demo.module.ts: -------------------------------------------------------------------------------- 1 | import { NgModule } from '@angular/core'; 2 | import { BrowserModule } from '@angular/platform-browser'; 3 | import { SidebarModule } from 'ng-sidebar'; 4 | 5 | import { DemoComponent } from './demo.component'; 6 | 7 | @NgModule({ 8 | declarations: [DemoComponent], 9 | imports: [BrowserModule, SidebarModule.forRoot()], 10 | bootstrap: [DemoComponent], 11 | }) 12 | export class DemoAppModule {} 13 | -------------------------------------------------------------------------------- /demo/src/polyfills.ts: -------------------------------------------------------------------------------- 1 | import 'es6-shim'; 2 | import 'zone.js/dist/zone'; 3 | import 'reflect-metadata'; 4 | -------------------------------------------------------------------------------- /demo/src/styles/styles.scss: -------------------------------------------------------------------------------- 1 | @charset "utf-8"; 2 | 3 | @import 'utils/variables'; 4 | @import 'utils/core'; 5 | 6 | .loading { 7 | padding: 1em; 8 | } 9 | 10 | demo { 11 | height: 100%; 12 | width: 100%; 13 | } 14 | 15 | .demo-header { 16 | align-items: center; 17 | background: $brand; 18 | box-shadow: 0 0.1em 1.5em rgba($dark-grey, 0.5); 19 | color: $white; 20 | display: flex; 21 | padding: 1em; 22 | } 23 | 24 | .demo-header__toggle { 25 | background: transparent; 26 | border: 0.15rem solid $white; 27 | border-left: 0; 28 | border-right: 0; 29 | cursor: pointer; 30 | font-size: 0; 31 | height: 1.5rem; 32 | margin-right: 1rem; 33 | position: relative; 34 | width: 2rem; 35 | 36 | &::after { 37 | background: $white; 38 | content: ''; 39 | height: 0.15rem; 40 | left: 0; 41 | margin-top: -0.075rem; 42 | position: absolute; 43 | top: 50%; 44 | width: 100%; 45 | } 46 | } 47 | 48 | .demo-sidebar { 49 | background-color: #fff; 50 | padding: 2em 1em; 51 | 52 | &.ng-sidebar--opened.ng-sidebar--over { 53 | box-shadow: 0 0 2.5em rgba(85, 85, 85, 0.5); 54 | } 55 | } 56 | 57 | .demo-contents { 58 | padding: 0 2em; 59 | } 60 | 61 | .demo-control { 62 | background-color: $light-grey; 63 | border: 1px solid $dark-grey; 64 | cursor: pointer; 65 | margin-bottom: 0.5em; 66 | padding: 0.5em 2em; 67 | transition: background-color 0.15s; 68 | 69 | &:hover { 70 | background-color: $dark-grey; 71 | color: $white; 72 | } 73 | } 74 | -------------------------------------------------------------------------------- /demo/src/styles/utils/_core.scss: -------------------------------------------------------------------------------- 1 | * { 2 | box-sizing: border-box; 3 | margin: 0; 4 | padding: 0; 5 | } 6 | 7 | html, 8 | body { 9 | height: 100%; 10 | width: 100%; 11 | } 12 | 13 | body { 14 | background: $light-grey; 15 | color: $dark-grey; 16 | font: 400 1em/1.25 $fonts; 17 | } 18 | 19 | ::selection { 20 | background-color: $brand; 21 | color: $white; 22 | } 23 | 24 | a { 25 | color: $brand; 26 | text-decoration: none; 27 | 28 | &:hover { 29 | border-bottom: 1px dotted $brand; 30 | } 31 | } 32 | 33 | p { 34 | margin-bottom: 1em; 35 | } 36 | 37 | h1, 38 | h2 { 39 | font-weight: 300; 40 | } 41 | 42 | h1 { 43 | border-bottom: 1px dotted $brand; 44 | display: block; 45 | margin: 2rem 0 1rem; 46 | padding-bottom: 0.5rem; 47 | } 48 | 49 | h2 { 50 | margin: 0.5rem 0; 51 | } 52 | -------------------------------------------------------------------------------- /demo/src/styles/utils/_variables.scss: -------------------------------------------------------------------------------- 1 | $fonts: 'Source Sans Pro', 'Helvetica', 'Arial', sans-serif; 2 | 3 | $brand: #0273d4; 4 | $light-grey: #f6f6f6; 5 | $dark-grey: #545555; 6 | $white: #fff; 7 | -------------------------------------------------------------------------------- /demo/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "target": "es5", 4 | "module": "commonjs", 5 | "moduleResolution": "node", 6 | "sourceMap": true, 7 | "emitDecoratorMetadata": true, 8 | "experimentalDecorators": true, 9 | "removeComments": true, 10 | "lib": ["dom", "es5", "es2015.core", "es2015.collection", "es2015.iterable", "es2015.promise"] 11 | }, 12 | "include": [ 13 | "src/**/*" 14 | ], 15 | "compileOnSave": false, 16 | "buildOnSave": false 17 | } 18 | -------------------------------------------------------------------------------- /demo/webpack.config.js: -------------------------------------------------------------------------------- 1 | const path = require('path'); 2 | const webpack = require('webpack'); 3 | const CopyWebpackPlugin = require('copy-webpack-plugin'); 4 | const ExtractTextPlugin = require('extract-text-webpack-plugin'); 5 | const HtmlWebpackPlugin = require('html-webpack-plugin'); 6 | 7 | const root = function (args) { 8 | return path.join.apply(path, [__dirname].concat(...arguments)); 9 | }; 10 | 11 | module.exports = { 12 | entry: [ 13 | root('src/polyfills.ts'), 14 | root('src/bootstrap.ts') 15 | ], 16 | 17 | output: { 18 | path: root('dist'), 19 | filename: 'js/[name].js' 20 | }, 21 | 22 | resolve: { 23 | modules: [path.join(__dirname, 'node_modules')], 24 | extensions: ['.js', '.ts', '.scss', '.html'] 25 | }, 26 | 27 | module: { 28 | rules: [ 29 | { 30 | test: /\.ts$/, 31 | exclude: [/node_modules\//], 32 | loader: 'ts-loader' 33 | }, 34 | { 35 | test: /\.scss$/, 36 | loader: ExtractTextPlugin.extract({ 37 | fallback: 'style-loader', 38 | use: [ 39 | { 40 | loader: 'css-loader', 41 | options: { 42 | 'sourceMap': true, 43 | 'importLoaders': 1 44 | } 45 | }, 46 | 'sass-loader' 47 | ] 48 | }) 49 | } 50 | ] 51 | }, 52 | 53 | plugins: [ 54 | new HtmlWebpackPlugin({ 55 | template: root('public/index.html'), 56 | inject: true 57 | }), 58 | 59 | new ExtractTextPlugin({ 60 | filename: 'css/[name].css' 61 | }), 62 | 63 | new CopyWebpackPlugin([{ 64 | from: root('public') 65 | }]), 66 | 67 | new webpack.ContextReplacementPlugin( 68 | /angular(\\|\/)core(\\|\/)@angular/, 69 | root('src') 70 | ) 71 | ], 72 | 73 | devServer: { 74 | contentBase: root('public'), 75 | stats: { chunkModules: false }, 76 | } 77 | }; 78 | -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "ng-sidebar", 3 | "version": "9.4.3", 4 | "lockfileVersion": 1, 5 | "requires": true, 6 | "dependencies": { 7 | "@angular/common": { 8 | "version": "8.2.14", 9 | "resolved": "https://registry.npmjs.org/@angular/common/-/common-8.2.14.tgz", 10 | "integrity": "sha512-Qmt+aX2quUW54kaNT7QH7WGXnFxr/cC2C6sf5SW5SdkZfDQSiz8IaItvieZfXVQUbBOQKFRJ7TlSkt0jI/yjvw==", 11 | "dev": true, 12 | "requires": { 13 | "tslib": "^1.9.0" 14 | } 15 | }, 16 | "@angular/compiler": { 17 | "version": "8.2.14", 18 | "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-8.2.14.tgz", 19 | "integrity": "sha512-ABZO4E7eeFA1QyJ2trDezxeQM5ZFa1dXw1Mpl/+1vuXDKNjJgNyWYwKp/NwRkLmrsuV0yv4UDCDe4kJOGbPKnw==", 20 | "dev": true, 21 | "requires": { 22 | "tslib": "^1.9.0" 23 | } 24 | }, 25 | "@angular/compiler-cli": { 26 | "version": "8.2.14", 27 | "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-8.2.14.tgz", 28 | "integrity": "sha512-XDrTyrlIZM+0NquVT+Kbg5bn48AaWFT+B3bAT288PENrTdkuxuF9AhjFRZj8jnMdmaE4O2rioEkXBtl6z3zptA==", 29 | "dev": true, 30 | "requires": { 31 | "canonical-path": "1.0.0", 32 | "chokidar": "^2.1.1", 33 | "convert-source-map": "^1.5.1", 34 | "dependency-graph": "^0.7.2", 35 | "magic-string": "^0.25.0", 36 | "minimist": "^1.2.0", 37 | "reflect-metadata": "^0.1.2", 38 | "source-map": "^0.6.1", 39 | "tslib": "^1.9.0", 40 | "yargs": "13.1.0" 41 | } 42 | }, 43 | "@angular/core": { 44 | "version": "8.2.14", 45 | "resolved": "https://registry.npmjs.org/@angular/core/-/core-8.2.14.tgz", 46 | "integrity": "sha512-zeePkigi+hPh3rN7yoNENG/YUBUsIvUXdxx+AZq+QPaFeKEA2FBSrKn36ojHFrdJUjKzl0lPMEiGC2b6a6bo6g==", 47 | "dev": true, 48 | "requires": { 49 | "tslib": "^1.9.0" 50 | } 51 | }, 52 | "@angular/platform-browser": { 53 | "version": "8.2.14", 54 | "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-8.2.14.tgz", 55 | "integrity": "sha512-MtJptptyKzsE37JZ2VB/tI4cvMrdAH+cT9pMBYZd66YSZfKjIj5s+AZo7z8ncoskQSB1o3HMfDjSK7QXGx1mLQ==", 56 | "dev": true, 57 | "requires": { 58 | "tslib": "^1.9.0" 59 | } 60 | }, 61 | "@babel/code-frame": { 62 | "version": "7.5.5", 63 | "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.5.5.tgz", 64 | "integrity": "sha512-27d4lZoomVyo51VegxI20xZPuSHusqbQag/ztrBC7wegWoQ1nLREPVSKSW8byhTlzTKyNE4ifaTA6lCp7JjpFw==", 65 | "dev": true, 66 | "requires": { 67 | "@babel/highlight": "^7.0.0" 68 | } 69 | }, 70 | "@babel/highlight": { 71 | "version": "7.5.0", 72 | "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.5.0.tgz", 73 | "integrity": "sha512-7dV4eu9gBxoM0dAnj/BCFDW9LFU0zvTrkq0ugM7pnHEgguOEeOz1so2ZghEdzviYzQEED0r4EAgpsBChKy1TRQ==", 74 | "dev": true, 75 | "requires": { 76 | "chalk": "^2.0.0", 77 | "esutils": "^2.0.2", 78 | "js-tokens": "^4.0.0" 79 | } 80 | }, 81 | "ansi-regex": { 82 | "version": "3.0.0", 83 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", 84 | "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", 85 | "dev": true 86 | }, 87 | "ansi-styles": { 88 | "version": "3.2.1", 89 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", 90 | "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", 91 | "dev": true, 92 | "requires": { 93 | "color-convert": "^1.9.0" 94 | } 95 | }, 96 | "anymatch": { 97 | "version": "2.0.0", 98 | "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", 99 | "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", 100 | "dev": true, 101 | "requires": { 102 | "micromatch": "^3.1.4", 103 | "normalize-path": "^2.1.1" 104 | }, 105 | "dependencies": { 106 | "normalize-path": { 107 | "version": "2.1.1", 108 | "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", 109 | "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", 110 | "dev": true, 111 | "requires": { 112 | "remove-trailing-separator": "^1.0.1" 113 | } 114 | } 115 | } 116 | }, 117 | "argparse": { 118 | "version": "1.0.10", 119 | "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", 120 | "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", 121 | "dev": true, 122 | "requires": { 123 | "sprintf-js": "~1.0.2" 124 | } 125 | }, 126 | "arr-diff": { 127 | "version": "4.0.0", 128 | "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", 129 | "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", 130 | "dev": true 131 | }, 132 | "arr-flatten": { 133 | "version": "1.1.0", 134 | "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", 135 | "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==", 136 | "dev": true 137 | }, 138 | "arr-union": { 139 | "version": "3.1.0", 140 | "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", 141 | "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=", 142 | "dev": true 143 | }, 144 | "array-unique": { 145 | "version": "0.3.2", 146 | "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", 147 | "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", 148 | "dev": true 149 | }, 150 | "assign-symbols": { 151 | "version": "1.0.0", 152 | "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", 153 | "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=", 154 | "dev": true 155 | }, 156 | "async-each": { 157 | "version": "1.0.3", 158 | "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.3.tgz", 159 | "integrity": "sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ==", 160 | "dev": true 161 | }, 162 | "atob": { 163 | "version": "2.1.2", 164 | "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", 165 | "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==", 166 | "dev": true 167 | }, 168 | "balanced-match": { 169 | "version": "1.0.0", 170 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", 171 | "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", 172 | "dev": true 173 | }, 174 | "base": { 175 | "version": "0.11.2", 176 | "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", 177 | "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", 178 | "dev": true, 179 | "requires": { 180 | "cache-base": "^1.0.1", 181 | "class-utils": "^0.3.5", 182 | "component-emitter": "^1.2.1", 183 | "define-property": "^1.0.0", 184 | "isobject": "^3.0.1", 185 | "mixin-deep": "^1.2.0", 186 | "pascalcase": "^0.1.1" 187 | }, 188 | "dependencies": { 189 | "define-property": { 190 | "version": "1.0.0", 191 | "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", 192 | "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", 193 | "dev": true, 194 | "requires": { 195 | "is-descriptor": "^1.0.0" 196 | } 197 | }, 198 | "is-accessor-descriptor": { 199 | "version": "1.0.0", 200 | "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", 201 | "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", 202 | "dev": true, 203 | "requires": { 204 | "kind-of": "^6.0.0" 205 | } 206 | }, 207 | "is-data-descriptor": { 208 | "version": "1.0.0", 209 | "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", 210 | "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", 211 | "dev": true, 212 | "requires": { 213 | "kind-of": "^6.0.0" 214 | } 215 | }, 216 | "is-descriptor": { 217 | "version": "1.0.2", 218 | "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", 219 | "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", 220 | "dev": true, 221 | "requires": { 222 | "is-accessor-descriptor": "^1.0.0", 223 | "is-data-descriptor": "^1.0.0", 224 | "kind-of": "^6.0.2" 225 | } 226 | } 227 | } 228 | }, 229 | "binary-extensions": { 230 | "version": "1.13.1", 231 | "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz", 232 | "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==", 233 | "dev": true 234 | }, 235 | "brace-expansion": { 236 | "version": "1.1.11", 237 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", 238 | "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", 239 | "dev": true, 240 | "requires": { 241 | "balanced-match": "^1.0.0", 242 | "concat-map": "0.0.1" 243 | } 244 | }, 245 | "braces": { 246 | "version": "2.3.2", 247 | "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", 248 | "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", 249 | "dev": true, 250 | "requires": { 251 | "arr-flatten": "^1.1.0", 252 | "array-unique": "^0.3.2", 253 | "extend-shallow": "^2.0.1", 254 | "fill-range": "^4.0.0", 255 | "isobject": "^3.0.1", 256 | "repeat-element": "^1.1.2", 257 | "snapdragon": "^0.8.1", 258 | "snapdragon-node": "^2.0.1", 259 | "split-string": "^3.0.2", 260 | "to-regex": "^3.0.1" 261 | }, 262 | "dependencies": { 263 | "extend-shallow": { 264 | "version": "2.0.1", 265 | "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", 266 | "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", 267 | "dev": true, 268 | "requires": { 269 | "is-extendable": "^0.1.0" 270 | } 271 | } 272 | } 273 | }, 274 | "builtin-modules": { 275 | "version": "1.1.1", 276 | "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", 277 | "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=", 278 | "dev": true 279 | }, 280 | "cache-base": { 281 | "version": "1.0.1", 282 | "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", 283 | "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", 284 | "dev": true, 285 | "requires": { 286 | "collection-visit": "^1.0.0", 287 | "component-emitter": "^1.2.1", 288 | "get-value": "^2.0.6", 289 | "has-value": "^1.0.0", 290 | "isobject": "^3.0.1", 291 | "set-value": "^2.0.0", 292 | "to-object-path": "^0.3.0", 293 | "union-value": "^1.0.0", 294 | "unset-value": "^1.0.0" 295 | } 296 | }, 297 | "camelcase": { 298 | "version": "5.3.1", 299 | "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", 300 | "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", 301 | "dev": true 302 | }, 303 | "canonical-path": { 304 | "version": "1.0.0", 305 | "resolved": "https://registry.npmjs.org/canonical-path/-/canonical-path-1.0.0.tgz", 306 | "integrity": "sha512-feylzsbDxi1gPZ1IjystzIQZagYYLvfKrSuygUCgf7z6x790VEzze5QEkdSV1U58RA7Hi0+v6fv4K54atOzATg==", 307 | "dev": true 308 | }, 309 | "chalk": { 310 | "version": "2.4.2", 311 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", 312 | "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", 313 | "dev": true, 314 | "requires": { 315 | "ansi-styles": "^3.2.1", 316 | "escape-string-regexp": "^1.0.5", 317 | "supports-color": "^5.3.0" 318 | } 319 | }, 320 | "chokidar": { 321 | "version": "2.1.8", 322 | "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz", 323 | "integrity": "sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==", 324 | "dev": true, 325 | "requires": { 326 | "anymatch": "^2.0.0", 327 | "async-each": "^1.0.1", 328 | "braces": "^2.3.2", 329 | "fsevents": "^1.2.7", 330 | "glob-parent": "^3.1.0", 331 | "inherits": "^2.0.3", 332 | "is-binary-path": "^1.0.0", 333 | "is-glob": "^4.0.0", 334 | "normalize-path": "^3.0.0", 335 | "path-is-absolute": "^1.0.0", 336 | "readdirp": "^2.2.1", 337 | "upath": "^1.1.1" 338 | } 339 | }, 340 | "class-utils": { 341 | "version": "0.3.6", 342 | "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", 343 | "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", 344 | "dev": true, 345 | "requires": { 346 | "arr-union": "^3.1.0", 347 | "define-property": "^0.2.5", 348 | "isobject": "^3.0.0", 349 | "static-extend": "^0.1.1" 350 | }, 351 | "dependencies": { 352 | "define-property": { 353 | "version": "0.2.5", 354 | "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", 355 | "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", 356 | "dev": true, 357 | "requires": { 358 | "is-descriptor": "^0.1.0" 359 | } 360 | } 361 | } 362 | }, 363 | "cliui": { 364 | "version": "4.1.0", 365 | "resolved": "https://registry.npmjs.org/cliui/-/cliui-4.1.0.tgz", 366 | "integrity": "sha512-4FG+RSG9DL7uEwRUZXZn3SS34DiDPfzP0VOiEwtUWlE+AR2EIg+hSyvrIgUUfhdgR/UkAeW2QHgeP+hWrXs7jQ==", 367 | "dev": true, 368 | "requires": { 369 | "string-width": "^2.1.1", 370 | "strip-ansi": "^4.0.0", 371 | "wrap-ansi": "^2.0.0" 372 | }, 373 | "dependencies": { 374 | "string-width": { 375 | "version": "2.1.1", 376 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", 377 | "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", 378 | "dev": true, 379 | "requires": { 380 | "is-fullwidth-code-point": "^2.0.0", 381 | "strip-ansi": "^4.0.0" 382 | } 383 | } 384 | } 385 | }, 386 | "code-point-at": { 387 | "version": "1.1.0", 388 | "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", 389 | "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", 390 | "dev": true 391 | }, 392 | "collection-visit": { 393 | "version": "1.0.0", 394 | "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", 395 | "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", 396 | "dev": true, 397 | "requires": { 398 | "map-visit": "^1.0.0", 399 | "object-visit": "^1.0.0" 400 | } 401 | }, 402 | "color-convert": { 403 | "version": "1.9.3", 404 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", 405 | "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", 406 | "dev": true, 407 | "requires": { 408 | "color-name": "1.1.3" 409 | } 410 | }, 411 | "color-name": { 412 | "version": "1.1.3", 413 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", 414 | "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", 415 | "dev": true 416 | }, 417 | "commander": { 418 | "version": "2.20.3", 419 | "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", 420 | "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", 421 | "dev": true 422 | }, 423 | "component-emitter": { 424 | "version": "1.3.0", 425 | "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", 426 | "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==", 427 | "dev": true 428 | }, 429 | "concat-map": { 430 | "version": "0.0.1", 431 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", 432 | "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", 433 | "dev": true 434 | }, 435 | "convert-source-map": { 436 | "version": "1.7.0", 437 | "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.7.0.tgz", 438 | "integrity": "sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA==", 439 | "dev": true, 440 | "requires": { 441 | "safe-buffer": "~5.1.1" 442 | } 443 | }, 444 | "copy-descriptor": { 445 | "version": "0.1.1", 446 | "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", 447 | "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=", 448 | "dev": true 449 | }, 450 | "core-util-is": { 451 | "version": "1.0.2", 452 | "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", 453 | "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", 454 | "dev": true 455 | }, 456 | "cross-spawn": { 457 | "version": "6.0.5", 458 | "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", 459 | "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", 460 | "dev": true, 461 | "requires": { 462 | "nice-try": "^1.0.4", 463 | "path-key": "^2.0.1", 464 | "semver": "^5.5.0", 465 | "shebang-command": "^1.2.0", 466 | "which": "^1.2.9" 467 | } 468 | }, 469 | "debug": { 470 | "version": "2.6.9", 471 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", 472 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", 473 | "dev": true, 474 | "requires": { 475 | "ms": "2.0.0" 476 | } 477 | }, 478 | "decamelize": { 479 | "version": "1.2.0", 480 | "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", 481 | "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", 482 | "dev": true 483 | }, 484 | "decode-uri-component": { 485 | "version": "0.2.0", 486 | "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", 487 | "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=", 488 | "dev": true 489 | }, 490 | "define-property": { 491 | "version": "2.0.2", 492 | "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", 493 | "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", 494 | "dev": true, 495 | "requires": { 496 | "is-descriptor": "^1.0.2", 497 | "isobject": "^3.0.1" 498 | }, 499 | "dependencies": { 500 | "is-accessor-descriptor": { 501 | "version": "1.0.0", 502 | "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", 503 | "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", 504 | "dev": true, 505 | "requires": { 506 | "kind-of": "^6.0.0" 507 | } 508 | }, 509 | "is-data-descriptor": { 510 | "version": "1.0.0", 511 | "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", 512 | "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", 513 | "dev": true, 514 | "requires": { 515 | "kind-of": "^6.0.0" 516 | } 517 | }, 518 | "is-descriptor": { 519 | "version": "1.0.2", 520 | "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", 521 | "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", 522 | "dev": true, 523 | "requires": { 524 | "is-accessor-descriptor": "^1.0.0", 525 | "is-data-descriptor": "^1.0.0", 526 | "kind-of": "^6.0.2" 527 | } 528 | } 529 | } 530 | }, 531 | "dependency-graph": { 532 | "version": "0.7.2", 533 | "resolved": "https://registry.npmjs.org/dependency-graph/-/dependency-graph-0.7.2.tgz", 534 | "integrity": "sha512-KqtH4/EZdtdfWX0p6MGP9jljvxSY6msy/pRUD4jgNwVpv3v1QmNLlsB3LDSSUg79BRVSn7jI1QPRtArGABovAQ==", 535 | "dev": true 536 | }, 537 | "diff": { 538 | "version": "4.0.1", 539 | "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.1.tgz", 540 | "integrity": "sha512-s2+XdvhPCOF01LRQBC8hf4vhbVmI2CGS5aZnxLJlT5FtdhPCDFq80q++zK2KlrVorVDdL5BOGZ/VfLrVtYNF+Q==", 541 | "dev": true 542 | }, 543 | "emoji-regex": { 544 | "version": "7.0.3", 545 | "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", 546 | "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", 547 | "dev": true 548 | }, 549 | "end-of-stream": { 550 | "version": "1.4.4", 551 | "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", 552 | "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", 553 | "dev": true, 554 | "requires": { 555 | "once": "^1.4.0" 556 | } 557 | }, 558 | "escape-string-regexp": { 559 | "version": "1.0.5", 560 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", 561 | "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", 562 | "dev": true 563 | }, 564 | "esprima": { 565 | "version": "4.0.1", 566 | "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", 567 | "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", 568 | "dev": true 569 | }, 570 | "esutils": { 571 | "version": "2.0.3", 572 | "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", 573 | "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", 574 | "dev": true 575 | }, 576 | "execa": { 577 | "version": "1.0.0", 578 | "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", 579 | "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", 580 | "dev": true, 581 | "requires": { 582 | "cross-spawn": "^6.0.0", 583 | "get-stream": "^4.0.0", 584 | "is-stream": "^1.1.0", 585 | "npm-run-path": "^2.0.0", 586 | "p-finally": "^1.0.0", 587 | "signal-exit": "^3.0.0", 588 | "strip-eof": "^1.0.0" 589 | } 590 | }, 591 | "expand-brackets": { 592 | "version": "2.1.4", 593 | "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", 594 | "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", 595 | "dev": true, 596 | "requires": { 597 | "debug": "^2.3.3", 598 | "define-property": "^0.2.5", 599 | "extend-shallow": "^2.0.1", 600 | "posix-character-classes": "^0.1.0", 601 | "regex-not": "^1.0.0", 602 | "snapdragon": "^0.8.1", 603 | "to-regex": "^3.0.1" 604 | }, 605 | "dependencies": { 606 | "define-property": { 607 | "version": "0.2.5", 608 | "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", 609 | "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", 610 | "dev": true, 611 | "requires": { 612 | "is-descriptor": "^0.1.0" 613 | } 614 | }, 615 | "extend-shallow": { 616 | "version": "2.0.1", 617 | "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", 618 | "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", 619 | "dev": true, 620 | "requires": { 621 | "is-extendable": "^0.1.0" 622 | } 623 | } 624 | } 625 | }, 626 | "extend-shallow": { 627 | "version": "3.0.2", 628 | "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", 629 | "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", 630 | "dev": true, 631 | "requires": { 632 | "assign-symbols": "^1.0.0", 633 | "is-extendable": "^1.0.1" 634 | }, 635 | "dependencies": { 636 | "is-extendable": { 637 | "version": "1.0.1", 638 | "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", 639 | "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", 640 | "dev": true, 641 | "requires": { 642 | "is-plain-object": "^2.0.4" 643 | } 644 | } 645 | } 646 | }, 647 | "extglob": { 648 | "version": "2.0.4", 649 | "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", 650 | "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", 651 | "dev": true, 652 | "requires": { 653 | "array-unique": "^0.3.2", 654 | "define-property": "^1.0.0", 655 | "expand-brackets": "^2.1.4", 656 | "extend-shallow": "^2.0.1", 657 | "fragment-cache": "^0.2.1", 658 | "regex-not": "^1.0.0", 659 | "snapdragon": "^0.8.1", 660 | "to-regex": "^3.0.1" 661 | }, 662 | "dependencies": { 663 | "define-property": { 664 | "version": "1.0.0", 665 | "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", 666 | "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", 667 | "dev": true, 668 | "requires": { 669 | "is-descriptor": "^1.0.0" 670 | } 671 | }, 672 | "extend-shallow": { 673 | "version": "2.0.1", 674 | "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", 675 | "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", 676 | "dev": true, 677 | "requires": { 678 | "is-extendable": "^0.1.0" 679 | } 680 | }, 681 | "is-accessor-descriptor": { 682 | "version": "1.0.0", 683 | "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", 684 | "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", 685 | "dev": true, 686 | "requires": { 687 | "kind-of": "^6.0.0" 688 | } 689 | }, 690 | "is-data-descriptor": { 691 | "version": "1.0.0", 692 | "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", 693 | "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", 694 | "dev": true, 695 | "requires": { 696 | "kind-of": "^6.0.0" 697 | } 698 | }, 699 | "is-descriptor": { 700 | "version": "1.0.2", 701 | "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", 702 | "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", 703 | "dev": true, 704 | "requires": { 705 | "is-accessor-descriptor": "^1.0.0", 706 | "is-data-descriptor": "^1.0.0", 707 | "kind-of": "^6.0.2" 708 | } 709 | } 710 | } 711 | }, 712 | "fill-range": { 713 | "version": "4.0.0", 714 | "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", 715 | "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", 716 | "dev": true, 717 | "requires": { 718 | "extend-shallow": "^2.0.1", 719 | "is-number": "^3.0.0", 720 | "repeat-string": "^1.6.1", 721 | "to-regex-range": "^2.1.0" 722 | }, 723 | "dependencies": { 724 | "extend-shallow": { 725 | "version": "2.0.1", 726 | "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", 727 | "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", 728 | "dev": true, 729 | "requires": { 730 | "is-extendable": "^0.1.0" 731 | } 732 | } 733 | } 734 | }, 735 | "find-up": { 736 | "version": "3.0.0", 737 | "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", 738 | "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", 739 | "dev": true, 740 | "requires": { 741 | "locate-path": "^3.0.0" 742 | } 743 | }, 744 | "for-in": { 745 | "version": "1.0.2", 746 | "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", 747 | "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", 748 | "dev": true 749 | }, 750 | "fragment-cache": { 751 | "version": "0.2.1", 752 | "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", 753 | "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", 754 | "dev": true, 755 | "requires": { 756 | "map-cache": "^0.2.2" 757 | } 758 | }, 759 | "fs.realpath": { 760 | "version": "1.0.0", 761 | "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", 762 | "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", 763 | "dev": true 764 | }, 765 | "fsevents": { 766 | "version": "1.2.9", 767 | "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.9.tgz", 768 | "integrity": "sha512-oeyj2H3EjjonWcFjD5NvZNE9Rqe4UW+nQBU2HNeKw0koVLEFIhtyETyAakeAM3de7Z/SW5kcA+fZUait9EApnw==", 769 | "dev": true, 770 | "optional": true, 771 | "requires": { 772 | "nan": "^2.12.1", 773 | "node-pre-gyp": "^0.12.0" 774 | }, 775 | "dependencies": { 776 | "abbrev": { 777 | "version": "1.1.1", 778 | "bundled": true, 779 | "dev": true, 780 | "optional": true 781 | }, 782 | "ansi-regex": { 783 | "version": "2.1.1", 784 | "bundled": true, 785 | "dev": true, 786 | "optional": true 787 | }, 788 | "aproba": { 789 | "version": "1.2.0", 790 | "bundled": true, 791 | "dev": true, 792 | "optional": true 793 | }, 794 | "are-we-there-yet": { 795 | "version": "1.1.5", 796 | "bundled": true, 797 | "dev": true, 798 | "optional": true, 799 | "requires": { 800 | "delegates": "^1.0.0", 801 | "readable-stream": "^2.0.6" 802 | } 803 | }, 804 | "balanced-match": { 805 | "version": "1.0.0", 806 | "bundled": true, 807 | "dev": true, 808 | "optional": true 809 | }, 810 | "brace-expansion": { 811 | "version": "1.1.11", 812 | "bundled": true, 813 | "dev": true, 814 | "optional": true, 815 | "requires": { 816 | "balanced-match": "^1.0.0", 817 | "concat-map": "0.0.1" 818 | } 819 | }, 820 | "chownr": { 821 | "version": "1.1.1", 822 | "bundled": true, 823 | "dev": true, 824 | "optional": true 825 | }, 826 | "code-point-at": { 827 | "version": "1.1.0", 828 | "bundled": true, 829 | "dev": true, 830 | "optional": true 831 | }, 832 | "concat-map": { 833 | "version": "0.0.1", 834 | "bundled": true, 835 | "dev": true, 836 | "optional": true 837 | }, 838 | "console-control-strings": { 839 | "version": "1.1.0", 840 | "bundled": true, 841 | "dev": true, 842 | "optional": true 843 | }, 844 | "core-util-is": { 845 | "version": "1.0.2", 846 | "bundled": true, 847 | "dev": true, 848 | "optional": true 849 | }, 850 | "debug": { 851 | "version": "4.1.1", 852 | "bundled": true, 853 | "dev": true, 854 | "optional": true, 855 | "requires": { 856 | "ms": "^2.1.1" 857 | } 858 | }, 859 | "deep-extend": { 860 | "version": "0.6.0", 861 | "bundled": true, 862 | "dev": true, 863 | "optional": true 864 | }, 865 | "delegates": { 866 | "version": "1.0.0", 867 | "bundled": true, 868 | "dev": true, 869 | "optional": true 870 | }, 871 | "detect-libc": { 872 | "version": "1.0.3", 873 | "bundled": true, 874 | "dev": true, 875 | "optional": true 876 | }, 877 | "fs-minipass": { 878 | "version": "1.2.5", 879 | "bundled": true, 880 | "dev": true, 881 | "optional": true, 882 | "requires": { 883 | "minipass": "^2.2.1" 884 | } 885 | }, 886 | "fs.realpath": { 887 | "version": "1.0.0", 888 | "bundled": true, 889 | "dev": true, 890 | "optional": true 891 | }, 892 | "gauge": { 893 | "version": "2.7.4", 894 | "bundled": true, 895 | "dev": true, 896 | "optional": true, 897 | "requires": { 898 | "aproba": "^1.0.3", 899 | "console-control-strings": "^1.0.0", 900 | "has-unicode": "^2.0.0", 901 | "object-assign": "^4.1.0", 902 | "signal-exit": "^3.0.0", 903 | "string-width": "^1.0.1", 904 | "strip-ansi": "^3.0.1", 905 | "wide-align": "^1.1.0" 906 | } 907 | }, 908 | "glob": { 909 | "version": "7.1.3", 910 | "bundled": true, 911 | "dev": true, 912 | "optional": true, 913 | "requires": { 914 | "fs.realpath": "^1.0.0", 915 | "inflight": "^1.0.4", 916 | "inherits": "2", 917 | "minimatch": "^3.0.4", 918 | "once": "^1.3.0", 919 | "path-is-absolute": "^1.0.0" 920 | } 921 | }, 922 | "has-unicode": { 923 | "version": "2.0.1", 924 | "bundled": true, 925 | "dev": true, 926 | "optional": true 927 | }, 928 | "iconv-lite": { 929 | "version": "0.4.24", 930 | "bundled": true, 931 | "dev": true, 932 | "optional": true, 933 | "requires": { 934 | "safer-buffer": ">= 2.1.2 < 3" 935 | } 936 | }, 937 | "ignore-walk": { 938 | "version": "3.0.1", 939 | "bundled": true, 940 | "dev": true, 941 | "optional": true, 942 | "requires": { 943 | "minimatch": "^3.0.4" 944 | } 945 | }, 946 | "inflight": { 947 | "version": "1.0.6", 948 | "bundled": true, 949 | "dev": true, 950 | "optional": true, 951 | "requires": { 952 | "once": "^1.3.0", 953 | "wrappy": "1" 954 | } 955 | }, 956 | "inherits": { 957 | "version": "2.0.3", 958 | "bundled": true, 959 | "dev": true, 960 | "optional": true 961 | }, 962 | "ini": { 963 | "version": "1.3.5", 964 | "bundled": true, 965 | "dev": true, 966 | "optional": true 967 | }, 968 | "is-fullwidth-code-point": { 969 | "version": "1.0.0", 970 | "bundled": true, 971 | "dev": true, 972 | "optional": true, 973 | "requires": { 974 | "number-is-nan": "^1.0.0" 975 | } 976 | }, 977 | "isarray": { 978 | "version": "1.0.0", 979 | "bundled": true, 980 | "dev": true, 981 | "optional": true 982 | }, 983 | "minimatch": { 984 | "version": "3.0.4", 985 | "bundled": true, 986 | "dev": true, 987 | "optional": true, 988 | "requires": { 989 | "brace-expansion": "^1.1.7" 990 | } 991 | }, 992 | "minimist": { 993 | "version": "0.0.8", 994 | "bundled": true, 995 | "dev": true, 996 | "optional": true 997 | }, 998 | "minipass": { 999 | "version": "2.3.5", 1000 | "bundled": true, 1001 | "dev": true, 1002 | "optional": true, 1003 | "requires": { 1004 | "safe-buffer": "^5.1.2", 1005 | "yallist": "^3.0.0" 1006 | } 1007 | }, 1008 | "minizlib": { 1009 | "version": "1.2.1", 1010 | "bundled": true, 1011 | "dev": true, 1012 | "optional": true, 1013 | "requires": { 1014 | "minipass": "^2.2.1" 1015 | } 1016 | }, 1017 | "mkdirp": { 1018 | "version": "0.5.1", 1019 | "bundled": true, 1020 | "dev": true, 1021 | "optional": true, 1022 | "requires": { 1023 | "minimist": "0.0.8" 1024 | } 1025 | }, 1026 | "ms": { 1027 | "version": "2.1.1", 1028 | "bundled": true, 1029 | "dev": true, 1030 | "optional": true 1031 | }, 1032 | "needle": { 1033 | "version": "2.3.0", 1034 | "bundled": true, 1035 | "dev": true, 1036 | "optional": true, 1037 | "requires": { 1038 | "debug": "^4.1.0", 1039 | "iconv-lite": "^0.4.4", 1040 | "sax": "^1.2.4" 1041 | } 1042 | }, 1043 | "node-pre-gyp": { 1044 | "version": "0.12.0", 1045 | "bundled": true, 1046 | "dev": true, 1047 | "optional": true, 1048 | "requires": { 1049 | "detect-libc": "^1.0.2", 1050 | "mkdirp": "^0.5.1", 1051 | "needle": "^2.2.1", 1052 | "nopt": "^4.0.1", 1053 | "npm-packlist": "^1.1.6", 1054 | "npmlog": "^4.0.2", 1055 | "rc": "^1.2.7", 1056 | "rimraf": "^2.6.1", 1057 | "semver": "^5.3.0", 1058 | "tar": "^4" 1059 | } 1060 | }, 1061 | "nopt": { 1062 | "version": "4.0.1", 1063 | "bundled": true, 1064 | "dev": true, 1065 | "optional": true, 1066 | "requires": { 1067 | "abbrev": "1", 1068 | "osenv": "^0.1.4" 1069 | } 1070 | }, 1071 | "npm-bundled": { 1072 | "version": "1.0.6", 1073 | "bundled": true, 1074 | "dev": true, 1075 | "optional": true 1076 | }, 1077 | "npm-packlist": { 1078 | "version": "1.4.1", 1079 | "bundled": true, 1080 | "dev": true, 1081 | "optional": true, 1082 | "requires": { 1083 | "ignore-walk": "^3.0.1", 1084 | "npm-bundled": "^1.0.1" 1085 | } 1086 | }, 1087 | "npmlog": { 1088 | "version": "4.1.2", 1089 | "bundled": true, 1090 | "dev": true, 1091 | "optional": true, 1092 | "requires": { 1093 | "are-we-there-yet": "~1.1.2", 1094 | "console-control-strings": "~1.1.0", 1095 | "gauge": "~2.7.3", 1096 | "set-blocking": "~2.0.0" 1097 | } 1098 | }, 1099 | "number-is-nan": { 1100 | "version": "1.0.1", 1101 | "bundled": true, 1102 | "dev": true, 1103 | "optional": true 1104 | }, 1105 | "object-assign": { 1106 | "version": "4.1.1", 1107 | "bundled": true, 1108 | "dev": true, 1109 | "optional": true 1110 | }, 1111 | "once": { 1112 | "version": "1.4.0", 1113 | "bundled": true, 1114 | "dev": true, 1115 | "optional": true, 1116 | "requires": { 1117 | "wrappy": "1" 1118 | } 1119 | }, 1120 | "os-homedir": { 1121 | "version": "1.0.2", 1122 | "bundled": true, 1123 | "dev": true, 1124 | "optional": true 1125 | }, 1126 | "os-tmpdir": { 1127 | "version": "1.0.2", 1128 | "bundled": true, 1129 | "dev": true, 1130 | "optional": true 1131 | }, 1132 | "osenv": { 1133 | "version": "0.1.5", 1134 | "bundled": true, 1135 | "dev": true, 1136 | "optional": true, 1137 | "requires": { 1138 | "os-homedir": "^1.0.0", 1139 | "os-tmpdir": "^1.0.0" 1140 | } 1141 | }, 1142 | "path-is-absolute": { 1143 | "version": "1.0.1", 1144 | "bundled": true, 1145 | "dev": true, 1146 | "optional": true 1147 | }, 1148 | "process-nextick-args": { 1149 | "version": "2.0.0", 1150 | "bundled": true, 1151 | "dev": true, 1152 | "optional": true 1153 | }, 1154 | "rc": { 1155 | "version": "1.2.8", 1156 | "bundled": true, 1157 | "dev": true, 1158 | "optional": true, 1159 | "requires": { 1160 | "deep-extend": "^0.6.0", 1161 | "ini": "~1.3.0", 1162 | "minimist": "^1.2.0", 1163 | "strip-json-comments": "~2.0.1" 1164 | }, 1165 | "dependencies": { 1166 | "minimist": { 1167 | "version": "1.2.0", 1168 | "bundled": true, 1169 | "dev": true, 1170 | "optional": true 1171 | } 1172 | } 1173 | }, 1174 | "readable-stream": { 1175 | "version": "2.3.6", 1176 | "bundled": true, 1177 | "dev": true, 1178 | "optional": true, 1179 | "requires": { 1180 | "core-util-is": "~1.0.0", 1181 | "inherits": "~2.0.3", 1182 | "isarray": "~1.0.0", 1183 | "process-nextick-args": "~2.0.0", 1184 | "safe-buffer": "~5.1.1", 1185 | "string_decoder": "~1.1.1", 1186 | "util-deprecate": "~1.0.1" 1187 | } 1188 | }, 1189 | "rimraf": { 1190 | "version": "2.6.3", 1191 | "bundled": true, 1192 | "dev": true, 1193 | "optional": true, 1194 | "requires": { 1195 | "glob": "^7.1.3" 1196 | } 1197 | }, 1198 | "safe-buffer": { 1199 | "version": "5.1.2", 1200 | "bundled": true, 1201 | "dev": true, 1202 | "optional": true 1203 | }, 1204 | "safer-buffer": { 1205 | "version": "2.1.2", 1206 | "bundled": true, 1207 | "dev": true, 1208 | "optional": true 1209 | }, 1210 | "sax": { 1211 | "version": "1.2.4", 1212 | "bundled": true, 1213 | "dev": true, 1214 | "optional": true 1215 | }, 1216 | "semver": { 1217 | "version": "5.7.0", 1218 | "bundled": true, 1219 | "dev": true, 1220 | "optional": true 1221 | }, 1222 | "set-blocking": { 1223 | "version": "2.0.0", 1224 | "bundled": true, 1225 | "dev": true, 1226 | "optional": true 1227 | }, 1228 | "signal-exit": { 1229 | "version": "3.0.2", 1230 | "bundled": true, 1231 | "dev": true, 1232 | "optional": true 1233 | }, 1234 | "string-width": { 1235 | "version": "1.0.2", 1236 | "bundled": true, 1237 | "dev": true, 1238 | "optional": true, 1239 | "requires": { 1240 | "code-point-at": "^1.0.0", 1241 | "is-fullwidth-code-point": "^1.0.0", 1242 | "strip-ansi": "^3.0.0" 1243 | } 1244 | }, 1245 | "string_decoder": { 1246 | "version": "1.1.1", 1247 | "bundled": true, 1248 | "dev": true, 1249 | "optional": true, 1250 | "requires": { 1251 | "safe-buffer": "~5.1.0" 1252 | } 1253 | }, 1254 | "strip-ansi": { 1255 | "version": "3.0.1", 1256 | "bundled": true, 1257 | "dev": true, 1258 | "optional": true, 1259 | "requires": { 1260 | "ansi-regex": "^2.0.0" 1261 | } 1262 | }, 1263 | "strip-json-comments": { 1264 | "version": "2.0.1", 1265 | "bundled": true, 1266 | "dev": true, 1267 | "optional": true 1268 | }, 1269 | "tar": { 1270 | "version": "4.4.8", 1271 | "bundled": true, 1272 | "dev": true, 1273 | "optional": true, 1274 | "requires": { 1275 | "chownr": "^1.1.1", 1276 | "fs-minipass": "^1.2.5", 1277 | "minipass": "^2.3.4", 1278 | "minizlib": "^1.1.1", 1279 | "mkdirp": "^0.5.0", 1280 | "safe-buffer": "^5.1.2", 1281 | "yallist": "^3.0.2" 1282 | } 1283 | }, 1284 | "util-deprecate": { 1285 | "version": "1.0.2", 1286 | "bundled": true, 1287 | "dev": true, 1288 | "optional": true 1289 | }, 1290 | "wide-align": { 1291 | "version": "1.1.3", 1292 | "bundled": true, 1293 | "dev": true, 1294 | "optional": true, 1295 | "requires": { 1296 | "string-width": "^1.0.2 || 2" 1297 | } 1298 | }, 1299 | "wrappy": { 1300 | "version": "1.0.2", 1301 | "bundled": true, 1302 | "dev": true, 1303 | "optional": true 1304 | }, 1305 | "yallist": { 1306 | "version": "3.0.3", 1307 | "bundled": true, 1308 | "dev": true, 1309 | "optional": true 1310 | } 1311 | } 1312 | }, 1313 | "get-caller-file": { 1314 | "version": "2.0.5", 1315 | "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", 1316 | "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", 1317 | "dev": true 1318 | }, 1319 | "get-stream": { 1320 | "version": "4.1.0", 1321 | "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", 1322 | "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", 1323 | "dev": true, 1324 | "requires": { 1325 | "pump": "^3.0.0" 1326 | } 1327 | }, 1328 | "get-value": { 1329 | "version": "2.0.6", 1330 | "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", 1331 | "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=", 1332 | "dev": true 1333 | }, 1334 | "glob": { 1335 | "version": "7.1.6", 1336 | "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", 1337 | "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", 1338 | "dev": true, 1339 | "requires": { 1340 | "fs.realpath": "^1.0.0", 1341 | "inflight": "^1.0.4", 1342 | "inherits": "2", 1343 | "minimatch": "^3.0.4", 1344 | "once": "^1.3.0", 1345 | "path-is-absolute": "^1.0.0" 1346 | } 1347 | }, 1348 | "glob-parent": { 1349 | "version": "3.1.0", 1350 | "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", 1351 | "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", 1352 | "dev": true, 1353 | "requires": { 1354 | "is-glob": "^3.1.0", 1355 | "path-dirname": "^1.0.0" 1356 | }, 1357 | "dependencies": { 1358 | "is-glob": { 1359 | "version": "3.1.0", 1360 | "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", 1361 | "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", 1362 | "dev": true, 1363 | "requires": { 1364 | "is-extglob": "^2.1.0" 1365 | } 1366 | } 1367 | } 1368 | }, 1369 | "graceful-fs": { 1370 | "version": "4.2.3", 1371 | "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.3.tgz", 1372 | "integrity": "sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ==", 1373 | "dev": true 1374 | }, 1375 | "has-flag": { 1376 | "version": "3.0.0", 1377 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", 1378 | "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", 1379 | "dev": true 1380 | }, 1381 | "has-value": { 1382 | "version": "1.0.0", 1383 | "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", 1384 | "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", 1385 | "dev": true, 1386 | "requires": { 1387 | "get-value": "^2.0.6", 1388 | "has-values": "^1.0.0", 1389 | "isobject": "^3.0.0" 1390 | } 1391 | }, 1392 | "has-values": { 1393 | "version": "1.0.0", 1394 | "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", 1395 | "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=", 1396 | "dev": true, 1397 | "requires": { 1398 | "is-number": "^3.0.0", 1399 | "kind-of": "^4.0.0" 1400 | }, 1401 | "dependencies": { 1402 | "kind-of": { 1403 | "version": "4.0.0", 1404 | "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", 1405 | "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", 1406 | "dev": true, 1407 | "requires": { 1408 | "is-buffer": "^1.1.5" 1409 | } 1410 | } 1411 | } 1412 | }, 1413 | "inflight": { 1414 | "version": "1.0.6", 1415 | "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", 1416 | "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", 1417 | "dev": true, 1418 | "requires": { 1419 | "once": "^1.3.0", 1420 | "wrappy": "1" 1421 | } 1422 | }, 1423 | "inherits": { 1424 | "version": "2.0.4", 1425 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", 1426 | "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", 1427 | "dev": true 1428 | }, 1429 | "invert-kv": { 1430 | "version": "2.0.0", 1431 | "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-2.0.0.tgz", 1432 | "integrity": "sha512-wPVv/y/QQ/Uiirj/vh3oP+1Ww+AWehmi1g5fFWGPF6IpCBCDVrhgHRMvrLfdYcwDh3QJbGXDW4JAuzxElLSqKA==", 1433 | "dev": true 1434 | }, 1435 | "is-accessor-descriptor": { 1436 | "version": "0.1.6", 1437 | "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", 1438 | "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", 1439 | "dev": true, 1440 | "requires": { 1441 | "kind-of": "^3.0.2" 1442 | }, 1443 | "dependencies": { 1444 | "kind-of": { 1445 | "version": "3.2.2", 1446 | "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", 1447 | "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", 1448 | "dev": true, 1449 | "requires": { 1450 | "is-buffer": "^1.1.5" 1451 | } 1452 | } 1453 | } 1454 | }, 1455 | "is-binary-path": { 1456 | "version": "1.0.1", 1457 | "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", 1458 | "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", 1459 | "dev": true, 1460 | "requires": { 1461 | "binary-extensions": "^1.0.0" 1462 | } 1463 | }, 1464 | "is-buffer": { 1465 | "version": "1.1.6", 1466 | "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", 1467 | "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", 1468 | "dev": true 1469 | }, 1470 | "is-data-descriptor": { 1471 | "version": "0.1.4", 1472 | "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", 1473 | "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", 1474 | "dev": true, 1475 | "requires": { 1476 | "kind-of": "^3.0.2" 1477 | }, 1478 | "dependencies": { 1479 | "kind-of": { 1480 | "version": "3.2.2", 1481 | "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", 1482 | "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", 1483 | "dev": true, 1484 | "requires": { 1485 | "is-buffer": "^1.1.5" 1486 | } 1487 | } 1488 | } 1489 | }, 1490 | "is-descriptor": { 1491 | "version": "0.1.6", 1492 | "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", 1493 | "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", 1494 | "dev": true, 1495 | "requires": { 1496 | "is-accessor-descriptor": "^0.1.6", 1497 | "is-data-descriptor": "^0.1.4", 1498 | "kind-of": "^5.0.0" 1499 | }, 1500 | "dependencies": { 1501 | "kind-of": { 1502 | "version": "5.1.0", 1503 | "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", 1504 | "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", 1505 | "dev": true 1506 | } 1507 | } 1508 | }, 1509 | "is-extendable": { 1510 | "version": "0.1.1", 1511 | "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", 1512 | "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", 1513 | "dev": true 1514 | }, 1515 | "is-extglob": { 1516 | "version": "2.1.1", 1517 | "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", 1518 | "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", 1519 | "dev": true 1520 | }, 1521 | "is-fullwidth-code-point": { 1522 | "version": "2.0.0", 1523 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", 1524 | "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", 1525 | "dev": true 1526 | }, 1527 | "is-glob": { 1528 | "version": "4.0.1", 1529 | "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", 1530 | "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", 1531 | "dev": true, 1532 | "requires": { 1533 | "is-extglob": "^2.1.1" 1534 | } 1535 | }, 1536 | "is-number": { 1537 | "version": "3.0.0", 1538 | "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", 1539 | "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", 1540 | "dev": true, 1541 | "requires": { 1542 | "kind-of": "^3.0.2" 1543 | }, 1544 | "dependencies": { 1545 | "kind-of": { 1546 | "version": "3.2.2", 1547 | "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", 1548 | "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", 1549 | "dev": true, 1550 | "requires": { 1551 | "is-buffer": "^1.1.5" 1552 | } 1553 | } 1554 | } 1555 | }, 1556 | "is-plain-object": { 1557 | "version": "2.0.4", 1558 | "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", 1559 | "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", 1560 | "dev": true, 1561 | "requires": { 1562 | "isobject": "^3.0.1" 1563 | } 1564 | }, 1565 | "is-stream": { 1566 | "version": "1.1.0", 1567 | "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", 1568 | "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", 1569 | "dev": true 1570 | }, 1571 | "is-windows": { 1572 | "version": "1.0.2", 1573 | "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", 1574 | "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", 1575 | "dev": true 1576 | }, 1577 | "isarray": { 1578 | "version": "1.0.0", 1579 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", 1580 | "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", 1581 | "dev": true 1582 | }, 1583 | "isexe": { 1584 | "version": "2.0.0", 1585 | "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", 1586 | "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", 1587 | "dev": true 1588 | }, 1589 | "isobject": { 1590 | "version": "3.0.1", 1591 | "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", 1592 | "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", 1593 | "dev": true 1594 | }, 1595 | "js-tokens": { 1596 | "version": "4.0.0", 1597 | "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", 1598 | "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", 1599 | "dev": true 1600 | }, 1601 | "js-yaml": { 1602 | "version": "3.13.1", 1603 | "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", 1604 | "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==", 1605 | "dev": true, 1606 | "requires": { 1607 | "argparse": "^1.0.7", 1608 | "esprima": "^4.0.0" 1609 | } 1610 | }, 1611 | "kind-of": { 1612 | "version": "6.0.3", 1613 | "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", 1614 | "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", 1615 | "dev": true 1616 | }, 1617 | "lcid": { 1618 | "version": "2.0.0", 1619 | "resolved": "https://registry.npmjs.org/lcid/-/lcid-2.0.0.tgz", 1620 | "integrity": "sha512-avPEb8P8EGnwXKClwsNUgryVjllcRqtMYa49NTsbQagYuT1DcXnl1915oxWjoyGrXR6zH/Y0Zc96xWsPcoDKeA==", 1621 | "dev": true, 1622 | "requires": { 1623 | "invert-kv": "^2.0.0" 1624 | } 1625 | }, 1626 | "locate-path": { 1627 | "version": "3.0.0", 1628 | "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", 1629 | "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", 1630 | "dev": true, 1631 | "requires": { 1632 | "p-locate": "^3.0.0", 1633 | "path-exists": "^3.0.0" 1634 | } 1635 | }, 1636 | "magic-string": { 1637 | "version": "0.25.4", 1638 | "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.4.tgz", 1639 | "integrity": "sha512-oycWO9nEVAP2RVPbIoDoA4Y7LFIJ3xRYov93gAyJhZkET1tNuB0u7uWkZS2LpBWTJUWnmau/To8ECWRC+jKNfw==", 1640 | "dev": true, 1641 | "requires": { 1642 | "sourcemap-codec": "^1.4.4" 1643 | } 1644 | }, 1645 | "map-age-cleaner": { 1646 | "version": "0.1.3", 1647 | "resolved": "https://registry.npmjs.org/map-age-cleaner/-/map-age-cleaner-0.1.3.tgz", 1648 | "integrity": "sha512-bJzx6nMoP6PDLPBFmg7+xRKeFZvFboMrGlxmNj9ClvX53KrmvM5bXFXEWjbz4cz1AFn+jWJ9z/DJSz7hrs0w3w==", 1649 | "dev": true, 1650 | "requires": { 1651 | "p-defer": "^1.0.0" 1652 | } 1653 | }, 1654 | "map-cache": { 1655 | "version": "0.2.2", 1656 | "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", 1657 | "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=", 1658 | "dev": true 1659 | }, 1660 | "map-visit": { 1661 | "version": "1.0.0", 1662 | "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", 1663 | "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=", 1664 | "dev": true, 1665 | "requires": { 1666 | "object-visit": "^1.0.0" 1667 | } 1668 | }, 1669 | "mem": { 1670 | "version": "4.3.0", 1671 | "resolved": "https://registry.npmjs.org/mem/-/mem-4.3.0.tgz", 1672 | "integrity": "sha512-qX2bG48pTqYRVmDB37rn/6PT7LcR8T7oAX3bf99u1Tt1nzxYfxkgqDwUwolPlXweM0XzBOBFzSx4kfp7KP1s/w==", 1673 | "dev": true, 1674 | "requires": { 1675 | "map-age-cleaner": "^0.1.1", 1676 | "mimic-fn": "^2.0.0", 1677 | "p-is-promise": "^2.0.0" 1678 | } 1679 | }, 1680 | "micromatch": { 1681 | "version": "3.1.10", 1682 | "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", 1683 | "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", 1684 | "dev": true, 1685 | "requires": { 1686 | "arr-diff": "^4.0.0", 1687 | "array-unique": "^0.3.2", 1688 | "braces": "^2.3.1", 1689 | "define-property": "^2.0.2", 1690 | "extend-shallow": "^3.0.2", 1691 | "extglob": "^2.0.4", 1692 | "fragment-cache": "^0.2.1", 1693 | "kind-of": "^6.0.2", 1694 | "nanomatch": "^1.2.9", 1695 | "object.pick": "^1.3.0", 1696 | "regex-not": "^1.0.0", 1697 | "snapdragon": "^0.8.1", 1698 | "to-regex": "^3.0.2" 1699 | } 1700 | }, 1701 | "mimic-fn": { 1702 | "version": "2.1.0", 1703 | "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", 1704 | "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", 1705 | "dev": true 1706 | }, 1707 | "minimatch": { 1708 | "version": "3.0.4", 1709 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", 1710 | "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", 1711 | "dev": true, 1712 | "requires": { 1713 | "brace-expansion": "^1.1.7" 1714 | } 1715 | }, 1716 | "minimist": { 1717 | "version": "1.2.5", 1718 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", 1719 | "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", 1720 | "dev": true 1721 | }, 1722 | "mixin-deep": { 1723 | "version": "1.3.2", 1724 | "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz", 1725 | "integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==", 1726 | "dev": true, 1727 | "requires": { 1728 | "for-in": "^1.0.2", 1729 | "is-extendable": "^1.0.1" 1730 | }, 1731 | "dependencies": { 1732 | "is-extendable": { 1733 | "version": "1.0.1", 1734 | "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", 1735 | "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", 1736 | "dev": true, 1737 | "requires": { 1738 | "is-plain-object": "^2.0.4" 1739 | } 1740 | } 1741 | } 1742 | }, 1743 | "mkdirp": { 1744 | "version": "0.5.5", 1745 | "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", 1746 | "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", 1747 | "dev": true, 1748 | "requires": { 1749 | "minimist": "^1.2.5" 1750 | } 1751 | }, 1752 | "ms": { 1753 | "version": "2.0.0", 1754 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", 1755 | "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", 1756 | "dev": true 1757 | }, 1758 | "nan": { 1759 | "version": "2.14.0", 1760 | "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.0.tgz", 1761 | "integrity": "sha512-INOFj37C7k3AfaNTtX8RhsTw7qRy7eLET14cROi9+5HAVbbHuIWUHEauBv5qT4Av2tWasiTY1Jw6puUNqRJXQg==", 1762 | "dev": true, 1763 | "optional": true 1764 | }, 1765 | "nanomatch": { 1766 | "version": "1.2.13", 1767 | "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", 1768 | "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", 1769 | "dev": true, 1770 | "requires": { 1771 | "arr-diff": "^4.0.0", 1772 | "array-unique": "^0.3.2", 1773 | "define-property": "^2.0.2", 1774 | "extend-shallow": "^3.0.2", 1775 | "fragment-cache": "^0.2.1", 1776 | "is-windows": "^1.0.2", 1777 | "kind-of": "^6.0.2", 1778 | "object.pick": "^1.3.0", 1779 | "regex-not": "^1.0.0", 1780 | "snapdragon": "^0.8.1", 1781 | "to-regex": "^3.0.1" 1782 | } 1783 | }, 1784 | "nice-try": { 1785 | "version": "1.0.5", 1786 | "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", 1787 | "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", 1788 | "dev": true 1789 | }, 1790 | "normalize-path": { 1791 | "version": "3.0.0", 1792 | "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", 1793 | "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", 1794 | "dev": true 1795 | }, 1796 | "npm-run-path": { 1797 | "version": "2.0.2", 1798 | "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", 1799 | "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", 1800 | "dev": true, 1801 | "requires": { 1802 | "path-key": "^2.0.0" 1803 | } 1804 | }, 1805 | "number-is-nan": { 1806 | "version": "1.0.1", 1807 | "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", 1808 | "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", 1809 | "dev": true 1810 | }, 1811 | "object-copy": { 1812 | "version": "0.1.0", 1813 | "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", 1814 | "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=", 1815 | "dev": true, 1816 | "requires": { 1817 | "copy-descriptor": "^0.1.0", 1818 | "define-property": "^0.2.5", 1819 | "kind-of": "^3.0.3" 1820 | }, 1821 | "dependencies": { 1822 | "define-property": { 1823 | "version": "0.2.5", 1824 | "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", 1825 | "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", 1826 | "dev": true, 1827 | "requires": { 1828 | "is-descriptor": "^0.1.0" 1829 | } 1830 | }, 1831 | "kind-of": { 1832 | "version": "3.2.2", 1833 | "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", 1834 | "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", 1835 | "dev": true, 1836 | "requires": { 1837 | "is-buffer": "^1.1.5" 1838 | } 1839 | } 1840 | } 1841 | }, 1842 | "object-visit": { 1843 | "version": "1.0.1", 1844 | "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", 1845 | "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=", 1846 | "dev": true, 1847 | "requires": { 1848 | "isobject": "^3.0.0" 1849 | } 1850 | }, 1851 | "object.pick": { 1852 | "version": "1.3.0", 1853 | "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", 1854 | "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", 1855 | "dev": true, 1856 | "requires": { 1857 | "isobject": "^3.0.1" 1858 | } 1859 | }, 1860 | "once": { 1861 | "version": "1.4.0", 1862 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", 1863 | "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", 1864 | "dev": true, 1865 | "requires": { 1866 | "wrappy": "1" 1867 | } 1868 | }, 1869 | "os-locale": { 1870 | "version": "3.1.0", 1871 | "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-3.1.0.tgz", 1872 | "integrity": "sha512-Z8l3R4wYWM40/52Z+S265okfFj8Kt2cC2MKY+xNi3kFs+XGI7WXu/I309QQQYbRW4ijiZ+yxs9pqEhJh0DqW3Q==", 1873 | "dev": true, 1874 | "requires": { 1875 | "execa": "^1.0.0", 1876 | "lcid": "^2.0.0", 1877 | "mem": "^4.0.0" 1878 | } 1879 | }, 1880 | "p-defer": { 1881 | "version": "1.0.0", 1882 | "resolved": "https://registry.npmjs.org/p-defer/-/p-defer-1.0.0.tgz", 1883 | "integrity": "sha1-n26xgvbJqozXQwBKfU+WsZaw+ww=", 1884 | "dev": true 1885 | }, 1886 | "p-finally": { 1887 | "version": "1.0.0", 1888 | "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", 1889 | "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=", 1890 | "dev": true 1891 | }, 1892 | "p-is-promise": { 1893 | "version": "2.1.0", 1894 | "resolved": "https://registry.npmjs.org/p-is-promise/-/p-is-promise-2.1.0.tgz", 1895 | "integrity": "sha512-Y3W0wlRPK8ZMRbNq97l4M5otioeA5lm1z7bkNkxCka8HSPjR0xRWmpCmc9utiaLP9Jb1eD8BgeIxTW4AIF45Pg==", 1896 | "dev": true 1897 | }, 1898 | "p-limit": { 1899 | "version": "2.2.1", 1900 | "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.1.tgz", 1901 | "integrity": "sha512-85Tk+90UCVWvbDavCLKPOLC9vvY8OwEX/RtKF+/1OADJMVlFfEHOiMTPVyxg7mk/dKa+ipdHm0OUkTvCpMTuwg==", 1902 | "dev": true, 1903 | "requires": { 1904 | "p-try": "^2.0.0" 1905 | } 1906 | }, 1907 | "p-locate": { 1908 | "version": "3.0.0", 1909 | "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", 1910 | "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", 1911 | "dev": true, 1912 | "requires": { 1913 | "p-limit": "^2.0.0" 1914 | } 1915 | }, 1916 | "p-try": { 1917 | "version": "2.2.0", 1918 | "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", 1919 | "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", 1920 | "dev": true 1921 | }, 1922 | "pascalcase": { 1923 | "version": "0.1.1", 1924 | "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", 1925 | "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=", 1926 | "dev": true 1927 | }, 1928 | "path-dirname": { 1929 | "version": "1.0.2", 1930 | "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz", 1931 | "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=", 1932 | "dev": true 1933 | }, 1934 | "path-exists": { 1935 | "version": "3.0.0", 1936 | "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", 1937 | "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", 1938 | "dev": true 1939 | }, 1940 | "path-is-absolute": { 1941 | "version": "1.0.1", 1942 | "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", 1943 | "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", 1944 | "dev": true 1945 | }, 1946 | "path-key": { 1947 | "version": "2.0.1", 1948 | "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", 1949 | "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", 1950 | "dev": true 1951 | }, 1952 | "path-parse": { 1953 | "version": "1.0.7", 1954 | "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", 1955 | "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", 1956 | "dev": true 1957 | }, 1958 | "posix-character-classes": { 1959 | "version": "0.1.1", 1960 | "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", 1961 | "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=", 1962 | "dev": true 1963 | }, 1964 | "process-nextick-args": { 1965 | "version": "2.0.1", 1966 | "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", 1967 | "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", 1968 | "dev": true 1969 | }, 1970 | "pump": { 1971 | "version": "3.0.0", 1972 | "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", 1973 | "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", 1974 | "dev": true, 1975 | "requires": { 1976 | "end-of-stream": "^1.1.0", 1977 | "once": "^1.3.1" 1978 | } 1979 | }, 1980 | "readable-stream": { 1981 | "version": "2.3.6", 1982 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", 1983 | "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", 1984 | "dev": true, 1985 | "requires": { 1986 | "core-util-is": "~1.0.0", 1987 | "inherits": "~2.0.3", 1988 | "isarray": "~1.0.0", 1989 | "process-nextick-args": "~2.0.0", 1990 | "safe-buffer": "~5.1.1", 1991 | "string_decoder": "~1.1.1", 1992 | "util-deprecate": "~1.0.1" 1993 | } 1994 | }, 1995 | "readdirp": { 1996 | "version": "2.2.1", 1997 | "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz", 1998 | "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==", 1999 | "dev": true, 2000 | "requires": { 2001 | "graceful-fs": "^4.1.11", 2002 | "micromatch": "^3.1.10", 2003 | "readable-stream": "^2.0.2" 2004 | } 2005 | }, 2006 | "reflect-metadata": { 2007 | "version": "0.1.13", 2008 | "resolved": "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.1.13.tgz", 2009 | "integrity": "sha512-Ts1Y/anZELhSsjMcU605fU9RE4Oi3p5ORujwbIKXfWa+0Zxs510Qrmrce5/Jowq3cHSZSJqBjypxmHarc+vEWg==", 2010 | "dev": true 2011 | }, 2012 | "regex-not": { 2013 | "version": "1.0.2", 2014 | "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", 2015 | "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", 2016 | "dev": true, 2017 | "requires": { 2018 | "extend-shallow": "^3.0.2", 2019 | "safe-regex": "^1.1.0" 2020 | } 2021 | }, 2022 | "remove-trailing-separator": { 2023 | "version": "1.1.0", 2024 | "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", 2025 | "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=", 2026 | "dev": true 2027 | }, 2028 | "repeat-element": { 2029 | "version": "1.1.3", 2030 | "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.3.tgz", 2031 | "integrity": "sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g==", 2032 | "dev": true 2033 | }, 2034 | "repeat-string": { 2035 | "version": "1.6.1", 2036 | "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", 2037 | "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", 2038 | "dev": true 2039 | }, 2040 | "require-directory": { 2041 | "version": "2.1.1", 2042 | "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", 2043 | "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", 2044 | "dev": true 2045 | }, 2046 | "require-main-filename": { 2047 | "version": "2.0.0", 2048 | "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", 2049 | "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", 2050 | "dev": true 2051 | }, 2052 | "resolve": { 2053 | "version": "1.13.1", 2054 | "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.13.1.tgz", 2055 | "integrity": "sha512-CxqObCX8K8YtAhOBRg+lrcdn+LK+WYOS8tSjqSFbjtrI5PnS63QPhZl4+yKfrU9tdsbMu9Anr/amegT87M9Z6w==", 2056 | "dev": true, 2057 | "requires": { 2058 | "path-parse": "^1.0.6" 2059 | } 2060 | }, 2061 | "resolve-url": { 2062 | "version": "0.2.1", 2063 | "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", 2064 | "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=", 2065 | "dev": true 2066 | }, 2067 | "ret": { 2068 | "version": "0.1.15", 2069 | "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", 2070 | "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==", 2071 | "dev": true 2072 | }, 2073 | "rimraf": { 2074 | "version": "3.0.2", 2075 | "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", 2076 | "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", 2077 | "dev": true, 2078 | "requires": { 2079 | "glob": "^7.1.3" 2080 | } 2081 | }, 2082 | "rxjs": { 2083 | "version": "6.5.5", 2084 | "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.5.5.tgz", 2085 | "integrity": "sha512-WfQI+1gohdf0Dai/Bbmk5L5ItH5tYqm3ki2c5GdWhKjalzjg93N3avFjVStyZZz+A2Em+ZxKH5bNghw9UeylGQ==", 2086 | "dev": true, 2087 | "requires": { 2088 | "tslib": "^1.9.0" 2089 | } 2090 | }, 2091 | "safe-buffer": { 2092 | "version": "5.1.2", 2093 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", 2094 | "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", 2095 | "dev": true 2096 | }, 2097 | "safe-regex": { 2098 | "version": "1.1.0", 2099 | "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", 2100 | "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", 2101 | "dev": true, 2102 | "requires": { 2103 | "ret": "~0.1.10" 2104 | } 2105 | }, 2106 | "semver": { 2107 | "version": "5.7.1", 2108 | "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", 2109 | "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", 2110 | "dev": true 2111 | }, 2112 | "set-blocking": { 2113 | "version": "2.0.0", 2114 | "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", 2115 | "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", 2116 | "dev": true 2117 | }, 2118 | "set-value": { 2119 | "version": "2.0.1", 2120 | "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz", 2121 | "integrity": "sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==", 2122 | "dev": true, 2123 | "requires": { 2124 | "extend-shallow": "^2.0.1", 2125 | "is-extendable": "^0.1.1", 2126 | "is-plain-object": "^2.0.3", 2127 | "split-string": "^3.0.1" 2128 | }, 2129 | "dependencies": { 2130 | "extend-shallow": { 2131 | "version": "2.0.1", 2132 | "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", 2133 | "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", 2134 | "dev": true, 2135 | "requires": { 2136 | "is-extendable": "^0.1.0" 2137 | } 2138 | } 2139 | } 2140 | }, 2141 | "shebang-command": { 2142 | "version": "1.2.0", 2143 | "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", 2144 | "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", 2145 | "dev": true, 2146 | "requires": { 2147 | "shebang-regex": "^1.0.0" 2148 | } 2149 | }, 2150 | "shebang-regex": { 2151 | "version": "1.0.0", 2152 | "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", 2153 | "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", 2154 | "dev": true 2155 | }, 2156 | "signal-exit": { 2157 | "version": "3.0.2", 2158 | "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", 2159 | "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", 2160 | "dev": true 2161 | }, 2162 | "snapdragon": { 2163 | "version": "0.8.2", 2164 | "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", 2165 | "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", 2166 | "dev": true, 2167 | "requires": { 2168 | "base": "^0.11.1", 2169 | "debug": "^2.2.0", 2170 | "define-property": "^0.2.5", 2171 | "extend-shallow": "^2.0.1", 2172 | "map-cache": "^0.2.2", 2173 | "source-map": "^0.5.6", 2174 | "source-map-resolve": "^0.5.0", 2175 | "use": "^3.1.0" 2176 | }, 2177 | "dependencies": { 2178 | "define-property": { 2179 | "version": "0.2.5", 2180 | "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", 2181 | "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", 2182 | "dev": true, 2183 | "requires": { 2184 | "is-descriptor": "^0.1.0" 2185 | } 2186 | }, 2187 | "extend-shallow": { 2188 | "version": "2.0.1", 2189 | "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", 2190 | "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", 2191 | "dev": true, 2192 | "requires": { 2193 | "is-extendable": "^0.1.0" 2194 | } 2195 | }, 2196 | "source-map": { 2197 | "version": "0.5.7", 2198 | "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", 2199 | "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", 2200 | "dev": true 2201 | } 2202 | } 2203 | }, 2204 | "snapdragon-node": { 2205 | "version": "2.1.1", 2206 | "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz", 2207 | "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", 2208 | "dev": true, 2209 | "requires": { 2210 | "define-property": "^1.0.0", 2211 | "isobject": "^3.0.0", 2212 | "snapdragon-util": "^3.0.1" 2213 | }, 2214 | "dependencies": { 2215 | "define-property": { 2216 | "version": "1.0.0", 2217 | "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", 2218 | "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", 2219 | "dev": true, 2220 | "requires": { 2221 | "is-descriptor": "^1.0.0" 2222 | } 2223 | }, 2224 | "is-accessor-descriptor": { 2225 | "version": "1.0.0", 2226 | "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", 2227 | "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", 2228 | "dev": true, 2229 | "requires": { 2230 | "kind-of": "^6.0.0" 2231 | } 2232 | }, 2233 | "is-data-descriptor": { 2234 | "version": "1.0.0", 2235 | "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", 2236 | "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", 2237 | "dev": true, 2238 | "requires": { 2239 | "kind-of": "^6.0.0" 2240 | } 2241 | }, 2242 | "is-descriptor": { 2243 | "version": "1.0.2", 2244 | "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", 2245 | "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", 2246 | "dev": true, 2247 | "requires": { 2248 | "is-accessor-descriptor": "^1.0.0", 2249 | "is-data-descriptor": "^1.0.0", 2250 | "kind-of": "^6.0.2" 2251 | } 2252 | } 2253 | } 2254 | }, 2255 | "snapdragon-util": { 2256 | "version": "3.0.1", 2257 | "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", 2258 | "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", 2259 | "dev": true, 2260 | "requires": { 2261 | "kind-of": "^3.2.0" 2262 | }, 2263 | "dependencies": { 2264 | "kind-of": { 2265 | "version": "3.2.2", 2266 | "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", 2267 | "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", 2268 | "dev": true, 2269 | "requires": { 2270 | "is-buffer": "^1.1.5" 2271 | } 2272 | } 2273 | } 2274 | }, 2275 | "source-map": { 2276 | "version": "0.6.1", 2277 | "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", 2278 | "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", 2279 | "dev": true 2280 | }, 2281 | "source-map-resolve": { 2282 | "version": "0.5.2", 2283 | "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.2.tgz", 2284 | "integrity": "sha512-MjqsvNwyz1s0k81Goz/9vRBe9SZdB09Bdw+/zYyO+3CuPk6fouTaxscHkgtE8jKvf01kVfl8riHzERQ/kefaSA==", 2285 | "dev": true, 2286 | "requires": { 2287 | "atob": "^2.1.1", 2288 | "decode-uri-component": "^0.2.0", 2289 | "resolve-url": "^0.2.1", 2290 | "source-map-url": "^0.4.0", 2291 | "urix": "^0.1.0" 2292 | } 2293 | }, 2294 | "source-map-url": { 2295 | "version": "0.4.0", 2296 | "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz", 2297 | "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=", 2298 | "dev": true 2299 | }, 2300 | "sourcemap-codec": { 2301 | "version": "1.4.6", 2302 | "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.6.tgz", 2303 | "integrity": "sha512-1ZooVLYFxC448piVLBbtOxFcXwnymH9oUF8nRd3CuYDVvkRBxRl6pB4Mtas5a4drtL+E8LDgFkQNcgIw6tc8Hg==", 2304 | "dev": true 2305 | }, 2306 | "split-string": { 2307 | "version": "3.1.0", 2308 | "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", 2309 | "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", 2310 | "dev": true, 2311 | "requires": { 2312 | "extend-shallow": "^3.0.0" 2313 | } 2314 | }, 2315 | "sprintf-js": { 2316 | "version": "1.0.3", 2317 | "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", 2318 | "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", 2319 | "dev": true 2320 | }, 2321 | "static-extend": { 2322 | "version": "0.1.2", 2323 | "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", 2324 | "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=", 2325 | "dev": true, 2326 | "requires": { 2327 | "define-property": "^0.2.5", 2328 | "object-copy": "^0.1.0" 2329 | }, 2330 | "dependencies": { 2331 | "define-property": { 2332 | "version": "0.2.5", 2333 | "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", 2334 | "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", 2335 | "dev": true, 2336 | "requires": { 2337 | "is-descriptor": "^0.1.0" 2338 | } 2339 | } 2340 | } 2341 | }, 2342 | "string-width": { 2343 | "version": "3.1.0", 2344 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", 2345 | "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", 2346 | "dev": true, 2347 | "requires": { 2348 | "emoji-regex": "^7.0.1", 2349 | "is-fullwidth-code-point": "^2.0.0", 2350 | "strip-ansi": "^5.1.0" 2351 | }, 2352 | "dependencies": { 2353 | "ansi-regex": { 2354 | "version": "4.1.0", 2355 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", 2356 | "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", 2357 | "dev": true 2358 | }, 2359 | "strip-ansi": { 2360 | "version": "5.2.0", 2361 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", 2362 | "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", 2363 | "dev": true, 2364 | "requires": { 2365 | "ansi-regex": "^4.1.0" 2366 | } 2367 | } 2368 | } 2369 | }, 2370 | "string_decoder": { 2371 | "version": "1.1.1", 2372 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", 2373 | "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", 2374 | "dev": true, 2375 | "requires": { 2376 | "safe-buffer": "~5.1.0" 2377 | } 2378 | }, 2379 | "strip-ansi": { 2380 | "version": "4.0.0", 2381 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", 2382 | "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", 2383 | "dev": true, 2384 | "requires": { 2385 | "ansi-regex": "^3.0.0" 2386 | } 2387 | }, 2388 | "strip-eof": { 2389 | "version": "1.0.0", 2390 | "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", 2391 | "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=", 2392 | "dev": true 2393 | }, 2394 | "supports-color": { 2395 | "version": "5.5.0", 2396 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", 2397 | "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", 2398 | "dev": true, 2399 | "requires": { 2400 | "has-flag": "^3.0.0" 2401 | } 2402 | }, 2403 | "to-object-path": { 2404 | "version": "0.3.0", 2405 | "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", 2406 | "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=", 2407 | "dev": true, 2408 | "requires": { 2409 | "kind-of": "^3.0.2" 2410 | }, 2411 | "dependencies": { 2412 | "kind-of": { 2413 | "version": "3.2.2", 2414 | "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", 2415 | "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", 2416 | "dev": true, 2417 | "requires": { 2418 | "is-buffer": "^1.1.5" 2419 | } 2420 | } 2421 | } 2422 | }, 2423 | "to-regex": { 2424 | "version": "3.0.2", 2425 | "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", 2426 | "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", 2427 | "dev": true, 2428 | "requires": { 2429 | "define-property": "^2.0.2", 2430 | "extend-shallow": "^3.0.2", 2431 | "regex-not": "^1.0.2", 2432 | "safe-regex": "^1.1.0" 2433 | } 2434 | }, 2435 | "to-regex-range": { 2436 | "version": "2.1.1", 2437 | "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", 2438 | "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", 2439 | "dev": true, 2440 | "requires": { 2441 | "is-number": "^3.0.0", 2442 | "repeat-string": "^1.6.1" 2443 | } 2444 | }, 2445 | "tslib": { 2446 | "version": "1.10.0", 2447 | "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.10.0.tgz", 2448 | "integrity": "sha512-qOebF53frne81cf0S9B41ByenJ3/IuH8yJKngAX35CmiZySA0khhkovshKK+jGCaMnVomla7gVlIcc3EvKPbTQ==", 2449 | "dev": true 2450 | }, 2451 | "tslint": { 2452 | "version": "5.20.1", 2453 | "resolved": "https://registry.npmjs.org/tslint/-/tslint-5.20.1.tgz", 2454 | "integrity": "sha512-EcMxhzCFt8k+/UP5r8waCf/lzmeSyVlqxqMEDQE7rWYiQky8KpIBz1JAoYXfROHrPZ1XXd43q8yQnULOLiBRQg==", 2455 | "dev": true, 2456 | "requires": { 2457 | "@babel/code-frame": "^7.0.0", 2458 | "builtin-modules": "^1.1.1", 2459 | "chalk": "^2.3.0", 2460 | "commander": "^2.12.1", 2461 | "diff": "^4.0.1", 2462 | "glob": "^7.1.1", 2463 | "js-yaml": "^3.13.1", 2464 | "minimatch": "^3.0.4", 2465 | "mkdirp": "^0.5.1", 2466 | "resolve": "^1.3.2", 2467 | "semver": "^5.3.0", 2468 | "tslib": "^1.8.0", 2469 | "tsutils": "^2.29.0" 2470 | } 2471 | }, 2472 | "tsutils": { 2473 | "version": "2.29.0", 2474 | "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-2.29.0.tgz", 2475 | "integrity": "sha512-g5JVHCIJwzfISaXpXE1qvNalca5Jwob6FjI4AoPlqMusJ6ftFE7IkkFoMhVLRgK+4Kx3gkzb8UZK5t5yTTvEmA==", 2476 | "dev": true, 2477 | "requires": { 2478 | "tslib": "^1.8.1" 2479 | } 2480 | }, 2481 | "typescript": { 2482 | "version": "3.4.5", 2483 | "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.4.5.tgz", 2484 | "integrity": "sha512-YycBxUb49UUhdNMU5aJ7z5Ej2XGmaIBL0x34vZ82fn3hGvD+bgrMrVDpatgz2f7YxUMJxMkbWxJZeAvDxVe7Vw==", 2485 | "dev": true 2486 | }, 2487 | "union-value": { 2488 | "version": "1.0.1", 2489 | "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz", 2490 | "integrity": "sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==", 2491 | "dev": true, 2492 | "requires": { 2493 | "arr-union": "^3.1.0", 2494 | "get-value": "^2.0.6", 2495 | "is-extendable": "^0.1.1", 2496 | "set-value": "^2.0.1" 2497 | } 2498 | }, 2499 | "unset-value": { 2500 | "version": "1.0.0", 2501 | "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", 2502 | "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=", 2503 | "dev": true, 2504 | "requires": { 2505 | "has-value": "^0.3.1", 2506 | "isobject": "^3.0.0" 2507 | }, 2508 | "dependencies": { 2509 | "has-value": { 2510 | "version": "0.3.1", 2511 | "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", 2512 | "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", 2513 | "dev": true, 2514 | "requires": { 2515 | "get-value": "^2.0.3", 2516 | "has-values": "^0.1.4", 2517 | "isobject": "^2.0.0" 2518 | }, 2519 | "dependencies": { 2520 | "isobject": { 2521 | "version": "2.1.0", 2522 | "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", 2523 | "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", 2524 | "dev": true, 2525 | "requires": { 2526 | "isarray": "1.0.0" 2527 | } 2528 | } 2529 | } 2530 | }, 2531 | "has-values": { 2532 | "version": "0.1.4", 2533 | "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", 2534 | "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=", 2535 | "dev": true 2536 | } 2537 | } 2538 | }, 2539 | "upath": { 2540 | "version": "1.2.0", 2541 | "resolved": "https://registry.npmjs.org/upath/-/upath-1.2.0.tgz", 2542 | "integrity": "sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==", 2543 | "dev": true 2544 | }, 2545 | "urix": { 2546 | "version": "0.1.0", 2547 | "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", 2548 | "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=", 2549 | "dev": true 2550 | }, 2551 | "use": { 2552 | "version": "3.1.1", 2553 | "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", 2554 | "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==", 2555 | "dev": true 2556 | }, 2557 | "util-deprecate": { 2558 | "version": "1.0.2", 2559 | "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", 2560 | "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", 2561 | "dev": true 2562 | }, 2563 | "which": { 2564 | "version": "1.3.1", 2565 | "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", 2566 | "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", 2567 | "dev": true, 2568 | "requires": { 2569 | "isexe": "^2.0.0" 2570 | } 2571 | }, 2572 | "which-module": { 2573 | "version": "2.0.0", 2574 | "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", 2575 | "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", 2576 | "dev": true 2577 | }, 2578 | "wrap-ansi": { 2579 | "version": "2.1.0", 2580 | "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", 2581 | "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", 2582 | "dev": true, 2583 | "requires": { 2584 | "string-width": "^1.0.1", 2585 | "strip-ansi": "^3.0.1" 2586 | }, 2587 | "dependencies": { 2588 | "ansi-regex": { 2589 | "version": "2.1.1", 2590 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", 2591 | "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", 2592 | "dev": true 2593 | }, 2594 | "is-fullwidth-code-point": { 2595 | "version": "1.0.0", 2596 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", 2597 | "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", 2598 | "dev": true, 2599 | "requires": { 2600 | "number-is-nan": "^1.0.0" 2601 | } 2602 | }, 2603 | "string-width": { 2604 | "version": "1.0.2", 2605 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", 2606 | "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", 2607 | "dev": true, 2608 | "requires": { 2609 | "code-point-at": "^1.0.0", 2610 | "is-fullwidth-code-point": "^1.0.0", 2611 | "strip-ansi": "^3.0.0" 2612 | } 2613 | }, 2614 | "strip-ansi": { 2615 | "version": "3.0.1", 2616 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", 2617 | "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", 2618 | "dev": true, 2619 | "requires": { 2620 | "ansi-regex": "^2.0.0" 2621 | } 2622 | } 2623 | } 2624 | }, 2625 | "wrappy": { 2626 | "version": "1.0.2", 2627 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", 2628 | "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", 2629 | "dev": true 2630 | }, 2631 | "y18n": { 2632 | "version": "4.0.1", 2633 | "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.1.tgz", 2634 | "integrity": "sha512-wNcy4NvjMYL8gogWWYAO7ZFWFfHcbdbE57tZO8e4cbpj8tfUcwrwqSl3ad8HxpYWCdXcJUCeKKZS62Av1affwQ==", 2635 | "dev": true 2636 | }, 2637 | "yargs": { 2638 | "version": "13.1.0", 2639 | "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.1.0.tgz", 2640 | "integrity": "sha512-1UhJbXfzHiPqkfXNHYhiz79qM/kZqjTE8yGlEjZa85Q+3+OwcV6NRkV7XOV1W2Eom2bzILeUn55pQYffjVOLAg==", 2641 | "dev": true, 2642 | "requires": { 2643 | "cliui": "^4.0.0", 2644 | "find-up": "^3.0.0", 2645 | "get-caller-file": "^2.0.1", 2646 | "os-locale": "^3.1.0", 2647 | "require-directory": "^2.1.1", 2648 | "require-main-filename": "^2.0.0", 2649 | "set-blocking": "^2.0.0", 2650 | "string-width": "^3.0.0", 2651 | "which-module": "^2.0.0", 2652 | "y18n": "^4.0.0", 2653 | "yargs-parser": "^13.0.0" 2654 | } 2655 | }, 2656 | "yargs-parser": { 2657 | "version": "13.1.2", 2658 | "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz", 2659 | "integrity": "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==", 2660 | "dev": true, 2661 | "requires": { 2662 | "camelcase": "^5.0.0", 2663 | "decamelize": "^1.2.0" 2664 | } 2665 | }, 2666 | "zone.js": { 2667 | "version": "0.9.1", 2668 | "resolved": "https://registry.npmjs.org/zone.js/-/zone.js-0.9.1.tgz", 2669 | "integrity": "sha512-GkPiJL8jifSrKReKaTZ5jkhrMEgXbXYC+IPo1iquBjayRa0q86w3Dipjn8b415jpitMExe9lV8iTsv8tk3DGag==", 2670 | "dev": true 2671 | } 2672 | } 2673 | } 2674 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "ng-sidebar", 3 | "version": "9.4.3", 4 | "description": "[DEPRECATED] Angular sidebar component.", 5 | "repository": { 6 | "type": "git", 7 | "url": "https://github.com/arkon/ng-sidebar.git" 8 | }, 9 | "homepage": "http://echeung.me/ng-sidebar/", 10 | "bugs": { 11 | "url": "https://github.com/arkon/ng-sidebar/issues" 12 | }, 13 | "files": [ 14 | "lib_commonjs/*", 15 | "lib_esmodule/*", 16 | "README.md", 17 | "LICENSE" 18 | ], 19 | "author": "Eugene Cheung", 20 | "license": "MIT", 21 | "keywords": [ 22 | "angular", 23 | "ng", 24 | "sidebar", 25 | "component" 26 | ], 27 | "main": "./lib_commonjs/index.js", 28 | "module": "./lib_esmodule/index.js", 29 | "jsnext:main": "./lib_esmodule/index.js", 30 | "typings": "./lib_commonjs/index.d.ts", 31 | "scripts": { 32 | "lint": "tslint --project tsconfig.json src/**/*.ts", 33 | "build:commonjs": "rimraf lib_commonjs && ngc -p tsconfig.json", 34 | "build:esmodule": "rimraf lib_esmodule && ngc -p tsconfig.module.json", 35 | "build": "npm run lint && npm run build:commonjs && npm run build:esmodule", 36 | "prepare": "npm run build" 37 | }, 38 | "peerDependencies": { 39 | "@angular/core": ">=8.0.0", 40 | "@angular/common": ">=8.0.0" 41 | }, 42 | "devDependencies": { 43 | "@angular/common": "^8.2.14", 44 | "@angular/compiler": "^8.2.14", 45 | "@angular/compiler-cli": "^8.2.14", 46 | "@angular/core": "^8.2.14", 47 | "@angular/platform-browser": "^8.2.14", 48 | "rimraf": "^3.0.2", 49 | "rxjs": "^6.5.5", 50 | "tslint": "^5.20.1", 51 | "typescript": "~3.4.0", 52 | "zone.js": "~0.9.1" 53 | } 54 | } 55 | -------------------------------------------------------------------------------- /src/close.directive.ts: -------------------------------------------------------------------------------- 1 | import { Directive } from '@angular/core'; 2 | 3 | import { Sidebar } from './sidebar.component'; 4 | 5 | @Directive({ 6 | selector: '[closeSidebar]', 7 | host: { 8 | '(click)': '_onClick()' 9 | } 10 | }) 11 | export class CloseSidebar { 12 | constructor(private _sidebar: Sidebar) {} 13 | 14 | /** @internal */ 15 | _onClick(): void { 16 | if (this._sidebar) { 17 | this._sidebar.close(); 18 | } 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /src/index.ts: -------------------------------------------------------------------------------- 1 | export { SidebarContainer } from './sidebar-container.component'; 2 | export { Sidebar } from './sidebar.component'; 3 | export { CloseSidebar } from './close.directive'; 4 | export { SidebarModule } from './sidebar.module'; 5 | -------------------------------------------------------------------------------- /src/sidebar-container.component.ts: -------------------------------------------------------------------------------- 1 | import { 2 | AfterContentInit, 3 | ChangeDetectionStrategy, 4 | ChangeDetectorRef, 5 | Component, 6 | EventEmitter, 7 | Inject, 8 | Input, 9 | OnChanges, 10 | OnDestroy, 11 | Output, 12 | PLATFORM_ID, 13 | SimpleChanges 14 | } from '@angular/core'; 15 | import { isPlatformBrowser } from '@angular/common'; 16 | 17 | import { Sidebar } from './sidebar.component'; 18 | 19 | // Based on https://github.com/angular/material2/tree/master/src/lib/sidenav 20 | @Component({ 21 | selector: 'ng-sidebar-container', 22 | template: ` 23 | 28 | 29 | 30 | 31 |
35 | 36 |
37 | `, 38 | styles: [` 39 | :host { 40 | box-sizing: border-box; 41 | display: block; 42 | position: relative; 43 | height: 100%; 44 | width: 100%; 45 | overflow: hidden; 46 | } 47 | 48 | .ng-sidebar__backdrop { 49 | position: absolute; 50 | top: 0; 51 | bottom: 0; 52 | left: 0; 53 | right: 0; 54 | background: #000; 55 | opacity: 0.75; 56 | pointer-events: auto; 57 | z-index: 1; 58 | } 59 | 60 | .ng-sidebar__content { 61 | -webkit-overflow-scrolling: touch; 62 | overflow: auto; 63 | position: absolute; 64 | top: 0; 65 | bottom: 0; 66 | left: 0; 67 | right: 0; 68 | } 69 | 70 | .ng-sidebar__content--animate { 71 | -webkit-transition: -webkit-transform 0.3s cubic-bezier(0, 0, 0.3, 1), padding 0.3s cubic-bezier(0, 0, 0.3, 1); 72 | transition: transform 0.3s cubic-bezier(0, 0, 0.3, 1), padding 0.3s cubic-bezier(0, 0, 0.3, 1); 73 | } 74 | `], 75 | changeDetection: ChangeDetectionStrategy.OnPush 76 | }) 77 | export class SidebarContainer implements AfterContentInit, OnChanges, OnDestroy { 78 | @Input() animate: boolean = true; 79 | 80 | @Input() allowSidebarBackdropControl: boolean = true; 81 | @Input() showBackdrop: boolean = false; 82 | @Output() showBackdropChange = new EventEmitter(); 83 | @Output() onBackdropClicked = new EventEmitter(); 84 | 85 | @Input() contentClass: string; 86 | @Input() backdropClass: string; 87 | 88 | private _sidebars: Array = []; 89 | 90 | private _isBrowser: boolean; 91 | 92 | constructor( 93 | private _ref: ChangeDetectorRef, 94 | @Inject(PLATFORM_ID) platformId: Object) { 95 | this._isBrowser = isPlatformBrowser(platformId); 96 | } 97 | 98 | ngAfterContentInit(): void { 99 | if (!this._isBrowser) { 100 | return; 101 | } 102 | 103 | this._onToggle(); 104 | } 105 | 106 | ngOnChanges(changes: SimpleChanges): void { 107 | if (!this._isBrowser) { 108 | return; 109 | } 110 | 111 | if (changes['showBackdrop']) { 112 | this.showBackdropChange.emit(changes['showBackdrop'].currentValue); 113 | } 114 | } 115 | 116 | ngOnDestroy(): void { 117 | if (!this._isBrowser) { 118 | return; 119 | } 120 | 121 | this._unsubscribe(); 122 | } 123 | 124 | /** 125 | * @internal 126 | * 127 | * Adds a sidebar to the container's list of sidebars. 128 | * 129 | * @param sidebar {Sidebar} A sidebar within the container to register. 130 | */ 131 | _addSidebar(sidebar: Sidebar) { 132 | this._sidebars.push(sidebar); 133 | this._subscribe(sidebar); 134 | } 135 | 136 | /** 137 | * @internal 138 | * 139 | * Removes a sidebar from the container's list of sidebars. 140 | * 141 | * @param sidebar {Sidebar} The sidebar to remove. 142 | */ 143 | _removeSidebar(sidebar: Sidebar) { 144 | const index = this._sidebars.indexOf(sidebar); 145 | if (index !== -1) { 146 | this._sidebars.splice(index, 1); 147 | } 148 | } 149 | 150 | /** 151 | * @internal 152 | * 153 | * Computes `margin` value to push page contents to accommodate open sidebars as needed. 154 | * 155 | * @return {CSSStyleDeclaration} margin styles for the page content. 156 | */ 157 | _getContentStyle(): CSSStyleDeclaration { 158 | let left = 0, 159 | right = 0, 160 | top = 0, 161 | bottom = 0; 162 | 163 | let transformStyle: string = ''; 164 | let heightStyle: string = ''; 165 | let widthStyle: string = ''; 166 | 167 | for (const sidebar of this._sidebars) { 168 | // Slide mode: we need to translate the entire container 169 | if (sidebar._isModeSlide) { 170 | if (sidebar.opened) { 171 | const transformDir: string = sidebar._isLeftOrRight ? 'X' : 'Y'; 172 | const transformAmt: string = 173 | `${sidebar._isLeftOrTop ? '' : '-'}${sidebar._isLeftOrRight ? sidebar._width : sidebar._height}`; 174 | 175 | transformStyle = `translate${transformDir}(${transformAmt}px)`; 176 | } 177 | } 178 | 179 | // Create a space for the sidebar 180 | if ((sidebar._isModePush && sidebar.opened) || sidebar.dock) { 181 | let paddingAmt: number = 0; 182 | 183 | if (sidebar._isModeSlide && sidebar.opened) { 184 | if (sidebar._isLeftOrRight) { 185 | widthStyle = '100%'; 186 | } else { 187 | heightStyle = '100%'; 188 | } 189 | } else { 190 | if (sidebar._isDocked || (sidebar._isModeOver && sidebar.dock)) { 191 | paddingAmt = sidebar._dockedSize; 192 | } else { 193 | paddingAmt = sidebar._isLeftOrRight ? sidebar._width : sidebar._height; 194 | } 195 | } 196 | 197 | switch (sidebar.position) { 198 | case 'left': 199 | left = Math.max(left, paddingAmt); 200 | break; 201 | 202 | case 'right': 203 | right = Math.max(right, paddingAmt); 204 | break; 205 | 206 | case 'top': 207 | top = Math.max(top, paddingAmt); 208 | break; 209 | 210 | case 'bottom': 211 | bottom = Math.max(bottom, paddingAmt); 212 | break; 213 | } 214 | } 215 | } 216 | 217 | return { 218 | padding: `${top}px ${right}px ${bottom}px ${left}px`, 219 | webkitTransform: transformStyle, 220 | transform: transformStyle, 221 | height: heightStyle, 222 | width: widthStyle 223 | } as CSSStyleDeclaration; 224 | } 225 | 226 | /** 227 | * @internal 228 | * 229 | * Closes sidebars when the backdrop is clicked, if they have the 230 | * `closeOnClickBackdrop` option set. 231 | */ 232 | _onBackdropClicked(): void { 233 | let backdropClicked = false; 234 | for (const sidebar of this._sidebars) { 235 | if (sidebar.opened && sidebar.showBackdrop && sidebar.closeOnClickBackdrop) { 236 | sidebar.close(); 237 | backdropClicked = true; 238 | } 239 | } 240 | 241 | if (backdropClicked) { 242 | this.onBackdropClicked.emit(); 243 | } 244 | } 245 | 246 | /** 247 | * Subscribes from a sidebar events to react properly. 248 | */ 249 | private _subscribe(sidebar: Sidebar): void { 250 | sidebar.onOpenStart.subscribe(() => this._onToggle()); 251 | sidebar.onOpened.subscribe(() => this._markForCheck()); 252 | 253 | sidebar.onCloseStart.subscribe(() => this._onToggle()); 254 | sidebar.onClosed.subscribe(() => this._markForCheck()); 255 | 256 | sidebar.onModeChange.subscribe(() => this._markForCheck()); 257 | sidebar.onPositionChange.subscribe(() => this._markForCheck()); 258 | 259 | sidebar._onRerender.subscribe(() => this._markForCheck()); 260 | } 261 | 262 | /** 263 | * Unsubscribes from all sidebars. 264 | */ 265 | private _unsubscribe(): void { 266 | for (const sidebar of this._sidebars) { 267 | sidebar.onOpenStart.unsubscribe(); 268 | sidebar.onOpened.unsubscribe(); 269 | 270 | sidebar.onCloseStart.unsubscribe(); 271 | sidebar.onClosed.unsubscribe(); 272 | 273 | sidebar.onModeChange.unsubscribe(); 274 | sidebar.onPositionChange.unsubscribe(); 275 | 276 | sidebar._onRerender.unsubscribe(); 277 | } 278 | } 279 | 280 | /** 281 | * Check if we should show the backdrop when a sidebar is toggled. 282 | */ 283 | private _onToggle(): void { 284 | if (this._sidebars.length > 0 && this.allowSidebarBackdropControl) { 285 | // Show backdrop if a single open sidebar has it set 286 | const hasOpen = this._sidebars.some(sidebar => sidebar.opened && sidebar.showBackdrop); 287 | 288 | this.showBackdrop = hasOpen; 289 | this.showBackdropChange.emit(hasOpen); 290 | } 291 | 292 | setTimeout(() => { 293 | this._markForCheck(); 294 | }); 295 | } 296 | 297 | /** 298 | * Triggers change detection to recompute styles. 299 | */ 300 | private _markForCheck(): void { 301 | this._ref.markForCheck(); 302 | } 303 | } 304 | -------------------------------------------------------------------------------- /src/sidebar.component.ts: -------------------------------------------------------------------------------- 1 | import { 2 | AfterContentInit, 3 | ChangeDetectionStrategy, 4 | ChangeDetectorRef, 5 | Component, 6 | ElementRef, 7 | EventEmitter, 8 | Inject, 9 | Input, 10 | OnChanges, 11 | OnDestroy, 12 | OnInit, 13 | Optional, 14 | Output, 15 | PLATFORM_ID, 16 | SimpleChanges, 17 | ViewChild 18 | } from '@angular/core'; 19 | import { isPlatformBrowser } from '@angular/common'; 20 | 21 | import { SidebarContainer } from './sidebar-container.component'; 22 | import { isLTR, isIOS } from './utils'; 23 | 24 | @Component({ 25 | selector: 'ng-sidebar', 26 | template: ` 27 | 39 | `, 40 | styles: [` 41 | .ng-sidebar { 42 | -webkit-overflow-scrolling: touch; 43 | overflow: auto; 44 | pointer-events: auto; 45 | position: absolute; 46 | touch-action: auto; 47 | will-change: initial; 48 | z-index: 2; 49 | } 50 | 51 | .ng-sidebar--left { 52 | bottom: 0; 53 | left: 0; 54 | top: 0; 55 | } 56 | 57 | .ng-sidebar--right { 58 | bottom: 0; 59 | right: 0; 60 | top: 0; 61 | } 62 | 63 | .ng-sidebar--top { 64 | left: 0; 65 | right: 0; 66 | top: 0; 67 | } 68 | 69 | .ng-sidebar--bottom { 70 | bottom: 0; 71 | left: 0; 72 | right: 0; 73 | } 74 | 75 | .ng-sidebar--inert { 76 | pointer-events: none; 77 | touch-action: none; 78 | will-change: transform; 79 | } 80 | 81 | .ng-sidebar--animate { 82 | -webkit-transition: -webkit-transform 0.3s cubic-bezier(0, 0, 0.3, 1); 83 | transition: transform 0.3s cubic-bezier(0, 0, 0.3, 1); 84 | } 85 | `], 86 | changeDetection: ChangeDetectionStrategy.OnPush 87 | }) 88 | export class Sidebar implements AfterContentInit, OnInit, OnChanges, OnDestroy { 89 | // `openedChange` allows for "2-way" data binding 90 | @Input() opened: boolean = false; 91 | @Output() openedChange: EventEmitter = new EventEmitter(); 92 | 93 | @Input() mode: 'over' | 'push' | 'slide' = 'over'; 94 | @Input() dock: boolean = false; 95 | @Input() dockedSize: string = '0px'; 96 | @Input() position: 'start' | 'end' | 'left' | 'right' | 'top' | 'bottom' = 'start'; 97 | @Input() animate: boolean = true; 98 | 99 | @Input() autoCollapseHeight: number; 100 | @Input() autoCollapseWidth: number; 101 | @Input() autoCollapseOnInit: boolean = true; 102 | 103 | @Input() sidebarClass: string; 104 | 105 | @Input() ariaLabel: string; 106 | @Input() trapFocus: boolean = false; 107 | @Input() autoFocus: boolean = true; 108 | 109 | @Input() showBackdrop: boolean = false; 110 | @Input() closeOnClickBackdrop: boolean = false; 111 | @Input() closeOnClickOutside: boolean = false; 112 | 113 | @Input() keyClose: boolean = false; 114 | @Input() keyCode: number = 27; // Default to ESC key 115 | 116 | @Output() onContentInit: EventEmitter = new EventEmitter(); 117 | @Output() onOpenStart: EventEmitter = new EventEmitter(); 118 | @Output() onOpened: EventEmitter = new EventEmitter(); 119 | @Output() onCloseStart: EventEmitter = new EventEmitter(); 120 | @Output() onClosed: EventEmitter = new EventEmitter(); 121 | @Output() onTransitionEnd: EventEmitter = new EventEmitter(); 122 | @Output() onModeChange: EventEmitter = new EventEmitter(); 123 | @Output() onPositionChange: EventEmitter = new EventEmitter(); 124 | 125 | /** @internal */ 126 | @Output() _onRerender: EventEmitter = new EventEmitter(); 127 | 128 | /** @internal */ 129 | @ViewChild('sidebar', {static: false}) _elSidebar: ElementRef; 130 | 131 | private _focusableElementsString: string = 'a[href], area[href], input:not([disabled]), select:not([disabled]),' + 132 | 'textarea:not([disabled]), button:not([disabled]), iframe, object, embed, [tabindex], [contenteditable]'; 133 | private _focusableElements: Array; 134 | private _focusedBeforeOpen: HTMLElement; 135 | 136 | private _tabIndexAttr: string = '__tabindex__'; 137 | private _tabIndexIndicatorAttr: string = '__ngsidebar-tabindex__'; 138 | 139 | private _wasCollapsed: boolean; 140 | 141 | // Delay initial animation (issues #59, #112) 142 | private _shouldAnimate: boolean; 143 | 144 | private _clickEvent: string = 'click'; 145 | private _onClickOutsideAttached: boolean = false; 146 | private _onKeyDownAttached: boolean = false; 147 | private _onResizeAttached: boolean = false; 148 | 149 | private _isBrowser: boolean; 150 | 151 | constructor( 152 | @Optional() private _container: SidebarContainer, 153 | private _ref: ChangeDetectorRef, 154 | @Inject(PLATFORM_ID) platformId: Object) { 155 | if (!this._container) { 156 | throw new Error( 157 | ' must be inside a . ' + 158 | 'See https://github.com/arkon/ng-sidebar#usage for more info.' 159 | ); 160 | } 161 | 162 | this._isBrowser = isPlatformBrowser(platformId); 163 | 164 | // Handle taps in iOS 165 | if (this._isBrowser && isIOS() && !('onclick' in window)) { 166 | this._clickEvent = 'touchstart'; 167 | } 168 | 169 | this._normalizePosition(); 170 | 171 | this.open = this.open.bind(this); 172 | this.close = this.close.bind(this); 173 | this._onTransitionEnd = this._onTransitionEnd.bind(this); 174 | this._onFocusTrap = this._onFocusTrap.bind(this); 175 | this._onClickOutside = this._onClickOutside.bind(this); 176 | this._onKeyDown = this._onKeyDown.bind(this); 177 | this._collapse = this._collapse.bind(this); 178 | } 179 | 180 | ngOnInit(): void { 181 | if (!this._isBrowser) { 182 | return; 183 | } 184 | 185 | if (this.animate) { 186 | this._shouldAnimate = true; 187 | this.animate = false; 188 | } 189 | 190 | this._container._addSidebar(this); 191 | 192 | if (this.autoCollapseOnInit) { 193 | this._collapse(); 194 | } 195 | } 196 | 197 | ngAfterContentInit(): void { 198 | this.onContentInit.emit(); 199 | } 200 | 201 | ngOnChanges(changes: SimpleChanges): void { 202 | if (!this._isBrowser) { 203 | return; 204 | } 205 | 206 | if (changes['animate'] && this._shouldAnimate) { 207 | this._shouldAnimate = changes['animate'].currentValue; 208 | } 209 | 210 | if (changes['closeOnClickOutside']) { 211 | if (changes['closeOnClickOutside'].currentValue) { 212 | this._initCloseClickListener(); 213 | } else { 214 | this._destroyCloseClickListener(); 215 | } 216 | } 217 | if (changes['keyClose']) { 218 | if (changes['keyClose'].currentValue) { 219 | this._initCloseKeyDownListener(); 220 | } else { 221 | this._destroyCloseKeyDownListener(); 222 | } 223 | } 224 | 225 | if (changes['position']) { 226 | // Handle "start" and "end" aliases 227 | this._normalizePosition(); 228 | 229 | // Emit change in timeout to allow for position change to be rendered first 230 | setTimeout(() => { 231 | this.onPositionChange.emit(changes['position'].currentValue); 232 | }); 233 | } 234 | 235 | if (changes['mode']) { 236 | setTimeout(() => { 237 | this.onModeChange.emit(changes['mode'].currentValue); 238 | }); 239 | } 240 | 241 | if (changes['dock']) { 242 | this.triggerRerender(); 243 | } 244 | 245 | if (changes['opened']) { 246 | if (this._shouldAnimate) { 247 | this.animate = true; 248 | this._shouldAnimate = false; 249 | } 250 | 251 | if (changes['opened'].currentValue) { 252 | this.open(); 253 | } else { 254 | this.close(); 255 | } 256 | } 257 | 258 | if (changes['autoCollapseHeight'] || changes['autoCollapseWidth']) { 259 | this._initCollapseListeners(); 260 | } 261 | } 262 | 263 | ngOnDestroy(): void { 264 | if (!this._isBrowser) { 265 | return; 266 | } 267 | 268 | this._destroyCloseListeners(); 269 | this._destroyCollapseListeners(); 270 | 271 | this._container._removeSidebar(this); 272 | } 273 | 274 | // Sidebar toggling 275 | // ============================================================================================== 276 | 277 | /** 278 | * Opens the sidebar and emits the appropriate events. 279 | */ 280 | open(): void { 281 | if (!this._isBrowser) { 282 | return; 283 | } 284 | 285 | this.opened = true; 286 | this.openedChange.emit(true); 287 | 288 | this.onOpenStart.emit(); 289 | 290 | this._ref.detectChanges(); 291 | 292 | setTimeout(() => { 293 | if (this.animate && !this._isModeSlide) { 294 | this._elSidebar.nativeElement.addEventListener('transitionend', this._onTransitionEnd); 295 | } else { 296 | this._setFocused(); 297 | this._initCloseListeners(); 298 | 299 | if (this.opened) { 300 | this.onOpened.emit(); 301 | } 302 | } 303 | }); 304 | } 305 | 306 | /** 307 | * Closes the sidebar and emits the appropriate events. 308 | */ 309 | close(): void { 310 | if (!this._isBrowser) { 311 | return; 312 | } 313 | 314 | this.opened = false; 315 | this.openedChange.emit(false); 316 | 317 | this.onCloseStart.emit(); 318 | 319 | this._ref.detectChanges(); 320 | 321 | setTimeout(() => { 322 | if (this.animate && !this._isModeSlide) { 323 | this._elSidebar.nativeElement.addEventListener('transitionend', this._onTransitionEnd); 324 | } else { 325 | this._setFocused(); 326 | this._destroyCloseListeners(); 327 | 328 | if (!this.opened) { 329 | this.onClosed.emit(); 330 | } 331 | } 332 | }); 333 | } 334 | 335 | /** 336 | * Manually trigger a re-render of the container. Useful if the sidebar contents might change. 337 | */ 338 | triggerRerender(): void { 339 | if (!this._isBrowser) { 340 | return; 341 | } 342 | 343 | setTimeout(() => { 344 | this._onRerender.emit(); 345 | }); 346 | } 347 | 348 | /** 349 | * @internal 350 | * 351 | * Computes the transform styles for the sidebar template. 352 | * 353 | * @return {CSSStyleDeclaration} The transform styles, with the WebKit-prefixed version as well. 354 | */ 355 | _getStyle(): CSSStyleDeclaration { 356 | let transformStyle: string = ''; 357 | 358 | // Hides sidebar off screen when closed 359 | if (!this.opened) { 360 | const transformDir: string = 'translate' + (this._isLeftOrRight ? 'X' : 'Y'); 361 | let translateAmt: string = `${this._isLeftOrTop ? '-' : ''}100%`; 362 | 363 | transformStyle = `${transformDir}(${translateAmt})`; 364 | 365 | // Docked mode: partially remains open 366 | // Note that using `calc(...)` within `transform(...)` doesn't work in IE 367 | if (this.dock && this._dockedSize > 0 && !(this._isModeSlide && this.opened)) { 368 | transformStyle += ` ${transformDir}(${this._isLeftOrTop ? '+' : '-'}${this.dockedSize})`; 369 | } 370 | } 371 | 372 | return { 373 | webkitTransform: transformStyle, 374 | transform: transformStyle 375 | } as CSSStyleDeclaration; 376 | } 377 | 378 | /** 379 | * @internal 380 | * 381 | * Handles the `transitionend` event on the sidebar to emit the onOpened/onClosed events after the transform 382 | * transition is completed. 383 | */ 384 | _onTransitionEnd(e: TransitionEvent): void { 385 | if (e.target === this._elSidebar.nativeElement && e.propertyName.endsWith('transform')) { 386 | this._setFocused(); 387 | 388 | if (this.opened) { 389 | this._initCloseListeners(); 390 | this.onOpened.emit(); 391 | } else { 392 | this._destroyCloseListeners(); 393 | this.onClosed.emit(); 394 | } 395 | 396 | this.onTransitionEnd.emit(); 397 | 398 | this._elSidebar.nativeElement.removeEventListener('transitionend', this._onTransitionEnd); 399 | } 400 | } 401 | 402 | // Focus on open/close 403 | // ============================================================================================== 404 | 405 | /** 406 | * Returns whether focus should be trapped within the sidebar. 407 | * 408 | * @return {boolean} Trap focus inside sidebar. 409 | */ 410 | private get _shouldTrapFocus(): boolean { 411 | return this.opened && this.trapFocus; 412 | } 413 | 414 | /** 415 | * Sets focus to the first focusable element inside the sidebar. 416 | */ 417 | private _focusFirstItem(): void { 418 | if (this._focusableElements && this._focusableElements.length > 0) { 419 | this._focusableElements[0].focus(); 420 | } 421 | } 422 | 423 | /** 424 | * Loops focus back to the start of the sidebar if set to do so. 425 | */ 426 | private _onFocusTrap(e: FocusEvent): void { 427 | if (this._shouldTrapFocus && !this._elSidebar.nativeElement.contains(e.target)) { 428 | this._focusFirstItem(); 429 | } 430 | } 431 | 432 | /** 433 | * Handles the ability to focus sidebar elements when it's open/closed to ensure that the sidebar is inert when 434 | * appropriate. 435 | */ 436 | private _setFocused(): void { 437 | this._focusableElements = Array.from( 438 | this._elSidebar.nativeElement.querySelectorAll(this._focusableElementsString) 439 | ) as Array; 440 | 441 | if (this.opened) { 442 | this._focusedBeforeOpen = document.activeElement as HTMLElement; 443 | 444 | // Restore focusability, with previous tabindex attributes 445 | for (const el of this._focusableElements) { 446 | const prevTabIndex = el.getAttribute(this._tabIndexAttr); 447 | const wasTabIndexSet = el.getAttribute(this._tabIndexIndicatorAttr) !== null; 448 | if (prevTabIndex !== null) { 449 | el.setAttribute('tabindex', prevTabIndex); 450 | el.removeAttribute(this._tabIndexAttr); 451 | } else if (wasTabIndexSet) { 452 | el.removeAttribute('tabindex'); 453 | el.removeAttribute(this._tabIndexIndicatorAttr); 454 | } 455 | } 456 | 457 | if (this.autoFocus) { 458 | this._focusFirstItem(); 459 | } 460 | 461 | document.addEventListener('focus', this._onFocusTrap, true); 462 | } else { 463 | // Manually make all focusable elements unfocusable, saving existing tabindex attributes 464 | for (const el of this._focusableElements) { 465 | const existingTabIndex = el.getAttribute('tabindex'); 466 | el.setAttribute('tabindex', '-1'); 467 | el.setAttribute(this._tabIndexIndicatorAttr, ''); 468 | 469 | if (existingTabIndex !== null) { 470 | el.setAttribute(this._tabIndexAttr, existingTabIndex); 471 | } 472 | } 473 | 474 | document.removeEventListener('focus', this._onFocusTrap, true); 475 | 476 | // Set focus back to element before the sidebar was opened 477 | if (this._focusedBeforeOpen && this.autoFocus && this._isModeOver) { 478 | this._focusedBeforeOpen.focus(); 479 | this._focusedBeforeOpen = null; 480 | } 481 | } 482 | } 483 | 484 | // Close event handlers 485 | // ============================================================================================== 486 | 487 | /** 488 | * Initializes event handlers for the closeOnClickOutside and keyClose options. 489 | */ 490 | private _initCloseListeners(): void { 491 | this._initCloseClickListener(); 492 | this._initCloseKeyDownListener(); 493 | } 494 | 495 | private _initCloseClickListener(): void { 496 | // In a timeout so that things render first 497 | setTimeout(() => { 498 | if (this.opened && this.closeOnClickOutside && !this._onClickOutsideAttached) { 499 | document.addEventListener(this._clickEvent, this._onClickOutside); 500 | this._onClickOutsideAttached = true; 501 | } 502 | }); 503 | } 504 | 505 | private _initCloseKeyDownListener(): void { 506 | // In a timeout so that things render first 507 | setTimeout(() => { 508 | if (this.opened && this.keyClose && !this._onKeyDownAttached) { 509 | document.addEventListener('keydown', this._onKeyDown); 510 | this._onKeyDownAttached = true; 511 | } 512 | }); 513 | } 514 | 515 | /** 516 | * Destroys all event handlers from _initCloseListeners. 517 | */ 518 | private _destroyCloseListeners(): void { 519 | this._destroyCloseClickListener(); 520 | this._destroyCloseKeyDownListener(); 521 | } 522 | 523 | private _destroyCloseClickListener(): void { 524 | if (this._onClickOutsideAttached) { 525 | document.removeEventListener(this._clickEvent, this._onClickOutside); 526 | this._onClickOutsideAttached = false; 527 | } 528 | } 529 | 530 | private _destroyCloseKeyDownListener(): void { 531 | if (this._onKeyDownAttached) { 532 | document.removeEventListener('keydown', this._onKeyDown); 533 | this._onKeyDownAttached = false; 534 | } 535 | } 536 | 537 | /** 538 | * Handles `click` events on anything while the sidebar is open for the closeOnClickOutside option. 539 | * Programatically closes the sidebar if a click occurs outside the sidebar. 540 | * 541 | * @param e {MouseEvent} Mouse click event. 542 | */ 543 | private _onClickOutside(e: MouseEvent): void { 544 | if (this._onClickOutsideAttached && this._elSidebar && !this._elSidebar.nativeElement.contains(e.target)) { 545 | this.close(); 546 | } 547 | } 548 | 549 | /** 550 | * Handles the `keydown` event for the keyClose option. 551 | * 552 | * @param e {KeyboardEvent} Normalized keydown event. 553 | */ 554 | private _onKeyDown(e: KeyboardEvent | Event): void { 555 | e = e || window.event; 556 | 557 | if ((e as KeyboardEvent).keyCode === this.keyCode) { 558 | this.close(); 559 | } 560 | } 561 | 562 | // Auto collapse handlers 563 | // ============================================================================================== 564 | 565 | private _initCollapseListeners(): void { 566 | if (this.autoCollapseHeight || this.autoCollapseWidth) { 567 | // In a timeout so that things render first 568 | setTimeout(() => { 569 | if (!this._onResizeAttached) { 570 | window.addEventListener('resize', this._collapse); 571 | this._onResizeAttached = true; 572 | } 573 | }); 574 | } 575 | } 576 | 577 | private _destroyCollapseListeners(): void { 578 | if (this._onResizeAttached) { 579 | window.removeEventListener('resize', this._collapse); 580 | this._onResizeAttached = false; 581 | } 582 | } 583 | 584 | private _collapse(): void { 585 | const winHeight: number = window.innerHeight; 586 | const winWidth: number = window.innerWidth; 587 | 588 | if (this.autoCollapseHeight) { 589 | if (winHeight <= this.autoCollapseHeight && this.opened) { 590 | this._wasCollapsed = true; 591 | this.close(); 592 | } else if (winHeight > this.autoCollapseHeight && this._wasCollapsed) { 593 | this.open(); 594 | this._wasCollapsed = false; 595 | } 596 | } 597 | 598 | if (this.autoCollapseWidth) { 599 | if (winWidth <= this.autoCollapseWidth && this.opened) { 600 | this._wasCollapsed = true; 601 | this.close(); 602 | } else if (winWidth > this.autoCollapseWidth && this._wasCollapsed) { 603 | this.open(); 604 | this._wasCollapsed = false; 605 | } 606 | } 607 | } 608 | 609 | // Helpers 610 | // ============================================================================================== 611 | 612 | /** 613 | * @internal 614 | * 615 | * Returns the rendered height of the sidebar (or the docked size). 616 | * This is used in the sidebar container. 617 | * 618 | * @return {number} Height of sidebar. 619 | */ 620 | get _height(): number { 621 | if (this._elSidebar.nativeElement) { 622 | return this._isDocked ? this._dockedSize : this._elSidebar.nativeElement.offsetHeight; 623 | } 624 | 625 | return 0; 626 | } 627 | 628 | /** 629 | * @internal 630 | * 631 | * Returns the rendered width of the sidebar (or the docked size). 632 | * This is used in the sidebar container. 633 | * 634 | * @return {number} Width of sidebar. 635 | */ 636 | get _width(): number { 637 | if (this._elSidebar.nativeElement) { 638 | return this._isDocked ? this._dockedSize : this._elSidebar.nativeElement.offsetWidth; 639 | } 640 | 641 | return 0; 642 | } 643 | 644 | /** 645 | * @internal 646 | * 647 | * Returns the docked size as a number. 648 | * 649 | * @return {number} Docked size. 650 | */ 651 | get _dockedSize(): number { 652 | return parseFloat(this.dockedSize); 653 | } 654 | 655 | /** 656 | * @internal 657 | * 658 | * Returns whether the sidebar is over mode. 659 | * 660 | * @return {boolean} Sidebar's mode is "over". 661 | */ 662 | get _isModeOver(): boolean { 663 | return this.mode === 'over'; 664 | } 665 | 666 | /** 667 | * @internal 668 | * 669 | * Returns whether the sidebar is push mode. 670 | * 671 | * @return {boolean} Sidebar's mode is "push". 672 | */ 673 | get _isModePush(): boolean { 674 | return this.mode === 'push'; 675 | } 676 | 677 | /** 678 | * @internal 679 | * 680 | * Returns whether the sidebar is slide mode. 681 | * 682 | * @return {boolean} Sidebar's mode is "slide". 683 | */ 684 | get _isModeSlide(): boolean { 685 | return this.mode === 'slide'; 686 | } 687 | 688 | /** 689 | * @internal 690 | * 691 | * Returns whether the sidebar is "docked" -- i.e. it is closed but in dock mode. 692 | * 693 | * @return {boolean} Sidebar is docked. 694 | */ 695 | get _isDocked(): boolean { 696 | return this.dock && this.dockedSize && !this.opened; 697 | } 698 | 699 | /** 700 | * @internal 701 | * 702 | * Returns whether the sidebar is positioned at the left or top. 703 | * 704 | * @return {boolean} Sidebar is positioned at the left or top. 705 | */ 706 | get _isLeftOrTop(): boolean { 707 | return this.position === 'left' || this.position === 'top'; 708 | } 709 | 710 | /** 711 | * @internal 712 | * 713 | * Returns whether the sidebar is positioned at the left or right. 714 | * 715 | * @return {boolean} Sidebar is positioned at the left or right. 716 | */ 717 | get _isLeftOrRight(): boolean { 718 | return this.position === 'left' || this.position === 'right'; 719 | } 720 | 721 | /** 722 | * @internal 723 | * 724 | * Returns whether the sidebar is inert -- i.e. the contents cannot be focused. 725 | * 726 | * @return {boolean} Sidebar is inert. 727 | */ 728 | get _isInert(): boolean { 729 | return !this.opened && !this.dock; 730 | } 731 | 732 | /** 733 | * "Normalizes" position. For example, "start" would be "left" if the page is LTR. 734 | */ 735 | private _normalizePosition(): void { 736 | const ltr: boolean = isLTR(); 737 | 738 | if (this.position === 'start') { 739 | this.position = ltr ? 'left' : 'right'; 740 | } else if (this.position === 'end') { 741 | this.position = ltr ? 'right' : 'left'; 742 | } 743 | } 744 | } 745 | -------------------------------------------------------------------------------- /src/sidebar.module.ts: -------------------------------------------------------------------------------- 1 | import { ModuleWithProviders, NgModule } from '@angular/core'; 2 | import { CommonModule } from '@angular/common'; 3 | 4 | import { SidebarContainer } from './sidebar-container.component'; 5 | import { Sidebar } from './sidebar.component'; 6 | import { CloseSidebar } from './close.directive'; 7 | 8 | @NgModule({ 9 | declarations: [SidebarContainer, Sidebar, CloseSidebar], 10 | imports: [CommonModule], 11 | exports: [SidebarContainer, Sidebar, CloseSidebar] 12 | }) 13 | export class SidebarModule { 14 | static forRoot(): ModuleWithProviders { 15 | return { 16 | ngModule: SidebarModule 17 | }; 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /src/utils.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * Returns whether the page is in LTR mode. Defaults to `true` if it can't be computed. 3 | * 4 | * @return {boolean} Page's language direction is left-to-right. 5 | */ 6 | export function isLTR(): boolean { 7 | let dir: string = 'ltr'; 8 | 9 | if (typeof window !== 'undefined') { 10 | if (window.getComputedStyle) { 11 | dir = window.getComputedStyle(document.body, null).getPropertyValue('direction'); 12 | } else { 13 | dir = (document.body as any).currentStyle.direction; 14 | } 15 | } 16 | 17 | return dir === 'ltr'; 18 | } 19 | 20 | /** 21 | * Returns whether or not the current device is an iOS device. 22 | * 23 | * @return {boolean} Device is an iOS device (i.e. iPod touch/iPhone/iPad). 24 | */ 25 | export function isIOS(): boolean { 26 | if (typeof window !== 'undefined' && typeof navigator !== 'undefined') { 27 | return /iPad|iPhone|iPod/.test(navigator.userAgent) && !(window as any).MSStream; 28 | } 29 | 30 | return false; 31 | } 32 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "target": "es5", 4 | "module": "commonjs", 5 | "moduleResolution": "node", 6 | "noUnusedParameters": true, 7 | "noUnusedLocals": true, 8 | "emitDecoratorMetadata": true, 9 | "experimentalDecorators": true, 10 | "declaration": true, 11 | "removeComments": true, 12 | "outDir": "lib_commonjs/", 13 | "rootDir": "src", 14 | "lib": ["dom", "es5", "es2015.core", "es2015.collection", "es2015.iterable", "es2015.promise"] 15 | }, 16 | "include": [ 17 | "src/**/*" 18 | ], 19 | "compileOnSave": false, 20 | "buildOnSave": false, 21 | "angularCompilerOptions": { 22 | "decoratorsAs": "static fields", 23 | "skipTemplateCodegen": true, 24 | "preserveWhitespaces": false 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /tsconfig.module.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "./tsconfig.json", 3 | "compilerOptions": { 4 | "module": "es2015", 5 | "outDir": "lib_esmodule/", 6 | "declaration": false 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /tslint.json: -------------------------------------------------------------------------------- 1 | { 2 | "rules": { 3 | "class-name": true, 4 | "comment-format": [true, "check-space"], 5 | "curly": true, 6 | "eofline": true, 7 | "indent": [true, "spaces"], 8 | "interface-name": [true, "always-prefix"], 9 | "jsdoc-format": true, 10 | "max-line-length": [true, 120], 11 | "member-ordering": [ 12 | true, 13 | "static-before-instance", 14 | "variables-before-functions" 15 | ], 16 | "new-parens": true, 17 | "no-angle-bracket-type-assertion": true, 18 | "no-arg": true, 19 | "no-construct": true, 20 | "no-debugger": true, 21 | "no-duplicate-variable": true, 22 | "no-empty": true, 23 | "no-eval": true, 24 | "no-invalid-this": true, 25 | "no-mergeable-namespace": true, 26 | "no-reference": true, 27 | "no-shadowed-variable": true, 28 | "no-trailing-whitespace": true, 29 | "no-unused-expression": true, 30 | "no-var-keyword": true, 31 | "one-line": [ 32 | true, 33 | "check-open-brace", 34 | "check-catch", 35 | "check-else", 36 | "check-whitespace" 37 | ], 38 | "quotemark": [true, "single", "jsx-double"], 39 | "radix": true, 40 | "semicolon": [true, "always"], 41 | "triple-equals": [ 42 | true, 43 | "allow-null-check", 44 | "allow-undefined-check" 45 | ], 46 | "use-isnan": true, 47 | "variable-name": false, 48 | "whitespace": [ 49 | true, 50 | "check-decl", 51 | "check-operator", 52 | "check-separator", 53 | "check-type" 54 | ] 55 | } 56 | } 57 | --------------------------------------------------------------------------------