├── .gitignore ├── .npmignore ├── LICENSE ├── README.md ├── package.json ├── src ├── Client.ts ├── Container.ts ├── Process.ts ├── Profile.ts ├── errors.ts ├── index.ts ├── model │ ├── index.ts │ └── signals.ts └── utilities │ ├── create-error.ts │ └── request.ts ├── test └── integration.test.ts ├── tsconfig.json ├── tslint.json ├── typings └── websocket-stream │ └── index.d.ts └── yarn.lock /.gitignore: -------------------------------------------------------------------------------- 1 | # Logs 2 | logs 3 | *.log 4 | npm-debug.log* 5 | 6 | # Runtime data 7 | pids 8 | *.pid 9 | *.seed 10 | 11 | # Directory for instrumented libs generated by jscoverage/JSCover 12 | lib-cov 13 | 14 | # Coverage directory used by tools like istanbul 15 | coverage 16 | 17 | # Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files) 18 | .grunt 19 | 20 | # node-waf configuration 21 | .lock-wscript 22 | 23 | # Compiled binary addons (http://nodejs.org/api/addons.html) 24 | build/Release 25 | 26 | dist 27 | 28 | # Dependency directory 29 | node_modules 30 | 31 | # Optional npm cache directory 32 | .npm 33 | 34 | # Optional REPL history 35 | .node_repl_history 36 | 37 | # IntelliJ 38 | .idea/ 39 | 40 | # IntelliJ 41 | .vscode/ 42 | 43 | # Test files (binary) 44 | test/*.zip 45 | 46 | package-lock.json 47 | -------------------------------------------------------------------------------- /.npmignore: -------------------------------------------------------------------------------- 1 | # git directory 2 | .git 3 | # Logs 4 | logs 5 | *.log 6 | npm-debug.log* 7 | 8 | # Runtime data 9 | pids 10 | *.pid 11 | *.seed 12 | 13 | # Directory for instrumented libs generated by jscoverage/JSCover 14 | lib-cov 15 | 16 | # Coverage directory used by tools like istanbul 17 | coverage 18 | 19 | # Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files) 20 | .grunt 21 | 22 | # node-waf configuration 23 | .lock-wscript 24 | 25 | # Compiled binary addons (http://nodejs.org/api/addons.html) 26 | build/Release 27 | 28 | # Dependency directory 29 | node_modules 30 | 31 | # Optional npm cache directory 32 | .npm 33 | 34 | # Optional REPL history 35 | .node_repl_history 36 | 37 | # IntelliJ 38 | .idea/ 39 | 40 | # IntelliJ 41 | .vscode/ 42 | 43 | # Test files (binary) 44 | test/*.zip 45 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2019 Truffle Blockchain Group 4 | Copyright (c) 2016 Alan Doherty 5 | 6 | Permission is hereby granted, free of charge, to any person obtaining a copy 7 | of this software and associated documentation files (the "Software"), to deal 8 | in the Software without restriction, including without limitation the rights 9 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 10 | copies of the Software, and to permit persons to whom the Software is 11 | furnished to do so, subject to the following conditions: 12 | 13 | The above copyright notice and this permission notice shall be included in all 14 | copies or substantial portions of the Software. 15 | 16 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 17 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 18 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 19 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 20 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 21 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 22 | SOFTWARE. 23 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | A typescript client for communicating with a local or remote instance of linux containers. The interface is object-oriented, simple and uniform. Unrestrictive with an open MIT license. 2 | 3 | This package was ported from Alan Doherty's [`node-lxd`](https://github.com/alandoherty/node-lxd) and updated to support TypeScript and modern async/await style code. 4 | 5 | This package forked from `node-lxd`, but it should not be considered a drop-in replacement, as we've made several breaking changes. 6 | 7 | # Installing 8 | 9 | ```bash 10 | $ npm install --save node-lxd 11 | ``` 12 | 13 | ## Getting Started ## 14 | 15 | The following example connects to the local LXC instance and launches a new container. 16 | 17 | ```js 18 | import lxd from "ts-lxd"; 19 | 20 | const client = lxd(); 21 | 22 | (async () => { 23 | const container = await client.createContainer("myContainer", "ubuntu"); 24 | await container.start(); 25 | console.log("Started " + container.name()); 26 | })(); 27 | ``` 28 | 29 | ## Example ## 30 | 31 | The following example uses an express application to allow users to create containers and execute commands. 32 | 33 | ```js 34 | // requires 35 | import express, { Request, Response, NextFunction } from "express"; 36 | import lxd, { Client, Container, Process } from "lxd"; 37 | 38 | const client: Client = lxd(); 39 | const app = express(); 40 | 41 | app.post("/create", function(req: Request, res: Response, _next: NextFunction): void { 42 | try { 43 | const container = await client.launchContainer(req.query.name); 44 | res.json({success: true, message: "Container launched"}); 45 | } catch (err) { 46 | res.json({success: false, message: err.getMessage()}); 47 | } 48 | }); 49 | 50 | app.post("/run", async function(req: Request, res: Response, _next: NextFunction) { 51 | try { 52 | const containers: Container[] = await client.containers(); 53 | 54 | for (const container of containers) { 55 | if (container.name === req.query.name) { 56 | let process; 57 | process = await container.run(req.query.cmd.split(" ")); 58 | if (process.stdErr.length > 0) { 59 | res.json({success: false, message: stdErr}); 60 | } else { 61 | res.json({success: true, message: stdOut}); 62 | } 63 | } 64 | } 65 | 66 | res.json({success: false, message: "Container does not exist"}); 67 | } catch (err) { 68 | res.json({success: false, message: err.getMessage()}); 69 | } 70 | }); 71 | 72 | app.listen(3000, function(err) { 73 | if (!err) { 74 | console.log("listening on port 3000"); 75 | } 76 | }); 77 | ``` -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "ts-lxd", 3 | "version": "0.1.9", 4 | "description": "A TypeScript client for LXD container virtualization, ported from node-lxd", 5 | "main": "dist/src/index.js", 6 | "keywords": [ 7 | "lxd", 8 | "lxc", 9 | "container", 10 | "virtualization", 11 | "node-lxd", 12 | "cgroups", 13 | "os", 14 | "linux", 15 | "simple", 16 | "sandbox", 17 | "isolation" 18 | ], 19 | "scripts": { 20 | "lint": "tslint -c tslint.json -p ./tsconfig.json", 21 | "test": "mocha --require ts-node/register ./test/**/*.ts", 22 | "build": "tsc", 23 | "prepare": "yarn build" 24 | }, 25 | "devDependencies": { 26 | "@types/debug": "^4.1.2", 27 | "@types/got": "^9.4.1", 28 | "@types/mocha": "^5.2.6", 29 | "@types/node": "^11.11.7", 30 | "@types/shortid": "^0.0.29", 31 | "@types/ws": "^6.0.1", 32 | "husky": "^1.3.1", 33 | "lint-staged": "^8.1.5", 34 | "mocha": "^6.0.2", 35 | "shortid": "^2.2.14", 36 | "ts-node": "^8.0.3", 37 | "tslint": "^5.13.1", 38 | "typescript": "^3.3.3" 39 | }, 40 | "dependencies": { 41 | "debug": "^4.1.1", 42 | "got": "^9.6.0", 43 | "websocket-stream": "^5.3.0", 44 | "ws": "^7.4.6" 45 | }, 46 | "author": { 47 | "name": "Ben Burns", 48 | "email": "ben@trufflesuite.com", 49 | "url": "https://truffleframework.com" 50 | }, 51 | "license": "MIT", 52 | "repository": { 53 | "type": "git", 54 | "url": "https://github.com/trufflesuite/ts-lxd.git" 55 | }, 56 | "husky": { 57 | "hooks": { 58 | "pre-commit": "lint-staged" 59 | } 60 | }, 61 | "lint-staged": { 62 | "(src|test)/**/*.ts": [ 63 | "tslint -c tslint.json --fix", 64 | "git add" 65 | ] 66 | } 67 | } 68 | -------------------------------------------------------------------------------- /src/Client.ts: -------------------------------------------------------------------------------- 1 | import debugOutput from "debug"; 2 | import { parse as parseUrl } from "url"; 3 | import { Agent } from "https"; 4 | import { existsSync, lstatSync } from "fs"; 5 | import createWebSocketStream, { WebSocketDuplex } from "websocket-stream"; 6 | 7 | import { Container } from "./Container"; 8 | import { Process } from "./Process"; 9 | import { Profile } from "./Profile"; 10 | 11 | import { 12 | IContainersMetadata, 13 | IOperationMetadata, 14 | IExecOperationMetadata, 15 | IContainerMetadata, 16 | IContainerStateMetadata, 17 | IProfilesMetadata, 18 | IProfileMetadata, 19 | IAuthorizeCertificateRequest, 20 | ITrustedInfoMetadata, 21 | } from "./model"; 22 | 23 | import { IRequestOptions as _IRequestOptions, request } from "./utilities/request"; 24 | 25 | const debug = debugOutput("lxd:Client"); 26 | 27 | export interface IRequestOptions { 28 | path: string; 29 | body?: T; 30 | waitForOperationCompletion?: boolean; 31 | } 32 | 33 | // client 34 | export class Client { 35 | /** 36 | * The request.js path for the API. 37 | */ 38 | private _path: string = ""; 39 | 40 | /** 41 | * The web socket path for the API. 42 | */ 43 | private _wsPath: string = ""; 44 | 45 | private _info?: ITrustedInfoMetadata; 46 | 47 | private _local: boolean = false; 48 | 49 | private _agent?: Agent; 50 | 51 | /** 52 | * Gets if the client is connected to a local unix socket. 53 | */ 54 | public get local(): boolean { 55 | return this._local; 56 | } 57 | 58 | private get _unixSocketLocation(): string { 59 | const defaultLocation = "/var/lib/lxd/unix.socket"; 60 | const snapLocation = "/var/snap/lxd/common/lxd/unix.socket"; 61 | 62 | if (existsSync(defaultLocation)) { 63 | if (lstatSync(defaultLocation).isSocket()) { 64 | return defaultLocation; 65 | } else { 66 | throw new Error(`File exists at ${defaultLocation} however it is not a unix socket.`); 67 | } 68 | } 69 | 70 | if (existsSync(snapLocation)) { 71 | if (lstatSync(snapLocation).isSocket()) { 72 | return snapLocation; 73 | throw new Error(`File exists at ${snapLocation} however it is not a unix socket.`); 74 | } 75 | } 76 | 77 | throw new Error("Can't access LXD socket. Please be sure that LXD is installed properly " + 78 | "and that your user has the appropriate permissions."); 79 | } 80 | 81 | /** 82 | * Creates a new LXD client. 83 | * @param host? 84 | * @param authenticate? 85 | */ 86 | constructor(host?: string, authenticate?: { cert: string, key: string, ca: string, password: string }) { 87 | let protocol: string; 88 | let hostname: string; 89 | let port: number; 90 | 91 | if (host) { 92 | this._local = false; 93 | 94 | const hostUrl = parseUrl(host); 95 | protocol = hostUrl.protocol as string; 96 | hostname = hostUrl.hostname as string; 97 | port = parseInt(hostUrl.port as string, 10); 98 | 99 | this._wsPath = "ws://" + hostname; 100 | this._wsPath += port ? ":" + port + "/" : "/"; 101 | 102 | this._path = protocol + "//" + hostname; 103 | this._path += port ? ":" + port + "/" : "/"; 104 | } else { 105 | this._local = true; 106 | this._path = `http://unix:${this._unixSocketLocation}:/`; 107 | this._wsPath = `ws+unix://${this._unixSocketLocation}:/`; 108 | } 109 | 110 | if (authenticate && authenticate.cert && authenticate.key) { 111 | this._agent = new Agent({ 112 | cert: authenticate.cert, 113 | key: authenticate.key, 114 | ca: authenticate.ca, 115 | }); 116 | } 117 | } 118 | 119 | /** 120 | * Gets all containers. 121 | */ 122 | public async getAllContainers(): Promise { 123 | const client = this; 124 | const containerNames: IContainersMetadata = 125 | await this.request({ 126 | path: "GET /containers", 127 | }) as IContainersMetadata; 128 | 129 | return Promise.all(containerNames.map((containerName) => { 130 | return client.getContainer(containerName.split("/").slice(-1)[0]); 131 | })); 132 | } 133 | 134 | /** 135 | * Gets a container with the specified name. 136 | * @param name 137 | */ 138 | public async getContainer(name: string): Promise { 139 | const metadata = await this.request({ 140 | path: "GET /containers/" + name, 141 | }) as IContainerMetadata; 142 | 143 | const state = await this.request({ 144 | path: "GET /containers/" + name + "/state", 145 | }) as IContainerStateMetadata; 146 | 147 | return new Container(this, metadata, state); 148 | } 149 | 150 | public async getProcess(operation: IOperationMetadata, interactive: boolean) { 151 | // socket connect queue 152 | const streams: WebSocketDuplex[] = []; 153 | 154 | const controlFd = interactive === true ? 1 : 3; 155 | const streamCount = interactive === true ? 2 : 4; 156 | 157 | try { 158 | for (let i = 0; i < streamCount; i++) { 159 | const fds = operation.metadata.fds ? operation.metadata.fds : operation.metadata.output; 160 | 161 | if (!fds) { 162 | throw new Error("No streams to connect to!"); 163 | } 164 | 165 | const wsSecret = fds[(i === controlFd) ? "control" : i.toString()]; 166 | const urlSecret = wsSecret ? `?secret=${wsSecret}` : ""; 167 | const baseWsUrl = `${this._wsPath}1.0/operations/${operation.id}/websocket${urlSecret}`; 168 | 169 | if (this._agent) { 170 | streams.push(createWebSocketStream(baseWsUrl)); 171 | } else { 172 | streams.push(createWebSocketStream(baseWsUrl, { 173 | agent: this._agent, 174 | })); 175 | } 176 | } 177 | 178 | return new Process(operation, this, streams); 179 | } catch (err) { 180 | for (const stream of streams) { 181 | stream.end(); 182 | } 183 | throw err; 184 | } 185 | } 186 | 187 | /** 188 | * Gets all profiles. 189 | */ 190 | public async getAllProfiles(): Promise { 191 | const client = this; 192 | const profiles = await this.request({ 193 | path: "GET /profiles", 194 | }) as IProfilesMetadata; 195 | 196 | return Promise.all(profiles.map((profileName) => { 197 | return client.profile(profileName.split("/").slice(-1)[0]); 198 | })); 199 | } 200 | 201 | /** 202 | * Gets a profile by the specified name. 203 | * @param name 204 | */ 205 | public async profile(name: string): Promise { 206 | const metadata = await this.request({ 207 | path: "GET /profiles/" + name, 208 | }) as IProfileMetadata; 209 | return new Profile(this, metadata); 210 | } 211 | 212 | /** 213 | * Authorizes certificate assigned to requests. 214 | * @param password 215 | */ 216 | public async authorizeCertificate(password: string): Promise { 217 | await this.request({ 218 | path: "POST /certificates", body: { type: "client", password }, 219 | }); 220 | } 221 | 222 | /** 223 | * Creates a new container and starts it. 224 | * @param name 225 | * @param image 226 | * @param config 227 | * @param profile 228 | */ 229 | public async launchContainer( 230 | name: string, 231 | image: string, 232 | config: any, 233 | profile?: string, 234 | ): Promise { 235 | const container: Container = await this.createContainer(name, image, config, profile); 236 | await container.start(); 237 | return container; 238 | } 239 | 240 | /** 241 | * Creates a new container. 242 | * @param name 243 | * @param image 244 | * @param config 245 | * @param profile 246 | */ 247 | public async createContainer( 248 | name: string, 249 | image: string, 250 | config?: any, 251 | profile?: string, 252 | ): Promise { 253 | if (config === undefined) { 254 | config = {}; 255 | } 256 | 257 | if (profile === undefined) { 258 | profile = "default"; 259 | } 260 | 261 | // check name length 262 | if (name.length === 0) { 263 | throw new Error("Container name too small"); 264 | } else if (name.length > 64) { 265 | throw new Error("Container name too long"); 266 | } 267 | 268 | const reqOpts = { 269 | path: "POST /containers", 270 | body: { 271 | name, 272 | architecture: "x86_64", 273 | profiles: [profile], 274 | ephemeral: false, 275 | config, 276 | source: { 277 | type: "image", 278 | alias: image, 279 | }, 280 | }, 281 | }; 282 | await this.request(reqOpts); 283 | 284 | return await this.getContainer(name); 285 | } 286 | 287 | /** 288 | * Gets information about the server. 289 | */ 290 | public async getInfo(): Promise { 291 | if (this._info) { 292 | return this._info; 293 | } 294 | 295 | const info: ITrustedInfoMetadata = await this.request({ path: "GET /" }) as ITrustedInfoMetadata; 296 | this._info = info; 297 | debug("LXC " + this._info.environment.server_version + " on " + 298 | this._info.environment.kernel + " using " + 299 | this._info.environment.storage + " v" + 300 | this._info.environment.storage_version); 301 | return info; 302 | } 303 | 304 | public async request(opts: IRequestOptions): Promise> { 305 | const reqOpts: _IRequestOptions = { 306 | ...opts, 307 | baseRequestUrl: this._path, 308 | }; 309 | 310 | if (this._agent) { 311 | reqOpts.agent = this._agent; 312 | } 313 | 314 | return await request(reqOpts); 315 | } 316 | } 317 | 318 | export default Client; 319 | -------------------------------------------------------------------------------- /src/Container.ts: -------------------------------------------------------------------------------- 1 | import fs from "fs"; 2 | import _path from "path"; 3 | import debugLib from "debug"; 4 | import { Client } from "./Client"; 5 | import { Process } from "./Process"; 6 | import { AlreadyStoppedError, AlreadyStartedError } from "./errors"; 7 | import { promisify } from "util"; 8 | import { 9 | IContainerStateMetadata, 10 | IContainerExecRequest, 11 | IExecOperationMetadata, 12 | IOperationMetadata, 13 | MetadataStatus, 14 | IContainerMetadata, 15 | } from "./model"; 16 | 17 | const debug = debugLib("ts-lxd:Container"); 18 | 19 | // file system 20 | export interface IExecOptions { 21 | env?: { 22 | [key: string]: string; 23 | }; 24 | interactive?: boolean; 25 | } 26 | 27 | export class Container { 28 | 29 | private _client: Client; 30 | private _metadata: IContainerMetadata; 31 | private _stateMetadata: IContainerStateMetadata; 32 | 33 | /** 34 | * Gets the metadata for this container. 35 | */ 36 | public get metadata() { 37 | return this._metadata; 38 | } 39 | 40 | /** 41 | * Gets the architecture. 42 | */ 43 | public get architecture() { 44 | return this._metadata.architecture; 45 | } 46 | 47 | /** 48 | * Gets the ephemeral flag 49 | */ 50 | public get ephemeral() { 51 | return this._metadata.ephemeral; 52 | } 53 | 54 | /** 55 | * Gets the stateful flag 56 | */ 57 | public get stateful() { 58 | return this._metadata.stateful; 59 | } 60 | 61 | /** 62 | * Gets the status (Running/Stopped) 63 | */ 64 | public get status() { 65 | return this._metadata.status; 66 | } 67 | 68 | /** 69 | * Gets the container name 70 | */ 71 | public get name() { 72 | return this._metadata.name; 73 | } 74 | 75 | /** 76 | * Creates a new container. 77 | * @param client 78 | * @param metadata 79 | * @param state 80 | */ 81 | constructor(client: Client, metadata: IContainerMetadata, state: IContainerStateMetadata) { 82 | this._client = client; 83 | this._metadata = metadata; 84 | this._stateMetadata = state; 85 | } 86 | 87 | /** 88 | * Sets the container name 89 | */ 90 | public async setName(name: string): Promise { 91 | debug(`Changing name of container '${this.name}' to ${name}`); 92 | try { 93 | const response = await this._client.request<{ name: string }, { name: string }>({ 94 | path: "POST /containers/" + name, 95 | body: { name }, 96 | }) as { name: string }; 97 | 98 | this._metadata.name = response.name; 99 | } catch (err) { 100 | debug(`Error changing name of container '${this.name}' to ${name}: ${err}`); 101 | throw err; 102 | } 103 | } 104 | 105 | /** 106 | * Gets the number of running processes in this container. 107 | */ 108 | public get processCount() { 109 | return this._stateMetadata.processes; 110 | } 111 | 112 | public get state(): MetadataStatus { 113 | return this._stateMetadata.status; 114 | } 115 | 116 | /** 117 | * Gets the interface on this container with the specified name and optional protocol. 118 | * @param dev 119 | * @param protocol 120 | */ 121 | public ip(dev: string, protocol?: string) { 122 | // check if ips unavailable 123 | if (!this._stateMetadata.network) { 124 | return null; 125 | } 126 | 127 | // check if dev unavailable 128 | if (!this._stateMetadata.network[dev]) { 129 | return null; 130 | } 131 | 132 | protocol = protocol || "inet"; 133 | 134 | // get ips 135 | const ips = this._stateMetadata.network[dev].addresses; 136 | 137 | for (const ip of ips) { 138 | if (ip.family === protocol) { 139 | return ip; 140 | } 141 | } 142 | 143 | return null; 144 | } 145 | 146 | /** 147 | * Gets the IPv4 address of this container. 148 | * @returns 149 | */ 150 | public async ipv4(numRetries: number = 15, msBetweenRetries: number = 1000): Promise { 151 | let ip = this.ip("eth0", "inet"); 152 | if (ip) { 153 | return ip.address; 154 | } 155 | 156 | // refresh until IPv4 obtained 157 | const container = this; 158 | let tries = 1; 159 | 160 | return new Promise(async (accept, reject) => { 161 | debug(`Getting IPv4 address of ${this.name}`); 162 | const retry = async () => { 163 | await container.refresh(); 164 | ip = container.ip("eth0", "inet"); 165 | 166 | if (ip) { 167 | return accept(ip.address); 168 | } else { 169 | tries++; 170 | if (tries >= numRetries) { 171 | debug(`IPv4 address of ${this.name} unavailable after 15 tries.`); 172 | reject(new Error("Exceeded retries when fetching address")); 173 | } 174 | debug(`IPv4 address of ${this.name}, retrying.`); 175 | setTimeout(retry, msBetweenRetries); 176 | } 177 | }; 178 | await retry(); 179 | }); 180 | } 181 | 182 | /** 183 | * Gets the IPv6 address of this container. 184 | * @param {function?} callback 185 | * @returns {string|undefined} 186 | */ 187 | public async ipv6(numRetries: number = 15, msBetweenRetries: number = 1000): Promise { 188 | let ip = this.ip("eth0", "inet6"); 189 | if (ip) { 190 | return ip.address; 191 | } 192 | 193 | // refresh until IPv6 obtained 194 | const container = this; 195 | let tries = 0; 196 | 197 | return new Promise(async (accept, reject) => { 198 | debug(`Getting IPv6 address of ${this.name}`); 199 | const retry = async () => { 200 | await container.refresh(); 201 | ip = container.ip("eth0", "inet6"); 202 | 203 | if (ip) { 204 | return accept(ip.address); 205 | } else { 206 | tries++; 207 | if (tries >= numRetries) { 208 | debug(`IPv6 address of ${this.name} unavailable after 15 tries.`); 209 | reject(new Error("Exceeded retries when fetching address")); 210 | } 211 | debug(`IPv6 address of ${this.name}, retrying.`); 212 | setTimeout(retry, msBetweenRetries); 213 | } 214 | }; 215 | await retry(); 216 | }); 217 | } 218 | 219 | /** 220 | * Refreshes the container information. 221 | */ 222 | public async refresh() { 223 | try { 224 | debug(`Refreshing metadata for ${this.name}`); 225 | const metadata = await this._client.request({ 226 | path: "GET /containers/" + this._metadata.name, 227 | }) as IContainerMetadata; 228 | 229 | this._metadata = metadata; 230 | } catch (err) { 231 | debug(`Error refreshing metadata for ${this.name}: ${err}`); 232 | throw err; 233 | } 234 | 235 | try { 236 | // we now have to a seperate query for state information 237 | // which we use heavily 238 | debug(`Refreshing state metadata for ${this.name}`); 239 | const stateMetadata = await this._client.request({ 240 | path: "GET /containers/" + this._metadata.name + "/state", 241 | }) as IContainerStateMetadata; 242 | 243 | this._stateMetadata = stateMetadata; 244 | } catch (err) { 245 | debug(`Error refreshing state metadata for ${this.name}: ${err}`); 246 | throw err; 247 | } 248 | } 249 | 250 | /** 251 | * Executes a terminal command on the container 252 | * @param command The command with arguments. 253 | * @param env The environment data, optional. 254 | */ 255 | public async run( 256 | command: string[], 257 | env?: { [key: string]: string }, 258 | ): Promise<{ stdOut: string, stdErr: string, exitCode: number | undefined }> { 259 | 260 | debug("Running command '", command.join(" "), "' in container", this.name); 261 | let proc: Process; 262 | try { 263 | proc = await this.exec(command, env ? { env } : {}); 264 | } catch (err) { 265 | debug("Error when running command '", command.join(" "), "' in container", `${this.name}:`, err); 266 | throw err; 267 | } 268 | 269 | return new Promise((accept, reject) => { 270 | 271 | // handle stdout/stderr 272 | let stdOut = ""; 273 | let stdErr = ""; 274 | 275 | proc.on("data", (isErr: boolean, msg: string) => { 276 | if (isErr) { 277 | stdErr += msg; 278 | } else { 279 | stdOut += msg; 280 | } 281 | }); 282 | 283 | // handle close 284 | proc.on("close", () => { 285 | process.nextTick(async () => { 286 | accept({ 287 | stdOut, 288 | stdErr, 289 | exitCode: proc.exitCode, 290 | }); 291 | }); 292 | }); 293 | 294 | proc.on("error", (err: any) => { 295 | debug(`Error (from Process error event) when running command '${command.join(" ")}' ` + 296 | `in container ${this.name}:`, err); 297 | reject(err); 298 | }); 299 | }); 300 | } 301 | 302 | /** 303 | * Executes a terminal command on the container. 304 | * @param command The command with arguments. 305 | * @param env The options data, optional. 306 | */ 307 | public async exec(command: string[], options: IExecOptions): Promise { 308 | const interactive = options.interactive || false; 309 | 310 | const body: IContainerExecRequest = { 311 | command, 312 | "environment": options.env || {}, 313 | interactive, 314 | "record-output": false, 315 | "wait-for-websocket": true, 316 | }; 317 | 318 | try { 319 | debug("Executing command '", command.join(" "), "' in container", this.name); 320 | const operation: IOperationMetadata = 321 | await this._client.request({ 322 | path: "POST /containers/" + this.name + "/exec", 323 | body, 324 | waitForOperationCompletion: false, 325 | }) as IOperationMetadata; 326 | 327 | return await this._client.getProcess(operation, interactive); 328 | } catch (err) { 329 | debug("Error when executing command '", command.join(" "), "' in container", `${this.name}:`, err); 330 | throw err; 331 | } 332 | } 333 | 334 | public async stop(timeout: number = 30, force: boolean = false, stateful: boolean = false) { 335 | try { 336 | debug(`Stopping container ${this.name}`); 337 | return await this._setState("stop", timeout, force, stateful); 338 | } catch (err) { 339 | // ignore exception if the container is already stopped 340 | if (!(err instanceof AlreadyStoppedError)) { 341 | debug(`Error when stopping container ${this.name}:`, err); 342 | throw err; 343 | } 344 | debug(`Warning: container ${this.name} was already stopped. API error silenced.`); 345 | } 346 | } 347 | 348 | public async start(timeout: number = 30, force: boolean = false, stateful: boolean = false) { 349 | try { 350 | debug(`Starting container ${this.name}`); 351 | return await this._setState("start", timeout, force, stateful); 352 | } catch (err) { 353 | // ignore exception if the container is already started 354 | if (!(err instanceof AlreadyStartedError)) { 355 | debug(`Error when starting container ${this.name}:`, err); 356 | throw err; 357 | } 358 | debug(`Warning: container ${this.name} was already started. API error silenced.`); 359 | } 360 | } 361 | 362 | public async restart(timeout: number = 30, force: boolean = false) { 363 | try { 364 | debug(`Restarting container ${this.name}`); 365 | return await this._setState("restart", timeout, force); 366 | } catch (err) { 367 | debug(`Error when restarting container ${this.name}:`, err); 368 | throw err; 369 | } 370 | } 371 | 372 | public async freeze(timeout: number = 30, force: boolean = false) { 373 | try { 374 | debug(`Freezing container ${this.name}`); 375 | return await this._setState("freeze", timeout, force); 376 | } catch (err) { 377 | debug(`Error when freezing container ${this.name}:`, err); 378 | throw err; 379 | } 380 | } 381 | 382 | public async unfreeze(timeout: number = 30, force: boolean = false) { 383 | try { 384 | debug(`Unfreezing container ${this.name}`); 385 | return await this._setState("unfreeze", timeout, force); 386 | } catch (err) { 387 | debug(`Error when unfreezing container ${this.name}:`, err); 388 | throw err; 389 | } 390 | } 391 | 392 | /** 393 | * Delete the container. 394 | */ 395 | public async delete(): Promise { 396 | await this.stop(); 397 | 398 | try { 399 | debug(`Deleting container ${this.name}`); 400 | return await this._client.request({ 401 | path: "DELETE /containers/" + this.name, 402 | }) as void; 403 | } catch (err) { 404 | debug(`Error when deleting container ${this.name}:`, err); 405 | throw err; 406 | } 407 | } 408 | 409 | /** 410 | * Uploads data to a remote path on the container. 411 | * Container must be running. 412 | * @param remotePath 413 | * @param data 414 | */ 415 | public async upload(remotePath: string, data: string | Buffer): Promise { 416 | // create operation 417 | try { 418 | debug(`Uploading file to container ${this.name} at remote path ${remotePath}`); 419 | 420 | let body: string; 421 | if (typeof data === "string") { 422 | body = data; 423 | } else { 424 | body = data.toString(); 425 | } 426 | 427 | await this._client.request({ 428 | path: "POST /containers/" + this.name + "/files?path=" + remotePath, 429 | body, 430 | }); 431 | } catch (err) { 432 | debug(`Error when uploading file to container ${this.name} at remote path ${remotePath}:`, err); 433 | throw err; 434 | } 435 | } 436 | 437 | /* 438 | * Downloads data from a remote path on the container. 439 | * Container must be running. 440 | * @param remotePath 441 | */ 442 | public async download(remotePath: string): Promise { 443 | try { 444 | // read the file 445 | const result = await this._client.request({ 446 | path: "GET /containers/" + this.name + "/files?path=" + remotePath, 447 | }); 448 | 449 | return result; 450 | } catch (err) { 451 | debug(`Error when downloading file at ${remotePath} to container ${this.name}:`, err); 452 | throw err; 453 | } 454 | } 455 | 456 | /** 457 | * Uploads a file to a remote path on the container. 458 | * @param localPath 459 | * @param remotePath 460 | */ 461 | public async uploadFile(localPath: string, remotePath: string): Promise { 462 | try { 463 | debug(`Uploading file at ${localPath} to container ${this.name} at remote path ${remotePath}`); 464 | 465 | const buff = await promisify(fs.readFile)(localPath); 466 | await this.upload(remotePath, buff); 467 | } catch (err) { 468 | debug(`Error when uploading file at ${localPath} to container ${this.name} ` + 469 | `at remote path ${remotePath}:`, err); 470 | throw err; 471 | } 472 | } 473 | 474 | // TODO: fix this 475 | /* 476 | * Downloads a file from the remote path on the container. 477 | * @param remotePath 478 | * @param localPath 479 | */ 480 | /*public async downloadFile(remotePath: string, localPath: string) { 481 | const data = await this.download(remotePath); 482 | await promisify(fs.writeFile)(localPath, data); 483 | }*/ 484 | 485 | private async _setState( 486 | action: "start" | "stop" | "restart" | "freeze" | "unfreeze", 487 | timeout: number = 30, 488 | force: boolean = false, 489 | stateful?: boolean, 490 | ): Promise { 491 | 492 | await this._client.request({ 493 | path: "PUT /containers/" + this._metadata.name + "/state", 494 | body: { 495 | action, 496 | timeout, 497 | force, 498 | stateful, 499 | }, 500 | }); 501 | await this.refresh(); 502 | } 503 | } 504 | 505 | export default Container; 506 | -------------------------------------------------------------------------------- /src/Process.ts: -------------------------------------------------------------------------------- 1 | import debugOutput from "debug"; 2 | import { EventEmitter } from "events"; 3 | import { Readable, Writable, Duplex } from "stream"; 4 | import { WebSocketDuplex } from "websocket-stream"; 5 | import { IExecOperationMetadata, IOperationMetadata, ISignalRequest } from "./model/index"; 6 | import { SignalNumber, SIGHUP } from "./model/signals"; 7 | import { Client, IRequestOptions } from "./Client"; 8 | 9 | const debug = debugOutput("ts-lxd:Process"); 10 | 11 | export class Process extends EventEmitter { 12 | private _stdIn: Writable; 13 | private _stdOut: Readable; 14 | private _stdErr: Readable; 15 | private _control: Duplex; 16 | private _closed: boolean; 17 | private _streams: WebSocketDuplex[]; 18 | private _operation: IOperationMetadata; 19 | private _client: Client; 20 | 21 | /** 22 | * Checks if the process is closed. 23 | */ 24 | public get isClosed(): boolean { 25 | return this._closed; 26 | } 27 | 28 | /** 29 | * Lets you write to the process's standard input 30 | */ 31 | public get stdIn(): Writable { 32 | return this._stdIn; 33 | } 34 | 35 | /** 36 | * Lets you read from the process's standard output 37 | */ 38 | public get stdOut(): Readable { 39 | return this._stdOut; 40 | } 41 | 42 | /** 43 | * Lets you read from the process's standard error 44 | */ 45 | public get stdErr(): Readable { 46 | return this._stdErr; 47 | } 48 | 49 | /** 50 | * Lets you read/write from/to the process's control stream (lets you set terminal size) 51 | */ 52 | public get control(): Readable { 53 | return this._control; 54 | } 55 | 56 | public get operation(): IOperationMetadata { 57 | return this._operation; 58 | } 59 | 60 | /** 61 | * Returns true if the process is still running, otherwise false. 62 | * Note that you might need to call `refreshOperation` for this data to be updated. 63 | */ 64 | public get isRunning(): boolean { 65 | // if we don't have a return code, let's assume we're still running 66 | return this._operation.metadata.return === undefined || this._operation.metadata.return === null; 67 | } 68 | 69 | /** 70 | * Gets the process's exit code. Returns null if the process is still running. 71 | * Note that you might need to call `refreshOperation` for this data to be updated. 72 | */ 73 | public get exitCode(): number | undefined { 74 | return this._operation.metadata.return; 75 | } 76 | 77 | /** 78 | * Creates a new operation error. 79 | * @param container 80 | * @param streams 81 | */ 82 | constructor( 83 | operation: IOperationMetadata, 84 | client: Client, 85 | streams: WebSocketDuplex[], 86 | ) { 87 | super(); 88 | this._closed = false; 89 | 90 | this._client = client; 91 | this._operation = operation; 92 | this._streams = streams; 93 | 94 | // web sockets, if we have two it's interactive 95 | // otherwise it's pty 96 | if (streams.length === 2) { 97 | this._stdIn = streams[0]; 98 | this._stdOut = streams[0]; 99 | this._stdErr = new Readable(); 100 | this._control = streams[1]; 101 | } else { 102 | this._stdIn = streams[0]; 103 | this._stdOut = streams[1]; 104 | this._stdErr = streams[2]; 105 | this._control = streams[3]; 106 | } 107 | 108 | // setup events 109 | const process = this; 110 | 111 | this._control.on("close", async () => { 112 | await this.refreshOperation(); 113 | this._close(this.exitCode); 114 | }); 115 | 116 | // messages 117 | this._stdOut.on("data", (data) => { 118 | data = data.toString("utf8").trim(); 119 | debug(`stdout data: ${data}`); 120 | process.emit("data", false, data); 121 | }); 122 | 123 | this._control.on("data", (data) => { 124 | data = data.toString("utf8").trim(); 125 | try { 126 | // pretty print for debug 127 | data = JSON.stringify(JSON.parse(data), null, 2); 128 | // tslint:disable-next-line: no-empty 129 | } catch { } 130 | debug(`control data: ${data}`); 131 | }); 132 | 133 | if (this._stdErr !== null) { 134 | this._stdErr.on("data", (data) => { 135 | data = data.toString("utf8").trim(); 136 | debug(`stderr data: ${data}`); 137 | process.emit("data", true, data.toString("utf8").trim()); 138 | }); 139 | } 140 | } 141 | 142 | /** 143 | * Closes the process. Sends SIGHUP. 144 | * 145 | * @param signal Optional signal to send on termination 146 | */ 147 | public close(signal: SignalNumber = SIGHUP): void { 148 | if (!this.isClosed) { 149 | if (signal !== undefined && signal !== null) { 150 | this.signal(signal); 151 | this._close(128 + signal); 152 | } else { 153 | this._close(); 154 | } 155 | } 156 | } 157 | 158 | /** 159 | * Write some data to the process"s standard input. 160 | * @param data 161 | * @returns If the data was written. 162 | */ 163 | public write(data: string | Buffer): boolean { 164 | if (this.isClosed) { 165 | return false; 166 | } 167 | 168 | this._stdIn.write(data); 169 | return true; 170 | } 171 | 172 | /** 173 | * Resize's the output window. 174 | * @param width 175 | * @param height 176 | */ 177 | public resize(width: number, height: number) { 178 | this._control.write(JSON.stringify({ 179 | command: "window-resize", 180 | width, 181 | height, 182 | })); 183 | } 184 | 185 | /** 186 | * Sends a signal to the process 187 | * 188 | * @param signal The numeric signal to be sent to the process 189 | */ 190 | public signal(signal: SignalNumber) { 191 | const signalReq: ISignalRequest = { 192 | command: "signal", 193 | signal, 194 | }; 195 | 196 | this._control.write(JSON.stringify(signalReq)); 197 | } 198 | 199 | /** 200 | * Queries for updates to the operation metadata 201 | */ 202 | public async refreshOperation(): Promise { 203 | const req: IRequestOptions = { 204 | path: `GET /operations/${this._operation.id}`, 205 | waitForOperationCompletion: false, 206 | }; 207 | 208 | this._operation = await this._client.request(req) as IOperationMetadata; 209 | } 210 | 211 | private _close(codeOrSignal?: number): void { 212 | for (const stream of this._streams) { 213 | stream.end(); 214 | } 215 | if (codeOrSignal !== null && codeOrSignal !== undefined && codeOrSignal >= 128) { 216 | this.emit("close", null, codeOrSignal - 128); 217 | } else { 218 | this.emit("close", codeOrSignal); 219 | } 220 | 221 | this._closed = true; 222 | } 223 | } 224 | 225 | export default Process; 226 | -------------------------------------------------------------------------------- /src/Profile.ts: -------------------------------------------------------------------------------- 1 | import { IProfileMetadata } from "./model"; 2 | import Client from "./Client"; 3 | 4 | export class Profile { 5 | private _metadata: IProfileMetadata; 6 | private _client: Client; 7 | 8 | /** 9 | * Gets the metadata for this profile. 10 | */ 11 | public get metadata(): IProfileMetadata { 12 | return this._metadata; 13 | } 14 | 15 | /** 16 | * Gets the profile name 17 | */ 18 | public get name() { 19 | return this._metadata.name; 20 | } 21 | 22 | /** 23 | * Creates a profile. 24 | * @param client 25 | * @param metadata 26 | */ 27 | constructor(client: Client, metadata: IProfileMetadata) { 28 | this._client = client; 29 | this._metadata = metadata; 30 | } 31 | 32 | /** 33 | * Sets the profile name 34 | * @param name 35 | */ 36 | public async setName(name: string): Promise { 37 | await this._client.request<{ name: string }, never>({ 38 | path: "POST /profiles/" + this.name, 39 | body: { name }, 40 | }); 41 | 42 | this._metadata.name = name; 43 | } 44 | 45 | /** 46 | * Delete the profile. 47 | */ 48 | public async delete(): Promise { 49 | await this._client.request({ path: "DELETE /profiles/" + this.name }); 50 | } 51 | 52 | /** 53 | * Refreshes the profile information. 54 | */ 55 | public async refresh(): Promise { 56 | const metadata = await this._client.request({ 57 | path: "GET /profiles/" + this._metadata.name, 58 | }) as IProfileMetadata; 59 | this._metadata = metadata; 60 | return metadata; 61 | } 62 | } 63 | 64 | export default Profile; 65 | 66 | // export 67 | module.exports = Profile; 68 | -------------------------------------------------------------------------------- /src/errors.ts: -------------------------------------------------------------------------------- 1 | import { IOperationMetadata } from "./model"; 2 | 3 | export class OperationError extends Error { 4 | private _message: string = ""; 5 | private _statusCode: number = -1; 6 | private _status: string = ""; 7 | private _innerError?: Error; 8 | private _containerName?: string; 9 | 10 | public get message(): string { 11 | return this._message; 12 | } 13 | 14 | /** 15 | * Gets the status code. 16 | */ 17 | public get statusCode(): number { 18 | return this._statusCode; 19 | } 20 | 21 | /** 22 | * Gets the status. 23 | */ 24 | public get status(): string { 25 | return this._status; 26 | } 27 | 28 | /** 29 | * Gets the inner error. 30 | */ 31 | public get innerError(): Error | undefined { 32 | return this._innerError; 33 | } 34 | 35 | /** 36 | * Gets the name of the container to which this error relates 37 | */ 38 | public get containerName(): string | undefined { 39 | return this._containerName; 40 | } 41 | 42 | /** 43 | * Creates a new operation error. 44 | * @param operation 45 | * @param message? 46 | * @param innerError? 47 | */ 48 | constructor(operation: IOperationMetadata, message?: string, innerError?: Error) { 49 | super(`${message ? message : ""} ${operation.err as string}`); 50 | 51 | message = `${message ? message : ""} ${operation.err as string}`; 52 | 53 | this._message = message; 54 | this._status = operation.status; 55 | this._statusCode = operation.status_code; 56 | this._innerError = innerError; 57 | if (operation.resources && operation.resources.containers) { 58 | this._containerName = operation.resources.containers[0].split("/").slice(-1)[0]; 59 | } 60 | } 61 | } 62 | 63 | export class AlreadyStoppedError extends OperationError { 64 | constructor(operation: IOperationMetadata, message?: string, innerError?: Error) { 65 | super(operation, message, innerError); 66 | } 67 | } 68 | 69 | export class AlreadyStartedError extends OperationError { 70 | constructor(operation: IOperationMetadata, message?: string, innerError?: Error) { 71 | super(operation, message, innerError); 72 | } 73 | } 74 | -------------------------------------------------------------------------------- /src/index.ts: -------------------------------------------------------------------------------- 1 | export { Client } from "./Client"; 2 | export { Container } from "./Container"; 3 | export { Profile } from "./Profile"; 4 | export { Process } from "./Process"; 5 | 6 | export * from "./errors"; 7 | 8 | // TODO: images 9 | // TODO: networks 10 | // TODO: cluster 11 | // TODO: resources 12 | // TODO: storage pools 13 | 14 | import { Client } from "./Client"; 15 | export default Client; 16 | -------------------------------------------------------------------------------- /src/model/index.ts: -------------------------------------------------------------------------------- 1 | import { SignalNumber } from "./signals"; 2 | 3 | export type MetadataStatus = 4 | "Operation Created" | 5 | "Started" | 6 | "Stopped" | 7 | "Running" | 8 | "Cancelling" | 9 | "Pending" | 10 | "Starting" | 11 | "Stopping" | 12 | "Aborting" | 13 | "Freezing" | 14 | "Frozen" | 15 | "Thawed" | 16 | "Success" | 17 | "Failure" | 18 | "Cancelled"; 19 | 20 | export type MetadataStatusCode = 21 | 100 | 22 | 101 | 23 | 102 | 24 | 103 | 25 | 104 | 26 | 105 | 27 | 106 | 28 | 107 | 29 | 108 | 30 | 109 | 31 | 110 | 32 | 111 | 33 | 200 | 34 | 400 | 35 | 401; 36 | 37 | // TODO - this type is incomplete 38 | // TODO - break this into multiple types once we know which fields are populated and when 39 | export interface IMetadataResourcesMap { 40 | containers?: string[]; 41 | } 42 | 43 | export interface IBaseResponseBody { 44 | type: "sync" | "async"; 45 | status: "Success"; 46 | status_code: MetadataStatusCode; 47 | metadata: Metadata; 48 | } 49 | 50 | export interface ISyncResponseBody extends IBaseResponseBody { 51 | type: "sync"; 52 | } 53 | 54 | export interface IASyncResponseBody extends IBaseResponseBody> { 55 | type: "async"; 56 | operation: string; 57 | } 58 | 59 | export interface IErrorResponseBody { 60 | type: "error"; 61 | error: "Failure"; 62 | error_code: MetadataStatusCode; 63 | // the type of this field isn't documented, so we expose it as type `any` for 64 | // debugging purposes 65 | metadata: any; 66 | } 67 | 68 | export interface IOperationMetadata { 69 | /** 70 | * UUID of this operation 71 | */ 72 | id: string; 73 | 74 | /** 75 | * Class of operation. Either "task", "websocket", or "token" 76 | */ 77 | class: "task" | "websocket" | "token"; 78 | 79 | /** 80 | * ISO8601 timestamp, when the operation was created 81 | */ 82 | created_at: string; 83 | 84 | /** 85 | * ISO8601 timestamp, when the operation was last updated 86 | */ 87 | updated_at: string; 88 | 89 | /** 90 | * String version of the operation's status 91 | */ 92 | status: MetadataStatus; 93 | 94 | /** 95 | * Numeric version of the operation's status 96 | */ 97 | status_code: MetadataStatusCode; 98 | 99 | // TODO 100 | /** 101 | * Dictionary of resource types (container, snapshots, images) and affected resources 102 | */ 103 | resources?: IMetadataResourcesMap; 104 | 105 | /** 106 | * Metadata specific to the operation in question. 107 | */ 108 | metadata: OperationMetadataType; 109 | 110 | /** 111 | * Whether the operation can be canceled (DELETE over REST) 112 | */ 113 | may_cancel: boolean; 114 | 115 | /** 116 | * The error string, should the operation have failed 117 | */ 118 | err?: string; 119 | } 120 | 121 | export interface IUntrustedInfoMetadata { 122 | api_extensions: string[]; 123 | api_status: "stable" | "development" | "deprecated"; 124 | api_version: "1.0"; 125 | auth: "guest" | "untrusted" | "trusted"; 126 | public: boolean; 127 | } 128 | 129 | export interface ITrustedInfoMetadata extends IUntrustedInfoMetadata { 130 | config: { 131 | "core.trust_password": boolean; 132 | "core.https_address": string; 133 | }; 134 | auth: "trusted"; 135 | auth_methods: string[]; 136 | environment: { 137 | addresses: string[]; 138 | architectures: string[]; 139 | certificate: string; 140 | certificate_fingerprint: string; 141 | kernel: string; 142 | kernel_architecture: string; 143 | kernel_version: string; 144 | server: string; 145 | server_pid: number; 146 | server_version: string; 147 | storage: string; 148 | storage_version: string; 149 | server_clustered: boolean; 150 | server_name: string; 151 | }; 152 | certificate: string; 153 | certificate_fingerprint: string; 154 | driver: string; 155 | driver_version: string; 156 | kernel: string; 157 | kernel_architecture: string; 158 | kernel_version: string; 159 | server: "lxd"; 160 | server_pid: number; 161 | server_version: string; 162 | storage: string; 163 | storage_version: string; 164 | server_clustered: boolean; 165 | server_name: string; 166 | project: string; 167 | } 168 | 169 | export type IContainersMetadata = string[]; 170 | 171 | export interface IContainerMetadata { 172 | architecture: string; 173 | config: { 174 | "image.architecture": string; 175 | "image.description": string; 176 | "image.label": string; 177 | "image.os": string; 178 | "image.release": string; 179 | "image.serial": string; 180 | "image.version": string; 181 | [key: string]: string 182 | }; 183 | devices: {}; 184 | ephemeral: boolean; 185 | profiles: string[]; 186 | stateful: boolean; 187 | description: string; 188 | created_at: string; 189 | expanded_config: { 190 | [key: string]: string; 191 | }; 192 | expanded_devices: { 193 | [key: string]: { 194 | [key: string]: string; 195 | }; 196 | }; 197 | name: string; 198 | status: MetadataStatus; 199 | status_code: MetadataStatusCode; 200 | last_used_at: string; 201 | location: string; 202 | } 203 | 204 | export interface INetworkAddress { 205 | family: string; 206 | address: string; 207 | netmask: string; 208 | scope: string; 209 | } 210 | 211 | export interface INetworkCounter { 212 | bytes_received: number; 213 | bytes_sent: number; 214 | packets_received: number; 215 | packets_sent: number; 216 | } 217 | 218 | export interface IContainerStateMetadata { 219 | status: MetadataStatus; 220 | status_code: MetadataStatusCode; 221 | pid: number; 222 | processes: number; 223 | cpu: { 224 | usage: number; 225 | }; 226 | disk: { 227 | [key: string]: { 228 | usage: number; 229 | }; 230 | }; 231 | memory: { 232 | usage: number; 233 | usage_peak: number; 234 | swap_usage: number; 235 | swap_usage_peak: number; 236 | }; 237 | network: { 238 | [key: string]: { 239 | addresses: INetworkAddress[]; 240 | counters: INetworkCounter[]; 241 | hwaddr: string; 242 | host_name: string; 243 | mtu: number; 244 | state: string; 245 | type: string; 246 | }; 247 | }; 248 | } 249 | 250 | export type IProfilesMetadata = string[]; 251 | 252 | export interface IProfileMetadata { 253 | name: string; 254 | description: string; 255 | config: { 256 | [key: string]: string; 257 | }; 258 | devices: { 259 | [key: string]: { 260 | path: string; 261 | type: string; 262 | }; 263 | }; 264 | used_by: string[]; 265 | } 266 | 267 | export interface IAuthorizeCertificateRequest { 268 | type: "client"; 269 | certificate?: string; 270 | name?: string; 271 | password?: string; 272 | } 273 | 274 | export interface IUpdateContainerNameRequest { 275 | name: string; 276 | } 277 | 278 | export interface IContainerExecRequest { 279 | command: string[]; 280 | environment?: { 281 | [key: string]: string; 282 | }; 283 | "wait-for-websocket": boolean; 284 | "record-output": boolean; 285 | interactive: boolean; 286 | width?: number; 287 | height?: number; 288 | } 289 | 290 | export interface IExecOperationMetadata { 291 | output?: { 292 | [key: string]: string; 293 | }; 294 | fds?: { 295 | [key: string]: string; 296 | }; 297 | return?: number; 298 | } 299 | 300 | export interface IContainerStateRequest { 301 | /** 302 | * State change action (stop, start, restart, freeze or unfreeze) 303 | */ 304 | action: "stop" | "start" | "restart" | "freeze" | "unfreeze"; 305 | 306 | /** 307 | * A timeout after which the state change is considered as failed 308 | */ 309 | timeout: number; 310 | 311 | /** 312 | * Force the state change (currently only valid for stop and restart where it means killing the container) 313 | */ 314 | force: boolean; 315 | 316 | /** 317 | * Whether to store or restore runtime state before stopping or starting 318 | * (only valid for stop and start, defaults to false) 319 | */ 320 | stateful: boolean; 321 | } 322 | 323 | export interface ISignalRequest { 324 | command: "signal"; 325 | signal: SignalNumber; 326 | } 327 | -------------------------------------------------------------------------------- /src/model/signals.ts: -------------------------------------------------------------------------------- 1 | export type SignalNumber = 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 2 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31; 3 | 4 | export type Signal = "SIGHUP" | "SIGINT" | "SIGQUIT" | "SIGILL" | "SIGTRAP" | "SIGABRT" | "SIGBUS" | 5 | "SIGFPE" | "SIGKILL" | "SIGUSR1" | "SIGSEGV" | "SIGUSR2" | "SIGPIPE" | "SIGALRM" | "SIGTERM" | "SIGSTKFLT" | 6 | "SIGCHLD" | "SIGCONT" | "SIGSTOP" | "SIGTSTP" | "SIGTTIN" | "SIGTTOU" | "SIGURG" | "SIGXCPU" | "SIGXFSZ" | 7 | "SIGVTALRM" | "SIGPROF" | "SIGWINCH" | "SIGIO" | "SIGPWR" | "SIGSYS"; 8 | 9 | export const SIGHUP = 1; 10 | export const SIGINT = 2; 11 | export const SIGQUIT = 3; 12 | export const SIGILL = 4; 13 | export const SIGTRAP = 5; 14 | export const SIGABRT = 6; 15 | export const SIGBUS = 7; 16 | export const SIGFPE = 8; 17 | export const SIGKILL = 9; 18 | export const SIGUSR1 = 10; 19 | export const SIGSEGV = 11; 20 | export const SIGUSR2 = 12; 21 | export const SIGPIPE = 13; 22 | export const SIGALRM = 14; 23 | export const SIGTERM = 15; 24 | export const SIGSTKFLT = 16; 25 | export const SIGCHLD = 17; 26 | export const SIGCONT = 18; 27 | export const SIGSTOP = 19; 28 | export const SIGTSTP = 20; 29 | export const SIGTTIN = 21; 30 | export const SIGTTOU = 22; 31 | export const SIGURG = 23; 32 | export const SIGXCPU = 24; 33 | export const SIGXFSZ = 25; 34 | export const SIGVTALRM = 26; 35 | export const SIGPROF = 27; 36 | export const SIGWINCH = 28; 37 | export const SIGIO = 29; 38 | export const SIGPWR = 30; 39 | export const SIGSYS = 31; 40 | 41 | export const SignalMapping = { 42 | SIGHUP: 1, 43 | SIGINT: 2, 44 | SIGQUIT: 3, 45 | SIGILL: 4, 46 | SIGTRAP: 5, 47 | SIGABRT: 6, 48 | SIGBUS: 7, 49 | SIGFPE: 8, 50 | SIGKILL: 9, 51 | SIGUSR1: 10, 52 | SIGSEGV: 11, 53 | SIGUSR2: 12, 54 | SIGPIPE: 13, 55 | SIGALRM: 14, 56 | SIGTERM: 15, 57 | SIGSTKFLT: 16, 58 | SIGCHLD: 17, 59 | SIGCONT: 18, 60 | SIGSTOP: 19, 61 | SIGTSTP: 20, 62 | SIGTTIN: 21, 63 | SIGTTOU: 22, 64 | SIGURG: 23, 65 | SIGXCPU: 24, 66 | SIGXFSZ: 25, 67 | SIGVTALRM: 26, 68 | SIGPROF: 27, 69 | SIGWINCH: 28, 70 | SIGIO: 29, 71 | SIGPWR: 30, 72 | SIGSYS: 31, 73 | 1: "SIGHUP", 74 | 2: "SIGINT", 75 | 3: "SIGQUIT", 76 | 4: "SIGILL", 77 | 5: "SIGTRAP", 78 | 6: "SIGABRT", 79 | 7: "SIGBUS", 80 | 8: "SIGFPE", 81 | 9: "SIGKILL", 82 | 10: "SIGUSR1", 83 | 11: "SIGSEGV", 84 | 12: "SIGUSR2", 85 | 13: "SIGPIPE", 86 | 14: "SIGALRM", 87 | 15: "SIGTERM", 88 | 16: "SIGSTKFLT", 89 | 17: "SIGCHLD", 90 | 18: "SIGCONT", 91 | 19: "SIGSTOP", 92 | 20: "SIGTSTP", 93 | 21: "SIGTTIN", 94 | 22: "SIGTTOU", 95 | 23: "SIGURG", 96 | 24: "SIGXCPU", 97 | 25: "SIGXFSZ", 98 | 26: "SIGVTALRM", 99 | 27: "SIGPROF", 100 | 28: "SIGWINCH", 101 | 29: "SIGIO", 102 | 30: "SIGPWR", 103 | 31: "SIGSYS", 104 | }; 105 | -------------------------------------------------------------------------------- /src/utilities/create-error.ts: -------------------------------------------------------------------------------- 1 | import * as errors from "../errors"; 2 | import { IOperationMetadata } from "../model"; 3 | 4 | interface IErrorMap { 5 | [key: string]: typeof errors.OperationError; 6 | } 7 | 8 | const _errorMap: IErrorMap = { 9 | "The container is already stopped": errors.AlreadyStoppedError, 10 | "The container is already started": errors.AlreadyStartedError, 11 | }; 12 | 13 | export function createError( 14 | op: IOperationMetadata, 15 | message?: string, innerError?: Error, 16 | ): errors.OperationError { 17 | const errorConstructor = _errorMap[op.err as string] || errors.OperationError; 18 | return new errorConstructor(op, message, innerError); 19 | } 20 | -------------------------------------------------------------------------------- /src/utilities/request.ts: -------------------------------------------------------------------------------- 1 | import got, { GotBodyOptions, Response } from "got"; 2 | import { Agent } from "https"; 3 | import debugLib from "debug"; 4 | import { IASyncResponseBody, IOperationMetadata, ISyncResponseBody, IErrorResponseBody } from "../model"; 5 | import { createError } from "./create-error"; 6 | 7 | const debug = debugLib("ts-lxd:request"); 8 | 9 | export interface IRequestOptions { 10 | baseRequestUrl: string; 11 | path: string; 12 | body?: RequestBodyType; 13 | waitForOperationCompletion?: boolean; 14 | agent?: Agent; 15 | } 16 | 17 | /** 18 | * Performs a REST request on this client. 19 | * @param options 20 | */ 21 | export async function request( 22 | options: IRequestOptions, 23 | ): Promise> { 24 | 25 | // parse path, strip leading slash if necessary 26 | const route = options.path.substring(options.path.indexOf(" ") + 1).trim().replace(/^\//, ""); 27 | const method = options.path.substring(0, options.path.indexOf(" ")).trim().toUpperCase(); 28 | 29 | const url = options.baseRequestUrl + "1.0" + (route.length === 0 ? "" : "/") + route; 30 | 31 | const reqParams: GotBodyOptions = { 32 | method, 33 | headers: { 34 | Host: "", 35 | }, 36 | }; 37 | 38 | if (["PUT", "POST", "PATCH"].includes(method)) { 39 | reqParams.body = typeof options.body === "string" ? options.body : JSON.stringify(options.body); 40 | } 41 | 42 | type BodyType = 43 | ISyncResponseBody | IASyncResponseBody | IErrorResponseBody | IOperationMetadata | T; 44 | 45 | if (typeof (options.body) === "object" && !Buffer.isBuffer(options.body)) { 46 | debug(`${method} ${url}: `, JSON.stringify(options.body, null, 2)); 47 | } else { 48 | debug(`${method} ${url}`); 49 | } 50 | 51 | let res: Response; 52 | try { 53 | res = await got(url, reqParams); 54 | } catch (err) { 55 | logRequestError(method, url, err); 56 | throw err; 57 | } 58 | 59 | const body: BodyType = JSON.parse(res.body.toString("utf8")); 60 | 61 | // log finished request 62 | debug(`Response from ${url}:\n\n${JSON.stringify(body, null, 2)}`); 63 | 64 | if (isResponseBody(body)) { 65 | switch (body.type) { 66 | case "async": 67 | return await handleAsyncResponse(body, options); 68 | case "sync": 69 | return await handleSyncResponse(body); 70 | default: 71 | debug(body); 72 | throw new Error("unknown operation type: " + (body as any).type); 73 | } 74 | } else if (isOperationMetadata(body)) { 75 | return body.metadata; 76 | } else { 77 | return body; 78 | } 79 | } 80 | 81 | function isResponseBody(arg: any): 82 | arg is (ISyncResponseBody | IASyncResponseBody | IErrorResponseBody) { 83 | return !!arg.type; 84 | } 85 | 86 | function isOperationMetadata(arg: any): 87 | arg is (IOperationMetadata) { 88 | return !!arg.id && 89 | !!arg.class && 90 | !!arg.created_at && 91 | !!arg.updated_at && 92 | !!arg.status && 93 | !!arg.status_code && 94 | !!arg.metadata && 95 | !!arg.may_cancel; 96 | } 97 | 98 | function logRequestError(method: string, url: string, err: any): void { 99 | // otherwise we assume it's an error from got 100 | const res: (Response | undefined) = err.response; 101 | 102 | if (res) { 103 | const body: IErrorResponseBody = JSON.parse(res.body.toString("utf8")); 104 | const metadataDebugOutput = body.metadata ? " metadata: " + JSON.stringify(body.metadata) : ""; 105 | 106 | debug(`${method} ${url} || ${res.statusCode} ${res.statusMessage}${metadataDebugOutput}`); 107 | } else { 108 | // we only branch here if we failed before we could get a response back from the server 109 | debug(`${method} ${url} || no response captured`); 110 | } 111 | } 112 | 113 | function handleSyncResponse(body: ISyncResponseBody): T { 114 | // when we call /1.0/containers//wait we can get back a sync response body that shows success 115 | // but the metadata contains a failure. (╯°□°)╯︵ ┻━┻ 116 | // we handle that here. 117 | const metadata: (IOperationMetadata | undefined) = body.metadata as any; 118 | if (metadata && metadata.status && metadata.status === "Failure") { 119 | throw createError(metadata); 120 | } 121 | 122 | return body.metadata; 123 | } 124 | 125 | async function handleAsyncResponse( 126 | body: IASyncResponseBody, 127 | options: IRequestOptions, 128 | ): Promise> { 129 | // wait for operation, do this by default 130 | if (options.waitForOperationCompletion === undefined || options.waitForOperationCompletion) { 131 | const strippedOptions = Object.keys(options).reduce( 132 | (prev: any, key) => { 133 | if (key !== "path" && key !== "body") { 134 | prev[key] = (options as any)[key]; 135 | } 136 | return prev; 137 | }, 138 | {}, 139 | ); 140 | 141 | const newOptions: IRequestOptions = { 142 | ...strippedOptions, 143 | path: "GET /operations/" + body.metadata.id + "/wait", 144 | }; 145 | 146 | return await request>(newOptions) as IOperationMetadata; 147 | } else { 148 | return body.metadata; 149 | } 150 | } 151 | 152 | export default request; 153 | -------------------------------------------------------------------------------- /test/integration.test.ts: -------------------------------------------------------------------------------- 1 | import { after, before, describe, it } from "mocha"; 2 | 3 | import assert from "assert"; 4 | import shortid from "shortid"; 5 | import { HTTPError } from "got"; 6 | 7 | import { Client, Container } from "../src/index"; 8 | 9 | /* 10 | * NOTE: These tests require that an image with the alias 'ubuntu-18.04' exists 11 | * on your machine, though they don't really care that it's _actually_ ubuntu 12 | * 18.04, as long as whatever it is has bash in the usual location. You likely 13 | * need to pull the `ubuntu:18.04` image, and create the alias for it like so: 14 | * 15 | * $ lxc image alias create ubuntu-18.04 6700bee14eb3 16 | * 17 | */ 18 | const IMAGE_ALIAS = "ubuntu-18.04"; 19 | 20 | describe("Client", () => { 21 | const client = new Client(); 22 | 23 | // Note: I don't explicitly test Container.stop and Container.delete anywhere 24 | // in this suite because they're exercised by literally every test. Instead I 25 | // add some checks to make sure that the set of containers that exists when 26 | // tests start is the set of containers that exists when tests end 27 | 28 | let preExistingContainers: Container[]; 29 | let preExistingContainerNames: string[]; 30 | before("capture preExistingContainers", async () => { 31 | preExistingContainers = await client.getAllContainers(); 32 | preExistingContainerNames = preExistingContainers.map((container) => container.name); 33 | }); 34 | 35 | describe("create", () => { 36 | let testStartMillis: number; 37 | let testStartIsoString: string; 38 | let containerName: string; 39 | 40 | before("create the client", async () => { 41 | const testStart = new Date(); 42 | testStartMillis = testStart.getTime(); 43 | testStartIsoString = testStart.toISOString(); 44 | containerName = getContainerNames(1)[0]; 45 | }); 46 | 47 | it("should create a container", async function() { 48 | this.timeout(10000); 49 | const testContainer = await client.createContainer(containerName, IMAGE_ALIAS, {}); 50 | 51 | assert(testContainer.name, "testContainer"); 52 | 53 | /* 54 | * Because of some crazy witchcraft that makes no sense to me, LXD always 55 | * seems to be reporting a created timestamp that's around 500ms _earlier_ 56 | * than the start of the test, even though it's running locally using the 57 | * same clock source. 58 | * (╯°□°)╯︵ ┻━┻ 59 | * to work around that I'm adding a second to the `createdTimestamp` here. 60 | */ 61 | const createdTimestampMillis = Date.parse(testContainer.metadata.created_at) + 1000; 62 | 63 | /* 64 | * We get the original timestamp as an ISO 8601 formatted string, but it's 65 | * localized to the computer's timezone Recreating it here gives it to us 66 | * in UTC. 67 | */ 68 | const createdTimestamp = new Date(createdTimestampMillis); 69 | const createdTimestampIsoString = createdTimestamp.toISOString(); 70 | 71 | assert( 72 | testStartMillis < createdTimestampMillis, 73 | `Container should have been created after the start of the test. ` + 74 | `Test started at ${testStartIsoString}. ` + 75 | `Container created at ${createdTimestampIsoString}, or ` + 76 | `${testStartMillis - createdTimestampMillis}ms before the test ` + 77 | `started.`, 78 | ); 79 | }); 80 | 81 | after("delete container", async () => { 82 | const c = await client.getContainer(containerName); 83 | await c.delete(); 84 | }); 85 | }); 86 | 87 | describe("getContainers", () => { 88 | let createdContainerNames: string[]; 89 | 90 | before("create containers", async function() { 91 | this.timeout(10000); 92 | // create four shiny new containers 93 | createdContainerNames = getContainerNames(4); 94 | await Promise.all( 95 | createdContainerNames.map(async (name) => { 96 | await client.createContainer(name, IMAGE_ALIAS); 97 | }), 98 | ); 99 | }); 100 | 101 | it("should fetch some containers", async () => { 102 | const containers = await client.getAllContainers(); 103 | 104 | assert(containers.length === 4 + preExistingContainers.length); 105 | const observedContainerNames = containers.map((container) => container.name); 106 | 107 | for (const observedContainerName of observedContainerNames) { 108 | assert( 109 | createdContainerNames.includes(observedContainerName) || 110 | preExistingContainerNames.includes(observedContainerName), 111 | `Container ${observedContainerName} didn't exist when the test suite was started. ` + 112 | `Did you create a container while the test was running?`, 113 | ); 114 | } 115 | 116 | for (const createdContainerName of createdContainerNames) { 117 | assert( 118 | observedContainerNames.includes(createdContainerName), 119 | `Container ${createdContainerName} wasn't returned by client.getAllContainers`, 120 | ); 121 | } 122 | }); 123 | 124 | after ("remove created containers", async function() { 125 | this.timeout(10000); 126 | await Promise.all( 127 | createdContainerNames.map(async (name) => { 128 | const container = await client.getContainer(name); 129 | await container.delete(); 130 | }), 131 | ); 132 | }); 133 | }); 134 | 135 | describe("run", () => { 136 | const fileName = `/testfile-${shortid().replace(/-|_/g, "")}`; 137 | const fileData = `${shortid()}${shortid()}`; 138 | const errorData = `${shortid()}${shortid()}`; 139 | const containerName = getContainerNames(1)[0]; 140 | 141 | let container: Container; 142 | before("create the container", async function() { 143 | this.timeout(10000); 144 | container = await client.createContainer(containerName, "ubuntu-18.04"); 145 | await container.start(); 146 | }); 147 | 148 | it("should create a file in the container", async function() { 149 | const results = await container.run([ 150 | "/bin/bash", 151 | "-c", 152 | `echo '${fileData}' > ${fileName}`, 153 | ]); 154 | 155 | assert.strictEqual(results.stdOut.trim(), ""); 156 | assert.strictEqual(results.stdErr.trim(), ""); 157 | assert.strictEqual(results.exitCode, 0); 158 | }); 159 | 160 | it("should read back a file in the container", async function() { 161 | const results = await container.run([ 162 | "/bin/bash", 163 | "-c", 164 | `cat ${fileName}`, 165 | ]); 166 | 167 | assert.strictEqual(results.stdOut.trim(), fileData); 168 | assert.strictEqual(results.stdErr.trim(), ""); 169 | assert.strictEqual(results.exitCode, 0); 170 | }); 171 | 172 | it("should get error data via stderr", async function() { 173 | const results = await container.run([ 174 | "/bin/bash", 175 | "-c", 176 | `>&2 echo '${errorData}' && exit 1`, 177 | ]); 178 | 179 | assert.strictEqual(results.stdOut.trim(), ""); 180 | assert.strictEqual(results.stdErr.trim(), errorData); 181 | assert.strictEqual(results.exitCode, 1); 182 | }); 183 | 184 | after ("remove created container", async function() { 185 | this.timeout(10000); 186 | await container.delete(); 187 | }); 188 | }); 189 | 190 | after("verify that only the preExistingContainers still exist", async function() { 191 | this.timeout(20000); 192 | const containers = await client.getAllContainers(); 193 | const observedContainerNames = containers.map((container) => container.name); 194 | 195 | for (const observedContainerName of observedContainerNames) { 196 | if (!preExistingContainerNames.includes(observedContainerName)) { 197 | const container = await client.getContainer(observedContainerName); 198 | if (container.status !== "Stopping") { 199 | await handleBadCleanup(container); 200 | } 201 | } 202 | } 203 | 204 | for (const preExistingContainerName of preExistingContainerNames) { 205 | assert( 206 | observedContainerNames.includes(preExistingContainerName), 207 | `Container ${preExistingContainerName} existed before tests ran, but no longer exists. ` + 208 | "Did you delete a container while the test was running? If not, this test suite might have " + 209 | "accidentally deleted one of your previously running containers!", 210 | ); 211 | } 212 | }); 213 | }); 214 | 215 | function getContainerNames(count: number): string[] { 216 | // kill the dashes here so that they're valid hostnames 217 | return Array.from( 218 | { length: count }, 219 | () => "testcontainer-" + (shortid().replace(/-|_/g, "")).toLowerCase(), 220 | ); 221 | } 222 | 223 | async function handleBadCleanup(container: Container) { 224 | const statuses: string[] = [container.status]; 225 | const wasDeleted = await waitAndRetry(10, 500, async () => { 226 | try { 227 | await container.refresh(); 228 | } catch (err) { 229 | if (err instanceof HTTPError && err.statusCode === 404) { 230 | statuses.push("[Deleted]"); 231 | return true; 232 | } 233 | throw err; 234 | } 235 | 236 | if (container.status !== statuses.slice(-1)[0]) { 237 | statuses.push(container.status); 238 | } 239 | 240 | return container.status === "Stopping"; 241 | }); 242 | 243 | const statusMessage = `Observed status(es) : ${statuses.join(", ")}`; 244 | 245 | // we're gonna fail here either way, but we use `assert` to give a nice user-friendly failure message 246 | assert(wasDeleted, `Container ${container.name} was not cleaned up. ${statusMessage}`); 247 | assert(!wasDeleted, `RACE CONDITION: await container.delete() should block until container is deleted.\n` + 248 | `However, container ${container.name} was cleaned up after tests completed. ${statusMessage}`, 249 | ); 250 | } 251 | 252 | // DO NOT USE THIS UNLESS YOU'RE POLLING FOR A STATE CHANGE 253 | async function waitAndRetry( 254 | maxTries: number, 255 | msecBetweenTries: number, 256 | func: () => boolean | Promise, 257 | ): Promise { 258 | 259 | let tries = 0; 260 | 261 | if (maxTries <= 1) { 262 | throw new Error(`maxTries was ${maxTries}. I mean... really?? What's the point of calling this, then?`); 263 | } 264 | 265 | // oooh, a do..while loop! You know you've got a good idea when you're writing one of these bad boys! 266 | do { 267 | // thresholding your iterator: another surefire sign of coding success! 268 | if (tries > 1) { 269 | await _wait(msecBetweenTries); 270 | } 271 | const result = await Promise.resolve(func()); 272 | if (result) { 273 | return result; 274 | } 275 | tries++; 276 | } while (tries < maxTries); 277 | 278 | // falsy failure so we don't need a try/catch 279 | return false; 280 | } 281 | 282 | // Don't use this in tests. Use `waitAndRetry`, instead. 283 | function _wait(msec: number): Promise { 284 | return new Promise((accept) => { 285 | setTimeout(accept, msec); 286 | }); 287 | } 288 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | /* Basic Options */ 4 | "target": "ES2017", /* Specify ECMAScript target version: 'ES3' (default), 'ES5', 'ES2015', 'ES2016', 'ES2017','ES2018' or 'ESNEXT'. */ 5 | "module": "commonjs", /* Specify module code generation: 'none', 'commonjs', 'amd', 'system', 'umd', 'es2015', or 'ESNext'. */ 6 | // "lib": [], /* Specify library files to be included in the compilation. */ 7 | // "allowJs": true, /* Allow javascript files to be compiled. */ 8 | // "checkJs": true, /* Report errors in .js files. */ 9 | // "jsx": "preserve", /* Specify JSX code generation: 'preserve', 'react-native', or 'react'. */ 10 | "declaration": true, /* Generates corresponding '.d.ts' file. */ 11 | "declarationMap": true , /* Generates a sourcemap for each corresponding '.d.ts' file. */ 12 | // "outFile": "./", /* Concatenate and emit output to single file. */ 13 | "outDir": "./dist", /* Redirect output structure to the directory. */ 14 | // "rootDir": "./src", /* Specify the root directory of input files. Use to control the output directory structure with --outDir. */ 15 | "composite": true, /* Enable project compilation */ 16 | // "removeComments": true, /* Do not emit comments to output. */ 17 | // "noEmit": true, /* Do not emit outputs. */ 18 | // "importHelpers": true, /* Import emit helpers from 'tslib'. */ 19 | // "downlevelIteration": true, /* Provide full support for iterables in 'for-of', spread, and destructuring when targeting 'ES5' or 'ES3'. */ 20 | // "isolatedModules": true, /* Transpile each file as a separate module (similar to 'ts.transpileModule'). */ 21 | 22 | /* Strict Type-Checking Options */ 23 | "strict": true, /* Enable all strict type-checking options. */ 24 | // "noImplicitAny": true, /* Raise error on expressions and declarations with an implied 'any' type. */ 25 | // "strictNullChecks": true, /* Enable strict null checks. */ 26 | // "strictFunctionTypes": true, /* Enable strict checking of function types. */ 27 | // "strictBindCallApply": true, /* Enable strict 'bind', 'call', and 'apply' methods on functions. */ 28 | // "strictPropertyInitialization": true, /* Enable strict checking of property initialization in classes. */ 29 | // "noImplicitThis": true, /* Raise error on 'this' expressions with an implied 'any' type. */ 30 | // "alwaysStrict": true, /* Parse in strict mode and emit "use strict" for each source file. */ 31 | "skipLibCheck": true, /* ignore transitive module with bad type definition */ 32 | 33 | /* Additional Checks */ 34 | "noUnusedLocals": true, /* Report errors on unused locals. */ 35 | "noUnusedParameters": true, /* Report errors on unused parameters. */ 36 | "noImplicitReturns": true, /* Report error when not all code paths in function return a value. */ 37 | "noFallthroughCasesInSwitch": true, /* Report errors for fallthrough cases in switch statement. */ 38 | 39 | /* Module Resolution Options */ 40 | // "moduleResolution": "node", /* Specify module resolution strategy: 'node' (Node.js) or 'classic' (TypeScript pre-1.6). */ 41 | // "baseUrl": "./", /* Base directory to resolve non-absolute module names. */ 42 | // "paths": {}, /* A series of entries which re-map imports to lookup locations relative to the 'baseUrl'. */ 43 | "rootDirs": [ "./src", "./test" ], /* List of root folders whose combined content represents the structure of the project at runtime. */ 44 | "typeRoots": [ /* List of folders to include type definitions from. */ 45 | "./node_modules/@types", 46 | "./typings" 47 | ], 48 | // "types": [], /* Type declaration files to be included in compilation. */ 49 | // "allowSyntheticDefaultImports": true, /* Allow default imports from modules with no default export. This does not affect code emit, just typechecking. */ 50 | "esModuleInterop": true, /* Enables emit interoperability between CommonJS and ES Modules via creation of namespace objects for all imports. Implies 'allowSyntheticDefaultImports'. */ 51 | // "preserveSymlinks": true, /* Do not resolve the real path of symlinks. */ 52 | 53 | /* Source Map Options */ 54 | "sourceRoot": "./src", /* Specify the location where debugger should locate TypeScript files instead of source locations. */ 55 | // "mapRoot": "", /* Specify the location where debugger should locate map files instead of generated locations. */ 56 | "sourceMap": true, /* Emit source map files */ 57 | // "inlineSourceMap": true, /* Emit a single file with source maps instead of having a separate file. */ 58 | // "inlineSources": true, /* Emit the source alongside the sourcemaps within a single file; requires '--inlineSourceMap' or '--sourceMap' to be set. */ 59 | 60 | /* Experimental Options */ 61 | // "experimentalDecorators": true, /* Enables experimental support for ES7 decorators. */ 62 | // "emitDecoratorMetadata": true, /* Enables experimental support for emitting type metadata for decorators. */ 63 | } 64 | } 65 | -------------------------------------------------------------------------------- /tslint.json: -------------------------------------------------------------------------------- 1 | { 2 | "defaultSeverity": "error", 3 | "extends": ["tslint:recommended"], 4 | "jsRules": {}, 5 | "rules": { 6 | "variable-name": [ 7 | true, 8 | "ban-keywords", 9 | "check-format", 10 | "allow-leading-underscore", 11 | "allow-pascal-case" 12 | ], 13 | "semicolon": [true, "always"], 14 | "object-literal-sort-keys": false, 15 | "ordered-imports": false, 16 | "max-line-length": [true, 110], 17 | "max-classes-per-file": false, 18 | "only-arrow-functions": false, 19 | "no-floating-promises": true 20 | }, 21 | "rulesDirectory": [] 22 | } 23 | -------------------------------------------------------------------------------- /typings/websocket-stream/index.d.ts: -------------------------------------------------------------------------------- 1 | // Type definitions for websocket-stream 5.3 2 | // Project: https://github.com/maxogden/websocket-stream#readme 3 | // Definitions by: Ben Burns 4 | // Definitions: https://github.com/DefinitelyTyped/DefinitelyTyped 5 | 6 | declare module "websocket-stream" { 7 | import * as WebSocket from 'ws'; 8 | import { Duplex } from 'stream'; 9 | import * as http from 'http'; 10 | 11 | namespace WebSocketStream { 12 | type WebSocketDuplex = Duplex & { socket: WebSocket }; 13 | 14 | class Server extends WebSocket.Server { 15 | on(event: 'connection', cb: (this: WebSocket, socket: WebSocket, request: http.IncomingMessage) => void): this; 16 | on(event: 'error', cb: (this: WebSocket, error: Error) => void): this; 17 | on(event: 'headers', cb: (this: WebSocket, headers: string[], request: http.IncomingMessage) => void): this; 18 | on(event: 'listening', cb: (this: WebSocket) => void): this; 19 | on(event: 'stream', cb: (this: WebSocket, stream: WebSocketDuplex, request: http.IncomingMessage) => void): this; 20 | on(event: string | symbol, listener: (this: WebSocket, ...args: any[]) => void): this; 21 | } 22 | 23 | function createServer(opts?: WebSocket.ServerOptions, callback?: () => void): Server; 24 | } 25 | 26 | function WebSocketStream(target: string | WebSocket, options?: WebSocket.ClientOptions): WebSocketStream.WebSocketDuplex; 27 | function WebSocketStream(target: string | WebSocket, protocols?: string | string[], options?: WebSocket.ClientOptions): WebSocketStream.WebSocketDuplex; 28 | 29 | export = WebSocketStream; 30 | } -------------------------------------------------------------------------------- /yarn.lock: -------------------------------------------------------------------------------- 1 | # THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. 2 | # yarn lockfile v1 3 | 4 | 5 | "@babel/code-frame@^7.0.0": 6 | version "7.0.0" 7 | resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.0.0.tgz#06e2ab19bdb535385559aabb5ba59729482800f8" 8 | integrity sha512-OfC2uemaknXr87bdLUkWog7nYuliM9Ij5HUcajsVcMCpQrcLmtxRbVFTIqmcSkSeYRBFBRxs2FiUqFJDLdiebA== 9 | dependencies: 10 | "@babel/highlight" "^7.0.0" 11 | 12 | "@babel/highlight@^7.0.0": 13 | version "7.0.0" 14 | resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.0.0.tgz#f710c38c8d458e6dd9a201afb637fcb781ce99e4" 15 | integrity sha512-UFMC4ZeFC48Tpvj7C8UgLvtkaUuovQX+5xNWrsIoMG8o2z+XFKjKaN9iVmS84dPwVN00W4wPmqvYoZF3EGAsfw== 16 | dependencies: 17 | chalk "^2.0.0" 18 | esutils "^2.0.2" 19 | js-tokens "^4.0.0" 20 | 21 | "@babel/runtime@7.0.0": 22 | version "7.0.0" 23 | resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.0.0.tgz#adeb78fedfc855aa05bc041640f3f6f98e85424c" 24 | integrity sha512-7hGhzlcmg01CvH1EHdSPVXYX1aJ8KCEyz6I9xYIi/asDtzBPMyMhVibhM/K6g/5qnKBwjZtp10bNZIEFTRW1MA== 25 | dependencies: 26 | regenerator-runtime "^0.12.0" 27 | 28 | "@samverschueren/stream-to-observable@^0.3.0": 29 | version "0.3.0" 30 | resolved "https://registry.yarnpkg.com/@samverschueren/stream-to-observable/-/stream-to-observable-0.3.0.tgz#ecdf48d532c58ea477acfcab80348424f8d0662f" 31 | integrity sha512-MI4Xx6LHs4Webyvi6EbspgyAb4D2Q2VtnCQ1blOJcoLS6mVa8lNN2rkIy1CVxfTUpoyIbCTkXES1rLXztFD1lg== 32 | dependencies: 33 | any-observable "^0.3.0" 34 | 35 | "@sindresorhus/is@^0.14.0": 36 | version "0.14.0" 37 | resolved "https://registry.yarnpkg.com/@sindresorhus/is/-/is-0.14.0.tgz#9fb3a3cf3132328151f353de4632e01e52102bea" 38 | integrity sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ== 39 | 40 | "@szmarczak/http-timer@^1.1.2": 41 | version "1.1.2" 42 | resolved "https://registry.yarnpkg.com/@szmarczak/http-timer/-/http-timer-1.1.2.tgz#b1665e2c461a2cd92f4c1bbf50d5454de0d4b421" 43 | integrity sha512-XIB2XbzHTN6ieIjfIMV9hlVcfPU26s2vafYWQcZHWXHOxiaRZYEDKEwdl129Zyg50+foYV2jCgtrqSA6qNuNSA== 44 | dependencies: 45 | defer-to-connect "^1.0.1" 46 | 47 | "@types/debug@^4.1.2": 48 | version "4.1.4" 49 | resolved "https://registry.yarnpkg.com/@types/debug/-/debug-4.1.4.tgz#56eec47706f0fd0b7c694eae2f3172e6b0b769da" 50 | integrity sha512-D9MyoQFI7iP5VdpEyPZyjjqIJ8Y8EDNQFIFVLOmeg1rI1xiHOChyUPMPRUVfqFCerxfE+yS3vMyj37F6IdtOoQ== 51 | 52 | "@types/events@*": 53 | version "3.0.0" 54 | resolved "https://registry.yarnpkg.com/@types/events/-/events-3.0.0.tgz#2862f3f58a9a7f7c3e78d79f130dd4d71c25c2a7" 55 | integrity sha512-EaObqwIvayI5a8dCzhFrjKzVwKLxjoG9T6Ppd5CEo07LRKfQ8Yokw54r5+Wq7FaBQ+yXRvQAYPrHwya1/UFt9g== 56 | 57 | "@types/got@^9.4.1": 58 | version "9.4.3" 59 | resolved "https://registry.yarnpkg.com/@types/got/-/got-9.4.3.tgz#199a395728fd846edfbcaf224836e341a09cdc32" 60 | integrity sha512-hyDJGHrObckE8jOZza024tp2Y4/vVQVuesPbNMEc69Sr+eK3GlhUG3G7mWysoJgNhpvWAYso7CRMlQDlctNnUA== 61 | dependencies: 62 | "@types/node" "*" 63 | "@types/tough-cookie" "*" 64 | 65 | "@types/mocha@^5.2.6": 66 | version "5.2.6" 67 | resolved "https://registry.yarnpkg.com/@types/mocha/-/mocha-5.2.6.tgz#b8622d50557dd155e9f2f634b7d68fd38de5e94b" 68 | integrity sha512-1axi39YdtBI7z957vdqXI4Ac25e7YihYQtJa+Clnxg1zTJEaIRbndt71O3sP4GAMgiAm0pY26/b9BrY4MR/PMw== 69 | 70 | "@types/node@*", "@types/node@^11.11.7": 71 | version "11.13.6" 72 | resolved "https://registry.yarnpkg.com/@types/node/-/node-11.13.6.tgz#37ec75690830acb0d74ce3c6c43caab787081e85" 73 | integrity sha512-Xoo/EBzEe8HxTSwaZNLZjaW6M6tA/+GmD3/DZ6uo8qSaolE/9Oarko0oV1fVfrLqOz0tx0nXJB4rdD5c+vixLw== 74 | 75 | "@types/shortid@^0.0.29": 76 | version "0.0.29" 77 | resolved "https://registry.yarnpkg.com/@types/shortid/-/shortid-0.0.29.tgz#8093ee0416a6e2bf2aa6338109114b3fbffa0e9b" 78 | integrity sha1-gJPuBBam4r8qpjOBCRFLP7/6Dps= 79 | 80 | "@types/tough-cookie@*": 81 | version "2.3.5" 82 | resolved "https://registry.yarnpkg.com/@types/tough-cookie/-/tough-cookie-2.3.5.tgz#9da44ed75571999b65c37b60c9b2b88db54c585d" 83 | integrity sha512-SCcK7mvGi3+ZNz833RRjFIxrn4gI1PPR3NtuIS+6vMkvmsGjosqTJwRt5bAEFLRz+wtJMWv8+uOnZf2hi2QXTg== 84 | 85 | "@types/ws@^6.0.1": 86 | version "6.0.1" 87 | resolved "https://registry.yarnpkg.com/@types/ws/-/ws-6.0.1.tgz#ca7a3f3756aa12f62a0a62145ed14c6db25d5a28" 88 | integrity sha512-EzH8k1gyZ4xih/MaZTXwT2xOkPiIMSrhQ9b8wrlX88L0T02eYsddatQlwVFlEPyEqV0ChpdpNnE51QPH6NVT4Q== 89 | dependencies: 90 | "@types/events" "*" 91 | "@types/node" "*" 92 | 93 | ansi-colors@3.2.3: 94 | version "3.2.3" 95 | resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-3.2.3.tgz#57d35b8686e851e2cc04c403f1c00203976a1813" 96 | integrity sha512-LEHHyuhlPY3TmuUYMh2oz89lTShfvgbmzaBcxve9t/9Wuy7Dwf4yoAKcND7KFT1HAQfqZ12qtc+DUrBMeKF9nw== 97 | 98 | ansi-escapes@^3.0.0: 99 | version "3.2.0" 100 | resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-3.2.0.tgz#8780b98ff9dbf5638152d1f1fe5c1d7b4442976b" 101 | integrity sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ== 102 | 103 | ansi-regex@^2.0.0: 104 | version "2.1.1" 105 | resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df" 106 | integrity sha1-w7M6te42DYbg5ijwRorn7yfWVN8= 107 | 108 | ansi-regex@^3.0.0: 109 | version "3.0.0" 110 | resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.0.tgz#ed0317c322064f79466c02966bddb605ab37d998" 111 | integrity sha1-7QMXwyIGT3lGbAKWa922Bas32Zg= 112 | 113 | ansi-regex@^4.1.0: 114 | version "4.1.0" 115 | resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-4.1.0.tgz#8b9f8f08cf1acb843756a839ca8c7e3168c51997" 116 | integrity sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg== 117 | 118 | ansi-styles@^2.2.1: 119 | version "2.2.1" 120 | resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe" 121 | integrity sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4= 122 | 123 | ansi-styles@^3.2.1: 124 | version "3.2.1" 125 | resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" 126 | integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== 127 | dependencies: 128 | color-convert "^1.9.0" 129 | 130 | any-observable@^0.3.0: 131 | version "0.3.0" 132 | resolved "https://registry.yarnpkg.com/any-observable/-/any-observable-0.3.0.tgz#af933475e5806a67d0d7df090dd5e8bef65d119b" 133 | integrity sha512-/FQM1EDkTsf63Ub2C6O7GuYFDsSXUwsaZDurV0np41ocwq0jthUAYCmhBX9f+KwlaCgIuWyr/4WlUQUBfKfZog== 134 | 135 | arg@^4.1.0: 136 | version "4.1.0" 137 | resolved "https://registry.yarnpkg.com/arg/-/arg-4.1.0.tgz#583c518199419e0037abb74062c37f8519e575f0" 138 | integrity sha512-ZWc51jO3qegGkVh8Hwpv636EkbesNV5ZNQPCtRa+0qytRYPEs9IYT9qITY9buezqUH5uqyzlWLcufrzU2rffdg== 139 | 140 | argparse@^1.0.7: 141 | version "1.0.10" 142 | resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" 143 | integrity sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg== 144 | dependencies: 145 | sprintf-js "~1.0.2" 146 | 147 | arr-diff@^4.0.0: 148 | version "4.0.0" 149 | resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-4.0.0.tgz#d6461074febfec71e7e15235761a329a5dc7c520" 150 | integrity sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA= 151 | 152 | arr-flatten@^1.1.0: 153 | version "1.1.0" 154 | resolved "https://registry.yarnpkg.com/arr-flatten/-/arr-flatten-1.1.0.tgz#36048bbff4e7b47e136644316c99669ea5ae91f1" 155 | integrity sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg== 156 | 157 | arr-union@^3.1.0: 158 | version "3.1.0" 159 | resolved "https://registry.yarnpkg.com/arr-union/-/arr-union-3.1.0.tgz#e39b09aea9def866a8f206e288af63919bae39c4" 160 | integrity sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ= 161 | 162 | array-union@^1.0.1: 163 | version "1.0.2" 164 | resolved "https://registry.yarnpkg.com/array-union/-/array-union-1.0.2.tgz#9a34410e4f4e3da23dea375be5be70f24778ec39" 165 | integrity sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk= 166 | dependencies: 167 | array-uniq "^1.0.1" 168 | 169 | array-uniq@^1.0.1: 170 | version "1.0.3" 171 | resolved "https://registry.yarnpkg.com/array-uniq/-/array-uniq-1.0.3.tgz#af6ac877a25cc7f74e058894753858dfdb24fdb6" 172 | integrity sha1-r2rId6Jcx/dOBYiUdThY39sk/bY= 173 | 174 | array-unique@^0.3.2: 175 | version "0.3.2" 176 | resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.3.2.tgz#a894b75d4bc4f6cd679ef3244a9fd8f46ae2d428" 177 | integrity sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg= 178 | 179 | arrify@^1.0.1: 180 | version "1.0.1" 181 | resolved "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d" 182 | integrity sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0= 183 | 184 | assign-symbols@^1.0.0: 185 | version "1.0.0" 186 | resolved "https://registry.yarnpkg.com/assign-symbols/-/assign-symbols-1.0.0.tgz#59667f41fadd4f20ccbc2bb96b8d4f7f78ec0367" 187 | integrity sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c= 188 | 189 | async-limiter@~1.0.0: 190 | version "1.0.0" 191 | resolved "https://registry.yarnpkg.com/async-limiter/-/async-limiter-1.0.0.tgz#78faed8c3d074ab81f22b4e985d79e8738f720f8" 192 | integrity sha512-jp/uFnooOiO+L211eZOoSyzpOITMXx1rBITauYykG3BRYPu8h0UcxsPNB04RR5vo4Tyz3+ay17tR6JVf9qzYWg== 193 | 194 | atob@^2.1.1: 195 | version "2.1.2" 196 | resolved "https://registry.yarnpkg.com/atob/-/atob-2.1.2.tgz#6d9517eb9e030d2436666651e86bd9f6f13533c9" 197 | integrity sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg== 198 | 199 | balanced-match@^1.0.0: 200 | version "1.0.0" 201 | resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" 202 | integrity sha1-ibTRmasr7kneFk6gK4nORi1xt2c= 203 | 204 | base@^0.11.1: 205 | version "0.11.2" 206 | resolved "https://registry.yarnpkg.com/base/-/base-0.11.2.tgz#7bde5ced145b6d551a90db87f83c558b4eb48a8f" 207 | integrity sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg== 208 | dependencies: 209 | cache-base "^1.0.1" 210 | class-utils "^0.3.5" 211 | component-emitter "^1.2.1" 212 | define-property "^1.0.0" 213 | isobject "^3.0.1" 214 | mixin-deep "^1.2.0" 215 | pascalcase "^0.1.1" 216 | 217 | brace-expansion@^1.1.7: 218 | version "1.1.11" 219 | resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" 220 | integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== 221 | dependencies: 222 | balanced-match "^1.0.0" 223 | concat-map "0.0.1" 224 | 225 | braces@^2.3.1: 226 | version "2.3.2" 227 | resolved "https://registry.yarnpkg.com/braces/-/braces-2.3.2.tgz#5979fd3f14cd531565e5fa2df1abfff1dfaee729" 228 | integrity sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w== 229 | dependencies: 230 | arr-flatten "^1.1.0" 231 | array-unique "^0.3.2" 232 | extend-shallow "^2.0.1" 233 | fill-range "^4.0.0" 234 | isobject "^3.0.1" 235 | repeat-element "^1.1.2" 236 | snapdragon "^0.8.1" 237 | snapdragon-node "^2.0.1" 238 | split-string "^3.0.2" 239 | to-regex "^3.0.1" 240 | 241 | browser-stdout@1.3.1: 242 | version "1.3.1" 243 | resolved "https://registry.yarnpkg.com/browser-stdout/-/browser-stdout-1.3.1.tgz#baa559ee14ced73452229bad7326467c61fabd60" 244 | integrity sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw== 245 | 246 | buffer-from@^1.0.0: 247 | version "1.1.1" 248 | resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.1.tgz#32713bc028f75c02fdb710d7c7bcec1f2c6070ef" 249 | integrity sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A== 250 | 251 | builtin-modules@^1.1.1: 252 | version "1.1.1" 253 | resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-1.1.1.tgz#270f076c5a72c02f5b65a47df94c5fe3a278892f" 254 | integrity sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8= 255 | 256 | cache-base@^1.0.1: 257 | version "1.0.1" 258 | resolved "https://registry.yarnpkg.com/cache-base/-/cache-base-1.0.1.tgz#0a7f46416831c8b662ee36fe4e7c59d76f666ab2" 259 | integrity sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ== 260 | dependencies: 261 | collection-visit "^1.0.0" 262 | component-emitter "^1.2.1" 263 | get-value "^2.0.6" 264 | has-value "^1.0.0" 265 | isobject "^3.0.1" 266 | set-value "^2.0.0" 267 | to-object-path "^0.3.0" 268 | union-value "^1.0.0" 269 | unset-value "^1.0.0" 270 | 271 | cacheable-request@^6.0.0: 272 | version "6.0.0" 273 | resolved "https://registry.yarnpkg.com/cacheable-request/-/cacheable-request-6.0.0.tgz#4a1727414e02ac4af82560c4da1b61daa3fa2b63" 274 | integrity sha512-2N7AmszH/WPPpl5Z3XMw1HAP+8d+xugnKQAeKvxFZ/04dbT/CAznqwbl+7eSr3HkwdepNwtb2yx3CAMQWvG01Q== 275 | dependencies: 276 | clone-response "^1.0.2" 277 | get-stream "^4.0.0" 278 | http-cache-semantics "^4.0.0" 279 | keyv "^3.0.0" 280 | lowercase-keys "^1.0.1" 281 | normalize-url "^3.1.0" 282 | responselike "^1.0.2" 283 | 284 | caller-callsite@^2.0.0: 285 | version "2.0.0" 286 | resolved "https://registry.yarnpkg.com/caller-callsite/-/caller-callsite-2.0.0.tgz#847e0fce0a223750a9a027c54b33731ad3154134" 287 | integrity sha1-hH4PzgoiN1CpoCfFSzNzGtMVQTQ= 288 | dependencies: 289 | callsites "^2.0.0" 290 | 291 | caller-path@^2.0.0: 292 | version "2.0.0" 293 | resolved "https://registry.yarnpkg.com/caller-path/-/caller-path-2.0.0.tgz#468f83044e369ab2010fac5f06ceee15bb2cb1f4" 294 | integrity sha1-Ro+DBE42mrIBD6xfBs7uFbsssfQ= 295 | dependencies: 296 | caller-callsite "^2.0.0" 297 | 298 | callsites@^2.0.0: 299 | version "2.0.0" 300 | resolved "https://registry.yarnpkg.com/callsites/-/callsites-2.0.0.tgz#06eb84f00eea413da86affefacbffb36093b3c50" 301 | integrity sha1-BuuE8A7qQT2oav/vrL/7Ngk7PFA= 302 | 303 | camelcase@^5.0.0: 304 | version "5.3.1" 305 | resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" 306 | integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== 307 | 308 | chalk@^1.0.0, chalk@^1.1.3: 309 | version "1.1.3" 310 | resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98" 311 | integrity sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg= 312 | dependencies: 313 | ansi-styles "^2.2.1" 314 | escape-string-regexp "^1.0.2" 315 | has-ansi "^2.0.0" 316 | strip-ansi "^3.0.0" 317 | supports-color "^2.0.0" 318 | 319 | chalk@^2.0.0, chalk@^2.0.1, chalk@^2.3.0, chalk@^2.3.1, chalk@^2.4.1: 320 | version "2.4.2" 321 | resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" 322 | integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== 323 | dependencies: 324 | ansi-styles "^3.2.1" 325 | escape-string-regexp "^1.0.5" 326 | supports-color "^5.3.0" 327 | 328 | ci-info@^2.0.0: 329 | version "2.0.0" 330 | resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-2.0.0.tgz#67a9e964be31a51e15e5010d58e6f12834002f46" 331 | integrity sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ== 332 | 333 | class-utils@^0.3.5: 334 | version "0.3.6" 335 | resolved "https://registry.yarnpkg.com/class-utils/-/class-utils-0.3.6.tgz#f93369ae8b9a7ce02fd41faad0ca83033190c463" 336 | integrity sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg== 337 | dependencies: 338 | arr-union "^3.1.0" 339 | define-property "^0.2.5" 340 | isobject "^3.0.0" 341 | static-extend "^0.1.1" 342 | 343 | cli-cursor@^2.0.0, cli-cursor@^2.1.0: 344 | version "2.1.0" 345 | resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-2.1.0.tgz#b35dac376479facc3e94747d41d0d0f5238ffcb5" 346 | integrity sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU= 347 | dependencies: 348 | restore-cursor "^2.0.0" 349 | 350 | cli-truncate@^0.2.1: 351 | version "0.2.1" 352 | resolved "https://registry.yarnpkg.com/cli-truncate/-/cli-truncate-0.2.1.tgz#9f15cfbb0705005369216c626ac7d05ab90dd574" 353 | integrity sha1-nxXPuwcFAFNpIWxiasfQWrkN1XQ= 354 | dependencies: 355 | slice-ansi "0.0.4" 356 | string-width "^1.0.1" 357 | 358 | cliui@^4.0.0: 359 | version "4.1.0" 360 | resolved "https://registry.yarnpkg.com/cliui/-/cliui-4.1.0.tgz#348422dbe82d800b3022eef4f6ac10bf2e4d1b49" 361 | integrity sha512-4FG+RSG9DL7uEwRUZXZn3SS34DiDPfzP0VOiEwtUWlE+AR2EIg+hSyvrIgUUfhdgR/UkAeW2QHgeP+hWrXs7jQ== 362 | dependencies: 363 | string-width "^2.1.1" 364 | strip-ansi "^4.0.0" 365 | wrap-ansi "^2.0.0" 366 | 367 | clone-response@^1.0.2: 368 | version "1.0.2" 369 | resolved "https://registry.yarnpkg.com/clone-response/-/clone-response-1.0.2.tgz#d1dc973920314df67fbeb94223b4ee350239e96b" 370 | integrity sha1-0dyXOSAxTfZ/vrlCI7TuNQI56Ws= 371 | dependencies: 372 | mimic-response "^1.0.0" 373 | 374 | code-point-at@^1.0.0: 375 | version "1.1.0" 376 | resolved "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77" 377 | integrity sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c= 378 | 379 | collection-visit@^1.0.0: 380 | version "1.0.0" 381 | resolved "https://registry.yarnpkg.com/collection-visit/-/collection-visit-1.0.0.tgz#4bc0373c164bc3291b4d368c829cf1a80a59dca0" 382 | integrity sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA= 383 | dependencies: 384 | map-visit "^1.0.0" 385 | object-visit "^1.0.0" 386 | 387 | color-convert@^1.9.0: 388 | version "1.9.3" 389 | resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" 390 | integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== 391 | dependencies: 392 | color-name "1.1.3" 393 | 394 | color-name@1.1.3: 395 | version "1.1.3" 396 | resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" 397 | integrity sha1-p9BVi9icQveV3UIyj3QIMcpTvCU= 398 | 399 | commander@^2.12.1, commander@^2.14.1, commander@^2.9.0: 400 | version "2.20.0" 401 | resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.0.tgz#d58bb2b5c1ee8f87b0d340027e9e94e222c5a422" 402 | integrity sha512-7j2y+40w61zy6YC2iRNpUe/NwhNyoXrYpHMrSunaMG64nRnaf96zO/KMQR4OyN/UnE5KLyEBnKHd4aG3rskjpQ== 403 | 404 | component-emitter@^1.2.1: 405 | version "1.3.0" 406 | resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.3.0.tgz#16e4070fba8ae29b679f2215853ee181ab2eabc0" 407 | integrity sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg== 408 | 409 | concat-map@0.0.1: 410 | version "0.0.1" 411 | resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" 412 | integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= 413 | 414 | copy-descriptor@^0.1.0: 415 | version "0.1.1" 416 | resolved "https://registry.yarnpkg.com/copy-descriptor/-/copy-descriptor-0.1.1.tgz#676f6eb3c39997c2ee1ac3a924fd6124748f578d" 417 | integrity sha1-Z29us8OZl8LuGsOpJP1hJHSPV40= 418 | 419 | core-util-is@~1.0.0: 420 | version "1.0.2" 421 | resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" 422 | integrity sha1-tf1UIgqivFq1eqtxQMlAdUUDwac= 423 | 424 | cosmiconfig@^5.0.2, cosmiconfig@^5.0.7: 425 | version "5.2.0" 426 | resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-5.2.0.tgz#45038e4d28a7fe787203aede9c25bca4a08b12c8" 427 | integrity sha512-nxt+Nfc3JAqf4WIWd0jXLjTJZmsPLrA9DDc4nRw2KFJQJK7DNooqSXrNI7tzLG50CF8axczly5UV929tBmh/7g== 428 | dependencies: 429 | import-fresh "^2.0.0" 430 | is-directory "^0.3.1" 431 | js-yaml "^3.13.0" 432 | parse-json "^4.0.0" 433 | 434 | cross-spawn@^6.0.0: 435 | version "6.0.5" 436 | resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-6.0.5.tgz#4a5ec7c64dfae22c3a14124dbacdee846d80cbc4" 437 | integrity sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ== 438 | dependencies: 439 | nice-try "^1.0.4" 440 | path-key "^2.0.1" 441 | semver "^5.5.0" 442 | shebang-command "^1.2.0" 443 | which "^1.2.9" 444 | 445 | date-fns@^1.27.2: 446 | version "1.30.1" 447 | resolved "https://registry.yarnpkg.com/date-fns/-/date-fns-1.30.1.tgz#2e71bf0b119153dbb4cc4e88d9ea5acfb50dc05c" 448 | integrity sha512-hBSVCvSmWC+QypYObzwGOd9wqdDpOt+0wl0KbU+R+uuZBS1jN8VsD1ss3irQDknRj5NvxiTF6oj/nDRnN/UQNw== 449 | 450 | debug@3.2.6, debug@^3.1.0: 451 | version "3.2.6" 452 | resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.6.tgz#e83d17de16d8a7efb7717edbe5fb10135eee629b" 453 | integrity sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ== 454 | dependencies: 455 | ms "^2.1.1" 456 | 457 | debug@^2.2.0, debug@^2.3.3: 458 | version "2.6.9" 459 | resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" 460 | integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== 461 | dependencies: 462 | ms "2.0.0" 463 | 464 | debug@^4.0.1, debug@^4.1.1: 465 | version "4.1.1" 466 | resolved "https://registry.yarnpkg.com/debug/-/debug-4.1.1.tgz#3b72260255109c6b589cee050f1d516139664791" 467 | integrity sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw== 468 | dependencies: 469 | ms "^2.1.1" 470 | 471 | decamelize@^1.2.0: 472 | version "1.2.0" 473 | resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" 474 | integrity sha1-9lNNFRSCabIDUue+4m9QH5oZEpA= 475 | 476 | decode-uri-component@^0.2.0: 477 | version "0.2.0" 478 | resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.0.tgz#eb3913333458775cb84cd1a1fae062106bb87545" 479 | integrity sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU= 480 | 481 | decompress-response@^3.3.0: 482 | version "3.3.0" 483 | resolved "https://registry.yarnpkg.com/decompress-response/-/decompress-response-3.3.0.tgz#80a4dd323748384bfa248083622aedec982adff3" 484 | integrity sha1-gKTdMjdIOEv6JICDYirt7Jgq3/M= 485 | dependencies: 486 | mimic-response "^1.0.0" 487 | 488 | dedent@^0.7.0: 489 | version "0.7.0" 490 | resolved "https://registry.yarnpkg.com/dedent/-/dedent-0.7.0.tgz#2495ddbaf6eb874abb0e1be9df22d2e5a544326c" 491 | integrity sha1-JJXduvbrh0q7Dhvp3yLS5aVEMmw= 492 | 493 | defer-to-connect@^1.0.1: 494 | version "1.0.2" 495 | resolved "https://registry.yarnpkg.com/defer-to-connect/-/defer-to-connect-1.0.2.tgz#4bae758a314b034ae33902b5aac25a8dd6a8633e" 496 | integrity sha512-k09hcQcTDY+cwgiwa6PYKLm3jlagNzQ+RSvhjzESOGOx+MNOuXkxTfEvPrO1IOQ81tArCFYQgi631clB70RpQw== 497 | 498 | define-properties@^1.1.2: 499 | version "1.1.3" 500 | resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.3.tgz#cf88da6cbee26fe6db7094f61d870cbd84cee9f1" 501 | integrity sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ== 502 | dependencies: 503 | object-keys "^1.0.12" 504 | 505 | define-property@^0.2.5: 506 | version "0.2.5" 507 | resolved "https://registry.yarnpkg.com/define-property/-/define-property-0.2.5.tgz#c35b1ef918ec3c990f9a5bc57be04aacec5c8116" 508 | integrity sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY= 509 | dependencies: 510 | is-descriptor "^0.1.0" 511 | 512 | define-property@^1.0.0: 513 | version "1.0.0" 514 | resolved "https://registry.yarnpkg.com/define-property/-/define-property-1.0.0.tgz#769ebaaf3f4a63aad3af9e8d304c9bbe79bfb0e6" 515 | integrity sha1-dp66rz9KY6rTr56NMEybvnm/sOY= 516 | dependencies: 517 | is-descriptor "^1.0.0" 518 | 519 | define-property@^2.0.2: 520 | version "2.0.2" 521 | resolved "https://registry.yarnpkg.com/define-property/-/define-property-2.0.2.tgz#d459689e8d654ba77e02a817f8710d702cb16e9d" 522 | integrity sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ== 523 | dependencies: 524 | is-descriptor "^1.0.2" 525 | isobject "^3.0.1" 526 | 527 | del@^3.0.0: 528 | version "3.0.0" 529 | resolved "https://registry.yarnpkg.com/del/-/del-3.0.0.tgz#53ecf699ffcbcb39637691ab13baf160819766e5" 530 | integrity sha1-U+z2mf/LyzljdpGrE7rxYIGXZuU= 531 | dependencies: 532 | globby "^6.1.0" 533 | is-path-cwd "^1.0.0" 534 | is-path-in-cwd "^1.0.0" 535 | p-map "^1.1.1" 536 | pify "^3.0.0" 537 | rimraf "^2.2.8" 538 | 539 | diff@3.5.0, diff@^3.1.0, diff@^3.2.0: 540 | version "3.5.0" 541 | resolved "https://registry.yarnpkg.com/diff/-/diff-3.5.0.tgz#800c0dd1e0a8bfbc95835c202ad220fe317e5a12" 542 | integrity sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA== 543 | 544 | duplexer3@^0.1.4: 545 | version "0.1.4" 546 | resolved "https://registry.yarnpkg.com/duplexer3/-/duplexer3-0.1.4.tgz#ee01dd1cac0ed3cbc7fdbea37dc0a8f1ce002ce2" 547 | integrity sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI= 548 | 549 | duplexify@^3.5.1: 550 | version "3.7.1" 551 | resolved "https://registry.yarnpkg.com/duplexify/-/duplexify-3.7.1.tgz#2a4df5317f6ccfd91f86d6fd25d8d8a103b88309" 552 | integrity sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g== 553 | dependencies: 554 | end-of-stream "^1.0.0" 555 | inherits "^2.0.1" 556 | readable-stream "^2.0.0" 557 | stream-shift "^1.0.0" 558 | 559 | elegant-spinner@^1.0.1: 560 | version "1.0.1" 561 | resolved "https://registry.yarnpkg.com/elegant-spinner/-/elegant-spinner-1.0.1.tgz#db043521c95d7e303fd8f345bedc3349cfb0729e" 562 | integrity sha1-2wQ1IcldfjA/2PNFvtwzSc+wcp4= 563 | 564 | emoji-regex@^7.0.1: 565 | version "7.0.3" 566 | resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-7.0.3.tgz#933a04052860c85e83c122479c4748a8e4c72156" 567 | integrity sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA== 568 | 569 | end-of-stream@^1.0.0, end-of-stream@^1.1.0: 570 | version "1.4.1" 571 | resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.1.tgz#ed29634d19baba463b6ce6b80a37213eab71ec43" 572 | integrity sha512-1MkrZNvWTKCaigbn+W15elq2BB/L22nqrSY5DKlo3X6+vclJm8Bb5djXJBmEX6fS3+zCh/F4VBK5Z2KxJt4s2Q== 573 | dependencies: 574 | once "^1.4.0" 575 | 576 | error-ex@^1.3.1: 577 | version "1.3.2" 578 | resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf" 579 | integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g== 580 | dependencies: 581 | is-arrayish "^0.2.1" 582 | 583 | es-abstract@^1.5.1: 584 | version "1.13.0" 585 | resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.13.0.tgz#ac86145fdd5099d8dd49558ccba2eaf9b88e24e9" 586 | integrity sha512-vDZfg/ykNxQVwup/8E1BZhVzFfBxs9NqMzGcvIJrqg5k2/5Za2bWo40dK2J1pgLngZ7c+Shh8lwYtLGyrwPutg== 587 | dependencies: 588 | es-to-primitive "^1.2.0" 589 | function-bind "^1.1.1" 590 | has "^1.0.3" 591 | is-callable "^1.1.4" 592 | is-regex "^1.0.4" 593 | object-keys "^1.0.12" 594 | 595 | es-to-primitive@^1.2.0: 596 | version "1.2.0" 597 | resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.2.0.tgz#edf72478033456e8dda8ef09e00ad9650707f377" 598 | integrity sha512-qZryBOJjV//LaxLTV6UC//WewneB3LcXOL9NP++ozKVXsIIIpm/2c13UDiD9Jp2eThsecw9m3jPqDwTyobcdbg== 599 | dependencies: 600 | is-callable "^1.1.4" 601 | is-date-object "^1.0.1" 602 | is-symbol "^1.0.2" 603 | 604 | escape-string-regexp@1.0.5, escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.4, escape-string-regexp@^1.0.5: 605 | version "1.0.5" 606 | resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" 607 | integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= 608 | 609 | esprima@^4.0.0: 610 | version "4.0.1" 611 | resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" 612 | integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== 613 | 614 | esutils@^2.0.2: 615 | version "2.0.2" 616 | resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.2.tgz#0abf4f1caa5bcb1f7a9d8acc6dea4faaa04bac9b" 617 | integrity sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs= 618 | 619 | execa@^1.0.0: 620 | version "1.0.0" 621 | resolved "https://registry.yarnpkg.com/execa/-/execa-1.0.0.tgz#c6236a5bb4df6d6f15e88e7f017798216749ddd8" 622 | integrity sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA== 623 | dependencies: 624 | cross-spawn "^6.0.0" 625 | get-stream "^4.0.0" 626 | is-stream "^1.1.0" 627 | npm-run-path "^2.0.0" 628 | p-finally "^1.0.0" 629 | signal-exit "^3.0.0" 630 | strip-eof "^1.0.0" 631 | 632 | expand-brackets@^2.1.4: 633 | version "2.1.4" 634 | resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-2.1.4.tgz#b77735e315ce30f6b6eff0f83b04151a22449622" 635 | integrity sha1-t3c14xXOMPa27/D4OwQVGiJEliI= 636 | dependencies: 637 | debug "^2.3.3" 638 | define-property "^0.2.5" 639 | extend-shallow "^2.0.1" 640 | posix-character-classes "^0.1.0" 641 | regex-not "^1.0.0" 642 | snapdragon "^0.8.1" 643 | to-regex "^3.0.1" 644 | 645 | extend-shallow@^2.0.1: 646 | version "2.0.1" 647 | resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-2.0.1.tgz#51af7d614ad9a9f610ea1bafbb989d6b1c56890f" 648 | integrity sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8= 649 | dependencies: 650 | is-extendable "^0.1.0" 651 | 652 | extend-shallow@^3.0.0, extend-shallow@^3.0.2: 653 | version "3.0.2" 654 | resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-3.0.2.tgz#26a71aaf073b39fb2127172746131c2704028db8" 655 | integrity sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg= 656 | dependencies: 657 | assign-symbols "^1.0.0" 658 | is-extendable "^1.0.1" 659 | 660 | extglob@^2.0.4: 661 | version "2.0.4" 662 | resolved "https://registry.yarnpkg.com/extglob/-/extglob-2.0.4.tgz#ad00fe4dc612a9232e8718711dc5cb5ab0285543" 663 | integrity sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw== 664 | dependencies: 665 | array-unique "^0.3.2" 666 | define-property "^1.0.0" 667 | expand-brackets "^2.1.4" 668 | extend-shallow "^2.0.1" 669 | fragment-cache "^0.2.1" 670 | regex-not "^1.0.0" 671 | snapdragon "^0.8.1" 672 | to-regex "^3.0.1" 673 | 674 | figures@^1.7.0: 675 | version "1.7.0" 676 | resolved "https://registry.yarnpkg.com/figures/-/figures-1.7.0.tgz#cbe1e3affcf1cd44b80cadfed28dc793a9701d2e" 677 | integrity sha1-y+Hjr/zxzUS4DK3+0o3Hk6lwHS4= 678 | dependencies: 679 | escape-string-regexp "^1.0.5" 680 | object-assign "^4.1.0" 681 | 682 | figures@^2.0.0: 683 | version "2.0.0" 684 | resolved "https://registry.yarnpkg.com/figures/-/figures-2.0.0.tgz#3ab1a2d2a62c8bfb431a0c94cb797a2fce27c962" 685 | integrity sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI= 686 | dependencies: 687 | escape-string-regexp "^1.0.5" 688 | 689 | fill-range@^4.0.0: 690 | version "4.0.0" 691 | resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-4.0.0.tgz#d544811d428f98eb06a63dc402d2403c328c38f7" 692 | integrity sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc= 693 | dependencies: 694 | extend-shallow "^2.0.1" 695 | is-number "^3.0.0" 696 | repeat-string "^1.6.1" 697 | to-regex-range "^2.1.0" 698 | 699 | find-parent-dir@^0.3.0: 700 | version "0.3.0" 701 | resolved "https://registry.yarnpkg.com/find-parent-dir/-/find-parent-dir-0.3.0.tgz#33c44b429ab2b2f0646299c5f9f718f376ff8d54" 702 | integrity sha1-M8RLQpqysvBkYpnF+fcY83b/jVQ= 703 | 704 | find-up@3.0.0, find-up@^3.0.0: 705 | version "3.0.0" 706 | resolved "https://registry.yarnpkg.com/find-up/-/find-up-3.0.0.tgz#49169f1d7993430646da61ecc5ae355c21c97b73" 707 | integrity sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg== 708 | dependencies: 709 | locate-path "^3.0.0" 710 | 711 | flat@^4.1.0: 712 | version "4.1.0" 713 | resolved "https://registry.yarnpkg.com/flat/-/flat-4.1.0.tgz#090bec8b05e39cba309747f1d588f04dbaf98db2" 714 | integrity sha512-Px/TiLIznH7gEDlPXcUD4KnBusa6kR6ayRUVcnEAbreRIuhkqow/mun59BuRXwoYk7ZQOLW1ZM05ilIvK38hFw== 715 | dependencies: 716 | is-buffer "~2.0.3" 717 | 718 | fn-name@~2.0.1: 719 | version "2.0.1" 720 | resolved "https://registry.yarnpkg.com/fn-name/-/fn-name-2.0.1.tgz#5214d7537a4d06a4a301c0cc262feb84188002e7" 721 | integrity sha1-UhTXU3pNBqSjAcDMJi/rhBiAAuc= 722 | 723 | for-in@^1.0.2: 724 | version "1.0.2" 725 | resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80" 726 | integrity sha1-gQaNKVqBQuwKxybG4iAMMPttXoA= 727 | 728 | fragment-cache@^0.2.1: 729 | version "0.2.1" 730 | resolved "https://registry.yarnpkg.com/fragment-cache/-/fragment-cache-0.2.1.tgz#4290fad27f13e89be7f33799c6bc5a0abfff0d19" 731 | integrity sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk= 732 | dependencies: 733 | map-cache "^0.2.2" 734 | 735 | fs.realpath@^1.0.0: 736 | version "1.0.0" 737 | resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" 738 | integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8= 739 | 740 | function-bind@^1.1.1: 741 | version "1.1.1" 742 | resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" 743 | integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== 744 | 745 | g-status@^2.0.2: 746 | version "2.0.2" 747 | resolved "https://registry.yarnpkg.com/g-status/-/g-status-2.0.2.tgz#270fd32119e8fc9496f066fe5fe88e0a6bc78b97" 748 | integrity sha512-kQoE9qH+T1AHKgSSD0Hkv98bobE90ILQcXAF4wvGgsr7uFqNvwmh8j+Lq3l0RVt3E3HjSbv2B9biEGcEtpHLCA== 749 | dependencies: 750 | arrify "^1.0.1" 751 | matcher "^1.0.0" 752 | simple-git "^1.85.0" 753 | 754 | get-caller-file@^1.0.1: 755 | version "1.0.3" 756 | resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-1.0.3.tgz#f978fa4c90d1dfe7ff2d6beda2a515e713bdcf4a" 757 | integrity sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w== 758 | 759 | get-caller-file@^2.0.1: 760 | version "2.0.5" 761 | resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" 762 | integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== 763 | 764 | get-own-enumerable-property-symbols@^3.0.0: 765 | version "3.0.0" 766 | resolved "https://registry.yarnpkg.com/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-3.0.0.tgz#b877b49a5c16aefac3655f2ed2ea5b684df8d203" 767 | integrity sha512-CIJYJC4GGF06TakLg8z4GQKvDsx9EMspVxOYih7LerEL/WosUnFIww45CGfxfeKHqlg3twgUrYRT1O3WQqjGCg== 768 | 769 | get-stdin@^6.0.0: 770 | version "6.0.0" 771 | resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-6.0.0.tgz#9e09bf712b360ab9225e812048f71fde9c89657b" 772 | integrity sha512-jp4tHawyV7+fkkSKyvjuLZswblUtz+SQKzSWnBbii16BuZksJlU1wuBYXY75r+duh/llF1ur6oNwi+2ZzjKZ7g== 773 | 774 | get-stream@^4.0.0, get-stream@^4.1.0: 775 | version "4.1.0" 776 | resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-4.1.0.tgz#c1b255575f3dc21d59bfc79cd3d2b46b1c3a54b5" 777 | integrity sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w== 778 | dependencies: 779 | pump "^3.0.0" 780 | 781 | get-value@^2.0.3, get-value@^2.0.6: 782 | version "2.0.6" 783 | resolved "https://registry.yarnpkg.com/get-value/-/get-value-2.0.6.tgz#dc15ca1c672387ca76bd37ac0a395ba2042a2c28" 784 | integrity sha1-3BXKHGcjh8p2vTesCjlbogQqLCg= 785 | 786 | glob@7.1.3, glob@^7.0.3, glob@^7.1.1, glob@^7.1.3: 787 | version "7.1.3" 788 | resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.3.tgz#3960832d3f1574108342dafd3a67b332c0969df1" 789 | integrity sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ== 790 | dependencies: 791 | fs.realpath "^1.0.0" 792 | inflight "^1.0.4" 793 | inherits "2" 794 | minimatch "^3.0.4" 795 | once "^1.3.0" 796 | path-is-absolute "^1.0.0" 797 | 798 | globby@^6.1.0: 799 | version "6.1.0" 800 | resolved "https://registry.yarnpkg.com/globby/-/globby-6.1.0.tgz#f5a6d70e8395e21c858fb0489d64df02424d506c" 801 | integrity sha1-9abXDoOV4hyFj7BInWTfAkJNUGw= 802 | dependencies: 803 | array-union "^1.0.1" 804 | glob "^7.0.3" 805 | object-assign "^4.0.1" 806 | pify "^2.0.0" 807 | pinkie-promise "^2.0.0" 808 | 809 | got@^9.6.0: 810 | version "9.6.0" 811 | resolved "https://registry.yarnpkg.com/got/-/got-9.6.0.tgz#edf45e7d67f99545705de1f7bbeeeb121765ed85" 812 | integrity sha512-R7eWptXuGYxwijs0eV+v3o6+XH1IqVK8dJOEecQfTmkncw9AV4dcw/Dhxi8MdlqPthxxpZyizMzyg8RTmEsG+Q== 813 | dependencies: 814 | "@sindresorhus/is" "^0.14.0" 815 | "@szmarczak/http-timer" "^1.1.2" 816 | cacheable-request "^6.0.0" 817 | decompress-response "^3.3.0" 818 | duplexer3 "^0.1.4" 819 | get-stream "^4.1.0" 820 | lowercase-keys "^1.0.1" 821 | mimic-response "^1.0.1" 822 | p-cancelable "^1.0.0" 823 | to-readable-stream "^1.0.0" 824 | url-parse-lax "^3.0.0" 825 | 826 | growl@1.10.5: 827 | version "1.10.5" 828 | resolved "https://registry.yarnpkg.com/growl/-/growl-1.10.5.tgz#f2735dc2283674fa67478b10181059355c369e5e" 829 | integrity sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA== 830 | 831 | has-ansi@^2.0.0: 832 | version "2.0.0" 833 | resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-2.0.0.tgz#34f5049ce1ecdf2b0649af3ef24e45ed35416d91" 834 | integrity sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE= 835 | dependencies: 836 | ansi-regex "^2.0.0" 837 | 838 | has-flag@^3.0.0: 839 | version "3.0.0" 840 | resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" 841 | integrity sha1-tdRU3CGZriJWmfNGfloH87lVuv0= 842 | 843 | has-symbols@^1.0.0: 844 | version "1.0.0" 845 | resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.0.tgz#ba1a8f1af2a0fc39650f5c850367704122063b44" 846 | integrity sha1-uhqPGvKg/DllD1yFA2dwQSIGO0Q= 847 | 848 | has-value@^0.3.1: 849 | version "0.3.1" 850 | resolved "https://registry.yarnpkg.com/has-value/-/has-value-0.3.1.tgz#7b1f58bada62ca827ec0a2078025654845995e1f" 851 | integrity sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8= 852 | dependencies: 853 | get-value "^2.0.3" 854 | has-values "^0.1.4" 855 | isobject "^2.0.0" 856 | 857 | has-value@^1.0.0: 858 | version "1.0.0" 859 | resolved "https://registry.yarnpkg.com/has-value/-/has-value-1.0.0.tgz#18b281da585b1c5c51def24c930ed29a0be6b177" 860 | integrity sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc= 861 | dependencies: 862 | get-value "^2.0.6" 863 | has-values "^1.0.0" 864 | isobject "^3.0.0" 865 | 866 | has-values@^0.1.4: 867 | version "0.1.4" 868 | resolved "https://registry.yarnpkg.com/has-values/-/has-values-0.1.4.tgz#6d61de95d91dfca9b9a02089ad384bff8f62b771" 869 | integrity sha1-bWHeldkd/Km5oCCJrThL/49it3E= 870 | 871 | has-values@^1.0.0: 872 | version "1.0.0" 873 | resolved "https://registry.yarnpkg.com/has-values/-/has-values-1.0.0.tgz#95b0b63fec2146619a6fe57fe75628d5a39efe4f" 874 | integrity sha1-lbC2P+whRmGab+V/51Yo1aOe/k8= 875 | dependencies: 876 | is-number "^3.0.0" 877 | kind-of "^4.0.0" 878 | 879 | has@^1.0.1, has@^1.0.3: 880 | version "1.0.3" 881 | resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" 882 | integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== 883 | dependencies: 884 | function-bind "^1.1.1" 885 | 886 | he@1.2.0: 887 | version "1.2.0" 888 | resolved "https://registry.yarnpkg.com/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f" 889 | integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw== 890 | 891 | hosted-git-info@^2.1.4: 892 | version "2.8.9" 893 | resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.8.9.tgz#dffc0bf9a21c02209090f2aa69429e1414daf3f9" 894 | integrity sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw== 895 | 896 | http-cache-semantics@^4.0.0: 897 | version "4.0.3" 898 | resolved "https://registry.yarnpkg.com/http-cache-semantics/-/http-cache-semantics-4.0.3.tgz#495704773277eeef6e43f9ab2c2c7d259dda25c5" 899 | integrity sha512-TcIMG3qeVLgDr1TEd2XvHaTnMPwYQUQMIBLy+5pLSDKYFc7UIqj39w8EGzZkaxoLv/l2K8HaI0t5AVA+YYgUew== 900 | 901 | husky@^1.3.1: 902 | version "1.3.1" 903 | resolved "https://registry.yarnpkg.com/husky/-/husky-1.3.1.tgz#26823e399300388ca2afff11cfa8a86b0033fae0" 904 | integrity sha512-86U6sVVVf4b5NYSZ0yvv88dRgBSSXXmHaiq5pP4KDj5JVzdwKgBjEtUPOm8hcoytezFwbU+7gotXNhpHdystlg== 905 | dependencies: 906 | cosmiconfig "^5.0.7" 907 | execa "^1.0.0" 908 | find-up "^3.0.0" 909 | get-stdin "^6.0.0" 910 | is-ci "^2.0.0" 911 | pkg-dir "^3.0.0" 912 | please-upgrade-node "^3.1.1" 913 | read-pkg "^4.0.1" 914 | run-node "^1.0.0" 915 | slash "^2.0.0" 916 | 917 | import-fresh@^2.0.0: 918 | version "2.0.0" 919 | resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-2.0.0.tgz#d81355c15612d386c61f9ddd3922d4304822a546" 920 | integrity sha1-2BNVwVYS04bGH53dOSLUMEgipUY= 921 | dependencies: 922 | caller-path "^2.0.0" 923 | resolve-from "^3.0.0" 924 | 925 | indent-string@^3.0.0: 926 | version "3.2.0" 927 | resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-3.2.0.tgz#4a5fd6d27cc332f37e5419a504dbb837105c9289" 928 | integrity sha1-Sl/W0nzDMvN+VBmlBNu4NxBckok= 929 | 930 | inflight@^1.0.4: 931 | version "1.0.6" 932 | resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" 933 | integrity sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk= 934 | dependencies: 935 | once "^1.3.0" 936 | wrappy "1" 937 | 938 | inherits@2, inherits@^2.0.1, inherits@~2.0.3: 939 | version "2.0.3" 940 | resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" 941 | integrity sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4= 942 | 943 | invert-kv@^2.0.0: 944 | version "2.0.0" 945 | resolved "https://registry.yarnpkg.com/invert-kv/-/invert-kv-2.0.0.tgz#7393f5afa59ec9ff5f67a27620d11c226e3eec02" 946 | integrity sha512-wPVv/y/QQ/Uiirj/vh3oP+1Ww+AWehmi1g5fFWGPF6IpCBCDVrhgHRMvrLfdYcwDh3QJbGXDW4JAuzxElLSqKA== 947 | 948 | is-accessor-descriptor@^0.1.6: 949 | version "0.1.6" 950 | resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz#a9e12cb3ae8d876727eeef3843f8a0897b5c98d6" 951 | integrity sha1-qeEss66Nh2cn7u84Q/igiXtcmNY= 952 | dependencies: 953 | kind-of "^3.0.2" 954 | 955 | is-accessor-descriptor@^1.0.0: 956 | version "1.0.0" 957 | resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz#169c2f6d3df1f992618072365c9b0ea1f6878656" 958 | integrity sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ== 959 | dependencies: 960 | kind-of "^6.0.0" 961 | 962 | is-arrayish@^0.2.1: 963 | version "0.2.1" 964 | resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" 965 | integrity sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0= 966 | 967 | is-buffer@^1.1.5: 968 | version "1.1.6" 969 | resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be" 970 | integrity sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w== 971 | 972 | is-buffer@~2.0.3: 973 | version "2.0.3" 974 | resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-2.0.3.tgz#4ecf3fcf749cbd1e472689e109ac66261a25e725" 975 | integrity sha512-U15Q7MXTuZlrbymiz95PJpZxu8IlipAp4dtS3wOdgPXx3mqBnslrWU14kxfHB+Py/+2PVKSr37dMAgM2A4uArw== 976 | 977 | is-callable@^1.1.4: 978 | version "1.1.4" 979 | resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.1.4.tgz#1e1adf219e1eeb684d691f9d6a05ff0d30a24d75" 980 | integrity sha512-r5p9sxJjYnArLjObpjA4xu5EKI3CuKHkJXMhT7kwbpUyIFD1n5PMAsoPvWnvtZiNz7LjkYDRZhd7FlI0eMijEA== 981 | 982 | is-ci@^2.0.0: 983 | version "2.0.0" 984 | resolved "https://registry.yarnpkg.com/is-ci/-/is-ci-2.0.0.tgz#6bc6334181810e04b5c22b3d589fdca55026404c" 985 | integrity sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w== 986 | dependencies: 987 | ci-info "^2.0.0" 988 | 989 | is-data-descriptor@^0.1.4: 990 | version "0.1.4" 991 | resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz#0b5ee648388e2c860282e793f1856fec3f301b56" 992 | integrity sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y= 993 | dependencies: 994 | kind-of "^3.0.2" 995 | 996 | is-data-descriptor@^1.0.0: 997 | version "1.0.0" 998 | resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz#d84876321d0e7add03990406abbbbd36ba9268c7" 999 | integrity sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ== 1000 | dependencies: 1001 | kind-of "^6.0.0" 1002 | 1003 | is-date-object@^1.0.1: 1004 | version "1.0.1" 1005 | resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.1.tgz#9aa20eb6aeebbff77fbd33e74ca01b33581d3a16" 1006 | integrity sha1-mqIOtq7rv/d/vTPnTKAbM1gdOhY= 1007 | 1008 | is-descriptor@^0.1.0: 1009 | version "0.1.6" 1010 | resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-0.1.6.tgz#366d8240dde487ca51823b1ab9f07a10a78251ca" 1011 | integrity sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg== 1012 | dependencies: 1013 | is-accessor-descriptor "^0.1.6" 1014 | is-data-descriptor "^0.1.4" 1015 | kind-of "^5.0.0" 1016 | 1017 | is-descriptor@^1.0.0, is-descriptor@^1.0.2: 1018 | version "1.0.2" 1019 | resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-1.0.2.tgz#3b159746a66604b04f8c81524ba365c5f14d86ec" 1020 | integrity sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg== 1021 | dependencies: 1022 | is-accessor-descriptor "^1.0.0" 1023 | is-data-descriptor "^1.0.0" 1024 | kind-of "^6.0.2" 1025 | 1026 | is-directory@^0.3.1: 1027 | version "0.3.1" 1028 | resolved "https://registry.yarnpkg.com/is-directory/-/is-directory-0.3.1.tgz#61339b6f2475fc772fd9c9d83f5c8575dc154ae1" 1029 | integrity sha1-YTObbyR1/Hcv2cnYP1yFddwVSuE= 1030 | 1031 | is-extendable@^0.1.0, is-extendable@^0.1.1: 1032 | version "0.1.1" 1033 | resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89" 1034 | integrity sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik= 1035 | 1036 | is-extendable@^1.0.1: 1037 | version "1.0.1" 1038 | resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-1.0.1.tgz#a7470f9e426733d81bd81e1155264e3a3507cab4" 1039 | integrity sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA== 1040 | dependencies: 1041 | is-plain-object "^2.0.4" 1042 | 1043 | is-extglob@^2.1.1: 1044 | version "2.1.1" 1045 | resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" 1046 | integrity sha1-qIwCU1eR8C7TfHahueqXc8gz+MI= 1047 | 1048 | is-fullwidth-code-point@^1.0.0: 1049 | version "1.0.0" 1050 | resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz#ef9e31386f031a7f0d643af82fde50c457ef00cb" 1051 | integrity sha1-754xOG8DGn8NZDr4L95QxFfvAMs= 1052 | dependencies: 1053 | number-is-nan "^1.0.0" 1054 | 1055 | is-fullwidth-code-point@^2.0.0: 1056 | version "2.0.0" 1057 | resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" 1058 | integrity sha1-o7MKXE8ZkYMWeqq5O+764937ZU8= 1059 | 1060 | is-glob@^4.0.0: 1061 | version "4.0.1" 1062 | resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.1.tgz#7567dbe9f2f5e2467bc77ab83c4a29482407a5dc" 1063 | integrity sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg== 1064 | dependencies: 1065 | is-extglob "^2.1.1" 1066 | 1067 | is-number@^3.0.0: 1068 | version "3.0.0" 1069 | resolved "https://registry.yarnpkg.com/is-number/-/is-number-3.0.0.tgz#24fd6201a4782cf50561c810276afc7d12d71195" 1070 | integrity sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU= 1071 | dependencies: 1072 | kind-of "^3.0.2" 1073 | 1074 | is-obj@^1.0.1: 1075 | version "1.0.1" 1076 | resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-1.0.1.tgz#3e4729ac1f5fde025cd7d83a896dab9f4f67db0f" 1077 | integrity sha1-PkcprB9f3gJc19g6iW2rn09n2w8= 1078 | 1079 | is-observable@^1.1.0: 1080 | version "1.1.0" 1081 | resolved "https://registry.yarnpkg.com/is-observable/-/is-observable-1.1.0.tgz#b3e986c8f44de950867cab5403f5a3465005975e" 1082 | integrity sha512-NqCa4Sa2d+u7BWc6CukaObG3Fh+CU9bvixbpcXYhy2VvYS7vVGIdAgnIS5Ks3A/cqk4rebLJ9s8zBstT2aKnIA== 1083 | dependencies: 1084 | symbol-observable "^1.1.0" 1085 | 1086 | is-path-cwd@^1.0.0: 1087 | version "1.0.0" 1088 | resolved "https://registry.yarnpkg.com/is-path-cwd/-/is-path-cwd-1.0.0.tgz#d225ec23132e89edd38fda767472e62e65f1106d" 1089 | integrity sha1-0iXsIxMuie3Tj9p2dHLmLmXxEG0= 1090 | 1091 | is-path-in-cwd@^1.0.0: 1092 | version "1.0.1" 1093 | resolved "https://registry.yarnpkg.com/is-path-in-cwd/-/is-path-in-cwd-1.0.1.tgz#5ac48b345ef675339bd6c7a48a912110b241cf52" 1094 | integrity sha512-FjV1RTW48E7CWM7eE/J2NJvAEEVektecDBVBE5Hh3nM1Jd0kvhHtX68Pr3xsDf857xt3Y4AkwVULK1Vku62aaQ== 1095 | dependencies: 1096 | is-path-inside "^1.0.0" 1097 | 1098 | is-path-inside@^1.0.0: 1099 | version "1.0.1" 1100 | resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-1.0.1.tgz#8ef5b7de50437a3fdca6b4e865ef7aa55cb48036" 1101 | integrity sha1-jvW33lBDej/cprToZe96pVy0gDY= 1102 | dependencies: 1103 | path-is-inside "^1.0.1" 1104 | 1105 | is-plain-object@^2.0.1, is-plain-object@^2.0.3, is-plain-object@^2.0.4: 1106 | version "2.0.4" 1107 | resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677" 1108 | integrity sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og== 1109 | dependencies: 1110 | isobject "^3.0.1" 1111 | 1112 | is-promise@^2.1.0: 1113 | version "2.1.0" 1114 | resolved "https://registry.yarnpkg.com/is-promise/-/is-promise-2.1.0.tgz#79a2a9ece7f096e80f36d2b2f3bc16c1ff4bf3fa" 1115 | integrity sha1-eaKp7OfwlugPNtKy87wWwf9L8/o= 1116 | 1117 | is-regex@^1.0.4: 1118 | version "1.0.4" 1119 | resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.0.4.tgz#5517489b547091b0930e095654ced25ee97e9491" 1120 | integrity sha1-VRdIm1RwkbCTDglWVM7SXul+lJE= 1121 | dependencies: 1122 | has "^1.0.1" 1123 | 1124 | is-regexp@^1.0.0: 1125 | version "1.0.0" 1126 | resolved "https://registry.yarnpkg.com/is-regexp/-/is-regexp-1.0.0.tgz#fd2d883545c46bac5a633e7b9a09e87fa2cb5069" 1127 | integrity sha1-/S2INUXEa6xaYz57mgnof6LLUGk= 1128 | 1129 | is-stream@^1.1.0: 1130 | version "1.1.0" 1131 | resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" 1132 | integrity sha1-EtSj3U5o4Lec6428hBc66A2RykQ= 1133 | 1134 | is-symbol@^1.0.2: 1135 | version "1.0.2" 1136 | resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.2.tgz#a055f6ae57192caee329e7a860118b497a950f38" 1137 | integrity sha512-HS8bZ9ox60yCJLH9snBpIwv9pYUAkcuLhSA1oero1UB5y9aiQpRA8y2ex945AOtCZL1lJDeIk3G5LthswI46Lw== 1138 | dependencies: 1139 | has-symbols "^1.0.0" 1140 | 1141 | is-windows@^1.0.2: 1142 | version "1.0.2" 1143 | resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d" 1144 | integrity sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA== 1145 | 1146 | isarray@1.0.0, isarray@~1.0.0: 1147 | version "1.0.0" 1148 | resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" 1149 | integrity sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE= 1150 | 1151 | isexe@^2.0.0: 1152 | version "2.0.0" 1153 | resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" 1154 | integrity sha1-6PvzdNxVb/iUehDcsFctYz8s+hA= 1155 | 1156 | isobject@^2.0.0: 1157 | version "2.1.0" 1158 | resolved "https://registry.yarnpkg.com/isobject/-/isobject-2.1.0.tgz#f065561096a3f1da2ef46272f815c840d87e0c89" 1159 | integrity sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk= 1160 | dependencies: 1161 | isarray "1.0.0" 1162 | 1163 | isobject@^3.0.0, isobject@^3.0.1: 1164 | version "3.0.1" 1165 | resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df" 1166 | integrity sha1-TkMekrEalzFjaqH5yNHMvP2reN8= 1167 | 1168 | js-tokens@^4.0.0: 1169 | version "4.0.0" 1170 | resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" 1171 | integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== 1172 | 1173 | js-yaml@3.13.1, js-yaml@^3.13.0: 1174 | version "3.13.1" 1175 | resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.13.1.tgz#aff151b30bfdfa8e49e05da22e7415e9dfa37847" 1176 | integrity sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw== 1177 | dependencies: 1178 | argparse "^1.0.7" 1179 | esprima "^4.0.0" 1180 | 1181 | json-buffer@3.0.0: 1182 | version "3.0.0" 1183 | resolved "https://registry.yarnpkg.com/json-buffer/-/json-buffer-3.0.0.tgz#5b1f397afc75d677bde8bcfc0e47e1f9a3d9a898" 1184 | integrity sha1-Wx85evx11ne96Lz8Dkfh+aPZqJg= 1185 | 1186 | json-parse-better-errors@^1.0.1: 1187 | version "1.0.2" 1188 | resolved "https://registry.yarnpkg.com/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz#bb867cfb3450e69107c131d1c514bab3dc8bcaa9" 1189 | integrity sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw== 1190 | 1191 | keyv@^3.0.0: 1192 | version "3.1.0" 1193 | resolved "https://registry.yarnpkg.com/keyv/-/keyv-3.1.0.tgz#ecc228486f69991e49e9476485a5be1e8fc5c4d9" 1194 | integrity sha512-9ykJ/46SN/9KPM/sichzQ7OvXyGDYKGTaDlKMGCAlg2UK8KRy4jb0d8sFc+0Tt0YYnThq8X2RZgCg74RPxgcVA== 1195 | dependencies: 1196 | json-buffer "3.0.0" 1197 | 1198 | kind-of@^3.0.2, kind-of@^3.0.3, kind-of@^3.2.0: 1199 | version "3.2.2" 1200 | resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.2.tgz#31ea21a734bab9bbb0f32466d893aea51e4a3c64" 1201 | integrity sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ= 1202 | dependencies: 1203 | is-buffer "^1.1.5" 1204 | 1205 | kind-of@^4.0.0: 1206 | version "4.0.0" 1207 | resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-4.0.0.tgz#20813df3d712928b207378691a45066fae72dd57" 1208 | integrity sha1-IIE989cSkosgc3hpGkUGb65y3Vc= 1209 | dependencies: 1210 | is-buffer "^1.1.5" 1211 | 1212 | kind-of@^5.0.0: 1213 | version "5.1.0" 1214 | resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-5.1.0.tgz#729c91e2d857b7a419a1f9aa65685c4c33f5845d" 1215 | integrity sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw== 1216 | 1217 | kind-of@^6.0.0, kind-of@^6.0.2: 1218 | version "6.0.2" 1219 | resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.2.tgz#01146b36a6218e64e58f3a8d66de5d7fc6f6d051" 1220 | integrity sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA== 1221 | 1222 | lcid@^2.0.0: 1223 | version "2.0.0" 1224 | resolved "https://registry.yarnpkg.com/lcid/-/lcid-2.0.0.tgz#6ef5d2df60e52f82eb228a4c373e8d1f397253cf" 1225 | integrity sha512-avPEb8P8EGnwXKClwsNUgryVjllcRqtMYa49NTsbQagYuT1DcXnl1915oxWjoyGrXR6zH/Y0Zc96xWsPcoDKeA== 1226 | dependencies: 1227 | invert-kv "^2.0.0" 1228 | 1229 | lint-staged@^8.1.5: 1230 | version "8.1.5" 1231 | resolved "https://registry.yarnpkg.com/lint-staged/-/lint-staged-8.1.5.tgz#372476fe1a58b8834eb562ed4c99126bd60bdd79" 1232 | integrity sha512-e5ZavfnSLcBJE1BTzRTqw6ly8OkqVyO3GL2M6teSmTBYQ/2BuueD5GIt2RPsP31u/vjKdexUyDCxSyK75q4BDA== 1233 | dependencies: 1234 | chalk "^2.3.1" 1235 | commander "^2.14.1" 1236 | cosmiconfig "^5.0.2" 1237 | debug "^3.1.0" 1238 | dedent "^0.7.0" 1239 | del "^3.0.0" 1240 | execa "^1.0.0" 1241 | find-parent-dir "^0.3.0" 1242 | g-status "^2.0.2" 1243 | is-glob "^4.0.0" 1244 | is-windows "^1.0.2" 1245 | listr "^0.14.2" 1246 | listr-update-renderer "^0.5.0" 1247 | lodash "^4.17.11" 1248 | log-symbols "^2.2.0" 1249 | micromatch "^3.1.8" 1250 | npm-which "^3.0.1" 1251 | p-map "^1.1.1" 1252 | path-is-inside "^1.0.2" 1253 | pify "^3.0.0" 1254 | please-upgrade-node "^3.0.2" 1255 | staged-git-files "1.1.2" 1256 | string-argv "^0.0.2" 1257 | stringify-object "^3.2.2" 1258 | yup "^0.26.10" 1259 | 1260 | listr-silent-renderer@^1.1.1: 1261 | version "1.1.1" 1262 | resolved "https://registry.yarnpkg.com/listr-silent-renderer/-/listr-silent-renderer-1.1.1.tgz#924b5a3757153770bf1a8e3fbf74b8bbf3f9242e" 1263 | integrity sha1-kktaN1cVN3C/Go4/v3S4u/P5JC4= 1264 | 1265 | listr-update-renderer@^0.5.0: 1266 | version "0.5.0" 1267 | resolved "https://registry.yarnpkg.com/listr-update-renderer/-/listr-update-renderer-0.5.0.tgz#4ea8368548a7b8aecb7e06d8c95cb45ae2ede6a2" 1268 | integrity sha512-tKRsZpKz8GSGqoI/+caPmfrypiaq+OQCbd+CovEC24uk1h952lVj5sC7SqyFUm+OaJ5HN/a1YLt5cit2FMNsFA== 1269 | dependencies: 1270 | chalk "^1.1.3" 1271 | cli-truncate "^0.2.1" 1272 | elegant-spinner "^1.0.1" 1273 | figures "^1.7.0" 1274 | indent-string "^3.0.0" 1275 | log-symbols "^1.0.2" 1276 | log-update "^2.3.0" 1277 | strip-ansi "^3.0.1" 1278 | 1279 | listr-verbose-renderer@^0.5.0: 1280 | version "0.5.0" 1281 | resolved "https://registry.yarnpkg.com/listr-verbose-renderer/-/listr-verbose-renderer-0.5.0.tgz#f1132167535ea4c1261102b9f28dac7cba1e03db" 1282 | integrity sha512-04PDPqSlsqIOaaaGZ+41vq5FejI9auqTInicFRndCBgE3bXG8D6W1I+mWhk+1nqbHmyhla/6BUrd5OSiHwKRXw== 1283 | dependencies: 1284 | chalk "^2.4.1" 1285 | cli-cursor "^2.1.0" 1286 | date-fns "^1.27.2" 1287 | figures "^2.0.0" 1288 | 1289 | listr@^0.14.2: 1290 | version "0.14.3" 1291 | resolved "https://registry.yarnpkg.com/listr/-/listr-0.14.3.tgz#2fea909604e434be464c50bddba0d496928fa586" 1292 | integrity sha512-RmAl7su35BFd/xoMamRjpIE4j3v+L28o8CT5YhAXQJm1fD+1l9ngXY8JAQRJ+tFK2i5njvi0iRUKV09vPwA0iA== 1293 | dependencies: 1294 | "@samverschueren/stream-to-observable" "^0.3.0" 1295 | is-observable "^1.1.0" 1296 | is-promise "^2.1.0" 1297 | is-stream "^1.1.0" 1298 | listr-silent-renderer "^1.1.1" 1299 | listr-update-renderer "^0.5.0" 1300 | listr-verbose-renderer "^0.5.0" 1301 | p-map "^2.0.0" 1302 | rxjs "^6.3.3" 1303 | 1304 | locate-path@^3.0.0: 1305 | version "3.0.0" 1306 | resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-3.0.0.tgz#dbec3b3ab759758071b58fe59fc41871af21400e" 1307 | integrity sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A== 1308 | dependencies: 1309 | p-locate "^3.0.0" 1310 | path-exists "^3.0.0" 1311 | 1312 | lodash@^4.17.10, lodash@^4.17.11: 1313 | version "4.17.21" 1314 | resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" 1315 | integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== 1316 | 1317 | log-symbols@2.2.0, log-symbols@^2.2.0: 1318 | version "2.2.0" 1319 | resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-2.2.0.tgz#5740e1c5d6f0dfda4ad9323b5332107ef6b4c40a" 1320 | integrity sha512-VeIAFslyIerEJLXHziedo2basKbMKtTw3vfn5IzG0XTjhAVEJyNHnL2p7vc+wBDSdQuUpNw3M2u6xb9QsAY5Eg== 1321 | dependencies: 1322 | chalk "^2.0.1" 1323 | 1324 | log-symbols@^1.0.2: 1325 | version "1.0.2" 1326 | resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-1.0.2.tgz#376ff7b58ea3086a0f09facc74617eca501e1a18" 1327 | integrity sha1-N2/3tY6jCGoPCfrMdGF+ylAeGhg= 1328 | dependencies: 1329 | chalk "^1.0.0" 1330 | 1331 | log-update@^2.3.0: 1332 | version "2.3.0" 1333 | resolved "https://registry.yarnpkg.com/log-update/-/log-update-2.3.0.tgz#88328fd7d1ce7938b29283746f0b1bc126b24708" 1334 | integrity sha1-iDKP19HOeTiykoN0bwsbwSayRwg= 1335 | dependencies: 1336 | ansi-escapes "^3.0.0" 1337 | cli-cursor "^2.0.0" 1338 | wrap-ansi "^3.0.1" 1339 | 1340 | lowercase-keys@^1.0.0, lowercase-keys@^1.0.1: 1341 | version "1.0.1" 1342 | resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-1.0.1.tgz#6f9e30b47084d971a7c820ff15a6c5167b74c26f" 1343 | integrity sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA== 1344 | 1345 | make-error@^1.1.1: 1346 | version "1.3.5" 1347 | resolved "https://registry.yarnpkg.com/make-error/-/make-error-1.3.5.tgz#efe4e81f6db28cadd605c70f29c831b58ef776c8" 1348 | integrity sha512-c3sIjNUow0+8swNwVpqoH4YCShKNFkMaw6oH1mNS2haDZQqkeZFlHS3dhoeEbKKmJB4vXpJucU6oH75aDYeE9g== 1349 | 1350 | map-age-cleaner@^0.1.1: 1351 | version "0.1.3" 1352 | resolved "https://registry.yarnpkg.com/map-age-cleaner/-/map-age-cleaner-0.1.3.tgz#7d583a7306434c055fe474b0f45078e6e1b4b92a" 1353 | integrity sha512-bJzx6nMoP6PDLPBFmg7+xRKeFZvFboMrGlxmNj9ClvX53KrmvM5bXFXEWjbz4cz1AFn+jWJ9z/DJSz7hrs0w3w== 1354 | dependencies: 1355 | p-defer "^1.0.0" 1356 | 1357 | map-cache@^0.2.2: 1358 | version "0.2.2" 1359 | resolved "https://registry.yarnpkg.com/map-cache/-/map-cache-0.2.2.tgz#c32abd0bd6525d9b051645bb4f26ac5dc98a0dbf" 1360 | integrity sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8= 1361 | 1362 | map-visit@^1.0.0: 1363 | version "1.0.0" 1364 | resolved "https://registry.yarnpkg.com/map-visit/-/map-visit-1.0.0.tgz#ecdca8f13144e660f1b5bd41f12f3479d98dfb8f" 1365 | integrity sha1-7Nyo8TFE5mDxtb1B8S80edmN+48= 1366 | dependencies: 1367 | object-visit "^1.0.0" 1368 | 1369 | matcher@^1.0.0: 1370 | version "1.1.1" 1371 | resolved "https://registry.yarnpkg.com/matcher/-/matcher-1.1.1.tgz#51d8301e138f840982b338b116bb0c09af62c1c2" 1372 | integrity sha512-+BmqxWIubKTRKNWx/ahnCkk3mG8m7OturVlqq6HiojGJTd5hVYbgZm6WzcYPCoB+KBT4Vd6R7WSRG2OADNaCjg== 1373 | dependencies: 1374 | escape-string-regexp "^1.0.4" 1375 | 1376 | mem@^4.0.0: 1377 | version "4.3.0" 1378 | resolved "https://registry.yarnpkg.com/mem/-/mem-4.3.0.tgz#461af497bc4ae09608cdb2e60eefb69bff744178" 1379 | integrity sha512-qX2bG48pTqYRVmDB37rn/6PT7LcR8T7oAX3bf99u1Tt1nzxYfxkgqDwUwolPlXweM0XzBOBFzSx4kfp7KP1s/w== 1380 | dependencies: 1381 | map-age-cleaner "^0.1.1" 1382 | mimic-fn "^2.0.0" 1383 | p-is-promise "^2.0.0" 1384 | 1385 | micromatch@^3.1.8: 1386 | version "3.1.10" 1387 | resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-3.1.10.tgz#70859bc95c9840952f359a068a3fc49f9ecfac23" 1388 | integrity sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg== 1389 | dependencies: 1390 | arr-diff "^4.0.0" 1391 | array-unique "^0.3.2" 1392 | braces "^2.3.1" 1393 | define-property "^2.0.2" 1394 | extend-shallow "^3.0.2" 1395 | extglob "^2.0.4" 1396 | fragment-cache "^0.2.1" 1397 | kind-of "^6.0.2" 1398 | nanomatch "^1.2.9" 1399 | object.pick "^1.3.0" 1400 | regex-not "^1.0.0" 1401 | snapdragon "^0.8.1" 1402 | to-regex "^3.0.2" 1403 | 1404 | mimic-fn@^1.0.0: 1405 | version "1.2.0" 1406 | resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-1.2.0.tgz#820c86a39334640e99516928bd03fca88057d022" 1407 | integrity sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ== 1408 | 1409 | mimic-fn@^2.0.0: 1410 | version "2.1.0" 1411 | resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" 1412 | integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== 1413 | 1414 | mimic-response@^1.0.0, mimic-response@^1.0.1: 1415 | version "1.0.1" 1416 | resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-1.0.1.tgz#4923538878eef42063cb8a3e3b0798781487ab1b" 1417 | integrity sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ== 1418 | 1419 | minimatch@3.0.4, minimatch@^3.0.4: 1420 | version "3.0.4" 1421 | resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" 1422 | integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA== 1423 | dependencies: 1424 | brace-expansion "^1.1.7" 1425 | 1426 | minimist@0.0.8: 1427 | version "0.0.8" 1428 | resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d" 1429 | integrity sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0= 1430 | 1431 | mixin-deep@^1.2.0: 1432 | version "1.3.2" 1433 | resolved "https://registry.yarnpkg.com/mixin-deep/-/mixin-deep-1.3.2.tgz#1120b43dc359a785dce65b55b82e257ccf479566" 1434 | integrity sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA== 1435 | dependencies: 1436 | for-in "^1.0.2" 1437 | is-extendable "^1.0.1" 1438 | 1439 | mkdirp@0.5.1, mkdirp@^0.5.1: 1440 | version "0.5.1" 1441 | resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903" 1442 | integrity sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM= 1443 | dependencies: 1444 | minimist "0.0.8" 1445 | 1446 | mocha@^6.0.2: 1447 | version "6.1.4" 1448 | resolved "https://registry.yarnpkg.com/mocha/-/mocha-6.1.4.tgz#e35fada242d5434a7e163d555c705f6875951640" 1449 | integrity sha512-PN8CIy4RXsIoxoFJzS4QNnCH4psUCPWc4/rPrst/ecSJJbLBkubMiyGCP2Kj/9YnWbotFqAoeXyXMucj7gwCFg== 1450 | dependencies: 1451 | ansi-colors "3.2.3" 1452 | browser-stdout "1.3.1" 1453 | debug "3.2.6" 1454 | diff "3.5.0" 1455 | escape-string-regexp "1.0.5" 1456 | find-up "3.0.0" 1457 | glob "7.1.3" 1458 | growl "1.10.5" 1459 | he "1.2.0" 1460 | js-yaml "3.13.1" 1461 | log-symbols "2.2.0" 1462 | minimatch "3.0.4" 1463 | mkdirp "0.5.1" 1464 | ms "2.1.1" 1465 | node-environment-flags "1.0.5" 1466 | object.assign "4.1.0" 1467 | strip-json-comments "2.0.1" 1468 | supports-color "6.0.0" 1469 | which "1.3.1" 1470 | wide-align "1.1.3" 1471 | yargs "13.2.2" 1472 | yargs-parser "13.0.0" 1473 | yargs-unparser "1.5.0" 1474 | 1475 | ms@2.0.0: 1476 | version "2.0.0" 1477 | resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" 1478 | integrity sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g= 1479 | 1480 | ms@2.1.1, ms@^2.1.1: 1481 | version "2.1.1" 1482 | resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.1.tgz#30a5864eb3ebb0a66f2ebe6d727af06a09d86e0a" 1483 | integrity sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg== 1484 | 1485 | nanoid@^2.0.0: 1486 | version "2.0.1" 1487 | resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-2.0.1.tgz#deb55cac196e3f138071911dabbc3726eb048864" 1488 | integrity sha512-k1u2uemjIGsn25zmujKnotgniC/gxQ9sdegdezeDiKdkDW56THUMqlz3urndKCXJxA6yPzSZbXx/QCMe/pxqsA== 1489 | 1490 | nanomatch@^1.2.9: 1491 | version "1.2.13" 1492 | resolved "https://registry.yarnpkg.com/nanomatch/-/nanomatch-1.2.13.tgz#b87a8aa4fc0de8fe6be88895b38983ff265bd119" 1493 | integrity sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA== 1494 | dependencies: 1495 | arr-diff "^4.0.0" 1496 | array-unique "^0.3.2" 1497 | define-property "^2.0.2" 1498 | extend-shallow "^3.0.2" 1499 | fragment-cache "^0.2.1" 1500 | is-windows "^1.0.2" 1501 | kind-of "^6.0.2" 1502 | object.pick "^1.3.0" 1503 | regex-not "^1.0.0" 1504 | snapdragon "^0.8.1" 1505 | to-regex "^3.0.1" 1506 | 1507 | nice-try@^1.0.4: 1508 | version "1.0.5" 1509 | resolved "https://registry.yarnpkg.com/nice-try/-/nice-try-1.0.5.tgz#a3378a7696ce7d223e88fc9b764bd7ef1089e366" 1510 | integrity sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ== 1511 | 1512 | node-environment-flags@1.0.5: 1513 | version "1.0.5" 1514 | resolved "https://registry.yarnpkg.com/node-environment-flags/-/node-environment-flags-1.0.5.tgz#fa930275f5bf5dae188d6192b24b4c8bbac3d76a" 1515 | integrity sha512-VNYPRfGfmZLx0Ye20jWzHUjyTW/c+6Wq+iLhDzUI4XmhrDd9l/FozXV3F2xOaXjvp0co0+v1YSR3CMP6g+VvLQ== 1516 | dependencies: 1517 | object.getownpropertydescriptors "^2.0.3" 1518 | semver "^5.7.0" 1519 | 1520 | normalize-package-data@^2.3.2: 1521 | version "2.5.0" 1522 | resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.5.0.tgz#e66db1838b200c1dfc233225d12cb36520e234a8" 1523 | integrity sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA== 1524 | dependencies: 1525 | hosted-git-info "^2.1.4" 1526 | resolve "^1.10.0" 1527 | semver "2 || 3 || 4 || 5" 1528 | validate-npm-package-license "^3.0.1" 1529 | 1530 | normalize-url@^3.1.0: 1531 | version "3.3.0" 1532 | resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-3.3.0.tgz#b2e1c4dc4f7c6d57743df733a4f5978d18650559" 1533 | integrity sha512-U+JJi7duF1o+u2pynbp2zXDW2/PADgC30f0GsHZtRh+HOcXHnw137TrNlyxxRvWW5fjKd3bcLHPxofWuCjaeZg== 1534 | 1535 | npm-path@^2.0.2: 1536 | version "2.0.4" 1537 | resolved "https://registry.yarnpkg.com/npm-path/-/npm-path-2.0.4.tgz#c641347a5ff9d6a09e4d9bce5580c4f505278e64" 1538 | integrity sha512-IFsj0R9C7ZdR5cP+ET342q77uSRdtWOlWpih5eC+lu29tIDbNEgDbzgVJ5UFvYHWhxDZ5TFkJafFioO0pPQjCw== 1539 | dependencies: 1540 | which "^1.2.10" 1541 | 1542 | npm-run-path@^2.0.0: 1543 | version "2.0.2" 1544 | resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-2.0.2.tgz#35a9232dfa35d7067b4cb2ddf2357b1871536c5f" 1545 | integrity sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8= 1546 | dependencies: 1547 | path-key "^2.0.0" 1548 | 1549 | npm-which@^3.0.1: 1550 | version "3.0.1" 1551 | resolved "https://registry.yarnpkg.com/npm-which/-/npm-which-3.0.1.tgz#9225f26ec3a285c209cae67c3b11a6b4ab7140aa" 1552 | integrity sha1-kiXybsOihcIJyuZ8OxGmtKtxQKo= 1553 | dependencies: 1554 | commander "^2.9.0" 1555 | npm-path "^2.0.2" 1556 | which "^1.2.10" 1557 | 1558 | number-is-nan@^1.0.0: 1559 | version "1.0.1" 1560 | resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d" 1561 | integrity sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0= 1562 | 1563 | object-assign@^4.0.1, object-assign@^4.1.0: 1564 | version "4.1.1" 1565 | resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" 1566 | integrity sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM= 1567 | 1568 | object-copy@^0.1.0: 1569 | version "0.1.0" 1570 | resolved "https://registry.yarnpkg.com/object-copy/-/object-copy-0.1.0.tgz#7e7d858b781bd7c991a41ba975ed3812754e998c" 1571 | integrity sha1-fn2Fi3gb18mRpBupde04EnVOmYw= 1572 | dependencies: 1573 | copy-descriptor "^0.1.0" 1574 | define-property "^0.2.5" 1575 | kind-of "^3.0.3" 1576 | 1577 | object-keys@^1.0.11, object-keys@^1.0.12: 1578 | version "1.1.1" 1579 | resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" 1580 | integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== 1581 | 1582 | object-visit@^1.0.0: 1583 | version "1.0.1" 1584 | resolved "https://registry.yarnpkg.com/object-visit/-/object-visit-1.0.1.tgz#f79c4493af0c5377b59fe39d395e41042dd045bb" 1585 | integrity sha1-95xEk68MU3e1n+OdOV5BBC3QRbs= 1586 | dependencies: 1587 | isobject "^3.0.0" 1588 | 1589 | object.assign@4.1.0: 1590 | version "4.1.0" 1591 | resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.0.tgz#968bf1100d7956bb3ca086f006f846b3bc4008da" 1592 | integrity sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w== 1593 | dependencies: 1594 | define-properties "^1.1.2" 1595 | function-bind "^1.1.1" 1596 | has-symbols "^1.0.0" 1597 | object-keys "^1.0.11" 1598 | 1599 | object.getownpropertydescriptors@^2.0.3: 1600 | version "2.0.3" 1601 | resolved "https://registry.yarnpkg.com/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.0.3.tgz#8758c846f5b407adab0f236e0986f14b051caa16" 1602 | integrity sha1-h1jIRvW0B62rDyNuCYbxSwUcqhY= 1603 | dependencies: 1604 | define-properties "^1.1.2" 1605 | es-abstract "^1.5.1" 1606 | 1607 | object.pick@^1.3.0: 1608 | version "1.3.0" 1609 | resolved "https://registry.yarnpkg.com/object.pick/-/object.pick-1.3.0.tgz#87a10ac4c1694bd2e1cbf53591a66141fb5dd747" 1610 | integrity sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c= 1611 | dependencies: 1612 | isobject "^3.0.1" 1613 | 1614 | once@^1.3.0, once@^1.3.1, once@^1.4.0: 1615 | version "1.4.0" 1616 | resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" 1617 | integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E= 1618 | dependencies: 1619 | wrappy "1" 1620 | 1621 | onetime@^2.0.0: 1622 | version "2.0.1" 1623 | resolved "https://registry.yarnpkg.com/onetime/-/onetime-2.0.1.tgz#067428230fd67443b2794b22bba528b6867962d4" 1624 | integrity sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ= 1625 | dependencies: 1626 | mimic-fn "^1.0.0" 1627 | 1628 | os-locale@^3.0.0, os-locale@^3.1.0: 1629 | version "3.1.0" 1630 | resolved "https://registry.yarnpkg.com/os-locale/-/os-locale-3.1.0.tgz#a802a6ee17f24c10483ab9935719cef4ed16bf1a" 1631 | integrity sha512-Z8l3R4wYWM40/52Z+S265okfFj8Kt2cC2MKY+xNi3kFs+XGI7WXu/I309QQQYbRW4ijiZ+yxs9pqEhJh0DqW3Q== 1632 | dependencies: 1633 | execa "^1.0.0" 1634 | lcid "^2.0.0" 1635 | mem "^4.0.0" 1636 | 1637 | p-cancelable@^1.0.0: 1638 | version "1.1.0" 1639 | resolved "https://registry.yarnpkg.com/p-cancelable/-/p-cancelable-1.1.0.tgz#d078d15a3af409220c886f1d9a0ca2e441ab26cc" 1640 | integrity sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw== 1641 | 1642 | p-defer@^1.0.0: 1643 | version "1.0.0" 1644 | resolved "https://registry.yarnpkg.com/p-defer/-/p-defer-1.0.0.tgz#9f6eb182f6c9aa8cd743004a7d4f96b196b0fb0c" 1645 | integrity sha1-n26xgvbJqozXQwBKfU+WsZaw+ww= 1646 | 1647 | p-finally@^1.0.0: 1648 | version "1.0.0" 1649 | resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae" 1650 | integrity sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4= 1651 | 1652 | p-is-promise@^2.0.0: 1653 | version "2.1.0" 1654 | resolved "https://registry.yarnpkg.com/p-is-promise/-/p-is-promise-2.1.0.tgz#918cebaea248a62cf7ffab8e3bca8c5f882fc42e" 1655 | integrity sha512-Y3W0wlRPK8ZMRbNq97l4M5otioeA5lm1z7bkNkxCka8HSPjR0xRWmpCmc9utiaLP9Jb1eD8BgeIxTW4AIF45Pg== 1656 | 1657 | p-limit@^2.0.0: 1658 | version "2.2.0" 1659 | resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.2.0.tgz#417c9941e6027a9abcba5092dd2904e255b5fbc2" 1660 | integrity sha512-pZbTJpoUsCzV48Mc9Nh51VbwO0X9cuPFE8gYwx9BTCt9SF8/b7Zljd2fVgOxhIF/HDTKgpVzs+GPhyKfjLLFRQ== 1661 | dependencies: 1662 | p-try "^2.0.0" 1663 | 1664 | p-locate@^3.0.0: 1665 | version "3.0.0" 1666 | resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-3.0.0.tgz#322d69a05c0264b25997d9f40cd8a891ab0064a4" 1667 | integrity sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ== 1668 | dependencies: 1669 | p-limit "^2.0.0" 1670 | 1671 | p-map@^1.1.1: 1672 | version "1.2.0" 1673 | resolved "https://registry.yarnpkg.com/p-map/-/p-map-1.2.0.tgz#e4e94f311eabbc8633a1e79908165fca26241b6b" 1674 | integrity sha512-r6zKACMNhjPJMTl8KcFH4li//gkrXWfbD6feV8l6doRHlzljFWGJ2AP6iKaCJXyZmAUMOPtvbW7EXkbWO/pLEA== 1675 | 1676 | p-map@^2.0.0: 1677 | version "2.1.0" 1678 | resolved "https://registry.yarnpkg.com/p-map/-/p-map-2.1.0.tgz#310928feef9c9ecc65b68b17693018a665cea175" 1679 | integrity sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw== 1680 | 1681 | p-try@^2.0.0: 1682 | version "2.2.0" 1683 | resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" 1684 | integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== 1685 | 1686 | parse-json@^4.0.0: 1687 | version "4.0.0" 1688 | resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-4.0.0.tgz#be35f5425be1f7f6c747184f98a788cb99477ee0" 1689 | integrity sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA= 1690 | dependencies: 1691 | error-ex "^1.3.1" 1692 | json-parse-better-errors "^1.0.1" 1693 | 1694 | pascalcase@^0.1.1: 1695 | version "0.1.1" 1696 | resolved "https://registry.yarnpkg.com/pascalcase/-/pascalcase-0.1.1.tgz#b363e55e8006ca6fe21784d2db22bd15d7917f14" 1697 | integrity sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ= 1698 | 1699 | path-exists@^3.0.0: 1700 | version "3.0.0" 1701 | resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515" 1702 | integrity sha1-zg6+ql94yxiSXqfYENe1mwEP1RU= 1703 | 1704 | path-is-absolute@^1.0.0: 1705 | version "1.0.1" 1706 | resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" 1707 | integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18= 1708 | 1709 | path-is-inside@^1.0.1, path-is-inside@^1.0.2: 1710 | version "1.0.2" 1711 | resolved "https://registry.yarnpkg.com/path-is-inside/-/path-is-inside-1.0.2.tgz#365417dede44430d1c11af61027facf074bdfc53" 1712 | integrity sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM= 1713 | 1714 | path-key@^2.0.0, path-key@^2.0.1: 1715 | version "2.0.1" 1716 | resolved "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40" 1717 | integrity sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A= 1718 | 1719 | path-parse@^1.0.6: 1720 | version "1.0.7" 1721 | resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" 1722 | integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== 1723 | 1724 | pify@^2.0.0: 1725 | version "2.3.0" 1726 | resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" 1727 | integrity sha1-7RQaasBDqEnqWISY59yosVMw6Qw= 1728 | 1729 | pify@^3.0.0: 1730 | version "3.0.0" 1731 | resolved "https://registry.yarnpkg.com/pify/-/pify-3.0.0.tgz#e5a4acd2c101fdf3d9a4d07f0dbc4db49dd28176" 1732 | integrity sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY= 1733 | 1734 | pinkie-promise@^2.0.0: 1735 | version "2.0.1" 1736 | resolved "https://registry.yarnpkg.com/pinkie-promise/-/pinkie-promise-2.0.1.tgz#2135d6dfa7a358c069ac9b178776288228450ffa" 1737 | integrity sha1-ITXW36ejWMBprJsXh3YogihFD/o= 1738 | dependencies: 1739 | pinkie "^2.0.0" 1740 | 1741 | pinkie@^2.0.0: 1742 | version "2.0.4" 1743 | resolved "https://registry.yarnpkg.com/pinkie/-/pinkie-2.0.4.tgz#72556b80cfa0d48a974e80e77248e80ed4f7f870" 1744 | integrity sha1-clVrgM+g1IqXToDnckjoDtT3+HA= 1745 | 1746 | pkg-dir@^3.0.0: 1747 | version "3.0.0" 1748 | resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-3.0.0.tgz#2749020f239ed990881b1f71210d51eb6523bea3" 1749 | integrity sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw== 1750 | dependencies: 1751 | find-up "^3.0.0" 1752 | 1753 | please-upgrade-node@^3.0.2, please-upgrade-node@^3.1.1: 1754 | version "3.1.1" 1755 | resolved "https://registry.yarnpkg.com/please-upgrade-node/-/please-upgrade-node-3.1.1.tgz#ed320051dfcc5024fae696712c8288993595e8ac" 1756 | integrity sha512-KY1uHnQ2NlQHqIJQpnh/i54rKkuxCEBx+voJIS/Mvb+L2iYd2NMotwduhKTMjfC1uKoX3VXOxLjIYG66dfJTVQ== 1757 | dependencies: 1758 | semver-compare "^1.0.0" 1759 | 1760 | posix-character-classes@^0.1.0: 1761 | version "0.1.1" 1762 | resolved "https://registry.yarnpkg.com/posix-character-classes/-/posix-character-classes-0.1.1.tgz#01eac0fe3b5af71a2a6c02feabb8c1fef7e00eab" 1763 | integrity sha1-AerA/jta9xoqbAL+q7jB/vfgDqs= 1764 | 1765 | prepend-http@^2.0.0: 1766 | version "2.0.0" 1767 | resolved "https://registry.yarnpkg.com/prepend-http/-/prepend-http-2.0.0.tgz#e92434bfa5ea8c19f41cdfd401d741a3c819d897" 1768 | integrity sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc= 1769 | 1770 | process-nextick-args@~2.0.0: 1771 | version "2.0.0" 1772 | resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.0.tgz#a37d732f4271b4ab1ad070d35508e8290788ffaa" 1773 | integrity sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw== 1774 | 1775 | property-expr@^1.5.0: 1776 | version "1.5.1" 1777 | resolved "https://registry.yarnpkg.com/property-expr/-/property-expr-1.5.1.tgz#22e8706894a0c8e28d58735804f6ba3a3673314f" 1778 | integrity sha512-CGuc0VUTGthpJXL36ydB6jnbyOf/rAHFvmVrJlH+Rg0DqqLFQGAP6hIaxD/G0OAmBJPhXDHuEJigrp0e0wFV6g== 1779 | 1780 | pump@^3.0.0: 1781 | version "3.0.0" 1782 | resolved "https://registry.yarnpkg.com/pump/-/pump-3.0.0.tgz#b4a2116815bde2f4e1ea602354e8c75565107a64" 1783 | integrity sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww== 1784 | dependencies: 1785 | end-of-stream "^1.1.0" 1786 | once "^1.3.1" 1787 | 1788 | read-pkg@^4.0.1: 1789 | version "4.0.1" 1790 | resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-4.0.1.tgz#963625378f3e1c4d48c85872b5a6ec7d5d093237" 1791 | integrity sha1-ljYlN48+HE1IyFhytabsfV0JMjc= 1792 | dependencies: 1793 | normalize-package-data "^2.3.2" 1794 | parse-json "^4.0.0" 1795 | pify "^3.0.0" 1796 | 1797 | readable-stream@^2.0.0, readable-stream@^2.3.3: 1798 | version "2.3.6" 1799 | resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.6.tgz#b11c27d88b8ff1fbe070643cf94b0c79ae1b0aaf" 1800 | integrity sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw== 1801 | dependencies: 1802 | core-util-is "~1.0.0" 1803 | inherits "~2.0.3" 1804 | isarray "~1.0.0" 1805 | process-nextick-args "~2.0.0" 1806 | safe-buffer "~5.1.1" 1807 | string_decoder "~1.1.1" 1808 | util-deprecate "~1.0.1" 1809 | 1810 | regenerator-runtime@^0.12.0: 1811 | version "0.12.1" 1812 | resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.12.1.tgz#fa1a71544764c036f8c49b13a08b2594c9f8a0de" 1813 | integrity sha512-odxIc1/vDlo4iZcfXqRYFj0vpXFNoGdKMAUieAlFYO6m/nl5e9KR/beGf41z4a1FI+aQgtjhuaSlDxQ0hmkrHg== 1814 | 1815 | regex-not@^1.0.0, regex-not@^1.0.2: 1816 | version "1.0.2" 1817 | resolved "https://registry.yarnpkg.com/regex-not/-/regex-not-1.0.2.tgz#1f4ece27e00b0b65e0247a6810e6a85d83a5752c" 1818 | integrity sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A== 1819 | dependencies: 1820 | extend-shallow "^3.0.2" 1821 | safe-regex "^1.1.0" 1822 | 1823 | repeat-element@^1.1.2: 1824 | version "1.1.3" 1825 | resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.3.tgz#782e0d825c0c5a3bb39731f84efee6b742e6b1ce" 1826 | integrity sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g== 1827 | 1828 | repeat-string@^1.6.1: 1829 | version "1.6.1" 1830 | resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637" 1831 | integrity sha1-jcrkcOHIirwtYA//Sndihtp15jc= 1832 | 1833 | require-directory@^2.1.1: 1834 | version "2.1.1" 1835 | resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" 1836 | integrity sha1-jGStX9MNqxyXbiNE/+f3kqam30I= 1837 | 1838 | require-main-filename@^1.0.1: 1839 | version "1.0.1" 1840 | resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-1.0.1.tgz#97f717b69d48784f5f526a6c5aa8ffdda055a4d1" 1841 | integrity sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE= 1842 | 1843 | require-main-filename@^2.0.0: 1844 | version "2.0.0" 1845 | resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-2.0.0.tgz#d0b329ecc7cc0f61649f62215be69af54aa8989b" 1846 | integrity sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg== 1847 | 1848 | resolve-from@^3.0.0: 1849 | version "3.0.0" 1850 | resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-3.0.0.tgz#b22c7af7d9d6881bc8b6e653335eebcb0a188748" 1851 | integrity sha1-six699nWiBvItuZTM17rywoYh0g= 1852 | 1853 | resolve-url@^0.2.1: 1854 | version "0.2.1" 1855 | resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a" 1856 | integrity sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo= 1857 | 1858 | resolve@^1.10.0, resolve@^1.3.2: 1859 | version "1.10.0" 1860 | resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.10.0.tgz#3bdaaeaf45cc07f375656dfd2e54ed0810b101ba" 1861 | integrity sha512-3sUr9aq5OfSg2S9pNtPA9hL1FVEAjvfOC4leW0SNf/mpnaakz2a9femSd6LqAww2RaFctwyf1lCqnTHuF1rxDg== 1862 | dependencies: 1863 | path-parse "^1.0.6" 1864 | 1865 | responselike@^1.0.2: 1866 | version "1.0.2" 1867 | resolved "https://registry.yarnpkg.com/responselike/-/responselike-1.0.2.tgz#918720ef3b631c5642be068f15ade5a46f4ba1e7" 1868 | integrity sha1-kYcg7ztjHFZCvgaPFa3lpG9Loec= 1869 | dependencies: 1870 | lowercase-keys "^1.0.0" 1871 | 1872 | restore-cursor@^2.0.0: 1873 | version "2.0.0" 1874 | resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-2.0.0.tgz#9f7ee287f82fd326d4fd162923d62129eee0dfaf" 1875 | integrity sha1-n37ih/gv0ybU/RYpI9YhKe7g368= 1876 | dependencies: 1877 | onetime "^2.0.0" 1878 | signal-exit "^3.0.2" 1879 | 1880 | ret@~0.1.10: 1881 | version "0.1.15" 1882 | resolved "https://registry.yarnpkg.com/ret/-/ret-0.1.15.tgz#b8a4825d5bdb1fc3f6f53c2bc33f81388681c7bc" 1883 | integrity sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg== 1884 | 1885 | rimraf@^2.2.8: 1886 | version "2.6.3" 1887 | resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.3.tgz#b2d104fe0d8fb27cf9e0a1cda8262dd3833c6cab" 1888 | integrity sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA== 1889 | dependencies: 1890 | glob "^7.1.3" 1891 | 1892 | run-node@^1.0.0: 1893 | version "1.0.0" 1894 | resolved "https://registry.yarnpkg.com/run-node/-/run-node-1.0.0.tgz#46b50b946a2aa2d4947ae1d886e9856fd9cabe5e" 1895 | integrity sha512-kc120TBlQ3mih1LSzdAJXo4xn/GWS2ec0l3S+syHDXP9uRr0JAT8Qd3mdMuyjqCzeZktgP3try92cEgf9Nks8A== 1896 | 1897 | rxjs@^6.3.3: 1898 | version "6.4.0" 1899 | resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.4.0.tgz#f3bb0fe7bda7fb69deac0c16f17b50b0b8790504" 1900 | integrity sha512-Z9Yfa11F6B9Sg/BK9MnqnQ+aQYicPLtilXBp2yUtDt2JRCE0h26d33EnfO3ZxoNxG0T92OUucP3Ct7cpfkdFfw== 1901 | dependencies: 1902 | tslib "^1.9.0" 1903 | 1904 | safe-buffer@^5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1: 1905 | version "5.1.2" 1906 | resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" 1907 | integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== 1908 | 1909 | safe-regex@^1.1.0: 1910 | version "1.1.0" 1911 | resolved "https://registry.yarnpkg.com/safe-regex/-/safe-regex-1.1.0.tgz#40a3669f3b077d1e943d44629e157dd48023bf2e" 1912 | integrity sha1-QKNmnzsHfR6UPURinhV91IAjvy4= 1913 | dependencies: 1914 | ret "~0.1.10" 1915 | 1916 | semver-compare@^1.0.0: 1917 | version "1.0.0" 1918 | resolved "https://registry.yarnpkg.com/semver-compare/-/semver-compare-1.0.0.tgz#0dee216a1c941ab37e9efb1788f6afc5ff5537fc" 1919 | integrity sha1-De4hahyUGrN+nvsXiPavxf9VN/w= 1920 | 1921 | "semver@2 || 3 || 4 || 5", semver@^5.3.0, semver@^5.5.0, semver@^5.7.0: 1922 | version "5.7.0" 1923 | resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.0.tgz#790a7cf6fea5459bac96110b29b60412dc8ff96b" 1924 | integrity sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA== 1925 | 1926 | set-blocking@^2.0.0: 1927 | version "2.0.0" 1928 | resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" 1929 | integrity sha1-BF+XgtARrppoA93TgrJDkrPYkPc= 1930 | 1931 | set-value@^0.4.3: 1932 | version "0.4.3" 1933 | resolved "https://registry.yarnpkg.com/set-value/-/set-value-0.4.3.tgz#7db08f9d3d22dc7f78e53af3c3bf4666ecdfccf1" 1934 | integrity sha1-fbCPnT0i3H945Trzw79GZuzfzPE= 1935 | dependencies: 1936 | extend-shallow "^2.0.1" 1937 | is-extendable "^0.1.1" 1938 | is-plain-object "^2.0.1" 1939 | to-object-path "^0.3.0" 1940 | 1941 | set-value@^2.0.0: 1942 | version "2.0.0" 1943 | resolved "https://registry.yarnpkg.com/set-value/-/set-value-2.0.0.tgz#71ae4a88f0feefbbf52d1ea604f3fb315ebb6274" 1944 | integrity sha512-hw0yxk9GT/Hr5yJEYnHNKYXkIA8mVJgd9ditYZCe16ZczcaELYYcfvaXesNACk2O8O0nTiPQcQhGUQj8JLzeeg== 1945 | dependencies: 1946 | extend-shallow "^2.0.1" 1947 | is-extendable "^0.1.1" 1948 | is-plain-object "^2.0.3" 1949 | split-string "^3.0.1" 1950 | 1951 | shebang-command@^1.2.0: 1952 | version "1.2.0" 1953 | resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea" 1954 | integrity sha1-RKrGW2lbAzmJaMOfNj/uXer98eo= 1955 | dependencies: 1956 | shebang-regex "^1.0.0" 1957 | 1958 | shebang-regex@^1.0.0: 1959 | version "1.0.0" 1960 | resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3" 1961 | integrity sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM= 1962 | 1963 | shortid@^2.2.14: 1964 | version "2.2.14" 1965 | resolved "https://registry.yarnpkg.com/shortid/-/shortid-2.2.14.tgz#80db6aafcbc3e3a46850b3c88d39e051b84c8d18" 1966 | integrity sha512-4UnZgr9gDdA1kaKj/38IiudfC3KHKhDc1zi/HSxd9FQDR0VLwH3/y79tZJLsVYPsJgIjeHjqIWaWVRJUj9qZOQ== 1967 | dependencies: 1968 | nanoid "^2.0.0" 1969 | 1970 | signal-exit@^3.0.0, signal-exit@^3.0.2: 1971 | version "3.0.2" 1972 | resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d" 1973 | integrity sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0= 1974 | 1975 | simple-git@^1.85.0: 1976 | version "1.110.0" 1977 | resolved "https://registry.yarnpkg.com/simple-git/-/simple-git-1.110.0.tgz#54eb179089d055a7783d32399246cebc9d9933e9" 1978 | integrity sha512-UYY0rQkknk0P5eb+KW+03F4TevZ9ou0H+LoGaj7iiVgpnZH4wdj/HTViy/1tNNkmIPcmtxuBqXWiYt2YwlRKOQ== 1979 | dependencies: 1980 | debug "^4.0.1" 1981 | 1982 | slash@^2.0.0: 1983 | version "2.0.0" 1984 | resolved "https://registry.yarnpkg.com/slash/-/slash-2.0.0.tgz#de552851a1759df3a8f206535442f5ec4ddeab44" 1985 | integrity sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A== 1986 | 1987 | slice-ansi@0.0.4: 1988 | version "0.0.4" 1989 | resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-0.0.4.tgz#edbf8903f66f7ce2f8eafd6ceed65e264c831b35" 1990 | integrity sha1-7b+JA/ZvfOL46v1s7tZeJkyDGzU= 1991 | 1992 | snapdragon-node@^2.0.1: 1993 | version "2.1.1" 1994 | resolved "https://registry.yarnpkg.com/snapdragon-node/-/snapdragon-node-2.1.1.tgz#6c175f86ff14bdb0724563e8f3c1b021a286853b" 1995 | integrity sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw== 1996 | dependencies: 1997 | define-property "^1.0.0" 1998 | isobject "^3.0.0" 1999 | snapdragon-util "^3.0.1" 2000 | 2001 | snapdragon-util@^3.0.1: 2002 | version "3.0.1" 2003 | resolved "https://registry.yarnpkg.com/snapdragon-util/-/snapdragon-util-3.0.1.tgz#f956479486f2acd79700693f6f7b805e45ab56e2" 2004 | integrity sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ== 2005 | dependencies: 2006 | kind-of "^3.2.0" 2007 | 2008 | snapdragon@^0.8.1: 2009 | version "0.8.2" 2010 | resolved "https://registry.yarnpkg.com/snapdragon/-/snapdragon-0.8.2.tgz#64922e7c565b0e14204ba1aa7d6964278d25182d" 2011 | integrity sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg== 2012 | dependencies: 2013 | base "^0.11.1" 2014 | debug "^2.2.0" 2015 | define-property "^0.2.5" 2016 | extend-shallow "^2.0.1" 2017 | map-cache "^0.2.2" 2018 | source-map "^0.5.6" 2019 | source-map-resolve "^0.5.0" 2020 | use "^3.1.0" 2021 | 2022 | source-map-resolve@^0.5.0: 2023 | version "0.5.2" 2024 | resolved "https://registry.yarnpkg.com/source-map-resolve/-/source-map-resolve-0.5.2.tgz#72e2cc34095543e43b2c62b2c4c10d4a9054f259" 2025 | integrity sha512-MjqsvNwyz1s0k81Goz/9vRBe9SZdB09Bdw+/zYyO+3CuPk6fouTaxscHkgtE8jKvf01kVfl8riHzERQ/kefaSA== 2026 | dependencies: 2027 | atob "^2.1.1" 2028 | decode-uri-component "^0.2.0" 2029 | resolve-url "^0.2.1" 2030 | source-map-url "^0.4.0" 2031 | urix "^0.1.0" 2032 | 2033 | source-map-support@^0.5.6: 2034 | version "0.5.12" 2035 | resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.12.tgz#b4f3b10d51857a5af0138d3ce8003b201613d599" 2036 | integrity sha512-4h2Pbvyy15EE02G+JOZpUCmqWJuqrs+sEkzewTm++BPi7Hvn/HwcqLAcNxYAyI0x13CpPPn+kMjl+hplXMHITQ== 2037 | dependencies: 2038 | buffer-from "^1.0.0" 2039 | source-map "^0.6.0" 2040 | 2041 | source-map-url@^0.4.0: 2042 | version "0.4.0" 2043 | resolved "https://registry.yarnpkg.com/source-map-url/-/source-map-url-0.4.0.tgz#3e935d7ddd73631b97659956d55128e87b5084a3" 2044 | integrity sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM= 2045 | 2046 | source-map@^0.5.6: 2047 | version "0.5.7" 2048 | resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" 2049 | integrity sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w= 2050 | 2051 | source-map@^0.6.0: 2052 | version "0.6.1" 2053 | resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" 2054 | integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== 2055 | 2056 | spdx-correct@^3.0.0: 2057 | version "3.1.0" 2058 | resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-3.1.0.tgz#fb83e504445268f154b074e218c87c003cd31df4" 2059 | integrity sha512-lr2EZCctC2BNR7j7WzJ2FpDznxky1sjfxvvYEyzxNyb6lZXHODmEoJeFu4JupYlkfha1KZpJyoqiJ7pgA1qq8Q== 2060 | dependencies: 2061 | spdx-expression-parse "^3.0.0" 2062 | spdx-license-ids "^3.0.0" 2063 | 2064 | spdx-exceptions@^2.1.0: 2065 | version "2.2.0" 2066 | resolved "https://registry.yarnpkg.com/spdx-exceptions/-/spdx-exceptions-2.2.0.tgz#2ea450aee74f2a89bfb94519c07fcd6f41322977" 2067 | integrity sha512-2XQACfElKi9SlVb1CYadKDXvoajPgBVPn/gOQLrTvHdElaVhr7ZEbqJaRnJLVNeaI4cMEAgVCeBMKF6MWRDCRA== 2068 | 2069 | spdx-expression-parse@^3.0.0: 2070 | version "3.0.0" 2071 | resolved "https://registry.yarnpkg.com/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz#99e119b7a5da00e05491c9fa338b7904823b41d0" 2072 | integrity sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg== 2073 | dependencies: 2074 | spdx-exceptions "^2.1.0" 2075 | spdx-license-ids "^3.0.0" 2076 | 2077 | spdx-license-ids@^3.0.0: 2078 | version "3.0.4" 2079 | resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.4.tgz#75ecd1a88de8c184ef015eafb51b5b48bfd11bb1" 2080 | integrity sha512-7j8LYJLeY/Yb6ACbQ7F76qy5jHkp0U6jgBfJsk97bwWlVUnUWsAgpyaCvo17h0/RQGnQ036tVDomiwoI4pDkQA== 2081 | 2082 | split-string@^3.0.1, split-string@^3.0.2: 2083 | version "3.1.0" 2084 | resolved "https://registry.yarnpkg.com/split-string/-/split-string-3.1.0.tgz#7cb09dda3a86585705c64b39a6466038682e8fe2" 2085 | integrity sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw== 2086 | dependencies: 2087 | extend-shallow "^3.0.0" 2088 | 2089 | sprintf-js@~1.0.2: 2090 | version "1.0.3" 2091 | resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" 2092 | integrity sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw= 2093 | 2094 | staged-git-files@1.1.2: 2095 | version "1.1.2" 2096 | resolved "https://registry.yarnpkg.com/staged-git-files/-/staged-git-files-1.1.2.tgz#4326d33886dc9ecfa29a6193bf511ba90a46454b" 2097 | integrity sha512-0Eyrk6uXW6tg9PYkhi/V/J4zHp33aNyi2hOCmhFLqLTIhbgqWn5jlSzI+IU0VqrZq6+DbHcabQl/WP6P3BG0QA== 2098 | 2099 | static-extend@^0.1.1: 2100 | version "0.1.2" 2101 | resolved "https://registry.yarnpkg.com/static-extend/-/static-extend-0.1.2.tgz#60809c39cbff55337226fd5e0b520f341f1fb5c6" 2102 | integrity sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY= 2103 | dependencies: 2104 | define-property "^0.2.5" 2105 | object-copy "^0.1.0" 2106 | 2107 | stream-shift@^1.0.0: 2108 | version "1.0.0" 2109 | resolved "https://registry.yarnpkg.com/stream-shift/-/stream-shift-1.0.0.tgz#d5c752825e5367e786f78e18e445ea223a155952" 2110 | integrity sha1-1cdSgl5TZ+eG944Y5EXqIjoVWVI= 2111 | 2112 | string-argv@^0.0.2: 2113 | version "0.0.2" 2114 | resolved "https://registry.yarnpkg.com/string-argv/-/string-argv-0.0.2.tgz#dac30408690c21f3c3630a3ff3a05877bdcbd736" 2115 | integrity sha1-2sMECGkMIfPDYwo/86BYd73L1zY= 2116 | 2117 | string-width@^1.0.1: 2118 | version "1.0.2" 2119 | resolved "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3" 2120 | integrity sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M= 2121 | dependencies: 2122 | code-point-at "^1.0.0" 2123 | is-fullwidth-code-point "^1.0.0" 2124 | strip-ansi "^3.0.0" 2125 | 2126 | "string-width@^1.0.2 || 2", string-width@^2.0.0, string-width@^2.1.1: 2127 | version "2.1.1" 2128 | resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e" 2129 | integrity sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw== 2130 | dependencies: 2131 | is-fullwidth-code-point "^2.0.0" 2132 | strip-ansi "^4.0.0" 2133 | 2134 | string-width@^3.0.0: 2135 | version "3.1.0" 2136 | resolved "https://registry.yarnpkg.com/string-width/-/string-width-3.1.0.tgz#22767be21b62af1081574306f69ac51b62203961" 2137 | integrity sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w== 2138 | dependencies: 2139 | emoji-regex "^7.0.1" 2140 | is-fullwidth-code-point "^2.0.0" 2141 | strip-ansi "^5.1.0" 2142 | 2143 | string_decoder@~1.1.1: 2144 | version "1.1.1" 2145 | resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" 2146 | integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== 2147 | dependencies: 2148 | safe-buffer "~5.1.0" 2149 | 2150 | stringify-object@^3.2.2: 2151 | version "3.3.0" 2152 | resolved "https://registry.yarnpkg.com/stringify-object/-/stringify-object-3.3.0.tgz#703065aefca19300d3ce88af4f5b3956d7556629" 2153 | integrity sha512-rHqiFh1elqCQ9WPLIC8I0Q/g/wj5J1eMkyoiD6eoQApWHP0FtlK7rqnhmabL5VUY9JQCcqwwvlOaSuutekgyrw== 2154 | dependencies: 2155 | get-own-enumerable-property-symbols "^3.0.0" 2156 | is-obj "^1.0.1" 2157 | is-regexp "^1.0.0" 2158 | 2159 | strip-ansi@^3.0.0, strip-ansi@^3.0.1: 2160 | version "3.0.1" 2161 | resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf" 2162 | integrity sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8= 2163 | dependencies: 2164 | ansi-regex "^2.0.0" 2165 | 2166 | strip-ansi@^4.0.0: 2167 | version "4.0.0" 2168 | resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-4.0.0.tgz#a8479022eb1ac368a871389b635262c505ee368f" 2169 | integrity sha1-qEeQIusaw2iocTibY1JixQXuNo8= 2170 | dependencies: 2171 | ansi-regex "^3.0.0" 2172 | 2173 | strip-ansi@^5.1.0: 2174 | version "5.2.0" 2175 | resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-5.2.0.tgz#8c9a536feb6afc962bdfa5b104a5091c1ad9c0ae" 2176 | integrity sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA== 2177 | dependencies: 2178 | ansi-regex "^4.1.0" 2179 | 2180 | strip-eof@^1.0.0: 2181 | version "1.0.0" 2182 | resolved "https://registry.yarnpkg.com/strip-eof/-/strip-eof-1.0.0.tgz#bb43ff5598a6eb05d89b59fcd129c983313606bf" 2183 | integrity sha1-u0P/VZim6wXYm1n80SnJgzE2Br8= 2184 | 2185 | strip-json-comments@2.0.1: 2186 | version "2.0.1" 2187 | resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" 2188 | integrity sha1-PFMZQukIwml8DsNEhYwobHygpgo= 2189 | 2190 | supports-color@6.0.0: 2191 | version "6.0.0" 2192 | resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-6.0.0.tgz#76cfe742cf1f41bb9b1c29ad03068c05b4c0e40a" 2193 | integrity sha512-on9Kwidc1IUQo+bQdhi8+Tijpo0e1SS6RoGo2guUwn5vdaxw8RXOF9Vb2ws+ihWOmh4JnCJOvaziZWP1VABaLg== 2194 | dependencies: 2195 | has-flag "^3.0.0" 2196 | 2197 | supports-color@^2.0.0: 2198 | version "2.0.0" 2199 | resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7" 2200 | integrity sha1-U10EXOa2Nj+kARcIRimZXp3zJMc= 2201 | 2202 | supports-color@^5.3.0: 2203 | version "5.5.0" 2204 | resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" 2205 | integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== 2206 | dependencies: 2207 | has-flag "^3.0.0" 2208 | 2209 | symbol-observable@^1.1.0: 2210 | version "1.2.0" 2211 | resolved "https://registry.yarnpkg.com/symbol-observable/-/symbol-observable-1.2.0.tgz#c22688aed4eab3cdc2dfeacbb561660560a00804" 2212 | integrity sha512-e900nM8RRtGhlV36KGEU9k65K3mPb1WV70OdjfxlG2EAuM1noi/E/BaW/uMhL7bPEssK8QV57vN3esixjUvcXQ== 2213 | 2214 | synchronous-promise@^2.0.5: 2215 | version "2.0.7" 2216 | resolved "https://registry.yarnpkg.com/synchronous-promise/-/synchronous-promise-2.0.7.tgz#3574b3d2fae86b145356a4b89103e1577f646fe3" 2217 | integrity sha512-16GbgwTmFMYFyQMLvtQjvNWh30dsFe1cAW5Fg1wm5+dg84L9Pe36mftsIRU95/W2YsISxsz/xq4VB23sqpgb/A== 2218 | 2219 | to-object-path@^0.3.0: 2220 | version "0.3.0" 2221 | resolved "https://registry.yarnpkg.com/to-object-path/-/to-object-path-0.3.0.tgz#297588b7b0e7e0ac08e04e672f85c1f4999e17af" 2222 | integrity sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68= 2223 | dependencies: 2224 | kind-of "^3.0.2" 2225 | 2226 | to-readable-stream@^1.0.0: 2227 | version "1.0.0" 2228 | resolved "https://registry.yarnpkg.com/to-readable-stream/-/to-readable-stream-1.0.0.tgz#ce0aa0c2f3df6adf852efb404a783e77c0475771" 2229 | integrity sha512-Iq25XBt6zD5npPhlLVXGFN3/gyR2/qODcKNNyTMd4vbm39HUaOiAM4PMq0eMVC/Tkxz+Zjdsc55g9yyz+Yq00Q== 2230 | 2231 | to-regex-range@^2.1.0: 2232 | version "2.1.1" 2233 | resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-2.1.1.tgz#7c80c17b9dfebe599e27367e0d4dd5590141db38" 2234 | integrity sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg= 2235 | dependencies: 2236 | is-number "^3.0.0" 2237 | repeat-string "^1.6.1" 2238 | 2239 | to-regex@^3.0.1, to-regex@^3.0.2: 2240 | version "3.0.2" 2241 | resolved "https://registry.yarnpkg.com/to-regex/-/to-regex-3.0.2.tgz#13cfdd9b336552f30b51f33a8ae1b42a7a7599ce" 2242 | integrity sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw== 2243 | dependencies: 2244 | define-property "^2.0.2" 2245 | extend-shallow "^3.0.2" 2246 | regex-not "^1.0.2" 2247 | safe-regex "^1.1.0" 2248 | 2249 | toposort@^2.0.2: 2250 | version "2.0.2" 2251 | resolved "https://registry.yarnpkg.com/toposort/-/toposort-2.0.2.tgz#ae21768175d1559d48bef35420b2f4962f09c330" 2252 | integrity sha1-riF2gXXRVZ1IvvNUILL0li8JwzA= 2253 | 2254 | ts-node@^8.0.3: 2255 | version "8.1.0" 2256 | resolved "https://registry.yarnpkg.com/ts-node/-/ts-node-8.1.0.tgz#8c4b37036abd448577db22a061fd7a67d47e658e" 2257 | integrity sha512-34jpuOrxDuf+O6iW1JpgTRDFynUZ1iEqtYruBqh35gICNjN8x+LpVcPAcwzLPi9VU6mdA3ym+x233nZmZp445A== 2258 | dependencies: 2259 | arg "^4.1.0" 2260 | diff "^3.1.0" 2261 | make-error "^1.1.1" 2262 | source-map-support "^0.5.6" 2263 | yn "^3.0.0" 2264 | 2265 | tslib@^1.8.0, tslib@^1.8.1, tslib@^1.9.0: 2266 | version "1.9.3" 2267 | resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.9.3.tgz#d7e4dd79245d85428c4d7e4822a79917954ca286" 2268 | integrity sha512-4krF8scpejhaOgqzBEcGM7yDIEfi0/8+8zDRZhNZZ2kjmHJ4hv3zCbQWxoJGz1iw5U0Jl0nma13xzHXcncMavQ== 2269 | 2270 | tslint@^5.13.1: 2271 | version "5.16.0" 2272 | resolved "https://registry.yarnpkg.com/tslint/-/tslint-5.16.0.tgz#ae61f9c5a98d295b9a4f4553b1b1e831c1984d67" 2273 | integrity sha512-UxG2yNxJ5pgGwmMzPMYh/CCnCnh0HfPgtlVRDs1ykZklufFBL1ZoTlWFRz2NQjcoEiDoRp+JyT0lhBbbH/obyA== 2274 | dependencies: 2275 | "@babel/code-frame" "^7.0.0" 2276 | builtin-modules "^1.1.1" 2277 | chalk "^2.3.0" 2278 | commander "^2.12.1" 2279 | diff "^3.2.0" 2280 | glob "^7.1.1" 2281 | js-yaml "^3.13.0" 2282 | minimatch "^3.0.4" 2283 | mkdirp "^0.5.1" 2284 | resolve "^1.3.2" 2285 | semver "^5.3.0" 2286 | tslib "^1.8.0" 2287 | tsutils "^2.29.0" 2288 | 2289 | tsutils@^2.29.0: 2290 | version "2.29.0" 2291 | resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-2.29.0.tgz#32b488501467acbedd4b85498673a0812aca0b99" 2292 | integrity sha512-g5JVHCIJwzfISaXpXE1qvNalca5Jwob6FjI4AoPlqMusJ6ftFE7IkkFoMhVLRgK+4Kx3gkzb8UZK5t5yTTvEmA== 2293 | dependencies: 2294 | tslib "^1.8.1" 2295 | 2296 | typescript@^3.3.3: 2297 | version "3.4.4" 2298 | resolved "https://registry.yarnpkg.com/typescript/-/typescript-3.4.4.tgz#aac4a08abecab8091a75f10842ffa0631818f785" 2299 | integrity sha512-xt5RsIRCEaf6+j9AyOBgvVuAec0i92rgCaS3S+UVf5Z/vF2Hvtsw08wtUTJqp4djwznoAgjSxeCcU4r+CcDBJA== 2300 | 2301 | ultron@~1.1.0: 2302 | version "1.1.1" 2303 | resolved "https://registry.yarnpkg.com/ultron/-/ultron-1.1.1.tgz#9fe1536a10a664a65266a1e3ccf85fd36302bc9c" 2304 | integrity sha512-UIEXBNeYmKptWH6z8ZnqTeS8fV74zG0/eRU9VGkpzz+LIJNs8W/zM/L+7ctCkRrgbNnnR0xxw4bKOr0cW0N0Og== 2305 | 2306 | union-value@^1.0.0: 2307 | version "1.0.0" 2308 | resolved "https://registry.yarnpkg.com/union-value/-/union-value-1.0.0.tgz#5c71c34cb5bad5dcebe3ea0cd08207ba5aa1aea4" 2309 | integrity sha1-XHHDTLW61dzr4+oM0IIHulqhrqQ= 2310 | dependencies: 2311 | arr-union "^3.1.0" 2312 | get-value "^2.0.6" 2313 | is-extendable "^0.1.1" 2314 | set-value "^0.4.3" 2315 | 2316 | unset-value@^1.0.0: 2317 | version "1.0.0" 2318 | resolved "https://registry.yarnpkg.com/unset-value/-/unset-value-1.0.0.tgz#8376873f7d2335179ffb1e6fc3a8ed0dfc8ab559" 2319 | integrity sha1-g3aHP30jNRef+x5vw6jtDfyKtVk= 2320 | dependencies: 2321 | has-value "^0.3.1" 2322 | isobject "^3.0.0" 2323 | 2324 | urix@^0.1.0: 2325 | version "0.1.0" 2326 | resolved "https://registry.yarnpkg.com/urix/-/urix-0.1.0.tgz#da937f7a62e21fec1fd18d49b35c2935067a6c72" 2327 | integrity sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI= 2328 | 2329 | url-parse-lax@^3.0.0: 2330 | version "3.0.0" 2331 | resolved "https://registry.yarnpkg.com/url-parse-lax/-/url-parse-lax-3.0.0.tgz#16b5cafc07dbe3676c1b1999177823d6503acb0c" 2332 | integrity sha1-FrXK/Afb42dsGxmZF3gj1lA6yww= 2333 | dependencies: 2334 | prepend-http "^2.0.0" 2335 | 2336 | use@^3.1.0: 2337 | version "3.1.1" 2338 | resolved "https://registry.yarnpkg.com/use/-/use-3.1.1.tgz#d50c8cac79a19fbc20f2911f56eb973f4e10070f" 2339 | integrity sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ== 2340 | 2341 | util-deprecate@~1.0.1: 2342 | version "1.0.2" 2343 | resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" 2344 | integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8= 2345 | 2346 | validate-npm-package-license@^3.0.1: 2347 | version "3.0.4" 2348 | resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz#fc91f6b9c7ba15c857f4cb2c5defeec39d4f410a" 2349 | integrity sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew== 2350 | dependencies: 2351 | spdx-correct "^3.0.0" 2352 | spdx-expression-parse "^3.0.0" 2353 | 2354 | websocket-stream@^5.3.0: 2355 | version "5.4.0" 2356 | resolved "https://registry.yarnpkg.com/websocket-stream/-/websocket-stream-5.4.0.tgz#d594e7b5305cf49d724829c5bf8f8f3d3b6dfa4f" 2357 | integrity sha512-7I4o+mmi0slEI7sUjbhYmhbP2O5qXeEV2fOs+oaRJ/Y/4+JgkTsIXvU6QqTN2i4vinxs4NOq2OwhHsLK3x0pWA== 2358 | dependencies: 2359 | duplexify "^3.5.1" 2360 | inherits "^2.0.1" 2361 | readable-stream "^2.3.3" 2362 | safe-buffer "^5.1.2" 2363 | ws "^3.2.0" 2364 | xtend "^4.0.0" 2365 | 2366 | which-module@^2.0.0: 2367 | version "2.0.0" 2368 | resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a" 2369 | integrity sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho= 2370 | 2371 | which@1.3.1, which@^1.2.10, which@^1.2.9: 2372 | version "1.3.1" 2373 | resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" 2374 | integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== 2375 | dependencies: 2376 | isexe "^2.0.0" 2377 | 2378 | wide-align@1.1.3: 2379 | version "1.1.3" 2380 | resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.3.tgz#ae074e6bdc0c14a431e804e624549c633b000457" 2381 | integrity sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA== 2382 | dependencies: 2383 | string-width "^1.0.2 || 2" 2384 | 2385 | wrap-ansi@^2.0.0: 2386 | version "2.1.0" 2387 | resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-2.1.0.tgz#d8fc3d284dd05794fe84973caecdd1cf824fdd85" 2388 | integrity sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU= 2389 | dependencies: 2390 | string-width "^1.0.1" 2391 | strip-ansi "^3.0.1" 2392 | 2393 | wrap-ansi@^3.0.1: 2394 | version "3.0.1" 2395 | resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-3.0.1.tgz#288a04d87eda5c286e060dfe8f135ce8d007f8ba" 2396 | integrity sha1-KIoE2H7aXChuBg3+jxNc6NAH+Lo= 2397 | dependencies: 2398 | string-width "^2.1.1" 2399 | strip-ansi "^4.0.0" 2400 | 2401 | wrappy@1: 2402 | version "1.0.2" 2403 | resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" 2404 | integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= 2405 | 2406 | ws@^3.2.0: 2407 | version "3.3.3" 2408 | resolved "https://registry.yarnpkg.com/ws/-/ws-3.3.3.tgz#f1cf84fe2d5e901ebce94efaece785f187a228f2" 2409 | integrity sha512-nnWLa/NwZSt4KQJu51MYlCcSQ5g7INpOrOMt4XV8j4dqTXdmlUmSHQ8/oLC069ckre0fRsgfvsKwbTdtKLCDkA== 2410 | dependencies: 2411 | async-limiter "~1.0.0" 2412 | safe-buffer "~5.1.0" 2413 | ultron "~1.1.0" 2414 | 2415 | ws@^7.4.6: 2416 | version "7.4.6" 2417 | resolved "https://registry.yarnpkg.com/ws/-/ws-7.4.6.tgz#5654ca8ecdeee47c33a9a4bf6d28e2be2980377c" 2418 | integrity sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A== 2419 | 2420 | xtend@^4.0.0: 2421 | version "4.0.1" 2422 | resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.1.tgz#a5c6d532be656e23db820efb943a1f04998d63af" 2423 | integrity sha1-pcbVMr5lbiPbgg77lDofBJmNY68= 2424 | 2425 | "y18n@^3.2.1 || ^4.0.0", y18n@^4.0.0: 2426 | version "4.0.0" 2427 | resolved "https://registry.yarnpkg.com/y18n/-/y18n-4.0.0.tgz#95ef94f85ecc81d007c264e190a120f0a3c8566b" 2428 | integrity sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w== 2429 | 2430 | yargs-parser@13.0.0, yargs-parser@^13.0.0: 2431 | version "13.0.0" 2432 | resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-13.0.0.tgz#3fc44f3e76a8bdb1cc3602e860108602e5ccde8b" 2433 | integrity sha512-w2LXjoL8oRdRQN+hOyppuXs+V/fVAYtpcrRxZuF7Kt/Oc+Jr2uAcVntaUTNT6w5ihoWfFDpNY8CPx1QskxZ/pw== 2434 | dependencies: 2435 | camelcase "^5.0.0" 2436 | decamelize "^1.2.0" 2437 | 2438 | yargs-parser@^11.1.1: 2439 | version "11.1.1" 2440 | resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-11.1.1.tgz#879a0865973bca9f6bab5cbdf3b1c67ec7d3bcf4" 2441 | integrity sha512-C6kB/WJDiaxONLJQnF8ccx9SEeoTTLek8RVbaOIsrAUS8VrBEXfmeSnCZxygc+XC2sNMBIwOOnfcxiynjHsVSQ== 2442 | dependencies: 2443 | camelcase "^5.0.0" 2444 | decamelize "^1.2.0" 2445 | 2446 | yargs-unparser@1.5.0: 2447 | version "1.5.0" 2448 | resolved "https://registry.yarnpkg.com/yargs-unparser/-/yargs-unparser-1.5.0.tgz#f2bb2a7e83cbc87bb95c8e572828a06c9add6e0d" 2449 | integrity sha512-HK25qidFTCVuj/D1VfNiEndpLIeJN78aqgR23nL3y4N0U/91cOAzqfHlF8n2BvoNDcZmJKin3ddNSvOxSr8flw== 2450 | dependencies: 2451 | flat "^4.1.0" 2452 | lodash "^4.17.11" 2453 | yargs "^12.0.5" 2454 | 2455 | yargs@13.2.2: 2456 | version "13.2.2" 2457 | resolved "https://registry.yarnpkg.com/yargs/-/yargs-13.2.2.tgz#0c101f580ae95cea7f39d927e7770e3fdc97f993" 2458 | integrity sha512-WyEoxgyTD3w5XRpAQNYUB9ycVH/PQrToaTXdYXRdOXvEy1l19br+VJsc0vcO8PTGg5ro/l/GY7F/JMEBmI0BxA== 2459 | dependencies: 2460 | cliui "^4.0.0" 2461 | find-up "^3.0.0" 2462 | get-caller-file "^2.0.1" 2463 | os-locale "^3.1.0" 2464 | require-directory "^2.1.1" 2465 | require-main-filename "^2.0.0" 2466 | set-blocking "^2.0.0" 2467 | string-width "^3.0.0" 2468 | which-module "^2.0.0" 2469 | y18n "^4.0.0" 2470 | yargs-parser "^13.0.0" 2471 | 2472 | yargs@^12.0.5: 2473 | version "12.0.5" 2474 | resolved "https://registry.yarnpkg.com/yargs/-/yargs-12.0.5.tgz#05f5997b609647b64f66b81e3b4b10a368e7ad13" 2475 | integrity sha512-Lhz8TLaYnxq/2ObqHDql8dX8CJi97oHxrjUcYtzKbbykPtVW9WB+poxI+NM2UIzsMgNCZTIf0AQwsjK5yMAqZw== 2476 | dependencies: 2477 | cliui "^4.0.0" 2478 | decamelize "^1.2.0" 2479 | find-up "^3.0.0" 2480 | get-caller-file "^1.0.1" 2481 | os-locale "^3.0.0" 2482 | require-directory "^2.1.1" 2483 | require-main-filename "^1.0.1" 2484 | set-blocking "^2.0.0" 2485 | string-width "^2.0.0" 2486 | which-module "^2.0.0" 2487 | y18n "^3.2.1 || ^4.0.0" 2488 | yargs-parser "^11.1.1" 2489 | 2490 | yn@^3.0.0: 2491 | version "3.1.0" 2492 | resolved "https://registry.yarnpkg.com/yn/-/yn-3.1.0.tgz#fcbe2db63610361afcc5eb9e0ac91e976d046114" 2493 | integrity sha512-kKfnnYkbTfrAdd0xICNFw7Atm8nKpLcLv9AZGEt+kczL/WQVai4e2V6ZN8U/O+iI6WrNuJjNNOyu4zfhl9D3Hg== 2494 | 2495 | yup@^0.26.10: 2496 | version "0.26.10" 2497 | resolved "https://registry.yarnpkg.com/yup/-/yup-0.26.10.tgz#3545839663289038faf25facfc07e11fd67c0cb1" 2498 | integrity sha512-keuNEbNSnsOTOuGCt3UJW69jDE3O4P+UHAakO7vSeFMnjaitcmlbij/a3oNb9g1Y1KvSKH/7O1R2PQ4m4TRylw== 2499 | dependencies: 2500 | "@babel/runtime" "7.0.0" 2501 | fn-name "~2.0.1" 2502 | lodash "^4.17.10" 2503 | property-expr "^1.5.0" 2504 | synchronous-promise "^2.0.5" 2505 | toposort "^2.0.2" 2506 | --------------------------------------------------------------------------------