├── .editorconfig ├── .gitignore ├── .tool-versions ├── README.md ├── index.d.ts ├── index.js ├── index.ts ├── nest-cli.json ├── package.json ├── src ├── .prettierrc ├── authn │ ├── authn-disallowed.decorator.ts │ ├── authn-optional.decorator.ts │ ├── authn-required.decorator.ts │ ├── authn-skip.decorator.ts │ ├── authn-status.enum.ts │ └── options.ts ├── authz │ ├── decorators.ts │ ├── options.ts │ └── rights-tree.ts ├── helper-types.ts ├── http-authx.interceptor.ts ├── identity.decorator.ts ├── index.ts ├── metadata-keys.ts ├── metadata.ts ├── types.ts └── util.ts ├── tsconfig.json ├── tslint.json └── yarn.lock /.editorconfig: -------------------------------------------------------------------------------- 1 | root = true 2 | 3 | [.editorconfig] 4 | insert_final_newline = true 5 | 6 | [{*.ts,*.js,*.json,*.yml,*.yaml,*.toml,*.md}] 7 | indent_size = 2 8 | indent_style = space 9 | insert_final_newline = true 10 | trim_trailing_whitespace = true 11 | tab_width = 2 12 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | dist/ 2 | node_modules 3 | 4 | ~* 5 | *~ 6 | 7 | yarn-error.log 8 | -------------------------------------------------------------------------------- /.tool-versions: -------------------------------------------------------------------------------- 1 | nodejs 12.6.0 2 | yarn 1.19.1 3 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # `@eropple/nestjs-auth` # 2 | [![npm version](https://badge.fury.io/js/%40eropple%2Fnestjs-auth.svg)](https://badge.fury.io/js/%40eropple%2Fnestjs-auth) 3 | 4 | ## Current Status ## 5 | `0.5.x` is being used, in anger, on multiple production apps, at my current 6 | employer and by other NestJS users. 7 | 8 | ### Recent Changes ### 9 | #### 0.5.2 #### 10 | - Bug fix: not awaiting the `context` at the root of the authz tree. I will 11 | probably rethink the types expressing that API to make this easier to catch 12 | in the future; right now it's `any` and that is a smell. 13 | - Bug fix: when using multiple scopes on the same endpoint, the testing of 14 | subsequent endpoints would result in re-setting `request.locals`. It no 15 | longer does this. 16 | 17 | #### 0.5.1 #### 18 | - `@AuthzScope()` is now stackable. If you use it multiple times on the same 19 | handler, the scopes checked will be the union of all of them. 20 | - `@AuthzAdoptScopeFrom()` added. It takes a controller and the name of a 21 | handler (which are typechecked, even though the syntax is a bit gross) and 22 | unions the scopes specified by that handler with any scopes specified for 23 | the current one. Thanks to Brian Kracoff @ Hydrow for the idea. 24 | - 0.5.1 fixes a failure-to-start bug in some NestJS environments. Pulled 0.5.0. 25 | 26 | #### 0.4.2 #### 27 | - Added `@AuthnSkip` decorator. This completely omits the endpoint from any 28 | checking, _including_ any context functions that may attach data to your 29 | `req.locals` instance. Thanks to Brian Kracoff @ Hydrow for the contribution. 30 | 31 | #### 0.4.0 #### 32 | - Added `unauthorizedResponse` and `forbiddenResponse` to the interceptor's 33 | options. These allow you to customize the output of 401s and 403s emitted by 34 | `@eropple/nestjs-auth` such that they can be predictable shapes in your 35 | codebase. This feature is designed to be used with 36 | [@eropple/nestjs-openapi3](https://github.com/eropple/nestjs-openapi3) so that 37 | you can easily provide a typed schema for your errors, but the world is your 38 | oyster! 39 | - Minor doc improvements. 40 | 41 | #### 0.3.0 / 0.3.1 (bug fix) #### 42 | - `nestjs-auth` now expects template arguments around principals and (optionally) 43 | credentials. Take a look at [the example](https://github.com/eropple/nestjs-auth-example) 44 | for details. 45 | - Replaced `HttpAuthnInterceptor` and `HttpAuthzInterceptor` with a single 46 | interceptor, `HttpAuthxInterceptor`. This is because NestJS offers no explicit 47 | way to guarantee that two request-scoped interceptors will run in the correct 48 | order. Order-of-declaration works but I don't consider it sufficiently reliable 49 | and it's easy enough to pass an `always` right as part of the tree if you wish 50 | to opt out of authz. 51 | 52 | #### 0.2.2 #### 53 | - Continued extending type system, this time on the authn side, to reduce the 54 | number of places where programmers have to trust their feeble brainmeats to do 55 | the right thing. 56 | 57 | #### 0.2.1 #### 58 | - Added generic types (with concrete default parameters) to ease type safety 59 | concerns when writing things like rights trees. In 0.3.0, the top-level 60 | generic parameters (things like `HttpAuthnInterceptor`) will lose their 61 | default values (where they currently map directly to `IdentifiedBill`), to 62 | encourage consumers to define their own top-level types and use them in their 63 | applications. 64 | 65 | ## Introduction ## 66 | 67 | Authentication and authorization on the web sucks. 68 | 69 | There, I said it. 70 | 71 | I don't mean the initial login process, though that kinda stinks too--we've got 72 | the awesome Passport library to help us out there, though, and it really isn't 73 | _that_ hard to write even OIDC or SAML correctly by hand. What sucks is 74 | everything past that point. There are some interesting tools out there like 75 | [Open Policy Agent](https://www.openpolicyagent.org) that are great if you want 76 | to wrangle a microserviceful universe--but most applications don't need 77 | microservices, most applications don't need to add a step to either their dev 78 | setup or their prod environment to go configure a spooky-action-at-a-distance 79 | service wedged into their environment--and most _developers_ need something that 80 | gets out of the way so they can concentrate on building _the thing they actually 81 | want to build_. 82 | 83 | In my NestJS travels, I haven't found something that hits the important bits: 84 | 85 | - **Do the simplest thing that can possibly work.** NestJS encourages some stuff 86 | that I have a pretty big problem with; in particular, the way the NestJS docs 87 | lead users by the hand down towards JWT--which is a minefield full of rabid 88 | alligators wielding rakes for you to step on, don't use JWT unless you know 89 | exactly why you need JWT and even then use something better, like 90 | [PASETO](https://paseto.io/), intead--makes me uncomfortable. 91 | - **Fall into correctness.** It should be hard to do the wrong thing. By opting 92 | into `@eropple/nestjs-auth`, you should have a secure-by-default auth scheme 93 | and you should have to _explicitly_ opt out, whether to a less secure mode for 94 | a particular handler or to a completely unsecured mode. (This is the same 95 | principle behind 96 | `[@eropple/nestjs-data-sec](https://github.com/eropple/nestjs-data-sec)`, for 97 | what it's worth.) 98 | - **Support resource-based access control.** This is a big one to me. So many 99 | libraries out there want to give you simple role-based access control, and for 100 | a lot of stuff that's fine, but if you're building anything with any kind of 101 | multi-tenancy that's just not going to fly. And a lot of the solutions that 102 | _do_ support resource-based access control come packed with some heavy policy 103 | tooling that requires mapping from the application's domain modeling to that 104 | policy language. (If you want a policy language, I won't judge. But you should 105 | make that decision yourself and not have it pushed onto you by the thing that 106 | handles serving 401s and 403s.) 107 | 108 | This is my take on attacking the problem. Not "once and for all," but maybe 109 | "once more for the time I'm using NestJS". 110 | 111 | **One important note:** this package is only tested to work with Express. 112 | Fastify support is out of my personal scope for it; if you'd like it, I am happy 113 | to accept PRs. 114 | 115 | ## Installation ## 116 | It's an NPM package. It's called `@eropple/nestjs-auth`. Wield your package 117 | manager of choice and install it. 118 | 119 | Just remember that you gotta have NestJS 6.5 or newer to make this work. 120 | 121 | ## Usage ## 122 | **Before you read all this:** code can speak for itself. Please consider 123 | checking out 124 | [@eropple/nestjs-auth-example](https://github.com/eropple/nestjs-auth-example); 125 | it is _exhaustively_ commented and has end-to-end tests that demonstrate 126 | `@eropple/nestjs-auth`'s completeness. 127 | 128 | `@eropple/nestjs-auth` provides the building blocks, but because of its focus on 129 | extensibility--not prescribing to you how your domain objects should work--I'm 130 | afraid you're going to have to do the wire-up yourself. Don't worry: it's easy, 131 | and if it shows you some stuff you're unfamiliar with you're going to benefit 132 | from learning how it works for your own code. 133 | 134 | (As an aside: I've been asked why this is an interceptor rather than a guard. 135 | That's because NestJS puts guards before interceptors, and if this was written 136 | as a guard it'd mean that you couldn't put a logging interceptor around requests 137 | that are rejected. It's harder to debug and harder to reason about.) 138 | 139 | ### How It Works ### 140 | There's perilously little magic in `@eropple/nestjs-auth`. It provides one 141 | interceptor, `HttpAuthxInterceptor`, which needs to be attached to a module for 142 | injection (we'll cover that later). These interceptors use their startup config 143 | and a set of decorators applied to handler methods to determine who's allowed to 144 | access what. 145 | 146 | **NOTE:** Version 0.2.x used two interceptors. This proved to be not-that-great 147 | if you wanted to use a request-scoped `nestjs-auth` (for example, you use 148 | request-scoped services in your rights tree), because even after the NestJS 6.5 149 | fixes that allow you to properly do request-scoped interceptors the ordering of 150 | them is undefined. In practice, they load in the order they're declared, but I 151 | don't really want to rely on that and I don't think you should either, so 0.3.0 152 | collapses them into a single interceptor. 153 | 154 | #### Authentication ### 155 | - The _authn step_ retrieves an identity (PASETO token, session token string, 156 | etc.) through a user-defined function. This identity is stashed on the request 157 | object, turning it from an Express `Request` (from the NodeJS `http` package) 158 | into an `IdentifiedExpressRequest`, which we define as adding the `identity` 159 | property. This property is an `IdentityBill`, which contains a _principal_ 160 | ("who is this?"), a _credential_ ("what says that they're them?"), and a set 161 | of _scopes_ that we'll use to authorize access to some resources. If the user 162 | function determines that the identity is invalid--it's been revoked or has 163 | expired over time, for example--then that function can return `false`, and the 164 | requestor will immediately receive 401 Unauthorized. 165 | - The _authz step_ checks that identity. If no identity was found, it attaches 166 | to the request an _anonymous identity_, which can be given a set of scopes of 167 | its own. 168 | - `HttpAuthnInterceptor` inspects the controller and its handler. By default, 169 | _all endpoints_ require authentication, but you can decorate your handlers 170 | with `@AuthnOptional()` to allow anonymous identities, with 171 | `@AuthnDisallowed()` to _require_ them or with `@AuthnSkip()` to skip the checks entirely. 172 | If the handler's requirement matches up with the identity on the request, 173 | the request continues; otherwise, the response is a 401 Unauthorized. 174 | 175 | || @AuthnRequired | @AuthnOptional | @AuthnDisallowed | @AuthnSkip | 176 | |-|-|-|-|-| 177 | | Good Auth |✅|✅|❌|✅| 178 | | Bad Auth |❌|❌|❌|✅| 179 | | No Auth |❌|✅|✅|✅| 180 | 181 | 182 | #### Authorization #### 183 | `@eropple/nestjs-auth` relies on three concepts for authorization: _scopes_, 184 | _grants_, and _rights_. 185 | 186 | ##### Scopes ##### 187 | Zero or more _scopes_ are attached to every handler method by using the 188 | `@AuthzScope()` decorator. An identity that has both a _grant_ and a _right_ to 189 | that scope is authorized to access the handler's endpoint. A list of example 190 | scopes can be found below. 191 | 192 | A method with zero scopes attached to it will always be allowed so long as the 193 | identity authenticates correctly. 194 | 195 | A method with no scope decorator attached to it will, once it hits the 196 | `HttpAuthzInterceptor`, throw a 500 Internal Server Error. 197 | 198 | ##### Grants ##### 199 | Scopes provided to an identity are called _grants_. If a handler uses a scope 200 | that is included in the identity's grants, then the identity is authorized to 201 | use that handler. Since we use 202 | `[nanomatch](https://www.npmjs.com/package/nanomatch)`, you can use both `*` and 203 | `**` 204 | (_[globstars](https://www.linuxjournal.com/content/globstar-new-bash-globbing-option)_) 205 | in your identity's grants to expand the matches allowed. 206 | 207 | ##### Examples of Scopes and Grants ##### 208 | Here are some examples of hypothetical scopes and grants, based on different 209 | resources: 210 | 211 | - `user/view` - Allows viewing--for example, viewing private information such as 212 | email address--of the singleton resource `user`, implied to be "the current 213 | user". 214 | - `user/edit` - Allows editing the singleton resource `user`, such as editing 215 | the user's profile. 216 | - `user/session/list` - Allows listing all sub-resource `session`s within the 217 | singleton resource `user`. (If you made this `user/session` and implied the 218 | `/list` part, you'd have surprising behavior with the next one.) 219 | - `user/*` (grant, not scope) - Allows any action on the singleton resource 220 | `user`. Implies both `user/view` and `user/edit`, but would not imply 221 | `user/session/list` (it would imply `user/session`, but as we just discussed 222 | that's not a valid scope.) 223 | - `user/**/*` (grant, not scope) - Allows any action on `user` or subresource. 224 | - `file/create` - Allows the creation of a new `file` resource (POST). 225 | Presumably, the response will include the ID of that file. 226 | - `file/12345/view` - Allows viewing the `file` resource with id `12345`. 227 | - `file/*/view` (grant, not scope) - Allows viewing of any `file` resource, but 228 | does not allow `file/create`. 229 | - `**/*` (grant, not scope) - Superuser glob; allows any access to any resource. 230 | A login scope, where you're logging in directly, will typically have this 231 | permission unless you're implementing a GitHub-style "sudo pattern". 232 | 233 | ##### Rights ##### 234 | While _grants_ are provided by (or perhaps "on behalf of") the user, _rights_ 235 | determine what the user is actually allowed to access on a system level. For 236 | example, a user might give an API token the scope `file/12345/view`--but that 237 | doesn't mean that the user is _allowed_ to view file `12345`. 238 | 239 | To that end, you must pass into `HttpAuthzInterceptor` what we refer to as the 240 | **rights tree**. This is an object tree; children map to values in the 241 | `children` If a scope is valid, its corresponding node in the rights tree will 242 | have a `right` function that returns `boolean | Promise` so that you 243 | can check your source of truth to ensure that the identity actually _does_ have 244 | the right to access the OAuth2 scope that you've granted. 245 | 246 | Once we've gotten to the authz step, you can take as guaranteed that we have 247 | added a `locals` field to the request. As such, each node may have a `context` 248 | method that can test against the current request, potentially to short-circuit 249 | and return 403 early but also to potentially store request-local data for other 250 | uses.. For example, if a path segment is a wildcard that represents a file ID 251 | and the file ID doesn't exist, the `context` method can return a falsy value to 252 | tell the requestor that they are unauthorized; if it does exist, the `context` 253 | method can attach the file entity to `request.locals` (which can then be used by 254 | deeper parts of the rights tree or be used for parameter injection in your 255 | handlers). `context` methods never _positively_ affirm a right, however; only a 256 | `right` method can do that. 257 | 258 | The above example of a nonexistent file is a good time to note that neither 259 | `context` nor `right` methods _do not_ handle exceptions; throwing an 260 | `HttpException` will cause the response to be a 500 Internal Server Error. This 261 | is a conscious decision--it might be tempting to say that we should return a 404 262 | here, but returning a 404 here allows a potential attacker to identify when a 263 | resource exists even if they don't have access to it. So we don't make that an 264 | option. 265 | 266 | You can see an example of a rights tree in **Module Injection**, below. 267 | 268 | ### Module Injection ### 269 | Your application's module, which we'll call `MyAuthModule` for the rest of this 270 | README, will need to tell NestJS how to build a `HttpAuthxInterceptor`. We do 271 | this with a [factory 272 | provider](https://docs.nestjs.com/fundamentals/custom-providers#use-factory); 273 | you can see how to do this in [the example project's module 274 | injection](https://github.com/eropple/nestjs-auth-example/tree/master/src/authx). 275 | 276 | _One helpful note:_ you might want to refer to NestJS's documentation on 277 | [circular 278 | dependencies](https://docs.nestjs.com/fundamentals/circular-dependency) when 279 | writing this; forward references are a little tricky. 280 | 281 | ### Setting Up ### 282 | Once you've got your module wired up, you need to attach the authentication and 283 | the authorization interceptors to your application. There are two ways to do 284 | this; one is way better than the other. 285 | 286 | #### The Good, Happy Path That Leads To Success #### 287 | It's a little long to put here. Please take a look at [the example project](https://github.com/eropple/nestjs-auth-example/tree/master/src/authx). 288 | 289 | I'm of two minds about global interceptors and guards. You have to replicate 290 | them in testing situations (please remember to add this to your E2E tests, too!) 291 | and that can lead to some confusion. On the other hand, this is the _only_ way 292 | to assert "everything is authenticated and authorized by default". 293 | 294 | ## Future Work ## 295 | - socket.io authorization/authentication 296 | - tests - the tests for this exist in the original app it was extracted from, 297 | they need to be cleaned up and made available here. 298 | -------------------------------------------------------------------------------- /index.d.ts: -------------------------------------------------------------------------------- 1 | export * from './dist'; 2 | -------------------------------------------------------------------------------- /index.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | function __export(m) { 3 | for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p]; 4 | } 5 | exports.__esModule = true; 6 | __export(require("./dist")); 7 | -------------------------------------------------------------------------------- /index.ts: -------------------------------------------------------------------------------- 1 | export * from './dist'; 2 | -------------------------------------------------------------------------------- /nest-cli.json: -------------------------------------------------------------------------------- 1 | { 2 | "language": "ts", 3 | "collection": "@nestjs/schematics", 4 | "sourceRoot": "src" 5 | } 6 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "@eropple/nestjs-auth", 3 | "version": "0.5.2", 4 | "description": "Comprehensive handling of authentication and authorization for NestJS.", 5 | "main": "dist", 6 | "author": "Ed Ropple", 7 | "license": "MIT", 8 | "repository": { 9 | "type": "git", 10 | "url": "https://github.com/eropple/nestjs-auth" 11 | }, 12 | "private": false, 13 | "scripts": { 14 | "format": "prettier --write \"src/**/*.ts\"", 15 | "lint": "tslint -p .", 16 | "build": "tsc", 17 | "watch": "yarn build -s --watch", 18 | "prepare": "yarn lint && yarn build" 19 | }, 20 | "peerDependencies": { 21 | "@nestjs/common": ">=6.5.0", 22 | "@nestjs/core": ">=6.5.0", 23 | "rxjs": ">=6.4.0" 24 | }, 25 | "devDependencies": { 26 | "@nestjs/common": "^6.5.0", 27 | "@nestjs/core": "^6.5.0", 28 | "@nestjs/schematics": "^6.3.0", 29 | "@nestjs/swagger": ">=3.0.2", 30 | "@types/cookie": "^0.3.2", 31 | "@types/express": "^4.16.1", 32 | "@types/jest": "^24.0.13", 33 | "@types/lodash": "4.14.145", 34 | "prettier": "^1.18.2", 35 | "rxjs": ">=6.4.0", 36 | "ts-jest": "^24.0.2", 37 | "tslint": "5.20.1", 38 | "typescript": "^3.2.4" 39 | }, 40 | "dependencies": { 41 | "@types/bunyan": "^1.8.6", 42 | "@types/bunyan-blackhole": "^0.2.2", 43 | "bunyan": "^1.8.12", 44 | "bunyan-blackhole": "^1.1.1", 45 | "cookie": "^0.4.0", 46 | "lodash": "4.17.15", 47 | "nanomatch": "^1.2.13", 48 | "reflect-metadata": "^0.1.13", 49 | "utility-types": "^3.7.0" 50 | } 51 | } 52 | -------------------------------------------------------------------------------- /src/.prettierrc: -------------------------------------------------------------------------------- 1 | { 2 | "singleQuote": true, 3 | "trailingComma": "all" 4 | } -------------------------------------------------------------------------------- /src/authn/authn-disallowed.decorator.ts: -------------------------------------------------------------------------------- 1 | import { SetMetadata } from '@nestjs/common'; 2 | 3 | import { AUTHN_STATUS } from '../metadata-keys'; 4 | import { AuthnStatus } from './authn-status.enum'; 5 | 6 | export const AuthnDisallowed = () => 7 | SetMetadata(AUTHN_STATUS, AuthnStatus.DISALLOWED); 8 | -------------------------------------------------------------------------------- /src/authn/authn-optional.decorator.ts: -------------------------------------------------------------------------------- 1 | import { SetMetadata } from '@nestjs/common'; 2 | 3 | import { AUTHN_STATUS } from '../metadata-keys'; 4 | import { AuthnStatus } from './authn-status.enum'; 5 | 6 | /** 7 | * Handlers decorated with `AuthnOptional` may or may not have a full identity 8 | * passed to their `@Identity` parameter. If the user _is_ logged in, then the 9 | * handler receives a full identity: principal, credential, and scopes. If the 10 | * user is not logged in, then the handler receives an _anonymous_ identity. 11 | * The principal and credential are undefined; the scopes are whatever you've 12 | * set as the application's anonymous scopes. 13 | * 14 | * This differs from `AuthSkip` in that if you send _bad_ auth, 15 | * `AuthOptional` will fail and `AuthnSkip` will succeed 16 | * 17 | * Formally, the @Identity parameter should take as a type something that looks 18 | * like `IdentityBill | AnonymousBill`. 19 | */ 20 | export const AuthnOptional = () => 21 | SetMetadata(AUTHN_STATUS, AuthnStatus.OPTIONAL); 22 | -------------------------------------------------------------------------------- /src/authn/authn-required.decorator.ts: -------------------------------------------------------------------------------- 1 | import { SetMetadata } from '@nestjs/common'; 2 | 3 | import { AUTHN_STATUS } from '../metadata-keys'; 4 | import { AuthnStatus } from './authn-status.enum'; 5 | 6 | /** 7 | * Please remember that, by default, `AuthnRequired` is not necessary. It is 8 | * implied on _all_ handlers. This just exists so that one can apply something 9 | * like `AuthnOptional` at the controller level but undo it at a lower level. 10 | * 11 | * You shouldn't do this regularly, but sometimes it makes your code easier to 12 | * read. 13 | */ 14 | export const AuthnRequired = () => 15 | SetMetadata(AUTHN_STATUS, AuthnStatus.REQUIRED); 16 | -------------------------------------------------------------------------------- /src/authn/authn-skip.decorator.ts: -------------------------------------------------------------------------------- 1 | import { SetMetadata } from '@nestjs/common'; 2 | 3 | import { AUTHN_STATUS } from '../metadata-keys'; 4 | import { AuthnStatus } from './authn-status.enum'; 5 | 6 | /** 7 | * Handlers decorated with `AuthnSkip` completely skip Authn entirely 8 | * This is used for things that don't need any authentication checks at all 9 | * 10 | * This differs from `AuthOptional` in that if you send _bad_ auth, 11 | * `AuthOptional` will fail and `AuthnSkip` will succeed 12 | * 13 | * Note that contexts are not loaded since we short-circuit, so youyou have to 14 | * load all contexts manually in the Controller 15 | */ 16 | export const AuthnSkip = () => 17 | SetMetadata(AUTHN_STATUS, AuthnStatus.SKIP); 18 | -------------------------------------------------------------------------------- /src/authn/authn-status.enum.ts: -------------------------------------------------------------------------------- 1 | export enum AuthnStatus { 2 | REQUIRED = 'required', 3 | OPTIONAL = 'optional', 4 | DISALLOWED = 'disallowed', 5 | SKIP = 'skip', 6 | } 7 | -------------------------------------------------------------------------------- /src/authn/options.ts: -------------------------------------------------------------------------------- 1 | import * as Bunyan from 'bunyan'; 2 | import { Request as ExpressRequest } from 'express'; 3 | 4 | import { IdentifiedBillBase } from '../types'; 5 | import { StringTo } from '../helper-types'; 6 | 7 | export type PrincipalFnRet = 8 | | TIdentifiedBill 9 | | null 10 | | false; 11 | 12 | export type PrincipalFn = ( 13 | headers: StringTo | undefined>, 14 | cookies: StringTo, 15 | request: ExpressRequest, 16 | ) => PrincipalFnRet | Promise>; 17 | 18 | export interface HttpAuthnOptions { 19 | /** 20 | * The function that `nestjs-auth` should use to determine a principal from 21 | * a request. This might be a session token lookup, decoding a JWT (but please 22 | * consider PASETO instead!), or some other method of extracting an identity 23 | * from the request. 24 | * 25 | * The return values may be any of the following (or a `Promise` of the same): 26 | * 27 | * - An `IdentityBill` containing a principal that your application can 28 | * understand, a reference to your credentials, and a set of authorization 29 | * scopes. If your application doesn't yet use scopes, you should return 30 | * `[**\/*]` as your scope set. (For details as to why, check the readme.) 31 | * - `null` if the request has no login. When you use handlers that are 32 | * decorated with `@AuthnOptional()`, the request will be provided the 33 | * scopes that you provide in `anonymousScopes`. 34 | * - `false` if the request should be rejected immediately. This should be 35 | * reserved for when you have determined that a set of credentials is 36 | * _invalid_ (as opposed to _nonexistent_), such as when a user attempts 37 | * to use an expired session token. 38 | */ 39 | principalFn: PrincipalFn; 40 | 41 | /** 42 | * The set of scopes to grant to an anonymous identity. 43 | */ 44 | anonymousScopes: ReadonlyArray; 45 | 46 | /** 47 | * An optional logger that will provide detailed introspection into the 48 | * behavior of the interceptor. 49 | */ 50 | logger?: Bunyan; 51 | } 52 | -------------------------------------------------------------------------------- /src/authz/decorators.ts: -------------------------------------------------------------------------------- 1 | import { AUTHZ_SCOPES } from '../metadata-keys'; 2 | import { IdentifiedExpressRequest } from '../helper-types'; 3 | import { IdentityBill, AnyCtor } from '../types'; 4 | import { AppendArrayMetadata, getAllMetadata, getAllPropertyMetadata } from '../metadata'; 5 | 6 | export type AuthzScopeArgFn = ( 7 | req: IdentifiedExpressRequest, 8 | ) => Array | string; 9 | export type AuthzScopeArg = 10 | | AuthzScopeArgFn 11 | | string; 12 | 13 | /** 14 | * Defines a scope (think OAuth2 scope) that `HttpAuthzInterceptor` will 15 | * check against. If the scope depends on something in the request, such as 16 | * a URL parameter, you can pass a function that takes the `http` module's 17 | * `IncomingMessage` and returns either a scope or a list of scopes. 18 | * 19 | * If you return a list of scopes, they are _all required_ in order to allow 20 | * the requestor to access the resource. `@eropple/nestjs-auth` does not and 21 | * will not provide an "or" function here; that way lies madness. 22 | * 23 | * @param scope a scope, a list of scopes, or a function to return the same 24 | */ 25 | export function AuthzScope( 26 | scope: AuthzScopeArg | Array>, 27 | ) { 28 | return AppendArrayMetadata(AUTHZ_SCOPES, scope); 29 | } 30 | 31 | /** 32 | * Points at another HTTP handler, already decorated with `AuthzScope`, that 33 | * should be a reference for scopes for this endpoint. It is important to note 34 | * that these will be a union of any other scopes attached to this endpoint, 35 | * _not_ a subset/intersection/etcetera. It is used primarily to make sure that 36 | * controllers that are logical supersets of other controllers can adopt the 37 | * permission structure for the controllers that they otherwise encapsulate 38 | * (when doing complex operations, etc.). 39 | * 40 | * This decorator can be stacked, and multiple copies of it can be added to the 41 | * same handler. 42 | */ 43 | export function AuthzAdoptScopesFrom, TIdentity extends IdentityBill = IdentityBill>( 44 | target: T, 45 | propertyKey: keyof T['prototype'], 46 | ): any { 47 | const allMetadata = getAllPropertyMetadata(target.prototype, String(propertyKey)); 48 | const adoptedScopes: Array> | undefined = allMetadata[AUTHZ_SCOPES]; 49 | 50 | if (!adoptedScopes) { 51 | throw new Error(`Attempted to adopt scopes from target '${target}', but none found: ${JSON.stringify(allMetadata)}.`); 52 | } 53 | 54 | return AppendArrayMetadata(AUTHZ_SCOPES, adoptedScopes); 55 | } 56 | -------------------------------------------------------------------------------- /src/authz/options.ts: -------------------------------------------------------------------------------- 1 | import { IdentityBill } from '../types'; 2 | import { RightsTree } from './rights-tree'; 3 | import { IdentifiedExpressRequest } from '../helper-types'; 4 | 5 | export interface HttpAuthzOptions { 6 | /** 7 | * The application's rights tree, used to determine whether a scope included 8 | * in an identity's grant is actually valid for that identity to grant in the 9 | * first place. 10 | */ 11 | tree: RightsTree>; 12 | } 13 | -------------------------------------------------------------------------------- /src/authz/rights-tree.ts: -------------------------------------------------------------------------------- 1 | import { IdentifiedExpressRequest } from '../helper-types'; 2 | import { IdentityBill } from '../types'; 3 | 4 | export interface RightsTree< 5 | TIdentity extends IdentityBill = IdentityBill, 6 | TRequest extends IdentifiedExpressRequest< 7 | TIdentity 8 | > = IdentifiedExpressRequest 9 | > { 10 | readonly context?: (scopePart: string, req: TRequest) => any | Promise; 11 | readonly right?: ( 12 | scopePart: string, 13 | req: TRequest, 14 | ) => boolean | Promise; 15 | readonly children?: { [name: string]: RightsTree }; 16 | readonly wildcard?: RightsTree; 17 | } 18 | -------------------------------------------------------------------------------- /src/helper-types.ts: -------------------------------------------------------------------------------- 1 | import { Request as ExpressRequest } from 'express'; 2 | 3 | import { IdentityBill } from './types'; 4 | 5 | // tslint:disable-next-line: interface-over-type-literal 6 | export type StringTo = { [key: string]: T }; 7 | // tslint:disable-next-line: interface-over-type-literal 8 | export type IdentityTag = { 9 | identity: TIdentity; 10 | }; 11 | 12 | export type ExpressRequestWithLocals = ExpressRequest & { 13 | locals: StringTo; 14 | }; 15 | export type IdentifiedExpressRequest< 16 | TIdentity extends IdentityBill = IdentityBill 17 | > = ExpressRequestWithLocals & IdentityTag; 18 | -------------------------------------------------------------------------------- /src/http-authx.interceptor.ts: -------------------------------------------------------------------------------- 1 | import * as Bunyan from 'bunyan'; 2 | import bunyanBlackHole from 'bunyan-blackhole'; 3 | import * as _ from 'lodash'; 4 | import { 5 | CallHandler, 6 | ExecutionContext, 7 | NestInterceptor, 8 | Type, 9 | } from '@nestjs/common'; 10 | import { ServerResponse } from 'http'; 11 | import { Observable } from 'rxjs'; 12 | import { parse as cookieParse } from 'cookie'; 13 | import { Request as ExpressRequest } from 'express'; 14 | 15 | import { 16 | IdentifiedBill, 17 | IdentityBill, 18 | AnonymousBill, 19 | IdentifiedBillBase, 20 | AnyCtor, 21 | } from './types'; 22 | import { StringTo, IdentifiedExpressRequest } from './helper-types'; 23 | import { AuthnStatus } from './authn/authn-status.enum'; 24 | import { AUTHN_STATUS, AUTHZ_SCOPES } from './metadata-keys'; 25 | import { observableResponse } from './util'; 26 | import { HttpAuthnOptions, PrincipalFnRet } from './authn/options'; 27 | import { HttpAuthzOptions } from './authz/options'; 28 | import { RightsTree } from './authz/rights-tree'; 29 | import { AuthzScopeArg, AuthzScopeArgFn } from './authz/decorators'; 30 | import { getAllPropertyMetadata } from './metadata'; 31 | 32 | // TODO: create a types library for nanomatch 33 | // tslint:disable-next-line: no-var-requires 34 | const nanomatch = require('nanomatch'); 35 | 36 | export interface HttpAuthxOptions< 37 | TIdentity extends IdentityBill, 38 | TIdentifiedBill extends IdentifiedBillBase 39 | > { 40 | /** 41 | * An optional logger that will provide detailed introspection into the 42 | * behavior of the interceptor. 43 | */ 44 | logger?: Bunyan; 45 | 46 | /** 47 | * Authentication-specific settings. 48 | */ 49 | authn: HttpAuthnOptions; 50 | /** 51 | * Authorization-specific settings. 52 | */ 53 | authz: HttpAuthzOptions; 54 | 55 | /** 56 | * Creator for the response body provided when a 403 Forbidden is being sent. 57 | * Useful for integrating with something like `@eropple/nestjs-openapi3` in 58 | * order to send back typed errors. 59 | */ 60 | forbiddenResponse?: ( 61 | request: ExpressRequest, 62 | response: ServerResponse, 63 | scopes: ReadonlyArray, 64 | ) => StringTo; 65 | 66 | /** 67 | * Creator for the response body provided when a 401 Unauthorized is being 68 | * sent. Useful for integrating with something like `@eropple/nestjs-openapi3` 69 | * in order to send back typed errors. 70 | */ 71 | unauthorizedResponse?: ( 72 | request: ExpressRequest, 73 | response: ServerResponse, 74 | ) => StringTo; 75 | } 76 | 77 | /** 78 | * The combined authentication layer of `@eropple/nestjs-auth`. 79 | * 80 | * For authentication (formerly `HttpAuthnInterceptor`), this takes a 81 | * user-defined function (see `HttpAuthnOptions`) and determines from it the 82 | * current state of the requestor's identity. It then uses the `@AuthnXXX()` 83 | * family of decorators (`@AuthnRequired()`, `@AuthnOptional()`, `@AuthnSkip()` and 84 | * `@AuthnDisallowed()`) to decide whether or not to return a 401 Unauthorized 85 | * to the requestor or to pass the request on down the chain. 86 | * 87 | * For authorization (formerly `HttpAuthzInterceptor`): nestjs-auth functionally 88 | * operates on the notion of scopes, as per OAuth2 (not that it's the _best_ way 89 | * to do this, but it's the most common way you see it in the wild). These 90 | * scopes are just a list of strings (there's an implicit "and" for these 91 | * scopes). 92 | * 93 | * **Something to pay attention to:** unlike some other implementations of 94 | * OAuth2 scopes, we use the forward slash character, `/`, as a separator to 95 | * indicate hierarchy. This is because we use file-style globbing to match the 96 | * handler's specified scopes against the grants in the identity. Check the 97 | * documentation for details. 98 | */ 99 | export class HttpAuthxInterceptor< 100 | TIdentityBill extends IdentityBill, 101 | TIdentifiedBill extends IdentifiedBillBase 102 | > implements NestInterceptor { 103 | private readonly logger: Bunyan; 104 | private readonly tree: RightsTree< 105 | TIdentityBill, 106 | IdentifiedExpressRequest 107 | >; 108 | 109 | constructor( 110 | private readonly options: HttpAuthxOptions, 111 | ) { 112 | this.logger = 113 | this.options.logger || bunyanBlackHole('HttpAuthxInterceptor'); 114 | this.tree = this.options.authz.tree; 115 | } 116 | 117 | //#region authn 118 | private _unauthorized( 119 | request: ExpressRequest, 120 | response: ServerResponse, 121 | ): Observable { 122 | const body = 123 | this.options.unauthorizedResponse 124 | ? this.options.unauthorizedResponse(request, response) 125 | : { error: 'Forbidden.' }; 126 | return observableResponse(response, body, 401); 127 | } 128 | 129 | private async _doAuthn( 130 | request: ExpressRequest, 131 | ): Promise> { 132 | const headers = request.headers; 133 | const cookies = cookieParse(headers.cookie || ''); 134 | 135 | return this.options.authn.principalFn(headers, cookies, request); 136 | } 137 | 138 | private _buildIdentity(authn: PrincipalFnRet) { 139 | if (authn instanceof IdentifiedBill) { 140 | // anonymous; create an anonymous identity bill 141 | return authn as TIdentifiedBill; 142 | } else { 143 | // identified; we already _have_ an identity bill returned to us 144 | return new AnonymousBill(this.options.authn.anonymousScopes); 145 | } 146 | } 147 | 148 | private _shortCircuitBadAuth( 149 | identity: IdentityBill, 150 | status: AuthnStatus, 151 | ): boolean { 152 | switch (status) { 153 | case AuthnStatus.REQUIRED: 154 | return identity.isIdentified; 155 | case AuthnStatus.DISALLOWED: 156 | return identity.isAnonymous; 157 | case AuthnStatus.OPTIONAL: 158 | return true; // doesn't matter 159 | case AuthnStatus.SKIP: 160 | return true; // doesn't matter 161 | default: 162 | throw new Error( 163 | `Bad AuthnStatus value (are you not in TypeScript?): ${status}`, 164 | ); 165 | } 166 | } 167 | //#endregion authn 168 | 169 | //#region authz 170 | private _forbidden( 171 | request: ExpressRequest, 172 | response: ServerResponse, 173 | scopes: ReadonlyArray, 174 | ): Observable { 175 | const body = 176 | this.options.forbiddenResponse 177 | ? this.options.forbiddenResponse(request, response, scopes) 178 | : { error: 'Forbidden.' }; 179 | return observableResponse(response, body, 403); 180 | } 181 | 182 | private _getScopes( 183 | request: IdentifiedExpressRequest, 184 | controller: AnyCtor, 185 | // we get this from NestJS/rxjs 186 | // tslint:disable-next-line: ban-types 187 | handler: Function, 188 | ): ReadonlyArray { 189 | const metadata = getAllPropertyMetadata(controller.prototype, handler.name); 190 | const scopesArgs: Array | undefined = metadata[AUTHZ_SCOPES]; 191 | 192 | if (!scopesArgs) { 193 | throw new Error( 194 | `Handler for request '${request.url}' does not have @AuthzScope().`, 195 | ); 196 | } 197 | 198 | const scopes: Array = _.flattenDeep(scopesArgs.map(scopesArg => { 199 | if (typeof scopesArg !== 'function') { 200 | return scopesArg; 201 | } else { 202 | return (scopesArg as AuthzScopeArgFn)(request); 203 | } 204 | })); 205 | 206 | return _.uniq(scopes); 207 | } 208 | 209 | private _validateScopesAgainstGrants( 210 | scopes: ReadonlyArray, 211 | grants: ReadonlyArray, 212 | ): boolean { 213 | const matches = nanomatch(scopes, grants); 214 | return matches.length === scopes.length; 215 | } 216 | 217 | private async _validateScopeAgainstRights( 218 | request: IdentifiedExpressRequest, 219 | scope: string, 220 | ): Promise { 221 | const scopeParts = scope.split('/'); 222 | const nodeName = '[ROOT]'; 223 | let node: RightsTree< 224 | TIdentityBill, 225 | IdentifiedExpressRequest 226 | > = this.tree; 227 | request.locals = request.locals || {}; 228 | 229 | if (this.tree.context) { 230 | this.logger.trace('Running root node\'s context.'); 231 | await this.tree.context('[ROOT]', request); 232 | } 233 | 234 | for (const scopePart of scopeParts) { 235 | this.logger.debug(`Testing node '${scopePart}'.`); 236 | let nextNode: 237 | | RightsTree> 238 | | undefined; 239 | 240 | if (node.children) { 241 | nextNode = node.children[scopePart]; 242 | } 243 | nextNode = nextNode || node.wildcard; 244 | 245 | if (!nextNode) { 246 | throw new Error( 247 | `When testing scope '${scope}', could not find scope part '${scopePart}' in rights tree. No wildcard exists, so we are failing.`, 248 | ); 249 | } 250 | 251 | if (nextNode.context) { 252 | this.logger.debug('Has context; evaluating.'); 253 | const contextRet = await nextNode.context(scopePart, request); 254 | if (contextRet === false) { 255 | this.logger.debug('Context returned false, failing on scope.'); 256 | return false; 257 | } 258 | } 259 | 260 | node = nextNode; 261 | } 262 | 263 | if (!node!.right) { 264 | throw new Error( 265 | `Scope '${scope}' is using node '${nodeName}' as a terminal node, but it has no rights function.`, 266 | ); 267 | } 268 | 269 | return await node!.right(scopeParts[scopeParts.length - 1], request); 270 | } 271 | 272 | private async _validateScopesAgainstRights( 273 | request: IdentifiedExpressRequest, 274 | scopes: ReadonlyArray, 275 | ): Promise { 276 | const rets = await Promise.all( 277 | scopes.map(s => this._validateScopeAgainstRights(request, s)), 278 | ); 279 | 280 | return rets.every(ret => ret); 281 | } 282 | //#endregion authz 283 | 284 | async intercept( 285 | context: ExecutionContext, 286 | next: CallHandler, 287 | ): Promise> { 288 | const request: IdentifiedExpressRequest< 289 | TIdentityBill 290 | > = context.switchToHttp().getRequest(); 291 | const response: ServerResponse = context.switchToHttp().getResponse(); 292 | const controller = context.getClass(); 293 | const handler = context.getHandler(); 294 | const status: AuthnStatus = 295 | Reflect.getMetadata(AUTHN_STATUS, handler) || 296 | Reflect.getMetadata(AUTHN_STATUS, controller) || 297 | AuthnStatus.REQUIRED; 298 | 299 | if (status === AuthnStatus.SKIP) { 300 | // Skip auth checks entirely 301 | return next.handle(); 302 | } 303 | 304 | // BEGINNING AUTHN STEP 305 | const authn = await this._doAuthn(request); 306 | 307 | // we should reject the request's credentials as invalid 308 | if (authn === false) { 309 | return this._unauthorized(request, response); 310 | } else { 311 | // we have a _potentially_ valid request; is it anonymous or identified? 312 | // (this confuses the typechecker but it is correct in practice) 313 | (request.identity as any) = this._buildIdentity(authn); 314 | 315 | if (!this._shortCircuitBadAuth(request.identity, status)) { 316 | return this._unauthorized(request, response); 317 | } 318 | } 319 | 320 | // AUTHN COMPLETED, BEGINNING AUTHZ STEP 321 | const scopes = this._getScopes(request, controller, handler); 322 | const grants = request.identity.grants; 323 | 324 | const scopesAgainstGrants = this._validateScopesAgainstGrants( 325 | scopes, 326 | grants, 327 | ); 328 | if (!scopesAgainstGrants) { 329 | this.logger.debug({ scopes, grants }, 'Request failed to validate scopes against grants.'); 330 | return this._forbidden(request, response, scopes); 331 | } 332 | 333 | const scopesAgainstRights = await this._validateScopesAgainstRights( 334 | request, 335 | scopes, 336 | ); 337 | if (!scopesAgainstRights) { 338 | this.logger.debug({ scopes, grants }, 'Request failed to validate scopes against rights.'); 339 | return this._forbidden(request, response, scopes); 340 | } 341 | 342 | // SUCCESSFULLY COMPLETED, LET'S DO AN APP THING 343 | return next.handle(); 344 | } 345 | } 346 | -------------------------------------------------------------------------------- /src/identity.decorator.ts: -------------------------------------------------------------------------------- 1 | import { createParamDecorator } from '@nestjs/common'; 2 | 3 | import { IdentifiedExpressRequest } from './helper-types'; 4 | 5 | // this is not type-safe and relies on the user specifying the correct value of 6 | // `TIdentity` in their parameter, so I see no reason to try to genericize this 7 | // decorator. 8 | export const Identity = createParamDecorator( 9 | (data, req: IdentifiedExpressRequest) => { 10 | if (!req.identity) { 11 | throw new Error( 12 | 'Attempted to fetch an @Identity from a handler not in the nestjs-auth flow.', 13 | ); 14 | } 15 | 16 | return req.identity; 17 | }, 18 | ); 19 | -------------------------------------------------------------------------------- /src/index.ts: -------------------------------------------------------------------------------- 1 | export * from './types'; 2 | export * from './helper-types'; 3 | export * from './identity.decorator'; 4 | 5 | export * from './authn/options'; 6 | export * from './authn/authn-disallowed.decorator'; 7 | export * from './authn/authn-optional.decorator'; 8 | export * from './authn/authn-required.decorator'; 9 | export * from './authn/authn-skip.decorator'; 10 | export * from './authn/authn-status.enum'; 11 | 12 | export * from './authz/options'; 13 | export * from './authz/decorators'; 14 | export * from './authz/rights-tree'; 15 | 16 | export * from './http-authx.interceptor'; 17 | 18 | export { StringTo } from './helper-types'; 19 | -------------------------------------------------------------------------------- /src/metadata-keys.ts: -------------------------------------------------------------------------------- 1 | export const AUTHN_STATUS = '@eropple/nestjs-auth:AuthnStatus'; 2 | export const AUTHZ_SCOPES = '@eropple/nestjs-auth:AuthzScope'; 3 | -------------------------------------------------------------------------------- /src/metadata.ts: -------------------------------------------------------------------------------- 1 | import * as _ from 'lodash'; 2 | 3 | export function getAllMetadata(o: any) { 4 | return _.fromPairs(Reflect.getMetadataKeys(o).map(k => [k, Reflect.getMetadata(k, o)])); 5 | } 6 | 7 | export function getAllPropertyMetadata(o: any, key: string | symbol) { 8 | return _.fromPairs(Reflect.getMetadataKeys(o, key).map(k => [k, Reflect.getMetadata(k, o, key)])); 9 | } 10 | 11 | export function doAppendArrayMetadata( 12 | metadataKey: string, 13 | metadataValue: V | Array, 14 | target: any, 15 | key?: string | symbol, 16 | ) { 17 | const current = 18 | (key 19 | ? Reflect.getMetadata(metadataKey, target, key) 20 | : Reflect.getMetadata(metadataKey, target) 21 | ) || []; 22 | const values = _.flattenDeep([ current, metadataValue ]); 23 | 24 | if (key) { 25 | Reflect.defineMetadata(metadataKey, values, target, key); 26 | } else { 27 | Reflect.defineMetadata(metadataKey, values, target); 28 | } 29 | 30 | if (process.env.NESTJS_AUTH_BUILD_TIME_DEBUG) { 31 | // tslint:disable-next-line: no-console 32 | console.log(target, key, 'before: ', current, 'after: ', values); 33 | } 34 | } 35 | 36 | export function AppendArrayMetadata( 37 | metadataKey: string, 38 | metadataValue: V | Array, 39 | ): MethodDecorator { 40 | return (target, propertyKey, descriptor) => { 41 | doAppendArrayMetadata(metadataKey, metadataValue, target, propertyKey); 42 | 43 | if (process.env.NESTJS_AUTH_BUILD_TIME_DEBUG) { 44 | // tslint:disable-next-line: no-console 45 | console.log(`${target} : ` + 46 | `${propertyKey && String(propertyKey)} @ ` + 47 | `${metadataKey}: ${Reflect.getMetadata(metadataKey, target, propertyKey)}`); 48 | } 49 | }; 50 | } 51 | -------------------------------------------------------------------------------- /src/types.ts: -------------------------------------------------------------------------------- 1 | // tslint:disable: max-classes-per-file 2 | export interface AnyCtor { 3 | new(...args: Array): T; 4 | prototype: {}; 5 | } 6 | 7 | export interface IdentityBill { 8 | grants: ReadonlyArray; 9 | 10 | isIdentified: boolean; 11 | isAnonymous: boolean; 12 | } 13 | 14 | export abstract class IdentifiedBillBase { 15 | constructor(readonly grants: ReadonlyArray) {} 16 | 17 | get isIdentified(): true { 18 | return true; 19 | } 20 | get isAnonymous(): false { 21 | return false; 22 | } 23 | } 24 | 25 | export class IdentifiedBill< 26 | TPrincipal, 27 | TCredential 28 | > extends IdentifiedBillBase { 29 | constructor( 30 | readonly principal: TPrincipal, 31 | readonly credential: TCredential, 32 | grants: ReadonlyArray, 33 | ) { 34 | super(grants); 35 | } 36 | } 37 | 38 | export class AnonymousBill implements IdentityBill { 39 | constructor(readonly grants: ReadonlyArray) {} 40 | 41 | get isIdentified(): false { 42 | return false; 43 | } 44 | get isAnonymous(): true { 45 | return true; 46 | } 47 | } 48 | -------------------------------------------------------------------------------- /src/util.ts: -------------------------------------------------------------------------------- 1 | import { ServerResponse } from 'http'; 2 | import { Observable } from 'rxjs'; 3 | 4 | import { StringTo } from './helper-types'; 5 | 6 | export function observableResponse( 7 | response: ServerResponse, 8 | msg: StringTo, 9 | code: number, 10 | ): Observable { 11 | response.statusCode = code; 12 | response.setHeader('content-type', 'application/json'); 13 | response.flushHeaders(); 14 | response.write(JSON.stringify(msg)); 15 | response.end(); 16 | 17 | return Observable.create(); 18 | } 19 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "module": "commonjs", 4 | "declaration": true, 5 | "removeComments": true, 6 | "esModuleInterop": true, 7 | "emitDecoratorMetadata": true, 8 | "experimentalDecorators": true, 9 | "target": "es6", 10 | "sourceMap": true, 11 | "strict": true, 12 | "preserveWatchOutput": true, 13 | "outDir": "./dist", 14 | "baseUrl": "./" 15 | }, 16 | "include": ["src/**/*.ts", "src/**/*.js"], 17 | "exclude": ["node_modules"] 18 | } 19 | -------------------------------------------------------------------------------- /tslint.json: -------------------------------------------------------------------------------- 1 | { 2 | "defaultSeverity": "error", 3 | "extends": ["tslint:recommended"], 4 | "jsRules": { 5 | "no-unused-expression": true 6 | }, 7 | "rules": { 8 | "quotemark": [true, "single"], 9 | "member-access": [false], 10 | "ordered-imports": [false], 11 | "max-line-length": [true, 150], 12 | "member-ordering": [false], 13 | "interface-name": [false], 14 | "arrow-parens": false, 15 | "no-floating-promises": true, 16 | "array-type": [true, "generic"], 17 | "object-literal-sort-keys": false 18 | }, 19 | "rulesDirectory": [] 20 | } 21 | -------------------------------------------------------------------------------- /yarn.lock: -------------------------------------------------------------------------------- 1 | # THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. 2 | # yarn lockfile v1 3 | 4 | 5 | "@angular-devkit/core@7.3.8": 6 | version "7.3.8" 7 | resolved "https://registry.yarnpkg.com/@angular-devkit/core/-/core-7.3.8.tgz#702b0944a69c71cce3a1492e0d62de18df22a993" 8 | integrity sha512-3X9uzaZXFpm5o2TSzhD6wEOtVU32CgeytKjD1Scxj+uMMVo48SWLlKiFh312T+smI9ko7tOT8VqxglwYkWosgg== 9 | dependencies: 10 | ajv "6.9.1" 11 | chokidar "2.0.4" 12 | fast-json-stable-stringify "2.0.0" 13 | rxjs "6.3.3" 14 | source-map "0.7.3" 15 | 16 | "@angular-devkit/schematics@7.3.8": 17 | version "7.3.8" 18 | resolved "https://registry.yarnpkg.com/@angular-devkit/schematics/-/schematics-7.3.8.tgz#70bfc7876f7924ff53ab9310a00b62f20acf2f5c" 19 | integrity sha512-mvaKoORZIaW/h0VNZ3IQWP0qThRCZRX6869FNlzV0jlW0mhn07XbiIGHCGGSCDRxS7qJ0VbuIVnKXntF+iDeWw== 20 | dependencies: 21 | "@angular-devkit/core" "7.3.8" 22 | rxjs "6.3.3" 23 | 24 | "@babel/code-frame@^7.0.0": 25 | version "7.0.0" 26 | resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.0.0.tgz#06e2ab19bdb535385559aabb5ba59729482800f8" 27 | integrity sha512-OfC2uemaknXr87bdLUkWog7nYuliM9Ij5HUcajsVcMCpQrcLmtxRbVFTIqmcSkSeYRBFBRxs2FiUqFJDLdiebA== 28 | dependencies: 29 | "@babel/highlight" "^7.0.0" 30 | 31 | "@babel/highlight@^7.0.0": 32 | version "7.5.0" 33 | resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.5.0.tgz#56d11312bd9248fa619591d02472be6e8cb32540" 34 | integrity sha512-7dV4eu9gBxoM0dAnj/BCFDW9LFU0zvTrkq0ugM7pnHEgguOEeOz1so2ZghEdzviYzQEED0r4EAgpsBChKy1TRQ== 35 | dependencies: 36 | chalk "^2.0.0" 37 | esutils "^2.0.2" 38 | js-tokens "^4.0.0" 39 | 40 | "@dsherret/to-absolute-glob@^2.0.2": 41 | version "2.0.2" 42 | resolved "https://registry.yarnpkg.com/@dsherret/to-absolute-glob/-/to-absolute-glob-2.0.2.tgz#1f6475dc8bd974cea07a2daf3864b317b1dd332c" 43 | integrity sha1-H2R13IvZdM6gei2vOGSzF7HdMyw= 44 | dependencies: 45 | is-absolute "^1.0.0" 46 | is-negated-glob "^1.0.0" 47 | 48 | "@mrmlnc/readdir-enhanced@^2.2.1": 49 | version "2.2.1" 50 | resolved "https://registry.yarnpkg.com/@mrmlnc/readdir-enhanced/-/readdir-enhanced-2.2.1.tgz#524af240d1a360527b730475ecfa1344aa540dde" 51 | integrity sha512-bPHp6Ji8b41szTOcaP63VlnbbO5Ny6dwAATtY6JTjh5N2OLrb5Qk/Th5cRkRQhkWCt+EJsYrNB0MiL+Gpn6e3g== 52 | dependencies: 53 | call-me-maybe "^1.0.1" 54 | glob-to-regexp "^0.3.0" 55 | 56 | "@nestjs/common@^6.5.0": 57 | version "6.5.2" 58 | resolved "https://registry.yarnpkg.com/@nestjs/common/-/common-6.5.2.tgz#a864a62f859a7662f658febc0e9a115eee00739e" 59 | integrity sha512-vkB6JLPPckjS35usLMV3Q6vljkgzhN3jgQ+U1VY6cKriyjnkIcUKo37tNQSPYkaAGe1pOLK4IkmwMTSyhNieyg== 60 | dependencies: 61 | axios "0.19.0" 62 | cli-color "1.4.0" 63 | uuid "3.3.2" 64 | 65 | "@nestjs/core@^6.5.0": 66 | version "6.5.2" 67 | resolved "https://registry.yarnpkg.com/@nestjs/core/-/core-6.5.2.tgz#42ff3ce1b1a51055bbc4732e60d1029fb8ca487d" 68 | integrity sha512-LTRCl4oaFP43DcPHbvVO0sH72M+N0uGwnqc0UxhJ7ovJMX6xhahSot1QTkBb56V2AIfmzaRbGpuA4qhIgBXj6A== 69 | dependencies: 70 | "@nuxtjs/opencollective" "0.2.2" 71 | fast-safe-stringify "2.0.6" 72 | iterare "1.2.0" 73 | object-hash "1.3.1" 74 | optional "0.1.4" 75 | uuid "3.3.2" 76 | 77 | "@nestjs/schematics@^6.3.0": 78 | version "6.3.0" 79 | resolved "https://registry.yarnpkg.com/@nestjs/schematics/-/schematics-6.3.0.tgz#d428d4f238d23f21434f58c4a20fce76fab19070" 80 | integrity sha512-SIb5eGoFjXu1RpMgC5lqh2Khbyf391zBrNj9Xjy4rN+6eArdlr439CPT17SI2QlFAzHiFEOQOMbpqv2ipx6ufA== 81 | dependencies: 82 | "@angular-devkit/core" "7.3.8" 83 | "@angular-devkit/schematics" "7.3.8" 84 | ts-morph "^1.3.1" 85 | typescript "^3.2.2" 86 | 87 | "@nestjs/swagger@>=3.0.2": 88 | version "3.0.2" 89 | resolved "https://registry.yarnpkg.com/@nestjs/swagger/-/swagger-3.0.2.tgz#b15b3354050757f648e7ebc6ae8d15a929220804" 90 | integrity sha512-7cmOqa3MoK3ZXThECa3RCe5s5Bppm66DqDRz+nfTp5k2oGoFHX9t45jNU8P5aANCIEi1nA3TYwvEAGgZdV8WbA== 91 | dependencies: 92 | lodash "4.17.11" 93 | path-to-regexp "3.0.0" 94 | 95 | "@nodelib/fs.stat@^1.1.2": 96 | version "1.1.3" 97 | resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-1.1.3.tgz#2b5a3ab3f918cca48a8c754c08168e3f03eba61b" 98 | integrity sha512-shAmDyaQC4H92APFoIaVDHCx5bStIocgvbwQyxPRrbUY20V1EYTbSDchWbuwlMG3V17cprZhA6+78JfB+3DTPw== 99 | 100 | "@nuxtjs/opencollective@0.2.2": 101 | version "0.2.2" 102 | resolved "https://registry.yarnpkg.com/@nuxtjs/opencollective/-/opencollective-0.2.2.tgz#26a761ebf588cc92a422d7cee996a66bd6e2761e" 103 | integrity sha512-69gFVDs7mJfNjv9Zs5DFVD+pvBW+k1TaHSOqUWqAyTTfLcKI/EMYQgvEvziRd+zAFtUOoye6MfWh0qvinGISPw== 104 | dependencies: 105 | chalk "^2.4.1" 106 | consola "^2.3.0" 107 | node-fetch "^2.3.0" 108 | 109 | "@types/body-parser@*": 110 | version "1.17.0" 111 | resolved "https://registry.yarnpkg.com/@types/body-parser/-/body-parser-1.17.0.tgz#9f5c9d9bd04bb54be32d5eb9fc0d8c974e6cf58c" 112 | integrity sha512-a2+YeUjPkztKJu5aIF2yArYFQQp8d51wZ7DavSHjFuY1mqVgidGyzEQ41JIVNy82fXj8yPgy2vJmfIywgESW6w== 113 | dependencies: 114 | "@types/connect" "*" 115 | "@types/node" "*" 116 | 117 | "@types/bunyan-blackhole@^0.2.2": 118 | version "0.2.2" 119 | resolved "https://registry.yarnpkg.com/@types/bunyan-blackhole/-/bunyan-blackhole-0.2.2.tgz#469e58c5d129027a9e08bcf9a36232a69b6ad011" 120 | integrity sha512-nbuxFn2FVw1AAT1h6shgluwz1cgpLKaMBYbEZcMU69Jb1UvSsXcwRiIg+FP4+/JjEUp/uPYLC+twWpfCAaVN1g== 121 | dependencies: 122 | "@types/bunyan" "*" 123 | 124 | "@types/bunyan@*", "@types/bunyan@^1.8.6": 125 | version "1.8.6" 126 | resolved "https://registry.yarnpkg.com/@types/bunyan/-/bunyan-1.8.6.tgz#6527641cca30bedec5feb9ab527b7803b8000582" 127 | integrity sha512-YiozPOOsS6bIuz31ilYqR5SlLif4TBWsousN2aCWLi5233nZSX19tFbcQUPdR7xJ8ypPyxkCGNxg0CIV5n9qxQ== 128 | dependencies: 129 | "@types/node" "*" 130 | 131 | "@types/connect@*": 132 | version "3.4.32" 133 | resolved "https://registry.yarnpkg.com/@types/connect/-/connect-3.4.32.tgz#aa0e9616b9435ccad02bc52b5b454ffc2c70ba28" 134 | integrity sha512-4r8qa0quOvh7lGD0pre62CAb1oni1OO6ecJLGCezTmhQ8Fz50Arx9RUszryR8KlgK6avuSXvviL6yWyViQABOg== 135 | dependencies: 136 | "@types/node" "*" 137 | 138 | "@types/cookie@^0.3.2": 139 | version "0.3.2" 140 | resolved "https://registry.yarnpkg.com/@types/cookie/-/cookie-0.3.2.tgz#453f4b14b25da6a8ea4494842dedcbf0151deef9" 141 | integrity sha512-aHQA072E10/8iUQsPH7mQU/KUyQBZAGzTVRCUvnSz8mSvbrYsP4xEO2RSA0Pjltolzi0j8+8ixrm//Hr4umPzw== 142 | 143 | "@types/express-serve-static-core@*": 144 | version "4.16.6" 145 | resolved "https://registry.yarnpkg.com/@types/express-serve-static-core/-/express-serve-static-core-4.16.6.tgz#66d4b29ece3e2fb6e5aac2232723002426e651bd" 146 | integrity sha512-8wr3CA/EMybyb6/V8qvTRKiNkPmgUA26uA9XWD6hlA0yFDuqi4r2L0C2B0U2HAYltJamoYJszlkaWM31vrKsHg== 147 | dependencies: 148 | "@types/node" "*" 149 | "@types/range-parser" "*" 150 | 151 | "@types/express@^4.16.1": 152 | version "4.16.1" 153 | resolved "https://registry.yarnpkg.com/@types/express/-/express-4.16.1.tgz#d756bd1a85c34d87eaf44c888bad27ba8a4b7cf0" 154 | integrity sha512-V0clmJow23WeyblmACoxbHBu2JKlE5TiIme6Lem14FnPW9gsttyHtk6wq7njcdIWH1njAaFgR8gW09lgY98gQg== 155 | dependencies: 156 | "@types/body-parser" "*" 157 | "@types/express-serve-static-core" "*" 158 | "@types/serve-static" "*" 159 | 160 | "@types/jest-diff@*": 161 | version "20.0.1" 162 | resolved "https://registry.yarnpkg.com/@types/jest-diff/-/jest-diff-20.0.1.tgz#35cc15b9c4f30a18ef21852e255fdb02f6d59b89" 163 | integrity sha512-yALhelO3i0hqZwhjtcr6dYyaLoCHbAMshwtj6cGxTvHZAKXHsYGdff6E8EPw3xLKY0ELUTQ69Q1rQiJENnccMA== 164 | 165 | "@types/jest@^24.0.13": 166 | version "24.0.13" 167 | resolved "https://registry.yarnpkg.com/@types/jest/-/jest-24.0.13.tgz#10f50b64cb05fb02411fbba49e9042a3a11da3f9" 168 | integrity sha512-3m6RPnO35r7Dg+uMLj1+xfZaOgIHHHut61djNjzwExXN4/Pm9has9C6I1KMYSfz7mahDhWUOVg4HW/nZdv5Pww== 169 | dependencies: 170 | "@types/jest-diff" "*" 171 | 172 | "@types/lodash@4.14.145": 173 | version "4.14.145" 174 | resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.14.145.tgz#abcafe85788f1392c5d5a144142aaf8529ad6bb9" 175 | integrity sha512-7lX5bZFO3YG3AG0XVIm5L1SB6wDLtuaJksTkTWrux3/XwCZgw3MPWZBt3Jgj0w98uqUXWVypT2msxo0A1t22lw== 176 | 177 | "@types/mime@*": 178 | version "2.0.1" 179 | resolved "https://registry.yarnpkg.com/@types/mime/-/mime-2.0.1.tgz#dc488842312a7f075149312905b5e3c0b054c79d" 180 | integrity sha512-FwI9gX75FgVBJ7ywgnq/P7tw+/o1GUbtP0KzbtusLigAOgIgNISRK0ZPl4qertvXSIE8YbsVJueQ90cDt9YYyw== 181 | 182 | "@types/node@*": 183 | version "12.0.2" 184 | resolved "https://registry.yarnpkg.com/@types/node/-/node-12.0.2.tgz#3452a24edf9fea138b48fad4a0a028a683da1e40" 185 | integrity sha512-5tabW/i+9mhrfEOUcLDu2xBPsHJ+X5Orqy9FKpale3SjDA17j5AEpYq5vfy3oAeAHGcvANRCO3NV3d2D6q3NiA== 186 | 187 | "@types/range-parser@*": 188 | version "1.2.3" 189 | resolved "https://registry.yarnpkg.com/@types/range-parser/-/range-parser-1.2.3.tgz#7ee330ba7caafb98090bece86a5ee44115904c2c" 190 | integrity sha512-ewFXqrQHlFsgc09MK5jP5iR7vumV/BYayNC6PgJO2LPe8vrnNFyjQjSppfEngITi0qvfKtzFvgKymGheFM9UOA== 191 | 192 | "@types/serve-static@*": 193 | version "1.13.2" 194 | resolved "https://registry.yarnpkg.com/@types/serve-static/-/serve-static-1.13.2.tgz#f5ac4d7a6420a99a6a45af4719f4dcd8cd907a48" 195 | integrity sha512-/BZ4QRLpH/bNYgZgwhKEh+5AsboDBcUdlBYgzoLX0fpj3Y2gp6EApyOlM3bK53wQS/OE1SrdSYBAbux2D1528Q== 196 | dependencies: 197 | "@types/express-serve-static-core" "*" 198 | "@types/mime" "*" 199 | 200 | abbrev@1: 201 | version "1.1.1" 202 | resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8" 203 | integrity sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q== 204 | 205 | ajv@6.9.1: 206 | version "6.9.1" 207 | resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.9.1.tgz#a4d3683d74abc5670e75f0b16520f70a20ea8dc1" 208 | integrity sha512-XDN92U311aINL77ieWHmqCcNlwjoP5cHXDxIxbf2MaPYuCXOHS7gHH8jktxeK5omgd52XbSTX6a4Piwd1pQmzA== 209 | dependencies: 210 | fast-deep-equal "^2.0.1" 211 | fast-json-stable-stringify "^2.0.0" 212 | json-schema-traverse "^0.4.1" 213 | uri-js "^4.2.2" 214 | 215 | ansi-regex@^2.0.0, ansi-regex@^2.1.1: 216 | version "2.1.1" 217 | resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df" 218 | integrity sha1-w7M6te42DYbg5ijwRorn7yfWVN8= 219 | 220 | ansi-regex@^3.0.0: 221 | version "3.0.0" 222 | resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.0.tgz#ed0317c322064f79466c02966bddb605ab37d998" 223 | integrity sha1-7QMXwyIGT3lGbAKWa922Bas32Zg= 224 | 225 | ansi-styles@^3.2.1: 226 | version "3.2.1" 227 | resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" 228 | integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== 229 | dependencies: 230 | color-convert "^1.9.0" 231 | 232 | anymatch@^2.0.0: 233 | version "2.0.0" 234 | resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-2.0.0.tgz#bcb24b4f37934d9aa7ac17b4adaf89e7c76ef2eb" 235 | integrity sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw== 236 | dependencies: 237 | micromatch "^3.1.4" 238 | normalize-path "^2.1.1" 239 | 240 | aproba@^1.0.3: 241 | version "1.2.0" 242 | resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.2.0.tgz#6802e6264efd18c790a1b0d517f0f2627bf2c94a" 243 | integrity sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw== 244 | 245 | are-we-there-yet@~1.1.2: 246 | version "1.1.5" 247 | resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz#4b35c2944f062a8bfcda66410760350fe9ddfc21" 248 | integrity sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w== 249 | dependencies: 250 | delegates "^1.0.0" 251 | readable-stream "^2.0.6" 252 | 253 | argparse@^1.0.7: 254 | version "1.0.10" 255 | resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" 256 | integrity sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg== 257 | dependencies: 258 | sprintf-js "~1.0.2" 259 | 260 | arr-diff@^4.0.0: 261 | version "4.0.0" 262 | resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-4.0.0.tgz#d6461074febfec71e7e15235761a329a5dc7c520" 263 | integrity sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA= 264 | 265 | arr-flatten@^1.1.0: 266 | version "1.1.0" 267 | resolved "https://registry.yarnpkg.com/arr-flatten/-/arr-flatten-1.1.0.tgz#36048bbff4e7b47e136644316c99669ea5ae91f1" 268 | integrity sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg== 269 | 270 | arr-union@^3.1.0: 271 | version "3.1.0" 272 | resolved "https://registry.yarnpkg.com/arr-union/-/arr-union-3.1.0.tgz#e39b09aea9def866a8f206e288af63919bae39c4" 273 | integrity sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ= 274 | 275 | array-differ@^1.0.0: 276 | version "1.0.0" 277 | resolved "https://registry.yarnpkg.com/array-differ/-/array-differ-1.0.0.tgz#eff52e3758249d33be402b8bb8e564bb2b5d4031" 278 | integrity sha1-7/UuN1gknTO+QCuLuOVkuytdQDE= 279 | 280 | array-union@^1.0.1: 281 | version "1.0.2" 282 | resolved "https://registry.yarnpkg.com/array-union/-/array-union-1.0.2.tgz#9a34410e4f4e3da23dea375be5be70f24778ec39" 283 | integrity sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk= 284 | dependencies: 285 | array-uniq "^1.0.1" 286 | 287 | array-uniq@^1.0.1: 288 | version "1.0.3" 289 | resolved "https://registry.yarnpkg.com/array-uniq/-/array-uniq-1.0.3.tgz#af6ac877a25cc7f74e058894753858dfdb24fdb6" 290 | integrity sha1-r2rId6Jcx/dOBYiUdThY39sk/bY= 291 | 292 | array-unique@^0.3.2: 293 | version "0.3.2" 294 | resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.3.2.tgz#a894b75d4bc4f6cd679ef3244a9fd8f46ae2d428" 295 | integrity sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg= 296 | 297 | arrify@^1.0.0, arrify@^1.0.1: 298 | version "1.0.1" 299 | resolved "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d" 300 | integrity sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0= 301 | 302 | assign-symbols@^1.0.0: 303 | version "1.0.0" 304 | resolved "https://registry.yarnpkg.com/assign-symbols/-/assign-symbols-1.0.0.tgz#59667f41fadd4f20ccbc2bb96b8d4f7f78ec0367" 305 | integrity sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c= 306 | 307 | async-each@^1.0.0: 308 | version "1.0.3" 309 | resolved "https://registry.yarnpkg.com/async-each/-/async-each-1.0.3.tgz#b727dbf87d7651602f06f4d4ac387f47d91b0cbf" 310 | integrity sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ== 311 | 312 | atob@^2.1.1: 313 | version "2.1.2" 314 | resolved "https://registry.yarnpkg.com/atob/-/atob-2.1.2.tgz#6d9517eb9e030d2436666651e86bd9f6f13533c9" 315 | integrity sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg== 316 | 317 | axios@0.19.0: 318 | version "0.19.0" 319 | resolved "https://registry.yarnpkg.com/axios/-/axios-0.19.0.tgz#8e09bff3d9122e133f7b8101c8fbdd00ed3d2ab8" 320 | integrity sha512-1uvKqKQta3KBxIz14F2v06AEHZ/dIoeKfbTRkK1E5oqjDnuEerLmYTgJB5AiQZHJcljpg1TuRzdjDR06qNk0DQ== 321 | dependencies: 322 | follow-redirects "1.5.10" 323 | is-buffer "^2.0.2" 324 | 325 | balanced-match@^1.0.0: 326 | version "1.0.0" 327 | resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" 328 | integrity sha1-ibTRmasr7kneFk6gK4nORi1xt2c= 329 | 330 | base@^0.11.1: 331 | version "0.11.2" 332 | resolved "https://registry.yarnpkg.com/base/-/base-0.11.2.tgz#7bde5ced145b6d551a90db87f83c558b4eb48a8f" 333 | integrity sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg== 334 | dependencies: 335 | cache-base "^1.0.1" 336 | class-utils "^0.3.5" 337 | component-emitter "^1.2.1" 338 | define-property "^1.0.0" 339 | isobject "^3.0.1" 340 | mixin-deep "^1.2.0" 341 | pascalcase "^0.1.1" 342 | 343 | binary-extensions@^1.0.0: 344 | version "1.13.1" 345 | resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-1.13.1.tgz#598afe54755b2868a5330d2aff9d4ebb53209b65" 346 | integrity sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw== 347 | 348 | brace-expansion@^1.1.7: 349 | version "1.1.11" 350 | resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" 351 | integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== 352 | dependencies: 353 | balanced-match "^1.0.0" 354 | concat-map "0.0.1" 355 | 356 | braces@^2.3.0, braces@^2.3.1: 357 | version "2.3.2" 358 | resolved "https://registry.yarnpkg.com/braces/-/braces-2.3.2.tgz#5979fd3f14cd531565e5fa2df1abfff1dfaee729" 359 | integrity sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w== 360 | dependencies: 361 | arr-flatten "^1.1.0" 362 | array-unique "^0.3.2" 363 | extend-shallow "^2.0.1" 364 | fill-range "^4.0.0" 365 | isobject "^3.0.1" 366 | repeat-element "^1.1.2" 367 | snapdragon "^0.8.1" 368 | snapdragon-node "^2.0.1" 369 | split-string "^3.0.2" 370 | to-regex "^3.0.1" 371 | 372 | bs-logger@0.x: 373 | version "0.2.6" 374 | resolved "https://registry.yarnpkg.com/bs-logger/-/bs-logger-0.2.6.tgz#eb7d365307a72cf974cc6cda76b68354ad336bd8" 375 | integrity sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog== 376 | dependencies: 377 | fast-json-stable-stringify "2.x" 378 | 379 | buffer-from@1.x: 380 | version "1.1.1" 381 | resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.1.tgz#32713bc028f75c02fdb710d7c7bcec1f2c6070ef" 382 | integrity sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A== 383 | 384 | builtin-modules@^1.1.1: 385 | version "1.1.1" 386 | resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-1.1.1.tgz#270f076c5a72c02f5b65a47df94c5fe3a278892f" 387 | integrity sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8= 388 | 389 | bunyan-blackhole@^1.1.1: 390 | version "1.1.1" 391 | resolved "https://registry.yarnpkg.com/bunyan-blackhole/-/bunyan-blackhole-1.1.1.tgz#b9208586dc0b4e47f4f713215b1bddd65e4f6257" 392 | integrity sha1-uSCFhtwLTkf09xMhWxvd1l5PYlc= 393 | dependencies: 394 | stream-blackhole "^1.0.3" 395 | 396 | bunyan@^1.8.12: 397 | version "1.8.12" 398 | resolved "https://registry.yarnpkg.com/bunyan/-/bunyan-1.8.12.tgz#f150f0f6748abdd72aeae84f04403be2ef113797" 399 | integrity sha1-8VDw9nSKvdcq6uhPBEA74u8RN5c= 400 | optionalDependencies: 401 | dtrace-provider "~0.8" 402 | moment "^2.10.6" 403 | mv "~2" 404 | safe-json-stringify "~1" 405 | 406 | cache-base@^1.0.1: 407 | version "1.0.1" 408 | resolved "https://registry.yarnpkg.com/cache-base/-/cache-base-1.0.1.tgz#0a7f46416831c8b662ee36fe4e7c59d76f666ab2" 409 | integrity sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ== 410 | dependencies: 411 | collection-visit "^1.0.0" 412 | component-emitter "^1.2.1" 413 | get-value "^2.0.6" 414 | has-value "^1.0.0" 415 | isobject "^3.0.1" 416 | set-value "^2.0.0" 417 | to-object-path "^0.3.0" 418 | union-value "^1.0.0" 419 | unset-value "^1.0.0" 420 | 421 | call-me-maybe@^1.0.1: 422 | version "1.0.1" 423 | resolved "https://registry.yarnpkg.com/call-me-maybe/-/call-me-maybe-1.0.1.tgz#26d208ea89e37b5cbde60250a15f031c16a4d66b" 424 | integrity sha1-JtII6onje1y95gJQoV8DHBak1ms= 425 | 426 | camelcase@^4.1.0: 427 | version "4.1.0" 428 | resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-4.1.0.tgz#d545635be1e33c542649c69173e5de6acfae34dd" 429 | integrity sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0= 430 | 431 | chalk@^2.0.0, chalk@^2.3.0, chalk@^2.4.1: 432 | version "2.4.2" 433 | resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" 434 | integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== 435 | dependencies: 436 | ansi-styles "^3.2.1" 437 | escape-string-regexp "^1.0.5" 438 | supports-color "^5.3.0" 439 | 440 | chokidar@2.0.4: 441 | version "2.0.4" 442 | resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-2.0.4.tgz#356ff4e2b0e8e43e322d18a372460bbcf3accd26" 443 | integrity sha512-z9n7yt9rOvIJrMhvDtDictKrkFHeihkNl6uWMmZlmL6tJtX9Cs+87oK+teBx+JIgzvbX3yZHT3eF8vpbDxHJXQ== 444 | dependencies: 445 | anymatch "^2.0.0" 446 | async-each "^1.0.0" 447 | braces "^2.3.0" 448 | glob-parent "^3.1.0" 449 | inherits "^2.0.1" 450 | is-binary-path "^1.0.0" 451 | is-glob "^4.0.0" 452 | lodash.debounce "^4.0.8" 453 | normalize-path "^2.1.1" 454 | path-is-absolute "^1.0.0" 455 | readdirp "^2.0.0" 456 | upath "^1.0.5" 457 | optionalDependencies: 458 | fsevents "^1.2.2" 459 | 460 | chownr@^1.1.1: 461 | version "1.1.1" 462 | resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.1.1.tgz#54726b8b8fff4df053c42187e801fb4412df1494" 463 | integrity sha512-j38EvO5+LHX84jlo6h4UzmOwi0UgW61WRyPtJz4qaadK5eY3BTS5TY/S1Stc3Uk2lIM6TPevAlULiEJwie860g== 464 | 465 | class-utils@^0.3.5: 466 | version "0.3.6" 467 | resolved "https://registry.yarnpkg.com/class-utils/-/class-utils-0.3.6.tgz#f93369ae8b9a7ce02fd41faad0ca83033190c463" 468 | integrity sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg== 469 | dependencies: 470 | arr-union "^3.1.0" 471 | define-property "^0.2.5" 472 | isobject "^3.0.0" 473 | static-extend "^0.1.1" 474 | 475 | cli-color@1.4.0: 476 | version "1.4.0" 477 | resolved "https://registry.yarnpkg.com/cli-color/-/cli-color-1.4.0.tgz#7d10738f48526824f8fe7da51857cb0f572fe01f" 478 | integrity sha512-xu6RvQqqrWEo6MPR1eixqGPywhYBHRs653F9jfXB2Hx4jdM/3WxiNE1vppRmxtMIfl16SFYTpYlrnqH/HsK/2w== 479 | dependencies: 480 | ansi-regex "^2.1.1" 481 | d "1" 482 | es5-ext "^0.10.46" 483 | es6-iterator "^2.0.3" 484 | memoizee "^0.4.14" 485 | timers-ext "^0.1.5" 486 | 487 | code-block-writer@7.2.2: 488 | version "7.2.2" 489 | resolved "https://registry.yarnpkg.com/code-block-writer/-/code-block-writer-7.2.2.tgz#14ec0120de9a65d2cc5d214561d51d1660dddbb1" 490 | integrity sha512-8SyXM1bWsMDCzvCoTdnDBhnnUbHntxcba4ApBIO3S3QX0M2Iq0xZCzs6SYdBOGaSUi4drysvrAK15JoXhlpsvQ== 491 | 492 | code-point-at@^1.0.0: 493 | version "1.1.0" 494 | resolved "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77" 495 | integrity sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c= 496 | 497 | collection-visit@^1.0.0: 498 | version "1.0.0" 499 | resolved "https://registry.yarnpkg.com/collection-visit/-/collection-visit-1.0.0.tgz#4bc0373c164bc3291b4d368c829cf1a80a59dca0" 500 | integrity sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA= 501 | dependencies: 502 | map-visit "^1.0.0" 503 | object-visit "^1.0.0" 504 | 505 | color-convert@^1.9.0: 506 | version "1.9.3" 507 | resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" 508 | integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== 509 | dependencies: 510 | color-name "1.1.3" 511 | 512 | color-name@1.1.3: 513 | version "1.1.3" 514 | resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" 515 | integrity sha1-p9BVi9icQveV3UIyj3QIMcpTvCU= 516 | 517 | commander@^2.12.1: 518 | version "2.20.0" 519 | resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.0.tgz#d58bb2b5c1ee8f87b0d340027e9e94e222c5a422" 520 | integrity sha512-7j2y+40w61zy6YC2iRNpUe/NwhNyoXrYpHMrSunaMG64nRnaf96zO/KMQR4OyN/UnE5KLyEBnKHd4aG3rskjpQ== 521 | 522 | component-emitter@^1.2.1: 523 | version "1.3.0" 524 | resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.3.0.tgz#16e4070fba8ae29b679f2215853ee181ab2eabc0" 525 | integrity sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg== 526 | 527 | concat-map@0.0.1: 528 | version "0.0.1" 529 | resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" 530 | integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= 531 | 532 | consola@^2.3.0: 533 | version "2.9.0" 534 | resolved "https://registry.yarnpkg.com/consola/-/consola-2.9.0.tgz#57760e3a65a53ec27337f4add31505802d902278" 535 | integrity sha512-34Iue+LRcWbndFIfZc5boNizWlsrRjqIBJZTe591vImgbnq7nx2EzlrLtANj9TH2Fxm7puFJBJAOk5BhvZOddQ== 536 | 537 | console-control-strings@^1.0.0, console-control-strings@~1.1.0: 538 | version "1.1.0" 539 | resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e" 540 | integrity sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4= 541 | 542 | cookie@^0.4.0: 543 | version "0.4.0" 544 | resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.4.0.tgz#beb437e7022b3b6d49019d088665303ebe9c14ba" 545 | integrity sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg== 546 | 547 | copy-descriptor@^0.1.0: 548 | version "0.1.1" 549 | resolved "https://registry.yarnpkg.com/copy-descriptor/-/copy-descriptor-0.1.1.tgz#676f6eb3c39997c2ee1ac3a924fd6124748f578d" 550 | integrity sha1-Z29us8OZl8LuGsOpJP1hJHSPV40= 551 | 552 | core-util-is@~1.0.0: 553 | version "1.0.2" 554 | resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" 555 | integrity sha1-tf1UIgqivFq1eqtxQMlAdUUDwac= 556 | 557 | d@1: 558 | version "1.0.0" 559 | resolved "https://registry.yarnpkg.com/d/-/d-1.0.0.tgz#754bb5bfe55451da69a58b94d45f4c5b0462d58f" 560 | integrity sha1-dUu1v+VUUdpppYuU1F9MWwRi1Y8= 561 | dependencies: 562 | es5-ext "^0.10.9" 563 | 564 | debug@=3.1.0: 565 | version "3.1.0" 566 | resolved "https://registry.yarnpkg.com/debug/-/debug-3.1.0.tgz#5bb5a0672628b64149566ba16819e61518c67261" 567 | integrity sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g== 568 | dependencies: 569 | ms "2.0.0" 570 | 571 | debug@^2.2.0, debug@^2.3.3: 572 | version "2.6.9" 573 | resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" 574 | integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== 575 | dependencies: 576 | ms "2.0.0" 577 | 578 | debug@^3.2.6: 579 | version "3.2.6" 580 | resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.6.tgz#e83d17de16d8a7efb7717edbe5fb10135eee629b" 581 | integrity sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ== 582 | dependencies: 583 | ms "^2.1.1" 584 | 585 | decode-uri-component@^0.2.0: 586 | version "0.2.0" 587 | resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.0.tgz#eb3913333458775cb84cd1a1fae062106bb87545" 588 | integrity sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU= 589 | 590 | deep-extend@^0.6.0: 591 | version "0.6.0" 592 | resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac" 593 | integrity sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA== 594 | 595 | define-property@^0.2.5: 596 | version "0.2.5" 597 | resolved "https://registry.yarnpkg.com/define-property/-/define-property-0.2.5.tgz#c35b1ef918ec3c990f9a5bc57be04aacec5c8116" 598 | integrity sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY= 599 | dependencies: 600 | is-descriptor "^0.1.0" 601 | 602 | define-property@^1.0.0: 603 | version "1.0.0" 604 | resolved "https://registry.yarnpkg.com/define-property/-/define-property-1.0.0.tgz#769ebaaf3f4a63aad3af9e8d304c9bbe79bfb0e6" 605 | integrity sha1-dp66rz9KY6rTr56NMEybvnm/sOY= 606 | dependencies: 607 | is-descriptor "^1.0.0" 608 | 609 | define-property@^2.0.2: 610 | version "2.0.2" 611 | resolved "https://registry.yarnpkg.com/define-property/-/define-property-2.0.2.tgz#d459689e8d654ba77e02a817f8710d702cb16e9d" 612 | integrity sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ== 613 | dependencies: 614 | is-descriptor "^1.0.2" 615 | isobject "^3.0.1" 616 | 617 | delegates@^1.0.0: 618 | version "1.0.0" 619 | resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a" 620 | integrity sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o= 621 | 622 | detect-libc@^1.0.2: 623 | version "1.0.3" 624 | resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-1.0.3.tgz#fa137c4bd698edf55cd5cd02ac559f91a4c4ba9b" 625 | integrity sha1-+hN8S9aY7fVc1c0CrFWfkaTEups= 626 | 627 | diff@^4.0.1: 628 | version "4.0.1" 629 | resolved "https://registry.yarnpkg.com/diff/-/diff-4.0.1.tgz#0c667cb467ebbb5cea7f14f135cc2dba7780a8ff" 630 | integrity sha512-s2+XdvhPCOF01LRQBC8hf4vhbVmI2CGS5aZnxLJlT5FtdhPCDFq80q++zK2KlrVorVDdL5BOGZ/VfLrVtYNF+Q== 631 | 632 | dir-glob@2.0.0: 633 | version "2.0.0" 634 | resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-2.0.0.tgz#0b205d2b6aef98238ca286598a8204d29d0a0034" 635 | integrity sha512-37qirFDz8cA5fimp9feo43fSuRo2gHwaIn6dXL8Ber1dGwUosDrGZeCCXq57WnIqE4aQ+u3eQZzsk1yOzhdwag== 636 | dependencies: 637 | arrify "^1.0.1" 638 | path-type "^3.0.0" 639 | 640 | dtrace-provider@~0.8: 641 | version "0.8.7" 642 | resolved "https://registry.yarnpkg.com/dtrace-provider/-/dtrace-provider-0.8.7.tgz#dc939b4d3e0620cfe0c1cd803d0d2d7ed04ffd04" 643 | integrity sha1-3JObTT4GIM/gwc2APQ0tftBP/QQ= 644 | dependencies: 645 | nan "^2.10.0" 646 | 647 | es5-ext@^0.10.14, es5-ext@^0.10.35, es5-ext@^0.10.45, es5-ext@^0.10.46, es5-ext@^0.10.9, es5-ext@~0.10.14, es5-ext@~0.10.2, es5-ext@~0.10.46: 648 | version "0.10.50" 649 | resolved "https://registry.yarnpkg.com/es5-ext/-/es5-ext-0.10.50.tgz#6d0e23a0abdb27018e5ac4fd09b412bc5517a778" 650 | integrity sha512-KMzZTPBkeQV/JcSQhI5/z6d9VWJ3EnQ194USTUwIYZ2ZbpN8+SGXQKt1h68EX44+qt+Fzr8DO17vnxrw7c3agw== 651 | dependencies: 652 | es6-iterator "~2.0.3" 653 | es6-symbol "~3.1.1" 654 | next-tick "^1.0.0" 655 | 656 | es6-iterator@^2.0.1, es6-iterator@^2.0.3, es6-iterator@~2.0.3: 657 | version "2.0.3" 658 | resolved "https://registry.yarnpkg.com/es6-iterator/-/es6-iterator-2.0.3.tgz#a7de889141a05a94b0854403b2d0a0fbfa98f3b7" 659 | integrity sha1-p96IkUGgWpSwhUQDstCg+/qY87c= 660 | dependencies: 661 | d "1" 662 | es5-ext "^0.10.35" 663 | es6-symbol "^3.1.1" 664 | 665 | es6-symbol@^3.1.1, es6-symbol@~3.1.1: 666 | version "3.1.1" 667 | resolved "https://registry.yarnpkg.com/es6-symbol/-/es6-symbol-3.1.1.tgz#bf00ef4fdab6ba1b46ecb7b629b4c7ed5715cc77" 668 | integrity sha1-vwDvT9q2uhtG7Le2KbTH7VcVzHc= 669 | dependencies: 670 | d "1" 671 | es5-ext "~0.10.14" 672 | 673 | es6-weak-map@^2.0.2: 674 | version "2.0.2" 675 | resolved "https://registry.yarnpkg.com/es6-weak-map/-/es6-weak-map-2.0.2.tgz#5e3ab32251ffd1538a1f8e5ffa1357772f92d96f" 676 | integrity sha1-XjqzIlH/0VOKH45f+hNXdy+S2W8= 677 | dependencies: 678 | d "1" 679 | es5-ext "^0.10.14" 680 | es6-iterator "^2.0.1" 681 | es6-symbol "^3.1.1" 682 | 683 | escape-string-regexp@^1.0.5: 684 | version "1.0.5" 685 | resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" 686 | integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= 687 | 688 | esprima@^4.0.0: 689 | version "4.0.1" 690 | resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" 691 | integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== 692 | 693 | esutils@^2.0.2: 694 | version "2.0.2" 695 | resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.2.tgz#0abf4f1caa5bcb1f7a9d8acc6dea4faaa04bac9b" 696 | integrity sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs= 697 | 698 | event-emitter@^0.3.5: 699 | version "0.3.5" 700 | resolved "https://registry.yarnpkg.com/event-emitter/-/event-emitter-0.3.5.tgz#df8c69eef1647923c7157b9ce83840610b02cc39" 701 | integrity sha1-34xp7vFkeSPHFXuc6DhAYQsCzDk= 702 | dependencies: 703 | d "1" 704 | es5-ext "~0.10.14" 705 | 706 | expand-brackets@^2.1.4: 707 | version "2.1.4" 708 | resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-2.1.4.tgz#b77735e315ce30f6b6eff0f83b04151a22449622" 709 | integrity sha1-t3c14xXOMPa27/D4OwQVGiJEliI= 710 | dependencies: 711 | debug "^2.3.3" 712 | define-property "^0.2.5" 713 | extend-shallow "^2.0.1" 714 | posix-character-classes "^0.1.0" 715 | regex-not "^1.0.0" 716 | snapdragon "^0.8.1" 717 | to-regex "^3.0.1" 718 | 719 | extend-shallow@^2.0.1: 720 | version "2.0.1" 721 | resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-2.0.1.tgz#51af7d614ad9a9f610ea1bafbb989d6b1c56890f" 722 | integrity sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8= 723 | dependencies: 724 | is-extendable "^0.1.0" 725 | 726 | extend-shallow@^3.0.0, extend-shallow@^3.0.2: 727 | version "3.0.2" 728 | resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-3.0.2.tgz#26a71aaf073b39fb2127172746131c2704028db8" 729 | integrity sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg= 730 | dependencies: 731 | assign-symbols "^1.0.0" 732 | is-extendable "^1.0.1" 733 | 734 | extglob@^2.0.4: 735 | version "2.0.4" 736 | resolved "https://registry.yarnpkg.com/extglob/-/extglob-2.0.4.tgz#ad00fe4dc612a9232e8718711dc5cb5ab0285543" 737 | integrity sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw== 738 | dependencies: 739 | array-unique "^0.3.2" 740 | define-property "^1.0.0" 741 | expand-brackets "^2.1.4" 742 | extend-shallow "^2.0.1" 743 | fragment-cache "^0.2.1" 744 | regex-not "^1.0.0" 745 | snapdragon "^0.8.1" 746 | to-regex "^3.0.1" 747 | 748 | fast-deep-equal@^2.0.1: 749 | version "2.0.1" 750 | resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz#7b05218ddf9667bf7f370bf7fdb2cb15fdd0aa49" 751 | integrity sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk= 752 | 753 | fast-glob@^2.0.2: 754 | version "2.2.7" 755 | resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-2.2.7.tgz#6953857c3afa475fff92ee6015d52da70a4cd39d" 756 | integrity sha512-g1KuQwHOZAmOZMuBtHdxDtju+T2RT8jgCC9aANsbpdiDDTSnjgfuVsIBNKbUeJI3oKMRExcfNDtJl4OhbffMsw== 757 | dependencies: 758 | "@mrmlnc/readdir-enhanced" "^2.2.1" 759 | "@nodelib/fs.stat" "^1.1.2" 760 | glob-parent "^3.1.0" 761 | is-glob "^4.0.0" 762 | merge2 "^1.2.3" 763 | micromatch "^3.1.10" 764 | 765 | fast-json-stable-stringify@2.0.0, fast-json-stable-stringify@2.x, fast-json-stable-stringify@^2.0.0: 766 | version "2.0.0" 767 | resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz#d5142c0caee6b1189f87d3a76111064f86c8bbf2" 768 | integrity sha1-1RQsDK7msRifh9OnYREGT4bIu/I= 769 | 770 | fast-safe-stringify@2.0.6: 771 | version "2.0.6" 772 | resolved "https://registry.yarnpkg.com/fast-safe-stringify/-/fast-safe-stringify-2.0.6.tgz#04b26106cc56681f51a044cfc0d76cf0008ac2c2" 773 | integrity sha512-q8BZ89jjc+mz08rSxROs8VsrBBcn1SIw1kq9NjolL509tkABRk9io01RAjSaEv1Xb2uFLt8VtRiZbGp5H8iDtg== 774 | 775 | fill-range@^4.0.0: 776 | version "4.0.0" 777 | resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-4.0.0.tgz#d544811d428f98eb06a63dc402d2403c328c38f7" 778 | integrity sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc= 779 | dependencies: 780 | extend-shallow "^2.0.1" 781 | is-number "^3.0.0" 782 | repeat-string "^1.6.1" 783 | to-regex-range "^2.1.0" 784 | 785 | follow-redirects@1.5.10: 786 | version "1.5.10" 787 | resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.5.10.tgz#7b7a9f9aea2fdff36786a94ff643ed07f4ff5e2a" 788 | integrity sha512-0V5l4Cizzvqt5D44aTXbFZz+FtyXV1vrDN6qrelxtfYQKW0KO0W2T/hkE8xvGa/540LkZlkaUjO4ailYTFtHVQ== 789 | dependencies: 790 | debug "=3.1.0" 791 | 792 | for-in@^1.0.2: 793 | version "1.0.2" 794 | resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80" 795 | integrity sha1-gQaNKVqBQuwKxybG4iAMMPttXoA= 796 | 797 | fragment-cache@^0.2.1: 798 | version "0.2.1" 799 | resolved "https://registry.yarnpkg.com/fragment-cache/-/fragment-cache-0.2.1.tgz#4290fad27f13e89be7f33799c6bc5a0abfff0d19" 800 | integrity sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk= 801 | dependencies: 802 | map-cache "^0.2.2" 803 | 804 | fs-extra@^7.0.0: 805 | version "7.0.1" 806 | resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-7.0.1.tgz#4f189c44aa123b895f722804f55ea23eadc348e9" 807 | integrity sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw== 808 | dependencies: 809 | graceful-fs "^4.1.2" 810 | jsonfile "^4.0.0" 811 | universalify "^0.1.0" 812 | 813 | fs-minipass@^1.2.5: 814 | version "1.2.6" 815 | resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-1.2.6.tgz#2c5cc30ded81282bfe8a0d7c7c1853ddeb102c07" 816 | integrity sha512-crhvyXcMejjv3Z5d2Fa9sf5xLYVCF5O1c71QxbVnbLsmYMBEvDAftewesN/HhY03YRoA7zOMxjNGrF5svGaaeQ== 817 | dependencies: 818 | minipass "^2.2.1" 819 | 820 | fs.realpath@^1.0.0: 821 | version "1.0.0" 822 | resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" 823 | integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8= 824 | 825 | fsevents@^1.2.2: 826 | version "1.2.9" 827 | resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-1.2.9.tgz#3f5ed66583ccd6f400b5a00db6f7e861363e388f" 828 | integrity sha512-oeyj2H3EjjonWcFjD5NvZNE9Rqe4UW+nQBU2HNeKw0koVLEFIhtyETyAakeAM3de7Z/SW5kcA+fZUait9EApnw== 829 | dependencies: 830 | nan "^2.12.1" 831 | node-pre-gyp "^0.12.0" 832 | 833 | gauge@~2.7.3: 834 | version "2.7.4" 835 | resolved "https://registry.yarnpkg.com/gauge/-/gauge-2.7.4.tgz#2c03405c7538c39d7eb37b317022e325fb018bf7" 836 | integrity sha1-LANAXHU4w51+s3sxcCLjJfsBi/c= 837 | dependencies: 838 | aproba "^1.0.3" 839 | console-control-strings "^1.0.0" 840 | has-unicode "^2.0.0" 841 | object-assign "^4.1.0" 842 | signal-exit "^3.0.0" 843 | string-width "^1.0.1" 844 | strip-ansi "^3.0.1" 845 | wide-align "^1.1.0" 846 | 847 | get-value@^2.0.3, get-value@^2.0.6: 848 | version "2.0.6" 849 | resolved "https://registry.yarnpkg.com/get-value/-/get-value-2.0.6.tgz#dc15ca1c672387ca76bd37ac0a395ba2042a2c28" 850 | integrity sha1-3BXKHGcjh8p2vTesCjlbogQqLCg= 851 | 852 | glob-parent@^3.1.0: 853 | version "3.1.0" 854 | resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-3.1.0.tgz#9e6af6299d8d3bd2bd40430832bd113df906c5ae" 855 | integrity sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4= 856 | dependencies: 857 | is-glob "^3.1.0" 858 | path-dirname "^1.0.0" 859 | 860 | glob-to-regexp@^0.3.0: 861 | version "0.3.0" 862 | resolved "https://registry.yarnpkg.com/glob-to-regexp/-/glob-to-regexp-0.3.0.tgz#8c5a1494d2066c570cc3bfe4496175acc4d502ab" 863 | integrity sha1-jFoUlNIGbFcMw7/kSWF1rMTVAqs= 864 | 865 | glob@^6.0.1: 866 | version "6.0.4" 867 | resolved "https://registry.yarnpkg.com/glob/-/glob-6.0.4.tgz#0f08860f6a155127b2fadd4f9ce24b1aab6e4d22" 868 | integrity sha1-DwiGD2oVUSey+t1PnOJLGqtuTSI= 869 | dependencies: 870 | inflight "^1.0.4" 871 | inherits "2" 872 | minimatch "2 || 3" 873 | once "^1.3.0" 874 | path-is-absolute "^1.0.0" 875 | 876 | glob@^7.1.1, glob@^7.1.2, glob@^7.1.3: 877 | version "7.1.4" 878 | resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.4.tgz#aa608a2f6c577ad357e1ae5a5c26d9a8d1969255" 879 | integrity sha512-hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A== 880 | dependencies: 881 | fs.realpath "^1.0.0" 882 | inflight "^1.0.4" 883 | inherits "2" 884 | minimatch "^3.0.4" 885 | once "^1.3.0" 886 | path-is-absolute "^1.0.0" 887 | 888 | globby@^8.0.1: 889 | version "8.0.2" 890 | resolved "https://registry.yarnpkg.com/globby/-/globby-8.0.2.tgz#5697619ccd95c5275dbb2d6faa42087c1a941d8d" 891 | integrity sha512-yTzMmKygLp8RUpG1Ymu2VXPSJQZjNAZPD4ywgYEaG7e4tBJeUQBO8OpXrf1RCNcEs5alsoJYPAMiIHP0cmeC7w== 892 | dependencies: 893 | array-union "^1.0.1" 894 | dir-glob "2.0.0" 895 | fast-glob "^2.0.2" 896 | glob "^7.1.2" 897 | ignore "^3.3.5" 898 | pify "^3.0.0" 899 | slash "^1.0.0" 900 | 901 | graceful-fs@^4.1.11, graceful-fs@^4.1.2, graceful-fs@^4.1.6: 902 | version "4.1.15" 903 | resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.15.tgz#ffb703e1066e8a0eeaa4c8b80ba9253eeefbfb00" 904 | integrity sha512-6uHUhOPEBgQ24HM+r6b/QwWfZq+yiFcipKFrOFiBEnWdy5sdzYoi+pJeQaPI5qOLRFqWmAXUPQNsielzdLoecA== 905 | 906 | has-flag@^3.0.0: 907 | version "3.0.0" 908 | resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" 909 | integrity sha1-tdRU3CGZriJWmfNGfloH87lVuv0= 910 | 911 | has-unicode@^2.0.0: 912 | version "2.0.1" 913 | resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9" 914 | integrity sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk= 915 | 916 | has-value@^0.3.1: 917 | version "0.3.1" 918 | resolved "https://registry.yarnpkg.com/has-value/-/has-value-0.3.1.tgz#7b1f58bada62ca827ec0a2078025654845995e1f" 919 | integrity sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8= 920 | dependencies: 921 | get-value "^2.0.3" 922 | has-values "^0.1.4" 923 | isobject "^2.0.0" 924 | 925 | has-value@^1.0.0: 926 | version "1.0.0" 927 | resolved "https://registry.yarnpkg.com/has-value/-/has-value-1.0.0.tgz#18b281da585b1c5c51def24c930ed29a0be6b177" 928 | integrity sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc= 929 | dependencies: 930 | get-value "^2.0.6" 931 | has-values "^1.0.0" 932 | isobject "^3.0.0" 933 | 934 | has-values@^0.1.4: 935 | version "0.1.4" 936 | resolved "https://registry.yarnpkg.com/has-values/-/has-values-0.1.4.tgz#6d61de95d91dfca9b9a02089ad384bff8f62b771" 937 | integrity sha1-bWHeldkd/Km5oCCJrThL/49it3E= 938 | 939 | has-values@^1.0.0: 940 | version "1.0.0" 941 | resolved "https://registry.yarnpkg.com/has-values/-/has-values-1.0.0.tgz#95b0b63fec2146619a6fe57fe75628d5a39efe4f" 942 | integrity sha1-lbC2P+whRmGab+V/51Yo1aOe/k8= 943 | dependencies: 944 | is-number "^3.0.0" 945 | kind-of "^4.0.0" 946 | 947 | iconv-lite@^0.4.4: 948 | version "0.4.24" 949 | resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" 950 | integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== 951 | dependencies: 952 | safer-buffer ">= 2.1.2 < 3" 953 | 954 | ignore-walk@^3.0.1: 955 | version "3.0.1" 956 | resolved "https://registry.yarnpkg.com/ignore-walk/-/ignore-walk-3.0.1.tgz#a83e62e7d272ac0e3b551aaa82831a19b69f82f8" 957 | integrity sha512-DTVlMx3IYPe0/JJcYP7Gxg7ttZZu3IInhuEhbchuqneY9wWe5Ojy2mXLBaQFUQmo0AW2r3qG7m1mg86js+gnlQ== 958 | dependencies: 959 | minimatch "^3.0.4" 960 | 961 | ignore@^3.3.5: 962 | version "3.3.10" 963 | resolved "https://registry.yarnpkg.com/ignore/-/ignore-3.3.10.tgz#0a97fb876986e8081c631160f8f9f389157f0043" 964 | integrity sha512-Pgs951kaMm5GXP7MOvxERINe3gsaVjUWFm+UZPSq9xYriQAksyhg0csnS0KXSNRD5NmNdapXEpjxG49+AKh/ug== 965 | 966 | inflight@^1.0.4: 967 | version "1.0.6" 968 | resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" 969 | integrity sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk= 970 | dependencies: 971 | once "^1.3.0" 972 | wrappy "1" 973 | 974 | inherits@2, inherits@^2.0.1, inherits@~2.0.3: 975 | version "2.0.3" 976 | resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" 977 | integrity sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4= 978 | 979 | ini@~1.3.0: 980 | version "1.3.5" 981 | resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.5.tgz#eee25f56db1c9ec6085e0c22778083f596abf927" 982 | integrity sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw== 983 | 984 | is-absolute@^1.0.0: 985 | version "1.0.0" 986 | resolved "https://registry.yarnpkg.com/is-absolute/-/is-absolute-1.0.0.tgz#395e1ae84b11f26ad1795e73c17378e48a301576" 987 | integrity sha512-dOWoqflvcydARa360Gvv18DZ/gRuHKi2NU/wU5X1ZFzdYfH29nkiNZsF3mp4OJ3H4yo9Mx8A/uAGNzpzPN3yBA== 988 | dependencies: 989 | is-relative "^1.0.0" 990 | is-windows "^1.0.1" 991 | 992 | is-accessor-descriptor@^0.1.6: 993 | version "0.1.6" 994 | resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz#a9e12cb3ae8d876727eeef3843f8a0897b5c98d6" 995 | integrity sha1-qeEss66Nh2cn7u84Q/igiXtcmNY= 996 | dependencies: 997 | kind-of "^3.0.2" 998 | 999 | is-accessor-descriptor@^1.0.0: 1000 | version "1.0.0" 1001 | resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz#169c2f6d3df1f992618072365c9b0ea1f6878656" 1002 | integrity sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ== 1003 | dependencies: 1004 | kind-of "^6.0.0" 1005 | 1006 | is-binary-path@^1.0.0: 1007 | version "1.0.1" 1008 | resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-1.0.1.tgz#75f16642b480f187a711c814161fd3a4a7655898" 1009 | integrity sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg= 1010 | dependencies: 1011 | binary-extensions "^1.0.0" 1012 | 1013 | is-buffer@^1.1.5: 1014 | version "1.1.6" 1015 | resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be" 1016 | integrity sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w== 1017 | 1018 | is-buffer@^2.0.2: 1019 | version "2.0.3" 1020 | resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-2.0.3.tgz#4ecf3fcf749cbd1e472689e109ac66261a25e725" 1021 | integrity sha512-U15Q7MXTuZlrbymiz95PJpZxu8IlipAp4dtS3wOdgPXx3mqBnslrWU14kxfHB+Py/+2PVKSr37dMAgM2A4uArw== 1022 | 1023 | is-data-descriptor@^0.1.4: 1024 | version "0.1.4" 1025 | resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz#0b5ee648388e2c860282e793f1856fec3f301b56" 1026 | integrity sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y= 1027 | dependencies: 1028 | kind-of "^3.0.2" 1029 | 1030 | is-data-descriptor@^1.0.0: 1031 | version "1.0.0" 1032 | resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz#d84876321d0e7add03990406abbbbd36ba9268c7" 1033 | integrity sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ== 1034 | dependencies: 1035 | kind-of "^6.0.0" 1036 | 1037 | is-descriptor@^0.1.0: 1038 | version "0.1.6" 1039 | resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-0.1.6.tgz#366d8240dde487ca51823b1ab9f07a10a78251ca" 1040 | integrity sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg== 1041 | dependencies: 1042 | is-accessor-descriptor "^0.1.6" 1043 | is-data-descriptor "^0.1.4" 1044 | kind-of "^5.0.0" 1045 | 1046 | is-descriptor@^1.0.0, is-descriptor@^1.0.2: 1047 | version "1.0.2" 1048 | resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-1.0.2.tgz#3b159746a66604b04f8c81524ba365c5f14d86ec" 1049 | integrity sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg== 1050 | dependencies: 1051 | is-accessor-descriptor "^1.0.0" 1052 | is-data-descriptor "^1.0.0" 1053 | kind-of "^6.0.2" 1054 | 1055 | is-extendable@^0.1.0, is-extendable@^0.1.1: 1056 | version "0.1.1" 1057 | resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89" 1058 | integrity sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik= 1059 | 1060 | is-extendable@^1.0.1: 1061 | version "1.0.1" 1062 | resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-1.0.1.tgz#a7470f9e426733d81bd81e1155264e3a3507cab4" 1063 | integrity sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA== 1064 | dependencies: 1065 | is-plain-object "^2.0.4" 1066 | 1067 | is-extglob@^2.1.0, is-extglob@^2.1.1: 1068 | version "2.1.1" 1069 | resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" 1070 | integrity sha1-qIwCU1eR8C7TfHahueqXc8gz+MI= 1071 | 1072 | is-fullwidth-code-point@^1.0.0: 1073 | version "1.0.0" 1074 | resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz#ef9e31386f031a7f0d643af82fde50c457ef00cb" 1075 | integrity sha1-754xOG8DGn8NZDr4L95QxFfvAMs= 1076 | dependencies: 1077 | number-is-nan "^1.0.0" 1078 | 1079 | is-fullwidth-code-point@^2.0.0: 1080 | version "2.0.0" 1081 | resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" 1082 | integrity sha1-o7MKXE8ZkYMWeqq5O+764937ZU8= 1083 | 1084 | is-glob@^3.1.0: 1085 | version "3.1.0" 1086 | resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-3.1.0.tgz#7ba5ae24217804ac70707b96922567486cc3e84a" 1087 | integrity sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo= 1088 | dependencies: 1089 | is-extglob "^2.1.0" 1090 | 1091 | is-glob@^4.0.0: 1092 | version "4.0.1" 1093 | resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.1.tgz#7567dbe9f2f5e2467bc77ab83c4a29482407a5dc" 1094 | integrity sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg== 1095 | dependencies: 1096 | is-extglob "^2.1.1" 1097 | 1098 | is-negated-glob@^1.0.0: 1099 | version "1.0.0" 1100 | resolved "https://registry.yarnpkg.com/is-negated-glob/-/is-negated-glob-1.0.0.tgz#6910bca5da8c95e784b5751b976cf5a10fee36d2" 1101 | integrity sha1-aRC8pdqMleeEtXUbl2z1oQ/uNtI= 1102 | 1103 | is-number@^3.0.0: 1104 | version "3.0.0" 1105 | resolved "https://registry.yarnpkg.com/is-number/-/is-number-3.0.0.tgz#24fd6201a4782cf50561c810276afc7d12d71195" 1106 | integrity sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU= 1107 | dependencies: 1108 | kind-of "^3.0.2" 1109 | 1110 | is-plain-object@^2.0.1, is-plain-object@^2.0.3, is-plain-object@^2.0.4: 1111 | version "2.0.4" 1112 | resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677" 1113 | integrity sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og== 1114 | dependencies: 1115 | isobject "^3.0.1" 1116 | 1117 | is-promise@^2.1: 1118 | version "2.1.0" 1119 | resolved "https://registry.yarnpkg.com/is-promise/-/is-promise-2.1.0.tgz#79a2a9ece7f096e80f36d2b2f3bc16c1ff4bf3fa" 1120 | integrity sha1-eaKp7OfwlugPNtKy87wWwf9L8/o= 1121 | 1122 | is-relative@^1.0.0: 1123 | version "1.0.0" 1124 | resolved "https://registry.yarnpkg.com/is-relative/-/is-relative-1.0.0.tgz#a1bb6935ce8c5dba1e8b9754b9b2dcc020e2260d" 1125 | integrity sha512-Kw/ReK0iqwKeu0MITLFuj0jbPAmEiOsIwyIXvvbfa6QfmN9pkD1M+8pdk7Rl/dTKbH34/XBFMbgD4iMJhLQbGA== 1126 | dependencies: 1127 | is-unc-path "^1.0.0" 1128 | 1129 | is-unc-path@^1.0.0: 1130 | version "1.0.0" 1131 | resolved "https://registry.yarnpkg.com/is-unc-path/-/is-unc-path-1.0.0.tgz#d731e8898ed090a12c352ad2eaed5095ad322c9d" 1132 | integrity sha512-mrGpVd0fs7WWLfVsStvgF6iEJnbjDFZh9/emhRDcGWTduTfNHd9CHeUwH3gYIjdbwo4On6hunkztwOaAw0yllQ== 1133 | dependencies: 1134 | unc-path-regex "^0.1.2" 1135 | 1136 | is-windows@^1.0.1, is-windows@^1.0.2: 1137 | version "1.0.2" 1138 | resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d" 1139 | integrity sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA== 1140 | 1141 | isarray@1.0.0, isarray@~1.0.0: 1142 | version "1.0.0" 1143 | resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" 1144 | integrity sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE= 1145 | 1146 | isobject@^2.0.0: 1147 | version "2.1.0" 1148 | resolved "https://registry.yarnpkg.com/isobject/-/isobject-2.1.0.tgz#f065561096a3f1da2ef46272f815c840d87e0c89" 1149 | integrity sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk= 1150 | dependencies: 1151 | isarray "1.0.0" 1152 | 1153 | isobject@^3.0.0, isobject@^3.0.1: 1154 | version "3.0.1" 1155 | resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df" 1156 | integrity sha1-TkMekrEalzFjaqH5yNHMvP2reN8= 1157 | 1158 | iterare@1.2.0: 1159 | version "1.2.0" 1160 | resolved "https://registry.yarnpkg.com/iterare/-/iterare-1.2.0.tgz#7427f5ed45986e4b73e2fea903579f1117f3dd15" 1161 | integrity sha512-RxMV9p/UzdK0Iplnd8mVgRvNdXlsTOiuDrqMRnDi3wIhbT+JP4xDquAX9ay13R3CH72NBzQ91KWe0+C168QAyQ== 1162 | 1163 | js-tokens@^4.0.0: 1164 | version "4.0.0" 1165 | resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" 1166 | integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== 1167 | 1168 | js-yaml@^3.13.1: 1169 | version "3.13.1" 1170 | resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.13.1.tgz#aff151b30bfdfa8e49e05da22e7415e9dfa37847" 1171 | integrity sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw== 1172 | dependencies: 1173 | argparse "^1.0.7" 1174 | esprima "^4.0.0" 1175 | 1176 | json-schema-traverse@^0.4.1: 1177 | version "0.4.1" 1178 | resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" 1179 | integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== 1180 | 1181 | json5@2.x: 1182 | version "2.1.0" 1183 | resolved "https://registry.yarnpkg.com/json5/-/json5-2.1.0.tgz#e7a0c62c48285c628d20a10b85c89bb807c32850" 1184 | integrity sha512-8Mh9h6xViijj36g7Dxi+Y4S6hNGV96vcJZr/SrlHh1LR/pEn/8j/+qIBbs44YKl69Lrfctp4QD+AdWLTMqEZAQ== 1185 | dependencies: 1186 | minimist "^1.2.0" 1187 | 1188 | jsonfile@^4.0.0: 1189 | version "4.0.0" 1190 | resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-4.0.0.tgz#8771aae0799b64076b76640fca058f9c10e33ecb" 1191 | integrity sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss= 1192 | optionalDependencies: 1193 | graceful-fs "^4.1.6" 1194 | 1195 | kind-of@^3.0.2, kind-of@^3.0.3, kind-of@^3.2.0: 1196 | version "3.2.2" 1197 | resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.2.tgz#31ea21a734bab9bbb0f32466d893aea51e4a3c64" 1198 | integrity sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ= 1199 | dependencies: 1200 | is-buffer "^1.1.5" 1201 | 1202 | kind-of@^4.0.0: 1203 | version "4.0.0" 1204 | resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-4.0.0.tgz#20813df3d712928b207378691a45066fae72dd57" 1205 | integrity sha1-IIE989cSkosgc3hpGkUGb65y3Vc= 1206 | dependencies: 1207 | is-buffer "^1.1.5" 1208 | 1209 | kind-of@^5.0.0: 1210 | version "5.1.0" 1211 | resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-5.1.0.tgz#729c91e2d857b7a419a1f9aa65685c4c33f5845d" 1212 | integrity sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw== 1213 | 1214 | kind-of@^6.0.0, kind-of@^6.0.2: 1215 | version "6.0.2" 1216 | resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.2.tgz#01146b36a6218e64e58f3a8d66de5d7fc6f6d051" 1217 | integrity sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA== 1218 | 1219 | lodash.debounce@^4.0.8: 1220 | version "4.0.8" 1221 | resolved "https://registry.yarnpkg.com/lodash.debounce/-/lodash.debounce-4.0.8.tgz#82d79bff30a67c4005ffd5e2515300ad9ca4d7af" 1222 | integrity sha1-gteb/zCmfEAF/9XiUVMArZyk168= 1223 | 1224 | lodash@4.17.11: 1225 | version "4.17.11" 1226 | resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.11.tgz#b39ea6229ef607ecd89e2c8df12536891cac9b8d" 1227 | integrity sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg== 1228 | 1229 | lodash@4.17.15: 1230 | version "4.17.15" 1231 | resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.15.tgz#b447f6670a0455bbfeedd11392eff330ea097548" 1232 | integrity sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A== 1233 | 1234 | lru-queue@0.1: 1235 | version "0.1.0" 1236 | resolved "https://registry.yarnpkg.com/lru-queue/-/lru-queue-0.1.0.tgz#2738bd9f0d3cf4f84490c5736c48699ac632cda3" 1237 | integrity sha1-Jzi9nw089PhEkMVzbEhpmsYyzaM= 1238 | dependencies: 1239 | es5-ext "~0.10.2" 1240 | 1241 | make-error@1.x: 1242 | version "1.3.5" 1243 | resolved "https://registry.yarnpkg.com/make-error/-/make-error-1.3.5.tgz#efe4e81f6db28cadd605c70f29c831b58ef776c8" 1244 | integrity sha512-c3sIjNUow0+8swNwVpqoH4YCShKNFkMaw6oH1mNS2haDZQqkeZFlHS3dhoeEbKKmJB4vXpJucU6oH75aDYeE9g== 1245 | 1246 | map-cache@^0.2.2: 1247 | version "0.2.2" 1248 | resolved "https://registry.yarnpkg.com/map-cache/-/map-cache-0.2.2.tgz#c32abd0bd6525d9b051645bb4f26ac5dc98a0dbf" 1249 | integrity sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8= 1250 | 1251 | map-visit@^1.0.0: 1252 | version "1.0.0" 1253 | resolved "https://registry.yarnpkg.com/map-visit/-/map-visit-1.0.0.tgz#ecdca8f13144e660f1b5bd41f12f3479d98dfb8f" 1254 | integrity sha1-7Nyo8TFE5mDxtb1B8S80edmN+48= 1255 | dependencies: 1256 | object-visit "^1.0.0" 1257 | 1258 | memoizee@^0.4.14: 1259 | version "0.4.14" 1260 | resolved "https://registry.yarnpkg.com/memoizee/-/memoizee-0.4.14.tgz#07a00f204699f9a95c2d9e77218271c7cd610d57" 1261 | integrity sha512-/SWFvWegAIYAO4NQMpcX+gcra0yEZu4OntmUdrBaWrJncxOqAziGFlHxc7yjKVK2uu3lpPW27P27wkR82wA8mg== 1262 | dependencies: 1263 | d "1" 1264 | es5-ext "^0.10.45" 1265 | es6-weak-map "^2.0.2" 1266 | event-emitter "^0.3.5" 1267 | is-promise "^2.1" 1268 | lru-queue "0.1" 1269 | next-tick "1" 1270 | timers-ext "^0.1.5" 1271 | 1272 | merge2@^1.2.3: 1273 | version "1.2.3" 1274 | resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.2.3.tgz#7ee99dbd69bb6481689253f018488a1b902b0ed5" 1275 | integrity sha512-gdUU1Fwj5ep4kplwcmftruWofEFt6lfpkkr3h860CXbAB9c3hGb55EOL2ali0Td5oebvW0E1+3Sr+Ur7XfKpRA== 1276 | 1277 | micromatch@^3.1.10, micromatch@^3.1.4: 1278 | version "3.1.10" 1279 | resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-3.1.10.tgz#70859bc95c9840952f359a068a3fc49f9ecfac23" 1280 | integrity sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg== 1281 | dependencies: 1282 | arr-diff "^4.0.0" 1283 | array-unique "^0.3.2" 1284 | braces "^2.3.1" 1285 | define-property "^2.0.2" 1286 | extend-shallow "^3.0.2" 1287 | extglob "^2.0.4" 1288 | fragment-cache "^0.2.1" 1289 | kind-of "^6.0.2" 1290 | nanomatch "^1.2.9" 1291 | object.pick "^1.3.0" 1292 | regex-not "^1.0.0" 1293 | snapdragon "^0.8.1" 1294 | to-regex "^3.0.2" 1295 | 1296 | "minimatch@2 || 3", minimatch@^3.0.0, minimatch@^3.0.4: 1297 | version "3.0.4" 1298 | resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" 1299 | integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA== 1300 | dependencies: 1301 | brace-expansion "^1.1.7" 1302 | 1303 | minimist@0.0.8: 1304 | version "0.0.8" 1305 | resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d" 1306 | integrity sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0= 1307 | 1308 | minimist@^1.2.0: 1309 | version "1.2.0" 1310 | resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284" 1311 | integrity sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ= 1312 | 1313 | minipass@^2.2.1, minipass@^2.3.4: 1314 | version "2.3.5" 1315 | resolved "https://registry.yarnpkg.com/minipass/-/minipass-2.3.5.tgz#cacebe492022497f656b0f0f51e2682a9ed2d848" 1316 | integrity sha512-Gi1W4k059gyRbyVUZQ4mEqLm0YIUiGYfvxhF6SIlk3ui1WVxMTGfGdQ2SInh3PDrRTVvPKgULkpJtT4RH10+VA== 1317 | dependencies: 1318 | safe-buffer "^5.1.2" 1319 | yallist "^3.0.0" 1320 | 1321 | minizlib@^1.1.1: 1322 | version "1.2.1" 1323 | resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-1.2.1.tgz#dd27ea6136243c7c880684e8672bb3a45fd9b614" 1324 | integrity sha512-7+4oTUOWKg7AuL3vloEWekXY2/D20cevzsrNT2kGWm+39J9hGTCBv8VI5Pm5lXZ/o3/mdR4f8rflAPhnQb8mPA== 1325 | dependencies: 1326 | minipass "^2.2.1" 1327 | 1328 | mixin-deep@^1.2.0: 1329 | version "1.3.1" 1330 | resolved "https://registry.yarnpkg.com/mixin-deep/-/mixin-deep-1.3.1.tgz#a49e7268dce1a0d9698e45326c5626df3543d0fe" 1331 | integrity sha512-8ZItLHeEgaqEvd5lYBXfm4EZSFCX29Jb9K+lAHhDKzReKBQKj3R+7NOF6tjqYi9t4oI8VUfaWITJQm86wnXGNQ== 1332 | dependencies: 1333 | for-in "^1.0.2" 1334 | is-extendable "^1.0.1" 1335 | 1336 | mkdirp@0.x, mkdirp@^0.5.0, mkdirp@^0.5.1, mkdirp@~0.5.1: 1337 | version "0.5.1" 1338 | resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903" 1339 | integrity sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM= 1340 | dependencies: 1341 | minimist "0.0.8" 1342 | 1343 | moment@^2.10.6: 1344 | version "2.24.0" 1345 | resolved "https://registry.yarnpkg.com/moment/-/moment-2.24.0.tgz#0d055d53f5052aa653c9f6eb68bb5d12bf5c2b5b" 1346 | integrity sha512-bV7f+6l2QigeBBZSM/6yTNq4P2fNpSWj/0e7jQcy87A8e7o2nAfP/34/2ky5Vw4B9S446EtIhodAzkFCcR4dQg== 1347 | 1348 | ms@2.0.0: 1349 | version "2.0.0" 1350 | resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" 1351 | integrity sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g= 1352 | 1353 | ms@^2.1.1: 1354 | version "2.1.1" 1355 | resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.1.tgz#30a5864eb3ebb0a66f2ebe6d727af06a09d86e0a" 1356 | integrity sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg== 1357 | 1358 | multimatch@^2.1.0: 1359 | version "2.1.0" 1360 | resolved "https://registry.yarnpkg.com/multimatch/-/multimatch-2.1.0.tgz#9c7906a22fb4c02919e2f5f75161b4cdbd4b2a2b" 1361 | integrity sha1-nHkGoi+0wCkZ4vX3UWG0zb1LKis= 1362 | dependencies: 1363 | array-differ "^1.0.0" 1364 | array-union "^1.0.1" 1365 | arrify "^1.0.0" 1366 | minimatch "^3.0.0" 1367 | 1368 | mv@~2: 1369 | version "2.1.1" 1370 | resolved "https://registry.yarnpkg.com/mv/-/mv-2.1.1.tgz#ae6ce0d6f6d5e0a4f7d893798d03c1ea9559b6a2" 1371 | integrity sha1-rmzg1vbV4KT32JN5jQPB6pVZtqI= 1372 | dependencies: 1373 | mkdirp "~0.5.1" 1374 | ncp "~2.0.0" 1375 | rimraf "~2.4.0" 1376 | 1377 | nan@^2.10.0, nan@^2.12.1: 1378 | version "2.14.0" 1379 | resolved "https://registry.yarnpkg.com/nan/-/nan-2.14.0.tgz#7818f722027b2459a86f0295d434d1fc2336c52c" 1380 | integrity sha512-INOFj37C7k3AfaNTtX8RhsTw7qRy7eLET14cROi9+5HAVbbHuIWUHEauBv5qT4Av2tWasiTY1Jw6puUNqRJXQg== 1381 | 1382 | nanomatch@^1.2.13, nanomatch@^1.2.9: 1383 | version "1.2.13" 1384 | resolved "https://registry.yarnpkg.com/nanomatch/-/nanomatch-1.2.13.tgz#b87a8aa4fc0de8fe6be88895b38983ff265bd119" 1385 | integrity sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA== 1386 | dependencies: 1387 | arr-diff "^4.0.0" 1388 | array-unique "^0.3.2" 1389 | define-property "^2.0.2" 1390 | extend-shallow "^3.0.2" 1391 | fragment-cache "^0.2.1" 1392 | is-windows "^1.0.2" 1393 | kind-of "^6.0.2" 1394 | object.pick "^1.3.0" 1395 | regex-not "^1.0.0" 1396 | snapdragon "^0.8.1" 1397 | to-regex "^3.0.1" 1398 | 1399 | ncp@~2.0.0: 1400 | version "2.0.0" 1401 | resolved "https://registry.yarnpkg.com/ncp/-/ncp-2.0.0.tgz#195a21d6c46e361d2fb1281ba38b91e9df7bdbb3" 1402 | integrity sha1-GVoh1sRuNh0vsSgbo4uR6d9727M= 1403 | 1404 | needle@^2.2.1: 1405 | version "2.4.0" 1406 | resolved "https://registry.yarnpkg.com/needle/-/needle-2.4.0.tgz#6833e74975c444642590e15a750288c5f939b57c" 1407 | integrity sha512-4Hnwzr3mi5L97hMYeNl8wRW/Onhy4nUKR/lVemJ8gJedxxUyBLm9kkrDColJvoSfwi0jCNhD+xCdOtiGDQiRZg== 1408 | dependencies: 1409 | debug "^3.2.6" 1410 | iconv-lite "^0.4.4" 1411 | sax "^1.2.4" 1412 | 1413 | next-tick@1, next-tick@^1.0.0: 1414 | version "1.0.0" 1415 | resolved "https://registry.yarnpkg.com/next-tick/-/next-tick-1.0.0.tgz#ca86d1fe8828169b0120208e3dc8424b9db8342c" 1416 | integrity sha1-yobR/ogoFpsBICCOPchCS524NCw= 1417 | 1418 | node-fetch@^2.3.0: 1419 | version "2.6.0" 1420 | resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.0.tgz#e633456386d4aa55863f676a7ab0daa8fdecb0fd" 1421 | integrity sha512-8dG4H5ujfvFiqDmVu9fQ5bOHUC15JMjMY/Zumv26oOvvVJjM67KF8koCWIabKQ1GJIa9r2mMZscBq/TbdOcmNA== 1422 | 1423 | node-pre-gyp@^0.12.0: 1424 | version "0.12.0" 1425 | resolved "https://registry.yarnpkg.com/node-pre-gyp/-/node-pre-gyp-0.12.0.tgz#39ba4bb1439da030295f899e3b520b7785766149" 1426 | integrity sha512-4KghwV8vH5k+g2ylT+sLTjy5wmUOb9vPhnM8NHvRf9dHmnW/CndrFXy2aRPaPST6dugXSdHXfeaHQm77PIz/1A== 1427 | dependencies: 1428 | detect-libc "^1.0.2" 1429 | mkdirp "^0.5.1" 1430 | needle "^2.2.1" 1431 | nopt "^4.0.1" 1432 | npm-packlist "^1.1.6" 1433 | npmlog "^4.0.2" 1434 | rc "^1.2.7" 1435 | rimraf "^2.6.1" 1436 | semver "^5.3.0" 1437 | tar "^4" 1438 | 1439 | nopt@^4.0.1: 1440 | version "4.0.1" 1441 | resolved "https://registry.yarnpkg.com/nopt/-/nopt-4.0.1.tgz#d0d4685afd5415193c8c7505602d0d17cd64474d" 1442 | integrity sha1-0NRoWv1UFRk8jHUFYC0NF81kR00= 1443 | dependencies: 1444 | abbrev "1" 1445 | osenv "^0.1.4" 1446 | 1447 | normalize-path@^2.1.1: 1448 | version "2.1.1" 1449 | resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-2.1.1.tgz#1ab28b556e198363a8c1a6f7e6fa20137fe6aed9" 1450 | integrity sha1-GrKLVW4Zg2Oowab35vogE3/mrtk= 1451 | dependencies: 1452 | remove-trailing-separator "^1.0.1" 1453 | 1454 | npm-bundled@^1.0.1: 1455 | version "1.0.6" 1456 | resolved "https://registry.yarnpkg.com/npm-bundled/-/npm-bundled-1.0.6.tgz#e7ba9aadcef962bb61248f91721cd932b3fe6bdd" 1457 | integrity sha512-8/JCaftHwbd//k6y2rEWp6k1wxVfpFzB6t1p825+cUb7Ym2XQfhwIC5KwhrvzZRJu+LtDE585zVaS32+CGtf0g== 1458 | 1459 | npm-packlist@^1.1.6: 1460 | version "1.4.1" 1461 | resolved "https://registry.yarnpkg.com/npm-packlist/-/npm-packlist-1.4.1.tgz#19064cdf988da80ea3cee45533879d90192bbfbc" 1462 | integrity sha512-+TcdO7HJJ8peiiYhvPxsEDhF3PJFGUGRcFsGve3vxvxdcpO2Z4Z7rkosRM0kWj6LfbK/P0gu3dzk5RU1ffvFcw== 1463 | dependencies: 1464 | ignore-walk "^3.0.1" 1465 | npm-bundled "^1.0.1" 1466 | 1467 | npmlog@^4.0.2: 1468 | version "4.1.2" 1469 | resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-4.1.2.tgz#08a7f2a8bf734604779a9efa4ad5cc717abb954b" 1470 | integrity sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg== 1471 | dependencies: 1472 | are-we-there-yet "~1.1.2" 1473 | console-control-strings "~1.1.0" 1474 | gauge "~2.7.3" 1475 | set-blocking "~2.0.0" 1476 | 1477 | number-is-nan@^1.0.0: 1478 | version "1.0.1" 1479 | resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d" 1480 | integrity sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0= 1481 | 1482 | object-assign@^4.1.0: 1483 | version "4.1.1" 1484 | resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" 1485 | integrity sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM= 1486 | 1487 | object-copy@^0.1.0: 1488 | version "0.1.0" 1489 | resolved "https://registry.yarnpkg.com/object-copy/-/object-copy-0.1.0.tgz#7e7d858b781bd7c991a41ba975ed3812754e998c" 1490 | integrity sha1-fn2Fi3gb18mRpBupde04EnVOmYw= 1491 | dependencies: 1492 | copy-descriptor "^0.1.0" 1493 | define-property "^0.2.5" 1494 | kind-of "^3.0.3" 1495 | 1496 | object-hash@1.3.1: 1497 | version "1.3.1" 1498 | resolved "https://registry.yarnpkg.com/object-hash/-/object-hash-1.3.1.tgz#fde452098a951cb145f039bb7d455449ddc126df" 1499 | integrity sha512-OSuu/pU4ENM9kmREg0BdNrUDIl1heYa4mBZacJc+vVWz4GtAwu7jO8s4AIt2aGRUTqxykpWzI3Oqnsm13tTMDA== 1500 | 1501 | object-visit@^1.0.0: 1502 | version "1.0.1" 1503 | resolved "https://registry.yarnpkg.com/object-visit/-/object-visit-1.0.1.tgz#f79c4493af0c5377b59fe39d395e41042dd045bb" 1504 | integrity sha1-95xEk68MU3e1n+OdOV5BBC3QRbs= 1505 | dependencies: 1506 | isobject "^3.0.0" 1507 | 1508 | object.pick@^1.3.0: 1509 | version "1.3.0" 1510 | resolved "https://registry.yarnpkg.com/object.pick/-/object.pick-1.3.0.tgz#87a10ac4c1694bd2e1cbf53591a66141fb5dd747" 1511 | integrity sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c= 1512 | dependencies: 1513 | isobject "^3.0.1" 1514 | 1515 | once@^1.3.0: 1516 | version "1.4.0" 1517 | resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" 1518 | integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E= 1519 | dependencies: 1520 | wrappy "1" 1521 | 1522 | optional@0.1.4: 1523 | version "0.1.4" 1524 | resolved "https://registry.yarnpkg.com/optional/-/optional-0.1.4.tgz#cdb1a9bedc737d2025f690ceeb50e049444fd5b3" 1525 | integrity sha512-gtvrrCfkE08wKcgXaVwQVgwEQ8vel2dc5DDBn9RLQZ3YtmtkBss6A2HY6BnJH4N/4Ku97Ri/SF8sNWE2225WJw== 1526 | 1527 | os-homedir@^1.0.0: 1528 | version "1.0.2" 1529 | resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3" 1530 | integrity sha1-/7xJiDNuDoM94MFox+8VISGqf7M= 1531 | 1532 | os-tmpdir@^1.0.0: 1533 | version "1.0.2" 1534 | resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" 1535 | integrity sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ= 1536 | 1537 | osenv@^0.1.4: 1538 | version "0.1.5" 1539 | resolved "https://registry.yarnpkg.com/osenv/-/osenv-0.1.5.tgz#85cdfafaeb28e8677f416e287592b5f3f49ea410" 1540 | integrity sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g== 1541 | dependencies: 1542 | os-homedir "^1.0.0" 1543 | os-tmpdir "^1.0.0" 1544 | 1545 | pascalcase@^0.1.1: 1546 | version "0.1.1" 1547 | resolved "https://registry.yarnpkg.com/pascalcase/-/pascalcase-0.1.1.tgz#b363e55e8006ca6fe21784d2db22bd15d7917f14" 1548 | integrity sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ= 1549 | 1550 | path-dirname@^1.0.0: 1551 | version "1.0.2" 1552 | resolved "https://registry.yarnpkg.com/path-dirname/-/path-dirname-1.0.2.tgz#cc33d24d525e099a5388c0336c6e32b9160609e0" 1553 | integrity sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA= 1554 | 1555 | path-is-absolute@^1.0.0: 1556 | version "1.0.1" 1557 | resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" 1558 | integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18= 1559 | 1560 | path-parse@^1.0.6: 1561 | version "1.0.6" 1562 | resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.6.tgz#d62dbb5679405d72c4737ec58600e9ddcf06d24c" 1563 | integrity sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw== 1564 | 1565 | path-to-regexp@3.0.0: 1566 | version "3.0.0" 1567 | resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-3.0.0.tgz#c981a218f3df543fa28696be2f88e0c58d2e012a" 1568 | integrity sha512-ZOtfhPttCrqp2M1PBBH4X13XlvnfhIwD7yCLx+GoGoXRPQyxGOTdQMpIzPSPKXAJT/JQrdfFrgdJOyAzvgpQ9A== 1569 | 1570 | path-type@^3.0.0: 1571 | version "3.0.0" 1572 | resolved "https://registry.yarnpkg.com/path-type/-/path-type-3.0.0.tgz#cef31dc8e0a1a3bb0d105c0cd97cf3bf47f4e36f" 1573 | integrity sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg== 1574 | dependencies: 1575 | pify "^3.0.0" 1576 | 1577 | pify@^3.0.0: 1578 | version "3.0.0" 1579 | resolved "https://registry.yarnpkg.com/pify/-/pify-3.0.0.tgz#e5a4acd2c101fdf3d9a4d07f0dbc4db49dd28176" 1580 | integrity sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY= 1581 | 1582 | posix-character-classes@^0.1.0: 1583 | version "0.1.1" 1584 | resolved "https://registry.yarnpkg.com/posix-character-classes/-/posix-character-classes-0.1.1.tgz#01eac0fe3b5af71a2a6c02feabb8c1fef7e00eab" 1585 | integrity sha1-AerA/jta9xoqbAL+q7jB/vfgDqs= 1586 | 1587 | prettier@^1.18.2: 1588 | version "1.18.2" 1589 | resolved "https://registry.yarnpkg.com/prettier/-/prettier-1.18.2.tgz#6823e7c5900017b4bd3acf46fe9ac4b4d7bda9ea" 1590 | integrity sha512-OeHeMc0JhFE9idD4ZdtNibzY0+TPHSpSSb9h8FqtP+YnoZZ1sl8Vc9b1sasjfymH3SonAF4QcA2+mzHPhMvIiw== 1591 | 1592 | process-nextick-args@~2.0.0: 1593 | version "2.0.0" 1594 | resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.0.tgz#a37d732f4271b4ab1ad070d35508e8290788ffaa" 1595 | integrity sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw== 1596 | 1597 | punycode@^2.1.0: 1598 | version "2.1.1" 1599 | resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" 1600 | integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== 1601 | 1602 | rc@^1.2.7: 1603 | version "1.2.8" 1604 | resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.8.tgz#cd924bf5200a075b83c188cd6b9e211b7fc0d3ed" 1605 | integrity sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw== 1606 | dependencies: 1607 | deep-extend "^0.6.0" 1608 | ini "~1.3.0" 1609 | minimist "^1.2.0" 1610 | strip-json-comments "~2.0.1" 1611 | 1612 | readable-stream@^2.0.2, readable-stream@^2.0.6: 1613 | version "2.3.6" 1614 | resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.6.tgz#b11c27d88b8ff1fbe070643cf94b0c79ae1b0aaf" 1615 | integrity sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw== 1616 | dependencies: 1617 | core-util-is "~1.0.0" 1618 | inherits "~2.0.3" 1619 | isarray "~1.0.0" 1620 | process-nextick-args "~2.0.0" 1621 | safe-buffer "~5.1.1" 1622 | string_decoder "~1.1.1" 1623 | util-deprecate "~1.0.1" 1624 | 1625 | readdirp@^2.0.0: 1626 | version "2.2.1" 1627 | resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-2.2.1.tgz#0e87622a3325aa33e892285caf8b4e846529a525" 1628 | integrity sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ== 1629 | dependencies: 1630 | graceful-fs "^4.1.11" 1631 | micromatch "^3.1.10" 1632 | readable-stream "^2.0.2" 1633 | 1634 | reflect-metadata@^0.1.13: 1635 | version "0.1.13" 1636 | resolved "https://registry.yarnpkg.com/reflect-metadata/-/reflect-metadata-0.1.13.tgz#67ae3ca57c972a2aa1642b10fe363fe32d49dc08" 1637 | integrity sha512-Ts1Y/anZELhSsjMcU605fU9RE4Oi3p5ORujwbIKXfWa+0Zxs510Qrmrce5/Jowq3cHSZSJqBjypxmHarc+vEWg== 1638 | 1639 | regex-not@^1.0.0, regex-not@^1.0.2: 1640 | version "1.0.2" 1641 | resolved "https://registry.yarnpkg.com/regex-not/-/regex-not-1.0.2.tgz#1f4ece27e00b0b65e0247a6810e6a85d83a5752c" 1642 | integrity sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A== 1643 | dependencies: 1644 | extend-shallow "^3.0.2" 1645 | safe-regex "^1.1.0" 1646 | 1647 | remove-trailing-separator@^1.0.1: 1648 | version "1.1.0" 1649 | resolved "https://registry.yarnpkg.com/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz#c24bce2a283adad5bc3f58e0d48249b92379d8ef" 1650 | integrity sha1-wkvOKig62tW8P1jg1IJJuSN52O8= 1651 | 1652 | repeat-element@^1.1.2: 1653 | version "1.1.3" 1654 | resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.3.tgz#782e0d825c0c5a3bb39731f84efee6b742e6b1ce" 1655 | integrity sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g== 1656 | 1657 | repeat-string@^1.6.1: 1658 | version "1.6.1" 1659 | resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637" 1660 | integrity sha1-jcrkcOHIirwtYA//Sndihtp15jc= 1661 | 1662 | resolve-url@^0.2.1: 1663 | version "0.2.1" 1664 | resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a" 1665 | integrity sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo= 1666 | 1667 | resolve@1.x: 1668 | version "1.11.0" 1669 | resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.11.0.tgz#4014870ba296176b86343d50b60f3b50609ce232" 1670 | integrity sha512-WL2pBDjqT6pGUNSUzMw00o4T7If+z4H2x3Gz893WoUQ5KW8Vr9txp00ykiP16VBaZF5+j/OcXJHZ9+PCvdiDKw== 1671 | dependencies: 1672 | path-parse "^1.0.6" 1673 | 1674 | resolve@^1.3.2: 1675 | version "1.11.1" 1676 | resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.11.1.tgz#ea10d8110376982fef578df8fc30b9ac30a07a3e" 1677 | integrity sha512-vIpgF6wfuJOZI7KKKSP+HmiKggadPQAdsp5HiC1mvqnfp0gF1vdwgBWZIdrVft9pgqoMFQN+R7BSWZiBxx+BBw== 1678 | dependencies: 1679 | path-parse "^1.0.6" 1680 | 1681 | ret@~0.1.10: 1682 | version "0.1.15" 1683 | resolved "https://registry.yarnpkg.com/ret/-/ret-0.1.15.tgz#b8a4825d5bdb1fc3f6f53c2bc33f81388681c7bc" 1684 | integrity sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg== 1685 | 1686 | rimraf@^2.6.1: 1687 | version "2.6.3" 1688 | resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.3.tgz#b2d104fe0d8fb27cf9e0a1cda8262dd3833c6cab" 1689 | integrity sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA== 1690 | dependencies: 1691 | glob "^7.1.3" 1692 | 1693 | rimraf@~2.4.0: 1694 | version "2.4.5" 1695 | resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.4.5.tgz#ee710ce5d93a8fdb856fb5ea8ff0e2d75934b2da" 1696 | integrity sha1-7nEM5dk6j9uFb7Xqj/Di11k0sto= 1697 | dependencies: 1698 | glob "^6.0.1" 1699 | 1700 | rxjs@6.3.3: 1701 | version "6.3.3" 1702 | resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.3.3.tgz#3c6a7fa420e844a81390fb1158a9ec614f4bad55" 1703 | integrity sha512-JTWmoY9tWCs7zvIk/CvRjhjGaOd+OVBM987mxFo+OW66cGpdKjZcpmc74ES1sB//7Kl/PAe8+wEakuhG4pcgOw== 1704 | dependencies: 1705 | tslib "^1.9.0" 1706 | 1707 | rxjs@>=6.4.0: 1708 | version "6.5.2" 1709 | resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.5.2.tgz#2e35ce815cd46d84d02a209fb4e5921e051dbec7" 1710 | integrity sha512-HUb7j3kvb7p7eCUHE3FqjoDsC1xfZQ4AHFWfTKSpZ+sAhhz5X1WX0ZuUqWbzB2QhSLp3DoLUG+hMdEDKqWo2Zg== 1711 | dependencies: 1712 | tslib "^1.9.0" 1713 | 1714 | safe-buffer@^5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1: 1715 | version "5.1.2" 1716 | resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" 1717 | integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== 1718 | 1719 | safe-json-stringify@~1: 1720 | version "1.2.0" 1721 | resolved "https://registry.yarnpkg.com/safe-json-stringify/-/safe-json-stringify-1.2.0.tgz#356e44bc98f1f93ce45df14bcd7c01cda86e0afd" 1722 | integrity sha512-gH8eh2nZudPQO6TytOvbxnuhYBOvDBBLW52tz5q6X58lJcd/tkmqFR+5Z9adS8aJtURSXWThWy/xJtJwixErvg== 1723 | 1724 | safe-regex@^1.1.0: 1725 | version "1.1.0" 1726 | resolved "https://registry.yarnpkg.com/safe-regex/-/safe-regex-1.1.0.tgz#40a3669f3b077d1e943d44629e157dd48023bf2e" 1727 | integrity sha1-QKNmnzsHfR6UPURinhV91IAjvy4= 1728 | dependencies: 1729 | ret "~0.1.10" 1730 | 1731 | "safer-buffer@>= 2.1.2 < 3": 1732 | version "2.1.2" 1733 | resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" 1734 | integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== 1735 | 1736 | sax@^1.2.4: 1737 | version "1.2.4" 1738 | resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9" 1739 | integrity sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw== 1740 | 1741 | semver@^5.3.0, semver@^5.5: 1742 | version "5.7.0" 1743 | resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.0.tgz#790a7cf6fea5459bac96110b29b60412dc8ff96b" 1744 | integrity sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA== 1745 | 1746 | set-blocking@~2.0.0: 1747 | version "2.0.0" 1748 | resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" 1749 | integrity sha1-BF+XgtARrppoA93TgrJDkrPYkPc= 1750 | 1751 | set-value@^0.4.3: 1752 | version "0.4.3" 1753 | resolved "https://registry.yarnpkg.com/set-value/-/set-value-0.4.3.tgz#7db08f9d3d22dc7f78e53af3c3bf4666ecdfccf1" 1754 | integrity sha1-fbCPnT0i3H945Trzw79GZuzfzPE= 1755 | dependencies: 1756 | extend-shallow "^2.0.1" 1757 | is-extendable "^0.1.1" 1758 | is-plain-object "^2.0.1" 1759 | to-object-path "^0.3.0" 1760 | 1761 | set-value@^2.0.0: 1762 | version "2.0.0" 1763 | resolved "https://registry.yarnpkg.com/set-value/-/set-value-2.0.0.tgz#71ae4a88f0feefbbf52d1ea604f3fb315ebb6274" 1764 | integrity sha512-hw0yxk9GT/Hr5yJEYnHNKYXkIA8mVJgd9ditYZCe16ZczcaELYYcfvaXesNACk2O8O0nTiPQcQhGUQj8JLzeeg== 1765 | dependencies: 1766 | extend-shallow "^2.0.1" 1767 | is-extendable "^0.1.1" 1768 | is-plain-object "^2.0.3" 1769 | split-string "^3.0.1" 1770 | 1771 | signal-exit@^3.0.0: 1772 | version "3.0.2" 1773 | resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d" 1774 | integrity sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0= 1775 | 1776 | slash@^1.0.0: 1777 | version "1.0.0" 1778 | resolved "https://registry.yarnpkg.com/slash/-/slash-1.0.0.tgz#c41f2f6c39fc16d1cd17ad4b5d896114ae470d55" 1779 | integrity sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU= 1780 | 1781 | snapdragon-node@^2.0.1: 1782 | version "2.1.1" 1783 | resolved "https://registry.yarnpkg.com/snapdragon-node/-/snapdragon-node-2.1.1.tgz#6c175f86ff14bdb0724563e8f3c1b021a286853b" 1784 | integrity sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw== 1785 | dependencies: 1786 | define-property "^1.0.0" 1787 | isobject "^3.0.0" 1788 | snapdragon-util "^3.0.1" 1789 | 1790 | snapdragon-util@^3.0.1: 1791 | version "3.0.1" 1792 | resolved "https://registry.yarnpkg.com/snapdragon-util/-/snapdragon-util-3.0.1.tgz#f956479486f2acd79700693f6f7b805e45ab56e2" 1793 | integrity sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ== 1794 | dependencies: 1795 | kind-of "^3.2.0" 1796 | 1797 | snapdragon@^0.8.1: 1798 | version "0.8.2" 1799 | resolved "https://registry.yarnpkg.com/snapdragon/-/snapdragon-0.8.2.tgz#64922e7c565b0e14204ba1aa7d6964278d25182d" 1800 | integrity sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg== 1801 | dependencies: 1802 | base "^0.11.1" 1803 | debug "^2.2.0" 1804 | define-property "^0.2.5" 1805 | extend-shallow "^2.0.1" 1806 | map-cache "^0.2.2" 1807 | source-map "^0.5.6" 1808 | source-map-resolve "^0.5.0" 1809 | use "^3.1.0" 1810 | 1811 | source-map-resolve@^0.5.0: 1812 | version "0.5.2" 1813 | resolved "https://registry.yarnpkg.com/source-map-resolve/-/source-map-resolve-0.5.2.tgz#72e2cc34095543e43b2c62b2c4c10d4a9054f259" 1814 | integrity sha512-MjqsvNwyz1s0k81Goz/9vRBe9SZdB09Bdw+/zYyO+3CuPk6fouTaxscHkgtE8jKvf01kVfl8riHzERQ/kefaSA== 1815 | dependencies: 1816 | atob "^2.1.1" 1817 | decode-uri-component "^0.2.0" 1818 | resolve-url "^0.2.1" 1819 | source-map-url "^0.4.0" 1820 | urix "^0.1.0" 1821 | 1822 | source-map-url@^0.4.0: 1823 | version "0.4.0" 1824 | resolved "https://registry.yarnpkg.com/source-map-url/-/source-map-url-0.4.0.tgz#3e935d7ddd73631b97659956d55128e87b5084a3" 1825 | integrity sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM= 1826 | 1827 | source-map@0.7.3: 1828 | version "0.7.3" 1829 | resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.7.3.tgz#5302f8169031735226544092e64981f751750383" 1830 | integrity sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ== 1831 | 1832 | source-map@^0.5.6: 1833 | version "0.5.7" 1834 | resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" 1835 | integrity sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w= 1836 | 1837 | split-string@^3.0.1, split-string@^3.0.2: 1838 | version "3.1.0" 1839 | resolved "https://registry.yarnpkg.com/split-string/-/split-string-3.1.0.tgz#7cb09dda3a86585705c64b39a6466038682e8fe2" 1840 | integrity sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw== 1841 | dependencies: 1842 | extend-shallow "^3.0.0" 1843 | 1844 | sprintf-js@~1.0.2: 1845 | version "1.0.3" 1846 | resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" 1847 | integrity sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw= 1848 | 1849 | static-extend@^0.1.1: 1850 | version "0.1.2" 1851 | resolved "https://registry.yarnpkg.com/static-extend/-/static-extend-0.1.2.tgz#60809c39cbff55337226fd5e0b520f341f1fb5c6" 1852 | integrity sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY= 1853 | dependencies: 1854 | define-property "^0.2.5" 1855 | object-copy "^0.1.0" 1856 | 1857 | stream-blackhole@^1.0.3: 1858 | version "1.0.3" 1859 | resolved "https://registry.yarnpkg.com/stream-blackhole/-/stream-blackhole-1.0.3.tgz#6fc2e2c2e9d9fde6be8c68d3db88de09802e4d63" 1860 | integrity sha1-b8LiwunZ/ea+jGjT24jeCYAuTWM= 1861 | 1862 | string-width@^1.0.1: 1863 | version "1.0.2" 1864 | resolved "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3" 1865 | integrity sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M= 1866 | dependencies: 1867 | code-point-at "^1.0.0" 1868 | is-fullwidth-code-point "^1.0.0" 1869 | strip-ansi "^3.0.0" 1870 | 1871 | "string-width@^1.0.2 || 2": 1872 | version "2.1.1" 1873 | resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e" 1874 | integrity sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw== 1875 | dependencies: 1876 | is-fullwidth-code-point "^2.0.0" 1877 | strip-ansi "^4.0.0" 1878 | 1879 | string_decoder@~1.1.1: 1880 | version "1.1.1" 1881 | resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" 1882 | integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== 1883 | dependencies: 1884 | safe-buffer "~5.1.0" 1885 | 1886 | strip-ansi@^3.0.0, strip-ansi@^3.0.1: 1887 | version "3.0.1" 1888 | resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf" 1889 | integrity sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8= 1890 | dependencies: 1891 | ansi-regex "^2.0.0" 1892 | 1893 | strip-ansi@^4.0.0: 1894 | version "4.0.0" 1895 | resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-4.0.0.tgz#a8479022eb1ac368a871389b635262c505ee368f" 1896 | integrity sha1-qEeQIusaw2iocTibY1JixQXuNo8= 1897 | dependencies: 1898 | ansi-regex "^3.0.0" 1899 | 1900 | strip-json-comments@~2.0.1: 1901 | version "2.0.1" 1902 | resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" 1903 | integrity sha1-PFMZQukIwml8DsNEhYwobHygpgo= 1904 | 1905 | supports-color@^5.3.0: 1906 | version "5.5.0" 1907 | resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" 1908 | integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== 1909 | dependencies: 1910 | has-flag "^3.0.0" 1911 | 1912 | tar@^4: 1913 | version "4.4.8" 1914 | resolved "https://registry.yarnpkg.com/tar/-/tar-4.4.8.tgz#b19eec3fde2a96e64666df9fdb40c5ca1bc3747d" 1915 | integrity sha512-LzHF64s5chPQQS0IYBn9IN5h3i98c12bo4NCO7e0sGM2llXQ3p2FGC5sdENN4cTW48O915Sh+x+EXx7XW96xYQ== 1916 | dependencies: 1917 | chownr "^1.1.1" 1918 | fs-minipass "^1.2.5" 1919 | minipass "^2.3.4" 1920 | minizlib "^1.1.1" 1921 | mkdirp "^0.5.0" 1922 | safe-buffer "^5.1.2" 1923 | yallist "^3.0.2" 1924 | 1925 | timers-ext@^0.1.5: 1926 | version "0.1.7" 1927 | resolved "https://registry.yarnpkg.com/timers-ext/-/timers-ext-0.1.7.tgz#6f57ad8578e07a3fb9f91d9387d65647555e25c6" 1928 | integrity sha512-b85NUNzTSdodShTIbky6ZF02e8STtVVfD+fu4aXXShEELpozH+bCpJLYMPZbsABN2wDH7fJpqIoXxJpzbf0NqQ== 1929 | dependencies: 1930 | es5-ext "~0.10.46" 1931 | next-tick "1" 1932 | 1933 | to-object-path@^0.3.0: 1934 | version "0.3.0" 1935 | resolved "https://registry.yarnpkg.com/to-object-path/-/to-object-path-0.3.0.tgz#297588b7b0e7e0ac08e04e672f85c1f4999e17af" 1936 | integrity sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68= 1937 | dependencies: 1938 | kind-of "^3.0.2" 1939 | 1940 | to-regex-range@^2.1.0: 1941 | version "2.1.1" 1942 | resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-2.1.1.tgz#7c80c17b9dfebe599e27367e0d4dd5590141db38" 1943 | integrity sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg= 1944 | dependencies: 1945 | is-number "^3.0.0" 1946 | repeat-string "^1.6.1" 1947 | 1948 | to-regex@^3.0.1, to-regex@^3.0.2: 1949 | version "3.0.2" 1950 | resolved "https://registry.yarnpkg.com/to-regex/-/to-regex-3.0.2.tgz#13cfdd9b336552f30b51f33a8ae1b42a7a7599ce" 1951 | integrity sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw== 1952 | dependencies: 1953 | define-property "^2.0.2" 1954 | extend-shallow "^3.0.2" 1955 | regex-not "^1.0.2" 1956 | safe-regex "^1.1.0" 1957 | 1958 | ts-jest@^24.0.2: 1959 | version "24.0.2" 1960 | resolved "https://registry.yarnpkg.com/ts-jest/-/ts-jest-24.0.2.tgz#8dde6cece97c31c03e80e474c749753ffd27194d" 1961 | integrity sha512-h6ZCZiA1EQgjczxq+uGLXQlNgeg02WWJBbeT8j6nyIBRQdglqbvzDoHahTEIiS6Eor6x8mK6PfZ7brQ9Q6tzHw== 1962 | dependencies: 1963 | bs-logger "0.x" 1964 | buffer-from "1.x" 1965 | fast-json-stable-stringify "2.x" 1966 | json5 "2.x" 1967 | make-error "1.x" 1968 | mkdirp "0.x" 1969 | resolve "1.x" 1970 | semver "^5.5" 1971 | yargs-parser "10.x" 1972 | 1973 | ts-morph@^1.3.1: 1974 | version "1.3.3" 1975 | resolved "https://registry.yarnpkg.com/ts-morph/-/ts-morph-1.3.3.tgz#ce4026699691db9bd297c039189f0fe4cc0fac4b" 1976 | integrity sha512-TO4xmC4yKSoOSjuIGBlYOkPSQhY4dC6/8ksEH+1jlt7XUk6fmLshn97wwchMQxz1ejSd2DSxEk+pC5cqDYlUzg== 1977 | dependencies: 1978 | "@dsherret/to-absolute-glob" "^2.0.2" 1979 | code-block-writer "7.2.2" 1980 | fs-extra "^7.0.0" 1981 | glob-parent "^3.1.0" 1982 | globby "^8.0.1" 1983 | is-negated-glob "^1.0.0" 1984 | multimatch "^2.1.0" 1985 | tslib "^1.9.0" 1986 | typescript ">=3.0.1 <3.5.0" 1987 | 1988 | tslib@^1.8.0, tslib@^1.8.1: 1989 | version "1.10.0" 1990 | resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.10.0.tgz#c3c19f95973fb0a62973fb09d90d961ee43e5c8a" 1991 | integrity sha512-qOebF53frne81cf0S9B41ByenJ3/IuH8yJKngAX35CmiZySA0khhkovshKK+jGCaMnVomla7gVlIcc3EvKPbTQ== 1992 | 1993 | tslib@^1.9.0: 1994 | version "1.9.3" 1995 | resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.9.3.tgz#d7e4dd79245d85428c4d7e4822a79917954ca286" 1996 | integrity sha512-4krF8scpejhaOgqzBEcGM7yDIEfi0/8+8zDRZhNZZ2kjmHJ4hv3zCbQWxoJGz1iw5U0Jl0nma13xzHXcncMavQ== 1997 | 1998 | tslint@5.20.1: 1999 | version "5.20.1" 2000 | resolved "https://registry.yarnpkg.com/tslint/-/tslint-5.20.1.tgz#e401e8aeda0152bc44dd07e614034f3f80c67b7d" 2001 | integrity sha512-EcMxhzCFt8k+/UP5r8waCf/lzmeSyVlqxqMEDQE7rWYiQky8KpIBz1JAoYXfROHrPZ1XXd43q8yQnULOLiBRQg== 2002 | dependencies: 2003 | "@babel/code-frame" "^7.0.0" 2004 | builtin-modules "^1.1.1" 2005 | chalk "^2.3.0" 2006 | commander "^2.12.1" 2007 | diff "^4.0.1" 2008 | glob "^7.1.1" 2009 | js-yaml "^3.13.1" 2010 | minimatch "^3.0.4" 2011 | mkdirp "^0.5.1" 2012 | resolve "^1.3.2" 2013 | semver "^5.3.0" 2014 | tslib "^1.8.0" 2015 | tsutils "^2.29.0" 2016 | 2017 | tsutils@^2.29.0: 2018 | version "2.29.0" 2019 | resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-2.29.0.tgz#32b488501467acbedd4b85498673a0812aca0b99" 2020 | integrity sha512-g5JVHCIJwzfISaXpXE1qvNalca5Jwob6FjI4AoPlqMusJ6ftFE7IkkFoMhVLRgK+4Kx3gkzb8UZK5t5yTTvEmA== 2021 | dependencies: 2022 | tslib "^1.8.1" 2023 | 2024 | "typescript@>=3.0.1 <3.5.0", typescript@^3.2.2, typescript@^3.2.4: 2025 | version "3.4.5" 2026 | resolved "https://registry.yarnpkg.com/typescript/-/typescript-3.4.5.tgz#2d2618d10bb566572b8d7aad5180d84257d70a99" 2027 | integrity sha512-YycBxUb49UUhdNMU5aJ7z5Ej2XGmaIBL0x34vZ82fn3hGvD+bgrMrVDpatgz2f7YxUMJxMkbWxJZeAvDxVe7Vw== 2028 | 2029 | unc-path-regex@^0.1.2: 2030 | version "0.1.2" 2031 | resolved "https://registry.yarnpkg.com/unc-path-regex/-/unc-path-regex-0.1.2.tgz#e73dd3d7b0d7c5ed86fbac6b0ae7d8c6a69d50fa" 2032 | integrity sha1-5z3T17DXxe2G+6xrCufYxqadUPo= 2033 | 2034 | union-value@^1.0.0: 2035 | version "1.0.0" 2036 | resolved "https://registry.yarnpkg.com/union-value/-/union-value-1.0.0.tgz#5c71c34cb5bad5dcebe3ea0cd08207ba5aa1aea4" 2037 | integrity sha1-XHHDTLW61dzr4+oM0IIHulqhrqQ= 2038 | dependencies: 2039 | arr-union "^3.1.0" 2040 | get-value "^2.0.6" 2041 | is-extendable "^0.1.1" 2042 | set-value "^0.4.3" 2043 | 2044 | universalify@^0.1.0: 2045 | version "0.1.2" 2046 | resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66" 2047 | integrity sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg== 2048 | 2049 | unset-value@^1.0.0: 2050 | version "1.0.0" 2051 | resolved "https://registry.yarnpkg.com/unset-value/-/unset-value-1.0.0.tgz#8376873f7d2335179ffb1e6fc3a8ed0dfc8ab559" 2052 | integrity sha1-g3aHP30jNRef+x5vw6jtDfyKtVk= 2053 | dependencies: 2054 | has-value "^0.3.1" 2055 | isobject "^3.0.0" 2056 | 2057 | upath@^1.0.5: 2058 | version "1.1.2" 2059 | resolved "https://registry.yarnpkg.com/upath/-/upath-1.1.2.tgz#3db658600edaeeccbe6db5e684d67ee8c2acd068" 2060 | integrity sha512-kXpym8nmDmlCBr7nKdIx8P2jNBa+pBpIUFRnKJ4dr8htyYGJFokkr2ZvERRtUN+9SY+JqXouNgUPtv6JQva/2Q== 2061 | 2062 | uri-js@^4.2.2: 2063 | version "4.2.2" 2064 | resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.2.2.tgz#94c540e1ff772956e2299507c010aea6c8838eb0" 2065 | integrity sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ== 2066 | dependencies: 2067 | punycode "^2.1.0" 2068 | 2069 | urix@^0.1.0: 2070 | version "0.1.0" 2071 | resolved "https://registry.yarnpkg.com/urix/-/urix-0.1.0.tgz#da937f7a62e21fec1fd18d49b35c2935067a6c72" 2072 | integrity sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI= 2073 | 2074 | use@^3.1.0: 2075 | version "3.1.1" 2076 | resolved "https://registry.yarnpkg.com/use/-/use-3.1.1.tgz#d50c8cac79a19fbc20f2911f56eb973f4e10070f" 2077 | integrity sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ== 2078 | 2079 | util-deprecate@~1.0.1: 2080 | version "1.0.2" 2081 | resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" 2082 | integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8= 2083 | 2084 | utility-types@^3.7.0: 2085 | version "3.7.0" 2086 | resolved "https://registry.yarnpkg.com/utility-types/-/utility-types-3.7.0.tgz#51f1c29fa35d4267488345706efcf3f68f2b1933" 2087 | integrity sha512-mqRJXN7dEArK/NZNJUubjr9kbFFVZcmF/JHDc9jt5O/aYXUVmopHYujDMhLmLil1Bxo2+khe6KAIVvDH9Yc4VA== 2088 | 2089 | uuid@3.3.2: 2090 | version "3.3.2" 2091 | resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.3.2.tgz#1b4af4955eb3077c501c23872fc6513811587131" 2092 | integrity sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA== 2093 | 2094 | wide-align@^1.1.0: 2095 | version "1.1.3" 2096 | resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.3.tgz#ae074e6bdc0c14a431e804e624549c633b000457" 2097 | integrity sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA== 2098 | dependencies: 2099 | string-width "^1.0.2 || 2" 2100 | 2101 | wrappy@1: 2102 | version "1.0.2" 2103 | resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" 2104 | integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= 2105 | 2106 | yallist@^3.0.0, yallist@^3.0.2: 2107 | version "3.0.3" 2108 | resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.0.3.tgz#b4b049e314be545e3ce802236d6cd22cd91c3de9" 2109 | integrity sha512-S+Zk8DEWE6oKpV+vI3qWkaK+jSbIK86pCwe2IF/xwIpQ8jEuxpw9NyaGjmp9+BoJv5FV2piqCDcoCtStppiq2A== 2110 | 2111 | yargs-parser@10.x: 2112 | version "10.1.0" 2113 | resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-10.1.0.tgz#7202265b89f7e9e9f2e5765e0fe735a905edbaa8" 2114 | integrity sha512-VCIyR1wJoEBZUqk5PA+oOBF6ypbwh5aNB3I50guxAL/quggdfs4TtNHQrSazFA3fYZ+tEqfs0zIGlv0c/rgjbQ== 2115 | dependencies: 2116 | camelcase "^4.1.0" 2117 | --------------------------------------------------------------------------------