├── .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 | 
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 | > 
36 |
37 |
38 |
39 | Modern Family (simple with houses)
40 |
41 | Source: *[modernfamily.yml](examples/modernfamily.yml)*
42 |
43 | > 
44 |
45 |
46 |
47 | Harry Potter (larger tree)
48 |
49 | Source: *[potter.yml](examples/potter.yml)*
50 |
51 | > 
52 |
53 |
54 |
55 | Game of Thrones (overly complicated)
56 |
57 | Source: *[got.yml](examples/got.yml)*
58 |
59 | > 
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 |
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 |
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 |
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 | '' +
80 | `${person.name || id} |
` +
81 | '' +
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 |
--------------------------------------------------------------------------------