├── .editorconfig ├── .gitignore ├── LICENSE ├── README.md ├── demo ├── asset │ ├── barrel.png │ ├── bush.gif │ ├── chopped.gif │ ├── fence.png │ ├── flower.gif │ ├── fpv-thumb.png │ ├── grassa.png │ ├── grassb.png │ ├── grassc.png │ ├── grassd.png │ ├── grasse.png │ ├── grassf.png │ ├── grassg.png │ ├── grassh.png │ ├── grassi.png │ ├── ortho-thumb.png │ ├── patch.png │ ├── riverbottom.gif │ ├── riverbottomleft.gif │ ├── rivertop.gif │ ├── rivertopleft.gif │ ├── roadbottom.png │ ├── roadmiddle.png │ ├── roadtop.png │ ├── rock.png │ ├── rot0.gif │ ├── rot150.gif │ ├── sign.png │ ├── tree.gif │ └── winner.png ├── css │ ├── fpv.css │ ├── index.css │ └── ortho.css ├── fpv.html ├── index.html ├── js │ ├── fpv.js │ ├── index.js │ └── ortho.js └── ortho.html ├── jsdoc.json ├── package-lock.json ├── package.json ├── rollup.config.js ├── src ├── CSSCamera.ts ├── constants │ ├── default.ts │ └── error.ts ├── index.ts ├── index.umd.ts ├── types.ts └── utils │ ├── helper.ts │ └── math.ts ├── test └── manual │ ├── assets │ └── cover.png │ ├── css │ └── common.css │ └── test.html ├── tsconfig.json └── tslint.json /.editorconfig: -------------------------------------------------------------------------------- 1 | root = true 2 | 3 | [*] 4 | end_of_line = lf 5 | charset = utf-8 6 | trim_trailing_whitespace = true 7 | insert_final_newline = true 8 | indent_style = space 9 | indent_size = 2 10 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | 2 | # Created by https://www.gitignore.io/api/node,visualstudiocode 3 | # Edit at https://www.gitignore.io/?templates=node,visualstudiocode 4 | 5 | ### Node ### 6 | # Logs 7 | logs 8 | *.log 9 | npm-debug.log* 10 | yarn-debug.log* 11 | yarn-error.log* 12 | lerna-debug.log* 13 | 14 | # Diagnostic reports (https://nodejs.org/api/report.html) 15 | report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json 16 | 17 | # Runtime data 18 | pids 19 | *.pid 20 | *.seed 21 | *.pid.lock 22 | 23 | # Directory for instrumented libs generated by jscoverage/JSCover 24 | lib-cov 25 | 26 | # Coverage directory used by tools like istanbul 27 | coverage 28 | 29 | # nyc test coverage 30 | .nyc_output 31 | 32 | # Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files) 33 | .grunt 34 | 35 | # Bower dependency directory (https://bower.io/) 36 | bower_components 37 | 38 | # node-waf configuration 39 | .lock-wscript 40 | 41 | # Compiled binary addons (https://nodejs.org/api/addons.html) 42 | build/Release 43 | 44 | # Dependency directories 45 | node_modules/ 46 | jspm_packages/ 47 | 48 | # TypeScript v1 declaration files 49 | typings/ 50 | 51 | # Optional npm cache directory 52 | .npm 53 | 54 | # Optional eslint cache 55 | .eslintcache 56 | 57 | # Optional REPL history 58 | .node_repl_history 59 | 60 | # Output of 'npm pack' 61 | *.tgz 62 | 63 | # Yarn Integrity file 64 | .yarn-integrity 65 | 66 | # dotenv environment variables file 67 | .env 68 | .env.test 69 | 70 | # parcel-bundler cache (https://parceljs.org/) 71 | .cache 72 | 73 | # next.js build output 74 | .next 75 | 76 | # nuxt.js build output 77 | .nuxt 78 | 79 | # vuepress build output 80 | .vuepress/dist 81 | 82 | # Serverless directories 83 | .serverless/ 84 | 85 | # FuseBox cache 86 | .fusebox/ 87 | 88 | # DynamoDB Local files 89 | .dynamodb/ 90 | 91 | ### VisualStudioCode ### 92 | .vscode/* 93 | !.vscode/settings.json 94 | !.vscode/tasks.json 95 | !.vscode/launch.json 96 | !.vscode/extensions.json 97 | 98 | ### VisualStudioCode Patch ### 99 | # Ignore all local history of files 100 | .history 101 | 102 | # End of https://www.gitignore.io/api/node,visualstudiocode 103 | 104 | ## Custom ### 105 | .DS_Store 106 | lib/ 107 | docs/ 108 | demo/release 109 | demo/_data/version.yml 110 | 111 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2019 WoodNeck 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 all 13 | 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 THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # 📷 CSS-CAMERA 2 | 3 | 4 | ![npm](https://img.shields.io/npm/v/css-camera?style=for-the-badge) 5 | ![GitHub](https://img.shields.io/github/license/woodneck/css-camera?style=for-the-badge) 6 | 7 |

8 |

🎥 Demo · 📄 Document

9 |

