diff --git a/__tests__/agent.ts b/__tests__/agent.ts index 548c571..98d90c4 100644 --- a/__tests__/agent.ts +++ b/__tests__/agent.ts @@ -3,7 +3,8 @@ import { Bzz } from '@erebos/api-bzz-node' import { createKeyPair, sign } from '@erebos/secp256k1' // eslint-disable-next-line import/default import getStream from 'get-stream' -import { BehaviorSubject } from 'rxjs' +import { BehaviorSubject, combineLatest } from 'rxjs' +import { filter, flatMap, map } from 'rxjs/operators' import { Core, FilesRecord } from '@aegle/core' import { Sync, getPublicAddress } from '@aegle/sync' @@ -13,6 +14,7 @@ import { createActorWriter, writeActor, readActor, + ActorAgent, // contact createFirstContactSubscriber, writeFirstContact, @@ -53,30 +55,36 @@ describe('agent', () => { }) } - test('actor protocol', async done => { - const keyPair = createKeyPair() - const pubKey = keyPair.getPublic('hex') - const actorData = { - publicKey: pubKey, - profile: { - displayName: 'Alice', - }, - } + describe('actor protocol', () => { + test('writes and subscribes to an actor feed', async done => { + const keyPair = createKeyPair() + const pubKey = keyPair.getPublic('hex') + const actorData = { + publicKey: pubKey, + profile: { + displayName: 'Alice', + }, + } - const subscription = createActorSubscriber({ - sync, - actor: pubKey, - interval: 1000, - }).subscribe({ - next: loadedActor => { - expect(loadedActor).toEqual(actorData) - subscription.unsubscribe() - done() - }, + const subscription = createActorSubscriber({ + sync, + actor: pubKey, + interval: 1000, + }).subscribe({ + next: loadedActor => { + expect(loadedActor).toEqual(actorData) + subscription.unsubscribe() + done() + }, + }) + + const write = createActorWriter({ sync, keyPair }) + await write(actorData) }) - const write = createActorWriter({ sync, keyPair }) - await write(actorData) + // check properties are initialised as expected in constructor + // check contact can be added + test.todo('ActorAgent') }) describe('contact protocols', () => { @@ -471,7 +479,7 @@ describe('agent', () => { test.todo('uploadFile() and downloadFile() with streams') - // This doesn't work - need more investigation + // This doesn't work as it needs the content length to be provided - will be fixed in Erebos v0.10 test.skip('uploadFile() supports a stream as input', async () => { const file1 = await uploadFile(sync, toReadable('hello'), { encrypt: true, @@ -814,236 +822,331 @@ describe('agent', () => { }) }) - test('end-to-end flow', async () => { - jest.setTimeout(30000) + describe('end-to-end flow', () => { + test('using individual function calls', async () => { + jest.setTimeout(30000) - // Create key pairs for Alice and Bob - const aliceKeyPair = createKeyPair() - const aliceAddress = getPublicAddress(aliceKeyPair) - const bobKeyPair = createKeyPair() - const bobAddress = getPublicAddress(bobKeyPair) + // Create key pairs for Alice and Bob + const aliceKeyPair = createKeyPair() + const aliceAddress = getPublicAddress(aliceKeyPair) + const bobKeyPair = createKeyPair() + const bobAddress = getPublicAddress(bobKeyPair) + + // Alice and Bob publish their public actor data to advertise their public keys + await Promise.all([ + writeActor( + { sync, keyPair: aliceKeyPair }, + { + profile: { displayName: 'Alice' }, + publicKey: aliceKeyPair.getPublic('hex'), + }, + ), + writeActor( + { sync, keyPair: bobKeyPair }, + { + profile: { displayName: 'Bob' }, + publicKey: bobKeyPair.getPublic('hex'), + }, + ), + ]) + + // Actor data can be loaded using their address after it's been published + const [aliceActor, bobActor] = await Promise.all([ + readActor({ sync, actor: aliceAddress }), + readActor({ sync, actor: bobAddress }), + ]) + if (aliceActor == null) { + throw new Error('Alice actor not found') + } + if (bobActor == null) { + throw new Error('Bob actor not found') + } - // Alice and Bob publish their public actor data to advertise their public keys - await Promise.all([ - writeActor( - { sync, keyPair: aliceKeyPair }, - { - profile: { displayName: 'Alice' }, - publicKey: aliceKeyPair.getPublic('hex'), - }, - ), - writeActor( - { sync, keyPair: bobKeyPair }, - { - profile: { displayName: 'Bob' }, - publicKey: bobKeyPair.getPublic('hex'), - }, - ), - ]) + // Based on these advertised public keys, they can publish an encrypted first contact payload + const aliceBobKeyPair = createKeyPair() + const bobAliceKeyPair = createKeyPair() + await Promise.all([ + // Alice -> Bob + writeFirstContact( + { sync, keyPair: aliceKeyPair, actorKey: bobActor.publicKey }, + { + contactPublicKey: aliceBobKeyPair.getPublic('hex'), + actorAddress: aliceAddress, + }, + ), + // Bob -> Alice + writeFirstContact( + { sync, keyPair: bobKeyPair, actorKey: aliceActor.publicKey }, + { + contactPublicKey: bobAliceKeyPair.getPublic('hex'), + actorAddress: bobAddress, + }, + ), + ]) - // Actor data can be loaded using their address after it's been published - const [aliceActor, bobActor] = await Promise.all([ - readActor({ sync, actor: aliceAddress }), - readActor({ sync, actor: bobAddress }), - ]) - if (aliceActor == null) { - throw new Error('Alice actor not found') - } - if (bobActor == null) { - throw new Error('Bob actor not found') - } + // Both Alice and Bob can retrieve each other's contact public key, they will use for future exchanges + const [aliceBobFirstContact, bobAliceFirstContact] = await Promise.all([ + readFirstContact({ + sync, + keyPair: aliceKeyPair, + actorKey: bobActor.publicKey, + }), + readFirstContact({ + sync, + keyPair: bobKeyPair, + actorKey: aliceActor.publicKey, + }), + ]) + if (aliceBobFirstContact == null) { + throw new Error('Alice - Bob first contact not found') + } + if (bobAliceFirstContact == null) { + throw new Error('Bob - Alice first contact not found') + } - // Based on these advertised public keys, they can publish an encrypted first contact payload - const aliceBobKeyPair = createKeyPair() - const bobAliceKeyPair = createKeyPair() - await Promise.all([ - // Alice -> Bob - writeFirstContact( - { sync, keyPair: aliceKeyPair, actorKey: bobActor.publicKey }, - { - contactPublicKey: aliceBobKeyPair.getPublic('hex'), - actorAddress: aliceAddress, - }, - ), - // Bob -> Alice - writeFirstContact( - { sync, keyPair: bobKeyPair, actorKey: aliceActor.publicKey }, - { - contactPublicKey: bobAliceKeyPair.getPublic('hex'), - actorAddress: bobAddress, - }, - ), - ]) + // Create a FileSystem where Alice shares files with Bob + const aliceFilesKeyPair = createKeyPair() + const aliceBobFS = new FileSystemWriter({ + sync, + keyPair: aliceFilesKeyPair, + reader: aliceBobFirstContact.contactPublicKey, + }) - // Both Alice and Bob can retrieve each other's contact public key, they will use for future exchanges - const [aliceBobFirstContact, bobAliceFirstContact] = await Promise.all([ - readFirstContact({ + // Push a file to Alice's FS and share the FS public key with Bob in their contact channel + await aliceBobFS.uploadFile('/readme.txt', 'Hello!', { encrypt: true }) + await Promise.all([ + aliceBobFS.push(), + writeContact( + { + sync, + keyPair: aliceBobKeyPair, + contactKey: aliceBobFirstContact.contactPublicKey, + }, + { fileSystemKey: aliceFilesKeyPair.getPublic('hex') }, + ), + ]) + + // Bob can now read the contact information from Alice + const bobAliceContact = await readContact({ sync, - keyPair: aliceKeyPair, - actorKey: bobActor.publicKey, - }), - readFirstContact({ + keyPair: bobAliceKeyPair, + contactKey: bobAliceFirstContact.contactPublicKey, + }) + if (bobAliceContact == null || bobAliceContact.fileSystemKey == null) { + throw new Error('Bob - Alice FS not found') + } + + // Bob can read from Alice's FileSystem and check the file + const bobAliceFS = new FileSystemReader({ sync, - keyPair: bobKeyPair, - actorKey: aliceActor.publicKey, - }), - ]) - if (aliceBobFirstContact == null) { - throw new Error('Alice - Bob first contact not found') - } - if (bobAliceFirstContact == null) { - throw new Error('Bob - Alice first contact not found') - } + keyPair: bobAliceKeyPair, + writer: bobAliceContact.fileSystemKey, + }) + await bobAliceFS.pull() + const fileFromAlice = bobAliceFS.getFile('/readme.txt') + expect(fileFromAlice).toBeDefined() + + // Now let's add a third user, Chloe, who is going to interact with Bob + const chloeKeyPair = createKeyPair() + const chloeAddress = getPublicAddress(chloeKeyPair) + const chloeBobKeyPair = createKeyPair() + + // Publish Chloe's actor and first contact payloads using Bob's public key + await Promise.all([ + writeActor( + { sync, keyPair: chloeKeyPair }, + { + profile: { displayName: 'Chloe' }, + publicKey: chloeKeyPair.getPublic('hex'), + }, + ), + writeFirstContact( + { sync, keyPair: chloeKeyPair, actorKey: bobActor.publicKey }, + { + contactPublicKey: chloeBobKeyPair.getPublic('hex'), + actorAddress: chloeAddress, + }, + ), + ]) - // Create a FileSystem where Alice shares files with Bob - const aliceFilesKeyPair = createKeyPair() - const aliceBobFS = new FileSystemWriter({ - sync, - keyPair: aliceFilesKeyPair, - reader: aliceBobFirstContact.contactPublicKey, - }) + // Bob can now access Chloe's actor and first contact data + const chloeActor = await readActor({ sync, actor: chloeAddress }) + if (chloeActor == null) { + throw new Error('Chloe actor not found') + } - // Push a file to Alice's FS and share the FS public key with Bob in their contact channel - await aliceBobFS.uploadFile('/readme.txt', 'Hello!', { encrypt: true }) - await Promise.all([ - aliceBobFS.push(), - writeContact( - { - sync, - keyPair: aliceBobKeyPair, - contactKey: aliceBobFirstContact.contactPublicKey, - }, - { fileSystemKey: aliceFilesKeyPair.getPublic('hex') }, - ), - ]) + const bobChloeFirstContact = await readFirstContact({ + sync, + keyPair: bobKeyPair, + actorKey: chloeActor.publicKey, + }) + if (bobChloeFirstContact == null) { + throw new Error('Bob - Chloe first contact not found') + } - // Bob can now read the contact information from Alice - const bobAliceContact = await readContact({ - sync, - keyPair: bobAliceKeyPair, - contactKey: bobAliceFirstContact.contactPublicKey, - }) - if (bobAliceContact == null || bobAliceContact.fileSystemKey == null) { - throw new Error('Bob - Alice FS not found') - } + // Create Bob -> Chloe mailbox and contact + const bobChloeKeyPair = createKeyPair() + const bobMailboxKeyPair = createKeyPair() + const publishMessage = createMailboxWriter({ + sync, + keyPair: bobMailboxKeyPair, + reader: bobChloeFirstContact.contactPublicKey, + }) - // Bob can read from Alice's FileSystem and check the file - const bobAliceFS = new FileSystemReader({ - sync, - keyPair: bobAliceKeyPair, - writer: bobAliceContact.fileSystemKey, - }) - await bobAliceFS.pull() - const fileFromAlice = bobAliceFS.getFile('/readme.txt') - expect(fileFromAlice).toBeDefined() + await Promise.all([ + publishMessage({ + title: 'Hello', + body: 'See attachment', + // Bob is attaching the metadata of the file Alice shared with him + attachments: [{ name: 'readme.txt', file: fileFromAlice }], + }), + writeContact( + { + sync, + keyPair: bobChloeKeyPair, + contactKey: bobChloeFirstContact.contactPublicKey, + }, + { mailboxes: { outbox: bobMailboxKeyPair.getPublic('hex') } }, + ), + writeFirstContact( + { sync, keyPair: bobKeyPair, actorKey: chloeActor.publicKey }, + { + contactPublicKey: bobChloeKeyPair.getPublic('hex'), + actorAddress: bobAddress, + }, + ), + ]) - // Now let's add a third user, Chloe, who is going to interact with Bob - const chloeKeyPair = createKeyPair() - const chloeAddress = getPublicAddress(chloeKeyPair) - const chloeBobKeyPair = createKeyPair() + // Chloe reads Bob's first contact and contact payloads + const chloeBobFirstContact = await readFirstContact({ + sync, + keyPair: chloeKeyPair, + actorKey: bobActor.publicKey, + }) + if (chloeBobFirstContact == null) { + throw new Error('Chloe - Bob first contact not found') + } - // Publish Chloe's actor and first contact payloads using Bob's public key - await Promise.all([ - writeActor( - { sync, keyPair: chloeKeyPair }, - { - profile: { displayName: 'Chloe' }, - publicKey: chloeKeyPair.getPublic('hex'), - }, - ), - writeFirstContact( - { sync, keyPair: chloeKeyPair, actorKey: bobActor.publicKey }, - { - contactPublicKey: chloeBobKeyPair.getPublic('hex'), - actorAddress: chloeAddress, - }, - ), - ]) + const chloeBobContact = await readContact({ + sync, + keyPair: chloeBobKeyPair, + contactKey: chloeBobFirstContact.contactPublicKey, + }) + if (chloeBobContact == null || chloeBobContact.mailboxes == null) { + throw new Error('Chloe - Bob mailboxes not found') + } - // Bob can now access Chloe's actor and first contact data - const chloeActor = await readActor({ sync, actor: chloeAddress }) - if (chloeActor == null) { - throw new Error('Chloe actor not found') - } + // Chloe reads from the mailbox Bob has created and loads the message sent + const reader = createMailboxReader({ + sync, + keyPair: chloeBobKeyPair, + writer: chloeBobContact.mailboxes.outbox, + }) + const chapter = await reader.getLatestChapter() + if (chapter == null) { + throw new Error('Message from Bob not found') + } - const bobChloeFirstContact = await readFirstContact({ - sync, - keyPair: bobKeyPair, - actorKey: chloeActor.publicKey, - }) - if (bobChloeFirstContact == null) { - throw new Error('Bob - Chloe first contact not found') - } + const attachment = chapter.content.data.attachments[0] + expect(attachment).toBeDefined() - // Create Bob -> Chloe mailbox and contact - const bobChloeKeyPair = createKeyPair() - const bobMailboxKeyPair = createKeyPair() - const publishMessage = createMailboxWriter({ - sync, - keyPair: bobMailboxKeyPair, - reader: bobChloeFirstContact.contactPublicKey, + // Chloe downloads the file originally shared by Alice + const fileStream = await downloadFile(sync, attachment.file) + const text = await getStream(fileStream) + expect(text).toBe('Hello!') }) + }) - await Promise.all([ - publishMessage({ - title: 'Hello', - body: 'See attachment', - // Bob is attaching the metadata of the file Alice shared with him - attachments: [{ name: 'readme.txt', file: fileFromAlice }], - }), - writeContact( - { - sync, - keyPair: bobChloeKeyPair, - contactKey: bobChloeFirstContact.contactPublicKey, - }, - { mailboxes: { outbox: bobMailboxKeyPair.getPublic('hex') } }, - ), - writeFirstContact( - { sync, keyPair: bobKeyPair, actorKey: chloeActor.publicKey }, - { - contactPublicKey: bobChloeKeyPair.getPublic('hex'), - actorAddress: bobAddress, - }, - ), - ]) - - // Chloe reads Bob's first contact and contact payloads - const chloeBobFirstContact = await readFirstContact({ - sync, - keyPair: chloeKeyPair, - actorKey: bobActor.publicKey, - }) - if (chloeBobFirstContact == null) { - throw new Error('Chloe - Bob first contact not found') - } + test('using agent classes', async done => { + jest.setTimeout(30000) - const chloeBobContact = await readContact({ - sync, - keyPair: chloeBobKeyPair, - contactKey: chloeBobFirstContact.contactPublicKey, - }) - if (chloeBobContact == null || chloeBobContact.mailboxes == null) { - throw new Error('Chloe - Bob mailboxes not found') + const createActorAgent = (displayName: string): ActorAgent => { + return new ActorAgent({ + autoStart: true, + interval: 1000, + data: { + actor: { + keyPair: createKeyPair(), + profile: { displayName }, + }, + }, + sync, + }) } - // Chloe reads from the mailbox Bob has created and loads the message sent - const reader = createMailboxReader({ - sync, - keyPair: chloeBobKeyPair, - writer: chloeBobContact.mailboxes.outbox, - }) - const chapter = await reader.getLatestChapter() - if (chapter == null) { - throw new Error('Message from Bob not found') - } + const alice = createActorAgent('Alice') + const bob = createActorAgent('Bob') + const chloe = createActorAgent('Chloe') - const attachment = chapter.content.data.attachments[0] - expect(attachment).toBeDefined() + // Alice, Bob and Chloe need to publish their actor data + await Promise.all([ + alice.publishActor(), + bob.publishActor(), + chloe.publishActor(), + ]) + // Alice, Bob need to get one another's address using a side-channel + const [aliceToBob, bobToAlice, bobToChloe, chloeToBob] = await Promise.all([ + alice.addContact(bob.address), + bob.addContact(alice.address), + bob.addContact(chloe.address), + chloe.addContact(bob.address), + ]) - // Chloe downloads the file originally shared by Alice - const fileStream = await downloadFile(sync, attachment.file) - const text = await getStream(fileStream) - expect(text).toBe('Hello!') + const aliceFileSent$ = aliceToBob.connected$.pipe( + filter(Boolean), + flatMap(async () => { + await aliceToBob.createOutboundFileSystem() + await aliceToBob.outboundFileSystem.uploadFile('/test', 'hello!') + await aliceToBob.outboundFileSystem.push() + }), + ) + + const aliceFileReceived$ = bobToAlice.data$.pipe( + map(() => bobToAlice.inboundFileSystem), + filter(Boolean), + flatMap(fs => fs.files), + map(() => bobToAlice.inboundFileSystem.getFile('/test')), + filter(Boolean), + ) + + const bobOutboxCreated$ = bobToChloe.connected$.pipe( + filter(Boolean), + flatMap(async () => { + await bobToChloe.addOutbox('hello') + }), + ) + + const bobMessageSent$ = combineLatest( + aliceFileReceived$, + bobOutboxCreated$, + ).pipe( + flatMap(async ([file]) => { + await bobToChloe.outboxes.sendMessage('hello', { + title: 'hello', + body: 'check this file!', + attachments: [{ file, name: 'hello' }], + }) + }), + ) + + const chloeMessageReceived$ = chloeToBob.data$.pipe( + map(() => chloeToBob.inboxes.getInbox('hello')), + filter(Boolean), + flatMap(inbox => inbox.newMessage$), + filter(msg => msg.title === 'hello'), + ) + + combineLatest( + aliceFileSent$, + bobMessageSent$, + chloeMessageReceived$, + ).subscribe({ + next: () => { + alice.stopAll() + bob.stopAll() + chloe.stopAll() + done() + }, + }) }) }) diff --git a/package.json b/package.json index f0bf765..4dd3f34 100644 --- a/package.json +++ b/package.json @@ -24,26 +24,26 @@ "start": "yarn build && yarn test:all" }, "devDependencies": { - "@babel/cli": "^7.5.5", - "@babel/core": "^7.5.5", + "@babel/cli": "^7.6.0", + "@babel/core": "^7.6.0", "@babel/plugin-proposal-class-properties": "^7.5.5", - "@babel/plugin-transform-runtime": "^7.5.5", - "@babel/preset-env": "^7.5.5", - "@babel/preset-typescript": "^7.3.3", + "@babel/plugin-transform-runtime": "^7.6.0", + "@babel/preset-env": "^7.6.0", + "@babel/preset-typescript": "^7.6.0", "@types/jest": "^24.0.18", - "@typescript-eslint/eslint-plugin": "^2.1.0", - "@typescript-eslint/parser": "^2.1.0", + "@typescript-eslint/eslint-plugin": "^2.3.0", + "@typescript-eslint/parser": "^2.3.0", "babel-eslint": "^10.0.3", "babel-jest": "^24.9.0", - "del-cli": "^2.0.0", - "eslint": "^6.3.0", + "del-cli": "^3.0.0", + "eslint": "^6.4.0", "eslint-config-mainframe": "^4.0.1", "get-stream": "^5.1.0", "jest": "^24.9.0", "jest-junit": "^8.0.0", "lerna": "^3.16.4", "prettier": "^1.18.2", - "ts-jest": "^24.0.2", - "typescript": "^3.6.2" + "ts-jest": "^24.1.0", + "typescript": "^3.6.3" } } diff --git a/packages/agent/package.json b/packages/agent/package.json index 0fb3058..e4e9b00 100644 --- a/packages/agent/package.json +++ b/packages/agent/package.json @@ -25,6 +25,7 @@ "@erebos/hex": "^0.9.0", "@erebos/secp256k1": "^0.9.0", "@erebos/timeline": "^0.9.0", + "fast-deep-equal": "^2.0.1", "get-stream": "^5.1.0", "p-queue": "^6.1.1", "rxjs": "^6.5.3" diff --git a/packages/agent/src/actor.ts b/packages/agent/src/actor.ts index afc5afb..4826802 100644 --- a/packages/agent/src/actor.ts +++ b/packages/agent/src/actor.ts @@ -1,5 +1,5 @@ import { ACTOR_NAME, ActorData, ProfileData } from '@aegle/core' -import { Sync } from '@aegle/sync' +import { Sync, getPublicAddress } from '@aegle/sync' import { hexValue } from '@erebos/hex' import { KeyPair, createKeyPair } from '@erebos/secp256k1' import { Observable } from 'rxjs' @@ -7,9 +7,11 @@ import { map } from 'rxjs/operators' import { ContactAgentData, ContactAgent } from './contact' import { FileSystemWriter } from './fileSystem' +import { SyncParams } from './types' const FEED_PARAMS = { entityType: ACTOR_NAME, name: ACTOR_NAME } +const POLL_INTERVAL = 10 * 1000 // 10 secs export interface ActorReaderParams { actor: string sync: Sync @@ -72,23 +74,29 @@ export interface ActorAgentData { fileSystemKeyPair?: KeyPair } -export interface ActorAgentParams { +export interface ActorAgentParams extends SyncParams { data: ActorAgentData sync: Sync } export class ActorAgent { + protected autoStart: boolean protected data: ActorAgentData + protected interval: number + public address: string public contacts: Record = {} public fileSystem: FileSystemWriter public sync: Sync public writeActor: (data: ActorData) => Promise public constructor(params: ActorAgentParams) { + this.autoStart = params.autoStart || false this.data = params.data + this.interval = params.interval || POLL_INTERVAL this.sync = params.sync + this.address = getPublicAddress(params.data.actor.keyPair) this.writeActor = createActorWriter({ keyPair: this.data.actor.keyPair, sync: this.sync, @@ -108,12 +116,35 @@ export class ActorAgent { fsKeyPair = this.data.fileSystemKeyPair } this.fileSystem = new FileSystemWriter({ + autoStart: this.autoStart, + interval: this.interval, keyPair: fsKeyPair, sync: this.sync, reader: this.data.actor.keyPair.getPublic('hex'), }) } + public startAll(): void { + Object.values(this.contacts).forEach(contact => { + contact.startAll() + }) + this.fileSystem.start() + } + + public stopAll(): void { + Object.values(this.contacts).forEach(contact => { + contact.stopAll() + }) + this.fileSystem.stop() + } + + public async publishActor(): Promise { + return await this.writeActor({ + profile: this.data.actor.profile, + publicKey: this.data.actor.keyPair.getPublic('hex'), + }) + } + public async lookupActor(address: string): Promise { return await readActor({ sync: this.sync, actor: address }) } @@ -129,6 +160,7 @@ export class ActorAgent { public async addContact( address: string, actor?: ActorData, + params: SyncParams = {}, ): Promise { let actorData: ActorData | null = null if (actor == null) { @@ -140,19 +172,24 @@ export class ActorAgent { throw new Error('Actor not found') } + const firstContact = { + keyPair: this.data.actor.keyPair, + actorKey: actorData.publicKey, + } const contact = new ContactAgent({ + autoStart: this.autoStart, + interval: this.interval, + ...params, sync: this.sync, data: { read: { actorAddress: address, actorData: actor, + firstContact, }, write: { keyPair: createKeyPair(), - firstContact: { - keyPair: this.data.actor.keyPair, - actorKey: actorData.publicKey, - }, + firstContact, }, }, }) diff --git a/packages/agent/src/contact.ts b/packages/agent/src/contact.ts index 06a4a6c..07d9fa8 100644 --- a/packages/agent/src/contact.ts +++ b/packages/agent/src/contact.ts @@ -14,6 +14,7 @@ import { map } from 'rxjs/operators' import { FileSystemReader, FileSystemWriter } from './fileSystem' import { InboxesAgent, InboxAgentData, OutboxesAgent } from './messaging' +import { SyncParams } from './types' const CONTACT_FEED_PARAMS = { entityType: CONTACT_NAME, name: CONTACT_NAME } @@ -149,11 +150,9 @@ export interface ContactAgentError { error: Error } -export interface ContactAgentParams { +export interface ContactAgentParams extends SyncParams { sync: Sync data: ContactAgentData - interval?: number - autoStart?: boolean } export class ContactAgent { @@ -371,6 +370,7 @@ export class ContactAgent { writer: read.contactData.fileSystemKey, keyPair: write.keyPair, autoStart: this.autoStart, + interval: this.interval, }) : null } diff --git a/packages/agent/src/fileSystem.ts b/packages/agent/src/fileSystem.ts index 47b6e6e..121599b 100644 --- a/packages/agent/src/fileSystem.ts +++ b/packages/agent/src/fileSystem.ts @@ -16,11 +16,15 @@ import { FeedWriteParams, Sync, getFeedWriteParams } from '@aegle/sync' import { KeyPair } from '@erebos/secp256k1' // eslint-disable-next-line import/default import getStream from 'get-stream' +import isEqual from 'fast-deep-equal' import PQueue from 'p-queue' import { BehaviorSubject, Subscription, interval } from 'rxjs' import { flatMap } from 'rxjs/operators' +import { SyncParams } from './types' + const PATH_RE = new RegExp('^(/[^/]+)+$', 'i') + const POLL_INTERVAL = 120 * 1000 // 2 mins export interface FileUploadParams extends FileMetadata { encrypt?: boolean @@ -55,11 +59,19 @@ export async function uploadFile( let hash, encryption, size if (data instanceof Readable) { + if (params.size == null) { + throw new Error( + 'The `size` parameter must be provided when calling `uploadFile()` with a Stream', + ) + } else { + size = params.size + } + // The `size` option for `uploadFileStream()` is added in Erebos v0.10 if (key === null) { - hash = await sync.bzz.uploadFileStream(data) + hash = await sync.bzz.uploadFileStream(data, { size }) } else { const { cipher, iv } = await createCipher(CRYPTO_ALGORITHM, key) - hash = await sync.bzz.uploadFileStream(data.pipe(cipher)) + hash = await sync.bzz.uploadFileStream(data.pipe(cipher), { size }) encryption = { algorithm: CRYPTO_ALGORITHM, authTag: cipher.getAuthTag().toString('base64'), @@ -149,11 +161,9 @@ enum FileSystemPushSyncState { FAILED, } -export interface FileSystemReaderParams extends FileSystemParams { +export interface FileSystemReaderParams extends FileSystemParams, SyncParams { writer: string keyPair?: KeyPair - interval?: number - autoStart?: boolean } export class FileSystemReader extends FileSystem { @@ -210,7 +220,7 @@ export class FileSystemReader extends FileSystem { try { this.error = undefined const fs = await this.read() - if (fs != null) { + if (fs != null && !isEqual(fs.files, this.files.value)) { this.files.next(fs.files) } this.pullSync.next(FileSystemPullSyncState.DONE) @@ -227,12 +237,10 @@ export interface FileSystemChanges { timestamp: number } -export interface FileSystemWriterParams extends FileSystemParams { +export interface FileSystemWriterParams extends FileSystemParams, SyncParams { keyPair: KeyPair files?: FilesRecord reader?: string - interval?: number - autoStart?: boolean } export class FileSystemWriter extends FileSystem { diff --git a/packages/agent/src/messaging.ts b/packages/agent/src/messaging.ts index 857eaf7..00383e2 100644 --- a/packages/agent/src/messaging.ts +++ b/packages/agent/src/messaging.ts @@ -85,10 +85,11 @@ export class InboxAgent { } } - public start(): InboxAgent { + public start(): void { if (this.subscription !== null) { this.subscription.unsubscribe() } + this.subscription = createMailboxReader({ sync: this.params.sync, keyPair: this.params.keyPair, @@ -109,39 +110,38 @@ export class InboxAgent { }, }) this.state$.next(InboxState.STARTED) - return this } - public stop(): InboxAgent { + public stop(): void { if (this.subscription !== null) { this.subscription.unsubscribe() this.subscription = null this.state$.next(InboxState.STOPPED) } - return this } public isWriter(key: string): boolean { return this.params.writer === key } - public setWriter(key: string): InboxAgent { + public setWriter(key: string): void { if (this.params.writer !== key) { this.params.writer = key if (this.subscription !== null) { this.start() } } - return this } } +// TODO: extend from SyncParams export interface InboxAgentData { writer: string interval?: number messages?: Array } +// TODO: extend from SyncParams, these params can be set at individual inbox and/or for all inboxes export interface InboxesAgentParams extends MailboxAgentParams { autoStart?: boolean inboxes?: Record @@ -176,18 +176,16 @@ export class InboxesAgent { } } - public startAll(): InboxesAgent { + public startAll(): void { Object.values(this.inboxes).forEach(inbox => { inbox.start() }) - return this } - public stopAll(): InboxesAgent { + public stopAll(): void { Object.values(this.inboxes).forEach(inbox => { inbox.stop() }) - return this } public hasInbox(label: string): boolean { @@ -198,21 +196,20 @@ export class InboxesAgent { return this.inboxes[label] || null } - public setInbox(label: string, inbox: InboxAgent): InboxesAgent { + public setInbox(label: string, inbox: InboxAgent): void { this.inboxes[label] = inbox this.inboxSubscriptions[label] = inbox.newMessage$.subscribe({ next: message => { this.newMessage$.next({ inbox: label, message }) }, }) - return this } public addInbox( label: string, data: InboxAgentData, start: boolean = this.autoStart, - ): InboxAgent { + ): void { const inbox = new InboxAgent({ sync: this.sync, keyPair: this.keyPair, @@ -222,10 +219,9 @@ export class InboxesAgent { start, }) this.setInbox(label, inbox) - return inbox } - public removeInbox(label: string): InboxesAgent { + public removeInbox(label: string): void { delete this.inboxes[label] const sub = this.inboxSubscriptions[label] @@ -233,17 +229,20 @@ export class InboxesAgent { sub.unsubscribe() delete this.inboxSubscriptions[label] } - return this } - public changeInboxes(mailboxes: MailboxesRecord): InboxesAgent { + public changeInboxes(mailboxes: MailboxesRecord): void { const labels: Array = [] Object.entries(mailboxes).forEach(([label, key]) => { labels.push(label) const inbox = this.inboxes[label] if (inbox == null) { - this.addInbox(label, { writer: key }) + this.addInbox( + label, + { writer: key, interval: this.interval }, + this.autoStart, + ) } else if (!inbox.isWriter(key)) { inbox.setWriter(key) } @@ -254,8 +253,6 @@ export class InboxesAgent { this.removeInbox(label) } }) - - return this } } @@ -294,13 +291,12 @@ export class OutboxesAgent { return this.outboxes[label] || null } - public setOutbox(label: string, keyPair: KeyPair): OutboxesAgent { + public setOutbox(label: string, keyPair: KeyPair): void { this.outboxes[label] = createMailboxWriter({ sync: this.sync, reader: this.reader, keyPair, }) - return this } public addOutbox(label: string): KeyPair { @@ -309,9 +305,8 @@ export class OutboxesAgent { return keyPair } - public removeOutbox(label: string): OutboxesAgent { + public removeOutbox(label: string): void { delete this.outboxes[label] - return this } public async sendMessage( diff --git a/packages/agent/src/types.ts b/packages/agent/src/types.ts new file mode 100644 index 0000000..c4e92cc --- /dev/null +++ b/packages/agent/src/types.ts @@ -0,0 +1,4 @@ +export interface SyncParams { + autoStart?: boolean + interval?: number +} diff --git a/packages/core/package.json b/packages/core/package.json index 387ea09..97d4d9d 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -25,6 +25,6 @@ "get-stream": "^5.1.0" }, "devDependencies": { - "@types/node-fetch": "^2.5.0" + "@types/node-fetch": "^2.5.1" } } diff --git a/tsconfig.build.json b/tsconfig.build.json index 4d6a806..1b2493f 100644 --- a/tsconfig.build.json +++ b/tsconfig.build.json @@ -2,6 +2,7 @@ "compilerOptions": { "allowSyntheticDefaultImports": true, "declaration": true, + "esModuleInterop": true, "lib": ["es2015"], "moduleResolution": "node", "strict": true, diff --git a/yarn.lock b/yarn.lock index b91efe9..ba4a62c 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2,10 +2,10 @@ # yarn lockfile v1 -"@babel/cli@^7.5.5": - version "7.5.5" - resolved "https://registry.yarnpkg.com/@babel/cli/-/cli-7.5.5.tgz#bdb6d9169e93e241a08f5f7b0265195bf38ef5ec" - integrity sha512-UHI+7pHv/tk9g6WXQKYz+kmXTI77YtuY3vqC59KIqcoWEjsJJSG6rAxKaLsgj3LDyadsPrCB929gVOKM6Hui0w== +"@babel/cli@^7.6.0": + version "7.6.0" + resolved "https://registry.yarnpkg.com/@babel/cli/-/cli-7.6.0.tgz#1470a04394eaf37862989ea4912adf440fa6ff8d" + integrity sha512-1CTDyGUjQqW3Mz4gfKZ04KGOckyyaNmKneAMlABPS+ZyuxWv3FrVEVz7Ag08kNIztVx8VaJ8YgvYLSNlMKAT5Q== dependencies: commander "^2.8.1" convert-source-map "^1.1.0" @@ -17,7 +17,7 @@ slash "^2.0.0" source-map "^0.5.0" optionalDependencies: - chokidar "^2.0.4" + chokidar "^2.1.8" "@babel/code-frame@^7.0.0", "@babel/code-frame@^7.5.5": version "7.5.5" @@ -26,7 +26,7 @@ dependencies: "@babel/highlight" "^7.0.0" -"@babel/core@^7.1.0", "@babel/core@^7.5.5": +"@babel/core@^7.1.0": version "7.5.5" resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.5.5.tgz#17b2686ef0d6bc58f963dddd68ab669755582c30" integrity sha512-i4qoSr2KTtce0DmkuuQBV4AuQgGPUcPXMr9L5MyYAtk06z068lQ10a4O009fe5OB/DfNV+h+qqT7ddNV8UnRjg== @@ -46,6 +46,26 @@ semver "^5.4.1" source-map "^0.5.0" +"@babel/core@^7.6.0": + version "7.6.0" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.6.0.tgz#9b00f73554edd67bebc86df8303ef678be3d7b48" + integrity sha512-FuRhDRtsd6IptKpHXAa+4WPZYY2ZzgowkbLBecEDDSje1X/apG7jQM33or3NdOmjXBKWGOg4JmSiRfUfuTtHXw== + dependencies: + "@babel/code-frame" "^7.5.5" + "@babel/generator" "^7.6.0" + "@babel/helpers" "^7.6.0" + "@babel/parser" "^7.6.0" + "@babel/template" "^7.6.0" + "@babel/traverse" "^7.6.0" + "@babel/types" "^7.6.0" + convert-source-map "^1.1.0" + debug "^4.1.0" + 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.5.5": version "7.5.5" resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.5.5.tgz#873a7f936a3c89491b43536d12245b626664e3cf" @@ -57,6 +77,17 @@ source-map "^0.5.0" trim-right "^1.0.1" +"@babel/generator@^7.6.0": + version "7.6.0" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.6.0.tgz#e2c21efbfd3293ad819a2359b448f002bfdfda56" + integrity sha512-Ms8Mo7YBdMMn1BYuNtKuP/z0TgEIhbcyB8HVR6PPNYp4P61lMsABiS4A3VG1qznjXVCf3r+fVHhm4efTYVsySA== + dependencies: + "@babel/types" "^7.6.0" + jsesc "^2.5.1" + lodash "^4.17.13" + source-map "^0.5.0" + trim-right "^1.0.1" + "@babel/helper-annotate-as-pure@^7.0.0": version "7.0.0" resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.0.0.tgz#323d39dd0b50e10c7c06ca7d7638e6864d8c5c32" @@ -93,6 +124,18 @@ "@babel/helper-replace-supers" "^7.5.5" "@babel/helper-split-export-declaration" "^7.4.4" +"@babel/helper-create-class-features-plugin@^7.6.0": + version "7.6.0" + resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.6.0.tgz#769711acca889be371e9bc2eb68641d55218021f" + integrity sha512-O1QWBko4fzGju6VoVvrZg0RROCVifcLxiApnGP3OWfWzvxRZFCoBD81K5ur5e3bVY2Vf/5rIJm8cqPKn8HUJng== + dependencies: + "@babel/helper-function-name" "^7.1.0" + "@babel/helper-member-expression-to-functions" "^7.5.5" + "@babel/helper-optimise-call-expression" "^7.0.0" + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-replace-supers" "^7.5.5" + "@babel/helper-split-export-declaration" "^7.4.4" + "@babel/helper-define-map@^7.5.5": version "7.5.5" resolved "https://registry.yarnpkg.com/@babel/helper-define-map/-/helper-define-map-7.5.5.tgz#3dec32c2046f37e09b28c93eb0b103fd2a25d369" @@ -233,6 +276,15 @@ "@babel/traverse" "^7.5.5" "@babel/types" "^7.5.5" +"@babel/helpers@^7.6.0": + version "7.6.0" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.6.0.tgz#21961d16c6a3c3ab597325c34c465c0887d31c6e" + integrity sha512-W9kao7OBleOjfXtFGgArGRX6eCP0UEcA2ZWEWNkJdRZnHhW4eEbeswbG3EwaRsnQUAEGWYgMq1HsIXuNNNy2eQ== + dependencies: + "@babel/template" "^7.6.0" + "@babel/traverse" "^7.6.0" + "@babel/types" "^7.6.0" + "@babel/highlight@^7.0.0": version "7.5.0" resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.5.0.tgz#56d11312bd9248fa619591d02472be6e8cb32540" @@ -247,6 +299,11 @@ resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.5.5.tgz#02f077ac8817d3df4a832ef59de67565e71cca4b" integrity sha512-E5BN68cqR7dhKan1SfqgPGhQ178bkVKpXTPEXnFJBrEt8/DKRZlybmy+IgYLTeN7tp1R5Ccmbm2rBk17sHYU3g== +"@babel/parser@^7.6.0": + version "7.6.0" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.6.0.tgz#3e05d0647432a8326cb28d0de03895ae5a57f39b" + integrity sha512-+o2q111WEx4srBs7L9eJmcwi655eD8sXniLqMB93TBK9GrNzGrxDWSjiqz2hLU0Ha8MTXFIP0yd9fNdP+m43ZQ== + "@babel/plugin-proposal-async-generator-functions@^7.2.0": version "7.2.0" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.2.0.tgz#b289b306669dce4ad20b0252889a15768c9d417e" @@ -370,10 +427,10 @@ dependencies: "@babel/helper-plugin-utils" "^7.0.0" -"@babel/plugin-transform-block-scoping@^7.5.5": - version "7.5.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.5.5.tgz#a35f395e5402822f10d2119f6f8e045e3639a2ce" - integrity sha512-82A3CLRRdYubkG85lKwhZB0WZoHxLGsJdux/cOVaJCJpvYFl1LVzAIFyRsa7CvXqW8rBM4Zf3Bfn8PHt5DP0Sg== +"@babel/plugin-transform-block-scoping@^7.6.0": + version "7.6.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.6.0.tgz#c49e21228c4bbd4068a35667e6d951c75439b1dc" + integrity sha512-tIt4E23+kw6TgL/edACZwP1OUKrjOTyMrFMLoT5IOFrfMRabCgekjqFd5o6PaAMildBu46oFkekIdMuGkkPEpA== dependencies: "@babel/helper-plugin-utils" "^7.0.0" lodash "^4.17.13" @@ -399,10 +456,10 @@ dependencies: "@babel/helper-plugin-utils" "^7.0.0" -"@babel/plugin-transform-destructuring@^7.5.0": - version "7.5.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.5.0.tgz#f6c09fdfe3f94516ff074fe877db7bc9ef05855a" - integrity sha512-YbYgbd3TryYYLGyC7ZR+Tq8H/+bCmwoaxHfJHupom5ECstzbRLTch6gOQbhEY9Z4hiCNHEURgq06ykFv9JZ/QQ== +"@babel/plugin-transform-destructuring@^7.6.0": + version "7.6.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.6.0.tgz#44bbe08b57f4480094d57d9ffbcd96d309075ba6" + integrity sha512-2bGIS5P1v4+sWTCnKNDZDxbGvEqi0ijeqM/YqHtVGrvG2y0ySgnEEhXErvE9dA0bnIzY9bIzdFK0jFA46ASIIQ== dependencies: "@babel/helper-plugin-utils" "^7.0.0" @@ -468,10 +525,10 @@ "@babel/helper-plugin-utils" "^7.0.0" babel-plugin-dynamic-import-node "^2.3.0" -"@babel/plugin-transform-modules-commonjs@^7.5.0": - version "7.5.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.5.0.tgz#425127e6045231360858eeaa47a71d75eded7a74" - integrity sha512-xmHq0B+ytyrWJvQTc5OWAC4ii6Dhr0s22STOoydokG51JjWhyYo5mRPXoi+ZmtHQhZZwuXNN+GG5jy5UZZJxIQ== +"@babel/plugin-transform-modules-commonjs@^7.6.0": + version "7.6.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.6.0.tgz#39dfe957de4420445f1fcf88b68a2e4aa4515486" + integrity sha512-Ma93Ix95PNSEngqomy5LSBMAQvYKVe3dy+JlVJSHEXZR5ASL9lQBedMiCyVtmTLraIDVRE3ZjTZvmXXD2Ozw3g== dependencies: "@babel/helper-module-transforms" "^7.4.4" "@babel/helper-plugin-utils" "^7.0.0" @@ -495,12 +552,12 @@ "@babel/helper-module-transforms" "^7.1.0" "@babel/helper-plugin-utils" "^7.0.0" -"@babel/plugin-transform-named-capturing-groups-regex@^7.4.5": - version "7.4.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.4.5.tgz#9d269fd28a370258199b4294736813a60bbdd106" - integrity sha512-z7+2IsWafTBbjNsOxU/Iv5CvTJlr5w4+HGu1HovKYTtgJ362f7kBcQglkfmlspKKZ3bgrbSGvLfNx++ZJgCWsg== +"@babel/plugin-transform-named-capturing-groups-regex@^7.6.0": + version "7.6.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.6.0.tgz#1e6e663097813bb4f53d42df0750cf28ad3bb3f1" + integrity sha512-jem7uytlmrRl3iCAuQyw8BpB4c4LWvSpvIeXKpMb+7j84lkx4m4mYr5ErAcmN5KM7B6BqrAvRGjBIbbzqCczew== dependencies: - regexp-tree "^0.1.6" + regexp-tree "^0.1.13" "@babel/plugin-transform-new-target@^7.4.4": version "7.4.4" @@ -547,10 +604,10 @@ dependencies: "@babel/helper-plugin-utils" "^7.0.0" -"@babel/plugin-transform-runtime@^7.5.5": - version "7.5.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.5.5.tgz#a6331afbfc59189d2135b2e09474457a8e3d28bc" - integrity sha512-6Xmeidsun5rkwnGfMOp6/z9nSzWpHFNVr2Jx7kwoq4mVatQfQx5S56drBgEHF+XQbKOdIaOiMIINvp/kAwMN+w== +"@babel/plugin-transform-runtime@^7.6.0": + version "7.6.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.6.0.tgz#85a3cce402b28586138e368fce20ab3019b9713e" + integrity sha512-Da8tMf7uClzwUm/pnJ1S93m/aRXmoYNDD7TkHua8xBDdaAs54uZpTWvEt6NGwmoVMb9mZbntfTqmG2oSzN/7Vg== dependencies: "@babel/helper-module-imports" "^7.0.0" "@babel/helper-plugin-utils" "^7.0.0" @@ -594,12 +651,12 @@ dependencies: "@babel/helper-plugin-utils" "^7.0.0" -"@babel/plugin-transform-typescript@^7.3.2": - version "7.5.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.5.5.tgz#6d862766f09b2da1cb1f7d505fe2aedab6b7d4b8" - integrity sha512-pehKf4m640myZu5B2ZviLaiBlxMCjSZ1qTEO459AXKX5GnPueyulJeCqZFs1nz/Ya2dDzXQ1NxZ/kKNWyD4h6w== +"@babel/plugin-transform-typescript@^7.6.0": + version "7.6.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.6.0.tgz#48d78405f1aa856ebeea7288a48a19ed8da377a6" + integrity sha512-yzw7EopOOr6saONZ3KA3lpizKnWRTe+rfBqg4AmQbSow7ik7fqmzrfIqt053osLwLE2AaTqGinLM2tl6+M/uog== dependencies: - "@babel/helper-create-class-features-plugin" "^7.5.5" + "@babel/helper-create-class-features-plugin" "^7.6.0" "@babel/helper-plugin-utils" "^7.0.0" "@babel/plugin-syntax-typescript" "^7.2.0" @@ -612,10 +669,10 @@ "@babel/helper-regex" "^7.4.4" regexpu-core "^4.5.4" -"@babel/preset-env@^7.5.5": - version "7.5.5" - resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.5.5.tgz#bc470b53acaa48df4b8db24a570d6da1fef53c9a" - integrity sha512-GMZQka/+INwsMz1A5UEql8tG015h5j/qjptpKY2gJ7giy8ohzU710YciJB5rcKsWGWHiW3RUnHib0E5/m3Tp3A== +"@babel/preset-env@^7.6.0": + version "7.6.0" + resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.6.0.tgz#aae4141c506100bb2bfaa4ac2a5c12b395619e50" + integrity sha512-1efzxFv/TcPsNXlRhMzRnkBFMeIqBBgzwmZwlFDw5Ubj0AGLeufxugirwZmkkX/ayi3owsSqoQ4fw8LkfK9SYg== dependencies: "@babel/helper-module-imports" "^7.0.0" "@babel/helper-plugin-utils" "^7.0.0" @@ -633,10 +690,10 @@ "@babel/plugin-transform-arrow-functions" "^7.2.0" "@babel/plugin-transform-async-to-generator" "^7.5.0" "@babel/plugin-transform-block-scoped-functions" "^7.2.0" - "@babel/plugin-transform-block-scoping" "^7.5.5" + "@babel/plugin-transform-block-scoping" "^7.6.0" "@babel/plugin-transform-classes" "^7.5.5" "@babel/plugin-transform-computed-properties" "^7.2.0" - "@babel/plugin-transform-destructuring" "^7.5.0" + "@babel/plugin-transform-destructuring" "^7.6.0" "@babel/plugin-transform-dotall-regex" "^7.4.4" "@babel/plugin-transform-duplicate-keys" "^7.5.0" "@babel/plugin-transform-exponentiation-operator" "^7.2.0" @@ -645,10 +702,10 @@ "@babel/plugin-transform-literals" "^7.2.0" "@babel/plugin-transform-member-expression-literals" "^7.2.0" "@babel/plugin-transform-modules-amd" "^7.5.0" - "@babel/plugin-transform-modules-commonjs" "^7.5.0" + "@babel/plugin-transform-modules-commonjs" "^7.6.0" "@babel/plugin-transform-modules-systemjs" "^7.5.0" "@babel/plugin-transform-modules-umd" "^7.2.0" - "@babel/plugin-transform-named-capturing-groups-regex" "^7.4.5" + "@babel/plugin-transform-named-capturing-groups-regex" "^7.6.0" "@babel/plugin-transform-new-target" "^7.4.4" "@babel/plugin-transform-object-super" "^7.5.5" "@babel/plugin-transform-parameters" "^7.4.4" @@ -661,20 +718,20 @@ "@babel/plugin-transform-template-literals" "^7.4.4" "@babel/plugin-transform-typeof-symbol" "^7.2.0" "@babel/plugin-transform-unicode-regex" "^7.4.4" - "@babel/types" "^7.5.5" + "@babel/types" "^7.6.0" browserslist "^4.6.0" core-js-compat "^3.1.1" invariant "^2.2.2" js-levenshtein "^1.1.3" semver "^5.5.0" -"@babel/preset-typescript@^7.3.3": - version "7.3.3" - resolved "https://registry.yarnpkg.com/@babel/preset-typescript/-/preset-typescript-7.3.3.tgz#88669911053fa16b2b276ea2ede2ca603b3f307a" - integrity sha512-mzMVuIP4lqtn4du2ynEfdO0+RYcslwrZiJHXu4MGaC1ctJiW2fyaeDrtjJGs7R/KebZ1sgowcIoWf4uRpEfKEg== +"@babel/preset-typescript@^7.6.0": + version "7.6.0" + resolved "https://registry.yarnpkg.com/@babel/preset-typescript/-/preset-typescript-7.6.0.tgz#25768cb8830280baf47c45ab1a519a9977498c98" + integrity sha512-4xKw3tTcCm0qApyT6PqM9qniseCE79xGHiUnNdKGdxNsGUc2X7WwZybqIpnTmoukg3nhPceI5KPNzNqLNeIJww== dependencies: "@babel/helper-plugin-utils" "^7.0.0" - "@babel/plugin-transform-typescript" "^7.3.2" + "@babel/plugin-transform-typescript" "^7.6.0" "@babel/runtime@^7.5.5": version "7.5.5" @@ -692,6 +749,15 @@ "@babel/parser" "^7.4.4" "@babel/types" "^7.4.4" +"@babel/template@^7.6.0": + version "7.6.0" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.6.0.tgz#7f0159c7f5012230dad64cca42ec9bdb5c9536e6" + integrity sha512-5AEH2EXD8euCk446b7edmgFdub/qfH1SN6Nii3+fyXP807QRx9Q73A2N5hNwRRslC2H9sNzaFhsPubkS4L8oNQ== + dependencies: + "@babel/code-frame" "^7.0.0" + "@babel/parser" "^7.6.0" + "@babel/types" "^7.6.0" + "@babel/traverse@^7.0.0", "@babel/traverse@^7.1.0", "@babel/traverse@^7.4.3", "@babel/traverse@^7.4.4", "@babel/traverse@^7.5.5": version "7.5.5" resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.5.5.tgz#f664f8f368ed32988cd648da9f72d5ca70f165bb" @@ -707,6 +773,21 @@ globals "^11.1.0" lodash "^4.17.13" +"@babel/traverse@^7.6.0": + version "7.6.0" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.6.0.tgz#389391d510f79be7ce2ddd6717be66d3fed4b516" + integrity sha512-93t52SaOBgml/xY74lsmt7xOR4ufYvhb5c5qiM6lu4J/dWGMAfAh6eKw4PjLes6DI6nQgearoxnFJk60YchpvQ== + dependencies: + "@babel/code-frame" "^7.5.5" + "@babel/generator" "^7.6.0" + "@babel/helper-function-name" "^7.1.0" + "@babel/helper-split-export-declaration" "^7.4.4" + "@babel/parser" "^7.6.0" + "@babel/types" "^7.6.0" + debug "^4.1.0" + globals "^11.1.0" + lodash "^4.17.13" + "@babel/types@^7.0.0", "@babel/types@^7.2.0", "@babel/types@^7.3.0", "@babel/types@^7.4.0", "@babel/types@^7.4.4", "@babel/types@^7.5.5": version "7.5.5" resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.5.5.tgz#97b9f728e182785909aa4ab56264f090a028d18a" @@ -716,6 +797,15 @@ lodash "^4.17.13" to-fast-properties "^2.0.0" +"@babel/types@^7.6.0": + version "7.6.1" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.6.1.tgz#53abf3308add3ac2a2884d539151c57c4b3ac648" + integrity sha512-X7gdiuaCmA0uRjCmRtYJNAVCc/q+5xSgsfKJHqMN4iNLILX39677fJE1O40arPMh0TTtS9ItH67yre6c7k6t0g== + 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" @@ -1691,11 +1781,32 @@ call-me-maybe "^1.0.1" glob-to-regexp "^0.3.0" +"@nodelib/fs.scandir@2.1.2": + version "2.1.2" + resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.2.tgz#1f981cd5b83e85cfdeb386fc693d4baab392fa54" + integrity sha512-wrIBsjA5pl13f0RN4Zx4FNWmU71lv03meGKnqRUoCyan17s4V3WL92f3w3AIuWbNnpcrQyFBU5qMavJoB8d27w== + dependencies: + "@nodelib/fs.stat" "2.0.2" + run-parallel "^1.1.9" + +"@nodelib/fs.stat@2.0.2", "@nodelib/fs.stat@^2.0.1": + version "2.0.2" + resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-2.0.2.tgz#2762aea8fe78ea256860182dcb52d61ee4b8fda6" + integrity sha512-z8+wGWV2dgUhLqrtRYa03yDx4HWMvXKi1z8g3m2JyxAx8F7xk74asqPk5LAETjqDSGLFML/6CDl0+yFunSYicw== + "@nodelib/fs.stat@^1.1.2": version "1.1.3" resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-1.1.3.tgz#2b5a3ab3f918cca48a8c754c08168e3f03eba61b" integrity sha512-shAmDyaQC4H92APFoIaVDHCx5bStIocgvbwQyxPRrbUY20V1EYTbSDchWbuwlMG3V17cprZhA6+78JfB+3DTPw== +"@nodelib/fs.walk@^1.2.1": + version "1.2.3" + resolved "https://registry.yarnpkg.com/@nodelib/fs.walk/-/fs.walk-1.2.3.tgz#a555dc256acaf00c62b0db29529028dd4d4cb141" + integrity sha512-l6t8xEhfK9Sa4YO5mIRdau7XSOADfmh3jCr0evNHdY+HNkW6xuQhgMH7D73VV6WpZOagrW0UludvMTiifiwTfA== + dependencies: + "@nodelib/fs.scandir" "2.1.2" + fastq "^1.6.0" + "@octokit/endpoint@^5.1.0": version "5.3.5" resolved "https://registry.yarnpkg.com/@octokit/endpoint/-/endpoint-5.3.5.tgz#2822c3b01107806dbdce3863b6205e3eff4289ed" @@ -1856,10 +1967,10 @@ resolved "https://registry.yarnpkg.com/@types/minimatch/-/minimatch-3.0.3.tgz#3dca0e3f33b200fc7d1139c0cd96c1268cadfd9d" integrity sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA== -"@types/node-fetch@^2.5.0": - version "2.5.0" - resolved "https://registry.yarnpkg.com/@types/node-fetch/-/node-fetch-2.5.0.tgz#1c55616a4591bdd15a389fbd0da4a55b9502add5" - integrity sha512-TLFRywthBgL68auWj+ziWu+vnmmcHCDFC/sqCOQf1xTz4hRq8cu79z8CtHU9lncExGBsB8fXA4TiLDLt6xvMzw== +"@types/node-fetch@^2.5.1": + version "2.5.1" + resolved "https://registry.yarnpkg.com/@types/node-fetch/-/node-fetch-2.5.1.tgz#9e4daffa983eb098d25c2cb410c949678f3aee78" + integrity sha512-nYsC20tHanaNa4coFvCDcuIvtdvu8YkQz0XQOoBHL1X1y1QxeNe73dg1PaLGqsJNWiVwK0bjn5Jf+ZQpE6acJg== dependencies: "@types/node" "*" @@ -1885,7 +1996,7 @@ dependencies: "@types/yargs-parser" "*" -"@typescript-eslint/eslint-plugin@^2.0.0", "@typescript-eslint/eslint-plugin@^2.1.0": +"@typescript-eslint/eslint-plugin@^2.0.0": version "2.1.0" resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-2.1.0.tgz#4bcd978d88419ea971613675f2620dde39920d69" integrity sha512-3i/dLPwxaVfCsaLu3HkB8CAA1Uw3McAegrTs+VBJ0BrGRKW7nUwSqRfHfCS7sw7zSbf62q3v0v6pOS8MyaYItg== @@ -1896,6 +2007,17 @@ regexpp "^2.0.1" tsutils "^3.14.0" +"@typescript-eslint/eslint-plugin@^2.3.0": + version "2.3.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-2.3.0.tgz#6ead12c6b15a9b930430931e396e01a1fe181fcc" + integrity sha512-QgO/qmNye+rKsU7dan6pkBTSfpbyrHJidsw9bR3gZCrQNTB9eWQ5+UDkrrev/fu9xg6Qh7ebbx03IVuGnGRmEw== + dependencies: + "@typescript-eslint/experimental-utils" "2.3.0" + eslint-utils "^1.4.2" + functional-red-black-tree "^1.0.1" + regexpp "^2.0.1" + tsutils "^3.17.1" + "@typescript-eslint/experimental-utils@2.1.0": version "2.1.0" resolved "https://registry.yarnpkg.com/@typescript-eslint/experimental-utils/-/experimental-utils-2.1.0.tgz#0837229f0e75a32db0db9bf662ad0eface914453" @@ -1905,6 +2027,15 @@ "@typescript-eslint/typescript-estree" "2.1.0" eslint-scope "^4.0.0" +"@typescript-eslint/experimental-utils@2.3.0": + version "2.3.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/experimental-utils/-/experimental-utils-2.3.0.tgz#19a8e1b8fcee7d7469f3b44691d91830568de140" + integrity sha512-ry+fgd0Hh33LyzS30bIhX/a1HJpvtnecjQjWxxsZTavrRa1ymdmX7tz+7lPrPAxB018jnNzwNtog6s3OhxPTAg== + dependencies: + "@types/json-schema" "^7.0.3" + "@typescript-eslint/typescript-estree" "2.3.0" + eslint-scope "^5.0.0" + "@typescript-eslint/experimental-utils@^1.13.0": version "1.13.0" resolved "https://registry.yarnpkg.com/@typescript-eslint/experimental-utils/-/experimental-utils-1.13.0.tgz#b08c60d780c0067de2fb44b04b432f540138301e" @@ -1914,7 +2045,7 @@ "@typescript-eslint/typescript-estree" "1.13.0" eslint-scope "^4.0.0" -"@typescript-eslint/parser@^2.0.0", "@typescript-eslint/parser@^2.1.0": +"@typescript-eslint/parser@^2.0.0": version "2.1.0" resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-2.1.0.tgz#ca62b26fa6a5a34ecdec4a000f22baf103791830" integrity sha512-0+hzirRJoqE1T4lSSvCfKD+kWjIpDWfbGBiisK5CENcr+22pPkHB2sfV1giON+UxHV4A08SSrQonZk7X2zIQdw== @@ -1924,6 +2055,16 @@ "@typescript-eslint/typescript-estree" "2.1.0" eslint-visitor-keys "^1.0.0" +"@typescript-eslint/parser@^2.3.0": + version "2.3.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-2.3.0.tgz#d2df1d4bb8827e36125fb7c6274df1b4d4e614f0" + integrity sha512-Dc+LAtHts0yDuusxG0NVjGvrpPy2kZauxqPbfFs0fmcMB4JhNs+WwIDMFGWeKjbGoPt/SIUC9XJ7E0ZD/f8InQ== + dependencies: + "@types/eslint-visitor-keys" "^1.0.0" + "@typescript-eslint/experimental-utils" "2.3.0" + "@typescript-eslint/typescript-estree" "2.3.0" + eslint-visitor-keys "^1.1.0" + "@typescript-eslint/typescript-estree@1.13.0": version "1.13.0" resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-1.13.0.tgz#8140f17d0f60c03619798f1d628b8434913dc32e" @@ -1942,6 +2083,16 @@ lodash.unescape "4.0.1" semver "^6.2.0" +"@typescript-eslint/typescript-estree@2.3.0": + version "2.3.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-2.3.0.tgz#fd8faff7e4c73795c65e5817c52f9038e33ef29d" + integrity sha512-WBxfwsTeCOsmQ7cLjow7lgysviBKUW34npShu7dxJYUQCbSG5nfZWZTgmQPKEc+3flpbSM7tjXjQOgETYp+njQ== + dependencies: + glob "^7.1.4" + is-glob "^4.0.1" + lodash.unescape "4.0.1" + semver "^6.3.0" + "@zkochan/cmd-shim@^3.1.0": version "3.1.0" resolved "https://registry.yarnpkg.com/@zkochan/cmd-shim/-/cmd-shim-3.1.0.tgz#2ab8ed81f5bb5452a85f25758eb9b8681982fd2e" @@ -2023,6 +2174,14 @@ agentkeepalive@^3.4.1: dependencies: humanize-ms "^1.2.1" +aggregate-error@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/aggregate-error/-/aggregate-error-3.0.0.tgz#5b5a3c95e9095f311c9ab16c19fb4f3527cd3f79" + integrity sha512-yKD9kEoJIR+2IFqhMwayIBgheLYbB3PS2OBhWae1L/ODTd/JF/30cW0bc9TqzRL3k4U41Dieu3BF4I29p8xesA== + dependencies: + clean-stack "^2.0.0" + indent-string "^3.2.0" + ajv@^6.10.0, ajv@^6.10.2, ajv@^6.5.5: version "6.10.2" resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.10.2.tgz#d3cea04d6b017b2894ad69040fec8b623eb4bd52" @@ -2141,13 +2300,18 @@ array-includes@^3.0.3: define-properties "^1.1.2" es-abstract "^1.7.0" -array-union@^1.0.1, array-union@^1.0.2: +array-union@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/array-union/-/array-union-1.0.2.tgz#9a34410e4f4e3da23dea375be5be70f24778ec39" integrity sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk= dependencies: array-uniq "^1.0.1" +array-union@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/array-union/-/array-union-2.1.0.tgz#b798420adbeb1de828d84acd8a2e23d3efe85e8d" + integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw== + array-uniq@^1.0.1: version "1.0.3" resolved "https://registry.yarnpkg.com/array-uniq/-/array-uniq-1.0.3.tgz#af6ac877a25cc7f74e058894753858dfdb24fdb6" @@ -2358,6 +2522,13 @@ braces@^2.3.1, braces@^2.3.2: split-string "^3.0.2" to-regex "^3.0.1" +braces@^3.0.1: + version "3.0.2" + resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" + integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== + dependencies: + fill-range "^7.0.1" + brorand@^1.0.1: version "1.1.0" resolved "https://registry.yarnpkg.com/brorand/-/brorand-1.1.0.tgz#12c25efe40a45e3c323eb8675a0a0ce57b22371f" @@ -2556,7 +2727,7 @@ chardet@^0.7.0: resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.7.0.tgz#90094849f0937f2eedc2425d0d28a9e5f0cbad9e" integrity sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA== -chokidar@^2.0.4: +chokidar@^2.1.8: version "2.1.8" resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-2.1.8.tgz#804b3a7b6a99358c3c5c61e71d8728f041cff917" integrity sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg== @@ -2595,6 +2766,11 @@ class-utils@^0.3.5: isobject "^3.0.0" static-extend "^0.1.1" +clean-stack@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/clean-stack/-/clean-stack-2.2.0.tgz#ee8472dbb129e727b31e8a10a427dee9dfe4008b" + integrity sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A== + cli-cursor@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-2.1.0.tgz#b35dac376479facc3e94747d41d0d0f5238ffcb5" @@ -3046,26 +3222,27 @@ define-property@^2.0.2: is-descriptor "^1.0.2" isobject "^3.0.1" -del-cli@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/del-cli/-/del-cli-2.0.0.tgz#e9a778398863c26796d85409b9891f98b0122cd1" - integrity sha512-IREsO6mjSTxxvWLKMMUi1G0izhqEBx7qeDkOJ6H3+TJl8gQl6x5C5hK4Sm1GJ51KodUMR6O7HuIhnF24Edua3g== +del-cli@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/del-cli/-/del-cli-3.0.0.tgz#327a15d4c18d6b7e5c849a53ef0d17901bc28197" + integrity sha512-J4HDC2mpcN5aopya4VdkyiFXZaqAoo7ua9VpKbciX3DDUSbtJbPMc3ivggJsAAgS6EqonmbenIiMhBGtJPW9FA== dependencies: - del "^4.1.1" + del "^5.1.0" meow "^5.0.0" -del@^4.1.1: - version "4.1.1" - resolved "https://registry.yarnpkg.com/del/-/del-4.1.1.tgz#9e8f117222ea44a31ff3a156c049b99052a9f0b4" - integrity sha512-QwGuEUouP2kVwQenAsOof5Fv8K9t3D8Ca8NxcXKrIpEHjTXK5J2nXLdP+ALI1cgv8wj7KuwBhTwBkOZSJKM5XQ== +del@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/del/-/del-5.1.0.tgz#d9487c94e367410e6eff2925ee58c0c84a75b3a7" + integrity sha512-wH9xOVHnczo9jN2IW68BabcecVPxacIA3g/7z6vhSU/4stOKQzeCRK0yD0A24WiAAUJmmVpWqrERcTxnLo3AnA== dependencies: - "@types/glob" "^7.1.1" - globby "^6.1.0" - is-path-cwd "^2.0.0" - is-path-in-cwd "^2.0.0" - p-map "^2.0.0" - pify "^4.0.1" - rimraf "^2.6.3" + globby "^10.0.1" + graceful-fs "^4.2.2" + is-glob "^4.0.1" + is-path-cwd "^2.2.0" + is-path-inside "^3.0.1" + p-map "^3.0.0" + rimraf "^3.0.0" + slash "^3.0.0" delayed-stream@~1.0.0: version "1.0.0" @@ -3117,6 +3294,13 @@ dir-glob@^2.2.2: dependencies: path-type "^3.0.0" +dir-glob@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-3.0.1.tgz#56dbf73d992a4a93ba1584f4534063fd2e41717f" + integrity sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA== + dependencies: + path-type "^4.0.0" + doctrine@1.5.0: version "1.5.0" resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-1.5.0.tgz#379dce730f6166f76cefa4e6707a159b02c5a6fa" @@ -3188,7 +3372,7 @@ electron-to-chromium@^1.3.247: resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.252.tgz#5b6261965b564a0f4df0f1c86246487897017f52" integrity sha512-NWJ5TztDnjExFISZHFwpoJjMbLUifsNBnx7u2JI0gCw6SbKyQYYWWtBHasO/jPtHym69F4EZuTpRNGN11MT/jg== -"elliptic@github:MainframeHQ/elliptic#circular-dependencies-fix": +elliptic@MainframeHQ/elliptic#circular-dependencies-fix: version "6.4.1" resolved "https://codeload.github.com/MainframeHQ/elliptic/tar.gz/11299b673d219dc67eb1d9c22e3006ffdea6fd42" dependencies: @@ -3448,10 +3632,10 @@ eslint-visitor-keys@^1.0.0, eslint-visitor-keys@^1.1.0: resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-1.1.0.tgz#e2a82cea84ff246ad6fb57f9bde5b46621459ec2" integrity sha512-8y9YjtM1JBJU/A9Kc+SbaOV4y29sSWckBwMHa+FGtVj5gN/sbnKDf6xJUl+8g7FAij9LVaP8C24DUiH/f/2Z9A== -eslint@^6.3.0: - version "6.3.0" - resolved "https://registry.yarnpkg.com/eslint/-/eslint-6.3.0.tgz#1f1a902f67bfd4c354e7288b81e40654d927eb6a" - integrity sha512-ZvZTKaqDue+N8Y9g0kp6UPZtS4FSY3qARxBs7p4f0H0iof381XHduqVerFWtK8DPtKmemqbqCFENWSQgPR/Gow== +eslint@^6.4.0: + version "6.4.0" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-6.4.0.tgz#5aa9227c3fbe921982b2eda94ba0d7fae858611a" + integrity sha512-WTVEzK3lSFoXUovDHEbkJqCVPEPwbhCq4trDktNI6ygs7aO41d4cDT0JFAT5MivzZeVLWlg7vHL+bgrQv/t3vA== dependencies: "@babel/code-frame" "^7.0.0" ajv "^6.10.0" @@ -3681,6 +3865,18 @@ fast-glob@^2.2.6: merge2 "^1.2.3" micromatch "^3.1.10" +fast-glob@^3.0.3: + version "3.0.4" + resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.0.4.tgz#d484a41005cb6faeb399b951fd1bd70ddaebb602" + integrity sha512-wkIbV6qg37xTJwqSsdnIphL1e+LaGz4AIQqr00mIubMaEhv1/HEmJ0uuCGZRNRUkZZmOB5mJKO0ZUTVq+SxMQg== + dependencies: + "@nodelib/fs.stat" "^2.0.1" + "@nodelib/fs.walk" "^1.2.1" + glob-parent "^5.0.0" + is-glob "^4.0.1" + merge2 "^1.2.3" + micromatch "^4.0.2" + fast-json-stable-stringify@2.x, fast-json-stable-stringify@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz#d5142c0caee6b1189f87d3a76111064f86c8bbf2" @@ -3691,6 +3887,13 @@ fast-levenshtein@~2.0.4: resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" integrity sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc= +fastq@^1.6.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.6.0.tgz#4ec8a38f4ac25f21492673adb7eae9cfef47d1c2" + integrity sha512-jmxqQ3Z/nXoeyDmWAzF9kH1aGZSis6e/SbfPmJpUnyZ0ogr6iscHQaml4wsEepEWSdtmpy+eVXmCRIMpxaXqOA== + dependencies: + reusify "^1.0.0" + fb-watchman@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/fb-watchman/-/fb-watchman-2.0.0.tgz#54e9abf7dfa2f26cd9b1636c588c1afc05de5d58" @@ -3727,6 +3930,13 @@ fill-range@^4.0.0: repeat-string "^1.6.1" to-regex-range "^2.1.0" +fill-range@^7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40" + integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== + dependencies: + to-regex-range "^5.0.1" + find-up@^1.0.0: version "1.1.2" resolved "https://registry.yarnpkg.com/find-up/-/find-up-1.1.2.tgz#6b2e9822b1a2ce0a60ab64d610eccad53cb24d0f" @@ -4048,16 +4258,19 @@ globals@^11.1.0, globals@^11.7.0: resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e" integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== -globby@^6.1.0: - version "6.1.0" - resolved "https://registry.yarnpkg.com/globby/-/globby-6.1.0.tgz#f5a6d70e8395e21c858fb0489d64df02424d506c" - integrity sha1-9abXDoOV4hyFj7BInWTfAkJNUGw= +globby@^10.0.1: + version "10.0.1" + resolved "https://registry.yarnpkg.com/globby/-/globby-10.0.1.tgz#4782c34cb75dd683351335c5829cc3420e606b22" + integrity sha512-sSs4inE1FB2YQiymcmTv6NWENryABjUNPeWhOvmn4SjtKybglsyPZxFB3U1/+L1bYi0rNZDqCLlHyLYDl1Pq5A== dependencies: - array-union "^1.0.1" - glob "^7.0.3" - object-assign "^4.0.1" - pify "^2.0.0" - pinkie-promise "^2.0.0" + "@types/glob" "^7.1.1" + array-union "^2.1.0" + dir-glob "^3.0.1" + fast-glob "^3.0.3" + glob "^7.1.3" + ignore "^5.1.1" + merge2 "^1.2.3" + slash "^3.0.0" globby@^9.2.0: version "9.2.0" @@ -4073,7 +4286,7 @@ globby@^9.2.0: pify "^4.0.1" slash "^2.0.0" -graceful-fs@^4.1.11, graceful-fs@^4.1.15, graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.0: +graceful-fs@^4.1.11, graceful-fs@^4.1.15, graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.2: version "4.2.2" resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.2.tgz#6f0952605d0140c1cfdb138ed005775b92d67b02" integrity sha512-IItsdsea19BoLC7ELy13q1iJFNmd7ofZH5+X/pJr90/nRoPEX0DJo1dHDbgtYWOhJhcCgMDTOw84RZ72q6lB+Q== @@ -4250,6 +4463,11 @@ ignore@^4.0.3, ignore@^4.0.6: resolved "https://registry.yarnpkg.com/ignore/-/ignore-4.0.6.tgz#750e3db5862087b4737ebac8207ffd1ef27b25fc" integrity sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg== +ignore@^5.1.1: + version "5.1.4" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.1.4.tgz#84b7b3dbe64552b6ef0eca99f6743dbec6d97adf" + integrity sha512-MzbUSahkTW1u7JpKKjY7LCARd1fU5W2rLdxlM4kdkayuCwZImjkpluF9CM1aLewYJguPDqewLam18Y6AU69A8A== + import-fresh@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-2.0.0.tgz#d81355c15612d386c61f9ddd3922d4304822a546" @@ -4291,7 +4509,7 @@ indent-string@^2.1.0: dependencies: repeating "^2.0.0" -indent-string@^3.0.0: +indent-string@^3.0.0, indent-string@^3.2.0: version "3.2.0" resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-3.2.0.tgz#4a5fd6d27cc332f37e5419a504dbb837105c9289" integrity sha1-Sl/W0nzDMvN+VBmlBNu4NxBckok= @@ -4521,29 +4739,25 @@ is-number@^3.0.0: dependencies: kind-of "^3.0.2" +is-number@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" + integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== + is-obj@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-1.0.1.tgz#3e4729ac1f5fde025cd7d83a896dab9f4f67db0f" integrity sha1-PkcprB9f3gJc19g6iW2rn09n2w8= -is-path-cwd@^2.0.0: +is-path-cwd@^2.2.0: version "2.2.0" resolved "https://registry.yarnpkg.com/is-path-cwd/-/is-path-cwd-2.2.0.tgz#67d43b82664a7b5191fd9119127eb300048a9fdb" integrity sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ== -is-path-in-cwd@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/is-path-in-cwd/-/is-path-in-cwd-2.1.0.tgz#bfe2dca26c69f397265a4009963602935a053acb" - integrity sha512-rNocXHgipO+rvnP6dk3zI20RpOtrAM/kzbB258Uw5BWr3TpXi861yzjo16Dn4hUox07iw5AyeMLHWsujkjzvRQ== - dependencies: - is-path-inside "^2.1.0" - -is-path-inside@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-2.1.0.tgz#7c9810587d659a40d27bcdb4d5616eab059494b2" - integrity sha512-wiyhTzfDWsvwAW53OBWF5zuvaOGlZ6PwYxAbPVDhpm+gM09xKQGjBq/8uYN12aDvMxnAnq3dxTyoSoRNmg5YFg== - dependencies: - path-is-inside "^1.0.2" +is-path-inside@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-3.0.1.tgz#7417049ed551d053ab82bba3fdd6baa6b3a81e89" + integrity sha512-CKstxrctq1kUesU6WhtZDbYKzzYBuRH0UYInAVrkc/EYdB9ltbfE0gOoayG9nhohG6447sOOVGhHqsdmBvkbNg== is-plain-obj@^1.0.0, is-plain-obj@^1.1.0: version "1.1.0" @@ -5357,6 +5571,11 @@ lodash.ismatch@^4.4.0: resolved "https://registry.yarnpkg.com/lodash.ismatch/-/lodash.ismatch-4.4.0.tgz#756cb5150ca3ba6f11085a78849645f188f85f37" integrity sha1-dWy1FQyjum8RCFp4hJZF8Yj4Xzc= +lodash.memoize@4.x: + version "4.1.2" + resolved "https://registry.yarnpkg.com/lodash.memoize/-/lodash.memoize-4.1.2.tgz#bcc6c49a42a2840ed997f323eada5ecd182e0bfe" + integrity sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4= + lodash.set@^4.3.2: version "4.3.2" resolved "https://registry.yarnpkg.com/lodash.set/-/lodash.set-4.3.2.tgz#d8757b1da807dde24816b0d6a84bea1a76230b23" @@ -5581,6 +5800,14 @@ micromatch@^3.1.10, micromatch@^3.1.4: snapdragon "^0.8.1" to-regex "^3.0.2" +micromatch@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.2.tgz#4fcb0999bf9fbc2fcbdd212f6d629b9a56c39259" + integrity sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q== + dependencies: + braces "^3.0.1" + picomatch "^2.0.5" + mime-db@1.40.0: version "1.40.0" resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.40.0.tgz#a65057e998db090f732a68f6c276d387d4126c32" @@ -6226,11 +6453,18 @@ p-map-series@^1.0.0: dependencies: p-reduce "^1.0.0" -p-map@^2.0.0, p-map@^2.1.0: +p-map@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/p-map/-/p-map-2.1.0.tgz#310928feef9c9ecc65b68b17693018a665cea175" integrity sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw== +p-map@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/p-map/-/p-map-3.0.0.tgz#d704d9af8a2ba684e2600d9a215983d4141a979d" + integrity sha512-d3qXVTF/s+W+CdJ5A29wywV2n8CQQYahlgz2bFiA+4eVNJbHJodPZ+/gXwPGh0bOqA+j8S+6+ckmvLGPk1QpxQ== + dependencies: + aggregate-error "^3.0.0" + p-pipe@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/p-pipe/-/p-pipe-1.2.0.tgz#4b1a11399a11520a67790ee5a0c1d5881d6befe9" @@ -6371,11 +6605,6 @@ path-is-absolute@^1.0.0: resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18= -path-is-inside@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/path-is-inside/-/path-is-inside-1.0.2.tgz#365417dede44430d1c11af61027facf074bdfc53" - integrity sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM= - path-key@^2.0.0, path-key@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40" @@ -6409,11 +6638,21 @@ path-type@^3.0.0: dependencies: pify "^3.0.0" +path-type@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b" + integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== + performance-now@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b" integrity sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns= +picomatch@^2.0.5: + version "2.0.7" + resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.0.7.tgz#514169d8c7cd0bdbeecc8a2609e34a7163de69f6" + integrity sha512-oLHIdio3tZ0qH76NybpeneBhYVj0QFTfXEFTc/B3zKQspYfYYkWYgFsmzo+4kvId/bQRcNkVeguI3y+CD22BtA== + pify@^2.0.0, pify@^2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" @@ -6835,7 +7074,7 @@ regex-not@^1.0.0, regex-not@^1.0.2: extend-shallow "^3.0.2" safe-regex "^1.1.0" -regexp-tree@^0.1.6: +regexp-tree@^0.1.13: version "0.1.13" resolved "https://registry.yarnpkg.com/regexp-tree/-/regexp-tree-0.1.13.tgz#5b19ab9377edc68bc3679256840bb29afc158d7f" integrity sha512-hwdV/GQY5F8ReLZWO+W1SRoN5YfpOKY6852+tBFcma72DKBIcHjPRIlIvQN35bCOljuAfP2G2iB0FC/w236mUw== @@ -7005,6 +7244,11 @@ retry@^0.10.0: resolved "https://registry.yarnpkg.com/retry/-/retry-0.10.1.tgz#e76388d217992c252750241d3d3956fed98d8ff4" integrity sha1-52OI0heZLCUnUCQdPTlW/tmNj/Q= +reusify@^1.0.0: + version "1.0.4" + resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76" + integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== + rimraf@2, rimraf@^2.5.4, rimraf@^2.6.1, rimraf@^2.6.2, rimraf@^2.6.3: version "2.7.1" resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.7.1.tgz#35797f13a7fdadc566142c29d4f07ccad483e3ec" @@ -7019,6 +7263,13 @@ rimraf@2.6.3: dependencies: glob "^7.1.3" +rimraf@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.0.tgz#614176d4b3010b75e5c390eb0ee96f6dc0cebb9b" + integrity sha512-NDGVxTsjqfunkds7CqsOiEnxln4Bo7Nddl3XhS4pXg5OzwkLqJ971ZVAAnB+DDLnF76N+VnDEiBHaVV8I06SUg== + dependencies: + glob "^7.1.3" + rsvp@^4.8.4: version "4.8.5" resolved "https://registry.yarnpkg.com/rsvp/-/rsvp-4.8.5.tgz#c8f155311d167f68f21e168df71ec5b083113734" @@ -7031,6 +7282,11 @@ run-async@^2.2.0: dependencies: is-promise "^2.1.0" +run-parallel@^1.1.9: + version "1.1.9" + resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.1.9.tgz#c9dd3a7cf9f4b2c4b6244e173a6ed866e61dd679" + integrity sha512-DEqnSRTDw/Tc3FXf49zedI638Z9onwUotBMiUFKmrO2sdFKIbXamXGQ3Axd4qgphxKB4kw/qP1w5kTxnfU1B9Q== + run-queue@^1.0.0, run-queue@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/run-queue/-/run-queue-1.0.3.tgz#e848396f057d223f24386924618e25694161ec47" @@ -7159,6 +7415,11 @@ slash@^2.0.0: resolved "https://registry.yarnpkg.com/slash/-/slash-2.0.0.tgz#de552851a1759df3a8f206535442f5ec4ddeab44" integrity sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A== +slash@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" + integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== + slice-ansi@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-2.1.0.tgz#cacd7693461a637a5788d92a7dd4fba068e81636" @@ -7674,6 +7935,13 @@ to-regex-range@^2.1.0: is-number "^3.0.0" repeat-string "^1.6.1" +to-regex-range@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" + integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== + dependencies: + is-number "^7.0.0" + to-regex@^3.0.1, to-regex@^3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/to-regex/-/to-regex-3.0.2.tgz#13cfdd9b336552f30b51f33a8ae1b42a7a7599ce" @@ -7727,15 +7995,16 @@ trim-right@^1.0.1: resolved "https://registry.yarnpkg.com/trim-right/-/trim-right-1.0.1.tgz#cb2e1203067e0c8de1f614094b9fe45704ea6003" integrity sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM= -ts-jest@^24.0.2: - version "24.0.2" - resolved "https://registry.yarnpkg.com/ts-jest/-/ts-jest-24.0.2.tgz#8dde6cece97c31c03e80e474c749753ffd27194d" - integrity sha512-h6ZCZiA1EQgjczxq+uGLXQlNgeg02WWJBbeT8j6nyIBRQdglqbvzDoHahTEIiS6Eor6x8mK6PfZ7brQ9Q6tzHw== +ts-jest@^24.1.0: + version "24.1.0" + resolved "https://registry.yarnpkg.com/ts-jest/-/ts-jest-24.1.0.tgz#2eaa813271a2987b7e6c3fefbda196301c131734" + integrity sha512-HEGfrIEAZKfu1pkaxB9au17b1d9b56YZSqz5eCVE8mX68+5reOvlM93xGOzzCREIov9mdH7JBG+s0UyNAqr0tQ== dependencies: bs-logger "0.x" buffer-from "1.x" fast-json-stable-stringify "2.x" json5 "2.x" + lodash.memoize "4.x" make-error "1.x" mkdirp "0.x" resolve "1.x" @@ -7747,7 +8016,7 @@ tslib@^1.8.1, tslib@^1.9.0: resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.10.0.tgz#c3c19f95973fb0a62973fb09d90d961ee43e5c8a" integrity sha512-qOebF53frne81cf0S9B41ByenJ3/IuH8yJKngAX35CmiZySA0khhkovshKK+jGCaMnVomla7gVlIcc3EvKPbTQ== -tsutils@^3.14.0: +tsutils@^3.14.0, tsutils@^3.17.1: version "3.17.1" resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-3.17.1.tgz#ed719917f11ca0dee586272b2ac49e015a2dd759" integrity sha512-kzeQ5B8H3w60nFY2g8cJIuH7JDpsALXySGtwGJ0p2LSjLgay3NdIpqq5SoOBe46bKDW2iq25irHCr8wjomUS2g== @@ -7783,10 +8052,10 @@ typedarray@^0.0.6: resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" integrity sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c= -typescript@^3.6.2: - version "3.6.2" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-3.6.2.tgz#105b0f1934119dde543ac8eb71af3a91009efe54" - integrity sha512-lmQ4L+J6mnu3xweP8+rOrUwzmN+MRAj7TgtJtDaXE5PMyX2kCrklhg3rvOsOIfNeAWMQWO2F1GPc1kMD2vLAfw== +typescript@^3.6.3: + version "3.6.3" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-3.6.3.tgz#fea942fabb20f7e1ca7164ff626f1a9f3f70b4da" + integrity sha512-N7bceJL1CtRQ2RiG0AQME13ksR7DiuQh/QehubYcghzv20tnh+MQnQIuJddTmsbqYj+dztchykemz0zFzlvdQw== uglify-js@^3.1.4: version "3.6.0"