├── .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 | 
5 | 
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 |
44 |
45 |
46 |
47 |
48 |
49 | VIDEO
50 |
51 |
52 |
53 |
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 |
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 |
95 |
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 | * |||
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 |
--------------------------------------------------------------------------------