10 | 11 | Add depth to your web page with CSS3 3D transform. 12 | 13 | > This project is mostly inspired by [Keith Clark's work](https://keithclark.co.uk/labs/css-fps/). 14 | 15 | ## ✨ Features 16 | - Movable, and Rotatable camera for your scene. 17 | - Can move to in front of any element in your scene, whether it has been rotated or translated. 18 | 19 | ## ⚙️ Installation 20 | ```sh 21 | npm i css-camera 22 | # or 23 | yarn add css-camera 24 | ``` 25 | 26 | ## 🏃 Quick Start 27 | ```js 28 | // Prerequisite: 29 | // Create your scene as you like 30 | const card = document.querySelector("#card"); 31 | const cardButton = document.querySelector("#card-button"); 32 | 33 | // First, make camera 34 | const camera = new CSSCamera("#space"); 35 | 36 | // Call its method, then update it! 37 | cardButton.onclick = () => { 38 | camera.focus(card); 39 | camera.update(2000); 40 | } 41 | ``` 42 | Check more methods on the 📄API Documentation page 43 | 44 | ## 📜 License 45 | [MIT](https://github.com/WoodNeck/css-camera/blob/master/LICENSE) 46 | -------------------------------------------------------------------------------- /demo/asset/barrel.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/WoodNeck/css-camera/94c82efbd7b4e298640c3668b70ee1d45b76b879/demo/asset/barrel.png -------------------------------------------------------------------------------- /demo/asset/bush.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/WoodNeck/css-camera/94c82efbd7b4e298640c3668b70ee1d45b76b879/demo/asset/bush.gif -------------------------------------------------------------------------------- /demo/asset/chopped.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/WoodNeck/css-camera/94c82efbd7b4e298640c3668b70ee1d45b76b879/demo/asset/chopped.gif -------------------------------------------------------------------------------- /demo/asset/fence.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/WoodNeck/css-camera/94c82efbd7b4e298640c3668b70ee1d45b76b879/demo/asset/fence.png -------------------------------------------------------------------------------- /demo/asset/flower.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/WoodNeck/css-camera/94c82efbd7b4e298640c3668b70ee1d45b76b879/demo/asset/flower.gif -------------------------------------------------------------------------------- /demo/asset/fpv-thumb.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/WoodNeck/css-camera/94c82efbd7b4e298640c3668b70ee1d45b76b879/demo/asset/fpv-thumb.png -------------------------------------------------------------------------------- /demo/asset/grassa.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/WoodNeck/css-camera/94c82efbd7b4e298640c3668b70ee1d45b76b879/demo/asset/grassa.png -------------------------------------------------------------------------------- /demo/asset/grassb.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/WoodNeck/css-camera/94c82efbd7b4e298640c3668b70ee1d45b76b879/demo/asset/grassb.png -------------------------------------------------------------------------------- /demo/asset/grassc.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/WoodNeck/css-camera/94c82efbd7b4e298640c3668b70ee1d45b76b879/demo/asset/grassc.png -------------------------------------------------------------------------------- /demo/asset/grassd.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/WoodNeck/css-camera/94c82efbd7b4e298640c3668b70ee1d45b76b879/demo/asset/grassd.png -------------------------------------------------------------------------------- /demo/asset/grasse.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/WoodNeck/css-camera/94c82efbd7b4e298640c3668b70ee1d45b76b879/demo/asset/grasse.png -------------------------------------------------------------------------------- /demo/asset/grassf.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/WoodNeck/css-camera/94c82efbd7b4e298640c3668b70ee1d45b76b879/demo/asset/grassf.png -------------------------------------------------------------------------------- /demo/asset/grassg.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/WoodNeck/css-camera/94c82efbd7b4e298640c3668b70ee1d45b76b879/demo/asset/grassg.png -------------------------------------------------------------------------------- /demo/asset/grassh.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/WoodNeck/css-camera/94c82efbd7b4e298640c3668b70ee1d45b76b879/demo/asset/grassh.png -------------------------------------------------------------------------------- /demo/asset/grassi.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/WoodNeck/css-camera/94c82efbd7b4e298640c3668b70ee1d45b76b879/demo/asset/grassi.png -------------------------------------------------------------------------------- /demo/asset/ortho-thumb.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/WoodNeck/css-camera/94c82efbd7b4e298640c3668b70ee1d45b76b879/demo/asset/ortho-thumb.png -------------------------------------------------------------------------------- /demo/asset/patch.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/WoodNeck/css-camera/94c82efbd7b4e298640c3668b70ee1d45b76b879/demo/asset/patch.png -------------------------------------------------------------------------------- /demo/asset/riverbottom.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/WoodNeck/css-camera/94c82efbd7b4e298640c3668b70ee1d45b76b879/demo/asset/riverbottom.gif -------------------------------------------------------------------------------- /demo/asset/riverbottomleft.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/WoodNeck/css-camera/94c82efbd7b4e298640c3668b70ee1d45b76b879/demo/asset/riverbottomleft.gif -------------------------------------------------------------------------------- /demo/asset/rivertop.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/WoodNeck/css-camera/94c82efbd7b4e298640c3668b70ee1d45b76b879/demo/asset/rivertop.gif -------------------------------------------------------------------------------- /demo/asset/rivertopleft.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/WoodNeck/css-camera/94c82efbd7b4e298640c3668b70ee1d45b76b879/demo/asset/rivertopleft.gif -------------------------------------------------------------------------------- /demo/asset/roadbottom.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/WoodNeck/css-camera/94c82efbd7b4e298640c3668b70ee1d45b76b879/demo/asset/roadbottom.png -------------------------------------------------------------------------------- /demo/asset/roadmiddle.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/WoodNeck/css-camera/94c82efbd7b4e298640c3668b70ee1d45b76b879/demo/asset/roadmiddle.png -------------------------------------------------------------------------------- /demo/asset/roadtop.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/WoodNeck/css-camera/94c82efbd7b4e298640c3668b70ee1d45b76b879/demo/asset/roadtop.png -------------------------------------------------------------------------------- /demo/asset/rock.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/WoodNeck/css-camera/94c82efbd7b4e298640c3668b70ee1d45b76b879/demo/asset/rock.png -------------------------------------------------------------------------------- /demo/asset/rot0.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/WoodNeck/css-camera/94c82efbd7b4e298640c3668b70ee1d45b76b879/demo/asset/rot0.gif -------------------------------------------------------------------------------- /demo/asset/rot150.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/WoodNeck/css-camera/94c82efbd7b4e298640c3668b70ee1d45b76b879/demo/asset/rot150.gif -------------------------------------------------------------------------------- /demo/asset/sign.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/WoodNeck/css-camera/94c82efbd7b4e298640c3668b70ee1d45b76b879/demo/asset/sign.png -------------------------------------------------------------------------------- /demo/asset/tree.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/WoodNeck/css-camera/94c82efbd7b4e298640c3668b70ee1d45b76b879/demo/asset/tree.gif -------------------------------------------------------------------------------- /demo/asset/winner.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/WoodNeck/css-camera/94c82efbd7b4e298640c3668b70ee1d45b76b879/demo/asset/winner.png -------------------------------------------------------------------------------- /demo/css/fpv.css: -------------------------------------------------------------------------------- 1 | * { 2 | box-sizing: border-box; 3 | transform-style: preserve-3d; 4 | font-size: 0; 5 | } 6 | html, body { 7 | position: relative; 8 | width: 100vw; 9 | height: 100vh; 10 | margin: 0; 11 | padding: 0; 12 | overflow: hidden; 13 | display: flex; 14 | justify-content: center; 15 | align-items: center; 16 | } 17 | #space { 18 | width: 100%; 19 | height: 100%; 20 | display: flex; 21 | justify-content: center; 22 | } 23 | .zone { 24 | width: 100%; 25 | height: 100%; 26 | display: flex; 27 | position: absolute; 28 | justify-content: center; 29 | align-items: center; 30 | } 31 | .zone0 { 32 | left: 0; 33 | } 34 | .zone1 { 35 | left: 700px; 36 | } 37 | .zone2 { 38 | left: 1400px; 39 | } 40 | .long-hallway { 41 | width: 200px; 42 | height: 200px; 43 | } 44 | .is-left { 45 | left: 0%; 46 | transform-origin: left; 47 | transform: rotateY(90deg); 48 | } 49 | .is-right { 50 | right: 0%; 51 | transform-origin: right; 52 | transform: rotateY(-90deg); 53 | } 54 | .wall { 55 | height: 200px; 56 | position: absolute; 57 | border: 10px solid #333; 58 | background-color: white; 59 | } 60 | .is-1200 { 61 | width: 1200px; 62 | } 63 | .is-1000 { 64 | width: 1000px; 65 | } 66 | .is-800 { 67 | width: 800px; 68 | } 69 | .is-600 { 70 | width: 600px; 71 | } 72 | .is-400 { 73 | width: 400px; 74 | } 75 | .is-200 { 76 | width: 200px; 77 | } 78 | .arrow { 79 | transform: rotateX(90deg); 80 | width: 200px; 81 | font-size: 300px; 82 | text-align: center; 83 | position: absolute; 84 | bottom: 0; 85 | transform-origin: bottom; 86 | } 87 | #inst { 88 | position: fixed; 89 | display: flex; 90 | justify-content: center; 91 | align-items: center; 92 | font-size: 72px; 93 | } 94 | -------------------------------------------------------------------------------- /demo/css/index.css: -------------------------------------------------------------------------------- 1 | * { 2 | box-sizing: border-box; 3 | } 4 | html, body { 5 | position: relative; 6 | width: 100%; 7 | height: 100%; 8 | margin: 0; 9 | padding: 0; 10 | overflow: hidden; 11 | transform-style: preserve-3d; 12 | display: flex; 13 | justify-content: center; 14 | } 15 | .page-header-container { 16 | position: absolute; 17 | bottom: 2%; 18 | display: flex; 19 | justify-content: center; 20 | flex-flow: column; 21 | } 22 | .page-header-wrapper { 23 | display: flex; 24 | flex-direction: row; 25 | justify-content: center; 26 | align-items: center; 27 | } 28 | .page-header-icon { 29 | margin-top: auto; 30 | margin-bottom: auto; 31 | margin-right: 0.8rem; 32 | } 33 | .page-title { 34 | color: #4a4a4a; 35 | } 36 | .page-header-buttons { 37 | display: flex; 38 | justify-content: center; 39 | align-items: center; 40 | margin-top: 1%; 41 | } 42 | .page-header-buttons .button { 43 | margin: 0.3rem; 44 | } 45 | #hero .button { 46 | background-color: transparent; 47 | } 48 | #space { 49 | display: flex; 50 | width: 100%; height: 100%; 51 | flex-direction: column; 52 | align-items: center; 53 | justify-content: center; 54 | margin: 0; padding: 0; border: 0; 55 | transform-style: preserve-3d; 56 | position: relative; 57 | } 58 | #card { 59 | transform-style: preserve-3d; 60 | transform: rotateX(-30deg) rotateY(45deg) translate3d(-180%, 80%, -200px); 61 | } 62 | .card-youtube { 63 | width: 100%; height: 100%; 64 | position: absolute; 65 | top: 0; bottom: 0; left: 0; right: 0; 66 | } 67 | .card-side { 68 | width: 10%; height: 100%; 69 | position: absolute; top: 0; 70 | background: #222; 71 | transform-style: preserve-3d; 72 | transform-origin: 0% 50%; 73 | transform: rotateY(90deg); 74 | } 75 | #code { 76 | max-width: 100%; 77 | transform-style: preserve-3d; 78 | transform: rotateZ(30deg) rotateY(-45deg) rotateX(70deg) translate3d(100%, -40%, 0px); 79 | } 80 | #code .title { 81 | text-align: center; 82 | font-family: 'Nanum Pen Script', cursive; 83 | } 84 | .camera-code { 85 | padding: 1rem; 86 | } 87 | #hero { 88 | position: absolute; 89 | top: 0; left: 0; right: 0; bottom: 0; 90 | transform-style: preserve-3d; 91 | transform: translateZ(2400px); 92 | background-color: transparent; 93 | } 94 | #more { 95 | width: 100%; min-height: 100%; 96 | transform-style: preserve-3d; 97 | transform: rotateX(90deg) translate3d(0, 0, -1600px); 98 | display: flex; 99 | justify-content: center; 100 | align-items: center; 101 | flex-direction: column; 102 | } 103 | #more h1 { 104 | margin-top: 1.5rem; 105 | position: absolute; 106 | top: 0%; 107 | } 108 | #more .arrow { 109 | position: absolute; 110 | z-index: 1; 111 | } 112 | #more .arrow.left { 113 | left: 1.5rem; 114 | } 115 | #more .arrow.right { 116 | right: 1.5rem; 117 | } 118 | #demo-flicking { 119 | width: 100%; height: 100%; 120 | display: flex; 121 | justify-content: center; 122 | align-items: center; 123 | } 124 | .eg-flick-camera { 125 | display: flex; 126 | justify-content: center; 127 | align-items: center; 128 | } 129 | .demo-entry { 130 | width: 70%; 131 | position: absolute; 132 | z-index: 0; 133 | display: flex; 134 | justify-content: center; 135 | box-shadow: 10px 10px 10px rgba(0, 0, 0, 0.5); 136 | } 137 | .demo-wrapper { 138 | width: 100%; 139 | } 140 | .demo-wrapper .caption-wrapper { 141 | width: 100%; height: 100%; 142 | display: flex; 143 | position: absolute; 144 | top: 0%; 145 | left: 0%; 146 | justify-content: center; 147 | align-items: center; 148 | } 149 | .demo-wrapper .demo-caption { 150 | font-size: 48px; 151 | color: gold; 152 | background-color: rgba(0, 0, 0, 0.5); 153 | font-weight: bold; 154 | padding: 30px; 155 | border-radius: 10px; 156 | } 157 | .demo-wrapper .demo-caption:hover { 158 | color: hotpink; 159 | } 160 | -------------------------------------------------------------------------------- /demo/css/ortho.css: -------------------------------------------------------------------------------- 1 | * { 2 | box-sizing: border-box; 3 | } 4 | html, body { 5 | position: relative; 6 | width: 100vw; 7 | height: 100vh; 8 | margin: 0; 9 | padding: 0; 10 | overflow: hidden; 11 | transform-style: preserve-3d; 12 | display: flex; 13 | justify-content: center; 14 | align-items: center; 15 | } 16 | #info { 17 | position: fixed; 18 | top: 12px; 19 | color: gold; 20 | font-size: 24px; 21 | } 22 | #info2 { 23 | position: fixed; 24 | bottom: 12px; 25 | font-size: 24px; 26 | } 27 | #info2 a { 28 | color: hotpink; 29 | text-decoration: none; 30 | } 31 | #space { 32 | transform-style: preserve-3d; 33 | width: 640px; 34 | height: 100%; 35 | font-size: 0; 36 | } 37 | .tile { 38 | display: inline-block; 39 | background-size: cover; 40 | transform-style: preserve-3d; 41 | image-rendering: -moz-crisp-edges; /* Firefox */ 42 | image-rendering: -o-crisp-edges; /* Opera */ 43 | image-rendering: -webkit-optimize-contrast;/* Webkit (non-standard naming) */ 44 | image-rendering: pixelated; 45 | -ms-interpolation-mode: nearest-neighbor; /* IE (non-standard property) */ 46 | margin: 0; border: 0; padding: 0; 47 | box-sizing: border-box; 48 | width: 64px; height: 64px; 49 | } 50 | .tile::before { 51 | content: ''; 52 | background-size: cover; 53 | transform-style: preserve-3d; 54 | position: absolute; 55 | width: 64px; height: 32px; 56 | transform: translateZ(-32px) scaleZ(-1) rotateZ(90deg) rotateX(-90deg); 57 | transform-origin: 0% 0%; 58 | } 59 | .tile::after { 60 | content: ''; 61 | background-size: cover; 62 | transform-style: preserve-3d; 63 | position: absolute; 64 | width: 64px; height: 32px; 65 | bottom: 0; 66 | transform: rotateX(90deg); 67 | transform-origin: bottom; 68 | } 69 | 70 | .height-1 { 71 | transform: translateZ(32px); 72 | } 73 | .height-2 { 74 | transform: translateZ(64px); 75 | } 76 | .height-3 { 77 | transform: translateZ(96px); 78 | } 79 | .height-4 { 80 | transform: translateZ(128px); 81 | } 82 | .height-5 { 83 | transform: translateZ(160px); 84 | } 85 | 86 | .grass { 87 | background-color: #8AD44E; 88 | } 89 | .grass::before { 90 | background-color: #5FB535; 91 | } 92 | .grass::after { 93 | background-color: #3D9756; 94 | } 95 | 96 | .grass.patch { 97 | background-image: url(../asset/patch.png); 98 | } 99 | 100 | .grass.grassa { 101 | background-image: url(../asset/grassa.png); 102 | } 103 | .grass.grassb { 104 | background-image: url(../asset/grassb.png); 105 | } 106 | .grass.grassc { 107 | background-image: url(../asset/grassc.png); 108 | } 109 | .grass.grassd { 110 | background-image: url(../asset/grassd.png); 111 | } 112 | .grass.grasse { 113 | background-image: url(../asset/grasse.png); 114 | } 115 | .grass.grassf { 116 | background-image: url(../asset/grassf.png); 117 | } 118 | .grass.grassg { 119 | background-image: url(../asset/grassg.png); 120 | } 121 | .grass.grassh { 122 | background-image: url(../asset/grassh.png); 123 | } 124 | .grass.grassi { 125 | background-image: url(../asset/grassi.png); 126 | } 127 | 128 | .grass.river-top { 129 | background-image: url(../asset/rivertop.gif); 130 | } 131 | .grass.river-top-left { 132 | background-image: url(../asset/rivertopleft.gif); 133 | } 134 | .grass.river-top-right { 135 | background-image: url(../asset/rivertopleft.gif); 136 | transform: scaleX(-1); 137 | } 138 | .grass.river-bottom { 139 | background-image: url(../asset/riverbottom.gif); 140 | } 141 | .grass.river-bottom-left { 142 | background-image: url(../asset/riverbottomleft.gif); 143 | } 144 | .grass.river-bottom-right { 145 | background-image: url(../asset/riverbottomleft.gif); 146 | transform: scaleX(-1); 147 | } 148 | 149 | .grass.road-top { 150 | background-image: url(../asset/roadtop.png); 151 | } 152 | .grass.road-vertical { 153 | background-image: url(../asset/roadmiddle.png); 154 | } 155 | .grass.road-bottom { 156 | background-image: url(../asset/roadbottom.png); 157 | } 158 | .grass.road-left { 159 | background-image: url(../asset/roadtop.png); 160 | transform: rotateZ(-90deg); 161 | } 162 | .grass.road-horizontal { 163 | background-image: url(../asset/roadmiddle.png); 164 | transform: rotateZ(-90deg); 165 | } 166 | .grass.road-right { 167 | background-image: url(../asset/roadbottom.png); 168 | transform: rotateZ(-90deg); 169 | } 170 | 171 | .grass div { 172 | position: absolute; 173 | transform-origin: bottom; 174 | background-size: cover; 175 | } 176 | 177 | .barrel { 178 | width: 64px; height: 64px; 179 | transform: translateZ(-16px) rotateX(-90deg); 180 | background-image: url(../asset/barrel.png); 181 | left: -25%; bottom: 50%; 182 | } 183 | .rock { 184 | width: 64px; height: 64px; 185 | transform: translateZ(-16px) rotateX(-90deg); 186 | background-image: url(../asset/rock.png); 187 | left: 0px; bottom: 50%; 188 | } 189 | .sign { 190 | width: 64px; height: 64px; 191 | transform: translateZ(-20px) rotateX(-90deg); 192 | background-image: url(../asset/sign.png); 193 | left: 0px; bottom: 50%; 194 | } 195 | .bush { 196 | width: 64px; height: 64px; 197 | transform: translateZ(-12px) rotateX(-90deg); 198 | background-image: url(../asset/bush.gif); 199 | left: 0px; bottom: 50%; 200 | } 201 | .fence { 202 | width: 64px; height: 64px; 203 | transform: translateZ(-18px) rotateX(-90deg); 204 | background-image: url(../asset/fence.png); 205 | left: 0px; bottom: 50%; 206 | } 207 | .tree { 208 | width: 192px; height: 192px; 209 | transform: rotateX(-90deg); 210 | background-image: url(../asset/tree.gif); 211 | left: -64px; bottom: 0px; 212 | } 213 | .flower { 214 | width: 64px; height: 64px; 215 | transform: translateZ(-18px) rotateX(-90deg); 216 | background-image: url(../asset/flower.gif); 217 | left: 0px; bottom: 50%; 218 | } 219 | .chopped { 220 | width: 64px; height: 64px; 221 | transform: translateZ(-2px) rotateX(-90deg); 222 | background-image: url(../asset/chopped.gif); 223 | left: 0px; bottom: 50%; 224 | } 225 | -------------------------------------------------------------------------------- /demo/fpv.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | css-camera 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 |
30 |
31 |
32 |
33 |
34 |
35 |
36 |
37 |
38 |
39 |
40 |
41 |
42 |
43 |
44 |
45 |
46 |
47 |
48 |
49 |
50 |
51 |
52 |
53 |
Click the screen to control
54 | 55 | 56 | 57 | -------------------------------------------------------------------------------- /demo/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | css-camera 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 |
23 |
24 |
25 |

CSS-CAMERA

26 |

Add depth to your web page with CSS3 3D transform.

27 | 28 | 29 | Documents 30 | 31 | 32 | 33 | Github 34 | 35 |
36 |
37 |
38 |
39 |

Install

40 |
$ npm i css-camera
41 |
42 |
43 |
44 |
45 |
46 |
47 |
48 |
49 | 50 |
51 |
52 |
53 |
54 |
55 |
56 | Placeholder image 57 |
58 |
59 |
60 |

WoodNeck

61 |

@woodneck

62 |
63 |
64 | 65 |
66 | You can put any HTML element you like, then just transform it. 67 | @css-camera will do the rest for you. 68 |
69 |
70 |
71 |
72 |
73 |
74 |

It's super simple!

75 |
// Prerequisite:
 76 | // Create your scene as you like
 77 | const card = document.querySelector("#card");
 78 | const cardButton = document.querySelector("#card-button");
 79 | 
 80 | // First, make camera
 81 | const camera = new CSSCamera("#space");
 82 | 
 83 | // Call its method, then update it!
 84 | cardButton.onclick = () => {
 85 |   // Move camera in front of "card"
 86 |   camera.focus(card);
 87 |   camera.update(2000);
 88 | }
89 |

See the source of this page.

90 |
91 | 92 |
93 |

More demos?

94 |
95 |
96 |
97 |
98 | 99 |
100 | 105 |
106 |
107 |
108 |
109 |
110 | 111 |
112 | 117 |
118 |
119 |
120 |
121 |
122 |
123 |
124 |
125 |
126 | 🎥 127 | Main 128 | Card 129 | Code 130 | More 131 |
132 |
133 | 134 | 135 | 136 | -------------------------------------------------------------------------------- /demo/js/fpv.js: -------------------------------------------------------------------------------- 1 | const windowHeight = window.innerHeight; 2 | const camera = new CSSCamera("#space", { 3 | position: [0, 0, -10], 4 | perspective: windowHeight / 2, 5 | }); 6 | 7 | let zone = 0; 8 | let rotate = 0; 9 | const inst = document.querySelector("#inst"); 10 | 11 | document.documentElement.onclick = function() { 12 | document.documentElement.requestPointerLock(); 13 | } 14 | document.addEventListener('pointerlockchange', onLockChange, false); 15 | document.addEventListener('mozpointerlockchange', onLockChange, false); 16 | 17 | function onLockChange() { 18 | if (document.pointerLockElement === document.documentElement || 19 | document.mozPointerLockElement === document.documentElement) { 20 | inst.style.display = "none"; 21 | document.addEventListener("mousemove", updateMouse, false); 22 | } else { 23 | inst.style.display = "flex"; 24 | document.removeEventListener("mousemove", updateMouse, false); 25 | } 26 | } 27 | 28 | let up = false; 29 | let right = false; 30 | let down = false; 31 | let left = false; 32 | 33 | document.addEventListener('keydown', press); 34 | function press(e){ 35 | if (e.keyCode === 38 /* up */ || e.keyCode === 87 /* w */){ 36 | up = true; 37 | } 38 | if (e.keyCode === 39 /* right */ || e.keyCode === 68 /* d */){ 39 | right = true; 40 | } 41 | if (e.keyCode === 40 /* down */ || e.keyCode === 83 /* s */){ 42 | down = true; 43 | } 44 | if (e.keyCode === 37 /* left */ || e.keyCode === 65 /* a */){ 45 | left = true; 46 | } 47 | } 48 | 49 | document.addEventListener('keyup', release); 50 | function release(e){ 51 | if (e.keyCode === 38 /* up */ || e.keyCode === 87 /* w */){ 52 | up = false 53 | } 54 | if (e.keyCode === 39 /* right */ || e.keyCode === 68 /* d */){ 55 | right = false 56 | } 57 | if (e.keyCode === 40 /* down */ || e.keyCode === 83 /* s */){ 58 | down = false 59 | } 60 | if (e.keyCode === 37 /* left */ || e.keyCode === 65 /* a */){ 61 | left = false 62 | } 63 | } 64 | 65 | const prevMouseLocation = { 66 | x: NaN, y: NaN, 67 | } 68 | 69 | const clamp = function(val, min, max) { 70 | return Math.min(Math.max(val, min), max); 71 | } 72 | const degToRad = function(deg) { 73 | return Math.PI * deg / 180; 74 | } 75 | 76 | const clampPosition0 = function(prev, position) { 77 | // Long Corridor 78 | if (position[0] <= 90 || (prev[0] <= 90 && prev[2] > -1010)) { 79 | position[0] = clamp(position[0], -90, 90); 80 | position[2] = clamp(position[2], -1190, -10); 81 | } 82 | // Top 83 | else if (prev[2] <= -1010) { 84 | position[0] = clamp(position[0], -90, 490); 85 | if (prev[0] > 90 && prev[0] < 310) { 86 | position[2] = clamp(position[2], -1190, -1010); 87 | } else { 88 | position[2] = clamp(position[2], -1190, -10); 89 | } 90 | } 91 | // Right 92 | else if (position[0] >= 310 || (prev[0] >= 310 && prev[2] > -1010)) { 93 | position[0] = clamp(position[0], 310, 490); 94 | position[2] = clamp(position[2], -1190, -610); 95 | } 96 | 97 | return position; 98 | } 99 | 100 | const clampPosition1 = function(prev, position) { 101 | position[0] = clamp(position[0], 610, 1190); 102 | position[2] = clamp(position[2], -1190, -610); 103 | 104 | if (prev[0] <= 790 && (prev[2] <= -790 && prev[2] > -1010)) { 105 | position[0] = clamp(position[0], 610, 790); 106 | } 107 | else if (prev[2] <= -1010) { 108 | if (prev[0] > 790 && prev[0] < 1010) { 109 | position[2] = clamp(position[2], -1190, -1010); 110 | } else { 111 | position[2] = clamp(position[2], -1190, -610); 112 | } 113 | } 114 | else if (prev[0] >= 1010 && (prev[2] <= -790 && prev[2] > -1010)) { 115 | position[0] = clamp(position[0], 1010, 1190); 116 | } 117 | else { 118 | if (prev[0] > 790 && prev[0] < 1010) { 119 | position[2] = clamp(position[2], -790, -610); 120 | } else { 121 | position[2] = clamp(position[2], -1190, -610); 122 | } 123 | } 124 | 125 | return position; 126 | } 127 | 128 | const clampPosition2 = function(prev, position) { 129 | position[0] = clamp(position[0], 1310, 1890); 130 | position[2] = clamp(position[2], -1790, -610); 131 | 132 | // Long Corridor 133 | if (position[0] <= 1490 || (prev[0] <= 1490 && prev[2] < -790)) { 134 | position[0] = clamp(position[0], 1310, 1490); 135 | position[2] = clamp(position[2], -1790, -610); 136 | } 137 | // Bottom 138 | else if (prev[2] >= -790) { 139 | if (prev[0] > 1490 && prev[0] < 1710) { 140 | position[2] = clamp(position[2], -790, -610); 141 | } else { 142 | position[2] = clamp(position[2], -1790, -610); 143 | } 144 | } 145 | // Right 146 | else if (position[0] >= 310 || (prev[0] >= 310 && prev[2] > -1010)) { 147 | position[0] = clamp(position[0], 310, 490); 148 | position[2] = clamp(position[2], -1190, -610); 149 | } 150 | 151 | return position; 152 | } 153 | 154 | const checkZone = function(prevPos) { 155 | const newPos = camera.position; 156 | // Zone 0 to 1 157 | if (zone === 0 && newPos[0] > 310 && prevPos[2] <= -980 && newPos[2] > -980) { 158 | camera.translate(700, 0, 0); 159 | zone = 1; 160 | rotate = 0; 161 | } else if (zone === 1 && newPos[0] > 1010) { 162 | if (prevPos[2] <= -980 && newPos[2] > -980) { 163 | rotate += 1; 164 | } else if (prevPos[2] > -980 && newPos[2] <= -980) { 165 | rotate -= 1; 166 | } 167 | if (rotate < 0) { 168 | camera.translate(-700, 0, 0); 169 | zone = 0; 170 | } 171 | } else if (zone === 1 && newPos[2] >= -790) { 172 | if (prevPos[0] > 980 && newPos[0] <= 980) { 173 | if (rotate > 5) { 174 | camera.translate(700, 0, 0); 175 | zone = 2; 176 | } 177 | } 178 | } else if (zone === 2 && newPos[2] >= -790) { 179 | if (prevPos[0] < 1680 && newPos[0] >= 1680) { 180 | camera.translate(-700, 0, 0); 181 | zone = 1; 182 | } 183 | } 184 | } 185 | 186 | const updateMouse = function(e) { 187 | const diffX = e.movementX; 188 | const diffY = e.movementY; 189 | 190 | camera.rotate(-diffY / 5, diffX / 5); 191 | camera.rotation = [clamp(camera.rotation[0], -85, 85), camera.rotation[1], camera.rotation[2]]; 192 | camera.update(0); 193 | 194 | prevMouseLocation.x = e.screenX; 195 | prevMouseLocation.y = e.screenY; 196 | } 197 | const speed = 5; 198 | const keyLoop = function() { 199 | const prevPos = camera.position.concat(); 200 | const speedVal = speed / Math.cos(degToRad(camera.rotation[0])); 201 | 202 | if (up){ 203 | camera.translateLocal(0, 0, -speedVal); 204 | } 205 | if (right){ 206 | camera.translateLocal(speed, 0, 0); 207 | } 208 | if (down){ 209 | camera.translateLocal(0, 0, speedVal); 210 | } 211 | if (left){ 212 | camera.translateLocal(-speed, 0, 0); 213 | } 214 | var newPos = [camera.position[0], 0, camera.position[2]]; 215 | camera.position = zone === 0 216 | ? clampPosition0(prevPos, newPos) 217 | : zone === 1 218 | ? clampPosition1(prevPos, newPos) 219 | : clampPosition2(prevPos, newPos); 220 | checkZone(prevPos); 221 | camera.update(0); 222 | requestAnimationFrame(keyLoop); 223 | } 224 | keyLoop(); 225 | -------------------------------------------------------------------------------- /demo/js/index.js: -------------------------------------------------------------------------------- 1 | const windowWidth = document.body.offsetWidth; 2 | 3 | const cardButton = document.querySelector("#card-button"); 4 | const codeButton = document.querySelector("#code-button"); 5 | const heroButton = document.querySelector("#hero-button"); 6 | const moreButton = document.querySelector("#more-button"); 7 | const buttons = [ 8 | cardButton, codeButton, heroButton, moreButton, 9 | ]; 10 | 11 | const card = document.querySelector("#card"); 12 | const code = document.querySelector("#code"); 13 | const hero = document.querySelector("#hero"); 14 | const more = document.querySelector("#more"); 15 | 16 | const restoreButtons = () => { 17 | buttons.forEach(button => button.classList.add("is-outlined")); 18 | } 19 | 20 | const flicking = new eg.Flicking("#demo-flicking", { 21 | collectStatistics: false, 22 | adaptive: true, 23 | zIndex: "", 24 | gap: 50, 25 | overflow: true 26 | }); 27 | 28 | const camera = new CSSCamera("#space", { 29 | perspective: windowWidth / 2, 30 | }); 31 | 32 | camera.focus(hero); 33 | camera.update(2000); 34 | 35 | cardButton.onclick = () => { 36 | camera.focus(card); 37 | camera.update(2000); 38 | restoreButtons(); 39 | cardButton.classList.remove("is-outlined"); 40 | } 41 | codeButton.onclick = () => { 42 | camera.focus(code); 43 | camera.update(2000); 44 | restoreButtons(); 45 | codeButton.classList.remove("is-outlined"); 46 | } 47 | heroButton.onclick = () => { 48 | camera.focus(hero); 49 | camera.update(2000); 50 | restoreButtons(); 51 | heroButton.classList.remove("is-outlined"); 52 | } 53 | moreButton.onclick = () => { 54 | camera.focus(more); 55 | camera.update(2000); 56 | restoreButtons(); 57 | moreButton.classList.remove("is-outlined"); 58 | } 59 | -------------------------------------------------------------------------------- /demo/js/ortho.js: -------------------------------------------------------------------------------- 1 | const windowWidth = window.innerWidth; 2 | const windowHeight = window.innerHeight; 3 | const center = document.querySelector("#center"); 4 | 5 | const camera = new CSSCamera("#space"); 6 | camera.viewportEl.style.backgroundColor = "white"; 7 | camera.focus(center); 8 | camera.update(0).then(async () => { 9 | await camera.update(1000); 10 | 11 | camera.rotation = [55, 0, 0]; 12 | 13 | await camera.update(1000); 14 | 15 | camera.rotation = [55, 0, -45]; 16 | camera.scale = [2, 2, 2]; 17 | camera.viewportEl.style.backgroundColor = "black"; 18 | await camera.update(2000, { 19 | property: "transform, background-color", 20 | timingFunction: "ease-out, linear", 21 | delay: "0ms, 0ms" 22 | }); 23 | 24 | // Controls after init 25 | const Axes = eg.Axes; 26 | const PanInput = Axes.PanInput; 27 | const axes = new Axes({ 28 | x: { range: [-400, 400] }, 29 | y: { range: [-150, 250] } 30 | }, { deceleration: 0.004 }, { x: 0, y: 0 }); 31 | const panInput = new PanInput(".cc-viewport", { 32 | scale: [0.3, 0.3], 33 | }); 34 | 35 | axes.on({ 36 | "change": evt => { 37 | camera.translateLocal(-evt.delta.x, -evt.delta.y); 38 | camera.update(0); 39 | } 40 | }); 41 | 42 | axes.connect(["x", "y"], panInput); 43 | }); 44 | -------------------------------------------------------------------------------- /demo/ortho.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | css-camera 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 | 28 |
29 |
30 |
31 |
32 |
33 |
34 |
35 |
36 |
37 |
38 | 39 |
40 |
41 |
42 |
43 |
44 |
45 |
46 |
47 |
48 |
49 | 50 |
51 |
52 |
53 |
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 |
82 | 83 |
84 |
85 |
86 |
87 |
88 |
89 |
90 |
91 |
92 |
93 |
94 |
All pixelart assets are from https://guttykreum.itch.io/field-of-green
95 |
Source
96 | 97 | 98 | 99 | -------------------------------------------------------------------------------- /jsdoc.json: -------------------------------------------------------------------------------- 1 | { 2 | "tags": { 3 | "allowUnknownTags" : false, 4 | "dictionaries": ["jsdoc", "closure"] 5 | }, 6 | "source": { 7 | "include": ["src", "README.md"], 8 | "includePattern": ".+\\.(j|t)s(doc|x)?$", 9 | "excludePattern": "(^|\\/|\\\\)_" 10 | }, 11 | "opts": { 12 | "template": "node_modules/docdash", 13 | "destination": "./docs/", 14 | "ignores": [], 15 | "expendsItemMembers": true, 16 | "recurse": true 17 | }, 18 | "plugins": [ 19 | "plugins/markdown" 20 | ], 21 | "docdash": { 22 | "static": true, 23 | "cleverLinks": true, 24 | "monospaceLinks": true, 25 | "typedefs": true, 26 | "private": true, 27 | "search": true, 28 | "openGraph": { 29 | "title": "css-camera", 30 | "type": "website", 31 | "site_name": "css-camera", 32 | "image": "", 33 | "url": "https://woodneck.github.io/css-camera/" 34 | }, 35 | "meta": { 36 | "title": "css-camera", 37 | "description": "Add a depth to your web page with CSS3 3D transform.", 38 | "keyword": "css3, camera, graphics, 3d" 39 | }, 40 | "menu":{ 41 | "Github":{ 42 | "href":"https://github.com/WoodNeck/css-camera", 43 | "target":"_blank" 44 | } 45 | } 46 | }, 47 | "markdown": { 48 | "parser": "gfm", 49 | "hardwrap": true 50 | } 51 | } 52 | -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "css-camera", 3 | "version": "0.1.0-snapshot", 4 | "lockfileVersion": 1, 5 | "requires": true, 6 | "dependencies": { 7 | "@babel/code-frame": { 8 | "version": "7.0.0", 9 | "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.0.0.tgz", 10 | "integrity": "sha512-OfC2uemaknXr87bdLUkWog7nYuliM9Ij5HUcajsVcMCpQrcLmtxRbVFTIqmcSkSeYRBFBRxs2FiUqFJDLdiebA==", 11 | "dev": true, 12 | "requires": { 13 | "@babel/highlight": "^7.0.0" 14 | } 15 | }, 16 | "@babel/generator": { 17 | "version": "7.4.4", 18 | "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.4.4.tgz", 19 | "integrity": "sha512-53UOLK6TVNqKxf7RUh8NE851EHRxOOeVXKbK2bivdb+iziMyk03Sr4eaE9OELCbyZAAafAKPDwF2TPUES5QbxQ==", 20 | "dev": true, 21 | "requires": { 22 | "@babel/types": "^7.4.4", 23 | "jsesc": "^2.5.1", 24 | "lodash": "^4.17.11", 25 | "source-map": "^0.5.0", 26 | "trim-right": "^1.0.1" 27 | } 28 | }, 29 | "@babel/helper-function-name": { 30 | "version": "7.1.0", 31 | "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.1.0.tgz", 32 | "integrity": "sha512-A95XEoCpb3TO+KZzJ4S/5uW5fNe26DjBGqf1o9ucyLyCmi1dXq/B3c8iaWTfBk3VvetUxl16e8tIrd5teOCfGw==", 33 | "dev": true, 34 | "requires": { 35 | "@babel/helper-get-function-arity": "^7.0.0", 36 | "@babel/template": "^7.1.0", 37 | "@babel/types": "^7.0.0" 38 | } 39 | }, 40 | "@babel/helper-get-function-arity": { 41 | "version": "7.0.0", 42 | "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.0.0.tgz", 43 | "integrity": "sha512-r2DbJeg4svYvt3HOS74U4eWKsUAMRH01Z1ds1zx8KNTPtpTL5JAsdFv8BNyOpVqdFhHkkRDIg5B4AsxmkjAlmQ==", 44 | "dev": true, 45 | "requires": { 46 | "@babel/types": "^7.0.0" 47 | } 48 | }, 49 | "@babel/helper-split-export-declaration": { 50 | "version": "7.4.4", 51 | "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.4.4.tgz", 52 | "integrity": "sha512-Ro/XkzLf3JFITkW6b+hNxzZ1n5OQ80NvIUdmHspih1XAhtN3vPTuUFT4eQnela+2MaZ5ulH+iyP513KJrxbN7Q==", 53 | "dev": true, 54 | "requires": { 55 | "@babel/types": "^7.4.4" 56 | } 57 | }, 58 | "@babel/highlight": { 59 | "version": "7.0.0", 60 | "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.0.0.tgz", 61 | "integrity": "sha512-UFMC4ZeFC48Tpvj7C8UgLvtkaUuovQX+5xNWrsIoMG8o2z+XFKjKaN9iVmS84dPwVN00W4wPmqvYoZF3EGAsfw==", 62 | "dev": true, 63 | "requires": { 64 | "chalk": "^2.0.0", 65 | "esutils": "^2.0.2", 66 | "js-tokens": "^4.0.0" 67 | }, 68 | "dependencies": { 69 | "js-tokens": { 70 | "version": "4.0.0", 71 | "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", 72 | "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", 73 | "dev": true 74 | } 75 | } 76 | }, 77 | "@babel/parser": { 78 | "version": "7.4.4", 79 | "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.4.4.tgz", 80 | "integrity": "sha512-5pCS4mOsL+ANsFZGdvNLybx4wtqAZJ0MJjMHxvzI3bvIsz6sQvzW8XX92EYIkiPtIvcfG3Aj+Ir5VNyjnZhP7w==", 81 | "dev": true 82 | }, 83 | "@babel/template": { 84 | "version": "7.4.4", 85 | "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.4.4.tgz", 86 | "integrity": "sha512-CiGzLN9KgAvgZsnivND7rkA+AeJ9JB0ciPOD4U59GKbQP2iQl+olF1l76kJOupqidozfZ32ghwBEJDhnk9MEcw==", 87 | "dev": true, 88 | "requires": { 89 | "@babel/code-frame": "^7.0.0", 90 | "@babel/parser": "^7.4.4", 91 | "@babel/types": "^7.4.4" 92 | } 93 | }, 94 | "@babel/traverse": { 95 | "version": "7.4.4", 96 | "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.4.4.tgz", 97 | "integrity": "sha512-Gw6qqkw/e6AGzlyj9KnkabJX7VcubqPtkUQVAwkc0wUMldr3A/hezNB3Rc5eIvId95iSGkGIOe5hh1kMKf951A==", 98 | "dev": true, 99 | "requires": { 100 | "@babel/code-frame": "^7.0.0", 101 | "@babel/generator": "^7.4.4", 102 | "@babel/helper-function-name": "^7.1.0", 103 | "@babel/helper-split-export-declaration": "^7.4.4", 104 | "@babel/parser": "^7.4.4", 105 | "@babel/types": "^7.4.4", 106 | "debug": "^4.1.0", 107 | "globals": "^11.1.0", 108 | "lodash": "^4.17.11" 109 | } 110 | }, 111 | "@babel/types": { 112 | "version": "7.4.4", 113 | "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.4.4.tgz", 114 | "integrity": "sha512-dOllgYdnEFOebhkKCjzSVFqw/PmmB8pH6RGOWkY4GsboQNd47b1fBThBSwlHAq9alF9vc1M3+6oqR47R50L0tQ==", 115 | "dev": true, 116 | "requires": { 117 | "esutils": "^2.0.2", 118 | "lodash": "^4.17.11", 119 | "to-fast-properties": "^2.0.0" 120 | } 121 | }, 122 | "@daybrush/jsdoc": { 123 | "version": "0.3.7", 124 | "resolved": "https://registry.npmjs.org/@daybrush/jsdoc/-/jsdoc-0.3.7.tgz", 125 | "integrity": "sha512-xVB7GZ5tp60swOGwmpl/XSIiE/MNfMTT0g7EjWQJlACFJpJdrkOUgAQBOH+piVI+1TcohGwukrky1NXTP2QYjg==", 126 | "dev": true, 127 | "requires": { 128 | "@babel/parser": "^7.2.3", 129 | "@babel/types": "^7.2.2", 130 | "@daybrush/utils": "^0.4.0", 131 | "ast-parser": "^0.0.3", 132 | "bluebird": "~3.5.0", 133 | "catharsis": "~0.8.9", 134 | "escape-string-regexp": "~1.0.5", 135 | "js2xmlparser": "~3.0.0", 136 | "klaw": "~2.0.0", 137 | "markdown-it": "~8.3.1", 138 | "markdown-it-named-headers": "~0.0.4", 139 | "marked": "~0.3.6", 140 | "mkdirp": "~0.5.1", 141 | "requizzle": "~0.2.1", 142 | "strip-json-comments": "~2.0.1", 143 | "taffydb": "2.6.2", 144 | "underscore": "~1.8.3" 145 | } 146 | }, 147 | "@daybrush/utils": { 148 | "version": "0.4.2", 149 | "resolved": "https://registry.npmjs.org/@daybrush/utils/-/utils-0.4.2.tgz", 150 | "integrity": "sha512-PMn5ppv/VOZCOrJH4W48xr2rFAatn+ZNkY77xZn6ZzEJAZ/uVCOgxIkbUml8oHRwu4gV7UM19Cc1flOunkymWA==", 151 | "dev": true 152 | }, 153 | "@egjs/build-helper": { 154 | "version": "0.0.5", 155 | "resolved": "https://registry.npmjs.org/@egjs/build-helper/-/build-helper-0.0.5.tgz", 156 | "integrity": "sha512-sMKDsNHFNBamwMnuQtQDO77J0l7z05kNuidHUjYQQTxT33Tl8h2dynZU5O9+ONS4zowFR4mE0UYEDQdAq58RGQ==", 157 | "dev": true, 158 | "requires": { 159 | "rollup": "^1.7.4", 160 | "rollup-plugin-commonjs": "^9.3.4", 161 | "rollup-plugin-node-resolve": "^4.0.1", 162 | "rollup-plugin-prototype-minify": "^1.0.5", 163 | "rollup-plugin-replace": "^2.1.1", 164 | "rollup-plugin-typescript": "^1.0.1", 165 | "rollup-plugin-uglify": "^6.0.2", 166 | "rollup-plugin-visualizer": "^1.1.0" 167 | } 168 | }, 169 | "@fimbul/bifrost": { 170 | "version": "0.17.0", 171 | "resolved": "https://registry.npmjs.org/@fimbul/bifrost/-/bifrost-0.17.0.tgz", 172 | "integrity": "sha512-gVTkJAOef5HtN6LPmrtt5fAUmBywwlgmObsU3FBhPoNeXPLaIl2zywXkJEtvvVLQnaFmtff3x+wIj5lHRCDE3Q==", 173 | "dev": true, 174 | "requires": { 175 | "@fimbul/ymir": "^0.17.0", 176 | "get-caller-file": "^2.0.0", 177 | "tslib": "^1.8.1", 178 | "tsutils": "^3.5.0" 179 | }, 180 | "dependencies": { 181 | "tsutils": { 182 | "version": "3.10.0", 183 | "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.10.0.tgz", 184 | "integrity": "sha512-q20XSMq7jutbGB8luhKKsQldRKWvyBO2BGqni3p4yq8Ys9bEP/xQw3KepKmMRt9gJ4lvQSScrihJrcKdKoSU7Q==", 185 | "dev": true, 186 | "requires": { 187 | "tslib": "^1.8.1" 188 | } 189 | } 190 | } 191 | }, 192 | "@fimbul/ymir": { 193 | "version": "0.17.0", 194 | "resolved": "https://registry.npmjs.org/@fimbul/ymir/-/ymir-0.17.0.tgz", 195 | "integrity": "sha512-xMXM9KTXRLHLVS6dnX1JhHNEkmWHcAVCQ/4+DA1KKwC/AFnGHzu/7QfQttEPgw3xplT+ILf9e3i64jrFwB3JtA==", 196 | "dev": true, 197 | "requires": { 198 | "inversify": "^5.0.0", 199 | "reflect-metadata": "^0.1.12", 200 | "tslib": "^1.8.1" 201 | } 202 | }, 203 | "@types/estree": { 204 | "version": "0.0.39", 205 | "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.39.tgz", 206 | "integrity": "sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw==", 207 | "dev": true 208 | }, 209 | "@types/gl-matrix": { 210 | "version": "2.4.5", 211 | "resolved": "https://registry.npmjs.org/@types/gl-matrix/-/gl-matrix-2.4.5.tgz", 212 | "integrity": "sha512-0L8Mq1+oaIW0oVzGUDbSW+HnTjCNb4CmoIQE5BkoHt/A7x20z0MJ1PnwfH3atty/vbWLGgvJwVu2Mz3SKFiEFw==", 213 | "dev": true 214 | }, 215 | "@types/node": { 216 | "version": "11.13.8", 217 | "resolved": "https://registry.npmjs.org/@types/node/-/node-11.13.8.tgz", 218 | "integrity": "sha512-szA3x/3miL90ZJxUCzx9haNbK5/zmPieGraZEe4WI+3srN0eGLiT22NXeMHmyhNEopn+IrxqMc7wdVwvPl8meg==", 219 | "dev": true 220 | }, 221 | "@types/resolve": { 222 | "version": "0.0.8", 223 | "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-0.0.8.tgz", 224 | "integrity": "sha512-auApPaJf3NPfe18hSoJkp8EbZzer2ISk7o8mCC3M9he/a04+gbMF97NkpD2S8riMGvm4BMRI59/SZQSaLTKpsQ==", 225 | "dev": true, 226 | "requires": { 227 | "@types/node": "*" 228 | } 229 | }, 230 | "acorn": { 231 | "version": "6.1.1", 232 | "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.1.1.tgz", 233 | "integrity": "sha512-jPTiwtOxaHNaAPg/dmrJ/beuzLRnXtB0kQPQ8JpotKJgTB6rX6c8mlf315941pyjBSaPg8NHXS9fhP4u17DpGA==", 234 | "dev": true 235 | }, 236 | "ansi-regex": { 237 | "version": "2.1.1", 238 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", 239 | "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", 240 | "dev": true 241 | }, 242 | "ansi-styles": { 243 | "version": "2.2.1", 244 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", 245 | "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", 246 | "dev": true 247 | }, 248 | "anymatch": { 249 | "version": "1.3.2", 250 | "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-1.3.2.tgz", 251 | "integrity": "sha512-0XNayC8lTHQ2OI8aljNCN3sSx6hsr/1+rlcDAotXJR7C1oZZHCNsfpbKwMjRA3Uqb5tF1Rae2oloTr4xpq+WjA==", 252 | "dev": true, 253 | "requires": { 254 | "micromatch": "^2.1.5", 255 | "normalize-path": "^2.0.0" 256 | }, 257 | "dependencies": { 258 | "arr-diff": { 259 | "version": "2.0.0", 260 | "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz", 261 | "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=", 262 | "dev": true, 263 | "requires": { 264 | "arr-flatten": "^1.0.1" 265 | } 266 | }, 267 | "array-unique": { 268 | "version": "0.2.1", 269 | "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz", 270 | "integrity": "sha1-odl8yvy8JiXMcPrc6zalDFiwGlM=", 271 | "dev": true 272 | }, 273 | "braces": { 274 | "version": "1.8.5", 275 | "resolved": "https://registry.npmjs.org/braces/-/braces-1.8.5.tgz", 276 | "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=", 277 | "dev": true, 278 | "requires": { 279 | "expand-range": "^1.8.1", 280 | "preserve": "^0.2.0", 281 | "repeat-element": "^1.1.2" 282 | } 283 | }, 284 | "expand-brackets": { 285 | "version": "0.1.5", 286 | "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz", 287 | "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=", 288 | "dev": true, 289 | "requires": { 290 | "is-posix-bracket": "^0.1.0" 291 | } 292 | }, 293 | "extglob": { 294 | "version": "0.3.2", 295 | "resolved": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz", 296 | "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=", 297 | "dev": true, 298 | "requires": { 299 | "is-extglob": "^1.0.0" 300 | } 301 | }, 302 | "kind-of": { 303 | "version": "3.2.2", 304 | "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", 305 | "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", 306 | "dev": true, 307 | "requires": { 308 | "is-buffer": "^1.1.5" 309 | } 310 | }, 311 | "micromatch": { 312 | "version": "2.3.11", 313 | "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz", 314 | "integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=", 315 | "dev": true, 316 | "requires": { 317 | "arr-diff": "^2.0.0", 318 | "array-unique": "^0.2.1", 319 | "braces": "^1.8.2", 320 | "expand-brackets": "^0.1.4", 321 | "extglob": "^0.3.1", 322 | "filename-regex": "^2.0.0", 323 | "is-extglob": "^1.0.0", 324 | "is-glob": "^2.0.1", 325 | "kind-of": "^3.0.2", 326 | "normalize-path": "^2.0.1", 327 | "object.omit": "^2.0.0", 328 | "parse-glob": "^3.0.4", 329 | "regex-cache": "^0.4.2" 330 | } 331 | } 332 | } 333 | }, 334 | "argparse": { 335 | "version": "1.0.10", 336 | "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", 337 | "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", 338 | "dev": true, 339 | "requires": { 340 | "sprintf-js": "~1.0.2" 341 | } 342 | }, 343 | "arr-diff": { 344 | "version": "4.0.0", 345 | "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", 346 | "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", 347 | "dev": true 348 | }, 349 | "arr-flatten": { 350 | "version": "1.1.0", 351 | "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", 352 | "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==", 353 | "dev": true 354 | }, 355 | "arr-union": { 356 | "version": "3.1.0", 357 | "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", 358 | "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=", 359 | "dev": true 360 | }, 361 | "array-filter": { 362 | "version": "0.0.1", 363 | "resolved": "https://registry.npmjs.org/array-filter/-/array-filter-0.0.1.tgz", 364 | "integrity": "sha1-fajPLiZijtcygDWB/SH2fKzS7uw=", 365 | "dev": true 366 | }, 367 | "array-map": { 368 | "version": "0.0.0", 369 | "resolved": "https://registry.npmjs.org/array-map/-/array-map-0.0.0.tgz", 370 | "integrity": "sha1-iKK6tz0c97zVwbEYoAP2b2ZfpmI=", 371 | "dev": true 372 | }, 373 | "array-reduce": { 374 | "version": "0.0.0", 375 | "resolved": "https://registry.npmjs.org/array-reduce/-/array-reduce-0.0.0.tgz", 376 | "integrity": "sha1-FziZ0//Rx9k4PkR5Ul2+J4yrXys=", 377 | "dev": true 378 | }, 379 | "array-union": { 380 | "version": "1.0.2", 381 | "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", 382 | "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", 383 | "dev": true, 384 | "requires": { 385 | "array-uniq": "^1.0.1" 386 | } 387 | }, 388 | "array-uniq": { 389 | "version": "1.0.3", 390 | "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", 391 | "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=", 392 | "dev": true 393 | }, 394 | "array-unique": { 395 | "version": "0.3.2", 396 | "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", 397 | "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", 398 | "dev": true 399 | }, 400 | "assign-symbols": { 401 | "version": "1.0.0", 402 | "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", 403 | "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=", 404 | "dev": true 405 | }, 406 | "ast-parser": { 407 | "version": "0.0.3", 408 | "resolved": "https://registry.npmjs.org/ast-parser/-/ast-parser-0.0.3.tgz", 409 | "integrity": "sha512-Ycpq7GpFwZ2Q9Mq8E5lq20i8bbcXvdHXlugC+0o5VBuAwGI0Y0/R55cdoIHXTIWLIHrbyCVH5CaIh66Sve4Lyw==", 410 | "dev": true, 411 | "requires": { 412 | "@babel/traverse": "^7.2.3", 413 | "@babel/types": "^7.3.0", 414 | "@daybrush/utils": "^0.6.0" 415 | }, 416 | "dependencies": { 417 | "@daybrush/utils": { 418 | "version": "0.6.0", 419 | "resolved": "https://registry.npmjs.org/@daybrush/utils/-/utils-0.6.0.tgz", 420 | "integrity": "sha512-ay9e0XgiT77pYnxw9j84WzrZPBXlkzqfYXQLEpOhqMVKUtdNSrbPtKslt8Y0sY8/3cpnzedMoFpn9UcjerE/uA==", 421 | "dev": true 422 | } 423 | } 424 | }, 425 | "async": { 426 | "version": "2.6.3", 427 | "resolved": "https://registry.npmjs.org/async/-/async-2.6.3.tgz", 428 | "integrity": "sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg==", 429 | "dev": true, 430 | "requires": { 431 | "lodash": "^4.17.14" 432 | }, 433 | "dependencies": { 434 | "lodash": { 435 | "version": "4.17.15", 436 | "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", 437 | "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==", 438 | "dev": true 439 | } 440 | } 441 | }, 442 | "async-each": { 443 | "version": "1.0.3", 444 | "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.3.tgz", 445 | "integrity": "sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ==", 446 | "dev": true 447 | }, 448 | "atob": { 449 | "version": "2.1.2", 450 | "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", 451 | "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==", 452 | "dev": true 453 | }, 454 | "babel-code-frame": { 455 | "version": "6.26.0", 456 | "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz", 457 | "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=", 458 | "dev": true, 459 | "requires": { 460 | "chalk": "^1.1.3", 461 | "esutils": "^2.0.2", 462 | "js-tokens": "^3.0.2" 463 | }, 464 | "dependencies": { 465 | "chalk": { 466 | "version": "1.1.3", 467 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", 468 | "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", 469 | "dev": true, 470 | "requires": { 471 | "ansi-styles": "^2.2.1", 472 | "escape-string-regexp": "^1.0.2", 473 | "has-ansi": "^2.0.0", 474 | "strip-ansi": "^3.0.0", 475 | "supports-color": "^2.0.0" 476 | } 477 | } 478 | } 479 | }, 480 | "babel-runtime": { 481 | "version": "6.26.0", 482 | "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", 483 | "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", 484 | "dev": true, 485 | "requires": { 486 | "core-js": "^2.4.0", 487 | "regenerator-runtime": "^0.11.0" 488 | } 489 | }, 490 | "balanced-match": { 491 | "version": "1.0.0", 492 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", 493 | "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", 494 | "dev": true 495 | }, 496 | "base": { 497 | "version": "0.11.2", 498 | "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", 499 | "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", 500 | "dev": true, 501 | "requires": { 502 | "cache-base": "^1.0.1", 503 | "class-utils": "^0.3.5", 504 | "component-emitter": "^1.2.1", 505 | "define-property": "^1.0.0", 506 | "isobject": "^3.0.1", 507 | "mixin-deep": "^1.2.0", 508 | "pascalcase": "^0.1.1" 509 | }, 510 | "dependencies": { 511 | "define-property": { 512 | "version": "1.0.0", 513 | "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", 514 | "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", 515 | "dev": true, 516 | "requires": { 517 | "is-descriptor": "^1.0.0" 518 | } 519 | }, 520 | "is-accessor-descriptor": { 521 | "version": "1.0.0", 522 | "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", 523 | "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", 524 | "dev": true, 525 | "requires": { 526 | "kind-of": "^6.0.0" 527 | } 528 | }, 529 | "is-data-descriptor": { 530 | "version": "1.0.0", 531 | "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", 532 | "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", 533 | "dev": true, 534 | "requires": { 535 | "kind-of": "^6.0.0" 536 | } 537 | }, 538 | "is-descriptor": { 539 | "version": "1.0.2", 540 | "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", 541 | "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", 542 | "dev": true, 543 | "requires": { 544 | "is-accessor-descriptor": "^1.0.0", 545 | "is-data-descriptor": "^1.0.0", 546 | "kind-of": "^6.0.2" 547 | } 548 | } 549 | } 550 | }, 551 | "binary-extensions": { 552 | "version": "1.13.1", 553 | "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz", 554 | "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==", 555 | "dev": true 556 | }, 557 | "bluebird": { 558 | "version": "3.5.5", 559 | "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.5.tgz", 560 | "integrity": "sha512-5am6HnnfN+urzt4yfg7IgTbotDjIT/u8AJpEt0sIU9FtXfVeezXAPKswrG+xKUCOYAINpSdgZVDU6QFh+cuH3w==", 561 | "dev": true 562 | }, 563 | "brace-expansion": { 564 | "version": "1.1.11", 565 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", 566 | "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", 567 | "dev": true, 568 | "requires": { 569 | "balanced-match": "^1.0.0", 570 | "concat-map": "0.0.1" 571 | } 572 | }, 573 | "braces": { 574 | "version": "2.3.2", 575 | "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", 576 | "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", 577 | "dev": true, 578 | "requires": { 579 | "arr-flatten": "^1.1.0", 580 | "array-unique": "^0.3.2", 581 | "extend-shallow": "^2.0.1", 582 | "fill-range": "^4.0.0", 583 | "isobject": "^3.0.1", 584 | "repeat-element": "^1.1.2", 585 | "snapdragon": "^0.8.1", 586 | "snapdragon-node": "^2.0.1", 587 | "split-string": "^3.0.2", 588 | "to-regex": "^3.0.1" 589 | }, 590 | "dependencies": { 591 | "extend-shallow": { 592 | "version": "2.0.1", 593 | "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", 594 | "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", 595 | "dev": true, 596 | "requires": { 597 | "is-extendable": "^0.1.0" 598 | } 599 | } 600 | } 601 | }, 602 | "builtin-modules": { 603 | "version": "1.1.1", 604 | "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", 605 | "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=", 606 | "dev": true 607 | }, 608 | "cache-base": { 609 | "version": "1.0.1", 610 | "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", 611 | "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", 612 | "dev": true, 613 | "requires": { 614 | "collection-visit": "^1.0.0", 615 | "component-emitter": "^1.2.1", 616 | "get-value": "^2.0.6", 617 | "has-value": "^1.0.0", 618 | "isobject": "^3.0.1", 619 | "set-value": "^2.0.0", 620 | "to-object-path": "^0.3.0", 621 | "union-value": "^1.0.0", 622 | "unset-value": "^1.0.0" 623 | } 624 | }, 625 | "catharsis": { 626 | "version": "0.8.11", 627 | "resolved": "https://registry.npmjs.org/catharsis/-/catharsis-0.8.11.tgz", 628 | "integrity": "sha512-a+xUyMV7hD1BrDQA/3iPV7oc+6W26BgVJO05PGEoatMyIuPScQKsde6i3YorWX1qs+AZjnJ18NqdKoCtKiNh1g==", 629 | "dev": true, 630 | "requires": { 631 | "lodash": "^4.17.14" 632 | }, 633 | "dependencies": { 634 | "lodash": { 635 | "version": "4.17.15", 636 | "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", 637 | "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==", 638 | "dev": true 639 | } 640 | } 641 | }, 642 | "chalk": { 643 | "version": "2.4.2", 644 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", 645 | "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", 646 | "dev": true, 647 | "requires": { 648 | "ansi-styles": "^3.2.1", 649 | "escape-string-regexp": "^1.0.5", 650 | "supports-color": "^5.3.0" 651 | }, 652 | "dependencies": { 653 | "ansi-styles": { 654 | "version": "3.2.1", 655 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", 656 | "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", 657 | "dev": true, 658 | "requires": { 659 | "color-convert": "^1.9.0" 660 | } 661 | }, 662 | "supports-color": { 663 | "version": "5.5.0", 664 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", 665 | "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", 666 | "dev": true, 667 | "requires": { 668 | "has-flag": "^3.0.0" 669 | } 670 | } 671 | } 672 | }, 673 | "chokidar": { 674 | "version": "1.7.0", 675 | "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-1.7.0.tgz", 676 | "integrity": "sha1-eY5ol3gVHIB2tLNg5e3SjNortGg=", 677 | "dev": true, 678 | "requires": { 679 | "anymatch": "^1.3.0", 680 | "async-each": "^1.0.0", 681 | "fsevents": "^1.0.0", 682 | "glob-parent": "^2.0.0", 683 | "inherits": "^2.0.1", 684 | "is-binary-path": "^1.0.0", 685 | "is-glob": "^2.0.0", 686 | "path-is-absolute": "^1.0.0", 687 | "readdirp": "^2.0.0" 688 | } 689 | }, 690 | "class-utils": { 691 | "version": "0.3.6", 692 | "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", 693 | "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", 694 | "dev": true, 695 | "requires": { 696 | "arr-union": "^3.1.0", 697 | "define-property": "^0.2.5", 698 | "isobject": "^3.0.0", 699 | "static-extend": "^0.1.1" 700 | }, 701 | "dependencies": { 702 | "define-property": { 703 | "version": "0.2.5", 704 | "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", 705 | "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", 706 | "dev": true, 707 | "requires": { 708 | "is-descriptor": "^0.1.0" 709 | } 710 | } 711 | } 712 | }, 713 | "collection-visit": { 714 | "version": "1.0.0", 715 | "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", 716 | "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", 717 | "dev": true, 718 | "requires": { 719 | "map-visit": "^1.0.0", 720 | "object-visit": "^1.0.0" 721 | } 722 | }, 723 | "color-convert": { 724 | "version": "1.9.3", 725 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", 726 | "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", 727 | "dev": true, 728 | "requires": { 729 | "color-name": "1.1.3" 730 | } 731 | }, 732 | "color-name": { 733 | "version": "1.1.3", 734 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", 735 | "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", 736 | "dev": true 737 | }, 738 | "commander": { 739 | "version": "2.20.0", 740 | "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.0.tgz", 741 | "integrity": "sha512-7j2y+40w61zy6YC2iRNpUe/NwhNyoXrYpHMrSunaMG64nRnaf96zO/KMQR4OyN/UnE5KLyEBnKHd4aG3rskjpQ==", 742 | "dev": true 743 | }, 744 | "component-emitter": { 745 | "version": "1.3.0", 746 | "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", 747 | "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==", 748 | "dev": true 749 | }, 750 | "concat-map": { 751 | "version": "0.0.1", 752 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", 753 | "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", 754 | "dev": true 755 | }, 756 | "copy-descriptor": { 757 | "version": "0.1.1", 758 | "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", 759 | "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=", 760 | "dev": true 761 | }, 762 | "core-js": { 763 | "version": "2.6.9", 764 | "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.9.tgz", 765 | "integrity": "sha512-HOpZf6eXmnl7la+cUdMnLvUxKNqLUzJvgIziQ0DiF3JwSImNphIqdGqzj6hIKyX04MmV0poclQ7+wjWvxQyR2A==", 766 | "dev": true 767 | }, 768 | "core-util-is": { 769 | "version": "1.0.2", 770 | "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", 771 | "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", 772 | "dev": true 773 | }, 774 | "cpx": { 775 | "version": "1.5.0", 776 | "resolved": "https://registry.npmjs.org/cpx/-/cpx-1.5.0.tgz", 777 | "integrity": "sha1-GFvgGFEdhycN7czCkxceN2VauI8=", 778 | "dev": true, 779 | "requires": { 780 | "babel-runtime": "^6.9.2", 781 | "chokidar": "^1.6.0", 782 | "duplexer": "^0.1.1", 783 | "glob": "^7.0.5", 784 | "glob2base": "^0.0.12", 785 | "minimatch": "^3.0.2", 786 | "mkdirp": "^0.5.1", 787 | "resolve": "^1.1.7", 788 | "safe-buffer": "^5.0.1", 789 | "shell-quote": "^1.6.1", 790 | "subarg": "^1.0.0" 791 | } 792 | }, 793 | "debug": { 794 | "version": "4.1.1", 795 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", 796 | "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", 797 | "dev": true, 798 | "requires": { 799 | "ms": "^2.1.1" 800 | } 801 | }, 802 | "decode-uri-component": { 803 | "version": "0.2.0", 804 | "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", 805 | "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=", 806 | "dev": true 807 | }, 808 | "define-property": { 809 | "version": "2.0.2", 810 | "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", 811 | "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", 812 | "dev": true, 813 | "requires": { 814 | "is-descriptor": "^1.0.2", 815 | "isobject": "^3.0.1" 816 | }, 817 | "dependencies": { 818 | "is-accessor-descriptor": { 819 | "version": "1.0.0", 820 | "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", 821 | "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", 822 | "dev": true, 823 | "requires": { 824 | "kind-of": "^6.0.0" 825 | } 826 | }, 827 | "is-data-descriptor": { 828 | "version": "1.0.0", 829 | "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", 830 | "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", 831 | "dev": true, 832 | "requires": { 833 | "kind-of": "^6.0.0" 834 | } 835 | }, 836 | "is-descriptor": { 837 | "version": "1.0.2", 838 | "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", 839 | "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", 840 | "dev": true, 841 | "requires": { 842 | "is-accessor-descriptor": "^1.0.0", 843 | "is-data-descriptor": "^1.0.0", 844 | "kind-of": "^6.0.2" 845 | } 846 | } 847 | } 848 | }, 849 | "diff": { 850 | "version": "3.5.0", 851 | "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", 852 | "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==", 853 | "dev": true 854 | }, 855 | "docdash": { 856 | "version": "1.1.1", 857 | "resolved": "https://registry.npmjs.org/docdash/-/docdash-1.1.1.tgz", 858 | "integrity": "sha512-WQkkr01zL6kcIfq9YCSXtqqevM6NYoTXLdl+Td0OYCEcX0RgsuEMeqHXQaXFt+p6Lo15RIgA5XhLAn7RL+erhA==", 859 | "dev": true 860 | }, 861 | "doctrine": { 862 | "version": "0.7.2", 863 | "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-0.7.2.tgz", 864 | "integrity": "sha1-fLhgNZujvpDgQLJrcpzkv6ZUxSM=", 865 | "dev": true, 866 | "requires": { 867 | "esutils": "^1.1.6", 868 | "isarray": "0.0.1" 869 | }, 870 | "dependencies": { 871 | "esutils": { 872 | "version": "1.1.6", 873 | "resolved": "https://registry.npmjs.org/esutils/-/esutils-1.1.6.tgz", 874 | "integrity": "sha1-wBzKqa5LiXxtDD4hCuUvPHqEQ3U=", 875 | "dev": true 876 | } 877 | } 878 | }, 879 | "duplexer": { 880 | "version": "0.1.1", 881 | "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.1.tgz", 882 | "integrity": "sha1-rOb/gIwc5mtX0ev5eXessCM0z8E=", 883 | "dev": true 884 | }, 885 | "email-addresses": { 886 | "version": "3.0.3", 887 | "resolved": "https://registry.npmjs.org/email-addresses/-/email-addresses-3.0.3.tgz", 888 | "integrity": "sha512-kUlSC06PVvvjlMRpNIl3kR1NRXLEe86VQ7N0bQeaCZb2g+InShCeHQp/JvyYNTugMnRN2NvJhHlc3q12MWbbpg==", 889 | "dev": true 890 | }, 891 | "entities": { 892 | "version": "1.1.2", 893 | "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.2.tgz", 894 | "integrity": "sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w==", 895 | "dev": true 896 | }, 897 | "escape-string-regexp": { 898 | "version": "1.0.5", 899 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", 900 | "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", 901 | "dev": true 902 | }, 903 | "esprima": { 904 | "version": "4.0.1", 905 | "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", 906 | "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", 907 | "dev": true 908 | }, 909 | "estree-walker": { 910 | "version": "0.6.0", 911 | "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-0.6.0.tgz", 912 | "integrity": "sha512-peq1RfVAVzr3PU/jL31RaOjUKLoZJpObQWJJ+LgfcxDUifyLZ1RjPQZTl0pzj2uJ45b7A7XpyppXvxdEqzo4rw==", 913 | "dev": true 914 | }, 915 | "esutils": { 916 | "version": "2.0.2", 917 | "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", 918 | "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=", 919 | "dev": true 920 | }, 921 | "expand-brackets": { 922 | "version": "2.1.4", 923 | "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", 924 | "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", 925 | "dev": true, 926 | "requires": { 927 | "debug": "^2.3.3", 928 | "define-property": "^0.2.5", 929 | "extend-shallow": "^2.0.1", 930 | "posix-character-classes": "^0.1.0", 931 | "regex-not": "^1.0.0", 932 | "snapdragon": "^0.8.1", 933 | "to-regex": "^3.0.1" 934 | }, 935 | "dependencies": { 936 | "debug": { 937 | "version": "2.6.9", 938 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", 939 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", 940 | "dev": true, 941 | "requires": { 942 | "ms": "2.0.0" 943 | } 944 | }, 945 | "define-property": { 946 | "version": "0.2.5", 947 | "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", 948 | "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", 949 | "dev": true, 950 | "requires": { 951 | "is-descriptor": "^0.1.0" 952 | } 953 | }, 954 | "extend-shallow": { 955 | "version": "2.0.1", 956 | "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", 957 | "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", 958 | "dev": true, 959 | "requires": { 960 | "is-extendable": "^0.1.0" 961 | } 962 | }, 963 | "ms": { 964 | "version": "2.0.0", 965 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", 966 | "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", 967 | "dev": true 968 | } 969 | } 970 | }, 971 | "expand-range": { 972 | "version": "1.8.2", 973 | "resolved": "https://registry.npmjs.org/expand-range/-/expand-range-1.8.2.tgz", 974 | "integrity": "sha1-opnv/TNf4nIeuujiV+x5ZE/IUzc=", 975 | "dev": true, 976 | "requires": { 977 | "fill-range": "^2.1.0" 978 | }, 979 | "dependencies": { 980 | "fill-range": { 981 | "version": "2.2.4", 982 | "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-2.2.4.tgz", 983 | "integrity": "sha512-cnrcCbj01+j2gTG921VZPnHbjmdAf8oQV/iGeV2kZxGSyfYjjTyY79ErsK1WJWMpw6DaApEX72binqJE+/d+5Q==", 984 | "dev": true, 985 | "requires": { 986 | "is-number": "^2.1.0", 987 | "isobject": "^2.0.0", 988 | "randomatic": "^3.0.0", 989 | "repeat-element": "^1.1.2", 990 | "repeat-string": "^1.5.2" 991 | } 992 | }, 993 | "is-number": { 994 | "version": "2.1.0", 995 | "resolved": "https://registry.npmjs.org/is-number/-/is-number-2.1.0.tgz", 996 | "integrity": "sha1-Afy7s5NGOlSPL0ZszhbezknbkI8=", 997 | "dev": true, 998 | "requires": { 999 | "kind-of": "^3.0.2" 1000 | } 1001 | }, 1002 | "isarray": { 1003 | "version": "1.0.0", 1004 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", 1005 | "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", 1006 | "dev": true 1007 | }, 1008 | "isobject": { 1009 | "version": "2.1.0", 1010 | "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", 1011 | "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", 1012 | "dev": true, 1013 | "requires": { 1014 | "isarray": "1.0.0" 1015 | } 1016 | }, 1017 | "kind-of": { 1018 | "version": "3.2.2", 1019 | "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", 1020 | "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", 1021 | "dev": true, 1022 | "requires": { 1023 | "is-buffer": "^1.1.5" 1024 | } 1025 | } 1026 | } 1027 | }, 1028 | "extend-shallow": { 1029 | "version": "3.0.2", 1030 | "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", 1031 | "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", 1032 | "dev": true, 1033 | "requires": { 1034 | "assign-symbols": "^1.0.0", 1035 | "is-extendable": "^1.0.1" 1036 | }, 1037 | "dependencies": { 1038 | "is-extendable": { 1039 | "version": "1.0.1", 1040 | "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", 1041 | "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", 1042 | "dev": true, 1043 | "requires": { 1044 | "is-plain-object": "^2.0.4" 1045 | } 1046 | } 1047 | } 1048 | }, 1049 | "extglob": { 1050 | "version": "2.0.4", 1051 | "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", 1052 | "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", 1053 | "dev": true, 1054 | "requires": { 1055 | "array-unique": "^0.3.2", 1056 | "define-property": "^1.0.0", 1057 | "expand-brackets": "^2.1.4", 1058 | "extend-shallow": "^2.0.1", 1059 | "fragment-cache": "^0.2.1", 1060 | "regex-not": "^1.0.0", 1061 | "snapdragon": "^0.8.1", 1062 | "to-regex": "^3.0.1" 1063 | }, 1064 | "dependencies": { 1065 | "define-property": { 1066 | "version": "1.0.0", 1067 | "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", 1068 | "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", 1069 | "dev": true, 1070 | "requires": { 1071 | "is-descriptor": "^1.0.0" 1072 | } 1073 | }, 1074 | "extend-shallow": { 1075 | "version": "2.0.1", 1076 | "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", 1077 | "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", 1078 | "dev": true, 1079 | "requires": { 1080 | "is-extendable": "^0.1.0" 1081 | } 1082 | }, 1083 | "is-accessor-descriptor": { 1084 | "version": "1.0.0", 1085 | "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", 1086 | "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", 1087 | "dev": true, 1088 | "requires": { 1089 | "kind-of": "^6.0.0" 1090 | } 1091 | }, 1092 | "is-data-descriptor": { 1093 | "version": "1.0.0", 1094 | "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", 1095 | "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", 1096 | "dev": true, 1097 | "requires": { 1098 | "kind-of": "^6.0.0" 1099 | } 1100 | }, 1101 | "is-descriptor": { 1102 | "version": "1.0.2", 1103 | "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", 1104 | "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", 1105 | "dev": true, 1106 | "requires": { 1107 | "is-accessor-descriptor": "^1.0.0", 1108 | "is-data-descriptor": "^1.0.0", 1109 | "kind-of": "^6.0.2" 1110 | } 1111 | } 1112 | } 1113 | }, 1114 | "filename-regex": { 1115 | "version": "2.0.1", 1116 | "resolved": "https://registry.npmjs.org/filename-regex/-/filename-regex-2.0.1.tgz", 1117 | "integrity": "sha1-wcS5vuPglyXdsQa3XB4wH+LxiyY=", 1118 | "dev": true 1119 | }, 1120 | "filename-reserved-regex": { 1121 | "version": "1.0.0", 1122 | "resolved": "https://registry.npmjs.org/filename-reserved-regex/-/filename-reserved-regex-1.0.0.tgz", 1123 | "integrity": "sha1-5hz4BfDeHJhFZ9A4bcXfUO5a9+Q=", 1124 | "dev": true 1125 | }, 1126 | "filenamify": { 1127 | "version": "1.2.1", 1128 | "resolved": "https://registry.npmjs.org/filenamify/-/filenamify-1.2.1.tgz", 1129 | "integrity": "sha1-qfL/0RxQO+0wABUCknI3jx8TZaU=", 1130 | "dev": true, 1131 | "requires": { 1132 | "filename-reserved-regex": "^1.0.0", 1133 | "strip-outer": "^1.0.0", 1134 | "trim-repeated": "^1.0.0" 1135 | } 1136 | }, 1137 | "filenamify-url": { 1138 | "version": "1.0.0", 1139 | "resolved": "https://registry.npmjs.org/filenamify-url/-/filenamify-url-1.0.0.tgz", 1140 | "integrity": "sha1-syvYExnvWGO3MHi+1Q9GpPeXX1A=", 1141 | "dev": true, 1142 | "requires": { 1143 | "filenamify": "^1.0.0", 1144 | "humanize-url": "^1.0.0" 1145 | } 1146 | }, 1147 | "fill-range": { 1148 | "version": "4.0.0", 1149 | "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", 1150 | "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", 1151 | "dev": true, 1152 | "requires": { 1153 | "extend-shallow": "^2.0.1", 1154 | "is-number": "^3.0.0", 1155 | "repeat-string": "^1.6.1", 1156 | "to-regex-range": "^2.1.0" 1157 | }, 1158 | "dependencies": { 1159 | "extend-shallow": { 1160 | "version": "2.0.1", 1161 | "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", 1162 | "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", 1163 | "dev": true, 1164 | "requires": { 1165 | "is-extendable": "^0.1.0" 1166 | } 1167 | } 1168 | } 1169 | }, 1170 | "find-index": { 1171 | "version": "0.1.1", 1172 | "resolved": "https://registry.npmjs.org/find-index/-/find-index-0.1.1.tgz", 1173 | "integrity": "sha1-Z101iyyjiS15Whq0cjL4tuLg3eQ=", 1174 | "dev": true 1175 | }, 1176 | "for-in": { 1177 | "version": "1.0.2", 1178 | "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", 1179 | "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", 1180 | "dev": true 1181 | }, 1182 | "for-own": { 1183 | "version": "0.1.5", 1184 | "resolved": "https://registry.npmjs.org/for-own/-/for-own-0.1.5.tgz", 1185 | "integrity": "sha1-UmXGgaTylNq78XyVCbZ2OqhFEM4=", 1186 | "dev": true, 1187 | "requires": { 1188 | "for-in": "^1.0.1" 1189 | } 1190 | }, 1191 | "fragment-cache": { 1192 | "version": "0.2.1", 1193 | "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", 1194 | "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", 1195 | "dev": true, 1196 | "requires": { 1197 | "map-cache": "^0.2.2" 1198 | } 1199 | }, 1200 | "fs-extra": { 1201 | "version": "7.0.1", 1202 | "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", 1203 | "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==", 1204 | "dev": true, 1205 | "requires": { 1206 | "graceful-fs": "^4.1.2", 1207 | "jsonfile": "^4.0.0", 1208 | "universalify": "^0.1.0" 1209 | } 1210 | }, 1211 | "fs.realpath": { 1212 | "version": "1.0.0", 1213 | "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", 1214 | "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", 1215 | "dev": true 1216 | }, 1217 | "fsevents": { 1218 | "version": "1.2.9", 1219 | "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.9.tgz", 1220 | "integrity": "sha512-oeyj2H3EjjonWcFjD5NvZNE9Rqe4UW+nQBU2HNeKw0koVLEFIhtyETyAakeAM3de7Z/SW5kcA+fZUait9EApnw==", 1221 | "dev": true, 1222 | "optional": true, 1223 | "requires": { 1224 | "nan": "^2.12.1", 1225 | "node-pre-gyp": "^0.12.0" 1226 | }, 1227 | "dependencies": { 1228 | "abbrev": { 1229 | "version": "1.1.1", 1230 | "bundled": true, 1231 | "dev": true, 1232 | "optional": true 1233 | }, 1234 | "ansi-regex": { 1235 | "version": "2.1.1", 1236 | "bundled": true, 1237 | "dev": true, 1238 | "optional": true 1239 | }, 1240 | "aproba": { 1241 | "version": "1.2.0", 1242 | "bundled": true, 1243 | "dev": true, 1244 | "optional": true 1245 | }, 1246 | "are-we-there-yet": { 1247 | "version": "1.1.5", 1248 | "bundled": true, 1249 | "dev": true, 1250 | "optional": true, 1251 | "requires": { 1252 | "delegates": "^1.0.0", 1253 | "readable-stream": "^2.0.6" 1254 | } 1255 | }, 1256 | "balanced-match": { 1257 | "version": "1.0.0", 1258 | "bundled": true, 1259 | "dev": true, 1260 | "optional": true 1261 | }, 1262 | "brace-expansion": { 1263 | "version": "1.1.11", 1264 | "bundled": true, 1265 | "dev": true, 1266 | "optional": true, 1267 | "requires": { 1268 | "balanced-match": "^1.0.0", 1269 | "concat-map": "0.0.1" 1270 | } 1271 | }, 1272 | "chownr": { 1273 | "version": "1.1.1", 1274 | "bundled": true, 1275 | "dev": true, 1276 | "optional": true 1277 | }, 1278 | "code-point-at": { 1279 | "version": "1.1.0", 1280 | "bundled": true, 1281 | "dev": true, 1282 | "optional": true 1283 | }, 1284 | "concat-map": { 1285 | "version": "0.0.1", 1286 | "bundled": true, 1287 | "dev": true, 1288 | "optional": true 1289 | }, 1290 | "console-control-strings": { 1291 | "version": "1.1.0", 1292 | "bundled": true, 1293 | "dev": true, 1294 | "optional": true 1295 | }, 1296 | "core-util-is": { 1297 | "version": "1.0.2", 1298 | "bundled": true, 1299 | "dev": true, 1300 | "optional": true 1301 | }, 1302 | "debug": { 1303 | "version": "4.1.1", 1304 | "bundled": true, 1305 | "dev": true, 1306 | "optional": true, 1307 | "requires": { 1308 | "ms": "^2.1.1" 1309 | } 1310 | }, 1311 | "deep-extend": { 1312 | "version": "0.6.0", 1313 | "bundled": true, 1314 | "dev": true, 1315 | "optional": true 1316 | }, 1317 | "delegates": { 1318 | "version": "1.0.0", 1319 | "bundled": true, 1320 | "dev": true, 1321 | "optional": true 1322 | }, 1323 | "detect-libc": { 1324 | "version": "1.0.3", 1325 | "bundled": true, 1326 | "dev": true, 1327 | "optional": true 1328 | }, 1329 | "fs-minipass": { 1330 | "version": "1.2.5", 1331 | "bundled": true, 1332 | "dev": true, 1333 | "optional": true, 1334 | "requires": { 1335 | "minipass": "^2.2.1" 1336 | } 1337 | }, 1338 | "fs.realpath": { 1339 | "version": "1.0.0", 1340 | "bundled": true, 1341 | "dev": true, 1342 | "optional": true 1343 | }, 1344 | "gauge": { 1345 | "version": "2.7.4", 1346 | "bundled": true, 1347 | "dev": true, 1348 | "optional": true, 1349 | "requires": { 1350 | "aproba": "^1.0.3", 1351 | "console-control-strings": "^1.0.0", 1352 | "has-unicode": "^2.0.0", 1353 | "object-assign": "^4.1.0", 1354 | "signal-exit": "^3.0.0", 1355 | "string-width": "^1.0.1", 1356 | "strip-ansi": "^3.0.1", 1357 | "wide-align": "^1.1.0" 1358 | } 1359 | }, 1360 | "glob": { 1361 | "version": "7.1.3", 1362 | "bundled": true, 1363 | "dev": true, 1364 | "optional": true, 1365 | "requires": { 1366 | "fs.realpath": "^1.0.0", 1367 | "inflight": "^1.0.4", 1368 | "inherits": "2", 1369 | "minimatch": "^3.0.4", 1370 | "once": "^1.3.0", 1371 | "path-is-absolute": "^1.0.0" 1372 | } 1373 | }, 1374 | "has-unicode": { 1375 | "version": "2.0.1", 1376 | "bundled": true, 1377 | "dev": true, 1378 | "optional": true 1379 | }, 1380 | "iconv-lite": { 1381 | "version": "0.4.24", 1382 | "bundled": true, 1383 | "dev": true, 1384 | "optional": true, 1385 | "requires": { 1386 | "safer-buffer": ">= 2.1.2 < 3" 1387 | } 1388 | }, 1389 | "ignore-walk": { 1390 | "version": "3.0.1", 1391 | "bundled": true, 1392 | "dev": true, 1393 | "optional": true, 1394 | "requires": { 1395 | "minimatch": "^3.0.4" 1396 | } 1397 | }, 1398 | "inflight": { 1399 | "version": "1.0.6", 1400 | "bundled": true, 1401 | "dev": true, 1402 | "optional": true, 1403 | "requires": { 1404 | "once": "^1.3.0", 1405 | "wrappy": "1" 1406 | } 1407 | }, 1408 | "inherits": { 1409 | "version": "2.0.3", 1410 | "bundled": true, 1411 | "dev": true, 1412 | "optional": true 1413 | }, 1414 | "ini": { 1415 | "version": "1.3.5", 1416 | "bundled": true, 1417 | "dev": true, 1418 | "optional": true 1419 | }, 1420 | "is-fullwidth-code-point": { 1421 | "version": "1.0.0", 1422 | "bundled": true, 1423 | "dev": true, 1424 | "optional": true, 1425 | "requires": { 1426 | "number-is-nan": "^1.0.0" 1427 | } 1428 | }, 1429 | "isarray": { 1430 | "version": "1.0.0", 1431 | "bundled": true, 1432 | "dev": true, 1433 | "optional": true 1434 | }, 1435 | "minimatch": { 1436 | "version": "3.0.4", 1437 | "bundled": true, 1438 | "dev": true, 1439 | "optional": true, 1440 | "requires": { 1441 | "brace-expansion": "^1.1.7" 1442 | } 1443 | }, 1444 | "minimist": { 1445 | "version": "0.0.8", 1446 | "bundled": true, 1447 | "dev": true, 1448 | "optional": true 1449 | }, 1450 | "minipass": { 1451 | "version": "2.3.5", 1452 | "bundled": true, 1453 | "dev": true, 1454 | "optional": true, 1455 | "requires": { 1456 | "safe-buffer": "^5.1.2", 1457 | "yallist": "^3.0.0" 1458 | } 1459 | }, 1460 | "minizlib": { 1461 | "version": "1.2.1", 1462 | "bundled": true, 1463 | "dev": true, 1464 | "optional": true, 1465 | "requires": { 1466 | "minipass": "^2.2.1" 1467 | } 1468 | }, 1469 | "mkdirp": { 1470 | "version": "0.5.1", 1471 | "bundled": true, 1472 | "dev": true, 1473 | "optional": true, 1474 | "requires": { 1475 | "minimist": "0.0.8" 1476 | } 1477 | }, 1478 | "ms": { 1479 | "version": "2.1.1", 1480 | "bundled": true, 1481 | "dev": true, 1482 | "optional": true 1483 | }, 1484 | "needle": { 1485 | "version": "2.3.0", 1486 | "bundled": true, 1487 | "dev": true, 1488 | "optional": true, 1489 | "requires": { 1490 | "debug": "^4.1.0", 1491 | "iconv-lite": "^0.4.4", 1492 | "sax": "^1.2.4" 1493 | } 1494 | }, 1495 | "node-pre-gyp": { 1496 | "version": "0.12.0", 1497 | "bundled": true, 1498 | "dev": true, 1499 | "optional": true, 1500 | "requires": { 1501 | "detect-libc": "^1.0.2", 1502 | "mkdirp": "^0.5.1", 1503 | "needle": "^2.2.1", 1504 | "nopt": "^4.0.1", 1505 | "npm-packlist": "^1.1.6", 1506 | "npmlog": "^4.0.2", 1507 | "rc": "^1.2.7", 1508 | "rimraf": "^2.6.1", 1509 | "semver": "^5.3.0", 1510 | "tar": "^4" 1511 | } 1512 | }, 1513 | "nopt": { 1514 | "version": "4.0.1", 1515 | "bundled": true, 1516 | "dev": true, 1517 | "optional": true, 1518 | "requires": { 1519 | "abbrev": "1", 1520 | "osenv": "^0.1.4" 1521 | } 1522 | }, 1523 | "npm-bundled": { 1524 | "version": "1.0.6", 1525 | "bundled": true, 1526 | "dev": true, 1527 | "optional": true 1528 | }, 1529 | "npm-packlist": { 1530 | "version": "1.4.1", 1531 | "bundled": true, 1532 | "dev": true, 1533 | "optional": true, 1534 | "requires": { 1535 | "ignore-walk": "^3.0.1", 1536 | "npm-bundled": "^1.0.1" 1537 | } 1538 | }, 1539 | "npmlog": { 1540 | "version": "4.1.2", 1541 | "bundled": true, 1542 | "dev": true, 1543 | "optional": true, 1544 | "requires": { 1545 | "are-we-there-yet": "~1.1.2", 1546 | "console-control-strings": "~1.1.0", 1547 | "gauge": "~2.7.3", 1548 | "set-blocking": "~2.0.0" 1549 | } 1550 | }, 1551 | "number-is-nan": { 1552 | "version": "1.0.1", 1553 | "bundled": true, 1554 | "dev": true, 1555 | "optional": true 1556 | }, 1557 | "object-assign": { 1558 | "version": "4.1.1", 1559 | "bundled": true, 1560 | "dev": true, 1561 | "optional": true 1562 | }, 1563 | "once": { 1564 | "version": "1.4.0", 1565 | "bundled": true, 1566 | "dev": true, 1567 | "optional": true, 1568 | "requires": { 1569 | "wrappy": "1" 1570 | } 1571 | }, 1572 | "os-homedir": { 1573 | "version": "1.0.2", 1574 | "bundled": true, 1575 | "dev": true, 1576 | "optional": true 1577 | }, 1578 | "os-tmpdir": { 1579 | "version": "1.0.2", 1580 | "bundled": true, 1581 | "dev": true, 1582 | "optional": true 1583 | }, 1584 | "osenv": { 1585 | "version": "0.1.5", 1586 | "bundled": true, 1587 | "dev": true, 1588 | "optional": true, 1589 | "requires": { 1590 | "os-homedir": "^1.0.0", 1591 | "os-tmpdir": "^1.0.0" 1592 | } 1593 | }, 1594 | "path-is-absolute": { 1595 | "version": "1.0.1", 1596 | "bundled": true, 1597 | "dev": true, 1598 | "optional": true 1599 | }, 1600 | "process-nextick-args": { 1601 | "version": "2.0.0", 1602 | "bundled": true, 1603 | "dev": true, 1604 | "optional": true 1605 | }, 1606 | "rc": { 1607 | "version": "1.2.8", 1608 | "bundled": true, 1609 | "dev": true, 1610 | "optional": true, 1611 | "requires": { 1612 | "deep-extend": "^0.6.0", 1613 | "ini": "~1.3.0", 1614 | "minimist": "^1.2.0", 1615 | "strip-json-comments": "~2.0.1" 1616 | }, 1617 | "dependencies": { 1618 | "minimist": { 1619 | "version": "1.2.0", 1620 | "bundled": true, 1621 | "dev": true, 1622 | "optional": true 1623 | } 1624 | } 1625 | }, 1626 | "readable-stream": { 1627 | "version": "2.3.6", 1628 | "bundled": true, 1629 | "dev": true, 1630 | "optional": true, 1631 | "requires": { 1632 | "core-util-is": "~1.0.0", 1633 | "inherits": "~2.0.3", 1634 | "isarray": "~1.0.0", 1635 | "process-nextick-args": "~2.0.0", 1636 | "safe-buffer": "~5.1.1", 1637 | "string_decoder": "~1.1.1", 1638 | "util-deprecate": "~1.0.1" 1639 | } 1640 | }, 1641 | "rimraf": { 1642 | "version": "2.6.3", 1643 | "bundled": true, 1644 | "dev": true, 1645 | "optional": true, 1646 | "requires": { 1647 | "glob": "^7.1.3" 1648 | } 1649 | }, 1650 | "safe-buffer": { 1651 | "version": "5.1.2", 1652 | "bundled": true, 1653 | "dev": true, 1654 | "optional": true 1655 | }, 1656 | "safer-buffer": { 1657 | "version": "2.1.2", 1658 | "bundled": true, 1659 | "dev": true, 1660 | "optional": true 1661 | }, 1662 | "sax": { 1663 | "version": "1.2.4", 1664 | "bundled": true, 1665 | "dev": true, 1666 | "optional": true 1667 | }, 1668 | "semver": { 1669 | "version": "5.7.0", 1670 | "bundled": true, 1671 | "dev": true, 1672 | "optional": true 1673 | }, 1674 | "set-blocking": { 1675 | "version": "2.0.0", 1676 | "bundled": true, 1677 | "dev": true, 1678 | "optional": true 1679 | }, 1680 | "signal-exit": { 1681 | "version": "3.0.2", 1682 | "bundled": true, 1683 | "dev": true, 1684 | "optional": true 1685 | }, 1686 | "string-width": { 1687 | "version": "1.0.2", 1688 | "bundled": true, 1689 | "dev": true, 1690 | "optional": true, 1691 | "requires": { 1692 | "code-point-at": "^1.0.0", 1693 | "is-fullwidth-code-point": "^1.0.0", 1694 | "strip-ansi": "^3.0.0" 1695 | } 1696 | }, 1697 | "string_decoder": { 1698 | "version": "1.1.1", 1699 | "bundled": true, 1700 | "dev": true, 1701 | "optional": true, 1702 | "requires": { 1703 | "safe-buffer": "~5.1.0" 1704 | } 1705 | }, 1706 | "strip-ansi": { 1707 | "version": "3.0.1", 1708 | "bundled": true, 1709 | "dev": true, 1710 | "optional": true, 1711 | "requires": { 1712 | "ansi-regex": "^2.0.0" 1713 | } 1714 | }, 1715 | "strip-json-comments": { 1716 | "version": "2.0.1", 1717 | "bundled": true, 1718 | "dev": true, 1719 | "optional": true 1720 | }, 1721 | "tar": { 1722 | "version": "4.4.8", 1723 | "bundled": true, 1724 | "dev": true, 1725 | "optional": true, 1726 | "requires": { 1727 | "chownr": "^1.1.1", 1728 | "fs-minipass": "^1.2.5", 1729 | "minipass": "^2.3.4", 1730 | "minizlib": "^1.1.1", 1731 | "mkdirp": "^0.5.0", 1732 | "safe-buffer": "^5.1.2", 1733 | "yallist": "^3.0.2" 1734 | } 1735 | }, 1736 | "util-deprecate": { 1737 | "version": "1.0.2", 1738 | "bundled": true, 1739 | "dev": true, 1740 | "optional": true 1741 | }, 1742 | "wide-align": { 1743 | "version": "1.1.3", 1744 | "bundled": true, 1745 | "dev": true, 1746 | "optional": true, 1747 | "requires": { 1748 | "string-width": "^1.0.2 || 2" 1749 | } 1750 | }, 1751 | "wrappy": { 1752 | "version": "1.0.2", 1753 | "bundled": true, 1754 | "dev": true, 1755 | "optional": true 1756 | }, 1757 | "yallist": { 1758 | "version": "3.0.3", 1759 | "bundled": true, 1760 | "dev": true, 1761 | "optional": true 1762 | } 1763 | } 1764 | }, 1765 | "get-caller-file": { 1766 | "version": "2.0.5", 1767 | "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", 1768 | "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", 1769 | "dev": true 1770 | }, 1771 | "get-value": { 1772 | "version": "2.0.6", 1773 | "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", 1774 | "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=", 1775 | "dev": true 1776 | }, 1777 | "gh-pages": { 1778 | "version": "2.0.1", 1779 | "resolved": "https://registry.npmjs.org/gh-pages/-/gh-pages-2.0.1.tgz", 1780 | "integrity": "sha512-uFlk3bukljeiWKQ2XvPfjcSi/ou7IfoDf2p+Fj672saLAr8bnOdFVqI/JSgrSgInKpCg5BksxEwGUl++dbg8Dg==", 1781 | "dev": true, 1782 | "requires": { 1783 | "async": "^2.6.1", 1784 | "commander": "^2.18.0", 1785 | "email-addresses": "^3.0.1", 1786 | "filenamify-url": "^1.0.0", 1787 | "fs-extra": "^7.0.0", 1788 | "globby": "^6.1.0", 1789 | "graceful-fs": "^4.1.11", 1790 | "rimraf": "^2.6.2" 1791 | } 1792 | }, 1793 | "gl-matrix": { 1794 | "version": "3.0.0", 1795 | "resolved": "https://registry.npmjs.org/gl-matrix/-/gl-matrix-3.0.0.tgz", 1796 | "integrity": "sha512-PD4mVH/C/Zs64kOozeFnKY8ybhgwxXXQYGWdB4h68krAHknWJgk9uKOn6z8YElh5//vs++90pb6csrTIDWnexA==" 1797 | }, 1798 | "glob": { 1799 | "version": "7.1.3", 1800 | "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz", 1801 | "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==", 1802 | "dev": true, 1803 | "requires": { 1804 | "fs.realpath": "^1.0.0", 1805 | "inflight": "^1.0.4", 1806 | "inherits": "2", 1807 | "minimatch": "^3.0.4", 1808 | "once": "^1.3.0", 1809 | "path-is-absolute": "^1.0.0" 1810 | } 1811 | }, 1812 | "glob-base": { 1813 | "version": "0.3.0", 1814 | "resolved": "https://registry.npmjs.org/glob-base/-/glob-base-0.3.0.tgz", 1815 | "integrity": "sha1-27Fk9iIbHAscz4Kuoyi0l98Oo8Q=", 1816 | "dev": true, 1817 | "requires": { 1818 | "glob-parent": "^2.0.0", 1819 | "is-glob": "^2.0.0" 1820 | } 1821 | }, 1822 | "glob-parent": { 1823 | "version": "2.0.0", 1824 | "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-2.0.0.tgz", 1825 | "integrity": "sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg=", 1826 | "dev": true, 1827 | "requires": { 1828 | "is-glob": "^2.0.0" 1829 | } 1830 | }, 1831 | "glob2base": { 1832 | "version": "0.0.12", 1833 | "resolved": "https://registry.npmjs.org/glob2base/-/glob2base-0.0.12.tgz", 1834 | "integrity": "sha1-nUGbPijxLoOjYhZKJ3BVkiycDVY=", 1835 | "dev": true, 1836 | "requires": { 1837 | "find-index": "^0.1.1" 1838 | } 1839 | }, 1840 | "globals": { 1841 | "version": "11.11.0", 1842 | "resolved": "https://registry.npmjs.org/globals/-/globals-11.11.0.tgz", 1843 | "integrity": "sha512-WHq43gS+6ufNOEqlrDBxVEbb8ntfXrfAUU2ZOpCxrBdGKW3gyv8mCxAfIBD0DroPKGrJ2eSsXsLtY9MPntsyTw==", 1844 | "dev": true 1845 | }, 1846 | "globby": { 1847 | "version": "6.1.0", 1848 | "resolved": "https://registry.npmjs.org/globby/-/globby-6.1.0.tgz", 1849 | "integrity": "sha1-9abXDoOV4hyFj7BInWTfAkJNUGw=", 1850 | "dev": true, 1851 | "requires": { 1852 | "array-union": "^1.0.1", 1853 | "glob": "^7.0.3", 1854 | "object-assign": "^4.0.1", 1855 | "pify": "^2.0.0", 1856 | "pinkie-promise": "^2.0.0" 1857 | } 1858 | }, 1859 | "graceful-fs": { 1860 | "version": "4.2.0", 1861 | "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.0.tgz", 1862 | "integrity": "sha512-jpSvDPV4Cq/bgtpndIWbI5hmYxhQGHPC4d4cqBPb4DLniCfhJokdXhwhaDuLBGLQdvvRum/UiX6ECVIPvDXqdg==", 1863 | "dev": true 1864 | }, 1865 | "has-ansi": { 1866 | "version": "2.0.0", 1867 | "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", 1868 | "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", 1869 | "dev": true, 1870 | "requires": { 1871 | "ansi-regex": "^2.0.0" 1872 | } 1873 | }, 1874 | "has-flag": { 1875 | "version": "3.0.0", 1876 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", 1877 | "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", 1878 | "dev": true 1879 | }, 1880 | "has-value": { 1881 | "version": "1.0.0", 1882 | "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", 1883 | "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", 1884 | "dev": true, 1885 | "requires": { 1886 | "get-value": "^2.0.6", 1887 | "has-values": "^1.0.0", 1888 | "isobject": "^3.0.0" 1889 | } 1890 | }, 1891 | "has-values": { 1892 | "version": "1.0.0", 1893 | "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", 1894 | "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=", 1895 | "dev": true, 1896 | "requires": { 1897 | "is-number": "^3.0.0", 1898 | "kind-of": "^4.0.0" 1899 | }, 1900 | "dependencies": { 1901 | "kind-of": { 1902 | "version": "4.0.0", 1903 | "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", 1904 | "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", 1905 | "dev": true, 1906 | "requires": { 1907 | "is-buffer": "^1.1.5" 1908 | } 1909 | } 1910 | } 1911 | }, 1912 | "humanize-url": { 1913 | "version": "1.0.1", 1914 | "resolved": "https://registry.npmjs.org/humanize-url/-/humanize-url-1.0.1.tgz", 1915 | "integrity": "sha1-9KuZ4NKIF0yk4eUEB8VfuuRk7/8=", 1916 | "dev": true, 1917 | "requires": { 1918 | "normalize-url": "^1.0.0", 1919 | "strip-url-auth": "^1.0.0" 1920 | } 1921 | }, 1922 | "inflight": { 1923 | "version": "1.0.6", 1924 | "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", 1925 | "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", 1926 | "dev": true, 1927 | "requires": { 1928 | "once": "^1.3.0", 1929 | "wrappy": "1" 1930 | } 1931 | }, 1932 | "inherits": { 1933 | "version": "2.0.3", 1934 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", 1935 | "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", 1936 | "dev": true 1937 | }, 1938 | "inversify": { 1939 | "version": "5.0.1", 1940 | "resolved": "https://registry.npmjs.org/inversify/-/inversify-5.0.1.tgz", 1941 | "integrity": "sha512-Ieh06s48WnEYGcqHepdsJUIJUXpwH5o5vodAX+DK2JA/gjy4EbEcQZxw+uFfzysmKjiLXGYwNG3qDZsKVMcINQ==", 1942 | "dev": true 1943 | }, 1944 | "is-accessor-descriptor": { 1945 | "version": "0.1.6", 1946 | "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", 1947 | "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", 1948 | "dev": true, 1949 | "requires": { 1950 | "kind-of": "^3.0.2" 1951 | }, 1952 | "dependencies": { 1953 | "kind-of": { 1954 | "version": "3.2.2", 1955 | "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", 1956 | "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", 1957 | "dev": true, 1958 | "requires": { 1959 | "is-buffer": "^1.1.5" 1960 | } 1961 | } 1962 | } 1963 | }, 1964 | "is-binary-path": { 1965 | "version": "1.0.1", 1966 | "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", 1967 | "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", 1968 | "dev": true, 1969 | "requires": { 1970 | "binary-extensions": "^1.0.0" 1971 | } 1972 | }, 1973 | "is-buffer": { 1974 | "version": "1.1.6", 1975 | "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", 1976 | "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", 1977 | "dev": true 1978 | }, 1979 | "is-data-descriptor": { 1980 | "version": "0.1.4", 1981 | "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", 1982 | "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", 1983 | "dev": true, 1984 | "requires": { 1985 | "kind-of": "^3.0.2" 1986 | }, 1987 | "dependencies": { 1988 | "kind-of": { 1989 | "version": "3.2.2", 1990 | "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", 1991 | "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", 1992 | "dev": true, 1993 | "requires": { 1994 | "is-buffer": "^1.1.5" 1995 | } 1996 | } 1997 | } 1998 | }, 1999 | "is-descriptor": { 2000 | "version": "0.1.6", 2001 | "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", 2002 | "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", 2003 | "dev": true, 2004 | "requires": { 2005 | "is-accessor-descriptor": "^0.1.6", 2006 | "is-data-descriptor": "^0.1.4", 2007 | "kind-of": "^5.0.0" 2008 | }, 2009 | "dependencies": { 2010 | "kind-of": { 2011 | "version": "5.1.0", 2012 | "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", 2013 | "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", 2014 | "dev": true 2015 | } 2016 | } 2017 | }, 2018 | "is-dotfile": { 2019 | "version": "1.0.3", 2020 | "resolved": "https://registry.npmjs.org/is-dotfile/-/is-dotfile-1.0.3.tgz", 2021 | "integrity": "sha1-pqLzL/0t+wT1yiXs0Pa4PPeYoeE=", 2022 | "dev": true 2023 | }, 2024 | "is-equal-shallow": { 2025 | "version": "0.1.3", 2026 | "resolved": "https://registry.npmjs.org/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz", 2027 | "integrity": "sha1-IjgJj8Ih3gvPpdnqxMRdY4qhxTQ=", 2028 | "dev": true, 2029 | "requires": { 2030 | "is-primitive": "^2.0.0" 2031 | } 2032 | }, 2033 | "is-extendable": { 2034 | "version": "0.1.1", 2035 | "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", 2036 | "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", 2037 | "dev": true 2038 | }, 2039 | "is-extglob": { 2040 | "version": "1.0.0", 2041 | "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", 2042 | "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", 2043 | "dev": true 2044 | }, 2045 | "is-glob": { 2046 | "version": "2.0.1", 2047 | "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", 2048 | "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", 2049 | "dev": true, 2050 | "requires": { 2051 | "is-extglob": "^1.0.0" 2052 | } 2053 | }, 2054 | "is-module": { 2055 | "version": "1.0.0", 2056 | "resolved": "https://registry.npmjs.org/is-module/-/is-module-1.0.0.tgz", 2057 | "integrity": "sha1-Mlj7afeMFNW4FdZkM2tM/7ZEFZE=", 2058 | "dev": true 2059 | }, 2060 | "is-number": { 2061 | "version": "3.0.0", 2062 | "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", 2063 | "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", 2064 | "dev": true, 2065 | "requires": { 2066 | "kind-of": "^3.0.2" 2067 | }, 2068 | "dependencies": { 2069 | "kind-of": { 2070 | "version": "3.2.2", 2071 | "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", 2072 | "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", 2073 | "dev": true, 2074 | "requires": { 2075 | "is-buffer": "^1.1.5" 2076 | } 2077 | } 2078 | } 2079 | }, 2080 | "is-plain-obj": { 2081 | "version": "1.1.0", 2082 | "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", 2083 | "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4=", 2084 | "dev": true 2085 | }, 2086 | "is-plain-object": { 2087 | "version": "2.0.4", 2088 | "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", 2089 | "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", 2090 | "dev": true, 2091 | "requires": { 2092 | "isobject": "^3.0.1" 2093 | } 2094 | }, 2095 | "is-posix-bracket": { 2096 | "version": "0.1.1", 2097 | "resolved": "https://registry.npmjs.org/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz", 2098 | "integrity": "sha1-MzTceXdDaOkvAW5vvAqI9c1ua8Q=", 2099 | "dev": true 2100 | }, 2101 | "is-primitive": { 2102 | "version": "2.0.0", 2103 | "resolved": "https://registry.npmjs.org/is-primitive/-/is-primitive-2.0.0.tgz", 2104 | "integrity": "sha1-IHurkWOEmcB7Kt8kCkGochADRXU=", 2105 | "dev": true 2106 | }, 2107 | "is-windows": { 2108 | "version": "1.0.2", 2109 | "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", 2110 | "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", 2111 | "dev": true 2112 | }, 2113 | "is-wsl": { 2114 | "version": "1.1.0", 2115 | "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", 2116 | "integrity": "sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=", 2117 | "dev": true 2118 | }, 2119 | "isarray": { 2120 | "version": "0.0.1", 2121 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", 2122 | "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", 2123 | "dev": true 2124 | }, 2125 | "isobject": { 2126 | "version": "3.0.1", 2127 | "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", 2128 | "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", 2129 | "dev": true 2130 | }, 2131 | "jest-worker": { 2132 | "version": "24.6.0", 2133 | "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-24.6.0.tgz", 2134 | "integrity": "sha512-jDwgW5W9qGNvpI1tNnvajh0a5IE/PuGLFmHk6aR/BZFz8tSgGw17GsDPXAJ6p91IvYDjOw8GpFbvvZGAK+DPQQ==", 2135 | "dev": true, 2136 | "requires": { 2137 | "merge-stream": "^1.0.1", 2138 | "supports-color": "^6.1.0" 2139 | }, 2140 | "dependencies": { 2141 | "supports-color": { 2142 | "version": "6.1.0", 2143 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", 2144 | "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", 2145 | "dev": true, 2146 | "requires": { 2147 | "has-flag": "^3.0.0" 2148 | } 2149 | } 2150 | } 2151 | }, 2152 | "js-tokens": { 2153 | "version": "3.0.2", 2154 | "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz", 2155 | "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=", 2156 | "dev": true 2157 | }, 2158 | "js-yaml": { 2159 | "version": "3.13.1", 2160 | "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", 2161 | "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==", 2162 | "dev": true, 2163 | "requires": { 2164 | "argparse": "^1.0.7", 2165 | "esprima": "^4.0.0" 2166 | } 2167 | }, 2168 | "js2xmlparser": { 2169 | "version": "3.0.0", 2170 | "resolved": "https://registry.npmjs.org/js2xmlparser/-/js2xmlparser-3.0.0.tgz", 2171 | "integrity": "sha1-P7YOqgicVED5MZ9RdgzNB+JJlzM=", 2172 | "dev": true, 2173 | "requires": { 2174 | "xmlcreate": "^1.0.1" 2175 | } 2176 | }, 2177 | "jsesc": { 2178 | "version": "2.5.2", 2179 | "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", 2180 | "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", 2181 | "dev": true 2182 | }, 2183 | "jsonfile": { 2184 | "version": "4.0.0", 2185 | "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", 2186 | "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", 2187 | "dev": true, 2188 | "requires": { 2189 | "graceful-fs": "^4.1.6" 2190 | } 2191 | }, 2192 | "jsonify": { 2193 | "version": "0.0.0", 2194 | "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz", 2195 | "integrity": "sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM=", 2196 | "dev": true 2197 | }, 2198 | "kind-of": { 2199 | "version": "6.0.2", 2200 | "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", 2201 | "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", 2202 | "dev": true 2203 | }, 2204 | "klaw": { 2205 | "version": "2.0.0", 2206 | "resolved": "https://registry.npmjs.org/klaw/-/klaw-2.0.0.tgz", 2207 | "integrity": "sha1-WcEo4Nxc5BAgEVEZTuucv4WGUPY=", 2208 | "dev": true, 2209 | "requires": { 2210 | "graceful-fs": "^4.1.9" 2211 | } 2212 | }, 2213 | "linkify-it": { 2214 | "version": "2.2.0", 2215 | "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-2.2.0.tgz", 2216 | "integrity": "sha512-GnAl/knGn+i1U/wjBz3akz2stz+HrHLsxMwHQGofCDfPvlf+gDKN58UtfmUquTY4/MXeE2x7k19KQmeoZi94Iw==", 2217 | "dev": true, 2218 | "requires": { 2219 | "uc.micro": "^1.0.1" 2220 | } 2221 | }, 2222 | "lodash": { 2223 | "version": "4.17.11", 2224 | "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz", 2225 | "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==", 2226 | "dev": true 2227 | }, 2228 | "magic-string": { 2229 | "version": "0.25.2", 2230 | "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.2.tgz", 2231 | "integrity": "sha512-iLs9mPjh9IuTtRsqqhNGYcZXGei0Nh/A4xirrsqW7c+QhKVFL2vm7U09ru6cHRD22azaP/wMDgI+HCqbETMTtg==", 2232 | "dev": true, 2233 | "requires": { 2234 | "sourcemap-codec": "^1.4.4" 2235 | } 2236 | }, 2237 | "map-cache": { 2238 | "version": "0.2.2", 2239 | "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", 2240 | "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=", 2241 | "dev": true 2242 | }, 2243 | "map-visit": { 2244 | "version": "1.0.0", 2245 | "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", 2246 | "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=", 2247 | "dev": true, 2248 | "requires": { 2249 | "object-visit": "^1.0.0" 2250 | } 2251 | }, 2252 | "markdown-it": { 2253 | "version": "8.3.2", 2254 | "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-8.3.2.tgz", 2255 | "integrity": "sha512-4J92IhJq1kGoyXddwzzfjr9cEKGexBfFsZooKYMhMLLlWa4+dlSPDUUP7y+xQOCebIj61aLmKlowg//YcdPP1w==", 2256 | "dev": true, 2257 | "requires": { 2258 | "argparse": "^1.0.7", 2259 | "entities": "~1.1.1", 2260 | "linkify-it": "^2.0.0", 2261 | "mdurl": "^1.0.1", 2262 | "uc.micro": "^1.0.3" 2263 | } 2264 | }, 2265 | "markdown-it-named-headers": { 2266 | "version": "0.0.4", 2267 | "resolved": "https://registry.npmjs.org/markdown-it-named-headers/-/markdown-it-named-headers-0.0.4.tgz", 2268 | "integrity": "sha1-gu/CgyQkCmsed7mq5QF3HV81HB8=", 2269 | "dev": true, 2270 | "requires": { 2271 | "string": "^3.0.1" 2272 | } 2273 | }, 2274 | "marked": { 2275 | "version": "0.3.19", 2276 | "resolved": "https://registry.npmjs.org/marked/-/marked-0.3.19.tgz", 2277 | "integrity": "sha512-ea2eGWOqNxPcXv8dyERdSr/6FmzvWwzjMxpfGB/sbMccXoct+xY+YukPD+QTUZwyvK7BZwcr4m21WBOW41pAkg==", 2278 | "dev": true 2279 | }, 2280 | "math-random": { 2281 | "version": "1.0.4", 2282 | "resolved": "https://registry.npmjs.org/math-random/-/math-random-1.0.4.tgz", 2283 | "integrity": "sha512-rUxjysqif/BZQH2yhd5Aaq7vXMSx9NdEsQcyA07uEzIvxgI7zIr33gGsh+RU0/XjmQpCW7RsVof1vlkvQVCK5A==", 2284 | "dev": true 2285 | }, 2286 | "mdurl": { 2287 | "version": "1.0.1", 2288 | "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-1.0.1.tgz", 2289 | "integrity": "sha1-/oWy7HWlkDfyrf7BAP1sYBdhFS4=", 2290 | "dev": true 2291 | }, 2292 | "merge-stream": { 2293 | "version": "1.0.1", 2294 | "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-1.0.1.tgz", 2295 | "integrity": "sha1-QEEgLVCKNCugAXQAjfDCUbjBNeE=", 2296 | "dev": true, 2297 | "requires": { 2298 | "readable-stream": "^2.0.1" 2299 | } 2300 | }, 2301 | "micromatch": { 2302 | "version": "3.1.10", 2303 | "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", 2304 | "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", 2305 | "dev": true, 2306 | "requires": { 2307 | "arr-diff": "^4.0.0", 2308 | "array-unique": "^0.3.2", 2309 | "braces": "^2.3.1", 2310 | "define-property": "^2.0.2", 2311 | "extend-shallow": "^3.0.2", 2312 | "extglob": "^2.0.4", 2313 | "fragment-cache": "^0.2.1", 2314 | "kind-of": "^6.0.2", 2315 | "nanomatch": "^1.2.9", 2316 | "object.pick": "^1.3.0", 2317 | "regex-not": "^1.0.0", 2318 | "snapdragon": "^0.8.1", 2319 | "to-regex": "^3.0.2" 2320 | } 2321 | }, 2322 | "minimatch": { 2323 | "version": "3.0.4", 2324 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", 2325 | "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", 2326 | "dev": true, 2327 | "requires": { 2328 | "brace-expansion": "^1.1.7" 2329 | } 2330 | }, 2331 | "minimist": { 2332 | "version": "0.0.8", 2333 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", 2334 | "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", 2335 | "dev": true 2336 | }, 2337 | "mixin-deep": { 2338 | "version": "1.3.1", 2339 | "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.1.tgz", 2340 | "integrity": "sha512-8ZItLHeEgaqEvd5lYBXfm4EZSFCX29Jb9K+lAHhDKzReKBQKj3R+7NOF6tjqYi9t4oI8VUfaWITJQm86wnXGNQ==", 2341 | "dev": true, 2342 | "requires": { 2343 | "for-in": "^1.0.2", 2344 | "is-extendable": "^1.0.1" 2345 | }, 2346 | "dependencies": { 2347 | "is-extendable": { 2348 | "version": "1.0.1", 2349 | "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", 2350 | "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", 2351 | "dev": true, 2352 | "requires": { 2353 | "is-plain-object": "^2.0.4" 2354 | } 2355 | } 2356 | } 2357 | }, 2358 | "mkdirp": { 2359 | "version": "0.5.1", 2360 | "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", 2361 | "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", 2362 | "dev": true, 2363 | "requires": { 2364 | "minimist": "0.0.8" 2365 | } 2366 | }, 2367 | "ms": { 2368 | "version": "2.1.1", 2369 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", 2370 | "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", 2371 | "dev": true 2372 | }, 2373 | "nan": { 2374 | "version": "2.14.0", 2375 | "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.0.tgz", 2376 | "integrity": "sha512-INOFj37C7k3AfaNTtX8RhsTw7qRy7eLET14cROi9+5HAVbbHuIWUHEauBv5qT4Av2tWasiTY1Jw6puUNqRJXQg==", 2377 | "dev": true, 2378 | "optional": true 2379 | }, 2380 | "nanomatch": { 2381 | "version": "1.2.13", 2382 | "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", 2383 | "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", 2384 | "dev": true, 2385 | "requires": { 2386 | "arr-diff": "^4.0.0", 2387 | "array-unique": "^0.3.2", 2388 | "define-property": "^2.0.2", 2389 | "extend-shallow": "^3.0.2", 2390 | "fragment-cache": "^0.2.1", 2391 | "is-windows": "^1.0.2", 2392 | "kind-of": "^6.0.2", 2393 | "object.pick": "^1.3.0", 2394 | "regex-not": "^1.0.0", 2395 | "snapdragon": "^0.8.1", 2396 | "to-regex": "^3.0.1" 2397 | } 2398 | }, 2399 | "normalize-path": { 2400 | "version": "2.1.1", 2401 | "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", 2402 | "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", 2403 | "dev": true, 2404 | "requires": { 2405 | "remove-trailing-separator": "^1.0.1" 2406 | } 2407 | }, 2408 | "normalize-url": { 2409 | "version": "1.9.1", 2410 | "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-1.9.1.tgz", 2411 | "integrity": "sha1-LMDWazHqIwNkWENuNiDYWVTGbDw=", 2412 | "dev": true, 2413 | "requires": { 2414 | "object-assign": "^4.0.1", 2415 | "prepend-http": "^1.0.0", 2416 | "query-string": "^4.1.0", 2417 | "sort-keys": "^1.0.0" 2418 | } 2419 | }, 2420 | "object-assign": { 2421 | "version": "4.1.1", 2422 | "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", 2423 | "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", 2424 | "dev": true 2425 | }, 2426 | "object-copy": { 2427 | "version": "0.1.0", 2428 | "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", 2429 | "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=", 2430 | "dev": true, 2431 | "requires": { 2432 | "copy-descriptor": "^0.1.0", 2433 | "define-property": "^0.2.5", 2434 | "kind-of": "^3.0.3" 2435 | }, 2436 | "dependencies": { 2437 | "define-property": { 2438 | "version": "0.2.5", 2439 | "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", 2440 | "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", 2441 | "dev": true, 2442 | "requires": { 2443 | "is-descriptor": "^0.1.0" 2444 | } 2445 | }, 2446 | "kind-of": { 2447 | "version": "3.2.2", 2448 | "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", 2449 | "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", 2450 | "dev": true, 2451 | "requires": { 2452 | "is-buffer": "^1.1.5" 2453 | } 2454 | } 2455 | } 2456 | }, 2457 | "object-visit": { 2458 | "version": "1.0.1", 2459 | "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", 2460 | "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=", 2461 | "dev": true, 2462 | "requires": { 2463 | "isobject": "^3.0.0" 2464 | } 2465 | }, 2466 | "object.omit": { 2467 | "version": "2.0.1", 2468 | "resolved": "https://registry.npmjs.org/object.omit/-/object.omit-2.0.1.tgz", 2469 | "integrity": "sha1-Gpx0SCnznbuFjHbKNXmuKlTr0fo=", 2470 | "dev": true, 2471 | "requires": { 2472 | "for-own": "^0.1.4", 2473 | "is-extendable": "^0.1.1" 2474 | } 2475 | }, 2476 | "object.pick": { 2477 | "version": "1.3.0", 2478 | "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", 2479 | "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", 2480 | "dev": true, 2481 | "requires": { 2482 | "isobject": "^3.0.1" 2483 | } 2484 | }, 2485 | "once": { 2486 | "version": "1.4.0", 2487 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", 2488 | "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", 2489 | "dev": true, 2490 | "requires": { 2491 | "wrappy": "1" 2492 | } 2493 | }, 2494 | "opn": { 2495 | "version": "5.5.0", 2496 | "resolved": "https://registry.npmjs.org/opn/-/opn-5.5.0.tgz", 2497 | "integrity": "sha512-PqHpggC9bLV0VeWcdKhkpxY+3JTzetLSqTCWL/z/tFIbI6G8JCjondXklT1JinczLz2Xib62sSp0T/gKT4KksA==", 2498 | "dev": true, 2499 | "requires": { 2500 | "is-wsl": "^1.1.0" 2501 | } 2502 | }, 2503 | "parse-glob": { 2504 | "version": "3.0.4", 2505 | "resolved": "https://registry.npmjs.org/parse-glob/-/parse-glob-3.0.4.tgz", 2506 | "integrity": "sha1-ssN2z7EfNVE7rdFz7wu246OIORw=", 2507 | "dev": true, 2508 | "requires": { 2509 | "glob-base": "^0.3.0", 2510 | "is-dotfile": "^1.0.0", 2511 | "is-extglob": "^1.0.0", 2512 | "is-glob": "^2.0.0" 2513 | } 2514 | }, 2515 | "pascalcase": { 2516 | "version": "0.1.1", 2517 | "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", 2518 | "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=", 2519 | "dev": true 2520 | }, 2521 | "path-is-absolute": { 2522 | "version": "1.0.1", 2523 | "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", 2524 | "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", 2525 | "dev": true 2526 | }, 2527 | "path-parse": { 2528 | "version": "1.0.6", 2529 | "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", 2530 | "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==", 2531 | "dev": true 2532 | }, 2533 | "pify": { 2534 | "version": "2.3.0", 2535 | "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", 2536 | "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", 2537 | "dev": true 2538 | }, 2539 | "pinkie": { 2540 | "version": "2.0.4", 2541 | "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", 2542 | "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", 2543 | "dev": true 2544 | }, 2545 | "pinkie-promise": { 2546 | "version": "2.0.1", 2547 | "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", 2548 | "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", 2549 | "dev": true, 2550 | "requires": { 2551 | "pinkie": "^2.0.0" 2552 | } 2553 | }, 2554 | "posix-character-classes": { 2555 | "version": "0.1.1", 2556 | "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", 2557 | "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=", 2558 | "dev": true 2559 | }, 2560 | "prepend-http": { 2561 | "version": "1.0.4", 2562 | "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz", 2563 | "integrity": "sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw=", 2564 | "dev": true 2565 | }, 2566 | "preserve": { 2567 | "version": "0.2.0", 2568 | "resolved": "https://registry.npmjs.org/preserve/-/preserve-0.2.0.tgz", 2569 | "integrity": "sha1-gV7R9uvGWSb4ZbMQwHE7yzMVzks=", 2570 | "dev": true 2571 | }, 2572 | "process-nextick-args": { 2573 | "version": "2.0.0", 2574 | "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", 2575 | "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==", 2576 | "dev": true 2577 | }, 2578 | "prototype-minify": { 2579 | "version": "1.0.5", 2580 | "resolved": "https://registry.npmjs.org/prototype-minify/-/prototype-minify-1.0.5.tgz", 2581 | "integrity": "sha512-Ftp1ZRixf3OxZlJ+OaP9Jfm7UWAXIwCTNLuUiqwQA/18hVanSv0rJ103ek/h8E/hcKtW9BRsLi9syAwzDIJkOg==", 2582 | "dev": true, 2583 | "requires": { 2584 | "@babel/generator": "^7.1.2", 2585 | "@babel/parser": "^7.1.2", 2586 | "@babel/traverse": "^7.1.0", 2587 | "@babel/types": "^7.1.2" 2588 | } 2589 | }, 2590 | "query-string": { 2591 | "version": "4.3.4", 2592 | "resolved": "https://registry.npmjs.org/query-string/-/query-string-4.3.4.tgz", 2593 | "integrity": "sha1-u7aTucqRXCMlFbIosaArYJBD2+s=", 2594 | "dev": true, 2595 | "requires": { 2596 | "object-assign": "^4.1.0", 2597 | "strict-uri-encode": "^1.0.0" 2598 | } 2599 | }, 2600 | "randomatic": { 2601 | "version": "3.1.1", 2602 | "resolved": "https://registry.npmjs.org/randomatic/-/randomatic-3.1.1.tgz", 2603 | "integrity": "sha512-TuDE5KxZ0J461RVjrJZCJc+J+zCkTb1MbH9AQUq68sMhOMcy9jLcb3BrZKgp9q9Ncltdg4QVqWrH02W2EFFVYw==", 2604 | "dev": true, 2605 | "requires": { 2606 | "is-number": "^4.0.0", 2607 | "kind-of": "^6.0.0", 2608 | "math-random": "^1.0.1" 2609 | }, 2610 | "dependencies": { 2611 | "is-number": { 2612 | "version": "4.0.0", 2613 | "resolved": "https://registry.npmjs.org/is-number/-/is-number-4.0.0.tgz", 2614 | "integrity": "sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ==", 2615 | "dev": true 2616 | } 2617 | } 2618 | }, 2619 | "readable-stream": { 2620 | "version": "2.3.6", 2621 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", 2622 | "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", 2623 | "dev": true, 2624 | "requires": { 2625 | "core-util-is": "~1.0.0", 2626 | "inherits": "~2.0.3", 2627 | "isarray": "~1.0.0", 2628 | "process-nextick-args": "~2.0.0", 2629 | "safe-buffer": "~5.1.1", 2630 | "string_decoder": "~1.1.1", 2631 | "util-deprecate": "~1.0.1" 2632 | }, 2633 | "dependencies": { 2634 | "isarray": { 2635 | "version": "1.0.0", 2636 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", 2637 | "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", 2638 | "dev": true 2639 | } 2640 | } 2641 | }, 2642 | "readdirp": { 2643 | "version": "2.2.1", 2644 | "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz", 2645 | "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==", 2646 | "dev": true, 2647 | "requires": { 2648 | "graceful-fs": "^4.1.11", 2649 | "micromatch": "^3.1.10", 2650 | "readable-stream": "^2.0.2" 2651 | } 2652 | }, 2653 | "reflect-metadata": { 2654 | "version": "0.1.13", 2655 | "resolved": "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.1.13.tgz", 2656 | "integrity": "sha512-Ts1Y/anZELhSsjMcU605fU9RE4Oi3p5ORujwbIKXfWa+0Zxs510Qrmrce5/Jowq3cHSZSJqBjypxmHarc+vEWg==", 2657 | "dev": true 2658 | }, 2659 | "regenerator-runtime": { 2660 | "version": "0.11.1", 2661 | "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", 2662 | "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==", 2663 | "dev": true 2664 | }, 2665 | "regex-cache": { 2666 | "version": "0.4.4", 2667 | "resolved": "https://registry.npmjs.org/regex-cache/-/regex-cache-0.4.4.tgz", 2668 | "integrity": "sha512-nVIZwtCjkC9YgvWkpM55B5rBhBYRZhAaJbgcFYXXsHnbZ9UZI9nnVWYZpBlCqv9ho2eZryPnWrZGsOdPwVWXWQ==", 2669 | "dev": true, 2670 | "requires": { 2671 | "is-equal-shallow": "^0.1.3" 2672 | } 2673 | }, 2674 | "regex-not": { 2675 | "version": "1.0.2", 2676 | "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", 2677 | "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", 2678 | "dev": true, 2679 | "requires": { 2680 | "extend-shallow": "^3.0.2", 2681 | "safe-regex": "^1.1.0" 2682 | } 2683 | }, 2684 | "remove-trailing-separator": { 2685 | "version": "1.1.0", 2686 | "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", 2687 | "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=", 2688 | "dev": true 2689 | }, 2690 | "repeat-element": { 2691 | "version": "1.1.3", 2692 | "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.3.tgz", 2693 | "integrity": "sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g==", 2694 | "dev": true 2695 | }, 2696 | "repeat-string": { 2697 | "version": "1.6.1", 2698 | "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", 2699 | "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", 2700 | "dev": true 2701 | }, 2702 | "requizzle": { 2703 | "version": "0.2.3", 2704 | "resolved": "https://registry.npmjs.org/requizzle/-/requizzle-0.2.3.tgz", 2705 | "integrity": "sha512-YanoyJjykPxGHii0fZP0uUPEXpvqfBDxWV7s6GKAiiOsiqhX6vHNyW3Qzdmqp/iq/ExbhaGbVrjB4ruEVSM4GQ==", 2706 | "dev": true, 2707 | "requires": { 2708 | "lodash": "^4.17.14" 2709 | }, 2710 | "dependencies": { 2711 | "lodash": { 2712 | "version": "4.17.15", 2713 | "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", 2714 | "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==", 2715 | "dev": true 2716 | } 2717 | } 2718 | }, 2719 | "resolve": { 2720 | "version": "1.10.0", 2721 | "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.10.0.tgz", 2722 | "integrity": "sha512-3sUr9aq5OfSg2S9pNtPA9hL1FVEAjvfOC4leW0SNf/mpnaakz2a9femSd6LqAww2RaFctwyf1lCqnTHuF1rxDg==", 2723 | "dev": true, 2724 | "requires": { 2725 | "path-parse": "^1.0.6" 2726 | } 2727 | }, 2728 | "resolve-url": { 2729 | "version": "0.2.1", 2730 | "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", 2731 | "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=", 2732 | "dev": true 2733 | }, 2734 | "ret": { 2735 | "version": "0.1.15", 2736 | "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", 2737 | "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==", 2738 | "dev": true 2739 | }, 2740 | "rimraf": { 2741 | "version": "2.6.3", 2742 | "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", 2743 | "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", 2744 | "dev": true, 2745 | "requires": { 2746 | "glob": "^7.1.3" 2747 | } 2748 | }, 2749 | "rollup": { 2750 | "version": "1.10.1", 2751 | "resolved": "https://registry.npmjs.org/rollup/-/rollup-1.10.1.tgz", 2752 | "integrity": "sha512-pW353tmBE7QP622ITkGxtqF0d5gSRCVPD9xqM+fcPjudeZfoXMFW2sCzsTe2TU/zU1xamIjiS9xuFCPVT9fESw==", 2753 | "dev": true, 2754 | "requires": { 2755 | "@types/estree": "0.0.39", 2756 | "@types/node": "^11.13.5", 2757 | "acorn": "^6.1.1" 2758 | } 2759 | }, 2760 | "rollup-plugin-commonjs": { 2761 | "version": "9.3.4", 2762 | "resolved": "https://registry.npmjs.org/rollup-plugin-commonjs/-/rollup-plugin-commonjs-9.3.4.tgz", 2763 | "integrity": "sha512-DTZOvRoiVIHHLFBCL4pFxOaJt8pagxsVldEXBOn6wl3/V21wVaj17HFfyzTsQUuou3sZL3lEJZVWKPFblJfI6w==", 2764 | "dev": true, 2765 | "requires": { 2766 | "estree-walker": "^0.6.0", 2767 | "magic-string": "^0.25.2", 2768 | "resolve": "^1.10.0", 2769 | "rollup-pluginutils": "^2.6.0" 2770 | } 2771 | }, 2772 | "rollup-plugin-node-resolve": { 2773 | "version": "4.2.3", 2774 | "resolved": "https://registry.npmjs.org/rollup-plugin-node-resolve/-/rollup-plugin-node-resolve-4.2.3.tgz", 2775 | "integrity": "sha512-r+WaesPzdGEynpLZLALFEDugA4ACa5zn7bc/+LVX4vAXQQ8IgDHv0xfsSvJ8tDXUtprfBtrDtRFg27ifKjcJTg==", 2776 | "dev": true, 2777 | "requires": { 2778 | "@types/resolve": "0.0.8", 2779 | "builtin-modules": "^3.1.0", 2780 | "is-module": "^1.0.0", 2781 | "resolve": "^1.10.0" 2782 | }, 2783 | "dependencies": { 2784 | "builtin-modules": { 2785 | "version": "3.1.0", 2786 | "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-3.1.0.tgz", 2787 | "integrity": "sha512-k0KL0aWZuBt2lrxrcASWDfwOLMnodeQjodT/1SxEQAXsHANgo6ZC/VEaSEHCXt7aSTZ4/4H5LKa+tBXmW7Vtvw==", 2788 | "dev": true 2789 | } 2790 | } 2791 | }, 2792 | "rollup-plugin-prototype-minify": { 2793 | "version": "1.0.5", 2794 | "resolved": "https://registry.npmjs.org/rollup-plugin-prototype-minify/-/rollup-plugin-prototype-minify-1.0.5.tgz", 2795 | "integrity": "sha512-3qeEFacOSjhoyByz53E7iBuK8roWrKVnWqHM1pOj600+0NX80/exxxH3QBY4Zj4YdMeGVk9SlA4lnNe13g2whQ==", 2796 | "dev": true, 2797 | "requires": { 2798 | "prototype-minify": "^1.0.0" 2799 | } 2800 | }, 2801 | "rollup-plugin-replace": { 2802 | "version": "2.2.0", 2803 | "resolved": "https://registry.npmjs.org/rollup-plugin-replace/-/rollup-plugin-replace-2.2.0.tgz", 2804 | "integrity": "sha512-/5bxtUPkDHyBJAKketb4NfaeZjL5yLZdeUihSfbF2PQMz+rSTEb8ARKoOl3UBT4m7/X+QOXJo3sLTcq+yMMYTA==", 2805 | "dev": true, 2806 | "requires": { 2807 | "magic-string": "^0.25.2", 2808 | "rollup-pluginutils": "^2.6.0" 2809 | } 2810 | }, 2811 | "rollup-plugin-typescript": { 2812 | "version": "1.0.1", 2813 | "resolved": "https://registry.npmjs.org/rollup-plugin-typescript/-/rollup-plugin-typescript-1.0.1.tgz", 2814 | "integrity": "sha512-rwJDNn9jv/NsKZuyBb/h0jsclP4CJ58qbvZt2Q9zDIGILF2LtdtvCqMOL+Gq9IVq5MTrTlHZNrn8h7VjQgd8tw==", 2815 | "dev": true, 2816 | "requires": { 2817 | "resolve": "^1.10.0", 2818 | "rollup-pluginutils": "^2.5.0" 2819 | } 2820 | }, 2821 | "rollup-plugin-uglify": { 2822 | "version": "6.0.2", 2823 | "resolved": "https://registry.npmjs.org/rollup-plugin-uglify/-/rollup-plugin-uglify-6.0.2.tgz", 2824 | "integrity": "sha512-qwz2Tryspn5QGtPUowq5oumKSxANKdrnfz7C0jm4lKxvRDsNe/hSGsB9FntUul7UeC4TsZEWKErVgE1qWSO0gw==", 2825 | "dev": true, 2826 | "requires": { 2827 | "@babel/code-frame": "^7.0.0", 2828 | "jest-worker": "^24.0.0", 2829 | "serialize-javascript": "^1.6.1", 2830 | "uglify-js": "^3.4.9" 2831 | } 2832 | }, 2833 | "rollup-plugin-visualizer": { 2834 | "version": "1.1.1", 2835 | "resolved": "https://registry.npmjs.org/rollup-plugin-visualizer/-/rollup-plugin-visualizer-1.1.1.tgz", 2836 | "integrity": "sha512-7xkSKp+dyJmSC7jg2LXqViaHuOnF1VvIFCnsZEKjrgT5ZVyiLLSbeszxFcQSfNJILphqgAEmWAUz0Z4xYScrRw==", 2837 | "dev": true, 2838 | "requires": { 2839 | "mkdirp": "^0.5.1", 2840 | "opn": "^5.4.0", 2841 | "source-map": "^0.7.3", 2842 | "typeface-oswald": "0.0.54" 2843 | }, 2844 | "dependencies": { 2845 | "source-map": { 2846 | "version": "0.7.3", 2847 | "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", 2848 | "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==", 2849 | "dev": true 2850 | } 2851 | } 2852 | }, 2853 | "rollup-pluginutils": { 2854 | "version": "2.6.0", 2855 | "resolved": "https://registry.npmjs.org/rollup-pluginutils/-/rollup-pluginutils-2.6.0.tgz", 2856 | "integrity": "sha512-aGQwspEF8oPKvg37u3p7h0cYNwmJR1sCBMZGZ5b9qy8HGtETknqjzcxrDRrcAnJNXN18lBH4Q9vZYth/p4n8jQ==", 2857 | "dev": true, 2858 | "requires": { 2859 | "estree-walker": "^0.6.0", 2860 | "micromatch": "^3.1.10" 2861 | } 2862 | }, 2863 | "safe-buffer": { 2864 | "version": "5.1.2", 2865 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", 2866 | "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", 2867 | "dev": true 2868 | }, 2869 | "safe-regex": { 2870 | "version": "1.1.0", 2871 | "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", 2872 | "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", 2873 | "dev": true, 2874 | "requires": { 2875 | "ret": "~0.1.10" 2876 | } 2877 | }, 2878 | "semver": { 2879 | "version": "5.7.0", 2880 | "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.0.tgz", 2881 | "integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA==", 2882 | "dev": true 2883 | }, 2884 | "serialize-javascript": { 2885 | "version": "1.7.0", 2886 | "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-1.7.0.tgz", 2887 | "integrity": "sha512-ke8UG8ulpFOxO8f8gRYabHQe/ZntKlcig2Mp+8+URDP1D8vJZ0KUt7LYo07q25Z/+JVSgpr/cui9PIp5H6/+nA==", 2888 | "dev": true 2889 | }, 2890 | "set-value": { 2891 | "version": "2.0.0", 2892 | "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.0.tgz", 2893 | "integrity": "sha512-hw0yxk9GT/Hr5yJEYnHNKYXkIA8mVJgd9ditYZCe16ZczcaELYYcfvaXesNACk2O8O0nTiPQcQhGUQj8JLzeeg==", 2894 | "dev": true, 2895 | "requires": { 2896 | "extend-shallow": "^2.0.1", 2897 | "is-extendable": "^0.1.1", 2898 | "is-plain-object": "^2.0.3", 2899 | "split-string": "^3.0.1" 2900 | }, 2901 | "dependencies": { 2902 | "extend-shallow": { 2903 | "version": "2.0.1", 2904 | "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", 2905 | "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", 2906 | "dev": true, 2907 | "requires": { 2908 | "is-extendable": "^0.1.0" 2909 | } 2910 | } 2911 | } 2912 | }, 2913 | "shell-quote": { 2914 | "version": "1.6.1", 2915 | "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.6.1.tgz", 2916 | "integrity": "sha1-9HgZSczkAmlxJ0MOo7PFR29IF2c=", 2917 | "dev": true, 2918 | "requires": { 2919 | "array-filter": "~0.0.0", 2920 | "array-map": "~0.0.0", 2921 | "array-reduce": "~0.0.0", 2922 | "jsonify": "~0.0.0" 2923 | } 2924 | }, 2925 | "snapdragon": { 2926 | "version": "0.8.2", 2927 | "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", 2928 | "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", 2929 | "dev": true, 2930 | "requires": { 2931 | "base": "^0.11.1", 2932 | "debug": "^2.2.0", 2933 | "define-property": "^0.2.5", 2934 | "extend-shallow": "^2.0.1", 2935 | "map-cache": "^0.2.2", 2936 | "source-map": "^0.5.6", 2937 | "source-map-resolve": "^0.5.0", 2938 | "use": "^3.1.0" 2939 | }, 2940 | "dependencies": { 2941 | "debug": { 2942 | "version": "2.6.9", 2943 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", 2944 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", 2945 | "dev": true, 2946 | "requires": { 2947 | "ms": "2.0.0" 2948 | } 2949 | }, 2950 | "define-property": { 2951 | "version": "0.2.5", 2952 | "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", 2953 | "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", 2954 | "dev": true, 2955 | "requires": { 2956 | "is-descriptor": "^0.1.0" 2957 | } 2958 | }, 2959 | "extend-shallow": { 2960 | "version": "2.0.1", 2961 | "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", 2962 | "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", 2963 | "dev": true, 2964 | "requires": { 2965 | "is-extendable": "^0.1.0" 2966 | } 2967 | }, 2968 | "ms": { 2969 | "version": "2.0.0", 2970 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", 2971 | "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", 2972 | "dev": true 2973 | } 2974 | } 2975 | }, 2976 | "snapdragon-node": { 2977 | "version": "2.1.1", 2978 | "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz", 2979 | "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", 2980 | "dev": true, 2981 | "requires": { 2982 | "define-property": "^1.0.0", 2983 | "isobject": "^3.0.0", 2984 | "snapdragon-util": "^3.0.1" 2985 | }, 2986 | "dependencies": { 2987 | "define-property": { 2988 | "version": "1.0.0", 2989 | "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", 2990 | "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", 2991 | "dev": true, 2992 | "requires": { 2993 | "is-descriptor": "^1.0.0" 2994 | } 2995 | }, 2996 | "is-accessor-descriptor": { 2997 | "version": "1.0.0", 2998 | "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", 2999 | "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", 3000 | "dev": true, 3001 | "requires": { 3002 | "kind-of": "^6.0.0" 3003 | } 3004 | }, 3005 | "is-data-descriptor": { 3006 | "version": "1.0.0", 3007 | "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", 3008 | "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", 3009 | "dev": true, 3010 | "requires": { 3011 | "kind-of": "^6.0.0" 3012 | } 3013 | }, 3014 | "is-descriptor": { 3015 | "version": "1.0.2", 3016 | "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", 3017 | "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", 3018 | "dev": true, 3019 | "requires": { 3020 | "is-accessor-descriptor": "^1.0.0", 3021 | "is-data-descriptor": "^1.0.0", 3022 | "kind-of": "^6.0.2" 3023 | } 3024 | } 3025 | } 3026 | }, 3027 | "snapdragon-util": { 3028 | "version": "3.0.1", 3029 | "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", 3030 | "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", 3031 | "dev": true, 3032 | "requires": { 3033 | "kind-of": "^3.2.0" 3034 | }, 3035 | "dependencies": { 3036 | "kind-of": { 3037 | "version": "3.2.2", 3038 | "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", 3039 | "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", 3040 | "dev": true, 3041 | "requires": { 3042 | "is-buffer": "^1.1.5" 3043 | } 3044 | } 3045 | } 3046 | }, 3047 | "sort-keys": { 3048 | "version": "1.1.2", 3049 | "resolved": "https://registry.npmjs.org/sort-keys/-/sort-keys-1.1.2.tgz", 3050 | "integrity": "sha1-RBttTTRnmPG05J6JIK37oOVD+a0=", 3051 | "dev": true, 3052 | "requires": { 3053 | "is-plain-obj": "^1.0.0" 3054 | } 3055 | }, 3056 | "source-map": { 3057 | "version": "0.5.7", 3058 | "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", 3059 | "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", 3060 | "dev": true 3061 | }, 3062 | "source-map-resolve": { 3063 | "version": "0.5.2", 3064 | "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.2.tgz", 3065 | "integrity": "sha512-MjqsvNwyz1s0k81Goz/9vRBe9SZdB09Bdw+/zYyO+3CuPk6fouTaxscHkgtE8jKvf01kVfl8riHzERQ/kefaSA==", 3066 | "dev": true, 3067 | "requires": { 3068 | "atob": "^2.1.1", 3069 | "decode-uri-component": "^0.2.0", 3070 | "resolve-url": "^0.2.1", 3071 | "source-map-url": "^0.4.0", 3072 | "urix": "^0.1.0" 3073 | } 3074 | }, 3075 | "source-map-url": { 3076 | "version": "0.4.0", 3077 | "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz", 3078 | "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=", 3079 | "dev": true 3080 | }, 3081 | "sourcemap-codec": { 3082 | "version": "1.4.4", 3083 | "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.4.tgz", 3084 | "integrity": "sha512-CYAPYdBu34781kLHkaW3m6b/uUSyMOC2R61gcYMWooeuaGtjof86ZA/8T+qVPPt7np1085CR9hmMGrySwEc8Xg==", 3085 | "dev": true 3086 | }, 3087 | "split-string": { 3088 | "version": "3.1.0", 3089 | "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", 3090 | "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", 3091 | "dev": true, 3092 | "requires": { 3093 | "extend-shallow": "^3.0.0" 3094 | } 3095 | }, 3096 | "sprintf-js": { 3097 | "version": "1.0.3", 3098 | "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", 3099 | "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", 3100 | "dev": true 3101 | }, 3102 | "static-extend": { 3103 | "version": "0.1.2", 3104 | "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", 3105 | "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=", 3106 | "dev": true, 3107 | "requires": { 3108 | "define-property": "^0.2.5", 3109 | "object-copy": "^0.1.0" 3110 | }, 3111 | "dependencies": { 3112 | "define-property": { 3113 | "version": "0.2.5", 3114 | "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", 3115 | "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", 3116 | "dev": true, 3117 | "requires": { 3118 | "is-descriptor": "^0.1.0" 3119 | } 3120 | } 3121 | } 3122 | }, 3123 | "strict-uri-encode": { 3124 | "version": "1.1.0", 3125 | "resolved": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz", 3126 | "integrity": "sha1-J5siXfHVgrH1TmWt3UNS4Y+qBxM=", 3127 | "dev": true 3128 | }, 3129 | "string": { 3130 | "version": "3.3.3", 3131 | "resolved": "https://registry.npmjs.org/string/-/string-3.3.3.tgz", 3132 | "integrity": "sha1-XqIRzZLSKOGEKUmQpsyXs2anfLA=", 3133 | "dev": true 3134 | }, 3135 | "string_decoder": { 3136 | "version": "1.1.1", 3137 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", 3138 | "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", 3139 | "dev": true, 3140 | "requires": { 3141 | "safe-buffer": "~5.1.0" 3142 | } 3143 | }, 3144 | "strip-ansi": { 3145 | "version": "3.0.1", 3146 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", 3147 | "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", 3148 | "dev": true, 3149 | "requires": { 3150 | "ansi-regex": "^2.0.0" 3151 | } 3152 | }, 3153 | "strip-json-comments": { 3154 | "version": "2.0.1", 3155 | "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", 3156 | "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", 3157 | "dev": true 3158 | }, 3159 | "strip-outer": { 3160 | "version": "1.0.1", 3161 | "resolved": "https://registry.npmjs.org/strip-outer/-/strip-outer-1.0.1.tgz", 3162 | "integrity": "sha512-k55yxKHwaXnpYGsOzg4Vl8+tDrWylxDEpknGjhTiZB8dFRU5rTo9CAzeycivxV3s+zlTKwrs6WxMxR95n26kwg==", 3163 | "dev": true, 3164 | "requires": { 3165 | "escape-string-regexp": "^1.0.2" 3166 | } 3167 | }, 3168 | "strip-url-auth": { 3169 | "version": "1.0.1", 3170 | "resolved": "https://registry.npmjs.org/strip-url-auth/-/strip-url-auth-1.0.1.tgz", 3171 | "integrity": "sha1-IrD6OkE4WzO+PzMVUbu4N/oM164=", 3172 | "dev": true 3173 | }, 3174 | "subarg": { 3175 | "version": "1.0.0", 3176 | "resolved": "https://registry.npmjs.org/subarg/-/subarg-1.0.0.tgz", 3177 | "integrity": "sha1-9izxdYHplrSPyWVpn1TAauJouNI=", 3178 | "dev": true, 3179 | "requires": { 3180 | "minimist": "^1.1.0" 3181 | }, 3182 | "dependencies": { 3183 | "minimist": { 3184 | "version": "1.2.0", 3185 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", 3186 | "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", 3187 | "dev": true 3188 | } 3189 | } 3190 | }, 3191 | "supports-color": { 3192 | "version": "2.0.0", 3193 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", 3194 | "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", 3195 | "dev": true 3196 | }, 3197 | "taffydb": { 3198 | "version": "2.6.2", 3199 | "resolved": "https://registry.npmjs.org/taffydb/-/taffydb-2.6.2.tgz", 3200 | "integrity": "sha1-fLy2S1oUG2ou/CxdLGe04VCyomg=", 3201 | "dev": true 3202 | }, 3203 | "to-fast-properties": { 3204 | "version": "2.0.0", 3205 | "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", 3206 | "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", 3207 | "dev": true 3208 | }, 3209 | "to-object-path": { 3210 | "version": "0.3.0", 3211 | "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", 3212 | "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=", 3213 | "dev": true, 3214 | "requires": { 3215 | "kind-of": "^3.0.2" 3216 | }, 3217 | "dependencies": { 3218 | "kind-of": { 3219 | "version": "3.2.2", 3220 | "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", 3221 | "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", 3222 | "dev": true, 3223 | "requires": { 3224 | "is-buffer": "^1.1.5" 3225 | } 3226 | } 3227 | } 3228 | }, 3229 | "to-regex": { 3230 | "version": "3.0.2", 3231 | "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", 3232 | "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", 3233 | "dev": true, 3234 | "requires": { 3235 | "define-property": "^2.0.2", 3236 | "extend-shallow": "^3.0.2", 3237 | "regex-not": "^1.0.2", 3238 | "safe-regex": "^1.1.0" 3239 | } 3240 | }, 3241 | "to-regex-range": { 3242 | "version": "2.1.1", 3243 | "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", 3244 | "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", 3245 | "dev": true, 3246 | "requires": { 3247 | "is-number": "^3.0.0", 3248 | "repeat-string": "^1.6.1" 3249 | } 3250 | }, 3251 | "trim-repeated": { 3252 | "version": "1.0.0", 3253 | "resolved": "https://registry.npmjs.org/trim-repeated/-/trim-repeated-1.0.0.tgz", 3254 | "integrity": "sha1-42RqLqTokTEr9+rObPsFOAvAHCE=", 3255 | "dev": true, 3256 | "requires": { 3257 | "escape-string-regexp": "^1.0.2" 3258 | } 3259 | }, 3260 | "trim-right": { 3261 | "version": "1.0.1", 3262 | "resolved": "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz", 3263 | "integrity": "sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM=", 3264 | "dev": true 3265 | }, 3266 | "tslib": { 3267 | "version": "1.9.3", 3268 | "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.9.3.tgz", 3269 | "integrity": "sha512-4krF8scpejhaOgqzBEcGM7yDIEfi0/8+8zDRZhNZZ2kjmHJ4hv3zCbQWxoJGz1iw5U0Jl0nma13xzHXcncMavQ==", 3270 | "dev": true 3271 | }, 3272 | "tslint": { 3273 | "version": "5.15.0", 3274 | "resolved": "https://registry.npmjs.org/tslint/-/tslint-5.15.0.tgz", 3275 | "integrity": "sha512-6bIEujKR21/3nyeoX2uBnE8s+tMXCQXhqMmaIPJpHmXJoBJPTLcI7/VHRtUwMhnLVdwLqqY3zmd8Dxqa5CVdJA==", 3276 | "dev": true, 3277 | "requires": { 3278 | "babel-code-frame": "^6.22.0", 3279 | "builtin-modules": "^1.1.1", 3280 | "chalk": "^2.3.0", 3281 | "commander": "^2.12.1", 3282 | "diff": "^3.2.0", 3283 | "glob": "^7.1.1", 3284 | "js-yaml": "^3.13.0", 3285 | "minimatch": "^3.0.4", 3286 | "mkdirp": "^0.5.1", 3287 | "resolve": "^1.3.2", 3288 | "semver": "^5.3.0", 3289 | "tslib": "^1.8.0", 3290 | "tsutils": "^2.29.0" 3291 | } 3292 | }, 3293 | "tslint-consistent-codestyle": { 3294 | "version": "1.15.1", 3295 | "resolved": "https://registry.npmjs.org/tslint-consistent-codestyle/-/tslint-consistent-codestyle-1.15.1.tgz", 3296 | "integrity": "sha512-38Y3Dz4zcABe/PlPAQSGNEWPGVq0OzcIQR7SEU6dNujp/SgvhxhJOhIhI9gY4r0I3/TNtvVQwARWor9O9LPZWg==", 3297 | "dev": true, 3298 | "requires": { 3299 | "@fimbul/bifrost": "^0.17.0", 3300 | "tslib": "^1.7.1", 3301 | "tsutils": "^2.29.0" 3302 | } 3303 | }, 3304 | "tslint-eslint-rules": { 3305 | "version": "5.4.0", 3306 | "resolved": "https://registry.npmjs.org/tslint-eslint-rules/-/tslint-eslint-rules-5.4.0.tgz", 3307 | "integrity": "sha512-WlSXE+J2vY/VPgIcqQuijMQiel+UtmXS+4nvK4ZzlDiqBfXse8FAvkNnTcYhnQyOTW5KFM+uRRGXxYhFpuBc6w==", 3308 | "dev": true, 3309 | "requires": { 3310 | "doctrine": "0.7.2", 3311 | "tslib": "1.9.0", 3312 | "tsutils": "^3.0.0" 3313 | }, 3314 | "dependencies": { 3315 | "tslib": { 3316 | "version": "1.9.0", 3317 | "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.9.0.tgz", 3318 | "integrity": "sha512-f/qGG2tUkrISBlQZEjEqoZ3B2+npJjIf04H1wuAv9iA8i04Icp+61KRXxFdha22670NJopsZCIjhC3SnjPRKrQ==", 3319 | "dev": true 3320 | }, 3321 | "tsutils": { 3322 | "version": "3.10.0", 3323 | "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.10.0.tgz", 3324 | "integrity": "sha512-q20XSMq7jutbGB8luhKKsQldRKWvyBO2BGqni3p4yq8Ys9bEP/xQw3KepKmMRt9gJ4lvQSScrihJrcKdKoSU7Q==", 3325 | "dev": true, 3326 | "requires": { 3327 | "tslib": "^1.8.1" 3328 | } 3329 | } 3330 | } 3331 | }, 3332 | "tsutils": { 3333 | "version": "2.29.0", 3334 | "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-2.29.0.tgz", 3335 | "integrity": "sha512-g5JVHCIJwzfISaXpXE1qvNalca5Jwob6FjI4AoPlqMusJ6ftFE7IkkFoMhVLRgK+4Kx3gkzb8UZK5t5yTTvEmA==", 3336 | "dev": true, 3337 | "requires": { 3338 | "tslib": "^1.8.1" 3339 | } 3340 | }, 3341 | "typeface-oswald": { 3342 | "version": "0.0.54", 3343 | "resolved": "https://registry.npmjs.org/typeface-oswald/-/typeface-oswald-0.0.54.tgz", 3344 | "integrity": "sha512-U1WMNp4qfy4/3khIfHMVAIKnNu941MXUfs3+H9R8PFgnoz42Hh9pboSFztWr86zut0eXC8byalmVhfkiKON/8Q==", 3345 | "dev": true 3346 | }, 3347 | "typescript": { 3348 | "version": "3.4.3", 3349 | "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.4.3.tgz", 3350 | "integrity": "sha512-FFgHdPt4T/duxx6Ndf7hwgMZZjZpB+U0nMNGVCYPq0rEzWKjEDobm4J6yb3CS7naZ0yURFqdw9Gwc7UOh/P9oQ==", 3351 | "dev": true 3352 | }, 3353 | "uc.micro": { 3354 | "version": "1.0.6", 3355 | "resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-1.0.6.tgz", 3356 | "integrity": "sha512-8Y75pvTYkLJW2hWQHXxoqRgV7qb9B+9vFEtidML+7koHUFapnVJAZ6cKs+Qjz5Aw3aZWHMC6u0wJE3At+nSGwA==", 3357 | "dev": true 3358 | }, 3359 | "uglify-js": { 3360 | "version": "3.5.9", 3361 | "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.5.9.tgz", 3362 | "integrity": "sha512-WpT0RqsDtAWPNJK955DEnb6xjymR8Fn0OlK4TT4pS0ASYsVPqr5ELhgwOwLCP5J5vHeJ4xmMmz3DEgdqC10JeQ==", 3363 | "dev": true, 3364 | "requires": { 3365 | "commander": "~2.20.0", 3366 | "source-map": "~0.6.1" 3367 | }, 3368 | "dependencies": { 3369 | "source-map": { 3370 | "version": "0.6.1", 3371 | "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", 3372 | "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", 3373 | "dev": true 3374 | } 3375 | } 3376 | }, 3377 | "underscore": { 3378 | "version": "1.8.3", 3379 | "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.8.3.tgz", 3380 | "integrity": "sha1-Tz+1OxBuYJf8+ctBCfKl6b36UCI=", 3381 | "dev": true 3382 | }, 3383 | "union-value": { 3384 | "version": "1.0.0", 3385 | "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.0.tgz", 3386 | "integrity": "sha1-XHHDTLW61dzr4+oM0IIHulqhrqQ=", 3387 | "dev": true, 3388 | "requires": { 3389 | "arr-union": "^3.1.0", 3390 | "get-value": "^2.0.6", 3391 | "is-extendable": "^0.1.1", 3392 | "set-value": "^0.4.3" 3393 | }, 3394 | "dependencies": { 3395 | "extend-shallow": { 3396 | "version": "2.0.1", 3397 | "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", 3398 | "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", 3399 | "dev": true, 3400 | "requires": { 3401 | "is-extendable": "^0.1.0" 3402 | } 3403 | }, 3404 | "set-value": { 3405 | "version": "0.4.3", 3406 | "resolved": "https://registry.npmjs.org/set-value/-/set-value-0.4.3.tgz", 3407 | "integrity": "sha1-fbCPnT0i3H945Trzw79GZuzfzPE=", 3408 | "dev": true, 3409 | "requires": { 3410 | "extend-shallow": "^2.0.1", 3411 | "is-extendable": "^0.1.1", 3412 | "is-plain-object": "^2.0.1", 3413 | "to-object-path": "^0.3.0" 3414 | } 3415 | } 3416 | } 3417 | }, 3418 | "universalify": { 3419 | "version": "0.1.2", 3420 | "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", 3421 | "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", 3422 | "dev": true 3423 | }, 3424 | "unset-value": { 3425 | "version": "1.0.0", 3426 | "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", 3427 | "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=", 3428 | "dev": true, 3429 | "requires": { 3430 | "has-value": "^0.3.1", 3431 | "isobject": "^3.0.0" 3432 | }, 3433 | "dependencies": { 3434 | "has-value": { 3435 | "version": "0.3.1", 3436 | "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", 3437 | "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", 3438 | "dev": true, 3439 | "requires": { 3440 | "get-value": "^2.0.3", 3441 | "has-values": "^0.1.4", 3442 | "isobject": "^2.0.0" 3443 | }, 3444 | "dependencies": { 3445 | "isobject": { 3446 | "version": "2.1.0", 3447 | "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", 3448 | "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", 3449 | "dev": true, 3450 | "requires": { 3451 | "isarray": "1.0.0" 3452 | } 3453 | } 3454 | } 3455 | }, 3456 | "has-values": { 3457 | "version": "0.1.4", 3458 | "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", 3459 | "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=", 3460 | "dev": true 3461 | }, 3462 | "isarray": { 3463 | "version": "1.0.0", 3464 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", 3465 | "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", 3466 | "dev": true 3467 | } 3468 | } 3469 | }, 3470 | "urix": { 3471 | "version": "0.1.0", 3472 | "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", 3473 | "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=", 3474 | "dev": true 3475 | }, 3476 | "use": { 3477 | "version": "3.1.1", 3478 | "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", 3479 | "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==", 3480 | "dev": true 3481 | }, 3482 | "util-deprecate": { 3483 | "version": "1.0.2", 3484 | "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", 3485 | "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", 3486 | "dev": true 3487 | }, 3488 | "wrappy": { 3489 | "version": "1.0.2", 3490 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", 3491 | "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", 3492 | "dev": true 3493 | }, 3494 | "xmlcreate": { 3495 | "version": "1.0.2", 3496 | "resolved": "https://registry.npmjs.org/xmlcreate/-/xmlcreate-1.0.2.tgz", 3497 | "integrity": "sha1-+mv3YqYKQT+z3Y9LA8WyaSONMI8=", 3498 | "dev": true 3499 | } 3500 | } 3501 | } 3502 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "css-camera", 3 | "version": "1.0.1-snapshot", 4 | "description": "Add a depth to your web page with CSS3 3D transform.", 5 | "main": "lib/css-camera.js", 6 | "module": "lib/css-camera.esm.js", 7 | "types": "lib/declaration/index.d.ts", 8 | "scripts": { 9 | "build": "rm -rf ./lib && rollup -c && npm run declaration", 10 | "build:windows": "rd /s /q ./lib || rollup -c && npm run declaration:windows", 11 | "declaration": "rm -rf ./lib/declaration && tsc -p tsconfig.json", 12 | "declaration:windows": "rd /s /q ./lib || tsc -p tsconfig.json", 13 | "demo:build": "npm run build && cpx 'lib/**/*' demo/release/latest/lib --clean", 14 | "demo:prebuild-version": "cpx 'lib/**/*' demo/release/$npm_package_version/lib --clean && cpx 'docs/**/*' demo/release/$npm_package_version/docs --clean", 15 | "demo:prebuild-latest": "cpx 'lib/**/*' demo/release/latest/lib --clean && cpx 'docs/**/*' demo/release/latest/docs --clean", 16 | "demo:deploy": "npm run build && npm run doc && npm run demo:prebuild-version && npm run demo:prebuild-latest && gh-pages -d demo/", 17 | "doc": "rm -rf ./docs && jsdoc -c jsdoc.json" 18 | }, 19 | "repository": { 20 | "type": "git", 21 | "url": "git+https://github.com/WoodNeck/css-camera.git" 22 | }, 23 | "author": "WoodNeck", 24 | "license": "MIT", 25 | "bugs": { 26 | "url": "https://github.com/WoodNeck/css-camera/issues" 27 | }, 28 | "homepage": "https://github.com/WoodNeck/css-camera#readme", 29 | "devDependencies": { 30 | "@daybrush/jsdoc": "^0.3.7", 31 | "@egjs/build-helper": "0.0.5", 32 | "@types/gl-matrix": "^2.4.5", 33 | "cpx": "^1.5.0", 34 | "docdash": "^1.1.1", 35 | "gh-pages": "2.0.1", 36 | "rollup": "^1.10.1", 37 | "rollup-plugin-node-resolve": "^4.2.3", 38 | "rollup-plugin-prototype-minify": "^1.0.5", 39 | "rollup-plugin-replace": "^2.2.0", 40 | "rollup-plugin-typescript": "^1.0.1", 41 | "rollup-plugin-uglify": "^6.0.2", 42 | "tslint": "^5.15.0", 43 | "tslint-consistent-codestyle": "^1.15.1", 44 | "tslint-eslint-rules": "^5.4.0", 45 | "typescript": "^3.4.3" 46 | }, 47 | "dependencies": { 48 | "gl-matrix": "^3.0.0" 49 | } 50 | } 51 | -------------------------------------------------------------------------------- /rollup.config.js: -------------------------------------------------------------------------------- 1 | const buildHelper = require("@egjs/build-helper"); 2 | 3 | const name = "CSSCamera"; 4 | const external = { 5 | "gl-matrix": "gl-matrix", 6 | } 7 | export default buildHelper([ 8 | { 9 | name, 10 | input: "./src/index.umd.ts", 11 | output: "./lib/css-camera.js", 12 | format: "umd", 13 | external, 14 | }, 15 | { 16 | name, 17 | input: "./src/index.umd.ts", 18 | output: "./lib/css-camera.min.js", 19 | format: "umd", 20 | uglify: true, 21 | external, 22 | }, 23 | { 24 | name, 25 | input: "./src/index.umd.ts", 26 | output: "./lib/css-camera.pkgd.js", 27 | format: "umd", 28 | resolve: true, 29 | }, 30 | { 31 | name, 32 | input: "./src/index.umd.ts", 33 | output: "./lib/css-camera.pkgd.min.js", 34 | format: "umd", 35 | resolve: true, 36 | uglify: true, 37 | }, 38 | { 39 | input: "./src/index.ts", 40 | output: "./lib/css-camera.esm.js", 41 | format: "esm", 42 | external, 43 | exports: "named", 44 | }, 45 | ]); 46 | -------------------------------------------------------------------------------- /src/CSSCamera.ts: -------------------------------------------------------------------------------- 1 | import { mat4, vec3, quat } from 'gl-matrix'; 2 | import { getElement, applyCSS, getTransformMatrix, findIndex, getOffsetFromParent, getRotateOffset, assign } from './utils/helper'; 3 | import { quatToEuler } from './utils/math'; 4 | import * as DEFAULT from './constants/default'; 5 | import { Offset, UpdateOption, ValueOf, Options } from './types'; 6 | 7 | class CSSCamera { 8 | private _element: HTMLElement; 9 | private _viewportEl: HTMLElement; 10 | private _cameraEl: HTMLElement; 11 | private _worldEl: HTMLElement; 12 | 13 | private _position: vec3; 14 | private _scale: vec3; 15 | private _rotation: vec3; 16 | private _perspective: number; 17 | private _rotateOffset: number; 18 | private _updateTimer: number; 19 | 20 | /** 21 | * Current version of CSSCamera. 22 | * @example 23 | * console.log(CSSCamera.VERSION); // ex) 1.0.0 24 | * @type {string} 25 | */ 26 | static get VERSION() { return '#__VERSION__#'; } 27 | 28 | /** 29 | * The element provided in the constructor. 30 | * @example 31 | * const camera = new CSSCamera(el); 32 | * console.log(camera.element === el); // true 33 | * @type {HTMLElement} 34 | */ 35 | public get element() { return this._element; } 36 | 37 | /** 38 | * The reference of viewport DOM element. 39 | * @type {HTMLElement} 40 | */ 41 | public get viewportEl() { return this._viewportEl; } 42 | 43 | /** 44 | * The reference of camera DOM element. 45 | * @type {HTMLElement} 46 | */ 47 | public get cameraEl() { return this._cameraEl; } 48 | 49 | /** 50 | * The reference of world DOM element. 51 | * @type {HTMLElement} 52 | */ 53 | public get worldEl() { return this._worldEl; } 54 | 55 | /** 56 | * The current position as number array([x, y, z]). 57 | * @example 58 | * const camera = new CSSCamera(el); 59 | * console.log(camera.position); // [0, 0, 0]; 60 | * camera.position = [0, 0, 300]; 61 | * console.log(camera.position); // [0, 0, 300]; 62 | * @type {number[]} 63 | */ 64 | public get position() { return [...this._position]; } 65 | 66 | /** 67 | * The current scale as number array([x, y, z]). 68 | * @example 69 | * const camera = new CSSCamera(el); 70 | * console.log(camera.scale); // [1, 1, 1]; 71 | * camera.scale = [5, 1, 1]; 72 | * console.log(camera.scale); // [5, 1, 1]; 73 | * @type {number[]} 74 | */ 75 | public get scale() { return [...this._scale]; } 76 | 77 | /** 78 | * The current Euler rotation angles in degree as number array([x, y, z]). 79 | * @example 80 | * const camera = new CSSCamera(el); 81 | * console.log(camera.rotation); // [0, 0, 0]; 82 | * camera.rotation = [90, 0, 0]; 83 | * console.log(camera.rotation); // [90, 0, 0]; 84 | * @type {number[]} 85 | */ 86 | public get rotation() { return [...this._rotation]; } 87 | 88 | /** 89 | * The current quaternion rotation as number array([x, y, z, w]). 90 | * @example 91 | * const camera = new CSSCamera(el); 92 | * console.log(camera.quaternion); // [0, 0, 0, 1]; 93 | * camera.rotation = [90, 0, 0]; 94 | * console.log(camera.quaternion); // [0.7071067690849304, 0, 0, 0.7071067690849304]; 95 | * camera.quaternion = [0, 0, 0, 1]; 96 | * console.log(camera.rotation); // [0, -0, 0]; 97 | * @type {number[]} 98 | */ 99 | public get quaternion() { 100 | const r = this._rotation; 101 | const quaternion = quat.fromEuler(quat.create(), r[0], r[1], r[2]); 102 | 103 | return [...quaternion]; 104 | } 105 | 106 | /** 107 | * The current perspective value that will be applied to viewport element. 108 | * @example 109 | * const camera = new CSSCamera(el); 110 | * camera.perspective = 300; 111 | * console.log(camera.perspective); // 300 112 | * @type {number} 113 | */ 114 | public get perspective() { return this._perspective; } 115 | 116 | /** 117 | * The current rotate offset value that will be applied to camera element. 118 | * The camera will be as far away from the focal point as this value. 119 | * |![rot0](https://woodneck.github.io/css-camera/asset/rot0.gif)|![rot150](https://woodneck.github.io/css-camera/asset/rot150.gif)| 120 | * |:---:|:---:| 121 | * @example 122 | * const camera = new CSSCamera(el); 123 | * camera.perspective = 300; 124 | * console.log(camera.cameraCSS); // scale3d(1, 1, 1) translateZ(300px) rotateX(0deg) rotateY(0deg) rotateZ(0deg); 125 | * camera.rotateOffset = 100; 126 | * console.log(camera.cameraCSS); // scale3d(1, 1, 1) translateZ(400px) rotateX(0deg) rotateY(0deg) rotateZ(0deg); 127 | * @type {number} 128 | */ 129 | public get rotateOffset() { return this._rotateOffset; } 130 | 131 | /** 132 | * CSS string can be applied to camera element based on current transform. 133 | * @example 134 | * const camera = new CSSCamera(el); 135 | * camera.perspective = 300; 136 | * console.log(camera.cameraCSS); // scale3d(1, 1, 1) translateZ(300px) rotateX(0deg) rotateY(0deg) rotateZ(0deg); 137 | * @type {string} 138 | */ 139 | public get cameraCSS() { 140 | const perspective = this._perspective; 141 | const rotateOffset = this._rotateOffset; 142 | const rotation = this._rotation; 143 | const scale = this._scale; 144 | 145 | // Rotate in order of Z - Y - X 146 | // tslint:disable-next-line: max-line-length 147 | return `scale3d(${scale[0]}, ${scale[1]}, ${scale[2]}) translateZ(${perspective - rotateOffset}px) rotateX(${rotation[0]}deg) rotateY(${rotation[1]}deg) rotateZ(${rotation[2]}deg)`; 148 | } 149 | 150 | /** 151 | * CSS string can be applied to world element based on current transform. 152 | * ``` 153 | * const camera = new CSSCamera(el); 154 | * console.log(camera.worldCSS); // "translate3d(0px, 0px, 0px)"; 155 | * camera.translate(0, 0, 300); 156 | * console.log(camera.worldCSS); // "translate3d(0px, 0px, -300px)"; 157 | * ``` 158 | * @type {string} 159 | */ 160 | public get worldCSS() { 161 | const position = this._position; 162 | 163 | return `translate3d(${-position[0]}px, ${-position[1]}px, ${-position[2]}px)`; 164 | } 165 | 166 | public set position(val: number[]) { this._position = vec3.fromValues(val[0], val[1], val[2]); } 167 | public set scale(val: number[]) { this._scale = vec3.fromValues(val[0], val[1], val[2]); } 168 | public set rotation(val: number[]) { this._rotation = vec3.fromValues(val[0], val[1], val[2]); } 169 | public set quaternion(val: number[]) { this._rotation = quatToEuler(quat.fromValues(val[0], val[1], val[2], val[3])); } 170 | public set perspective(val: number) { this._perspective = val; } 171 | public set rotateOffset(val: number) { this._rotateOffset = val; } 172 | 173 | /** 174 | * Create new CSSCamera with given element / selector. 175 | * @param - The element to apply camera. Can be HTMLElement or CSS selector. 176 | * @param {Partial} [options] Camera options 177 | * @param {number[]} [options.position=[0, 0, 0]] Initial position of the camera. 178 | * @param {number[]} [options.scale=[1, 1, 1]] Initial scale of the camera. 179 | * @param {number[]} [options.rotation=[0, 0, 0]] Initial Euler rotation angles(x, y, z) of the camera in degree. 180 | * @param {number} [options.perspective=0] Initial perspective of the camera. 181 | * @param {number} [options.rotateOffset=0] Initial rotate offset of the camera. 182 | * @example 183 | * const camera = new CSSCamera("#el", { 184 | * position: [0, 0, 150], // Initial pos(x, y, z) 185 | * rotation: [90, 0, 0], // Initial rotation(x, y, z, in degree) 186 | * perspective: 300 // CSS "perspective" value to apply 187 | * }); 188 | */ 189 | constructor(el: string | HTMLElement, options: Partial = {}) { 190 | this._element = getElement(el); 191 | 192 | const op = assign(assign({}, DEFAULT.OPTIONS), options) as Options; 193 | 194 | this._position = vec3.fromValues(op.position[0], op.position[1], op.position[2]); 195 | this._scale = vec3.fromValues(op.scale[0], op.scale[1], op.scale[2]); 196 | this._rotation = vec3.fromValues(op.rotation[0], op.rotation[1], op.rotation[2]); 197 | this._perspective = op.perspective; 198 | this._rotateOffset = op.rotateOffset; 199 | this._updateTimer = -1; 200 | 201 | const element = this._element; 202 | const viewport = document.createElement('div'); 203 | const camera = viewport.cloneNode() as HTMLElement; 204 | const world = viewport.cloneNode() as HTMLElement; 205 | 206 | viewport.className = DEFAULT.CLASS.VIEWPORT; 207 | camera.className = DEFAULT.CLASS.CAMERA; 208 | world.className = DEFAULT.CLASS.WORLD; 209 | 210 | applyCSS(viewport, DEFAULT.STYLE.VIEWPORT); 211 | applyCSS(camera, DEFAULT.STYLE.CAMERA); 212 | applyCSS(world, DEFAULT.STYLE.WORLD); 213 | 214 | camera.appendChild(world); 215 | viewport.appendChild(camera); 216 | 217 | this._viewportEl = viewport; 218 | this._cameraEl = camera; 219 | this._worldEl = world; 220 | 221 | // EL's PARENT -> VIEWPORT -> CAMERA -> WORLD -> EL 222 | element.parentElement!.insertBefore(viewport, element); 223 | world.appendChild(element); 224 | 225 | this.update(0); 226 | } 227 | 228 | /** 229 | * Focus a camera to given element. 230 | * After focus, element will be in front of camera with no rotation applied. 231 | * Also, it will have original width / height if neither [scale](#scale) nor [perspectiveOffset](#perspectiveOffset) is applied. 232 | * This method won't work if any of element's parent except camera element has scale applied. 233 | * @param - The element to focus. Can be HTMLElement or CSS selector. 234 | * @return {CSSCamera} The instance itself 235 | */ 236 | public focus(el: string | HTMLElement): this { 237 | const element = getElement(el); 238 | const focusMatrix = this._getFocusMatrix(element); 239 | 240 | const rotation = quat.create(); 241 | const translation = vec3.create(); 242 | mat4.getRotation(rotation, focusMatrix); 243 | mat4.getTranslation(translation, focusMatrix); 244 | 245 | const eulerAngle = quatToEuler(rotation); 246 | 247 | vec3.negate(eulerAngle, eulerAngle); 248 | 249 | this._rotation = eulerAngle; 250 | this._position = translation; 251 | return this; 252 | } 253 | 254 | /** 255 | * Translate a camera in its local coordinate space. 256 | * For example, `camera.translateLocal(0, 0, -300)` will always move camera to direction where it's seeing. 257 | * @param - Amount of horizontal translation, in px. 258 | * @param - Amount of vertical translation, in px. 259 | * @param - Amount of translation in view direction, in px. 260 | * @return {CSSCamera} The instance itself 261 | */ 262 | public translateLocal(x: number = 0, y: number = 0, z: number = 0): this { 263 | const position = this._position; 264 | const rotation = this._rotation; 265 | 266 | const transVec = vec3.fromValues(x, y, z); 267 | const rotQuat = quat.create(); 268 | quat.fromEuler(rotQuat, -rotation[0], -rotation[1], -rotation[2]); 269 | vec3.transformQuat(transVec, transVec, rotQuat); 270 | 271 | vec3.add(position, position, transVec); 272 | return this; 273 | } 274 | 275 | /** 276 | * Translate a camera in world(absolute) coordinate space. 277 | * @param - Amount of translation in x axis, in px. 278 | * @param - Amount of translation in y axis, in px. 279 | * @param - Amount of translation in z axis, in px. 280 | * @return {CSSCamera} The instance itself 281 | */ 282 | public translate(x: number = 0, y: number = 0, z: number = 0): this { 283 | vec3.add(this._position, this._position, vec3.fromValues(x, y, z)); 284 | 285 | return this; 286 | } 287 | 288 | /** 289 | * Rotate a camera in world(absolute) coordinate space. 290 | * @param - Amount of rotation in x axis, in degree. 291 | * @param - Amount of rotation in y axis, in degree. 292 | * @param - Amount of rotation in z axis, in degree. 293 | * @return {CSSCamera} The instance itself 294 | */ 295 | public rotate(x: number = 0, y: number = 0, z: number = 0): this { 296 | vec3.add(this._rotation, this._rotation, vec3.fromValues(x, y, z)); 297 | 298 | return this; 299 | } 300 | 301 | /** 302 | * Updates a camera CSS with given duration. 303 | * Every other camera transforming properties / methods will be batched until this method is called. 304 | * @example 305 | * const camera = new CSSCamera(el); 306 | * console.log(camera.cameraEl.style.transform); // '' 307 | * 308 | * camera.perspective = 300; 309 | * camera.translate(0, 0, 300); 310 | * camera.rotate(0, 90, 0); 311 | * console.log(camera.cameraEl.style.transform); // '', Not changed! 312 | * 313 | * await camera.update(1000); // Camera style is updated. 314 | * console.log(camera.cameraEl.style.transform); // scale3d(1, 1, 1) translateZ(300px) rotateX(0deg) rotateY(90deg) rotateZ(0deg) 315 | * 316 | * // When if you want to apply multiple properties 317 | * camera.update(1000, { 318 | * property: "transform, background-color", 319 | * timingFunction: "ease-out, ease-out", // As same with CSS, you should assign values to each property 320 | * delay: "0ms, 100ms" 321 | * }); 322 | * @param - Transition duration in ms. 323 | * @param {Partial} [options] Transition options. 324 | * @param {string} [options.property="transform"] CSS [transition-property](https://developer.mozilla.org/en-US/docs/Web/CSS/transition-property) to apply. 325 | * @param {string} [options.timingFunction="ease-out"] CSS [transition-timing-function](https://developer.mozilla.org/en-US/docs/Web/CSS/transition-timing-function) to apply. 326 | * @param {string} [options.delay="0ms"] CSS [transition-delay](https://developer.mozilla.org/en-US/docs/Web/CSS/transition-delay) to apply. 327 | * @return {Promise} A promise resolving instance itself 328 | */ 329 | public async update(duration: number = 0, options: Partial = {}): Promise { 330 | applyCSS(this._viewportEl, { perspective: `${this.perspective}px` }); 331 | applyCSS(this._cameraEl, { transform: this.cameraCSS }); 332 | applyCSS(this._worldEl, { transform: this.worldCSS }); 333 | 334 | const updateOptions = assign(assign({}, DEFAULT.UPDATE_OPTIONS), options) as UpdateOption; 335 | 336 | if (duration > 0) { 337 | if (this._updateTimer > 0) { 338 | window.clearTimeout(this._updateTimer); 339 | } 340 | 341 | const transitionDuration = `${duration}ms`; 342 | const updateOption = Object.keys(updateOptions).reduce((option: {[key: string]: ValueOf}, key) => { 343 | option[`transition${key.charAt(0).toUpperCase() + key.slice(1)}`] = updateOptions[key as keyof UpdateOption]!; 344 | return option; 345 | }, {}); 346 | 347 | const finalOption = { 348 | transitionDuration, 349 | ...updateOption, 350 | }; 351 | 352 | [this._viewportEl, this._cameraEl, this._worldEl].forEach(el => { 353 | applyCSS(el, finalOption); 354 | }); 355 | } 356 | 357 | return new Promise(resolve => { 358 | // Make sure to use requestAnimationFrame even if duration is 0 359 | // To make sure DOM is updated, for successive update() calls. 360 | if (duration > 0) { 361 | this._updateTimer = window.setTimeout(() => { 362 | // Reset transition values 363 | [this._viewportEl, this._cameraEl, this._worldEl].forEach(el => { 364 | applyCSS(el, { transition: '' }); 365 | }); 366 | this._updateTimer = -1; 367 | resolve(); 368 | }, duration); 369 | } else { 370 | requestAnimationFrame(() => { 371 | resolve(); 372 | }); 373 | } 374 | }); 375 | } 376 | 377 | private _getFocusMatrix(element: HTMLElement): mat4 { 378 | const elements: HTMLElement[] = []; 379 | while (element) { 380 | elements.push(element); 381 | if (element === this._element) break; 382 | element = element.parentElement!; 383 | } 384 | 385 | // Order by shallow to deep 386 | elements.reverse(); 387 | 388 | const elStyles = elements.map(el => window.getComputedStyle(el)); 389 | 390 | // Find first element that transform-style is not preserve-3d 391 | // As all childs of that element is affected by its matrix 392 | const firstFlatIndex = findIndex(elStyles, style => style.transformStyle !== 'preserve-3d'); 393 | if (firstFlatIndex > 0) { // el doesn't have to be preserve-3d'ed 394 | elStyles.splice(firstFlatIndex + 1); 395 | } 396 | 397 | let parentOffset: Offset = { 398 | left: 0, 399 | top: 0, 400 | width: this.viewportEl.offsetWidth, 401 | height: this.viewportEl.offsetHeight, 402 | }; 403 | 404 | // Accumulated rotation 405 | const accRotation = quat.identity(quat.create()); 406 | // Assume center of screen as (0, 0, 0) 407 | const centerPos = vec3.fromValues(0, 0, 0); 408 | 409 | elStyles.forEach((style, idx) => { 410 | const el = elements[idx]; 411 | const currentOffset = { 412 | left: el.offsetLeft, 413 | top: el.offsetTop, 414 | width: el.offsetWidth, 415 | height: el.offsetHeight, 416 | }; 417 | const transformMat = getTransformMatrix(style); 418 | const offsetFromParent = getOffsetFromParent(currentOffset, parentOffset); 419 | vec3.transformQuat(offsetFromParent, offsetFromParent, accRotation); 420 | 421 | vec3.add(centerPos, centerPos, offsetFromParent); 422 | 423 | const rotateOffset = getRotateOffset(style, currentOffset); 424 | vec3.transformQuat(rotateOffset, rotateOffset, accRotation); 425 | 426 | const transformOrigin = vec3.clone(centerPos); 427 | vec3.add(transformOrigin, transformOrigin, rotateOffset); 428 | 429 | const centerFromOrigin = vec3.create(); 430 | vec3.sub(centerFromOrigin, centerPos, transformOrigin); 431 | 432 | const invAccRotation = quat.invert(quat.create(), accRotation); 433 | vec3.transformQuat(centerFromOrigin, centerFromOrigin, invAccRotation); 434 | vec3.transformMat4(centerFromOrigin, centerFromOrigin, transformMat); 435 | vec3.transformQuat(centerFromOrigin, centerFromOrigin, accRotation); 436 | 437 | const newCenterPos = vec3.add(vec3.create(), transformOrigin, centerFromOrigin); 438 | const rotation = mat4.getRotation(quat.create(), transformMat); 439 | 440 | vec3.copy(centerPos, newCenterPos); 441 | quat.mul(accRotation, accRotation, rotation); 442 | parentOffset = currentOffset; 443 | }); 444 | 445 | const perspective = vec3.fromValues(0, 0, this.perspective); 446 | vec3.transformQuat(perspective, perspective, accRotation); 447 | vec3.add(centerPos, centerPos, perspective); 448 | 449 | const matrix = mat4.create(); 450 | mat4.fromRotationTranslation(matrix, accRotation, centerPos); 451 | 452 | return matrix; 453 | } 454 | } 455 | 456 | export default CSSCamera; 457 | -------------------------------------------------------------------------------- /src/constants/default.ts: -------------------------------------------------------------------------------- 1 | export const STYLE = { 2 | VIEWPORT: { 3 | width: '100%', 4 | height: '100%', 5 | 'transform-style': 'preserve-3d', 6 | overflow: 'hidden', 7 | }, 8 | CAMERA: { 9 | width: '100%', 10 | height: '100%', 11 | 'transform-style': 'preserve-3d', 12 | 'will-change': 'transform', 13 | }, 14 | WORLD: { 15 | width: '100%', 16 | height: '100%', 17 | 'transform-style': 'preserve-3d', 18 | 'will-change': 'transform', 19 | }, 20 | }; 21 | 22 | export const CLASS = { 23 | VIEWPORT: 'cc-viewport', 24 | CAMERA: 'cc-camera', 25 | WORLD: 'cc-world', 26 | }; 27 | 28 | export const OPTIONS = { 29 | position: [0, 0, 0], 30 | scale: [1, 1, 1], 31 | rotation: [0, 0, 0], 32 | perspective: 0, 33 | rotateOffset: 0, 34 | }; 35 | 36 | export const UPDATE_OPTIONS = { 37 | property: 'transform', 38 | timingFunction: 'ease-out', 39 | delay: '0ms', 40 | }; 41 | -------------------------------------------------------------------------------- /src/constants/error.ts: -------------------------------------------------------------------------------- 1 | export const ELEMENT_NOT_EXIST = (selector: string) => `Element with selector "${selector}" doesn't exist.`; 2 | export const MUST_STRING_OR_ELEMENT = (received: any) => `Element should be provided in string or HTMLElement. Received: ${received}`; 3 | -------------------------------------------------------------------------------- /src/index.ts: -------------------------------------------------------------------------------- 1 | import CSSCamera from './CSSCamera'; 2 | 3 | export * from './types'; 4 | export default CSSCamera; 5 | -------------------------------------------------------------------------------- /src/index.umd.ts: -------------------------------------------------------------------------------- 1 | import CSSCamera from './CSSCamera'; 2 | 3 | export default CSSCamera; 4 | -------------------------------------------------------------------------------- /src/types.ts: -------------------------------------------------------------------------------- 1 | export type ValueOf = T[keyof T]; 2 | 3 | export type Matrix4x4 = [ 4 | number, number, number, number, 5 | number, number, number, number, 6 | number, number, number, number, 7 | number, number, number, number, 8 | ]; 9 | 10 | /** 11 | * @typedef 12 | * @property - Initial position of the camera. 13 | * @property - Initial scale of the camera. 14 | * @property - Initial Euler rotation angles(x, y, z) of the camera in degree. 15 | * @property - Initial perspective of the camera. 16 | * @property - Initial rotate offset of the camera. 17 | */ 18 | export interface Options { 19 | position: number[]; 20 | scale: number[]; 21 | rotation: number[]; 22 | perspective: number; 23 | rotateOffset: number; 24 | } 25 | 26 | export interface Offset { 27 | left: number; 28 | top: number; 29 | width: number; 30 | height: number; 31 | } 32 | 33 | /** 34 | * @typedef 35 | * @property - CSS [transition-property](https://developer.mozilla.org/en-US/docs/Web/CSS/transition-property) to apply. 36 | * @property - CSS [transition-timing-function](https://developer.mozilla.org/en-US/docs/Web/CSS/transition-timing-function) to apply. 37 | * @property - CSS [transition-delay](https://developer.mozilla.org/en-US/docs/Web/CSS/transition-delay) to apply. 38 | */ 39 | export interface UpdateOption { 40 | property: string; 41 | timingFunction: string; 42 | delay: string; 43 | } 44 | -------------------------------------------------------------------------------- /src/utils/helper.ts: -------------------------------------------------------------------------------- 1 | import { mat4, vec3 } from 'gl-matrix'; 2 | import { ELEMENT_NOT_EXIST, MUST_STRING_OR_ELEMENT } from '../constants/error'; 3 | import { Matrix4x4, Offset } from '../types'; 4 | 5 | export const getElement = (el: string | HTMLElement, baseElement?: HTMLElement): HTMLElement => { 6 | if (typeof el === 'string') { 7 | const queryResult = baseElement 8 | ? baseElement.querySelector(el) 9 | : document.querySelector(el); 10 | if (!queryResult) { 11 | throw new Error(ELEMENT_NOT_EXIST(el)); 12 | } 13 | return queryResult as HTMLElement; 14 | } else if (el.nodeName && el.nodeType === 1) { 15 | return el; 16 | } else { 17 | throw new Error(MUST_STRING_OR_ELEMENT(el)); 18 | } 19 | }; 20 | 21 | export function applyCSS(element: HTMLElement, cssObj: { [keys: string]: string }): void { 22 | Object.keys(cssObj).forEach(property => { 23 | (element.style as any)[property] = cssObj[property]; 24 | }); 25 | } 26 | 27 | export function getTransformMatrix(elStyle: CSSStyleDeclaration): mat4 { 28 | const trVal = elStyle.getPropertyValue('transform'); 29 | const transformStr = /\(((\s|\S)+)\)/.exec(trVal); 30 | const matrixVal = transformStr 31 | ? transformStr[1].split(',').map(val => parseFloat(val)) as Matrix4x4 32 | : [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1] as Matrix4x4; 33 | if (matrixVal.length === 16 ) { 34 | return mat4.fromValues(...matrixVal); 35 | } else { 36 | // Convert 2d matrix(length 6) to 3d 37 | const matrix = mat4.create(); 38 | mat4.identity(matrix); 39 | 40 | matrix[0] = matrixVal[0]; 41 | matrix[1] = matrixVal[1]; 42 | matrix[4] = matrixVal[2]; 43 | matrix[5] = matrixVal[3]; 44 | matrix[12] = matrixVal[4]; 45 | matrix[13] = matrixVal[5]; 46 | 47 | return matrix; 48 | } 49 | } 50 | 51 | export function getOffsetFromParent(currentOffset: Offset, parentOffset: Offset): vec3 { 52 | const offsetLeft = currentOffset.left + (currentOffset.width - parentOffset.width) / 2; 53 | const offsetTop = currentOffset.top + (currentOffset.height - parentOffset.height) / 2; 54 | 55 | return vec3.fromValues(offsetLeft, offsetTop, 0); 56 | } 57 | 58 | export function getRotateOffset(elStyle: CSSStyleDeclaration, currentOffset: Offset): vec3 { 59 | const axis = (elStyle.transformOrigin as string) 60 | .split(' ') 61 | .map(str => parseFloat(str.substring(0, str.length - 2))); 62 | const ax = axis[0] - currentOffset.width / 2; 63 | const ay = axis[1] - currentOffset.height / 2; 64 | 65 | return vec3.fromValues(ax, ay, 0); 66 | } 67 | 68 | export function findIndex(iterable: T[], callback: (el: T) => boolean): number { 69 | for (let i = 0; i < iterable.length; i += 1) { 70 | const element = iterable[i]; 71 | if (element && callback(element)) { 72 | return i; 73 | } 74 | } 75 | 76 | return -1; 77 | } 78 | 79 | // return [0, 1, ...., max - 1] 80 | export function range(max: number): number[] { 81 | const counterArray: number[] = []; 82 | for (let i = 0; i < max; i += 1) { 83 | counterArray[i] = i; 84 | } 85 | return counterArray; 86 | } 87 | 88 | export function clamp(val: number, min: number, max: number): number { 89 | return Math.max(Math.min(val, max), min); 90 | } 91 | 92 | export function assign(target: object, ...srcs: object[]): object { 93 | srcs.forEach(source => { 94 | Object.keys(source).forEach(key => { 95 | const value = (source as any)[key]; 96 | (target as any)[key] = value; 97 | }); 98 | }); 99 | 100 | return target; 101 | } 102 | -------------------------------------------------------------------------------- /src/utils/math.ts: -------------------------------------------------------------------------------- 1 | import { mat4, quat, vec3 } from 'gl-matrix'; 2 | import { clamp } from './helper'; 3 | 4 | export function degToRad(deg: number): number { 5 | return Math.PI * deg / 180; 6 | } 7 | 8 | export function radToDeg(rad: number): number { 9 | return 180 * rad / Math.PI; 10 | } 11 | 12 | // From Three.js https://github.com/mrdoob/three.js/blob/dev/src/math/Euler.js 13 | export function quatToEuler(q: quat): vec3 { 14 | const rotM = mat4.create(); 15 | mat4.fromQuat(rotM, q); 16 | 17 | const m11 = rotM[0]; 18 | const m12 = rotM[4]; 19 | // const m13 = rotM[8]; 20 | const m21 = rotM[1]; 21 | const m22 = rotM[5]; 22 | // const m23 = rotM[9]; 23 | const m31 = rotM[2]; 24 | const m32 = rotM[6]; 25 | const m33 = rotM[10]; 26 | 27 | const euler = vec3.create(); 28 | 29 | // ZYX 30 | euler[1] = Math.asin(-clamp(m31, -1, 1)); 31 | if (Math.abs(m31) < 0.99999) { 32 | euler[0] = Math.atan2(m32, m33); 33 | euler[2] = Math.atan2(m21, m11); 34 | } else { 35 | euler[0] = 0; 36 | euler[2] = Math.atan2(-m12, m22); 37 | } 38 | 39 | return euler.map(val => radToDeg(val)) as vec3; 40 | } 41 | -------------------------------------------------------------------------------- /test/manual/assets/cover.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/WoodNeck/css-camera/94c82efbd7b4e298640c3668b70ee1d45b76b879/test/manual/assets/cover.png -------------------------------------------------------------------------------- /test/manual/css/common.css: -------------------------------------------------------------------------------- 1 | html { 2 | height: 100%; 3 | } 4 | body { 5 | width: 100%; 6 | height: 100%; 7 | min-height: 100%; 8 | margin: 0; 9 | } 10 | 11 | /* .cc-camera { 12 | transition: transform 1s; 13 | } 14 | 15 | .cc-world { 16 | transition: transform 1s; 17 | } */ 18 | #space { 19 | transform-style: preserve-3d; 20 | position: relative; 21 | width: 100%; 22 | height: 100%; 23 | } 24 | .cube { 25 | display: inline-block; 26 | width: 300px; 27 | height: 300px; 28 | position: absolute; 29 | left: calc(50% - 150px); 30 | top: calc(50% - 150px); 31 | transform-style: preserve-3d; 32 | transition: transform 3s; 33 | } 34 | #cube2 { 35 | transform: translate3d(150px, 0, -150px) rotateY(-90deg); 36 | } 37 | #cube3 { 38 | transform: translate3d(300px, 0, 0px) rotateY(180deg); 39 | } 40 | .cube-side { 41 | width: 100%; 42 | height: 100%; 43 | background: rgb(114, 55, 55); 44 | position: absolute; 45 | left: 0; top: 0; 46 | } 47 | .cube-side.up { 48 | background: #222; 49 | transform-origin: top; 50 | transform: rotateX(-90deg); 51 | } 52 | .cube-side.down { 53 | background: #444; 54 | transform-origin: bottom; 55 | transform: rotateX(90deg); 56 | } 57 | .cube-side.left { 58 | background: #666; 59 | transform-origin: left; 60 | transform: rotateY(90deg); 61 | } 62 | .cube-side.right { 63 | background: #888; 64 | transform-origin: right; 65 | transform: rotateY(-90deg); 66 | } 67 | #cube1 .cube-side.right, 68 | #cube2 .cube-side.right { 69 | background: transparent; 70 | } 71 | .cube-side.front { 72 | background: url("../assets/cover.png"); 73 | background-position: center; 74 | background-repeat: no-repeat; 75 | background-size: cover; 76 | } 77 | .cube-side.back { 78 | background: url(https://thumbs.gfycat.com/IdealisticOilyFlicker-size_restricted.gif); 79 | background-position: center; 80 | background-repeat: no-repeat; 81 | background-size: cover; 82 | transform: translateZ(-300px); 83 | transform-style: preserve-3d; 84 | } 85 | #rotated { 86 | transform-style: preserve-3d; 87 | transform: rotateZ(-45deg) translate3d(200px, -500px, 300px) rotateX(90deg); 88 | /* transform-origin: 50px 30%; */ 89 | width: 50vw; 90 | height: 50vh; 91 | transform-origin: 0% 0%; 92 | background: aquamarine; 93 | backface-visibility: hidden; 94 | } 95 | #rotated2 { 96 | transform-style: preserve-3d; 97 | transform: rotateY(15deg) translate3d(200px, -500px, 300px) rotateZ(10deg); 98 | transform-origin: 0% 50px; 99 | width: 50vw; 100 | height: 50vh; 101 | background: chartreuse; 102 | backface-visibility: hidden; 103 | } 104 | #rotated3 { 105 | transform-style: preserve-3d; 106 | transform: translate3d(200px, -500px, 300px) rotateX(30deg) rotateY(-30deg); 107 | transform-origin: 0% 120px; 108 | width: 50vw; 109 | height: 50vh; 110 | background: tomato; 111 | backface-visibility: hidden; 112 | } 113 | -------------------------------------------------------------------------------- /test/manual/test.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | CSS-Camera Demo Page 4 | 5 | 6 | 7 | 8 | 9 |
10 |
11 | TEXT 12 |
13 | TEXT 14 |
15 | 16 | TEXT 17 |
18 |
19 |
˜ 20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 |
30 |
31 |
32 |
33 |
34 |
35 |
36 |
37 |
38 |
39 |
40 |
41 |
42 |
43 |
44 |
45 | 46 | 195 | 196 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "target": "es5", 4 | 5 | // Module 6 | "module": "es2015", 7 | "moduleResolution": "node", 8 | "allowSyntheticDefaultImports": true, 9 | "esModuleInterop": true, 10 | 11 | // Path 12 | "rootDir": "./src", 13 | "outDir": "./lib/", 14 | 15 | // Delcaration 16 | "declaration": true, 17 | "declarationDir": "./lib/declaration", 18 | 19 | // Log 20 | "pretty": true, 21 | 22 | // Lint 23 | "strict": true, 24 | "allowUnreachableCode": false, 25 | "allowUnusedLabels": false, 26 | "noFallthroughCasesInSwitch": true, 27 | "noImplicitReturns": true, 28 | "noUnusedLocals": true, 29 | "noUnusedParameters": true, 30 | "newLine": "lf", 31 | 32 | // Outfile 33 | "charset": "utf8", 34 | "removeComments": true, 35 | "noEmitOnError": true, 36 | 37 | // SourceMap 38 | "sourceMap": true, 39 | 40 | // etc 41 | "importHelpers": true, 42 | "downlevelIteration": true 43 | }, 44 | "include": [ 45 | "./src/**/*.ts" 46 | ] 47 | } 48 | -------------------------------------------------------------------------------- /tslint.json: -------------------------------------------------------------------------------- 1 | { 2 | "defaultSeverity": "error", 3 | "extends": [ 4 | "tslint:recommended" 5 | ], 6 | "rulesDirectory": [ 7 | "tslint-consistent-codestyle", 8 | "tslint-eslint-rules" 9 | ], 10 | "rules": { 11 | "quotemark": [true, "single"], 12 | "variable-name": false, 13 | "arrow-parens": false, 14 | "object-literal-key-quotes": false, 15 | "object-literal-sort-keys": false, 16 | "object-literal-shorthand": false, 17 | "ordered-imports": false, 18 | "no-console": false, 19 | "curly": false, 20 | "adjacent-overload-signatures": false, 21 | "no-bitwise": false, 22 | "interface-name": false, 23 | "max-line-length": false 24 | }, 25 | "linterOptions": { 26 | "exclude": [ 27 | "node_modules/**/*" 28 | ] 29 | } 30 | } 31 | --------------------------------------------------------------------------------