├── .gitignore
├── CHANGELOG.md
├── README.md
├── bin.js
├── config
├── interfaces.mustache
└── resources
│ ├── baker_rsa
│ └── insecure_private_key
├── create.sh
├── index.js
├── lib
├── VBoxProvider.js
├── commands
│ └── execute.js
└── util.js
├── package-lock.json
├── package.json
└── test
└── integration
├── micros.js
├── sanity-check.js
└── shared-folders.js
/.gitignore:
--------------------------------------------------------------------------------
1 | node_modules/
--------------------------------------------------------------------------------
/CHANGELOG.md:
--------------------------------------------------------------------------------
1 | # Change Log
2 |
3 | All notable changes to this project will be documented in this file. See [standard-version](https://github.com/conventional-changelog/standard-version) for commit guidelines.
4 |
5 |
6 | ## 0.1.35 (2019-02-13)
7 |
8 |
9 | ### Bug Fixes
10 |
11 | * Sync folders should enable symlinks ([ebfe67e](https://github.com/ottomatica/node-virtualbox/commit/ebfe67e))
12 |
13 |
14 |
15 |
16 | ## 0.1.34 (2018-11-22)
17 |
18 |
19 | ### Bug Fixes
20 |
21 | * Fix stop() to poweroff instead of saving state ([57b0cea](https://github.com/ottomatica/node-virtualbox/commit/57b0cea))
22 |
23 | ### Feature
24 |
25 | * New `saveState()` to save state of VM (renamed old `stop()`) ([57b0cea](https://github.com/ottomatica/node-virtualbox/commit/57b0cea))
26 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # node-virtualbox | [](https://david-dm.org/ottomatica/node-virtualbox)
2 |
3 | This is a simple tool that helps provision basic VirtualBox virtual machines with sane defaults.
4 |
5 | ### Installation and Usage
6 |
7 | Requires node >= 8.X
8 |
9 | ```
10 | npm install node-virtualbox [--save] [-g]
11 | ```
12 |
13 | Example run:
14 |
15 | ``` bash
16 | node bin.js --provision --vmname "hello" --ip 172.168.0.55 --verbose
17 | ```
18 |
19 | ssh into instance.
20 | ```
21 | ssh -i config/resources/insecure_private_key -p 2002 -o StrictHostKeyChecking=no -o IdentitiesOnly=yes vagrant@127.0.0.1
22 | ```
23 |
24 | ### Default setup
25 |
26 | The default VM will have 2 cpus and 1G memory. The default image is based on the latest [ubuntu/xenial64](https://cloud-images.ubuntu.com/xenial/current/) image. The VM has two NICs. The first nic uses NAT to forward incoming and outgoing traffic. The second nic is assigned a private host only network address. After creation, you can login with vagrant/vagrant or ssh with the default insecure_private_key located in `config/resources/`.
27 |
28 | ### Commands
29 |
30 | `--list` return a list of vm names and uuids.
31 |
32 | ```
33 | node bin.js --list
34 | ```
35 |
36 | `--stop` Stop vm with save state.
37 |
38 | ```
39 | node bin.js --stop --vmname
40 | ```
41 |
42 | `--delete` Unregister vm and delete all its contents.
43 |
44 | ```
45 | node bin.js --delete --vmname
46 | ```
47 |
48 | `--info` Provide information about a vm. This will print out a json string with properties of the specified vm.
49 |
50 | For example, running `node .\bin.js --info --vmname "vm3"` will print the following, which can be used to retrieve properties such as the port that can be used for ssh access:
51 |
52 | ```
53 | { name: '"vm3"',
54 | ...
55 | 'Forwarding(0)': '"guestssh,tcp,,2002,,22"',
56 | }
57 | ```
58 |
59 | ### Provision options
60 |
61 | `--cpus` Set the number of cpus for VM. Default is 2 (or 1 for micro).
62 |
63 | `--mem` Set the size of ram in MB(e.g., 512 or 1024). Default is 1024 (or 512 for micro).
64 |
65 | `--ovf` Set the box to import when creating vm. If this is omitted, the latest ubuntu-xenial image is downloaded and used.
66 |
67 | `--ssh_port` Set the local port used to forward ssh connections to vm. If this is omitted, then a freely available port between 2002 and 2999 is automatically assigned.
68 |
69 | `--forward_ports` Set the port forwarding rules. Format: `":"` or `""`. `""` translates to `":"`.
70 |
71 | `--sync` Set a shared folder. Format: `";"`. You can provide multiple of these options.
72 |
73 | `--add_ssh_key` Add public ssh key to ~/.ssh/authorized_keys of the vm.
74 | ```
75 | node bin.js --provision --vmname "shared_folders_vm" --ip 172.16.1.45 --ssh_port 2095 --verbose --sync "C:\Users\chris;/chris" --sync "C:\Users\chris\projects;/projects" --add_ssh_key ~/.ssh/id_rsa.pub
76 | ```
77 |
78 | ### Micro VM
79 | This is for booting micro kernels (custom initramfs inside of an iso)
80 |
81 | Example micro VMs (iso):
82 | ``` bash
83 | node bin.js --micro --vmname "micro" --attach_iso
84 | ```
85 |
86 | If you don't specify path to an iso it will download and use an Alpine linux iso.
87 |
--------------------------------------------------------------------------------
/bin.js:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env node
2 |
3 | /**
4 | * Run virtualbox as program.
5 | *
6 | * @module virtualbox/bin
7 | */
8 |
9 | // Modules
10 | const yargs = require('yargs');
11 | const _ = require('lodash');
12 | const virtualbox = require('./index');
13 |
14 | // Dockerize
15 | (async () => {
16 |
17 | try {
18 |
19 | // Get args and validate
20 | let argv = yargs.boolean('dry-run').boolean('verbose').argv;
21 | let args = argv._;
22 | if (args.length > 1) {
23 | throw new Error('Usage: virtualbox [--vmname=] [--verbose] ...');
24 | }
25 |
26 | // common options
27 | let vmname = argv.vmname;
28 | let verbose = argv.verbose;
29 |
30 | // general commands
31 | let list = argv.list;
32 | let start = argv.start;
33 | let check = argv.check;
34 | let deleteCmd = argv.delete;
35 | let stopCmd = argv.stop;
36 | let infoCmd = argv.info;
37 |
38 | // provision related arguments
39 | let provision = argv.provision;
40 | let ovf = argv.ovf;
41 | let attach_iso = argv.attach_iso;
42 | let micro = argv.micro;
43 | let disk = argv.disk;
44 | let ip = argv.ip;
45 | let ssh_port = argv.ssh_port;
46 | let forward_ports = argv.forward_ports;
47 | let cpus = argv.cpus;
48 | let mem = argv.mem;
49 | let add_ssh_key = argv.add_ssh_key;
50 | let syncs = [];
51 | if( argv.sync)
52 | {
53 | syncs = _.isArray(argv.sync) ? argv.sync : [ argv.sync ];
54 | }
55 |
56 | // Update running vm arguments
57 | let exposePort = argv.exposePort;
58 |
59 | // If a dry run, enable logging
60 | if (argv.dryRun) {
61 | }
62 |
63 | // Provision
64 | await virtualbox(
65 | {
66 | vmname, ovf, verbose, list, start, check, provision, ip, ssh_port, deleteCmd, stopCmd, infoCmd, syncs, attach_iso, micro,
67 | mem, cpus, add_ssh_key, forward_ports, disk, exposePort
68 | }
69 | );
70 |
71 | }
72 | catch(e) {
73 | console.log(e);
74 | process.exit(1);
75 | }
76 |
77 | })();
--------------------------------------------------------------------------------
/config/interfaces.mustache:
--------------------------------------------------------------------------------
1 | # This file describes the network interfaces available on your system
2 | # and how to activate them. For more information, see interfaces(5).
3 |
4 | # The loopback network interface
5 | auto lo
6 | iface lo inet loopback
7 |
8 | # Source interfaces
9 | # Please check /etc/network/interfaces.d before changing this file
10 | # as interfaces may have been defined in /etc/network/interfaces.d
11 | # See LP: #1262951
12 | source /etc/network/interfaces.d/*.cfg
13 |
14 | auto enp0s8
15 | iface enp0s8 inet static
16 | address {{ip}}
17 | netmask 255.255.255.0
18 |
--------------------------------------------------------------------------------
/config/resources/baker_rsa:
--------------------------------------------------------------------------------
1 | -----BEGIN RSA PRIVATE KEY-----
2 | MIIJKAIBAAKCAgEAqPmEYSNho56PuTQ/jf6Qb78Owb44ujhLWYFCryX/D/az3FAk
3 | fMOw6Qz06S0jOLKQaiMKBDNQkEZx/Mf1H74a+dbVP++AOCdjIARIwpSPDOWfIqmI
4 | Q1n6EcsKP9rgda6zxyAiDO9ei0RRiA6Kp7fpXh1OMHHx5hzWvPyqgubTcXff1QcX
5 | r3odAiLu/wWt/1FbZ+gk2NrBjKNJiZNCI8yLCuNk4ES+2Tk0H26NU3dw6TgnbdNs
6 | X7ecVwpPSrkcMK43bcmWz/J/MXO/2HEZNKbMBVYjXxGlORG+Nvg069DoQoGnRg/b
7 | n8SW0oeLctlZkcnEAX49NFakDtszzS9ru+hH5DBCP07KVWp7DAoXkbbdwuUCUAr9
8 | IF57Q0rp84CDr24EoXOuOHiK5lf5IdKC2JFvhYvNM6sf3SHSjHOzqVyv7piW9fGq
9 | NiAbQaE4ja+XJWtV3qw8GVyRKerDyZUo2vcTW9MsNDwH8TIirEf348pmeRO3T2mI
10 | 0t2/iyMsY8S/hkq/GUS/t2h+5WLHQGkMHpHrMWjGVEnyg8EVpOVLxPNYKQllpIHE
11 | 3KsQhrogQnb4gVPPMl3w7haHYnYGEyd/STPb94Crr5SQLUWgW10iemE42p36M5Zq
12 | WjWCJh1D3qKGNtL5aJZl87NpZWSPoDOvBmaZ5pd3p/NCyWJ4p9upIoFjPVkCAwEA
13 | AQKCAgBRyAn5Fa3BChIXmiEUcVuoqfjTbmR4RJy7YiNLMAGl0Uo13Bf8xp3N/bZf
14 | ULhWTZ41sGW9qLRaT64FoSWTSmg1+XNWsW0GQJHqQgiRHGOr40rE9PZ9WoP8rp90
15 | TlQKwRZDztqMFiJVFyi6yAb1q75oDZj1O4DPVa/c4hEIr/0wUstjiD4/cMOvcAbq
16 | KO6QvuiVfrauuhmpHrKNwlbliq7VAz+kh8Ey00vV1qTR++ILDmGO9x/hp7UkL1o3
17 | GSZ6rSconMPAO2ayIYp9kCeZ4wylnI4cCidEWsEMS88ZPw/aeHPkJfKu/e/dTzr/
18 | yBBgzh1ud5HZzgEzK4aDzWrAFGkOT6Oa3OuqCPmYGZZ/Z8H/lSvRxcnVG9UyjFpe
19 | yjXhnBfsJzhjFLqyIQfoSO31sbNJkmxQ1XmMEOdYwqmK8nhCSJM5WiUDZQ/X6hpc
20 | ophsS4iGExqqB5/LpodZunDdrxJbljD86iJUp34xCs1LPHqcaB3QmUEppIfYrMUk
21 | crUm6OhUy/u5IcKcpeGGATd26XIi9ljs1GwgSjNd1ejO42HLQBXq569bfhhwDfEf
22 | rVoCM9h6jMeiZQXNsOgf4f7d7T8aPHaOSipJVzoEVyM21K/CDIUtdX8SENeDZaEc
23 | Ob7cKlVDuuZkfk1v/KVDhEGVYBpOYPAiHnedSiYoL6J/9RKTvQKCAQEA1YvF0aho
24 | //O55rk5uGOwdcZ9FM+QNoJNCILGDHWlo/AQdNwd1eWLH0Yap4uYn/WJT50VwcL0
25 | efDyToLDX7GLAZtc/6eUJ7glhQ0u0dUBcIlH6Z8KBZ8BVJIR7i3V2c9FBh0jmLF1
26 | BvO5ulcGizv3r8+vcVqVU5YF33vaWlcV4iP1GeH1QzAru5wLyKtLr8SrZZ9JL5xR
27 | 5xxmNvvxyUmL7tVCoclyMR9X0qluwGriSOziBCL4mUuhvK5UElgmvFFa2kSP/gEx
28 | +D+DyY8FZ3p8NtdZWYAEs+6HXekxTfD6EhbkfB3AWYeu/N3ETRTX64tS+twYSGQT
29 | EPQZNEt34qOKIwKCAQEAypFUD1cWMaHGzRgaXODqmGZj6uwb8kQ2MUDKlJloUt6H
30 | p/9779RYmcR1Yo5W7H0lmcVH12kE0co7Sco7YtSPR1wLgicyjR+Sq+zxyetwqVEu
31 | LDsmraL3BVaTMqRnAaWpHQlbp+NIeeZcnuW3b8EBAEKPy3xujGsHuZ9miumf45qq
32 | 4DbsqMB296yhiXQB1yhWDSEHdcnBfHN8aawDEkp6cssdOB85lmBZpwqAuXxH0l/W
33 | Qrhohq7MH1X7CDefwh23Pz4b9V7XxzirNaq7zFs6ceSNuHv11bHV5QRR5YsPh+KG
34 | CdEDzMuao/1/df0TsiztYdC3K2aYaOEejyGv4sH8UwKCAQBJ8jqwHScu6pEHSkCo
35 | jyy9u9v4Zt/DYF+YgOBf1CVlnW21abuTJAeG7tmwBvD1AytnPDgafo314++kLDfH
36 | XU2LYudTSA5Pqr6jUitSUfZLp94VEhOAWs01Ide/qHOTFukJ8vEuoNSrcZ5w3k3P
37 | zRY59SsFj56B8UNbXiIAgoN7aYQoUEyD1ZxvPNv/wwFUfj/z0rKfH/xkkTr780aI
38 | s0UXkRWfvIgkZnwc4LsPOnPdWNnzIMEBJGV/VsaaC5huQaW6S1+pT3SkSCo0k6gF
39 | ay60NuIj0ebO/9w0Mtn16WpO9UptiEfhONDpk0m0f3E9iWNUpv5pou3PQxevOirr
40 | ekINAoIBACfC3v0j2vdjCeK4GHSisWm4r2QtdE7ZlMmWLi187z1U8MvJGkq5I6sL
41 | JP9zcRx6dCb60l81/fwv9fNF/uInVvhq2NdzWjjZObEFkXBRBow1oxqLgcwTcOlb
42 | VQlbu9xW6BsK+zK5KkDDNur5rEgDWm7yoccPZaOqXpnQ8A/US84hTek03r9BCBkV
43 | iZ+xZasV/84T7aLxN0l2YbVcTj4I4IAn3lRlzKf3waFILnw6KN7icOwnxlypcuez
44 | uNKkGHfB3XZMerBvLWutc+3U1YgHYDF661aK/nYzsgiCEJE9+o5xqF3E6ToJvRDz
45 | cVF3m6Ydq3rHvSyHtuLfTWBK/HtGGIECggEBAMXM4KSngNKpTCApjFpvEI3TvJtp
46 | 8A2Mvhj/M0pXkBIDxcBFqF/0cYXnGpPc/AgPekh/vEyOOGOSh3dplswXie231Bod
47 | 6h8d2I8Pn7dTl/Po1jSMpwXDQu2PlrTr9+zcRZfGgJc4f6nU4PeD5CdUyBCtvJsG
48 | DrnJ2NVUhgRXkCwn8Whe+le9GUKo3athetUZ7lKrbxz0bs2KHniUURpWltfmG+EM
49 | g08w319Gyq9XEdfcdyoxUDCoiyhyV1AYx+tHiMYidkadnKJVXHUC2YapTKtEfK1o
50 | cJmno7sstGUNY0o6+sPve4CIECE4NSMCQdE/K1JPAvF+yZwHlVUZacX+a5M=
51 | -----END RSA PRIVATE KEY-----
52 |
--------------------------------------------------------------------------------
/config/resources/insecure_private_key:
--------------------------------------------------------------------------------
1 | -----BEGIN RSA PRIVATE KEY-----
2 | MIIEogIBAAKCAQEA6NF8iallvQVp22WDkTkyrtvp9eWW6A8YVr+kz4TjGYe7gHzI
3 | w+niNltGEFHzD8+v1I2YJ6oXevct1YeS0o9HZyN1Q9qgCgzUFtdOKLv6IedplqoP
4 | kcmF0aYet2PkEDo3MlTBckFXPITAMzF8dJSIFo9D8HfdOV0IAdx4O7PtixWKn5y2
5 | hMNG0zQPyUecp4pzC6kivAIhyfHilFR61RGL+GPXQ2MWZWFYbAGjyiYJnAmCP3NO
6 | Td0jMZEnDkbUvxhMmBYSdETk1rRgm+R4LOzFUGaHqHDLKLX+FIPKcF96hrucXzcW
7 | yLbIbEgE98OHlnVYCzRdK8jlqm8tehUc9c9WhQIBIwKCAQEA4iqWPJXtzZA68mKd
8 | ELs4jJsdyky+ewdZeNds5tjcnHU5zUYE25K+ffJED9qUWICcLZDc81TGWjHyAqD1
9 | Bw7XpgUwFgeUJwUlzQurAv+/ySnxiwuaGJfhFM1CaQHzfXphgVml+fZUvnJUTvzf
10 | TK2Lg6EdbUE9TarUlBf/xPfuEhMSlIE5keb/Zz3/LUlRg8yDqz5w+QWVJ4utnKnK
11 | iqwZN0mwpwU7YSyJhlT4YV1F3n4YjLswM5wJs2oqm0jssQu/BT0tyEXNDYBLEF4A
12 | sClaWuSJ2kjq7KhrrYXzagqhnSei9ODYFShJu8UWVec3Ihb5ZXlzO6vdNQ1J9Xsf
13 | 4m+2ywKBgQD6qFxx/Rv9CNN96l/4rb14HKirC2o/orApiHmHDsURs5rUKDx0f9iP
14 | cXN7S1uePXuJRK/5hsubaOCx3Owd2u9gD6Oq0CsMkE4CUSiJcYrMANtx54cGH7Rk
15 | EjFZxK8xAv1ldELEyxrFqkbE4BKd8QOt414qjvTGyAK+OLD3M2QdCQKBgQDtx8pN
16 | CAxR7yhHbIWT1AH66+XWN8bXq7l3RO/ukeaci98JfkbkxURZhtxV/HHuvUhnPLdX
17 | 3TwygPBYZFNo4pzVEhzWoTtnEtrFueKxyc3+LjZpuo+mBlQ6ORtfgkr9gBVphXZG
18 | YEzkCD3lVdl8L4cw9BVpKrJCs1c5taGjDgdInQKBgHm/fVvv96bJxc9x1tffXAcj
19 | 3OVdUN0UgXNCSaf/3A/phbeBQe9xS+3mpc4r6qvx+iy69mNBeNZ0xOitIjpjBo2+
20 | dBEjSBwLk5q5tJqHmy/jKMJL4n9ROlx93XS+njxgibTvU6Fp9w+NOFD/HvxB3Tcz
21 | 6+jJF85D5BNAG3DBMKBjAoGBAOAxZvgsKN+JuENXsST7F89Tck2iTcQIT8g5rwWC
22 | P9Vt74yboe2kDT531w8+egz7nAmRBKNM751U/95P9t88EDacDI/Z2OwnuFQHCPDF
23 | llYOUI+SpLJ6/vURRbHSnnn8a/XG+nzedGH5JGqEJNQsz+xT2axM0/W/CRknmGaJ
24 | kda/AoGANWrLCz708y7VYgAtW2Uf1DPOIYMdvo6fxIB5i9ZfISgcJ/bbCUkFrhoH
25 | +vq/5CIWxCPp0f85R4qxxQ5ihxJ0YDQT9Jpx4TMss4PSavPaBH3RXow5Ohe+bYoQ
26 | NE5OgEXk2wVfZczCZpigBKbKZHNYcelXtTt/nP3rsCuGcM4h53s=
27 | -----END RSA PRIVATE KEY-----
28 |
--------------------------------------------------------------------------------
/create.sh:
--------------------------------------------------------------------------------
1 | #!/bin/bash
2 |
3 | # terminate early if commands fail
4 | set -e
5 | #set -o pipefail
6 |
7 | VM="demo-ubuntu"
8 | #BOX=~/.vagrant.d/boxes/ubuntu-VAGRANTSLASH-xenial64/20180620.0.0/virtualbox/box.ovf
9 | listOfBoxes=(~/.vagrant.d/boxes/ubuntu-VAGRANTSLASH-xenial64/*/virtualbox/box.ovf)
10 | BOX=${listOfBoxes[0]}
11 |
12 | echo "Found $BOX"
13 |
14 | IPGATEWAY=192.168.33.1
15 | SSH_PORT=2002
16 |
17 | VBoxManage import $BOX --vsys 0 --vmname ${VM} || echo "alredy created"
18 |
19 | # Prevent hanging in boot waiting for console
20 | VBoxManage modifyvm ${VM} --uart1 0x3f8 4 --uartmode1 disconnected
21 |
22 | # Networking
23 | VBOXNET=vboxnet0
24 |
25 | # turn off for now...
26 | # VBoxManage hostonlyif create
27 | # VBoxManage hostonlyif ipconfig ${VBOXNET} --ip ${IPGATEWAY}
28 |
29 | # TODO: Something smart with this
30 | # VBoxManage list hostonlyifs
31 |
32 | # Name: vboxnet7
33 | # GUID: 786f6276-656e-4774-8000-0a0027000007
34 | # DHCP: Disabled
35 | # IPAddress: 192.168.63.1
36 | # NetworkMask: 255.255.255.0
37 | # IPV6Address:
38 | # IPV6NetworkMaskPrefixLength: 0
39 | # HardwareAddress: 0a:00:27:00:00:07
40 | # MediumType: Ethernet
41 | # Wireless: No
42 | # Status: Down
43 | # VBoxNetworkName: HostInterfaceNetworking-vboxnet7
44 |
45 | # NIC 1 (NAT)
46 | VBoxManage modifyvm ${VM} --nic1 nat
47 | VBoxManage modifyvm ${VM} --nictype1 virtio
48 | # Use port forwarding to enable ssh.
49 | #VBoxManage modifyvm ${VM} --natpf1 delete "guestssh" || echo "not here"
50 | VBoxManage modifyvm ${VM} --natpf1 "guestssh,tcp,,${SSH_PORT},,22"
51 |
52 | # NIC 2 (HOST-ONLY IP)
53 | VBoxManage modifyvm ${VM} --hostonlyadapter2 ${VBOXNET}
54 | VBoxManage modifyvm ${VM} --nic2 hostonly
55 | VBoxManage modifyvm ${VM} --nictype2 virtio
56 |
57 | VBoxManage startvm ${VM} --type headless
--------------------------------------------------------------------------------
/index.js:
--------------------------------------------------------------------------------
1 | /**
2 | * @module virtualbox
3 | */
4 |
5 | const path = require('path');
6 | const fs = require('fs');
7 |
8 | const download = require('download');
9 | const tar = require('tar');
10 | const md5File = require('md5-file/promise')
11 | const ProgressBar = require('progress');
12 |
13 | const util = require('./lib/util');
14 | const VBoxProvider = require('./lib/VBoxProvider');
15 |
16 | module.exports = async function (options = {}) {
17 | let provider = new VBoxProvider();
18 |
19 | if( !options.ssh_port && (options.provision || options.micro) )
20 | {
21 | options.ssh_port = await util.findAvailablePort(provider, options.verbose);
22 | }
23 |
24 | if( !options.cpus && (options.provision || options.micro) )
25 | {
26 | options.cpus = options.provision ? 2: 1;
27 | }
28 |
29 | if( !options.mem && (options.provision || options.micro) )
30 | {
31 | options.mem = options.provision ? 1024: 512;
32 | }
33 |
34 | if(options.micro) {
35 | try {
36 | options.quickBoot = options.quickBoot || false;
37 | await provider.micro(options.vmname, options.cpus, options.mem, options.attach_iso, options.ssh_port, path.join(__dirname,'config/resources/baker_rsa'), options.syncs, options.disk, options.verbose, options.quickBoot, options.bridged);
38 | } catch (error) {
39 | console.error('=> exec error:', error);
40 | }
41 | }
42 |
43 | if(options.provision) {
44 |
45 | if( !options.ovf )
46 | {
47 | const boxesPath = path.join(require('os').userInfo().homedir, '.baker', 'boxes');
48 | const unpackPath = path.join(boxesPath, 'ubuntu-xenial');
49 |
50 | util.mkDirByPathSync(boxesPath);
51 | util.mkDirByPathSync(unpackPath);
52 |
53 | // download files if not available locally
54 | if (!(await fs.existsSync(path.join(unpackPath, 'box.ovf')))) {
55 | console.log("no --ovf specified, downloading latest ubuntu box!");
56 | const bar = new ProgressBar('[:bar] :percent :etas', {
57 | complete: '=',
58 | incomplete: ' ',
59 | width: 20,
60 | total: 0
61 | });
62 |
63 | await download('http://cloud-images.ubuntu.com/xenial/current/xenial-server-cloudimg-amd64-vagrant.box', boxesPath)
64 | .on('response', res => {
65 | // console.log(`Size: ${res.headers['content-length']}`);
66 | bar.total = res.headers['content-length'];
67 | res.on('data', data => bar.tick(data.length));
68 | })
69 | .then(() => console.log('downloaded!'));
70 | await tar.x( // or tar.extract(
71 | {
72 | file: path.join(boxesPath, 'xenial-server-cloudimg-amd64-vagrant.box'),
73 | C: unpackPath
74 | }
75 | );
76 | // Remove box
77 | fs.unlinkSync(path.join(boxesPath, 'xenial-server-cloudimg-amd64-vagrant.box'));
78 | }
79 | options.ovf = path.join(unpackPath, 'box.ovf');
80 | }
81 |
82 | try {
83 | await provider.check(options);
84 | await provider.provision(options.vmname, options.cpus, options.mem, options.ovf, options.attach_iso, options.verbose);
85 | await provider.customize(options.vmname, options.ip, options.ssh_port, options.forward_ports, options.syncs, options.verbose);
86 | await provider.start(options.vmname, options.verbose);
87 | await provider.postSetup(options.vmname, options.ip, options.ssh_port, path.join(__dirname,'config/resources/insecure_private_key'), options.add_ssh_key, options.syncs, options.verbose);
88 | } catch (error) {
89 | console.error('=> exec error:', error);
90 | }
91 | }
92 |
93 | if(options.list)
94 | console.log(await provider.list());
95 |
96 | if(options.deleteCmd)
97 | {
98 | if( !options.vmname )
99 | {
100 | console.error("Please provide --vmname with --delete");
101 | process.exit(1);
102 | }
103 | console.log(await provider.delete(options.vmname));
104 | }
105 |
106 | if(options.stopCmd)
107 | {
108 | if( !options.vmname )
109 | {
110 | console.error("Please provide --vmname with --stop");
111 | process.exit(1);
112 | }
113 | console.log(await provider.stop(options.vmname));
114 | }
115 |
116 | if(options.infoCmd){
117 |
118 | if( !options.vmname )
119 | {
120 | console.error("Please provide --vmname with --info");
121 | process.exit(1);
122 | }
123 | console.log(await provider.info(options.vmname));
124 | }
125 |
126 | if(options.start)
127 | await provider.start(options.vmname, options.verbose);
128 |
129 | if(options.exposePort )
130 | {
131 | if( !options.vmname )
132 | {
133 | console.error("Please provide --vmname with --exposePort");
134 | process.exit(1);
135 | }
136 |
137 | console.log(await provider.expose(options.vmname, options.exposePort, options.verbose));
138 | }
139 | };
140 |
--------------------------------------------------------------------------------
/lib/VBoxProvider.js:
--------------------------------------------------------------------------------
1 | /**
2 | * @module lib/VBoxProvider
3 | */
4 |
5 | const execute = require('./commands/execute');
6 | const execSync = require('child_process').execSync;
7 | const exec = require('child_process').exec;
8 | const { promisify } = require('util');
9 | const execAsync = promisify(exec);
10 | const mustache = require('mustache');
11 | const os = require('os');
12 | const fs = require('fs-extra');
13 | const path = require('path');
14 | const ipUtil = require('ip');
15 | const util = require('../lib/util');
16 | const VBexe = process.platform === 'win32' ? '"C:\\Program Files\\Oracle\\VirtualBox\\VBoxManage.exe"' : 'VBoxManage';
17 |
18 | const isPortAvailable = require('is-port-available');
19 |
20 | class VBoxProvider {
21 |
22 | // Returns the major version of the VirtualBox instance
23 | async majorVersion() {
24 | let version = await execute("--version", "", false);
25 |
26 | return Number(version.split('.')[0]);
27 | }
28 |
29 | // Returns the correct serial port settings based on version.
30 | async serialOut(name) {
31 | let version = await this.majorVersion();
32 |
33 | if (version < 6) { return 'disconnected'; }
34 |
35 | let logPath = path.join(os.homedir(),'.baker',`${name}.log`);
36 |
37 | // Fix: ensure .baker exists
38 | if( !fs.existsSync(path.join(os.homedir(),'.baker')))
39 | {
40 | fs.mkdirSync(path.join(os.homedir(),'.baker'));
41 | }
42 |
43 | return `file ${logPath}`;
44 | }
45 |
46 | /**
47 | * Get default run command.
48 | *
49 | * @param {String} name Name of virtual machine.
50 | * @param {String} ovf Path of image to clone/import.
51 | * @returns {Object} Promise.
52 | */
53 | async provision(name, cpus, mem, ovf, iso, verbose) {
54 | await execute("import", `"${ovf}" --vsys 0 --vmname ${name}`, verbose);
55 | await execute("modifyvm", `"${name}" --memory ${mem} --cpus ${cpus}`, verbose);
56 | if(iso)
57 | await execute("storageattach", `${name} --storagectl IDE --port 0 --device 0 --type dvddrive --medium "${iso}"`)
58 | }
59 |
60 | _calculateGateway(ip, mask='255.255.255.0'){
61 | let networkAddress = ipUtil.mask(ip, mask);
62 | return ipUtil.cidrSubnet(networkAddress + '/26').firstAddress;
63 | }
64 |
65 | async micro(name, cpus, mem, iso, ssh_port, sshKeyPath, syncs, disk, verbose, quickBoot, bridged) {
66 | await execute("createvm", `--name "${name}" --register`, verbose);
67 | await execute("modifyvm", `"${name}" --memory ${mem} --cpus ${cpus}`, verbose);
68 | await execute("storagectl", `"${name}" --name IDE --add ide`, verbose);
69 | await execute("storageattach", `${name} --storagectl IDE --port 0 --device 0 --type dvddrive --medium "${iso}"`, verbose);
70 |
71 | let serial = await this.serialOut(name);
72 | await execute("modifyvm", `${name} --uart1 0x3f8 4 --uartmode1 ${serial}`, verbose);
73 |
74 | // NIC1 =======
75 | await execute("modifyvm", `${name} --nic1 nat`, verbose);
76 | await execute("modifyvm", `${name} --nictype1 virtio`, verbose);
77 |
78 | // NIC2 =======
79 | if (bridged) {
80 | let bridgedif = (await this.bridgedifs())[0].Name;
81 | await execute("modifyvm", `${name} --bridgeadapter2 "${bridgedif}"`, verbose);
82 | await execute("modifyvm", `${name} --nic2 bridged`, verbose);
83 | await execute("modifyvm", `${name} --nictype2 virtio`, verbose);
84 | // await execute("modifyvm", `${name} --macaddress2 auto`, verbose);
85 | }
86 |
87 | // port forwarding
88 | await execute("modifyvm", `${name} --natpf1 "guestssh,tcp,,${ssh_port},,22"`, verbose);
89 |
90 | // Disks
91 | if( disk )
92 | {
93 | let diskPath = path.join(os.homedir(),'.baker','boxes',`${name}-disk.vdi`);
94 | let diskSize = 32768;
95 | if( !fs.existsSync(diskPath) )
96 | {
97 | //let rawDisk = "\\\\.\\PhysicalDrive0";
98 | //await execute("internalcommands", `createrawvmdk -filename ${diskPath} -rawdisk "${rawDisk}"`, verbose);
99 | // --variant Fixed
100 | await execute("createmedium", `disk --format VDI --filename "${diskPath}" --size ${diskSize} `, verbose);
101 | //await execute("modifymedium", `${diskPath} --type writethrough`, verbose);
102 | }
103 |
104 | await execute("storagectl", `"${name}" --name "SATA" --add sata`, verbose);
105 | await execute("storageattach", `${name} --storagectl "SATA" --port 2 --device 0 --type hdd --medium "${diskPath}"`, verbose);
106 | }
107 |
108 | // syncs
109 | if( syncs.length > 0 )
110 | {
111 | let count = 0;
112 | for( var sync of syncs )
113 | {
114 | let host = sync.split(';')[0];
115 | let guest = sync.split(';')[1];
116 | await execute("sharedfolder", `add ${name} --name "vbox-share-${count}" --hostpath "${host}" `, verbose);
117 | count++;
118 | }
119 | }
120 |
121 | if (quickBoot) {
122 | await execute("modifyvm", `${name} --boot1 dvd`);
123 | await execute("modifyvm", `${name} --biosbootmenu disabled`);
124 | }
125 |
126 | await this.start(name, verbose);
127 |
128 | // post setup
129 | if( disk )
130 | {
131 | // format new disk to be ext4
132 | let sshConfig = {port: ssh_port, user: 'root', private_key: sshKeyPath};
133 | //let cmd = 'echo -e "o\nn\np\n1\n\n\nw" | fdisk /dev/sda && /sbin/mkfs.ext4 /dev/sda1';
134 | let cmd = `/sbin/mkfs.ext4 /dev/sda; mount -t ext4 /dev/sda /mnt/disk`;
135 | console.log('Formatting virtual drive');
136 |
137 | await util.sshExec(cmd, sshConfig, 60000, verbose).catch( e => {console.log(e)});;
138 | }
139 | }
140 |
141 | async customize(name, ip, ssh_port, forward_ports=[], syncs, verbose) {
142 | // modifyvm ${VM} --uart1 0x3f8 4 --uartmode1 disconnected
143 | let serial = await this.serialOut(name);
144 | await execute("modifyvm", `${name} --uart1 0x3f8 4 --uartmode1 ${serial}`, verbose);
145 |
146 | // syncs
147 | if( syncs.length > 0 )
148 | {
149 | let count = 0;
150 | for( var sync of syncs )
151 | {
152 | let host = sync.split(';')[0];
153 | let guest = sync.split(';')[1];
154 | await execute("sharedfolder", `add ${name} --name "${name}-${count}" --hostpath "${host}" `, verbose);
155 | await execute(`setextradata`, `${name} VBoxInternal2/SharedFoldersEnableSymlinksCreate/${name}-0 1`, verbose);
156 | count++;
157 | }
158 | }
159 |
160 | // NIC1 =======
161 | await execute("modifyvm", `${name} --nic1 nat`, verbose);
162 | await execute("modifyvm", `${name} --nictype1 virtio`, verbose);
163 |
164 | if( ip )
165 | {
166 | // NIC2 =======
167 | let VBOXNET = null;
168 | // check if any adapters with this ip :
169 | let gateway = this._calculateGateway(ip);
170 | let networks = (await this.hostonlyifs()).filter(e => e.IPAddress === gateway);
171 | if (networks.length > 0 )
172 | {
173 | VBOXNET = networks[0].Name;
174 | console.log(`Using ${gateway} in ${VBOXNET}`);
175 | }
176 | else
177 | {
178 | let stdout = (await execAsync(`${VBexe} hostonlyif create`)).stdout;
179 | VBOXNET = stdout.substr(stdout.indexOf(`'`) + 1, stdout.lastIndexOf(`'`) - stdout.indexOf(`'`) - 1);
180 | console.log('created adapter:', VBOXNET);
181 | }
182 |
183 | await execute("hostonlyif", `ipconfig "${VBOXNET}" --ip ${gateway}`, verbose);
184 |
185 | await execute("modifyvm", `${name} --hostonlyadapter2 "${VBOXNET}"`, verbose);
186 | await execute("modifyvm", `${name} --nic2 hostonly`, verbose);
187 | await execute("modifyvm", `${name} --nictype2 virtio`, verbose);
188 | }
189 |
190 | // port forwarding for ssh
191 | await execute("modifyvm", `${name} --natpf1 "guestssh,tcp,,${ssh_port},,22"`, verbose);
192 |
193 | // port forwarding
194 | forward_ports.forEach(async function (port) {
195 | let splitPort = String(port).split(':');
196 | let guestPort = splitPort[0];
197 | let hostPort = splitPort[1] || splitPort[0];
198 | await execute("modifyvm", `${name} --natpf1 "${port},tcp,,${hostPort},,${guestPort}"`, verbose);
199 | });
200 | }
201 |
202 | async start(name, verbose) {
203 | // For unlock any session.
204 | await execute("startvm", `${name} --type emergencystop`, verbose).catch(e => e);
205 | // Real start.
206 | await execute("startvm", `${name} --type headless`, verbose);
207 | }
208 |
209 | async waitForConnection(sshInfo, tries=0)
210 | {
211 | try {
212 | let cmd = `echo "waiting to start"`;
213 | await util.sshExec(cmd, sshInfo, 60000);
214 | } catch (error) {
215 | if( tries > 5 )
216 | {
217 | throw `Timed out.`;
218 | }
219 | this.waitForConnection(sshInfo,tries++);
220 | }
221 | }
222 |
223 | // setting /etc/network/interfaces
224 | async postSetup(vmname, ip, port, sshKeyPath, newSSHKeyPath, syncs, verbose) {
225 | let interfacesPath = path.resolve(__dirname, '../config/interfaces.mustache');
226 |
227 | // render and create interfaces in /tmp/interfaces
228 | let tmpFile = path.join(os.tmpdir(),'interfaces');
229 | let interfaces = mustache.render((await fs.readFile(interfacesPath)).toString(), {ip});
230 | await fs.writeFile(tmpFile, interfaces);
231 |
232 | await this.waitForConnection({port, user: 'vagrant', private_key: sshKeyPath});
233 |
234 | if (ip )
235 | {
236 | // cp /tmp/interfaces vm:/tmp/interfaces
237 | try {
238 | await util.scp(tmpFile, '/tmp/interfaces', {port, user: 'vagrant', private_key: sshKeyPath});
239 | } catch (error) {
240 | throw `failed to generate interfaces configuration, ${error}`;
241 | }
242 |
243 | // mv vm:/tmp/interfaces /etc/network/interfaces,
244 | // sudo systemctl restart networking
245 | // ifdown ens0p8; ifup ens0p8
246 | try {
247 | let cmd = `sudo cp /tmp/interfaces /etc/network/interfaces && sudo systemctl restart networking && sudo ifdown enp0s8 && sudo ifup enp0s8`;
248 | await util.sshExec(cmd, {port, user: 'vagrant', private_key: sshKeyPath}, 60000, verbose);
249 | } catch (error) {
250 | throw `failed to copy interfaces configuration, ${error}`;
251 | }
252 | }
253 |
254 |
255 | // adding new ssh-key
256 | if(newSSHKeyPath){
257 | try {
258 | let newSSHKey = (await fs.readFile(newSSHKeyPath)).toString();
259 | let cmd = `echo "${newSSHKey}" >> ~/.ssh/authorized_keys`;
260 | await util.sshExec(cmd, {port, user: 'vagrant', private_key: sshKeyPath}, 60000, verbose);
261 | } catch (error) {
262 | throw `failed to add new ssh key, ${error}`;
263 | }
264 | }
265 |
266 | await this.setupSyncFoldersOnGuest(vmname, syncs, port, sshKeyPath, verbose);
267 |
268 | }
269 |
270 | async setupSyncFoldersOnGuest(vmname, syncs, port, sshKeyPath, verbose)
271 | {
272 | // Handle sync folders
273 | if( syncs.length > 0 )
274 | {
275 | // Add vboxsf to modules so we can enable shared folders; ensure our user is in vboxsf group
276 | try {
277 | let LINE = "vboxsf"; let FILE= '/etc/modules';
278 | let cmd = `(grep -qF -- "${LINE}" "${FILE}" || echo "${LINE}" | sudo tee -a "${FILE}"); sudo usermod -a -G vboxsf vagrant`;
279 | await util.sshExec(cmd, {port, user: 'vagrant', private_key: sshKeyPath}, 60000, verbose);
280 | } catch (error) {
281 | throw `failed to setup shared folders, ${error}`;
282 | }
283 |
284 | // Add mount to /etc/fstab for every shared folder
285 | let count = 0;
286 | for( var sync of syncs )
287 | {
288 | let host = sync.split(';')[0];
289 | let guest = sync.split(';')[1];
290 |
291 | try {
292 | let LINE=`${vmname}-${count} ${guest} vboxsf uid=1000,gid=1000 0 0`; let FILE=`/etc/fstab`;
293 | let cmd = `sudo mkdir -p ${guest}; grep -qF -- "${LINE}" "${FILE}" || echo "${LINE}" | sudo tee -a "${FILE}"`;
294 | await util.sshExec(cmd, {port, user: 'vagrant', private_key: sshKeyPath}, 60000, verbose);
295 | } catch (error) {
296 | throw `failed to add fstab entry for shared folder, ${error}`;
297 | }
298 | count++;
299 | }
300 |
301 | // Reload fstab
302 | try {
303 | let cmd = `sudo mount -a`;
304 | await util.sshExec(cmd, {port, user: 'vagrant', private_key: sshKeyPath}, 60000, verbose);
305 | } catch (error) {
306 | throw `failed to setup shared folders, ${error}`;
307 | }
308 |
309 | }
310 | }
311 |
312 | async list() {
313 | return new Promise(function (resolve, reject) {
314 | exec(`${VBexe} list vms`, (error, stdout, stderr) => {
315 | if(error || stderr) {
316 | console.error(`exec error: vboxmanage list`);
317 | console.error(`=> ${error}, ${stderr}`);
318 | reject(error);
319 | }
320 |
321 | let list = [];
322 | let lines = stdout.split('\n');
323 | for (let i = 0; i < lines.length-1; i++) {
324 | let lineSplit = lines[i].split(' ');
325 | let name= lineSplit[0].replace(/"/g, '');
326 | let id = lineSplit[1].replace(/{|}/g, '');
327 | list.push({name: name, id: id});
328 | }
329 | resolve(list);
330 | })
331 | });
332 | }
333 |
334 | async hostonlyifs(){
335 | return new Promise(function (resolve, reject) {
336 | exec(`${VBexe} list hostonlyifs`, (error, stdout, stderr) => {
337 | if(error || stderr) {
338 | console.error(`exec error: vboxmanage list`);
339 | console.error(`=> ${error}, ${stderr}`);
340 | reject(error);
341 | }
342 |
343 | let hostonlyifs = [];
344 | stdout.split(/\r?\n\r?\n/).forEach(adapters => {
345 | if(adapters.length > 0) {
346 | let adapter = {};
347 | adapters.split('\n').forEach(line => {
348 | if(line.length > 0) {
349 | let splitIdx = line.indexOf(':');
350 | adapter[line.substr(0, splitIdx).trim()] = line.substr(splitIdx+1).trim();
351 | }
352 | })
353 | hostonlyifs.push(adapter);
354 | }
355 | })
356 |
357 | resolve(hostonlyifs);
358 | })
359 | });
360 | }
361 |
362 | async bridgedifs(){
363 | return new Promise(function (resolve, reject) {
364 | exec(`${VBexe} list bridgedifs`, (error, stdout, stderr) => {
365 | if(error || stderr) {
366 | console.error(`exec error: vboxmanage list`);
367 | console.error(`=> ${error}, ${stderr}`);
368 | reject(error);
369 | }
370 |
371 | let bridgedifs = [];
372 | stdout.split(/\r?\n\r?\n/).forEach(adapters => {
373 | if(adapters.length > 0) {
374 | let adapter = {};
375 | adapters.split('\n').forEach(line => {
376 | if(line.length > 0) {
377 | let splitIdx = line.indexOf(':');
378 | adapter[line.substr(0, splitIdx).trim()] = line.substr(splitIdx+1).trim();
379 | }
380 | })
381 | bridgedifs.push(adapter);
382 | }
383 | })
384 |
385 | resolve(bridgedifs);
386 | })
387 | });
388 | }
389 |
390 | async check(options) {
391 | let ovf =options.ovf;
392 | let name=options.vmname;
393 | let syncs=options.syncs;
394 | return new Promise(async function (resolve, reject) {
395 | // check if box already exists
396 | if(!(await fs.exists(path.resolve(ovf)))) {
397 | reject(`File not found ${ovf}`);
398 | }
399 |
400 | // Progress state: VBOX_E_FILE_ERROR
401 | // VBoxManage: error: Appliance import failed
402 | // VBoxManage: error: Machine settings file '/Users/cjparnin/VirtualBox VMs/hello/hello.vbox' already exists
403 | let MachineSettingPath = path.join(require('os').userInfo().homedir, `VirtualBox\ VMs/${name}/${name}.vbox`);
404 | if (await fs.exists(MachineSettingPath)) {
405 | reject(`Machine setting file ${MachineSettingPath} already exists.`);
406 | }
407 |
408 | // Verify correct format and existence of sync folders.
409 | for( var sync of syncs )
410 | {
411 | let atoms = sync.split(';');
412 | if( atoms.length !=2 )
413 | {
414 | reject(`Invalid sync folder format. Please use this format: ";".`);
415 | }
416 | let host = atoms[0];
417 | let guest = atoms[1];
418 | if (!await fs.exists(host)) {
419 | reject(`The path ${host} does not exist on your host machine. Cannot create shared folder.`);
420 | }
421 | }
422 |
423 | // Verify new ssh key exists
424 | if (options.add_ssh_key) {
425 | const sshKeyExists = await fs.pathExists(options.add_ssh_key);
426 | if(!sshKeyExists)
427 | reject(`No such file or directory: ${options.add_ssh_key}`);
428 | }
429 |
430 | resolve();
431 | })
432 | }
433 |
434 | async saveState(name) {
435 | return new Promise(function (resolve, reject) {
436 | exec(`${VBexe} controlvm ${name} savestate`, (error, stdout, stderr) => {
437 | if(error && stderr.indexOf('VBOX_E_OBJECT_NOT_FOUND') == -1) {
438 | console.error(`exec error: stop`);
439 | console.error(`=> ${error}, ${stderr}`);
440 | reject(error);
441 | }
442 | resolve("");
443 | });
444 | });
445 | }
446 |
447 | async stop(name) {
448 | return new Promise(function (resolve, reject) {
449 | exec(`${VBexe} controlvm ${name} poweroff soft`, (error, stdout, stderr) => {
450 | if(error && stderr.indexOf('VBOX_E_OBJECT_NOT_FOUND') == -1) {
451 | console.error(`exec error: stop`);
452 | console.error(`=> ${error}, ${stderr}`);
453 | reject(error);
454 | }
455 | resolve("");
456 | });
457 | });
458 | }
459 |
460 | async delete(name) {
461 | return new Promise(function (resolve, reject) {
462 | exec(`${VBexe} unregistervm ${name} --delete`, (error, stdout, stderr) => {
463 | if(error && stderr.indexOf('VBOX_E_OBJECT_NOT_FOUND') == -1) {
464 | console.error(`=> ${error}, ${stderr}`);
465 | reject(error);
466 | }
467 | resolve("");
468 | });
469 | });
470 | }
471 |
472 | async info(vmname) {
473 | return new Promise(function (resolve, reject) {
474 | exec(`${VBexe} showvminfo ${vmname} --machinereadable`, (error, stdout, stderr) => {
475 | if(error && stderr.indexOf('VBOX_E_OBJECT_NOT_FOUND') != -1) {
476 | resolve({VMState:'not_found'});
477 | }
478 | else if( error )
479 | {
480 | console.error(`=> ${error}, ${stderr}`);
481 | reject(error);
482 | }
483 | else
484 | {
485 | let properties = {};
486 | let lines = stdout.split('\n');
487 | for (let i = 0; i < lines.length-1; i++) {
488 | let lineSplit = lines[i].split('=');
489 | let name= lineSplit[0].trim();
490 | let id = lineSplit[1].trim();
491 | properties[name]=id;
492 | }
493 | resolve(properties);
494 | }
495 | });
496 | });
497 | }
498 |
499 | async getState(name) {
500 | let vmInfo = await this.info(name);
501 | return vmInfo.VMState.replace(/"/g,'');
502 | }
503 |
504 | async expose(name, port, verbose) {
505 |
506 | let hostPort=port, guestPort=port;
507 | if( port.indexOf(':') > 0 )
508 | {
509 | [hostPort,guestPort] = port.split(':');
510 | }
511 |
512 | var status = await isPortAvailable(hostPort);
513 | if(!status)
514 | {
515 | throw new Error(`The port ${hostPort} is not available for use!`)
516 | }
517 |
518 | try
519 | {
520 | if( await this.getState(name) == "running" )
521 | {
522 | await execute("controlvm", `${name} natpf1 "${hostPort},tcp,,${hostPort},,${guestPort}"`, verbose);
523 | }
524 | else
525 | {
526 | await execute("modifyvm", `${name} --natpf1 "${hostPort},tcp,,${hostPort},,${guestPort}"`, verbose);
527 | }
528 | }
529 | catch(err)
530 | {
531 | if( err.message.indexOf("name already exists") == -1 )
532 | {
533 | throw new Error(err);
534 | }
535 | }
536 | return `Added exposed port ${hostPort} => ${guestPort} on ${name}`;
537 | }
538 |
539 |
540 | }
541 |
542 | // Export
543 | module.exports = VBoxProvider;
--------------------------------------------------------------------------------
/lib/commands/execute.js:
--------------------------------------------------------------------------------
1 | const exec = require('child_process').exec;
2 | const VBexe = process.platform === 'win32' ? '"C:\\Program Files\\Oracle\\VirtualBox\\VBoxManage.exe"' : 'VBoxManage';
3 |
4 | module.exports = function(cmd, args, verbose) {
5 |
6 | return new Promise(function (resolve, reject) {
7 |
8 | let runCmd = `${VBexe} ${cmd} ${args}`;
9 |
10 | if( verbose )
11 | {
12 | console.log( `Executing ${runCmd}` );
13 | }
14 |
15 | exec(runCmd, (error, stdout, stderr) => {
16 |
17 | if(error) {
18 | reject(error);
19 | }
20 | else
21 | {
22 | resolve(stdout, stderr);
23 | }
24 |
25 | });
26 |
27 | }.bind({cmd, args, verbose}));
28 |
29 | };
--------------------------------------------------------------------------------
/lib/util.js:
--------------------------------------------------------------------------------
1 | const fs = require('fs');
2 | const path = require('path');
3 | const Client = require('ssh2').Client;
4 | const scp2 = require('scp2');
5 | const isPortAvailable = require('is-port-available');
6 |
7 | // Adapted from https://stackoverflow.com/a/40686853/547112
8 | module.exports.mkDirByPathSync = function mkDirByPathSync(targetDir, {isRelativeToScript = false} = {}) {
9 | const sep = path.sep;
10 | const initDir = path.isAbsolute(targetDir) ? sep : '';
11 | const baseDir = isRelativeToScript ? __dirname : '.';
12 |
13 | targetDir.split(sep).reduce((parentDir, childDir) => {
14 | const curDir = path.resolve(baseDir, parentDir, childDir);
15 | try {
16 | if( !fs.existsSync(curDir))
17 | {
18 | fs.mkdirSync(curDir);
19 | }
20 | } catch (err) {
21 | if (err.code !== 'EEXIST') {
22 | throw err;
23 | }
24 | }
25 |
26 | return curDir;
27 | }, initDir);
28 | }
29 |
30 | module.exports.findAvailablePort = async function findAvailablePort(provider, verbose, startPort=2002,endPort=2999)
31 | {
32 | let port = startPort;
33 | let blackListPorts = await module.exports.getPortsUsedByVMs(provider);
34 | if( verbose )
35 | {
36 | console.log(`Searching between ports ${startPort} and ${endPort} for ssh on localhost for this vm.`);
37 | console.log(`Excluding the following ports already used by VirtualBox VMS: ${blackListPorts}`);
38 | }
39 | while( port <= endPort )
40 | {
41 | if( !blackListPorts.includes(port) )
42 | {
43 | var status = await isPortAvailable(port);
44 | if(status)
45 | {
46 | console.log(`Port ${port} is available for ssh on localhost!`);
47 | return port;
48 | }
49 | }
50 | port++;
51 | }
52 | throw new Error(`Could not find available port between ${startPort} and ${endPort}`);
53 | }
54 |
55 | // A VM could be powered off but assigned a port in its NAT/fowards for ssh/etc.
56 | module.exports.getPortsUsedByVMs = async function getPortsUsedByVMs(provider)
57 | {
58 | let vms = await provider.list();
59 | let ports = [];
60 | for( var vm of vms )
61 | {
62 | let properties = await provider.info(vm.name);
63 | for( let prop in properties )
64 | {
65 | if( prop.indexOf('Forwarding(') >= 0 )
66 | {
67 | try{
68 | ports.push( parseInt( properties[prop].split(',')[3]) );
69 | }
70 | catch(e)
71 | {
72 | console.error(e);
73 | }
74 | }
75 | }
76 | }
77 | return ports;
78 | }
79 |
80 | module.exports.scp = async function scp(src, dest, destSSHConfig) {
81 | return new Promise((resolve, reject) => {
82 | scp2.scp(
83 | src, {
84 | host: '127.0.0.1',
85 | port: destSSHConfig.port,
86 | username: destSSHConfig.user,
87 | privateKey: fs.readFileSync(destSSHConfig.private_key, 'utf8'),
88 | path: dest
89 | },
90 | async function (err) {
91 | if (err) {
92 | console.error(`Failed to configure ssh keys: ${err}`);
93 | reject();
94 | } else {
95 | resolve();
96 | }
97 | }
98 | );
99 | });
100 | }
101 |
102 | module.exports.sshExec = async function sshExec(cmd, sshConfig, timeout=20000, verbose) {
103 | let buffer = "";
104 | return new Promise((resolve, reject) => {
105 | var c = new Client();
106 | c
107 | .on('ready', function() {
108 | c.exec(cmd, function(err, stream) {
109 | if (err){
110 | console.error(err);
111 | }
112 | stream
113 | .on('close', function(code, signal) {
114 | c.end();
115 | resolve(buffer);
116 | })
117 | .on('data', function(data) {
118 | if( verbose )
119 | {
120 | console.log('STDOUT: ' + data);
121 | }
122 | buffer += data;
123 | })
124 | .stderr.on('data', function(data) {
125 | console.log('STDERR: ' + data);
126 | reject();
127 | });
128 | });
129 | })
130 | .connect({
131 | host: '127.0.0.1',
132 | port: sshConfig.port,
133 | username: sshConfig.user,
134 | privateKey: fs.readFileSync(sshConfig.private_key),
135 | readyTimeout: timeout
136 | });
137 | });
138 | }
139 |
--------------------------------------------------------------------------------
/package-lock.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "node-virtualbox",
3 | "version": "0.2.4",
4 | "lockfileVersion": 1,
5 | "requires": true,
6 | "dependencies": {
7 | "@sindresorhus/is": {
8 | "version": "0.7.0",
9 | "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-0.7.0.tgz",
10 | "integrity": "sha512-ONhaKPIufzzrlNbqtWFFd+jlnemX6lJAgq9ZeiZtS7I1PIf/la7CW4m83rTXRnVnsMbW2k56pGYu7AUFJD9Pow=="
11 | },
12 | "@types/color-name": {
13 | "version": "1.1.1",
14 | "resolved": "https://registry.npmjs.org/@types/color-name/-/color-name-1.1.1.tgz",
15 | "integrity": "sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ=="
16 | },
17 | "JSONStream": {
18 | "version": "1.3.5",
19 | "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-1.3.5.tgz",
20 | "integrity": "sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==",
21 | "dev": true,
22 | "requires": {
23 | "jsonparse": "^1.2.0",
24 | "through": ">=2.2.7 <3"
25 | }
26 | },
27 | "add-stream": {
28 | "version": "1.0.0",
29 | "resolved": "https://registry.npmjs.org/add-stream/-/add-stream-1.0.0.tgz",
30 | "integrity": "sha1-anmQQ3ynNtXhKI25K9MmbV9csqo=",
31 | "dev": true
32 | },
33 | "ansi-colors": {
34 | "version": "4.1.1",
35 | "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz",
36 | "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==",
37 | "dev": true
38 | },
39 | "ansi-regex": {
40 | "version": "3.0.0",
41 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz",
42 | "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=",
43 | "dev": true
44 | },
45 | "ansi-styles": {
46 | "version": "3.2.1",
47 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
48 | "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
49 | "dev": true,
50 | "requires": {
51 | "color-convert": "^1.9.0"
52 | }
53 | },
54 | "anymatch": {
55 | "version": "3.1.1",
56 | "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.1.tgz",
57 | "integrity": "sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg==",
58 | "dev": true,
59 | "requires": {
60 | "normalize-path": "^3.0.0",
61 | "picomatch": "^2.0.4"
62 | }
63 | },
64 | "archive-type": {
65 | "version": "4.0.0",
66 | "resolved": "https://registry.npmjs.org/archive-type/-/archive-type-4.0.0.tgz",
67 | "integrity": "sha1-+S5yIzBW38aWlHJ0nCZ72wRrHXA=",
68 | "requires": {
69 | "file-type": "^4.2.0"
70 | },
71 | "dependencies": {
72 | "file-type": {
73 | "version": "4.4.0",
74 | "resolved": "https://registry.npmjs.org/file-type/-/file-type-4.4.0.tgz",
75 | "integrity": "sha1-G2AOX8ofvcboDApwxxyNul95BsU="
76 | }
77 | }
78 | },
79 | "argparse": {
80 | "version": "1.0.10",
81 | "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz",
82 | "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==",
83 | "dev": true,
84 | "requires": {
85 | "sprintf-js": "~1.0.2"
86 | }
87 | },
88 | "array-find-index": {
89 | "version": "1.0.2",
90 | "resolved": "https://registry.npmjs.org/array-find-index/-/array-find-index-1.0.2.tgz",
91 | "integrity": "sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E=",
92 | "dev": true
93 | },
94 | "array-ify": {
95 | "version": "1.0.0",
96 | "resolved": "https://registry.npmjs.org/array-ify/-/array-ify-1.0.0.tgz",
97 | "integrity": "sha1-nlKHYrSpBmrRY6aWKjZEGOlibs4=",
98 | "dev": true
99 | },
100 | "array.prototype.map": {
101 | "version": "1.0.2",
102 | "resolved": "https://registry.npmjs.org/array.prototype.map/-/array.prototype.map-1.0.2.tgz",
103 | "integrity": "sha512-Az3OYxgsa1g7xDYp86l0nnN4bcmuEITGe1rbdEBVkrqkzMgDcbdQ2R7r41pNzti+4NMces3H8gMmuioZUilLgw==",
104 | "dev": true,
105 | "requires": {
106 | "define-properties": "^1.1.3",
107 | "es-abstract": "^1.17.0-next.1",
108 | "es-array-method-boxes-properly": "^1.0.0",
109 | "is-string": "^1.0.4"
110 | }
111 | },
112 | "arrify": {
113 | "version": "1.0.1",
114 | "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz",
115 | "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=",
116 | "dev": true
117 | },
118 | "asn1": {
119 | "version": "0.2.3",
120 | "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.3.tgz",
121 | "integrity": "sha1-2sh4dxPJlmhJ/IGAd36+nB3fO4Y="
122 | },
123 | "assertion-error": {
124 | "version": "1.1.0",
125 | "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz",
126 | "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==",
127 | "dev": true
128 | },
129 | "async": {
130 | "version": "0.9.2",
131 | "resolved": "https://registry.npmjs.org/async/-/async-0.9.2.tgz",
132 | "integrity": "sha1-rqdNXmHB+JlhO/ZL2mbUx48v0X0="
133 | },
134 | "at-least-node": {
135 | "version": "1.0.0",
136 | "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz",
137 | "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg=="
138 | },
139 | "balanced-match": {
140 | "version": "1.0.0",
141 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz",
142 | "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c="
143 | },
144 | "base64-js": {
145 | "version": "1.3.1",
146 | "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.3.1.tgz",
147 | "integrity": "sha512-mLQ4i2QO1ytvGWFWmcngKO//JXAQueZvwEKtjgQFM4jIK0kU+ytMfplL8j+n5mspOfjHwoAg+9yhb7BwAHm36g=="
148 | },
149 | "bcrypt-pbkdf": {
150 | "version": "1.0.2",
151 | "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz",
152 | "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=",
153 | "requires": {
154 | "tweetnacl": "^0.14.3"
155 | }
156 | },
157 | "binary-extensions": {
158 | "version": "2.0.0",
159 | "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.0.0.tgz",
160 | "integrity": "sha512-Phlt0plgpIIBOGTT/ehfFnbNlfsDEiqmzE2KRXoX1bLIlir4X/MR+zSyBEkL05ffWgnRSf/DXv+WrUAVr93/ow==",
161 | "dev": true
162 | },
163 | "bl": {
164 | "version": "1.2.2",
165 | "resolved": "https://registry.npmjs.org/bl/-/bl-1.2.2.tgz",
166 | "integrity": "sha512-e8tQYnZodmebYDWGH7KMRvtzKXaJHx3BbilrgZCfvyLUYdKpK1t5PSPmpkny/SgiTSCnjfLW7v5rlONXVFkQEA==",
167 | "requires": {
168 | "readable-stream": "^2.3.5",
169 | "safe-buffer": "^5.1.1"
170 | }
171 | },
172 | "bluebird": {
173 | "version": "3.7.2",
174 | "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz",
175 | "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg=="
176 | },
177 | "brace-expansion": {
178 | "version": "1.1.11",
179 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
180 | "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
181 | "requires": {
182 | "balanced-match": "^1.0.0",
183 | "concat-map": "0.0.1"
184 | }
185 | },
186 | "braces": {
187 | "version": "3.0.2",
188 | "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz",
189 | "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==",
190 | "dev": true,
191 | "requires": {
192 | "fill-range": "^7.0.1"
193 | }
194 | },
195 | "browser-stdout": {
196 | "version": "1.3.1",
197 | "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz",
198 | "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==",
199 | "dev": true
200 | },
201 | "buffer": {
202 | "version": "5.6.0",
203 | "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.6.0.tgz",
204 | "integrity": "sha512-/gDYp/UtU0eA1ys8bOs9J6a+E/KWIY+DZ+Q2WESNUA0jFRsJOc0SNUO6xJ5SGA1xueg3NL65W6s+NY5l9cunuw==",
205 | "requires": {
206 | "base64-js": "^1.0.2",
207 | "ieee754": "^1.1.4"
208 | }
209 | },
210 | "buffer-alloc": {
211 | "version": "1.2.0",
212 | "resolved": "https://registry.npmjs.org/buffer-alloc/-/buffer-alloc-1.2.0.tgz",
213 | "integrity": "sha512-CFsHQgjtW1UChdXgbyJGtnm+O/uLQeZdtbDo8mfUgYXCHSM1wgrVxXm6bSyrUuErEb+4sYVGCzASBRot7zyrow==",
214 | "requires": {
215 | "buffer-alloc-unsafe": "^1.1.0",
216 | "buffer-fill": "^1.0.0"
217 | }
218 | },
219 | "buffer-alloc-unsafe": {
220 | "version": "1.1.0",
221 | "resolved": "https://registry.npmjs.org/buffer-alloc-unsafe/-/buffer-alloc-unsafe-1.1.0.tgz",
222 | "integrity": "sha512-TEM2iMIEQdJ2yjPJoSIsldnleVaAk1oW3DBVUykyOLsEsFmEc9kn+SFFPz+gl54KQNxlDnAwCXosOS9Okx2xAg=="
223 | },
224 | "buffer-crc32": {
225 | "version": "0.2.13",
226 | "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz",
227 | "integrity": "sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI="
228 | },
229 | "buffer-fill": {
230 | "version": "1.0.0",
231 | "resolved": "https://registry.npmjs.org/buffer-fill/-/buffer-fill-1.0.0.tgz",
232 | "integrity": "sha1-+PeLdniYiO858gXNY39o5wISKyw="
233 | },
234 | "buffer-from": {
235 | "version": "1.1.1",
236 | "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz",
237 | "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==",
238 | "dev": true
239 | },
240 | "cacheable-request": {
241 | "version": "2.1.4",
242 | "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-2.1.4.tgz",
243 | "integrity": "sha1-DYCIAbY0KtM8kd+dC0TcCbkeXD0=",
244 | "requires": {
245 | "clone-response": "1.0.2",
246 | "get-stream": "3.0.0",
247 | "http-cache-semantics": "3.8.1",
248 | "keyv": "3.0.0",
249 | "lowercase-keys": "1.0.0",
250 | "normalize-url": "2.0.1",
251 | "responselike": "1.0.2"
252 | },
253 | "dependencies": {
254 | "get-stream": {
255 | "version": "3.0.0",
256 | "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz",
257 | "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ="
258 | },
259 | "lowercase-keys": {
260 | "version": "1.0.0",
261 | "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.0.tgz",
262 | "integrity": "sha1-TjNms55/VFfjXxMkvfb4jQv8cwY="
263 | }
264 | }
265 | },
266 | "camelcase": {
267 | "version": "4.1.0",
268 | "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz",
269 | "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=",
270 | "dev": true
271 | },
272 | "camelcase-keys": {
273 | "version": "4.2.0",
274 | "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-4.2.0.tgz",
275 | "integrity": "sha1-oqpfsa9oh1glnDLBQUJteJI7m3c=",
276 | "dev": true,
277 | "requires": {
278 | "camelcase": "^4.1.0",
279 | "map-obj": "^2.0.0",
280 | "quick-lru": "^1.0.0"
281 | }
282 | },
283 | "chai": {
284 | "version": "4.2.0",
285 | "resolved": "https://registry.npmjs.org/chai/-/chai-4.2.0.tgz",
286 | "integrity": "sha512-XQU3bhBukrOsQCuwZndwGcCVQHyZi53fQ6Ys1Fym7E4olpIqqZZhhoFJoaKVvV17lWQoXYwgWN2nF5crA8J2jw==",
287 | "dev": true,
288 | "requires": {
289 | "assertion-error": "^1.1.0",
290 | "check-error": "^1.0.2",
291 | "deep-eql": "^3.0.1",
292 | "get-func-name": "^2.0.0",
293 | "pathval": "^1.1.0",
294 | "type-detect": "^4.0.5"
295 | }
296 | },
297 | "chalk": {
298 | "version": "2.4.2",
299 | "resolved": "http://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
300 | "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
301 | "dev": true,
302 | "requires": {
303 | "ansi-styles": "^3.2.1",
304 | "escape-string-regexp": "^1.0.5",
305 | "supports-color": "^5.3.0"
306 | }
307 | },
308 | "check-error": {
309 | "version": "1.0.2",
310 | "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.2.tgz",
311 | "integrity": "sha1-V00xLt2Iu13YkS6Sht1sCu1KrII=",
312 | "dev": true
313 | },
314 | "chokidar": {
315 | "version": "3.3.1",
316 | "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.3.1.tgz",
317 | "integrity": "sha512-4QYCEWOcK3OJrxwvyyAOxFuhpvOVCYkr33LPfFNBjAD/w3sEzWsp2BUOkI4l9bHvWioAd0rc6NlHUOEaWkTeqg==",
318 | "dev": true,
319 | "requires": {
320 | "anymatch": "~3.1.1",
321 | "braces": "~3.0.2",
322 | "fsevents": "~2.1.2",
323 | "glob-parent": "~5.1.0",
324 | "is-binary-path": "~2.1.0",
325 | "is-glob": "~4.0.1",
326 | "normalize-path": "~3.0.0",
327 | "readdirp": "~3.3.0"
328 | }
329 | },
330 | "chownr": {
331 | "version": "1.1.3",
332 | "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.3.tgz",
333 | "integrity": "sha512-i70fVHhmV3DtTl6nqvZOnIjbY0Pe4kAUjwHj8z0zAdgBtYrJyYwLKCCuRBQ5ppkyL0AkN7HKRnETdmdp1zqNXw=="
334 | },
335 | "cliui": {
336 | "version": "5.0.0",
337 | "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz",
338 | "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==",
339 | "dev": true,
340 | "requires": {
341 | "string-width": "^3.1.0",
342 | "strip-ansi": "^5.2.0",
343 | "wrap-ansi": "^5.1.0"
344 | },
345 | "dependencies": {
346 | "ansi-regex": {
347 | "version": "4.1.0",
348 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz",
349 | "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==",
350 | "dev": true
351 | },
352 | "string-width": {
353 | "version": "3.1.0",
354 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz",
355 | "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==",
356 | "dev": true,
357 | "requires": {
358 | "emoji-regex": "^7.0.1",
359 | "is-fullwidth-code-point": "^2.0.0",
360 | "strip-ansi": "^5.1.0"
361 | }
362 | },
363 | "strip-ansi": {
364 | "version": "5.2.0",
365 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz",
366 | "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==",
367 | "dev": true,
368 | "requires": {
369 | "ansi-regex": "^4.1.0"
370 | }
371 | }
372 | }
373 | },
374 | "clone-response": {
375 | "version": "1.0.2",
376 | "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.2.tgz",
377 | "integrity": "sha1-0dyXOSAxTfZ/vrlCI7TuNQI56Ws=",
378 | "requires": {
379 | "mimic-response": "^1.0.0"
380 | }
381 | },
382 | "color-convert": {
383 | "version": "1.9.3",
384 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
385 | "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
386 | "dev": true,
387 | "requires": {
388 | "color-name": "1.1.3"
389 | }
390 | },
391 | "color-name": {
392 | "version": "1.1.3",
393 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
394 | "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=",
395 | "dev": true
396 | },
397 | "commander": {
398 | "version": "2.8.1",
399 | "resolved": "https://registry.npmjs.org/commander/-/commander-2.8.1.tgz",
400 | "integrity": "sha1-Br42f+v9oMMwqh4qBy09yXYkJdQ=",
401 | "requires": {
402 | "graceful-readlink": ">= 1.0.0"
403 | }
404 | },
405 | "compare-func": {
406 | "version": "1.3.2",
407 | "resolved": "https://registry.npmjs.org/compare-func/-/compare-func-1.3.2.tgz",
408 | "integrity": "sha1-md0LpFfh+bxyKxLAjsM+6rMfpkg=",
409 | "dev": true,
410 | "requires": {
411 | "array-ify": "^1.0.0",
412 | "dot-prop": "^3.0.0"
413 | }
414 | },
415 | "concat-map": {
416 | "version": "0.0.1",
417 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
418 | "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s="
419 | },
420 | "concat-stream": {
421 | "version": "2.0.0",
422 | "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-2.0.0.tgz",
423 | "integrity": "sha512-MWufYdFw53ccGjCA+Ol7XJYpAlW6/prSMzuPOTRnJGcGzuhLn4Scrz7qf6o8bROZ514ltazcIFJZevcfbo0x7A==",
424 | "dev": true,
425 | "requires": {
426 | "buffer-from": "^1.0.0",
427 | "inherits": "^2.0.3",
428 | "readable-stream": "^3.0.2",
429 | "typedarray": "^0.0.6"
430 | },
431 | "dependencies": {
432 | "readable-stream": {
433 | "version": "3.6.0",
434 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz",
435 | "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==",
436 | "dev": true,
437 | "requires": {
438 | "inherits": "^2.0.3",
439 | "string_decoder": "^1.1.1",
440 | "util-deprecate": "^1.0.1"
441 | }
442 | }
443 | }
444 | },
445 | "content-disposition": {
446 | "version": "0.5.3",
447 | "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz",
448 | "integrity": "sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==",
449 | "requires": {
450 | "safe-buffer": "5.1.2"
451 | }
452 | },
453 | "conventional-changelog": {
454 | "version": "3.1.18",
455 | "resolved": "https://registry.npmjs.org/conventional-changelog/-/conventional-changelog-3.1.18.tgz",
456 | "integrity": "sha512-aN6a3rjgV8qwAJj3sC/Lme2kvswWO7fFSGQc32gREcwIOsaiqBaO6f2p0NomFaPDnTqZ+mMZFLL3hlzvEnZ0mQ==",
457 | "dev": true,
458 | "requires": {
459 | "conventional-changelog-angular": "^5.0.6",
460 | "conventional-changelog-atom": "^2.0.3",
461 | "conventional-changelog-codemirror": "^2.0.3",
462 | "conventional-changelog-conventionalcommits": "^4.2.3",
463 | "conventional-changelog-core": "^4.1.4",
464 | "conventional-changelog-ember": "^2.0.4",
465 | "conventional-changelog-eslint": "^3.0.4",
466 | "conventional-changelog-express": "^2.0.1",
467 | "conventional-changelog-jquery": "^3.0.6",
468 | "conventional-changelog-jshint": "^2.0.3",
469 | "conventional-changelog-preset-loader": "^2.3.0"
470 | }
471 | },
472 | "conventional-changelog-angular": {
473 | "version": "5.0.6",
474 | "resolved": "http://registry.npmjs.org/conventional-changelog-angular/-/conventional-changelog-angular-5.0.6.tgz",
475 | "integrity": "sha512-QDEmLa+7qdhVIv8sFZfVxU1VSyVvnXPsxq8Vam49mKUcO1Z8VTLEJk9uI21uiJUsnmm0I4Hrsdc9TgkOQo9WSA==",
476 | "dev": true,
477 | "requires": {
478 | "compare-func": "^1.3.1",
479 | "q": "^1.5.1"
480 | }
481 | },
482 | "conventional-changelog-atom": {
483 | "version": "2.0.3",
484 | "resolved": "http://registry.npmjs.org/conventional-changelog-atom/-/conventional-changelog-atom-2.0.3.tgz",
485 | "integrity": "sha512-szZe2ut97qNO6vCCMkm1I/tWu6ol4Rr8a9Lx0y/VlpDnpY0PNp+oGpFgU55lplhx+I3Lro9Iv4/gRj0knfgjzg==",
486 | "dev": true,
487 | "requires": {
488 | "q": "^1.5.1"
489 | }
490 | },
491 | "conventional-changelog-codemirror": {
492 | "version": "2.0.3",
493 | "resolved": "http://registry.npmjs.org/conventional-changelog-codemirror/-/conventional-changelog-codemirror-2.0.3.tgz",
494 | "integrity": "sha512-t2afackdgFV2yBdHhWPqrKbpaQeVnz2hSJKdWqjasPo5EpIB6TBL0er3cOP1mnGQmuzk9JSvimNSuqjWGDtU5Q==",
495 | "dev": true,
496 | "requires": {
497 | "q": "^1.5.1"
498 | }
499 | },
500 | "conventional-changelog-config-spec": {
501 | "version": "2.1.0",
502 | "resolved": "https://registry.npmjs.org/conventional-changelog-config-spec/-/conventional-changelog-config-spec-2.1.0.tgz",
503 | "integrity": "sha512-IpVePh16EbbB02V+UA+HQnnPIohgXvJRxHcS5+Uwk4AT5LjzCZJm5sp/yqs5C6KZJ1jMsV4paEV13BN1pvDuxQ==",
504 | "dev": true
505 | },
506 | "conventional-changelog-conventionalcommits": {
507 | "version": "4.2.3",
508 | "resolved": "https://registry.npmjs.org/conventional-changelog-conventionalcommits/-/conventional-changelog-conventionalcommits-4.2.3.tgz",
509 | "integrity": "sha512-atGa+R4vvEhb8N/8v3IoW59gCBJeeFiX6uIbPu876ENAmkMwsenyn0R21kdDHJFLQdy6zW4J6b4xN8KI3b9oww==",
510 | "dev": true,
511 | "requires": {
512 | "compare-func": "^1.3.1",
513 | "lodash": "^4.17.15",
514 | "q": "^1.5.1"
515 | }
516 | },
517 | "conventional-changelog-core": {
518 | "version": "4.1.4",
519 | "resolved": "https://registry.npmjs.org/conventional-changelog-core/-/conventional-changelog-core-4.1.4.tgz",
520 | "integrity": "sha512-LO58ZbEpp1Ul+y/vOI8rJRsWkovsYkCFbOCVgi6UnVfU8WC0F8K8VQQwaBZWWUpb6JvEiN4GBR5baRP2txZ+Vg==",
521 | "dev": true,
522 | "requires": {
523 | "add-stream": "^1.0.0",
524 | "conventional-changelog-writer": "^4.0.11",
525 | "conventional-commits-parser": "^3.0.8",
526 | "dateformat": "^3.0.0",
527 | "get-pkg-repo": "^1.0.0",
528 | "git-raw-commits": "2.0.0",
529 | "git-remote-origin-url": "^2.0.0",
530 | "git-semver-tags": "^3.0.1",
531 | "lodash": "^4.17.15",
532 | "normalize-package-data": "^2.3.5",
533 | "q": "^1.5.1",
534 | "read-pkg": "^3.0.0",
535 | "read-pkg-up": "^3.0.0",
536 | "through2": "^3.0.0"
537 | }
538 | },
539 | "conventional-changelog-ember": {
540 | "version": "2.0.4",
541 | "resolved": "https://registry.npmjs.org/conventional-changelog-ember/-/conventional-changelog-ember-2.0.4.tgz",
542 | "integrity": "sha512-q1u73sO9uCnxN4TSw8xu6MRU8Y1h9kpwtcdJuNRwu/LSKI1IE/iuNSH5eQ6aLlQ3HTyrIpTfUuVybW4W0F17rA==",
543 | "dev": true,
544 | "requires": {
545 | "q": "^1.5.1"
546 | }
547 | },
548 | "conventional-changelog-eslint": {
549 | "version": "3.0.4",
550 | "resolved": "http://registry.npmjs.org/conventional-changelog-eslint/-/conventional-changelog-eslint-3.0.4.tgz",
551 | "integrity": "sha512-CPwTUENzhLGl3auunrJxiIEWncAGaby7gOFCdj2gslIuOFJ0KPJVOUhRz4Da/I53sdo/7UncUJkiLg94jEsjxg==",
552 | "dev": true,
553 | "requires": {
554 | "q": "^1.5.1"
555 | }
556 | },
557 | "conventional-changelog-express": {
558 | "version": "2.0.1",
559 | "resolved": "http://registry.npmjs.org/conventional-changelog-express/-/conventional-changelog-express-2.0.1.tgz",
560 | "integrity": "sha512-G6uCuCaQhLxdb4eEfAIHpcfcJ2+ao3hJkbLrw/jSK/eROeNfnxCJasaWdDAfFkxsbpzvQT4W01iSynU3OoPLIw==",
561 | "dev": true,
562 | "requires": {
563 | "q": "^1.5.1"
564 | }
565 | },
566 | "conventional-changelog-jquery": {
567 | "version": "3.0.6",
568 | "resolved": "http://registry.npmjs.org/conventional-changelog-jquery/-/conventional-changelog-jquery-3.0.6.tgz",
569 | "integrity": "sha512-gHAABCXUNA/HjnZEm+vxAfFPJkgtrZvCDIlCKfdPVXtCIo/Q0lN5VKpx8aR5p8KdVRQFF3OuTlvv5kv6iPuRqA==",
570 | "dev": true,
571 | "requires": {
572 | "q": "^1.5.1"
573 | }
574 | },
575 | "conventional-changelog-jshint": {
576 | "version": "2.0.3",
577 | "resolved": "http://registry.npmjs.org/conventional-changelog-jshint/-/conventional-changelog-jshint-2.0.3.tgz",
578 | "integrity": "sha512-Pc2PnMPcez634ckzr4EOWviwRSpZcURaK7bjyD9oK6N5fsC/a+3G7LW5m/JpcHPhA9ZxsfIbm7uqZ3ZDGsQ/sw==",
579 | "dev": true,
580 | "requires": {
581 | "compare-func": "^1.3.1",
582 | "q": "^1.5.1"
583 | }
584 | },
585 | "conventional-changelog-preset-loader": {
586 | "version": "2.3.0",
587 | "resolved": "http://registry.npmjs.org/conventional-changelog-preset-loader/-/conventional-changelog-preset-loader-2.3.0.tgz",
588 | "integrity": "sha512-/rHb32J2EJnEXeK4NpDgMaAVTFZS3o1ExmjKMtYVgIC4MQn0vkNSbYpdGRotkfGGRWiqk3Ri3FBkiZGbAfIfOQ==",
589 | "dev": true
590 | },
591 | "conventional-changelog-writer": {
592 | "version": "4.0.11",
593 | "resolved": "http://registry.npmjs.org/conventional-changelog-writer/-/conventional-changelog-writer-4.0.11.tgz",
594 | "integrity": "sha512-g81GQOR392I+57Cw3IyP1f+f42ME6aEkbR+L7v1FBBWolB0xkjKTeCWVguzRrp6UiT1O6gBpJbEy2eq7AnV1rw==",
595 | "dev": true,
596 | "requires": {
597 | "compare-func": "^1.3.1",
598 | "conventional-commits-filter": "^2.0.2",
599 | "dateformat": "^3.0.0",
600 | "handlebars": "^4.4.0",
601 | "json-stringify-safe": "^5.0.1",
602 | "lodash": "^4.17.15",
603 | "meow": "^5.0.0",
604 | "semver": "^6.0.0",
605 | "split": "^1.0.0",
606 | "through2": "^3.0.0"
607 | },
608 | "dependencies": {
609 | "semver": {
610 | "version": "6.3.0",
611 | "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
612 | "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
613 | "dev": true
614 | }
615 | }
616 | },
617 | "conventional-commits-filter": {
618 | "version": "2.0.2",
619 | "resolved": "http://registry.npmjs.org/conventional-commits-filter/-/conventional-commits-filter-2.0.2.tgz",
620 | "integrity": "sha512-WpGKsMeXfs21m1zIw4s9H5sys2+9JccTzpN6toXtxhpw2VNF2JUXwIakthKBy+LN4DvJm+TzWhxOMWOs1OFCFQ==",
621 | "dev": true,
622 | "requires": {
623 | "lodash.ismatch": "^4.4.0",
624 | "modify-values": "^1.0.0"
625 | }
626 | },
627 | "conventional-commits-parser": {
628 | "version": "3.0.8",
629 | "resolved": "http://registry.npmjs.org/conventional-commits-parser/-/conventional-commits-parser-3.0.8.tgz",
630 | "integrity": "sha512-YcBSGkZbYp7d+Cr3NWUeXbPDFUN6g3SaSIzOybi8bjHL5IJ5225OSCxJJ4LgziyEJ7AaJtE9L2/EU6H7Nt/DDQ==",
631 | "dev": true,
632 | "requires": {
633 | "JSONStream": "^1.0.4",
634 | "is-text-path": "^1.0.1",
635 | "lodash": "^4.17.15",
636 | "meow": "^5.0.0",
637 | "split2": "^2.0.0",
638 | "through2": "^3.0.0",
639 | "trim-off-newlines": "^1.0.0"
640 | }
641 | },
642 | "conventional-recommended-bump": {
643 | "version": "6.0.5",
644 | "resolved": "https://registry.npmjs.org/conventional-recommended-bump/-/conventional-recommended-bump-6.0.5.tgz",
645 | "integrity": "sha512-srkferrB4kACPEbKYltZwX1CQZAEqbQkabKN444mavLRVMetzwJFJf23/+pwvtMsWbd+cc4HaleV1nHke0f8Rw==",
646 | "dev": true,
647 | "requires": {
648 | "concat-stream": "^2.0.0",
649 | "conventional-changelog-preset-loader": "^2.3.0",
650 | "conventional-commits-filter": "^2.0.2",
651 | "conventional-commits-parser": "^3.0.8",
652 | "git-raw-commits": "2.0.0",
653 | "git-semver-tags": "^3.0.1",
654 | "meow": "^5.0.0",
655 | "q": "^1.5.1"
656 | }
657 | },
658 | "core-util-is": {
659 | "version": "1.0.2",
660 | "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz",
661 | "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac="
662 | },
663 | "currently-unhandled": {
664 | "version": "0.4.1",
665 | "resolved": "https://registry.npmjs.org/currently-unhandled/-/currently-unhandled-0.4.1.tgz",
666 | "integrity": "sha1-mI3zP+qxke95mmE2nddsF635V+o=",
667 | "dev": true,
668 | "requires": {
669 | "array-find-index": "^1.0.1"
670 | }
671 | },
672 | "dargs": {
673 | "version": "4.1.0",
674 | "resolved": "https://registry.npmjs.org/dargs/-/dargs-4.1.0.tgz",
675 | "integrity": "sha1-A6nbtLXC8Tm/FK5T8LiipqhvThc=",
676 | "dev": true,
677 | "requires": {
678 | "number-is-nan": "^1.0.0"
679 | }
680 | },
681 | "dateformat": {
682 | "version": "3.0.3",
683 | "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-3.0.3.tgz",
684 | "integrity": "sha512-jyCETtSl3VMZMWeRo7iY1FL19ges1t55hMo5yaam4Jrsm5EPL89UQkoQRyiI+Yf4k8r2ZpdngkV8hr1lIdjb3Q==",
685 | "dev": true
686 | },
687 | "debug": {
688 | "version": "3.2.6",
689 | "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz",
690 | "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==",
691 | "dev": true,
692 | "requires": {
693 | "ms": "^2.1.1"
694 | }
695 | },
696 | "decamelize": {
697 | "version": "1.2.0",
698 | "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz",
699 | "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA="
700 | },
701 | "decamelize-keys": {
702 | "version": "1.1.0",
703 | "resolved": "https://registry.npmjs.org/decamelize-keys/-/decamelize-keys-1.1.0.tgz",
704 | "integrity": "sha1-0XGoeTMlKAfrPLYdwcFEXQeN8tk=",
705 | "dev": true,
706 | "requires": {
707 | "decamelize": "^1.1.0",
708 | "map-obj": "^1.0.0"
709 | },
710 | "dependencies": {
711 | "map-obj": {
712 | "version": "1.0.1",
713 | "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz",
714 | "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=",
715 | "dev": true
716 | }
717 | }
718 | },
719 | "decode-uri-component": {
720 | "version": "0.2.0",
721 | "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz",
722 | "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU="
723 | },
724 | "decompress": {
725 | "version": "4.2.1",
726 | "resolved": "https://registry.npmjs.org/decompress/-/decompress-4.2.1.tgz",
727 | "integrity": "sha512-e48kc2IjU+2Zw8cTb6VZcJQ3lgVbS4uuB1TfCHbiZIP/haNXm+SVyhu+87jts5/3ROpd82GSVCoNs/z8l4ZOaQ==",
728 | "requires": {
729 | "decompress-tar": "^4.0.0",
730 | "decompress-tarbz2": "^4.0.0",
731 | "decompress-targz": "^4.0.0",
732 | "decompress-unzip": "^4.0.1",
733 | "graceful-fs": "^4.1.10",
734 | "make-dir": "^1.0.0",
735 | "pify": "^2.3.0",
736 | "strip-dirs": "^2.0.0"
737 | },
738 | "dependencies": {
739 | "make-dir": {
740 | "version": "1.3.0",
741 | "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.3.0.tgz",
742 | "integrity": "sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==",
743 | "requires": {
744 | "pify": "^3.0.0"
745 | },
746 | "dependencies": {
747 | "pify": {
748 | "version": "3.0.0",
749 | "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz",
750 | "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY="
751 | }
752 | }
753 | },
754 | "pify": {
755 | "version": "2.3.0",
756 | "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz",
757 | "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw="
758 | }
759 | }
760 | },
761 | "decompress-response": {
762 | "version": "3.3.0",
763 | "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-3.3.0.tgz",
764 | "integrity": "sha1-gKTdMjdIOEv6JICDYirt7Jgq3/M=",
765 | "requires": {
766 | "mimic-response": "^1.0.0"
767 | }
768 | },
769 | "decompress-tar": {
770 | "version": "4.1.1",
771 | "resolved": "https://registry.npmjs.org/decompress-tar/-/decompress-tar-4.1.1.tgz",
772 | "integrity": "sha512-JdJMaCrGpB5fESVyxwpCx4Jdj2AagLmv3y58Qy4GE6HMVjWz1FeVQk1Ct4Kye7PftcdOo/7U7UKzYBJgqnGeUQ==",
773 | "requires": {
774 | "file-type": "^5.2.0",
775 | "is-stream": "^1.1.0",
776 | "tar-stream": "^1.5.2"
777 | },
778 | "dependencies": {
779 | "file-type": {
780 | "version": "5.2.0",
781 | "resolved": "https://registry.npmjs.org/file-type/-/file-type-5.2.0.tgz",
782 | "integrity": "sha1-LdvqfHP/42No365J3DOMBYwritY="
783 | }
784 | }
785 | },
786 | "decompress-tarbz2": {
787 | "version": "4.1.1",
788 | "resolved": "https://registry.npmjs.org/decompress-tarbz2/-/decompress-tarbz2-4.1.1.tgz",
789 | "integrity": "sha512-s88xLzf1r81ICXLAVQVzaN6ZmX4A6U4z2nMbOwobxkLoIIfjVMBg7TeguTUXkKeXni795B6y5rnvDw7rxhAq9A==",
790 | "requires": {
791 | "decompress-tar": "^4.1.0",
792 | "file-type": "^6.1.0",
793 | "is-stream": "^1.1.0",
794 | "seek-bzip": "^1.0.5",
795 | "unbzip2-stream": "^1.0.9"
796 | },
797 | "dependencies": {
798 | "file-type": {
799 | "version": "6.2.0",
800 | "resolved": "https://registry.npmjs.org/file-type/-/file-type-6.2.0.tgz",
801 | "integrity": "sha512-YPcTBDV+2Tm0VqjybVd32MHdlEGAtuxS3VAYsumFokDSMG+ROT5wawGlnHDoz7bfMcMDt9hxuXvXwoKUx2fkOg=="
802 | }
803 | }
804 | },
805 | "decompress-targz": {
806 | "version": "4.1.1",
807 | "resolved": "https://registry.npmjs.org/decompress-targz/-/decompress-targz-4.1.1.tgz",
808 | "integrity": "sha512-4z81Znfr6chWnRDNfFNqLwPvm4db3WuZkqV+UgXQzSngG3CEKdBkw5jrv3axjjL96glyiiKjsxJG3X6WBZwX3w==",
809 | "requires": {
810 | "decompress-tar": "^4.1.1",
811 | "file-type": "^5.2.0",
812 | "is-stream": "^1.1.0"
813 | },
814 | "dependencies": {
815 | "file-type": {
816 | "version": "5.2.0",
817 | "resolved": "https://registry.npmjs.org/file-type/-/file-type-5.2.0.tgz",
818 | "integrity": "sha1-LdvqfHP/42No365J3DOMBYwritY="
819 | }
820 | }
821 | },
822 | "decompress-unzip": {
823 | "version": "4.0.1",
824 | "resolved": "https://registry.npmjs.org/decompress-unzip/-/decompress-unzip-4.0.1.tgz",
825 | "integrity": "sha1-3qrM39FK6vhVePczroIQ+bSEj2k=",
826 | "requires": {
827 | "file-type": "^3.8.0",
828 | "get-stream": "^2.2.0",
829 | "pify": "^2.3.0",
830 | "yauzl": "^2.4.2"
831 | },
832 | "dependencies": {
833 | "file-type": {
834 | "version": "3.9.0",
835 | "resolved": "https://registry.npmjs.org/file-type/-/file-type-3.9.0.tgz",
836 | "integrity": "sha1-JXoHg4TR24CHvESdEH1SpSZyuek="
837 | },
838 | "get-stream": {
839 | "version": "2.3.1",
840 | "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-2.3.1.tgz",
841 | "integrity": "sha1-Xzj5PzRgCWZu4BUKBUFn+Rvdld4=",
842 | "requires": {
843 | "object-assign": "^4.0.1",
844 | "pinkie-promise": "^2.0.0"
845 | }
846 | },
847 | "pify": {
848 | "version": "2.3.0",
849 | "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz",
850 | "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw="
851 | }
852 | }
853 | },
854 | "deep-eql": {
855 | "version": "3.0.1",
856 | "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-3.0.1.tgz",
857 | "integrity": "sha512-+QeIQyN5ZuO+3Uk5DYh6/1eKO0m0YmJFGNmFHGACpf1ClL1nmlV/p4gNgbl2pJGxgXb4faqo6UE+M5ACEMyVcw==",
858 | "dev": true,
859 | "requires": {
860 | "type-detect": "^4.0.0"
861 | }
862 | },
863 | "define-properties": {
864 | "version": "1.1.3",
865 | "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz",
866 | "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==",
867 | "dev": true,
868 | "requires": {
869 | "object-keys": "^1.0.12"
870 | }
871 | },
872 | "detect-indent": {
873 | "version": "6.0.0",
874 | "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-6.0.0.tgz",
875 | "integrity": "sha512-oSyFlqaTHCItVRGK5RmrmjB+CmaMOW7IaNA/kdxqhoa6d17j/5ce9O9eWXmV/KEdRwqpQA+Vqe8a8Bsybu4YnA==",
876 | "dev": true
877 | },
878 | "detect-newline": {
879 | "version": "3.1.0",
880 | "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz",
881 | "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==",
882 | "dev": true
883 | },
884 | "diff": {
885 | "version": "4.0.2",
886 | "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz",
887 | "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==",
888 | "dev": true
889 | },
890 | "dot-prop": {
891 | "version": "3.0.0",
892 | "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-3.0.0.tgz",
893 | "integrity": "sha1-G3CK8JSknJoOfbyteQq6U52sEXc=",
894 | "dev": true,
895 | "requires": {
896 | "is-obj": "^1.0.0"
897 | }
898 | },
899 | "dotgitignore": {
900 | "version": "2.1.0",
901 | "resolved": "https://registry.npmjs.org/dotgitignore/-/dotgitignore-2.1.0.tgz",
902 | "integrity": "sha512-sCm11ak2oY6DglEPpCB8TixLjWAxd3kJTs6UIcSasNYxXdFPV+YKlye92c8H4kKFqV5qYMIh7d+cYecEg0dIkA==",
903 | "dev": true,
904 | "requires": {
905 | "find-up": "^3.0.0",
906 | "minimatch": "^3.0.4"
907 | }
908 | },
909 | "download": {
910 | "version": "8.0.0",
911 | "resolved": "https://registry.npmjs.org/download/-/download-8.0.0.tgz",
912 | "integrity": "sha512-ASRY5QhDk7FK+XrQtQyvhpDKanLluEEQtWl/J7Lxuf/b+i8RYh997QeXvL85xitrmRKVlx9c7eTrcRdq2GS4eA==",
913 | "requires": {
914 | "archive-type": "^4.0.0",
915 | "content-disposition": "^0.5.2",
916 | "decompress": "^4.2.1",
917 | "ext-name": "^5.0.0",
918 | "file-type": "^11.1.0",
919 | "filenamify": "^3.0.0",
920 | "get-stream": "^4.1.0",
921 | "got": "^8.3.1",
922 | "make-dir": "^2.1.0",
923 | "p-event": "^2.1.0",
924 | "pify": "^4.0.1"
925 | },
926 | "dependencies": {
927 | "pify": {
928 | "version": "4.0.1",
929 | "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz",
930 | "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g=="
931 | }
932 | }
933 | },
934 | "duplexer3": {
935 | "version": "0.1.4",
936 | "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.4.tgz",
937 | "integrity": "sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI="
938 | },
939 | "emoji-regex": {
940 | "version": "7.0.3",
941 | "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz",
942 | "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==",
943 | "dev": true
944 | },
945 | "end-of-stream": {
946 | "version": "1.4.4",
947 | "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz",
948 | "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==",
949 | "requires": {
950 | "once": "^1.4.0"
951 | }
952 | },
953 | "error-ex": {
954 | "version": "1.3.2",
955 | "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz",
956 | "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==",
957 | "dev": true,
958 | "requires": {
959 | "is-arrayish": "^0.2.1"
960 | }
961 | },
962 | "es-abstract": {
963 | "version": "1.17.5",
964 | "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.5.tgz",
965 | "integrity": "sha512-BR9auzDbySxOcfog0tLECW8l28eRGpDpU3Dm3Hp4q/N+VtLTmyj4EUN088XZWQDW/hzj6sYRDXeOFsaAODKvpg==",
966 | "dev": true,
967 | "requires": {
968 | "es-to-primitive": "^1.2.1",
969 | "function-bind": "^1.1.1",
970 | "has": "^1.0.3",
971 | "has-symbols": "^1.0.1",
972 | "is-callable": "^1.1.5",
973 | "is-regex": "^1.0.5",
974 | "object-inspect": "^1.7.0",
975 | "object-keys": "^1.1.1",
976 | "object.assign": "^4.1.0",
977 | "string.prototype.trimleft": "^2.1.1",
978 | "string.prototype.trimright": "^2.1.1"
979 | }
980 | },
981 | "es-array-method-boxes-properly": {
982 | "version": "1.0.0",
983 | "resolved": "https://registry.npmjs.org/es-array-method-boxes-properly/-/es-array-method-boxes-properly-1.0.0.tgz",
984 | "integrity": "sha512-wd6JXUmyHmt8T5a2xreUwKcGPq6f1f+WwIJkijUqiGcJz1qqnZgP6XIK+QyIWU5lT7imeNxUll48bziG+TSYcA==",
985 | "dev": true
986 | },
987 | "es-get-iterator": {
988 | "version": "1.1.0",
989 | "resolved": "https://registry.npmjs.org/es-get-iterator/-/es-get-iterator-1.1.0.tgz",
990 | "integrity": "sha512-UfrmHuWQlNMTs35e1ypnvikg6jCz3SK8v8ImvmDsh36fCVUR1MqoFDiyn0/k52C8NqO3YsO8Oe0azeesNuqSsQ==",
991 | "dev": true,
992 | "requires": {
993 | "es-abstract": "^1.17.4",
994 | "has-symbols": "^1.0.1",
995 | "is-arguments": "^1.0.4",
996 | "is-map": "^2.0.1",
997 | "is-set": "^2.0.1",
998 | "is-string": "^1.0.5",
999 | "isarray": "^2.0.5"
1000 | },
1001 | "dependencies": {
1002 | "isarray": {
1003 | "version": "2.0.5",
1004 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz",
1005 | "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==",
1006 | "dev": true
1007 | }
1008 | }
1009 | },
1010 | "es-to-primitive": {
1011 | "version": "1.2.1",
1012 | "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz",
1013 | "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==",
1014 | "dev": true,
1015 | "requires": {
1016 | "is-callable": "^1.1.4",
1017 | "is-date-object": "^1.0.1",
1018 | "is-symbol": "^1.0.2"
1019 | }
1020 | },
1021 | "escape-string-regexp": {
1022 | "version": "1.0.5",
1023 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
1024 | "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ="
1025 | },
1026 | "esprima": {
1027 | "version": "4.0.1",
1028 | "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz",
1029 | "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==",
1030 | "dev": true
1031 | },
1032 | "ext-list": {
1033 | "version": "2.2.2",
1034 | "resolved": "https://registry.npmjs.org/ext-list/-/ext-list-2.2.2.tgz",
1035 | "integrity": "sha512-u+SQgsubraE6zItfVA0tBuCBhfU9ogSRnsvygI7wht9TS510oLkBRXBsqopeUG/GBOIQyKZO9wjTqIu/sf5zFA==",
1036 | "requires": {
1037 | "mime-db": "^1.28.0"
1038 | }
1039 | },
1040 | "ext-name": {
1041 | "version": "5.0.0",
1042 | "resolved": "https://registry.npmjs.org/ext-name/-/ext-name-5.0.0.tgz",
1043 | "integrity": "sha512-yblEwXAbGv1VQDmow7s38W77hzAgJAO50ztBLMcUyUBfxv1HC+LGwtiEN+Co6LtlqT/5uwVOxsD4TNIilWhwdQ==",
1044 | "requires": {
1045 | "ext-list": "^2.0.0",
1046 | "sort-keys-length": "^1.0.0"
1047 | }
1048 | },
1049 | "fd-slicer": {
1050 | "version": "1.1.0",
1051 | "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz",
1052 | "integrity": "sha1-JcfInLH5B3+IkbvmHY85Dq4lbx4=",
1053 | "requires": {
1054 | "pend": "~1.2.0"
1055 | }
1056 | },
1057 | "figures": {
1058 | "version": "3.1.0",
1059 | "resolved": "https://registry.npmjs.org/figures/-/figures-3.1.0.tgz",
1060 | "integrity": "sha512-ravh8VRXqHuMvZt/d8GblBeqDMkdJMBdv/2KntFH+ra5MXkO7nxNKpzQ3n6QD/2da1kH0aWmNISdvhM7gl2gVg==",
1061 | "dev": true,
1062 | "requires": {
1063 | "escape-string-regexp": "^1.0.5"
1064 | }
1065 | },
1066 | "file-type": {
1067 | "version": "11.1.0",
1068 | "resolved": "https://registry.npmjs.org/file-type/-/file-type-11.1.0.tgz",
1069 | "integrity": "sha512-rM0UO7Qm9K7TWTtA6AShI/t7H5BPjDeGVDaNyg9BjHAj3PysKy7+8C8D137R88jnR3rFJZQB/tFgydl5sN5m7g=="
1070 | },
1071 | "filename-reserved-regex": {
1072 | "version": "2.0.0",
1073 | "resolved": "https://registry.npmjs.org/filename-reserved-regex/-/filename-reserved-regex-2.0.0.tgz",
1074 | "integrity": "sha1-q/c9+rc10EVECr/qLZHzieu/oik="
1075 | },
1076 | "filenamify": {
1077 | "version": "3.0.0",
1078 | "resolved": "https://registry.npmjs.org/filenamify/-/filenamify-3.0.0.tgz",
1079 | "integrity": "sha512-5EFZ//MsvJgXjBAFJ+Bh2YaCTRF/VP1YOmGrgt+KJ4SFRLjI87EIdwLLuT6wQX0I4F9W41xutobzczjsOKlI/g==",
1080 | "requires": {
1081 | "filename-reserved-regex": "^2.0.0",
1082 | "strip-outer": "^1.0.0",
1083 | "trim-repeated": "^1.0.0"
1084 | }
1085 | },
1086 | "fill-range": {
1087 | "version": "7.0.1",
1088 | "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz",
1089 | "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==",
1090 | "dev": true,
1091 | "requires": {
1092 | "to-regex-range": "^5.0.1"
1093 | }
1094 | },
1095 | "find-up": {
1096 | "version": "3.0.0",
1097 | "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz",
1098 | "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==",
1099 | "dev": true,
1100 | "requires": {
1101 | "locate-path": "^3.0.0"
1102 | }
1103 | },
1104 | "flat": {
1105 | "version": "4.1.0",
1106 | "resolved": "https://registry.npmjs.org/flat/-/flat-4.1.0.tgz",
1107 | "integrity": "sha512-Px/TiLIznH7gEDlPXcUD4KnBusa6kR6ayRUVcnEAbreRIuhkqow/mun59BuRXwoYk7ZQOLW1ZM05ilIvK38hFw==",
1108 | "dev": true,
1109 | "requires": {
1110 | "is-buffer": "~2.0.3"
1111 | }
1112 | },
1113 | "from2": {
1114 | "version": "2.3.0",
1115 | "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz",
1116 | "integrity": "sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8=",
1117 | "requires": {
1118 | "inherits": "^2.0.1",
1119 | "readable-stream": "^2.0.0"
1120 | }
1121 | },
1122 | "fs-access": {
1123 | "version": "1.0.1",
1124 | "resolved": "http://registry.npmjs.org/fs-access/-/fs-access-1.0.1.tgz",
1125 | "integrity": "sha1-1qh/JiJxzv6+wwxVNAf7mV2od3o=",
1126 | "dev": true,
1127 | "requires": {
1128 | "null-check": "^1.0.0"
1129 | }
1130 | },
1131 | "fs-constants": {
1132 | "version": "1.0.0",
1133 | "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz",
1134 | "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow=="
1135 | },
1136 | "fs-extra": {
1137 | "version": "9.0.1",
1138 | "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.0.1.tgz",
1139 | "integrity": "sha512-h2iAoN838FqAFJY2/qVpzFXy+EBxfVE220PalAqQLDVsFOHLJrZvut5puAbCdNv6WJk+B8ihI+k0c7JK5erwqQ==",
1140 | "requires": {
1141 | "at-least-node": "^1.0.0",
1142 | "graceful-fs": "^4.2.0",
1143 | "jsonfile": "^6.0.1",
1144 | "universalify": "^1.0.0"
1145 | },
1146 | "dependencies": {
1147 | "graceful-fs": {
1148 | "version": "4.2.4",
1149 | "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz",
1150 | "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw=="
1151 | }
1152 | }
1153 | },
1154 | "fs-minipass": {
1155 | "version": "2.0.0",
1156 | "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.0.0.tgz",
1157 | "integrity": "sha512-40Qz+LFXmd9tzYVnnBmZvFfvAADfUA14TXPK1s7IfElJTIZ97rA8w4Kin7Wt5JBrC3ShnnFJO/5vPjPEeJIq9A==",
1158 | "requires": {
1159 | "minipass": "^3.0.0"
1160 | }
1161 | },
1162 | "fs.realpath": {
1163 | "version": "1.0.0",
1164 | "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
1165 | "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8="
1166 | },
1167 | "fsevents": {
1168 | "version": "2.1.3",
1169 | "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.3.tgz",
1170 | "integrity": "sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ==",
1171 | "dev": true,
1172 | "optional": true
1173 | },
1174 | "function-bind": {
1175 | "version": "1.1.1",
1176 | "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz",
1177 | "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==",
1178 | "dev": true
1179 | },
1180 | "get-caller-file": {
1181 | "version": "2.0.5",
1182 | "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz",
1183 | "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg=="
1184 | },
1185 | "get-func-name": {
1186 | "version": "2.0.0",
1187 | "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.0.tgz",
1188 | "integrity": "sha1-6td0q+5y4gQJQzoGY2YCPdaIekE=",
1189 | "dev": true
1190 | },
1191 | "get-pkg-repo": {
1192 | "version": "1.4.0",
1193 | "resolved": "https://registry.npmjs.org/get-pkg-repo/-/get-pkg-repo-1.4.0.tgz",
1194 | "integrity": "sha1-xztInAbYDMVTbCyFP54FIyBWly0=",
1195 | "dev": true,
1196 | "requires": {
1197 | "hosted-git-info": "^2.1.4",
1198 | "meow": "^3.3.0",
1199 | "normalize-package-data": "^2.3.0",
1200 | "parse-github-repo-url": "^1.3.0",
1201 | "through2": "^2.0.0"
1202 | },
1203 | "dependencies": {
1204 | "camelcase": {
1205 | "version": "2.1.1",
1206 | "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz",
1207 | "integrity": "sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8=",
1208 | "dev": true
1209 | },
1210 | "camelcase-keys": {
1211 | "version": "2.1.0",
1212 | "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-2.1.0.tgz",
1213 | "integrity": "sha1-MIvur/3ygRkFHvodkyITyRuPkuc=",
1214 | "dev": true,
1215 | "requires": {
1216 | "camelcase": "^2.0.0",
1217 | "map-obj": "^1.0.0"
1218 | }
1219 | },
1220 | "find-up": {
1221 | "version": "1.1.2",
1222 | "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz",
1223 | "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=",
1224 | "dev": true,
1225 | "requires": {
1226 | "path-exists": "^2.0.0",
1227 | "pinkie-promise": "^2.0.0"
1228 | }
1229 | },
1230 | "indent-string": {
1231 | "version": "2.1.0",
1232 | "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-2.1.0.tgz",
1233 | "integrity": "sha1-ji1INIdCEhtKghi3oTfppSBJ3IA=",
1234 | "dev": true,
1235 | "requires": {
1236 | "repeating": "^2.0.0"
1237 | }
1238 | },
1239 | "load-json-file": {
1240 | "version": "1.1.0",
1241 | "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz",
1242 | "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=",
1243 | "dev": true,
1244 | "requires": {
1245 | "graceful-fs": "^4.1.2",
1246 | "parse-json": "^2.2.0",
1247 | "pify": "^2.0.0",
1248 | "pinkie-promise": "^2.0.0",
1249 | "strip-bom": "^2.0.0"
1250 | }
1251 | },
1252 | "map-obj": {
1253 | "version": "1.0.1",
1254 | "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz",
1255 | "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=",
1256 | "dev": true
1257 | },
1258 | "meow": {
1259 | "version": "3.7.0",
1260 | "resolved": "https://registry.npmjs.org/meow/-/meow-3.7.0.tgz",
1261 | "integrity": "sha1-cstmi0JSKCkKu/qFaJJYcwioAfs=",
1262 | "dev": true,
1263 | "requires": {
1264 | "camelcase-keys": "^2.0.0",
1265 | "decamelize": "^1.1.2",
1266 | "loud-rejection": "^1.0.0",
1267 | "map-obj": "^1.0.1",
1268 | "minimist": "^1.1.3",
1269 | "normalize-package-data": "^2.3.4",
1270 | "object-assign": "^4.0.1",
1271 | "read-pkg-up": "^1.0.1",
1272 | "redent": "^1.0.0",
1273 | "trim-newlines": "^1.0.0"
1274 | }
1275 | },
1276 | "minimist": {
1277 | "version": "1.2.5",
1278 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz",
1279 | "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==",
1280 | "dev": true
1281 | },
1282 | "parse-json": {
1283 | "version": "2.2.0",
1284 | "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz",
1285 | "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=",
1286 | "dev": true,
1287 | "requires": {
1288 | "error-ex": "^1.2.0"
1289 | }
1290 | },
1291 | "path-exists": {
1292 | "version": "2.1.0",
1293 | "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz",
1294 | "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=",
1295 | "dev": true,
1296 | "requires": {
1297 | "pinkie-promise": "^2.0.0"
1298 | }
1299 | },
1300 | "path-type": {
1301 | "version": "1.1.0",
1302 | "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz",
1303 | "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=",
1304 | "dev": true,
1305 | "requires": {
1306 | "graceful-fs": "^4.1.2",
1307 | "pify": "^2.0.0",
1308 | "pinkie-promise": "^2.0.0"
1309 | }
1310 | },
1311 | "pify": {
1312 | "version": "2.3.0",
1313 | "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz",
1314 | "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=",
1315 | "dev": true
1316 | },
1317 | "read-pkg": {
1318 | "version": "1.1.0",
1319 | "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz",
1320 | "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=",
1321 | "dev": true,
1322 | "requires": {
1323 | "load-json-file": "^1.0.0",
1324 | "normalize-package-data": "^2.3.2",
1325 | "path-type": "^1.0.0"
1326 | }
1327 | },
1328 | "read-pkg-up": {
1329 | "version": "1.0.1",
1330 | "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz",
1331 | "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=",
1332 | "dev": true,
1333 | "requires": {
1334 | "find-up": "^1.0.0",
1335 | "read-pkg": "^1.0.0"
1336 | }
1337 | },
1338 | "redent": {
1339 | "version": "1.0.0",
1340 | "resolved": "https://registry.npmjs.org/redent/-/redent-1.0.0.tgz",
1341 | "integrity": "sha1-z5Fqsf1fHxbfsggi3W7H9zDCr94=",
1342 | "dev": true,
1343 | "requires": {
1344 | "indent-string": "^2.1.0",
1345 | "strip-indent": "^1.0.1"
1346 | }
1347 | },
1348 | "strip-bom": {
1349 | "version": "2.0.0",
1350 | "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz",
1351 | "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=",
1352 | "dev": true,
1353 | "requires": {
1354 | "is-utf8": "^0.2.0"
1355 | }
1356 | },
1357 | "strip-indent": {
1358 | "version": "1.0.1",
1359 | "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-1.0.1.tgz",
1360 | "integrity": "sha1-DHlipq3vp7vUrDZkYKY4VSrhoKI=",
1361 | "dev": true,
1362 | "requires": {
1363 | "get-stdin": "^4.0.1"
1364 | }
1365 | },
1366 | "through2": {
1367 | "version": "2.0.5",
1368 | "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz",
1369 | "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==",
1370 | "dev": true,
1371 | "requires": {
1372 | "readable-stream": "~2.3.6",
1373 | "xtend": "~4.0.1"
1374 | }
1375 | },
1376 | "trim-newlines": {
1377 | "version": "1.0.0",
1378 | "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-1.0.0.tgz",
1379 | "integrity": "sha1-WIeWa7WCpFA6QetST301ARgVphM=",
1380 | "dev": true
1381 | }
1382 | }
1383 | },
1384 | "get-stdin": {
1385 | "version": "4.0.1",
1386 | "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz",
1387 | "integrity": "sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4=",
1388 | "dev": true
1389 | },
1390 | "get-stream": {
1391 | "version": "4.1.0",
1392 | "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz",
1393 | "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==",
1394 | "requires": {
1395 | "pump": "^3.0.0"
1396 | }
1397 | },
1398 | "git-raw-commits": {
1399 | "version": "2.0.0",
1400 | "resolved": "http://registry.npmjs.org/git-raw-commits/-/git-raw-commits-2.0.0.tgz",
1401 | "integrity": "sha512-w4jFEJFgKXMQJ0H0ikBk2S+4KP2VEjhCvLCNqbNRQC8BgGWgLKNCO7a9K9LI+TVT7Gfoloje502sEnctibffgg==",
1402 | "dev": true,
1403 | "requires": {
1404 | "dargs": "^4.0.1",
1405 | "lodash.template": "^4.0.2",
1406 | "meow": "^4.0.0",
1407 | "split2": "^2.0.0",
1408 | "through2": "^2.0.0"
1409 | },
1410 | "dependencies": {
1411 | "meow": {
1412 | "version": "4.0.1",
1413 | "resolved": "https://registry.npmjs.org/meow/-/meow-4.0.1.tgz",
1414 | "integrity": "sha512-xcSBHD5Z86zaOc+781KrupuHAzeGXSLtiAOmBsiLDiPSaYSB6hdew2ng9EBAnZ62jagG9MHAOdxpDi/lWBFJ/A==",
1415 | "dev": true,
1416 | "requires": {
1417 | "camelcase-keys": "^4.0.0",
1418 | "decamelize-keys": "^1.0.0",
1419 | "loud-rejection": "^1.0.0",
1420 | "minimist": "^1.1.3",
1421 | "minimist-options": "^3.0.1",
1422 | "normalize-package-data": "^2.3.4",
1423 | "read-pkg-up": "^3.0.0",
1424 | "redent": "^2.0.0",
1425 | "trim-newlines": "^2.0.0"
1426 | }
1427 | },
1428 | "minimist": {
1429 | "version": "1.2.5",
1430 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz",
1431 | "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==",
1432 | "dev": true
1433 | },
1434 | "through2": {
1435 | "version": "2.0.5",
1436 | "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz",
1437 | "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==",
1438 | "dev": true,
1439 | "requires": {
1440 | "readable-stream": "~2.3.6",
1441 | "xtend": "~4.0.1"
1442 | }
1443 | }
1444 | }
1445 | },
1446 | "git-remote-origin-url": {
1447 | "version": "2.0.0",
1448 | "resolved": "https://registry.npmjs.org/git-remote-origin-url/-/git-remote-origin-url-2.0.0.tgz",
1449 | "integrity": "sha1-UoJlna4hBxRaERJhEq0yFuxfpl8=",
1450 | "dev": true,
1451 | "requires": {
1452 | "gitconfiglocal": "^1.0.0",
1453 | "pify": "^2.3.0"
1454 | },
1455 | "dependencies": {
1456 | "pify": {
1457 | "version": "2.3.0",
1458 | "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz",
1459 | "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=",
1460 | "dev": true
1461 | }
1462 | }
1463 | },
1464 | "git-semver-tags": {
1465 | "version": "3.0.1",
1466 | "resolved": "http://registry.npmjs.org/git-semver-tags/-/git-semver-tags-3.0.1.tgz",
1467 | "integrity": "sha512-Hzd1MOHXouITfCasrpVJbRDg9uvW7LfABk3GQmXYZByerBDrfrEMP9HXpNT7RxAbieiocP6u+xq20DkvjwxnCA==",
1468 | "dev": true,
1469 | "requires": {
1470 | "meow": "^5.0.0",
1471 | "semver": "^6.0.0"
1472 | },
1473 | "dependencies": {
1474 | "semver": {
1475 | "version": "6.3.0",
1476 | "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
1477 | "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
1478 | "dev": true
1479 | }
1480 | }
1481 | },
1482 | "gitconfiglocal": {
1483 | "version": "1.0.0",
1484 | "resolved": "https://registry.npmjs.org/gitconfiglocal/-/gitconfiglocal-1.0.0.tgz",
1485 | "integrity": "sha1-QdBF84UaXqiPA/JMocYXgRRGS5s=",
1486 | "dev": true,
1487 | "requires": {
1488 | "ini": "^1.3.2"
1489 | }
1490 | },
1491 | "glob": {
1492 | "version": "7.0.6",
1493 | "resolved": "https://registry.npmjs.org/glob/-/glob-7.0.6.tgz",
1494 | "integrity": "sha1-IRuvr0nlJbjNkyYNFKsTYVKz9Xo=",
1495 | "requires": {
1496 | "fs.realpath": "^1.0.0",
1497 | "inflight": "^1.0.4",
1498 | "inherits": "2",
1499 | "minimatch": "^3.0.2",
1500 | "once": "^1.3.0",
1501 | "path-is-absolute": "^1.0.0"
1502 | }
1503 | },
1504 | "glob-parent": {
1505 | "version": "5.1.1",
1506 | "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.1.tgz",
1507 | "integrity": "sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ==",
1508 | "dev": true,
1509 | "requires": {
1510 | "is-glob": "^4.0.1"
1511 | }
1512 | },
1513 | "got": {
1514 | "version": "8.3.2",
1515 | "resolved": "https://registry.npmjs.org/got/-/got-8.3.2.tgz",
1516 | "integrity": "sha512-qjUJ5U/hawxosMryILofZCkm3C84PLJS/0grRIpjAwu+Lkxxj5cxeCU25BG0/3mDSpXKTyZr8oh8wIgLaH0QCw==",
1517 | "requires": {
1518 | "@sindresorhus/is": "^0.7.0",
1519 | "cacheable-request": "^2.1.1",
1520 | "decompress-response": "^3.3.0",
1521 | "duplexer3": "^0.1.4",
1522 | "get-stream": "^3.0.0",
1523 | "into-stream": "^3.1.0",
1524 | "is-retry-allowed": "^1.1.0",
1525 | "isurl": "^1.0.0-alpha5",
1526 | "lowercase-keys": "^1.0.0",
1527 | "mimic-response": "^1.0.0",
1528 | "p-cancelable": "^0.4.0",
1529 | "p-timeout": "^2.0.1",
1530 | "pify": "^3.0.0",
1531 | "safe-buffer": "^5.1.1",
1532 | "timed-out": "^4.0.1",
1533 | "url-parse-lax": "^3.0.0",
1534 | "url-to-options": "^1.0.1"
1535 | },
1536 | "dependencies": {
1537 | "get-stream": {
1538 | "version": "3.0.0",
1539 | "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz",
1540 | "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ="
1541 | }
1542 | }
1543 | },
1544 | "graceful-fs": {
1545 | "version": "4.1.11",
1546 | "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz",
1547 | "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg="
1548 | },
1549 | "graceful-readlink": {
1550 | "version": "1.0.1",
1551 | "resolved": "https://registry.npmjs.org/graceful-readlink/-/graceful-readlink-1.0.1.tgz",
1552 | "integrity": "sha1-TK+tdrxi8C+gObL5Tpo906ORpyU="
1553 | },
1554 | "growl": {
1555 | "version": "1.10.5",
1556 | "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.5.tgz",
1557 | "integrity": "sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==",
1558 | "dev": true
1559 | },
1560 | "handlebars": {
1561 | "version": "4.7.6",
1562 | "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.6.tgz",
1563 | "integrity": "sha512-1f2BACcBfiwAfStCKZNrUCgqNZkGsAT7UM3kkYtXuLo0KnaVfjKOyf7PRzB6++aK9STyT1Pd2ZCPe3EGOXleXA==",
1564 | "dev": true,
1565 | "requires": {
1566 | "minimist": "^1.2.5",
1567 | "neo-async": "^2.6.0",
1568 | "source-map": "^0.6.1",
1569 | "uglify-js": "^3.1.4",
1570 | "wordwrap": "^1.0.0"
1571 | },
1572 | "dependencies": {
1573 | "minimist": {
1574 | "version": "1.2.5",
1575 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz",
1576 | "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==",
1577 | "dev": true
1578 | }
1579 | }
1580 | },
1581 | "has": {
1582 | "version": "1.0.3",
1583 | "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz",
1584 | "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==",
1585 | "dev": true,
1586 | "requires": {
1587 | "function-bind": "^1.1.1"
1588 | }
1589 | },
1590 | "has-flag": {
1591 | "version": "3.0.0",
1592 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
1593 | "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
1594 | "dev": true
1595 | },
1596 | "has-symbol-support-x": {
1597 | "version": "1.4.2",
1598 | "resolved": "https://registry.npmjs.org/has-symbol-support-x/-/has-symbol-support-x-1.4.2.tgz",
1599 | "integrity": "sha512-3ToOva++HaW+eCpgqZrCfN51IPB+7bJNVT6CUATzueB5Heb8o6Nam0V3HG5dlDvZU1Gn5QLcbahiKw/XVk5JJw=="
1600 | },
1601 | "has-symbols": {
1602 | "version": "1.0.1",
1603 | "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz",
1604 | "integrity": "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==",
1605 | "dev": true
1606 | },
1607 | "has-to-string-tag-x": {
1608 | "version": "1.4.1",
1609 | "resolved": "https://registry.npmjs.org/has-to-string-tag-x/-/has-to-string-tag-x-1.4.1.tgz",
1610 | "integrity": "sha512-vdbKfmw+3LoOYVr+mtxHaX5a96+0f3DljYd8JOqvOLsf5mw2Otda2qCDT9qRqLAhrjyQ0h7ual5nOiASpsGNFw==",
1611 | "requires": {
1612 | "has-symbol-support-x": "^1.4.1"
1613 | }
1614 | },
1615 | "he": {
1616 | "version": "1.2.0",
1617 | "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz",
1618 | "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==",
1619 | "dev": true
1620 | },
1621 | "hosted-git-info": {
1622 | "version": "2.8.8",
1623 | "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.8.tgz",
1624 | "integrity": "sha512-f/wzC2QaWBs7t9IYqB4T3sR1xviIViXJRJTWBlx2Gf3g0Xi5vI7Yy4koXQ1c9OYDGHN9sBy1DQ2AB8fqZBWhUg==",
1625 | "dev": true
1626 | },
1627 | "http-cache-semantics": {
1628 | "version": "3.8.1",
1629 | "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-3.8.1.tgz",
1630 | "integrity": "sha512-5ai2iksyV8ZXmnZhHH4rWPoxxistEexSi5936zIQ1bnNTW5VnA85B6P/VpXiRM017IgRvb2kKo1a//y+0wSp3w=="
1631 | },
1632 | "ieee754": {
1633 | "version": "1.1.13",
1634 | "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.13.tgz",
1635 | "integrity": "sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg=="
1636 | },
1637 | "indent-string": {
1638 | "version": "3.2.0",
1639 | "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-3.2.0.tgz",
1640 | "integrity": "sha1-Sl/W0nzDMvN+VBmlBNu4NxBckok=",
1641 | "dev": true
1642 | },
1643 | "inflight": {
1644 | "version": "1.0.6",
1645 | "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
1646 | "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=",
1647 | "requires": {
1648 | "once": "^1.3.0",
1649 | "wrappy": "1"
1650 | }
1651 | },
1652 | "inherits": {
1653 | "version": "2.0.3",
1654 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
1655 | "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4="
1656 | },
1657 | "ini": {
1658 | "version": "1.3.5",
1659 | "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz",
1660 | "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==",
1661 | "dev": true
1662 | },
1663 | "into-stream": {
1664 | "version": "3.1.0",
1665 | "resolved": "https://registry.npmjs.org/into-stream/-/into-stream-3.1.0.tgz",
1666 | "integrity": "sha1-lvsKk2wSur1v8XUqF9BWFqvQlMY=",
1667 | "requires": {
1668 | "from2": "^2.1.1",
1669 | "p-is-promise": "^1.1.0"
1670 | }
1671 | },
1672 | "ip": {
1673 | "version": "1.1.5",
1674 | "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.5.tgz",
1675 | "integrity": "sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo="
1676 | },
1677 | "is-arguments": {
1678 | "version": "1.0.4",
1679 | "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.0.4.tgz",
1680 | "integrity": "sha512-xPh0Rmt8NE65sNzvyUmWgI1tz3mKq74lGA0mL8LYZcoIzKOzDh6HmrYm3d18k60nHerC8A9Km8kYu87zfSFnLA==",
1681 | "dev": true
1682 | },
1683 | "is-arrayish": {
1684 | "version": "0.2.1",
1685 | "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz",
1686 | "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=",
1687 | "dev": true
1688 | },
1689 | "is-binary-path": {
1690 | "version": "2.1.0",
1691 | "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz",
1692 | "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==",
1693 | "dev": true,
1694 | "requires": {
1695 | "binary-extensions": "^2.0.0"
1696 | }
1697 | },
1698 | "is-buffer": {
1699 | "version": "2.0.4",
1700 | "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.4.tgz",
1701 | "integrity": "sha512-Kq1rokWXOPXWuaMAqZiJW4XxsmD9zGx9q4aePabbn3qCRGedtH7Cm+zV8WETitMfu1wdh+Rvd6w5egwSngUX2A==",
1702 | "dev": true
1703 | },
1704 | "is-callable": {
1705 | "version": "1.2.0",
1706 | "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.0.tgz",
1707 | "integrity": "sha512-pyVD9AaGLxtg6srb2Ng6ynWJqkHU9bEM087AKck0w8QwDarTfNcpIYoU8x8Hv2Icm8u6kFJM18Dag8lyqGkviw==",
1708 | "dev": true
1709 | },
1710 | "is-date-object": {
1711 | "version": "1.0.2",
1712 | "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.2.tgz",
1713 | "integrity": "sha512-USlDT524woQ08aoZFzh3/Z6ch9Y/EWXEHQ/AaRN0SkKq4t2Jw2R2339tSXmwuVoY7LLlBCbOIlx2myP/L5zk0g==",
1714 | "dev": true
1715 | },
1716 | "is-extglob": {
1717 | "version": "2.1.1",
1718 | "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
1719 | "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=",
1720 | "dev": true
1721 | },
1722 | "is-finite": {
1723 | "version": "1.1.0",
1724 | "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.1.0.tgz",
1725 | "integrity": "sha512-cdyMtqX/BOqqNBBiKlIVkytNHm49MtMlYyn1zxzvJKWmFMlGzm+ry5BBfYyeY9YmNKbRSo/o7OX9w9ale0wg3w==",
1726 | "dev": true
1727 | },
1728 | "is-fullwidth-code-point": {
1729 | "version": "2.0.0",
1730 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz",
1731 | "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=",
1732 | "dev": true
1733 | },
1734 | "is-glob": {
1735 | "version": "4.0.1",
1736 | "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz",
1737 | "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==",
1738 | "dev": true,
1739 | "requires": {
1740 | "is-extglob": "^2.1.1"
1741 | }
1742 | },
1743 | "is-map": {
1744 | "version": "2.0.1",
1745 | "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.1.tgz",
1746 | "integrity": "sha512-T/S49scO8plUiAOA2DBTBG3JHpn1yiw0kRp6dgiZ0v2/6twi5eiB0rHtHFH9ZIrvlWc6+4O+m4zg5+Z833aXgw==",
1747 | "dev": true
1748 | },
1749 | "is-natural-number": {
1750 | "version": "4.0.1",
1751 | "resolved": "https://registry.npmjs.org/is-natural-number/-/is-natural-number-4.0.1.tgz",
1752 | "integrity": "sha1-q5124dtM7VHjXeDHLr7PCfc0zeg="
1753 | },
1754 | "is-number": {
1755 | "version": "7.0.0",
1756 | "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
1757 | "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
1758 | "dev": true
1759 | },
1760 | "is-obj": {
1761 | "version": "1.0.1",
1762 | "resolved": "http://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz",
1763 | "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=",
1764 | "dev": true
1765 | },
1766 | "is-object": {
1767 | "version": "1.0.1",
1768 | "resolved": "https://registry.npmjs.org/is-object/-/is-object-1.0.1.tgz",
1769 | "integrity": "sha1-iVJojF7C/9awPsyF52ngKQMINHA="
1770 | },
1771 | "is-plain-obj": {
1772 | "version": "1.1.0",
1773 | "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz",
1774 | "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4="
1775 | },
1776 | "is-port-available": {
1777 | "version": "0.1.5",
1778 | "resolved": "https://registry.npmjs.org/is-port-available/-/is-port-available-0.1.5.tgz",
1779 | "integrity": "sha512-/r7UZAQtfgDFdhxzM71jG0mkC4oSRA513cImMILdRe/+UOIe0Se/D/Z7XCua4AFg5k4Zt3ALMGaC1W3FzlrR2w=="
1780 | },
1781 | "is-regex": {
1782 | "version": "1.1.0",
1783 | "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.0.tgz",
1784 | "integrity": "sha512-iI97M8KTWID2la5uYXlkbSDQIg4F6o1sYboZKKTDpnDQMLtUL86zxhgDet3Q2SriaYsyGqZ6Mn2SjbRKeLHdqw==",
1785 | "dev": true,
1786 | "requires": {
1787 | "has-symbols": "^1.0.1"
1788 | }
1789 | },
1790 | "is-retry-allowed": {
1791 | "version": "1.2.0",
1792 | "resolved": "https://registry.npmjs.org/is-retry-allowed/-/is-retry-allowed-1.2.0.tgz",
1793 | "integrity": "sha512-RUbUeKwvm3XG2VYamhJL1xFktgjvPzL0Hq8C+6yrWIswDy3BIXGqCxhxkc30N9jqK311gVU137K8Ei55/zVJRg=="
1794 | },
1795 | "is-set": {
1796 | "version": "2.0.1",
1797 | "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.1.tgz",
1798 | "integrity": "sha512-eJEzOtVyenDs1TMzSQ3kU3K+E0GUS9sno+F0OBT97xsgcJsF9nXMBtkT9/kut5JEpM7oL7X/0qxR17K3mcwIAA==",
1799 | "dev": true
1800 | },
1801 | "is-stream": {
1802 | "version": "1.1.0",
1803 | "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz",
1804 | "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ="
1805 | },
1806 | "is-string": {
1807 | "version": "1.0.5",
1808 | "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.5.tgz",
1809 | "integrity": "sha512-buY6VNRjhQMiF1qWDouloZlQbRhDPCebwxSjxMjxgemYT46YMd2NR0/H+fBhEfWX4A/w9TBJ+ol+okqJKFE6vQ==",
1810 | "dev": true
1811 | },
1812 | "is-symbol": {
1813 | "version": "1.0.3",
1814 | "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.3.tgz",
1815 | "integrity": "sha512-OwijhaRSgqvhm/0ZdAcXNZt9lYdKFpcRDT5ULUuYXPoT794UNOdU+gpT6Rzo7b4V2HUl/op6GqY894AZwv9faQ==",
1816 | "dev": true,
1817 | "requires": {
1818 | "has-symbols": "^1.0.1"
1819 | }
1820 | },
1821 | "is-text-path": {
1822 | "version": "1.0.1",
1823 | "resolved": "https://registry.npmjs.org/is-text-path/-/is-text-path-1.0.1.tgz",
1824 | "integrity": "sha1-Thqg+1G/vLPpJogAE5cgLBd1tm4=",
1825 | "dev": true,
1826 | "requires": {
1827 | "text-extensions": "^1.0.0"
1828 | }
1829 | },
1830 | "is-utf8": {
1831 | "version": "0.2.1",
1832 | "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz",
1833 | "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=",
1834 | "dev": true
1835 | },
1836 | "isarray": {
1837 | "version": "1.0.0",
1838 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
1839 | "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE="
1840 | },
1841 | "isexe": {
1842 | "version": "2.0.0",
1843 | "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
1844 | "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=",
1845 | "dev": true
1846 | },
1847 | "isurl": {
1848 | "version": "1.0.0",
1849 | "resolved": "https://registry.npmjs.org/isurl/-/isurl-1.0.0.tgz",
1850 | "integrity": "sha512-1P/yWsxPlDtn7QeRD+ULKQPaIaN6yF368GZ2vDfv0AL0NwpStafjWCDDdn0k8wgFMWpVAqG7oJhxHnlud42i9w==",
1851 | "requires": {
1852 | "has-to-string-tag-x": "^1.2.0",
1853 | "is-object": "^1.0.1"
1854 | }
1855 | },
1856 | "iterate-iterator": {
1857 | "version": "1.0.1",
1858 | "resolved": "https://registry.npmjs.org/iterate-iterator/-/iterate-iterator-1.0.1.tgz",
1859 | "integrity": "sha512-3Q6tudGN05kbkDQDI4CqjaBf4qf85w6W6GnuZDtUVYwKgtC1q8yxYX7CZed7N+tLzQqS6roujWvszf13T+n9aw==",
1860 | "dev": true
1861 | },
1862 | "iterate-value": {
1863 | "version": "1.0.2",
1864 | "resolved": "https://registry.npmjs.org/iterate-value/-/iterate-value-1.0.2.tgz",
1865 | "integrity": "sha512-A6fMAio4D2ot2r/TYzr4yUWrmwNdsN5xL7+HUiyACE4DXm+q8HtPcnFTp+NnW3k4N05tZ7FVYFFb2CR13NxyHQ==",
1866 | "dev": true,
1867 | "requires": {
1868 | "es-get-iterator": "^1.0.2",
1869 | "iterate-iterator": "^1.0.1"
1870 | }
1871 | },
1872 | "js-yaml": {
1873 | "version": "3.13.1",
1874 | "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz",
1875 | "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==",
1876 | "dev": true,
1877 | "requires": {
1878 | "argparse": "^1.0.7",
1879 | "esprima": "^4.0.0"
1880 | }
1881 | },
1882 | "json-buffer": {
1883 | "version": "3.0.0",
1884 | "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.0.tgz",
1885 | "integrity": "sha1-Wx85evx11ne96Lz8Dkfh+aPZqJg="
1886 | },
1887 | "json-parse-better-errors": {
1888 | "version": "1.0.2",
1889 | "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz",
1890 | "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==",
1891 | "dev": true
1892 | },
1893 | "json-stringify-safe": {
1894 | "version": "5.0.1",
1895 | "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz",
1896 | "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=",
1897 | "dev": true
1898 | },
1899 | "jsonfile": {
1900 | "version": "6.0.1",
1901 | "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.0.1.tgz",
1902 | "integrity": "sha512-jR2b5v7d2vIOust+w3wtFKZIfpC2pnRmFAhAC/BuweZFQR8qZzxH1OyrQ10HmdVYiXWkYUqPVsz91cG7EL2FBg==",
1903 | "requires": {
1904 | "graceful-fs": "^4.1.6",
1905 | "universalify": "^1.0.0"
1906 | }
1907 | },
1908 | "jsonparse": {
1909 | "version": "1.3.1",
1910 | "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz",
1911 | "integrity": "sha1-P02uSpH6wxX3EGL4UhzCOfE2YoA=",
1912 | "dev": true
1913 | },
1914 | "keyv": {
1915 | "version": "3.0.0",
1916 | "resolved": "https://registry.npmjs.org/keyv/-/keyv-3.0.0.tgz",
1917 | "integrity": "sha512-eguHnq22OE3uVoSYG0LVWNP+4ppamWr9+zWBe1bsNcovIMy6huUJFPgy4mGwCd/rnl3vOLGW1MTlu4c57CT1xA==",
1918 | "requires": {
1919 | "json-buffer": "3.0.0"
1920 | }
1921 | },
1922 | "load-json-file": {
1923 | "version": "4.0.0",
1924 | "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz",
1925 | "integrity": "sha1-L19Fq5HjMhYjT9U62rZo607AmTs=",
1926 | "dev": true,
1927 | "requires": {
1928 | "graceful-fs": "^4.1.2",
1929 | "parse-json": "^4.0.0",
1930 | "pify": "^3.0.0",
1931 | "strip-bom": "^3.0.0"
1932 | }
1933 | },
1934 | "locate-path": {
1935 | "version": "3.0.0",
1936 | "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz",
1937 | "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==",
1938 | "dev": true,
1939 | "requires": {
1940 | "p-locate": "^3.0.0",
1941 | "path-exists": "^3.0.0"
1942 | }
1943 | },
1944 | "lodash": {
1945 | "version": "4.17.15",
1946 | "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz",
1947 | "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A=="
1948 | },
1949 | "lodash._reinterpolate": {
1950 | "version": "3.0.0",
1951 | "resolved": "https://registry.npmjs.org/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz",
1952 | "integrity": "sha1-DM8tiRZq8Ds2Y8eWU4t1rG4RTZ0=",
1953 | "dev": true
1954 | },
1955 | "lodash.ismatch": {
1956 | "version": "4.4.0",
1957 | "resolved": "https://registry.npmjs.org/lodash.ismatch/-/lodash.ismatch-4.4.0.tgz",
1958 | "integrity": "sha1-dWy1FQyjum8RCFp4hJZF8Yj4Xzc=",
1959 | "dev": true
1960 | },
1961 | "lodash.template": {
1962 | "version": "4.5.0",
1963 | "resolved": "https://registry.npmjs.org/lodash.template/-/lodash.template-4.5.0.tgz",
1964 | "integrity": "sha512-84vYFxIkmidUiFxidA/KjjH9pAycqW+h980j7Fuz5qxRtO9pgB7MDFTdys1N7A5mcucRiDyEq4fusljItR1T/A==",
1965 | "dev": true,
1966 | "requires": {
1967 | "lodash._reinterpolate": "^3.0.0",
1968 | "lodash.templatesettings": "^4.0.0"
1969 | }
1970 | },
1971 | "lodash.templatesettings": {
1972 | "version": "4.2.0",
1973 | "resolved": "https://registry.npmjs.org/lodash.templatesettings/-/lodash.templatesettings-4.2.0.tgz",
1974 | "integrity": "sha512-stgLz+i3Aa9mZgnjr/O+v9ruKZsPsndy7qPZOchbqk2cnTU1ZaldKK+v7m54WoKIyxiuMZTKT2H81F8BeAc3ZQ==",
1975 | "dev": true,
1976 | "requires": {
1977 | "lodash._reinterpolate": "^3.0.0"
1978 | }
1979 | },
1980 | "log-symbols": {
1981 | "version": "3.0.0",
1982 | "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-3.0.0.tgz",
1983 | "integrity": "sha512-dSkNGuI7iG3mfvDzUuYZyvk5dD9ocYCYzNU6CYDE6+Xqd+gwme6Z00NS3dUh8mq/73HaEtT7m6W+yUPtU6BZnQ==",
1984 | "dev": true,
1985 | "requires": {
1986 | "chalk": "^2.4.2"
1987 | }
1988 | },
1989 | "loud-rejection": {
1990 | "version": "1.6.0",
1991 | "resolved": "https://registry.npmjs.org/loud-rejection/-/loud-rejection-1.6.0.tgz",
1992 | "integrity": "sha1-W0b4AUft7leIcPCG0Eghz5mOVR8=",
1993 | "dev": true,
1994 | "requires": {
1995 | "currently-unhandled": "^0.4.1",
1996 | "signal-exit": "^3.0.0"
1997 | }
1998 | },
1999 | "lowercase-keys": {
2000 | "version": "1.0.1",
2001 | "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz",
2002 | "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA=="
2003 | },
2004 | "make-dir": {
2005 | "version": "2.1.0",
2006 | "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz",
2007 | "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==",
2008 | "requires": {
2009 | "pify": "^4.0.1",
2010 | "semver": "^5.6.0"
2011 | },
2012 | "dependencies": {
2013 | "pify": {
2014 | "version": "4.0.1",
2015 | "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz",
2016 | "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g=="
2017 | },
2018 | "semver": {
2019 | "version": "5.7.1",
2020 | "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
2021 | "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ=="
2022 | }
2023 | }
2024 | },
2025 | "map-obj": {
2026 | "version": "2.0.0",
2027 | "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-2.0.0.tgz",
2028 | "integrity": "sha1-plzSkIepJZi4eRJXpSPgISIqwfk=",
2029 | "dev": true
2030 | },
2031 | "md5-file": {
2032 | "version": "4.0.0",
2033 | "resolved": "https://registry.npmjs.org/md5-file/-/md5-file-4.0.0.tgz",
2034 | "integrity": "sha512-UC0qFwyAjn4YdPpKaDNw6gNxRf7Mcx7jC1UGCY4boCzgvU2Aoc1mOGzTtrjjLKhM5ivsnhoKpQVxKPp+1j1qwg=="
2035 | },
2036 | "meow": {
2037 | "version": "5.0.0",
2038 | "resolved": "https://registry.npmjs.org/meow/-/meow-5.0.0.tgz",
2039 | "integrity": "sha512-CbTqYU17ABaLefO8vCU153ZZlprKYWDljcndKKDCFcYQITzWCXZAVk4QMFZPgvzrnUQ3uItnIE/LoUOwrT15Ig==",
2040 | "dev": true,
2041 | "requires": {
2042 | "camelcase-keys": "^4.0.0",
2043 | "decamelize-keys": "^1.0.0",
2044 | "loud-rejection": "^1.0.0",
2045 | "minimist-options": "^3.0.1",
2046 | "normalize-package-data": "^2.3.4",
2047 | "read-pkg-up": "^3.0.0",
2048 | "redent": "^2.0.0",
2049 | "trim-newlines": "^2.0.0",
2050 | "yargs-parser": "^10.0.0"
2051 | },
2052 | "dependencies": {
2053 | "yargs-parser": {
2054 | "version": "10.1.0",
2055 | "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-10.1.0.tgz",
2056 | "integrity": "sha512-VCIyR1wJoEBZUqk5PA+oOBF6ypbwh5aNB3I50guxAL/quggdfs4TtNHQrSazFA3fYZ+tEqfs0zIGlv0c/rgjbQ==",
2057 | "dev": true,
2058 | "requires": {
2059 | "camelcase": "^4.1.0"
2060 | }
2061 | }
2062 | }
2063 | },
2064 | "mime-db": {
2065 | "version": "1.44.0",
2066 | "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.44.0.tgz",
2067 | "integrity": "sha512-/NOTfLrsPBVeH7YtFPgsVWveuL+4SjjYxaQ1xtM1KMFj7HdxlBlxeyNLzhyJVx7r4rZGJAZ/6lkKCitSc/Nmpg=="
2068 | },
2069 | "mimic-response": {
2070 | "version": "1.0.1",
2071 | "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz",
2072 | "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ=="
2073 | },
2074 | "minimatch": {
2075 | "version": "3.0.4",
2076 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
2077 | "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==",
2078 | "requires": {
2079 | "brace-expansion": "^1.1.7"
2080 | }
2081 | },
2082 | "minimist": {
2083 | "version": "0.0.8",
2084 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz",
2085 | "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0="
2086 | },
2087 | "minimist-options": {
2088 | "version": "3.0.2",
2089 | "resolved": "https://registry.npmjs.org/minimist-options/-/minimist-options-3.0.2.tgz",
2090 | "integrity": "sha512-FyBrT/d0d4+uiZRbqznPXqw3IpZZG3gl3wKWiX784FycUKVwBt0uLBFkQrtE4tZOrgo78nZp2jnKz3L65T5LdQ==",
2091 | "dev": true,
2092 | "requires": {
2093 | "arrify": "^1.0.1",
2094 | "is-plain-obj": "^1.1.0"
2095 | }
2096 | },
2097 | "minipass": {
2098 | "version": "3.0.1",
2099 | "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.0.1.tgz",
2100 | "integrity": "sha512-2y5okJ4uBsjoD2vAbLKL9EUQPPkC0YMIp+2mZOXG3nBba++pdfJWRxx2Ewirc0pwAJYu4XtWg2EkVo1nRXuO/w==",
2101 | "requires": {
2102 | "yallist": "^4.0.0"
2103 | }
2104 | },
2105 | "minizlib": {
2106 | "version": "2.1.0",
2107 | "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.0.tgz",
2108 | "integrity": "sha512-EzTZN/fjSvifSX0SlqUERCN39o6T40AMarPbv0MrarSFtIITCBh7bi+dU8nxGFHuqs9jdIAeoYoKuQAAASsPPA==",
2109 | "requires": {
2110 | "minipass": "^3.0.0",
2111 | "yallist": "^4.0.0"
2112 | }
2113 | },
2114 | "mkdirp": {
2115 | "version": "0.5.1",
2116 | "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz",
2117 | "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=",
2118 | "requires": {
2119 | "minimist": "0.0.8"
2120 | }
2121 | },
2122 | "mocha": {
2123 | "version": "8.0.1",
2124 | "resolved": "https://registry.npmjs.org/mocha/-/mocha-8.0.1.tgz",
2125 | "integrity": "sha512-vefaXfdYI8+Yo8nPZQQi0QO2o+5q9UIMX1jZ1XMmK3+4+CQjc7+B0hPdUeglXiTlr8IHMVRo63IhO9Mzt6fxOg==",
2126 | "dev": true,
2127 | "requires": {
2128 | "ansi-colors": "4.1.1",
2129 | "browser-stdout": "1.3.1",
2130 | "chokidar": "3.3.1",
2131 | "debug": "3.2.6",
2132 | "diff": "4.0.2",
2133 | "escape-string-regexp": "1.0.5",
2134 | "find-up": "4.1.0",
2135 | "glob": "7.1.6",
2136 | "growl": "1.10.5",
2137 | "he": "1.2.0",
2138 | "js-yaml": "3.13.1",
2139 | "log-symbols": "3.0.0",
2140 | "minimatch": "3.0.4",
2141 | "ms": "2.1.2",
2142 | "object.assign": "4.1.0",
2143 | "promise.allsettled": "1.0.2",
2144 | "serialize-javascript": "3.0.0",
2145 | "strip-json-comments": "3.0.1",
2146 | "supports-color": "7.1.0",
2147 | "which": "2.0.2",
2148 | "wide-align": "1.1.3",
2149 | "workerpool": "6.0.0",
2150 | "yargs": "13.3.2",
2151 | "yargs-parser": "13.1.2",
2152 | "yargs-unparser": "1.6.0"
2153 | },
2154 | "dependencies": {
2155 | "ansi-regex": {
2156 | "version": "4.1.0",
2157 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz",
2158 | "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==",
2159 | "dev": true
2160 | },
2161 | "find-up": {
2162 | "version": "4.1.0",
2163 | "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz",
2164 | "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==",
2165 | "dev": true,
2166 | "requires": {
2167 | "locate-path": "^5.0.0",
2168 | "path-exists": "^4.0.0"
2169 | }
2170 | },
2171 | "glob": {
2172 | "version": "7.1.6",
2173 | "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz",
2174 | "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==",
2175 | "dev": true,
2176 | "requires": {
2177 | "fs.realpath": "^1.0.0",
2178 | "inflight": "^1.0.4",
2179 | "inherits": "2",
2180 | "minimatch": "^3.0.4",
2181 | "once": "^1.3.0",
2182 | "path-is-absolute": "^1.0.0"
2183 | }
2184 | },
2185 | "has-flag": {
2186 | "version": "4.0.0",
2187 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
2188 | "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
2189 | "dev": true
2190 | },
2191 | "locate-path": {
2192 | "version": "5.0.0",
2193 | "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz",
2194 | "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==",
2195 | "dev": true,
2196 | "requires": {
2197 | "p-locate": "^4.1.0"
2198 | }
2199 | },
2200 | "p-limit": {
2201 | "version": "2.3.0",
2202 | "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz",
2203 | "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==",
2204 | "dev": true,
2205 | "requires": {
2206 | "p-try": "^2.0.0"
2207 | }
2208 | },
2209 | "p-locate": {
2210 | "version": "4.1.0",
2211 | "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz",
2212 | "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==",
2213 | "dev": true,
2214 | "requires": {
2215 | "p-limit": "^2.2.0"
2216 | }
2217 | },
2218 | "path-exists": {
2219 | "version": "4.0.0",
2220 | "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz",
2221 | "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==",
2222 | "dev": true
2223 | },
2224 | "string-width": {
2225 | "version": "3.1.0",
2226 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz",
2227 | "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==",
2228 | "dev": true,
2229 | "requires": {
2230 | "emoji-regex": "^7.0.1",
2231 | "is-fullwidth-code-point": "^2.0.0",
2232 | "strip-ansi": "^5.1.0"
2233 | }
2234 | },
2235 | "strip-ansi": {
2236 | "version": "5.2.0",
2237 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz",
2238 | "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==",
2239 | "dev": true,
2240 | "requires": {
2241 | "ansi-regex": "^4.1.0"
2242 | }
2243 | },
2244 | "supports-color": {
2245 | "version": "7.1.0",
2246 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz",
2247 | "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==",
2248 | "dev": true,
2249 | "requires": {
2250 | "has-flag": "^4.0.0"
2251 | }
2252 | },
2253 | "yargs": {
2254 | "version": "13.3.2",
2255 | "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz",
2256 | "integrity": "sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==",
2257 | "dev": true,
2258 | "requires": {
2259 | "cliui": "^5.0.0",
2260 | "find-up": "^3.0.0",
2261 | "get-caller-file": "^2.0.1",
2262 | "require-directory": "^2.1.1",
2263 | "require-main-filename": "^2.0.0",
2264 | "set-blocking": "^2.0.0",
2265 | "string-width": "^3.0.0",
2266 | "which-module": "^2.0.0",
2267 | "y18n": "^4.0.0",
2268 | "yargs-parser": "^13.1.2"
2269 | },
2270 | "dependencies": {
2271 | "find-up": {
2272 | "version": "3.0.0",
2273 | "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz",
2274 | "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==",
2275 | "dev": true,
2276 | "requires": {
2277 | "locate-path": "^3.0.0"
2278 | }
2279 | },
2280 | "locate-path": {
2281 | "version": "3.0.0",
2282 | "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz",
2283 | "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==",
2284 | "dev": true,
2285 | "requires": {
2286 | "p-locate": "^3.0.0",
2287 | "path-exists": "^3.0.0"
2288 | }
2289 | },
2290 | "p-locate": {
2291 | "version": "3.0.0",
2292 | "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz",
2293 | "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==",
2294 | "dev": true,
2295 | "requires": {
2296 | "p-limit": "^2.0.0"
2297 | }
2298 | },
2299 | "path-exists": {
2300 | "version": "3.0.0",
2301 | "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz",
2302 | "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=",
2303 | "dev": true
2304 | }
2305 | }
2306 | }
2307 | }
2308 | },
2309 | "modify-values": {
2310 | "version": "1.0.1",
2311 | "resolved": "https://registry.npmjs.org/modify-values/-/modify-values-1.0.1.tgz",
2312 | "integrity": "sha512-xV2bxeN6F7oYjZWTe/YPAy6MN2M+sL4u/Rlm2AHCIVGfo2p1yGmBHQ6vHehl4bRTZBdHu3TSkWdYgkwpYzAGSw==",
2313 | "dev": true
2314 | },
2315 | "ms": {
2316 | "version": "2.1.2",
2317 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
2318 | "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
2319 | "dev": true
2320 | },
2321 | "mustache": {
2322 | "version": "4.0.1",
2323 | "resolved": "https://registry.npmjs.org/mustache/-/mustache-4.0.1.tgz",
2324 | "integrity": "sha512-yL5VE97+OXn4+Er3THSmTdCFCtx5hHWzrolvH+JObZnUYwuaG7XV+Ch4fR2cIrcYI0tFHxS7iyFYl14bW8y2sA=="
2325 | },
2326 | "neo-async": {
2327 | "version": "2.6.1",
2328 | "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.1.tgz",
2329 | "integrity": "sha512-iyam8fBuCUpWeKPGpaNMetEocMt364qkCsfL9JuhjXX6dRnguRVOfk2GZaDpPjcOKiiXCPINZC1GczQ7iTq3Zw==",
2330 | "dev": true
2331 | },
2332 | "normalize-package-data": {
2333 | "version": "2.5.0",
2334 | "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz",
2335 | "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==",
2336 | "dev": true,
2337 | "requires": {
2338 | "hosted-git-info": "^2.1.4",
2339 | "resolve": "^1.10.0",
2340 | "semver": "2 || 3 || 4 || 5",
2341 | "validate-npm-package-license": "^3.0.1"
2342 | },
2343 | "dependencies": {
2344 | "semver": {
2345 | "version": "5.7.1",
2346 | "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
2347 | "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==",
2348 | "dev": true
2349 | }
2350 | }
2351 | },
2352 | "normalize-path": {
2353 | "version": "3.0.0",
2354 | "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz",
2355 | "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==",
2356 | "dev": true
2357 | },
2358 | "normalize-url": {
2359 | "version": "2.0.1",
2360 | "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-2.0.1.tgz",
2361 | "integrity": "sha512-D6MUW4K/VzoJ4rJ01JFKxDrtY1v9wrgzCX5f2qj/lzH1m/lW6MhUZFKerVsnyjOhOsYzI9Kqqak+10l4LvLpMw==",
2362 | "requires": {
2363 | "prepend-http": "^2.0.0",
2364 | "query-string": "^5.0.1",
2365 | "sort-keys": "^2.0.0"
2366 | },
2367 | "dependencies": {
2368 | "sort-keys": {
2369 | "version": "2.0.0",
2370 | "resolved": "https://registry.npmjs.org/sort-keys/-/sort-keys-2.0.0.tgz",
2371 | "integrity": "sha1-ZYU1WEhh7JfXMNbPQYIuH1ZoQSg=",
2372 | "requires": {
2373 | "is-plain-obj": "^1.0.0"
2374 | }
2375 | }
2376 | }
2377 | },
2378 | "null-check": {
2379 | "version": "1.0.0",
2380 | "resolved": "https://registry.npmjs.org/null-check/-/null-check-1.0.0.tgz",
2381 | "integrity": "sha1-l33/1xdgErnsMNKjnbXPcqBDnt0=",
2382 | "dev": true
2383 | },
2384 | "number-is-nan": {
2385 | "version": "1.0.1",
2386 | "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz",
2387 | "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=",
2388 | "dev": true
2389 | },
2390 | "object-assign": {
2391 | "version": "4.1.1",
2392 | "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
2393 | "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM="
2394 | },
2395 | "object-inspect": {
2396 | "version": "1.7.0",
2397 | "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.7.0.tgz",
2398 | "integrity": "sha512-a7pEHdh1xKIAgTySUGgLMx/xwDZskN1Ud6egYYN3EdRW4ZMPNEDUTF+hwy2LUC+Bl+SyLXANnwz/jyh/qutKUw==",
2399 | "dev": true
2400 | },
2401 | "object-keys": {
2402 | "version": "1.1.1",
2403 | "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz",
2404 | "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==",
2405 | "dev": true
2406 | },
2407 | "object.assign": {
2408 | "version": "4.1.0",
2409 | "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.0.tgz",
2410 | "integrity": "sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w==",
2411 | "dev": true,
2412 | "requires": {
2413 | "define-properties": "^1.1.2",
2414 | "function-bind": "^1.1.1",
2415 | "has-symbols": "^1.0.0",
2416 | "object-keys": "^1.0.11"
2417 | }
2418 | },
2419 | "once": {
2420 | "version": "1.4.0",
2421 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
2422 | "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
2423 | "requires": {
2424 | "wrappy": "1"
2425 | }
2426 | },
2427 | "p-cancelable": {
2428 | "version": "0.4.1",
2429 | "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-0.4.1.tgz",
2430 | "integrity": "sha512-HNa1A8LvB1kie7cERyy21VNeHb2CWJJYqyyC2o3klWFfMGlFmWv2Z7sFgZH8ZiaYL95ydToKTFVXgMV/Os0bBQ=="
2431 | },
2432 | "p-event": {
2433 | "version": "2.3.1",
2434 | "resolved": "https://registry.npmjs.org/p-event/-/p-event-2.3.1.tgz",
2435 | "integrity": "sha512-NQCqOFhbpVTMX4qMe8PF8lbGtzZ+LCiN7pcNrb/413Na7+TRoe1xkKUzuWa/YEJdGQ0FvKtj35EEbDoVPO2kbA==",
2436 | "requires": {
2437 | "p-timeout": "^2.0.1"
2438 | }
2439 | },
2440 | "p-finally": {
2441 | "version": "1.0.0",
2442 | "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz",
2443 | "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4="
2444 | },
2445 | "p-is-promise": {
2446 | "version": "1.1.0",
2447 | "resolved": "https://registry.npmjs.org/p-is-promise/-/p-is-promise-1.1.0.tgz",
2448 | "integrity": "sha1-nJRWmJ6fZYgBewQ01WCXZ1w9oF4="
2449 | },
2450 | "p-limit": {
2451 | "version": "2.1.0",
2452 | "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.1.0.tgz",
2453 | "integrity": "sha512-NhURkNcrVB+8hNfLuysU8enY5xn2KXphsHBaC2YmRNTZRc7RWusw6apSpdEj3jo4CMb6W9nrF6tTnsJsJeyu6g==",
2454 | "dev": true,
2455 | "requires": {
2456 | "p-try": "^2.0.0"
2457 | }
2458 | },
2459 | "p-locate": {
2460 | "version": "3.0.0",
2461 | "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz",
2462 | "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==",
2463 | "dev": true,
2464 | "requires": {
2465 | "p-limit": "^2.0.0"
2466 | }
2467 | },
2468 | "p-timeout": {
2469 | "version": "2.0.1",
2470 | "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-2.0.1.tgz",
2471 | "integrity": "sha512-88em58dDVB/KzPEx1X0N3LwFfYZPyDc4B6eF38M1rk9VTZMbxXXgjugz8mmwpS9Ox4BDZ+t6t3QP5+/gazweIA==",
2472 | "requires": {
2473 | "p-finally": "^1.0.0"
2474 | }
2475 | },
2476 | "p-try": {
2477 | "version": "2.0.0",
2478 | "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.0.0.tgz",
2479 | "integrity": "sha512-hMp0onDKIajHfIkdRk3P4CdCmErkYAxxDtP3Wx/4nZ3aGlau2VKh3mZpcuFkH27WQkL/3WBCPOktzA9ZOAnMQQ=="
2480 | },
2481 | "parse-github-repo-url": {
2482 | "version": "1.4.1",
2483 | "resolved": "https://registry.npmjs.org/parse-github-repo-url/-/parse-github-repo-url-1.4.1.tgz",
2484 | "integrity": "sha1-nn2LslKmy2ukJZUGC3v23z28H1A=",
2485 | "dev": true
2486 | },
2487 | "parse-json": {
2488 | "version": "4.0.0",
2489 | "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz",
2490 | "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=",
2491 | "dev": true,
2492 | "requires": {
2493 | "error-ex": "^1.3.1",
2494 | "json-parse-better-errors": "^1.0.1"
2495 | }
2496 | },
2497 | "path-exists": {
2498 | "version": "3.0.0",
2499 | "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz",
2500 | "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=",
2501 | "dev": true
2502 | },
2503 | "path-is-absolute": {
2504 | "version": "1.0.1",
2505 | "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
2506 | "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18="
2507 | },
2508 | "path-parse": {
2509 | "version": "1.0.6",
2510 | "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz",
2511 | "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==",
2512 | "dev": true
2513 | },
2514 | "path-type": {
2515 | "version": "3.0.0",
2516 | "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz",
2517 | "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==",
2518 | "dev": true,
2519 | "requires": {
2520 | "pify": "^3.0.0"
2521 | }
2522 | },
2523 | "pathval": {
2524 | "version": "1.1.0",
2525 | "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.0.tgz",
2526 | "integrity": "sha1-uULm1L3mUwBe9rcTYd74cn0GReA=",
2527 | "dev": true
2528 | },
2529 | "pend": {
2530 | "version": "1.2.0",
2531 | "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz",
2532 | "integrity": "sha1-elfrVQpng/kRUzH89GY9XI4AelA="
2533 | },
2534 | "picomatch": {
2535 | "version": "2.2.2",
2536 | "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.2.tgz",
2537 | "integrity": "sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg==",
2538 | "dev": true
2539 | },
2540 | "pify": {
2541 | "version": "3.0.0",
2542 | "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz",
2543 | "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY="
2544 | },
2545 | "pinkie": {
2546 | "version": "2.0.4",
2547 | "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz",
2548 | "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA="
2549 | },
2550 | "pinkie-promise": {
2551 | "version": "2.0.1",
2552 | "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz",
2553 | "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=",
2554 | "requires": {
2555 | "pinkie": "^2.0.0"
2556 | }
2557 | },
2558 | "prepend-http": {
2559 | "version": "2.0.0",
2560 | "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-2.0.0.tgz",
2561 | "integrity": "sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc="
2562 | },
2563 | "process-nextick-args": {
2564 | "version": "2.0.0",
2565 | "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz",
2566 | "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw=="
2567 | },
2568 | "progress": {
2569 | "version": "2.0.3",
2570 | "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz",
2571 | "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA=="
2572 | },
2573 | "promise.allsettled": {
2574 | "version": "1.0.2",
2575 | "resolved": "https://registry.npmjs.org/promise.allsettled/-/promise.allsettled-1.0.2.tgz",
2576 | "integrity": "sha512-UpcYW5S1RaNKT6pd+s9jp9K9rlQge1UXKskec0j6Mmuq7UJCvlS2J2/s/yuPN8ehftf9HXMxWlKiPbGGUzpoRg==",
2577 | "dev": true,
2578 | "requires": {
2579 | "array.prototype.map": "^1.0.1",
2580 | "define-properties": "^1.1.3",
2581 | "es-abstract": "^1.17.0-next.1",
2582 | "function-bind": "^1.1.1",
2583 | "iterate-value": "^1.0.0"
2584 | }
2585 | },
2586 | "pump": {
2587 | "version": "3.0.0",
2588 | "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz",
2589 | "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==",
2590 | "requires": {
2591 | "end-of-stream": "^1.1.0",
2592 | "once": "^1.3.1"
2593 | }
2594 | },
2595 | "q": {
2596 | "version": "1.5.1",
2597 | "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz",
2598 | "integrity": "sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc=",
2599 | "dev": true
2600 | },
2601 | "query-string": {
2602 | "version": "5.1.1",
2603 | "resolved": "https://registry.npmjs.org/query-string/-/query-string-5.1.1.tgz",
2604 | "integrity": "sha512-gjWOsm2SoGlgLEdAGt7a6slVOk9mGiXmPFMqrEhLQ68rhQuBnpfs3+EmlvqKyxnCo9/PPlF+9MtY02S1aFg+Jw==",
2605 | "requires": {
2606 | "decode-uri-component": "^0.2.0",
2607 | "object-assign": "^4.1.0",
2608 | "strict-uri-encode": "^1.0.0"
2609 | }
2610 | },
2611 | "quick-lru": {
2612 | "version": "1.1.0",
2613 | "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-1.1.0.tgz",
2614 | "integrity": "sha1-Q2CxfGETatOAeDl/8RQW4Ybc+7g=",
2615 | "dev": true
2616 | },
2617 | "read-pkg": {
2618 | "version": "3.0.0",
2619 | "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz",
2620 | "integrity": "sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k=",
2621 | "dev": true,
2622 | "requires": {
2623 | "load-json-file": "^4.0.0",
2624 | "normalize-package-data": "^2.3.2",
2625 | "path-type": "^3.0.0"
2626 | }
2627 | },
2628 | "read-pkg-up": {
2629 | "version": "3.0.0",
2630 | "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-3.0.0.tgz",
2631 | "integrity": "sha1-PtSWaF26D4/hGNBpHcUfSh/5bwc=",
2632 | "dev": true,
2633 | "requires": {
2634 | "find-up": "^2.0.0",
2635 | "read-pkg": "^3.0.0"
2636 | },
2637 | "dependencies": {
2638 | "find-up": {
2639 | "version": "2.1.0",
2640 | "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz",
2641 | "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=",
2642 | "dev": true,
2643 | "requires": {
2644 | "locate-path": "^2.0.0"
2645 | }
2646 | },
2647 | "locate-path": {
2648 | "version": "2.0.0",
2649 | "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz",
2650 | "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=",
2651 | "dev": true,
2652 | "requires": {
2653 | "p-locate": "^2.0.0",
2654 | "path-exists": "^3.0.0"
2655 | }
2656 | },
2657 | "p-limit": {
2658 | "version": "1.3.0",
2659 | "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz",
2660 | "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==",
2661 | "dev": true,
2662 | "requires": {
2663 | "p-try": "^1.0.0"
2664 | }
2665 | },
2666 | "p-locate": {
2667 | "version": "2.0.0",
2668 | "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz",
2669 | "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=",
2670 | "dev": true,
2671 | "requires": {
2672 | "p-limit": "^1.1.0"
2673 | }
2674 | },
2675 | "p-try": {
2676 | "version": "1.0.0",
2677 | "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz",
2678 | "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=",
2679 | "dev": true
2680 | }
2681 | }
2682 | },
2683 | "readable-stream": {
2684 | "version": "2.3.6",
2685 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz",
2686 | "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==",
2687 | "requires": {
2688 | "core-util-is": "~1.0.0",
2689 | "inherits": "~2.0.3",
2690 | "isarray": "~1.0.0",
2691 | "process-nextick-args": "~2.0.0",
2692 | "safe-buffer": "~5.1.1",
2693 | "string_decoder": "~1.1.1",
2694 | "util-deprecate": "~1.0.1"
2695 | }
2696 | },
2697 | "readdirp": {
2698 | "version": "3.3.0",
2699 | "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.3.0.tgz",
2700 | "integrity": "sha512-zz0pAkSPOXXm1viEwygWIPSPkcBYjW1xU5j/JBh5t9bGCJwa6f9+BJa6VaB2g+b55yVrmXzqkyLf4xaWYM0IkQ==",
2701 | "dev": true,
2702 | "requires": {
2703 | "picomatch": "^2.0.7"
2704 | }
2705 | },
2706 | "redent": {
2707 | "version": "2.0.0",
2708 | "resolved": "https://registry.npmjs.org/redent/-/redent-2.0.0.tgz",
2709 | "integrity": "sha1-wbIAe0LVfrE4kHmzyDM2OdXhzKo=",
2710 | "dev": true,
2711 | "requires": {
2712 | "indent-string": "^3.0.0",
2713 | "strip-indent": "^2.0.0"
2714 | }
2715 | },
2716 | "repeating": {
2717 | "version": "2.0.1",
2718 | "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz",
2719 | "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=",
2720 | "dev": true,
2721 | "requires": {
2722 | "is-finite": "^1.0.0"
2723 | }
2724 | },
2725 | "require-directory": {
2726 | "version": "2.1.1",
2727 | "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz",
2728 | "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I="
2729 | },
2730 | "require-main-filename": {
2731 | "version": "2.0.0",
2732 | "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz",
2733 | "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg=="
2734 | },
2735 | "resolve": {
2736 | "version": "1.17.0",
2737 | "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.17.0.tgz",
2738 | "integrity": "sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w==",
2739 | "dev": true,
2740 | "requires": {
2741 | "path-parse": "^1.0.6"
2742 | }
2743 | },
2744 | "responselike": {
2745 | "version": "1.0.2",
2746 | "resolved": "https://registry.npmjs.org/responselike/-/responselike-1.0.2.tgz",
2747 | "integrity": "sha1-kYcg7ztjHFZCvgaPFa3lpG9Loec=",
2748 | "requires": {
2749 | "lowercase-keys": "^1.0.0"
2750 | }
2751 | },
2752 | "safe-buffer": {
2753 | "version": "5.1.2",
2754 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
2755 | "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g=="
2756 | },
2757 | "scp2": {
2758 | "version": "0.5.0",
2759 | "resolved": "https://registry.npmjs.org/scp2/-/scp2-0.5.0.tgz",
2760 | "integrity": "sha1-ZO50vDaF86TGKQ8tqMHjtO75Lo0=",
2761 | "requires": {
2762 | "async": "~0.9.0",
2763 | "glob": "~7.0.3",
2764 | "lodash": "~4.11.1",
2765 | "ssh2": "~0.4.10"
2766 | },
2767 | "dependencies": {
2768 | "isarray": {
2769 | "version": "0.0.1",
2770 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz",
2771 | "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8="
2772 | },
2773 | "lodash": {
2774 | "version": "4.11.2",
2775 | "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.11.2.tgz",
2776 | "integrity": "sha1-1rQzixEKWOIdrlzrz9u/0rxM2zs="
2777 | },
2778 | "readable-stream": {
2779 | "version": "1.0.34",
2780 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz",
2781 | "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=",
2782 | "requires": {
2783 | "core-util-is": "~1.0.0",
2784 | "inherits": "~2.0.1",
2785 | "isarray": "0.0.1",
2786 | "string_decoder": "~0.10.x"
2787 | }
2788 | },
2789 | "ssh2": {
2790 | "version": "0.4.15",
2791 | "resolved": "https://registry.npmjs.org/ssh2/-/ssh2-0.4.15.tgz",
2792 | "integrity": "sha1-B8b0EG2fe26m5N9jbGxT8fmBf/g=",
2793 | "requires": {
2794 | "readable-stream": "~1.0.0",
2795 | "ssh2-streams": "~0.0.22"
2796 | }
2797 | },
2798 | "string_decoder": {
2799 | "version": "0.10.31",
2800 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz",
2801 | "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ="
2802 | }
2803 | }
2804 | },
2805 | "seek-bzip": {
2806 | "version": "1.0.5",
2807 | "resolved": "https://registry.npmjs.org/seek-bzip/-/seek-bzip-1.0.5.tgz",
2808 | "integrity": "sha1-z+kXyz0nS8/6x5J1ivUxc+sfq9w=",
2809 | "requires": {
2810 | "commander": "~2.8.1"
2811 | }
2812 | },
2813 | "semver": {
2814 | "version": "7.1.1",
2815 | "resolved": "https://registry.npmjs.org/semver/-/semver-7.1.1.tgz",
2816 | "integrity": "sha512-WfuG+fl6eh3eZ2qAf6goB7nhiCd7NPXhmyFxigB/TOkQyeLP8w8GsVehvtGNtnNmyboz4TgeK40B1Kbql/8c5A==",
2817 | "dev": true
2818 | },
2819 | "serialize-javascript": {
2820 | "version": "3.0.0",
2821 | "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-3.0.0.tgz",
2822 | "integrity": "sha512-skZcHYw2vEX4bw90nAr2iTTsz6x2SrHEnfxgKYmZlvJYBEZrvbKtobJWlQ20zczKb3bsHHXXTYt48zBA7ni9cw==",
2823 | "dev": true
2824 | },
2825 | "set-blocking": {
2826 | "version": "2.0.0",
2827 | "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz",
2828 | "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc="
2829 | },
2830 | "signal-exit": {
2831 | "version": "3.0.3",
2832 | "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz",
2833 | "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==",
2834 | "dev": true
2835 | },
2836 | "sort-keys": {
2837 | "version": "1.1.2",
2838 | "resolved": "https://registry.npmjs.org/sort-keys/-/sort-keys-1.1.2.tgz",
2839 | "integrity": "sha1-RBttTTRnmPG05J6JIK37oOVD+a0=",
2840 | "requires": {
2841 | "is-plain-obj": "^1.0.0"
2842 | }
2843 | },
2844 | "sort-keys-length": {
2845 | "version": "1.0.1",
2846 | "resolved": "https://registry.npmjs.org/sort-keys-length/-/sort-keys-length-1.0.1.tgz",
2847 | "integrity": "sha1-nLb09OnkgVWmqgZx7dM2/xR5oYg=",
2848 | "requires": {
2849 | "sort-keys": "^1.0.0"
2850 | }
2851 | },
2852 | "source-map": {
2853 | "version": "0.6.1",
2854 | "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
2855 | "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
2856 | "dev": true
2857 | },
2858 | "spdx-correct": {
2859 | "version": "3.1.0",
2860 | "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.0.tgz",
2861 | "integrity": "sha512-lr2EZCctC2BNR7j7WzJ2FpDznxky1sjfxvvYEyzxNyb6lZXHODmEoJeFu4JupYlkfha1KZpJyoqiJ7pgA1qq8Q==",
2862 | "dev": true,
2863 | "requires": {
2864 | "spdx-expression-parse": "^3.0.0",
2865 | "spdx-license-ids": "^3.0.0"
2866 | }
2867 | },
2868 | "spdx-exceptions": {
2869 | "version": "2.3.0",
2870 | "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz",
2871 | "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==",
2872 | "dev": true
2873 | },
2874 | "spdx-expression-parse": {
2875 | "version": "3.0.0",
2876 | "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz",
2877 | "integrity": "sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg==",
2878 | "dev": true,
2879 | "requires": {
2880 | "spdx-exceptions": "^2.1.0",
2881 | "spdx-license-ids": "^3.0.0"
2882 | }
2883 | },
2884 | "spdx-license-ids": {
2885 | "version": "3.0.5",
2886 | "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.5.tgz",
2887 | "integrity": "sha512-J+FWzZoynJEXGphVIS+XEh3kFSjZX/1i9gFBaWQcB+/tmpe2qUsSBABpcxqxnAxFdiUFEgAX1bjYGQvIZmoz9Q==",
2888 | "dev": true
2889 | },
2890 | "split": {
2891 | "version": "1.0.1",
2892 | "resolved": "https://registry.npmjs.org/split/-/split-1.0.1.tgz",
2893 | "integrity": "sha512-mTyOoPbrivtXnwnIxZRFYRrPNtEFKlpB2fvjSnCQUiAA6qAZzqwna5envK4uk6OIeP17CsdF3rSBGYVBsU0Tkg==",
2894 | "dev": true,
2895 | "requires": {
2896 | "through": "2"
2897 | }
2898 | },
2899 | "split2": {
2900 | "version": "2.2.0",
2901 | "resolved": "https://registry.npmjs.org/split2/-/split2-2.2.0.tgz",
2902 | "integrity": "sha512-RAb22TG39LhI31MbreBgIuKiIKhVsawfTgEGqKHTK87aG+ul/PB8Sqoi3I7kVdRWiCfrKxK3uo4/YUkpNvhPbw==",
2903 | "dev": true,
2904 | "requires": {
2905 | "through2": "^2.0.2"
2906 | },
2907 | "dependencies": {
2908 | "through2": {
2909 | "version": "2.0.5",
2910 | "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz",
2911 | "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==",
2912 | "dev": true,
2913 | "requires": {
2914 | "readable-stream": "~2.3.6",
2915 | "xtend": "~4.0.1"
2916 | }
2917 | }
2918 | }
2919 | },
2920 | "sprintf-js": {
2921 | "version": "1.0.3",
2922 | "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz",
2923 | "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=",
2924 | "dev": true
2925 | },
2926 | "ssh2": {
2927 | "version": "0.8.9",
2928 | "resolved": "https://registry.npmjs.org/ssh2/-/ssh2-0.8.9.tgz",
2929 | "integrity": "sha512-GmoNPxWDMkVpMFa9LVVzQZHF6EW3WKmBwL+4/GeILf2hFmix5Isxm7Amamo8o7bHiU0tC+wXsGcUXOxp8ChPaw==",
2930 | "requires": {
2931 | "ssh2-streams": "~0.4.10"
2932 | },
2933 | "dependencies": {
2934 | "ssh2-streams": {
2935 | "version": "0.4.10",
2936 | "resolved": "https://registry.npmjs.org/ssh2-streams/-/ssh2-streams-0.4.10.tgz",
2937 | "integrity": "sha512-8pnlMjvnIZJvmTzUIIA5nT4jr2ZWNNVHwyXfMGdRJbug9TpI3kd99ffglgfSWqujVv/0gxwMsDn9j9RVst8yhQ==",
2938 | "requires": {
2939 | "asn1": "~0.2.0",
2940 | "bcrypt-pbkdf": "^1.0.2",
2941 | "streamsearch": "~0.1.2"
2942 | }
2943 | }
2944 | }
2945 | },
2946 | "ssh2-streams": {
2947 | "version": "0.0.23",
2948 | "resolved": "https://registry.npmjs.org/ssh2-streams/-/ssh2-streams-0.0.23.tgz",
2949 | "integrity": "sha1-ru8wgxu1/Er2qj9tCiYaQTUxYSs=",
2950 | "requires": {
2951 | "asn1": "~0.2.0",
2952 | "readable-stream": "~1.0.0",
2953 | "streamsearch": "~0.1.2"
2954 | },
2955 | "dependencies": {
2956 | "isarray": {
2957 | "version": "0.0.1",
2958 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz",
2959 | "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8="
2960 | },
2961 | "readable-stream": {
2962 | "version": "1.0.34",
2963 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz",
2964 | "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=",
2965 | "requires": {
2966 | "core-util-is": "~1.0.0",
2967 | "inherits": "~2.0.1",
2968 | "isarray": "0.0.1",
2969 | "string_decoder": "~0.10.x"
2970 | }
2971 | },
2972 | "string_decoder": {
2973 | "version": "0.10.31",
2974 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz",
2975 | "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ="
2976 | }
2977 | }
2978 | },
2979 | "standard-version": {
2980 | "version": "8.0.0",
2981 | "resolved": "https://registry.npmjs.org/standard-version/-/standard-version-8.0.0.tgz",
2982 | "integrity": "sha512-cS/U9yhYPHfyokFce6e/H3U8MaKwZKSGzH25J776sChrae/doDQjsl3vCQ0hW1MSzdrUTb7pir4ApjnbDt/TAg==",
2983 | "dev": true,
2984 | "requires": {
2985 | "chalk": "2.4.2",
2986 | "conventional-changelog": "3.1.18",
2987 | "conventional-changelog-config-spec": "2.1.0",
2988 | "conventional-changelog-conventionalcommits": "4.2.3",
2989 | "conventional-recommended-bump": "6.0.5",
2990 | "detect-indent": "6.0.0",
2991 | "detect-newline": "3.1.0",
2992 | "dotgitignore": "2.1.0",
2993 | "figures": "3.1.0",
2994 | "find-up": "4.1.0",
2995 | "fs-access": "1.0.1",
2996 | "git-semver-tags": "3.0.1",
2997 | "semver": "7.1.1",
2998 | "stringify-package": "1.0.1",
2999 | "yargs": "15.3.1"
3000 | },
3001 | "dependencies": {
3002 | "ansi-regex": {
3003 | "version": "5.0.0",
3004 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz",
3005 | "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==",
3006 | "dev": true
3007 | },
3008 | "ansi-styles": {
3009 | "version": "4.2.1",
3010 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz",
3011 | "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==",
3012 | "dev": true,
3013 | "requires": {
3014 | "@types/color-name": "^1.1.1",
3015 | "color-convert": "^2.0.1"
3016 | }
3017 | },
3018 | "camelcase": {
3019 | "version": "5.3.1",
3020 | "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz",
3021 | "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==",
3022 | "dev": true
3023 | },
3024 | "cliui": {
3025 | "version": "6.0.0",
3026 | "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz",
3027 | "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==",
3028 | "dev": true,
3029 | "requires": {
3030 | "string-width": "^4.2.0",
3031 | "strip-ansi": "^6.0.0",
3032 | "wrap-ansi": "^6.2.0"
3033 | }
3034 | },
3035 | "color-convert": {
3036 | "version": "2.0.1",
3037 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
3038 | "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
3039 | "dev": true,
3040 | "requires": {
3041 | "color-name": "~1.1.4"
3042 | }
3043 | },
3044 | "color-name": {
3045 | "version": "1.1.4",
3046 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
3047 | "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
3048 | "dev": true
3049 | },
3050 | "emoji-regex": {
3051 | "version": "8.0.0",
3052 | "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
3053 | "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
3054 | "dev": true
3055 | },
3056 | "find-up": {
3057 | "version": "4.1.0",
3058 | "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz",
3059 | "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==",
3060 | "dev": true,
3061 | "requires": {
3062 | "locate-path": "^5.0.0",
3063 | "path-exists": "^4.0.0"
3064 | }
3065 | },
3066 | "is-fullwidth-code-point": {
3067 | "version": "3.0.0",
3068 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
3069 | "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
3070 | "dev": true
3071 | },
3072 | "locate-path": {
3073 | "version": "5.0.0",
3074 | "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz",
3075 | "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==",
3076 | "dev": true,
3077 | "requires": {
3078 | "p-locate": "^4.1.0"
3079 | }
3080 | },
3081 | "p-limit": {
3082 | "version": "2.3.0",
3083 | "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz",
3084 | "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==",
3085 | "dev": true,
3086 | "requires": {
3087 | "p-try": "^2.0.0"
3088 | }
3089 | },
3090 | "p-locate": {
3091 | "version": "4.1.0",
3092 | "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz",
3093 | "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==",
3094 | "dev": true,
3095 | "requires": {
3096 | "p-limit": "^2.2.0"
3097 | }
3098 | },
3099 | "path-exists": {
3100 | "version": "4.0.0",
3101 | "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz",
3102 | "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==",
3103 | "dev": true
3104 | },
3105 | "string-width": {
3106 | "version": "4.2.0",
3107 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz",
3108 | "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==",
3109 | "dev": true,
3110 | "requires": {
3111 | "emoji-regex": "^8.0.0",
3112 | "is-fullwidth-code-point": "^3.0.0",
3113 | "strip-ansi": "^6.0.0"
3114 | }
3115 | },
3116 | "strip-ansi": {
3117 | "version": "6.0.0",
3118 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz",
3119 | "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==",
3120 | "dev": true,
3121 | "requires": {
3122 | "ansi-regex": "^5.0.0"
3123 | }
3124 | },
3125 | "wrap-ansi": {
3126 | "version": "6.2.0",
3127 | "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz",
3128 | "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==",
3129 | "dev": true,
3130 | "requires": {
3131 | "ansi-styles": "^4.0.0",
3132 | "string-width": "^4.1.0",
3133 | "strip-ansi": "^6.0.0"
3134 | }
3135 | },
3136 | "yargs": {
3137 | "version": "15.3.1",
3138 | "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.3.1.tgz",
3139 | "integrity": "sha512-92O1HWEjw27sBfgmXiixJWT5hRBp2eobqXicLtPBIDBhYB+1HpwZlXmbW2luivBJHBzki+7VyCLRtAkScbTBQA==",
3140 | "dev": true,
3141 | "requires": {
3142 | "cliui": "^6.0.0",
3143 | "decamelize": "^1.2.0",
3144 | "find-up": "^4.1.0",
3145 | "get-caller-file": "^2.0.1",
3146 | "require-directory": "^2.1.1",
3147 | "require-main-filename": "^2.0.0",
3148 | "set-blocking": "^2.0.0",
3149 | "string-width": "^4.2.0",
3150 | "which-module": "^2.0.0",
3151 | "y18n": "^4.0.0",
3152 | "yargs-parser": "^18.1.1"
3153 | }
3154 | },
3155 | "yargs-parser": {
3156 | "version": "18.1.3",
3157 | "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz",
3158 | "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==",
3159 | "dev": true,
3160 | "requires": {
3161 | "camelcase": "^5.0.0",
3162 | "decamelize": "^1.2.0"
3163 | }
3164 | }
3165 | }
3166 | },
3167 | "streamsearch": {
3168 | "version": "0.1.2",
3169 | "resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-0.1.2.tgz",
3170 | "integrity": "sha1-gIudDlb8Jz2Am6VzOOkpkZoanxo="
3171 | },
3172 | "strict-uri-encode": {
3173 | "version": "1.1.0",
3174 | "resolved": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz",
3175 | "integrity": "sha1-J5siXfHVgrH1TmWt3UNS4Y+qBxM="
3176 | },
3177 | "string-width": {
3178 | "version": "2.1.1",
3179 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz",
3180 | "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==",
3181 | "dev": true,
3182 | "requires": {
3183 | "is-fullwidth-code-point": "^2.0.0",
3184 | "strip-ansi": "^4.0.0"
3185 | }
3186 | },
3187 | "string.prototype.trimend": {
3188 | "version": "1.0.1",
3189 | "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.1.tgz",
3190 | "integrity": "sha512-LRPxFUaTtpqYsTeNKaFOw3R4bxIzWOnbQ837QfBylo8jIxtcbK/A/sMV7Q+OAV/vWo+7s25pOE10KYSjaSO06g==",
3191 | "dev": true,
3192 | "requires": {
3193 | "define-properties": "^1.1.3",
3194 | "es-abstract": "^1.17.5"
3195 | }
3196 | },
3197 | "string.prototype.trimleft": {
3198 | "version": "2.1.2",
3199 | "resolved": "https://registry.npmjs.org/string.prototype.trimleft/-/string.prototype.trimleft-2.1.2.tgz",
3200 | "integrity": "sha512-gCA0tza1JBvqr3bfAIFJGqfdRTyPae82+KTnm3coDXkZN9wnuW3HjGgN386D7hfv5CHQYCI022/rJPVlqXyHSw==",
3201 | "dev": true,
3202 | "requires": {
3203 | "define-properties": "^1.1.3",
3204 | "es-abstract": "^1.17.5",
3205 | "string.prototype.trimstart": "^1.0.0"
3206 | }
3207 | },
3208 | "string.prototype.trimright": {
3209 | "version": "2.1.2",
3210 | "resolved": "https://registry.npmjs.org/string.prototype.trimright/-/string.prototype.trimright-2.1.2.tgz",
3211 | "integrity": "sha512-ZNRQ7sY3KroTaYjRS6EbNiiHrOkjihL9aQE/8gfQ4DtAC/aEBRHFJa44OmoWxGGqXuJlfKkZW4WcXErGr+9ZFg==",
3212 | "dev": true,
3213 | "requires": {
3214 | "define-properties": "^1.1.3",
3215 | "es-abstract": "^1.17.5",
3216 | "string.prototype.trimend": "^1.0.0"
3217 | }
3218 | },
3219 | "string.prototype.trimstart": {
3220 | "version": "1.0.1",
3221 | "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.1.tgz",
3222 | "integrity": "sha512-XxZn+QpvrBI1FOcg6dIpxUPgWCPuNXvMD72aaRaUQv1eD4e/Qy8i/hFTe0BUmD60p/QA6bh1avmuPTfNjqVWRw==",
3223 | "dev": true,
3224 | "requires": {
3225 | "define-properties": "^1.1.3",
3226 | "es-abstract": "^1.17.5"
3227 | }
3228 | },
3229 | "string_decoder": {
3230 | "version": "1.1.1",
3231 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
3232 | "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
3233 | "requires": {
3234 | "safe-buffer": "~5.1.0"
3235 | }
3236 | },
3237 | "stringify-package": {
3238 | "version": "1.0.1",
3239 | "resolved": "https://registry.npmjs.org/stringify-package/-/stringify-package-1.0.1.tgz",
3240 | "integrity": "sha512-sa4DUQsYciMP1xhKWGuFM04fB0LG/9DlluZoSVywUMRNvzid6XucHK0/90xGxRoHrAaROrcHK1aPKaijCtSrhg==",
3241 | "dev": true
3242 | },
3243 | "strip-ansi": {
3244 | "version": "4.0.0",
3245 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz",
3246 | "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=",
3247 | "dev": true,
3248 | "requires": {
3249 | "ansi-regex": "^3.0.0"
3250 | }
3251 | },
3252 | "strip-bom": {
3253 | "version": "3.0.0",
3254 | "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz",
3255 | "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=",
3256 | "dev": true
3257 | },
3258 | "strip-dirs": {
3259 | "version": "2.1.0",
3260 | "resolved": "https://registry.npmjs.org/strip-dirs/-/strip-dirs-2.1.0.tgz",
3261 | "integrity": "sha512-JOCxOeKLm2CAS73y/U4ZeZPTkE+gNVCzKt7Eox84Iej1LT/2pTWYpZKJuxwQpvX1LiZb1xokNR7RLfuBAa7T3g==",
3262 | "requires": {
3263 | "is-natural-number": "^4.0.1"
3264 | }
3265 | },
3266 | "strip-indent": {
3267 | "version": "2.0.0",
3268 | "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-2.0.0.tgz",
3269 | "integrity": "sha1-XvjbKV0B5u1sv3qrlpmNeCJSe2g=",
3270 | "dev": true
3271 | },
3272 | "strip-json-comments": {
3273 | "version": "3.0.1",
3274 | "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.0.1.tgz",
3275 | "integrity": "sha512-VTyMAUfdm047mwKl+u79WIdrZxtFtn+nBxHeb844XBQ9uMNTuTHdx2hc5RiAJYqwTj3wc/xe5HLSdJSkJ+WfZw==",
3276 | "dev": true
3277 | },
3278 | "strip-outer": {
3279 | "version": "1.0.1",
3280 | "resolved": "https://registry.npmjs.org/strip-outer/-/strip-outer-1.0.1.tgz",
3281 | "integrity": "sha512-k55yxKHwaXnpYGsOzg4Vl8+tDrWylxDEpknGjhTiZB8dFRU5rTo9CAzeycivxV3s+zlTKwrs6WxMxR95n26kwg==",
3282 | "requires": {
3283 | "escape-string-regexp": "^1.0.2"
3284 | }
3285 | },
3286 | "supports-color": {
3287 | "version": "5.4.0",
3288 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz",
3289 | "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==",
3290 | "dev": true,
3291 | "requires": {
3292 | "has-flag": "^3.0.0"
3293 | }
3294 | },
3295 | "tar": {
3296 | "version": "5.0.5",
3297 | "resolved": "https://registry.npmjs.org/tar/-/tar-5.0.5.tgz",
3298 | "integrity": "sha512-MNIgJddrV2TkuwChwcSNds/5E9VijOiw7kAc1y5hTNJoLDSuIyid2QtLYiCYNnICebpuvjhPQZsXwUL0O3l7OQ==",
3299 | "requires": {
3300 | "chownr": "^1.1.3",
3301 | "fs-minipass": "^2.0.0",
3302 | "minipass": "^3.0.0",
3303 | "minizlib": "^2.1.0",
3304 | "mkdirp": "^0.5.0",
3305 | "yallist": "^4.0.0"
3306 | }
3307 | },
3308 | "tar-stream": {
3309 | "version": "1.6.2",
3310 | "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-1.6.2.tgz",
3311 | "integrity": "sha512-rzS0heiNf8Xn7/mpdSVVSMAWAoy9bfb1WOTYC78Z0UQKeKa/CWS8FOq0lKGNa8DWKAn9gxjCvMLYc5PGXYlK2A==",
3312 | "requires": {
3313 | "bl": "^1.0.0",
3314 | "buffer-alloc": "^1.2.0",
3315 | "end-of-stream": "^1.0.0",
3316 | "fs-constants": "^1.0.0",
3317 | "readable-stream": "^2.3.0",
3318 | "to-buffer": "^1.1.1",
3319 | "xtend": "^4.0.0"
3320 | }
3321 | },
3322 | "text-extensions": {
3323 | "version": "1.9.0",
3324 | "resolved": "https://registry.npmjs.org/text-extensions/-/text-extensions-1.9.0.tgz",
3325 | "integrity": "sha512-wiBrwC1EhBelW12Zy26JeOUkQ5mRu+5o8rpsJk5+2t+Y5vE7e842qtZDQ2g1NpX/29HdyFeJ4nSIhI47ENSxlQ==",
3326 | "dev": true
3327 | },
3328 | "through": {
3329 | "version": "2.3.8",
3330 | "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz",
3331 | "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU="
3332 | },
3333 | "through2": {
3334 | "version": "3.0.1",
3335 | "resolved": "https://registry.npmjs.org/through2/-/through2-3.0.1.tgz",
3336 | "integrity": "sha512-M96dvTalPT3YbYLaKaCuwu+j06D/8Jfib0o/PxbVt6Amhv3dUAtW6rTV1jPgJSBG83I/e04Y6xkVdVhSRhi0ww==",
3337 | "dev": true,
3338 | "requires": {
3339 | "readable-stream": "2 || 3"
3340 | }
3341 | },
3342 | "timed-out": {
3343 | "version": "4.0.1",
3344 | "resolved": "https://registry.npmjs.org/timed-out/-/timed-out-4.0.1.tgz",
3345 | "integrity": "sha1-8y6srFoXW+ol1/q1Zas+2HQe9W8="
3346 | },
3347 | "to-buffer": {
3348 | "version": "1.1.1",
3349 | "resolved": "https://registry.npmjs.org/to-buffer/-/to-buffer-1.1.1.tgz",
3350 | "integrity": "sha512-lx9B5iv7msuFYE3dytT+KE5tap+rNYw+K4jVkb9R/asAb+pbBSM17jtunHplhBe6RRJdZx3Pn2Jph24O32mOVg=="
3351 | },
3352 | "to-regex-range": {
3353 | "version": "5.0.1",
3354 | "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
3355 | "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
3356 | "dev": true,
3357 | "requires": {
3358 | "is-number": "^7.0.0"
3359 | }
3360 | },
3361 | "trim-newlines": {
3362 | "version": "2.0.0",
3363 | "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-2.0.0.tgz",
3364 | "integrity": "sha1-tAPQuRvlDDMd/EuC7s6yLD3hbSA=",
3365 | "dev": true
3366 | },
3367 | "trim-off-newlines": {
3368 | "version": "1.0.1",
3369 | "resolved": "https://registry.npmjs.org/trim-off-newlines/-/trim-off-newlines-1.0.1.tgz",
3370 | "integrity": "sha1-n5up2e+odkw4dpi8v+sshI8RrbM=",
3371 | "dev": true
3372 | },
3373 | "trim-repeated": {
3374 | "version": "1.0.0",
3375 | "resolved": "https://registry.npmjs.org/trim-repeated/-/trim-repeated-1.0.0.tgz",
3376 | "integrity": "sha1-42RqLqTokTEr9+rObPsFOAvAHCE=",
3377 | "requires": {
3378 | "escape-string-regexp": "^1.0.2"
3379 | }
3380 | },
3381 | "tweetnacl": {
3382 | "version": "0.14.5",
3383 | "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz",
3384 | "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q="
3385 | },
3386 | "type-detect": {
3387 | "version": "4.0.8",
3388 | "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz",
3389 | "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==",
3390 | "dev": true
3391 | },
3392 | "typedarray": {
3393 | "version": "0.0.6",
3394 | "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz",
3395 | "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=",
3396 | "dev": true
3397 | },
3398 | "uglify-js": {
3399 | "version": "3.9.2",
3400 | "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.9.2.tgz",
3401 | "integrity": "sha512-zGVwKslUAD/EeqOrD1nQaBmXIHl1Vw371we8cvS8I6mYK9rmgX5tv8AAeJdfsQ3Kk5mGax2SVV/AizxdNGhl7Q==",
3402 | "dev": true,
3403 | "optional": true,
3404 | "requires": {
3405 | "commander": "~2.20.3"
3406 | },
3407 | "dependencies": {
3408 | "commander": {
3409 | "version": "2.20.3",
3410 | "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz",
3411 | "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==",
3412 | "dev": true,
3413 | "optional": true
3414 | }
3415 | }
3416 | },
3417 | "unbzip2-stream": {
3418 | "version": "1.4.3",
3419 | "resolved": "https://registry.npmjs.org/unbzip2-stream/-/unbzip2-stream-1.4.3.tgz",
3420 | "integrity": "sha512-mlExGW4w71ebDJviH16lQLtZS32VKqsSfk80GCfUlwT/4/hNRFsoscrF/c++9xinkMzECL1uL9DDwXqFWkruPg==",
3421 | "requires": {
3422 | "buffer": "^5.2.1",
3423 | "through": "^2.3.8"
3424 | }
3425 | },
3426 | "universalify": {
3427 | "version": "1.0.0",
3428 | "resolved": "https://registry.npmjs.org/universalify/-/universalify-1.0.0.tgz",
3429 | "integrity": "sha512-rb6X1W158d7pRQBg5gkR8uPaSfiids68LTJQYOtEUhoJUWBdaQHsuT/EUduxXYxcrt4r5PJ4fuHW1MHT6p0qug=="
3430 | },
3431 | "url-parse-lax": {
3432 | "version": "3.0.0",
3433 | "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-3.0.0.tgz",
3434 | "integrity": "sha1-FrXK/Afb42dsGxmZF3gj1lA6yww=",
3435 | "requires": {
3436 | "prepend-http": "^2.0.0"
3437 | }
3438 | },
3439 | "url-to-options": {
3440 | "version": "1.0.1",
3441 | "resolved": "https://registry.npmjs.org/url-to-options/-/url-to-options-1.0.1.tgz",
3442 | "integrity": "sha1-FQWgOiiaSMvXpDTvuu7FBV9WM6k="
3443 | },
3444 | "util-deprecate": {
3445 | "version": "1.0.2",
3446 | "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
3447 | "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8="
3448 | },
3449 | "validate-npm-package-license": {
3450 | "version": "3.0.4",
3451 | "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz",
3452 | "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==",
3453 | "dev": true,
3454 | "requires": {
3455 | "spdx-correct": "^3.0.0",
3456 | "spdx-expression-parse": "^3.0.0"
3457 | }
3458 | },
3459 | "which": {
3460 | "version": "2.0.2",
3461 | "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
3462 | "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
3463 | "dev": true,
3464 | "requires": {
3465 | "isexe": "^2.0.0"
3466 | }
3467 | },
3468 | "which-module": {
3469 | "version": "2.0.0",
3470 | "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz",
3471 | "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho="
3472 | },
3473 | "wide-align": {
3474 | "version": "1.1.3",
3475 | "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz",
3476 | "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==",
3477 | "dev": true,
3478 | "requires": {
3479 | "string-width": "^1.0.2 || 2"
3480 | }
3481 | },
3482 | "wordwrap": {
3483 | "version": "1.0.0",
3484 | "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz",
3485 | "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=",
3486 | "dev": true
3487 | },
3488 | "workerpool": {
3489 | "version": "6.0.0",
3490 | "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.0.0.tgz",
3491 | "integrity": "sha512-fU2OcNA/GVAJLLyKUoHkAgIhKb0JoCpSjLC/G2vYKxUjVmQwGbRVeoPJ1a8U4pnVofz4AQV5Y/NEw8oKqxEBtA==",
3492 | "dev": true
3493 | },
3494 | "wrap-ansi": {
3495 | "version": "5.1.0",
3496 | "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz",
3497 | "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==",
3498 | "dev": true,
3499 | "requires": {
3500 | "ansi-styles": "^3.2.0",
3501 | "string-width": "^3.0.0",
3502 | "strip-ansi": "^5.0.0"
3503 | },
3504 | "dependencies": {
3505 | "ansi-regex": {
3506 | "version": "4.1.0",
3507 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz",
3508 | "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==",
3509 | "dev": true
3510 | },
3511 | "string-width": {
3512 | "version": "3.1.0",
3513 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz",
3514 | "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==",
3515 | "dev": true,
3516 | "requires": {
3517 | "emoji-regex": "^7.0.1",
3518 | "is-fullwidth-code-point": "^2.0.0",
3519 | "strip-ansi": "^5.1.0"
3520 | }
3521 | },
3522 | "strip-ansi": {
3523 | "version": "5.2.0",
3524 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz",
3525 | "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==",
3526 | "dev": true,
3527 | "requires": {
3528 | "ansi-regex": "^4.1.0"
3529 | }
3530 | }
3531 | }
3532 | },
3533 | "wrappy": {
3534 | "version": "1.0.2",
3535 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
3536 | "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8="
3537 | },
3538 | "xtend": {
3539 | "version": "4.0.1",
3540 | "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz",
3541 | "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68="
3542 | },
3543 | "y18n": {
3544 | "version": "4.0.0",
3545 | "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz",
3546 | "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w=="
3547 | },
3548 | "yallist": {
3549 | "version": "4.0.0",
3550 | "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
3551 | "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A=="
3552 | },
3553 | "yargs": {
3554 | "version": "15.3.1",
3555 | "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.3.1.tgz",
3556 | "integrity": "sha512-92O1HWEjw27sBfgmXiixJWT5hRBp2eobqXicLtPBIDBhYB+1HpwZlXmbW2luivBJHBzki+7VyCLRtAkScbTBQA==",
3557 | "requires": {
3558 | "cliui": "^6.0.0",
3559 | "decamelize": "^1.2.0",
3560 | "find-up": "^4.1.0",
3561 | "get-caller-file": "^2.0.1",
3562 | "require-directory": "^2.1.1",
3563 | "require-main-filename": "^2.0.0",
3564 | "set-blocking": "^2.0.0",
3565 | "string-width": "^4.2.0",
3566 | "which-module": "^2.0.0",
3567 | "y18n": "^4.0.0",
3568 | "yargs-parser": "^18.1.1"
3569 | },
3570 | "dependencies": {
3571 | "ansi-regex": {
3572 | "version": "5.0.0",
3573 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz",
3574 | "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg=="
3575 | },
3576 | "ansi-styles": {
3577 | "version": "4.2.1",
3578 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz",
3579 | "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==",
3580 | "requires": {
3581 | "@types/color-name": "^1.1.1",
3582 | "color-convert": "^2.0.1"
3583 | }
3584 | },
3585 | "camelcase": {
3586 | "version": "5.3.1",
3587 | "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz",
3588 | "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg=="
3589 | },
3590 | "cliui": {
3591 | "version": "6.0.0",
3592 | "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz",
3593 | "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==",
3594 | "requires": {
3595 | "string-width": "^4.2.0",
3596 | "strip-ansi": "^6.0.0",
3597 | "wrap-ansi": "^6.2.0"
3598 | }
3599 | },
3600 | "color-convert": {
3601 | "version": "2.0.1",
3602 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
3603 | "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
3604 | "requires": {
3605 | "color-name": "~1.1.4"
3606 | }
3607 | },
3608 | "color-name": {
3609 | "version": "1.1.4",
3610 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
3611 | "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="
3612 | },
3613 | "emoji-regex": {
3614 | "version": "8.0.0",
3615 | "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
3616 | "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A=="
3617 | },
3618 | "find-up": {
3619 | "version": "4.1.0",
3620 | "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz",
3621 | "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==",
3622 | "requires": {
3623 | "locate-path": "^5.0.0",
3624 | "path-exists": "^4.0.0"
3625 | }
3626 | },
3627 | "is-fullwidth-code-point": {
3628 | "version": "3.0.0",
3629 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
3630 | "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg=="
3631 | },
3632 | "locate-path": {
3633 | "version": "5.0.0",
3634 | "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz",
3635 | "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==",
3636 | "requires": {
3637 | "p-locate": "^4.1.0"
3638 | }
3639 | },
3640 | "p-limit": {
3641 | "version": "2.2.2",
3642 | "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.2.tgz",
3643 | "integrity": "sha512-WGR+xHecKTr7EbUEhyLSh5Dube9JtdiG78ufaeLxTgpudf/20KqyMioIUZJAezlTIi6evxuoUs9YXc11cU+yzQ==",
3644 | "requires": {
3645 | "p-try": "^2.0.0"
3646 | }
3647 | },
3648 | "p-locate": {
3649 | "version": "4.1.0",
3650 | "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz",
3651 | "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==",
3652 | "requires": {
3653 | "p-limit": "^2.2.0"
3654 | }
3655 | },
3656 | "path-exists": {
3657 | "version": "4.0.0",
3658 | "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz",
3659 | "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w=="
3660 | },
3661 | "string-width": {
3662 | "version": "4.2.0",
3663 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz",
3664 | "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==",
3665 | "requires": {
3666 | "emoji-regex": "^8.0.0",
3667 | "is-fullwidth-code-point": "^3.0.0",
3668 | "strip-ansi": "^6.0.0"
3669 | }
3670 | },
3671 | "strip-ansi": {
3672 | "version": "6.0.0",
3673 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz",
3674 | "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==",
3675 | "requires": {
3676 | "ansi-regex": "^5.0.0"
3677 | }
3678 | },
3679 | "wrap-ansi": {
3680 | "version": "6.2.0",
3681 | "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz",
3682 | "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==",
3683 | "requires": {
3684 | "ansi-styles": "^4.0.0",
3685 | "string-width": "^4.1.0",
3686 | "strip-ansi": "^6.0.0"
3687 | }
3688 | },
3689 | "yargs-parser": {
3690 | "version": "18.1.1",
3691 | "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.1.tgz",
3692 | "integrity": "sha512-KRHEsOM16IX7XuLnMOqImcPNbLVXMNHYAoFc3BKR8Ortl5gzDbtXvvEoGx9imk5E+X1VeNKNlcHr8B8vi+7ipA==",
3693 | "requires": {
3694 | "camelcase": "^5.0.0",
3695 | "decamelize": "^1.2.0"
3696 | }
3697 | }
3698 | }
3699 | },
3700 | "yargs-parser": {
3701 | "version": "13.1.2",
3702 | "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz",
3703 | "integrity": "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==",
3704 | "dev": true,
3705 | "requires": {
3706 | "camelcase": "^5.0.0",
3707 | "decamelize": "^1.2.0"
3708 | },
3709 | "dependencies": {
3710 | "camelcase": {
3711 | "version": "5.3.1",
3712 | "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz",
3713 | "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==",
3714 | "dev": true
3715 | }
3716 | }
3717 | },
3718 | "yargs-unparser": {
3719 | "version": "1.6.0",
3720 | "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-1.6.0.tgz",
3721 | "integrity": "sha512-W9tKgmSn0DpSatfri0nx52Joq5hVXgeLiqR/5G0sZNDoLZFOr/xjBUDcShCOGNsBnEMNo1KAMBkTej1Hm62HTw==",
3722 | "dev": true,
3723 | "requires": {
3724 | "flat": "^4.1.0",
3725 | "lodash": "^4.17.15",
3726 | "yargs": "^13.3.0"
3727 | },
3728 | "dependencies": {
3729 | "ansi-regex": {
3730 | "version": "4.1.0",
3731 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz",
3732 | "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==",
3733 | "dev": true
3734 | },
3735 | "string-width": {
3736 | "version": "3.1.0",
3737 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz",
3738 | "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==",
3739 | "dev": true,
3740 | "requires": {
3741 | "emoji-regex": "^7.0.1",
3742 | "is-fullwidth-code-point": "^2.0.0",
3743 | "strip-ansi": "^5.1.0"
3744 | }
3745 | },
3746 | "strip-ansi": {
3747 | "version": "5.2.0",
3748 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz",
3749 | "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==",
3750 | "dev": true,
3751 | "requires": {
3752 | "ansi-regex": "^4.1.0"
3753 | }
3754 | },
3755 | "yargs": {
3756 | "version": "13.3.2",
3757 | "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz",
3758 | "integrity": "sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==",
3759 | "dev": true,
3760 | "requires": {
3761 | "cliui": "^5.0.0",
3762 | "find-up": "^3.0.0",
3763 | "get-caller-file": "^2.0.1",
3764 | "require-directory": "^2.1.1",
3765 | "require-main-filename": "^2.0.0",
3766 | "set-blocking": "^2.0.0",
3767 | "string-width": "^3.0.0",
3768 | "which-module": "^2.0.0",
3769 | "y18n": "^4.0.0",
3770 | "yargs-parser": "^13.1.2"
3771 | }
3772 | }
3773 | }
3774 | },
3775 | "yauzl": {
3776 | "version": "2.10.0",
3777 | "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz",
3778 | "integrity": "sha1-x+sXyT4RLLEIb6bY5R+wZnt5pfk=",
3779 | "requires": {
3780 | "buffer-crc32": "~0.2.3",
3781 | "fd-slicer": "~1.1.0"
3782 | }
3783 | }
3784 | }
3785 | }
3786 |
--------------------------------------------------------------------------------
/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "node-virtualbox",
3 | "version": "0.2.4",
4 | "description": "A lightweight tool/module for provisioning VirtualBox virtual machines.",
5 | "main": "index.js",
6 | "scripts": {
7 | "test": "mocha test/integration/*.js",
8 | "release": "standard-version"
9 | },
10 | "repository": {
11 | "type": "git",
12 | "url": "git+https://github.com/ottomatica/node-virtualbox.git"
13 | },
14 | "keywords": [
15 | "vagrant",
16 | "virtualbox"
17 | ],
18 | "author": "ottomatica",
19 | "license": "Apache-2.0",
20 | "bugs": {
21 | "url": "https://github.com/ottomatica/node-virtualbox/issues"
22 | },
23 | "homepage": "https://github.com/ottomatica/node-virtualbox#readme",
24 | "bin": "bin.js",
25 | "dependencies": {
26 | "bluebird": "^3.5.1",
27 | "download": "^8.0.0",
28 | "fs-extra": "^9.0.1",
29 | "ip": "^1.1.5",
30 | "is-port-available": "^0.1.5",
31 | "lodash": "^4.17.10",
32 | "md5-file": "^4.0.0",
33 | "mustache": "^4.0.0",
34 | "progress": "^2.0.0",
35 | "scp2": "^0.5.0",
36 | "ssh2": "^0.8.2",
37 | "tar": "^5.0.5",
38 | "yargs": "^15.0.1"
39 | },
40 | "devDependencies": {
41 | "chai": "^4.1.2",
42 | "mocha": "^8.0.1",
43 | "standard-version": "^8.0.0"
44 | }
45 | }
46 |
--------------------------------------------------------------------------------
/test/integration/micros.js:
--------------------------------------------------------------------------------
1 | const child_process = require('child_process');
2 | const os = require('os');
3 | const chai = require('chai');
4 | const expect = chai.expect;
5 | const path = require('path');
6 |
7 | const util = require('../../lib/util');
8 |
9 | describe('node-virtualbox should create micro vm with disk and shared folder, and stop and destroy it', function() {
10 | this.timeout(2000000);
11 | it('should create micro vm', function(done) {
12 | let testSharedPath = path.join(os.homedir(),'.baker');
13 | var child = child_process.exec(`node bin.js --micro --vmname "micro-vm" --ssh_port 2050 --verbose --disk --sync "${testSharedPath};/data"`,
14 | {}, function(error, stdout, stderr)
15 | {
16 | if( error ) console.log(stderr || stdout);
17 | expect(error).to.be.null;
18 | done();
19 | });
20 | child.stdout.pipe(process.stdout);
21 | });
22 |
23 | it('should have shared folder in micro vm', async function()
24 | {
25 | let cmd = `ls /data`;
26 | let sshKeyPath = path.join('config','resources','baker_rsa');
27 | let buffer = await util.sshExec(cmd, {port: 2050, user: 'root', private_key: sshKeyPath}, 60000);
28 | expect(buffer).to.include('boxes');
29 | });
30 |
31 | it('should stop micro vm', function(done) {
32 | // echo value for prompt input for password.
33 | var child = child_process.exec(`node bin.js --stop --vmname "micro-vm"`,
34 | {}, function(error, stdout, stderr)
35 | {
36 | if( error ) console.log(stderr || stdout);
37 | expect(error).to.be.null;
38 |
39 | done();
40 | });
41 | child.stdout.pipe(process.stdout);
42 | });
43 |
44 | it('should destroy micro vm', function(done) {
45 | // echo value for prompt input for password.
46 | var child = child_process.exec(`node bin.js --delete --vmname "micro-vm"`,
47 | {}, function(error, stdout, stderr)
48 | {
49 | if( error ) console.log(stderr || stdout);
50 | expect(error).to.be.null;
51 |
52 | done();
53 | });
54 | child.stdout.pipe(process.stdout);
55 | });
56 |
57 | });
58 |
--------------------------------------------------------------------------------
/test/integration/sanity-check.js:
--------------------------------------------------------------------------------
1 | const child_process = require('child_process');
2 | const chai = require('chai');
3 | const expect = chai.expect;
4 | const os = require('os');
5 | const path = require('path');
6 | const fs = require('fs-extra');
7 |
8 | describe('node-virtualbox should create pingable vm, and stop and destroy it', function() {
9 | this.timeout(2000000);
10 | it('should create pingable vm', function(done) {
11 | // echo value for prompt input for password.
12 | var child = child_process.exec(`node bin.js --provision --vmname "sanity-check-vm" --ip 172.16.1.44 --port 2092 --verbose`,
13 | {}, function(error, stdout, stderr)
14 | {
15 | if( error ) console.log(stderr || stdout);
16 | expect(error).to.be.null;
17 |
18 | let cmd = process.platform === 'win32' ? `ping 172.16.1.44 -n 5` : `ping 172.16.1.44 -c 5`
19 | let output = child_process.execSync(cmd).toString();
20 | console.log(output);
21 | expect(output).to.include('time=');
22 |
23 | done();
24 | });
25 | child.stdout.pipe(process.stdout);
26 | });
27 |
28 | it('should stop vm', function(done) {
29 | // echo value for prompt input for password.
30 | var child = child_process.exec(`node bin.js --stop --vmname "sanity-check-vm"`,
31 | {}, function(error, stdout, stderr)
32 | {
33 | if( error ) console.log(stderr || stdout);
34 | expect(error).to.be.null;
35 |
36 | done();
37 | });
38 | child.stdout.pipe(process.stdout);
39 | });
40 |
41 | it('should destroy vm', function(done) {
42 | // echo value for prompt input for password.
43 | var child = child_process.exec(`node bin.js --delete --vmname "sanity-check-vm"`,
44 | {}, function(error, stdout, stderr)
45 | {
46 | if( error ) console.log(stderr || stdout);
47 | expect(error).to.be.null;
48 |
49 | done();
50 | });
51 | child.stdout.pipe(process.stdout);
52 | });
53 |
54 | });
55 |
--------------------------------------------------------------------------------
/test/integration/shared-folders.js:
--------------------------------------------------------------------------------
1 | const child_process = require('child_process');
2 | const chai = require('chai');
3 | const expect = chai.expect;
4 | const path = require('path');
5 |
6 | const util = require('../../lib/util');
7 |
8 | describe('node-virtualbox should create vm with shared folder, and stop and destroy it', function() {
9 | this.timeout(2000000);
10 | it('should create vm', function(done) {
11 | let testSharedPath = __dirname;
12 | var child = child_process.exec(`node bin.js --provision --vmname "shared-folders-vm" --ip 172.16.1.47 --ssh_port 2097 --verbose --sync "${testSharedPath};/testShare"`,
13 | {}, function(error, stdout, stderr)
14 | {
15 | if( error ) console.log(stderr || stdout);
16 | expect(error).to.be.null;
17 | done();
18 | });
19 | child.stdout.pipe(process.stdout);
20 | });
21 |
22 | it('should have shared folder in vm', async function()
23 | {
24 | let cmd = `ls /testShare`;
25 | let sshKeyPath = path.join('config','resources','insecure_private_key');
26 | let buffer = await util.sshExec(cmd, {port: 2097, user: 'vagrant', private_key: sshKeyPath}, 60000);
27 | expect(buffer).to.include('shared-folders.js');
28 | });
29 |
30 | it('should stop vm', function(done) {
31 | // echo value for prompt input for password.
32 | var child = child_process.exec(`node bin.js --stop --vmname "shared-folders-vm"`,
33 | {}, function(error, stdout, stderr)
34 | {
35 | if( error ) console.log(stderr || stdout);
36 | expect(error).to.be.null;
37 |
38 | done();
39 | });
40 | child.stdout.pipe(process.stdout);
41 | });
42 |
43 | it('should destroy vm', function(done) {
44 | // echo value for prompt input for password.
45 | var child = child_process.exec(`node bin.js --delete --vmname "shared-folders-vm"`,
46 | {}, function(error, stdout, stderr)
47 | {
48 | if( error ) console.log(stderr || stdout);
49 | expect(error).to.be.null;
50 |
51 | done();
52 | });
53 | child.stdout.pipe(process.stdout);
54 | });
55 |
56 | });
57 |
--------------------------------------------------------------------------------