├── .gitignore ├── README.md ├── bin └── kingraph ├── docs ├── advanced.md ├── getting_started.md ├── images │ └── example.png └── schema.md ├── examples ├── Makefile ├── got.png ├── got.svg ├── got.yml ├── modernfamily.png ├── modernfamily.yml ├── potter.png ├── potter.svg ├── potter.yml ├── simpsons.png ├── simpsons.svg └── simpsons.yml ├── index.js ├── lib ├── apply_style.js ├── apply_style.test.js ├── defaults │ ├── colors.js │ ├── styles.js │ └── symbols.js ├── id_generator.js ├── id_generator.test.js ├── join.js ├── join.test.js ├── normalize.js ├── render.js ├── render_graph.js ├── slugify.js ├── slugify.test.js ├── to_png.js └── to_png_image.js ├── package.json └── yarn.lock /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | *.dot 3 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # kingraph 2 | 3 | > 👪 Plots family trees using JavaScript and Graphviz 4 | 5 | A family tree plotter with a very simple syntax. It probably doesn't cover everything [bigger tools](https://gramps-project.org/) do, but covers 90% of it for the sake of simplicity. 6 | 7 | ![](docs/images/example.png) 8 | 9 | Installation 10 | ------------ 11 | 12 | ```sh 13 | npm install -g rstacruz/kingraph 14 | # or 15 | yarn global add rstacruz/kingraph # via yarnpkg.com 16 | ``` 17 | 18 | This adds the `kingraph` command to your shell. 19 | 20 | ```sh 21 | kingraph --help 22 | kingraph family.yml > family.svg 23 | ``` 24 | 25 | Examples 26 | -------- 27 | 28 | Spoiler alerts, view at your own risk :) 29 | 30 |
31 | Simpsons (simple) 32 | 33 | Source: *[simpsons.yml](examples/simpsons.yml)* 34 | 35 | > ![](examples/simpsons.png) 36 |
37 | 38 |
39 | Modern Family (simple with houses) 40 | 41 | Source: *[modernfamily.yml](examples/modernfamily.yml)* 42 | 43 | > ![](examples/modernfamily.png) 44 |
45 | 46 |
47 | Harry Potter (larger tree) 48 | 49 | Source: *[potter.yml](examples/potter.yml)* 50 | 51 | > ![](examples/potter.png) 52 |
53 | 54 |
55 | Game of Thrones (overly complicated) 56 | 57 | Source: *[got.yml](examples/got.yml)* 58 | 59 | > ![](examples/got.png) 60 |
61 | 62 | Getting started 63 | --------------- 64 | 65 | A family tree is a [YAML](http://yaml.org/) file. 66 | 67 | ```yaml 68 | families: 69 | - parents: [Marge, Homer] 70 | children: [Bart, Lisa, Maggie] 71 | - parents: [Lisa, Milhouse] 72 | children: [Zia] 73 | 74 | people: 75 | Marge: 76 | fullname: Marjorie Bouvier Simpson 77 | ``` 78 | 79 | kingraph can give you `svg` (default), `png` or `dot` files. 80 | 81 | ```sh 82 | kingraph family.yml > family.svg 83 | kingraph family.yml -F png > family.png 84 | kingraph family.yml -F dot > family.dot 85 | ``` 86 | 87 | See [Getting started](docs/getting_started.md) for more! 88 | 89 | Documentation 90 | ------------- 91 | 92 | For further reading: 93 | 94 | - [Getting started](docs/getting_started.md) 95 | - [Advanced usage](docs/advanced.md) 96 | - [Schema](docs/schema.md) 97 | 98 | ## Thanks 99 | 100 | **kingraph** © 2016+, Rico Sta. Cruz. Released under the [MIT] License.
101 | Authored and maintained by Rico Sta. Cruz with help from contributors ([list][contributors]). 102 | 103 | > [ricostacruz.com](http://ricostacruz.com)  ·  104 | > GitHub [@rstacruz](https://github.com/rstacruz)  ·  105 | > Twitter [@rstacruz](https://twitter.com/rstacruz) 106 | 107 | [MIT]: http://mit-license.org/ 108 | [contributors]: http://github.com/rstacruz/kingraph/contributors 109 | -------------------------------------------------------------------------------- /bin/kingraph: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env node 2 | const render = require('../lib/render') 3 | const all = Promise.all.bind(Promise) 4 | 5 | const cli = require('meow')(` 6 | Usage: 7 | $ kingraph INPUT.yml 8 | 9 | Options: 10 | -h, --help show usage information 11 | -v, --version print version info and exit 12 | -F, --format=svg format (dot, svg) 13 | `, { 14 | boolean: ['help', 'version'], 15 | string: ['format'], 16 | alias: { 17 | h: 'help', v: 'version', F: 'format' 18 | } 19 | }) 20 | 21 | require('read-input')(cli.input) 22 | .then(res => { 23 | return all(res.files.map(file => { 24 | const input = require('js-yaml').safeLoad(file.data) 25 | const format = cli.flags.format || 'svg' 26 | 27 | return render(input, { format, async: true }) 28 | .then(result => { 29 | process.stdout.write(result) 30 | }) 31 | })) 32 | }) 33 | .catch(err => { 34 | console.error(err) 35 | process.exit(8) 36 | }) 37 | -------------------------------------------------------------------------------- /docs/advanced.md: -------------------------------------------------------------------------------- 1 | # Advanced 2 | 3 | This is the part of the API that will help deal with bigger trees. 4 | 5 | ## Complex families 6 | 7 | To express complex families, you can use `parents2` and `children2`. They will be drawn as dotted lines. Use this to express a different link, such as foster children or step parents. 8 | 9 | ```yml 10 | families: 11 | - parents: [Ned, Catelyn] 12 | children: [Arya, Rickon, Bran, Sansa, Rob] 13 | children2: [Jon] 14 | ``` 15 | 16 | ## Expressing relationships 17 | 18 | All properties in a `Family` are optional (but you have to define at least one). You can use these to show other types of relationships. 19 | 20 | ```yml 21 | families: 22 | # These guys are having an affair of sorts 23 | - parents2: [Loras, Renly] 24 | 25 | # No need to show their parents in the family tree, 26 | # but we want them to show up as siblings. 27 | - children: [Danaerys, Viserys, Rhaegar] 28 | ``` 29 | 30 | ## Styling 31 | 32 | Use `class` and `style` to style. Refer to Graphviz's [attributes documentation](http://graphviz.org/doc/info/attrs.html) for possible attributes. 33 | 34 | ```yml 35 | people: 36 | James: 37 | fullname: James Potter 38 | class: [deceased] 39 | styles: 40 | deceased: 41 | color: red 42 | ``` 43 | 44 | -------------------------------------------------------------------------------- /docs/getting_started.md: -------------------------------------------------------------------------------- 1 | # Getting started 2 | 3 | A family tree is a [YAML](http://yaml.org/) file. Start with a `families` collection. Every family can have `parents` and `children`. 4 | 5 | ```diff 6 | +families: 7 | + - parents: [Marge, Homer] 8 | + children: [Bart, Lisa, Maggie] 9 | ``` 10 | 11 | ## Generating 12 | 13 | kingraph can give you `svg` (default), `png` or `dot` files. 14 | 15 | ```sh 16 | kingraph family.yml > family.svg 17 | kingraph family.yml -F png > family.png 18 | kingraph family.yml -F dot > family.dot 19 | ``` 20 | 21 | ## Defining names 22 | 23 | To define their full names, add a `people` collection. This is optional—people will still be in the family tree even if they don't have a `people` record. 24 | 25 | ```diff 26 | families: 27 | - parents: [Marge, Homer] 28 | children: [Bart, Lisa, Maggie] 29 | +people: 30 | + Marge: 31 | + fullname: Marjorie Bouvier Simpson 32 | ``` 33 | 34 | ## Second generations 35 | 36 | To create second generations, you can simply add another record to `families`. 37 | 38 | ```diff 39 | families: 40 | - parents: [Marge, Homer] 41 | children: [Bart, Lisa, Maggie] 42 | + - parents: [Lisa, Milhouse] 43 | + children: [Zia] 44 | ``` 45 | 46 | ## Houses 47 | 48 | Turn a family into a house by adding a `house` name. They will show up grouped in a box. 49 | 50 | ```diff 51 | families: 52 | + - house: Stark 53 | parents: [Ned, Catelyn] 54 | children: [Arya, Rickon, Bran, Sansa, Rob] 55 | + - house: Lannister 56 | parents: [Tywin, Joanna] 57 | children: [Cersei, Jaime, Tyrion] 58 | ``` 59 | 60 | To add families into a house, nest the families. 61 | 62 | ```diff 63 | families: 64 | - house: Simpson 65 | parents: [Marge, Homer] 66 | children: [Bart, Lisa, Maggie] 67 | + families: 68 | + - parents: [Lisa, Milhouse] 69 | + children: [Zia] 70 | ``` 71 | 72 |
73 | *Why nest?* 74 | 75 | Families can be placed as sub-families of another families. This is more of a visual designation rather than a semantic one. If the parent family is a "house", then the sub-families will show up in the same house. 76 | 77 | It also helps to untangle your YAML file. 78 |
79 | 80 | ## Next 81 | 82 | See [advanced usage](advanced.md) for more features. 83 | -------------------------------------------------------------------------------- /docs/images/example.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rstacruz/kingraph/c147268b674c6ce56250d92b9e24037da4311a31/docs/images/example.png -------------------------------------------------------------------------------- /docs/schema.md: -------------------------------------------------------------------------------- 1 | # Schema 2 | 3 | - **[families](#family)** 4 | - [parents](#parents) 5 | - [children](#children) 6 | - [parents2](#parents2) 7 | - [children2](#children2) 8 | - [house](#house) 9 | - [families](#families) 10 | - **[people](#person)** 11 | - [name](#name) 12 | - [fullname](#fullname) 13 | - [links](#links) 14 | - [class](#class) 15 | - **[styles](#styles)** 16 | 17 | ## Family 18 | 19 | > `families` (Family[])
20 | > `families[].families` (Family[]) 21 | 22 | A list of families. All properties in a Family are optional, but you have to define at least one. 23 | 24 | ```yaml 25 | families: 26 | - parents: [Homer, Marge] 27 | children: [Bart, Lisa, Maggie] 28 | - parents: [Lisa, Milhouse] 29 | children: [Zia] 30 | ``` 31 | 32 | A typical family has `parents` and `children`, but only one is required. Every family must have at least one or more of the required properties defined (`parents`, `parents2`, `children`, `children2`). 33 | 34 | ```yaml 35 | families: 36 | # Example: no children 37 | - parents: [Cam, Mitchell] 38 | 39 | # Example: siblings with unknown parents 40 | - children: [Haley, Luke, Alex] 41 | ``` 42 | 43 | ### parents 44 | 45 | > `families[].parents` (String[]) 46 | 47 | A list of parents. This is a list of person ID's. See [Family](#family) for an example. 48 | 49 | ### children 50 | 51 | > `families[].children` (String[]) 52 | 53 | A list of children. See [Family](#family) for an example. 54 | 55 | ### parents2 56 | 57 | > `families[].parents2` (String[]) 58 | 59 | A list of parents. Use this to express atypical lineage, such as step-parents or adoptive parents. See [Family](#family) for an example. 60 | 61 | ```yaml 62 | # Cersei and Jaime are the biological parents. 63 | # Robert is married to Cersei, and acts as the children's father. 64 | - parents: [Cersei, Jaime] 65 | parents2: [Robert] 66 | children: [Myrcella, Joffrey] 67 | ``` 68 | 69 | ### children2 70 | 71 | > `families[].children2` (String[]) 72 | 73 | A list of children. Use this to express atypical offspring lineage, such as adoptions, illegitimate children or foster siblings. See [parents2](#parents2) for an example. 74 | 75 | 76 | ```yaml 77 | # Jon is the adopted son of Ned and Catelyn. 78 | - parents: [Ned, Catelyn] 79 | children: [Rob, Rickon, Arya, Sansa] 80 | children2: [Jon] 81 | ``` 82 | 83 | ### house 84 | 85 | > `families[].house` (String) 86 | 87 | The name of the house. If given, then a box will be drawn around the family and the sub-families inside it. 88 | 89 | ```yaml 90 | # The [Rob, Talisa] family will be placed inside House Stark. 91 | - house: Stark 92 | parents: [Ned, Catelyn] 93 | children: [Rob, Rickon, Arya, Sansa] 94 | families: 95 | - parents: [Rob, Talisa] 96 | ``` 97 | 98 | ### families 99 | 100 | > `families[].families` (Family[]) 101 | 102 | You can nest families inside other families. See [house](#house) for an example. 103 | 104 | ## Person 105 | 106 | > `people{}` 107 | 108 | Defines metadata for a person. All parameters are optional. 109 | 110 | ```yaml 111 | # Nope, he's not dead, he's just here as an example ;) 112 | people: 113 | Ned: 114 | name: Ned 115 | fullname: Eddard Stark 116 | born: 1950 117 | died: 1966 118 | class: [deceased] 119 | ``` 120 | 121 | ### name 122 | 123 | A person's name. If not present, then the person's ID will be used by default. 124 | 125 | ### fullname 126 | 127 | A person's full name. Will be displayed in gray text. 128 | 129 | ### links 130 | 131 | An array of links. Use this to link to a person's Facebook account. If given, their names will be clickable. 132 | 133 | ### class 134 | 135 | A list of classes for styles. These will be applied to nodes. See [styles](#styles) for more information. 136 | 137 | ## Styles 138 | 139 | > `styles{}` 140 | 141 | A key-value object with `class` names as keys, and their GraphViz attributes as values. Refer to Graphviz's [attributes documentation](http://graphviz.org/doc/info/attrs.html) for attributes. 142 | 143 | ```yml 144 | people: 145 | Ned: 146 | class: [deceased] 147 | styles: 148 | deceased: 149 | color: red 150 | penwidth: 0.25 151 | ``` 152 | -------------------------------------------------------------------------------- /examples/Makefile: -------------------------------------------------------------------------------- 1 | all: got.svg simpsons.svg potter.svg got.png simpsons.png potter.png modernfamily.png 2 | 3 | open: all 4 | open *.svg -a "Google Chrome" 5 | 6 | %.png: %.yml 7 | ../bin/kingraph $^ -F png > $@ 8 | %.svg: %.yml 9 | ../bin/kingraph $^ -F svg > $@ 10 | -------------------------------------------------------------------------------- /examples/got.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rstacruz/kingraph/c147268b674c6ce56250d92b9e24037da4311a31/examples/got.png -------------------------------------------------------------------------------- /examples/got.svg: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 9 | 10 | G 11 | 12 | cluster_family_0 13 | 14 | Targaryen 15 | 16 | cluster_family_1 17 | 18 | Greyjoy 19 | 20 | cluster_family_2 21 | 22 | Stark 23 | 24 | cluster_family_2_0 25 | 26 | cluster_family_2_1 27 | 28 | cluster_family_2_1_0 29 | 30 | cluster_family_3 31 | 32 | Tyrell 33 | 34 | cluster_family_4 35 | 36 | Barratheon 37 | 38 | cluster_family_4_0 39 | 40 | cluster_family_4_1 41 | 42 | cluster_family_4_2 43 | 44 | cluster_family_5 45 | 46 | Lannister 47 | 48 | cluster_family_5_0 49 | 50 | cluster_family_5_1 51 | 52 | cluster_family_5_2 53 | 54 | cluster_family_6 55 | 56 | Tully 57 | 58 | cluster_family_7 59 | 60 | cluster_family_8 61 | 62 | cluster_family_9 63 | 64 | cluster_family_10 65 | 66 | cluster_family_11 67 | 68 | cluster_family_12 69 | 70 | cluster_family_13 71 | 72 | cluster_family_14 73 | 74 | 75 | siblings_0 76 | 77 | 78 | 79 | Danaerys 80 | 81 | Danaerys 82 | Danaerys Targaryen 83 | 84 | 85 | siblings_0->Danaerys 86 | 87 | 88 | 89 | 90 | 91 | Rhaegar 92 | 93 | Rhaegar 94 | Rhaegar Targaryen 95 | 96 | 97 | siblings_0->Rhaegar 98 | 99 | 100 | 101 | 102 | 103 | Viserys 104 | 105 | Viserys 106 | Viserys Targaryen 107 | 108 | 109 | siblings_0->Viserys 110 | 111 | 112 | 113 | 114 | 115 | union_9 116 | 117 | 118 | 119 | Danaerys->union_9 120 | 121 | 122 | 123 | union_13 124 | 125 | 126 | 127 | Danaerys->union_13 128 | 129 | 130 | 131 | union_2_0 132 | 133 | 134 | 135 | Rhaegar->union_2_0 136 | 137 | 138 | 139 | union_1 140 | 141 | 142 | 143 | siblings_1 144 | 145 | 146 | 147 | union_1->siblings_1 148 | 149 | 150 | 151 | Balon 152 | 153 | Balon 154 | 155 | 156 | Balon->union_1 157 | 158 | 159 | 160 | Alannys 161 | 162 | Alannys 163 | 164 | 165 | Alannys->union_1 166 | 167 | 168 | 169 | Theon 170 | 171 | Theon 172 | 173 | 174 | siblings_1->Theon 175 | 176 | 177 | 178 | 179 | 180 | Yara 181 | 182 | Yara 183 | 184 | 185 | siblings_1->Yara 186 | 187 | 188 | 189 | 190 | 191 | Rodrik 192 | 193 | Rodrik 194 | 195 | 196 | siblings_1->Rodrik 197 | 198 | 199 | 200 | 201 | 202 | Maron 203 | 204 | Maron 205 | 206 | 207 | siblings_1->Maron 208 | 209 | 210 | 211 | 212 | 213 | siblings_2_0 214 | 215 | 216 | 217 | union_2_0->siblings_2_0 218 | 219 | 220 | 221 | Lyanna 222 | 223 | Lyanna 224 | 225 | 226 | Lyanna->union_2_0 227 | 228 | 229 | 230 | Jon 231 | 232 | Jon 233 | Jon Snow 234 | 235 | 236 | siblings_2_0->Jon 237 | 238 | 239 | 240 | 241 | 242 | union_2_1_0 243 | 244 | 245 | 246 | Robb 247 | 248 | Robb 249 | 250 | 251 | Robb->union_2_1_0 252 | 253 | 254 | 255 | Talisa 256 | 257 | Talisa 258 | 259 | 260 | Talisa->union_2_1_0 261 | 262 | 263 | 264 | union_2_1 265 | 266 | 267 | 268 | siblings_2_1 269 | 270 | 271 | 272 | union_2_1->siblings_2_1 273 | 274 | 275 | 276 | Ned 277 | 278 | Ned 279 | Eddard Stark 280 | 281 | 282 | Ned->union_2_1 283 | 284 | 285 | 286 | Catelyn 287 | 288 | Catelyn 289 | 290 | 291 | Catelyn->union_2_1 292 | 293 | 294 | 295 | siblings_2_1->Theon 296 | 297 | 298 | 299 | 300 | 301 | siblings_2_1->Jon 302 | 303 | 304 | 305 | 306 | 307 | siblings_2_1->Robb 308 | 309 | 310 | 311 | 312 | 313 | Sansa 314 | 315 | Sansa 316 | 317 | 318 | siblings_2_1->Sansa 319 | 320 | 321 | 322 | 323 | 324 | Arya 325 | 326 | Arya 327 | 328 | 329 | siblings_2_1->Arya 330 | 331 | 332 | 333 | 334 | 335 | Bran 336 | 337 | Bran 338 | 339 | 340 | siblings_2_1->Bran 341 | 342 | 343 | 344 | 345 | 346 | Rickon 347 | 348 | Rickon 349 | 350 | 351 | siblings_2_1->Rickon 352 | 353 | 354 | 355 | 356 | 357 | union_5_1 358 | 359 | 360 | 361 | Sansa->union_5_1 362 | 363 | 364 | 365 | union_11 366 | 367 | 368 | 369 | Sansa->union_11 370 | 371 | 372 | 373 | union_2 374 | 375 | 376 | 377 | siblings_2 378 | 379 | 380 | 381 | union_2->siblings_2 382 | 383 | 384 | 385 | Rickard 386 | 387 | Rickard 388 | 389 | 390 | Rickard->union_2 391 | 392 | 393 | 394 | Lyarra 395 | 396 | Lyarra 397 | 398 | 399 | Lyarra->union_2 400 | 401 | 402 | 403 | siblings_2->Lyanna 404 | 405 | 406 | 407 | 408 | 409 | siblings_2->Ned 410 | 411 | 412 | 413 | 414 | 415 | Brandon 416 | 417 | Brandon 418 | 419 | 420 | siblings_2->Brandon 421 | 422 | 423 | 424 | 425 | 426 | Benjen 427 | 428 | Benjen 429 | 430 | 431 | siblings_2->Benjen 432 | 433 | 434 | 435 | 436 | 437 | siblings_3 438 | 439 | 440 | 441 | Margaery 442 | 443 | Margaery 444 | 445 | 446 | siblings_3->Margaery 447 | 448 | 449 | 450 | 451 | 452 | Loras 453 | 454 | Loras 455 | 456 | 457 | siblings_3->Loras 458 | 459 | 460 | 461 | 462 | 463 | union_4_2 464 | 465 | 466 | 467 | Margaery->union_4_2 468 | 469 | 470 | 471 | union_7 472 | 473 | 474 | 475 | Margaery->union_7 476 | 477 | 478 | 479 | union_8 480 | 481 | 482 | 483 | Margaery->union_8 484 | 485 | 486 | 487 | union_12 488 | 489 | 490 | 491 | Loras->union_12 492 | 493 | 494 | 495 | union_4_0 496 | 497 | 498 | 499 | siblings_4_0 500 | 501 | 502 | 503 | union_4_0->siblings_4_0 504 | 505 | 506 | 507 | Robert 508 | 509 | Robert 510 | Robert Baratheon 511 | 512 | 513 | Robert->union_4_0 514 | 515 | 516 | 517 | union_5_2 518 | 519 | 520 | 521 | Robert->union_5_2 522 | 523 | 524 | 525 | Gendry 526 | 527 | Gendry 528 | 529 | 530 | siblings_4_0->Gendry 531 | 532 | 533 | 534 | 535 | 536 | union_4_1 537 | 538 | 539 | 540 | siblings_4_1 541 | 542 | 543 | 544 | union_4_1->siblings_4_1 545 | 546 | 547 | 548 | Stannis 549 | 550 | Stannis 551 | 552 | 553 | Stannis->union_4_1 554 | 555 | 556 | 557 | union_14 558 | 559 | 560 | 561 | Stannis->union_14 562 | 563 | 564 | 565 | Selyse 566 | 567 | Selyse 568 | Selyse Florent 569 | 570 | 571 | Selyse->union_4_1 572 | 573 | 574 | 575 | Shireen 576 | 577 | Shireen 578 | 579 | 580 | siblings_4_1->Shireen 581 | 582 | 583 | 584 | 585 | 586 | Renly 587 | 588 | Renly 589 | 590 | 591 | Renly->union_4_2 592 | 593 | 594 | 595 | Renly->union_12 596 | 597 | 598 | 599 | siblings_4 600 | 601 | 602 | 603 | siblings_4->Robert 604 | 605 | 606 | 607 | 608 | 609 | siblings_4->Stannis 610 | 611 | 612 | 613 | 614 | 615 | siblings_4->Renly 616 | 617 | 618 | 619 | 620 | 621 | union_5_0 622 | 623 | 624 | 625 | Tyrion 626 | 627 | Tyrion 628 | Tyrion "The Imp" Lannister 629 | 630 | 631 | Tyrion->union_5_0 632 | 633 | 634 | 635 | Tyrion->union_5_1 636 | 637 | 638 | 639 | Shae 640 | 641 | Shae 642 | 643 | 644 | Shae->union_5_0 645 | 646 | 647 | 648 | siblings_5_2 649 | 650 | 651 | 652 | union_5_2->siblings_5_2 653 | 654 | 655 | 656 | Cersei 657 | 658 | Cersei 659 | Cersei Lannister 660 | 661 | 662 | Cersei->union_5_2 663 | 664 | 665 | 666 | Jaime 667 | 668 | Jaime 669 | Jaime "Kingslayer" Lannister 670 | 671 | 672 | Jaime->union_5_2 673 | 674 | 675 | 676 | Joffrey 677 | 678 | Joffrey 679 | 680 | 681 | siblings_5_2->Joffrey 682 | 683 | 684 | 685 | 686 | 687 | Myrcella 688 | 689 | Myrcella 690 | 691 | 692 | siblings_5_2->Myrcella 693 | 694 | 695 | 696 | 697 | 698 | Tommen 699 | 700 | Tommen 701 | 702 | 703 | siblings_5_2->Tommen 704 | 705 | 706 | 707 | 708 | 709 | Joffrey->union_7 710 | 711 | 712 | 713 | Joffrey->union_11 714 | 715 | 716 | 717 | Tommen->union_8 718 | 719 | 720 | 721 | union_5 722 | 723 | 724 | 725 | siblings_5 726 | 727 | 728 | 729 | union_5->siblings_5 730 | 731 | 732 | 733 | Tywin 734 | 735 | Tywin 736 | 737 | 738 | Tywin->union_5 739 | 740 | 741 | 742 | Joanna 743 | 744 | Joanna 745 | 746 | 747 | Joanna->union_5 748 | 749 | 750 | 751 | siblings_5->Tyrion 752 | 753 | 754 | 755 | 756 | 757 | siblings_5->Cersei 758 | 759 | 760 | 761 | 762 | 763 | siblings_5->Jaime 764 | 765 | 766 | 767 | 768 | 769 | union_6 770 | 771 | 772 | 773 | siblings_6 774 | 775 | 776 | 777 | union_6->siblings_6 778 | 779 | 780 | 781 | Hoster 782 | 783 | Hoster 784 | Hoster Tully 785 | 786 | 787 | Hoster->union_6 788 | 789 | 790 | 791 | Minisa 792 | 793 | Minisa 794 | Minisa Whent 795 | 796 | 797 | Minisa->union_6 798 | 799 | 800 | 801 | siblings_6->Catelyn 802 | 803 | 804 | 805 | 806 | 807 | Lysa 808 | 809 | Lysa 810 | 811 | 812 | siblings_6->Lysa 813 | 814 | 815 | 816 | 817 | 818 | Edmure 819 | 820 | Edmure 821 | 822 | 823 | siblings_6->Edmure 824 | 825 | 826 | 827 | 828 | 829 | Robin Arryn 830 | 831 | Robin Arryn 832 | 833 | 834 | siblings_6->Robin Arryn 835 | 836 | 837 | 838 | 839 | 840 | Brynden 841 | 842 | Brynden 843 | 844 | 845 | siblings_6->Brynden 846 | 847 | 848 | 849 | 850 | 851 | union_10 852 | 853 | 854 | 855 | Lysa->union_10 856 | 857 | 858 | 859 | Drogo 860 | 861 | Drogo 862 | Khal Drogo 863 | 864 | 865 | Drogo->union_9 866 | 867 | 868 | 869 | Littlefinger 870 | 871 | Littlefinger 872 | Petyr "Littlefinger" Baelish 873 | 874 | 875 | Littlefinger->union_10 876 | 877 | 878 | 879 | Daario 880 | 881 | Daario 882 | Daario Naharis 883 | 884 | 885 | Daario->union_13 886 | 887 | 888 | 889 | Melisandre 890 | 891 | Melisandre 892 | 893 | 894 | Melisandre->union_14 895 | 896 | 897 | 898 | 899 | -------------------------------------------------------------------------------- /examples/got.yml: -------------------------------------------------------------------------------- 1 | families: 2 | - house: Targaryen 3 | children: [Danaerys, Rhaegar, Viserys] 4 | 5 | - house: Greyjoy 6 | parents: [Balon, Alannys] 7 | children: [Theon, Yara, Rodrik, Maron] 8 | 9 | - house: Stark 10 | parents: [Rickard, Lyarra] 11 | children: [Ned, Lyanna, Brandon, Benjen] 12 | families: 13 | - parents: [Ned, Catelyn] 14 | children: [Robb, Sansa, Arya, Bran, Rickon] 15 | children2: [Jon, Theon] 16 | families: 17 | - parents: [Robb, Talisa] 18 | - parents: [Lyanna, Rhaegar] 19 | children: [Jon] 20 | 21 | - house: Tyrell 22 | children: [Margaery, Loras] 23 | 24 | - house: Barratheon 25 | children: [Robert, Stannis, Renly] 26 | families: 27 | - parents2: [Renly, Margaery] 28 | - parents: [Stannis, Selyse] 29 | children: [Shireen] 30 | - parents2: [Robert] 31 | children: [Gendry] 32 | 33 | - house: Lannister 34 | parents: [Tywin, Joanna] 35 | children: [Cersei, Jaime, Tyrion] 36 | families: 37 | - parents: [Cersei, Jaime] 38 | parents2: [Robert] 39 | children: [Joffrey, Myrcella, Tommen] 40 | - parents2: [Sansa, Tyrion] 41 | - parents2: [Tyrion, Shae] 42 | 43 | - house: Tully 44 | parents: [Hoster, Minisa] 45 | children: [Catelyn, Lysa, Edmure, Robin Arryn, Brynden] 46 | 47 | # Affinities 48 | - parents2: [Margaery, Joffrey] 49 | - parents2: [Margaery, Tommen] 50 | - parents2: [Danaerys, Drogo] 51 | - parents2: [Lysa, Littlefinger] 52 | - parents2: [Sansa, Joffrey] 53 | - parents2: [Loras, Renly] 54 | - parents2: [Danaerys, Daario] 55 | - parents2: [Stannis, Melisandre] 56 | 57 | people: 58 | Jon: 59 | fullname: Jon Snow 60 | Robert: 61 | fullname: Robert Baratheon 62 | Cersei: 63 | fullname: Cersei Lannister 64 | Jaime: 65 | fullname: Jaime "Kingslayer" Lannister 66 | Tyrion: 67 | fullname: Tyrion "The Imp" Lannister 68 | Rhaegar: 69 | fullname: Rhaegar Targaryen 70 | class: [minor] 71 | Danaerys: 72 | fullname: Danaerys Targaryen 73 | Viserys: 74 | fullname: Viserys Targaryen 75 | Hoster: 76 | fullname: Hoster Tully 77 | class: [minor] 78 | Minisa: 79 | fullname: Minisa Whent 80 | class: [minor] 81 | Brandon: 82 | class: [minor] 83 | Rickon: 84 | class: [minor] 85 | Joanna: 86 | class: [minor] 87 | Lyanna: 88 | class: [minor] 89 | Rickard: 90 | class: [minor] 91 | Lyarra: 92 | class: [minor] 93 | Littlefinger: 94 | fullname: Petyr "Littlefinger" Baelish 95 | class: [unaffiliated] 96 | Ned: 97 | fullname: Eddard Stark 98 | Selyse: 99 | fullname: Selyse Florent 100 | class: [minor] 101 | Daario: 102 | fullname: Daario Naharis 103 | class: [unaffiliated] 104 | Drogo: 105 | fullname: Khal Drogo 106 | class: [unaffiliated] 107 | Balon: 108 | class: [minor] 109 | Alannys: 110 | class: [minor] 111 | Rodrik: 112 | class: [minor] 113 | Maron: 114 | class: [minor] 115 | Edmure: 116 | class: [minor] 117 | Brynden: 118 | class: [minor] 119 | Melisandre: 120 | class: [unaffiliated] 121 | 122 | styles: 123 | minor: 124 | style: "filled" 125 | fillcolor: "#f4f4f4" 126 | penwidth: 0 127 | unaffiliated: 128 | style: "filled" 129 | fillcolor: "#f4f4e0" 130 | penwidth: 0 131 | -------------------------------------------------------------------------------- /examples/modernfamily.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rstacruz/kingraph/c147268b674c6ce56250d92b9e24037da4311a31/examples/modernfamily.png -------------------------------------------------------------------------------- /examples/modernfamily.yml: -------------------------------------------------------------------------------- 1 | families: 2 | - house: Pritchett 3 | families: 4 | - parents: [Jay, Gloria] 5 | children: [Joe] 6 | - parents: [Gloria] 7 | children: [Manny] 8 | - house: Dunphy 9 | families: 10 | - parents: [Phil, Claire] 11 | children: [Alex, Luke, Haley] 12 | - house: Tucker 13 | families: 14 | - parents: [Cam, Mitchell] 15 | children2: [Lily] 16 | 17 | - parents: [Jay, Dede] 18 | children: [Claire, Mitchell] 19 | people: 20 | Dede: 21 | class: [minor] 22 | styles: 23 | minor: 24 | style: "filled" 25 | fillcolor: "#f4f4f4" 26 | penwidth: 0 27 | -------------------------------------------------------------------------------- /examples/potter.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rstacruz/kingraph/c147268b674c6ce56250d92b9e24037da4311a31/examples/potter.png -------------------------------------------------------------------------------- /examples/potter.svg: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 9 | 10 | G 11 | 12 | cluster_family_0 13 | 14 | Potter 15 | 16 | cluster_family_0_0 17 | 18 | cluster_family_1 19 | 20 | Dursley 21 | 22 | cluster_family_2 23 | 24 | Weasley 25 | 26 | cluster_family_2_0 27 | 28 | cluster_family_2_1 29 | 30 | cluster_family_2_2 31 | 32 | cluster_family_3 33 | 34 | Granger 35 | 36 | cluster_family_4 37 | 38 | 39 | union_0_0 40 | 41 | 42 | 43 | siblings_0_0 44 | 45 | 46 | 47 | union_0_0->siblings_0_0 48 | 49 | 50 | 51 | Harry 52 | 53 | Harry 54 | 55 | 56 | Harry->union_0_0 57 | 58 | 59 | 60 | Ginny 61 | 62 | Ginny 63 | 64 | 65 | Ginny->union_0_0 66 | 67 | 68 | 69 | James II 70 | 71 | James II 72 | 73 | 74 | siblings_0_0->James II 75 | 76 | 77 | 78 | 79 | 80 | Lily II 81 | 82 | Lily II 83 | 84 | 85 | siblings_0_0->Lily II 86 | 87 | 88 | 89 | 90 | 91 | Albus 92 | 93 | Albus 94 | 95 | 96 | siblings_0_0->Albus 97 | 98 | 99 | 100 | 101 | 102 | union_0 103 | 104 | 105 | 106 | siblings_0 107 | 108 | 109 | 110 | union_0->siblings_0 111 | 112 | 113 | 114 | James 115 | 116 | 117 | James 118 | James Potter I 119 | 120 | 121 | 122 | 123 | James->union_0 124 | 125 | 126 | 127 | Lily 128 | 129 | 130 | Lily 131 | Lily Evans 132 | 133 | 134 | 135 | 136 | Lily->union_0 137 | 138 | 139 | 140 | siblings_0->Harry 141 | 142 | 143 | 144 | 145 | 146 | union_1 147 | 148 | 149 | 150 | siblings_1 151 | 152 | 153 | 154 | union_1->siblings_1 155 | 156 | 157 | 158 | Vernon 159 | 160 | Vernon 161 | 162 | 163 | Vernon->union_1 164 | 165 | 166 | 167 | Petunia 168 | 169 | Petunia 170 | 171 | 172 | Petunia->union_1 173 | 174 | 175 | 176 | siblings_1->Harry 177 | 178 | 179 | 180 | 181 | 182 | Dudley 183 | 184 | Dudley 185 | 186 | 187 | siblings_1->Dudley 188 | 189 | 190 | 191 | 192 | 193 | union_2_0 194 | 195 | 196 | 197 | siblings_2_0 198 | 199 | 200 | 201 | union_2_0->siblings_2_0 202 | 203 | 204 | 205 | Bill 206 | 207 | Bill 208 | 209 | 210 | Bill->union_2_0 211 | 212 | 213 | 214 | Fleur 215 | 216 | 217 | Fleur 218 | Fleur Delacour 219 | 220 | 221 | 222 | 223 | Fleur->union_2_0 224 | 225 | 226 | 227 | Victoire 228 | 229 | Victoire 230 | 231 | 232 | siblings_2_0->Victoire 233 | 234 | 235 | 236 | 237 | 238 | Dominique 239 | 240 | Dominique 241 | 242 | 243 | siblings_2_0->Dominique 244 | 245 | 246 | 247 | 248 | 249 | Louis 250 | 251 | Louis 252 | 253 | 254 | siblings_2_0->Louis 255 | 256 | 257 | 258 | 259 | 260 | union_2_1 261 | 262 | 263 | 264 | George 265 | 266 | George 267 | 268 | 269 | George->union_2_1 270 | 271 | 272 | 273 | Angelina 274 | 275 | Angelina 276 | 277 | 278 | Angelina->union_2_1 279 | 280 | 281 | 282 | union_2_2 283 | 284 | 285 | 286 | siblings_2_2 287 | 288 | 289 | 290 | union_2_2->siblings_2_2 291 | 292 | 293 | 294 | Ron 295 | 296 | 297 | Ron 298 | Ron Weasley 299 | 300 | 301 | 302 | 303 | Ron->union_2_2 304 | 305 | 306 | 307 | Hermione 308 | 309 | 310 | Hermione 311 | Hermione Granger 312 | 313 | 314 | 315 | 316 | Hermione->union_2_2 317 | 318 | 319 | 320 | Rose 321 | 322 | Rose 323 | 324 | 325 | siblings_2_2->Rose 326 | 327 | 328 | 329 | 330 | 331 | Hugo 332 | 333 | Hugo 334 | 335 | 336 | siblings_2_2->Hugo 337 | 338 | 339 | 340 | 341 | 342 | union_2 343 | 344 | 345 | 346 | siblings_2 347 | 348 | 349 | 350 | union_2->siblings_2 351 | 352 | 353 | 354 | Arthur 355 | 356 | Arthur 357 | 358 | 359 | Arthur->union_2 360 | 361 | 362 | 363 | Molly 364 | 365 | Molly 366 | 367 | 368 | Molly->union_2 369 | 370 | 371 | 372 | siblings_2->Ginny 373 | 374 | 375 | 376 | 377 | 378 | siblings_2->Bill 379 | 380 | 381 | 382 | 383 | 384 | siblings_2->George 385 | 386 | 387 | 388 | 389 | 390 | siblings_2->Ron 391 | 392 | 393 | 394 | 395 | 396 | Fred 397 | 398 | Fred 399 | 400 | 401 | siblings_2->Fred 402 | 403 | 404 | 405 | 406 | 407 | union_3 408 | 409 | 410 | 411 | siblings_3 412 | 413 | 414 | 415 | union_3->siblings_3 416 | 417 | 418 | 419 | Mr Granger 420 | 421 | Mr Granger 422 | 423 | 424 | Mr Granger->union_3 425 | 426 | 427 | 428 | Mrs Granger 429 | 430 | Mrs Granger 431 | 432 | 433 | Mrs Granger->union_3 434 | 435 | 436 | 437 | siblings_3->Hermione 438 | 439 | 440 | 441 | 442 | 443 | siblings_4 444 | 445 | 446 | 447 | siblings_4->Lily 448 | 449 | 450 | 451 | 452 | 453 | siblings_4->Petunia 454 | 455 | 456 | 457 | 458 | 459 | 460 | -------------------------------------------------------------------------------- /examples/potter.yml: -------------------------------------------------------------------------------- 1 | families: 2 | - house: Potter 3 | parents: [James, Lily] 4 | children: [Harry] 5 | links: 6 | - http://harrypotter.wikia.com/wiki/Potter_family 7 | families: 8 | - parents: [Harry, Ginny] 9 | children: [James II, Lily II, Albus] 10 | 11 | - house: Dursley 12 | parents: [Vernon, Petunia] 13 | children: [Dudley] 14 | children2: [Harry] 15 | 16 | - house: Weasley 17 | parents: [Arthur, Molly] 18 | children: [Ron, Fred, George, Ginny, Bill] 19 | families: 20 | - parents: [Ron, Hermione] 21 | children: [Rose, Hugo] 22 | - parents: [George, Angelina] 23 | - parents: [Bill, Fleur] 24 | children: [Victoire, Dominique, Louis] 25 | 26 | - house: Granger 27 | parents: [Mr Granger, Mrs Granger] 28 | children: [Hermione] 29 | 30 | - children: [Petunia, Lily] 31 | 32 | people: 33 | James: 34 | fullname: James Potter I 35 | links: 36 | - http://harrypotter.wikia.com/wiki/James_Potter_I 37 | Lily: 38 | fullname: Lily Evans 39 | class: [muggleborn] 40 | links: 41 | - http://harrypotter.wikia.com/wiki/Lily_J._Potter 42 | Fleur: 43 | fullname: Fleur Delacour 44 | links: 45 | - http://harrypotter.wikia.com/wiki/Fleur_Delacour 46 | Ron: 47 | fullname: Ron Weasley 48 | links: 49 | - http://harrypotter.wikia.com/wiki/Ronald_Weasley 50 | Hermione: 51 | fullname: Hermione Granger 52 | class: [muggleborn] 53 | links: 54 | - http://harrypotter.wikia.com/wiki/Hermione_Granger 55 | Mr Granger: 56 | class: [muggle] 57 | Mrs Granger: 58 | class: [muggle] 59 | Vernon: 60 | class: [muggle] 61 | Petunia: 62 | class: [muggle] 63 | 64 | styles: 65 | muggleborn: 66 | penstyle: dashed 67 | -------------------------------------------------------------------------------- /examples/simpsons.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rstacruz/kingraph/c147268b674c6ce56250d92b9e24037da4311a31/examples/simpsons.png -------------------------------------------------------------------------------- /examples/simpsons.svg: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 9 | 10 | G 11 | 12 | cluster_family_0 13 | 14 | cluster_family_1 15 | 16 | cluster_family_2 17 | 18 | 19 | union_0 20 | 21 | 22 | 23 | siblings_0 24 | 25 | 26 | 27 | union_0->siblings_0 28 | 29 | 30 | 31 | Homer 32 | 33 | Homer 34 | Homer Simpson 35 | 36 | 37 | Homer->union_0 38 | 39 | 40 | 41 | Marge 42 | 43 | Marge 44 | Marjorie Jacqueline Simpson 45 | 46 | 47 | Marge->union_0 48 | 49 | 50 | 51 | Bart 52 | 53 | Bart 54 | Bart Simpson 55 | 56 | 57 | siblings_0->Bart 58 | 59 | 60 | 61 | 62 | 63 | Lisa 64 | 65 | Lisa 66 | Lisa Simpson 67 | 68 | 69 | siblings_0->Lisa 70 | 71 | 72 | 73 | 74 | 75 | Maggie 76 | 77 | Maggie 78 | Maggie Simpson 79 | 80 | 81 | siblings_0->Maggie 82 | 83 | 84 | 85 | 86 | 87 | union_1 88 | 89 | 90 | 91 | siblings_1 92 | 93 | 94 | 95 | union_1->siblings_1 96 | 97 | 98 | 99 | Abe 100 | 101 | Abe 102 | Abe Simpson 103 | 104 | 105 | Abe->union_1 106 | 107 | 108 | 109 | Mona 110 | 111 | Mona 112 | Mona Simpson 113 | 114 | 115 | Mona->union_1 116 | 117 | 118 | 119 | siblings_1->Homer 120 | 121 | 122 | 123 | 124 | 125 | union_2 126 | 127 | 128 | 129 | siblings_2 130 | 131 | 132 | 133 | union_2->siblings_2 134 | 135 | 136 | 137 | Jacqueline 138 | 139 | Jacqueline 140 | Jacqueline Bouvier 141 | 142 | 143 | Jacqueline->union_2 144 | 145 | 146 | 147 | Clancy 148 | 149 | Clancy 150 | Clancy Bouvier 151 | 152 | 153 | Clancy->union_2 154 | 155 | 156 | 157 | siblings_2->Marge 158 | 159 | 160 | 161 | 162 | 163 | Patty 164 | 165 | Patty 166 | Patty Bouvier 167 | 168 | 169 | siblings_2->Patty 170 | 171 | 172 | 173 | 174 | 175 | Selma 176 | 177 | Selma 178 | Selma Bouvier 179 | 180 | 181 | siblings_2->Selma 182 | 183 | 184 | 185 | 186 | 187 | 188 | -------------------------------------------------------------------------------- /examples/simpsons.yml: -------------------------------------------------------------------------------- 1 | families: 2 | - parents: [Homer, Marge] 3 | children: [Bart, Lisa, Maggie] 4 | - parents: [Abe, Mona] 5 | children: [Homer] 6 | - parents: [Jacqueline, Clancy] 7 | children: [Marge, Patty, Selma] 8 | 9 | people: 10 | Bart: 11 | name: Bart 12 | fullname: Bart Simpson 13 | gender: m 14 | Lisa: 15 | name: Lisa 16 | fullname: Lisa Simpson 17 | gender: f 18 | Maggie: 19 | name: Maggie 20 | fullname: Maggie Simpson 21 | gender: f 22 | Marge: 23 | name: Marge 24 | fullname: Marjorie Jacqueline Simpson 25 | gender: f 26 | Homer: 27 | name: Homer 28 | fullname: Homer Simpson 29 | gender: m 30 | Abe: 31 | name: Abe 32 | fullname: Abe Simpson 33 | gender: m 34 | Mona: 35 | name: Mona 36 | fullname: Mona Simpson 37 | gender: f 38 | Patty: 39 | name: Patty 40 | fullname: Patty Bouvier 41 | gender: f 42 | Selma: 43 | name: Selma 44 | fullname: Selma Bouvier 45 | gender: f 46 | Jacqueline: 47 | name: Jacqueline 48 | fullname: Jacqueline Bouvier 49 | gender: f 50 | Clancy: 51 | name: Clancy 52 | fullname: Clancy Bouvier 53 | gender: m 54 | 55 | -------------------------------------------------------------------------------- /index.js: -------------------------------------------------------------------------------- 1 | module.exports = require('./lib/render') 2 | -------------------------------------------------------------------------------- /lib/apply_style.js: -------------------------------------------------------------------------------- 1 | const map = require('object-loops/map') 2 | const assign = require('object-assign') 3 | const reduce = require('object-loops/reduce') 4 | const values = require('object-loops/values') 5 | const DEFAULT_STYLES = require('./defaults/styles') 6 | 7 | /** 8 | * Returns attributes for a given class 9 | * 10 | * data = { styles: { ':root': { color: 'gold', dir: 'none' } } } 11 | * applyStyle(data, [':root']) 12 | * => ['color="gold"', 'dir="none"'] 13 | */ 14 | 15 | function applyStyle (data, classes, options) { 16 | if (!options) options = {} 17 | 18 | const styles = data.styles || {} 19 | 20 | function applyStyles (acc, stylesheet) { 21 | return reduce(stylesheet, (styles, val, key) => { 22 | if (classes.indexOf(key) === -1) return styles 23 | return assign({}, styles, val) 24 | }, acc) 25 | } 26 | 27 | let result = {} 28 | result = assign({}, result, options.before || {}) 29 | result = applyStyles(result, DEFAULT_STYLES) 30 | result = applyStyles(result, data.styles || {}) 31 | result = assign({}, result, options.after || {}) 32 | return renderStyle(result, options) 33 | } 34 | 35 | /** 36 | * Renders key/value into an attribute string 37 | * 38 | * renderStyle({ color: 'gold', dir: 'none' ]) 39 | * => ['color="gold"', 'dir="none"'] 40 | */ 41 | 42 | function renderStyle (properties, options) { 43 | return values(map(properties, (val, key) => { 44 | if (val == null) return 45 | return `${key}=${stringify(val)}` 46 | })).filter(s => s != null) 47 | } 48 | 49 | function stringify (val) { 50 | if (typeof val === 'string' && /^<.*>$/.test(val)) { 51 | return val 52 | } else { 53 | return JSON.stringify(val) 54 | } 55 | } 56 | 57 | /* 58 | * Export 59 | */ 60 | 61 | module.exports = applyStyle 62 | -------------------------------------------------------------------------------- /lib/apply_style.test.js: -------------------------------------------------------------------------------- 1 | const test = require('tape') 2 | const applyStyle = require('./apply_style') 3 | 4 | test('applyStyle()', t => { 5 | let out 6 | 7 | let data = { 8 | styles: { 9 | 'hello': { color: 'gold', dir: 'none' }, 10 | 'world': { style: 'filled', color: 'blue' } 11 | } 12 | } 13 | 14 | out = applyStyle(data, ['hello']) 15 | t.deepEqual(out, ['color="gold"', 'dir="none"'], 16 | 'single class') 17 | 18 | out = applyStyle(data, ['world']) 19 | t.deepEqual(out, ['style="filled"', 'color="blue"'], 20 | 'single class') 21 | 22 | out = applyStyle(data, ['hello', 'world']) 23 | t.deepEqual(out, ['color="blue"', 'dir="none"', 'style="filled"'], 24 | 'multiple classes') 25 | 26 | out = applyStyle(data, ['world', 'hello']) 27 | t.deepEqual(out, ['color="blue"', 'dir="none"', 'style="filled"'], 28 | 'multiple classes, reordered') 29 | 30 | out = applyStyle(data, ['hello'], { before: { color: 'red' }}) 31 | t.deepEqual(out, ['color="gold"', 'dir="none"'], 32 | 'before') 33 | 34 | out = applyStyle(data, ['hello'], { after: { color: 'red' }}) 35 | t.deepEqual(out, ['color="red"', 'dir="none"'], 36 | 'after') 37 | 38 | t.end() 39 | }) 40 | -------------------------------------------------------------------------------- /lib/defaults/colors.js: -------------------------------------------------------------------------------- 1 | const COLORS = [ 2 | '#1abc9c', 3 | '#2ecc71', 4 | '#3498db', 5 | '#9b59b6', 6 | '#34495e', 7 | '#f1c40f', 8 | '#e67e22', 9 | '#e74c3c' 10 | ] 11 | 12 | module.exports = COLORS 13 | -------------------------------------------------------------------------------- /lib/defaults/styles.js: -------------------------------------------------------------------------------- 1 | const DEFAULT_STYLES = { 2 | ':edge': { 3 | dir: 'none', 4 | color: '#cccccc' 5 | }, 6 | ':house': { 7 | style: 'filled', 8 | color: '#fafafa', 9 | labeljust: 'l', 10 | fontname: 'Helvetica, Arial, sans-serif', 11 | fontsize: 16, 12 | margin: 10 13 | }, 14 | ':house-2': { 15 | color: '#ffffff' 16 | }, 17 | // Family subgraph 18 | ':family': { 19 | label: '', 20 | style: 'invis', 21 | margin: 0 22 | }, 23 | ':node': { 24 | shape: 'box', 25 | style: 'filled', 26 | fontname: 'Helvetica, Arial, sans-serif', 27 | width: 2.5, 28 | fillcolor: 'white', 29 | color: '#cccccc' 30 | }, 31 | ':digraph': { 32 | rankdir: 'LR', 33 | ranksep: 0.4, 34 | splines: 'ortho' 35 | }, 36 | ':union': { 37 | shape: 'circle', 38 | style: 'filled', 39 | penwidth: 1, 40 | color: 'white', 41 | label: '', 42 | height: 0.1, 43 | width: 0.1 44 | }, 45 | ':children': { 46 | shape: 'box', 47 | style: 'filled', 48 | label: '', 49 | height: 0.005, /* Make it look like a line. Brilliant! */ 50 | penwidth: 0, 51 | width: 0.1 52 | }, 53 | ':parent-link': { 54 | weight: 2 /* give priority to be straighter than parent2 */ 55 | }, 56 | ':parent2-link': { 57 | style: 'dashed', 58 | penwidth: 0.25, 59 | weight: 1 60 | }, 61 | ':parent-child-link': { 62 | weight: 3 /* prefer bridges to be straight */ 63 | }, 64 | ':child-link': { 65 | dir: 'forward', 66 | arrowhead: 'tee', 67 | arrowsize: 2, 68 | weight: 2 69 | }, 70 | ':child2-link': { 71 | style: 'dashed', 72 | penwidth: 0.25, 73 | weight: 1 74 | }, 75 | } 76 | 77 | module.exports = DEFAULT_STYLES 78 | -------------------------------------------------------------------------------- /lib/defaults/symbols.js: -------------------------------------------------------------------------------- 1 | const SYMBOLS = { 2 | male: '♂', 3 | female: '♀', 4 | deceased: '†' 5 | } 6 | 7 | module.exports = SYMBOLS 8 | -------------------------------------------------------------------------------- /lib/id_generator.js: -------------------------------------------------------------------------------- 1 | function idGen () { 2 | var ids = {} 3 | 4 | return function (key) { 5 | if (typeof ids[key] === 'undefined') { 6 | return (ids[key] = 0) 7 | } else { 8 | return ++ids[key] 9 | } 10 | } 11 | } 12 | 13 | module.exports = idGen 14 | -------------------------------------------------------------------------------- /lib/id_generator.test.js: -------------------------------------------------------------------------------- 1 | const test = require('tape') 2 | const gen = require('./id_generator') 3 | 4 | test('idGenerator()', t => { 5 | let get 6 | get = gen() 7 | 8 | t.equal(get('family'), 0) 9 | t.equal(get('family'), 1) 10 | t.equal(get('family'), 2) 11 | t.equal(get('other'), 0) 12 | t.equal(get('other'), 1) 13 | 14 | t.end() 15 | }) 16 | -------------------------------------------------------------------------------- /lib/join.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Joins everything in `array` recursively. 3 | * 4 | * join(['a', ['b', 'c']], { sep: ',' }) 5 | * => 'a,b,c' 6 | * 7 | * To make an indentation, make a `{indent: [...]}` object. 8 | * 9 | * join(['a {', {indent: ['b', 'c']}, '}'], { sep: '\n' }) 10 | * => 'a {\n b\n c\n}' 11 | */ 12 | 13 | function join (array, options) { 14 | if (!options) options = {} 15 | 16 | var prefix = options.prefix || '' 17 | var indent = options.indent || '\t' 18 | 19 | return flatten(array) 20 | .map(frag => { 21 | if (!frag.indent) return prefix + frag 22 | return join(frag.indent, Object.assign({}, options, { prefix: prefix + indent })) 23 | }) 24 | .join(options && options.sep || '\n') 25 | } 26 | 27 | function flatten (array) { 28 | if (array === null || array === undefined || array === false) return [] 29 | if (!Array.isArray(array)) return [array] 30 | 31 | return array.reduce((acc, frag) => { 32 | return acc.concat(flatten(frag)) 33 | }, []) 34 | } 35 | 36 | module.exports = join 37 | -------------------------------------------------------------------------------- /lib/join.test.js: -------------------------------------------------------------------------------- 1 | const test = require('tape') 2 | const join = require('./join') 3 | 4 | test('join()', t => { 5 | t.equal(join(['a', 'b'], { sep: ',' }), 'a,b') 6 | t.equal(join(['a', ['b']], { sep: ',' }), 'a,b') 7 | t.equal(join(['a', ['b', 'c']], { sep: ',' }), 'a,b,c') 8 | t.equal(join(['a', ['b', null, 'c']], { sep: ',' }), 'a,b,c') 9 | t.equal(join(['a', '', 'b'], { sep: ',' }), 'a,,b') 10 | t.equal(join(['a', false, 'b'], { sep: ',' }), 'a,b') 11 | t.equal(join(['a {', { indent: ['hello'] }, '}'], { sep: '\n', indent: ' ' }), 'a {\n hello\n}') 12 | t.equal(join(['a {', { indent: ['hello'] }, '}']), 'a {\n\thello\n}') 13 | t.equal(join(['a {', { indent: ['hello {', { indent: ['world'] }, '}'] }, '}']), 14 | 'a {\n\thello {\n\t\tworld\n\t}\n}') 15 | t.end() 16 | }) 17 | -------------------------------------------------------------------------------- /lib/normalize.js: -------------------------------------------------------------------------------- 1 | const assign = require('object-assign') 2 | 3 | function normalize (data) { 4 | data = assign({}, data) 5 | return data 6 | } 7 | 8 | /** 9 | * Normalizes people options. 10 | */ 11 | 12 | function normalizePeople (people, options) { 13 | return map(people, p => normalizePerson(p, options)) 14 | } 15 | 16 | /** 17 | * Normalizes person names and such. 18 | */ 19 | 20 | function normalizePerson (person, options) { 21 | return person 22 | } 23 | 24 | module.exports = normalize 25 | -------------------------------------------------------------------------------- /lib/render.js: -------------------------------------------------------------------------------- 1 | const renderGraph = require('./render_graph') 2 | const toPng = require('./to_png') 3 | 4 | /* 5 | * Renders data into various formats. 6 | * 7 | * @param String format Can be `dot`, `svg`, `png` or `png-image`. 8 | * 9 | * Use `{ async: true }` to return a Promise. 10 | * Using `{ format: 'png' }` implies `async: true`. 11 | */ 12 | 13 | function render (data, options) { 14 | if (options && options.async) { 15 | return Promise.resolve(render(data, Object.assign({}, options, { async: false }))) 16 | } 17 | 18 | const format = options && options.format || 'svg' 19 | 20 | const dot = renderGraph(data) 21 | if (format === 'dot') return dot 22 | 23 | const svg = require('viz.js')(dot, { format: 'svg', engine: 'dot' }) 24 | if (format === 'svg') return svg 25 | 26 | if (format === 'png') return require('./to_png')(svg) 27 | if (format === 'png-image') return require('./to_png_image')(svg) 28 | } 29 | 30 | /* 31 | * Export 32 | */ 33 | 34 | module.exports = render 35 | -------------------------------------------------------------------------------- /lib/render_graph.js: -------------------------------------------------------------------------------- 1 | const map = require('object-loops/map') 2 | const join = require('./join') 3 | const values = require('object-loops/values') 4 | const slugify = require('./slugify') 5 | const normalize = require('./normalize') 6 | const applyStyle = require('./apply_style') 7 | const idGenerator = require('./id_generator') 8 | 9 | const COLORS = require('./defaults/colors') 10 | 11 | const getId = idGenerator() 12 | 13 | const LINE = Array(76).join('#') 14 | const LINE2 = '# ' + Array(74).join('-') 15 | 16 | function render (data) { 17 | data = normalize(data) 18 | 19 | return join([ 20 | 'digraph G {', 21 | { indent: [ 22 | 'edge [', 23 | { indent: applyStyle(data, [':edge']) }, 24 | ']', 25 | '', 26 | 'node [', 27 | { indent: applyStyle(data, [':node']) }, 28 | ']', 29 | '', 30 | applyStyle(data, [':digraph']), 31 | renderHouse(data, data, []) 32 | ]}, 33 | '}' 34 | ], { indent: ' ' }) 35 | } 36 | 37 | function renderHouse (data, house, path) { 38 | const people = house.people || {} 39 | const families = house.families || [] 40 | const houses = house.houses || {} 41 | 42 | const meat = [ 43 | // People and families 44 | values(map(families, (f, id) => renderFamily(data, house, f || {}, path.concat([id])))), 45 | values(map(people, (p, id) => renderPerson(data, house, p || {}, path.concat([id])))) 46 | ] 47 | 48 | if (path.length === 0) { 49 | return meat 50 | } else { 51 | const name = house.name || path[path.length -1 ] 52 | 53 | return [ 54 | '', 55 | LINE, 56 | `# House ${path}`, 57 | LINE, 58 | '', 59 | `subgraph cluster_${slugify(path)} {`, 60 | { indent: [ 61 | `label=<${name}>`, 62 | applyStyle(data, [':house', `:house-${path.length}`]), 63 | '', 64 | meat 65 | ] }, 66 | '}' 67 | ] 68 | } 69 | } 70 | 71 | function renderPerson (data, house, person, path) { 72 | let id = path[path.length - 1] 73 | let label 74 | let href = person.links && person.links[0] 75 | 76 | if (person.name || person.fullname) { 77 | label = 78 | '<' + 79 | '` + 81 | '
' + 80 | `${person.name || id}
' + 82 | '' + 83 | `${person.fullname || person.name}
>` 84 | } else { 85 | label = id 86 | } 87 | 88 | return [ 89 | `"${id}" [`, 90 | { indent: [ 91 | applyStyle(data, person.class || [], { before: { 92 | label, href 93 | } }) 94 | ] }, 95 | ']' ] 96 | } 97 | 98 | /* 99 | * For comments 100 | */ 101 | 102 | function summarizeFamily (family) { 103 | const parents = [] 104 | .concat(family.parents || []) 105 | .concat(family.parents2 || []) 106 | .filter(Boolean) 107 | 108 | const children = [] 109 | .concat(family.children || []) 110 | .concat(family.children2 || []) 111 | .filter(Boolean) 112 | 113 | return `[${parents.join(', ')}] -> [${children.join(', ')}]` 114 | } 115 | 116 | /* 117 | * Renders a family subgraph 118 | */ 119 | 120 | function renderFamily (data, house, family, path) { 121 | const slug = slugify(path) 122 | const color = COLORS[getId('family') % COLORS.length] 123 | const parents = family.parents || [] 124 | const parents2 = family.parents2 || [] 125 | const children = family.children || [] 126 | const children2 = family.children2 || [] 127 | const affinity = family.affinity || [] 128 | const housename = family.house 129 | 130 | const hasParents = (parents.length + parents2.length) > 0 131 | const hasChildren = (children.length + children2.length) > 0 132 | const hasManyChildren = (children.length + children.length) > 1 133 | 134 | const union = `union_${slug}` 135 | const kids = `siblings_${slug}` 136 | 137 | return [ 138 | '', 139 | `subgraph cluster_family_${slug} {`, 140 | style([':family']), 141 | { indent: [ 142 | housename && renderHousePrelude(), 143 | // renderPeople(), 144 | renderSubFamilies(), 145 | '', 146 | `# Family ${summarizeFamily(family)}`, 147 | LINE2, 148 | '', 149 | hasParents && renderParents(), 150 | hasParents && hasChildren && renderLink(), 151 | hasChildren && renderKids(), 152 | (hasManyChildren > 1) && renderKidLinks() 153 | ] }, 154 | '}' 155 | ] 156 | 157 | function style (classes, before) { 158 | return { indent: applyStyle(data, classes, { before: (before || {}) }) } 159 | } 160 | 161 | function renderPeople () { 162 | const list = [] 163 | .concat(parents) 164 | .concat(children) 165 | 166 | return `{${list.map(escape).join('; ')}}` 167 | } 168 | 169 | function renderHousePrelude () { 170 | let label = `<${housename}>` 171 | let labelhref = family.links && family.links[0] 172 | 173 | return [ 174 | applyStyle(data, [':house'], { before: { label, labelhref } }) 175 | ] 176 | } 177 | 178 | function renderSubFamilies () { 179 | // Reverse the families, because we assume people put "deeper" families last. 180 | // You want to render the deeper families first so that their parents are placed 181 | // in those families, rather than the parent families. 182 | const families = [].concat(family.families || []).reverse() 183 | return families.map((f, idx) => renderFamily(data, house, f, path.concat(idx))) 184 | } 185 | 186 | function renderParents () { 187 | return [ 188 | `${union} [`, 189 | style([':union'], { fillcolor: color }), 190 | ']', 191 | '', 192 | parents.length > 0 && [ 193 | `{${parents.map(escape).join(', ')}} -> ${union} [`, 194 | style([':parent-link'], { color }), 195 | ']' 196 | ], 197 | parents2.length > 0 && [ 198 | `{${parents2.map(escape).join(', ')}} -> ${union} [`, 199 | style([':parent-link', ':parent2-link'], { color }), 200 | ']' 201 | ] 202 | ] 203 | } 204 | 205 | function renderLink () { 206 | return [ 207 | `${union} -> ${kids} [`, 208 | style([':parent-link', ':parent-child-link'], { color: color }), 209 | ']' ] 210 | } 211 | 212 | function renderKids () { 213 | return [ 214 | `${kids} [`, 215 | style([':children'], { fillcolor: color }), 216 | `]`, 217 | 218 | children.length > 0 && [ 219 | `${kids} -> {${children.map(escape).join(', ')}} [`, 220 | style([':child-link'], { color }), 221 | ']' 222 | ], 223 | 224 | children2.length > 0 && [ 225 | `${kids} -> {${children2.map(escape).join(', ')}} [`, 226 | style([':child-link', ':child2-link'], { color }), 227 | ']' 228 | ] 229 | 230 | ] 231 | } 232 | 233 | function renderKidLinks () { 234 | return [ 235 | `{"${children.concat(children2).join('" -> "')}" [`, 236 | { indent: [ 237 | applyStyle(data, [':child-links'], { before: { 238 | style: 'invis' 239 | }}) 240 | ] }, 241 | ']' ] 242 | } 243 | } 244 | 245 | /* 246 | * Escapes a name into a node name. 247 | */ 248 | 249 | function escape (str) { 250 | if (/^[A-Za-z]+$/.test(str)){ 251 | return str 252 | } else { 253 | return JSON.stringify(str) 254 | } 255 | } 256 | 257 | /* 258 | * Export 259 | */ 260 | 261 | module.exports = render 262 | -------------------------------------------------------------------------------- /lib/slugify.js: -------------------------------------------------------------------------------- 1 | function slugify (object, options) { 2 | const sep = options && options.sep || '_' 3 | 4 | if (Array.isArray(object)) { 5 | return object.map(f => slugify(f, options)).join(sep) 6 | } 7 | 8 | return kebabCase(object.toString(), sep) 9 | } 10 | 11 | function kebabCase (str, sep) { 12 | return str.toLowerCase().match(/[a-z0-9]+/g).join(sep || '_') 13 | } 14 | 15 | module.exports = slugify 16 | -------------------------------------------------------------------------------- /lib/slugify.test.js: -------------------------------------------------------------------------------- 1 | const test = require('tape') 2 | const slugify = require('./slugify') 3 | 4 | test('slugify()', t => { 5 | t.equal(slugify('hi'), 'hi') 6 | t.equal(slugify(['hi', 'world']), 'hi_world') 7 | t.equal(slugify(['hi', 0]), 'hi_0') 8 | t.equal(slugify(['hi', 'k'], { sep: '-' }), 'hi-k') 9 | t.equal(slugify(['hi', ['k']], { sep: '-' }), 'hi-k') 10 | t.end() 11 | }) 12 | -------------------------------------------------------------------------------- /lib/to_png.js: -------------------------------------------------------------------------------- 1 | /* 2 | * Converts to PNG. 3 | */ 4 | 5 | function toPng (svgXml) { 6 | const svg2png = require('svg2png') 7 | return svg2png(svgXml) 8 | } 9 | 10 | module.exports = toPng 11 | -------------------------------------------------------------------------------- /lib/to_png_image.js: -------------------------------------------------------------------------------- 1 | 2 | /* 3 | * toPNG for the browser 4 | */ 5 | 6 | function toPng (svgXml) { 7 | var scaleFactor = 1 8 | 9 | if (typeof window !== 'undefined' && 'devicePixelRatio' in window) { 10 | if (window.devicePixelRatio > 1) { 11 | scaleFactor = window.devicePixelRatio 12 | } 13 | } 14 | 15 | var svgImage = new Image() 16 | svgImage.src = 'data:image/svg+xml;utf8,' + svgXml 17 | 18 | var pngImage = new Image() 19 | 20 | svgImage.onload = function() { 21 | var canvas = document.createElement('canvas') 22 | canvas.width = svgImage.width * scaleFactor 23 | canvas.height = svgImage.height * scaleFactor 24 | 25 | var context = canvas.getContext('2d') 26 | context.drawImage(svgImage, 0, 0, canvas.width, canvas.height) 27 | 28 | pngImage.src = canvas.toDataURL 29 | pngImage.width = svgImage.width 30 | pngImage.height = svgImage.height 31 | } 32 | 33 | return pngImage 34 | } 35 | 36 | module.exports = toPng 37 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "kingraph", 3 | "description": "Plots family trees using JavaScript and Graphviz", 4 | "version": "0.1.0", 5 | "author": "Rico Sta. Cruz (http://ricostacruz.com)", 6 | "bin": { 7 | "kingraph": "bin/kingraph" 8 | }, 9 | "dependencies": { 10 | "js-yaml": "3.6.1", 11 | "meow": "3.7.0", 12 | "object-assign": "4.1.0", 13 | "object-loops": "0.8.0", 14 | "read-input": "0.3.1", 15 | "strip-indent": "2.0.0", 16 | "svg2png": "4.1.0", 17 | "viz.js": "1.3.0" 18 | }, 19 | "browser": { 20 | "lib/to_png.js": "lib/to_png.browser.js" 21 | }, 22 | "devDependencies": { 23 | "tape": "4.6.2" 24 | }, 25 | "keywords": [ 26 | "ancestry", 27 | "family", 28 | "family tree", 29 | "genealogy" 30 | ], 31 | "license": "MIT", 32 | "main": "index.js", 33 | "scripts": { 34 | "test": "tape lib/**/*.test.js" 35 | } 36 | } 37 | -------------------------------------------------------------------------------- /yarn.lock: -------------------------------------------------------------------------------- 1 | # THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. 2 | # yarn lockfile v1 3 | "101@^1.0.0", "101@^1.6.1": 4 | version "1.6.2" 5 | resolved "https://registry.yarnpkg.com/101/-/101-1.6.2.tgz#43cb51db1a400443de2929ec9c788144d56b57e8" 6 | dependencies: 7 | clone "^1.0.2" 8 | deep-eql "^0.1.3" 9 | keypather "^1.10.2" 10 | 11 | ansi-regex@^2.0.0: 12 | version "2.0.0" 13 | resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.0.0.tgz#c5061b6e0ef8a81775e50f5d66151bf6bf371107" 14 | 15 | ansi-styles@^2.2.1: 16 | version "2.2.1" 17 | resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe" 18 | 19 | argparse@^1.0.7: 20 | version "1.0.9" 21 | resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.9.tgz#73d83bc263f86e97f8cc4f6bae1b0e90a7d22c86" 22 | dependencies: 23 | sprintf-js "~1.0.2" 24 | 25 | array-find-index@^1.0.1: 26 | version "1.0.2" 27 | resolved "https://registry.yarnpkg.com/array-find-index/-/array-find-index-1.0.2.tgz#df010aa1287e164bbda6f9723b0a96a1ec4187a1" 28 | 29 | asn1@~0.2.3: 30 | version "0.2.3" 31 | resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.3.tgz#dac8787713c9966849fc8180777ebe9c1ddf3b86" 32 | 33 | assert-plus@^0.2.0: 34 | version "0.2.0" 35 | resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-0.2.0.tgz#d74e1b87e7affc0db8aadb7021f3fe48101ab234" 36 | 37 | assert-plus@^1.0.0: 38 | version "1.0.0" 39 | resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525" 40 | 41 | async@^2.0.1: 42 | version "2.1.2" 43 | resolved "https://registry.yarnpkg.com/async/-/async-2.1.2.tgz#612a4ab45ef42a70cde806bad86ee6db047e8385" 44 | dependencies: 45 | lodash "^4.14.0" 46 | 47 | aws-sign2@~0.6.0: 48 | version "0.6.0" 49 | resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.6.0.tgz#14342dd38dbcc94d0e5b87d763cd63612c0e794f" 50 | 51 | aws4@^1.2.1: 52 | version "1.5.0" 53 | resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.5.0.tgz#0a29ffb79c31c9e712eeb087e8e7a64b4a56d755" 54 | 55 | balanced-match@^0.4.1: 56 | version "0.4.2" 57 | resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-0.4.2.tgz#cb3f3e3c732dc0f01ee70b403f302e61d7709838" 58 | 59 | bcrypt-pbkdf@^1.0.0: 60 | version "1.0.0" 61 | resolved "https://registry.yarnpkg.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.0.tgz#3ca76b85241c7170bf7d9703e7b9aa74630040d4" 62 | dependencies: 63 | tweetnacl "^0.14.3" 64 | 65 | bl@~1.1.2: 66 | version "1.1.2" 67 | resolved "https://registry.yarnpkg.com/bl/-/bl-1.1.2.tgz#fdca871a99713aa00d19e3bbba41c44787a65398" 68 | dependencies: 69 | readable-stream "~2.0.5" 70 | 71 | boom@2.x.x: 72 | version "2.10.1" 73 | resolved "https://registry.yarnpkg.com/boom/-/boom-2.10.1.tgz#39c8918ceff5799f83f9492a848f625add0c766f" 74 | dependencies: 75 | hoek "2.x.x" 76 | 77 | brace-expansion@^1.0.0: 78 | version "1.1.6" 79 | resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.6.tgz#7197d7eaa9b87e648390ea61fc66c84427420df9" 80 | dependencies: 81 | balanced-match "^0.4.1" 82 | concat-map "0.0.1" 83 | 84 | builtin-modules@^1.0.0: 85 | version "1.1.1" 86 | resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-1.1.1.tgz#270f076c5a72c02f5b65a47df94c5fe3a278892f" 87 | 88 | camelcase-keys@^2.0.0: 89 | version "2.1.0" 90 | resolved "https://registry.yarnpkg.com/camelcase-keys/-/camelcase-keys-2.1.0.tgz#308beeaffdf28119051efa1d932213c91b8f92e7" 91 | dependencies: 92 | camelcase "^2.0.0" 93 | map-obj "^1.0.0" 94 | 95 | camelcase@^2.0.0: 96 | version "2.1.1" 97 | resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-2.1.1.tgz#7c1d16d679a1bbe59ca02cacecfb011e201f5a1f" 98 | 99 | camelcase@^3.0.0: 100 | version "3.0.0" 101 | resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-3.0.0.tgz#32fc4b9fcdaf845fcdf7e73bb97cac2261f0ab0a" 102 | 103 | canvas: 104 | version "1.6.2" 105 | resolved "https://registry.yarnpkg.com/canvas/-/canvas-1.6.2.tgz#12b56e3f00e7880aa45e3aae59fe75237720aaa4" 106 | dependencies: 107 | nan "^2.4.0" 108 | 109 | caseless@~0.11.0: 110 | version "0.11.0" 111 | resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.11.0.tgz#715b96ea9841593cc33067923f5ec60ebda4f7d7" 112 | 113 | chalk@^1.1.1: 114 | version "1.1.3" 115 | resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98" 116 | dependencies: 117 | ansi-styles "^2.2.1" 118 | escape-string-regexp "^1.0.2" 119 | has-ansi "^2.0.0" 120 | strip-ansi "^3.0.0" 121 | supports-color "^2.0.0" 122 | 123 | cliui@^3.2.0: 124 | version "3.2.0" 125 | resolved "https://registry.yarnpkg.com/cliui/-/cliui-3.2.0.tgz#120601537a916d29940f934da3b48d585a39213d" 126 | dependencies: 127 | string-width "^1.0.1" 128 | strip-ansi "^3.0.1" 129 | wrap-ansi "^2.0.0" 130 | 131 | clone@^1.0.2: 132 | version "1.0.2" 133 | resolved "https://registry.yarnpkg.com/clone/-/clone-1.0.2.tgz#260b7a99ebb1edfe247538175f783243cb19d149" 134 | 135 | code-point-at@^1.0.0: 136 | version "1.1.0" 137 | resolved "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77" 138 | 139 | combined-stream@^1.0.5, combined-stream@~1.0.5: 140 | version "1.0.5" 141 | resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.5.tgz#938370a57b4a51dea2c77c15d5c5fdf895164009" 142 | dependencies: 143 | delayed-stream "~1.0.0" 144 | 145 | commander@^2.9.0: 146 | version "2.9.0" 147 | resolved "https://registry.yarnpkg.com/commander/-/commander-2.9.0.tgz#9c99094176e12240cb22d6c5146098400fe0f7d4" 148 | dependencies: 149 | graceful-readlink ">= 1.0.0" 150 | 151 | concat-map@0.0.1: 152 | version "0.0.1" 153 | resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" 154 | 155 | concat-stream@1.5.0: 156 | version "1.5.0" 157 | resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.5.0.tgz#53f7d43c51c5e43f81c8fdd03321c631be68d611" 158 | dependencies: 159 | inherits "~2.0.1" 160 | readable-stream "~2.0.0" 161 | typedarray "~0.0.5" 162 | 163 | core-util-is@~1.0.0: 164 | version "1.0.2" 165 | resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" 166 | 167 | cryptiles@2.x.x: 168 | version "2.0.5" 169 | resolved "https://registry.yarnpkg.com/cryptiles/-/cryptiles-2.0.5.tgz#3bdfecdc608147c1c67202fa291e7dca59eaa3b8" 170 | dependencies: 171 | boom "2.x.x" 172 | 173 | currently-unhandled@^0.4.1: 174 | version "0.4.1" 175 | resolved "https://registry.yarnpkg.com/currently-unhandled/-/currently-unhandled-0.4.1.tgz#988df33feab191ef799a61369dd76c17adf957ea" 176 | dependencies: 177 | array-find-index "^1.0.1" 178 | 179 | dashdash@^1.12.0: 180 | version "1.14.0" 181 | resolved "https://registry.yarnpkg.com/dashdash/-/dashdash-1.14.0.tgz#29e486c5418bf0f356034a993d51686a33e84141" 182 | dependencies: 183 | assert-plus "^1.0.0" 184 | 185 | dasherize@^2.0.0: 186 | version "2.0.0" 187 | resolved "https://registry.yarnpkg.com/dasherize/-/dasherize-2.0.0.tgz#6d809c9cd0cf7bb8952d80fc84fa13d47ddb1308" 188 | 189 | debug@0.7.4: 190 | version "0.7.4" 191 | resolved "https://registry.yarnpkg.com/debug/-/debug-0.7.4.tgz#06e1ea8082c2cb14e39806e22e2f6f757f92af39" 192 | 193 | decamelize@^1.1.1, decamelize@^1.1.2: 194 | version "1.2.0" 195 | resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" 196 | 197 | deep-eql@^0.1.3: 198 | version "0.1.3" 199 | resolved "https://registry.yarnpkg.com/deep-eql/-/deep-eql-0.1.3.tgz#ef558acab8de25206cd713906d74e56930eb69f2" 200 | dependencies: 201 | type-detect "0.1.1" 202 | 203 | deep-equal@~1.0.1: 204 | version "1.0.1" 205 | resolved "https://registry.yarnpkg.com/deep-equal/-/deep-equal-1.0.1.tgz#f5d260292b660e084eff4cdbc9f08ad3247448b5" 206 | 207 | define-properties@^1.1.2: 208 | version "1.1.2" 209 | resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.2.tgz#83a73f2fea569898fb737193c8f873caf6d45c94" 210 | dependencies: 211 | foreach "^2.0.5" 212 | object-keys "^1.0.8" 213 | 214 | defined@~1.0.0: 215 | version "1.0.0" 216 | resolved "https://registry.yarnpkg.com/defined/-/defined-1.0.0.tgz#c98d9bcef75674188e110969151199e39b1fa693" 217 | 218 | delayed-stream@~1.0.0: 219 | version "1.0.0" 220 | resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" 221 | 222 | ecc-jsbn@~0.1.1: 223 | version "0.1.1" 224 | resolved "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz#0fc73a9ed5f0d53c38193398523ef7e543777505" 225 | dependencies: 226 | jsbn "~0.1.0" 227 | 228 | error-ex@^1.2.0: 229 | version "1.3.0" 230 | resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.0.tgz#e67b43f3e82c96ea3a584ffee0b9fc3325d802d9" 231 | dependencies: 232 | is-arrayish "^0.2.1" 233 | 234 | es-abstract@^1.5.0: 235 | version "1.6.1" 236 | resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.6.1.tgz#bb8a2064120abcf928a086ea3d9043114285ec99" 237 | dependencies: 238 | es-to-primitive "^1.1.1" 239 | function-bind "^1.1.0" 240 | is-callable "^1.1.3" 241 | is-regex "^1.0.3" 242 | 243 | es-to-primitive@^1.1.1: 244 | version "1.1.1" 245 | resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.1.1.tgz#45355248a88979034b6792e19bb81f2b7975dd0d" 246 | dependencies: 247 | is-callable "^1.1.1" 248 | is-date-object "^1.0.1" 249 | is-symbol "^1.0.1" 250 | 251 | es6-promise@~4.0.3: 252 | version "4.0.5" 253 | resolved "https://registry.yarnpkg.com/es6-promise/-/es6-promise-4.0.5.tgz#7882f30adde5b240ccfa7f7d78c548330951ae42" 254 | 255 | escape-string-regexp@^1.0.2: 256 | version "1.0.5" 257 | resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" 258 | 259 | esprima@^2.6.0: 260 | version "2.7.3" 261 | resolved "https://registry.yarnpkg.com/esprima/-/esprima-2.7.3.tgz#96e3b70d5779f6ad49cd032673d1c312767ba581" 262 | 263 | extend@~3.0.0: 264 | version "3.0.0" 265 | resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.0.tgz#5a474353b9f3353ddd8176dfd37b91c83a46f1d4" 266 | 267 | extract-zip@~1.5.0: 268 | version "1.5.0" 269 | resolved "https://registry.yarnpkg.com/extract-zip/-/extract-zip-1.5.0.tgz#92ccf6d81ef70a9fa4c1747114ccef6d8688a6c4" 270 | dependencies: 271 | concat-stream "1.5.0" 272 | debug "0.7.4" 273 | mkdirp "0.5.0" 274 | yauzl "2.4.1" 275 | 276 | extsprintf@1.0.2: 277 | version "1.0.2" 278 | resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.0.2.tgz#e1080e0658e300b06294990cc70e1502235fd550" 279 | 280 | fd-slicer@~1.0.1: 281 | version "1.0.1" 282 | resolved "https://registry.yarnpkg.com/fd-slicer/-/fd-slicer-1.0.1.tgz#8b5bcbd9ec327c5041bf9ab023fd6750f1177e65" 283 | dependencies: 284 | pend "~1.2.0" 285 | 286 | file-url@^1.1.0: 287 | version "1.1.0" 288 | resolved "https://registry.yarnpkg.com/file-url/-/file-url-1.1.0.tgz#a0f9cf3eb6904c9b1d3a6790b83a976fc40217bb" 289 | dependencies: 290 | meow "^3.7.0" 291 | 292 | find-up@^1.0.0: 293 | version "1.1.2" 294 | resolved "https://registry.yarnpkg.com/find-up/-/find-up-1.1.2.tgz#6b2e9822b1a2ce0a60ab64d610eccad53cb24d0f" 295 | dependencies: 296 | path-exists "^2.0.0" 297 | pinkie-promise "^2.0.0" 298 | 299 | foreach@^2.0.5: 300 | version "2.0.5" 301 | resolved "https://registry.yarnpkg.com/foreach/-/foreach-2.0.5.tgz#0bee005018aeb260d0a3af3ae658dd0136ec1b99" 302 | 303 | forever-agent@~0.6.1: 304 | version "0.6.1" 305 | resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91" 306 | 307 | form-data@~1.0.0-rc4: 308 | version "1.0.1" 309 | resolved "https://registry.yarnpkg.com/form-data/-/form-data-1.0.1.tgz#ae315db9a4907fa065502304a66d7733475ee37c" 310 | dependencies: 311 | async "^2.0.1" 312 | combined-stream "^1.0.5" 313 | mime-types "^2.1.11" 314 | 315 | fs-extra@~0.30.0: 316 | version "0.30.0" 317 | resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-0.30.0.tgz#f233ffcc08d4da7d432daa449776989db1df93f0" 318 | dependencies: 319 | graceful-fs "^4.1.2" 320 | jsonfile "^2.1.0" 321 | klaw "^1.0.0" 322 | path-is-absolute "^1.0.0" 323 | rimraf "^2.2.8" 324 | 325 | fs.realpath@^1.0.0: 326 | version "1.0.0" 327 | resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" 328 | 329 | function-bind@^1.0.2, function-bind@^1.1.0, function-bind@~1.1.0: 330 | version "1.1.0" 331 | resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.0.tgz#16176714c801798e4e8f2cf7f7529467bb4a5771" 332 | 333 | generate-function@^2.0.0: 334 | version "2.0.0" 335 | resolved "https://registry.yarnpkg.com/generate-function/-/generate-function-2.0.0.tgz#6858fe7c0969b7d4e9093337647ac79f60dfbe74" 336 | 337 | generate-object-property@^1.1.0: 338 | version "1.2.0" 339 | resolved "https://registry.yarnpkg.com/generate-object-property/-/generate-object-property-1.2.0.tgz#9c0e1c40308ce804f4783618b937fa88f99d50d0" 340 | dependencies: 341 | is-property "^1.0.0" 342 | 343 | get-caller-file@^1.0.1: 344 | version "1.0.2" 345 | resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-1.0.2.tgz#f702e63127e7e231c160a80c1554acb70d5047e5" 346 | 347 | get-stdin@^4.0.1: 348 | version "4.0.1" 349 | resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-4.0.1.tgz#b968c6b0a04384324902e8bf1a5df32579a450fe" 350 | 351 | getpass@^0.1.1: 352 | version "0.1.6" 353 | resolved "https://registry.yarnpkg.com/getpass/-/getpass-0.1.6.tgz#283ffd9fc1256840875311c1b60e8c40187110e6" 354 | dependencies: 355 | assert-plus "^1.0.0" 356 | 357 | glob@^7.0.5, glob@~7.1.0: 358 | version "7.1.1" 359 | resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.1.tgz#805211df04faaf1c63a3600306cdf5ade50b2ec8" 360 | dependencies: 361 | fs.realpath "^1.0.0" 362 | inflight "^1.0.4" 363 | inherits "2" 364 | minimatch "^3.0.2" 365 | once "^1.3.0" 366 | path-is-absolute "^1.0.0" 367 | 368 | graceful-fs@^4.1.2: 369 | version "4.1.9" 370 | resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.9.tgz#baacba37d19d11f9d146d3578bc99958c3787e29" 371 | 372 | graceful-fs@^4.1.6, graceful-fs@^4.1.9: 373 | version "4.1.10" 374 | resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.10.tgz#f2d720c22092f743228775c75e3612632501f131" 375 | 376 | "graceful-readlink@>= 1.0.0": 377 | version "1.0.1" 378 | resolved "https://registry.yarnpkg.com/graceful-readlink/-/graceful-readlink-1.0.1.tgz#4cafad76bc62f02fa039b2f94e9a3dd3a391a725" 379 | 380 | har-validator@~2.0.6: 381 | version "2.0.6" 382 | resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-2.0.6.tgz#cdcbc08188265ad119b6a5a7c8ab70eecfb5d27d" 383 | dependencies: 384 | chalk "^1.1.1" 385 | commander "^2.9.0" 386 | is-my-json-valid "^2.12.4" 387 | pinkie-promise "^2.0.0" 388 | 389 | has-ansi@^2.0.0: 390 | version "2.0.0" 391 | resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-2.0.0.tgz#34f5049ce1ecdf2b0649af3ef24e45ed35416d91" 392 | dependencies: 393 | ansi-regex "^2.0.0" 394 | 395 | has@~1.0.1: 396 | version "1.0.1" 397 | resolved "https://registry.yarnpkg.com/has/-/has-1.0.1.tgz#8461733f538b0837c9361e39a9ab9e9704dc2f28" 398 | dependencies: 399 | function-bind "^1.0.2" 400 | 401 | hasha@~2.2.0: 402 | version "2.2.0" 403 | resolved "https://registry.yarnpkg.com/hasha/-/hasha-2.2.0.tgz#78d7cbfc1e6d66303fe79837365984517b2f6ee1" 404 | dependencies: 405 | is-stream "^1.0.1" 406 | pinkie-promise "^2.0.0" 407 | 408 | hawk@~3.1.3: 409 | version "3.1.3" 410 | resolved "https://registry.yarnpkg.com/hawk/-/hawk-3.1.3.tgz#078444bd7c1640b0fe540d2c9b73d59678e8e1c4" 411 | dependencies: 412 | boom "2.x.x" 413 | cryptiles "2.x.x" 414 | hoek "2.x.x" 415 | sntp "1.x.x" 416 | 417 | hoek@2.x.x: 418 | version "2.16.3" 419 | resolved "https://registry.yarnpkg.com/hoek/-/hoek-2.16.3.tgz#20bb7403d3cea398e91dc4710a8ff1b8274a25ed" 420 | 421 | hosted-git-info@^2.1.4: 422 | version "2.1.5" 423 | resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.1.5.tgz#0ba81d90da2e25ab34a332e6ec77936e1598118b" 424 | 425 | http-signature@~1.1.0: 426 | version "1.1.1" 427 | resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.1.1.tgz#df72e267066cd0ac67fb76adf8e134a8fbcf91bf" 428 | dependencies: 429 | assert-plus "^0.2.0" 430 | jsprim "^1.2.2" 431 | sshpk "^1.7.0" 432 | 433 | indent-string@^2.1.0: 434 | version "2.1.0" 435 | resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-2.1.0.tgz#8e2d48348742121b4a8218b7a137e9a52049dc80" 436 | dependencies: 437 | repeating "^2.0.0" 438 | 439 | inflight@^1.0.4: 440 | version "1.0.6" 441 | resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" 442 | dependencies: 443 | once "^1.3.0" 444 | wrappy "1" 445 | 446 | inherits@~2.0.1, inherits@~2.0.3, inherits@2: 447 | version "2.0.3" 448 | resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" 449 | 450 | invert-kv@^1.0.0: 451 | version "1.0.0" 452 | resolved "https://registry.yarnpkg.com/invert-kv/-/invert-kv-1.0.0.tgz#104a8e4aaca6d3d8cd157a8ef8bfab2d7a3ffdb6" 453 | 454 | is-arrayish@^0.2.1: 455 | version "0.2.1" 456 | resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" 457 | 458 | is-builtin-module@^1.0.0: 459 | version "1.0.0" 460 | resolved "https://registry.yarnpkg.com/is-builtin-module/-/is-builtin-module-1.0.0.tgz#540572d34f7ac3119f8f76c30cbc1b1e037affbe" 461 | dependencies: 462 | builtin-modules "^1.0.0" 463 | 464 | is-callable@^1.1.1, is-callable@^1.1.3: 465 | version "1.1.3" 466 | resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.1.3.tgz#86eb75392805ddc33af71c92a0eedf74ee7604b2" 467 | 468 | is-date-object@^1.0.1: 469 | version "1.0.1" 470 | resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.1.tgz#9aa20eb6aeebbff77fbd33e74ca01b33581d3a16" 471 | 472 | is-finite@^1.0.0: 473 | version "1.0.2" 474 | resolved "https://registry.yarnpkg.com/is-finite/-/is-finite-1.0.2.tgz#cc6677695602be550ef11e8b4aa6305342b6d0aa" 475 | dependencies: 476 | number-is-nan "^1.0.0" 477 | 478 | is-fullwidth-code-point@^1.0.0: 479 | version "1.0.0" 480 | resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz#ef9e31386f031a7f0d643af82fde50c457ef00cb" 481 | dependencies: 482 | number-is-nan "^1.0.0" 483 | 484 | is-my-json-valid@^2.12.4: 485 | version "2.15.0" 486 | resolved "https://registry.yarnpkg.com/is-my-json-valid/-/is-my-json-valid-2.15.0.tgz#936edda3ca3c211fd98f3b2d3e08da43f7b2915b" 487 | dependencies: 488 | generate-function "^2.0.0" 489 | generate-object-property "^1.1.0" 490 | jsonpointer "^4.0.0" 491 | xtend "^4.0.0" 492 | 493 | is-property@^1.0.0: 494 | version "1.0.2" 495 | resolved "https://registry.yarnpkg.com/is-property/-/is-property-1.0.2.tgz#57fe1c4e48474edd65b09911f26b1cd4095dda84" 496 | 497 | is-regex@^1.0.3: 498 | version "1.0.3" 499 | resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.0.3.tgz#0d55182bddf9f2fde278220aec3a75642c908637" 500 | 501 | is-stream@^1.0.1: 502 | version "1.1.0" 503 | resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" 504 | 505 | is-symbol@^1.0.1: 506 | version "1.0.1" 507 | resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.1.tgz#3cc59f00025194b6ab2e38dbae6689256b660572" 508 | 509 | is-typedarray@~1.0.0: 510 | version "1.0.0" 511 | resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" 512 | 513 | is-utf8@^0.2.0: 514 | version "0.2.1" 515 | resolved "https://registry.yarnpkg.com/is-utf8/-/is-utf8-0.2.1.tgz#4b0da1442104d1b336340e80797e865cf39f7d72" 516 | 517 | isarray@~1.0.0: 518 | version "1.0.0" 519 | resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" 520 | 521 | isexe@^1.1.1: 522 | version "1.1.2" 523 | resolved "https://registry.yarnpkg.com/isexe/-/isexe-1.1.2.tgz#36f3e22e60750920f5e7241a476a8c6a42275ad0" 524 | 525 | isstream@~0.1.2: 526 | version "0.1.2" 527 | resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" 528 | 529 | jodid25519@^1.0.0: 530 | version "1.0.2" 531 | resolved "https://registry.yarnpkg.com/jodid25519/-/jodid25519-1.0.2.tgz#06d4912255093419477d425633606e0e90782967" 532 | dependencies: 533 | jsbn "~0.1.0" 534 | 535 | js-yaml: 536 | version "3.6.1" 537 | resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.6.1.tgz#6e5fe67d8b205ce4d22fad05b7781e8dadcc4b30" 538 | dependencies: 539 | argparse "^1.0.7" 540 | esprima "^2.6.0" 541 | 542 | jsbn@~0.1.0: 543 | version "0.1.0" 544 | resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.0.tgz#650987da0dd74f4ebf5a11377a2aa2d273e97dfd" 545 | 546 | json-schema@0.2.3: 547 | version "0.2.3" 548 | resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.2.3.tgz#b480c892e59a2f05954ce727bd3f2a4e882f9e13" 549 | 550 | json-stringify-safe@~5.0.1: 551 | version "5.0.1" 552 | resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" 553 | 554 | jsonfile@^2.1.0: 555 | version "2.4.0" 556 | resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-2.4.0.tgz#3736a2b428b87bbda0cc83b53fa3d633a35c2ae8" 557 | optionalDependencies: 558 | graceful-fs "^4.1.6" 559 | 560 | jsonpointer@^4.0.0: 561 | version "4.0.0" 562 | resolved "https://registry.yarnpkg.com/jsonpointer/-/jsonpointer-4.0.0.tgz#6661e161d2fc445f19f98430231343722e1fcbd5" 563 | 564 | jsprim@^1.2.2: 565 | version "1.3.1" 566 | resolved "https://registry.yarnpkg.com/jsprim/-/jsprim-1.3.1.tgz#2a7256f70412a29ee3670aaca625994c4dcff252" 567 | dependencies: 568 | extsprintf "1.0.2" 569 | json-schema "0.2.3" 570 | verror "1.3.6" 571 | 572 | kew@~0.7.0: 573 | version "0.7.0" 574 | resolved "https://registry.yarnpkg.com/kew/-/kew-0.7.0.tgz#79d93d2d33363d6fdd2970b335d9141ad591d79b" 575 | 576 | keypather@^1.10.2: 577 | version "1.10.2" 578 | resolved "https://registry.yarnpkg.com/keypather/-/keypather-1.10.2.tgz#e0449632d4b3e516f21cc014ce7c5644fddce614" 579 | dependencies: 580 | "101" "^1.0.0" 581 | 582 | klaw@^1.0.0: 583 | version "1.3.1" 584 | resolved "https://registry.yarnpkg.com/klaw/-/klaw-1.3.1.tgz#4088433b46b3b1ba259d78785d8e96f73ba02439" 585 | optionalDependencies: 586 | graceful-fs "^4.1.9" 587 | 588 | lcid@^1.0.0: 589 | version "1.0.0" 590 | resolved "https://registry.yarnpkg.com/lcid/-/lcid-1.0.0.tgz#308accafa0bc483a3867b4b6f2b9506251d1b835" 591 | dependencies: 592 | invert-kv "^1.0.0" 593 | 594 | load-img@^1.0.0: 595 | version "1.0.0" 596 | resolved "https://registry.yarnpkg.com/load-img/-/load-img-1.0.0.tgz#09537449893c32a8709074645566c4c5faa9ac26" 597 | 598 | load-json-file@^1.0.0: 599 | version "1.1.0" 600 | resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-1.1.0.tgz#956905708d58b4bab4c2261b04f59f31c99374c0" 601 | dependencies: 602 | graceful-fs "^4.1.2" 603 | parse-json "^2.2.0" 604 | pify "^2.0.0" 605 | pinkie-promise "^2.0.0" 606 | strip-bom "^2.0.0" 607 | 608 | lodash.assign@^4.1.0, lodash.assign@^4.2.0: 609 | version "4.2.0" 610 | resolved "https://registry.yarnpkg.com/lodash.assign/-/lodash.assign-4.2.0.tgz#0d99f3ccd7a6d261d19bdaeb9245005d285808e7" 611 | 612 | lodash@^4.14.0: 613 | version "4.16.6" 614 | resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.16.6.tgz#d22c9ac660288f3843e16ba7d2b5d06cca27d777" 615 | 616 | loud-rejection@^1.0.0: 617 | version "1.6.0" 618 | resolved "https://registry.yarnpkg.com/loud-rejection/-/loud-rejection-1.6.0.tgz#5b46f80147edee578870f086d04821cf998e551f" 619 | dependencies: 620 | currently-unhandled "^0.4.1" 621 | signal-exit "^3.0.0" 622 | 623 | map-obj@^1.0.0, map-obj@^1.0.1: 624 | version "1.0.1" 625 | resolved "https://registry.yarnpkg.com/map-obj/-/map-obj-1.0.1.tgz#d933ceb9205d82bdcf4886f6742bdc2b4dea146d" 626 | 627 | meow, meow@^3.7.0: 628 | version "3.7.0" 629 | resolved "https://registry.yarnpkg.com/meow/-/meow-3.7.0.tgz#72cb668b425228290abbfa856892587308a801fb" 630 | dependencies: 631 | camelcase-keys "^2.0.0" 632 | decamelize "^1.1.2" 633 | loud-rejection "^1.0.0" 634 | map-obj "^1.0.1" 635 | minimist "^1.1.3" 636 | normalize-package-data "^2.3.4" 637 | object-assign "^4.0.1" 638 | read-pkg-up "^1.0.1" 639 | redent "^1.0.0" 640 | trim-newlines "^1.0.0" 641 | 642 | mime-db@~1.24.0: 643 | version "1.24.0" 644 | resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.24.0.tgz#e2d13f939f0016c6e4e9ad25a8652f126c467f0c" 645 | 646 | mime-types@^2.1.11, mime-types@~2.1.7: 647 | version "2.1.12" 648 | resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.12.tgz#152ba256777020dd4663f54c2e7bc26381e71729" 649 | dependencies: 650 | mime-db "~1.24.0" 651 | 652 | minimatch@^3.0.2: 653 | version "3.0.3" 654 | resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.3.tgz#2a4e4090b96b2db06a9d7df01055a62a77c9b774" 655 | dependencies: 656 | brace-expansion "^1.0.0" 657 | 658 | minimist@^1.1.3, minimist@~1.2.0: 659 | version "1.2.0" 660 | resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284" 661 | 662 | minimist@0.0.8: 663 | version "0.0.8" 664 | resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d" 665 | 666 | mkdirp@0.5.0: 667 | version "0.5.0" 668 | resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.0.tgz#1d73076a6df986cd9344e15e71fcc05a4c9abf12" 669 | dependencies: 670 | minimist "0.0.8" 671 | 672 | nan@^2.4.0: 673 | version "2.4.0" 674 | resolved "https://registry.yarnpkg.com/nan/-/nan-2.4.0.tgz#fb3c59d45fe4effe215f0b890f8adf6eb32d2232" 675 | 676 | node-uuid@~1.4.7: 677 | version "1.4.7" 678 | resolved "https://registry.yarnpkg.com/node-uuid/-/node-uuid-1.4.7.tgz#6da5a17668c4b3dd59623bda11cf7fa4c1f60a6f" 679 | 680 | normalize-package-data@^2.3.2, normalize-package-data@^2.3.4: 681 | version "2.3.5" 682 | resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.3.5.tgz#8d924f142960e1777e7ffe170543631cc7cb02df" 683 | dependencies: 684 | hosted-git-info "^2.1.4" 685 | is-builtin-module "^1.0.0" 686 | semver "2 || 3 || 4 || 5" 687 | validate-npm-package-license "^3.0.1" 688 | 689 | number-is-nan@^1.0.0: 690 | version "1.0.1" 691 | resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d" 692 | 693 | oauth-sign@~0.8.1: 694 | version "0.8.2" 695 | resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.8.2.tgz#46a6ab7f0aead8deae9ec0565780b7d4efeb9d43" 696 | 697 | object-assign, object-assign@^4.0.1: 698 | version "4.1.0" 699 | resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.0.tgz#7a3b3d0e98063d43f4c03f2e8ae6cd51a86883a0" 700 | 701 | object-inspect@~1.2.1: 702 | version "1.2.1" 703 | resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.2.1.tgz#3b62226eb8f6d441751c7d8f22a20ff80ac9dc3f" 704 | 705 | object-keys@^1.0.8: 706 | version "1.0.11" 707 | resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.0.11.tgz#c54601778ad560f1142ce0e01bcca8b56d13426d" 708 | 709 | object-loops: 710 | version "0.8.0" 711 | resolved "https://registry.yarnpkg.com/object-loops/-/object-loops-0.8.0.tgz#270a427c3ea3ba0f53e6bccfb3f2819f4adddc90" 712 | dependencies: 713 | "101" "^1.6.1" 714 | dasherize "^2.0.0" 715 | 716 | once@^1.3.0: 717 | version "1.4.0" 718 | resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" 719 | dependencies: 720 | wrappy "1" 721 | 722 | os-locale@^1.4.0: 723 | version "1.4.0" 724 | resolved "https://registry.yarnpkg.com/os-locale/-/os-locale-1.4.0.tgz#20f9f17ae29ed345e8bde583b13d2009803c14d9" 725 | dependencies: 726 | lcid "^1.0.0" 727 | 728 | parse-json@^2.2.0: 729 | version "2.2.0" 730 | resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-2.2.0.tgz#f480f40434ef80741f8469099f8dea18f55a4dc9" 731 | dependencies: 732 | error-ex "^1.2.0" 733 | 734 | path-exists@^2.0.0: 735 | version "2.1.0" 736 | resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-2.1.0.tgz#0feb6c64f0fc518d9a754dd5efb62c7022761f4b" 737 | dependencies: 738 | pinkie-promise "^2.0.0" 739 | 740 | path-is-absolute@^1.0.0: 741 | version "1.0.1" 742 | resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" 743 | 744 | path-type@^1.0.0: 745 | version "1.1.0" 746 | resolved "https://registry.yarnpkg.com/path-type/-/path-type-1.1.0.tgz#59c44f7ee491da704da415da5a4070ba4f8fe441" 747 | dependencies: 748 | graceful-fs "^4.1.2" 749 | pify "^2.0.0" 750 | pinkie-promise "^2.0.0" 751 | 752 | pend@~1.2.0: 753 | version "1.2.0" 754 | resolved "https://registry.yarnpkg.com/pend/-/pend-1.2.0.tgz#7a57eb550a6783f9115331fcf4663d5c8e007a50" 755 | 756 | phantomjs-prebuilt@^2.1.10: 757 | version "2.1.13" 758 | resolved "https://registry.yarnpkg.com/phantomjs-prebuilt/-/phantomjs-prebuilt-2.1.13.tgz#66556ad9e965d893ca5a7dc9e763df7e8697f76d" 759 | dependencies: 760 | es6-promise "~4.0.3" 761 | extract-zip "~1.5.0" 762 | fs-extra "~0.30.0" 763 | hasha "~2.2.0" 764 | kew "~0.7.0" 765 | progress "~1.1.8" 766 | request "~2.74.0" 767 | request-progress "~2.0.1" 768 | which "~1.2.10" 769 | 770 | pify@^2.0.0: 771 | version "2.3.0" 772 | resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" 773 | 774 | pinkie-promise@^2.0.0: 775 | version "2.0.1" 776 | resolved "https://registry.yarnpkg.com/pinkie-promise/-/pinkie-promise-2.0.1.tgz#2135d6dfa7a358c069ac9b178776288228450ffa" 777 | dependencies: 778 | pinkie "^2.0.0" 779 | 780 | pinkie@^2.0.0: 781 | version "2.0.4" 782 | resolved "https://registry.yarnpkg.com/pinkie/-/pinkie-2.0.4.tgz#72556b80cfa0d48a974e80e77248e80ed4f7f870" 783 | 784 | pn@^1.0.0: 785 | version "1.0.0" 786 | resolved "https://registry.yarnpkg.com/pn/-/pn-1.0.0.tgz#1cf5a30b0d806cd18f88fc41a6b5d4ad615b3ba9" 787 | 788 | process-nextick-args@~1.0.6: 789 | version "1.0.7" 790 | resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-1.0.7.tgz#150e20b756590ad3f91093f25a4f2ad8bff30ba3" 791 | 792 | progress@~1.1.8: 793 | version "1.1.8" 794 | resolved "https://registry.yarnpkg.com/progress/-/progress-1.1.8.tgz#e260c78f6161cdd9b0e56cc3e0a85de17c7a57be" 795 | 796 | punycode@^1.4.1: 797 | version "1.4.1" 798 | resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e" 799 | 800 | qs@~6.2.0: 801 | version "6.2.1" 802 | resolved "https://registry.yarnpkg.com/qs/-/qs-6.2.1.tgz#ce03c5ff0935bc1d9d69a9f14cbd18e568d67625" 803 | 804 | read-input: 805 | version "0.3.1" 806 | resolved "https://registry.yarnpkg.com/read-input/-/read-input-0.3.1.tgz#5b3169308013464ffda6ec92e58d2d3cea948df1" 807 | 808 | read-pkg-up@^1.0.1: 809 | version "1.0.1" 810 | resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-1.0.1.tgz#9d63c13276c065918d57f002a57f40a1b643fb02" 811 | dependencies: 812 | find-up "^1.0.0" 813 | read-pkg "^1.0.0" 814 | 815 | read-pkg@^1.0.0: 816 | version "1.1.0" 817 | resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-1.1.0.tgz#f5ffaa5ecd29cb31c0474bca7d756b6bb29e3f28" 818 | dependencies: 819 | load-json-file "^1.0.0" 820 | normalize-package-data "^2.3.2" 821 | path-type "^1.0.0" 822 | 823 | readable-stream@~2.0.0, readable-stream@~2.0.5: 824 | version "2.0.6" 825 | resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.0.6.tgz#8f90341e68a53ccc928788dacfcd11b36eb9b78e" 826 | dependencies: 827 | core-util-is "~1.0.0" 828 | inherits "~2.0.1" 829 | isarray "~1.0.0" 830 | process-nextick-args "~1.0.6" 831 | string_decoder "~0.10.x" 832 | util-deprecate "~1.0.1" 833 | 834 | redent@^1.0.0: 835 | version "1.0.0" 836 | resolved "https://registry.yarnpkg.com/redent/-/redent-1.0.0.tgz#cf916ab1fd5f1f16dfb20822dd6ec7f730c2afde" 837 | dependencies: 838 | indent-string "^2.1.0" 839 | strip-indent "^1.0.1" 840 | 841 | repeating@^2.0.0: 842 | version "2.0.1" 843 | resolved "https://registry.yarnpkg.com/repeating/-/repeating-2.0.1.tgz#5214c53a926d3552707527fbab415dbc08d06dda" 844 | dependencies: 845 | is-finite "^1.0.0" 846 | 847 | request-progress@~2.0.1: 848 | version "2.0.1" 849 | resolved "https://registry.yarnpkg.com/request-progress/-/request-progress-2.0.1.tgz#5d36bb57961c673aa5b788dbc8141fdf23b44e08" 850 | dependencies: 851 | throttleit "^1.0.0" 852 | 853 | request@~2.74.0: 854 | version "2.74.0" 855 | resolved "https://registry.yarnpkg.com/request/-/request-2.74.0.tgz#7693ca768bbb0ea5c8ce08c084a45efa05b892ab" 856 | dependencies: 857 | aws-sign2 "~0.6.0" 858 | aws4 "^1.2.1" 859 | bl "~1.1.2" 860 | caseless "~0.11.0" 861 | combined-stream "~1.0.5" 862 | extend "~3.0.0" 863 | forever-agent "~0.6.1" 864 | form-data "~1.0.0-rc4" 865 | har-validator "~2.0.6" 866 | hawk "~3.1.3" 867 | http-signature "~1.1.0" 868 | is-typedarray "~1.0.0" 869 | isstream "~0.1.2" 870 | json-stringify-safe "~5.0.1" 871 | mime-types "~2.1.7" 872 | node-uuid "~1.4.7" 873 | oauth-sign "~0.8.1" 874 | qs "~6.2.0" 875 | stringstream "~0.0.4" 876 | tough-cookie "~2.3.0" 877 | tunnel-agent "~0.4.1" 878 | 879 | require-directory@^2.1.1: 880 | version "2.1.1" 881 | resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" 882 | 883 | require-main-filename@^1.0.1: 884 | version "1.0.1" 885 | resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-1.0.1.tgz#97f717b69d48784f5f526a6c5aa8ffdda055a4d1" 886 | 887 | resolve@~1.1.7: 888 | version "1.1.7" 889 | resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.1.7.tgz#203114d82ad2c5ed9e8e0411b3932875e889e97b" 890 | 891 | resumer@~0.0.0: 892 | version "0.0.0" 893 | resolved "https://registry.yarnpkg.com/resumer/-/resumer-0.0.0.tgz#f1e8f461e4064ba39e82af3cdc2a8c893d076759" 894 | dependencies: 895 | through "~2.3.4" 896 | 897 | rimraf@^2.2.8: 898 | version "2.5.4" 899 | resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.5.4.tgz#96800093cbf1a0c86bd95b4625467535c29dfa04" 900 | dependencies: 901 | glob "^7.0.5" 902 | 903 | "semver@2 || 3 || 4 || 5": 904 | version "5.3.0" 905 | resolved "https://registry.yarnpkg.com/semver/-/semver-5.3.0.tgz#9b2ce5d3de02d17c6012ad326aa6b4d0cf54f94f" 906 | 907 | set-blocking@^2.0.0: 908 | version "2.0.0" 909 | resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" 910 | 911 | signal-exit@^3.0.0: 912 | version "3.0.1" 913 | resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.1.tgz#5a4c884992b63a7acd9badb7894c3ee9cfccad81" 914 | 915 | sntp@1.x.x: 916 | version "1.0.9" 917 | resolved "https://registry.yarnpkg.com/sntp/-/sntp-1.0.9.tgz#6541184cc90aeea6c6e7b35e2659082443c66198" 918 | dependencies: 919 | hoek "2.x.x" 920 | 921 | spdx-correct@~1.0.0: 922 | version "1.0.2" 923 | resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-1.0.2.tgz#4b3073d933ff51f3912f03ac5519498a4150db40" 924 | dependencies: 925 | spdx-license-ids "^1.0.2" 926 | 927 | spdx-expression-parse@~1.0.0: 928 | version "1.0.4" 929 | resolved "https://registry.yarnpkg.com/spdx-expression-parse/-/spdx-expression-parse-1.0.4.tgz#9bdf2f20e1f40ed447fbe273266191fced51626c" 930 | 931 | spdx-license-ids@^1.0.2: 932 | version "1.2.2" 933 | resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-1.2.2.tgz#c9df7a3424594ade6bd11900d596696dc06bac57" 934 | 935 | sprintf-js@~1.0.2: 936 | version "1.0.3" 937 | resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" 938 | 939 | sshpk@^1.7.0: 940 | version "1.10.1" 941 | resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.10.1.tgz#30e1a5d329244974a1af61511339d595af6638b0" 942 | dependencies: 943 | asn1 "~0.2.3" 944 | assert-plus "^1.0.0" 945 | dashdash "^1.12.0" 946 | getpass "^0.1.1" 947 | optionalDependencies: 948 | bcrypt-pbkdf "^1.0.0" 949 | ecc-jsbn "~0.1.1" 950 | jodid25519 "^1.0.0" 951 | jsbn "~0.1.0" 952 | tweetnacl "~0.14.0" 953 | 954 | string_decoder@~0.10.x: 955 | version "0.10.31" 956 | resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-0.10.31.tgz#62e203bc41766c6c28c9fc84301dab1c5310fa94" 957 | 958 | string-width@^1.0.1, string-width@^1.0.2: 959 | version "1.0.2" 960 | resolved "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3" 961 | dependencies: 962 | code-point-at "^1.0.0" 963 | is-fullwidth-code-point "^1.0.0" 964 | strip-ansi "^3.0.0" 965 | 966 | string.prototype.trim@~1.1.2: 967 | version "1.1.2" 968 | resolved "https://registry.yarnpkg.com/string.prototype.trim/-/string.prototype.trim-1.1.2.tgz#d04de2c89e137f4d7d206f086b5ed2fae6be8cea" 969 | dependencies: 970 | define-properties "^1.1.2" 971 | es-abstract "^1.5.0" 972 | function-bind "^1.0.2" 973 | 974 | stringstream@~0.0.4: 975 | version "0.0.5" 976 | resolved "https://registry.yarnpkg.com/stringstream/-/stringstream-0.0.5.tgz#4e484cd4de5a0bbbee18e46307710a8a81621878" 977 | 978 | strip-ansi@^3.0.0, strip-ansi@^3.0.1: 979 | version "3.0.1" 980 | resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf" 981 | dependencies: 982 | ansi-regex "^2.0.0" 983 | 984 | strip-bom@^2.0.0: 985 | version "2.0.0" 986 | resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-2.0.0.tgz#6219a85616520491f35788bdbf1447a99c7e6b0e" 987 | dependencies: 988 | is-utf8 "^0.2.0" 989 | 990 | strip-indent: 991 | version "2.0.0" 992 | resolved "https://registry.yarnpkg.com/strip-indent/-/strip-indent-2.0.0.tgz#5ef8db295d01e6ed6cbf7aab96998d7822527b68" 993 | 994 | strip-indent@^1.0.1: 995 | version "1.0.1" 996 | resolved "https://registry.yarnpkg.com/strip-indent/-/strip-indent-1.0.1.tgz#0c7962a6adefa7bbd4ac366460a638552ae1a0a2" 997 | dependencies: 998 | get-stdin "^4.0.1" 999 | 1000 | supports-color@^2.0.0: 1001 | version "2.0.0" 1002 | resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7" 1003 | 1004 | svg-to-image: 1005 | version "1.1.3" 1006 | resolved "https://registry.yarnpkg.com/svg-to-image/-/svg-to-image-1.1.3.tgz#d6ff4d883ca8f7e3f792b42b2328b15cbe2fb0f3" 1007 | dependencies: 1008 | load-img "^1.0.0" 1009 | 1010 | svg2png: 1011 | version "4.1.0" 1012 | resolved "https://registry.yarnpkg.com/svg2png/-/svg2png-4.1.0.tgz#68e85fc9d0784dc041f97d2a28815405acd56217" 1013 | dependencies: 1014 | file-url "^1.1.0" 1015 | phantomjs-prebuilt "^2.1.10" 1016 | pn "^1.0.0" 1017 | yargs "^5.0.0" 1018 | 1019 | tape: 1020 | version "4.6.2" 1021 | resolved "https://registry.yarnpkg.com/tape/-/tape-4.6.2.tgz#19b3d874508485a1dc30fb30fe2a7d9be2c28b78" 1022 | dependencies: 1023 | deep-equal "~1.0.1" 1024 | defined "~1.0.0" 1025 | function-bind "~1.1.0" 1026 | glob "~7.1.0" 1027 | has "~1.0.1" 1028 | inherits "~2.0.3" 1029 | minimist "~1.2.0" 1030 | object-inspect "~1.2.1" 1031 | resolve "~1.1.7" 1032 | resumer "~0.0.0" 1033 | string.prototype.trim "~1.1.2" 1034 | through "~2.3.8" 1035 | 1036 | throttleit@^1.0.0: 1037 | version "1.0.0" 1038 | resolved "https://registry.yarnpkg.com/throttleit/-/throttleit-1.0.0.tgz#9e785836daf46743145a5984b6268d828528ac6c" 1039 | 1040 | through@~2.3.4, through@~2.3.8: 1041 | version "2.3.8" 1042 | resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" 1043 | 1044 | tough-cookie@~2.3.0: 1045 | version "2.3.2" 1046 | resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.3.2.tgz#f081f76e4c85720e6c37a5faced737150d84072a" 1047 | dependencies: 1048 | punycode "^1.4.1" 1049 | 1050 | trim-newlines@^1.0.0: 1051 | version "1.0.0" 1052 | resolved "https://registry.yarnpkg.com/trim-newlines/-/trim-newlines-1.0.0.tgz#5887966bb582a4503a41eb524f7d35011815a613" 1053 | 1054 | tunnel-agent@~0.4.1: 1055 | version "0.4.3" 1056 | resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.4.3.tgz#6373db76909fe570e08d73583365ed828a74eeeb" 1057 | 1058 | tweetnacl@^0.14.3, tweetnacl@~0.14.0: 1059 | version "0.14.3" 1060 | resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.3.tgz#3da382f670f25ded78d7b3d1792119bca0b7132d" 1061 | 1062 | type-detect@0.1.1: 1063 | version "0.1.1" 1064 | resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-0.1.1.tgz#0ba5ec2a885640e470ea4e8505971900dac58822" 1065 | 1066 | typedarray@~0.0.5: 1067 | version "0.0.6" 1068 | resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" 1069 | 1070 | util-deprecate@~1.0.1: 1071 | version "1.0.2" 1072 | resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" 1073 | 1074 | validate-npm-package-license@^3.0.1: 1075 | version "3.0.1" 1076 | resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.1.tgz#2804babe712ad3379459acfbe24746ab2c303fbc" 1077 | dependencies: 1078 | spdx-correct "~1.0.0" 1079 | spdx-expression-parse "~1.0.0" 1080 | 1081 | verror@1.3.6: 1082 | version "1.3.6" 1083 | resolved "https://registry.yarnpkg.com/verror/-/verror-1.3.6.tgz#cff5df12946d297d2baaefaa2689e25be01c005c" 1084 | dependencies: 1085 | extsprintf "1.0.2" 1086 | 1087 | viz.js: 1088 | version "1.3.0" 1089 | resolved "https://registry.yarnpkg.com/viz.js/-/viz.js-1.3.0.tgz#a7d928a40bdb451a093298038fc999bd59a87288" 1090 | 1091 | which-module@^1.0.0: 1092 | version "1.0.0" 1093 | resolved "https://registry.yarnpkg.com/which-module/-/which-module-1.0.0.tgz#bba63ca861948994ff307736089e3b96026c2a4f" 1094 | 1095 | which@~1.2.10: 1096 | version "1.2.11" 1097 | resolved "https://registry.yarnpkg.com/which/-/which-1.2.11.tgz#c8b2eeea6b8c1659fa7c1dd4fdaabe9533dc5e8b" 1098 | dependencies: 1099 | isexe "^1.1.1" 1100 | 1101 | window-size@^0.2.0: 1102 | version "0.2.0" 1103 | resolved "https://registry.yarnpkg.com/window-size/-/window-size-0.2.0.tgz#b4315bb4214a3d7058ebeee892e13fa24d98b075" 1104 | 1105 | wrap-ansi@^2.0.0: 1106 | version "2.0.0" 1107 | resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-2.0.0.tgz#7d30f8f873f9a5bbc3a64dabc8d177e071ae426f" 1108 | dependencies: 1109 | string-width "^1.0.1" 1110 | 1111 | wrappy@1: 1112 | version "1.0.2" 1113 | resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" 1114 | 1115 | xtend@^4.0.0: 1116 | version "4.0.1" 1117 | resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.1.tgz#a5c6d532be656e23db820efb943a1f04998d63af" 1118 | 1119 | y18n@^3.2.1: 1120 | version "3.2.1" 1121 | resolved "https://registry.yarnpkg.com/y18n/-/y18n-3.2.1.tgz#6d15fba884c08679c0d77e88e7759e811e07fa41" 1122 | 1123 | yargs-parser@^3.2.0: 1124 | version "3.2.0" 1125 | resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-3.2.0.tgz#5081355d19d9d0c8c5d81ada908cb4e6d186664f" 1126 | dependencies: 1127 | camelcase "^3.0.0" 1128 | lodash.assign "^4.1.0" 1129 | 1130 | yargs@^5.0.0: 1131 | version "5.0.0" 1132 | resolved "https://registry.yarnpkg.com/yargs/-/yargs-5.0.0.tgz#3355144977d05757dbb86d6e38ec056123b3a66e" 1133 | dependencies: 1134 | cliui "^3.2.0" 1135 | decamelize "^1.1.1" 1136 | get-caller-file "^1.0.1" 1137 | lodash.assign "^4.2.0" 1138 | os-locale "^1.4.0" 1139 | read-pkg-up "^1.0.1" 1140 | require-directory "^2.1.1" 1141 | require-main-filename "^1.0.1" 1142 | set-blocking "^2.0.0" 1143 | string-width "^1.0.2" 1144 | which-module "^1.0.0" 1145 | window-size "^0.2.0" 1146 | y18n "^3.2.1" 1147 | yargs-parser "^3.2.0" 1148 | 1149 | yauzl@2.4.1: 1150 | version "2.4.1" 1151 | resolved "https://registry.yarnpkg.com/yauzl/-/yauzl-2.4.1.tgz#9528f442dab1b2284e58b4379bb194e22e0c4005" 1152 | dependencies: 1153 | fd-slicer "~1.0.1" 1154 | 1155 | --------------------------------------------------------------------------------