diff --git a/.gitignore b/.gitignore index 42c117c643..8facee1ab1 100644 --- a/.gitignore +++ b/.gitignore @@ -11,7 +11,7 @@ node_modules/ .idea -*/yarn-error.log +yarn-error.log # Konnectd konnectd/assets/identifier diff --git a/ocis/go.mod b/ocis/go.mod index 01ca7ada1a..3cdf426f4b 100644 --- a/ocis/go.mod +++ b/ocis/go.mod @@ -53,4 +53,5 @@ replace ( github.com/owncloud/ocis/thumbnails => ../thumbnails github.com/owncloud/ocis/webdav => ../webdav google.golang.org/grpc => google.golang.org/grpc v1.26.0 + github.com/cs3org/reva => ../../../cs3org/reva ) diff --git a/tests/k6/.eslintignore b/tests/k6/.eslintignore new file mode 100644 index 0000000000..76add878f8 --- /dev/null +++ b/tests/k6/.eslintignore @@ -0,0 +1,2 @@ +node_modules +dist \ No newline at end of file diff --git a/tests/k6/.eslintrc b/tests/k6/.eslintrc new file mode 100644 index 0000000000..a68b151723 --- /dev/null +++ b/tests/k6/.eslintrc @@ -0,0 +1,14 @@ +{ + "parser": "@typescript-eslint/parser", + "parserOptions": { + "ecmaVersion": 2020, + "sourceType": "module" + }, + "extends": [ + "plugin:@typescript-eslint/recommended", + "prettier/@typescript-eslint", + "plugin:prettier/recommended" + ], + "rules": { + } +} \ No newline at end of file diff --git a/tests/k6/.prettierrc b/tests/k6/.prettierrc new file mode 100644 index 0000000000..c5d3c0a5ae --- /dev/null +++ b/tests/k6/.prettierrc @@ -0,0 +1,7 @@ +{ + "semi": true, + "trailingComma": "all", + "singleQuote": true, + "printWidth": 120, + "tabWidth": 4 +} \ No newline at end of file diff --git a/tests/k6/package.json b/tests/k6/package.json index 3dcacc9d77..980ce8bed6 100644 --- a/tests/k6/package.json +++ b/tests/k6/package.json @@ -4,9 +4,20 @@ "main": "index.js", "scripts": { "clean": "rm -rf ./dist", + "lint": "eslint './src/**/*.ts' --fix", "build": "rollup -c", "build:w": "rollup -c -w" }, + "husky": { + "hooks": { + "pre-commit": "lint-staged" + } + }, + "lint-staged": { + "*.{ts}": [ + "eslint --fix" + ] + }, "devDependencies": { "@babel/core": "^7.9.0", "@babel/polyfill": "^7.12.1", @@ -18,26 +29,26 @@ "@rollup/plugin-json": "^4.0.3", "@rollup/plugin-node-resolve": "^7.1.3", "@rollup/pluginutils": "^4.1.0", - "@types/faker": "^5.1.4", - "@types/jest": "^25.2.1", "@types/k6": "^0.28.2", "@types/lodash": "^4.14.165", - "@typescript-eslint/eslint-plugin": "^2.29.0", - "@typescript-eslint/parser": "^2.29.0", + "@typescript-eslint/eslint-plugin": "^4.9.0", + "@typescript-eslint/parser": "^4.9.0", "babel-plugin-lodash": "^3.3.4", - "eslint": "^6.8.0", - "eslint-config-prettier": "^6.11.0", + "eslint": "^7.14.0", + "eslint-config-prettier": "^6.15.0", "eslint-plugin-jest": "^23.8.2", - "eslint-plugin-prettier": "^3.1.3", + "eslint-plugin-prettier": "^3.2.0", + "husky": "^4.3.0", "jest": "^25.4.0", "k6": "^0.0.0", "lint-staged": "^10.1.7", - "prettier": "^2.0.5", + "prettier": "^2.2.1", + "prettier-eslint": "^12.0.0", "rollup": "^2.7.2", "rollup-plugin-babel": "^4.4.0", "rollup-plugin-multi-input": "^1.1.1", "rollup-plugin-terser": "^5.3.0", - "typescript": "^3.8.3" + "typescript": "^4.1.2" }, "dependencies": { "lodash": "^4.17.20", diff --git a/tests/k6/src/lib/api/api.ts b/tests/k6/src/lib/api/api.ts index 7ba632d1b8..d09cc74668 100644 --- a/tests/k6/src/lib/api/api.ts +++ b/tests/k6/src/lib/api/api.ts @@ -1,41 +1,52 @@ import encoding from 'k6/encoding'; import * as types from '../types'; -import * as defaults from "../defaults"; -import {merge} from 'lodash'; -import http, {RefinedParams, RefinedResponse, RequestBody, ResponseType} from "k6/http"; +import * as defaults from '../defaults'; +import { merge } from 'lodash'; +import http, { RefinedParams, RefinedResponse, RequestBody, ResponseType } from 'k6/http'; +import { bytes } from 'k6'; -export const buildHeaders = ({credential}: { credential: types.Credential }): { [key: string]: string } => { +export const buildHeaders = ({ credential }: { credential?: types.Credential }): { [key: string]: string } => { const isOIDCGuard = (credential as types.Token).tokenType !== undefined; const authOIDC = credential as types.Token; const authBasic = credential as types.Account; return { - Authorization: isOIDCGuard ? `${authOIDC.tokenType} ${authOIDC.accessToken}` : `Basic ${encoding.b64encode(`${authBasic.login}:${authBasic.password}`)}`, - } -} + ...(credential && { + Authorization: isOIDCGuard + ? `${authOIDC.tokenType} ${authOIDC.accessToken}` + : `Basic ${encoding.b64encode(`${authBasic.login}:${authBasic.password}`)}`, + }), + }; +}; -export const buildURL = ({path}: { path: string }): string => { - return [ - defaults.ENV.HOST, - ...path.split('/').filter(Boolean) - ].join('/') -} +export const buildURL = ({ path }: { path: string }): string => { + return [defaults.ENV.HOST, ...path.split('/').filter(Boolean)].join('/'); +}; -export const request = ({method, path, body = {}, params = {}, credential}: { - method: 'PROPFIND' | 'PUT' | 'GET' | 'DELETE' | 'MKCOL', - path: string, +export const request = ({ + method, + path, + body = {}, + params = {}, + credential, +}: { + method: 'PROPFIND' | 'PUT' | 'GET' | 'POST' | 'DELETE' | 'MKCOL'; + path: string; credential: types.Credential; - body?: RequestBody | null, - params?: RefinedParams | null + body?: RequestBody | bytes | null; + params?: RefinedParams | null; }): RefinedResponse => { return http.request( method, - buildURL({path}), - body, - merge({ - headers: { - ...buildHeaders({credential}) - } - }, params) + buildURL({ path }), + body as never, + merge( + { + headers: { + ...buildHeaders({ credential }), + }, + }, + params, + ), ); -} \ No newline at end of file +}; diff --git a/tests/k6/src/lib/api/dav.ts b/tests/k6/src/lib/api/dav.ts index 722e3ad0b5..ea74a25095 100644 --- a/tests/k6/src/lib/api/dav.ts +++ b/tests/k6/src/lib/api/dav.ts @@ -1,59 +1,111 @@ -import {RefinedResponse, ResponseType} from 'k6/http'; -import * as api from './api' +import { RefinedResponse, ResponseType } from 'k6/http'; +import * as api from './api'; import * as types from '../types'; export class Upload { - public static exec({credential, userName, path = '', asset, tags}: { + public static exec({ + credential, + userName, + path = '', + asset, + tags, + }: { credential: types.Credential; userName: string; asset: types.Asset; path?: string; tags?: types.Tags; }): RefinedResponse { - return api.request({method: 'PUT', credential, path: `/remote.php/dav/files/${userName}/${path}/${asset.name}`, params: {tags}, body: asset.bytes as any}) + return api.request({ + method: 'PUT', + credential, + path: `/remote.php/dav/files/${userName}/${path}/${asset.name}`, + params: { tags }, + body: asset.bytes, + }); } } export class Download { - public static exec({credential, userName, path, tags}: { + public static exec({ + credential, + userName, + path, + tags, + }: { credential: types.Credential; userName: string; path: string; tags?: types.Tags; }): RefinedResponse { - return api.request({method: 'GET', credential, path: `/remote.php/dav/files/${userName}/${path}`, params: {tags}}) + return api.request({ + method: 'GET', + credential, + path: `/remote.php/dav/files/${userName}/${path}`, + params: { tags }, + }); } } export class Delete { - public static exec({credential, userName, path, tags}: { + public static exec({ + credential, + userName, + path, + tags, + }: { credential: types.Credential; userName: string; path: string; tags?: types.Tags; }): RefinedResponse { - return api.request({method: 'DELETE', credential, path: `/remote.php/dav/files/${userName}/${path}`, params: {tags}}) + return api.request({ + method: 'DELETE', + credential, + path: `/remote.php/dav/files/${userName}/${path}`, + params: { tags }, + }); } } export class Create { - public static exec({credential, userName, path, tags}: { + public static exec({ + credential, + userName, + path, + tags, + }: { credential: types.Credential; userName: string; path: string; tags?: types.Tags; }): RefinedResponse { - return api.request({method: 'MKCOL', credential, path: `/remote.php/dav/files/${userName}/${path}`, params: {tags}}) + return api.request({ + method: 'MKCOL', + credential, + path: `/remote.php/dav/files/${userName}/${path}`, + params: { tags }, + }); } } export class Propfind { - public static exec({credential, userName, path = '', tags}: { + public static exec({ + credential, + userName, + path = '', + tags, + }: { credential: types.Credential; userName: string; path?: string; tags?: types.Tags; }): RefinedResponse { - return api.request({method: 'PROPFIND', credential, path: `/remote.php/dav/files/${userName}/${path}`, params: {tags}}) + return api.request({ + method: 'PROPFIND', + credential, + path: `/remote.php/dav/files/${userName}/${path}`, + params: { tags }, + }); } -} \ No newline at end of file +} diff --git a/tests/k6/src/lib/api/index.ts b/tests/k6/src/lib/api/index.ts index 9219d4ba2a..cbc6d4d6d4 100644 --- a/tests/k6/src/lib/api/index.ts +++ b/tests/k6/src/lib/api/index.ts @@ -1,2 +1,3 @@ -export * as api from './api' -export * as dav from './dav' +export * as api from './api'; +export * as dav from './dav'; +export * as users from './users'; diff --git a/tests/k6/src/lib/api/users.ts b/tests/k6/src/lib/api/users.ts new file mode 100644 index 0000000000..75a0dbf248 --- /dev/null +++ b/tests/k6/src/lib/api/users.ts @@ -0,0 +1,46 @@ +import { RefinedResponse, ResponseType } from 'k6/http'; +import * as api from './api'; +import * as types from '../types'; + +export class Create { + public static exec({ + userName, + password, + email, + credential, + tags, + }: { + credential: types.Credential; + userName: string; + password: string; + email: string; + tags?: types.Tags; + }): RefinedResponse { + return api.request({ + method: 'POST', + credential, + path: `/ocs/v1.php/cloud/users`, + params: { tags }, + body: { userid: userName, password, email }, + }); + } +} + +export class Delete { + public static exec({ + userName, + credential, + tags, + }: { + credential: types.Credential; + userName: string; + tags?: types.Tags; + }): RefinedResponse { + return api.request({ + method: 'DELETE', + credential, + path: `/ocs/v1.php/cloud/users/${userName}`, + params: { tags }, + }); + } +} diff --git a/tests/k6/src/lib/auth.ts b/tests/k6/src/lib/auth.ts index 6622b4be71..3aa21e8bff 100644 --- a/tests/k6/src/lib/auth.ts +++ b/tests/k6/src/lib/auth.ts @@ -2,9 +2,8 @@ import * as defaults from './defaults'; import http from 'k6/http'; import queryString from 'query-string'; import * as types from './types'; -import {fail} from 'k6'; -import {get} from 'lodash' - +import { fail } from 'k6'; +import { get } from 'lodash'; export default class Factory { private provider!: types.AuthProvider; @@ -15,14 +14,14 @@ export default class Factory { if (defaults.ENV.OIDC_ENABLED) { this.provider = new OIDCProvider(account); - return + return; } this.provider = new AccountProvider(account); } public get credential(): types.Credential { - return this.provider.credential + return this.provider.credential; } } @@ -46,7 +45,7 @@ class OIDCProvider implements types.AuthProvider { private cache!: { validTo: Date; token: types.Token; - } + }; constructor(account: types.Account) { this.account = account; @@ -63,12 +62,12 @@ class OIDCProvider implements types.AuthProvider { const offset = 5; const d = new Date(); - d.setSeconds(d.getSeconds() + token.expiresIn - offset) + d.setSeconds(d.getSeconds() + token.expiresIn - offset); - return d + return d; })(), token, - } + }; } return this.cache.token; @@ -77,18 +76,16 @@ class OIDCProvider implements types.AuthProvider { private getContinueURI(): string { const logonResponse = http.post( this.logonUri, - JSON.stringify( - { - params: [this.account.login, this.account.password, '1'], - hello: { - scope: 'openid profile email', - client_id: 'phoenix', - redirect_uri: this.redirectUri, - flow: 'oidc' - }, - 'state': 'vp42cf' + JSON.stringify({ + params: [this.account.login, this.account.password, '1'], + hello: { + scope: 'openid profile email', + client_id: 'phoenix', + redirect_uri: this.redirectUri, + flow: 'oidc', }, - ), + state: 'vp42cf', + }), { headers: { 'Kopano-Konnect-XSRF': '1', @@ -107,53 +104,49 @@ class OIDCProvider implements types.AuthProvider { } private getCode(continueURI: string): string { - const authorizeUri = `${continueURI}?${ - queryString.stringify( - { - client_id: 'phoenix', - prompt: 'none', - redirect_uri: this.redirectUri, - response_mode: 'query', - response_type: 'code', - scope: 'openid profile email', - }, - ) - }`; - const authorizeResponse = http.get( - authorizeUri, - { - redirects: 0, - }, - ) + const authorizeUri = `${continueURI}?${queryString.stringify({ + client_id: 'phoenix', + prompt: 'none', + redirect_uri: this.redirectUri, + response_mode: 'query', + response_type: 'code', + scope: 'openid profile email', + })}`; + const authorizeResponse = http.get(authorizeUri, { + redirects: 0, + }); - const code = get(queryString.parseUrl(authorizeResponse.headers.Location), 'query.code') + const code = get(queryString.parseUrl(authorizeResponse.headers.Location), 'query.code'); if (authorizeResponse.status != 302 || !code) { fail(continueURI); } - return code + return code; } private getToken(code: string): types.Token { - const tokenResponse = http.post( - this.tokenUrl, - { - client_id: 'phoenix', - code, - redirect_uri: this.redirectUri, - grant_type: 'authorization_code' - } - ) + const tokenResponse = http.post(this.tokenUrl, { + client_id: 'phoenix', + code, + redirect_uri: this.redirectUri, + grant_type: 'authorization_code', + }); const token = { accessToken: get(tokenResponse.json(), 'access_token'), tokenType: get(tokenResponse.json(), 'token_type'), idToken: get(tokenResponse.json(), 'id_token'), expiresIn: get(tokenResponse.json(), 'expires_in'), - } + }; - if (tokenResponse.status != 200 || !token.accessToken || !token.tokenType || !token.idToken || !token.expiresIn) { + if ( + tokenResponse.status != 200 || + !token.accessToken || + !token.tokenType || + !token.idToken || + !token.expiresIn + ) { fail(this.tokenUrl); } diff --git a/tests/k6/src/lib/defaults.ts b/tests/k6/src/lib/defaults.ts index 4e2deac520..401a2f0d40 100644 --- a/tests/k6/src/lib/defaults.ts +++ b/tests/k6/src/lib/defaults.ts @@ -9,9 +9,14 @@ export class ENV { } export class ACCOUNTS { + public static readonly ADMIN = 'admin'; public static readonly EINSTEIN = 'einstein'; public static readonly RICHARD = 'richard'; - public static readonly ALL: { [key: string]: types.Account; } = { + public static readonly ALL: { [key: string]: types.Account } = { + admin: { + login: 'admin', + password: 'admin', + }, einstein: { login: 'einstein', password: 'relativity', @@ -20,5 +25,5 @@ export class ACCOUNTS { login: 'richard', password: 'superfluidity', }, - } -} \ No newline at end of file + }; +} diff --git a/tests/k6/src/lib/index.ts b/tests/k6/src/lib/index.ts index fe9d944220..056deecb97 100644 --- a/tests/k6/src/lib/index.ts +++ b/tests/k6/src/lib/index.ts @@ -1,6 +1,6 @@ -export * as api from './api' -export * as playbook from './playbook' -export * as auth from './auth' -export * as defaults from './defaults' -export * as types from './types' -export * as utils from './utils' +export * as api from './api'; +export * as playbook from './playbook'; +export * as auth from './auth'; +export * as defaults from './defaults'; +export * as types from './types'; +export * as utils from './utils'; diff --git a/tests/k6/src/lib/playbook/dav.ts b/tests/k6/src/lib/playbook/dav.ts index 07f97d3e41..ec9996dcec 100644 --- a/tests/k6/src/lib/playbook/dav.ts +++ b/tests/k6/src/lib/playbook/dav.ts @@ -1,141 +1,177 @@ import * as api from '../api'; -import {check} from 'k6'; +import { check } from 'k6'; import * as types from '../types'; -import {RefinedResponse, ResponseType} from 'k6/http'; -import {Play} from "./playbook"; +import { RefinedResponse, ResponseType } from 'k6/http'; +import { Play } from './playbook'; export class Upload extends Play { - constructor({name, metricID = 'default'}: { name?: string; metricID?: string; }) { - super({name: name || `oc_${metricID}_play_dav_upload`}); + constructor({ name, metricID = 'default' }: { name?: string; metricID?: string } = {}) { + super({ name: name || `oc_${metricID}_play_dav_upload` }); } - public exec( - {credential, userName, path, asset, tags}: { - credential: types.Credential; - path?: string; - userName: string; - asset: types.Asset; - tags?: types.Tags; - } - ): { response: RefinedResponse; tags: types.Tags; } { - tags = {...this.tags, ...tags}; + public exec({ + credential, + userName, + path, + asset, + tags, + }: { + credential: types.Credential; + path?: string; + userName: string; + asset: types.Asset; + tags?: types.Tags; + }): { response: RefinedResponse; tags: types.Tags } { + tags = { ...this.tags, ...tags }; - const response = api.dav.Upload.exec({credential: credential as types.Credential, asset, userName, tags, path}); + const response = api.dav.Upload.exec({ credential: credential, asset, userName, tags, path }); - check(response, { - 'upload status is 201': () => response.status === 201, - }, tags) || this.metricErrorRate.add(1, tags); + check( + response, + { + 'dav upload status is 201': () => response.status === 201, + }, + tags, + ) || this.metricErrorRate.add(1, tags); - this.metricTrend.add(response.timings.duration, tags) + this.metricTrend.add(response.timings.duration, tags); - return {response, tags} + return { response, tags }; } } export class Delete extends Play { - constructor({name, metricID = 'default'}: { name?: string; metricID?: string; }) { - super({name: name || `oc_${metricID}_play_dav_delete`}); + constructor({ name, metricID = 'default' }: { name?: string; metricID?: string } = {}) { + super({ name: name || `oc_${metricID}_play_dav_delete` }); } - public exec( - {credential, userName, path, tags}: { - credential: types.Credential; - path: string; - userName: string; - tags?: types.Tags; - } - ): { response: RefinedResponse; tags: types.Tags; } { - tags = {...this.tags, ...tags}; + public exec({ + credential, + userName, + path, + tags, + }: { + credential: types.Credential; + path: string; + userName: string; + tags?: types.Tags; + }): { response: RefinedResponse; tags: types.Tags } { + tags = { ...this.tags, ...tags }; - const response = api.dav.Delete.exec({credential: credential as types.Credential, userName, tags, path}); + const response = api.dav.Delete.exec({ credential: credential, userName, tags, path }); - check(response, { - 'delete status is 204': () => response.status === 204, - }, tags) || this.metricErrorRate.add(1, tags); + check( + response, + { + 'dav delete status is 204': () => response.status === 204, + }, + tags, + ) || this.metricErrorRate.add(1, tags); - this.metricTrend.add(response.timings.duration, tags) + this.metricTrend.add(response.timings.duration, tags); - return {response, tags} + return { response, tags }; } } export class Download extends Play { - constructor({name, metricID = 'default'}: { name?: string; metricID?: string; }) { - super({name: name || `oc_${metricID}_play_dav_download`}); + constructor({ name, metricID = 'default' }: { name?: string; metricID?: string } = {}) { + super({ name: name || `oc_${metricID}_play_dav_download` }); } - public exec( - {credential, userName, path, tags}: { - credential: types.Credential; - path: string; - userName: string; - tags?: types.Tags; - } - ): { response: RefinedResponse; tags: types.Tags; } { - tags = {...this.tags, ...tags}; + public exec({ + credential, + userName, + path, + tags, + }: { + credential: types.Credential; + path: string; + userName: string; + tags?: types.Tags; + }): { response: RefinedResponse; tags: types.Tags } { + tags = { ...this.tags, ...tags }; - const response = api.dav.Download.exec({credential: credential as types.Credential, userName, tags, path}); + const response = api.dav.Download.exec({ credential: credential, userName, tags, path }); - check(response, { - 'download status is 200': () => response.status === 200, - }, tags) || this.metricErrorRate.add(1, tags); + check( + response, + { + 'dav download status is 200': () => response.status === 200, + }, + tags, + ) || this.metricErrorRate.add(1, tags); - this.metricTrend.add(response.timings.duration, tags) + this.metricTrend.add(response.timings.duration, tags); - return {response, tags} + return { response, tags }; } } export class Create extends Play { - constructor({name, metricID = 'default'}: { name?: string; metricID?: string; }) { - super({name: name || `oc_${metricID}_play_dav_create`}); + constructor({ name, metricID = 'default' }: { name?: string; metricID?: string } = {}) { + super({ name: name || `oc_${metricID}_play_dav_create` }); } - public exec( - {credential, userName, path, tags}: { - credential: types.Credential; - path: string; - userName: string; - tags?: types.Tags; - } - ): { response: RefinedResponse; tags: types.Tags; } { - tags = {...this.tags, ...tags}; + public exec({ + credential, + userName, + path, + tags, + }: { + credential: types.Credential; + path: string; + userName: string; + tags?: types.Tags; + }): { response: RefinedResponse; tags: types.Tags } { + tags = { ...this.tags, ...tags }; - const response = api.dav.Create.exec({credential: credential as types.Credential, userName, tags, path}); + const response = api.dav.Create.exec({ credential: credential, userName, tags, path }); - check(response, { - 'create status is 201': () => response.status === 201, - }, tags) || this.metricErrorRate.add(1, tags); + check( + response, + { + 'dav create status is 201': () => response.status === 201, + }, + tags, + ) || this.metricErrorRate.add(1, tags); - this.metricTrend.add(response.timings.duration, tags) + this.metricTrend.add(response.timings.duration, tags); - return {response, tags} + return { response, tags }; } } export class Propfind extends Play { - constructor({name, metricID = 'default'}: { name?: string; metricID?: string; }) { - super({name: name || `oc_${metricID}_play_dav_propfind`}); + constructor({ name, metricID = 'default' }: { name?: string; metricID?: string } = {}) { + super({ name: name || `oc_${metricID}_play_dav_propfind` }); } - public exec( - {credential, userName, path, tags}: { - credential: types.Credential; - path?: string; - userName: string; - tags?: types.Tags; - } - ): { response: RefinedResponse; tags: types.Tags; } { - tags = {...this.tags, ...tags}; + public exec({ + credential, + userName, + path, + tags, + }: { + credential: types.Credential; + path?: string; + userName: string; + tags?: types.Tags; + }): { response: RefinedResponse; tags: types.Tags } { + tags = { ...this.tags, ...tags }; - const response = api.dav.Propfind.exec({credential: credential as types.Credential, userName, tags, path}); + const response = api.dav.Propfind.exec({ credential: credential, userName, tags, path }); - check(response, { - 'propfind status is 207': () => response.status === 207, - }, tags) || this.metricErrorRate.add(1, tags); + check( + response, + { + 'dav propfind status is 207': () => response.status === 207, + }, + tags, + ) || this.metricErrorRate.add(1, tags); - this.metricTrend.add(response.timings.duration, tags) + this.metricTrend.add(response.timings.duration, tags); - return {response, tags} + return { response, tags }; } -} \ No newline at end of file +} diff --git a/tests/k6/src/lib/playbook/index.ts b/tests/k6/src/lib/playbook/index.ts index 3d7e48162a..7c93922e3a 100644 --- a/tests/k6/src/lib/playbook/index.ts +++ b/tests/k6/src/lib/playbook/index.ts @@ -1 +1,2 @@ -export * as dav from './dav' \ No newline at end of file +export * as dav from './dav'; +export * as users from './users'; diff --git a/tests/k6/src/lib/playbook/playbook.ts b/tests/k6/src/lib/playbook/playbook.ts index e85dd292ad..f42c5f88b3 100644 --- a/tests/k6/src/lib/playbook/playbook.ts +++ b/tests/k6/src/lib/playbook/playbook.ts @@ -1,4 +1,4 @@ -import {Gauge, Trend} from "k6/metrics"; +import { Gauge, Trend } from 'k6/metrics'; export class Play { public readonly name: string; @@ -8,12 +8,12 @@ export class Play { public readonly metricErrorRate: Gauge; protected tags: { [key: string]: string }; - constructor({name}: { name: string; }) { + constructor({ name }: { name: string }) { this.name = name; this.metricTrendName = `${this.name}_trend`; this.metricErrorRateName = `${this.name}_error_rate`; this.metricTrend = new Trend(this.metricTrendName, true); this.metricErrorRate = new Gauge(this.metricErrorRateName); - this.tags = {play: this.name} + this.tags = { play: this.name }; } -} \ No newline at end of file +} diff --git a/tests/k6/src/lib/playbook/users.ts b/tests/k6/src/lib/playbook/users.ts new file mode 100644 index 0000000000..ae228ef50b --- /dev/null +++ b/tests/k6/src/lib/playbook/users.ts @@ -0,0 +1,73 @@ +import * as api from '../api'; +import { check } from 'k6'; +import * as types from '../types'; +import { RefinedResponse, ResponseType } from 'k6/http'; +import { Play } from './playbook'; + +export class Create extends Play { + constructor({ name, metricID = 'default' }: { name?: string; metricID?: string } = {}) { + super({ name: name || `oc_${metricID}_play_users_create` }); + } + + public exec({ + credential, + userName, + password, + email, + tags, + }: { + credential: types.Credential; + userName: string; + password: string; + email: string; + tags?: types.Tags; + }): { response: RefinedResponse; tags: types.Tags } { + tags = { ...this.tags, ...tags }; + + const response = api.users.Create.exec({ credential: credential, userName, password, tags, email }); + + check( + response, + { + 'users create status is 200': () => response.status === 200, + }, + tags, + ) || this.metricErrorRate.add(1, tags); + + this.metricTrend.add(response.timings.duration, tags); + + return { response, tags }; + } +} + +export class Delete extends Play { + constructor({ name, metricID = 'default' }: { name?: string; metricID?: string } = {}) { + super({ name: name || `oc_${metricID}_play_users_delete` }); + } + + public exec({ + credential, + userName, + tags, + }: { + credential: types.Credential; + userName: string; + tags?: types.Tags; + }): { response: RefinedResponse; tags: types.Tags } { + tags = { ...this.tags, ...tags }; + + const response = api.users.Delete.exec({ credential: credential, userName, tags }); + + check( + response, + { + 'users delete status is 200': () => response.status === 200, + }, + tags, + ) || this.metricErrorRate.add(1, tags); + + this.metricTrend.add(response.timings.duration, tags); + + return { response, tags }; + } +} diff --git a/tests/k6/src/lib/types.ts b/tests/k6/src/lib/types.ts index bcd5cd8082..34a831234c 100644 --- a/tests/k6/src/lib/types.ts +++ b/tests/k6/src/lib/types.ts @@ -1,4 +1,4 @@ -import {bytes} from 'k6'; +import { bytes } from 'k6'; export interface Asset { bytes: bytes; @@ -13,16 +13,16 @@ export interface Token { } export interface Account { - login: string - password: string + login: string; + password: string; } -export type Credential = Token | Account +export type Credential = Token | Account; export interface AuthProvider { - credential: Credential + credential: Credential; } -export type AssetUnit = 'KB' | 'MB' | 'GB' +export type Tags = { [key: string]: string }; -export type Tags = { [key: string]: string } \ No newline at end of file +export declare type AssetUnit = 'KB' | 'MB' | 'GB'; diff --git a/tests/k6/src/lib/utils.ts b/tests/k6/src/lib/utils.ts index 85f0599a6f..5fa7ec79b7 100644 --- a/tests/k6/src/lib/utils.ts +++ b/tests/k6/src/lib/utils.ts @@ -1,57 +1,60 @@ -import {bytes} from 'k6'; -import {randomBytes as k6_randomBytes} from 'k6/crypto'; +import { bytes } from 'k6'; +import { randomBytes as k6_randomBytes } from 'k6/crypto'; import * as defaults from './defaults'; import * as types from './types'; -export const randomNumber = ({min, max}: { min: number; max: number; }): number => { +export const randomNumber = ({ min, max }: { min: number; max: number }): number => { return Math.random() * (max - min) + min; -} +}; -export const randomString = (): string => { - return Math.random().toString(20).substr(2) -} +export const randomString = ({ length = 10 }: { length?: number } = {}): string => { + const chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz'; -export const buildAccount = ({login = defaults.ACCOUNTS.EINSTEIN}: { login: string; }): types.Account => { + let str = ''; + for (let i = 0; i < length; i++) { + str += chars.charAt(Math.floor(Math.random() * chars.length)); + } + + return str; +}; + +export const buildAccount = ({ login = defaults.ACCOUNTS.EINSTEIN }: { login: string }): types.Account => { if (defaults.ENV.LOGIN && defaults.ENV.PASSWORD) { return { login: defaults.ENV.LOGIN, password: defaults.ENV.PASSWORD, - } + }; } return defaults.ACCOUNTS.ALL[login]; -} - -export const buildAsset = ( - { - name = 'dummy.zip', - size = 1, - unit = 'MB', - }: { - name?: string; - size?: number; - unit?: types.AssetUnit; - } -): types.Asset => { +}; +export const buildAsset = ({ + name = 'dummy.zip', + size = 50, + unit = 'KB', +}: { + name?: string; + size?: number; + unit?: types.AssetUnit; +}): types.Asset => { const gen = { KB: (s: number): bytes => { - return k6_randomBytes(s * 1024) + return k6_randomBytes(s * 1024); }, MB: (s: number): bytes => { - return gen.KB(s * 1024) + return gen.KB(s * 1024); }, GB: (s: number): bytes => { - return gen.MB(s * 1024) + return gen.MB(s * 1024); }, - } + }; - const fileBaseName = name.split('/').reverse()[0] - const fileName = fileBaseName.split('.')[0] - const fileExtension = fileBaseName.split('.').reverse()[0] || 'zip' + const fileBaseName = name.split('/').reverse()[0]; + const fileName = fileBaseName.split('.')[0]; + const fileExtension = fileBaseName.split('.').reverse()[0] || 'zip'; return { - name: `${fileName}-${__VU}-${__ITER}-${size}-${unit}-${randomString()}.${fileExtension}`, + name: `${fileName}-${__VU}-${__ITER}-${unit}-${size}-${randomString()}.${fileExtension}`, bytes: gen[unit](size), - } -} - + }; +}; diff --git a/tests/k6/src/test/issue/jira/ocis/1007/concurrent-users.ts b/tests/k6/src/test/issue/jira/ocis/1007/concurrent-users.ts new file mode 100644 index 0000000000..65a01ec48b --- /dev/null +++ b/tests/k6/src/test/issue/jira/ocis/1007/concurrent-users.ts @@ -0,0 +1,73 @@ +import { Options, Threshold } from 'k6/options'; +import { utils, auth, defaults, playbook, types } from '../../../../../lib'; + +const files: Array<{ + size: number; + unit: types.AssetUnit; +}> = [ + { size: 50, unit: 'KB' }, + { size: 500, unit: 'KB' }, + { size: 5, unit: 'MB' }, + { size: 50, unit: 'MB' }, +]; +const adminAuthFactory = new auth.default(utils.buildAccount({ login: defaults.ACCOUNTS.ADMIN })); +const plays = { + usersCreate: new playbook.users.Create(), + usersDelete: new playbook.users.Delete(), + davUpload: new playbook.dav.Upload(), + davDelete: new playbook.dav.Delete(), +}; +export const options: Options = { + insecureSkipTLSVerify: true, + iterations: 10, + vus: 10, + thresholds: files.reduce((acc: { [name: string]: Threshold[] }, c) => { + acc[`${plays.davUpload.metricTrendName}{asset:${c.unit + c.size.toString()}}`] = []; + acc[`${plays.davDelete.metricTrendName}{asset:${c.unit + c.size.toString()}}`] = []; + return acc; + }, {}), +}; + +export default (): void => { + const userName: string = utils.randomString(); + const password: string = utils.randomString(); + + plays.usersCreate.exec({ + userName, + password, + email: `${userName}@owncloud.com`, + credential: adminAuthFactory.credential, + }); + const userAuthFactory = new auth.default({ login: userName, password }); + const filesUploaded: { id: string; name: string }[] = []; + + files.forEach((f) => { + const id = f.unit + f.size.toString(); + + const asset = utils.buildAsset({ + name: `${userName}-dummy.zip`, + unit: f.unit, + size: f.size, + }); + + plays.davUpload.exec({ + credential: userAuthFactory.credential, + asset, + userName, + tags: { asset: id }, + }); + + filesUploaded.push({ id, name: asset.name }); + }); + + filesUploaded.forEach((f) => { + plays.davDelete.exec({ + credential: userAuthFactory.credential, + userName: userAuthFactory.account.login, + path: f.name, + tags: { asset: f.id }, + }); + }); + + plays.usersDelete.exec({ userName: userName, credential: adminAuthFactory.credential }); +}; diff --git a/tests/k6/src/test/issue/jira/ocis/1007/folder-listing/flat.ts b/tests/k6/src/test/issue/jira/ocis/1007/folder-listing/flat.ts index e4e11794aa..656ee3f56b 100644 --- a/tests/k6/src/test/issue/jira/ocis/1007/folder-listing/flat.ts +++ b/tests/k6/src/test/issue/jira/ocis/1007/folder-listing/flat.ts @@ -1,64 +1,63 @@ -import {Options} from "k6/options"; -import {utils, auth, defaults, playbook} from '../../../../../../lib' -import {times} from 'lodash' +import { Options, Threshold } from 'k6/options'; +import { utils, auth, defaults, playbook, types } from '../../../../../../lib'; +import { times } from 'lodash'; // put 1000 files into one dir and run a 'PROPFIND' through API const files: { size: number; - unit: any; -}[] = times(1000, () => ({size: 1, unit: 'KB'})) -const authFactory = new auth.default(utils.buildAccount({login: defaults.ACCOUNTS.EINSTEIN})); + unit: types.AssetUnit; +}[] = times(1000, () => ({ size: 1, unit: 'KB' })); +const authFactory = new auth.default(utils.buildAccount({ login: defaults.ACCOUNTS.EINSTEIN })); const plays = { - davUpload: new playbook.dav.Upload({}), - davPropfind: new playbook.dav.Propfind({}), - davDelete: new playbook.dav.Delete({}), -} + davUpload: new playbook.dav.Upload(), + davPropfind: new playbook.dav.Propfind(), + davDelete: new playbook.dav.Delete(), +}; export const options: Options = { insecureSkipTLSVerify: true, iterations: 3, vus: 1, - thresholds: files.reduce((acc: any, c) => { - acc[`${plays.davUpload.metricTrendName}{asset:${c.unit + c.size.toString()}`] = [] - acc[`${plays.davPropfind.metricTrendName}`] = [] - acc[`${plays.davDelete.metricTrendName}{asset:${c.unit + c.size.toString()}`] = [] - return acc + thresholds: files.reduce((acc: { [name: string]: Threshold[] }, c) => { + acc[`${plays.davUpload.metricTrendName}{asset:${c.unit + c.size.toString()}}`] = []; + acc[`${plays.davDelete.metricTrendName}{asset:${c.unit + c.size.toString()}}`] = []; + return acc; }, {}), }; export default (): void => { - const filesUploaded: { id: string, name: string, }[] = [] - const {account, credential} = authFactory; + const filesUploaded: { id: string; name: string }[] = []; + const { account, credential } = authFactory; - files.forEach(f => { + files.forEach((f) => { const id = f.unit + f.size.toString(); const asset = utils.buildAsset({ name: `${account.login}-dummy.zip`, - unit: f.unit as any, + unit: f.unit, size: f.size, - }) + }); plays.davUpload.exec({ credential, asset, userName: account.login, - tags: {asset: id}, + tags: { asset: id }, }); - filesUploaded.push({id, name: asset.name}) - }) + filesUploaded.push({ id, name: asset.name }); + }); plays.davPropfind.exec({ credential, userName: account.login, - }) + }); - filesUploaded.forEach(f => { + filesUploaded.forEach((f) => { plays.davDelete.exec({ credential, userName: account.login, path: f.name, - tags: {asset: f.id}, + tags: { asset: f.id }, }); - }) -} \ No newline at end of file + }); +}; diff --git a/tests/k6/src/test/issue/jira/ocis/1007/folder-listing/nested.ts b/tests/k6/src/test/issue/jira/ocis/1007/folder-listing/nested.ts index 097fda0b41..c5a33af174 100644 --- a/tests/k6/src/test/issue/jira/ocis/1007/folder-listing/nested.ts +++ b/tests/k6/src/test/issue/jira/ocis/1007/folder-listing/nested.ts @@ -1,81 +1,81 @@ -import {Options} from "k6/options"; -import {utils, auth, defaults, playbook} from '../../../../../../lib' -import {times} from 'lodash' +import { Options, Threshold } from 'k6/options'; +import { utils, auth, defaults, playbook, types } from '../../../../../../lib'; +import { times } from 'lodash'; // Unpack standard data tarball, run PROPFIND on each dir const files: { size: number; - unit: any; -}[] = times(1000, () => ({size: 1, unit: 'KB'})) -const authFactory = new auth.default(utils.buildAccount({login: defaults.ACCOUNTS.EINSTEIN})); + unit: types.AssetUnit; +}[] = times(1000, () => ({ size: 1, unit: 'KB' })); +const authFactory = new auth.default(utils.buildAccount({ login: defaults.ACCOUNTS.EINSTEIN })); const plays = { - davUpload: new playbook.dav.Upload({}), - davPropfind: new playbook.dav.Propfind({}), - davCreate: new playbook.dav.Create({}), - davDelete: new playbook.dav.Delete({}), -} + davUpload: new playbook.dav.Upload(), + davPropfind: new playbook.dav.Propfind(), + davCreate: new playbook.dav.Create(), + davDelete: new playbook.dav.Delete(), +}; export const options: Options = { insecureSkipTLSVerify: true, iterations: 3, vus: 1, - thresholds: files.reduce((acc: any, c) => { - acc[`${plays.davUpload.metricTrendName}{asset:${c.unit + c.size.toString()}`] = [] - acc[`${plays.davPropfind.metricTrendName}`] = [] - acc[`${plays.davCreate.metricTrendName}{asset:${c.unit + c.size.toString()}`] = [] - acc[`${plays.davDelete.metricTrendName}{asset:${c.unit + c.size.toString()}`] = [] - return acc + thresholds: files.reduce((acc: { [name: string]: Threshold[] }, c) => { + acc[`${plays.davUpload.metricTrendName}{asset:${c.unit + c.size.toString()}}`] = []; + acc[`${plays.davCreate.metricTrendName}{asset:${c.unit + c.size.toString()}}`] = []; + acc[`${plays.davDelete.metricTrendName}{asset:${c.unit + c.size.toString()}}`] = []; + return acc; }, {}), }; export default (): void => { - const filesUploaded: { id: string, name: string, folder: string }[] = [] - const {account, credential} = authFactory; + const filesUploaded: { id: string; name: string; folder: string }[] = []; + const { account, credential } = authFactory; - files.forEach(f => { + files.forEach((f) => { const id = f.unit + f.size.toString(); const asset = utils.buildAsset({ name: `${account.login}-dummy.zip`, - unit: f.unit as any, + unit: f.unit, size: f.size, - }) + }); - const folder = times(utils.randomNumber({min: 1, max: 10}), () => utils.randomString()).reduce((acc: string[], c) => { - acc.push(c) + const folder = times(utils.randomNumber({ min: 1, max: 10 }), () => utils.randomString()) + .reduce((acc: string[], c) => { + acc.push(c); - plays.davCreate.exec({ - credential, - path: acc.join('/'), - userName: account.login, - tags: {asset: id}, - }); - - return acc - }, []).join('/') + plays.davCreate.exec({ + credential, + path: acc.join('/'), + userName: account.login, + tags: { asset: id }, + }); + return acc; + }, []) + .join('/'); plays.davUpload.exec({ credential, asset, path: folder, userName: account.login, - tags: {asset: id}, + tags: { asset: id }, }); - filesUploaded.push({id, name: asset.name, folder}) - }) + filesUploaded.push({ id, name: asset.name, folder }); + }); plays.davPropfind.exec({ credential, userName: account.login, - }) + }); - filesUploaded.forEach(f => { + filesUploaded.forEach((f) => { plays.davDelete.exec({ credential, userName: account.login, path: f.folder.split('/')[0], - tags: {asset: f.id}, + tags: { asset: f.id }, }); - }) -} \ No newline at end of file + }); +}; diff --git a/tests/k6/src/test/issue/jira/ocis/1007/simple-down-and-upload/many-small.ts b/tests/k6/src/test/issue/jira/ocis/1007/simple-down-and-upload/many-small.ts index b7ab3d1829..4e72077da9 100644 --- a/tests/k6/src/test/issue/jira/ocis/1007/simple-down-and-upload/many-small.ts +++ b/tests/k6/src/test/issue/jira/ocis/1007/simple-down-and-upload/many-small.ts @@ -1,72 +1,72 @@ -import {Options} from "k6/options"; -import {utils, auth, defaults, playbook} from '../../../../../../lib' -import {times} from 'lodash' +import { Options, Threshold } from 'k6/options'; +import { utils, auth, defaults, playbook, types } from '../../../../../../lib'; +import { times } from 'lodash'; // upload, download and delete of many files with several sizes and summary size of 500 MB in one directory const files: { size: number; - unit: any; + unit: types.AssetUnit; }[] = [ - ...times(100, () => ({size: 500, unit: 'KB'})), - ...times(50, () => ({size: 5, unit: 'MB'})), - ...times(10, () => ({size: 25, unit: 'MB'})), -] -const authFactory = new auth.default(utils.buildAccount({login: defaults.ACCOUNTS.EINSTEIN})); + ...times(100, () => ({ size: 500, unit: 'KB' as types.AssetUnit })), + ...times(50, () => ({ size: 5, unit: 'MB' as types.AssetUnit })), + ...times(10, () => ({ size: 25, unit: 'MB' as types.AssetUnit })), +]; +const authFactory = new auth.default(utils.buildAccount({ login: defaults.ACCOUNTS.EINSTEIN })); const plays = { - davUpload: new playbook.dav.Upload({}), - davDownload: new playbook.dav.Download({}), - davDelete: new playbook.dav.Delete({}), -} + davUpload: new playbook.dav.Upload(), + davDownload: new playbook.dav.Download(), + davDelete: new playbook.dav.Delete(), +}; export const options: Options = { insecureSkipTLSVerify: true, iterations: 3, vus: 1, - thresholds: files.reduce((acc: any, c) => { - acc[`${plays.davUpload.metricTrendName}{asset:${c.unit + c.size.toString()}`] = [] - acc[`${plays.davDownload.metricTrendName}{asset:${c.unit + c.size.toString()}`] = [] - acc[`${plays.davDelete.metricTrendName}{asset:${c.unit + c.size.toString()}`] = [] - return acc + thresholds: files.reduce((acc: { [name: string]: Threshold[] }, c) => { + acc[`${plays.davUpload.metricTrendName}{asset:${c.unit + c.size.toString()}}`] = []; + acc[`${plays.davDownload.metricTrendName}{asset:${c.unit + c.size.toString()}}`] = []; + acc[`${plays.davDelete.metricTrendName}{asset:${c.unit + c.size.toString()}}`] = []; + return acc; }, {}), }; export default (): void => { - const filesUploaded: { id: string, name: string, }[] = [] - const {account, credential} = authFactory; + const filesUploaded: { id: string; name: string }[] = []; + const { account, credential } = authFactory; - files.forEach(f => { + files.forEach((f) => { const id = f.unit + f.size.toString(); const asset = utils.buildAsset({ name: `${account.login}-dummy.zip`, - unit: f.unit as any, + unit: f.unit, size: f.size, - }) + }); plays.davUpload.exec({ credential, asset, userName: account.login, - tags: {asset: id}, + tags: { asset: id }, }); - filesUploaded.push({id, name: asset.name}) - }) + filesUploaded.push({ id, name: asset.name }); + }); - filesUploaded.forEach(f => { + filesUploaded.forEach((f) => { plays.davDownload.exec({ credential, userName: account.login, path: f.name, - tags: {asset: f.id}, + tags: { asset: f.id }, }); - }) + }); - filesUploaded.forEach(f => { + filesUploaded.forEach((f) => { plays.davDelete.exec({ credential, userName: account.login, path: f.name, - tags: {asset: f.id}, + tags: { asset: f.id }, }); - }) -} \ No newline at end of file + }); +}; diff --git a/tests/k6/src/test/issue/jira/ocis/1007/simple-down-and-upload/some-large.ts b/tests/k6/src/test/issue/jira/ocis/1007/simple-down-and-upload/some-large.ts index 82ef129a6a..ca038216c8 100644 --- a/tests/k6/src/test/issue/jira/ocis/1007/simple-down-and-upload/some-large.ts +++ b/tests/k6/src/test/issue/jira/ocis/1007/simple-down-and-upload/some-large.ts @@ -1,5 +1,5 @@ -import {Options} from "k6/options"; -import {utils, auth, defaults, playbook, types} from '../../../../../../lib' +import { Options, Threshold } from 'k6/options'; +import { utils, auth, defaults, playbook, types } from '../../../../../../lib'; // upload, download and delete of one file with sizes 50kb, 500kb, 5MB, 50MB, 500MB, 1GB @@ -7,69 +7,69 @@ const files: { size: number; unit: types.AssetUnit; }[] = [ - {size: 50, unit: 'KB'}, - {size: 500, unit: 'KB'}, - {size: 5, unit: 'MB'}, - {size: 50, unit: 'MB'}, - {size: 500, unit: 'MB'}, - {size: 1, unit: 'GB'}, -] -const authFactory = new auth.default(utils.buildAccount({login: defaults.ACCOUNTS.EINSTEIN})); + { size: 50, unit: 'KB' }, + { size: 500, unit: 'KB' }, + { size: 5, unit: 'MB' }, + { size: 50, unit: 'MB' }, + { size: 500, unit: 'MB' }, + { size: 1, unit: 'GB' }, +]; +const authFactory = new auth.default(utils.buildAccount({ login: defaults.ACCOUNTS.EINSTEIN })); const plays = { - davUpload: new playbook.dav.Upload({}), - davDownload: new playbook.dav.Download({}), - davDelete: new playbook.dav.Delete({}), -} + davUpload: new playbook.dav.Upload(), + davDownload: new playbook.dav.Download(), + davDelete: new playbook.dav.Delete(), +}; export const options: Options = { insecureSkipTLSVerify: true, iterations: 3, vus: 1, - thresholds: files.reduce((acc: any, c) => { - acc[`${plays.davUpload.metricTrendName}{asset:${c.unit + c.size.toString()}`] = [] - acc[`${plays.davDownload.metricTrendName}{asset:${c.unit + c.size.toString()}`] = [] - acc[`${plays.davDelete.metricTrendName}{asset:${c.unit + c.size.toString()}`] = [] - return acc + thresholds: files.reduce((acc: { [name: string]: Threshold[] }, c) => { + acc[`${plays.davUpload.metricTrendName}{asset:${c.unit + c.size.toString()}}`] = []; + acc[`${plays.davDownload.metricTrendName}{asset:${c.unit + c.size.toString()}}`] = []; + acc[`${plays.davDelete.metricTrendName}{asset:${c.unit + c.size.toString()}}`] = []; + return acc; }, {}), }; export default (): void => { - const filesUploaded: { id: string, name: string, }[] = [] - const {account, credential} = authFactory; + const filesUploaded: { id: string; name: string }[] = []; + const { account, credential } = authFactory; - files.forEach(f => { + files.forEach((f) => { const id = f.unit + f.size.toString(); const asset = utils.buildAsset({ name: `${account.login}-dummy.zip`, - unit: f.unit as any, + unit: f.unit, size: f.size, - }) + }); plays.davUpload.exec({ credential, asset, userName: account.login, - tags: {asset: id}, + tags: { asset: id }, }); - filesUploaded.push({id, name: asset.name}) - }) + filesUploaded.push({ id, name: asset.name }); + }); - filesUploaded.forEach(f => { + filesUploaded.forEach((f) => { plays.davDownload.exec({ credential, userName: account.login, path: f.name, - tags: {asset: f.id}, + tags: { asset: f.id }, }); - }) + }); - filesUploaded.forEach(f => { + filesUploaded.forEach((f) => { plays.davDelete.exec({ credential, userName: account.login, path: f.name, - tags: {asset: f.id}, + tags: { asset: f.id }, }); - }) -} \ No newline at end of file + }); +}; diff --git a/tests/k6/yarn.lock b/tests/k6/yarn.lock index df96e66782..35ee33c402 100644 --- a/tests/k6/yarn.lock +++ b/tests/k6/yarn.lock @@ -1013,6 +1013,22 @@ dependencies: find-up "^4.0.0" +"@eslint/eslintrc@^0.2.1": + version "0.2.1" + resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-0.2.1.tgz#f72069c330461a06684d119384435e12a5d76e3c" + integrity sha512-XRUeBZ5zBWLYgSANMpThFddrZZkEbGHgUdt5UJjZfnlN9BGCiUBrf+nvbRupSjMvqzwnQN0qwCmOxITt1cfywA== + dependencies: + ajv "^6.12.4" + debug "^4.1.1" + espree "^7.3.0" + globals "^12.1.0" + ignore "^4.0.6" + import-fresh "^3.2.1" + js-yaml "^3.13.1" + lodash "^4.17.19" + minimatch "^3.0.4" + strip-json-comments "^3.1.1" + "@istanbuljs/load-nyc-config@^1.0.0": version "1.1.0" resolved "https://registry.yarnpkg.com/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz#fd3db1d59ecf7cf121e80650bb86712f9b55eced" @@ -1330,11 +1346,6 @@ resolved "https://registry.yarnpkg.com/@types/estree/-/estree-0.0.39.tgz#e177e699ee1b8c22d23174caaa7422644389509f" integrity sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw== -"@types/faker@^5.1.4": - version "5.1.4" - resolved "https://registry.yarnpkg.com/@types/faker/-/faker-5.1.4.tgz#1299e3e3e1b115227a33f2330bc038ce03237b52" - integrity sha512-ZK+Bmi5GcWSLe8TQDOj9+K5KImV/41Ydm7Fs3IbtAA11l1MVK0Dlo16KTni5cGZISxGiCaWE+uB9gznWT2GUgw== - "@types/graceful-fs@^4.1.2": version "4.1.4" resolved "https://registry.yarnpkg.com/@types/graceful-fs/-/graceful-fs-4.1.4.tgz#4ff9f641a7c6d1a3508ff88bc3141b152772e753" @@ -1362,14 +1373,6 @@ "@types/istanbul-lib-coverage" "*" "@types/istanbul-lib-report" "*" -"@types/jest@^25.2.1": - version "25.2.3" - resolved "https://registry.yarnpkg.com/@types/jest/-/jest-25.2.3.tgz#33d27e4c4716caae4eced355097a47ad363fdcaf" - integrity sha512-JXc1nK/tXHiDhV55dvfzqtmP4S3sy3T3ouV2tkViZgxY/zeUkcpQcQPGRlgF4KmWzWW5oiWYSZwtCB+2RsE4Fw== - dependencies: - jest-diff "^25.2.1" - pretty-format "^25.2.1" - "@types/json-schema@^7.0.3": version "7.0.6" resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.6.tgz#f4c7ec43e81b319a9815115031709f26987891f0" @@ -1434,17 +1437,43 @@ dependencies: "@types/yargs-parser" "*" -"@typescript-eslint/eslint-plugin@^2.29.0": - version "2.34.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-2.34.0.tgz#6f8ce8a46c7dea4a6f1d171d2bb8fbae6dac2be9" - integrity sha512-4zY3Z88rEE99+CNvTbXSyovv2z9PNOVffTWD2W8QF5s2prBQtwN2zadqERcrHpcR7O/+KMI3fcTAmUUhK/iQcQ== +"@typescript-eslint/eslint-plugin@^4.9.0": + version "4.9.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-4.9.0.tgz#8fde15743413661fdc086c9f1f5d74a80b856113" + integrity sha512-WrVzGMzzCrgrpnQMQm4Tnf+dk+wdl/YbgIgd5hKGa2P+lnJ2MON+nQnbwgbxtN9QDLi8HO+JAq0/krMnjQK6Cw== dependencies: - "@typescript-eslint/experimental-utils" "2.34.0" + "@typescript-eslint/experimental-utils" "4.9.0" + "@typescript-eslint/scope-manager" "4.9.0" + debug "^4.1.1" functional-red-black-tree "^1.0.1" regexpp "^3.0.0" + semver "^7.3.2" tsutils "^3.17.1" -"@typescript-eslint/experimental-utils@2.34.0", "@typescript-eslint/experimental-utils@^2.5.0": +"@typescript-eslint/experimental-utils@3.10.1": + version "3.10.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/experimental-utils/-/experimental-utils-3.10.1.tgz#e179ffc81a80ebcae2ea04e0332f8b251345a686" + integrity sha512-DewqIgscDzmAfd5nOGe4zm6Bl7PKtMG2Ad0KG8CUZAHlXfAKTF9Ol5PXhiMh39yRL2ChRH1cuuUGOcVyyrhQIw== + dependencies: + "@types/json-schema" "^7.0.3" + "@typescript-eslint/types" "3.10.1" + "@typescript-eslint/typescript-estree" "3.10.1" + eslint-scope "^5.0.0" + eslint-utils "^2.0.0" + +"@typescript-eslint/experimental-utils@4.9.0": + version "4.9.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/experimental-utils/-/experimental-utils-4.9.0.tgz#23a296b85d243afba24e75a43fd55aceda5141f0" + integrity sha512-0p8GnDWB3R2oGhmRXlEnCvYOtaBCijtA5uBfH5GxQKsukdSQyI4opC4NGTUb88CagsoNQ4rb/hId2JuMbzWKFQ== + dependencies: + "@types/json-schema" "^7.0.3" + "@typescript-eslint/scope-manager" "4.9.0" + "@typescript-eslint/types" "4.9.0" + "@typescript-eslint/typescript-estree" "4.9.0" + eslint-scope "^5.0.0" + eslint-utils "^2.0.0" + +"@typescript-eslint/experimental-utils@^2.5.0": version "2.34.0" resolved "https://registry.yarnpkg.com/@typescript-eslint/experimental-utils/-/experimental-utils-2.34.0.tgz#d3524b644cdb40eebceca67f8cf3e4cc9c8f980f" integrity sha512-eS6FTkq+wuMJ+sgtuNTtcqavWXqsflWcfBnlYhg/nS4aZ1leewkXGbvBhaapn1q6qf4M71bsR1tez5JTRMuqwA== @@ -1454,16 +1483,45 @@ eslint-scope "^5.0.0" eslint-utils "^2.0.0" -"@typescript-eslint/parser@^2.29.0": - version "2.34.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-2.34.0.tgz#50252630ca319685420e9a39ca05fe185a256bc8" - integrity sha512-03ilO0ucSD0EPTw2X4PntSIRFtDPWjrVq7C3/Z3VQHRC7+13YB55rcJI3Jt+YgeHbjUdJPcPa7b23rXCBokuyA== +"@typescript-eslint/parser@^3.0.0": + version "3.10.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-3.10.1.tgz#1883858e83e8b442627e1ac6f408925211155467" + integrity sha512-Ug1RcWcrJP02hmtaXVS3axPPTTPnZjupqhgj+NnZ6BCkwSImWk/283347+x9wN+lqOdK9Eo3vsyiyDHgsmiEJw== dependencies: "@types/eslint-visitor-keys" "^1.0.0" - "@typescript-eslint/experimental-utils" "2.34.0" - "@typescript-eslint/typescript-estree" "2.34.0" + "@typescript-eslint/experimental-utils" "3.10.1" + "@typescript-eslint/types" "3.10.1" + "@typescript-eslint/typescript-estree" "3.10.1" eslint-visitor-keys "^1.1.0" +"@typescript-eslint/parser@^4.9.0": + version "4.9.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-4.9.0.tgz#bb65f1214b5e221604996db53ef77c9d62b09249" + integrity sha512-QRSDAV8tGZoQye/ogp28ypb8qpsZPV6FOLD+tbN4ohKUWHD2n/u0Q2tIBnCsGwQCiD94RdtLkcqpdK4vKcLCCw== + dependencies: + "@typescript-eslint/scope-manager" "4.9.0" + "@typescript-eslint/types" "4.9.0" + "@typescript-eslint/typescript-estree" "4.9.0" + debug "^4.1.1" + +"@typescript-eslint/scope-manager@4.9.0": + version "4.9.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-4.9.0.tgz#5eefe305d6b71d1c85af6587b048426bfd4d3708" + integrity sha512-q/81jtmcDtMRE+nfFt5pWqO0R41k46gpVLnuefqVOXl4QV1GdQoBWfk5REcipoJNQH9+F5l+dwa9Li5fbALjzg== + dependencies: + "@typescript-eslint/types" "4.9.0" + "@typescript-eslint/visitor-keys" "4.9.0" + +"@typescript-eslint/types@3.10.1": + version "3.10.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-3.10.1.tgz#1d7463fa7c32d8a23ab508a803ca2fe26e758727" + integrity sha512-+3+FCUJIahE9q0lDi1WleYzjCwJs5hIsbugIgnbB+dSCYUxl8L6PwmsyOPFZde2hc1DlTo/xnkOgiTLSyAbHiQ== + +"@typescript-eslint/types@4.9.0": + version "4.9.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-4.9.0.tgz#3fe8c3632abd07095c7458f7451bd14c85d0033c" + integrity sha512-luzLKmowfiM/IoJL/rus1K9iZpSJK6GlOS/1ezKplb7MkORt2dDcfi8g9B0bsF6JoRGhqn0D3Va55b+vredFHA== + "@typescript-eslint/typescript-estree@2.34.0": version "2.34.0" resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-2.34.0.tgz#14aeb6353b39ef0732cc7f1b8285294937cf37d5" @@ -1477,6 +1535,49 @@ semver "^7.3.2" tsutils "^3.17.1" +"@typescript-eslint/typescript-estree@3.10.1": + version "3.10.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-3.10.1.tgz#fd0061cc38add4fad45136d654408569f365b853" + integrity sha512-QbcXOuq6WYvnB3XPsZpIwztBoquEYLXh2MtwVU+kO8jgYCiv4G5xrSP/1wg4tkvrEE+esZVquIPX/dxPlePk1w== + dependencies: + "@typescript-eslint/types" "3.10.1" + "@typescript-eslint/visitor-keys" "3.10.1" + debug "^4.1.1" + glob "^7.1.6" + is-glob "^4.0.1" + lodash "^4.17.15" + semver "^7.3.2" + tsutils "^3.17.1" + +"@typescript-eslint/typescript-estree@4.9.0": + version "4.9.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-4.9.0.tgz#38a98df6ee281cfd6164d6f9d91795b37d9e508c" + integrity sha512-rmDR++PGrIyQzAtt3pPcmKWLr7MA+u/Cmq9b/rON3//t5WofNR4m/Ybft2vOLj0WtUzjn018ekHjTsnIyBsQug== + dependencies: + "@typescript-eslint/types" "4.9.0" + "@typescript-eslint/visitor-keys" "4.9.0" + debug "^4.1.1" + globby "^11.0.1" + is-glob "^4.0.1" + lodash "^4.17.15" + semver "^7.3.2" + tsutils "^3.17.1" + +"@typescript-eslint/visitor-keys@3.10.1": + version "3.10.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-3.10.1.tgz#cd4274773e3eb63b2e870ac602274487ecd1e931" + integrity sha512-9JgC82AaQeglebjZMgYR5wgmfUdUc+EitGUUMW8u2nDckaeimzW+VsoLV6FoimPv2id3VQzfjwBxEMVz08ameQ== + dependencies: + eslint-visitor-keys "^1.1.0" + +"@typescript-eslint/visitor-keys@4.9.0": + version "4.9.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-4.9.0.tgz#f284e9fac43f2d6d35094ce137473ee321f266c8" + integrity sha512-sV45zfdRqQo1A97pOSx3fsjR+3blmwtdCt8LDrXgCX36v4Vmz4KHrhpV6Fo2cRdXmyumxx11AHw0pNJqCNpDyg== + dependencies: + "@typescript-eslint/types" "4.9.0" + eslint-visitor-keys "^2.0.0" + JSONStream@^1.0.4: version "1.3.5" resolved "https://registry.yarnpkg.com/JSONStream/-/JSONStream-1.3.5.tgz#3208c1f08d3a4d99261ab64f92302bc15e111ca0" @@ -1513,7 +1614,7 @@ acorn@^6.0.1: resolved "https://registry.yarnpkg.com/acorn/-/acorn-6.4.2.tgz#35866fd710528e92de10cf06016498e47e39e1e6" integrity sha512-XtGIhXwF8YM8bJhGxG5kXgjkEuNGLTkoYqVE+KMR+aspr4KGYmKYg7yUe3KghyQ9yheNwLnjmzh/7+gfDBmHCQ== -acorn@^7.1.0, acorn@^7.1.1: +acorn@^7.1.0, acorn@^7.1.1, acorn@^7.4.0: version "7.4.1" resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.4.1.tgz#feaed255973d2e77555b83dbc08851a6c63520fa" integrity sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A== @@ -1526,7 +1627,7 @@ aggregate-error@^3.0.0: clean-stack "^2.0.0" indent-string "^4.0.0" -ajv@^6.10.0, ajv@^6.10.2, ajv@^6.12.3: +ajv@^6.10.0, ajv@^6.10.2, ajv@^6.12.3, ajv@^6.12.4: version "6.12.6" resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== @@ -1548,6 +1649,16 @@ ansi-escapes@^4.2.1, ansi-escapes@^4.3.0: dependencies: type-fest "^0.11.0" +ansi-regex@^2.0.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df" + integrity sha1-w7M6te42DYbg5ijwRorn7yfWVN8= + +ansi-regex@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.0.tgz#ed0317c322064f79466c02966bddb605ab37d998" + integrity sha1-7QMXwyIGT3lGbAKWa922Bas32Zg= + ansi-regex@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-4.1.0.tgz#8b9f8f08cf1acb843756a839ca8c7e3168c51997" @@ -1558,6 +1669,11 @@ ansi-regex@^5.0.0: resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.0.tgz#388539f55179bf39339c81af30a654d69f87cb75" integrity sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg== +ansi-styles@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe" + integrity sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4= + ansi-styles@^3.2.0, ansi-styles@^3.2.1: version "3.2.1" resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" @@ -1625,6 +1741,11 @@ array-ify@^1.0.0: resolved "https://registry.yarnpkg.com/array-ify/-/array-ify-1.0.0.tgz#9e528762b4a9066ad163a6962a364418e9626ece" integrity sha1-nlKHYrSpBmrRY6aWKjZEGOlibs4= +array-union@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/array-union/-/array-union-2.1.0.tgz#b798420adbeb1de828d84acd8a2e23d3efe85e8d" + integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw== + array-unique@^0.3.2: version "0.3.2" resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.3.2.tgz#a894b75d4bc4f6cd679ef3244a9fd8f46ae2d428" @@ -1964,7 +2085,7 @@ caseless@~0.12.0: resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" integrity sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw= -chalk@2.4.2, chalk@^2.0.0, chalk@^2.0.1, chalk@^2.1.0: +chalk@2.4.2, chalk@^2.0.0, chalk@^2.0.1: version "2.4.2" resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== @@ -1973,6 +2094,17 @@ chalk@2.4.2, chalk@^2.0.0, chalk@^2.0.1, chalk@^2.1.0: escape-string-regexp "^1.0.5" supports-color "^5.3.0" +chalk@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98" + integrity sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg= + dependencies: + ansi-styles "^2.2.1" + escape-string-regexp "^1.0.2" + has-ansi "^2.0.0" + strip-ansi "^3.0.0" + supports-color "^2.0.0" + chalk@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/chalk/-/chalk-3.0.0.tgz#3f73c2bf526591f574cc492c51e2456349f844e4" @@ -1989,11 +2121,6 @@ chalk@^4.0.0, chalk@^4.1.0: ansi-styles "^4.1.0" supports-color "^7.1.0" -chardet@^0.7.0: - version "0.7.0" - resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.7.0.tgz#90094849f0937f2eedc2425d0d28a9e5f0cbad9e" - integrity sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA== - ci-info@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-2.0.0.tgz#67a9e964be31a51e15e5010d58e6f12834002f46" @@ -2029,11 +2156,6 @@ cli-truncate@^2.1.0: slice-ansi "^3.0.0" string-width "^4.2.0" -cli-width@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-3.0.0.tgz#a2f48437a2caa9a22436e794bf071ec9e61cedf6" - integrity sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw== - cliui@^6.0.0: version "6.0.0" resolved "https://registry.yarnpkg.com/cliui/-/cliui-6.0.0.tgz#511d702c0c4e41ca156d7d0e96021f23e13225b1" @@ -2107,6 +2229,11 @@ commander@^6.2.0: resolved "https://registry.yarnpkg.com/commander/-/commander-6.2.0.tgz#b990bfb8ac030aedc6d11bc04d1488ffef56db75" integrity sha512-zP4jEKbe8SHzKJYQmq8Y9gYjtO/POJLgIdKgV7B9qNmABVFVc+ctqSX6iXh4mCpJfRBOabiZ2YKPg8ciDw6C+Q== +common-tags@^1.4.0: + version "1.8.0" + resolved "https://registry.yarnpkg.com/common-tags/-/common-tags-1.8.0.tgz#8e3153e542d4a39e9b10554434afaaf98956a937" + integrity sha512-6P6g0uetGpW/sdyUy/iQQCbFF0kWVMSIVSyYz7Zgjcgh8mgw8PQzDNZeyZ5DQ2gM7LBoZPHmnjz8rUthkBG5tw== + commondir@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/commondir/-/commondir-1.0.1.tgz#ddd800da0c66127393cca5950ea968a3aaf1253b" @@ -2120,6 +2247,11 @@ compare-func@^1.3.1: array-ify "^1.0.0" dot-prop "^3.0.0" +compare-versions@^3.6.0: + version "3.6.0" + resolved "https://registry.yarnpkg.com/compare-versions/-/compare-versions-3.6.0.tgz#1a5689913685e5a87637b8d3ffca75514ec41d62" + integrity sha512-W6Af2Iw1z4CB7q4uU4hv646dW9GQuBM+YpC0UvUCWSD8w90SJjp+ujJuXaEMtAXBtSqGfMPuFOVn4/+FlaqfBA== + component-emitter@^1.2.1: version "1.3.0" resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.3.0.tgz#16e4070fba8ae29b679f2215853ee181ab2eabc0" @@ -2216,7 +2348,7 @@ cosmiconfig@^7.0.0: path-type "^4.0.0" yaml "^1.10.0" -cross-spawn@^6.0.0, cross-spawn@^6.0.5: +cross-spawn@^6.0.0: version "6.0.5" resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-6.0.5.tgz#4a5ec7c64dfae22c3a14124dbacdee846d80cbc4" integrity sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ== @@ -2227,7 +2359,7 @@ cross-spawn@^6.0.0, cross-spawn@^6.0.5: shebang-command "^1.2.0" which "^1.2.9" -cross-spawn@^7.0.0: +cross-spawn@^7.0.0, cross-spawn@^7.0.2: version "7.0.3" resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== @@ -2318,7 +2450,7 @@ dedent@^0.7.0: resolved "https://registry.yarnpkg.com/dedent/-/dedent-0.7.0.tgz#2495ddbaf6eb874abb0e1be9df22d2e5a544326c" integrity sha1-JJXduvbrh0q7Dhvp3yLS5aVEMmw= -deep-is@~0.1.3: +deep-is@^0.1.3, deep-is@~0.1.3: version "0.1.3" resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.3.tgz#b369d6fb5dbc13eecf524f91b070feedc357cf34" integrity sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ= @@ -2372,6 +2504,18 @@ diff-sequences@^25.2.6: resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-25.2.6.tgz#5f467c00edd35352b7bca46d7927d60e687a76dd" integrity sha512-Hq8o7+6GaZeoFjtpgvRBUknSXNeJiCx7V9Fr94ZMljNiCr9n9L8H8aJqgWOQiDDGdyn29fRNcDdRVJ5fdyihfg== +dir-glob@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-3.0.1.tgz#56dbf73d992a4a93ba1584f4534063fd2e41717f" + integrity sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA== + dependencies: + path-type "^4.0.0" + +dlv@^1.1.0: + version "1.1.3" + resolved "https://registry.yarnpkg.com/dlv/-/dlv-1.1.3.tgz#5c198a8a11453596e751494d49874bc7732f2e79" + integrity sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA== + doctrine@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-3.0.0.tgz#addebead72a6574db783639dc87a121773973961" @@ -2423,7 +2567,7 @@ end-of-stream@^1.1.0: dependencies: once "^1.4.0" -enquirer@^2.3.6: +enquirer@^2.3.5, enquirer@^2.3.6: version "2.3.6" resolved "https://registry.yarnpkg.com/enquirer/-/enquirer-2.3.6.tgz#2a7fe5dd634a1e4125a975ec994ff5456dc3734d" integrity sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg== @@ -2442,7 +2586,7 @@ escalade@^3.1.1: resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40" integrity sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw== -escape-string-regexp@^1.0.5: +escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= @@ -2464,7 +2608,7 @@ escodegen@^1.11.1: optionalDependencies: source-map "~0.6.1" -eslint-config-prettier@^6.11.0: +eslint-config-prettier@^6.15.0: version "6.15.0" resolved "https://registry.yarnpkg.com/eslint-config-prettier/-/eslint-config-prettier-6.15.0.tgz#7f93f6cb7d45a92f1537a70ecc06366e1ac6fed9" integrity sha512-a1+kOYLR8wMGustcgAjdydMsQ2A/2ipRPwRKUmfYaSxc9ZPcrku080Ctl6zrZzZNs/U82MjSv+qKREkoq3bJaw== @@ -2478,14 +2622,14 @@ eslint-plugin-jest@^23.8.2: dependencies: "@typescript-eslint/experimental-utils" "^2.5.0" -eslint-plugin-prettier@^3.1.3: - version "3.1.4" - resolved "https://registry.yarnpkg.com/eslint-plugin-prettier/-/eslint-plugin-prettier-3.1.4.tgz#168ab43154e2ea57db992a2cd097c828171f75c2" - integrity sha512-jZDa8z76klRqo+TdGDTFJSavwbnWK2ZpqGKNZ+VvweMW516pDUMmQ2koXvxEE4JhzNvTv+radye/bWGBmA6jmg== +eslint-plugin-prettier@^3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-prettier/-/eslint-plugin-prettier-3.2.0.tgz#af391b2226fa0e15c96f36c733f6e9035dbd952c" + integrity sha512-kOUSJnFjAUFKwVxuzy6sA5yyMx6+o9ino4gCdShzBNx4eyFRudWRYKCFolKjoM40PEiuU6Cn7wBLfq3WsGg7qg== dependencies: prettier-linter-helpers "^1.0.0" -eslint-scope@^5.0.0: +eslint-scope@^5.0.0, eslint-scope@^5.1.1: version "5.1.1" resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-5.1.1.tgz#e786e59a66cb92b3f6c1fb0d508aab174848f48c" integrity sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw== @@ -2493,41 +2637,41 @@ eslint-scope@^5.0.0: esrecurse "^4.3.0" estraverse "^4.1.1" -eslint-utils@^1.4.3: - version "1.4.3" - resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-1.4.3.tgz#74fec7c54d0776b6f67e0251040b5806564e981f" - integrity sha512-fbBN5W2xdY45KulGXmLHZ3c3FHfVYmKg0IrAKGOkT/464PQsx2UeIzfz1RmEci+KLm1bBaAzZAh8+/E+XAeZ8Q== - dependencies: - eslint-visitor-keys "^1.1.0" - -eslint-utils@^2.0.0: +eslint-utils@^2.0.0, eslint-utils@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-2.1.0.tgz#d2de5e03424e707dc10c74068ddedae708741b27" integrity sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg== dependencies: eslint-visitor-keys "^1.1.0" -eslint-visitor-keys@^1.1.0: +eslint-visitor-keys@^1.1.0, eslint-visitor-keys@^1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz#30ebd1ef7c2fdff01c3a4f151044af25fab0523e" integrity sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ== -eslint@^6.8.0: - version "6.8.0" - resolved "https://registry.yarnpkg.com/eslint/-/eslint-6.8.0.tgz#62262d6729739f9275723824302fb227c8c93ffb" - integrity sha512-K+Iayyo2LtyYhDSYwz5D5QdWw0hCacNzyq1Y821Xna2xSJj7cijoLLYmLxTQgcgZ9mC61nryMy9S7GRbYpI5Ig== +eslint-visitor-keys@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-2.0.0.tgz#21fdc8fbcd9c795cc0321f0563702095751511a8" + integrity sha512-QudtT6av5WXels9WjIM7qz1XD1cWGvX4gGXvp/zBn9nXG02D0utdU3Em2m/QjTnrsk6bBjmCygl3rmj118msQQ== + +eslint@^7.14.0, eslint@^7.9.0: + version "7.14.0" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-7.14.0.tgz#2d2cac1d28174c510a97b377f122a5507958e344" + integrity sha512-5YubdnPXrlrYAFCKybPuHIAH++PINe1pmKNc5wQRB9HSbqIK1ywAnntE3Wwua4giKu0bjligf1gLF6qxMGOYRA== dependencies: "@babel/code-frame" "^7.0.0" + "@eslint/eslintrc" "^0.2.1" ajv "^6.10.0" - chalk "^2.1.0" - cross-spawn "^6.0.5" + chalk "^4.0.0" + cross-spawn "^7.0.2" debug "^4.0.1" doctrine "^3.0.0" - eslint-scope "^5.0.0" - eslint-utils "^1.4.3" - eslint-visitor-keys "^1.1.0" - espree "^6.1.2" - esquery "^1.0.1" + enquirer "^2.3.5" + eslint-scope "^5.1.1" + eslint-utils "^2.1.0" + eslint-visitor-keys "^2.0.0" + espree "^7.3.0" + esquery "^1.2.0" esutils "^2.0.2" file-entry-cache "^5.0.1" functional-red-black-tree "^1.0.1" @@ -2536,26 +2680,24 @@ eslint@^6.8.0: ignore "^4.0.6" import-fresh "^3.0.0" imurmurhash "^0.1.4" - inquirer "^7.0.0" is-glob "^4.0.0" js-yaml "^3.13.1" json-stable-stringify-without-jsonify "^1.0.1" - levn "^0.3.0" - lodash "^4.17.14" + levn "^0.4.1" + lodash "^4.17.19" minimatch "^3.0.4" - mkdirp "^0.5.1" natural-compare "^1.4.0" - optionator "^0.8.3" + optionator "^0.9.1" progress "^2.0.0" - regexpp "^2.0.1" - semver "^6.1.2" - strip-ansi "^5.2.0" - strip-json-comments "^3.0.1" + regexpp "^3.1.0" + semver "^7.2.1" + strip-ansi "^6.0.0" + strip-json-comments "^3.1.0" table "^5.2.3" text-table "^0.2.0" v8-compile-cache "^2.0.3" -espree@^6.1.2: +espree@^6.2.1: version "6.2.1" resolved "https://registry.yarnpkg.com/espree/-/espree-6.2.1.tgz#77fc72e1fd744a2052c20f38a5b575832e82734a" integrity sha512-ysCxRQY3WaXJz9tdbWOwuWr5Y/XrPTGX9Kiz3yoUXwW0VZ4w30HTkQLaGx/+ttFjF8i+ACbArnB4ce68a9m5hw== @@ -2564,12 +2706,21 @@ espree@^6.1.2: acorn-jsx "^5.2.0" eslint-visitor-keys "^1.1.0" +espree@^7.3.0: + version "7.3.0" + resolved "https://registry.yarnpkg.com/espree/-/espree-7.3.0.tgz#dc30437cf67947cf576121ebd780f15eeac72348" + integrity sha512-dksIWsvKCixn1yrEXO8UosNSxaDoSYpq9reEjZSbHLpT5hpaCAKTLBwq0RHtLrIr+c0ByiYzWT8KTMRzoRCNlw== + dependencies: + acorn "^7.4.0" + acorn-jsx "^5.2.0" + eslint-visitor-keys "^1.3.0" + esprima@^4.0.0, esprima@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== -esquery@^1.0.1: +esquery@^1.0.1, esquery@^1.2.0: version "1.3.1" resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.3.1.tgz#b78b5828aa8e214e29fb74c4d5b752e1c033da57" integrity sha512-olpvt9QG0vniUBZspVRN6lwB7hOZoTRtT+jzR+tS4ffYx2mzbw+z0XCOk44aaLYKApNX5nMm+E+P6o25ip/DHQ== @@ -2712,15 +2863,6 @@ extend@~3.0.2: resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa" integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g== -external-editor@^3.0.3: - version "3.1.0" - resolved "https://registry.yarnpkg.com/external-editor/-/external-editor-3.1.0.tgz#cb03f740befae03ea4d283caed2741a83f335495" - integrity sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew== - dependencies: - chardet "^0.7.0" - iconv-lite "^0.4.24" - tmp "^0.0.33" - extglob@^2.0.4: version "2.0.4" resolved "https://registry.yarnpkg.com/extglob/-/extglob-2.0.4.tgz#ad00fe4dc612a9232e8718711dc5cb5ab0285543" @@ -2755,7 +2897,7 @@ fast-diff@^1.1.2: resolved "https://registry.yarnpkg.com/fast-diff/-/fast-diff-1.2.0.tgz#73ee11982d86caaf7959828d519cfe927fac5f03" integrity sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w== -fast-glob@^3.0.0: +fast-glob@^3.0.0, fast-glob@^3.1.1: version "3.2.4" resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.2.4.tgz#d20aefbf99579383e7f3cc66529158c9b98554d3" integrity sha512-kr/Oo6PX51265qeuCYsyGypiO5uJFgBS0jksyG7FUeCyQzNwYnzrNIMR1NXfkZXsMYXYLRAHgISHBz8gQcxKHQ== @@ -2772,7 +2914,7 @@ fast-json-stable-stringify@^2.0.0: resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== -fast-levenshtein@~2.0.6: +fast-levenshtein@^2.0.6, fast-levenshtein@~2.0.6: version "2.0.6" resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" integrity sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc= @@ -2791,7 +2933,7 @@ fb-watchman@^2.0.0: dependencies: bser "2.1.1" -figures@^3.0.0, figures@^3.2.0: +figures@^3.2.0: version "3.2.0" resolved "https://registry.yarnpkg.com/figures/-/figures-3.2.0.tgz#625c18bd293c604dc4a8ddb2febf0c88341746af" integrity sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg== @@ -2837,6 +2979,13 @@ find-up@^4.0.0, find-up@^4.1.0: locate-path "^5.0.0" path-exists "^4.0.0" +find-versions@^3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/find-versions/-/find-versions-3.2.0.tgz#10297f98030a786829681690545ef659ed1d254e" + integrity sha512-P8WRou2S+oe222TOCHitLy8zj+SIsVJh52VP4lvXkaFVnOFFdoWv1H1Jjvel1aI6NCFOAaeAVm8qrI0odiLcww== + dependencies: + semver-regex "^2.0.0" + flat-cache@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-2.0.1.tgz#5d296d6f04bda44a4630a301413bdbc2ec085ec0" @@ -3016,6 +3165,18 @@ globals@^12.1.0: dependencies: type-fest "^0.8.1" +globby@^11.0.1: + version "11.0.1" + resolved "https://registry.yarnpkg.com/globby/-/globby-11.0.1.tgz#9a2bf107a068f3ffeabc49ad702c79ede8cfd357" + integrity sha512-iH9RmgwCmUJHi2z5o2l3eTtGBtXek1OYlHrbcxOYugyHLmAsZrPj43OtHThd62Buh/Vv6VyCBD2bdyWcGNQqoQ== + dependencies: + array-union "^2.1.0" + dir-glob "^3.0.1" + fast-glob "^3.1.1" + ignore "^5.1.4" + merge2 "^1.3.0" + slash "^3.0.0" + graceful-fs@^4.1.2, graceful-fs@^4.1.3, graceful-fs@^4.2.4: version "4.2.4" resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.4.tgz#2256bde14d3632958c465ebc96dc467ca07a29fb" @@ -3044,6 +3205,13 @@ hard-rejection@^2.1.0: resolved "https://registry.yarnpkg.com/hard-rejection/-/hard-rejection-2.1.0.tgz#1c6eda5c1685c63942766d79bb40ae773cecd883" integrity sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA== +has-ansi@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-2.0.0.tgz#34f5049ce1ecdf2b0649af3ef24e45ed35416d91" + integrity sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE= + dependencies: + ansi-regex "^2.0.0" + has-flag@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" @@ -3135,7 +3303,23 @@ human-signals@^1.1.1: resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-1.1.1.tgz#c5b1cd14f50aeae09ab6c59fe63ba3395fe4dfa3" integrity sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw== -iconv-lite@0.4.24, iconv-lite@^0.4.24: +husky@^4.3.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/husky/-/husky-4.3.0.tgz#0b2ec1d66424e9219d359e26a51c58ec5278f0de" + integrity sha512-tTMeLCLqSBqnflBZnlVDhpaIMucSGaYyX6855jM4AguGeWCeSzNdb1mfyWduTZ3pe3SJVvVWGL0jO1iKZVPfTA== + dependencies: + chalk "^4.0.0" + ci-info "^2.0.0" + compare-versions "^3.6.0" + cosmiconfig "^7.0.0" + find-versions "^3.2.0" + opencollective-postinstall "^2.0.2" + pkg-dir "^4.2.0" + please-upgrade-node "^3.2.0" + slash "^3.0.0" + which-pm-runs "^1.0.0" + +iconv-lite@0.4.24: version "0.4.24" resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== @@ -3147,6 +3331,11 @@ ignore@^4.0.6: resolved "https://registry.yarnpkg.com/ignore/-/ignore-4.0.6.tgz#750e3db5862087b4737ebac8207ffd1ef27b25fc" integrity sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg== +ignore@^5.1.4: + version "5.1.8" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.1.8.tgz#f150a8b50a34289b33e22f5889abd4d8016f0e57" + integrity sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw== + import-fresh@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-2.0.0.tgz#d81355c15612d386c61f9ddd3922d4304822a546" @@ -3204,25 +3393,6 @@ ini@^1.3.4: resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.5.tgz#eee25f56db1c9ec6085e0c22778083f596abf927" integrity sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw== -inquirer@^7.0.0: - version "7.3.3" - resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-7.3.3.tgz#04d176b2af04afc157a83fd7c100e98ee0aad003" - integrity sha512-JG3eIAj5V9CwcGvuOmoo6LB9kbAYT8HXffUl6memuszlwDC/qvFAJw49XJ5NROSFNPxp3iQg1GqkFhaY/CR0IA== - dependencies: - ansi-escapes "^4.2.1" - chalk "^4.1.0" - cli-cursor "^3.1.0" - cli-width "^3.0.0" - external-editor "^3.0.3" - figures "^3.0.0" - lodash "^4.17.19" - mute-stream "0.0.8" - run-async "^2.4.0" - rxjs "^6.6.0" - string-width "^4.1.0" - strip-ansi "^6.0.0" - through "^2.3.6" - ip-regex@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/ip-regex/-/ip-regex-2.1.0.tgz#fa78bf5d2e6913c911ce9f819ee5146bb6d844e9" @@ -3549,7 +3719,7 @@ jest-config@^25.5.4: pretty-format "^25.5.0" realpath-native "^2.0.0" -jest-diff@^25.2.1, jest-diff@^25.5.0: +jest-diff@^25.5.0: version "25.5.0" resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-25.5.0.tgz#1dd26ed64f96667c068cef026b677dfa01afcfa9" integrity sha512-z1kygetuPiREYdNIumRpAHY6RXiGmp70YHptjdaxTWGmA085W3iCnXNx0DhflK3vwrKmrRWyY1wUpkPMVxMK7A== @@ -4018,7 +4188,15 @@ leven@^3.1.0: resolved "https://registry.yarnpkg.com/leven/-/leven-3.1.0.tgz#77891de834064cccba82ae7842bb6b14a13ed7f2" integrity sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A== -levn@^0.3.0, levn@~0.3.0: +levn@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/levn/-/levn-0.4.1.tgz#ae4562c007473b932a6200d403268dd2fffc6ade" + integrity sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ== + dependencies: + prelude-ls "^1.2.1" + type-check "~0.4.0" + +levn@~0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee" integrity sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4= @@ -4096,6 +4274,11 @@ lodash._reinterpolate@^3.0.0: resolved "https://registry.yarnpkg.com/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz#0ccf2d89166af03b3663c796538b75ac6e114d9d" integrity sha1-DM8tiRZq8Ds2Y8eWU4t1rG4RTZ0= +lodash.merge@^4.6.0: + version "4.6.2" + resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a" + integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ== + lodash.sortby@^4.7.0: version "4.7.0" resolved "https://registry.yarnpkg.com/lodash.sortby/-/lodash.sortby-4.7.0.tgz#edd14c824e2cc9c1e0b0a1b42bb5210516a42438" @@ -4143,6 +4326,19 @@ log-update@^4.0.0: slice-ansi "^4.0.0" wrap-ansi "^6.2.0" +loglevel-colored-level-prefix@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/loglevel-colored-level-prefix/-/loglevel-colored-level-prefix-1.0.0.tgz#6a40218fdc7ae15fc76c3d0f3e676c465388603e" + integrity sha1-akAhj9x64V/HbD0PPmdsRlOIYD4= + dependencies: + chalk "^1.1.3" + loglevel "^1.4.1" + +loglevel@^1.4.1: + version "1.7.1" + resolved "https://registry.yarnpkg.com/loglevel/-/loglevel-1.7.1.tgz#005fde2f5e6e47068f935ff28573e125ef72f197" + integrity sha512-Hesni4s5UkWkwCGJMQGAh71PaLUmKFM60dHvq0zi/vDhhrzuk+4GgNbTXJ12YYQJn6ZKBDNIjYcuQGKudvqrIw== + lolex@^5.0.0: version "5.1.2" resolved "https://registry.yarnpkg.com/lolex/-/lolex-5.1.2.tgz#953694d098ce7c07bc5ed6d0e42bc6c0c6d5a367" @@ -4358,11 +4554,6 @@ ms@2.1.2: resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== -mute-stream@0.0.8: - version "0.0.8" - resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.8.tgz#1630c42b2251ff81e2a283de96a5497ea92e5e0d" - integrity sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA== - nanomatch@^1.2.9: version "1.2.13" resolved "https://registry.yarnpkg.com/nanomatch/-/nanomatch-1.2.13.tgz#b87a8aa4fc0de8fe6be88895b38983ff265bd119" @@ -4524,7 +4715,12 @@ onetime@^5.1.0: dependencies: mimic-fn "^2.1.0" -optionator@^0.8.1, optionator@^0.8.3: +opencollective-postinstall@^2.0.2: + version "2.0.3" + resolved "https://registry.yarnpkg.com/opencollective-postinstall/-/opencollective-postinstall-2.0.3.tgz#7a0fff978f6dbfa4d006238fbac98ed4198c3259" + integrity sha512-8AV/sCtuzUeTo8gQK5qDZzARrulB3egtLzFgteqB2tcT4Mw7B8Kt7JcDHmltjz6FOAHsvTevk70gZEbhM4ZS9Q== + +optionator@^0.8.1: version "0.8.3" resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.3.tgz#84fa1d036fe9d3c7e21d99884b601167ec8fb495" integrity sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA== @@ -4536,10 +4732,17 @@ optionator@^0.8.1, optionator@^0.8.3: type-check "~0.3.2" word-wrap "~1.2.3" -os-tmpdir@~1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" - integrity sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ= +optionator@^0.9.1: + version "0.9.1" + resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.9.1.tgz#4f236a6373dae0566a6d43e1326674f50c291499" + integrity sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw== + dependencies: + deep-is "^0.1.3" + fast-levenshtein "^2.0.6" + levn "^0.4.1" + prelude-ls "^1.2.1" + type-check "^0.4.0" + word-wrap "^1.2.3" p-each-series@^2.1.0: version "2.1.0" @@ -4724,11 +4927,34 @@ posix-character-classes@^0.1.0: resolved "https://registry.yarnpkg.com/posix-character-classes/-/posix-character-classes-0.1.1.tgz#01eac0fe3b5af71a2a6c02feabb8c1fef7e00eab" integrity sha1-AerA/jta9xoqbAL+q7jB/vfgDqs= +prelude-ls@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396" + integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g== + prelude-ls@~1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54" integrity sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ= +prettier-eslint@^12.0.0: + version "12.0.0" + resolved "https://registry.yarnpkg.com/prettier-eslint/-/prettier-eslint-12.0.0.tgz#b4dab5111aad1c0dca062eb7f92a69d5fb1ac1d3" + integrity sha512-N8SGGQwAosISXTNl1E57sBbtnqUGlyRWjcfIUxyD3HF4ynehA9GZ8IfJgiep/OfYvCof/JEpy9ZqSl250Wia7A== + dependencies: + "@typescript-eslint/parser" "^3.0.0" + common-tags "^1.4.0" + dlv "^1.1.0" + eslint "^7.9.0" + indent-string "^4.0.0" + lodash.merge "^4.6.0" + loglevel-colored-level-prefix "^1.0.0" + prettier "^2.0.0" + pretty-format "^23.0.1" + require-relative "^0.8.7" + typescript "^3.9.3" + vue-eslint-parser "~7.1.0" + prettier-linter-helpers@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz#d23d41fe1375646de2d0104d3454a3008802cf7b" @@ -4736,12 +4962,20 @@ prettier-linter-helpers@^1.0.0: dependencies: fast-diff "^1.1.2" -prettier@^2.0.5: - version "2.1.2" - resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.1.2.tgz#3050700dae2e4c8b67c4c3f666cdb8af405e1ce5" - integrity sha512-16c7K+x4qVlJg9rEbXl7HEGmQyZlG4R9AgP+oHKRMsMsuk8s+ATStlf1NpDqyBI1HpVyfjLOeMhH2LvuNvV5Vg== +prettier@^2.0.0, prettier@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.2.1.tgz#795a1a78dd52f073da0cd42b21f9c91381923ff5" + integrity sha512-PqyhM2yCjg/oKkFPtTGUojv7gnZAoG80ttl45O6x2Ug/rMJw4wcc9k6aaf2hibP7BGVCCM33gZoGjyvt9mm16Q== -pretty-format@^25.2.1, pretty-format@^25.5.0: +pretty-format@^23.0.1: + version "23.6.0" + resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-23.6.0.tgz#5eaac8eeb6b33b987b7fe6097ea6a8a146ab5760" + integrity sha512-zf9NV1NSlDLDjycnwm6hpFATCGl/K1lt0R/GdkAK2O5LN/rwJoB+Mh93gGJjut4YbmecbfgLWVGSTCr0Ewvvbw== + dependencies: + ansi-regex "^3.0.0" + ansi-styles "^3.2.0" + +pretty-format@^25.5.0: version "25.5.0" resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-25.5.0.tgz#7873c1d774f682c34b8d48b6743a2bf2ac55791a" integrity sha512-kbo/kq2LQ/A/is0PQwsEHM7Ca6//bGPPvU6UnsdDRSKTWxT/ru/xb88v4BJf6a69H+uTytOEsTusT9ksd/1iWQ== @@ -4949,12 +5183,7 @@ regex-not@^1.0.0, regex-not@^1.0.2: extend-shallow "^3.0.2" safe-regex "^1.1.0" -regexpp@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-2.0.1.tgz#8d19d31cf632482b589049f8281f93dbcba4d07f" - integrity sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw== - -regexpp@^3.0.0: +regexpp@^3.0.0, regexpp@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-3.1.0.tgz#206d0ad0a5648cffbdb8ae46438f3dc51c9f78e2" integrity sha512-ZOIzd8yVsQQA7j8GCSlPGXwg5PfmA1mrq0JP4nGhh54LaKN3xdai/vHUDu74pKwV8OxseMS65u2NImosQcSD0Q== @@ -5055,6 +5284,11 @@ require-package-name@^2.0.1: resolved "https://registry.yarnpkg.com/require-package-name/-/require-package-name-2.0.1.tgz#c11e97276b65b8e2923f75dabf5fb2ef0c3841b9" integrity sha1-wR6XJ2tluOKSP3Xav1+y7ww4Qbk= +require-relative@^0.8.7: + version "0.8.7" + resolved "https://registry.yarnpkg.com/require-relative/-/require-relative-0.8.7.tgz#7999539fc9e047a37928fa196f8e1563dabd36de" + integrity sha1-eZlTn8ngR6N5KPoZb44VY9q9Nt4= + resolve-cwd@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/resolve-cwd/-/resolve-cwd-3.0.0.tgz#0f0075f1bb2544766cf73ba6a6e2adfebcb13f2d" @@ -5189,17 +5423,12 @@ rsvp@^4.8.4: resolved "https://registry.yarnpkg.com/rsvp/-/rsvp-4.8.5.tgz#c8f155311d167f68f21e168df71ec5b083113734" integrity sha512-nfMOlASu9OnRJo1mbEk2cz0D56a1MBNrJ7orjRZQG10XDyuvwksKbuXNp6qa+kbn839HwjwhBzhFmdsaEAfauA== -run-async@^2.4.0: - version "2.4.1" - resolved "https://registry.yarnpkg.com/run-async/-/run-async-2.4.1.tgz#8440eccf99ea3e70bd409d49aab88e10c189a455" - integrity sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ== - run-parallel@^1.1.9: version "1.1.10" resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.1.10.tgz#60a51b2ae836636c81377df16cb107351bcd13ef" integrity sha512-zb/1OuZ6flOlH6tQyMPUrE3x3Ulxjlo9WIVXR4yVYi4H9UXQaeIsPbLn2R3O3vQCnDKkAl2qHiuocKKX4Tz/Sw== -rxjs@^6.6.0, rxjs@^6.6.3: +rxjs@^6.6.3: version "6.6.3" resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.6.3.tgz#8ca84635c4daa900c0d3967a6ee7ac60271ee552" integrity sha512-trsQc+xYYXZ3urjOiJOuCOa5N3jAZ3eiSpQB5hIT8zGlL2QfnHLJ2r7GMkBGuIausdJN1OneaI6gQlsqNHHmZQ== @@ -5255,12 +5484,17 @@ semver-compare@^1.0.0: resolved "https://registry.yarnpkg.com/semver-compare/-/semver-compare-1.0.0.tgz#0dee216a1c941ab37e9efb1788f6afc5ff5537fc" integrity sha1-De4hahyUGrN+nvsXiPavxf9VN/w= +semver-regex@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/semver-regex/-/semver-regex-2.0.0.tgz#a93c2c5844539a770233379107b38c7b4ac9d338" + integrity sha512-mUdIBBvdn0PLOeP3TEkMH7HHeUP3GjsXCwKarjv/kGmUFOYg1VqEemKhoQpWMu6X2I8kHeuVdGibLGkVK+/5Qw== + "semver@2 || 3 || 4 || 5", semver@^5.4.1, semver@^5.5.0: version "5.7.1" resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== -semver@6.3.0, semver@^6.0.0, semver@^6.1.2, semver@^6.3.0: +semver@6.3.0, semver@^6.0.0, semver@^6.3.0: version "6.3.0" resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== @@ -5270,6 +5504,13 @@ semver@7.0.0: resolved "https://registry.yarnpkg.com/semver/-/semver-7.0.0.tgz#5f3ca35761e47e05b206c6daff2cf814f0316b8e" integrity sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A== +semver@^7.2.1: + version "7.3.4" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.4.tgz#27aaa7d2e4ca76452f98d3add093a72c943edc97" + integrity sha512-tCfb2WLjqFAtXn4KEdxIhalnRtoKFN7nAwj0B3ZXCbQloV2tq5eDbcTmT68JJD3nRJq24/XgxtQKFIpQdtvmVw== + dependencies: + lru-cache "^6.0.0" + semver@^7.3.2: version "7.3.2" resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.2.tgz#604962b052b81ed0786aae84389ffba70ffd3938" @@ -5586,6 +5827,13 @@ stringify-object@^3.3.0: is-obj "^1.0.1" is-regexp "^1.0.0" +strip-ansi@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf" + integrity sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8= + dependencies: + ansi-regex "^2.0.0" + strip-ansi@^5.1.0, strip-ansi@^5.2.0: version "5.2.0" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-5.2.0.tgz#8c9a536feb6afc962bdfa5b104a5091c1ad9c0ae" @@ -5632,11 +5880,16 @@ strip-indent@^3.0.0: dependencies: min-indent "^1.0.0" -strip-json-comments@^3.0.1: +strip-json-comments@^3.1.0, strip-json-comments@^3.1.1: version "3.1.1" resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== +supports-color@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7" + integrity sha1-U10EXOa2Nj+kARcIRimZXp3zJMc= + supports-color@^5.3.0: version "5.5.0" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" @@ -5737,18 +5990,11 @@ through2@^4.0.0: dependencies: readable-stream "3" -"through@>=2.2.7 <3", through@^2.3.6, through@^2.3.8: +"through@>=2.2.7 <3", through@^2.3.8: version "2.3.8" resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" integrity sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU= -tmp@^0.0.33: - version "0.0.33" - resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.33.tgz#6d34335889768d21b2bcda0aa277ced3b1bfadf9" - integrity sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw== - dependencies: - os-tmpdir "~1.0.2" - tmpl@1.0.x: version "1.0.4" resolved "https://registry.yarnpkg.com/tmpl/-/tmpl-1.0.4.tgz#23640dd7b42d00433911140820e5cf440e521dd1" @@ -5854,6 +6100,13 @@ tweetnacl@^0.14.3, tweetnacl@~0.14.0: resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64" integrity sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q= +type-check@^0.4.0, type-check@~0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.4.0.tgz#07b8203bfa7056c0657050e3ccd2c37730bab8f1" + integrity sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew== + dependencies: + prelude-ls "^1.2.1" + type-check@~0.3.2: version "0.3.2" resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.3.2.tgz#5884cab512cf1d355e3fb784f30804b2b520db72" @@ -5893,11 +6146,16 @@ typedarray-to-buffer@^3.1.5: dependencies: is-typedarray "^1.0.0" -typescript@^3.8.3: +typescript@^3.9.3: version "3.9.7" resolved "https://registry.yarnpkg.com/typescript/-/typescript-3.9.7.tgz#98d600a5ebdc38f40cb277522f12dc800e9e25fa" integrity sha512-BLbiRkiBzAwsjut4x/dsibSTB6yWpwT5qWmC2OfuCg3GgVQCSgMs4vEctYPhsaGtd0AeuuHMkjZ2h2WG8MSzRw== +typescript@^4.1.2: + version "4.1.2" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.1.2.tgz#6369ef22516fe5e10304aae5a5c4862db55380e9" + integrity sha512-thGloWsGH3SOxv1SoY7QojKi0tc+8FnOmiarEGMbd/lar7QOEd3hvlx3Fp5y6FlDUGl9L+pd4n2e+oToGMmhRQ== + unicode-canonical-property-names-ecmascript@^1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-1.0.4.tgz#2619800c4c825800efdd8343af7dd9933cbe2818" @@ -5997,6 +6255,18 @@ verror@1.10.0: core-util-is "1.0.2" extsprintf "^1.2.0" +vue-eslint-parser@~7.1.0: + version "7.1.1" + resolved "https://registry.yarnpkg.com/vue-eslint-parser/-/vue-eslint-parser-7.1.1.tgz#c43c1c715ff50778b9a7e9a4e16921185f3425d3" + integrity sha512-8FdXi0gieEwh1IprIBafpiJWcApwrU+l2FEj8c1HtHFdNXMd0+2jUSjBVmcQYohf/E72irwAXEXLga6TQcB3FA== + dependencies: + debug "^4.1.1" + eslint-scope "^5.0.0" + eslint-visitor-keys "^1.1.0" + espree "^6.2.1" + esquery "^1.0.1" + lodash "^4.17.15" + w3c-hr-time@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz#0a89cdf5cc15822df9c360543676963e0cc308cd" @@ -6051,6 +6321,11 @@ which-module@^2.0.0: resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a" integrity sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho= +which-pm-runs@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/which-pm-runs/-/which-pm-runs-1.0.0.tgz#670b3afbc552e0b55df6b7780ca74615f23ad1cb" + integrity sha1-Zws6+8VS4LVd9rd4DKdGFfI60cs= + which@^1.2.9, which@^1.3.1: version "1.3.1" resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" @@ -6065,7 +6340,7 @@ which@^2.0.1, which@^2.0.2: dependencies: isexe "^2.0.0" -word-wrap@~1.2.3: +word-wrap@^1.2.3, word-wrap@~1.2.3: version "1.2.3" resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.3.tgz#610636f6b1f703891bd34771ccb17fb93b47079c" integrity sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==