├── .eslintrc
├── .gitignore
├── LICENSE
├── README-CH.md
├── README.md
├── index.js
├── package-lock.json
├── package.json
├── src
├── compiler.js
├── container.js
├── draw.js
├── formater.js
├── generator.js
├── layout.js
├── parser.js
├── tokenizer.js
└── util.js
└── test
├── generator_test.js
├── parser_test.js
└── tokenizer_test.js
/.eslintrc:
--------------------------------------------------------------------------------
1 | {
2 | "env": { "es6": true, "node": true },
3 | "globals": { "argv": true },
4 | "extends": "elemefe"
5 | }
6 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | # Logs
2 | logs
3 | *.log
4 | npm-debug.log*
5 | yarn-debug.log*
6 | yarn-error.log*
7 |
8 | # Runtime data
9 | pids
10 | *.pid
11 | *.seed
12 | *.pid.lock
13 |
14 | # Directory for instrumented libs generated by jscoverage/JSCover
15 | lib-cov
16 |
17 | # Coverage directory used by tools like istanbul
18 | coverage
19 |
20 | # nyc test coverage
21 | .nyc_output
22 |
23 | # Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files)
24 | .grunt
25 |
26 | # Bower dependency directory (https://bower.io/)
27 | bower_components
28 |
29 | # node-waf configuration
30 | .lock-wscript
31 |
32 | # Compiled binary addons (http://nodejs.org/api/addons.html)
33 | build/Release
34 |
35 | # Dependency directories
36 | node_modules/
37 | jspm_packages/
38 |
39 | # Typescript v1 declaration files
40 | typings/
41 |
42 | # Optional npm cache directory
43 | .npm
44 |
45 | # Optional eslint cache
46 | .eslintcache
47 |
48 | # Optional REPL history
49 | .node_repl_history
50 |
51 | # Output of 'npm pack'
52 | *.tgz
53 |
54 | # Yarn Integrity file
55 | .yarn-integrity
56 |
57 | # dotenv environment variables file
58 | .env
59 |
60 |
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | MIT License
2 |
3 | Copyright (c) 2017 饿了么前端
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-CH.md:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ElemeFE/Hachart/eae27b8af3b6735d61510354911a51d9e7809671/README-CH.md
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # Hachart
2 |
3 | HaHa, this is a flowchart generator.
4 |
5 | [online edit website](https://wangdashuaihenshuai.github.io/demo/flow-chart/)
6 |
7 | 
8 |
9 | # install
10 |
11 | ```bash
12 | npm install ha-chart --save
13 | ```
14 |
15 | # quick start
16 |
17 | ```html
18 |
19 |
20 |
21 |
22 | flow-draw
23 |
24 |
25 |
26 |
27 |
28 | ```
29 |
30 | ```js
31 | const {compiler, layout, Container} = require('ha-chart')
32 |
33 | const code = `
34 | type CondStyle struct{
35 | "extend": "deafultShape",
36 | "fill": "#fcb738"
37 | }
38 |
39 | def start("action")
40 | () -> cond
41 | end
42 |
43 | def cond:CondStyle("is 10?")
44 | ("yes") -> step1
45 | ("no") -> step2
46 | end
47 |
48 | def step1("step 1")
49 | end
50 |
51 | def step2("step 2")
52 | end
53 | `
54 |
55 | const output = layout(compiler(code))
56 | const container = new Container({containerID: "container"})
57 | container.draw(output)
58 | ```
59 | 
60 |
61 | # API
62 |
63 | ## compiler(code, options)
64 |
65 | **code**
66 |
67 | ```js
68 | //create new style, you can extends default style to create new style
69 | type style struct{
70 | "extend": "deafultShape",
71 | "fill": "#fcb738"
72 | }
73 |
74 | // create a chart
75 | def name:style("string")
76 | () -> nextShape
77 | end
78 | ```
79 |
80 | **options**
81 |
82 | you can change the default style at compiler code using options.
83 | ```js
84 | {
85 | type: {
86 | deafultShape: {
87 | fill: '#3ab882',
88 | cornerRadius: 10,
89 | maxWidth: 180,
90 | fontType: {
91 | fontSize: 16,
92 | fontFamily: 'Calibri',
93 | padding: 20,
94 | fill: '#fff',
95 | fontStyle: 'bold',
96 | align: 'center'
97 | }
98 | },
99 | defaultAnnotation: {
100 | fill: '#fff',
101 | fontType: {
102 | fontSize: 16,
103 | fontFamily: 'Calibri',
104 | padding: 5,
105 | fill: '#8699a3',
106 | fontStyle: 'bold',
107 | align: 'center'
108 | }
109 | },
110 | defaultFontType: {
111 | 'fontSize': 16,
112 | 'fontFamily': 'Calibri',
113 | 'fill': '#fff',
114 | 'fontStyle': 'bold',
115 | 'align': 'center',
116 | 'padding': 20
117 | },
118 | defaultArrow: {
119 | stroke: '#8699a3',
120 | strokeWidth: 3,
121 | lineCap: 'round',
122 | lineJoin: 'round'
123 | }
124 | }
125 | }
126 | ```
127 | draw with [konvajs](https://konvajs.github.io)
128 |
129 | [more defaultShape and defaultAnnotation Parameters](https://konvajs.github.io/api/Konva.Arc.html)
130 |
131 | [more defaultArrow Parameters](https://konvajs.github.io/api/Konva.Line.html)
132 |
133 | [more default fontType parameters](https://konvajs.github.io/api/Konva.Text.html)
134 |
135 | ## layout(input, options)
136 |
137 | **input**
138 | ```js
139 | const input = compiler(code)
140 | ```
141 | **options**
142 |
143 | name | defaultValue | description
144 | -----|---------------|------------
145 | rankdir | TB | Direction for rank nodes. Can be TB, BT, LR, or RL, where T = top, B = bottom, L = left, and R = right.
146 | align | TB | Alignment for rank nodes. Can be UL, UR, DL, or DR, where U = up, D = down, L = left, and R = right.
147 | nodesep | 50 | Number of pixels that separate nodes horizontally in the layout.
148 | edgesep | 10 | Number of pixels that separate edges horizontally in the layout.
149 | ranksep | 50 | Number of pixels between each rank in the layout.
150 | marginx | 0 | Number of pixels to use as a margin around the left and right of the graph.
151 | marginy | 0 | Number of pixels to use as a margin around the top and bottom of the graph.
152 | acyclicer | undefined | If set to greedy, uses a greedy heuristic for finding a feedback arc set for a graph. A feedback arc set is a set of edges that can be removed to make a graph acyclic.
153 | ranker | network-simplex | Type of algorithm to assigns a rank to each node in the input graph. Possible values: network-simplex, tight-tree or longest-path
154 |
155 | ## Container
156 |
157 | **constructor({containerID: "string"})**
158 |
159 | containerID: the id of document node.
160 |
161 | **draw(input)**
162 |
163 | draw the compiler code
164 |
--------------------------------------------------------------------------------
/index.js:
--------------------------------------------------------------------------------
1 | const tokenizer = require('./src/tokenizer.js');
2 | const parser = require('./src/parser.js');
3 | const generator = require('./src/generator.js');
4 | const compiler = require('./src/compiler.js');
5 | const layout = require('./src/layout.js');
6 | const draw = require('./src/draw.js');
7 | const Container = require('./src/container.js');
8 |
9 | module.exports = {
10 | tokenizer,
11 | generator,
12 | Container,
13 | compiler,
14 | layout,
15 | parser,
16 | draw
17 | };
18 |
--------------------------------------------------------------------------------
/package-lock.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Hachart",
3 | "version": "0.0.1",
4 | "lockfileVersion": 1,
5 | "dependencies": {
6 | "@ava/babel-plugin-throws-helper": {
7 | "version": "2.0.0",
8 | "resolved": "https://registry.npmjs.org/@ava/babel-plugin-throws-helper/-/babel-plugin-throws-helper-2.0.0.tgz",
9 | "integrity": "sha1-L8H+PCEacQcaTsp7j3r1hCzRrnw=",
10 | "dev": true
11 | },
12 | "@ava/babel-preset-stage-4": {
13 | "version": "1.1.0",
14 | "resolved": "https://registry.npmjs.org/@ava/babel-preset-stage-4/-/babel-preset-stage-4-1.1.0.tgz",
15 | "integrity": "sha512-oWqTnIGXW3k72UFidXzW0ONlO7hnO9x02S/QReJ7NBGeiBH9cUHY9+EfV6C8PXC6YJH++WrliEq03wMSJGNZFg==",
16 | "dev": true,
17 | "dependencies": {
18 | "md5-hex": {
19 | "version": "1.3.0",
20 | "resolved": "https://registry.npmjs.org/md5-hex/-/md5-hex-1.3.0.tgz",
21 | "integrity": "sha1-0sSv6YPENwZiF5uMrRRSGRNQRsQ=",
22 | "dev": true
23 | },
24 | "package-hash": {
25 | "version": "1.2.0",
26 | "resolved": "https://registry.npmjs.org/package-hash/-/package-hash-1.2.0.tgz",
27 | "integrity": "sha1-AD5WzVe3NqbtYRTMK4FUJnJ3DkQ=",
28 | "dev": true
29 | }
30 | }
31 | },
32 | "@ava/babel-preset-transform-test-files": {
33 | "version": "3.0.0",
34 | "resolved": "https://registry.npmjs.org/@ava/babel-preset-transform-test-files/-/babel-preset-transform-test-files-3.0.0.tgz",
35 | "integrity": "sha1-ze0RlqjY2TgaUJJAq5LpGl7Aafc=",
36 | "dev": true
37 | },
38 | "@ava/pretty-format": {
39 | "version": "1.1.0",
40 | "resolved": "https://registry.npmjs.org/@ava/pretty-format/-/pretty-format-1.1.0.tgz",
41 | "integrity": "sha1-0KV9Jeua6rlkO90aAwZCuRwSPig=",
42 | "dev": true
43 | },
44 | "ansi-align": {
45 | "version": "2.0.0",
46 | "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-2.0.0.tgz",
47 | "integrity": "sha1-w2rsy6VjuJzrVW82kPCx2eNUf38=",
48 | "dev": true
49 | },
50 | "ansi-regex": {
51 | "version": "2.1.1",
52 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz",
53 | "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=",
54 | "dev": true
55 | },
56 | "ansi-styles": {
57 | "version": "2.2.1",
58 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz",
59 | "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=",
60 | "dev": true
61 | },
62 | "anymatch": {
63 | "version": "1.3.0",
64 | "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-1.3.0.tgz",
65 | "integrity": "sha1-o+Uvo5FoyCX/V7AkgSbOWo/5VQc=",
66 | "dev": true
67 | },
68 | "argparse": {
69 | "version": "1.0.9",
70 | "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.9.tgz",
71 | "integrity": "sha1-c9g7wmP4bpf4zE9rrhsOkKfSLIY=",
72 | "dev": true
73 | },
74 | "arr-diff": {
75 | "version": "2.0.0",
76 | "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz",
77 | "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=",
78 | "dev": true
79 | },
80 | "arr-exclude": {
81 | "version": "1.0.0",
82 | "resolved": "https://registry.npmjs.org/arr-exclude/-/arr-exclude-1.0.0.tgz",
83 | "integrity": "sha1-38fC5VKicHI8zaBM8xKMjL/lxjE=",
84 | "dev": true
85 | },
86 | "arr-flatten": {
87 | "version": "1.0.3",
88 | "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.0.3.tgz",
89 | "integrity": "sha1-onTthawIhJtr14R8RYB0XcUa37E=",
90 | "dev": true
91 | },
92 | "array-differ": {
93 | "version": "1.0.0",
94 | "resolved": "https://registry.npmjs.org/array-differ/-/array-differ-1.0.0.tgz",
95 | "integrity": "sha1-7/UuN1gknTO+QCuLuOVkuytdQDE=",
96 | "dev": true
97 | },
98 | "array-find-index": {
99 | "version": "1.0.2",
100 | "resolved": "https://registry.npmjs.org/array-find-index/-/array-find-index-1.0.2.tgz",
101 | "integrity": "sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E=",
102 | "dev": true
103 | },
104 | "array-union": {
105 | "version": "1.0.2",
106 | "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz",
107 | "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=",
108 | "dev": true
109 | },
110 | "array-uniq": {
111 | "version": "1.0.3",
112 | "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz",
113 | "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=",
114 | "dev": true
115 | },
116 | "array-unique": {
117 | "version": "0.2.1",
118 | "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz",
119 | "integrity": "sha1-odl8yvy8JiXMcPrc6zalDFiwGlM=",
120 | "dev": true
121 | },
122 | "arrify": {
123 | "version": "1.0.1",
124 | "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz",
125 | "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=",
126 | "dev": true
127 | },
128 | "async-each": {
129 | "version": "1.0.1",
130 | "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.1.tgz",
131 | "integrity": "sha1-GdOGodntxufByF04iu28xW0zYC0=",
132 | "dev": true
133 | },
134 | "auto-bind": {
135 | "version": "1.1.0",
136 | "resolved": "https://registry.npmjs.org/auto-bind/-/auto-bind-1.1.0.tgz",
137 | "integrity": "sha1-k7hk3H7gGjJigXddXHXKCnUeWWE=",
138 | "dev": true
139 | },
140 | "ava": {
141 | "version": "0.19.1",
142 | "resolved": "https://registry.npmjs.org/ava/-/ava-0.19.1.tgz",
143 | "integrity": "sha1-Q92CQ1rRmzmA/8okiPBdqrlAsnM=",
144 | "dev": true
145 | },
146 | "ava-init": {
147 | "version": "0.2.0",
148 | "resolved": "https://registry.npmjs.org/ava-init/-/ava-init-0.2.0.tgz",
149 | "integrity": "sha1-kwTItMNX1m49/a4fv/R7EZnVxV0=",
150 | "dev": true
151 | },
152 | "babel-code-frame": {
153 | "version": "6.22.0",
154 | "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.22.0.tgz",
155 | "integrity": "sha1-AnYgvuVnqIwyVhV05/0IAdMxGOQ=",
156 | "dev": true
157 | },
158 | "babel-core": {
159 | "version": "6.25.0",
160 | "resolved": "https://registry.npmjs.org/babel-core/-/babel-core-6.25.0.tgz",
161 | "integrity": "sha1-fdQrBGPHQunVKW3rPsZ6kyLa1yk=",
162 | "dev": true,
163 | "dependencies": {
164 | "lodash": {
165 | "version": "4.17.4",
166 | "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.4.tgz",
167 | "integrity": "sha1-eCA6TRwyiuHYbcpkYONptX9AVa4=",
168 | "dev": true
169 | }
170 | }
171 | },
172 | "babel-generator": {
173 | "version": "6.25.0",
174 | "resolved": "https://registry.npmjs.org/babel-generator/-/babel-generator-6.25.0.tgz",
175 | "integrity": "sha1-M6GvcNXyiQrrRlpKd5PB32qeqfw=",
176 | "dev": true,
177 | "dependencies": {
178 | "jsesc": {
179 | "version": "1.3.0",
180 | "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-1.3.0.tgz",
181 | "integrity": "sha1-RsP+yMGJKxKwgz25vHYiF226s0s=",
182 | "dev": true
183 | },
184 | "lodash": {
185 | "version": "4.17.4",
186 | "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.4.tgz",
187 | "integrity": "sha1-eCA6TRwyiuHYbcpkYONptX9AVa4=",
188 | "dev": true
189 | }
190 | }
191 | },
192 | "babel-helper-builder-binary-assignment-operator-visitor": {
193 | "version": "6.24.1",
194 | "resolved": "https://registry.npmjs.org/babel-helper-builder-binary-assignment-operator-visitor/-/babel-helper-builder-binary-assignment-operator-visitor-6.24.1.tgz",
195 | "integrity": "sha1-zORReto1b0IgvK6KAsKzRvmlZmQ=",
196 | "dev": true
197 | },
198 | "babel-helper-call-delegate": {
199 | "version": "6.24.1",
200 | "resolved": "https://registry.npmjs.org/babel-helper-call-delegate/-/babel-helper-call-delegate-6.24.1.tgz",
201 | "integrity": "sha1-7Oaqzdx25Bw0YfiL/Fdb0Nqi340=",
202 | "dev": true
203 | },
204 | "babel-helper-explode-assignable-expression": {
205 | "version": "6.24.1",
206 | "resolved": "https://registry.npmjs.org/babel-helper-explode-assignable-expression/-/babel-helper-explode-assignable-expression-6.24.1.tgz",
207 | "integrity": "sha1-8luCz33BBDPFX3BZLVdGQArCLKo=",
208 | "dev": true
209 | },
210 | "babel-helper-function-name": {
211 | "version": "6.24.1",
212 | "resolved": "https://registry.npmjs.org/babel-helper-function-name/-/babel-helper-function-name-6.24.1.tgz",
213 | "integrity": "sha1-00dbjAPtmCQqJbSDUasYOZ01gKk=",
214 | "dev": true
215 | },
216 | "babel-helper-get-function-arity": {
217 | "version": "6.24.1",
218 | "resolved": "https://registry.npmjs.org/babel-helper-get-function-arity/-/babel-helper-get-function-arity-6.24.1.tgz",
219 | "integrity": "sha1-j3eCqpNAfEHTqlCQj4mwMbG2hT0=",
220 | "dev": true
221 | },
222 | "babel-helper-hoist-variables": {
223 | "version": "6.24.1",
224 | "resolved": "https://registry.npmjs.org/babel-helper-hoist-variables/-/babel-helper-hoist-variables-6.24.1.tgz",
225 | "integrity": "sha1-HssnaJydJVE+rbyZFKc/VAi+enY=",
226 | "dev": true
227 | },
228 | "babel-helper-regex": {
229 | "version": "6.24.1",
230 | "resolved": "https://registry.npmjs.org/babel-helper-regex/-/babel-helper-regex-6.24.1.tgz",
231 | "integrity": "sha1-024i+rEAjXnYhkjjIRaGgShFbOg=",
232 | "dev": true,
233 | "dependencies": {
234 | "lodash": {
235 | "version": "4.17.4",
236 | "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.4.tgz",
237 | "integrity": "sha1-eCA6TRwyiuHYbcpkYONptX9AVa4=",
238 | "dev": true
239 | }
240 | }
241 | },
242 | "babel-helper-remap-async-to-generator": {
243 | "version": "6.24.1",
244 | "resolved": "https://registry.npmjs.org/babel-helper-remap-async-to-generator/-/babel-helper-remap-async-to-generator-6.24.1.tgz",
245 | "integrity": "sha1-XsWBgnrXI/7N04HxySg5BnbkVRs=",
246 | "dev": true
247 | },
248 | "babel-helpers": {
249 | "version": "6.24.1",
250 | "resolved": "https://registry.npmjs.org/babel-helpers/-/babel-helpers-6.24.1.tgz",
251 | "integrity": "sha1-NHHenK7DiOXIUOWX5Yom3fN2ArI=",
252 | "dev": true
253 | },
254 | "babel-messages": {
255 | "version": "6.23.0",
256 | "resolved": "https://registry.npmjs.org/babel-messages/-/babel-messages-6.23.0.tgz",
257 | "integrity": "sha1-8830cDhYA1sqKVHG7F7fbGLyYw4=",
258 | "dev": true
259 | },
260 | "babel-plugin-check-es2015-constants": {
261 | "version": "6.22.0",
262 | "resolved": "https://registry.npmjs.org/babel-plugin-check-es2015-constants/-/babel-plugin-check-es2015-constants-6.22.0.tgz",
263 | "integrity": "sha1-NRV7EBQm/S/9PaP3XH0ekYNbv4o=",
264 | "dev": true
265 | },
266 | "babel-plugin-espower": {
267 | "version": "2.3.2",
268 | "resolved": "https://registry.npmjs.org/babel-plugin-espower/-/babel-plugin-espower-2.3.2.tgz",
269 | "integrity": "sha1-VRa4/NsmyfDh2BYHSfbkxl5xJx4=",
270 | "dev": true
271 | },
272 | "babel-plugin-syntax-async-functions": {
273 | "version": "6.13.0",
274 | "resolved": "https://registry.npmjs.org/babel-plugin-syntax-async-functions/-/babel-plugin-syntax-async-functions-6.13.0.tgz",
275 | "integrity": "sha1-ytnK0RkbWtY0vzCuCHI5HgZHvpU=",
276 | "dev": true
277 | },
278 | "babel-plugin-syntax-exponentiation-operator": {
279 | "version": "6.13.0",
280 | "resolved": "https://registry.npmjs.org/babel-plugin-syntax-exponentiation-operator/-/babel-plugin-syntax-exponentiation-operator-6.13.0.tgz",
281 | "integrity": "sha1-nufoM3KQ2pUoggGmpX9BcDF4MN4=",
282 | "dev": true
283 | },
284 | "babel-plugin-syntax-trailing-function-commas": {
285 | "version": "6.22.0",
286 | "resolved": "https://registry.npmjs.org/babel-plugin-syntax-trailing-function-commas/-/babel-plugin-syntax-trailing-function-commas-6.22.0.tgz",
287 | "integrity": "sha1-ugNgk3+NBuQBgKQ/4NVhb/9TLPM=",
288 | "dev": true
289 | },
290 | "babel-plugin-transform-async-to-generator": {
291 | "version": "6.24.1",
292 | "resolved": "https://registry.npmjs.org/babel-plugin-transform-async-to-generator/-/babel-plugin-transform-async-to-generator-6.24.1.tgz",
293 | "integrity": "sha1-ZTbjeK/2yx1VF6wOQOs+n8jQh2E=",
294 | "dev": true
295 | },
296 | "babel-plugin-transform-es2015-destructuring": {
297 | "version": "6.23.0",
298 | "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-destructuring/-/babel-plugin-transform-es2015-destructuring-6.23.0.tgz",
299 | "integrity": "sha1-mXux8auWf2gtKwh2/jWNYOdlxW0=",
300 | "dev": true
301 | },
302 | "babel-plugin-transform-es2015-function-name": {
303 | "version": "6.24.1",
304 | "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-function-name/-/babel-plugin-transform-es2015-function-name-6.24.1.tgz",
305 | "integrity": "sha1-g0yJhTvDaxrw86TF26qU/Y6sqos=",
306 | "dev": true
307 | },
308 | "babel-plugin-transform-es2015-modules-commonjs": {
309 | "version": "6.24.1",
310 | "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-commonjs/-/babel-plugin-transform-es2015-modules-commonjs-6.24.1.tgz",
311 | "integrity": "sha1-0+MQtA72ZKNmIiAAl8bUQCmPK/4=",
312 | "dev": true
313 | },
314 | "babel-plugin-transform-es2015-parameters": {
315 | "version": "6.24.1",
316 | "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-parameters/-/babel-plugin-transform-es2015-parameters-6.24.1.tgz",
317 | "integrity": "sha1-V6w1GrScrxSpfNE7CfZv3wpiXys=",
318 | "dev": true
319 | },
320 | "babel-plugin-transform-es2015-spread": {
321 | "version": "6.22.0",
322 | "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-spread/-/babel-plugin-transform-es2015-spread-6.22.0.tgz",
323 | "integrity": "sha1-1taKmfia7cRTbIGlQujdnxdG+NE=",
324 | "dev": true
325 | },
326 | "babel-plugin-transform-es2015-sticky-regex": {
327 | "version": "6.24.1",
328 | "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-sticky-regex/-/babel-plugin-transform-es2015-sticky-regex-6.24.1.tgz",
329 | "integrity": "sha1-AMHNsaynERLN8M9hJsLta0V8zbw=",
330 | "dev": true
331 | },
332 | "babel-plugin-transform-es2015-unicode-regex": {
333 | "version": "6.24.1",
334 | "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-unicode-regex/-/babel-plugin-transform-es2015-unicode-regex-6.24.1.tgz",
335 | "integrity": "sha1-04sS9C6nMj9yk4fxinxa4frrNek=",
336 | "dev": true
337 | },
338 | "babel-plugin-transform-exponentiation-operator": {
339 | "version": "6.24.1",
340 | "resolved": "https://registry.npmjs.org/babel-plugin-transform-exponentiation-operator/-/babel-plugin-transform-exponentiation-operator-6.24.1.tgz",
341 | "integrity": "sha1-KrDJx/MJj6SJB3cruBP+QejeOg4=",
342 | "dev": true
343 | },
344 | "babel-plugin-transform-strict-mode": {
345 | "version": "6.24.1",
346 | "resolved": "https://registry.npmjs.org/babel-plugin-transform-strict-mode/-/babel-plugin-transform-strict-mode-6.24.1.tgz",
347 | "integrity": "sha1-1fr3qleKZbvlkc9e2uBKDGcCB1g=",
348 | "dev": true
349 | },
350 | "babel-register": {
351 | "version": "6.24.1",
352 | "resolved": "https://registry.npmjs.org/babel-register/-/babel-register-6.24.1.tgz",
353 | "integrity": "sha1-fhDhOi9xBlvfrVoXh7pFvKbe118=",
354 | "dev": true,
355 | "dependencies": {
356 | "lodash": {
357 | "version": "4.17.4",
358 | "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.4.tgz",
359 | "integrity": "sha1-eCA6TRwyiuHYbcpkYONptX9AVa4=",
360 | "dev": true
361 | }
362 | }
363 | },
364 | "babel-runtime": {
365 | "version": "6.23.0",
366 | "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.23.0.tgz",
367 | "integrity": "sha1-CpSJ8UTecO+zzkMArM2zKeL8VDs=",
368 | "dev": true
369 | },
370 | "babel-template": {
371 | "version": "6.25.0",
372 | "resolved": "https://registry.npmjs.org/babel-template/-/babel-template-6.25.0.tgz",
373 | "integrity": "sha1-ZlJBFmt8KqTGGdceGSlpVSsQwHE=",
374 | "dev": true,
375 | "dependencies": {
376 | "lodash": {
377 | "version": "4.17.4",
378 | "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.4.tgz",
379 | "integrity": "sha1-eCA6TRwyiuHYbcpkYONptX9AVa4=",
380 | "dev": true
381 | }
382 | }
383 | },
384 | "babel-traverse": {
385 | "version": "6.25.0",
386 | "resolved": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.25.0.tgz",
387 | "integrity": "sha1-IldJfi/NGbie3BPEyROB+VEklvE=",
388 | "dev": true,
389 | "dependencies": {
390 | "lodash": {
391 | "version": "4.17.4",
392 | "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.4.tgz",
393 | "integrity": "sha1-eCA6TRwyiuHYbcpkYONptX9AVa4=",
394 | "dev": true
395 | }
396 | }
397 | },
398 | "babel-types": {
399 | "version": "6.25.0",
400 | "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.25.0.tgz",
401 | "integrity": "sha1-cK+ySNVmDl0Y+BHZHIMDtUE0oY4=",
402 | "dev": true,
403 | "dependencies": {
404 | "lodash": {
405 | "version": "4.17.4",
406 | "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.4.tgz",
407 | "integrity": "sha1-eCA6TRwyiuHYbcpkYONptX9AVa4=",
408 | "dev": true
409 | }
410 | }
411 | },
412 | "babylon": {
413 | "version": "6.17.4",
414 | "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.17.4.tgz",
415 | "integrity": "sha512-kChlV+0SXkjE0vUn9OZ7pBMWRFd8uq3mZe8x1K6jhuNcAFAtEnjchFAqB+dYEXKyd+JpT6eppRR78QAr5gTsUw==",
416 | "dev": true
417 | },
418 | "balanced-match": {
419 | "version": "1.0.0",
420 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz",
421 | "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=",
422 | "dev": true
423 | },
424 | "binary-extensions": {
425 | "version": "1.8.0",
426 | "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.8.0.tgz",
427 | "integrity": "sha1-SOyNFt9Dd+rl+liEaCSAr02Vx3Q=",
428 | "dev": true
429 | },
430 | "bluebird": {
431 | "version": "3.5.0",
432 | "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.0.tgz",
433 | "integrity": "sha1-eRQg1/VR7qKJdFOop3ZT+WYG1nw=",
434 | "dev": true
435 | },
436 | "boxen": {
437 | "version": "1.1.0",
438 | "resolved": "https://registry.npmjs.org/boxen/-/boxen-1.1.0.tgz",
439 | "integrity": "sha1-sbad1SIwXoB6md7ud329blFnsQI=",
440 | "dev": true,
441 | "dependencies": {
442 | "camelcase": {
443 | "version": "4.1.0",
444 | "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz",
445 | "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=",
446 | "dev": true
447 | }
448 | }
449 | },
450 | "brace-expansion": {
451 | "version": "1.1.8",
452 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.8.tgz",
453 | "integrity": "sha1-wHshHHyVLsH479Uad+8NHTmQopI=",
454 | "dev": true
455 | },
456 | "braces": {
457 | "version": "1.8.5",
458 | "resolved": "https://registry.npmjs.org/braces/-/braces-1.8.5.tgz",
459 | "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=",
460 | "dev": true
461 | },
462 | "buf-compare": {
463 | "version": "1.0.1",
464 | "resolved": "https://registry.npmjs.org/buf-compare/-/buf-compare-1.0.1.tgz",
465 | "integrity": "sha1-/vKNqLgROgoNtEMLC2Rntpcws0o=",
466 | "dev": true
467 | },
468 | "builtin-modules": {
469 | "version": "1.1.1",
470 | "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz",
471 | "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=",
472 | "dev": true
473 | },
474 | "caching-transform": {
475 | "version": "1.0.1",
476 | "resolved": "https://registry.npmjs.org/caching-transform/-/caching-transform-1.0.1.tgz",
477 | "integrity": "sha1-bb2y8g+Nj7znnz6U6dF0Lc31wKE=",
478 | "dev": true,
479 | "dependencies": {
480 | "md5-hex": {
481 | "version": "1.3.0",
482 | "resolved": "https://registry.npmjs.org/md5-hex/-/md5-hex-1.3.0.tgz",
483 | "integrity": "sha1-0sSv6YPENwZiF5uMrRRSGRNQRsQ=",
484 | "dev": true
485 | },
486 | "write-file-atomic": {
487 | "version": "1.3.4",
488 | "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-1.3.4.tgz",
489 | "integrity": "sha1-+Aek8LHZ6ROuekgRLmzDrxmRtF8=",
490 | "dev": true
491 | }
492 | }
493 | },
494 | "call-matcher": {
495 | "version": "1.0.1",
496 | "resolved": "https://registry.npmjs.org/call-matcher/-/call-matcher-1.0.1.tgz",
497 | "integrity": "sha1-UTTQd5hPcSpU2tPL9i3ijc5BbKg=",
498 | "dev": true
499 | },
500 | "call-signature": {
501 | "version": "0.0.2",
502 | "resolved": "https://registry.npmjs.org/call-signature/-/call-signature-0.0.2.tgz",
503 | "integrity": "sha1-qEq8glpV70yysCi9dOIFpluaSZY=",
504 | "dev": true
505 | },
506 | "camelcase": {
507 | "version": "2.1.1",
508 | "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz",
509 | "integrity": "sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8=",
510 | "dev": true
511 | },
512 | "camelcase-keys": {
513 | "version": "2.1.0",
514 | "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-2.1.0.tgz",
515 | "integrity": "sha1-MIvur/3ygRkFHvodkyITyRuPkuc=",
516 | "dev": true
517 | },
518 | "capture-stack-trace": {
519 | "version": "1.0.0",
520 | "resolved": "https://registry.npmjs.org/capture-stack-trace/-/capture-stack-trace-1.0.0.tgz",
521 | "integrity": "sha1-Sm+gc5nCa7pH8LJJa00PtAjFVQ0=",
522 | "dev": true
523 | },
524 | "chalk": {
525 | "version": "1.1.3",
526 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
527 | "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
528 | "dev": true,
529 | "dependencies": {
530 | "supports-color": {
531 | "version": "2.0.0",
532 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz",
533 | "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=",
534 | "dev": true
535 | }
536 | }
537 | },
538 | "chokidar": {
539 | "version": "1.7.0",
540 | "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-1.7.0.tgz",
541 | "integrity": "sha1-eY5ol3gVHIB2tLNg5e3SjNortGg=",
542 | "dev": true
543 | },
544 | "ci-info": {
545 | "version": "1.0.0",
546 | "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-1.0.0.tgz",
547 | "integrity": "sha1-3FKF8rTiUYIWg2gcOBwziPRuxTQ=",
548 | "dev": true
549 | },
550 | "clean-stack": {
551 | "version": "1.3.0",
552 | "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-1.3.0.tgz",
553 | "integrity": "sha1-noIVAa6XmYbEax1m0tQy2y/UrjE=",
554 | "dev": true
555 | },
556 | "clean-yaml-object": {
557 | "version": "0.1.0",
558 | "resolved": "https://registry.npmjs.org/clean-yaml-object/-/clean-yaml-object-0.1.0.tgz",
559 | "integrity": "sha1-Y/sRDcLOGoTcIfbZM0h20BCui2g=",
560 | "dev": true
561 | },
562 | "cli-boxes": {
563 | "version": "1.0.0",
564 | "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-1.0.0.tgz",
565 | "integrity": "sha1-T6kXw+WclKAEzWH47lCdplFocUM=",
566 | "dev": true
567 | },
568 | "cli-cursor": {
569 | "version": "2.1.0",
570 | "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz",
571 | "integrity": "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=",
572 | "dev": true
573 | },
574 | "cli-spinners": {
575 | "version": "1.0.0",
576 | "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-1.0.0.tgz",
577 | "integrity": "sha1-75h+09SDkaw9q5GAtAanQhgNbmo=",
578 | "dev": true
579 | },
580 | "cli-truncate": {
581 | "version": "1.0.0",
582 | "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-1.0.0.tgz",
583 | "integrity": "sha1-IeuR9Hs/ZWDwBNt3p2m0Zo2cVRg=",
584 | "dev": true
585 | },
586 | "co-with-promise": {
587 | "version": "4.6.0",
588 | "resolved": "https://registry.npmjs.org/co-with-promise/-/co-with-promise-4.6.0.tgz",
589 | "integrity": "sha1-QT59tvWJOmC5Qs9JLEvsk9tBWrc=",
590 | "dev": true,
591 | "dependencies": {
592 | "pinkie": {
593 | "version": "1.0.0",
594 | "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-1.0.0.tgz",
595 | "integrity": "sha1-Wkfyi6EBXQIBvae/DzWOR77Ix+Q=",
596 | "dev": true
597 | },
598 | "pinkie-promise": {
599 | "version": "1.0.0",
600 | "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-1.0.0.tgz",
601 | "integrity": "sha1-0dpn9UglY7t89X8oauKCLs+/NnA=",
602 | "dev": true
603 | }
604 | }
605 | },
606 | "code-excerpt": {
607 | "version": "2.1.0",
608 | "resolved": "https://registry.npmjs.org/code-excerpt/-/code-excerpt-2.1.0.tgz",
609 | "integrity": "sha1-XcwIHoj0p+O1VOnjXX7yMtR/gUc=",
610 | "dev": true
611 | },
612 | "code-point-at": {
613 | "version": "1.1.0",
614 | "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz",
615 | "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=",
616 | "dev": true
617 | },
618 | "color-convert": {
619 | "version": "1.9.0",
620 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.0.tgz",
621 | "integrity": "sha1-Gsz5fdc5uYO/mU1W/sj5WFNkG3o=",
622 | "dev": true
623 | },
624 | "color-name": {
625 | "version": "1.1.2",
626 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.2.tgz",
627 | "integrity": "sha1-XIq3K2S9IhXWF66VWeuxSEdc+Y0=",
628 | "dev": true
629 | },
630 | "common-path-prefix": {
631 | "version": "1.0.0",
632 | "resolved": "https://registry.npmjs.org/common-path-prefix/-/common-path-prefix-1.0.0.tgz",
633 | "integrity": "sha1-zVL28HEuC6q5fW+XModPIvR3UsA=",
634 | "dev": true
635 | },
636 | "commondir": {
637 | "version": "1.0.1",
638 | "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz",
639 | "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=",
640 | "dev": true
641 | },
642 | "concat-map": {
643 | "version": "0.0.1",
644 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
645 | "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=",
646 | "dev": true
647 | },
648 | "configstore": {
649 | "version": "3.1.0",
650 | "resolved": "https://registry.npmjs.org/configstore/-/configstore-3.1.0.tgz",
651 | "integrity": "sha1-Rd+QcHPibfoc9LLVL1tgVF6qEdE=",
652 | "dev": true
653 | },
654 | "convert-source-map": {
655 | "version": "1.5.0",
656 | "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.5.0.tgz",
657 | "integrity": "sha1-ms1whRxtXf3ZPZKC5e35SgP/RrU=",
658 | "dev": true
659 | },
660 | "convert-to-spaces": {
661 | "version": "1.0.2",
662 | "resolved": "https://registry.npmjs.org/convert-to-spaces/-/convert-to-spaces-1.0.2.tgz",
663 | "integrity": "sha1-fj5Iu+bZl7FBfdyihoIEtNPYVxU=",
664 | "dev": true
665 | },
666 | "core-assert": {
667 | "version": "0.2.1",
668 | "resolved": "https://registry.npmjs.org/core-assert/-/core-assert-0.2.1.tgz",
669 | "integrity": "sha1-+F4s+b/tKPdzzIs/pcW2m9wC/j8=",
670 | "dev": true
671 | },
672 | "core-js": {
673 | "version": "2.4.1",
674 | "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.4.1.tgz",
675 | "integrity": "sha1-TekR5mew6ukSTjQlS1OupvxhjT4=",
676 | "dev": true
677 | },
678 | "core-util-is": {
679 | "version": "1.0.2",
680 | "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz",
681 | "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=",
682 | "dev": true
683 | },
684 | "create-error-class": {
685 | "version": "3.0.2",
686 | "resolved": "https://registry.npmjs.org/create-error-class/-/create-error-class-3.0.2.tgz",
687 | "integrity": "sha1-Br56vvlHo/FKMP1hBnHUAbyot7Y=",
688 | "dev": true
689 | },
690 | "cross-spawn": {
691 | "version": "4.0.2",
692 | "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-4.0.2.tgz",
693 | "integrity": "sha1-e5JHYhwjrf3ThWAEqCPL45dCTUE=",
694 | "dev": true
695 | },
696 | "cross-spawn-async": {
697 | "version": "2.2.5",
698 | "resolved": "https://registry.npmjs.org/cross-spawn-async/-/cross-spawn-async-2.2.5.tgz",
699 | "integrity": "sha1-hF/wwINKPe2dFg2sptOQkGuyiMw=",
700 | "dev": true
701 | },
702 | "crypto-random-string": {
703 | "version": "1.0.0",
704 | "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-1.0.0.tgz",
705 | "integrity": "sha1-ojD2T1aDEOFJgAmUB5DsmVRbyn4=",
706 | "dev": true
707 | },
708 | "currently-unhandled": {
709 | "version": "0.4.1",
710 | "resolved": "https://registry.npmjs.org/currently-unhandled/-/currently-unhandled-0.4.1.tgz",
711 | "integrity": "sha1-mI3zP+qxke95mmE2nddsF635V+o=",
712 | "dev": true
713 | },
714 | "dagre": {
715 | "version": "0.7.4",
716 | "resolved": "https://registry.npmjs.org/dagre/-/dagre-0.7.4.tgz",
717 | "integrity": "sha1-3nLw50pVDOEc5jjwoTb+1xI5gCI="
718 | },
719 | "date-time": {
720 | "version": "0.1.1",
721 | "resolved": "https://registry.npmjs.org/date-time/-/date-time-0.1.1.tgz",
722 | "integrity": "sha1-7S9tk9l5DOL9ZtW1/z7dW7y/Owc=",
723 | "dev": true
724 | },
725 | "debug": {
726 | "version": "2.6.8",
727 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.8.tgz",
728 | "integrity": "sha1-5zFTHKLt4n0YgiJCfaF4IdaP9Pw=",
729 | "dev": true,
730 | "dependencies": {
731 | "ms": {
732 | "version": "2.0.0",
733 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
734 | "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
735 | "dev": true
736 | }
737 | }
738 | },
739 | "decamelize": {
740 | "version": "1.2.0",
741 | "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz",
742 | "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=",
743 | "dev": true
744 | },
745 | "deep-equal": {
746 | "version": "1.0.1",
747 | "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.0.1.tgz",
748 | "integrity": "sha1-9dJgKStmDghO/0zbyfCK0yR0SLU=",
749 | "dev": true
750 | },
751 | "deep-extend": {
752 | "version": "0.4.2",
753 | "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.4.2.tgz",
754 | "integrity": "sha1-SLaZwn4zS/ifEIkr5DL25MfTSn8=",
755 | "dev": true
756 | },
757 | "detect-indent": {
758 | "version": "4.0.0",
759 | "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-4.0.0.tgz",
760 | "integrity": "sha1-920GQ1LN9Docts5hnE7jqUdd4gg=",
761 | "dev": true
762 | },
763 | "diff": {
764 | "version": "3.2.0",
765 | "resolved": "https://registry.npmjs.org/diff/-/diff-3.2.0.tgz",
766 | "integrity": "sha1-yc45Okt8vQsFinJck98pkCeGj/k=",
767 | "dev": true
768 | },
769 | "diff-match-patch": {
770 | "version": "1.0.0",
771 | "resolved": "https://registry.npmjs.org/diff-match-patch/-/diff-match-patch-1.0.0.tgz",
772 | "integrity": "sha1-HMPIOkkNZ/ldkeOfatHy4Ia2MEg=",
773 | "dev": true
774 | },
775 | "dot-prop": {
776 | "version": "4.1.1",
777 | "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-4.1.1.tgz",
778 | "integrity": "sha1-qEk/C3te7sglJbXHWH+n3nyoWcE=",
779 | "dev": true
780 | },
781 | "duplexer3": {
782 | "version": "0.1.4",
783 | "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.4.tgz",
784 | "integrity": "sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=",
785 | "dev": true
786 | },
787 | "empower-core": {
788 | "version": "0.6.2",
789 | "resolved": "https://registry.npmjs.org/empower-core/-/empower-core-0.6.2.tgz",
790 | "integrity": "sha1-Wt71ZgiOMfuoC6CjbfR9cJQWkUQ=",
791 | "dev": true
792 | },
793 | "equal-length": {
794 | "version": "1.0.1",
795 | "resolved": "https://registry.npmjs.org/equal-length/-/equal-length-1.0.1.tgz",
796 | "integrity": "sha1-IcoRLUirJLTh5//A5TOdMf38J0w=",
797 | "dev": true
798 | },
799 | "error-ex": {
800 | "version": "1.3.1",
801 | "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.1.tgz",
802 | "integrity": "sha1-+FWobOYa3E6GIcPNoh56dhLDqNw=",
803 | "dev": true
804 | },
805 | "es6-error": {
806 | "version": "4.0.2",
807 | "resolved": "https://registry.npmjs.org/es6-error/-/es6-error-4.0.2.tgz",
808 | "integrity": "sha1-7sXHJurO9Rt/a3PCDbbhsTsGnJg=",
809 | "dev": true
810 | },
811 | "escape-string-regexp": {
812 | "version": "1.0.5",
813 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
814 | "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=",
815 | "dev": true
816 | },
817 | "espower-location-detector": {
818 | "version": "1.0.0",
819 | "resolved": "https://registry.npmjs.org/espower-location-detector/-/espower-location-detector-1.0.0.tgz",
820 | "integrity": "sha1-oXt+zFnTDheeK+9z+0E3cEyzMbU=",
821 | "dev": true
822 | },
823 | "esprima": {
824 | "version": "3.1.3",
825 | "resolved": "https://registry.npmjs.org/esprima/-/esprima-3.1.3.tgz",
826 | "integrity": "sha1-/cpRzuYTOJXjyI1TXOSdv/YqRjM=",
827 | "dev": true
828 | },
829 | "espurify": {
830 | "version": "1.7.0",
831 | "resolved": "https://registry.npmjs.org/espurify/-/espurify-1.7.0.tgz",
832 | "integrity": "sha1-HFz2y8zDLm9jk4C9T5kfq5up0iY=",
833 | "dev": true
834 | },
835 | "estraverse": {
836 | "version": "4.2.0",
837 | "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz",
838 | "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM=",
839 | "dev": true
840 | },
841 | "esutils": {
842 | "version": "2.0.2",
843 | "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz",
844 | "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=",
845 | "dev": true
846 | },
847 | "execa": {
848 | "version": "0.5.1",
849 | "resolved": "https://registry.npmjs.org/execa/-/execa-0.5.1.tgz",
850 | "integrity": "sha1-3j+4XLjW6RyFvLzrFkWBeFy1ezY=",
851 | "dev": true
852 | },
853 | "expand-brackets": {
854 | "version": "0.1.5",
855 | "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz",
856 | "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=",
857 | "dev": true
858 | },
859 | "expand-range": {
860 | "version": "1.8.2",
861 | "resolved": "https://registry.npmjs.org/expand-range/-/expand-range-1.8.2.tgz",
862 | "integrity": "sha1-opnv/TNf4nIeuujiV+x5ZE/IUzc=",
863 | "dev": true
864 | },
865 | "extglob": {
866 | "version": "0.3.2",
867 | "resolved": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz",
868 | "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=",
869 | "dev": true
870 | },
871 | "figures": {
872 | "version": "2.0.0",
873 | "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz",
874 | "integrity": "sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=",
875 | "dev": true
876 | },
877 | "filename-regex": {
878 | "version": "2.0.1",
879 | "resolved": "https://registry.npmjs.org/filename-regex/-/filename-regex-2.0.1.tgz",
880 | "integrity": "sha1-wcS5vuPglyXdsQa3XB4wH+LxiyY=",
881 | "dev": true
882 | },
883 | "fill-range": {
884 | "version": "2.2.3",
885 | "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-2.2.3.tgz",
886 | "integrity": "sha1-ULd9/X5Gm8dJJHCWNpn+eoSFpyM=",
887 | "dev": true
888 | },
889 | "find-cache-dir": {
890 | "version": "0.1.1",
891 | "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-0.1.1.tgz",
892 | "integrity": "sha1-yN765XyKUqinhPnjHFfHQumToLk=",
893 | "dev": true
894 | },
895 | "find-up": {
896 | "version": "2.1.0",
897 | "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz",
898 | "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=",
899 | "dev": true
900 | },
901 | "fn-name": {
902 | "version": "2.0.1",
903 | "resolved": "https://registry.npmjs.org/fn-name/-/fn-name-2.0.1.tgz",
904 | "integrity": "sha1-UhTXU3pNBqSjAcDMJi/rhBiAAuc=",
905 | "dev": true
906 | },
907 | "for-in": {
908 | "version": "1.0.2",
909 | "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz",
910 | "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=",
911 | "dev": true
912 | },
913 | "for-own": {
914 | "version": "0.1.5",
915 | "resolved": "https://registry.npmjs.org/for-own/-/for-own-0.1.5.tgz",
916 | "integrity": "sha1-UmXGgaTylNq78XyVCbZ2OqhFEM4=",
917 | "dev": true
918 | },
919 | "fs.realpath": {
920 | "version": "1.0.0",
921 | "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
922 | "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=",
923 | "dev": true
924 | },
925 | "fsevents": {
926 | "version": "1.1.2",
927 | "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.1.2.tgz",
928 | "integrity": "sha512-Sn44E5wQW4bTHXvQmvSHwqbuiXtduD6Rrjm2ZtUEGbyrig+nUH3t/QD4M4/ZXViY556TBpRgZkHLDx3JxPwxiw==",
929 | "dev": true,
930 | "optional": true,
931 | "dependencies": {
932 | "abbrev": {
933 | "version": "1.1.0",
934 | "bundled": true,
935 | "dev": true,
936 | "optional": true
937 | },
938 | "ajv": {
939 | "version": "4.11.8",
940 | "bundled": true,
941 | "dev": true,
942 | "optional": true
943 | },
944 | "ansi-regex": {
945 | "version": "2.1.1",
946 | "bundled": true,
947 | "dev": true
948 | },
949 | "aproba": {
950 | "version": "1.1.1",
951 | "bundled": true,
952 | "dev": true,
953 | "optional": true
954 | },
955 | "are-we-there-yet": {
956 | "version": "1.1.4",
957 | "bundled": true,
958 | "dev": true,
959 | "optional": true
960 | },
961 | "asn1": {
962 | "version": "0.2.3",
963 | "bundled": true,
964 | "dev": true,
965 | "optional": true
966 | },
967 | "assert-plus": {
968 | "version": "0.2.0",
969 | "bundled": true,
970 | "dev": true,
971 | "optional": true
972 | },
973 | "asynckit": {
974 | "version": "0.4.0",
975 | "bundled": true,
976 | "dev": true,
977 | "optional": true
978 | },
979 | "aws-sign2": {
980 | "version": "0.6.0",
981 | "bundled": true,
982 | "dev": true,
983 | "optional": true
984 | },
985 | "aws4": {
986 | "version": "1.6.0",
987 | "bundled": true,
988 | "dev": true,
989 | "optional": true
990 | },
991 | "balanced-match": {
992 | "version": "0.4.2",
993 | "bundled": true,
994 | "dev": true
995 | },
996 | "bcrypt-pbkdf": {
997 | "version": "1.0.1",
998 | "bundled": true,
999 | "dev": true,
1000 | "optional": true
1001 | },
1002 | "block-stream": {
1003 | "version": "0.0.9",
1004 | "bundled": true,
1005 | "dev": true
1006 | },
1007 | "boom": {
1008 | "version": "2.10.1",
1009 | "bundled": true,
1010 | "dev": true
1011 | },
1012 | "brace-expansion": {
1013 | "version": "1.1.7",
1014 | "bundled": true,
1015 | "dev": true
1016 | },
1017 | "buffer-shims": {
1018 | "version": "1.0.0",
1019 | "bundled": true,
1020 | "dev": true
1021 | },
1022 | "caseless": {
1023 | "version": "0.12.0",
1024 | "bundled": true,
1025 | "dev": true,
1026 | "optional": true
1027 | },
1028 | "co": {
1029 | "version": "4.6.0",
1030 | "bundled": true,
1031 | "dev": true,
1032 | "optional": true
1033 | },
1034 | "code-point-at": {
1035 | "version": "1.1.0",
1036 | "bundled": true,
1037 | "dev": true
1038 | },
1039 | "combined-stream": {
1040 | "version": "1.0.5",
1041 | "bundled": true,
1042 | "dev": true
1043 | },
1044 | "concat-map": {
1045 | "version": "0.0.1",
1046 | "bundled": true,
1047 | "dev": true
1048 | },
1049 | "console-control-strings": {
1050 | "version": "1.1.0",
1051 | "bundled": true,
1052 | "dev": true
1053 | },
1054 | "core-util-is": {
1055 | "version": "1.0.2",
1056 | "bundled": true,
1057 | "dev": true
1058 | },
1059 | "cryptiles": {
1060 | "version": "2.0.5",
1061 | "bundled": true,
1062 | "dev": true,
1063 | "optional": true
1064 | },
1065 | "dashdash": {
1066 | "version": "1.14.1",
1067 | "bundled": true,
1068 | "dev": true,
1069 | "optional": true,
1070 | "dependencies": {
1071 | "assert-plus": {
1072 | "version": "1.0.0",
1073 | "bundled": true,
1074 | "dev": true,
1075 | "optional": true
1076 | }
1077 | }
1078 | },
1079 | "debug": {
1080 | "version": "2.6.8",
1081 | "bundled": true,
1082 | "dev": true,
1083 | "optional": true
1084 | },
1085 | "deep-extend": {
1086 | "version": "0.4.2",
1087 | "bundled": true,
1088 | "dev": true,
1089 | "optional": true
1090 | },
1091 | "delayed-stream": {
1092 | "version": "1.0.0",
1093 | "bundled": true,
1094 | "dev": true
1095 | },
1096 | "delegates": {
1097 | "version": "1.0.0",
1098 | "bundled": true,
1099 | "dev": true,
1100 | "optional": true
1101 | },
1102 | "ecc-jsbn": {
1103 | "version": "0.1.1",
1104 | "bundled": true,
1105 | "dev": true,
1106 | "optional": true
1107 | },
1108 | "extend": {
1109 | "version": "3.0.1",
1110 | "bundled": true,
1111 | "dev": true,
1112 | "optional": true
1113 | },
1114 | "extsprintf": {
1115 | "version": "1.0.2",
1116 | "bundled": true,
1117 | "dev": true
1118 | },
1119 | "forever-agent": {
1120 | "version": "0.6.1",
1121 | "bundled": true,
1122 | "dev": true,
1123 | "optional": true
1124 | },
1125 | "form-data": {
1126 | "version": "2.1.4",
1127 | "bundled": true,
1128 | "dev": true,
1129 | "optional": true
1130 | },
1131 | "fs.realpath": {
1132 | "version": "1.0.0",
1133 | "bundled": true,
1134 | "dev": true
1135 | },
1136 | "fstream": {
1137 | "version": "1.0.11",
1138 | "bundled": true,
1139 | "dev": true
1140 | },
1141 | "fstream-ignore": {
1142 | "version": "1.0.5",
1143 | "bundled": true,
1144 | "dev": true,
1145 | "optional": true
1146 | },
1147 | "gauge": {
1148 | "version": "2.7.4",
1149 | "bundled": true,
1150 | "dev": true,
1151 | "optional": true
1152 | },
1153 | "getpass": {
1154 | "version": "0.1.7",
1155 | "bundled": true,
1156 | "dev": true,
1157 | "optional": true,
1158 | "dependencies": {
1159 | "assert-plus": {
1160 | "version": "1.0.0",
1161 | "bundled": true,
1162 | "dev": true,
1163 | "optional": true
1164 | }
1165 | }
1166 | },
1167 | "glob": {
1168 | "version": "7.1.2",
1169 | "bundled": true,
1170 | "dev": true
1171 | },
1172 | "graceful-fs": {
1173 | "version": "4.1.11",
1174 | "bundled": true,
1175 | "dev": true
1176 | },
1177 | "har-schema": {
1178 | "version": "1.0.5",
1179 | "bundled": true,
1180 | "dev": true,
1181 | "optional": true
1182 | },
1183 | "har-validator": {
1184 | "version": "4.2.1",
1185 | "bundled": true,
1186 | "dev": true,
1187 | "optional": true
1188 | },
1189 | "has-unicode": {
1190 | "version": "2.0.1",
1191 | "bundled": true,
1192 | "dev": true,
1193 | "optional": true
1194 | },
1195 | "hawk": {
1196 | "version": "3.1.3",
1197 | "bundled": true,
1198 | "dev": true,
1199 | "optional": true
1200 | },
1201 | "hoek": {
1202 | "version": "2.16.3",
1203 | "bundled": true,
1204 | "dev": true
1205 | },
1206 | "http-signature": {
1207 | "version": "1.1.1",
1208 | "bundled": true,
1209 | "dev": true,
1210 | "optional": true
1211 | },
1212 | "inflight": {
1213 | "version": "1.0.6",
1214 | "bundled": true,
1215 | "dev": true
1216 | },
1217 | "inherits": {
1218 | "version": "2.0.3",
1219 | "bundled": true,
1220 | "dev": true
1221 | },
1222 | "ini": {
1223 | "version": "1.3.4",
1224 | "bundled": true,
1225 | "dev": true,
1226 | "optional": true
1227 | },
1228 | "is-fullwidth-code-point": {
1229 | "version": "1.0.0",
1230 | "bundled": true,
1231 | "dev": true
1232 | },
1233 | "is-typedarray": {
1234 | "version": "1.0.0",
1235 | "bundled": true,
1236 | "dev": true,
1237 | "optional": true
1238 | },
1239 | "isarray": {
1240 | "version": "1.0.0",
1241 | "bundled": true,
1242 | "dev": true
1243 | },
1244 | "isstream": {
1245 | "version": "0.1.2",
1246 | "bundled": true,
1247 | "dev": true,
1248 | "optional": true
1249 | },
1250 | "jodid25519": {
1251 | "version": "1.0.2",
1252 | "bundled": true,
1253 | "dev": true,
1254 | "optional": true
1255 | },
1256 | "jsbn": {
1257 | "version": "0.1.1",
1258 | "bundled": true,
1259 | "dev": true,
1260 | "optional": true
1261 | },
1262 | "json-schema": {
1263 | "version": "0.2.3",
1264 | "bundled": true,
1265 | "dev": true,
1266 | "optional": true
1267 | },
1268 | "json-stable-stringify": {
1269 | "version": "1.0.1",
1270 | "bundled": true,
1271 | "dev": true,
1272 | "optional": true
1273 | },
1274 | "json-stringify-safe": {
1275 | "version": "5.0.1",
1276 | "bundled": true,
1277 | "dev": true,
1278 | "optional": true
1279 | },
1280 | "jsonify": {
1281 | "version": "0.0.0",
1282 | "bundled": true,
1283 | "dev": true,
1284 | "optional": true
1285 | },
1286 | "jsprim": {
1287 | "version": "1.4.0",
1288 | "bundled": true,
1289 | "dev": true,
1290 | "optional": true,
1291 | "dependencies": {
1292 | "assert-plus": {
1293 | "version": "1.0.0",
1294 | "bundled": true,
1295 | "dev": true,
1296 | "optional": true
1297 | }
1298 | }
1299 | },
1300 | "mime-db": {
1301 | "version": "1.27.0",
1302 | "bundled": true,
1303 | "dev": true
1304 | },
1305 | "mime-types": {
1306 | "version": "2.1.15",
1307 | "bundled": true,
1308 | "dev": true
1309 | },
1310 | "minimatch": {
1311 | "version": "3.0.4",
1312 | "bundled": true,
1313 | "dev": true
1314 | },
1315 | "minimist": {
1316 | "version": "0.0.8",
1317 | "bundled": true,
1318 | "dev": true
1319 | },
1320 | "mkdirp": {
1321 | "version": "0.5.1",
1322 | "bundled": true,
1323 | "dev": true
1324 | },
1325 | "ms": {
1326 | "version": "2.0.0",
1327 | "bundled": true,
1328 | "dev": true,
1329 | "optional": true
1330 | },
1331 | "node-pre-gyp": {
1332 | "version": "0.6.36",
1333 | "bundled": true,
1334 | "dev": true,
1335 | "optional": true
1336 | },
1337 | "nopt": {
1338 | "version": "4.0.1",
1339 | "bundled": true,
1340 | "dev": true,
1341 | "optional": true
1342 | },
1343 | "npmlog": {
1344 | "version": "4.1.0",
1345 | "bundled": true,
1346 | "dev": true,
1347 | "optional": true
1348 | },
1349 | "number-is-nan": {
1350 | "version": "1.0.1",
1351 | "bundled": true,
1352 | "dev": true
1353 | },
1354 | "oauth-sign": {
1355 | "version": "0.8.2",
1356 | "bundled": true,
1357 | "dev": true,
1358 | "optional": true
1359 | },
1360 | "object-assign": {
1361 | "version": "4.1.1",
1362 | "bundled": true,
1363 | "dev": true,
1364 | "optional": true
1365 | },
1366 | "once": {
1367 | "version": "1.4.0",
1368 | "bundled": true,
1369 | "dev": true
1370 | },
1371 | "os-homedir": {
1372 | "version": "1.0.2",
1373 | "bundled": true,
1374 | "dev": true,
1375 | "optional": true
1376 | },
1377 | "os-tmpdir": {
1378 | "version": "1.0.2",
1379 | "bundled": true,
1380 | "dev": true,
1381 | "optional": true
1382 | },
1383 | "osenv": {
1384 | "version": "0.1.4",
1385 | "bundled": true,
1386 | "dev": true,
1387 | "optional": true
1388 | },
1389 | "path-is-absolute": {
1390 | "version": "1.0.1",
1391 | "bundled": true,
1392 | "dev": true
1393 | },
1394 | "performance-now": {
1395 | "version": "0.2.0",
1396 | "bundled": true,
1397 | "dev": true,
1398 | "optional": true
1399 | },
1400 | "process-nextick-args": {
1401 | "version": "1.0.7",
1402 | "bundled": true,
1403 | "dev": true
1404 | },
1405 | "punycode": {
1406 | "version": "1.4.1",
1407 | "bundled": true,
1408 | "dev": true,
1409 | "optional": true
1410 | },
1411 | "qs": {
1412 | "version": "6.4.0",
1413 | "bundled": true,
1414 | "dev": true,
1415 | "optional": true
1416 | },
1417 | "rc": {
1418 | "version": "1.2.1",
1419 | "bundled": true,
1420 | "dev": true,
1421 | "optional": true,
1422 | "dependencies": {
1423 | "minimist": {
1424 | "version": "1.2.0",
1425 | "bundled": true,
1426 | "dev": true,
1427 | "optional": true
1428 | }
1429 | }
1430 | },
1431 | "readable-stream": {
1432 | "version": "2.2.9",
1433 | "bundled": true,
1434 | "dev": true
1435 | },
1436 | "request": {
1437 | "version": "2.81.0",
1438 | "bundled": true,
1439 | "dev": true,
1440 | "optional": true
1441 | },
1442 | "rimraf": {
1443 | "version": "2.6.1",
1444 | "bundled": true,
1445 | "dev": true
1446 | },
1447 | "safe-buffer": {
1448 | "version": "5.0.1",
1449 | "bundled": true,
1450 | "dev": true
1451 | },
1452 | "semver": {
1453 | "version": "5.3.0",
1454 | "bundled": true,
1455 | "dev": true,
1456 | "optional": true
1457 | },
1458 | "set-blocking": {
1459 | "version": "2.0.0",
1460 | "bundled": true,
1461 | "dev": true,
1462 | "optional": true
1463 | },
1464 | "signal-exit": {
1465 | "version": "3.0.2",
1466 | "bundled": true,
1467 | "dev": true,
1468 | "optional": true
1469 | },
1470 | "sntp": {
1471 | "version": "1.0.9",
1472 | "bundled": true,
1473 | "dev": true,
1474 | "optional": true
1475 | },
1476 | "sshpk": {
1477 | "version": "1.13.0",
1478 | "bundled": true,
1479 | "dev": true,
1480 | "optional": true,
1481 | "dependencies": {
1482 | "assert-plus": {
1483 | "version": "1.0.0",
1484 | "bundled": true,
1485 | "dev": true,
1486 | "optional": true
1487 | }
1488 | }
1489 | },
1490 | "string_decoder": {
1491 | "version": "1.0.1",
1492 | "bundled": true,
1493 | "dev": true
1494 | },
1495 | "string-width": {
1496 | "version": "1.0.2",
1497 | "bundled": true,
1498 | "dev": true
1499 | },
1500 | "stringstream": {
1501 | "version": "0.0.5",
1502 | "bundled": true,
1503 | "dev": true,
1504 | "optional": true
1505 | },
1506 | "strip-ansi": {
1507 | "version": "3.0.1",
1508 | "bundled": true,
1509 | "dev": true
1510 | },
1511 | "strip-json-comments": {
1512 | "version": "2.0.1",
1513 | "bundled": true,
1514 | "dev": true,
1515 | "optional": true
1516 | },
1517 | "tar": {
1518 | "version": "2.2.1",
1519 | "bundled": true,
1520 | "dev": true
1521 | },
1522 | "tar-pack": {
1523 | "version": "3.4.0",
1524 | "bundled": true,
1525 | "dev": true,
1526 | "optional": true
1527 | },
1528 | "tough-cookie": {
1529 | "version": "2.3.2",
1530 | "bundled": true,
1531 | "dev": true,
1532 | "optional": true
1533 | },
1534 | "tunnel-agent": {
1535 | "version": "0.6.0",
1536 | "bundled": true,
1537 | "dev": true,
1538 | "optional": true
1539 | },
1540 | "tweetnacl": {
1541 | "version": "0.14.5",
1542 | "bundled": true,
1543 | "dev": true,
1544 | "optional": true
1545 | },
1546 | "uid-number": {
1547 | "version": "0.0.6",
1548 | "bundled": true,
1549 | "dev": true,
1550 | "optional": true
1551 | },
1552 | "util-deprecate": {
1553 | "version": "1.0.2",
1554 | "bundled": true,
1555 | "dev": true
1556 | },
1557 | "uuid": {
1558 | "version": "3.0.1",
1559 | "bundled": true,
1560 | "dev": true,
1561 | "optional": true
1562 | },
1563 | "verror": {
1564 | "version": "1.3.6",
1565 | "bundled": true,
1566 | "dev": true,
1567 | "optional": true
1568 | },
1569 | "wide-align": {
1570 | "version": "1.1.2",
1571 | "bundled": true,
1572 | "dev": true,
1573 | "optional": true
1574 | },
1575 | "wrappy": {
1576 | "version": "1.0.2",
1577 | "bundled": true,
1578 | "dev": true
1579 | }
1580 | }
1581 | },
1582 | "get-port": {
1583 | "version": "3.1.0",
1584 | "resolved": "https://registry.npmjs.org/get-port/-/get-port-3.1.0.tgz",
1585 | "integrity": "sha1-7wGxioTKZIaXD/meVERhQac//T4=",
1586 | "dev": true
1587 | },
1588 | "get-stdin": {
1589 | "version": "4.0.1",
1590 | "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz",
1591 | "integrity": "sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4=",
1592 | "dev": true
1593 | },
1594 | "get-stream": {
1595 | "version": "2.3.1",
1596 | "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-2.3.1.tgz",
1597 | "integrity": "sha1-Xzj5PzRgCWZu4BUKBUFn+Rvdld4=",
1598 | "dev": true
1599 | },
1600 | "glob": {
1601 | "version": "7.1.2",
1602 | "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz",
1603 | "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==",
1604 | "dev": true
1605 | },
1606 | "glob-base": {
1607 | "version": "0.3.0",
1608 | "resolved": "https://registry.npmjs.org/glob-base/-/glob-base-0.3.0.tgz",
1609 | "integrity": "sha1-27Fk9iIbHAscz4Kuoyi0l98Oo8Q=",
1610 | "dev": true
1611 | },
1612 | "glob-parent": {
1613 | "version": "2.0.0",
1614 | "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-2.0.0.tgz",
1615 | "integrity": "sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg=",
1616 | "dev": true
1617 | },
1618 | "globals": {
1619 | "version": "9.18.0",
1620 | "resolved": "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz",
1621 | "integrity": "sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ==",
1622 | "dev": true
1623 | },
1624 | "globby": {
1625 | "version": "6.1.0",
1626 | "resolved": "https://registry.npmjs.org/globby/-/globby-6.1.0.tgz",
1627 | "integrity": "sha1-9abXDoOV4hyFj7BInWTfAkJNUGw=",
1628 | "dev": true
1629 | },
1630 | "got": {
1631 | "version": "6.7.1",
1632 | "resolved": "https://registry.npmjs.org/got/-/got-6.7.1.tgz",
1633 | "integrity": "sha1-JAzQV4WpoY5WHcG0S0HHY+8ejbA=",
1634 | "dev": true,
1635 | "dependencies": {
1636 | "get-stream": {
1637 | "version": "3.0.0",
1638 | "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz",
1639 | "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=",
1640 | "dev": true
1641 | }
1642 | }
1643 | },
1644 | "graceful-fs": {
1645 | "version": "4.1.11",
1646 | "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz",
1647 | "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=",
1648 | "dev": true
1649 | },
1650 | "graphlib": {
1651 | "version": "1.0.7",
1652 | "resolved": "https://registry.npmjs.org/graphlib/-/graphlib-1.0.7.tgz",
1653 | "integrity": "sha1-DKst8P/mq+BwsmJb+h7bbslnuLE="
1654 | },
1655 | "has-ansi": {
1656 | "version": "2.0.0",
1657 | "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz",
1658 | "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=",
1659 | "dev": true
1660 | },
1661 | "has-color": {
1662 | "version": "0.1.7",
1663 | "resolved": "https://registry.npmjs.org/has-color/-/has-color-0.1.7.tgz",
1664 | "integrity": "sha1-ZxRKUmDDT8PMpnfQQdr1L+e3iy8=",
1665 | "dev": true
1666 | },
1667 | "has-flag": {
1668 | "version": "2.0.0",
1669 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz",
1670 | "integrity": "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE=",
1671 | "dev": true
1672 | },
1673 | "has-yarn": {
1674 | "version": "1.0.0",
1675 | "resolved": "https://registry.npmjs.org/has-yarn/-/has-yarn-1.0.0.tgz",
1676 | "integrity": "sha1-ieJdtgS3Jcj1l2//Ct3JIbgopac=",
1677 | "dev": true
1678 | },
1679 | "home-or-tmp": {
1680 | "version": "2.0.0",
1681 | "resolved": "https://registry.npmjs.org/home-or-tmp/-/home-or-tmp-2.0.0.tgz",
1682 | "integrity": "sha1-42w/LSyufXRqhX440Y1fMqeILbg=",
1683 | "dev": true
1684 | },
1685 | "hosted-git-info": {
1686 | "version": "2.5.0",
1687 | "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.5.0.tgz",
1688 | "integrity": "sha512-pNgbURSuab90KbTqvRPsseaTxOJCZBD0a7t+haSN33piP9cCM4l0CqdzAif2hUqm716UovKB2ROmiabGAKVXyg==",
1689 | "dev": true
1690 | },
1691 | "hullabaloo-config-manager": {
1692 | "version": "1.1.1",
1693 | "resolved": "https://registry.npmjs.org/hullabaloo-config-manager/-/hullabaloo-config-manager-1.1.1.tgz",
1694 | "integrity": "sha512-ztKnkZV0TmxnumCDHHgLGNiDnotu4EHCp9YMkznWuo4uTtCyJ+cu+RNcxUeXYKTllpvLFWnbfWry09yzszgg+A==",
1695 | "dev": true,
1696 | "dependencies": {
1697 | "pkg-dir": {
1698 | "version": "2.0.0",
1699 | "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-2.0.0.tgz",
1700 | "integrity": "sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s=",
1701 | "dev": true
1702 | }
1703 | }
1704 | },
1705 | "ignore-by-default": {
1706 | "version": "1.0.1",
1707 | "resolved": "https://registry.npmjs.org/ignore-by-default/-/ignore-by-default-1.0.1.tgz",
1708 | "integrity": "sha1-SMptcvbGo68Aqa1K5odr44ieKwk=",
1709 | "dev": true
1710 | },
1711 | "import-lazy": {
1712 | "version": "2.1.0",
1713 | "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-2.1.0.tgz",
1714 | "integrity": "sha1-BWmOPUXIjo1+nZLLBYTnfwlvPkM=",
1715 | "dev": true
1716 | },
1717 | "imurmurhash": {
1718 | "version": "0.1.4",
1719 | "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz",
1720 | "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=",
1721 | "dev": true
1722 | },
1723 | "indent-string": {
1724 | "version": "3.1.0",
1725 | "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-3.1.0.tgz",
1726 | "integrity": "sha1-CP9DNGAziDmbMp5rlTjcejz13n0=",
1727 | "dev": true
1728 | },
1729 | "inflight": {
1730 | "version": "1.0.6",
1731 | "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
1732 | "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=",
1733 | "dev": true
1734 | },
1735 | "inherits": {
1736 | "version": "2.0.3",
1737 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
1738 | "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=",
1739 | "dev": true
1740 | },
1741 | "ini": {
1742 | "version": "1.3.4",
1743 | "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.4.tgz",
1744 | "integrity": "sha1-BTfLedr1m1mhpRff9wbIbsA5Fi4=",
1745 | "dev": true
1746 | },
1747 | "invariant": {
1748 | "version": "2.2.2",
1749 | "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.2.tgz",
1750 | "integrity": "sha1-nh9WrArNtr8wMwbzOL47IErmA2A=",
1751 | "dev": true
1752 | },
1753 | "irregular-plurals": {
1754 | "version": "1.3.0",
1755 | "resolved": "https://registry.npmjs.org/irregular-plurals/-/irregular-plurals-1.3.0.tgz",
1756 | "integrity": "sha512-njf5A+Mxb3kojuHd1DzISjjIl+XhyzovXEOyPPSzdQozq/Lf2tN27mOrAAsxEPZxpn6I4MGzs1oo9TxXxPFpaA==",
1757 | "dev": true
1758 | },
1759 | "is-arrayish": {
1760 | "version": "0.2.1",
1761 | "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz",
1762 | "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=",
1763 | "dev": true
1764 | },
1765 | "is-binary-path": {
1766 | "version": "1.0.1",
1767 | "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz",
1768 | "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=",
1769 | "dev": true
1770 | },
1771 | "is-buffer": {
1772 | "version": "1.1.5",
1773 | "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.5.tgz",
1774 | "integrity": "sha1-Hzsm72E7IUuIy8ojzGwB2Hlh7sw=",
1775 | "dev": true
1776 | },
1777 | "is-builtin-module": {
1778 | "version": "1.0.0",
1779 | "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-1.0.0.tgz",
1780 | "integrity": "sha1-VAVy0096wxGfj3bDDLwbHgN6/74=",
1781 | "dev": true
1782 | },
1783 | "is-ci": {
1784 | "version": "1.0.10",
1785 | "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-1.0.10.tgz",
1786 | "integrity": "sha1-9zkzayYyNlBhqdSCcM1WrjNpMY4=",
1787 | "dev": true
1788 | },
1789 | "is-dotfile": {
1790 | "version": "1.0.3",
1791 | "resolved": "https://registry.npmjs.org/is-dotfile/-/is-dotfile-1.0.3.tgz",
1792 | "integrity": "sha1-pqLzL/0t+wT1yiXs0Pa4PPeYoeE=",
1793 | "dev": true
1794 | },
1795 | "is-equal-shallow": {
1796 | "version": "0.1.3",
1797 | "resolved": "https://registry.npmjs.org/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz",
1798 | "integrity": "sha1-IjgJj8Ih3gvPpdnqxMRdY4qhxTQ=",
1799 | "dev": true
1800 | },
1801 | "is-error": {
1802 | "version": "2.2.1",
1803 | "resolved": "https://registry.npmjs.org/is-error/-/is-error-2.2.1.tgz",
1804 | "integrity": "sha1-aEqW2EB2V3yY9M20DG0mpRI78Zw=",
1805 | "dev": true
1806 | },
1807 | "is-extendable": {
1808 | "version": "0.1.1",
1809 | "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz",
1810 | "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=",
1811 | "dev": true
1812 | },
1813 | "is-extglob": {
1814 | "version": "1.0.0",
1815 | "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz",
1816 | "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=",
1817 | "dev": true
1818 | },
1819 | "is-finite": {
1820 | "version": "1.0.2",
1821 | "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.0.2.tgz",
1822 | "integrity": "sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko=",
1823 | "dev": true
1824 | },
1825 | "is-fullwidth-code-point": {
1826 | "version": "2.0.0",
1827 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz",
1828 | "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=",
1829 | "dev": true
1830 | },
1831 | "is-generator-fn": {
1832 | "version": "1.0.0",
1833 | "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-1.0.0.tgz",
1834 | "integrity": "sha1-lp1J4bszKfa7fwkIm+JleLLd1Go=",
1835 | "dev": true
1836 | },
1837 | "is-glob": {
1838 | "version": "2.0.1",
1839 | "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz",
1840 | "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=",
1841 | "dev": true
1842 | },
1843 | "is-npm": {
1844 | "version": "1.0.0",
1845 | "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-1.0.0.tgz",
1846 | "integrity": "sha1-8vtjpl5JBbQGyGBydloaTceTufQ=",
1847 | "dev": true
1848 | },
1849 | "is-number": {
1850 | "version": "2.1.0",
1851 | "resolved": "https://registry.npmjs.org/is-number/-/is-number-2.1.0.tgz",
1852 | "integrity": "sha1-Afy7s5NGOlSPL0ZszhbezknbkI8=",
1853 | "dev": true
1854 | },
1855 | "is-obj": {
1856 | "version": "1.0.1",
1857 | "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz",
1858 | "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=",
1859 | "dev": true
1860 | },
1861 | "is-observable": {
1862 | "version": "0.2.0",
1863 | "resolved": "https://registry.npmjs.org/is-observable/-/is-observable-0.2.0.tgz",
1864 | "integrity": "sha1-s2ExHYPG5dcmyr9eJQsCNxBvWuI=",
1865 | "dev": true
1866 | },
1867 | "is-plain-obj": {
1868 | "version": "1.1.0",
1869 | "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz",
1870 | "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4=",
1871 | "dev": true
1872 | },
1873 | "is-posix-bracket": {
1874 | "version": "0.1.1",
1875 | "resolved": "https://registry.npmjs.org/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz",
1876 | "integrity": "sha1-MzTceXdDaOkvAW5vvAqI9c1ua8Q=",
1877 | "dev": true
1878 | },
1879 | "is-primitive": {
1880 | "version": "2.0.0",
1881 | "resolved": "https://registry.npmjs.org/is-primitive/-/is-primitive-2.0.0.tgz",
1882 | "integrity": "sha1-IHurkWOEmcB7Kt8kCkGochADRXU=",
1883 | "dev": true
1884 | },
1885 | "is-promise": {
1886 | "version": "2.1.0",
1887 | "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.1.0.tgz",
1888 | "integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o=",
1889 | "dev": true
1890 | },
1891 | "is-redirect": {
1892 | "version": "1.0.0",
1893 | "resolved": "https://registry.npmjs.org/is-redirect/-/is-redirect-1.0.0.tgz",
1894 | "integrity": "sha1-HQPd7VO9jbDzDCbk+V02/HyH3CQ=",
1895 | "dev": true
1896 | },
1897 | "is-retry-allowed": {
1898 | "version": "1.1.0",
1899 | "resolved": "https://registry.npmjs.org/is-retry-allowed/-/is-retry-allowed-1.1.0.tgz",
1900 | "integrity": "sha1-EaBgVotnM5REAz0BJaYaINVk+zQ=",
1901 | "dev": true
1902 | },
1903 | "is-stream": {
1904 | "version": "1.1.0",
1905 | "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz",
1906 | "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=",
1907 | "dev": true
1908 | },
1909 | "is-url": {
1910 | "version": "1.2.2",
1911 | "resolved": "https://registry.npmjs.org/is-url/-/is-url-1.2.2.tgz",
1912 | "integrity": "sha1-SYkFpZO/R8wtnn9zg3K792lsfyY=",
1913 | "dev": true
1914 | },
1915 | "is-utf8": {
1916 | "version": "0.2.1",
1917 | "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz",
1918 | "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=",
1919 | "dev": true
1920 | },
1921 | "isarray": {
1922 | "version": "1.0.0",
1923 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
1924 | "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=",
1925 | "dev": true
1926 | },
1927 | "isexe": {
1928 | "version": "2.0.0",
1929 | "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
1930 | "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=",
1931 | "dev": true
1932 | },
1933 | "isobject": {
1934 | "version": "2.1.0",
1935 | "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz",
1936 | "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=",
1937 | "dev": true
1938 | },
1939 | "jest-diff": {
1940 | "version": "19.0.0",
1941 | "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-19.0.0.tgz",
1942 | "integrity": "sha1-0VY8/FbItgIymI+8BdTRbtkPBjw=",
1943 | "dev": true
1944 | },
1945 | "jest-file-exists": {
1946 | "version": "19.0.0",
1947 | "resolved": "https://registry.npmjs.org/jest-file-exists/-/jest-file-exists-19.0.0.tgz",
1948 | "integrity": "sha1-zKLlh6EeyS4kz+qz+KlNZX8/zrg=",
1949 | "dev": true
1950 | },
1951 | "jest-matcher-utils": {
1952 | "version": "19.0.0",
1953 | "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-19.0.0.tgz",
1954 | "integrity": "sha1-Xs2bY1ZdKwAfYfv37Ex/U3lkVk0=",
1955 | "dev": true
1956 | },
1957 | "jest-message-util": {
1958 | "version": "19.0.0",
1959 | "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-19.0.0.tgz",
1960 | "integrity": "sha1-cheWuJwOTXYWBvm6jLgoo7YkZBY=",
1961 | "dev": true
1962 | },
1963 | "jest-mock": {
1964 | "version": "19.0.0",
1965 | "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-19.0.0.tgz",
1966 | "integrity": "sha1-ZwOGQelgerLOCOxKjLg6q7yJnQE=",
1967 | "dev": true
1968 | },
1969 | "jest-snapshot": {
1970 | "version": "19.0.2",
1971 | "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-19.0.2.tgz",
1972 | "integrity": "sha1-nBshYhT3GHw4v9XHCx76sWsP9Qs=",
1973 | "dev": true
1974 | },
1975 | "jest-util": {
1976 | "version": "19.0.2",
1977 | "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-19.0.2.tgz",
1978 | "integrity": "sha1-4KAjKiq55rK1Nmi9s1NMK1l37UE=",
1979 | "dev": true
1980 | },
1981 | "jest-validate": {
1982 | "version": "19.0.2",
1983 | "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-19.0.2.tgz",
1984 | "integrity": "sha1-3FNN9fEnjVtj3zKxQkHU2/ckTAw=",
1985 | "dev": true
1986 | },
1987 | "js-tokens": {
1988 | "version": "3.0.2",
1989 | "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz",
1990 | "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=",
1991 | "dev": true
1992 | },
1993 | "js-yaml": {
1994 | "version": "3.8.4",
1995 | "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.8.4.tgz",
1996 | "integrity": "sha1-UgtFZPhlc7qWZir4Woyvp7S1pvY=",
1997 | "dev": true
1998 | },
1999 | "jsesc": {
2000 | "version": "0.5.0",
2001 | "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz",
2002 | "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=",
2003 | "dev": true
2004 | },
2005 | "json5": {
2006 | "version": "0.5.1",
2007 | "resolved": "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz",
2008 | "integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=",
2009 | "dev": true
2010 | },
2011 | "kind-of": {
2012 | "version": "3.2.2",
2013 | "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
2014 | "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
2015 | "dev": true
2016 | },
2017 | "konva": {
2018 | "version": "1.6.3",
2019 | "resolved": "https://registry.npmjs.org/konva/-/konva-1.6.3.tgz",
2020 | "integrity": "sha1-M/pEKC0SSKbwt714DcrHYy20xr0="
2021 | },
2022 | "last-line-stream": {
2023 | "version": "1.0.0",
2024 | "resolved": "https://registry.npmjs.org/last-line-stream/-/last-line-stream-1.0.0.tgz",
2025 | "integrity": "sha1-0bZNafhv8kry0EiDos7uFFIKVgA=",
2026 | "dev": true
2027 | },
2028 | "latest-version": {
2029 | "version": "3.1.0",
2030 | "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-3.1.0.tgz",
2031 | "integrity": "sha1-ogU4P+oyKzO1rjsYq+4NwvNW7hU=",
2032 | "dev": true
2033 | },
2034 | "leven": {
2035 | "version": "2.1.0",
2036 | "resolved": "https://registry.npmjs.org/leven/-/leven-2.1.0.tgz",
2037 | "integrity": "sha1-wuep93IJTe6dNCAq6KzORoeHVYA=",
2038 | "dev": true
2039 | },
2040 | "load-json-file": {
2041 | "version": "2.0.0",
2042 | "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-2.0.0.tgz",
2043 | "integrity": "sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg=",
2044 | "dev": true
2045 | },
2046 | "locate-path": {
2047 | "version": "2.0.0",
2048 | "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz",
2049 | "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=",
2050 | "dev": true
2051 | },
2052 | "lodash": {
2053 | "version": "3.10.1",
2054 | "resolved": "https://registry.npmjs.org/lodash/-/lodash-3.10.1.tgz",
2055 | "integrity": "sha1-W/Rejkm6QYnhfUgnid/RW9FAt7Y="
2056 | },
2057 | "lodash.clonedeep": {
2058 | "version": "4.5.0",
2059 | "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz",
2060 | "integrity": "sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8=",
2061 | "dev": true
2062 | },
2063 | "lodash.clonedeepwith": {
2064 | "version": "4.5.0",
2065 | "resolved": "https://registry.npmjs.org/lodash.clonedeepwith/-/lodash.clonedeepwith-4.5.0.tgz",
2066 | "integrity": "sha1-buMFc6A6GmDWcKYu8zwQzxr9vdQ=",
2067 | "dev": true
2068 | },
2069 | "lodash.debounce": {
2070 | "version": "4.0.8",
2071 | "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz",
2072 | "integrity": "sha1-gteb/zCmfEAF/9XiUVMArZyk168=",
2073 | "dev": true
2074 | },
2075 | "lodash.difference": {
2076 | "version": "4.5.0",
2077 | "resolved": "https://registry.npmjs.org/lodash.difference/-/lodash.difference-4.5.0.tgz",
2078 | "integrity": "sha1-nMtOUF1Ia5FlE0V3KIWi3yf9AXw=",
2079 | "dev": true
2080 | },
2081 | "lodash.flatten": {
2082 | "version": "4.4.0",
2083 | "resolved": "https://registry.npmjs.org/lodash.flatten/-/lodash.flatten-4.4.0.tgz",
2084 | "integrity": "sha1-8xwiIlqWMtK7+OSt2+8kCqdlph8=",
2085 | "dev": true
2086 | },
2087 | "lodash.flattendeep": {
2088 | "version": "4.4.0",
2089 | "resolved": "https://registry.npmjs.org/lodash.flattendeep/-/lodash.flattendeep-4.4.0.tgz",
2090 | "integrity": "sha1-+wMJF/hqMTTlvJvsDWngAT3f7bI=",
2091 | "dev": true
2092 | },
2093 | "lodash.isequal": {
2094 | "version": "4.5.0",
2095 | "resolved": "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz",
2096 | "integrity": "sha1-QVxEePK8wwEgwizhDtMib30+GOA=",
2097 | "dev": true
2098 | },
2099 | "lodash.merge": {
2100 | "version": "4.6.0",
2101 | "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.0.tgz",
2102 | "integrity": "sha1-aYhLoUSsM/5plzemCG3v+t0PicU=",
2103 | "dev": true
2104 | },
2105 | "loose-envify": {
2106 | "version": "1.3.1",
2107 | "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.3.1.tgz",
2108 | "integrity": "sha1-0aitM/qc4OcT1l/dCsi3SNR4yEg=",
2109 | "dev": true
2110 | },
2111 | "loud-rejection": {
2112 | "version": "1.6.0",
2113 | "resolved": "https://registry.npmjs.org/loud-rejection/-/loud-rejection-1.6.0.tgz",
2114 | "integrity": "sha1-W0b4AUft7leIcPCG0Eghz5mOVR8=",
2115 | "dev": true
2116 | },
2117 | "lowercase-keys": {
2118 | "version": "1.0.0",
2119 | "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.0.tgz",
2120 | "integrity": "sha1-TjNms55/VFfjXxMkvfb4jQv8cwY=",
2121 | "dev": true
2122 | },
2123 | "lru-cache": {
2124 | "version": "4.1.1",
2125 | "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.1.tgz",
2126 | "integrity": "sha512-q4spe4KTfsAS1SUHLO0wz8Qiyf1+vMIAgpRYioFYDMNqKfHQbg+AVDH3i4fvpl71/P1L0dBl+fQi+P37UYf0ew==",
2127 | "dev": true
2128 | },
2129 | "make-dir": {
2130 | "version": "1.0.0",
2131 | "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.0.0.tgz",
2132 | "integrity": "sha1-l6ARdR6R3YfPre9Ygy67BJNt6Xg=",
2133 | "dev": true
2134 | },
2135 | "map-obj": {
2136 | "version": "1.0.1",
2137 | "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz",
2138 | "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=",
2139 | "dev": true
2140 | },
2141 | "matcher": {
2142 | "version": "0.1.2",
2143 | "resolved": "https://registry.npmjs.org/matcher/-/matcher-0.1.2.tgz",
2144 | "integrity": "sha1-7yDL3mTCTFDMYa9bg+4LG4/wAQE=",
2145 | "dev": true
2146 | },
2147 | "md5-hex": {
2148 | "version": "2.0.0",
2149 | "resolved": "https://registry.npmjs.org/md5-hex/-/md5-hex-2.0.0.tgz",
2150 | "integrity": "sha1-0FiOnxx0lUSS7NJKwKxs6ZfZLjM=",
2151 | "dev": true
2152 | },
2153 | "md5-o-matic": {
2154 | "version": "0.1.1",
2155 | "resolved": "https://registry.npmjs.org/md5-o-matic/-/md5-o-matic-0.1.1.tgz",
2156 | "integrity": "sha1-givM1l4RfFFPqxdrJZRdVBAKA8M=",
2157 | "dev": true
2158 | },
2159 | "meow": {
2160 | "version": "3.7.0",
2161 | "resolved": "https://registry.npmjs.org/meow/-/meow-3.7.0.tgz",
2162 | "integrity": "sha1-cstmi0JSKCkKu/qFaJJYcwioAfs=",
2163 | "dev": true,
2164 | "dependencies": {
2165 | "find-up": {
2166 | "version": "1.1.2",
2167 | "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz",
2168 | "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=",
2169 | "dev": true
2170 | },
2171 | "load-json-file": {
2172 | "version": "1.1.0",
2173 | "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz",
2174 | "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=",
2175 | "dev": true
2176 | },
2177 | "minimist": {
2178 | "version": "1.2.0",
2179 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz",
2180 | "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=",
2181 | "dev": true
2182 | },
2183 | "path-exists": {
2184 | "version": "2.1.0",
2185 | "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz",
2186 | "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=",
2187 | "dev": true
2188 | },
2189 | "path-type": {
2190 | "version": "1.1.0",
2191 | "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz",
2192 | "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=",
2193 | "dev": true
2194 | },
2195 | "read-pkg": {
2196 | "version": "1.1.0",
2197 | "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz",
2198 | "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=",
2199 | "dev": true
2200 | },
2201 | "read-pkg-up": {
2202 | "version": "1.0.1",
2203 | "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz",
2204 | "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=",
2205 | "dev": true
2206 | },
2207 | "strip-bom": {
2208 | "version": "2.0.0",
2209 | "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz",
2210 | "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=",
2211 | "dev": true
2212 | }
2213 | }
2214 | },
2215 | "micromatch": {
2216 | "version": "2.3.11",
2217 | "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz",
2218 | "integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=",
2219 | "dev": true
2220 | },
2221 | "mimic-fn": {
2222 | "version": "1.1.0",
2223 | "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.1.0.tgz",
2224 | "integrity": "sha1-5md4PZLonb00KBi1IwudYqZyrRg=",
2225 | "dev": true
2226 | },
2227 | "minimatch": {
2228 | "version": "3.0.4",
2229 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
2230 | "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==",
2231 | "dev": true
2232 | },
2233 | "minimist": {
2234 | "version": "0.0.8",
2235 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz",
2236 | "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=",
2237 | "dev": true
2238 | },
2239 | "mkdirp": {
2240 | "version": "0.5.1",
2241 | "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz",
2242 | "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=",
2243 | "dev": true
2244 | },
2245 | "ms": {
2246 | "version": "0.7.3",
2247 | "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.3.tgz",
2248 | "integrity": "sha1-cIFVpeROM/X9D8U+gdDUCpG+H/8=",
2249 | "dev": true
2250 | },
2251 | "multimatch": {
2252 | "version": "2.1.0",
2253 | "resolved": "https://registry.npmjs.org/multimatch/-/multimatch-2.1.0.tgz",
2254 | "integrity": "sha1-nHkGoi+0wCkZ4vX3UWG0zb1LKis=",
2255 | "dev": true
2256 | },
2257 | "nan": {
2258 | "version": "2.6.2",
2259 | "resolved": "https://registry.npmjs.org/nan/-/nan-2.6.2.tgz",
2260 | "integrity": "sha1-5P805slf37WuzAjeZZb0NgWn20U=",
2261 | "dev": true,
2262 | "optional": true
2263 | },
2264 | "natural-compare": {
2265 | "version": "1.4.0",
2266 | "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz",
2267 | "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=",
2268 | "dev": true
2269 | },
2270 | "normalize-package-data": {
2271 | "version": "2.4.0",
2272 | "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.4.0.tgz",
2273 | "integrity": "sha512-9jjUFbTPfEy3R/ad/2oNbKtW9Hgovl5O1FvFWKkKblNXoN/Oou6+9+KKohPK13Yc3/TyunyWhJp6gvRNR/PPAw==",
2274 | "dev": true
2275 | },
2276 | "normalize-path": {
2277 | "version": "2.1.1",
2278 | "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz",
2279 | "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=",
2280 | "dev": true
2281 | },
2282 | "npm-run-path": {
2283 | "version": "2.0.2",
2284 | "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz",
2285 | "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=",
2286 | "dev": true
2287 | },
2288 | "number-is-nan": {
2289 | "version": "1.0.1",
2290 | "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz",
2291 | "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=",
2292 | "dev": true
2293 | },
2294 | "object-assign": {
2295 | "version": "4.1.1",
2296 | "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
2297 | "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=",
2298 | "dev": true
2299 | },
2300 | "object.omit": {
2301 | "version": "2.0.1",
2302 | "resolved": "https://registry.npmjs.org/object.omit/-/object.omit-2.0.1.tgz",
2303 | "integrity": "sha1-Gpx0SCnznbuFjHbKNXmuKlTr0fo=",
2304 | "dev": true
2305 | },
2306 | "observable-to-promise": {
2307 | "version": "0.5.0",
2308 | "resolved": "https://registry.npmjs.org/observable-to-promise/-/observable-to-promise-0.5.0.tgz",
2309 | "integrity": "sha1-yCjw8NxH6fhq+KSXfF1VB2znqR8=",
2310 | "dev": true,
2311 | "dependencies": {
2312 | "symbol-observable": {
2313 | "version": "1.0.4",
2314 | "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-1.0.4.tgz",
2315 | "integrity": "sha1-Kb9hXUqnEhvdiYsi1LP5vE4qoD0=",
2316 | "dev": true
2317 | }
2318 | }
2319 | },
2320 | "once": {
2321 | "version": "1.4.0",
2322 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
2323 | "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
2324 | "dev": true
2325 | },
2326 | "onetime": {
2327 | "version": "2.0.1",
2328 | "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz",
2329 | "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=",
2330 | "dev": true
2331 | },
2332 | "option-chain": {
2333 | "version": "0.1.1",
2334 | "resolved": "https://registry.npmjs.org/option-chain/-/option-chain-0.1.1.tgz",
2335 | "integrity": "sha1-6bgR4AbxwPVIAvKClb/Ilw+Nz70=",
2336 | "dev": true
2337 | },
2338 | "os-homedir": {
2339 | "version": "1.0.2",
2340 | "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz",
2341 | "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=",
2342 | "dev": true
2343 | },
2344 | "os-tmpdir": {
2345 | "version": "1.0.2",
2346 | "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz",
2347 | "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=",
2348 | "dev": true
2349 | },
2350 | "p-finally": {
2351 | "version": "1.0.0",
2352 | "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz",
2353 | "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=",
2354 | "dev": true
2355 | },
2356 | "p-limit": {
2357 | "version": "1.1.0",
2358 | "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.1.0.tgz",
2359 | "integrity": "sha1-sH/y2aXYi+yAYDWJWiurZqJ5iLw=",
2360 | "dev": true
2361 | },
2362 | "p-locate": {
2363 | "version": "2.0.0",
2364 | "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz",
2365 | "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=",
2366 | "dev": true
2367 | },
2368 | "package-hash": {
2369 | "version": "2.0.0",
2370 | "resolved": "https://registry.npmjs.org/package-hash/-/package-hash-2.0.0.tgz",
2371 | "integrity": "sha1-eK4ybIngWk2BO2hgGXevBcANKg0=",
2372 | "dev": true
2373 | },
2374 | "package-json": {
2375 | "version": "4.0.1",
2376 | "resolved": "https://registry.npmjs.org/package-json/-/package-json-4.0.1.tgz",
2377 | "integrity": "sha1-iGmgQBJTZhxMTKPabCEh7VVfXu0=",
2378 | "dev": true
2379 | },
2380 | "parse-glob": {
2381 | "version": "3.0.4",
2382 | "resolved": "https://registry.npmjs.org/parse-glob/-/parse-glob-3.0.4.tgz",
2383 | "integrity": "sha1-ssN2z7EfNVE7rdFz7wu246OIORw=",
2384 | "dev": true
2385 | },
2386 | "parse-json": {
2387 | "version": "2.2.0",
2388 | "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz",
2389 | "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=",
2390 | "dev": true
2391 | },
2392 | "parse-ms": {
2393 | "version": "1.0.1",
2394 | "resolved": "https://registry.npmjs.org/parse-ms/-/parse-ms-1.0.1.tgz",
2395 | "integrity": "sha1-VjRtR0nXjyNDDKDHE4UK75GqNh0=",
2396 | "dev": true
2397 | },
2398 | "path-exists": {
2399 | "version": "3.0.0",
2400 | "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz",
2401 | "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=",
2402 | "dev": true
2403 | },
2404 | "path-is-absolute": {
2405 | "version": "1.0.1",
2406 | "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
2407 | "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=",
2408 | "dev": true
2409 | },
2410 | "path-key": {
2411 | "version": "2.0.1",
2412 | "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz",
2413 | "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=",
2414 | "dev": true
2415 | },
2416 | "path-type": {
2417 | "version": "2.0.0",
2418 | "resolved": "https://registry.npmjs.org/path-type/-/path-type-2.0.0.tgz",
2419 | "integrity": "sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM=",
2420 | "dev": true
2421 | },
2422 | "pify": {
2423 | "version": "2.3.0",
2424 | "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz",
2425 | "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=",
2426 | "dev": true
2427 | },
2428 | "pinkie": {
2429 | "version": "2.0.4",
2430 | "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz",
2431 | "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=",
2432 | "dev": true
2433 | },
2434 | "pinkie-promise": {
2435 | "version": "2.0.1",
2436 | "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz",
2437 | "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=",
2438 | "dev": true
2439 | },
2440 | "pkg-conf": {
2441 | "version": "2.0.0",
2442 | "resolved": "https://registry.npmjs.org/pkg-conf/-/pkg-conf-2.0.0.tgz",
2443 | "integrity": "sha1-BxyHZQQDvM+5xif1h1G/5HwGcnk=",
2444 | "dev": true
2445 | },
2446 | "pkg-dir": {
2447 | "version": "1.0.0",
2448 | "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-1.0.0.tgz",
2449 | "integrity": "sha1-ektQio1bstYp1EcFb/TpyTFM89Q=",
2450 | "dev": true,
2451 | "dependencies": {
2452 | "find-up": {
2453 | "version": "1.1.2",
2454 | "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz",
2455 | "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=",
2456 | "dev": true
2457 | },
2458 | "path-exists": {
2459 | "version": "2.1.0",
2460 | "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz",
2461 | "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=",
2462 | "dev": true
2463 | }
2464 | }
2465 | },
2466 | "plur": {
2467 | "version": "2.1.2",
2468 | "resolved": "https://registry.npmjs.org/plur/-/plur-2.1.2.tgz",
2469 | "integrity": "sha1-dIJFLBoPUI4+NE6uwxLJHCncZVo=",
2470 | "dev": true
2471 | },
2472 | "prepend-http": {
2473 | "version": "1.0.4",
2474 | "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz",
2475 | "integrity": "sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw=",
2476 | "dev": true
2477 | },
2478 | "preserve": {
2479 | "version": "0.2.0",
2480 | "resolved": "https://registry.npmjs.org/preserve/-/preserve-0.2.0.tgz",
2481 | "integrity": "sha1-gV7R9uvGWSb4ZbMQwHE7yzMVzks=",
2482 | "dev": true
2483 | },
2484 | "pretty-format": {
2485 | "version": "19.0.0",
2486 | "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-19.0.0.tgz",
2487 | "integrity": "sha1-VlMNMqy5ij+khRxOK503tCBoTIQ=",
2488 | "dev": true,
2489 | "dependencies": {
2490 | "ansi-styles": {
2491 | "version": "3.1.0",
2492 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.1.0.tgz",
2493 | "integrity": "sha1-CcIC1ckX7CMYjKpcnLkXnNlUd1A=",
2494 | "dev": true
2495 | }
2496 | }
2497 | },
2498 | "pretty-ms": {
2499 | "version": "2.1.0",
2500 | "resolved": "https://registry.npmjs.org/pretty-ms/-/pretty-ms-2.1.0.tgz",
2501 | "integrity": "sha1-QlfCVt8/sLRR1q/6qwIYhBJpgdw=",
2502 | "dev": true,
2503 | "dependencies": {
2504 | "plur": {
2505 | "version": "1.0.0",
2506 | "resolved": "https://registry.npmjs.org/plur/-/plur-1.0.0.tgz",
2507 | "integrity": "sha1-24XGgU9eXlo7Se/CjWBP7GKXUVY=",
2508 | "dev": true
2509 | }
2510 | }
2511 | },
2512 | "private": {
2513 | "version": "0.1.7",
2514 | "resolved": "https://registry.npmjs.org/private/-/private-0.1.7.tgz",
2515 | "integrity": "sha1-aM5eih7woju1cMwoU3tTMqumPvE=",
2516 | "dev": true
2517 | },
2518 | "process-nextick-args": {
2519 | "version": "1.0.7",
2520 | "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz",
2521 | "integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M=",
2522 | "dev": true
2523 | },
2524 | "pseudomap": {
2525 | "version": "1.0.2",
2526 | "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz",
2527 | "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=",
2528 | "dev": true
2529 | },
2530 | "randomatic": {
2531 | "version": "1.1.7",
2532 | "resolved": "https://registry.npmjs.org/randomatic/-/randomatic-1.1.7.tgz",
2533 | "integrity": "sha512-D5JUjPyJbaJDkuAazpVnSfVkLlpeO3wDlPROTMLGKG1zMFNFRgrciKo1ltz/AzNTkqE0HzDx655QOL51N06how==",
2534 | "dev": true,
2535 | "dependencies": {
2536 | "is-number": {
2537 | "version": "3.0.0",
2538 | "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz",
2539 | "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=",
2540 | "dev": true,
2541 | "dependencies": {
2542 | "kind-of": {
2543 | "version": "3.2.2",
2544 | "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
2545 | "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
2546 | "dev": true
2547 | }
2548 | }
2549 | },
2550 | "kind-of": {
2551 | "version": "4.0.0",
2552 | "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz",
2553 | "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=",
2554 | "dev": true
2555 | }
2556 | }
2557 | },
2558 | "rc": {
2559 | "version": "1.2.1",
2560 | "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.1.tgz",
2561 | "integrity": "sha1-LgPo5C7kULjLPc5lvhv4l04d/ZU=",
2562 | "dev": true,
2563 | "dependencies": {
2564 | "minimist": {
2565 | "version": "1.2.0",
2566 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz",
2567 | "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=",
2568 | "dev": true
2569 | }
2570 | }
2571 | },
2572 | "read-pkg": {
2573 | "version": "2.0.0",
2574 | "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-2.0.0.tgz",
2575 | "integrity": "sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg=",
2576 | "dev": true
2577 | },
2578 | "read-pkg-up": {
2579 | "version": "2.0.0",
2580 | "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-2.0.0.tgz",
2581 | "integrity": "sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4=",
2582 | "dev": true
2583 | },
2584 | "readable-stream": {
2585 | "version": "2.3.3",
2586 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.3.tgz",
2587 | "integrity": "sha512-m+qzzcn7KUxEmd1gMbchF+Y2eIUbieUaxkWtptyHywrX0rE8QEYqPC07Vuy4Wm32/xE16NcdBctb8S0Xe/5IeQ==",
2588 | "dev": true
2589 | },
2590 | "readdirp": {
2591 | "version": "2.1.0",
2592 | "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.1.0.tgz",
2593 | "integrity": "sha1-TtCtBg3zBzMAxIRANz9y0cxkLXg=",
2594 | "dev": true
2595 | },
2596 | "redent": {
2597 | "version": "1.0.0",
2598 | "resolved": "https://registry.npmjs.org/redent/-/redent-1.0.0.tgz",
2599 | "integrity": "sha1-z5Fqsf1fHxbfsggi3W7H9zDCr94=",
2600 | "dev": true,
2601 | "dependencies": {
2602 | "indent-string": {
2603 | "version": "2.1.0",
2604 | "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-2.1.0.tgz",
2605 | "integrity": "sha1-ji1INIdCEhtKghi3oTfppSBJ3IA=",
2606 | "dev": true
2607 | }
2608 | }
2609 | },
2610 | "regenerate": {
2611 | "version": "1.3.2",
2612 | "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.3.2.tgz",
2613 | "integrity": "sha1-0ZQcZ7rUN+G+dkM63Vs4X5WxkmA=",
2614 | "dev": true
2615 | },
2616 | "regenerator-runtime": {
2617 | "version": "0.10.5",
2618 | "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.10.5.tgz",
2619 | "integrity": "sha1-M2w+/BIgrc7dosn6tntaeVWjNlg=",
2620 | "dev": true
2621 | },
2622 | "regex-cache": {
2623 | "version": "0.4.3",
2624 | "resolved": "https://registry.npmjs.org/regex-cache/-/regex-cache-0.4.3.tgz",
2625 | "integrity": "sha1-mxpsNdTQ3871cRrmUejp09cRQUU=",
2626 | "dev": true
2627 | },
2628 | "regexpu-core": {
2629 | "version": "2.0.0",
2630 | "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-2.0.0.tgz",
2631 | "integrity": "sha1-SdA4g3uNz4v6W5pCE5k45uoq4kA=",
2632 | "dev": true
2633 | },
2634 | "registry-auth-token": {
2635 | "version": "3.3.1",
2636 | "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-3.3.1.tgz",
2637 | "integrity": "sha1-+w0yie4Nmtosu1KvXf5mywcNMAY=",
2638 | "dev": true
2639 | },
2640 | "registry-url": {
2641 | "version": "3.1.0",
2642 | "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-3.1.0.tgz",
2643 | "integrity": "sha1-PU74cPc93h138M+aOBQyRE4XSUI=",
2644 | "dev": true
2645 | },
2646 | "regjsgen": {
2647 | "version": "0.2.0",
2648 | "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.2.0.tgz",
2649 | "integrity": "sha1-bAFq3qxVT3WCP+N6wFuS1aTtsfc=",
2650 | "dev": true
2651 | },
2652 | "regjsparser": {
2653 | "version": "0.1.5",
2654 | "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.1.5.tgz",
2655 | "integrity": "sha1-fuj4Tcb6eS0/0K4ijSS9lJ6tIFw=",
2656 | "dev": true
2657 | },
2658 | "release-zalgo": {
2659 | "version": "1.0.0",
2660 | "resolved": "https://registry.npmjs.org/release-zalgo/-/release-zalgo-1.0.0.tgz",
2661 | "integrity": "sha1-CXALflB0Mpc5Mw5TXFqQ+2eFFzA=",
2662 | "dev": true
2663 | },
2664 | "remove-trailing-separator": {
2665 | "version": "1.0.2",
2666 | "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.0.2.tgz",
2667 | "integrity": "sha1-abBi2XhyetFNxrVrpKt3L9jXBRE=",
2668 | "dev": true
2669 | },
2670 | "repeat-element": {
2671 | "version": "1.1.2",
2672 | "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.2.tgz",
2673 | "integrity": "sha1-7wiaF40Ug7quTZPrmLT55OEdmQo=",
2674 | "dev": true
2675 | },
2676 | "repeat-string": {
2677 | "version": "1.6.1",
2678 | "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz",
2679 | "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=",
2680 | "dev": true
2681 | },
2682 | "repeating": {
2683 | "version": "2.0.1",
2684 | "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz",
2685 | "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=",
2686 | "dev": true
2687 | },
2688 | "require-precompiled": {
2689 | "version": "0.1.0",
2690 | "resolved": "https://registry.npmjs.org/require-precompiled/-/require-precompiled-0.1.0.tgz",
2691 | "integrity": "sha1-WhtS63Dr7UPrmC6XTIWrWVceVvo=",
2692 | "dev": true
2693 | },
2694 | "resolve-cwd": {
2695 | "version": "1.0.0",
2696 | "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-1.0.0.tgz",
2697 | "integrity": "sha1-Tq7qQe0EDRcCRX32SkKysH0kb58=",
2698 | "dev": true,
2699 | "dependencies": {
2700 | "resolve-from": {
2701 | "version": "2.0.0",
2702 | "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-2.0.0.tgz",
2703 | "integrity": "sha1-lICrIOlP+h2egKgEx+oUdhGWa1c=",
2704 | "dev": true
2705 | }
2706 | }
2707 | },
2708 | "resolve-from": {
2709 | "version": "3.0.0",
2710 | "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz",
2711 | "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=",
2712 | "dev": true
2713 | },
2714 | "restore-cursor": {
2715 | "version": "2.0.0",
2716 | "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz",
2717 | "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=",
2718 | "dev": true
2719 | },
2720 | "safe-buffer": {
2721 | "version": "5.1.1",
2722 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz",
2723 | "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==",
2724 | "dev": true
2725 | },
2726 | "semver": {
2727 | "version": "5.3.0",
2728 | "resolved": "https://registry.npmjs.org/semver/-/semver-5.3.0.tgz",
2729 | "integrity": "sha1-myzl094C0XxgEq0yaqa00M9U+U8=",
2730 | "dev": true
2731 | },
2732 | "semver-diff": {
2733 | "version": "2.1.0",
2734 | "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-2.1.0.tgz",
2735 | "integrity": "sha1-S7uEN8jTfksM8aaP1ybsbWRdbTY=",
2736 | "dev": true
2737 | },
2738 | "set-immediate-shim": {
2739 | "version": "1.0.1",
2740 | "resolved": "https://registry.npmjs.org/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz",
2741 | "integrity": "sha1-SysbJ+uAip+NzEgaWOXlb1mfP2E=",
2742 | "dev": true
2743 | },
2744 | "signal-exit": {
2745 | "version": "3.0.2",
2746 | "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz",
2747 | "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=",
2748 | "dev": true
2749 | },
2750 | "slash": {
2751 | "version": "1.0.0",
2752 | "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz",
2753 | "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=",
2754 | "dev": true
2755 | },
2756 | "slice-ansi": {
2757 | "version": "0.0.4",
2758 | "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-0.0.4.tgz",
2759 | "integrity": "sha1-7b+JA/ZvfOL46v1s7tZeJkyDGzU=",
2760 | "dev": true
2761 | },
2762 | "slide": {
2763 | "version": "1.1.6",
2764 | "resolved": "https://registry.npmjs.org/slide/-/slide-1.1.6.tgz",
2765 | "integrity": "sha1-VusCfWW00tzmyy4tMsTUr8nh1wc=",
2766 | "dev": true
2767 | },
2768 | "sort-keys": {
2769 | "version": "1.1.2",
2770 | "resolved": "https://registry.npmjs.org/sort-keys/-/sort-keys-1.1.2.tgz",
2771 | "integrity": "sha1-RBttTTRnmPG05J6JIK37oOVD+a0=",
2772 | "dev": true
2773 | },
2774 | "source-map": {
2775 | "version": "0.5.6",
2776 | "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.6.tgz",
2777 | "integrity": "sha1-dc449SvwczxafwwRjYEzSiu19BI=",
2778 | "dev": true
2779 | },
2780 | "source-map-support": {
2781 | "version": "0.4.15",
2782 | "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.4.15.tgz",
2783 | "integrity": "sha1-AyAt9lwG0r2MfsI2KhkwVv7407E=",
2784 | "dev": true
2785 | },
2786 | "spdx-correct": {
2787 | "version": "1.0.2",
2788 | "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-1.0.2.tgz",
2789 | "integrity": "sha1-SzBz2TP/UfORLwOsVRlJikFQ20A=",
2790 | "dev": true
2791 | },
2792 | "spdx-expression-parse": {
2793 | "version": "1.0.4",
2794 | "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-1.0.4.tgz",
2795 | "integrity": "sha1-m98vIOH0DtRH++JzJmGR/O1RYmw=",
2796 | "dev": true
2797 | },
2798 | "spdx-license-ids": {
2799 | "version": "1.2.2",
2800 | "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-1.2.2.tgz",
2801 | "integrity": "sha1-yd96NCRZSt5r0RkA1ZZpbcBrrFc=",
2802 | "dev": true
2803 | },
2804 | "sprintf-js": {
2805 | "version": "1.0.3",
2806 | "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz",
2807 | "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=",
2808 | "dev": true
2809 | },
2810 | "stack-utils": {
2811 | "version": "1.0.1",
2812 | "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-1.0.1.tgz",
2813 | "integrity": "sha1-1PM6tU6OOHeLDKXP07OvsS22hiA=",
2814 | "dev": true
2815 | },
2816 | "string_decoder": {
2817 | "version": "1.0.3",
2818 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz",
2819 | "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==",
2820 | "dev": true
2821 | },
2822 | "string-width": {
2823 | "version": "2.1.0",
2824 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.0.tgz",
2825 | "integrity": "sha1-AwZkVh/BRslCPsfZeP4kV0N/5tA=",
2826 | "dev": true,
2827 | "dependencies": {
2828 | "ansi-regex": {
2829 | "version": "3.0.0",
2830 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz",
2831 | "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=",
2832 | "dev": true
2833 | },
2834 | "strip-ansi": {
2835 | "version": "4.0.0",
2836 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz",
2837 | "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=",
2838 | "dev": true
2839 | }
2840 | }
2841 | },
2842 | "strip-ansi": {
2843 | "version": "3.0.1",
2844 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz",
2845 | "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=",
2846 | "dev": true
2847 | },
2848 | "strip-bom": {
2849 | "version": "3.0.0",
2850 | "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz",
2851 | "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=",
2852 | "dev": true
2853 | },
2854 | "strip-bom-buf": {
2855 | "version": "1.0.0",
2856 | "resolved": "https://registry.npmjs.org/strip-bom-buf/-/strip-bom-buf-1.0.0.tgz",
2857 | "integrity": "sha1-HLRar1dTD0yvhsf3UXnSyaUd1XI=",
2858 | "dev": true
2859 | },
2860 | "strip-eof": {
2861 | "version": "1.0.0",
2862 | "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz",
2863 | "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=",
2864 | "dev": true
2865 | },
2866 | "strip-indent": {
2867 | "version": "1.0.1",
2868 | "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-1.0.1.tgz",
2869 | "integrity": "sha1-DHlipq3vp7vUrDZkYKY4VSrhoKI=",
2870 | "dev": true
2871 | },
2872 | "strip-json-comments": {
2873 | "version": "2.0.1",
2874 | "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz",
2875 | "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=",
2876 | "dev": true
2877 | },
2878 | "supports-color": {
2879 | "version": "3.2.3",
2880 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz",
2881 | "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=",
2882 | "dev": true,
2883 | "dependencies": {
2884 | "has-flag": {
2885 | "version": "1.0.0",
2886 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz",
2887 | "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=",
2888 | "dev": true
2889 | }
2890 | }
2891 | },
2892 | "symbol-observable": {
2893 | "version": "0.2.4",
2894 | "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-0.2.4.tgz",
2895 | "integrity": "sha1-lag9smGG1q9+ehjb2XYKL4bQj0A=",
2896 | "dev": true
2897 | },
2898 | "term-size": {
2899 | "version": "0.1.1",
2900 | "resolved": "https://registry.npmjs.org/term-size/-/term-size-0.1.1.tgz",
2901 | "integrity": "sha1-hzYLljlsq1dgljcUzaDQy+7K2co=",
2902 | "dev": true,
2903 | "dependencies": {
2904 | "execa": {
2905 | "version": "0.4.0",
2906 | "resolved": "https://registry.npmjs.org/execa/-/execa-0.4.0.tgz",
2907 | "integrity": "sha1-TrZGejaglfq7KXD/nV4/t7zm68M=",
2908 | "dev": true
2909 | },
2910 | "npm-run-path": {
2911 | "version": "1.0.0",
2912 | "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-1.0.0.tgz",
2913 | "integrity": "sha1-9cMr9ZX+ga6Sfa7FLoL4sACsPI8=",
2914 | "dev": true
2915 | },
2916 | "path-key": {
2917 | "version": "1.0.0",
2918 | "resolved": "https://registry.npmjs.org/path-key/-/path-key-1.0.0.tgz",
2919 | "integrity": "sha1-XVPVeAGWRsDWiADbThRua9wqx68=",
2920 | "dev": true
2921 | }
2922 | }
2923 | },
2924 | "text-table": {
2925 | "version": "0.2.0",
2926 | "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz",
2927 | "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=",
2928 | "dev": true
2929 | },
2930 | "through2": {
2931 | "version": "2.0.3",
2932 | "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.3.tgz",
2933 | "integrity": "sha1-AARWmzfHx0ujnEPzzteNGtlBQL4=",
2934 | "dev": true
2935 | },
2936 | "time-require": {
2937 | "version": "0.1.2",
2938 | "resolved": "https://registry.npmjs.org/time-require/-/time-require-0.1.2.tgz",
2939 | "integrity": "sha1-+eEss3D8JgXhFARYK6VO9corLZg=",
2940 | "dev": true,
2941 | "dependencies": {
2942 | "ansi-styles": {
2943 | "version": "1.0.0",
2944 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-1.0.0.tgz",
2945 | "integrity": "sha1-yxAt8cVvUSPquLZ817mAJ6AnkXg=",
2946 | "dev": true
2947 | },
2948 | "chalk": {
2949 | "version": "0.4.0",
2950 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-0.4.0.tgz",
2951 | "integrity": "sha1-UZmj3c0MHv4jvAjBsCewYXbgxk8=",
2952 | "dev": true
2953 | },
2954 | "parse-ms": {
2955 | "version": "0.1.2",
2956 | "resolved": "https://registry.npmjs.org/parse-ms/-/parse-ms-0.1.2.tgz",
2957 | "integrity": "sha1-3T+iXtbC78e93hKtm0bBY6opIk4=",
2958 | "dev": true
2959 | },
2960 | "pretty-ms": {
2961 | "version": "0.2.2",
2962 | "resolved": "https://registry.npmjs.org/pretty-ms/-/pretty-ms-0.2.2.tgz",
2963 | "integrity": "sha1-2oeaaC/zOjcBEEbxPWJ/Z8c7hPY=",
2964 | "dev": true
2965 | },
2966 | "strip-ansi": {
2967 | "version": "0.1.1",
2968 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-0.1.1.tgz",
2969 | "integrity": "sha1-OeipjQRNFQZgq+SmgIrPcLt7yZE=",
2970 | "dev": true
2971 | }
2972 | }
2973 | },
2974 | "timed-out": {
2975 | "version": "4.0.1",
2976 | "resolved": "https://registry.npmjs.org/timed-out/-/timed-out-4.0.1.tgz",
2977 | "integrity": "sha1-8y6srFoXW+ol1/q1Zas+2HQe9W8=",
2978 | "dev": true
2979 | },
2980 | "to-fast-properties": {
2981 | "version": "1.0.3",
2982 | "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.3.tgz",
2983 | "integrity": "sha1-uDVx+k2MJbguIxsG46MFXeTKGkc=",
2984 | "dev": true
2985 | },
2986 | "trim-newlines": {
2987 | "version": "1.0.0",
2988 | "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-1.0.0.tgz",
2989 | "integrity": "sha1-WIeWa7WCpFA6QetST301ARgVphM=",
2990 | "dev": true
2991 | },
2992 | "trim-right": {
2993 | "version": "1.0.1",
2994 | "resolved": "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz",
2995 | "integrity": "sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM=",
2996 | "dev": true
2997 | },
2998 | "uid2": {
2999 | "version": "0.0.3",
3000 | "resolved": "https://registry.npmjs.org/uid2/-/uid2-0.0.3.tgz",
3001 | "integrity": "sha1-SDEm4Rd03y9xuLY53NeZw3YWK4I=",
3002 | "dev": true
3003 | },
3004 | "unique-string": {
3005 | "version": "1.0.0",
3006 | "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-1.0.0.tgz",
3007 | "integrity": "sha1-nhBXzKhRq7kzmPizOuGHuZyuwRo=",
3008 | "dev": true
3009 | },
3010 | "unique-temp-dir": {
3011 | "version": "1.0.0",
3012 | "resolved": "https://registry.npmjs.org/unique-temp-dir/-/unique-temp-dir-1.0.0.tgz",
3013 | "integrity": "sha1-bc6VsmgcoAPuv7MEpBX5y6vMU4U=",
3014 | "dev": true
3015 | },
3016 | "unzip-response": {
3017 | "version": "2.0.1",
3018 | "resolved": "https://registry.npmjs.org/unzip-response/-/unzip-response-2.0.1.tgz",
3019 | "integrity": "sha1-0vD3N9FrBhXnKmk17QQhRXLVb5c=",
3020 | "dev": true
3021 | },
3022 | "update-notifier": {
3023 | "version": "2.2.0",
3024 | "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-2.2.0.tgz",
3025 | "integrity": "sha1-G1g3z5DAc22IYncytmHBOPht5y8=",
3026 | "dev": true
3027 | },
3028 | "url-parse-lax": {
3029 | "version": "1.0.0",
3030 | "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-1.0.0.tgz",
3031 | "integrity": "sha1-evjzA2Rem9eaJy56FKxovAYJ2nM=",
3032 | "dev": true
3033 | },
3034 | "util-deprecate": {
3035 | "version": "1.0.2",
3036 | "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
3037 | "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=",
3038 | "dev": true
3039 | },
3040 | "validate-npm-package-license": {
3041 | "version": "3.0.1",
3042 | "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.1.tgz",
3043 | "integrity": "sha1-KAS6vnEq0zeUWaz74kdGqywwP7w=",
3044 | "dev": true
3045 | },
3046 | "which": {
3047 | "version": "1.2.14",
3048 | "resolved": "https://registry.npmjs.org/which/-/which-1.2.14.tgz",
3049 | "integrity": "sha1-mofEN48D6CfOyvGs31bHNsAcFOU=",
3050 | "dev": true
3051 | },
3052 | "widest-line": {
3053 | "version": "1.0.0",
3054 | "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-1.0.0.tgz",
3055 | "integrity": "sha1-DAnIXCqUaD0Nfq+O4JfVZL8OEFw=",
3056 | "dev": true,
3057 | "dependencies": {
3058 | "is-fullwidth-code-point": {
3059 | "version": "1.0.0",
3060 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz",
3061 | "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=",
3062 | "dev": true
3063 | },
3064 | "string-width": {
3065 | "version": "1.0.2",
3066 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz",
3067 | "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=",
3068 | "dev": true
3069 | }
3070 | }
3071 | },
3072 | "wrappy": {
3073 | "version": "1.0.2",
3074 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
3075 | "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=",
3076 | "dev": true
3077 | },
3078 | "write-file-atomic": {
3079 | "version": "2.1.0",
3080 | "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.1.0.tgz",
3081 | "integrity": "sha512-0TZ20a+xcIl4u0+Mj5xDH2yOWdmQiXlKf9Hm+TgDXjTMsEYb+gDrmb8e8UNAzMCitX8NBqG4Z/FUQIyzv/R1JQ==",
3082 | "dev": true
3083 | },
3084 | "write-json-file": {
3085 | "version": "2.2.0",
3086 | "resolved": "https://registry.npmjs.org/write-json-file/-/write-json-file-2.2.0.tgz",
3087 | "integrity": "sha1-UYYlBruzthnu+reFnx/WxtBTCHY=",
3088 | "dev": true,
3089 | "dependencies": {
3090 | "detect-indent": {
3091 | "version": "5.0.0",
3092 | "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-5.0.0.tgz",
3093 | "integrity": "sha1-OHHMCmoALow+Wzz38zYmRnXwa50=",
3094 | "dev": true
3095 | }
3096 | }
3097 | },
3098 | "write-pkg": {
3099 | "version": "2.1.0",
3100 | "resolved": "https://registry.npmjs.org/write-pkg/-/write-pkg-2.1.0.tgz",
3101 | "integrity": "sha1-NTqkTDnEjCFED1wIzmq9RhQcnAg=",
3102 | "dev": true
3103 | },
3104 | "xdg-basedir": {
3105 | "version": "3.0.0",
3106 | "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-3.0.0.tgz",
3107 | "integrity": "sha1-SWsswQnsqNus/i3HK2A8F8WHCtQ=",
3108 | "dev": true
3109 | },
3110 | "xtend": {
3111 | "version": "4.0.1",
3112 | "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz",
3113 | "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=",
3114 | "dev": true
3115 | },
3116 | "yallist": {
3117 | "version": "2.1.2",
3118 | "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz",
3119 | "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=",
3120 | "dev": true
3121 | }
3122 | }
3123 | }
3124 |
--------------------------------------------------------------------------------
/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "ha-chart",
3 | "version": "0.0.1",
4 | "description": "beautiful auto layout flowchart",
5 | "main": "index.js",
6 | "scripts": {
7 | "test": "ava test"
8 | },
9 | "keywords": [
10 | "composition"
11 | ],
12 | "author": "jinhia.wang",
13 | "license": "MIT",
14 | "devDependencies": {
15 | "ava": "^0.19.1"
16 | },
17 | "dependencies": {
18 | "dagre": "^0.7.4",
19 | "konva": "^1.6.3"
20 | }
21 | }
22 |
--------------------------------------------------------------------------------
/src/compiler.js:
--------------------------------------------------------------------------------
1 | const tokenizer = require('./tokenizer.js');
2 | const parser = require('./parser.js');
3 | const generator = require('./generator.js');
4 |
5 | const defaultType = {
6 | deafultShape: {
7 | fill: '#3ab882',
8 | cornerRadius: 10,
9 | maxWidth: 180,
10 | fontType: {
11 | fontSize: 16,
12 | fontFamily: 'Calibri',
13 | padding: 20,
14 | fill: '#fff',
15 | fontStyle: 'bold',
16 | align: 'center'
17 | }
18 | },
19 | defaultAnnotation: {
20 | fill: '#fff',
21 | fontType: {
22 | fontSize: 16,
23 | fontFamily: 'Calibri',
24 | padding: 5,
25 | fill: '#8699a3',
26 | fontStyle: 'bold',
27 | align: 'center'
28 | }
29 | },
30 | defaultFontType: {
31 | 'fontSize': 16,
32 | 'fontFamily': 'Calibri',
33 | 'fill': '#fff',
34 | 'fontStyle': 'bold',
35 | 'align': 'center',
36 | 'padding': 20
37 | },
38 | defaultArrow: {
39 | stroke: '#8699a3',
40 | strokeWidth: 3,
41 | lineCap: 'round',
42 | lineJoin: 'round'
43 | }
44 | };
45 |
46 | module.exports = function(str, opt = {}) {
47 | const type = Object.assign({}, defaultType, opt.type || {});
48 | opt.type = type;
49 | return generator(parser(tokenizer(str)), opt);
50 | };
51 |
--------------------------------------------------------------------------------
/src/container.js:
--------------------------------------------------------------------------------
1 | const draw = require('./draw.js');
2 | const Konva = require('konva');
3 |
4 | class Container {
5 | constructor({containerID}) {
6 | this.stage = new Konva.Stage({container: containerID});
7 | }
8 |
9 | draw(input) {
10 | this.clear();
11 | draw(this.stage, input);
12 | }
13 |
14 | clear() {
15 | this.stage.destroyChildren();
16 | }
17 |
18 | destroy() {
19 | this.stage.destroy();
20 | }
21 | }
22 |
23 | module.exports = Container;
24 |
--------------------------------------------------------------------------------
/src/draw.js:
--------------------------------------------------------------------------------
1 | const Konva = require('konva');
2 |
3 | module.exports = function(stage, input) {
4 | const {width, height} = input.container;
5 | stage.setWidth(width);
6 | stage.height(height);
7 | const layer = new Konva.Layer();
8 | const Text = function(x, y, width, height, label, style) {
9 | const opt = Object.assign({}, style, {text: label, width, x, y});
10 | const text = new Konva.Text(opt);
11 | layer.add(text);
12 | };
13 |
14 | const Box = function(centerX, centerY, width, height, label, style) {
15 | const x = centerX - width / 2;
16 | const y = centerY - height / 2;
17 | const opt = Object.assign({}, style, {x, y, width, height});
18 | var rect = new Konva.Rect(opt);
19 | layer.add(rect);
20 | Text(x, y, width, height, label, style.fontType);
21 | };
22 |
23 | const Line = function(a, type) {
24 | const points = [];
25 | a.points.map(p => {
26 | points.push(p.x, p.y);
27 | });
28 | const shortPoints = shortLine(points);
29 | const opt = Object.assign({}, type, {points: shortPoints});
30 | const line = new Konva.Line(opt);
31 | layer.add(line);
32 | const arrowPoints = points.slice(points.length - 4, points.length);
33 | const arrow = new Konva.Arrow({
34 | x: 0,
35 | y: 0,
36 | points: arrowPoints,
37 | pointerLength: type.strokeWidth * 3,
38 | pointerWidth: type.strokeWidth * 3,
39 | fill: type.stroke
40 | });
41 | layer.add(arrow);
42 | };
43 |
44 | const shortLine = function(oldPoints, k = 0.8) {
45 | let points = oldPoints.slice();
46 | let [x1, y1, x2, y2] = points.splice(points.length - 4, points.length);
47 | x2 = (x2 - x1) * k + x1;
48 | y2 = (y2 - y1) * k + y1;
49 | points = points.concat([x1, y1, x2, y2]);
50 | return points;
51 | };
52 |
53 | const {nodesInfo, labelInfo, arrowsInfo, types} = input;
54 |
55 | for (let a of arrowsInfo) {
56 | const type = types[a.type];
57 | Line(a, type);
58 | }
59 | for (let l of labelInfo) {
60 | const {x, y, width, height, label} = l;
61 | const type = types['defaultAnnotation'];
62 | Box(x, y, width, height, label, type);
63 | }
64 |
65 | for (let name of Object.keys(nodesInfo)) {
66 | const node = nodesInfo[name];
67 | const type = types[node.type];
68 | const {width, height, x, y, string} = node;
69 | Box(x, y, width, height, string, type);
70 | }
71 | stage.add(layer);
72 | };
73 |
--------------------------------------------------------------------------------
/src/formater.js:
--------------------------------------------------------------------------------
1 | const {getTextLayout} = require('./util.js');
2 |
3 | const autoWidth = function(label, fontType, maxWidth) {
4 | let {width, height} = getTextLayout(label, fontType);
5 | if (maxWidth) {
6 | if (width > maxWidth) {
7 | fontType.width = maxWidth;
8 | return autoWidth(label, fontType);
9 | }
10 | }
11 | return {width, height, fontType};
12 | };
13 |
14 | module.exports = function(input) {
15 | const {nodes, arrows, types} = input;
16 | const newNodes = {};
17 | const newArrows = {};
18 | const defaultFontType = types['defaultFontType'];
19 | for (let name of Object.keys(nodes)) {
20 | const node = nodes[name];
21 | const type = types[node.type];
22 | const {string} = node;
23 | const f = Object.assign({}, defaultFontType, type.fontType);
24 | const {width, height, fontType} = autoWidth(string, f, type.maxWidth);
25 | delete fontType.width;
26 | type.fontType = fontType;
27 | node.width = type.width || width;
28 | node.height = type.height || height;
29 | newNodes[name] = node;
30 | }
31 |
32 | for (let a of arrows) {
33 | const key = `${a.from}->${a.to}`;
34 | newArrows[key] = a;
35 | }
36 | return {
37 | nodes: newNodes,
38 | arrows: newArrows,
39 | types
40 | };
41 | };
42 |
--------------------------------------------------------------------------------
/src/generator.js:
--------------------------------------------------------------------------------
1 | module.exports = function(ast, opt = {}) {
2 | const { type = {} } = opt;
3 | type.defaultArrow = type.defaultArrow || {};
4 | type.deafultShape = type.deafultShape || {};
5 | const _global = type;
6 | const nodes = {};
7 | let arrows = [];
8 | let types = {};
9 | const Body = function(body) {
10 | switch (body.type) {
11 | case 'Struct':
12 | return Struct(body);
13 | case 'StatusExpression':
14 | return StatusExpression(body);
15 | default:
16 | throw new Error(`unknow ast body ${JSON.stringify(body)}`);
17 | }
18 | };
19 |
20 | const Struct = function({name, value}) {
21 | value = filterValue(value);
22 | types[name] = value;
23 | };
24 |
25 | const filterValue = function(value) {
26 | for (let k of Object.keys(value)) {
27 | const v = value[k];
28 | if (k === 'extend') {
29 | if (_global[v] === undefined) {
30 | throw new Error(`extend ${v} not find.`);
31 | }
32 | const cpv = Object.assign({}, _global[v]);
33 | value = Object.assign(cpv, value);
34 | break;
35 | }
36 | }
37 | return value;
38 | };
39 |
40 | const StatusExpression = function(statusExpression) {
41 | const {name, typing, string, expressions} = statusExpression;
42 | const type = typing.value || 'deafultShape';
43 | const a = Expressions(expressions).map(e => {
44 | const {string, type} = e;
45 | return {
46 | from: name,
47 | to: e.name,
48 | string,
49 | type
50 | };
51 | });
52 | arrows = arrows.concat(a);
53 | const node = {
54 | string,
55 | type
56 | };
57 | nodes[name] = node;
58 | };
59 |
60 | const Expressions = function(expressions) {
61 | return expressions.map(e => {
62 | const {typing, string, value} = e;
63 | const type = typing.value || 'defaultArrow';
64 | return {
65 | name: value,
66 | string,
67 | type
68 | };
69 | });
70 | };
71 | ast.body.map(b => Body(b));
72 | types = Object.assign(_global, types);
73 | return {
74 | nodes,
75 | arrows,
76 | types
77 | };
78 | };
79 |
--------------------------------------------------------------------------------
/src/layout.js:
--------------------------------------------------------------------------------
1 | const dagre = require('dagre');
2 | const formater = require('./formater.js');
3 |
4 | const {getTextLayout} = require('./util.js');
5 |
6 | const getCenterPoint = function(points) {
7 | const len = points.length;
8 | let center = parseInt(len / 2, 10);
9 | return points[center];
10 | };
11 |
12 | const layoutLabel = function({label, point}, type) {
13 | const {width, height} = getTextLayout(label, type);
14 | const {x, y} = point;
15 | return {
16 | x,
17 | y,
18 | height,
19 | width,
20 | label
21 | };
22 | };
23 |
24 | module.exports = function(input, opt = {}) {
25 | const g = new dagre.graphlib.Graph({ directed: true, rankdir: 'LR'});
26 | g.setGraph(opt);
27 | g.setDefaultEdgeLabel(function() { return {}; });
28 | const {nodes, arrows, types} = formater(input);
29 | for (let name of Object.keys(nodes)) {
30 | const node = nodes[name];
31 | g.setNode(name, node);
32 | }
33 | for (let k of Object.keys(arrows)) {
34 | const a = arrows[k];
35 | a.string ? g.setEdge(a.from, a.to, { label: a.string }) : g.setEdge(a.from, a.to);
36 | }
37 | dagre.layout(g);
38 | const nodesInfo = {};
39 | const arrowsInfo = [];
40 | const labelInfo = [];
41 | g.nodes().forEach(n => {
42 | nodesInfo[n] = g.node(n);
43 | });
44 | const annotation = types['defaultAnnotation'];
45 | g.edges().forEach(e => {
46 |
47 | const key = `${e.v}->${e.w}`;
48 | const edge = g.edge(e);
49 | if (edge.label) {
50 | labelInfo.push(layoutLabel({
51 | label: edge.label,
52 | point: getCenterPoint(edge.points)
53 | }, annotation.fontType));
54 | }
55 | arrowsInfo.push(Object.assign(arrows[key], edge));
56 | });
57 | const container = g._label;
58 | return {
59 | container,
60 | nodesInfo,
61 | arrowsInfo,
62 | labelInfo,
63 | types
64 | };
65 | };
66 |
--------------------------------------------------------------------------------
/src/parser.js:
--------------------------------------------------------------------------------
1 | module.exports = function(tokens) {
2 | let index = 0;
3 |
4 | const body = function() {
5 | switch (true) {
6 | case isStruct():
7 | return struct();
8 | case isStatusExpression():
9 | return statusExpression();
10 | default:
11 | throw new Error(`unknow token ${JSON.stringify(token())}`);
12 | }
13 | };
14 |
15 | const expect = function({value = null, type = null}) {
16 | if (!value && !type) {
17 | throw new Error('eat lack of params value and type');
18 | }
19 | const t = token();
20 | if (!t) {
21 | return false;
22 | }
23 | if (value) {
24 | if (t.value !== value) {
25 | throw new Error(`parse token value error: expect ${value}, but${t.value}`);
26 | }
27 | }
28 |
29 | if (type) {
30 | if (t.type !== type) {
31 | throw new Error(`parse token value error: expect ${type}, but${t.type}`);
32 | }
33 | }
34 | return true;
35 | };
36 |
37 | const eat = function({value = null, type = null}) {
38 | if (!value && !type) {
39 | throw new Error('eat lack of params value and type');
40 | }
41 | const t = token();
42 | if (!t) {
43 | return false;
44 | }
45 | if (value) {
46 | if (t.value !== value) {
47 | return false;
48 | }
49 | }
50 |
51 | if (type) {
52 | if (t.type !== type) {
53 | return false;
54 | }
55 | }
56 | return true;
57 | };
58 |
59 | const next = function(t) {
60 | expect(t);
61 | index++;
62 | };
63 |
64 | const token = function() {
65 | return tokens[index];
66 | };
67 |
68 | const isStatusExpression = function() {
69 | return eat({type: 'Keyword', value: 'def'});
70 | };
71 | const statusExpression = function() {
72 | next({type: 'Keyword', value: 'def'});
73 | const name = token().value;
74 | next({type: 'Word'});
75 | const typing = type();
76 | next({type: 'Operator', value: '('});
77 | const string = token().value;
78 | next({type: 'String'});
79 | next({type: 'Operator', value: ')'});
80 | const expressions = Expressions();
81 | next({type: 'Keyword', value: 'end'});
82 | return {
83 | name,
84 | typing,
85 | string,
86 | expressions,
87 | type: 'StatusExpression'
88 | };
89 | };
90 |
91 | const type = function() {
92 | let value = null;
93 | if (eat({type: 'Operator', value: ':'})) {
94 | next({type: 'Operator', value: ':'});
95 | value = token().value;
96 | next({type: 'Word'});
97 | }
98 | return {
99 | type: 'type',
100 | value
101 | };
102 | };
103 | const Expressions = function() {
104 | let expressions = [];
105 | while (!eat({type: 'Keyword', value: 'end'})) {
106 | expressions.push(Expression());
107 | }
108 | return expressions;
109 | };
110 |
111 | const Expression = function() {
112 | const typing = type();
113 | next({type: 'Operator', value: '('});
114 | let string = null;
115 | if (eat({type: 'String'})) {
116 | string = token().value;
117 | index++;
118 | }
119 | next({type: 'Operator', value: ')'});
120 | next({type: 'Operator', value: '->'});
121 |
122 | const value = token().value;
123 | next({type: 'Word'});
124 | return {
125 | type: 'Expression',
126 | typing,
127 | string,
128 | value
129 | };
130 | };
131 |
132 | const isStruct = function() {
133 | return eat({type: 'Keyword', value: 'type'});
134 | };
135 |
136 | const struct = function() {
137 | next({value: 'type', type: 'Keyword'});
138 | const name = token().value;
139 | next({type: 'Word'});
140 | next({type: 'Keyword', value: 'struct'});
141 | const value = token().value;
142 | next({type: 'Json'});
143 | return {
144 | type: 'Struct',
145 | name,
146 | value
147 | };
148 | };
149 |
150 | const node = {
151 | type: 'Program',
152 | body: []
153 | };
154 | while (index < tokens.length) {
155 | node.body.push(body());
156 | }
157 | return node;
158 | };
159 |
--------------------------------------------------------------------------------
/src/tokenizer.js:
--------------------------------------------------------------------------------
1 | const KEY_WORD = ['type', 'struct', 'var', 'def', 'end'];
2 | const WORD = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_-';
3 | const OPERATORS = ['=', '(', ')', '->', ':'];
4 |
5 | module.exports = function(str) {
6 | let index = 0;
7 | const tokens = [];
8 |
9 | const throwError = function(m) {
10 | const msg = `
11 | at: ${index}
12 | ${str.slice(index - 5, index + 5)}
13 | ${' '}^
14 | ${m}
15 | `;
16 | throw new Error(msg);
17 | };
18 |
19 | const next = function(word) {
20 | word.split('').map(w => {
21 | if (str[index] !== w) {
22 | throwError(`parse struct expect ${w}, but find ${str[index]}`);
23 | }
24 | index++;
25 | });
26 | };
27 |
28 | const isEnd = function() {
29 | return index >= str.length;
30 | };
31 |
32 | const space = function() {
33 | while ((str[index] === ' ' || str[index] === '\n' || str[index] === '\t') && !isEnd()) {
34 | index++;
35 | }
36 | return index;
37 | };
38 |
39 | const basicParseString = function(stop) {
40 | const start = index;
41 | while (!isEnd() && !stop(str[index])) {
42 | index++;
43 | }
44 | const s = str.slice(start, index);
45 | return s;
46 | };
47 |
48 | const isString = function() {
49 | return str[index] === '"';
50 | };
51 |
52 | const parseString = function() {
53 | next('"');
54 | let s = '';
55 | s = basicParseString((w) => w === '"');
56 | next('"');
57 | return s;
58 | };
59 |
60 | const string = function() {
61 | const s = parseString();
62 | return {
63 | type: 'String',
64 | value: s
65 | };
66 | };
67 |
68 | const isWord = function(w) {
69 | return WORD.indexOf(w) >= 0;
70 | };
71 |
72 | const isKeyword = function(word) {
73 | for (let w of KEY_WORD) {
74 | if (word === w) {
75 | return true;
76 | }
77 | }
78 | return false;
79 | };
80 |
81 | const parseWord = function() {
82 | let w = '';
83 | w = basicParseString((w) => !isWord(w));
84 | return w;
85 | };
86 |
87 | const word = function() {
88 | const w = parseWord();
89 | let type = 'Word';
90 | if (isKeyword(w)) {
91 | type = 'Keyword';
92 | }
93 | return {
94 | type,
95 | value: w
96 | };
97 | };
98 |
99 | const isStruct = function() {
100 | return str[index] === '{';
101 | };
102 |
103 | const struct = function() {
104 | const start = index;
105 | next('{');
106 | let inString = false;
107 | let left = 0;
108 | let right = 0;
109 | while (!(str[index] === '}' && !inString && left === right) && !isEnd()) {
110 | if (str[index] === '"') inString = !inString;
111 | if (str[index] === '{' && !inString) left++;
112 | if (str[index] === '}' && !inString) right++;
113 | index++;
114 | }
115 | next('}');
116 | const s = str.slice(start, index);
117 | const j = JSON.parse(s);
118 | return {
119 | value: j,
120 | type: 'Json'
121 | };
122 | };
123 |
124 | const isOperator = function() {
125 | for (let op of OPERATORS) {
126 | const compareOpt = str.slice(index, index + op.length);
127 | if (op === compareOpt) {
128 | return true;
129 | }
130 | }
131 | return false;
132 | };
133 |
134 | const operator = function() {
135 | let op = null;
136 | for (let _op of OPERATORS) {
137 | const compareOpt = str.slice(index, index + _op.length);
138 | if (_op === compareOpt) {
139 | op = _op;
140 | }
141 | }
142 | index = index + op.length;
143 | return {
144 | value: op,
145 | type: 'Operator'
146 | };
147 | };
148 |
149 | const parseToken = function() {
150 | switch (true) {
151 | case isOperator():
152 | return operator();
153 | case isStruct():
154 | return struct();
155 | case isString():
156 | return string();
157 | case isWord(str[index]):
158 | return word();
159 | default:
160 | throwError('unknow str');
161 | }
162 | };
163 |
164 | while (!isEnd()) {
165 | space();
166 | const t = parseToken(str, index);
167 | tokens.push(t);
168 | space();
169 | }
170 |
171 | return tokens;
172 | };
173 |
--------------------------------------------------------------------------------
/src/util.js:
--------------------------------------------------------------------------------
1 | const Konva = require('konva');
2 |
3 | exports.getTextLayout = function(label, style) {
4 | const opt = Object.assign({}, style, {x: 0, y: 0, text: label});
5 | const t = new Konva.Text(opt);
6 | const width = t.getWidth();
7 | const height = t.getHeight();
8 | return {width, height};
9 | };
10 |
--------------------------------------------------------------------------------
/test/generator_test.js:
--------------------------------------------------------------------------------
1 | const test = require('ava');
2 | const compiler = require('../src/compiler.js');
3 |
4 | test('output struct success', t => {
5 | const output = compiler(`
6 | type Arrow struct {
7 | "type": "arrow",
8 | "test": "test"
9 | }
10 | `);
11 | t.deepEqual(output, {
12 | 'nodes': {},
13 | 'arrows': [],
14 | 'types': {
15 | 'deafultShape': {
16 | 'fill': '#3ab882',
17 | 'cornerRadius': 10,
18 | 'maxWidth': 180,
19 | 'fontType': {
20 | 'fontSize': 16,
21 | 'fontFamily': 'Calibri',
22 | 'padding': 20,
23 | 'fill': '#fff',
24 | 'fontStyle': 'bold',
25 | 'align': 'center'
26 | }
27 | },
28 | 'defaultAnnotation': {
29 | 'fill': '#fff',
30 | 'fontType': {
31 | 'fontSize': 16,
32 | 'fontFamily': 'Calibri',
33 | 'padding': 5,
34 | 'fill': '#8699a3',
35 | 'fontStyle': 'bold',
36 | 'align': 'center'
37 | }
38 | },
39 | 'defaultFontType': {
40 | 'fontSize': 16,
41 | 'fontFamily': 'Calibri',
42 | 'fill': '#fff',
43 | 'fontStyle': 'bold',
44 | 'align': 'center',
45 | 'padding': 20
46 | },
47 | 'defaultArrow': {
48 | 'stroke': '#8699a3',
49 | 'strokeWidth': 3,
50 | 'lineCap': 'round',
51 | 'lineJoin': 'round'
52 | },
53 | 'Arrow': {
54 | 'type': 'arrow',
55 | 'test': 'test'
56 | }
57 | }
58 | });
59 | });
60 |
61 | test('output struct extend success', t => {
62 | const output = compiler(`
63 | type Condition struct {
64 | "extend": "deafultShape",
65 | "color": "yellow"
66 | }
67 | `, {type: {deafultShape: {width: '100'}}});
68 | t.deepEqual(output, {
69 | 'nodes': {},
70 | 'arrows': [],
71 | 'types': {
72 | 'deafultShape': {
73 | 'width': '100'
74 | },
75 | 'defaultAnnotation': {
76 | 'fill': '#fff',
77 | 'fontType': {
78 | 'fontSize': 16,
79 | 'fontFamily': 'Calibri',
80 | 'padding': 5,
81 | 'fill': '#8699a3',
82 | 'fontStyle': 'bold',
83 | 'align': 'center'
84 | }
85 | },
86 | 'defaultFontType': {
87 | 'fontSize': 16,
88 | 'fontFamily': 'Calibri',
89 | 'fill': '#fff',
90 | 'fontStyle': 'bold',
91 | 'align': 'center',
92 | 'padding': 20
93 | },
94 | 'defaultArrow': {
95 | 'stroke': '#8699a3',
96 | 'strokeWidth': 3,
97 | 'lineCap': 'round',
98 | 'lineJoin': 'round'
99 | },
100 | 'Condition': {
101 | 'width': '100',
102 | 'extend': 'deafultShape',
103 | 'color': 'yellow'
104 | }
105 | }
106 | });
107 | });
108 |
109 | test('output struct extend success', t => {
110 | const output = compiler(`
111 | type deafultShape struct {
112 | "extend": "deafultShape",
113 | "color": "yellow"
114 | }
115 | `);
116 |
117 | t.deepEqual(output, {
118 | 'nodes': {},
119 | 'arrows': [],
120 | 'types': {
121 | 'deafultShape': {
122 | 'fill': '#3ab882',
123 | 'cornerRadius': 10,
124 | 'maxWidth': 180,
125 | 'fontType': {
126 | 'fontSize': 16,
127 | 'fontFamily': 'Calibri',
128 | 'padding': 20,
129 | 'fill': '#fff',
130 | 'fontStyle': 'bold',
131 | 'align': 'center'
132 | },
133 | 'extend': 'deafultShape',
134 | 'color': 'yellow'
135 | },
136 | 'defaultAnnotation': {
137 | 'fill': '#fff',
138 | 'fontType': {
139 | 'fontSize': 16,
140 | 'fontFamily': 'Calibri',
141 | 'padding': 5,
142 | 'fill': '#8699a3',
143 | 'fontStyle': 'bold',
144 | 'align': 'center'
145 | }
146 | },
147 | 'defaultFontType': {
148 | 'fontSize': 16,
149 | 'fontFamily': 'Calibri',
150 | 'fill': '#fff',
151 | 'fontStyle': 'bold',
152 | 'align': 'center',
153 | 'padding': 20
154 | },
155 | 'defaultArrow': {
156 | 'stroke': '#8699a3',
157 | 'strokeWidth': 3,
158 | 'lineCap': 'round',
159 | 'lineJoin': 'round'
160 | }
161 | }
162 | });
163 | });
164 |
165 | test('output struct extend success', t => {
166 | const opt = {
167 | type: {
168 | deafultShape: {
169 | 'fill': 'green',
170 | 'stroke': 'black',
171 | 'strokeWidth': '4',
172 | 'width': '80',
173 | 'height': '80'
174 | }
175 | }
176 | };
177 | const output = compiler(`
178 | type Condition struct {
179 | "extend": "deafultShape",
180 | "color": "yellow"
181 | }
182 |
183 | type Arrow struct {
184 | "type": "arrow",
185 | "test": "test"
186 | }
187 | def start("start")
188 | () -> cond1
189 | end
190 |
191 | def cond1("big than 1?")
192 | ("yes") -> mid1
193 | :Arrow("no") -> mid2
194 | end
195 |
196 | def mid1("mid")
197 | :Arrow() -> close
198 | end
199 |
200 | def mid2:Condition("mid2")
201 | () -> close
202 | end
203 |
204 | def close("close")
205 | end
206 | `, opt);
207 | t.deepEqual(output, {
208 | 'nodes': {
209 | 'start': {
210 | 'string': 'start',
211 | 'type': 'deafultShape'
212 | },
213 | 'cond1': {
214 | 'string': 'big than 1?',
215 | 'type': 'deafultShape'
216 | },
217 | 'mid1': {
218 | 'string': 'mid',
219 | 'type': 'deafultShape'
220 | },
221 | 'mid2': {
222 | 'string': 'mid2',
223 | 'type': 'Condition'
224 | },
225 | 'close': {
226 | 'string': 'close',
227 | 'type': 'deafultShape'
228 | }
229 | },
230 | 'arrows': [
231 | {
232 | 'from': 'start',
233 | 'to': 'cond1',
234 | 'string': null,
235 | 'type': 'defaultArrow'
236 | },
237 | {
238 | 'from': 'cond1',
239 | 'to': 'mid1',
240 | 'string': 'yes',
241 | 'type': 'defaultArrow'
242 | },
243 | {
244 | 'from': 'cond1',
245 | 'to': 'mid2',
246 | 'string': 'no',
247 | 'type': 'Arrow'
248 | },
249 | {
250 | 'from': 'mid1',
251 | 'to': 'close',
252 | 'string': null,
253 | 'type': 'Arrow'
254 | },
255 | {
256 | 'from': 'mid2',
257 | 'to': 'close',
258 | 'string': null,
259 | 'type': 'defaultArrow'
260 | }
261 | ],
262 | 'types': {
263 | 'deafultShape': {
264 | 'fill': 'green',
265 | 'stroke': 'black',
266 | 'strokeWidth': '4',
267 | 'width': '80',
268 | 'height': '80'
269 | },
270 | 'defaultAnnotation': {
271 | 'fill': '#fff',
272 | 'fontType': {
273 | 'fontSize': 16,
274 | 'fontFamily': 'Calibri',
275 | 'padding': 5,
276 | 'fill': '#8699a3',
277 | 'fontStyle': 'bold',
278 | 'align': 'center'
279 | }
280 | },
281 | 'defaultFontType': {
282 | 'fontSize': 16,
283 | 'fontFamily': 'Calibri',
284 | 'fill': '#fff',
285 | 'fontStyle': 'bold',
286 | 'align': 'center',
287 | 'padding': 20
288 | },
289 | 'defaultArrow': {
290 | 'stroke': '#8699a3',
291 | 'strokeWidth': 3,
292 | 'lineCap': 'round',
293 | 'lineJoin': 'round'
294 | },
295 | 'Condition': {
296 | 'fill': 'green',
297 | 'stroke': 'black',
298 | 'strokeWidth': '4',
299 | 'width': '80',
300 | 'height': '80',
301 | 'extend': 'deafultShape',
302 | 'color': 'yellow'
303 | },
304 | 'Arrow': {
305 | 'type': 'arrow',
306 | 'test': 'test'
307 | }
308 | }
309 | });
310 | });
311 |
--------------------------------------------------------------------------------
/test/parser_test.js:
--------------------------------------------------------------------------------
1 | const tokenizer = require('../src/tokenizer.js');
2 | const parser = require('../src/parser.js');
3 | const test = require('ava');
4 |
5 | test('parse struct success', t => {
6 | const token = tokenizer(`
7 | type condition struct {
8 | "type": "status",
9 | "color": "yellow",
10 | "max-width": "100px",
11 | "max-hight": "200px",
12 | "font-size": "20px",
13 | "back-ground-color": "black"
14 | }
15 | `);
16 | const ast = parser(token);
17 | t.deepEqual(ast, {
18 | 'type': 'Program',
19 | 'body': [
20 | {
21 | 'type': 'Struct',
22 | 'name': 'condition',
23 | 'value': {
24 | 'type': 'status',
25 | 'color': 'yellow',
26 | 'max-width': '100px',
27 | 'max-hight': '200px',
28 | 'font-size': '20px',
29 | 'back-ground-color': 'black'
30 | }
31 | }
32 | ]
33 | });
34 | });
35 |
36 | test('parse basic StatusExpression success', t => {
37 | const token = tokenizer(`
38 | def cond("cond1")
39 | () -> mid1
40 | end
41 | `);
42 | const ast = parser(token);
43 | t.deepEqual(ast, {
44 | 'type': 'Program',
45 | 'body': [
46 | {
47 | 'name': 'cond',
48 | 'typing': {
49 | 'type': 'type',
50 | 'value': null
51 | },
52 | 'string': 'cond1',
53 | 'expressions': [
54 | {
55 | 'type': 'Expression',
56 | 'typing': {
57 | 'type': 'type',
58 | 'value': null
59 | },
60 | 'string': null,
61 | 'value': 'mid1'
62 | }
63 | ],
64 | 'type': 'StatusExpression'
65 | }
66 | ]
67 | });
68 | });
69 |
70 | test('parse no Expression success', t => {
71 | const token = tokenizer(`
72 | def close("close")
73 | end
74 | `);
75 | const ast = parser(token);
76 | t.deepEqual(ast, {
77 | 'type': 'Program',
78 | 'body': [
79 | {
80 | 'name': 'close',
81 | 'typing': {
82 | 'type': 'type',
83 | 'value': null
84 | },
85 | 'string': 'close',
86 | 'expressions': [],
87 | 'type': 'StatusExpression'
88 | }
89 | ]
90 | });
91 | });
92 |
93 | test('parse Type Expression success', t => {
94 | const token = tokenizer(`
95 | def mid2:Condition("mid2")
96 | () -> close
97 | end
98 | `);
99 | const ast = parser(token);
100 | t.deepEqual(ast, {
101 | 'type': 'Program',
102 | 'body': [
103 | {
104 | 'name': 'mid2',
105 | 'typing': {
106 | 'type': 'type',
107 | 'value': 'Condition'
108 | },
109 | 'string': 'mid2',
110 | 'expressions': [
111 | {
112 | 'type': 'Expression',
113 | 'typing': {
114 | 'type': 'type',
115 | 'value': null
116 | },
117 | 'string': null,
118 | 'value': 'close'
119 | }
120 | ],
121 | 'type': 'StatusExpression'
122 | }
123 | ]
124 | });
125 | });
126 |
127 | test('parse mutil Expression with type success', t => {
128 | const token = tokenizer(`
129 | def cond1("big than 1?")
130 | ("yes") -> mid1
131 | :Arrow("no") -> mid2
132 | end
133 | `);
134 | const ast = parser(token);
135 | t.deepEqual(ast, {
136 | 'type': 'Program',
137 | 'body': [
138 | {
139 | 'name': 'cond1',
140 | 'typing': {
141 | 'type': 'type',
142 | 'value': null
143 | },
144 | 'string': 'big than 1?',
145 | 'expressions': [
146 | {
147 | 'type': 'Expression',
148 | 'typing': {
149 | 'type': 'type',
150 | 'value': null
151 | },
152 | 'string': 'yes',
153 | 'value': 'mid1'
154 | },
155 | {
156 | 'type': 'Expression',
157 | 'typing': {
158 | 'type': 'type',
159 | 'value': 'Arrow'
160 | },
161 | 'string': 'no',
162 | 'value': 'mid2'
163 | }
164 | ],
165 | 'type': 'StatusExpression'
166 | }
167 | ]
168 | });
169 | });
170 |
--------------------------------------------------------------------------------
/test/tokenizer_test.js:
--------------------------------------------------------------------------------
1 | const test = require('ava');
2 | const tokenizer = require('../src/tokenizer.js');
3 |
4 | test('tokenize Word success', t => {
5 | const token = tokenizer(' word ');
6 | t.deepEqual(token, [ { type: 'Word', value: 'word' } ]);
7 | });
8 |
9 | test('tokenize Word success', t => {
10 | const token = tokenizer(' endTest ');
11 | t.deepEqual(token, [ { type: 'Word', value: 'endTest' } ]);
12 | });
13 |
14 | test('tokenize String success', t => {
15 | const token = tokenizer(' "word" ');
16 | t.deepEqual(token, [ { type: 'String', value: 'word' } ]);
17 | });
18 |
19 | test('tokenize Operator success', t => {
20 | const token = tokenizer(' = ');
21 | t.deepEqual(token, [ { type: 'Operator', value: '=' } ]);
22 | });
23 |
24 | test('tokenize Json success', t => {
25 | const token = tokenizer(`
26 | {
27 | "test": "test}",
28 | "haha": {"in": "in"}
29 | }
30 | `);
31 | t.deepEqual(token, [ { type: 'Json', value: {
32 | 'test': 'test}',
33 | 'haha': {'in': 'in'}
34 | } } ]);
35 | });
36 |
37 | test('tokenize keyword success', t => {
38 | const token = tokenizer(' end');
39 | t.deepEqual(token, [ { type: 'Keyword', value: 'end' } ]);
40 | });
41 |
42 | test('tokenize keyword success', t => {
43 | const token = tokenizer(' end ');
44 | t.deepEqual(token, [ { type: 'Keyword', value: 'end' } ]);
45 | });
46 |
47 | test('tokenize json success', t => {
48 | const token = tokenizer(`
49 | type Blank struct {
50 | "extend": "deafultShape",
51 | "fill": "#000",
52 | "fontType": {
53 | "fontSize": 16,
54 | "fontFamily": "Calibri",
55 | "fill": "#fff",
56 | "fontStyle": "bold",
57 | "align": "center"
58 | }
59 | }
60 | `);
61 | t.deepEqual(token, [
62 | {
63 | 'type': 'Keyword',
64 | 'value': 'type'
65 | },
66 | {
67 | 'type': 'Word',
68 | 'value': 'Blank'
69 | },
70 | {
71 | 'type': 'Keyword',
72 | 'value': 'struct'
73 | },
74 | {
75 | 'value': {
76 | 'extend': 'deafultShape',
77 | 'fill': '#000',
78 | 'fontType': {
79 | 'fontSize': 16,
80 | 'fontFamily': 'Calibri',
81 | 'fill': '#fff',
82 | 'fontStyle': 'bold',
83 | 'align': 'center'
84 | }
85 | },
86 | 'type': 'Json'
87 | }
88 | ]);
89 | });
90 |
91 | test('tokenize struct success', t => {
92 | const token = tokenizer(`
93 | type condition struct {
94 | "type": "status",
95 | "color": "yellow",
96 | "max-width": 100,
97 | "max-hight": 200,
98 | "font-size": "20px",
99 | "back-ground-color": "black"
100 | }
101 | `);
102 | t.deepEqual(token, [
103 | { type: 'Keyword', value: 'type' },
104 | { type: 'Word', value: 'condition' },
105 | { type: 'Keyword', value: 'struct' },
106 | { value:
107 | { type: 'status',
108 | color: 'yellow',
109 | 'max-width': 100,
110 | 'max-hight': 200,
111 | 'font-size': '20px',
112 | 'back-ground-color': 'black' },
113 | type: 'Json' } ]);
114 | });
115 |
116 | test('tokenize keyword success', t => {
117 | const token = tokenizer(`
118 | def start("start")
119 | () -> cond
120 | end
121 | `);
122 | t.deepEqual(token, [
123 | {
124 | 'type': 'Keyword',
125 | 'value': 'def'
126 | },
127 | {
128 | 'type': 'Word',
129 | 'value': 'start'
130 | },
131 | {
132 | 'value': '(',
133 | 'type': 'Operator'
134 | },
135 | {
136 | 'type': 'String',
137 | 'value': 'start'
138 | },
139 | {
140 | 'value': ')',
141 | 'type': 'Operator'
142 | },
143 | {
144 | 'value': '(',
145 | 'type': 'Operator'
146 | },
147 | {
148 | 'value': ')',
149 | 'type': 'Operator'
150 | },
151 | {
152 | 'value': '->',
153 | 'type': 'Operator'
154 | },
155 | {
156 | 'type': 'Word',
157 | 'value': 'cond'
158 | },
159 | {
160 | 'type': 'Keyword',
161 | 'value': 'end'
162 | }
163 | ]);
164 | });
165 |
166 | test('tokenize keyword success', t => {
167 | const token = tokenizer(`
168 | def start:Condition("start")
169 | :Arrow("yes") -> cond
170 | end
171 | `);
172 | t.deepEqual(token, [
173 | {
174 | 'type': 'Keyword',
175 | 'value': 'def'
176 | },
177 | {
178 | 'type': 'Word',
179 | 'value': 'start'
180 | },
181 | {
182 | 'value': ':',
183 | 'type': 'Operator'
184 | },
185 | {
186 | 'type': 'Word',
187 | 'value': 'Condition'
188 | },
189 | {
190 | 'value': '(',
191 | 'type': 'Operator'
192 | },
193 | {
194 | 'type': 'String',
195 | 'value': 'start'
196 | },
197 | {
198 | 'value': ')',
199 | 'type': 'Operator'
200 | },
201 | {
202 | 'value': ':',
203 | 'type': 'Operator'
204 | },
205 | {
206 | 'type': 'Word',
207 | 'value': 'Arrow'
208 | },
209 | {
210 | 'value': '(',
211 | 'type': 'Operator'
212 | },
213 | {
214 | 'type': 'String',
215 | 'value': 'yes'
216 | },
217 | {
218 | 'value': ')',
219 | 'type': 'Operator'
220 | },
221 | {
222 | 'value': '->',
223 | 'type': 'Operator'
224 | },
225 | {
226 | 'type': 'Word',
227 | 'value': 'cond'
228 | },
229 | {
230 | 'type': 'Keyword',
231 | 'value': 'end'
232 | }
233 | ]);
234 | });
235 |
--------------------------------------------------------------------------------