From 6475b5854112dd4c991980ac551d0e02639979a7 Mon Sep 17 00:00:00 2001 From: badrAZ Date: Wed, 26 Feb 2020 16:25:35 +0100 Subject: [PATCH] feat(audit-log): version 1 (#4740) Fixes #4653 #701 --- @xen-orchestra/audit-core/.babelrc.js | 3 + @xen-orchestra/audit-core/.npmignore | 24 + @xen-orchestra/audit-core/package.json | 40 + @xen-orchestra/audit-core/src/index.js | 127 +++ @xen-orchestra/audit-core/src/index.spec.js | 126 +++ .../audit-core/src/specification.ts | 25 + CHANGELOG.unreleased.md | 4 + packages/xo-common/src/api-errors.js | 17 + packages/xo-server-audit/.babelrc.js | 3 + packages/xo-server-audit/.npmignore | 10 + packages/xo-server-audit/README.md | 50 ++ packages/xo-server-audit/config.toml | 39 + packages/xo-server-audit/package.json | 60 ++ packages/xo-server-audit/src/index.js | 222 +++++ packages/xo-server/src/index.js | 15 + packages/xo-server/src/xo-mixins/api.js | 8 + packages/xo-web/src/common/intl/messages.js | 26 + packages/xo-web/src/common/render-xo-item.js | 54 +- packages/xo-web/src/common/xo/index.js | 28 + packages/xo-web/src/icons.scss | 4 + packages/xo-web/src/xo-app/menu/index.js | 5 + .../xo-web/src/xo-app/settings/audit/index.js | 277 ++++++ packages/xo-web/src/xo-app/settings/index.js | 5 + yarn.lock | 841 +++++++++++++++++- 24 files changed, 2006 insertions(+), 7 deletions(-) create mode 100644 @xen-orchestra/audit-core/.babelrc.js create mode 100644 @xen-orchestra/audit-core/.npmignore create mode 100644 @xen-orchestra/audit-core/package.json create mode 100644 @xen-orchestra/audit-core/src/index.js create mode 100644 @xen-orchestra/audit-core/src/index.spec.js create mode 100644 @xen-orchestra/audit-core/src/specification.ts create mode 100644 packages/xo-server-audit/.babelrc.js create mode 100644 packages/xo-server-audit/.npmignore create mode 100644 packages/xo-server-audit/README.md create mode 100644 packages/xo-server-audit/config.toml create mode 100644 packages/xo-server-audit/package.json create mode 100644 packages/xo-server-audit/src/index.js create mode 100644 packages/xo-web/src/xo-app/settings/audit/index.js diff --git a/@xen-orchestra/audit-core/.babelrc.js b/@xen-orchestra/audit-core/.babelrc.js new file mode 100644 index 000000000..4e27ec135 --- /dev/null +++ b/@xen-orchestra/audit-core/.babelrc.js @@ -0,0 +1,3 @@ +module.exports = require('../../@xen-orchestra/babel-config')( + require('./package.json') +) diff --git a/@xen-orchestra/audit-core/.npmignore b/@xen-orchestra/audit-core/.npmignore new file mode 100644 index 000000000..e058b6bc1 --- /dev/null +++ b/@xen-orchestra/audit-core/.npmignore @@ -0,0 +1,24 @@ +/benchmark/ +/benchmarks/ +*.bench.js +*.bench.js.map + +/examples/ +example.js +example.js.map +*.example.js +*.example.js.map + +/fixture/ +/fixtures/ +*.fixture.js +*.fixture.js.map +*.fixtures.js +*.fixtures.js.map + +/test/ +/tests/ +*.spec.js +*.spec.js.map + +__snapshots__/ diff --git a/@xen-orchestra/audit-core/package.json b/@xen-orchestra/audit-core/package.json new file mode 100644 index 000000000..2334f86ad --- /dev/null +++ b/@xen-orchestra/audit-core/package.json @@ -0,0 +1,40 @@ +{ + "name": "@xen-orchestra/audit-core", + "homepage": "https://github.com/vatesfr/xen-orchestra/tree/master/@xen-orchestra/audit-core", + "bugs": "https://github.com/vatesfr/xen-orchestra/issues", + "repository": { + "directory": "@xen-orchestra/audit-core", + "type": "git", + "url": "https://github.com/vatesfr/xen-orchestra.git" + }, + "version": "0.0.0", + "engines": { + "node": ">=8.10" + }, + "main": "dist/", + "scripts": { + "build": "cross-env NODE_ENV=production babel --source-maps --out-dir=dist/ src/", + "dev": "cross-env NODE_ENV=development babel --watch --source-maps --out-dir=dist/ src/", + "postversion": "npm publish --access public", + "prebuild": "rimraf dist/", + "predev": "yarn run prebuild", + "prepublishOnly": "yarn run build" + }, + "devDependencies": { + "@babel/cli": "^7.7.4", + "@babel/core": "^7.7.4", + "@babel/plugin-proposal-decorators": "^7.8.0", + "@babel/plugin-proposal-nullish-coalescing-operator": "^7.8.0", + "@babel/preset-env": "^7.7.4", + "@babel/preset-typescript": "^7.7.4", + "cross": "^1.0.0", + "rimraf": "^3.0.0" + }, + "dependencies": { + "core-js": "^3.6.4", + "golike-defer": "^0.4.1", + "lodash": "^4.17.15", + "object-hash": "^2.0.1" + }, + "private": false +} diff --git a/@xen-orchestra/audit-core/src/index.js b/@xen-orchestra/audit-core/src/index.js new file mode 100644 index 000000000..b15003a33 --- /dev/null +++ b/@xen-orchestra/audit-core/src/index.js @@ -0,0 +1,127 @@ +// see https://github.com/babel/babel/issues/8450 +import 'core-js/features/symbol/async-iterator' + +import assert from 'assert' +import defer from 'golike-defer' +import hash from 'object-hash' + +export class Storage { + constructor() { + this._lock = Promise.resolve() + } + + async acquireLock() { + const lock = this._lock + let releaseLock + this._lock = new Promise(resolve => { + releaseLock = resolve + }) + await lock + return releaseLock + } +} + +// Format: $$$ +// +// http://man7.org/linux/man-pages/man3/crypt.3.html#NOTES +const ID_TO_ALGORITHM = { + '5': 'sha256', +} + +export class AlteredRecordError extends Error { + constructor(id, nValid, record) { + super('altered record') + + this.id = id + this.nValid = nValid + this.record = record + } +} + +export class MissingRecordError extends Error { + constructor(id, nValid) { + super('missing record') + + this.id = id + this.nValid = nValid + } +} + +export const NULL_ID = 'nullId' + +const HASH_ALGORITHM_ID = '5' +const createHash = (data, algorithmId = HASH_ALGORITHM_ID) => + `$${algorithmId}$$${hash(data, { + algorithm: ID_TO_ALGORITHM[algorithmId], + excludeKeys: key => key === 'id', + })}` + +export class AuditCore { + constructor(storage) { + assert.notStrictEqual(storage, undefined) + this._storage = storage + } + + @defer + async add($defer, subject, event, data) { + const time = Date.now() + const storage = this._storage + $defer(await storage.acquireLock()) + + // delete "undefined" properties and normalize data with JSON.stringify + const record = JSON.parse( + JSON.stringify({ + data, + event, + previousId: (await storage.getLastId()) ?? NULL_ID, + subject, + time, + }) + ) + record.id = createHash(record) + await storage.put(record) + await storage.setLastId(record.id) + return record + } + + // TODO: https://github.com/vatesfr/xen-orchestra/pull/4733#discussion_r366897798 + async checkIntegrity(oldest, newest) { + let nValid = 0 + while (newest !== oldest) { + const record = await this._storage.get(newest) + if (record === undefined) { + throw new MissingRecordError(newest, nValid) + } + if ( + newest !== createHash(record, newest.slice(1, newest.indexOf('$', 1))) + ) { + throw new AlteredRecordError(newest, nValid, record) + } + newest = record.previousId + nValid++ + } + return nValid + } + + async *getFrom(newest) { + const storage = this._storage + + let id = newest ?? (await storage.getLastId()) + if (id === undefined) { + return + } + + let record + while ((record = await storage.get(id)) !== undefined) { + yield record + id = record.previousId + } + } + + async deleteFrom(newest) { + assert.notStrictEqual(newest, undefined) + for await (const { id } of this.getFrom(newest)) { + await this._storage.del(id) + } + } +} diff --git a/@xen-orchestra/audit-core/src/index.spec.js b/@xen-orchestra/audit-core/src/index.spec.js new file mode 100644 index 000000000..b96291d4f --- /dev/null +++ b/@xen-orchestra/audit-core/src/index.spec.js @@ -0,0 +1,126 @@ +/* eslint-env jest */ + +import { + AlteredRecordError, + AuditCore, + MissingRecordError, + NULL_ID, + Storage, +} from '.' + +const asyncIteratorToArray = async asyncIterator => { + const array = [] + for await (const entry of asyncIterator) { + array.push(entry) + } + return array +} + +class DB extends Storage { + constructor() { + super() + + this._db = new Map() + this._lastId = undefined + } + + async put(record) { + this._db.set(record.id, record) + } + + async setLastId(id) { + this._lastId = id + } + + async getLastId() { + return this._lastId + } + + async del(id) { + this._db.delete(id) + } + + async get(id) { + return this._db.get(id) + } + + _clear() { + return this._db.clear() + } +} + +const DATA = [ + [ + { + name: 'subject0', + }, + 'event0', + {}, + ], + [ + { + name: 'subject1', + }, + 'event1', + {}, + ], + [ + { + name: 'subject2', + }, + 'event2', + {}, + ], +] + +const db = new DB() +const auditCore = new AuditCore(db) +const storeAuditRecords = async () => { + await Promise.all(DATA.map(data => auditCore.add(...data))) + const records = await asyncIteratorToArray(auditCore.getFrom()) + expect(records.length).toBe(DATA.length) + return records +} + +describe('auditCore', () => { + afterEach(() => db._clear()) + + it('detects that a record is missing', async () => { + const [newestRecord, deletedRecord] = await storeAuditRecords() + + const nValidRecords = await auditCore.checkIntegrity( + NULL_ID, + newestRecord.id + ) + expect(nValidRecords).toBe(DATA.length) + + await db.del(deletedRecord.id) + await expect( + auditCore.checkIntegrity(NULL_ID, newestRecord.id) + ).rejects.toEqual(new MissingRecordError(deletedRecord.id, 1)) + }) + + it('detects that a record has been altered', async () => { + const [newestRecord, alteredRecord] = await storeAuditRecords() + + alteredRecord.event = '' + await db.put(alteredRecord) + + await expect( + auditCore.checkIntegrity(NULL_ID, newestRecord.id) + ).rejects.toEqual( + new AlteredRecordError(alteredRecord.id, 1, alteredRecord) + ) + }) + + it('confirms interval integrity after deletion of records outside of the interval', async () => { + const [thirdRecord, secondRecord, firstRecord] = await storeAuditRecords() + + await auditCore.deleteFrom(secondRecord.id) + + expect(await db.get(firstRecord.id)).toBe(undefined) + expect(await db.get(secondRecord.id)).toBe(undefined) + + await auditCore.checkIntegrity(secondRecord.id, thirdRecord.id) + }) +}) diff --git a/@xen-orchestra/audit-core/src/specification.ts b/@xen-orchestra/audit-core/src/specification.ts new file mode 100644 index 000000000..daa27172c --- /dev/null +++ b/@xen-orchestra/audit-core/src/specification.ts @@ -0,0 +1,25 @@ +class Storage { + acquire: () => Promise<() => undefined> + del: (id: string) => Promise + get: (id: string) => Promise + getLastId: () => Promise + put: (record: Record) => Promise + setLastId: (id: string) => Promise +} + +interface Record { + data: object + event: string + id: string + previousId: string + subject: object + time: number +} + +export class AuditCore { + constructor(storage: Storage) {} + public add(subject: any, event: string, data: any): Promise {} + public checkIntegrity(oldest: string, newest: string): Promise {} + public getFrom(newest?: string): AsyncIterator {} + public deleteFrom(newest: string): Promise {} +} diff --git a/CHANGELOG.unreleased.md b/CHANGELOG.unreleased.md index 2da841e40..988c8c11d 100644 --- a/CHANGELOG.unreleased.md +++ b/CHANGELOG.unreleased.md @@ -13,6 +13,7 @@ - [Menu] Display a warning icon in case of missing patches [#4475](https://github.com/vatesfr/xen-orchestra/issues/4475) (PR [#4683](https://github.com/vatesfr/xen-orchestra/pull/4683)) - [SR/general] Clickable SR usage graph: shows the corresponding disks when you click on one of the sections [#4747](https://github.com/vatesfr/xen-orchestra/issues/4747) (PR [#4754](https://github.com/vatesfr/xen-orchestra/pull/4754)) - [New VM] Ability to copy host BIOS strings [#4204](https://github.com/vatesfr/xen-orchestra/issues/4204) (PR [4755](https://github.com/vatesfr/xen-orchestra/pull/4755)) +- [Audit log] Record side effects triggered by users [#4653](https://github.com/vatesfr/xen-orchestra/issues/4653) [#701](https://github.com/vatesfr/xen-orchestra/issues/701) (PR [#4740](https://github.com/vatesfr/xen-orchestra/pull/4740)) ### Bug fixes @@ -29,6 +30,9 @@ > > Rule of thumb: add packages on top. +- xo-common v0.4.0 +- @xen-orchestra/audit-core v0.1.0 +- xo-server-audit v0.1.0 - xo-server-auth-ldap v0.7.0 - xo-server-usage-report v0.7.4 - xo-server-sdn-controller v0.4.0 diff --git a/packages/xo-common/src/api-errors.js b/packages/xo-common/src/api-errors.js index 1c2437495..a39d1c243 100644 --- a/packages/xo-common/src/api-errors.js +++ b/packages/xo-common/src/api-errors.js @@ -180,3 +180,20 @@ export const operationFailed = create(21, ({ objectId, code }) => ({ }, message: 'operation failed', })) + +export const missingAuditRecord = create(22, ({ id, nValid }) => ({ + data: { + id, + nValid, + }, + message: 'missing record', +})) + +export const alteredAuditRecord = create(23, ({ id, record, nValid }) => ({ + data: { + id, + record, + nValid, + }, + message: 'altered record', +})) diff --git a/packages/xo-server-audit/.babelrc.js b/packages/xo-server-audit/.babelrc.js new file mode 100644 index 000000000..4e27ec135 --- /dev/null +++ b/packages/xo-server-audit/.babelrc.js @@ -0,0 +1,3 @@ +module.exports = require('../../@xen-orchestra/babel-config')( + require('./package.json') +) diff --git a/packages/xo-server-audit/.npmignore b/packages/xo-server-audit/.npmignore new file mode 100644 index 000000000..c31ee82cb --- /dev/null +++ b/packages/xo-server-audit/.npmignore @@ -0,0 +1,10 @@ +/examples/ +example.js +example.js.map +*.example.js +*.example.js.map + +/test/ +/tests/ +*.spec.js +*.spec.js.map diff --git a/packages/xo-server-audit/README.md b/packages/xo-server-audit/README.md new file mode 100644 index 000000000..94a9ccb70 --- /dev/null +++ b/packages/xo-server-audit/README.md @@ -0,0 +1,50 @@ +# xo-server-audit [![Build Status](https://api.travis-ci.org/vatesfr/xo-server-audit.png?branch=master)](https://travis-ci.org/vatesfr/xen-orchestra) + +> **TODO** + +## Install + +Installation of the [npm package](https://npmjs.org/package/xo-server-audit): + +``` +> npm install --global xo-server-audit +``` + +## Usage + +Like all other xo-server plugins, it can be configured directly via +the web interface, see [the plugin documentation](https://xen-orchestra.com/docs/plugins.html). + +## Development + +``` +# Install dependencies +> yarn + +# Run the tests +> yarn test + +# Continuously compile +> yarn dev + +# Continuously run the tests +> yarn dev-test + +# Build for production +> yarn build +``` + +## Contributions + +Contributions are _very_ welcomed, either on the documentation or on +the code. + +You may: + +- report any [issue](https://github.com/vatesfr/xen-orchestra/issues) + you've encountered; +- fork and create a pull request. + +## License + +AGPL3 © [Vates SAS](http://vates.fr) diff --git a/packages/xo-server-audit/config.toml b/packages/xo-server-audit/config.toml new file mode 100644 index 000000000..bc51b1b31 --- /dev/null +++ b/packages/xo-server-audit/config.toml @@ -0,0 +1,39 @@ +# List of skipped methods +blockedList = [ + 'acl.get', + 'acl.getCurrentPermissions', + 'audit.checkIntegrity', + 'audit.generateFingerprint', + 'audit.getRecords', + 'backupNg.getAllJobs', + 'backupNg.getAllLogs', + 'cloud.getResourceCatalog', + 'cloudConfig.getAll', + 'group.getAll', + 'host.stats', + 'ipPool.getAll', + 'job.getAll', + 'log.get', + 'metadataBackup.getAllJobs', + 'plugin.get', + 'pool.listMissingPatches', + 'proxy.getAll', + 'remote.getAll', + 'remote.getAllInfo', + 'resourceSet.getAll', + 'role.getAll', + 'schedule.getAll', + 'server.getAll', + 'session.getUser', + 'sr.getUnhealthyVdiChainsLength', + 'sr.stats', + 'system.getMethodsInfo', + 'system.getServerTimezone', + 'system.getServerVersion', + 'user.getAll', + 'vm.stats', + 'xo.getAllObjects', + 'xoa.supportTunnel.getState', + 'xosan.checkSrCurrentState', + 'xosan.getVolumeInfo', +] diff --git a/packages/xo-server-audit/package.json b/packages/xo-server-audit/package.json new file mode 100644 index 000000000..e16dc1ba2 --- /dev/null +++ b/packages/xo-server-audit/package.json @@ -0,0 +1,60 @@ +{ + "name": "xo-server-audit", + "version": "0.0.0", + "license": "AGPL-3.0", + "description": "Audit plugin for XO-Server", + "keywords": [ + "audit", + "log", + "logs", + "orchestra", + "plugin", + "xen-orchestra", + "xen", + "xo-server" + ], + "homepage": "https://github.com/vatesfr/xen-orchestra/tree/master/packages/xo-server-audit", + "bugs": "https://github.com/vatesfr/xen-orchestra/issues", + "repository": { + "directory": "packages/xo-server-audit", + "type": "git", + "url": "https://github.com/vatesfr/xen-orchestra.git" + }, + "author": { + "name": "Julien Fontanet", + "email": "julien.fontanet@isonoe.net" + }, + "preferGlobal": false, + "main": "dist/", + "bin": {}, + "files": [ + "dist/" + ], + "engines": { + "node": ">=6" + }, + "devDependencies": { + "@babel/cli": "^7.7.0", + "@babel/core": "^7.7.2", + "@babel/preset-env": "^7.7.1", + "cross-env": "^6.0.3", + "rimraf": "^3.0.0" + }, + "scripts": { + "build": "cross-env NODE_ENV=production babel --source-maps --out-dir=dist/ src/", + "dev": "cross-env NODE_ENV=development babel --watch --source-maps --out-dir=dist/ src/", + "prebuild": "rimraf dist/", + "predev": "yarn run prebuild", + "prepublishOnly": "yarn run build" + }, + "dependencies": { + "@xen-orchestra/audit-core": "^0.0.0", + "@xen-orchestra/log": "^0.2.0", + "app-conf": "^0.7.1", + "async-iterator-to-stream": "^1.1.0", + "promise-toolbox": "^0.15.0", + "readable-stream": "^3.5.0", + "xo-common": "^0.3.0" + }, + "private": true +} diff --git a/packages/xo-server-audit/src/index.js b/packages/xo-server-audit/src/index.js new file mode 100644 index 000000000..1f5552e18 --- /dev/null +++ b/packages/xo-server-audit/src/index.js @@ -0,0 +1,222 @@ +import appConf from 'app-conf' +import asyncIteratorToStream from 'async-iterator-to-stream' +import createLogger from '@xen-orchestra/log' +import path from 'path' +import { alteredAuditRecord, missingAuditRecord } from 'xo-common/api-errors' +import { fromCallback } from 'promise-toolbox' +import { pipeline } from 'readable-stream' +import { + AlteredRecordError, + AuditCore, + MissingRecordError, + NULL_ID, + Storage, +} from '@xen-orchestra/audit-core' + +const log = createLogger('xo:xo-server-audit') + +const LAST_ID = 'lastId' +class Db extends Storage { + constructor(db) { + super() + this._db = db + } + + async put(record) { + await this._db.put(record.id, record) + } + + async del(id) { + await this._db.del(id) + } + + get(id) { + return this._db.get(id).catch(error => { + if (!error.notFound) { + throw error + } + }) + } + + async setLastId(id) { + await this._db.put(LAST_ID, id) + } + + getLastId() { + return this.get(LAST_ID) + } +} + +const NAMESPACE = 'audit' +class AuditXoPlugin { + constructor({ xo }) { + this._cleaners = [] + this._xo = xo + + this._auditCore = undefined + this._blockedList = undefined + this._storage = undefined + } + + async load() { + const cleaners = this._cleaners + + try { + const storage = (this._storage = new Db( + await this._xo.getStore(NAMESPACE) + )) + this._auditCore = new AuditCore(storage) + this._blockedList = ( + await appConf.load('xo-server-audit', { + appDir: path.join(__dirname, '..'), + }) + ).blockedList + + cleaners.push(() => { + this._auditCore = undefined + this._blockedList = undefined + this._storage = undefined + }) + } catch (error) { + this._auditCore = undefined + this._blockedList = undefined + this._storage = undefined + throw error + } + + this._addListener('xo:postCall', this._handleEvent.bind(this, 'apiCall')) + this._addListener('xo:audit', this._handleEvent.bind(this)) + + const getRecords = this._getRecords.bind(this) + getRecords.description = 'Get records from a passed record ID' + getRecords.permission = 'admin' + getRecords.params = { + id: { type: 'string', optional: true }, + ndjson: { type: 'boolean', optional: true }, + } + + const checkIntegrity = this._checkIntegrity.bind(this) + checkIntegrity.description = + 'Check records integrity between oldest and newest' + checkIntegrity.permission = 'admin' + checkIntegrity.params = { + newest: { type: 'string', optional: true }, + oldest: { type: 'string', optional: true }, + } + + const generateFingerprint = this._generateFingerprint.bind(this) + generateFingerprint.description = + 'Generate a fingerprint of the chain oldest-newest' + generateFingerprint.permission = 'admin' + generateFingerprint.params = { + newest: { type: 'string', optional: true }, + oldest: { type: 'string', optional: true }, + } + + cleaners.push( + this._xo.addApiMethods({ + audit: { + checkIntegrity, + generateFingerprint, + getRecords, + }, + }) + ) + } + + unload() { + this._cleaners.forEach(cleaner => cleaner()) + this._cleaners.length = 0 + } + + _addListener(event, listener_) { + const listener = async (...args) => { + try { + await listener_(...args) + } catch (error) { + log.error(error) + } + } + const xo = this._xo + xo.on(event, listener) + this._cleaners.push(() => xo.removeListener(event, listener)) + } + + _handleEvent(event, { userId, userIp, userName, ...data }) { + if (event !== 'apiCall' || this._blockedList.indexOf(data.method) === -1) { + return this._auditCore.add( + { + userId, + userIp, + userName, + }, + event, + data + ) + } + } + + _handleGetRecords(req, res, id) { + res.set('Content-Type', 'application/json') + return fromCallback( + pipeline, + asyncIteratorToStream(async function*(asyncIterator) { + for await (const record of asyncIterator) { + yield JSON.stringify(record) + yield '\n' + } + })(this._auditCore.getFrom(id)), + res + ) + } + + async _getRecords({ id, ndjson = false }) { + if (ndjson) { + return this._xo + .registerHttpRequest(this._handleGetRecords.bind(this), id) + .then($getFrom => ({ + $getFrom, + })) + } + + const records = [] + for await (const record of this._auditCore.getFrom(id)) { + records.push(record) + } + return records + } + + async _checkIntegrity(props) { + const { oldest = NULL_ID, newest = await this._storage.getLastId() } = props + return this._auditCore.checkIntegrity(oldest, newest).catch(error => { + if (error instanceof MissingRecordError) { + throw missingAuditRecord(error) + } + if (error instanceof AlteredRecordError) { + throw alteredAuditRecord(error) + } + throw error + }) + } + + async _generateFingerprint(props) { + const { oldest = NULL_ID, newest = await this._storage.getLastId() } = props + try { + return { + fingerprint: `${oldest}|${newest}`, + nValid: await this._checkIntegrity({ oldest, newest }), + } + } catch (error) { + if (missingAuditRecord.is(error) || alteredAuditRecord.is(error)) { + return { + fingerprint: `${error.data.id}|${newest}`, + nValid: error.data.nValid, + error, + } + } + throw error + } + } +} + +export default opts => new AuditXoPlugin(opts) diff --git a/packages/xo-server/src/index.js b/packages/xo-server/src/index.js index 98df271e5..7924a606c 100644 --- a/packages/xo-server/src/index.js +++ b/packages/xo-server/src/index.js @@ -525,6 +525,7 @@ const setUpApi = (webServer, xo, config) => { // Create the abstract XO object for this connection. const connection = xo.createUserConnection() + connection.set('user_ip', remoteAddress) connection.once('close', () => { socket.close() }) @@ -606,7 +607,21 @@ const setUpConsoleProxy = (webServer, xo) => { const { remoteAddress } = socket log.info(`+ Console proxy (${user.name} - ${remoteAddress})`) + + const data = { + timestamp: Date.now(), + userId: user.id, + userIp: remoteAddress, + userName: user.name, + vmId: id, + } + xo.emit('xo:audit', 'consoleOpened', data) + socket.on('close', () => { + xo.emit('xo:audit', 'consoleClosed', { + ...data, + timestamp: Date.now(), + }) log.info(`- Console proxy (${user.name} - ${remoteAddress})`) }) } diff --git a/packages/xo-server/src/xo-mixins/api.js b/packages/xo-server/src/xo-mixins/api.js index a78c0f79c..c7ef0c23b 100644 --- a/packages/xo-server/src/xo-mixins/api.js +++ b/packages/xo-server/src/xo-mixins/api.js @@ -255,6 +255,7 @@ export default class Api { .slice(2), userId, userName, + userIp: session.get('user_ip'), method: name, params: sensitiveValues.replace(params, '* obfuscated *'), timestamp: Date.now(), @@ -303,6 +304,13 @@ export default class Api { )}] ==> ${kindOf(result)}` ) + // it's a special case in which the user is defined at the end of the call + if (data.method === 'session.signIn') { + const { id, email } = await xo.getUser(session.get('user_id')) + data.userId = id + data.userName = email + } + const now = Date.now() xo.emit('xo:postCall', { ...data, diff --git a/packages/xo-web/src/common/intl/messages.js b/packages/xo-web/src/common/intl/messages.js index 26f1f67d7..453afbaf8 100644 --- a/packages/xo-web/src/common/intl/messages.js +++ b/packages/xo-web/src/common/intl/messages.js @@ -63,6 +63,8 @@ const messages = { dhcp: 'DHCP', ip: 'IP', static: 'Static', + user: 'User', + deletedUser: 'deleted ({ name })', // ----- Modals ----- alertOk: 'OK', @@ -114,6 +116,7 @@ const messages = { notificationsPage: 'Notifications', supportPage: 'Support', settingsPage: 'Settings', + settingsAuditPage: 'Audit', settingsServersPage: 'Servers', settingsUsersPage: 'Users', settingsGroupsPage: 'Groups', @@ -2220,6 +2223,29 @@ const messages = { recipeSshKeyLabel: 'SSH key', recipeNetworkCidr: 'Network CIDR', + // Audit + auditActionEvent: 'Action/Event', + auditAlteredRecord: + 'The record ({ id }) was altered ({ n, number } valid records)', + auditCheckIntegrity: 'Check integrity', + auditCopyFingerprintToClipboard: 'Copy fingerprint to clipboard', + auditGenerateNewFingerprint: 'Generate a new fingerprint', + auditMissingRecord: + 'The record ({ id }) is missing ({ n, number } valid records)', + auditEnterFingerprint: 'Fingerprint', + auditEnterFingerprintInfo: + "Enter the saved fingerprint to check the previous logs' integrity. If you don't have any, click OK.", + auditRecord: 'Audit record', + auditIntegrityVerified: 'Integrity verified', + auditSaveFingerprintInfo: + 'Keep this fingerprint to be able to check the integrity of the current records later.', + auditSaveFingerprintInErrorInfo: + 'However, if you trust the current state of the records, keep this fingerprint to be able to check their integrity later.', + auditNewFingerprint: 'New fingerprint', + displayAuditRecord: 'Display record', + noAuditRecordAvailable: 'No audit record available', + refreshAuditRecordsList: 'Refresh records list', + // Licenses xosanUnregisteredDisclaimer: 'You are not registered and therefore will not be able to create or manage your XOSAN SRs. {link}', diff --git a/packages/xo-web/src/common/render-xo-item.js b/packages/xo-web/src/common/render-xo-item.js index 2ec064bbd..e499301ab 100644 --- a/packages/xo-web/src/common/render-xo-item.js +++ b/packages/xo-web/src/common/render-xo-item.js @@ -12,7 +12,12 @@ import Tooltip from './tooltip' import { addSubscriptions, connectStore, formatSize } from './utils' import { createGetObject, createSelector } from './selectors' import { FormattedDate } from 'react-intl' -import { isSrWritable, subscribeProxies, subscribeRemotes } from './xo' +import { + isSrWritable, + subscribeProxies, + subscribeRemotes, + subscribeUsers, +} from './xo' // =================================================================== @@ -407,6 +412,47 @@ Vgpu.propTypes = { // =================================================================== +export const User = decorate([ + addSubscriptions(({ id }) => ({ + user: cb => + subscribeUsers(users => { + const user = users.find(user => user.id === id) + cb(user === undefined ? null : user) + }), + })), + ({ defaultRender, id, link, newTab, user }) => { + if (user === undefined) { + return + } + if (user === null) { + return defaultRender || unknowItem(id, 'user') + } + return ( + + {user.email} + + ) + }, +]) + +User.propTypes = { + defaultRender: PropTypes.node, + id: PropTypes.string.isRequired, + link: PropTypes.bool, + newTab: PropTypes.bool, +} + +User.defaultProps = { + link: false, + newTab: false, +} + +// =================================================================== + const xoItemToRender = { // Subscription objects. cloudConfig: template => ( @@ -422,11 +468,7 @@ const xoItemToRender = { remote: ({ value: { id } }) => , proxy: ({ id }) => , role: role => {role.name}, - user: user => ( - - {user.email} - - ), + user: ({ id }) => , resourceSet: resourceSet => ( diff --git a/packages/xo-web/src/common/xo/index.js b/packages/xo-web/src/common/xo/index.js index 2c61209ae..39897b378 100644 --- a/packages/xo-web/src/common/xo/index.js +++ b/packages/xo-web/src/common/xo/index.js @@ -3109,3 +3109,31 @@ export const checkProxyHealth = proxy => _('proxyTestSuccessMessage') ) ) + +// Audit plugin --------------------------------------------------------- + +const METHOD_NOT_FOUND_CODE = -32601 +export const fetchAuditRecords = async () => { + try { + const { $getFrom } = await _call('audit.getRecords', { ndjson: true }) + const response = await fetch(`.${$getFrom}`) + const data = await response.text() + + const records = [] + parseNdJson(data, record => { + records.push(record) + }) + return records + } catch (error) { + if (error.code === METHOD_NOT_FOUND_CODE) { + return [] + } + throw error + } +} + +export const checkAuditRecordsIntegrity = (oldest, newest) => + _call('audit.checkIntegrity', { oldest, newest }) + +export const generateAuditFingerprint = oldest => + _call('audit.generateFingerprint', { oldest }) diff --git a/packages/xo-web/src/icons.scss b/packages/xo-web/src/icons.scss index 17b94dace..af98bb350 100644 --- a/packages/xo-web/src/icons.scss +++ b/packages/xo-web/src/icons.scss @@ -103,6 +103,10 @@ @extend .fa; @extend .fa-cube; } + &-audit { + @extend .fa; + @extend .fa-list-alt; + } &-grab { @extend .fa; diff --git a/packages/xo-web/src/xo-app/menu/index.js b/packages/xo-web/src/xo-app/menu/index.js index 46122a3c0..262af4936 100644 --- a/packages/xo-web/src/xo-app/menu/index.js +++ b/packages/xo-web/src/xo-app/menu/index.js @@ -364,6 +364,11 @@ export default class Menu extends Component { icon: 'menu-settings-logs', label: 'settingsLogsPage', }, + { + to: '/settings/audit', + icon: 'audit', + label: 'settingsAuditPage', + }, { to: '/settings/ips', icon: 'ip', label: 'settingsIpsPage' }, { to: '/settings/cloud-configs', diff --git a/packages/xo-web/src/xo-app/settings/audit/index.js b/packages/xo-web/src/xo-app/settings/audit/index.js new file mode 100644 index 000000000..a04bb069b --- /dev/null +++ b/packages/xo-web/src/xo-app/settings/audit/index.js @@ -0,0 +1,277 @@ +import _, { messages } from 'intl' +import ActionButton from 'action-button' +import Button from 'button' +import Copiable from 'copiable' +import CopyToClipboard from 'react-copy-to-clipboard' +import decorate from 'apply-decorators' +import Icon from 'icon' +import NoObjects from 'no-objects' +import React from 'react' +import SortedTable from 'sorted-table' +import Tooltip from 'tooltip' +import { alert, chooseAction, form } from 'modal' +import { alteredAuditRecord, missingAuditRecord } from 'xo-common/api-errors' +import { FormattedDate, injectIntl } from 'react-intl' +import { injectState, provideState } from 'reaclette' +import { noop, startCase } from 'lodash' +import { User } from 'render-xo-item' +import { + checkAuditRecordsIntegrity, + fetchAuditRecords, + generateAuditFingerprint, +} from 'xo' + +const getIntegrityErrorRender = ({ nValid, error }) => ( +

+ {' '} + {_( + missingAuditRecord.is(error) + ? 'auditMissingRecord' + : 'auditAlteredRecord', + { + id: ( + + + + {error.data.id.slice(4, 8)} + + + + ), + n: nValid, + } + )} +

+) + +const openGeneratedFingerprintModal = ({ fingerprint, nValid, error }) => + alert( + + {_('auditNewFingerprint')} + , +
+ {error !== undefined ? ( +
+ {getIntegrityErrorRender({ nValid, error })} +

{_('auditSaveFingerprintInErrorInfo')}

+
+ ) : ( +

{_('auditSaveFingerprintInfo')}

+ )} +

+ + + + + + + + +

+
+ ).catch(noop) + +const openIntegrityFeedbackModal = error => + chooseAction({ + icon: 'diagnosis', + title: _('auditCheckIntegrity'), + body: + error !== undefined ? ( + getIntegrityErrorRender(error) + ) : ( +

+ {_('auditIntegrityVerified')} +

+ ), + buttons: [ + { + btnStyle: 'success', + label: _('auditGenerateNewFingerprint'), + }, + ], + }).then( + () => true, + () => false + ) + +const FingerPrintModalBody = injectIntl( + ({ intl: { formatMessage }, onChange, value }) => ( +
+

{_('auditEnterFingerprintInfo')}

+
+ +
+
+ ) +) + +const DEFAULT_HASH = 'nullId|nullId' +const openFingerprintPromptModal = () => + form({ + render: ({ onChange, value }) => ( + + ), + header: ( + + {_('auditCheckIntegrity')} + + ), + }).then((value = '') => { + value = value.trim() + return value !== '' ? value : DEFAULT_HASH + }, noop) + +const checkIntegrity = async () => { + const fingerprint = await openFingerprintPromptModal() + if (fingerprint === undefined) { + return + } + + const [oldest, newest] = fingerprint.split('|') + const error = await checkAuditRecordsIntegrity(oldest, newest).then( + noop, + error => { + if (missingAuditRecord.is(error) || alteredAuditRecord.is(error)) { + return { + nValid: error.data.nValid, + error, + } + } + throw error + } + ) + + const shouldGenerateFingerprint = await openIntegrityFeedbackModal(error) + if (!shouldGenerateFingerprint) { + return + } + + await openGeneratedFingerprintModal(await generateAuditFingerprint(newest)) +} + +const displayRecord = record => + alert( + + {_('auditRecord')} + , + {JSON.stringify(record, null, 2)} + ) + +const INDIVIDUAL_ACTIONS = [ + { + handler: displayRecord, + icon: 'preview', + label: _('displayAuditRecord'), + }, +] + +const COLUMNS = [ + { + itemRenderer: ({ subject: { userId, userName } }) => + userId !== undefined ? ( + + {_('deletedUser', { name: userName })} + + } + id={userId} + link + newTab + /> + ) : ( +

{_('noUser')}

+ ), + name: _('user'), + sortCriteria: 'subject.userName', + }, + { + name: _('ip'), + valuePath: 'subject.userIp', + }, + { + itemRenderer: ({ data, event }) => + event === 'apiCall' ? data.method : startCase(event), + name: _('auditActionEvent'), + sortCriteria: ({ data, event }) => + event === 'apiCall' ? data.method : event, + }, + { + itemRenderer: ({ time }) => ( + + ), + name: _('date'), + sortCriteria: 'time', + sortOrder: 'desc', + }, +] + +export default decorate([ + provideState({ + initialState: () => ({ + records: undefined, + }), + effects: { + initialize({ fetchRecords }) { + return fetchRecords() + }, + async fetchRecords() { + this.state.records = await fetchAuditRecords() + }, + }, + }), + injectState, + ({ state, effects }) => ( +
+
+ + {_('refreshAuditRecordsList')} + {' '} + + {_('auditCheckIntegrity')} + +
+ + +   + {_('noAuditRecordAvailable')} + + } + individualActions={INDIVIDUAL_ACTIONS} + stateUrlParam='s' + /> +
+ ), +]) diff --git a/packages/xo-web/src/xo-app/settings/index.js b/packages/xo-web/src/xo-app/settings/index.js index 737996412..bd9ce4223 100644 --- a/packages/xo-web/src/xo-app/settings/index.js +++ b/packages/xo-web/src/xo-app/settings/index.js @@ -7,6 +7,7 @@ import { Container, Row, Col } from 'grid' import { NavLink, NavTabs } from 'nav' import Acls from './acls' +import Audit from './audit' import CloudConfigs from './cloud-configs' import Config from './config' import Groups from './groups' @@ -48,6 +49,9 @@ const HEADER = ( {_('settingsLogsPage')} + + {_('settingsAuditPage')} + {_('settingsIpsPage')} @@ -65,6 +69,7 @@ const HEADER = ( const Settings = routes('servers', { acls: Acls, + audit: Audit, 'cloud-configs': CloudConfigs, config: Config, groups: Groups, diff --git a/yarn.lock b/yarn.lock index 358801a8e..0ce76b37d 100644 --- a/yarn.lock +++ b/yarn.lock @@ -18,6 +18,22 @@ optionalDependencies: chokidar "^2.1.8" +"@babel/cli@^7.7.4": + version "7.8.0" + resolved "https://registry.yarnpkg.com/@babel/cli/-/cli-7.8.0.tgz#e9ed4c3dbb163de5034c18979c118ed1aa294e05" + integrity sha512-/zOi56gIH3jBmnrfUvVf8MOMqf3hfFou2ONRYdRRpgnBSi0dUkiO+usu44YHsOEJqqwPkijBsiDKscQizouoag== + dependencies: + commander "^4.0.1" + convert-source-map "^1.1.0" + fs-readdir-recursive "^1.1.0" + glob "^7.0.0" + lodash "^4.17.13" + make-dir "^2.1.0" + slash "^2.0.0" + source-map "^0.5.0" + optionalDependencies: + chokidar "^2.1.8" + "@babel/code-frame@^7.0.0", "@babel/code-frame@^7.5.5": version "7.5.5" resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.5.5.tgz#bc0782f6d69f7b7d49531219699b988f669a8f9d" @@ -25,6 +41,22 @@ dependencies: "@babel/highlight" "^7.0.0" +"@babel/code-frame@^7.8.0": + version "7.8.0" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.8.0.tgz#8c98d4ac29d6f80f28127b1bc50970a72086c5ac" + integrity sha512-AN2IR/wCUYsM+PdErq6Bp3RFTXl8W0p9Nmymm7zkpsCmh+r/YYcckaCGpU8Q/mEKmST19kkGRaG42A/jxOWwBA== + dependencies: + "@babel/highlight" "^7.8.0" + +"@babel/compat-data@^7.8.0", "@babel/compat-data@^7.8.1": + version "7.8.1" + resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.8.1.tgz#fc0bbbb7991e4fb2b47e168e60f2cc2c41680be9" + integrity sha512-Z+6ZOXvyOWYxJ50BwxzdhRnRsGST8Y3jaZgxYig575lTjVSs3KtJnmESwZegg6e2Dn0td1eDhoWlp1wI4BTCPw== + dependencies: + browserslist "^4.8.2" + invariant "^2.2.4" + semver "^5.5.0" + "@babel/core@^7.0.0", "@babel/core@^7.1.0", "@babel/core@^7.1.5", "@babel/core@^7.1.6", "@babel/core@^7.4.4", "@babel/core@^7.7.2": version "7.7.7" resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.7.7.tgz#ee155d2e12300bcc0cff6a8ad46f2af5063803e9" @@ -45,6 +77,27 @@ semver "^5.4.1" source-map "^0.5.0" +"@babel/core@^7.7.4": + version "7.8.0" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.8.0.tgz#fd273d4faf69cc20ee3ccfd32d42df916bb4a15c" + integrity sha512-3rqPi/bv/Xfu2YzHvBz4XqMI1fKVwnhntPA1/fjoECrSjrhbOCxlTrbVu5gUtr8zkxW+RpkDOa/HCW93gzS2Dw== + dependencies: + "@babel/code-frame" "^7.8.0" + "@babel/generator" "^7.8.0" + "@babel/helpers" "^7.8.0" + "@babel/parser" "^7.8.0" + "@babel/template" "^7.8.0" + "@babel/traverse" "^7.8.0" + "@babel/types" "^7.8.0" + convert-source-map "^1.7.0" + debug "^4.1.0" + gensync "^1.0.0-beta.1" + json5 "^2.1.0" + lodash "^4.17.13" + resolve "^1.3.2" + semver "^5.4.1" + source-map "^0.5.0" + "@babel/generator@^7.4.0", "@babel/generator@^7.7.4", "@babel/generator@^7.7.7": version "7.7.7" resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.7.7.tgz#859ac733c44c74148e1a72980a64ec84b85f4f45" @@ -55,6 +108,16 @@ lodash "^4.17.13" source-map "^0.5.0" +"@babel/generator@^7.8.0": + version "7.8.0" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.8.0.tgz#40a1244677be58ffdc5cd01e22634cd1d5b29edf" + integrity sha512-2Lp2e02CV2C7j/H4n4D9YvsvdhPVVg9GDIamr6Tu4tU35mL3mzOrzl1lZ8ZJtysfZXh+y+AGORc2rPS7yHxBUg== + dependencies: + "@babel/types" "^7.8.0" + jsesc "^2.5.1" + lodash "^4.17.13" + source-map "^0.5.0" + "@babel/helper-annotate-as-pure@^7.7.4": version "7.7.4" resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.7.4.tgz#bb3faf1e74b74bd547e867e48f551fa6b098b6ce" @@ -62,6 +125,13 @@ dependencies: "@babel/types" "^7.7.4" +"@babel/helper-annotate-as-pure@^7.8.0": + version "7.8.0" + resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.8.0.tgz#334ae2cb801e2381509631a5caa1ac6ab1c5016a" + integrity sha512-WWj+1amBdowU2g18p3/KUc1Y5kWnaNm1paohq2tT4/RreeMNssYkv6ul9wkE2iIqjwLBwNMZGH4pTGlMSUqMMg== + dependencies: + "@babel/types" "^7.8.0" + "@babel/helper-builder-binary-assignment-operator-visitor@^7.7.4": version "7.7.4" resolved "https://registry.yarnpkg.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.7.4.tgz#5f73f2b28580e224b5b9bd03146a4015d6217f5f" @@ -70,6 +140,14 @@ "@babel/helper-explode-assignable-expression" "^7.7.4" "@babel/types" "^7.7.4" +"@babel/helper-builder-binary-assignment-operator-visitor@^7.8.0": + version "7.8.0" + resolved "https://registry.yarnpkg.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.8.0.tgz#c2237beb110f64f592dddcabef1098e9d766ef88" + integrity sha512-KbBloNiBHM3ZyHg1ViDRs4QcnAunwMJ+rLpAEA8l3cWb3Z1xof7ag1iHvX16EwhUfaTG3+YSvTRPv4xHIrseUQ== + dependencies: + "@babel/helper-explode-assignable-expression" "^7.8.0" + "@babel/types" "^7.8.0" + "@babel/helper-call-delegate@^7.7.4": version "7.7.4" resolved "https://registry.yarnpkg.com/@babel/helper-call-delegate/-/helper-call-delegate-7.7.4.tgz#621b83e596722b50c0066f9dc37d3232e461b801" @@ -79,6 +157,26 @@ "@babel/traverse" "^7.7.4" "@babel/types" "^7.7.4" +"@babel/helper-call-delegate@^7.8.0": + version "7.8.0" + resolved "https://registry.yarnpkg.com/@babel/helper-call-delegate/-/helper-call-delegate-7.8.0.tgz#1cd725c5444be0ce59dbfa47b6ac5e9772168c67" + integrity sha512-Vi8K1LScr8ZgLicfuCNSE7JWUPG/H/9Bw9zn+3vQyy4vA54FEGTCuUTOXCFwmBM93OD6jHfjrQ6ZnivM5U+bHg== + dependencies: + "@babel/helper-hoist-variables" "^7.8.0" + "@babel/traverse" "^7.8.0" + "@babel/types" "^7.8.0" + +"@babel/helper-compilation-targets@^7.8.0": + version "7.8.1" + resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.8.1.tgz#309da97e93e6ca74896393d0c8da7af39cb4cea8" + integrity sha512-Fsrljg8DHSdnKSzC0YFopX7lseRpVfWMYuC1Dnvf7tw972E2KDjZ4XEaqjO9aJL0sLcG4KNRXxowDxHYIcZ+Cw== + dependencies: + "@babel/compat-data" "^7.8.1" + browserslist "^4.8.2" + invariant "^2.2.4" + levenary "^1.1.0" + semver "^5.5.0" + "@babel/helper-create-class-features-plugin@^7.7.4": version "7.7.4" resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.7.4.tgz#fce60939fd50618610942320a8d951b3b639da2d" @@ -91,6 +189,18 @@ "@babel/helper-replace-supers" "^7.7.4" "@babel/helper-split-export-declaration" "^7.7.4" +"@babel/helper-create-class-features-plugin@^7.8.0": + version "7.8.0" + resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.8.0.tgz#b3ddf557ed4656e0d296c3b0f3fcd381ea8de72c" + integrity sha512-ctCvqYBTlwEl2uF4hCxE0cd/sSw71Zfag0jKa39y4HDLh0BQ4PVBX1384Ye8GqrEZ69xgLp9fwPbv3GgIDDF2Q== + dependencies: + "@babel/helper-function-name" "^7.8.0" + "@babel/helper-member-expression-to-functions" "^7.8.0" + "@babel/helper-optimise-call-expression" "^7.8.0" + "@babel/helper-plugin-utils" "^7.8.0" + "@babel/helper-replace-supers" "^7.8.0" + "@babel/helper-split-export-declaration" "^7.8.0" + "@babel/helper-create-regexp-features-plugin@^7.7.4": version "7.7.4" resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.7.4.tgz#6d5762359fd34f4da1500e4cff9955b5299aaf59" @@ -99,6 +209,14 @@ "@babel/helper-regex" "^7.4.4" regexpu-core "^4.6.0" +"@babel/helper-create-regexp-features-plugin@^7.8.0": + version "7.8.0" + resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.8.0.tgz#ae551572b840189a7b94e39eddc1a68d355974eb" + integrity sha512-vJj2hPbxxLUWJEV86iZiac5curAnC3ZVc+rFmFeWZigUOcuCPpbF+KxoEmxrkmuCGylHFF9t4lkpcDUcxnhQ5g== + dependencies: + "@babel/helper-regex" "^7.8.0" + regexpu-core "^4.6.0" + "@babel/helper-define-map@^7.7.4": version "7.7.4" resolved "https://registry.yarnpkg.com/@babel/helper-define-map/-/helper-define-map-7.7.4.tgz#2841bf92eb8bd9c906851546fe6b9d45e162f176" @@ -108,6 +226,15 @@ "@babel/types" "^7.7.4" lodash "^4.17.13" +"@babel/helper-define-map@^7.8.0": + version "7.8.0" + resolved "https://registry.yarnpkg.com/@babel/helper-define-map/-/helper-define-map-7.8.0.tgz#d3180691fa189fc147d411deaa029305c1470dfe" + integrity sha512-Go06lUlZ4YImNEmdyAH5iO38yh5mbpOPSwA2PtV1vyczFhTZfX0OtzkiIL2pACo6AOYf89pLh42nhhDrqgzC3A== + dependencies: + "@babel/helper-function-name" "^7.8.0" + "@babel/types" "^7.8.0" + lodash "^4.17.13" + "@babel/helper-explode-assignable-expression@^7.7.4": version "7.7.4" resolved "https://registry.yarnpkg.com/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.7.4.tgz#fa700878e008d85dc51ba43e9fb835cddfe05c84" @@ -116,6 +243,14 @@ "@babel/traverse" "^7.7.4" "@babel/types" "^7.7.4" +"@babel/helper-explode-assignable-expression@^7.8.0": + version "7.8.0" + resolved "https://registry.yarnpkg.com/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.8.0.tgz#a2ded9298a5dc9df0a8ec65ac12e4745f9af2882" + integrity sha512-w4mRQqKAh4M7BSLwvDMm8jYFroEzpqMCtXDhFHP+kNjMIQWpbC6b0Q/RUQsJNSf54rIx6XMdci1Stf60DWw+og== + dependencies: + "@babel/traverse" "^7.8.0" + "@babel/types" "^7.8.0" + "@babel/helper-function-name@^7.7.4": version "7.7.4" resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.7.4.tgz#ab6e041e7135d436d8f0a3eca15de5b67a341a2e" @@ -125,6 +260,15 @@ "@babel/template" "^7.7.4" "@babel/types" "^7.7.4" +"@babel/helper-function-name@^7.8.0": + version "7.8.0" + resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.8.0.tgz#dde5cf0d6b15c21817a67dd66fe7350348e023bf" + integrity sha512-x9psucuU0Xalw+0Vpr2FYJMLB7/KnPSLZhlkUyOGbYAWRDfmtZBrguYpJYiaNCRV7vGkYjO/gF6/J6yMvdWTDw== + dependencies: + "@babel/helper-get-function-arity" "^7.8.0" + "@babel/template" "^7.8.0" + "@babel/types" "^7.8.0" + "@babel/helper-get-function-arity@^7.7.4": version "7.7.4" resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.7.4.tgz#cb46348d2f8808e632f0ab048172130e636005f0" @@ -132,6 +276,13 @@ dependencies: "@babel/types" "^7.7.4" +"@babel/helper-get-function-arity@^7.8.0": + version "7.8.0" + resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.8.0.tgz#90977f61d76d2225d1ae0208def7df22ea92792e" + integrity sha512-eUP5grliToMapQiTaYS2AAO/WwaCG7cuJztR1v/a1aPzUzUeGt+AaI9OvLATc/AfFkF8SLJ10d5ugGt/AQ9d6w== + dependencies: + "@babel/types" "^7.8.0" + "@babel/helper-hoist-variables@^7.7.4": version "7.7.4" resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.7.4.tgz#612384e3d823fdfaaf9fce31550fe5d4db0f3d12" @@ -139,6 +290,13 @@ dependencies: "@babel/types" "^7.7.4" +"@babel/helper-hoist-variables@^7.8.0": + version "7.8.0" + resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.8.0.tgz#693586b56487e60fff9d9c7074f4a86e1a8af348" + integrity sha512-jDl66KvuklTXUADcoXDMur1jDtAZUZZkzLIaQ54+z38ih8C0V0hC56hMaoVoyoxN60MwQmmrHctBwcLqP0c/Lw== + dependencies: + "@babel/types" "^7.8.0" + "@babel/helper-member-expression-to-functions@^7.7.4": version "7.7.4" resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.7.4.tgz#356438e2569df7321a8326644d4b790d2122cb74" @@ -146,6 +304,13 @@ dependencies: "@babel/types" "^7.7.4" +"@babel/helper-member-expression-to-functions@^7.8.0": + version "7.8.0" + resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.8.0.tgz#50d0ed445d2da11beb60e2dbc2c428254bd5a4ae" + integrity sha512-0m1QabGrdXuoxX/g+KOAGndoHwskC70WweqHRQyCsaO67KOEELYh4ECcGw6ZGKjDKa5Y7SW4Qbhw6ly4Fah/jQ== + dependencies: + "@babel/types" "^7.8.0" + "@babel/helper-module-imports@^7.0.0-beta.49", "@babel/helper-module-imports@^7.7.4": version "7.7.4" resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.7.4.tgz#e5a92529f8888bf319a6376abfbd1cebc491ad91" @@ -153,6 +318,13 @@ dependencies: "@babel/types" "^7.7.4" +"@babel/helper-module-imports@^7.8.0": + version "7.8.0" + resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.8.0.tgz#076edda55d8cd39c099981b785ce53f4303b967e" + integrity sha512-ylY9J6ZxEcjmJaJ4P6aVs/fZdrZVctCGnxxfYXwCnSMapqd544zT8lWK2qI/vBPjE5gS0o2jILnH+AkpsPauEQ== + dependencies: + "@babel/types" "^7.8.0" + "@babel/helper-module-transforms@^7.7.4", "@babel/helper-module-transforms@^7.7.5": version "7.7.5" resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.7.5.tgz#d044da7ffd91ec967db25cd6748f704b6b244835" @@ -165,6 +337,18 @@ "@babel/types" "^7.7.4" lodash "^4.17.13" +"@babel/helper-module-transforms@^7.8.0": + version "7.8.0" + resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.8.0.tgz#a3cbe4ac91b101c4b6db278af0c868fe7091ebae" + integrity sha512-fvGhX4FY7YwRdWW/zfddNaKpYl8TaA8hvwONIYhv1/a1ZbgxbTrjsmH6IGWUgUNki7QzbpZ27OEh88sZdft3YA== + dependencies: + "@babel/helper-module-imports" "^7.8.0" + "@babel/helper-simple-access" "^7.8.0" + "@babel/helper-split-export-declaration" "^7.8.0" + "@babel/template" "^7.8.0" + "@babel/types" "^7.8.0" + lodash "^4.17.13" + "@babel/helper-optimise-call-expression@^7.7.4": version "7.7.4" resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.7.4.tgz#034af31370d2995242aa4df402c3b7794b2dcdf2" @@ -172,11 +356,23 @@ dependencies: "@babel/types" "^7.7.4" +"@babel/helper-optimise-call-expression@^7.8.0": + version "7.8.0" + resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.8.0.tgz#3df62773cf210db9ed34c2bb39fece5acd1e1733" + integrity sha512-aiJt1m+K57y0n10fTw+QXcCXzmpkG+o+NoQmAZqlZPstkTE0PZT+Z27QSd/6Gf00nuXJQO4NiJ0/YagSW5kC2A== + dependencies: + "@babel/types" "^7.8.0" + "@babel/helper-plugin-utils@^7.0.0": version "7.0.0" resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.0.0.tgz#bbb3fbee98661c569034237cc03967ba99b4f250" integrity sha512-CYAOUCARwExnEixLdB6sDm2dIJ/YgEAKDM1MOeMeZu9Ld/bDgVo8aiWrXwcY7OBh+1Ea2uUcVRcxKk0GJvW7QA== +"@babel/helper-plugin-utils@^7.8.0": + version "7.8.0" + resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.0.tgz#59ec882d43c21c544ccb51decaecb306b34a8231" + integrity sha512-+hAlRGdf8fHQAyNnDBqTHQhwdLURLdrCROoWaEQYiQhk2sV9Rhs+GoFZZfMJExTq9HG8o2NX3uN2G90bFtmFdA== + "@babel/helper-regex@^7.0.0", "@babel/helper-regex@^7.4.4": version "7.5.5" resolved "https://registry.yarnpkg.com/@babel/helper-regex/-/helper-regex-7.5.5.tgz#0aa6824f7100a2e0e89c1527c23936c152cab351" @@ -184,6 +380,13 @@ dependencies: lodash "^4.17.13" +"@babel/helper-regex@^7.8.0": + version "7.8.0" + resolved "https://registry.yarnpkg.com/@babel/helper-regex/-/helper-regex-7.8.0.tgz#dde1d2d2070e292c19a8702075e945923aa1678b" + integrity sha512-haD8fRsPtyFZkbtxBIaGBBHRtbn0YsyecdYrxNgO0Bl6SlGokJPQX9M2tDuVbeQBYHZVLUPMSwGQn4obHevsMQ== + dependencies: + lodash "^4.17.13" + "@babel/helper-remap-async-to-generator@^7.7.4": version "7.7.4" resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.7.4.tgz#c68c2407350d9af0e061ed6726afb4fff16d0234" @@ -195,6 +398,17 @@ "@babel/traverse" "^7.7.4" "@babel/types" "^7.7.4" +"@babel/helper-remap-async-to-generator@^7.8.0": + version "7.8.0" + resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.8.0.tgz#034c21154dd12472717cfb31faf1713426fbc435" + integrity sha512-+aKyBd4oHAaIZgOLq/uLjkUz7ExZ0ppdNBc8Qr72BmtKNAy3A6EJa/ifjj0//CIzQtUDPs3E6HjKM2cV6bnXsQ== + dependencies: + "@babel/helper-annotate-as-pure" "^7.8.0" + "@babel/helper-wrap-function" "^7.8.0" + "@babel/template" "^7.8.0" + "@babel/traverse" "^7.8.0" + "@babel/types" "^7.8.0" + "@babel/helper-replace-supers@^7.7.4": version "7.7.4" resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.7.4.tgz#3c881a6a6a7571275a72d82e6107126ec9e2cdd2" @@ -205,6 +419,16 @@ "@babel/traverse" "^7.7.4" "@babel/types" "^7.7.4" +"@babel/helper-replace-supers@^7.8.0": + version "7.8.0" + resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.8.0.tgz#d83cb117edb820eebe9ae6c970a8ad5eac09d19f" + integrity sha512-R2CyorW4tcO3YzdkClLpt6MS84G+tPkOi0MmiCn1bvYVnmDpdl9R15XOi3NQW2mhOAEeBnuQ4g1Bh7pT2sX8fg== + dependencies: + "@babel/helper-member-expression-to-functions" "^7.8.0" + "@babel/helper-optimise-call-expression" "^7.8.0" + "@babel/traverse" "^7.8.0" + "@babel/types" "^7.8.0" + "@babel/helper-simple-access@^7.7.4": version "7.7.4" resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.7.4.tgz#a169a0adb1b5f418cfc19f22586b2ebf58a9a294" @@ -213,6 +437,14 @@ "@babel/template" "^7.7.4" "@babel/types" "^7.7.4" +"@babel/helper-simple-access@^7.8.0": + version "7.8.0" + resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.8.0.tgz#a5095ab031f759995134183fa7719aa85f0ec962" + integrity sha512-I+7yKZJnxp7VIC2UFzXfVjLiJuU16rYFF59x27c+boINkO/pLETgZcoesCryg9jmU4jxEa0foFueW+2wjc9Gsw== + dependencies: + "@babel/template" "^7.8.0" + "@babel/types" "^7.8.0" + "@babel/helper-split-export-declaration@^7.7.4": version "7.7.4" resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.7.4.tgz#57292af60443c4a3622cf74040ddc28e68336fd8" @@ -220,6 +452,13 @@ dependencies: "@babel/types" "^7.7.4" +"@babel/helper-split-export-declaration@^7.8.0": + version "7.8.0" + resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.8.0.tgz#ed10cb03b07454c0d40735fad4e9c9711e739588" + integrity sha512-YhYFhH4T6DlbT6CPtVgLfC1Jp2gbCawU/ml7WJvUpBg01bCrXSzTYMZZXbbIGjq/kHmK8YUATxTppcRGzj31pA== + dependencies: + "@babel/types" "^7.8.0" + "@babel/helper-wrap-function@^7.7.4": version "7.7.4" resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.7.4.tgz#37ab7fed5150e22d9d7266e830072c0cdd8baace" @@ -230,6 +469,16 @@ "@babel/traverse" "^7.7.4" "@babel/types" "^7.7.4" +"@babel/helper-wrap-function@^7.8.0": + version "7.8.0" + resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.8.0.tgz#a26751c7b0be765a0db10162c6de485402cb505c" + integrity sha512-2j6idN2jt8Y+8nJ4UPN/6AZa53DAkcETMVmroJQh50qZc59PuQKVjgOIIqmrLoQf6Ia9bs90MHRcID1OW5tfag== + dependencies: + "@babel/helper-function-name" "^7.8.0" + "@babel/template" "^7.8.0" + "@babel/traverse" "^7.8.0" + "@babel/types" "^7.8.0" + "@babel/helpers@^7.7.4": version "7.7.4" resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.7.4.tgz#62c215b9e6c712dadc15a9a0dcab76c92a940302" @@ -239,6 +488,15 @@ "@babel/traverse" "^7.7.4" "@babel/types" "^7.7.4" +"@babel/helpers@^7.8.0": + version "7.8.0" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.8.0.tgz#3d3e6e08febf5edbbf63b1cf64395525aa3ece37" + integrity sha512-srWKpjAFbiut5JoCReZJ098hLqoZ9HufOnKZPggc7j74XaPuQ+9b3RYPV1M/HfjL63lCNd8uI1O487qIWxAFNA== + dependencies: + "@babel/template" "^7.8.0" + "@babel/traverse" "^7.8.0" + "@babel/types" "^7.8.0" + "@babel/highlight@^7.0.0": version "7.5.0" resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.5.0.tgz#56d11312bd9248fa619591d02472be6e8cb32540" @@ -248,11 +506,25 @@ esutils "^2.0.2" js-tokens "^4.0.0" +"@babel/highlight@^7.8.0": + version "7.8.0" + resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.8.0.tgz#4cc003dc10359919e2e3a1d9459150942913dd1a" + integrity sha512-OsdTJbHlPtIk2mmtwXItYrdmalJ8T0zpVzNAbKSkHshuywj7zb29Y09McV/jQsQunc/nEyHiPV2oy9llYMLqxw== + dependencies: + chalk "^2.0.0" + esutils "^2.0.2" + js-tokens "^4.0.0" + "@babel/parser@^7.0.0", "@babel/parser@^7.1.0", "@babel/parser@^7.4.3", "@babel/parser@^7.7.4", "@babel/parser@^7.7.7": version "7.7.7" resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.7.7.tgz#1b886595419cf92d811316d5b715a53ff38b4937" integrity sha512-WtTZMZAZLbeymhkd/sEaPD8IQyGAhmuTuvTzLiCFM7iXiVdY0gc0IaI+cW0fh1BnSMbJSzXX6/fHllgHKwHhXw== +"@babel/parser@^7.8.0": + version "7.8.0" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.8.0.tgz#54682775f1fb25dd29a93a02315aab29a6a292bb" + integrity sha512-VVtsnUYbd1+2A2vOVhm4P2qNXQE8L/W859GpUHfUcdhX8d3pEKThZuIr6fztocWx9HbK+00/CR0tXnhAggJ4CA== + "@babel/plugin-proposal-async-generator-functions@^7.7.4": version "7.7.4" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.7.4.tgz#0351c5ac0a9e927845fffd5b82af476947b7ce6d" @@ -262,6 +534,15 @@ "@babel/helper-remap-async-to-generator" "^7.7.4" "@babel/plugin-syntax-async-generators" "^7.7.4" +"@babel/plugin-proposal-async-generator-functions@^7.8.0": + version "7.8.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.8.0.tgz#92520961d1b2220f0f2e6b576b7896698cd747f9" + integrity sha512-8vIQf8JYced7gCeKDsGETNGKE+zdD/JmP1LBlRn+w3UXc1aSpZv2Y330bB/fnOEbUgPbuFv+IEi+gopg+Fu0kQ== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + "@babel/helper-remap-async-to-generator" "^7.8.0" + "@babel/plugin-syntax-async-generators" "^7.8.0" + "@babel/plugin-proposal-class-properties@^7.3.4": version "7.7.4" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.7.4.tgz#2f964f0cb18b948450362742e33e15211e77c2ba" @@ -279,6 +560,15 @@ "@babel/helper-plugin-utils" "^7.0.0" "@babel/plugin-syntax-decorators" "^7.7.4" +"@babel/plugin-proposal-decorators@^7.8.0": + version "7.8.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.8.0.tgz#2f1661712c557de8bc65c0b58876a2b47ff886d5" + integrity sha512-HKltBhhrRigrHYkDrO/9rg+ZerXSAtZjepm8URUrNxgzTzEfuOb06fUU311chMkahZHSfASNUxWVwRzIwGt/uw== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.8.0" + "@babel/helper-plugin-utils" "^7.8.0" + "@babel/plugin-syntax-decorators" "^7.8.0" + "@babel/plugin-proposal-dynamic-import@^7.7.4": version "7.7.4" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.7.4.tgz#dde64a7f127691758cbfed6cf70de0fa5879d52d" @@ -287,6 +577,14 @@ "@babel/helper-plugin-utils" "^7.0.0" "@babel/plugin-syntax-dynamic-import" "^7.7.4" +"@babel/plugin-proposal-dynamic-import@^7.8.0": + version "7.8.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.8.0.tgz#bbd7c00f351b55f02aec0fe9b9c42ad3f659b176" + integrity sha512-YzMq0AqeTR4Mh2pz3GrCWqhcEV38HgUMMR/56/YR5GPc4Y2p1KJ4Le6j92vMnW8TJqVj+qJz/KDNglpMeww9Yg== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + "@babel/plugin-syntax-dynamic-import" "^7.8.0" + "@babel/plugin-proposal-export-default-from@^7.0.0": version "7.7.4" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-export-default-from/-/plugin-proposal-export-default-from-7.7.4.tgz#890de3c0c475374638292df31f6582160b54d639" @@ -319,6 +617,14 @@ "@babel/helper-plugin-utils" "^7.0.0" "@babel/plugin-syntax-json-strings" "^7.7.4" +"@babel/plugin-proposal-json-strings@^7.8.0": + version "7.8.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.8.0.tgz#99fd838398c32f4d96117770f7f3591062e72607" + integrity sha512-pSpuhwn926vtNeUH2FHx1OzIXaUMgklG0MzlFZJVEg37fB904gOxN572NgBae+KDwFyZDpkLMyEkVA011lBJrQ== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + "@babel/plugin-syntax-json-strings" "^7.8.0" + "@babel/plugin-proposal-nullish-coalescing-operator@^7.0.0", "@babel/plugin-proposal-nullish-coalescing-operator@^7.2.0", "@babel/plugin-proposal-nullish-coalescing-operator@^7.4.3", "@babel/plugin-proposal-nullish-coalescing-operator@^7.4.4": version "7.7.4" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.7.4.tgz#7db302c83bc30caa89e38fee935635ef6bd11c28" @@ -327,6 +633,14 @@ "@babel/helper-plugin-utils" "^7.0.0" "@babel/plugin-syntax-nullish-coalescing-operator" "^7.7.4" +"@babel/plugin-proposal-nullish-coalescing-operator@^7.8.0": + version "7.8.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.8.0.tgz#1ef61239ed2241746bc4936fc643a5c6f1cb24fa" + integrity sha512-cQMI+RQdcK2IyMm13NKKFCYfOSBUtFxEeRBOdFCi2Pubv/CpkrCubc/ikdeKMT6Lu+uQ+lNSDEJvDCOQZkUy0g== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.0" + "@babel/plugin-proposal-object-rest-spread@^7.7.7": version "7.7.7" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.7.7.tgz#9f27075004ab99be08c5c1bd653a2985813cb370" @@ -335,6 +649,14 @@ "@babel/helper-plugin-utils" "^7.0.0" "@babel/plugin-syntax-object-rest-spread" "^7.7.4" +"@babel/plugin-proposal-object-rest-spread@^7.8.0": + version "7.8.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.8.0.tgz#ca8ac673d32db774c2154a4c7517fd46ec45e9cf" + integrity sha512-SjJ2ZXCylpWC+5DTES0/pbpNmw/FnjU/3dF068xF0DU9aN+oOKah+3MCSFcb4pnZ9IwmxfOy4KnbGJSQR+hAZA== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + "@babel/plugin-syntax-object-rest-spread" "^7.8.0" + "@babel/plugin-proposal-optional-catch-binding@^7.7.4": version "7.7.4" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.7.4.tgz#ec21e8aeb09ec6711bc0a39ca49520abee1de379" @@ -343,6 +665,14 @@ "@babel/helper-plugin-utils" "^7.0.0" "@babel/plugin-syntax-optional-catch-binding" "^7.7.4" +"@babel/plugin-proposal-optional-catch-binding@^7.8.0": + version "7.8.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.8.0.tgz#6a7dee0bfd72751e3f1386ba4da03e6fa82fcd95" + integrity sha512-tHP3eez6TrpPJYttBZ/6uItRbIuXUIDpQ9xwvzKwR+RboWGMJ7WzFC5dDJ3vjLuCx0/DG1tM0MVkmgcBybth9w== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + "@babel/plugin-syntax-optional-catch-binding" "^7.8.0" + "@babel/plugin-proposal-optional-chaining@^7.0.0", "@babel/plugin-proposal-optional-chaining@^7.2.0", "@babel/plugin-proposal-optional-chaining@^7.6.0": version "7.7.5" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.7.5.tgz#f0835f044cef85b31071a924010a2a390add11d4" @@ -351,6 +681,14 @@ "@babel/helper-plugin-utils" "^7.0.0" "@babel/plugin-syntax-optional-chaining" "^7.7.4" +"@babel/plugin-proposal-optional-chaining@^7.8.0": + version "7.8.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.8.0.tgz#d05e4fa3c1e4ef18eaea6bc92a4b06f95eaf1df5" + integrity sha512-PNBHxPHE91m+LLOdGwlvyGicWfrMgiVwng5WdB3CMjd61+vn3vPw0GbgECIAUCZnyi7Jqs5htUIZRztGuV8/5g== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + "@babel/plugin-syntax-optional-chaining" "^7.8.0" + "@babel/plugin-proposal-pipeline-operator@^7.0.0": version "7.7.7" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-pipeline-operator/-/plugin-proposal-pipeline-operator-7.7.7.tgz#d85c3c90924db3c4876cdf5a6290f1977d66cd5a" @@ -375,6 +713,14 @@ "@babel/helper-create-regexp-features-plugin" "^7.7.4" "@babel/helper-plugin-utils" "^7.0.0" +"@babel/plugin-proposal-unicode-property-regex@^7.8.0": + version "7.8.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.8.0.tgz#9e1c0481863485052bae8ac024fca7028e24ee31" + integrity sha512-3oK0Qt5w4arb+es3rWBribDbtc0TYJP7dFZ1dXcYul3cXderqfIOoSx9YUC1oD208nJwJO/++fvrgLmkYSbe8A== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.8.0" + "@babel/helper-plugin-utils" "^7.8.0" + "@babel/plugin-syntax-async-generators@^7.7.4": version "7.7.4" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.7.4.tgz#331aaf310a10c80c44a66b238b6e49132bd3c889" @@ -382,6 +728,13 @@ dependencies: "@babel/helper-plugin-utils" "^7.0.0" +"@babel/plugin-syntax-async-generators@^7.8.0": + version "7.8.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.0.tgz#e6c3dba5a61ecf72ba00a3f3f5f1234989a58e6a" + integrity sha512-a8w8k7pK8nYhem07rXdAq03T+DlTX8LFojUptrh9JEx80AgLqGiuoFIyQOGTWif39kFnDOQqbzl1s6KQqrfV+A== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + "@babel/plugin-syntax-decorators@^7.7.4": version "7.7.4" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.7.4.tgz#3c91cfee2a111663ff3ac21b851140f5a52a4e0b" @@ -389,6 +742,13 @@ dependencies: "@babel/helper-plugin-utils" "^7.0.0" +"@babel/plugin-syntax-decorators@^7.8.0": + version "7.8.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.8.0.tgz#4a2930ef597c5bc5c5ae9a97d7883d03eeb48eb2" + integrity sha512-Qz68qh9jJqQePGWqbNW9PA7vkE2gvnWkYtx32jgPOszpE7u+xObPkRGm3B80oXAjQlBdTa4ktqjkOIRiKRuapw== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + "@babel/plugin-syntax-dynamic-import@^7.7.4": version "7.7.4" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.7.4.tgz#29ca3b4415abfe4a5ec381e903862ad1a54c3aec" @@ -396,6 +756,13 @@ dependencies: "@babel/helper-plugin-utils" "^7.0.0" +"@babel/plugin-syntax-dynamic-import@^7.8.0": + version "7.8.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.0.tgz#3a6c1cd36af923db602df83c5aa72e08bb14353a" + integrity sha512-Mx2RzpCHJaBfmFdA2abXDKRHVJdzJ6R0Wqwb6TxCgM7NRR5wcC4cyiAsRL7Ga+lwG8GG1cKvb+4ENjic8y15jA== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + "@babel/plugin-syntax-export-default-from@^7.7.4": version "7.7.4" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-export-default-from/-/plugin-syntax-export-default-from-7.7.4.tgz#897f05808298060b52873fa804ff853540790ea1" @@ -431,6 +798,13 @@ dependencies: "@babel/helper-plugin-utils" "^7.0.0" +"@babel/plugin-syntax-json-strings@^7.8.0": + version "7.8.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.0.tgz#7f798eb7e8cfd3821388120679d23d530bae6e53" + integrity sha512-LPykaAbH86L5NnDfCRSpNxtEHZk+6GaFzXfWEFU/6R4v69EXQr6GOp7hwH+Uw0QlYVN++s6TukTJ3flFcspahA== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + "@babel/plugin-syntax-nullish-coalescing-operator@^7.7.4": version "7.7.4" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.7.4.tgz#e53b751d0c3061b1ba3089242524b65a7a9da12b" @@ -438,6 +812,13 @@ dependencies: "@babel/helper-plugin-utils" "^7.0.0" +"@babel/plugin-syntax-nullish-coalescing-operator@^7.8.0": + version "7.8.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.0.tgz#5d8f24ecffa4ae74164e53264953c5ea8ba6d149" + integrity sha512-Rv2hnBToN6rbA9hO2a4vtwXZLzNa+TWkoSIMMvUezFz5+D9NPeX7SFrArwtFzzbwndmWiqboTr5rNpzAz0MPpA== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + "@babel/plugin-syntax-object-rest-spread@^7.0.0", "@babel/plugin-syntax-object-rest-spread@^7.7.4": version "7.7.4" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.7.4.tgz#47cf220d19d6d0d7b154304701f468fc1cc6ff46" @@ -445,6 +826,13 @@ dependencies: "@babel/helper-plugin-utils" "^7.0.0" +"@babel/plugin-syntax-object-rest-spread@^7.8.0": + version "7.8.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.0.tgz#9b37d580d459682364d8602494c69145b394fd4c" + integrity sha512-dt89fDlkfkTrQcy5KavMQPyF2A6tR0kYp8HAnIoQv5hO34iAUffHghP/hMGd7Gf/+uYTmLQO0ar7peX1SUWyIA== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + "@babel/plugin-syntax-optional-catch-binding@^7.7.4": version "7.7.4" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.7.4.tgz#a3e38f59f4b6233867b4a92dcb0ee05b2c334aa6" @@ -452,6 +840,13 @@ dependencies: "@babel/helper-plugin-utils" "^7.0.0" +"@babel/plugin-syntax-optional-catch-binding@^7.8.0": + version "7.8.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.0.tgz#180c7bdd6b7fd81cc6d18269de12d5ddd60cabce" + integrity sha512-EIgJVy+u1RvR2gJfX4ReLwAupO/twllUue1wPrRxhu18+eC3bGTEcOSXLQdaE9ya9NG1rE0eQs0GSiloUGFEwg== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + "@babel/plugin-syntax-optional-chaining@^7.7.4": version "7.7.4" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.7.4.tgz#c91fdde6de85d2eb8906daea7b21944c3610c901" @@ -459,6 +854,13 @@ dependencies: "@babel/helper-plugin-utils" "^7.0.0" +"@babel/plugin-syntax-optional-chaining@^7.8.0": + version "7.8.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.0.tgz#c40f4d4d6a4f5e71d2bfd949b0a7f1e1e6792fe0" + integrity sha512-LV1c+TTAO8Vawe3t+WXBHYWbS7endP8MSlqKPKEZOyWPEJX2akl3jfvFG828/OE7RpyoC3JXfLJDFj/jN7A8hg== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + "@babel/plugin-syntax-pipeline-operator@^7.7.7": version "7.7.7" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-pipeline-operator/-/plugin-syntax-pipeline-operator-7.7.7.tgz#90e9bb01d9157db8019a3e2021ee6eefe52e96d1" @@ -480,6 +882,20 @@ dependencies: "@babel/helper-plugin-utils" "^7.0.0" +"@babel/plugin-syntax-top-level-await@^7.8.0": + version "7.8.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.8.0.tgz#8d45e3d68a1e26bce79c51b08dd9126290686207" + integrity sha512-iXR/Cw32fMfWlD1sK2zD/nXtuLStkalRv+xee6VrX84CFrn2LKwb/EOs/4UaDNUpUsws8YZYKeQjPagacFquug== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-typescript@^7.8.0": + version "7.8.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.8.0.tgz#8bdf202f573cd0e1231caea970f41fdf104f69d7" + integrity sha512-LrvVrabb993Ve5fzXsyEkfYCuhpXBwsUFjlvgD8UmXXg3r/8/ceooSdRvjdmtPXXz+lHaqZHZooV1jMWer2qkA== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + "@babel/plugin-transform-arrow-functions@^7.7.4": version "7.7.4" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.7.4.tgz#76309bd578addd8aee3b379d809c802305a98a12" @@ -487,6 +903,13 @@ dependencies: "@babel/helper-plugin-utils" "^7.0.0" +"@babel/plugin-transform-arrow-functions@^7.8.0": + version "7.8.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.8.0.tgz#d98b7c425fed35f70cb85024a2b10008936631b3" + integrity sha512-9KfteDp9d8cF388dxFMOh3Dum41qpOVUPVjQhXGd1kPyQBE05FJgYndiAriML2yhMIbZ2bjgweh2nnvBXDH2MQ== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + "@babel/plugin-transform-async-to-generator@^7.7.4": version "7.7.4" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.7.4.tgz#694cbeae6d613a34ef0292713fa42fb45c4470ba" @@ -496,6 +919,15 @@ "@babel/helper-plugin-utils" "^7.0.0" "@babel/helper-remap-async-to-generator" "^7.7.4" +"@babel/plugin-transform-async-to-generator@^7.8.0": + version "7.8.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.8.0.tgz#6561fb6445d89bc20b72150430944cad0e501e4a" + integrity sha512-9dvBvJnEdsDWYMrykoMyLNVRPGoub6SFlARtsYgSQ1riTjnyBjhctihSME4XsSku86F59PDeFpC9PCU+9I154w== + dependencies: + "@babel/helper-module-imports" "^7.8.0" + "@babel/helper-plugin-utils" "^7.8.0" + "@babel/helper-remap-async-to-generator" "^7.8.0" + "@babel/plugin-transform-block-scoped-functions@^7.7.4": version "7.7.4" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.7.4.tgz#d0d9d5c269c78eaea76227ace214b8d01e4d837b" @@ -503,6 +935,13 @@ dependencies: "@babel/helper-plugin-utils" "^7.0.0" +"@babel/plugin-transform-block-scoped-functions@^7.8.0": + version "7.8.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.8.0.tgz#2ea8a33ec78825ce91244980389cb96d4c6dc6bd" + integrity sha512-bim6gUfHq2kPN+aQst33ZEMeglpaUXAo6PWTZvOA8BOnWpNKgZcUzBvpZhh2ofL6YhZgzGoRwVVfzwynDEf47g== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + "@babel/plugin-transform-block-scoping@^7.7.4": version "7.7.4" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.7.4.tgz#200aad0dcd6bb80372f94d9e628ea062c58bf224" @@ -511,6 +950,14 @@ "@babel/helper-plugin-utils" "^7.0.0" lodash "^4.17.13" +"@babel/plugin-transform-block-scoping@^7.8.0": + version "7.8.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.8.0.tgz#f6a81bc8c76dbbd202b718cb9e681a27f1d0af8f" + integrity sha512-FKTK4hzg7W950Yu9iqMl12WBixCmusMc5HBt3/ErvpFLnvr3/6mu/EBTZoCEJ0mw/lQUDfU01vTcZY9oEahlMg== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + lodash "^4.17.13" + "@babel/plugin-transform-classes@^7.7.4": version "7.7.4" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.7.4.tgz#c92c14be0a1399e15df72667067a8f510c9400ec" @@ -525,6 +972,20 @@ "@babel/helper-split-export-declaration" "^7.7.4" globals "^11.1.0" +"@babel/plugin-transform-classes@^7.8.0": + version "7.8.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.8.0.tgz#eb4699613b3ea3ccaf095bb0447dac55f7454fc9" + integrity sha512-18RLDwKtGXCLLbf5V03GojebPH7dKYCmIBqQGhgfZDoYsyEzR9kMZ6IxlJP72K5ROC9ADa4KPI6ywuh7NfQOgQ== + dependencies: + "@babel/helper-annotate-as-pure" "^7.8.0" + "@babel/helper-define-map" "^7.8.0" + "@babel/helper-function-name" "^7.8.0" + "@babel/helper-optimise-call-expression" "^7.8.0" + "@babel/helper-plugin-utils" "^7.8.0" + "@babel/helper-replace-supers" "^7.8.0" + "@babel/helper-split-export-declaration" "^7.8.0" + globals "^11.1.0" + "@babel/plugin-transform-computed-properties@^7.7.4": version "7.7.4" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.7.4.tgz#e856c1628d3238ffe12d668eb42559f79a81910d" @@ -532,6 +993,13 @@ dependencies: "@babel/helper-plugin-utils" "^7.0.0" +"@babel/plugin-transform-computed-properties@^7.8.0": + version "7.8.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.8.0.tgz#c86c200ea42cbecda754fdf636a04dfbf6371cc7" + integrity sha512-FaODHuQRdnWFVwxLPlTN85Lk/aitfvQBHTXahf58FnatCynfhkeNUO8ID+AqAxY4IJsZjeH6OnKDzcGfgKJcVw== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + "@babel/plugin-transform-destructuring@^7.7.4": version "7.7.4" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.7.4.tgz#2b713729e5054a1135097b6a67da1b6fe8789267" @@ -539,6 +1007,13 @@ dependencies: "@babel/helper-plugin-utils" "^7.0.0" +"@babel/plugin-transform-destructuring@^7.8.0": + version "7.8.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.8.0.tgz#579d09e8dabf825cc3ac1524414ff99669f0abf9" + integrity sha512-D+69HT//cE86aBTLULzSBFLC5A7HcPQzJPiny6P4SLHkDF750MylRKO3iWvdgvb+OSp5dOrOxwXajvaxk1ZfYA== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + "@babel/plugin-transform-dotall-regex@^7.7.7": version "7.7.7" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.7.7.tgz#3e9713f1b69f339e87fa796b097d73ded16b937b" @@ -547,6 +1022,14 @@ "@babel/helper-create-regexp-features-plugin" "^7.7.4" "@babel/helper-plugin-utils" "^7.0.0" +"@babel/plugin-transform-dotall-regex@^7.8.0": + version "7.8.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.8.0.tgz#7e9e439e85219be091c5dbf1be138320600d1172" + integrity sha512-pq/XLkDB4MPvTe9ktHJInfWksalXogrIGRZJUG7RiDXhEfdNrlducoMPbACZQuCFtelVgVpD0VyreiY0l38G7g== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.8.0" + "@babel/helper-plugin-utils" "^7.8.0" + "@babel/plugin-transform-duplicate-keys@^7.7.4": version "7.7.4" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.7.4.tgz#3d21731a42e3f598a73835299dd0169c3b90ac91" @@ -554,6 +1037,13 @@ dependencies: "@babel/helper-plugin-utils" "^7.0.0" +"@babel/plugin-transform-duplicate-keys@^7.8.0": + version "7.8.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.8.0.tgz#913b3fdb5cbd35e3208b017dac5ef335ef6b0d65" + integrity sha512-REtYWvpP4TDw4oVeP01vQJcAeewjgk8/i7tPFP11vUjvarUGGyxJLeq79WEnIdnKPQJirZaoDRT4kEWEdSWkDw== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + "@babel/plugin-transform-exponentiation-operator@^7.7.4": version "7.7.4" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.7.4.tgz#dd30c0191e3a1ba19bcc7e389bdfddc0729d5db9" @@ -562,6 +1052,14 @@ "@babel/helper-builder-binary-assignment-operator-visitor" "^7.7.4" "@babel/helper-plugin-utils" "^7.0.0" +"@babel/plugin-transform-exponentiation-operator@^7.8.0": + version "7.8.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.8.0.tgz#72ddf89e1acfac75482992b8976df62f8ad813c4" + integrity sha512-vaDgF3gPLzVcoe3UZqnra6FA7O797sZc+UCHPd9eQTI34cPtpCA270LzopIXS3Fhc3UmFrijLmre9mHTmUKVgg== + dependencies: + "@babel/helper-builder-binary-assignment-operator-visitor" "^7.8.0" + "@babel/helper-plugin-utils" "^7.8.0" + "@babel/plugin-transform-flow-strip-types@^7.7.4": version "7.7.4" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.7.4.tgz#cc73f85944782df1d77d80977bc097920a8bf31a" @@ -577,6 +1075,13 @@ dependencies: "@babel/helper-plugin-utils" "^7.0.0" +"@babel/plugin-transform-for-of@^7.8.0": + version "7.8.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.8.0.tgz#4a2960b76d42f4cc8a821edb66f4a7eadf6042ce" + integrity sha512-9j9g0qViCAo8E5qCBSaQdghymn7A9bRXSfS9jU7oLpYccYFZg9A+1KO8X+HV7fhJYH6mZ+e7MRg4p3sLo+RG6Q== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + "@babel/plugin-transform-function-name@^7.7.4": version "7.7.4" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.7.4.tgz#75a6d3303d50db638ff8b5385d12451c865025b1" @@ -585,6 +1090,14 @@ "@babel/helper-function-name" "^7.7.4" "@babel/helper-plugin-utils" "^7.0.0" +"@babel/plugin-transform-function-name@^7.8.0": + version "7.8.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.8.0.tgz#9c5fdb20967f151c0e06419621d56d63120653c9" + integrity sha512-YL8Ol54UKeIyY1uUGfry+B9ppXAB3aVBB1gG9gxqhg/OBCPpV2QUNswmjvfmyXEdaWv8qODssBgX7on792h44w== + dependencies: + "@babel/helper-function-name" "^7.8.0" + "@babel/helper-plugin-utils" "^7.8.0" + "@babel/plugin-transform-literals@^7.7.4": version "7.7.4" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.7.4.tgz#27fe87d2b5017a2a5a34d1c41a6b9f6a6262643e" @@ -592,6 +1105,13 @@ dependencies: "@babel/helper-plugin-utils" "^7.0.0" +"@babel/plugin-transform-literals@^7.8.0": + version "7.8.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.8.0.tgz#bda7a4773293ee9b687174eb4e1f91fe37ed576f" + integrity sha512-7UDPKG+uVltsZt98Hw+rMbLg772r8fQC6YJ2fNDckcpAXgIWqQbMCmCpfYo0hBNhdhqocM73auk4P/zziQshQw== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + "@babel/plugin-transform-member-expression-literals@^7.7.4": version "7.7.4" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.7.4.tgz#aee127f2f3339fc34ce5e3055d7ffbf7aa26f19a" @@ -599,6 +1119,13 @@ dependencies: "@babel/helper-plugin-utils" "^7.0.0" +"@babel/plugin-transform-member-expression-literals@^7.8.0": + version "7.8.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.8.0.tgz#da3e170e99c2fd1110785cc6146aa2f45429f664" + integrity sha512-lJSdaWR56wmrosCiyqKFRVnLrFYoVAk2mtZAyegt7akeJky/gguv0Rukx9GV3XwHGuM1ZPE06cZMjNlcLp8LrQ== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + "@babel/plugin-transform-modules-amd@^7.7.5": version "7.7.5" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.7.5.tgz#39e0fb717224b59475b306402bb8eedab01e729c" @@ -608,6 +1135,15 @@ "@babel/helper-plugin-utils" "^7.0.0" babel-plugin-dynamic-import-node "^2.3.0" +"@babel/plugin-transform-modules-amd@^7.8.0": + version "7.8.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.8.0.tgz#09f4fb47a2a7d4471866afeb446bc9a068a091b0" + integrity sha512-mFr1O3TaDL4XozM3AzNPz9AsxzzjTxwn4aOShYP5TlO+4rufvjagV2KKDTPMZTQm1ZA/C/PxJDsDekEnnUGz5A== + dependencies: + "@babel/helper-module-transforms" "^7.8.0" + "@babel/helper-plugin-utils" "^7.8.0" + babel-plugin-dynamic-import-node "^2.3.0" + "@babel/plugin-transform-modules-commonjs@^7.7.5": version "7.7.5" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.7.5.tgz#1d27f5eb0bcf7543e774950e5b2fa782e637b345" @@ -618,6 +1154,16 @@ "@babel/helper-simple-access" "^7.7.4" babel-plugin-dynamic-import-node "^2.3.0" +"@babel/plugin-transform-modules-commonjs@^7.8.0": + version "7.8.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.8.0.tgz#69c682a41905f8885ffb9c37ab34ad1fe8ec3fd7" + integrity sha512-w2g8tmL7NgBYt6alc8YawMcmPiYqnVvvI0kLB++VOUOssqdJMAkfQOMGV+2M8H5uhJYDaAghAVMUYps3s+jMrw== + dependencies: + "@babel/helper-module-transforms" "^7.8.0" + "@babel/helper-plugin-utils" "^7.8.0" + "@babel/helper-simple-access" "^7.8.0" + babel-plugin-dynamic-import-node "^2.3.0" + "@babel/plugin-transform-modules-systemjs@^7.7.4": version "7.7.4" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.7.4.tgz#cd98152339d3e763dfe838b7d4273edaf520bb30" @@ -627,6 +1173,16 @@ "@babel/helper-plugin-utils" "^7.0.0" babel-plugin-dynamic-import-node "^2.3.0" +"@babel/plugin-transform-modules-systemjs@^7.8.0": + version "7.8.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.8.0.tgz#b0ff0106a7f8a465a75ce5167c88b648770b0a0c" + integrity sha512-tKF9KLiIsiKyWTVU0yo+NcNAylGn7euggYwXw63/tMxGtDTPsB9Y7Ecqv4EoXEwtoJOJ0Lewf17oaWQtindxIA== + dependencies: + "@babel/helper-hoist-variables" "^7.8.0" + "@babel/helper-module-transforms" "^7.8.0" + "@babel/helper-plugin-utils" "^7.8.0" + babel-plugin-dynamic-import-node "^2.3.0" + "@babel/plugin-transform-modules-umd@^7.7.4": version "7.7.4" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.7.4.tgz#1027c355a118de0aae9fee00ad7813c584d9061f" @@ -635,6 +1191,14 @@ "@babel/helper-module-transforms" "^7.7.4" "@babel/helper-plugin-utils" "^7.0.0" +"@babel/plugin-transform-modules-umd@^7.8.0": + version "7.8.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.8.0.tgz#edc1a7a587a31a185070421f97ae3798b15df9b7" + integrity sha512-lAwNfXwmfTy7fl2XOyoVpMXnLkJANgH0vdSYNFcS4RuJPBtHfunGA+Y0L7wsHmfPzyVYt8sUglLjaWtdZMNJNg== + dependencies: + "@babel/helper-module-transforms" "^7.8.0" + "@babel/helper-plugin-utils" "^7.8.0" + "@babel/plugin-transform-named-capturing-groups-regex@^7.7.4": version "7.7.4" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.7.4.tgz#fb3bcc4ee4198e7385805007373d6b6f42c98220" @@ -642,6 +1206,13 @@ dependencies: "@babel/helper-create-regexp-features-plugin" "^7.7.4" +"@babel/plugin-transform-named-capturing-groups-regex@^7.8.0": + version "7.8.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.8.0.tgz#718e168e7f5ab83fa7e4dfd0cf1831804fc016f0" + integrity sha512-kq1rxQ1HviCP13SMGZ4WjBBpdogTGK7yn/g/+p+g1AQledgHOWKVeMY1DwKYGlGJ/grDGTOqpJLF1v3Sb7ghKA== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.8.0" + "@babel/plugin-transform-new-target@^7.7.4": version "7.7.4" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.7.4.tgz#4a0753d2d60639437be07b592a9e58ee00720167" @@ -649,6 +1220,13 @@ dependencies: "@babel/helper-plugin-utils" "^7.0.0" +"@babel/plugin-transform-new-target@^7.8.0": + version "7.8.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.8.0.tgz#54d126788abc648cab27bc9b74a8306b4158f70f" + integrity sha512-hH1Afz9Xy/wkcxhoI0vYw48kTBJqYUhMmhp3SLI1p817iByM6ItH4LS8tZatDAIKmAQAXj8d3Ups1BgVJECDrA== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + "@babel/plugin-transform-object-super@^7.7.4": version "7.7.4" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.7.4.tgz#48488937a2d586c0148451bf51af9d7dda567262" @@ -657,6 +1235,14 @@ "@babel/helper-plugin-utils" "^7.0.0" "@babel/helper-replace-supers" "^7.7.4" +"@babel/plugin-transform-object-super@^7.8.0": + version "7.8.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.8.0.tgz#aa35d295dd62b84bbea2e155e0b3a2017eb2f4e8" + integrity sha512-2DYqQ811nRlFVlni6iqfxBVVGqkBgfvEv/lcvmdNu2CaG+EA7zSP1hqYUsqamR+uCdDbsrV7uY6/0rkXbJo5YQ== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + "@babel/helper-replace-supers" "^7.8.0" + "@babel/plugin-transform-parameters@^7.7.7": version "7.7.7" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.7.7.tgz#7a884b2460164dc5f194f668332736584c760007" @@ -666,6 +1252,15 @@ "@babel/helper-get-function-arity" "^7.7.4" "@babel/helper-plugin-utils" "^7.0.0" +"@babel/plugin-transform-parameters@^7.8.0": + version "7.8.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.8.0.tgz#edc1531beed51fb8a49e0a3f11ca6b508d083d6f" + integrity sha512-9R2yykk7H92rntETO0fq52vJ4OFaTcDA49K9s8bQPyoD4o3/SkWEklukArCsQC6fowEuraPkH/umopr9uO539g== + dependencies: + "@babel/helper-call-delegate" "^7.8.0" + "@babel/helper-get-function-arity" "^7.8.0" + "@babel/helper-plugin-utils" "^7.8.0" + "@babel/plugin-transform-property-literals@^7.7.4": version "7.7.4" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.7.4.tgz#2388d6505ef89b266103f450f9167e6bd73f98c2" @@ -673,6 +1268,13 @@ dependencies: "@babel/helper-plugin-utils" "^7.0.0" +"@babel/plugin-transform-property-literals@^7.8.0": + version "7.8.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.8.0.tgz#af7538d916935ece100e72123fce109182c01ac3" + integrity sha512-vjZaQlojnZIahu5ofEW+hPJfDI5A6r2Sbi5C0RuCaAOFj7viDIR5kOR7ul3Fz5US8V1sVk5Zd2yuPaz7iBeysg== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + "@babel/plugin-transform-regenerator@^7.7.5": version "7.7.5" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.7.5.tgz#3a8757ee1a2780f390e89f246065ecf59c26fce9" @@ -680,6 +1282,13 @@ dependencies: regenerator-transform "^0.14.0" +"@babel/plugin-transform-regenerator@^7.8.0": + version "7.8.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.8.0.tgz#4a0a40af2f7d60a54a3fd7ce58f06b12ab14eaf9" + integrity sha512-n88GT8PZuOHWxqxCJORW3g1QaYzQhHu5sEslxYeQkHVoewfnfuWN37t7YGaRLaNUdaZUlRPXhDcLGT7zBa/u0g== + dependencies: + regenerator-transform "^0.14.0" + "@babel/plugin-transform-reserved-words@^7.7.4": version "7.7.4" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.7.4.tgz#6a7cf123ad175bb5c69aec8f6f0770387ed3f1eb" @@ -687,6 +1296,13 @@ dependencies: "@babel/helper-plugin-utils" "^7.0.0" +"@babel/plugin-transform-reserved-words@^7.8.0": + version "7.8.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.8.0.tgz#572f21e11b9271e67cc5695890b8d5e58186f51e" + integrity sha512-DnshRyDTXZhmAgO2c1QKZI4CfZjoP2t3fSwRsnbCP9P/FSBpf9I7ovnAELswklw5OeY+/D/JIiaGLoUt2II3LA== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + "@babel/plugin-transform-shorthand-properties@^7.7.4": version "7.7.4" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.7.4.tgz#74a0a9b2f6d67a684c6fbfd5f0458eb7ba99891e" @@ -694,6 +1310,13 @@ dependencies: "@babel/helper-plugin-utils" "^7.0.0" +"@babel/plugin-transform-shorthand-properties@^7.8.0": + version "7.8.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.8.0.tgz#38b43048e633878f82a3ef1353868c12015ac838" + integrity sha512-sExhzq63Gl2PMbl7ETpN7Z1A38rLD6GeCT6EEEIIKjTVt9u6dRqJ6nHhaquL7QgR3egj/8fcvq23UvzfPqGAYA== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + "@babel/plugin-transform-spread@^7.7.4": version "7.7.4" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.7.4.tgz#aa673b356fe6b7e70d69b6e33a17fef641008578" @@ -701,6 +1324,13 @@ dependencies: "@babel/helper-plugin-utils" "^7.0.0" +"@babel/plugin-transform-spread@^7.8.0": + version "7.8.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.8.0.tgz#939e17585b1f24535fdeafc5e11a439520f4b3ab" + integrity sha512-6Zjl0pv6x10YmFVRI0VhwJ/rE++geVHNJ9xwd+UIt3ON2VMRO7qI2lPsyLnzidR5HYNd/JXj47kdU9Rrn4YcnQ== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + "@babel/plugin-transform-sticky-regex@^7.7.4": version "7.7.4" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.7.4.tgz#ffb68c05090c30732076b1285dc1401b404a123c" @@ -709,6 +1339,14 @@ "@babel/helper-plugin-utils" "^7.0.0" "@babel/helper-regex" "^7.0.0" +"@babel/plugin-transform-sticky-regex@^7.8.0": + version "7.8.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.8.0.tgz#98f634d133f7be471e1e6ccc613c6a95e7e9f1f5" + integrity sha512-uksok0Bqox8YeIRFhr6RRtlBXeGpN1ogiEVjEd7A7rVLPZBXKGbL7kODpE7MQ+avjDLv5EEKtDCeYuWZK7FF7g== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + "@babel/helper-regex" "^7.8.0" + "@babel/plugin-transform-template-literals@^7.7.4": version "7.7.4" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.7.4.tgz#1eb6411736dd3fe87dbd20cc6668e5121c17d604" @@ -717,6 +1355,14 @@ "@babel/helper-annotate-as-pure" "^7.7.4" "@babel/helper-plugin-utils" "^7.0.0" +"@babel/plugin-transform-template-literals@^7.8.0": + version "7.8.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.8.0.tgz#2e19e890cc5b0d58643ee6986840e928d707f7ef" + integrity sha512-EF7Q7LEgeMpogHcvmHMNXBWdLWG1tpA1ErXH3i8zTu3+UEKo6aBn+FldPAJ16UbbbOwSCUCiDP6oZxvVRPhwnQ== + dependencies: + "@babel/helper-annotate-as-pure" "^7.8.0" + "@babel/helper-plugin-utils" "^7.8.0" + "@babel/plugin-transform-typeof-symbol@^7.7.4": version "7.7.4" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.7.4.tgz#3174626214f2d6de322882e498a38e8371b2140e" @@ -724,6 +1370,22 @@ dependencies: "@babel/helper-plugin-utils" "^7.0.0" +"@babel/plugin-transform-typeof-symbol@^7.8.0": + version "7.8.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.8.0.tgz#a8d0dd317349d3dcbb9d659808099c94486554a5" + integrity sha512-rEUBEFzsA9mCS2r7EtXFlM/6GqtzgLdC4WVYM9fIgJX+HcSJ8oMmj8LinfKhbo0ipRauvUM2teE2iNDNqDwO1g== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-transform-typescript@^7.8.0": + version "7.8.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.8.0.tgz#485c9d12f011697e0a762d683897711c3daad9c9" + integrity sha512-RhMZnNWcyvX+rM6mk888MaeoVl5pGfmYP3as709n4+0d15SRedz4r+LPRg2a9s4z+t+DM+gy8uz/rmM3Cb8JBw== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.8.0" + "@babel/helper-plugin-utils" "^7.8.0" + "@babel/plugin-syntax-typescript" "^7.8.0" + "@babel/plugin-transform-unicode-regex@^7.7.4": version "7.7.4" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.7.4.tgz#a3c0f65b117c4c81c5b6484f2a5e7b95346b83ae" @@ -732,6 +1394,14 @@ "@babel/helper-create-regexp-features-plugin" "^7.7.4" "@babel/helper-plugin-utils" "^7.0.0" +"@babel/plugin-transform-unicode-regex@^7.8.0": + version "7.8.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.8.0.tgz#20988246a9d98271f861be422e5a17898b80e5b0" + integrity sha512-qDg8wsnE47B/Sj8ZtOndPHrGBxJMssZJ71SzXrItum9n++iVFN7kYuJO+OHhjom7+/or0zzYqvJNzCkUjyNKqg== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.8.0" + "@babel/helper-plugin-utils" "^7.8.0" + "@babel/polyfill@^7.0.0": version "7.7.0" resolved "https://registry.yarnpkg.com/@babel/polyfill/-/polyfill-7.7.0.tgz#e1066e251e17606ec7908b05617f9b7f8180d8f3" @@ -797,6 +1467,69 @@ js-levenshtein "^1.1.3" semver "^5.5.0" +"@babel/preset-env@^7.7.4": + version "7.8.2" + resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.8.2.tgz#dd55bd61f5d0bb1237915173c0e94aa350de3089" + integrity sha512-AF2YUl2bGsLWTtFL68upTTB7nDo05aEcKjHmXJE+aXRvsx5K+9yRsHQP3MjnTrLOWe/eFyUr93dfILROsKC4eg== + dependencies: + "@babel/compat-data" "^7.8.0" + "@babel/helper-compilation-targets" "^7.8.0" + "@babel/helper-module-imports" "^7.8.0" + "@babel/helper-plugin-utils" "^7.8.0" + "@babel/plugin-proposal-async-generator-functions" "^7.8.0" + "@babel/plugin-proposal-dynamic-import" "^7.8.0" + "@babel/plugin-proposal-json-strings" "^7.8.0" + "@babel/plugin-proposal-nullish-coalescing-operator" "^7.8.0" + "@babel/plugin-proposal-object-rest-spread" "^7.8.0" + "@babel/plugin-proposal-optional-catch-binding" "^7.8.0" + "@babel/plugin-proposal-optional-chaining" "^7.8.0" + "@babel/plugin-proposal-unicode-property-regex" "^7.8.0" + "@babel/plugin-syntax-async-generators" "^7.8.0" + "@babel/plugin-syntax-dynamic-import" "^7.8.0" + "@babel/plugin-syntax-json-strings" "^7.8.0" + "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.0" + "@babel/plugin-syntax-object-rest-spread" "^7.8.0" + "@babel/plugin-syntax-optional-catch-binding" "^7.8.0" + "@babel/plugin-syntax-optional-chaining" "^7.8.0" + "@babel/plugin-syntax-top-level-await" "^7.8.0" + "@babel/plugin-transform-arrow-functions" "^7.8.0" + "@babel/plugin-transform-async-to-generator" "^7.8.0" + "@babel/plugin-transform-block-scoped-functions" "^7.8.0" + "@babel/plugin-transform-block-scoping" "^7.8.0" + "@babel/plugin-transform-classes" "^7.8.0" + "@babel/plugin-transform-computed-properties" "^7.8.0" + "@babel/plugin-transform-destructuring" "^7.8.0" + "@babel/plugin-transform-dotall-regex" "^7.8.0" + "@babel/plugin-transform-duplicate-keys" "^7.8.0" + "@babel/plugin-transform-exponentiation-operator" "^7.8.0" + "@babel/plugin-transform-for-of" "^7.8.0" + "@babel/plugin-transform-function-name" "^7.8.0" + "@babel/plugin-transform-literals" "^7.8.0" + "@babel/plugin-transform-member-expression-literals" "^7.8.0" + "@babel/plugin-transform-modules-amd" "^7.8.0" + "@babel/plugin-transform-modules-commonjs" "^7.8.0" + "@babel/plugin-transform-modules-systemjs" "^7.8.0" + "@babel/plugin-transform-modules-umd" "^7.8.0" + "@babel/plugin-transform-named-capturing-groups-regex" "^7.8.0" + "@babel/plugin-transform-new-target" "^7.8.0" + "@babel/plugin-transform-object-super" "^7.8.0" + "@babel/plugin-transform-parameters" "^7.8.0" + "@babel/plugin-transform-property-literals" "^7.8.0" + "@babel/plugin-transform-regenerator" "^7.8.0" + "@babel/plugin-transform-reserved-words" "^7.8.0" + "@babel/plugin-transform-shorthand-properties" "^7.8.0" + "@babel/plugin-transform-spread" "^7.8.0" + "@babel/plugin-transform-sticky-regex" "^7.8.0" + "@babel/plugin-transform-template-literals" "^7.8.0" + "@babel/plugin-transform-typeof-symbol" "^7.8.0" + "@babel/plugin-transform-unicode-regex" "^7.8.0" + "@babel/types" "^7.8.0" + browserslist "^4.8.2" + core-js-compat "^3.6.2" + invariant "^2.2.2" + levenary "^1.1.0" + semver "^5.5.0" + "@babel/preset-flow@^7.0.0": version "7.7.4" resolved "https://registry.yarnpkg.com/@babel/preset-flow/-/preset-flow-7.7.4.tgz#99c1349b6fd7132783196de181e6b32d0949427e" @@ -805,6 +1538,14 @@ "@babel/helper-plugin-utils" "^7.0.0" "@babel/plugin-transform-flow-strip-types" "^7.7.4" +"@babel/preset-typescript@^7.7.4": + version "7.8.0" + resolved "https://registry.yarnpkg.com/@babel/preset-typescript/-/preset-typescript-7.8.0.tgz#f3bcb241e530e5acd424659e641189f06401a7ad" + integrity sha512-mvu4OmrLK6qRPiXlOkE4yOeOszHzk9itwe6aiMN0RL9Bc5uAwAotVTy4kKl17evLMd1WsvWT1O3mZltynuqxXg== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + "@babel/plugin-transform-typescript" "^7.8.0" + "@babel/register@^7.0.0": version "7.7.7" resolved "https://registry.yarnpkg.com/@babel/register/-/register-7.7.7.tgz#46910c4d1926b9c6096421b23d1f9e159c1dcee1" @@ -839,6 +1580,15 @@ "@babel/parser" "^7.7.4" "@babel/types" "^7.7.4" +"@babel/template@^7.8.0": + version "7.8.0" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.8.0.tgz#a32f57ad3be89c0fa69ae87b53b4826844dc6330" + integrity sha512-0NNMDsY2t3ltAVVK1WHNiaePo3tXPUeJpCX4I3xSKFoEl852wJHG8mrgHVADf8Lz1y+8al9cF7cSSfzSnFSYiw== + dependencies: + "@babel/code-frame" "^7.8.0" + "@babel/parser" "^7.8.0" + "@babel/types" "^7.8.0" + "@babel/traverse@^7.0.0", "@babel/traverse@^7.1.0", "@babel/traverse@^7.4.3", "@babel/traverse@^7.7.4": version "7.7.4" resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.7.4.tgz#9c1e7c60fb679fe4fcfaa42500833333c2058558" @@ -854,6 +1604,21 @@ globals "^11.1.0" lodash "^4.17.13" +"@babel/traverse@^7.8.0": + version "7.8.0" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.8.0.tgz#d85266fdcff553c10e57b672604b36383a127c1f" + integrity sha512-d/6sPXFLGlJHZO/zWDtgFaKyalCOHLedzxpVJn6el1cw+f2TZa7xZEszeXdOw6EUemqRFBAn106BWBvtSck9Qw== + dependencies: + "@babel/code-frame" "^7.8.0" + "@babel/generator" "^7.8.0" + "@babel/helper-function-name" "^7.8.0" + "@babel/helper-split-export-declaration" "^7.8.0" + "@babel/parser" "^7.8.0" + "@babel/types" "^7.8.0" + debug "^4.1.0" + globals "^11.1.0" + lodash "^4.17.13" + "@babel/types@^7.0.0", "@babel/types@^7.0.0-beta.49", "@babel/types@^7.3.0", "@babel/types@^7.4.0", "@babel/types@^7.7.4": version "7.7.4" resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.7.4.tgz#516570d539e44ddf308c07569c258ff94fde9193" @@ -863,6 +1628,15 @@ lodash "^4.17.13" to-fast-properties "^2.0.0" +"@babel/types@^7.8.0": + version "7.8.0" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.8.0.tgz#1a2039a028057a2c888b668d94c98e61ea906e7f" + integrity sha512-1RF84ehyx9HH09dMMwGWl3UTWlVoCPtqqJPjGuC4JzMe1ZIVDJ2DT8mv3cPv/A7veLD6sgR7vi95lJqm+ZayIg== + dependencies: + esutils "^2.0.2" + lodash "^4.17.13" + to-fast-properties "^2.0.0" + "@cnakazawa/watch@^1.0.3": version "1.0.3" resolved "https://registry.yarnpkg.com/@cnakazawa/watch/-/watch-1.0.3.tgz#099139eaec7ebf07a27c1786a3ff64f39464d2ef" @@ -1587,7 +2361,7 @@ anymatch@^2.0.0: micromatch "^3.1.4" normalize-path "^2.1.1" -app-conf@^0.7.0: +app-conf@^0.7.0, app-conf@^0.7.1: version "0.7.1" resolved "https://registry.yarnpkg.com/app-conf/-/app-conf-0.7.1.tgz#59bf3605e6d8fa19107408ae9f94c1c9984764b4" integrity sha512-arusY8qGB4EmPFUweuLVQde4cj0zQfMBo+D7wRk285SQPfetX9Jk+4VRL+20n5dsJr4Rm4uj2y6exm78wsgCFg== @@ -3282,6 +4056,15 @@ browserslist@^4.6.0, browserslist@^4.8.0, browserslist@^4.8.2: electron-to-chromium "^1.3.322" node-releases "^1.1.42" +browserslist@^4.8.3: + version "4.8.3" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.8.3.tgz#65802fcd77177c878e015f0e3189f2c4f627ba44" + integrity sha512-iU43cMMknxG1ClEZ2MDKeonKE1CCrFVkQK2AqO2YWFmvIrx4JWrvQ4w4hQez6EpVI8rHTtqh/ruHHDHSOKxvUg== + dependencies: + caniuse-lite "^1.0.30001017" + electron-to-chromium "^1.3.322" + node-releases "^1.1.44" + bser@2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/bser/-/bser-2.1.1.tgz#e6787da20ece9d07998533cfd9de6f5c38f4bc05" @@ -3482,6 +4265,11 @@ caniuse-lite@^1.0.30000844, caniuse-lite@^1.0.30001012, caniuse-lite@^1.0.300010 resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001016.tgz#16ea48d7d6e8caf3cad3295c2d746fe38c4e7f66" integrity sha512-yYQ2QfotceRiH4U+h1Us86WJXtVHDmy3nEKIdYPsZCYnOV5/tMgGbmoIlrMzmh2VXlproqYtVaKeGDBkMZifFA== +caniuse-lite@^1.0.30001017: + version "1.0.30001020" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001020.tgz#3f04c1737500ffda78be9beb0b5c1e2070e15926" + integrity sha512-yWIvwA68wRHKanAVS1GjN8vajAv7MBFshullKCeq/eKpK7pJBVDgFFEqvgWTkcP2+wIDeQGYFRXECjKZnLkUjA== + capture-exit@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/capture-exit/-/capture-exit-2.0.0.tgz#fb953bfaebeb781f62898239dabb426d08a509a4" @@ -4053,6 +4841,14 @@ core-js-compat@^3.6.0: browserslist "^4.8.2" semver "7.0.0" +core-js-compat@^3.6.2: + version "3.6.3" + resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.6.3.tgz#41e281ca771209d5f2eb63ce34f96037d0928538" + integrity sha512-Y3YNGU3bU1yrnzVodop23ghArbKv4IqkZg9MMOWv/h7KT6NRk1/SzHhWDDlubg2+tlcUzAqgj1/GyeJ9fUKMeg== + dependencies: + browserslist "^4.8.3" + semver "7.0.0" + core-js@^1.0.0: version "1.2.7" resolved "https://registry.yarnpkg.com/core-js/-/core-js-1.2.7.tgz#652294c14651db28fa93bd2d5ff2983a4f08c636" @@ -4068,6 +4864,11 @@ core-js@^3.0.0: resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.6.0.tgz#2b854e451de1967d1e29896025cdc13a2518d9ea" integrity sha512-AHPTNKzyB+YwgDWoSOCaid9PUSEF6781vsfiK8qUz62zRR448/XgK2NtCbpiUGizbep8Lrpt0Du19PpGGZvw3Q== +core-js@^3.6.4: + version "3.6.4" + resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.6.4.tgz#440a83536b458114b9cb2ac1580ba377dc470647" + integrity sha512-4paDGScNgZP2IXXilaffL9X7968RuvwlkK3xWtZRVqgd8SYNiVKRJvkFd1aqqEuPfN7E68ZHEp9hDj6lHj4Hyw== + core-util-is@1.0.2, core-util-is@~1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" @@ -4181,6 +4982,11 @@ cross-spawn@^7.0.0: shebang-command "^2.0.0" which "^2.0.1" +cross@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/cross/-/cross-1.0.0.tgz#b155d3719d95e3eb16e51757ed5abc96bee19cfa" + integrity sha1-sVXTcZ2V4+sW5RdX7Vq8lr7hnPo= + crypto-browserify@^3.0.0: version "3.12.0" resolved "https://registry.yarnpkg.com/crypto-browserify/-/crypto-browserify-3.12.0.tgz#396cf9f3137f03e4b8e532c58f698254e00f80ec" @@ -6431,6 +7237,11 @@ generate-object-property@^1.0.0: dependencies: is-property "^1.0.0" +gensync@^1.0.0-beta.1: + version "1.0.0-beta.1" + resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.1.tgz#58f4361ff987e5ff6e1e7a210827aa371eaac269" + integrity sha512-r8EC6NO1sngH/zdD9fiRDLdcgnbayXah+mLgManTaIZJqEC1MZstmnox8KpnI2/fxQwrp5OpCOYWLp4rBl4Jcg== + get-assigned-identifiers@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/get-assigned-identifiers/-/get-assigned-identifiers-1.2.0.tgz#6dbf411de648cbaf8d9169ebb0d2d576191e2ff1" @@ -8820,6 +9631,13 @@ 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== +levenary@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/levenary/-/levenary-1.1.0.tgz#fc146fe75f32dc483a0a2c64aef720f602cd6210" + integrity sha512-VHcwhO0UTpUW7rLPN2/OiWJdgA1e9BqEDALhrgCe/F+uUJnep6CoUsTzMeP8Rh0NGr9uKquXxqe7lwLZo509nQ== + dependencies: + leven "^3.1.0" + levn@^0.3.0, levn@~0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee" @@ -9929,6 +10747,13 @@ node-releases@^1.1.42: dependencies: semver "^6.3.0" +node-releases@^1.1.44: + version "1.1.45" + resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.45.tgz#4cf7e9175d71b1317f15ffd68ce63bce1d53e9f2" + integrity sha512-cXvGSfhITKI8qsV116u2FTzH5EWZJfgG7d4cpqwF8I8+1tWpD6AsvvGRKq2onR0DNj1jfqsjkXZsm14JMS7Cyg== + dependencies: + semver "^6.3.0" + node-sass@^4.8.3: version "4.13.0" resolved "https://registry.yarnpkg.com/node-sass/-/node-sass-4.13.0.tgz#b647288babdd6a1cb726de4545516b31f90da066" @@ -10167,6 +10992,11 @@ object-copy@^0.1.0: define-property "^0.2.5" kind-of "^3.0.3" +object-hash@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/object-hash/-/object-hash-2.0.1.tgz#cef18a0c940cc60aa27965ecf49b782cbf101d96" + integrity sha512-HgcGMooY4JC2PBt9sdUdJ6PMzpin+YtY3r/7wg0uTifP+HJWW8rammseSEHuyt0UeShI183UGssCJqm1bJR7QA== + object-inspect@^1.7.0: version "1.7.0" resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.7.0.tgz#f4f6bd181ad77f006b5ece60bd0b6f398ff74a67" @@ -11924,6 +12754,15 @@ readable-stream@^3.0.0: string_decoder "^1.1.1" util-deprecate "^1.0.1" +readable-stream@^3.5.0: + version "3.6.0" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.0.tgz#337bbda3adc0706bd3e024426a286d4b4b2c9198" + integrity sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA== + dependencies: + inherits "^2.0.3" + string_decoder "^1.1.1" + util-deprecate "^1.0.1" + readable-stream@~1.0.17: version "1.0.34" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.0.34.tgz#125820e34bc842d2f2aaafafe4c2916ee32c157c"