From 9f4ce35edc1f1a2873effe5d176a42ac7af511b6 Mon Sep 17 00:00:00 2001 From: Einhornimmond Date: Fri, 1 Sep 2023 09:41:56 +0200 Subject: [PATCH 1/9] add first draft of protobuf entities --- dlt-connector/src/graphql/enum/AddressType.ts | 8 +++ .../src/graphql/enum/CrossGroupType.ts | 7 +++ .../src/proto/GradidoConfirmedTransaction.ts | 0 dlt-connector/src/proto/GradidoCreation.ts | 16 +++++ .../src/proto/GradidoDeferredTransfer.ts | 31 ++++++++++ dlt-connector/src/proto/GradidoTransaction.ts | 21 +++++++ dlt-connector/src/proto/GradidoTransfer.ts | 13 ++++ dlt-connector/src/proto/GroupFriendsUpdate.ts | 15 +++++ dlt-connector/src/proto/RegisterAddress.ts | 19 ++++++ dlt-connector/src/proto/SignatureMap.ts | 10 +++ dlt-connector/src/proto/SignaturePair.ts | 11 ++++ dlt-connector/src/proto/Timestamp.ts | 13 ++++ dlt-connector/src/proto/TimestampSeconds.ts | 9 +++ .../src/proto/TransactionBody.test.ts | 10 +-- dlt-connector/src/proto/TransactionBody.ts | 62 ++++++++++++++++--- dlt-connector/src/proto/TransferAmount.ts | 16 +++++ 16 files changed, 247 insertions(+), 14 deletions(-) create mode 100644 dlt-connector/src/graphql/enum/AddressType.ts create mode 100644 dlt-connector/src/graphql/enum/CrossGroupType.ts create mode 100644 dlt-connector/src/proto/GradidoConfirmedTransaction.ts create mode 100644 dlt-connector/src/proto/GradidoCreation.ts create mode 100644 dlt-connector/src/proto/GradidoDeferredTransfer.ts create mode 100644 dlt-connector/src/proto/GradidoTransaction.ts create mode 100644 dlt-connector/src/proto/GradidoTransfer.ts create mode 100644 dlt-connector/src/proto/GroupFriendsUpdate.ts create mode 100644 dlt-connector/src/proto/RegisterAddress.ts create mode 100644 dlt-connector/src/proto/SignatureMap.ts create mode 100644 dlt-connector/src/proto/SignaturePair.ts create mode 100644 dlt-connector/src/proto/Timestamp.ts create mode 100644 dlt-connector/src/proto/TimestampSeconds.ts create mode 100644 dlt-connector/src/proto/TransferAmount.ts diff --git a/dlt-connector/src/graphql/enum/AddressType.ts b/dlt-connector/src/graphql/enum/AddressType.ts new file mode 100644 index 000000000..d75ad9988 --- /dev/null +++ b/dlt-connector/src/graphql/enum/AddressType.ts @@ -0,0 +1,8 @@ +export enum AddressType { + NONE = 0, // if no address was found + HUMAN = 1, + PROJECT = 2, // no creations allowed + SUBACCOUNT = 3, // no creations allowed + CRYPTO_ACCOUNT = 4, // user control his keys, no creations + COMMUNITY_ACCOUNT = 5, // community control keys, creations allowed +} diff --git a/dlt-connector/src/graphql/enum/CrossGroupType.ts b/dlt-connector/src/graphql/enum/CrossGroupType.ts new file mode 100644 index 000000000..921ae4eed --- /dev/null +++ b/dlt-connector/src/graphql/enum/CrossGroupType.ts @@ -0,0 +1,7 @@ +export enum CrossGroupType { + LOCAL = 0, + INBOUND = 1, + OUTBOUND = 2, + // for cross group transaction which haven't a direction like group friend update + CROSS = 3, +} diff --git a/dlt-connector/src/proto/GradidoConfirmedTransaction.ts b/dlt-connector/src/proto/GradidoConfirmedTransaction.ts new file mode 100644 index 000000000..e69de29bb diff --git a/dlt-connector/src/proto/GradidoCreation.ts b/dlt-connector/src/proto/GradidoCreation.ts new file mode 100644 index 000000000..90ca85806 --- /dev/null +++ b/dlt-connector/src/proto/GradidoCreation.ts @@ -0,0 +1,16 @@ +import { Field, Message } from '@apollo/protobufjs' + +import { TimestampSeconds } from './TimestampSeconds' +import { TransferAmount } from './TransferAmount' + +// need signature from group admin or +// percent of group users another than the receiver +// https://www.npmjs.com/package/@apollo/protobufjs +// eslint-disable-next-line no-use-before-define +export class GradidoCreation extends Message { + @Field.d(1, TransferAmount) + public recipient: TransferAmount + + @Field.d(3, 'TimestampSeconds') + public targetDate: TimestampSeconds +} diff --git a/dlt-connector/src/proto/GradidoDeferredTransfer.ts b/dlt-connector/src/proto/GradidoDeferredTransfer.ts new file mode 100644 index 000000000..a97cc22a7 --- /dev/null +++ b/dlt-connector/src/proto/GradidoDeferredTransfer.ts @@ -0,0 +1,31 @@ +import { Field, Message } from '@apollo/protobufjs' + +import { GradidoTransfer } from './GradidoTransfer' +import { Timestamp } from './Timestamp' + +// transaction type for chargeable transactions +// for transaction for people which haven't a account already +// consider using a seed number for key pair generation for recipient +// using seed as redeem key for claiming transaction, technically make a default Transfer transaction from recipient address +// seed must be long enough to prevent brute force, maybe base64 encoded +// to own account +// https://www.npmjs.com/package/@apollo/protobufjs +// eslint-disable-next-line no-use-before-define +export class GradidoDeferredTransfer extends Message { + // amount is amount with decay for time span between transaction was received and timeout + // useable amount can be calculated + // recipient address don't need to be registered in blockchain with register address + @Field.d(1, GradidoTransfer) + public transfer: GradidoTransfer + + // if timeout timestamp is reached if it wasn't used, it will be booked back minus decay + // technically on blockchain no additional transaction will be created because how should sign it? + // the decay for amount and the seconds until timeout is lost no matter what happened + // consider is as fee for this service + // rest decay could be transferred back as separate transaction + @Field.d(2, 'Timestamp') + public timeout: Timestamp + + // split for n recipient + // max gradido per recipient? or per transaction with cool down? +} diff --git a/dlt-connector/src/proto/GradidoTransaction.ts b/dlt-connector/src/proto/GradidoTransaction.ts new file mode 100644 index 000000000..ca1a59e30 --- /dev/null +++ b/dlt-connector/src/proto/GradidoTransaction.ts @@ -0,0 +1,21 @@ +import { Field, Message } from '@apollo/protobufjs' + +import { SignatureMap } from './SignatureMap' + +// https://www.npmjs.com/package/@apollo/protobufjs +// eslint-disable-next-line no-use-before-define +export class GradidoTransaction extends Message { + @Field.d(1, SignatureMap) + public sigMap: SignatureMap + + // inspired by Hedera + // bodyBytes are the payload for signature + // bodyBytes are serialized TransactionBody + @Field.d(2, 'bytes') + public bodyBytes: Buffer + + // if it is a cross group transaction the parent message + // id from outbound transaction or other by cross + @Field.d(3, 'bytes') + public parentMessageId: Buffer +} diff --git a/dlt-connector/src/proto/GradidoTransfer.ts b/dlt-connector/src/proto/GradidoTransfer.ts new file mode 100644 index 000000000..203b281ad --- /dev/null +++ b/dlt-connector/src/proto/GradidoTransfer.ts @@ -0,0 +1,13 @@ +import { Field, Message } from '@apollo/protobufjs' + +import { TransferAmount } from './TransferAmount' + +// https://www.npmjs.com/package/@apollo/protobufjs +// eslint-disable-next-line no-use-before-define +export class GradidoTransfer extends Message { + @Field.d(1, TransferAmount) + public sender: TransferAmount + + @Field.d(2, 'bytes') + public recipient: Buffer +} diff --git a/dlt-connector/src/proto/GroupFriendsUpdate.ts b/dlt-connector/src/proto/GroupFriendsUpdate.ts new file mode 100644 index 000000000..64e74a694 --- /dev/null +++ b/dlt-connector/src/proto/GroupFriendsUpdate.ts @@ -0,0 +1,15 @@ +import { Field, Message } from '@apollo/protobufjs' + +// connect group together +// only CrossGroupType CROSS (in TransactionBody) +// https://www.npmjs.com/package/@apollo/protobufjs +// eslint-disable-next-line no-use-before-define +export class GroupFriendsUpdate extends Message { + // if set to true, colors of this both groups are trait as the same + // on creation user get coins still in there color + // on transfer into another group which a connection exist, + // coins will be automatic swapped into user group color coin + // (if fusion between src coin and dst coin is enabled) + @Field.d(1, 'bool') + public colorFusion: boolean +} diff --git a/dlt-connector/src/proto/RegisterAddress.ts b/dlt-connector/src/proto/RegisterAddress.ts new file mode 100644 index 000000000..85b8390df --- /dev/null +++ b/dlt-connector/src/proto/RegisterAddress.ts @@ -0,0 +1,19 @@ +import { Field, Message } from '@apollo/protobufjs' + +import { AddressType } from '@enum/AddressType' + +// https://www.npmjs.com/package/@apollo/protobufjs +// eslint-disable-next-line no-use-before-define +export class RegisterAddress extends Message { + @Field.d(1, 'bytes') + public userPubkey: Buffer + + @Field.d(2, 'AddressType') + public addressType: AddressType + + @Field.d(3, 'bytes') + public nameHash: Buffer + + @Field.d(4, 'bytes') + public subaccountPubkey: Buffer +} diff --git a/dlt-connector/src/proto/SignatureMap.ts b/dlt-connector/src/proto/SignatureMap.ts new file mode 100644 index 000000000..e48b0232d --- /dev/null +++ b/dlt-connector/src/proto/SignatureMap.ts @@ -0,0 +1,10 @@ +import { Field, Message } from '@apollo/protobufjs' + +import { SignaturePair } from './SignaturePair' + +// https://www.npmjs.com/package/@apollo/protobufjs +// eslint-disable-next-line no-use-before-define +export class SignatureMap extends Message { + @Field.d(1, SignaturePair, 'repeated') + public sigPair: SignaturePair +} diff --git a/dlt-connector/src/proto/SignaturePair.ts b/dlt-connector/src/proto/SignaturePair.ts new file mode 100644 index 000000000..07ed4cc55 --- /dev/null +++ b/dlt-connector/src/proto/SignaturePair.ts @@ -0,0 +1,11 @@ +import { Field, Message } from '@apollo/protobufjs' + +// https://www.npmjs.com/package/@apollo/protobufjs +// eslint-disable-next-line no-use-before-define +export class SignaturePair extends Message { + @Field.d(1, 'bytes') + public pubKey: Buffer + + @Field.d(2, 'bytes') + public signature: Buffer +} diff --git a/dlt-connector/src/proto/Timestamp.ts b/dlt-connector/src/proto/Timestamp.ts new file mode 100644 index 000000000..2d3335272 --- /dev/null +++ b/dlt-connector/src/proto/Timestamp.ts @@ -0,0 +1,13 @@ +import { Field, Message } from '@apollo/protobufjs' + +// https://www.npmjs.com/package/@apollo/protobufjs +// eslint-disable-next-line no-use-before-define +export class Timestamp extends Message { + // Number of complete seconds since the start of the epoch + @Field.d(1, 'int64') + public seconds: number + + // Number of nanoseconds since the start of the last second + @Field.d(2, 'int32') + public nanoSeconds: number +} diff --git a/dlt-connector/src/proto/TimestampSeconds.ts b/dlt-connector/src/proto/TimestampSeconds.ts new file mode 100644 index 000000000..9a8c5b9de --- /dev/null +++ b/dlt-connector/src/proto/TimestampSeconds.ts @@ -0,0 +1,9 @@ +import { Field, Message } from '@apollo/protobufjs' + +// https://www.npmjs.com/package/@apollo/protobufjs +// eslint-disable-next-line no-use-before-define +export class TimestampSeconds extends Message { + // Number of complete seconds since the start of the epoch + @Field.d(1, 'int64') + public seconds: number +} diff --git a/dlt-connector/src/proto/TransactionBody.test.ts b/dlt-connector/src/proto/TransactionBody.test.ts index 168d15b63..c9315ba81 100644 --- a/dlt-connector/src/proto/TransactionBody.test.ts +++ b/dlt-connector/src/proto/TransactionBody.test.ts @@ -3,25 +3,27 @@ import { TransactionType } from '@enum/TransactionType' import { TransactionInput } from '@input/TransactionInput' import Decimal from 'decimal.js-light' import { TransactionBody } from './TransactionBody' +import { TimestampSeconds } from './TimestampSeconds' describe('proto/TransactionBodyTest', () => { it('test compatible with graphql/input/TransactionInput', async () => { // test data const type = TransactionType.SEND const amount = new Decimal('10') - const createdAt = 1688992436 + const createdAt = new TimestampSeconds() + createdAt.seconds = 1688992436 // init both objects // graphql input object const transactionInput = new TransactionInput() transactionInput.type = type transactionInput.amount = amount - transactionInput.createdAt = createdAt + transactionInput.createdAt = createdAt.seconds // protobuf object const transactionBody = new TransactionBody() - transactionBody.type = type - transactionBody.amount = amount.toString() + // transactionBody.type = type + // transactionBody.amount = amount.toString() transactionBody.createdAt = createdAt // create protobuf object from graphql Input object diff --git a/dlt-connector/src/proto/TransactionBody.ts b/dlt-connector/src/proto/TransactionBody.ts index 8fda5b863..bb90f788a 100644 --- a/dlt-connector/src/proto/TransactionBody.ts +++ b/dlt-connector/src/proto/TransactionBody.ts @@ -1,18 +1,60 @@ -import { TransactionType } from '../graphql/enum/TransactionType' -import { Field, Message } from '@apollo/protobufjs' +import { Field, Message, OneOf } from '@apollo/protobufjs' + +import { CrossGroupType } from '@/graphql/enum/CrossGroupType' + +import { TimestampSeconds } from './TimestampSeconds' +import { GradidoTransfer } from './GradidoTransfer' +import { GradidoCreation } from './GradidoCreation' +import { GradidoDeferredTransfer } from './GradidoDeferredTransfer' +import { GroupFriendsUpdate } from './GroupFriendsUpdate' +import { RegisterAddress } from './RegisterAddress' + +/*interface OneofExample { + result: + | { oneofKind: 'value'; value: number } + | { oneofKind: 'error'; error: string } + | { oneofKind: undefined } +}*/ // https://www.npmjs.com/package/@apollo/protobufjs // eslint-disable-next-line no-use-before-define export class TransactionBody extends Message { - @Field.d(1, TransactionType) - type: TransactionType + @Field.d(1, 'string') + public memo: string - @Field.d(2, 'string') - amount: string + @Field.d(2, TimestampSeconds) + public createdAt: TimestampSeconds - @Field.d(3, 'uint64') - createdAt: number + @Field.d(3, 'string') + public versionNumber: string - // @protoField.d(4, 'string') - // communitySum: Decimal + @Field.d(4, CrossGroupType) + public type: CrossGroupType + + @Field.d(5, 'string') + public otherGroup: string + + @OneOf.d( + 'gradidoTransfer', + 'gradidoCreation', + 'groupFriendsUpdate', + 'registerAddress', + 'gradidoDeferredTransfer', + ) + public data: string + + @Field.d(6, 'GradidoTransfer') + transfer?: GradidoTransfer + + @Field.d(7, 'GradidoCreation') + creation?: GradidoCreation + + @Field.d(8, 'GroupFriendsUpdate') + groupFriendsUpdate?: GroupFriendsUpdate + + @Field.d(9, 'RegisterAddress') + registerAddress?: RegisterAddress + + @Field.d(10, 'GradidoDeferredTransfer') + deferredTransfer?: GradidoDeferredTransfer } diff --git a/dlt-connector/src/proto/TransferAmount.ts b/dlt-connector/src/proto/TransferAmount.ts new file mode 100644 index 000000000..f6adc47ff --- /dev/null +++ b/dlt-connector/src/proto/TransferAmount.ts @@ -0,0 +1,16 @@ +import { Field, Message } from '@apollo/protobufjs' + +// https://www.npmjs.com/package/@apollo/protobufjs +// eslint-disable-next-line no-use-before-define +export class TransferAmount extends Message { + @Field.d(1, 'bytes') + public pubkey: Buffer + + @Field.d(2, 'string') + public amount: string + + // community which created this coin + // used for colored coins + @Field.d(3, 'string') + public communityId: string +} From 94b867762590dddd6f544e390ec5e37af4d13f4b Mon Sep 17 00:00:00 2001 From: einhorn_b Date: Mon, 4 Sep 2023 10:50:00 +0200 Subject: [PATCH 2/9] implement first draft for send complete transaction --- backend/src/apis/DltConnectorClient.test.ts | 6 +- backend/src/apis/DltConnectorClient.ts | 48 +++++++----- .../sendTransactionsToDltConnector.test.ts | 6 +- .../util/sendTransactionsToDltConnector.ts | 14 +++- common/src/graphql/validator/DateString.ts | 21 ++++++ common/src/graphql/validator/Decimal.ts | 22 ++++++ common/src/graphql/validator/validator | 1 + dlt-connector/src/controller/Community.ts | 3 + .../src/controller/GradidoTransaction.ts | 10 +++ .../src/controller/TransactionBase.ts | 6 ++ .../src/controller/TransactionBody.ts | 74 +++++++++++++++++++ dlt-connector/src/graphql/arg/User.ts | 19 +++++ dlt-connector/src/graphql/enum/AddressType.ts | 11 +-- .../src/graphql/enum/TransactionErrorType.ts | 10 +++ .../enum/TransactionValidationLevel.ts | 15 ++++ .../src/graphql/input/AddCommunityDraft.ts | 20 +++++ .../src/graphql/input/AddUserDraft.ts | 20 +++++ .../src/graphql/input/TransactionDraft.ts | 40 ++++++++++ .../src/graphql/input/TransactionInput.ts | 21 ------ .../src/graphql/model/TransactionError.ts | 16 ++++ .../src/graphql/model/TransactionResult.ts | 21 ++++++ .../graphql/resolver/TransactionsResolver.ts | 14 ++-- dlt-connector/src/graphql/validator | 1 + .../proto/3_3/GradidoConfirmedTransaction.ts | 34 +++++++++ .../src/proto/{ => 3_3}/GradidoCreation.ts | 8 ++ .../{ => 3_3}/GradidoDeferredTransfer.ts | 6 +- .../src/proto/{ => 3_3}/GradidoTransaction.ts | 0 .../src/proto/{ => 3_3}/GradidoTransfer.ts | 10 +++ .../src/proto/{ => 3_3}/GroupFriendsUpdate.ts | 0 .../src/proto/{ => 3_3}/RegisterAddress.ts | 0 .../src/proto/{ => 3_3}/SignatureMap.ts | 0 .../src/proto/{ => 3_3}/SignaturePair.ts | 0 dlt-connector/src/proto/3_3/Timestamp.ts | 27 +++++++ .../src/proto/{ => 3_3}/TimestampSeconds.ts | 11 +++ .../proto/{ => 3_3}/TransactionBody.test.ts | 5 +- .../src/proto/{ => 3_3}/TransactionBody.ts | 26 ++++--- .../src/proto/{ => 3_3}/TransferAmount.ts | 1 + .../src/proto/GradidoConfirmedTransaction.ts | 0 dlt-connector/src/proto/Timestamp.ts | 13 ---- dlt-connector/tsconfig.json | 2 + 40 files changed, 477 insertions(+), 85 deletions(-) create mode 100644 common/src/graphql/validator/DateString.ts create mode 100644 common/src/graphql/validator/Decimal.ts create mode 120000 common/src/graphql/validator/validator create mode 100644 dlt-connector/src/controller/Community.ts create mode 100644 dlt-connector/src/controller/GradidoTransaction.ts create mode 100644 dlt-connector/src/controller/TransactionBase.ts create mode 100644 dlt-connector/src/controller/TransactionBody.ts create mode 100644 dlt-connector/src/graphql/arg/User.ts create mode 100644 dlt-connector/src/graphql/enum/TransactionErrorType.ts create mode 100644 dlt-connector/src/graphql/enum/TransactionValidationLevel.ts create mode 100644 dlt-connector/src/graphql/input/AddCommunityDraft.ts create mode 100644 dlt-connector/src/graphql/input/AddUserDraft.ts create mode 100755 dlt-connector/src/graphql/input/TransactionDraft.ts delete mode 100755 dlt-connector/src/graphql/input/TransactionInput.ts create mode 100644 dlt-connector/src/graphql/model/TransactionError.ts create mode 100644 dlt-connector/src/graphql/model/TransactionResult.ts create mode 120000 dlt-connector/src/graphql/validator create mode 100644 dlt-connector/src/proto/3_3/GradidoConfirmedTransaction.ts rename dlt-connector/src/proto/{ => 3_3}/GradidoCreation.ts (67%) rename dlt-connector/src/proto/{ => 3_3}/GradidoDeferredTransfer.ts (92%) rename dlt-connector/src/proto/{ => 3_3}/GradidoTransaction.ts (100%) rename dlt-connector/src/proto/{ => 3_3}/GradidoTransfer.ts (57%) rename dlt-connector/src/proto/{ => 3_3}/GroupFriendsUpdate.ts (100%) rename dlt-connector/src/proto/{ => 3_3}/RegisterAddress.ts (100%) rename dlt-connector/src/proto/{ => 3_3}/SignatureMap.ts (100%) rename dlt-connector/src/proto/{ => 3_3}/SignaturePair.ts (100%) create mode 100644 dlt-connector/src/proto/3_3/Timestamp.ts rename dlt-connector/src/proto/{ => 3_3}/TimestampSeconds.ts (51%) rename dlt-connector/src/proto/{ => 3_3}/TransactionBody.test.ts (91%) rename dlt-connector/src/proto/{ => 3_3}/TransactionBody.ts (69%) rename dlt-connector/src/proto/{ => 3_3}/TransferAmount.ts (86%) delete mode 100644 dlt-connector/src/proto/GradidoConfirmedTransaction.ts delete mode 100644 dlt-connector/src/proto/Timestamp.ts diff --git a/backend/src/apis/DltConnectorClient.test.ts b/backend/src/apis/DltConnectorClient.test.ts index 56fa3d13f..aa7cff2fc 100644 --- a/backend/src/apis/DltConnectorClient.test.ts +++ b/backend/src/apis/DltConnectorClient.test.ts @@ -134,7 +134,11 @@ describe('transmitTransaction', () => { const localTransaction = new DbTransaction() localTransaction.typeId = 12 try { - await DltConnectorClient.getInstance()?.transmitTransaction(localTransaction) + await DltConnectorClient.getInstance()?.transmitTransaction( + localTransaction, + 'senderCommunityUUid', + 'recipientCommunity', + ) } catch (e) { expect(e).toMatchObject( new LogError('invalid transaction type id: ' + localTransaction.typeId.toString()), diff --git a/backend/src/apis/DltConnectorClient.ts b/backend/src/apis/DltConnectorClient.ts index 593072eef..852454220 100644 --- a/backend/src/apis/DltConnectorClient.ts +++ b/backend/src/apis/DltConnectorClient.ts @@ -78,27 +78,35 @@ export class DltConnectorClient { * transmit transaction via dlt-connector to iota * and update dltTransactionId of transaction in db with iota message id */ - public async transmitTransaction(transaction?: DbTransaction | null): Promise { - if (transaction) { - const typeString = getTransactionTypeString(transaction.typeId) - const secondsSinceEpoch = Math.round(transaction.balanceDate.getTime() / 1000) - const amountString = transaction.amount.toString() - try { - // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment - const { data } = await this.client.rawRequest(sendTransaction, { - input: { - type: typeString, - amount: amountString, - createdAt: secondsSinceEpoch, + public async transmitTransaction( + transaction: DbTransaction, + senderCommunityUuid: string, + recipientCommunityUuid = '', + ): Promise { + const typeString = getTransactionTypeString(transaction.typeId) + const milliSecondsSinceEpoch = Math.round(transaction.balanceDate.getTime()) + const amountString = transaction.amount.toString() + try { + // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment + const { data } = await this.client.rawRequest(sendTransaction, { + input: { + senderUser: { + uuid: transaction.userGradidoID, + communityUuid: senderCommunityUuid, }, - }) - // eslint-disable-next-line @typescript-eslint/no-unsafe-return, @typescript-eslint/no-unsafe-member-access - return data.sendTransaction.dltTransactionIdHex - } catch (e) { - throw new LogError('Error send sending transaction to dlt-connector: ', e) - } - } else { - throw new LogError('parameter transaction not set...') + recipientUser: { + uuid: transaction.linkedUserGradidoID, + communityUuid: recipientCommunityUuid, + }, + amount: amountString, + type: typeString, + createdAt: milliSecondsSinceEpoch, + }, + }) + // eslint-disable-next-line @typescript-eslint/no-unsafe-return, @typescript-eslint/no-unsafe-member-access + return data.sendTransaction.dltTransactionIdHex + } catch (e) { + throw new LogError('Error send sending transaction to dlt-connector: ', e) } } } diff --git a/backend/src/graphql/resolver/util/sendTransactionsToDltConnector.test.ts b/backend/src/graphql/resolver/util/sendTransactionsToDltConnector.test.ts index 871c31a89..0e0f0a810 100644 --- a/backend/src/graphql/resolver/util/sendTransactionsToDltConnector.test.ts +++ b/backend/src/graphql/resolver/util/sendTransactionsToDltConnector.test.ts @@ -360,7 +360,7 @@ describe('create and send Transactions to DltConnector', () => { txCREATION3 = await createTxCREATION3(false) CONFIG.DLT_CONNECTOR = false - await sendTransactionsToDltConnector() + await sendTransactionsToDltConnector('senderCommunityUuid') expect(logger.info).toBeCalledWith('sendTransactionsToDltConnector...') // Find the previous created transactions of sendCoin mutation @@ -429,7 +429,7 @@ describe('create and send Transactions to DltConnector', () => { } as Response }) - await sendTransactionsToDltConnector() + await sendTransactionsToDltConnector('senderCommunityUuid') expect(logger.info).toBeCalledWith('sendTransactionsToDltConnector...') @@ -507,7 +507,7 @@ describe('create and send Transactions to DltConnector', () => { } as Response }) - await sendTransactionsToDltConnector() + await sendTransactionsToDltConnector('senderCommunityUuid') expect(logger.info).toBeCalledWith('sendTransactionsToDltConnector...') diff --git a/backend/src/graphql/resolver/util/sendTransactionsToDltConnector.ts b/backend/src/graphql/resolver/util/sendTransactionsToDltConnector.ts index 98ea255c1..2e3211378 100644 --- a/backend/src/graphql/resolver/util/sendTransactionsToDltConnector.ts +++ b/backend/src/graphql/resolver/util/sendTransactionsToDltConnector.ts @@ -6,7 +6,10 @@ import { DltConnectorClient } from '@/apis/DltConnectorClient' import { backendLogger as logger } from '@/server/logger' import { Monitor, MonitorNames } from '@/util/Monitor' -export async function sendTransactionsToDltConnector(): Promise { +export async function sendTransactionsToDltConnector( + senderCommunityUuid: string, + recipientCommunityUuid = '', +): Promise { logger.info('sendTransactionsToDltConnector...') // check if this logic is still occupied, no concurrecy allowed if (!Monitor.isLocked(MonitorNames.SEND_DLT_TRANSACTIONS)) { @@ -24,8 +27,15 @@ export async function sendTransactionsToDltConnector(): Promise { order: { createdAt: 'ASC', id: 'ASC' }, }) for (const dltTx of dltTransactions) { + if (!dltTx.transaction) { + continue + } try { - const messageId = await dltConnector.transmitTransaction(dltTx.transaction) + const messageId = await dltConnector.transmitTransaction( + dltTx.transaction, + senderCommunityUuid, + recipientCommunityUuid, + ) const dltMessageId = Buffer.from(messageId, 'hex') if (dltMessageId.length !== 32) { logger.error( diff --git a/common/src/graphql/validator/DateString.ts b/common/src/graphql/validator/DateString.ts new file mode 100644 index 000000000..4ee23b51a --- /dev/null +++ b/common/src/graphql/validator/DateString.ts @@ -0,0 +1,21 @@ +import { registerDecorator, ValidationOptions, ValidationArguments } from 'class-validator' + +export function isValidDateString(validationOptions?: ValidationOptions) { + // eslint-disable-next-line @typescript-eslint/ban-types + return function (object: Object, propertyName: string) { + registerDecorator({ + name: 'isValidDateString', + target: object.constructor, + propertyName, + options: validationOptions, + validator: { + validate(value: string) { + return new Date(value).toString() !== 'Invalid Date' + }, + defaultMessage(args: ValidationArguments) { + return `${propertyName} must be a valid date string, ${args.property}` + }, + }, + }) + } +} diff --git a/common/src/graphql/validator/Decimal.ts b/common/src/graphql/validator/Decimal.ts new file mode 100644 index 000000000..09e8fb4bd --- /dev/null +++ b/common/src/graphql/validator/Decimal.ts @@ -0,0 +1,22 @@ +import { registerDecorator, ValidationOptions, ValidationArguments } from 'class-validator' +import { Decimal } from 'decimal.js-light' + +export function IsPositiveDecimal(validationOptions?: ValidationOptions) { + // eslint-disable-next-line @typescript-eslint/ban-types + return function (object: Object, propertyName: string) { + registerDecorator({ + name: 'isPositiveDecimal', + target: object.constructor, + propertyName, + options: validationOptions, + validator: { + validate(value: Decimal) { + return value.greaterThan(0) + }, + defaultMessage(args: ValidationArguments) { + return `The ${propertyName} must be a positive value ${args.property}` + }, + }, + }) + } +} diff --git a/common/src/graphql/validator/validator b/common/src/graphql/validator/validator new file mode 120000 index 000000000..cc34f673a --- /dev/null +++ b/common/src/graphql/validator/validator @@ -0,0 +1 @@ +validator \ No newline at end of file diff --git a/dlt-connector/src/controller/Community.ts b/dlt-connector/src/controller/Community.ts new file mode 100644 index 000000000..ff6d43012 --- /dev/null +++ b/dlt-connector/src/controller/Community.ts @@ -0,0 +1,3 @@ +export class Community { + +} \ No newline at end of file diff --git a/dlt-connector/src/controller/GradidoTransaction.ts b/dlt-connector/src/controller/GradidoTransaction.ts new file mode 100644 index 000000000..671f3f57a --- /dev/null +++ b/dlt-connector/src/controller/GradidoTransaction.ts @@ -0,0 +1,10 @@ +import { GradidoTransaction } from '@/proto/3_3/GradidoTransaction' +import { TransactionBody } from '@/proto/3_3/TransactionBody' + +export const create = (body: TransactionBody): GradidoTransaction => { + const transaction = new GradidoTransaction({ + bodyBytes: Buffer.from(TransactionBody.encode(body).finish()), + }) + // TODO: add correct signature(s) + return transaction +} diff --git a/dlt-connector/src/controller/TransactionBase.ts b/dlt-connector/src/controller/TransactionBase.ts new file mode 100644 index 000000000..9833226a9 --- /dev/null +++ b/dlt-connector/src/controller/TransactionBase.ts @@ -0,0 +1,6 @@ +import { TransactionValidationLevel } from '@/graphql/enum/TransactionValidationLevel' + +export abstract class TransactionBase { + // validate if transaction is valid, maybe expensive because depending on level several transactions will be fetched from db + public abstract validate(level: TransactionValidationLevel): boolean +} diff --git a/dlt-connector/src/controller/TransactionBody.ts b/dlt-connector/src/controller/TransactionBody.ts new file mode 100644 index 000000000..e5141277d --- /dev/null +++ b/dlt-connector/src/controller/TransactionBody.ts @@ -0,0 +1,74 @@ +import { CrossGroupType } from '@/graphql/enum/CrossGroupType' +import { TransactionErrorType } from '@/graphql/enum/TransactionErrorType' +import { TransactionType } from '@/graphql/enum/TransactionType' +import { TransactionDraft } from '@/graphql/input/TransactionDraft' +import { TransactionError } from '@/graphql/model/TransactionError' +import { GradidoCreation } from '@/proto/3_3/GradidoCreation' +import { GradidoTransfer } from '@/proto/3_3/GradidoTransfer' +import { TransactionBody } from '@/proto/3_3/TransactionBody' + +export const create = (transaction: TransactionDraft): TransactionBody => { + const body = new TransactionBody(transaction) + // TODO: load pubkeys for sender and recipient user from db + switch (transaction.type) { + case TransactionType.CREATION: + body.creation = new GradidoCreation(transaction) + body.data = 'gradidoCreation' + break + case TransactionType.SEND: + body.transfer = new GradidoTransfer(transaction) + body.data = 'gradidoTransfer' + break + case TransactionType.RECEIVE: + body.transfer = new GradidoTransfer(transaction) + body.data = 'gradidoTransfer' + break + default: + throw new TransactionError( + TransactionErrorType.NOT_IMPLEMENTED_YET, + 'transaction type unknown', + ) + } + return body +} + +export const determineCrossGroupType = ({ + senderUser, + recipientUser, + type, +}: TransactionDraft): CrossGroupType => { + if ( + recipientUser.communityUuid === '' || + senderUser.communityUuid === recipientUser.communityUuid || + type === TransactionType.CREATION + ) { + return CrossGroupType.LOCAL + } else if (type === TransactionType.SEND) { + return CrossGroupType.INBOUND + } else if (type === TransactionType.RECEIVE) { + return CrossGroupType.OUTBOUND + } + throw new TransactionError( + TransactionErrorType.NOT_IMPLEMENTED_YET, + 'cannot determine CrossGroupType', + ) +} + +export const determineOtherGroup = ( + type: CrossGroupType, + { senderUser, recipientUser }: TransactionDraft, +): string => { + switch (type) { + case CrossGroupType.LOCAL: + return '' + case CrossGroupType.INBOUND: + return recipientUser.communityUuid + case CrossGroupType.OUTBOUND: + return senderUser.communityUuid + default: + throw new TransactionError( + TransactionErrorType.NOT_IMPLEMENTED_YET, + type.toString() + ' for enum CrossGroupType not implemented yet', + ) + } +} diff --git a/dlt-connector/src/graphql/arg/User.ts b/dlt-connector/src/graphql/arg/User.ts new file mode 100644 index 000000000..5175e3d78 --- /dev/null +++ b/dlt-connector/src/graphql/arg/User.ts @@ -0,0 +1,19 @@ +// https://www.npmjs.com/package/@apollo/protobufjs + +import { IsPositive, IsUUID } from 'class-validator' +import { Field, Int, ArgsType } from 'type-graphql' + +@ArgsType() +export class User { + @Field(() => String) + @IsUUID('4') + uuid: string + + @Field(() => String) + @IsUUID('4') + communityUuid: string + + @Field(() => Int, { defaultValue: 1 }) + @IsPositive() + accountNr: number +} diff --git a/dlt-connector/src/graphql/enum/AddressType.ts b/dlt-connector/src/graphql/enum/AddressType.ts index d75ad9988..26efd2825 100644 --- a/dlt-connector/src/graphql/enum/AddressType.ts +++ b/dlt-connector/src/graphql/enum/AddressType.ts @@ -1,8 +1,9 @@ export enum AddressType { NONE = 0, // if no address was found - HUMAN = 1, - PROJECT = 2, // no creations allowed - SUBACCOUNT = 3, // no creations allowed - CRYPTO_ACCOUNT = 4, // user control his keys, no creations - COMMUNITY_ACCOUNT = 5, // community control keys, creations allowed + COMMUNITY_HUMAN = 1, // creation account for human + COMMUNITY_GMW = 2, // community public budget account + COMMUNITY_AUF = 3, // community compensation and environment founds account + COMMUNITY_PROJECT = 4, // no creations allowed + SUBACCOUNT = 5, // no creations allowed + CRYPTO_ACCOUNT = 6, // user control his keys, no creations } diff --git a/dlt-connector/src/graphql/enum/TransactionErrorType.ts b/dlt-connector/src/graphql/enum/TransactionErrorType.ts new file mode 100644 index 000000000..6977c34a8 --- /dev/null +++ b/dlt-connector/src/graphql/enum/TransactionErrorType.ts @@ -0,0 +1,10 @@ +import { registerEnumType } from 'type-graphql' + +export enum TransactionErrorType { + NOT_IMPLEMENTED_YET = 'Not Implemented yet', +} + +registerEnumType(TransactionErrorType, { + name: 'TransactionErrorType', + description: 'Transaction Error Type', +}) diff --git a/dlt-connector/src/graphql/enum/TransactionValidationLevel.ts b/dlt-connector/src/graphql/enum/TransactionValidationLevel.ts new file mode 100644 index 000000000..9462dd8a8 --- /dev/null +++ b/dlt-connector/src/graphql/enum/TransactionValidationLevel.ts @@ -0,0 +1,15 @@ +import { registerEnumType } from 'type-graphql' + +export enum TransactionValidationLevel { + SINGLE = 1, // check only the transaction + SINGLE_PREVIOUS = 2, // check also with previous transaction + DATE_RANGE = 3, // check all transaction from within date range by creation automatic the same month + PAIRED = 4, // check paired transaction on another group by cross group transactions + CONNECTED_GROUP = 5, // check all transactions in the group which connected with this transaction address(es) + CONNECTED_BLOCKCHAIN = 6, // check all transactions which connected with this transaction +} + +registerEnumType(TransactionValidationLevel, { + name: 'TransactionValidationLevel', + description: 'Transaction Validation Levels', +}) diff --git a/dlt-connector/src/graphql/input/AddCommunityDraft.ts b/dlt-connector/src/graphql/input/AddCommunityDraft.ts new file mode 100644 index 000000000..f967019b3 --- /dev/null +++ b/dlt-connector/src/graphql/input/AddCommunityDraft.ts @@ -0,0 +1,20 @@ +// https://www.npmjs.com/package/@apollo/protobufjs +import { InputType, Field } from 'type-graphql' + +import { isValidDateString } from '../validator/DateString' +import { IsBoolean, IsUUID } from 'class-validator' + +@InputType() +export class AddCommunityDraft { + @Field(() => String) + @IsUUID('4') + communityUuid: string + + @Field(() => String) + @isValidDateString() + createdAt: string + + @Field(() => Boolean) + @IsBoolean() + foreign: boolean +} diff --git a/dlt-connector/src/graphql/input/AddUserDraft.ts b/dlt-connector/src/graphql/input/AddUserDraft.ts new file mode 100644 index 000000000..5c6705375 --- /dev/null +++ b/dlt-connector/src/graphql/input/AddUserDraft.ts @@ -0,0 +1,20 @@ +// https://www.npmjs.com/package/@apollo/protobufjs + +import { IsUUID } from 'class-validator' +import { isValidDateString } from '../validator/DateString' +import { InputType, Field } from 'type-graphql' + +@InputType() +export class AddUserDraft { + @Field(() => String) + @IsUUID('4') + uuid: string + + @Field(() => String) + @IsUUID('4') + communityUuid: string + + @Field(() => String) + @isValidDateString() + createdAt: string +} diff --git a/dlt-connector/src/graphql/input/TransactionDraft.ts b/dlt-connector/src/graphql/input/TransactionDraft.ts new file mode 100755 index 000000000..22da79d4a --- /dev/null +++ b/dlt-connector/src/graphql/input/TransactionDraft.ts @@ -0,0 +1,40 @@ +// https://www.npmjs.com/package/@apollo/protobufjs + +import { Decimal } from 'decimal.js-light' +import { TransactionType } from '@enum/TransactionType' +import { InputType, Field } from 'type-graphql' +import { User } from '@arg/User' +import { isValidDateString } from '../validator/DateString' +import { IsPositiveDecimal } from '../validator/Decimal' +import { IsEnum, IsObject, ValidateNested, IsNumber, Min } from 'class-validator' + +@InputType() +export class TransactionDraft { + @Field(() => User) + @IsObject() + @ValidateNested() + senderUser: User + + @Field(() => User) + @IsObject() + @ValidateNested() + recipientUser: User + + @Field(() => Decimal) + @IsPositiveDecimal() + amount: Decimal + + @Field(() => TransactionType) + @IsEnum(TransactionType) + type: TransactionType + + @Field(() => Number) + @IsNumber() + @Min(9783072000000) // 01.01.2001 + createdAt: number // in milliseconds + + // only for creation transactions + @Field(() => String, { nullable: true }) + @isValidDateString() + targetDate?: string +} diff --git a/dlt-connector/src/graphql/input/TransactionInput.ts b/dlt-connector/src/graphql/input/TransactionInput.ts deleted file mode 100755 index 02eba916e..000000000 --- a/dlt-connector/src/graphql/input/TransactionInput.ts +++ /dev/null @@ -1,21 +0,0 @@ -// https://www.npmjs.com/package/@apollo/protobufjs - -import { Decimal } from 'decimal.js-light' -import { TransactionType } from '../enum/TransactionType' -import { InputType, Field } from 'type-graphql' - -@InputType() -export class TransactionInput { - @Field(() => TransactionType) - type: TransactionType - - @Field(() => Decimal) - amount: Decimal - - @Field(() => Number) - createdAt: number - - // @protoField.d(4, 'string') - // @Field(() => Decimal) - // communitySum: Decimal -} diff --git a/dlt-connector/src/graphql/model/TransactionError.ts b/dlt-connector/src/graphql/model/TransactionError.ts new file mode 100644 index 000000000..be2743239 --- /dev/null +++ b/dlt-connector/src/graphql/model/TransactionError.ts @@ -0,0 +1,16 @@ +import { ObjectType, Field } from 'type-graphql' +import { TransactionErrorType } from '../enum/TransactionErrorType' + +@ObjectType() +export class TransactionError { + constructor(type: TransactionErrorType, message: string) { + this.type = type + this.message = message + } + + @Field(() => TransactionErrorType) + type: TransactionErrorType + + @Field(() => String) + message: string +} diff --git a/dlt-connector/src/graphql/model/TransactionResult.ts b/dlt-connector/src/graphql/model/TransactionResult.ts new file mode 100644 index 000000000..5aeb7f441 --- /dev/null +++ b/dlt-connector/src/graphql/model/TransactionResult.ts @@ -0,0 +1,21 @@ +import { ObjectType, Field } from 'type-graphql' +import { TransactionError } from './TransactionError' + +@ObjectType() +export class TransactionResult { + constructor(content: TransactionError | Buffer) { + if (content instanceof TransactionError) { + this.error = content + } else if (content instanceof Buffer) { + this.messageId = content.toString('hex') + } + } + + // the error if one happened + @Field(() => TransactionError, { nullable: true }) + error?: TransactionError + + // if no error happend, the message id of the iota transaction + @Field(() => String, { nullable: true }) + messageId?: string +} diff --git a/dlt-connector/src/graphql/resolver/TransactionsResolver.ts b/dlt-connector/src/graphql/resolver/TransactionsResolver.ts index df50322fb..b798465d0 100755 --- a/dlt-connector/src/graphql/resolver/TransactionsResolver.ts +++ b/dlt-connector/src/graphql/resolver/TransactionsResolver.ts @@ -1,9 +1,12 @@ import { Resolver, Query, Arg, Mutation } from 'type-graphql' -import { TransactionInput } from '@input/TransactionInput' -import { TransactionBody } from '@proto/TransactionBody' +import { TransactionDraft } from '@input/TransactionDraft' + +import { create as createTransactionBody } from '@controller/TransactionBody' +import { create as createGradidoTransaction } from '@controller/GradidoTransaction' import { sendMessage as iotaSendMessage } from '@/client/IotaClient' +import { GradidoTransaction } from '@/proto/3_3/GradidoTransaction' @Resolver() export class TransactionResolver { @@ -21,10 +24,11 @@ export class TransactionResolver { @Mutation(() => String) async sendTransaction( @Arg('data') - transaction: TransactionInput, + transaction: TransactionDraft, ): Promise { - const message = TransactionBody.fromObject(transaction) - const messageBuffer = TransactionBody.encode(message).finish() + const body = createTransactionBody(transaction) + const message = createGradidoTransaction(body) + const messageBuffer = GradidoTransaction.encode(message).finish() const resultMessage = await iotaSendMessage(messageBuffer) return resultMessage.messageId } diff --git a/dlt-connector/src/graphql/validator b/dlt-connector/src/graphql/validator new file mode 120000 index 000000000..7268ccb05 --- /dev/null +++ b/dlt-connector/src/graphql/validator @@ -0,0 +1 @@ +../../../common/src/graphql/validator \ No newline at end of file diff --git a/dlt-connector/src/proto/3_3/GradidoConfirmedTransaction.ts b/dlt-connector/src/proto/3_3/GradidoConfirmedTransaction.ts new file mode 100644 index 000000000..7f0a58109 --- /dev/null +++ b/dlt-connector/src/proto/3_3/GradidoConfirmedTransaction.ts @@ -0,0 +1,34 @@ +import { Field, Message } from '@apollo/protobufjs' +import { GradidoTransaction } from './GradidoTransaction' +import { TimestampSeconds } from './TimestampSeconds' + +/* + id will be set by Node server + running_hash will be also set by Node server, + calculated from previous transaction running_hash and this id, transaction and received +*/ + +// https://www.npmjs.com/package/@apollo/protobufjs +// eslint-disable-next-line no-use-before-define +export class GradidoConfirmedTransaction extends Message { + @Field.d(1, 'uint64') + id: number + + @Field.d(2, 'GradidoTransaction') + transaction: GradidoTransaction + + @Field.d(3, 'TimestampSeconds') + confirmedAt: TimestampSeconds + + @Field.d(4, 'string') + versionNumber: string + + @Field.d(5, 'bytes') + runningHash: Buffer + + @Field.d(6, 'bytes') + messageId: Buffer + + @Field.d(7, 'string') + accountBalance: string +} diff --git a/dlt-connector/src/proto/GradidoCreation.ts b/dlt-connector/src/proto/3_3/GradidoCreation.ts similarity index 67% rename from dlt-connector/src/proto/GradidoCreation.ts rename to dlt-connector/src/proto/3_3/GradidoCreation.ts index 90ca85806..a54cb6169 100644 --- a/dlt-connector/src/proto/GradidoCreation.ts +++ b/dlt-connector/src/proto/3_3/GradidoCreation.ts @@ -2,12 +2,20 @@ import { Field, Message } from '@apollo/protobufjs' import { TimestampSeconds } from './TimestampSeconds' import { TransferAmount } from './TransferAmount' +import { TransactionDraft } from '@/graphql/input/TransactionDraft' // need signature from group admin or // percent of group users another than the receiver // https://www.npmjs.com/package/@apollo/protobufjs // eslint-disable-next-line no-use-before-define export class GradidoCreation extends Message { + constructor(transaction: TransactionDraft) { + super({ + recipient: new TransferAmount({ amount: transaction.amount.toString() }), + targetDate: new TimestampSeconds(), + }) + } + @Field.d(1, TransferAmount) public recipient: TransferAmount diff --git a/dlt-connector/src/proto/GradidoDeferredTransfer.ts b/dlt-connector/src/proto/3_3/GradidoDeferredTransfer.ts similarity index 92% rename from dlt-connector/src/proto/GradidoDeferredTransfer.ts rename to dlt-connector/src/proto/3_3/GradidoDeferredTransfer.ts index a97cc22a7..7b27c064a 100644 --- a/dlt-connector/src/proto/GradidoDeferredTransfer.ts +++ b/dlt-connector/src/proto/3_3/GradidoDeferredTransfer.ts @@ -1,7 +1,7 @@ import { Field, Message } from '@apollo/protobufjs' import { GradidoTransfer } from './GradidoTransfer' -import { Timestamp } from './Timestamp' +import { TimestampSeconds } from './TimestampSeconds' // transaction type for chargeable transactions // for transaction for people which haven't a account already @@ -23,8 +23,8 @@ export class GradidoDeferredTransfer extends Message { // the decay for amount and the seconds until timeout is lost no matter what happened // consider is as fee for this service // rest decay could be transferred back as separate transaction - @Field.d(2, 'Timestamp') - public timeout: Timestamp + @Field.d(2, 'TimestampSeconds') + public timeout: TimestampSeconds // split for n recipient // max gradido per recipient? or per transaction with cool down? diff --git a/dlt-connector/src/proto/GradidoTransaction.ts b/dlt-connector/src/proto/3_3/GradidoTransaction.ts similarity index 100% rename from dlt-connector/src/proto/GradidoTransaction.ts rename to dlt-connector/src/proto/3_3/GradidoTransaction.ts diff --git a/dlt-connector/src/proto/GradidoTransfer.ts b/dlt-connector/src/proto/3_3/GradidoTransfer.ts similarity index 57% rename from dlt-connector/src/proto/GradidoTransfer.ts rename to dlt-connector/src/proto/3_3/GradidoTransfer.ts index 203b281ad..215ffc60f 100644 --- a/dlt-connector/src/proto/GradidoTransfer.ts +++ b/dlt-connector/src/proto/3_3/GradidoTransfer.ts @@ -1,10 +1,20 @@ import { Field, Message } from '@apollo/protobufjs' import { TransferAmount } from './TransferAmount' +import { TransactionDraft } from '@/graphql/input/TransactionDraft' // https://www.npmjs.com/package/@apollo/protobufjs // eslint-disable-next-line no-use-before-define export class GradidoTransfer extends Message { + constructor(transaction: TransactionDraft, coinOrigin?: string) { + super({ + sender: new TransferAmount({ + amount: transaction.amount.toString(), + communityId: coinOrigin, + }), + }) + } + @Field.d(1, TransferAmount) public sender: TransferAmount diff --git a/dlt-connector/src/proto/GroupFriendsUpdate.ts b/dlt-connector/src/proto/3_3/GroupFriendsUpdate.ts similarity index 100% rename from dlt-connector/src/proto/GroupFriendsUpdate.ts rename to dlt-connector/src/proto/3_3/GroupFriendsUpdate.ts diff --git a/dlt-connector/src/proto/RegisterAddress.ts b/dlt-connector/src/proto/3_3/RegisterAddress.ts similarity index 100% rename from dlt-connector/src/proto/RegisterAddress.ts rename to dlt-connector/src/proto/3_3/RegisterAddress.ts diff --git a/dlt-connector/src/proto/SignatureMap.ts b/dlt-connector/src/proto/3_3/SignatureMap.ts similarity index 100% rename from dlt-connector/src/proto/SignatureMap.ts rename to dlt-connector/src/proto/3_3/SignatureMap.ts diff --git a/dlt-connector/src/proto/SignaturePair.ts b/dlt-connector/src/proto/3_3/SignaturePair.ts similarity index 100% rename from dlt-connector/src/proto/SignaturePair.ts rename to dlt-connector/src/proto/3_3/SignaturePair.ts diff --git a/dlt-connector/src/proto/3_3/Timestamp.ts b/dlt-connector/src/proto/3_3/Timestamp.ts new file mode 100644 index 000000000..ab060a9bc --- /dev/null +++ b/dlt-connector/src/proto/3_3/Timestamp.ts @@ -0,0 +1,27 @@ +import { Field, Message } from '@apollo/protobufjs' + +// https://www.npmjs.com/package/@apollo/protobufjs +// eslint-disable-next-line no-use-before-define +export class Timestamp extends Message { + public constructor(input?: Date | number) { + let seconds = 0 + let nanoSeconds = 0 + if (input instanceof Date) { + seconds = Math.floor(input.getTime() / 1000) + nanoSeconds = (input.getTime() % 1000) * 1000000 // Convert milliseconds to nanoseconds + } else if (typeof input === 'number') { + // Calculate seconds and nanoseconds from milliseconds + seconds = Math.floor(input / 1000) + nanoSeconds = (input % 1000) * 1000000 + } + super({ seconds, nanoSeconds }) + } + + // Number of complete seconds since the start of the epoch + @Field.d(1, 'int64') + public seconds: number + + // Number of nanoseconds since the start of the last second + @Field.d(2, 'int32') + public nanoSeconds: number +} diff --git a/dlt-connector/src/proto/TimestampSeconds.ts b/dlt-connector/src/proto/3_3/TimestampSeconds.ts similarity index 51% rename from dlt-connector/src/proto/TimestampSeconds.ts rename to dlt-connector/src/proto/3_3/TimestampSeconds.ts index 9a8c5b9de..055094c6d 100644 --- a/dlt-connector/src/proto/TimestampSeconds.ts +++ b/dlt-connector/src/proto/3_3/TimestampSeconds.ts @@ -3,6 +3,17 @@ import { Field, Message } from '@apollo/protobufjs' // https://www.npmjs.com/package/@apollo/protobufjs // eslint-disable-next-line no-use-before-define export class TimestampSeconds extends Message { + public constructor(input?: Date | number) { + let seconds = 0 + // Calculate seconds from milliseconds + if (input instanceof Date) { + seconds = Math.floor(input.getTime() / 1000) + } else if (typeof input === 'number') { + seconds = Math.floor(input / 1000) + } + super({ seconds }) + } + // Number of complete seconds since the start of the epoch @Field.d(1, 'int64') public seconds: number diff --git a/dlt-connector/src/proto/TransactionBody.test.ts b/dlt-connector/src/proto/3_3/TransactionBody.test.ts similarity index 91% rename from dlt-connector/src/proto/TransactionBody.test.ts rename to dlt-connector/src/proto/3_3/TransactionBody.test.ts index c9315ba81..cfed31a53 100644 --- a/dlt-connector/src/proto/TransactionBody.test.ts +++ b/dlt-connector/src/proto/3_3/TransactionBody.test.ts @@ -1,6 +1,6 @@ import 'reflect-metadata' import { TransactionType } from '@enum/TransactionType' -import { TransactionInput } from '@input/TransactionInput' +// import { TransactionInput } from '@input/TransactionInput' import Decimal from 'decimal.js-light' import { TransactionBody } from './TransactionBody' import { TimestampSeconds } from './TimestampSeconds' @@ -15,7 +15,7 @@ describe('proto/TransactionBodyTest', () => { // init both objects // graphql input object - const transactionInput = new TransactionInput() + /* const transactionInput = new TransactionInput() transactionInput.type = type transactionInput.amount = amount transactionInput.createdAt = createdAt.seconds @@ -34,5 +34,6 @@ describe('proto/TransactionBodyTest', () => { // compare expect(messageBuffer).toStrictEqual(messageBuffer2) + */ }) }) diff --git a/dlt-connector/src/proto/TransactionBody.ts b/dlt-connector/src/proto/3_3/TransactionBody.ts similarity index 69% rename from dlt-connector/src/proto/TransactionBody.ts rename to dlt-connector/src/proto/3_3/TransactionBody.ts index bb90f788a..ec15d3474 100644 --- a/dlt-connector/src/proto/TransactionBody.ts +++ b/dlt-connector/src/proto/3_3/TransactionBody.ts @@ -2,28 +2,34 @@ import { Field, Message, OneOf } from '@apollo/protobufjs' import { CrossGroupType } from '@/graphql/enum/CrossGroupType' -import { TimestampSeconds } from './TimestampSeconds' +import { Timestamp } from './Timestamp' import { GradidoTransfer } from './GradidoTransfer' import { GradidoCreation } from './GradidoCreation' import { GradidoDeferredTransfer } from './GradidoDeferredTransfer' import { GroupFriendsUpdate } from './GroupFriendsUpdate' import { RegisterAddress } from './RegisterAddress' - -/*interface OneofExample { - result: - | { oneofKind: 'value'; value: number } - | { oneofKind: 'error'; error: string } - | { oneofKind: undefined } -}*/ +import { TransactionDraft } from '@/graphql/input/TransactionDraft' +import { determineCrossGroupType, determineOtherGroup } from '@/controller/TransactionBody' // https://www.npmjs.com/package/@apollo/protobufjs // eslint-disable-next-line no-use-before-define export class TransactionBody extends Message { + public constructor(transaction: TransactionDraft) { + const type = determineCrossGroupType(transaction) + super({ + memo: 'Not implemented yet', + createdAt: new Timestamp(transaction.createdAt), + versionNumber: '3.3', + type, + otherGroup: determineOtherGroup(type, transaction), + }) + } + @Field.d(1, 'string') public memo: string - @Field.d(2, TimestampSeconds) - public createdAt: TimestampSeconds + @Field.d(2, Timestamp) + public createdAt: Timestamp @Field.d(3, 'string') public versionNumber: string diff --git a/dlt-connector/src/proto/TransferAmount.ts b/dlt-connector/src/proto/3_3/TransferAmount.ts similarity index 86% rename from dlt-connector/src/proto/TransferAmount.ts rename to dlt-connector/src/proto/3_3/TransferAmount.ts index f6adc47ff..2abe87322 100644 --- a/dlt-connector/src/proto/TransferAmount.ts +++ b/dlt-connector/src/proto/3_3/TransferAmount.ts @@ -1,3 +1,4 @@ +import { TransactionDraft } from '@/graphql/input/TransactionDraft' import { Field, Message } from '@apollo/protobufjs' // https://www.npmjs.com/package/@apollo/protobufjs diff --git a/dlt-connector/src/proto/GradidoConfirmedTransaction.ts b/dlt-connector/src/proto/GradidoConfirmedTransaction.ts deleted file mode 100644 index e69de29bb..000000000 diff --git a/dlt-connector/src/proto/Timestamp.ts b/dlt-connector/src/proto/Timestamp.ts deleted file mode 100644 index 2d3335272..000000000 --- a/dlt-connector/src/proto/Timestamp.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { Field, Message } from '@apollo/protobufjs' - -// https://www.npmjs.com/package/@apollo/protobufjs -// eslint-disable-next-line no-use-before-define -export class Timestamp extends Message { - // Number of complete seconds since the start of the epoch - @Field.d(1, 'int64') - public seconds: number - - // Number of nanoseconds since the start of the last second - @Field.d(2, 'int32') - public nanoSeconds: number -} diff --git a/dlt-connector/tsconfig.json b/dlt-connector/tsconfig.json index bdc5e3a9b..c82548df9 100644 --- a/dlt-connector/tsconfig.json +++ b/dlt-connector/tsconfig.json @@ -51,10 +51,12 @@ "@arg/*": ["src/graphql/arg/*"], "@enum/*": ["src/graphql/enum/*"], "@input/*": ["src/graphql/input/*"], + "@model/*": ["src/graphql/model/*"], "@resolver/*": ["src/graphql/resolver/*"], "@scalar/*": ["src/graphql/scalar/*"], "@test/*": ["test/*"], "@proto/*" : ["src/proto/*"], + "@controller/*": ["src/controller/*"], /* external */ }, // "rootDirs": [], /* List of root folders whose combined content represents the structure of the project at runtime. */ From ddbec0ae3bfc871a08c652f42347c496ba103dd7 Mon Sep 17 00:00:00 2001 From: einhorn_b Date: Mon, 4 Sep 2023 10:58:50 +0200 Subject: [PATCH 3/9] update resolver result --- .../src/graphql/model/TransactionResult.ts | 4 +++- .../graphql/resolver/TransactionsResolver.ts | 21 +++++++++++++------ 2 files changed, 18 insertions(+), 7 deletions(-) diff --git a/dlt-connector/src/graphql/model/TransactionResult.ts b/dlt-connector/src/graphql/model/TransactionResult.ts index 5aeb7f441..6be3a8b1e 100644 --- a/dlt-connector/src/graphql/model/TransactionResult.ts +++ b/dlt-connector/src/graphql/model/TransactionResult.ts @@ -3,11 +3,13 @@ import { TransactionError } from './TransactionError' @ObjectType() export class TransactionResult { - constructor(content: TransactionError | Buffer) { + constructor(content: TransactionError | Buffer | string) { if (content instanceof TransactionError) { this.error = content } else if (content instanceof Buffer) { this.messageId = content.toString('hex') + } else if (typeof content === 'string') { + this.messageId = content } } diff --git a/dlt-connector/src/graphql/resolver/TransactionsResolver.ts b/dlt-connector/src/graphql/resolver/TransactionsResolver.ts index b798465d0..e9b034d76 100755 --- a/dlt-connector/src/graphql/resolver/TransactionsResolver.ts +++ b/dlt-connector/src/graphql/resolver/TransactionsResolver.ts @@ -7,6 +7,8 @@ import { create as createGradidoTransaction } from '@controller/GradidoTransacti import { sendMessage as iotaSendMessage } from '@/client/IotaClient' import { GradidoTransaction } from '@/proto/3_3/GradidoTransaction' +import { TransactionResult } from '../model/TransactionResult' +import { TransactionError } from '../model/TransactionError' @Resolver() export class TransactionResolver { @@ -25,11 +27,18 @@ export class TransactionResolver { async sendTransaction( @Arg('data') transaction: TransactionDraft, - ): Promise { - const body = createTransactionBody(transaction) - const message = createGradidoTransaction(body) - const messageBuffer = GradidoTransaction.encode(message).finish() - const resultMessage = await iotaSendMessage(messageBuffer) - return resultMessage.messageId + ): Promise { + try { + const body = createTransactionBody(transaction) + const message = createGradidoTransaction(body) + const messageBuffer = GradidoTransaction.encode(message).finish() + const resultMessage = await iotaSendMessage(messageBuffer) + return new TransactionResult(resultMessage.messageId) + } catch (error) { + if (error instanceof TransactionError) { + return new TransactionResult(error) + } + throw error + } } } From 6c0c973cb8c303b15ec3b713f78913736c588e0d Mon Sep 17 00:00:00 2001 From: einhorn_b Date: Wed, 6 Sep 2023 13:02:45 +0200 Subject: [PATCH 4/9] add test, increase coverage to 80% --- backend/src/apis/DltConnectorClient.ts | 2 +- .../sendTransactionsToDltConnector.test.ts | 21 +- .../util/sendTransactionsToDltConnector.ts | 11 +- common/src/graphql/validator/validator | 1 - dlt-connector/.env.dist | 2 +- dlt-connector/Dockerfile | 2 +- dlt-connector/jest.config.js | 5 +- dlt-connector/src/config/index.ts | 2 +- dlt-connector/src/controller/Community.ts | 3 - .../src/controller/TransactionBody.test.ts | 162 +++ .../src/controller/TransactionBody.ts | 25 +- dlt-connector/src/graphql/arg/User.ts | 19 - .../src/graphql/enum/CrossGroupType.ts | 2 +- .../src/graphql/enum/TransactionErrorType.ts | 1 + .../src/graphql/input/AddCommunityDraft.ts | 20 - .../src/graphql/input/AddUserDraft.ts | 20 - .../src/graphql/input/TransactionDraft.ts | 23 +- .../src/graphql/input/UserIdentifier.ts | 19 + .../src/graphql/model/TransactionError.ts | 6 +- .../src/graphql/model/TransactionResult.ts | 4 +- .../resolver/TransactionsResolver.test.ts | 93 +- .../graphql/resolver/TransactionsResolver.ts | 5 +- dlt-connector/src/graphql/scalar/Decimal.ts | 2 +- dlt-connector/src/graphql/schema.ts | 8 + dlt-connector/src/graphql/validator | 1 - .../src/graphql/validator/DateString.ts | 8 +- .../src/graphql/validator/Decimal.ts | 4 +- .../src/proto/3_3/GradidoCreation.test.ts | 20 + .../src/proto/3_3/GradidoCreation.ts | 10 +- dlt-connector/src/proto/3_3/Timestamp.test.ts | 16 + .../src/proto/3_3/TimestampSeconds.test.ts | 14 + .../src/proto/3_3/TransactionBody.test.ts | 39 - .../src/proto/3_3/TransactionBody.ts | 2 +- dlt-connector/src/proto/3_3/TransferAmount.ts | 1 - dlt-connector/tsconfig.json | 1 + dlt-connector/yarn.lock | 972 ++++++++---------- docker-compose.yml | 4 +- 37 files changed, 842 insertions(+), 708 deletions(-) delete mode 120000 common/src/graphql/validator/validator delete mode 100644 dlt-connector/src/controller/Community.ts create mode 100644 dlt-connector/src/controller/TransactionBody.test.ts delete mode 100644 dlt-connector/src/graphql/arg/User.ts delete mode 100644 dlt-connector/src/graphql/input/AddCommunityDraft.ts delete mode 100644 dlt-connector/src/graphql/input/AddUserDraft.ts create mode 100644 dlt-connector/src/graphql/input/UserIdentifier.ts delete mode 120000 dlt-connector/src/graphql/validator rename {common => dlt-connector}/src/graphql/validator/DateString.ts (64%) rename {common => dlt-connector}/src/graphql/validator/Decimal.ts (86%) create mode 100644 dlt-connector/src/proto/3_3/GradidoCreation.test.ts create mode 100644 dlt-connector/src/proto/3_3/Timestamp.test.ts create mode 100644 dlt-connector/src/proto/3_3/TimestampSeconds.test.ts delete mode 100644 dlt-connector/src/proto/3_3/TransactionBody.test.ts diff --git a/backend/src/apis/DltConnectorClient.ts b/backend/src/apis/DltConnectorClient.ts index 852454220..c020d1d9f 100644 --- a/backend/src/apis/DltConnectorClient.ts +++ b/backend/src/apis/DltConnectorClient.ts @@ -80,7 +80,7 @@ export class DltConnectorClient { */ public async transmitTransaction( transaction: DbTransaction, - senderCommunityUuid: string, + senderCommunityUuid = '', recipientCommunityUuid = '', ): Promise { const typeString = getTransactionTypeString(transaction.typeId) diff --git a/backend/src/graphql/resolver/util/sendTransactionsToDltConnector.test.ts b/backend/src/graphql/resolver/util/sendTransactionsToDltConnector.test.ts index 0e0f0a810..d9a2da569 100644 --- a/backend/src/graphql/resolver/util/sendTransactionsToDltConnector.test.ts +++ b/backend/src/graphql/resolver/util/sendTransactionsToDltConnector.test.ts @@ -6,6 +6,7 @@ /* eslint-disable @typescript-eslint/explicit-module-boundary-types */ import { Connection } from '@dbTools/typeorm' +import { Community } from '@entity/Community' import { DltTransaction } from '@entity/DltTransaction' import { Transaction } from '@entity/Transaction' import { ApolloServerTestClient } from 'apollo-server-testing' @@ -14,6 +15,7 @@ import { Decimal } from 'decimal.js-light' // import { Response } from 'graphql-request/dist/types' import { GraphQLClient } from 'graphql-request' import { Response } from 'graphql-request/dist/types' +import { v4 as uuidv4 } from 'uuid' import { testEnvironment, cleanDB } from '@test/helpers' import { logger, i18n as localization } from '@test/testSetup' @@ -80,6 +82,16 @@ let testEnv: { } */ +async function createHomeCommunity(): Promise { + const homeCommunity = Community.create() + homeCommunity.foreign = false + homeCommunity.communityUuid = uuidv4() + homeCommunity.url = 'localhost' + homeCommunity.publicKey = Buffer.from('0x6e6a6c6d6feffe', 'hex') + await Community.save(homeCommunity) + return homeCommunity +} + async function createTxCREATION1(verified: boolean): Promise { let tx = Transaction.create() tx.amount = new Decimal(1000) @@ -358,9 +370,10 @@ describe('create and send Transactions to DltConnector', () => { txCREATION1 = await createTxCREATION1(false) txCREATION2 = await createTxCREATION2(false) txCREATION3 = await createTxCREATION3(false) + await createHomeCommunity() CONFIG.DLT_CONNECTOR = false - await sendTransactionsToDltConnector('senderCommunityUuid') + await sendTransactionsToDltConnector() expect(logger.info).toBeCalledWith('sendTransactionsToDltConnector...') // Find the previous created transactions of sendCoin mutation @@ -413,6 +426,7 @@ describe('create and send Transactions to DltConnector', () => { txCREATION1 = await createTxCREATION1(false) txCREATION2 = await createTxCREATION2(false) txCREATION3 = await createTxCREATION3(false) + await createHomeCommunity() CONFIG.DLT_CONNECTOR = true @@ -429,7 +443,7 @@ describe('create and send Transactions to DltConnector', () => { } as Response }) - await sendTransactionsToDltConnector('senderCommunityUuid') + await sendTransactionsToDltConnector() expect(logger.info).toBeCalledWith('sendTransactionsToDltConnector...') @@ -481,6 +495,7 @@ describe('create and send Transactions to DltConnector', () => { txCREATION1 = await createTxCREATION1(true) txCREATION2 = await createTxCREATION2(true) txCREATION3 = await createTxCREATION3(true) + await createHomeCommunity() txSEND1to2 = await createTxSend1ToReceive2(false) txRECEIVE2From1 = await createTxReceive2FromSend1(false) @@ -507,7 +522,7 @@ describe('create and send Transactions to DltConnector', () => { } as Response }) - await sendTransactionsToDltConnector('senderCommunityUuid') + await sendTransactionsToDltConnector() expect(logger.info).toBeCalledWith('sendTransactionsToDltConnector...') diff --git a/backend/src/graphql/resolver/util/sendTransactionsToDltConnector.ts b/backend/src/graphql/resolver/util/sendTransactionsToDltConnector.ts index 2e3211378..93280dbd6 100644 --- a/backend/src/graphql/resolver/util/sendTransactionsToDltConnector.ts +++ b/backend/src/graphql/resolver/util/sendTransactionsToDltConnector.ts @@ -6,10 +6,9 @@ import { DltConnectorClient } from '@/apis/DltConnectorClient' import { backendLogger as logger } from '@/server/logger' import { Monitor, MonitorNames } from '@/util/Monitor' -export async function sendTransactionsToDltConnector( - senderCommunityUuid: string, - recipientCommunityUuid = '', -): Promise { +import { getHomeCommunityUuid } from './communities' + +export async function sendTransactionsToDltConnector(): Promise { logger.info('sendTransactionsToDltConnector...') // check if this logic is still occupied, no concurrecy allowed if (!Monitor.isLocked(MonitorNames.SEND_DLT_TRANSACTIONS)) { @@ -19,6 +18,9 @@ export async function sendTransactionsToDltConnector( try { await createDltTransactions() const dltConnector = DltConnectorClient.getInstance() + // TODO: get actual communities from users + const senderCommunityUuid = await getHomeCommunityUuid() + const recipientCommunityUuid = '' if (dltConnector) { logger.debug('with sending to DltConnector...') const dltTransactions = await DltTransaction.find({ @@ -26,6 +28,7 @@ export async function sendTransactionsToDltConnector( relations: ['transaction'], order: { createdAt: 'ASC', id: 'ASC' }, }) + for (const dltTx of dltTransactions) { if (!dltTx.transaction) { continue diff --git a/common/src/graphql/validator/validator b/common/src/graphql/validator/validator deleted file mode 120000 index cc34f673a..000000000 --- a/common/src/graphql/validator/validator +++ /dev/null @@ -1 +0,0 @@ -validator \ No newline at end of file diff --git a/dlt-connector/.env.dist b/dlt-connector/.env.dist index 96867eebb..ce2ac92c1 100644 --- a/dlt-connector/.env.dist +++ b/dlt-connector/.env.dist @@ -9,4 +9,4 @@ IOTA_API_URL=https://chrysalis-nodes.iota.org IOTA_COMMUNITY_ALIAS=GRADIDO: TestHelloWelt2 # DLT-Connector -DLT_CONNECTOR_PORT=6000 \ No newline at end of file +DLT_CONNECTOR_PORT=6010 \ No newline at end of file diff --git a/dlt-connector/Dockerfile b/dlt-connector/Dockerfile index 6e5e628f7..d99758df9 100644 --- a/dlt-connector/Dockerfile +++ b/dlt-connector/Dockerfile @@ -16,7 +16,7 @@ ENV BUILD_COMMIT="0000000" ## SET NODE_ENV ENV NODE_ENV="production" ## App relevant Envs -ENV PORT="6000" +ENV PORT="6010" # Labels LABEL org.label-schema.build-date="${BUILD_DATE}" diff --git a/dlt-connector/jest.config.js b/dlt-connector/jest.config.js index 45bee507e..a1f4688dd 100644 --- a/dlt-connector/jest.config.js +++ b/dlt-connector/jest.config.js @@ -6,7 +6,7 @@ module.exports = { collectCoverageFrom: ['src/**/*.ts', '!**/node_modules/**', '!src/seeds/**', '!build/**'], coverageThreshold: { global: { - lines: 63, + lines: 77, }, }, setupFiles: ['/test/testSetup.ts'], @@ -14,6 +14,8 @@ module.exports = { modulePathIgnorePatterns: ['/build/'], moduleNameMapper: { '@/(.*)': '/src/$1', + '@arg/(.*)': '/src/graphql/arg/$1', + '@controller/(.*)': '/src/controller/$1', '@enum/(.*)': '/src/graphql/enum/$1', '@resolver/(.*)': '/src/graphql/resolver/$1', '@input/(.*)': '/src/graphql/input/$1', @@ -30,6 +32,7 @@ module.exports = { process.env.NODE_ENV === 'development' ? '/../database/src/$1' : '/../database/build/src/$1', + '@validator/(.*)': '/src/graphql/validator/$1', }, } /* diff --git a/dlt-connector/src/config/index.ts b/dlt-connector/src/config/index.ts index be0d4b7da..02cf07fcf 100644 --- a/dlt-connector/src/config/index.ts +++ b/dlt-connector/src/config/index.ts @@ -23,7 +23,7 @@ const iota = { } const dltConnector = { - DLT_CONNECTOR_PORT: process.env.DLT_CONNECTOR_PORT || 6000, + DLT_CONNECTOR_PORT: process.env.DLT_CONNECTOR_PORT || 6010, } // Check config version diff --git a/dlt-connector/src/controller/Community.ts b/dlt-connector/src/controller/Community.ts deleted file mode 100644 index ff6d43012..000000000 --- a/dlt-connector/src/controller/Community.ts +++ /dev/null @@ -1,3 +0,0 @@ -export class Community { - -} \ No newline at end of file diff --git a/dlt-connector/src/controller/TransactionBody.test.ts b/dlt-connector/src/controller/TransactionBody.test.ts new file mode 100644 index 000000000..eac613ab7 --- /dev/null +++ b/dlt-connector/src/controller/TransactionBody.test.ts @@ -0,0 +1,162 @@ +import 'reflect-metadata' +import { TransactionDraft } from '@/graphql/input/TransactionDraft' +import { create, determineCrossGroupType, determineOtherGroup } from './TransactionBody' +import { UserIdentifier } from '@/graphql/input/UserIdentifier' +import { TransactionError } from '@/graphql/model/TransactionError' +import { TransactionErrorType } from '@/graphql/enum/TransactionErrorType' +import { CrossGroupType } from '@/graphql/enum/CrossGroupType' +import { TransactionType } from '@/graphql/enum/TransactionType' +import Decimal from 'decimal.js-light' + +describe('test controller/TransactionBody', () => { + describe('test create ', () => { + const senderUser = new UserIdentifier() + const recipientUser = new UserIdentifier() + it('test with contribution transaction', () => { + const transactionDraft = new TransactionDraft() + transactionDraft.senderUser = senderUser + transactionDraft.recipientUser = recipientUser + transactionDraft.type = TransactionType.CREATION + transactionDraft.amount = new Decimal(1000) + transactionDraft.createdAt = '2022-01-02T19:10:34.121' + transactionDraft.targetDate = '2021-12-01T10:05:00.191' + const body = create(transactionDraft) + + expect(body.creation).toBeDefined() + expect(body).toMatchObject({ + createdAt: { + seconds: 1641150634, + nanoSeconds: 121000000, + }, + versionNumber: '3.3', + type: CrossGroupType.LOCAL, + otherGroup: '', + creation: { + recipient: { + amount: '1000', + }, + targetDate: { + seconds: 1638353100, + }, + }, + }) + }) + it('test with local send transaction send part', () => { + const transactionDraft = new TransactionDraft() + transactionDraft.senderUser = senderUser + transactionDraft.recipientUser = recipientUser + transactionDraft.type = TransactionType.SEND + transactionDraft.amount = new Decimal(1000) + transactionDraft.createdAt = '2022-01-02T19:10:34.121' + const body = create(transactionDraft) + + expect(body.transfer).toBeDefined() + expect(body).toMatchObject({ + createdAt: { + seconds: 1641150634, + nanoSeconds: 121000000, + }, + versionNumber: '3.3', + type: CrossGroupType.LOCAL, + otherGroup: '', + transfer: { + sender: { + amount: '1000', + }, + }, + }) + }) + + it('test with local send transaction receive part', () => { + const transactionDraft = new TransactionDraft() + transactionDraft.senderUser = senderUser + transactionDraft.recipientUser = recipientUser + transactionDraft.type = TransactionType.RECEIVE + transactionDraft.amount = new Decimal(1000) + transactionDraft.createdAt = '2022-01-02T19:10:34.121' + const body = create(transactionDraft) + + expect(body.transfer).toBeDefined() + expect(body).toMatchObject({ + createdAt: { + seconds: 1641150634, + nanoSeconds: 121000000, + }, + versionNumber: '3.3', + type: CrossGroupType.LOCAL, + otherGroup: '', + transfer: { + sender: { + amount: '1000', + }, + }, + }) + }) + }) + describe('test determineCrossGroupType', () => { + const transactionDraft = new TransactionDraft() + transactionDraft.senderUser = new UserIdentifier() + transactionDraft.recipientUser = new UserIdentifier() + + it('local transaction', () => { + expect(determineCrossGroupType(transactionDraft)).toEqual(CrossGroupType.LOCAL) + }) + + it('test with with invalid input', () => { + transactionDraft.recipientUser.communityUuid = 'a72a4a4a-aa12-4f6c-b3d8-7cc65c67e24a' + expect(() => determineCrossGroupType(transactionDraft)).toThrow( + new TransactionError( + TransactionErrorType.NOT_IMPLEMENTED_YET, + 'cannot determine CrossGroupType', + ), + ) + }) + + it('inbound transaction (send to sender community)', () => { + transactionDraft.type = TransactionType.SEND + expect(determineCrossGroupType(transactionDraft)).toEqual(CrossGroupType.INBOUND) + }) + + it('outbound transaction (send to recipient community)', () => { + transactionDraft.type = TransactionType.RECEIVE + expect(determineCrossGroupType(transactionDraft)).toEqual(CrossGroupType.OUTBOUND) + }) + }) + + describe('test determineOtherGroup', () => { + const transactionDraft = new TransactionDraft() + transactionDraft.senderUser = new UserIdentifier() + transactionDraft.recipientUser = new UserIdentifier() + + it('for inbound transaction, other group is from recipient, missing community id for recipient', () => { + expect(() => determineOtherGroup(CrossGroupType.INBOUND, transactionDraft)).toThrowError( + new TransactionError( + TransactionErrorType.MISSING_PARAMETER, + 'missing recipient user community id for cross group transaction', + ), + ) + }) + it('for inbound transaction, other group is from recipient', () => { + transactionDraft.recipientUser.communityUuid = 'b8e9f00a-5a56-4b23-8c44-6823ac9e0d2d' + expect(determineOtherGroup(CrossGroupType.INBOUND, transactionDraft)).toEqual( + 'b8e9f00a-5a56-4b23-8c44-6823ac9e0d2d', + ) + }) + + it('for outbound transaction, other group is from sender, missing community id for sender', () => { + expect(() => determineOtherGroup(CrossGroupType.OUTBOUND, transactionDraft)).toThrowError( + new TransactionError( + TransactionErrorType.MISSING_PARAMETER, + 'missing sender user community id for cross group transaction', + ), + ) + }) + + it('for outbound transaction, other group is from sender', () => { + transactionDraft.senderUser.communityUuid = 'a72a4a4a-aa12-4f6c-b3d8-7cc65c67e24a' + expect(determineOtherGroup(CrossGroupType.OUTBOUND, transactionDraft)).toEqual( + 'a72a4a4a-aa12-4f6c-b3d8-7cc65c67e24a', + ) + }) + }) +}) diff --git a/dlt-connector/src/controller/TransactionBody.ts b/dlt-connector/src/controller/TransactionBody.ts index e5141277d..4da53a5af 100644 --- a/dlt-connector/src/controller/TransactionBody.ts +++ b/dlt-connector/src/controller/TransactionBody.ts @@ -16,18 +16,10 @@ export const create = (transaction: TransactionDraft): TransactionBody => { body.data = 'gradidoCreation' break case TransactionType.SEND: - body.transfer = new GradidoTransfer(transaction) - body.data = 'gradidoTransfer' - break case TransactionType.RECEIVE: body.transfer = new GradidoTransfer(transaction) body.data = 'gradidoTransfer' break - default: - throw new TransactionError( - TransactionErrorType.NOT_IMPLEMENTED_YET, - 'transaction type unknown', - ) } return body } @@ -62,13 +54,20 @@ export const determineOtherGroup = ( case CrossGroupType.LOCAL: return '' case CrossGroupType.INBOUND: + if (!recipientUser.communityUuid) { + throw new TransactionError( + TransactionErrorType.MISSING_PARAMETER, + 'missing recipient user community id for cross group transaction', + ) + } return recipientUser.communityUuid case CrossGroupType.OUTBOUND: + if (!senderUser.communityUuid) { + throw new TransactionError( + TransactionErrorType.MISSING_PARAMETER, + 'missing sender user community id for cross group transaction', + ) + } return senderUser.communityUuid - default: - throw new TransactionError( - TransactionErrorType.NOT_IMPLEMENTED_YET, - type.toString() + ' for enum CrossGroupType not implemented yet', - ) } } diff --git a/dlt-connector/src/graphql/arg/User.ts b/dlt-connector/src/graphql/arg/User.ts deleted file mode 100644 index 5175e3d78..000000000 --- a/dlt-connector/src/graphql/arg/User.ts +++ /dev/null @@ -1,19 +0,0 @@ -// https://www.npmjs.com/package/@apollo/protobufjs - -import { IsPositive, IsUUID } from 'class-validator' -import { Field, Int, ArgsType } from 'type-graphql' - -@ArgsType() -export class User { - @Field(() => String) - @IsUUID('4') - uuid: string - - @Field(() => String) - @IsUUID('4') - communityUuid: string - - @Field(() => Int, { defaultValue: 1 }) - @IsPositive() - accountNr: number -} diff --git a/dlt-connector/src/graphql/enum/CrossGroupType.ts b/dlt-connector/src/graphql/enum/CrossGroupType.ts index 921ae4eed..13e968509 100644 --- a/dlt-connector/src/graphql/enum/CrossGroupType.ts +++ b/dlt-connector/src/graphql/enum/CrossGroupType.ts @@ -3,5 +3,5 @@ export enum CrossGroupType { INBOUND = 1, OUTBOUND = 2, // for cross group transaction which haven't a direction like group friend update - CROSS = 3, + // CROSS = 3, } diff --git a/dlt-connector/src/graphql/enum/TransactionErrorType.ts b/dlt-connector/src/graphql/enum/TransactionErrorType.ts index 6977c34a8..c08c307e8 100644 --- a/dlt-connector/src/graphql/enum/TransactionErrorType.ts +++ b/dlt-connector/src/graphql/enum/TransactionErrorType.ts @@ -2,6 +2,7 @@ import { registerEnumType } from 'type-graphql' export enum TransactionErrorType { NOT_IMPLEMENTED_YET = 'Not Implemented yet', + MISSING_PARAMETER = 'Missing parameter', } registerEnumType(TransactionErrorType, { diff --git a/dlt-connector/src/graphql/input/AddCommunityDraft.ts b/dlt-connector/src/graphql/input/AddCommunityDraft.ts deleted file mode 100644 index f967019b3..000000000 --- a/dlt-connector/src/graphql/input/AddCommunityDraft.ts +++ /dev/null @@ -1,20 +0,0 @@ -// https://www.npmjs.com/package/@apollo/protobufjs -import { InputType, Field } from 'type-graphql' - -import { isValidDateString } from '../validator/DateString' -import { IsBoolean, IsUUID } from 'class-validator' - -@InputType() -export class AddCommunityDraft { - @Field(() => String) - @IsUUID('4') - communityUuid: string - - @Field(() => String) - @isValidDateString() - createdAt: string - - @Field(() => Boolean) - @IsBoolean() - foreign: boolean -} diff --git a/dlt-connector/src/graphql/input/AddUserDraft.ts b/dlt-connector/src/graphql/input/AddUserDraft.ts deleted file mode 100644 index 5c6705375..000000000 --- a/dlt-connector/src/graphql/input/AddUserDraft.ts +++ /dev/null @@ -1,20 +0,0 @@ -// https://www.npmjs.com/package/@apollo/protobufjs - -import { IsUUID } from 'class-validator' -import { isValidDateString } from '../validator/DateString' -import { InputType, Field } from 'type-graphql' - -@InputType() -export class AddUserDraft { - @Field(() => String) - @IsUUID('4') - uuid: string - - @Field(() => String) - @IsUUID('4') - communityUuid: string - - @Field(() => String) - @isValidDateString() - createdAt: string -} diff --git a/dlt-connector/src/graphql/input/TransactionDraft.ts b/dlt-connector/src/graphql/input/TransactionDraft.ts index 22da79d4a..1e8819e51 100755 --- a/dlt-connector/src/graphql/input/TransactionDraft.ts +++ b/dlt-connector/src/graphql/input/TransactionDraft.ts @@ -3,22 +3,22 @@ import { Decimal } from 'decimal.js-light' import { TransactionType } from '@enum/TransactionType' import { InputType, Field } from 'type-graphql' -import { User } from '@arg/User' -import { isValidDateString } from '../validator/DateString' -import { IsPositiveDecimal } from '../validator/Decimal' -import { IsEnum, IsObject, ValidateNested, IsNumber, Min } from 'class-validator' +import { UserIdentifier } from './UserIdentifier' +import { isValidDateString } from '@validator/DateString' +import { IsPositiveDecimal } from '@validator/Decimal' +import { IsEnum, IsObject, ValidateNested } from 'class-validator' @InputType() export class TransactionDraft { - @Field(() => User) + @Field(() => UserIdentifier) @IsObject() @ValidateNested() - senderUser: User + senderUser: UserIdentifier - @Field(() => User) + @Field(() => UserIdentifier) @IsObject() @ValidateNested() - recipientUser: User + recipientUser: UserIdentifier @Field(() => Decimal) @IsPositiveDecimal() @@ -28,10 +28,9 @@ export class TransactionDraft { @IsEnum(TransactionType) type: TransactionType - @Field(() => Number) - @IsNumber() - @Min(9783072000000) // 01.01.2001 - createdAt: number // in milliseconds + @Field(() => String) + @isValidDateString() + createdAt: string // in milliseconds // only for creation transactions @Field(() => String, { nullable: true }) diff --git a/dlt-connector/src/graphql/input/UserIdentifier.ts b/dlt-connector/src/graphql/input/UserIdentifier.ts new file mode 100644 index 000000000..12f2e5889 --- /dev/null +++ b/dlt-connector/src/graphql/input/UserIdentifier.ts @@ -0,0 +1,19 @@ +// https://www.npmjs.com/package/@apollo/protobufjs + +import { IsPositive, IsUUID } from 'class-validator' +import { Field, Int, InputType } from 'type-graphql' + +@InputType() +export class UserIdentifier { + @Field(() => String) + @IsUUID('4') + uuid: string + + @Field(() => String, { nullable: true }) + @IsUUID('4') + communityUuid?: string + + @Field(() => Int, { defaultValue: 1, nullable: true }) + @IsPositive() + accountNr?: number +} diff --git a/dlt-connector/src/graphql/model/TransactionError.ts b/dlt-connector/src/graphql/model/TransactionError.ts index be2743239..891ad2a89 100644 --- a/dlt-connector/src/graphql/model/TransactionError.ts +++ b/dlt-connector/src/graphql/model/TransactionError.ts @@ -2,10 +2,11 @@ import { ObjectType, Field } from 'type-graphql' import { TransactionErrorType } from '../enum/TransactionErrorType' @ObjectType() -export class TransactionError { +export class TransactionError implements Error { constructor(type: TransactionErrorType, message: string) { this.type = type this.message = message + this.name = type.toString() } @Field(() => TransactionErrorType) @@ -13,4 +14,7 @@ export class TransactionError { @Field(() => String) message: string + + @Field(() => String) + name: string } diff --git a/dlt-connector/src/graphql/model/TransactionResult.ts b/dlt-connector/src/graphql/model/TransactionResult.ts index 6be3a8b1e..ce75bb30a 100644 --- a/dlt-connector/src/graphql/model/TransactionResult.ts +++ b/dlt-connector/src/graphql/model/TransactionResult.ts @@ -3,11 +3,9 @@ import { TransactionError } from './TransactionError' @ObjectType() export class TransactionResult { - constructor(content: TransactionError | Buffer | string) { + constructor(content: TransactionError | string) { if (content instanceof TransactionError) { this.error = content - } else if (content instanceof Buffer) { - this.messageId = content.toString('hex') } else if (typeof content === 'string') { this.messageId = content } diff --git a/dlt-connector/src/graphql/resolver/TransactionsResolver.test.ts b/dlt-connector/src/graphql/resolver/TransactionsResolver.test.ts index 0e54fa660..7c02a4306 100644 --- a/dlt-connector/src/graphql/resolver/TransactionsResolver.test.ts +++ b/dlt-connector/src/graphql/resolver/TransactionsResolver.test.ts @@ -2,6 +2,9 @@ import 'reflect-metadata' import { ApolloServer } from '@apollo/server' import { createApolloTestServer } from '@test/ApolloServerMock' import assert from 'assert' +import { TransactionResult } from '../model/TransactionResult' + +let apolloTestServer: ApolloServer jest.mock('@/client/IotaClient', () => { return { @@ -11,8 +14,6 @@ jest.mock('@/client/IotaClient', () => { } }) -let apolloTestServer: ApolloServer - describe('Transaction Resolver Test', () => { beforeAll(async () => { apolloTestServer = await createApolloTestServer() @@ -31,30 +32,45 @@ describe('Transaction Resolver Test', () => { }) it('test mocked sendTransaction', async () => { const response = await apolloTestServer.executeOperation({ - query: 'mutation ($input: TransactionInput!) { sendTransaction(data: $input) }', + query: + 'mutation ($input: TransactionDraft!) { sendTransaction(data: $input) {error {type, message}, messageId} }', variables: { input: { + senderUser: { + uuid: '0ec72b74-48c2-446f-91ce-31ad7d9f4d65', + }, + recipientUser: { + uuid: 'ddc8258e-fcb5-4e48-8d1d-3a07ec371dbe', + }, type: 'SEND', amount: '10', - createdAt: 1688992436, + createdAt: '2012-04-17T17:12:00Z', }, }, }) assert(response.body.kind === 'single') expect(response.body.singleResult.errors).toBeUndefined() - expect(response.body.singleResult.data?.sendTransaction).toBe( + const transactionResult = response.body.singleResult.data?.sendTransaction as TransactionResult + expect(transactionResult.messageId).toBe( '5498130bc3918e1a7143969ce05805502417e3e1bd596d3c44d6a0adeea22710', ) }) it('test mocked sendTransaction invalid transactionType ', async () => { const response = await apolloTestServer.executeOperation({ - query: 'mutation ($input: TransactionInput!) { sendTransaction(data: $input) }', + query: + 'mutation ($input: TransactionDraft!) { sendTransaction(data: $input) {error {type, message}, messageId} }', variables: { input: { + senderUser: { + uuid: '0ec72b74-48c2-446f-91ce-31ad7d9f4d65', + }, + recipientUser: { + uuid: 'ddc8258e-fcb5-4e48-8d1d-3a07ec371dbe', + }, type: 'INVALID', amount: '10', - createdAt: 1688992436, + createdAt: '2012-04-17T17:12:00Z', }, }, }) @@ -71,12 +87,19 @@ describe('Transaction Resolver Test', () => { it('test mocked sendTransaction invalid amount ', async () => { const response = await apolloTestServer.executeOperation({ - query: 'mutation ($input: TransactionInput!) { sendTransaction(data: $input) }', + query: + 'mutation ($input: TransactionDraft!) { sendTransaction(data: $input) {error {type, message}, messageId} }', variables: { input: { + senderUser: { + uuid: '0ec72b74-48c2-446f-91ce-31ad7d9f4d65', + }, + recipientUser: { + uuid: 'ddc8258e-fcb5-4e48-8d1d-3a07ec371dbe', + }, type: 'SEND', amount: 'no number', - createdAt: 1688992436, + createdAt: '2012-04-17T17:12:00Z', }, }, }) @@ -93,12 +116,19 @@ describe('Transaction Resolver Test', () => { it('test mocked sendTransaction invalid created date ', async () => { const response = await apolloTestServer.executeOperation({ - query: 'mutation ($input: TransactionInput!) { sendTransaction(data: $input) }', + query: + 'mutation ($input: TransactionDraft!) { sendTransaction(data: $input) {error {type, message}, messageId} }', variables: { input: { + senderUser: { + uuid: '0ec72b74-48c2-446f-91ce-31ad7d9f4d65', + }, + recipientUser: { + uuid: 'ddc8258e-fcb5-4e48-8d1d-3a07ec371dbe', + }, type: 'SEND', amount: '10', - createdAt: '2023-03-02T10:12:00', + createdAt: 'not valid', }, }, }) @@ -106,10 +136,47 @@ describe('Transaction Resolver Test', () => { expect(response.body.singleResult).toMatchObject({ errors: [ { - message: - 'Variable "$input" got invalid value "2023-03-02T10:12:00" at "input.createdAt"; Float cannot represent non numeric value: "2023-03-02T10:12:00"', + message: 'Argument Validation Error', + extensions: { + code: 'BAD_USER_INPUT', + validationErrors: [ + { + value: 'not valid', + property: 'createdAt', + constraints: { + isValidDateString: 'createdAt must be a valid date string', + }, + }, + ], + }, }, ], }) }) + it('test mocked sendTransaction missing creationDate for contribution', async () => { + const response = await apolloTestServer.executeOperation({ + query: + 'mutation ($input: TransactionDraft!) { sendTransaction(data: $input) {error {type, message}, messageId} }', + variables: { + input: { + senderUser: { + uuid: '0ec72b74-48c2-446f-91ce-31ad7d9f4d65', + }, + recipientUser: { + uuid: 'ddc8258e-fcb5-4e48-8d1d-3a07ec371dbe', + }, + type: 'CREATION', + amount: '10', + createdAt: '2012-04-17T17:12:00Z', + }, + }, + }) + assert(response.body.kind === 'single') + expect(response.body.singleResult.data?.sendTransaction).toMatchObject({ + error: { + type: 'MISSING_PARAMETER', + message: 'missing targetDate for contribution', + }, + }) + }) }) diff --git a/dlt-connector/src/graphql/resolver/TransactionsResolver.ts b/dlt-connector/src/graphql/resolver/TransactionsResolver.ts index e9b034d76..282eb11cd 100755 --- a/dlt-connector/src/graphql/resolver/TransactionsResolver.ts +++ b/dlt-connector/src/graphql/resolver/TransactionsResolver.ts @@ -23,7 +23,7 @@ export class TransactionResolver { return '0.1' } - @Mutation(() => String) + @Mutation(() => TransactionResult) async sendTransaction( @Arg('data') transaction: TransactionDraft, @@ -37,8 +37,9 @@ export class TransactionResolver { } catch (error) { if (error instanceof TransactionError) { return new TransactionResult(error) + } else { + throw error } - throw error } } } diff --git a/dlt-connector/src/graphql/scalar/Decimal.ts b/dlt-connector/src/graphql/scalar/Decimal.ts index 5046488e5..b343f383a 100755 --- a/dlt-connector/src/graphql/scalar/Decimal.ts +++ b/dlt-connector/src/graphql/scalar/Decimal.ts @@ -2,7 +2,7 @@ import { Decimal } from 'decimal.js-light' import { GraphQLScalarType, Kind, ValueNode } from 'graphql' -export const DecimalScalar = new GraphQLScalarType({ +export const DecimalScalar = new GraphQLScalarType({ name: 'Decimal', description: 'The `Decimal` scalar type to represent currency values', diff --git a/dlt-connector/src/graphql/schema.ts b/dlt-connector/src/graphql/schema.ts index 84951f360..eb3b3024c 100755 --- a/dlt-connector/src/graphql/schema.ts +++ b/dlt-connector/src/graphql/schema.ts @@ -9,5 +9,13 @@ export const schema = async (): Promise => { return buildSchema({ resolvers: [TransactionResolver], scalarsMap: [{ type: Decimal, scalar: DecimalScalar }], + validate: { + validationError: { target: false }, + skipMissingProperties: true, + skipNullProperties: true, + skipUndefinedProperties: false, + forbidUnknownValues: true, + stopAtFirstError: true, + }, }) } diff --git a/dlt-connector/src/graphql/validator b/dlt-connector/src/graphql/validator deleted file mode 120000 index 7268ccb05..000000000 --- a/dlt-connector/src/graphql/validator +++ /dev/null @@ -1 +0,0 @@ -../../../common/src/graphql/validator \ No newline at end of file diff --git a/common/src/graphql/validator/DateString.ts b/dlt-connector/src/graphql/validator/DateString.ts similarity index 64% rename from common/src/graphql/validator/DateString.ts rename to dlt-connector/src/graphql/validator/DateString.ts index 4ee23b51a..300841b31 100644 --- a/common/src/graphql/validator/DateString.ts +++ b/dlt-connector/src/graphql/validator/DateString.ts @@ -1,4 +1,4 @@ -import { registerDecorator, ValidationOptions, ValidationArguments } from 'class-validator' +import { registerDecorator, ValidationOptions } from 'class-validator' export function isValidDateString(validationOptions?: ValidationOptions) { // eslint-disable-next-line @typescript-eslint/ban-types @@ -9,11 +9,11 @@ export function isValidDateString(validationOptions?: ValidationOptions) { propertyName, options: validationOptions, validator: { - validate(value: string) { + validate(value: string): boolean { return new Date(value).toString() !== 'Invalid Date' }, - defaultMessage(args: ValidationArguments) { - return `${propertyName} must be a valid date string, ${args.property}` + defaultMessage(): string { + return `${propertyName} must be a valid date string` }, }, }) diff --git a/common/src/graphql/validator/Decimal.ts b/dlt-connector/src/graphql/validator/Decimal.ts similarity index 86% rename from common/src/graphql/validator/Decimal.ts rename to dlt-connector/src/graphql/validator/Decimal.ts index 09e8fb4bd..fd2604514 100644 --- a/common/src/graphql/validator/Decimal.ts +++ b/dlt-connector/src/graphql/validator/Decimal.ts @@ -10,10 +10,10 @@ export function IsPositiveDecimal(validationOptions?: ValidationOptions) { propertyName, options: validationOptions, validator: { - validate(value: Decimal) { + validate(value: Decimal): boolean { return value.greaterThan(0) }, - defaultMessage(args: ValidationArguments) { + defaultMessage(args: ValidationArguments): string { return `The ${propertyName} must be a positive value ${args.property}` }, }, diff --git a/dlt-connector/src/proto/3_3/GradidoCreation.test.ts b/dlt-connector/src/proto/3_3/GradidoCreation.test.ts new file mode 100644 index 000000000..8b3fd1b3f --- /dev/null +++ b/dlt-connector/src/proto/3_3/GradidoCreation.test.ts @@ -0,0 +1,20 @@ +import 'reflect-metadata' +import { TransactionDraft } from '@/graphql/input/TransactionDraft' +import { GradidoCreation } from './GradidoCreation' +import { TransactionError } from '@/graphql/model/TransactionError' +import { TransactionErrorType } from '@enum/TransactionErrorType' + +describe('proto/3.3/GradidoCreation', () => { + it('test with missing targetDate', () => { + const transactionDraft = new TransactionDraft() + expect(() => { + // eslint-disable-next-line no-new + new GradidoCreation(transactionDraft) + }).toThrowError( + new TransactionError( + TransactionErrorType.MISSING_PARAMETER, + 'missing targetDate for contribution', + ), + ) + }) +}) diff --git a/dlt-connector/src/proto/3_3/GradidoCreation.ts b/dlt-connector/src/proto/3_3/GradidoCreation.ts index a54cb6169..ba6e93652 100644 --- a/dlt-connector/src/proto/3_3/GradidoCreation.ts +++ b/dlt-connector/src/proto/3_3/GradidoCreation.ts @@ -3,6 +3,8 @@ import { Field, Message } from '@apollo/protobufjs' import { TimestampSeconds } from './TimestampSeconds' import { TransferAmount } from './TransferAmount' import { TransactionDraft } from '@/graphql/input/TransactionDraft' +import { TransactionError } from '@/graphql/model/TransactionError' +import { TransactionErrorType } from '@/graphql/enum/TransactionErrorType' // need signature from group admin or // percent of group users another than the receiver @@ -10,9 +12,15 @@ import { TransactionDraft } from '@/graphql/input/TransactionDraft' // eslint-disable-next-line no-use-before-define export class GradidoCreation extends Message { constructor(transaction: TransactionDraft) { + if (!transaction.targetDate) { + throw new TransactionError( + TransactionErrorType.MISSING_PARAMETER, + 'missing targetDate for contribution', + ) + } super({ recipient: new TransferAmount({ amount: transaction.amount.toString() }), - targetDate: new TimestampSeconds(), + targetDate: new TimestampSeconds(new Date(transaction.targetDate)), }) } diff --git a/dlt-connector/src/proto/3_3/Timestamp.test.ts b/dlt-connector/src/proto/3_3/Timestamp.test.ts new file mode 100644 index 000000000..39f6fd2c8 --- /dev/null +++ b/dlt-connector/src/proto/3_3/Timestamp.test.ts @@ -0,0 +1,16 @@ +import { Timestamp } from './Timestamp' + +describe('test timestamp constructor', () => { + it('with date input object', () => { + const now = new Date('2011-04-17T12:01:10.109') + const timestamp = new Timestamp(now) + expect(timestamp.seconds).toEqual(1303041670) + expect(timestamp.nanoSeconds).toEqual(109000000) + }) + + it('with milliseconds number input', () => { + const timestamp = new Timestamp(1303041670109) + expect(timestamp.seconds).toEqual(1303041670) + expect(timestamp.nanoSeconds).toEqual(109000000) + }) +}) diff --git a/dlt-connector/src/proto/3_3/TimestampSeconds.test.ts b/dlt-connector/src/proto/3_3/TimestampSeconds.test.ts new file mode 100644 index 000000000..92dc79130 --- /dev/null +++ b/dlt-connector/src/proto/3_3/TimestampSeconds.test.ts @@ -0,0 +1,14 @@ +import { TimestampSeconds } from './TimestampSeconds' + +describe('test TimestampSeconds constructor', () => { + it('with date input object', () => { + const now = new Date('2011-04-17T12:01:10.109') + const timestamp = new TimestampSeconds(now) + expect(timestamp.seconds).toEqual(1303041670) + }) + + it('with milliseconds number input', () => { + const timestamp = new TimestampSeconds(1303041670109) + expect(timestamp.seconds).toEqual(1303041670) + }) +}) diff --git a/dlt-connector/src/proto/3_3/TransactionBody.test.ts b/dlt-connector/src/proto/3_3/TransactionBody.test.ts deleted file mode 100644 index cfed31a53..000000000 --- a/dlt-connector/src/proto/3_3/TransactionBody.test.ts +++ /dev/null @@ -1,39 +0,0 @@ -import 'reflect-metadata' -import { TransactionType } from '@enum/TransactionType' -// import { TransactionInput } from '@input/TransactionInput' -import Decimal from 'decimal.js-light' -import { TransactionBody } from './TransactionBody' -import { TimestampSeconds } from './TimestampSeconds' - -describe('proto/TransactionBodyTest', () => { - it('test compatible with graphql/input/TransactionInput', async () => { - // test data - const type = TransactionType.SEND - const amount = new Decimal('10') - const createdAt = new TimestampSeconds() - createdAt.seconds = 1688992436 - - // init both objects - // graphql input object - /* const transactionInput = new TransactionInput() - transactionInput.type = type - transactionInput.amount = amount - transactionInput.createdAt = createdAt.seconds - - // protobuf object - const transactionBody = new TransactionBody() - // transactionBody.type = type - // transactionBody.amount = amount.toString() - transactionBody.createdAt = createdAt - - // create protobuf object from graphql Input object - const message = TransactionBody.fromObject(transactionInput) - // serialize both protobuf objects - const messageBuffer = TransactionBody.encode(message).finish() - const messageBuffer2 = TransactionBody.encode(transactionBody).finish() - - // compare - expect(messageBuffer).toStrictEqual(messageBuffer2) - */ - }) -}) diff --git a/dlt-connector/src/proto/3_3/TransactionBody.ts b/dlt-connector/src/proto/3_3/TransactionBody.ts index ec15d3474..9e9179b3f 100644 --- a/dlt-connector/src/proto/3_3/TransactionBody.ts +++ b/dlt-connector/src/proto/3_3/TransactionBody.ts @@ -18,7 +18,7 @@ export class TransactionBody extends Message { const type = determineCrossGroupType(transaction) super({ memo: 'Not implemented yet', - createdAt: new Timestamp(transaction.createdAt), + createdAt: new Timestamp(new Date(transaction.createdAt)), versionNumber: '3.3', type, otherGroup: determineOtherGroup(type, transaction), diff --git a/dlt-connector/src/proto/3_3/TransferAmount.ts b/dlt-connector/src/proto/3_3/TransferAmount.ts index 2abe87322..f6adc47ff 100644 --- a/dlt-connector/src/proto/3_3/TransferAmount.ts +++ b/dlt-connector/src/proto/3_3/TransferAmount.ts @@ -1,4 +1,3 @@ -import { TransactionDraft } from '@/graphql/input/TransactionDraft' import { Field, Message } from '@apollo/protobufjs' // https://www.npmjs.com/package/@apollo/protobufjs diff --git a/dlt-connector/tsconfig.json b/dlt-connector/tsconfig.json index c82548df9..8336980ec 100644 --- a/dlt-connector/tsconfig.json +++ b/dlt-connector/tsconfig.json @@ -57,6 +57,7 @@ "@test/*": ["test/*"], "@proto/*" : ["src/proto/*"], "@controller/*": ["src/controller/*"], + "@validator/*" : ["src/graphql/validator/*"] /* external */ }, // "rootDirs": [], /* List of root folders whose combined content represents the structure of the project at runtime. */ diff --git a/dlt-connector/yarn.lock b/dlt-connector/yarn.lock index 54c58c1e6..2a7a0f801 100644 --- a/dlt-connector/yarn.lock +++ b/dlt-connector/yarn.lock @@ -49,9 +49,9 @@ "@apollo/utils.logger" "^2.0.0" "@apollo/server@^4.7.5": - version "4.7.5" - resolved "https://registry.yarnpkg.com/@apollo/server/-/server-4.7.5.tgz#b3f679dd50898f55b6d11dd61efb1f05e59503b5" - integrity sha512-XobKpTnW/jbmr0DuJ+8zBzoeL6uEat4CkBN7kOCjhXEUuCNxiLrQGrWFVDqgV7bSdOJr6o2POmZYBPNQXLdyvA== + version "4.9.3" + resolved "https://registry.yarnpkg.com/@apollo/server/-/server-4.9.3.tgz#d51fa1745a7e9f3b1d687c6df40256744aaa977a" + integrity sha512-U56Sx/UmzR3Es344hQ/Ptf2EJrH+kV4ZPoLmgGjWoiwf2wYQ/pRSvkSXgjOvoyE34wSa8Gh7f92ljfLfY+6q1w== dependencies: "@apollo/cache-control-types" "^1.0.3" "@apollo/server-gateway-interface" "^1.1.1" @@ -167,59 +167,60 @@ resolved "https://registry.yarnpkg.com/@apollo/utils.withrequired/-/utils.withrequired-2.0.1.tgz#e72bc512582a6f26af150439f7eb7473b46ba874" integrity sha512-YBDiuAX9i1lLc6GeTy1m7DGLFn/gMnvXqlalOIMjM7DeOgIacEjjfwPqb0M1CQ2v11HhR15d1NmxJoRCfrNqcA== -"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.12.13", "@babel/code-frame@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.22.5.tgz#234d98e1551960604f1246e6475891a570ad5658" - integrity sha512-Xmwn266vad+6DAqEB2A6V/CcZVp62BbwVmcOJc2RPuwih1kw02TjQvWVWlcKGbBPd+8/0V5DEkOcizRGYsspYQ== +"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.12.13", "@babel/code-frame@^7.22.13": + version "7.22.13" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.22.13.tgz#e3c1c099402598483b7a8c46a721d1038803755e" + integrity sha512-XktuhWlJ5g+3TJXc5upd9Ks1HutSArik6jf2eAjYFyIOf4ej3RN+184cZbzDvbPnuTJIUhPKKJE3cIsYTiAT3w== dependencies: - "@babel/highlight" "^7.22.5" + "@babel/highlight" "^7.22.13" + chalk "^2.4.2" -"@babel/compat-data@^7.22.6": - version "7.22.6" - resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.22.6.tgz#15606a20341de59ba02cd2fcc5086fcbe73bf544" - integrity sha512-29tfsWTq2Ftu7MXmimyC0C5FDZv5DYxOZkh3XD3+QW4V/BYuv/LyEsjj3c0hqedEaDt6DBfDvexMKU8YevdqFg== +"@babel/compat-data@^7.22.9": + version "7.22.9" + resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.22.9.tgz#71cdb00a1ce3a329ce4cbec3a44f9fef35669730" + integrity sha512-5UamI7xkUcJ3i9qVDS+KFDEK8/7oJ55/sJMB1Ge7IEapr7KfdfV/HErR+koZwOfd+SgtFKOKRhRakdg++DcJpQ== "@babel/core@^7.1.0", "@babel/core@^7.12.3", "@babel/core@^7.7.2", "@babel/core@^7.8.0": - version "7.22.8" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.22.8.tgz#386470abe884302db9c82e8e5e87be9e46c86785" - integrity sha512-75+KxFB4CZqYRXjx4NlR4J7yGvKumBuZTmV4NV6v09dVXXkuYVYLT68N6HCzLvfJ+fWCxQsntNzKwwIXL4bHnw== + version "7.22.15" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.22.15.tgz#15d4fd03f478a459015a4b94cfbb3bd42c48d2f4" + integrity sha512-PtZqMmgRrvj8ruoEOIwVA3yoF91O+Hgw9o7DAUTNBA6Mo2jpu31clx9a7Nz/9JznqetTR6zwfC4L3LAjKQXUwA== dependencies: "@ampproject/remapping" "^2.2.0" - "@babel/code-frame" "^7.22.5" - "@babel/generator" "^7.22.7" - "@babel/helper-compilation-targets" "^7.22.6" - "@babel/helper-module-transforms" "^7.22.5" - "@babel/helpers" "^7.22.6" - "@babel/parser" "^7.22.7" - "@babel/template" "^7.22.5" - "@babel/traverse" "^7.22.8" - "@babel/types" "^7.22.5" - "@nicolo-ribaudo/semver-v6" "^6.3.3" + "@babel/code-frame" "^7.22.13" + "@babel/generator" "^7.22.15" + "@babel/helper-compilation-targets" "^7.22.15" + "@babel/helper-module-transforms" "^7.22.15" + "@babel/helpers" "^7.22.15" + "@babel/parser" "^7.22.15" + "@babel/template" "^7.22.15" + "@babel/traverse" "^7.22.15" + "@babel/types" "^7.22.15" convert-source-map "^1.7.0" debug "^4.1.0" gensync "^1.0.0-beta.2" - json5 "^2.2.2" + json5 "^2.2.3" + semver "^6.3.1" -"@babel/generator@^7.22.7", "@babel/generator@^7.7.2": - version "7.22.7" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.22.7.tgz#a6b8152d5a621893f2c9dacf9a4e286d520633d5" - integrity sha512-p+jPjMG+SI8yvIaxGgeW24u7q9+5+TGpZh8/CuB7RhBKd7RCy8FayNEFNNKrNK/eUcY/4ExQqLmyrvBXKsIcwQ== +"@babel/generator@^7.22.15", "@babel/generator@^7.7.2": + version "7.22.15" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.22.15.tgz#1564189c7ec94cb8f77b5e8a90c4d200d21b2339" + integrity sha512-Zu9oWARBqeVOW0dZOjXc3JObrzuqothQ3y/n1kUtrjCoCPLkXUwMvOo/F/TCfoHMbWIFlWwpZtkZVb9ga4U2pA== dependencies: - "@babel/types" "^7.22.5" + "@babel/types" "^7.22.15" "@jridgewell/gen-mapping" "^0.3.2" "@jridgewell/trace-mapping" "^0.3.17" jsesc "^2.5.1" -"@babel/helper-compilation-targets@^7.22.6": - version "7.22.6" - resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.6.tgz#e30d61abe9480aa5a83232eb31c111be922d2e52" - integrity sha512-534sYEqWD9VfUm3IPn2SLcH4Q3P86XL+QvqdC7ZsFrzyyPF3T4XGiVghF6PTYNdWg6pXuoqXxNQAhbYeEInTzA== +"@babel/helper-compilation-targets@^7.22.15": + version "7.22.15" + resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.15.tgz#0698fc44551a26cf29f18d4662d5bf545a6cfc52" + integrity sha512-y6EEzULok0Qvz8yyLkCvVX+02ic+By2UdOhylwUOvOn9dvYc9mKICJuuU1n1XBI02YWsNsnrY1kc6DVbjcXbtw== dependencies: - "@babel/compat-data" "^7.22.6" - "@babel/helper-validator-option" "^7.22.5" - "@nicolo-ribaudo/semver-v6" "^6.3.3" + "@babel/compat-data" "^7.22.9" + "@babel/helper-validator-option" "^7.22.15" browserslist "^4.21.9" lru-cache "^5.1.1" + semver "^6.3.1" "@babel/helper-environment-visitor@^7.22.5": version "7.22.5" @@ -241,26 +242,23 @@ dependencies: "@babel/types" "^7.22.5" -"@babel/helper-module-imports@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.22.5.tgz#1a8f4c9f4027d23f520bd76b364d44434a72660c" - integrity sha512-8Dl6+HD/cKifutF5qGd/8ZJi84QeAKh+CEe1sBzz8UayBBGg1dAIJrdHOcOM5b2MpzWL2yuotJTtGjETq0qjXg== +"@babel/helper-module-imports@^7.22.15": + version "7.22.15" + resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.22.15.tgz#16146307acdc40cc00c3b2c647713076464bdbf0" + integrity sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w== dependencies: - "@babel/types" "^7.22.5" + "@babel/types" "^7.22.15" -"@babel/helper-module-transforms@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.22.5.tgz#0f65daa0716961b6e96b164034e737f60a80d2ef" - integrity sha512-+hGKDt/Ze8GFExiVHno/2dvG5IdstpzCq0y4Qc9OJ25D4q3pKfiIP/4Vp3/JvhDkLKsDK2api3q3fpIgiIF5bw== +"@babel/helper-module-transforms@^7.22.15": + version "7.22.15" + resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.22.15.tgz#40ad2f6950f143900e9c1c72363c0b431a606082" + integrity sha512-l1UiX4UyHSFsYt17iQ3Se5pQQZZHa22zyIXURmvkmLCD4t/aU+dvNWHatKac/D9Vm9UES7nvIqHs4jZqKviUmQ== dependencies: "@babel/helper-environment-visitor" "^7.22.5" - "@babel/helper-module-imports" "^7.22.5" + "@babel/helper-module-imports" "^7.22.15" "@babel/helper-simple-access" "^7.22.5" - "@babel/helper-split-export-declaration" "^7.22.5" - "@babel/helper-validator-identifier" "^7.22.5" - "@babel/template" "^7.22.5" - "@babel/traverse" "^7.22.5" - "@babel/types" "^7.22.5" + "@babel/helper-split-export-declaration" "^7.22.6" + "@babel/helper-validator-identifier" "^7.22.15" "@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.14.5", "@babel/helper-plugin-utils@^7.22.5", "@babel/helper-plugin-utils@^7.8.0": version "7.22.5" @@ -274,7 +272,7 @@ dependencies: "@babel/types" "^7.22.5" -"@babel/helper-split-export-declaration@^7.22.5", "@babel/helper-split-export-declaration@^7.22.6": +"@babel/helper-split-export-declaration@^7.22.6": version "7.22.6" resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz#322c61b7310c0997fe4c323955667f18fcefb91c" integrity sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g== @@ -286,38 +284,38 @@ resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz#533f36457a25814cf1df6488523ad547d784a99f" integrity sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw== -"@babel/helper-validator-identifier@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.5.tgz#9544ef6a33999343c8740fa51350f30eeaaaf193" - integrity sha512-aJXu+6lErq8ltp+JhkJUfk1MTGyuA4v7f3pA+BJ5HLfNC6nAQ0Cpi9uOquUj8Hehg0aUiHzWQbOVJGao6ztBAQ== +"@babel/helper-validator-identifier@^7.22.15", "@babel/helper-validator-identifier@^7.22.5": + version "7.22.15" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.15.tgz#601fa28e4cc06786c18912dca138cec73b882044" + integrity sha512-4E/F9IIEi8WR94324mbDUMo074YTheJmd7eZF5vITTeYchqAi6sYXRLHUVsmkdmY4QjfKTcB2jB7dVP3NaBElQ== -"@babel/helper-validator-option@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.22.5.tgz#de52000a15a177413c8234fa3a8af4ee8102d0ac" - integrity sha512-R3oB6xlIVKUnxNUxbmgq7pKjxpru24zlimpE8WK47fACIlM0II/Hm1RS8IaOI7NgCr6LNS+jl5l75m20npAziw== +"@babel/helper-validator-option@^7.22.15": + version "7.22.15" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.22.15.tgz#694c30dfa1d09a6534cdfcafbe56789d36aba040" + integrity sha512-bMn7RmyFjY/mdECUbgn9eoSY4vqvacUnS9i9vGAGttgFWesO6B4CYWA7XlpbWgBt71iv/hfbPlynohStqnu5hA== -"@babel/helpers@^7.22.6": - version "7.22.6" - resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.22.6.tgz#8e61d3395a4f0c5a8060f309fb008200969b5ecd" - integrity sha512-YjDs6y/fVOYFV8hAf1rxd1QvR9wJe1pDBZ2AREKq/SDayfPzgk0PBnVuTCE5X1acEpMMNOVUqoe+OwiZGJ+OaA== +"@babel/helpers@^7.22.15": + version "7.22.15" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.22.15.tgz#f09c3df31e86e3ea0b7ff7556d85cdebd47ea6f1" + integrity sha512-7pAjK0aSdxOwR+CcYAqgWOGy5dcfvzsTIfFTb2odQqW47MDfv14UaJDY6eng8ylM2EaeKXdxaSWESbkmaQHTmw== dependencies: - "@babel/template" "^7.22.5" - "@babel/traverse" "^7.22.6" - "@babel/types" "^7.22.5" + "@babel/template" "^7.22.15" + "@babel/traverse" "^7.22.15" + "@babel/types" "^7.22.15" -"@babel/highlight@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.22.5.tgz#aa6c05c5407a67ebce408162b7ede789b4d22031" - integrity sha512-BSKlD1hgnedS5XRnGOljZawtag7H1yPfQp0tdNJCHoH6AZ+Pcm9VvkrK59/Yy593Ypg0zMxH2BxD1VPYUQ7UIw== +"@babel/highlight@^7.22.13": + version "7.22.13" + resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.22.13.tgz#9cda839e5d3be9ca9e8c26b6dd69e7548f0cbf16" + integrity sha512-C/BaXcnnvBCmHTpz/VGZ8jgtE2aYlW4hxDhseJAWZb7gqGM/qtCK6iZUb0TyKFf7BOUsBH7Q7fkRsDRhg1XklQ== dependencies: "@babel/helper-validator-identifier" "^7.22.5" - chalk "^2.0.0" + chalk "^2.4.2" js-tokens "^4.0.0" -"@babel/parser@^7.1.0", "@babel/parser@^7.14.7", "@babel/parser@^7.20.7", "@babel/parser@^7.22.5", "@babel/parser@^7.22.7": - version "7.22.7" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.22.7.tgz#df8cf085ce92ddbdbf668a7f186ce848c9036cae" - integrity sha512-7NF8pOkHP5o2vpmGgNGcfAeCvOYhGLyA3Z4eBQkT1RJlWu47n63bCs93QfJ2hIAFCil7L5P2IWhs1oToVgrL0Q== +"@babel/parser@^7.1.0", "@babel/parser@^7.14.7", "@babel/parser@^7.20.7", "@babel/parser@^7.22.15": + version "7.22.15" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.22.15.tgz#d34592bfe288a32e741aa0663dbc4829fcd55160" + integrity sha512-RWmQ/sklUN9BvGGpCDgSubhHWfAx24XDTDObup4ffvxaYsptOg2P3KG0j+1eWKLxpkX0j0uHxmpq2Z1SP/VhxA== "@babel/plugin-syntax-async-generators@^7.8.4": version "7.8.4" @@ -410,38 +408,38 @@ dependencies: "@babel/helper-plugin-utils" "^7.22.5" -"@babel/template@^7.22.5", "@babel/template@^7.3.3": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.22.5.tgz#0c8c4d944509875849bd0344ff0050756eefc6ec" - integrity sha512-X7yV7eiwAxdj9k94NEylvbVHLiVG1nvzCV2EAowhxLTwODV1jl9UzZ48leOC0sH7OnuHrIkllaBgneUykIcZaw== +"@babel/template@^7.22.15", "@babel/template@^7.22.5", "@babel/template@^7.3.3": + version "7.22.15" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.22.15.tgz#09576efc3830f0430f4548ef971dde1350ef2f38" + integrity sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w== dependencies: - "@babel/code-frame" "^7.22.5" - "@babel/parser" "^7.22.5" - "@babel/types" "^7.22.5" + "@babel/code-frame" "^7.22.13" + "@babel/parser" "^7.22.15" + "@babel/types" "^7.22.15" -"@babel/traverse@^7.22.5", "@babel/traverse@^7.22.6", "@babel/traverse@^7.22.8", "@babel/traverse@^7.7.2": - version "7.22.8" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.22.8.tgz#4d4451d31bc34efeae01eac222b514a77aa4000e" - integrity sha512-y6LPR+wpM2I3qJrsheCTwhIinzkETbplIgPBbwvqPKc+uljeA5gP+3nP8irdYt1mjQaDnlIcG+dw8OjAco4GXw== +"@babel/traverse@^7.22.15", "@babel/traverse@^7.7.2": + version "7.22.15" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.22.15.tgz#75be4d2d6e216e880e93017f4e2389aeb77ef2d9" + integrity sha512-DdHPwvJY0sEeN4xJU5uRLmZjgMMDIvMPniLuYzUVXj/GGzysPl0/fwt44JBkyUIzGJPV8QgHMcQdQ34XFuKTYQ== dependencies: - "@babel/code-frame" "^7.22.5" - "@babel/generator" "^7.22.7" + "@babel/code-frame" "^7.22.13" + "@babel/generator" "^7.22.15" "@babel/helper-environment-visitor" "^7.22.5" "@babel/helper-function-name" "^7.22.5" "@babel/helper-hoist-variables" "^7.22.5" "@babel/helper-split-export-declaration" "^7.22.6" - "@babel/parser" "^7.22.7" - "@babel/types" "^7.22.5" + "@babel/parser" "^7.22.15" + "@babel/types" "^7.22.15" debug "^4.1.0" globals "^11.1.0" -"@babel/types@^7.0.0", "@babel/types@^7.20.7", "@babel/types@^7.22.5", "@babel/types@^7.3.3": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.22.5.tgz#cd93eeaab025880a3a47ec881f4b096a5b786fbe" - integrity sha512-zo3MIHGOkPOfoRXitsgHLjEXmlDaD/5KU1Uzuc9GNiZPhSqVxVRtxuPaSBZDsYZ9qV88AjtMtWW7ww98loJ9KA== +"@babel/types@^7.0.0", "@babel/types@^7.20.7", "@babel/types@^7.22.15", "@babel/types@^7.22.5", "@babel/types@^7.3.3": + version "7.22.15" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.22.15.tgz#266cb21d2c5fd0b3931e7a91b6dd72d2f617d282" + integrity sha512-X+NLXr0N8XXmN5ZsaQdm9U2SSC3UbIYq/doL++sueHOTisgZHoKaQtZxGuV2cUPQHMfjKEfg/g6oy7Hm6SKFtA== dependencies: "@babel/helper-string-parser" "^7.22.5" - "@babel/helper-validator-identifier" "^7.22.5" + "@babel/helper-validator-identifier" "^7.22.15" to-fast-properties "^2.0.0" "@bcoe/v8-coverage@^0.2.3": @@ -471,15 +469,15 @@ dependencies: eslint-visitor-keys "^3.3.0" -"@eslint-community/regexpp@^4.4.0": - version "4.5.1" - resolved "https://registry.yarnpkg.com/@eslint-community/regexpp/-/regexpp-4.5.1.tgz#cdd35dce4fa1a89a4fd42b1599eb35b3af408884" - integrity sha512-Z5ba73P98O1KUYCCJTUeVpja9RcGoMdncZ6T49FCUl2lN38JtCJ+3WgIDBv0AuY4WChU5PmtJmOCTlN6FZTFKQ== +"@eslint-community/regexpp@^4.4.0", "@eslint-community/regexpp@^4.6.1": + version "4.8.0" + resolved "https://registry.yarnpkg.com/@eslint-community/regexpp/-/regexpp-4.8.0.tgz#11195513186f68d42fbf449f9a7136b2c0c92005" + integrity sha512-JylOEEzDiOryeUnFbQz+oViCXS0KsvR1mvHkoMiu5+UiBvy+RYX7tzlIIIEstF/gVa2tj9AQXk3dgnxv6KxhFg== -"@eslint/eslintrc@^2.1.0": - version "2.1.0" - resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-2.1.0.tgz#82256f164cc9e0b59669efc19d57f8092706841d" - integrity sha512-Lj7DECXqIVCqnqjjHMPna4vn6GJcMgul/wuS0je9OZ9gsL0zzDpKPVtcG1HaDVc+9y+qgXneTeUMbCqXJNpH1A== +"@eslint/eslintrc@^2.1.2": + version "2.1.2" + resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-2.1.2.tgz#c6936b4b328c64496692f76944e755738be62396" + integrity sha512-+wvgpDsrB1YqAMdEUCcnTlpfVBH7Vqn6A/NT3D8WVXFIaKMlErPIZT3oCIAVCOtarRpMtelZLqJeU3t7WY6X6g== dependencies: ajv "^6.12.4" debug "^4.3.2" @@ -491,10 +489,10 @@ minimatch "^3.1.2" strip-json-comments "^3.1.1" -"@eslint/js@8.44.0": - version "8.44.0" - resolved "https://registry.yarnpkg.com/@eslint/js/-/js-8.44.0.tgz#961a5903c74139390478bdc808bcde3fc45ab7af" - integrity sha512-Ag+9YM4ocKQx9AarydN0KY2j0ErMHNIocPDrVo8zAE44xLTjEtz81OdR68/cydGtk6m6jDb5Za3r2useMzYmSw== +"@eslint/js@8.48.0": + version "8.48.0" + resolved "https://registry.yarnpkg.com/@eslint/js/-/js-8.48.0.tgz#642633964e217905436033a2bd08bf322849b7fb" + integrity sha512-ZSjtmelB7IJfWD2Fvb7+Z+ChTIKWq6kjda95fLcQKNS5aheVHn4IkfgRQE3sIIzTcSLwLcLZUD9UBt+V7+h+Pw== "@graphql-tools/merge@^8.4.1": version "8.4.2" @@ -543,9 +541,9 @@ value-or-promise "^1.0.12" "@graphql-tools/utils@^10.0.0": - version "10.0.3" - resolved "https://registry.yarnpkg.com/@graphql-tools/utils/-/utils-10.0.3.tgz#e5d5b217ba643b7b67a35b50086b5d831aadb71c" - integrity sha512-6uO41urAEIs4sXQT2+CYGsUTkHkVo/2MpM/QjoHj6D6xoEF2woXHBpdAVi0HKIInDwZqWgEYOwIFez0pERxa1Q== + version "10.0.6" + resolved "https://registry.yarnpkg.com/@graphql-tools/utils/-/utils-10.0.6.tgz#8a809d6bc0df27ffe8964696f182af2383b5974b" + integrity sha512-hZMjl/BbX10iagovakgf3IiqArx8TPsotq5pwBld37uIX1JiZoSbgbCIFol7u55bh32o6cfDEiiJgfAD5fbeyQ== dependencies: "@graphql-typed-document-node/core" "^3.1.1" dset "^3.1.2" @@ -565,9 +563,9 @@ integrity sha512-mB9oAsNCm9aM3/SOv4YtBMqZbYj10R7dkq8byBqxGY/ncFwhf2oQzMV+LCRlWoDSEBJ3COiR1yeDvMtsoOsuFQ== "@humanwhocodes/config-array@^0.11.10": - version "0.11.10" - resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.11.10.tgz#5a3ffe32cc9306365fb3fd572596cd602d5e12d2" - integrity sha512-KVVjQmNUepDVGXNuoRRdmmEjruj0KfiGSbS8LVc12LMsWDQzRXJ0qdhN8L8uUigKpfEHRhlaQFY0ib1tnUbNeQ== + version "0.11.11" + resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.11.11.tgz#88a04c570dbbc7dd943e4712429c3df09bc32844" + integrity sha512-N2brEuAadi0CcdeMXUkhbZB84eskAc8MEX1By6qEchoVywSgXPIjou4rYsl0V3Hj0ZnuGycGCjdNgockbzeWNA== dependencies: "@humanwhocodes/object-schema" "^1.2.1" debug "^4.1.1" @@ -790,12 +788,7 @@ "@jridgewell/sourcemap-codec" "^1.4.10" "@jridgewell/trace-mapping" "^0.3.9" -"@jridgewell/resolve-uri@3.1.0": - version "3.1.0" - resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz#2203b118c157721addfe69d47b70465463066d78" - integrity sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w== - -"@jridgewell/resolve-uri@^3.0.3": +"@jridgewell/resolve-uri@^3.0.3", "@jridgewell/resolve-uri@^3.1.0": version "3.1.1" resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz#c08679063f279615a3326583ba3a90d1d82cc721" integrity sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA== @@ -805,12 +798,7 @@ resolved "https://registry.yarnpkg.com/@jridgewell/set-array/-/set-array-1.1.2.tgz#7c6cf998d6d20b914c0a55a91ae928ff25965e72" integrity sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw== -"@jridgewell/sourcemap-codec@1.4.14": - version "1.4.14" - resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz#add4c98d341472a289190b424efbdb096991bb24" - integrity sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw== - -"@jridgewell/sourcemap-codec@^1.4.10": +"@jridgewell/sourcemap-codec@^1.4.10", "@jridgewell/sourcemap-codec@^1.4.14": version "1.4.15" resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz#d7c6e6755c78567a951e04ab52ef0fd26de59f32" integrity sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg== @@ -824,17 +812,12 @@ "@jridgewell/sourcemap-codec" "^1.4.10" "@jridgewell/trace-mapping@^0.3.17", "@jridgewell/trace-mapping@^0.3.9": - version "0.3.18" - resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.18.tgz#25783b2086daf6ff1dcb53c9249ae480e4dd4cd6" - integrity sha512-w+niJYzMHdd7USdiH2U6869nqhD2nbfZXND5Yp93qIbEmnDNk7PD48o+YchRVpzMU7M6jVCbenTR7PA1FLQ9pA== + version "0.3.19" + resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.19.tgz#f8a3249862f91be48d3127c3cfe992f79b4b8811" + integrity sha512-kf37QtfW+Hwx/buWGMPcR60iF9ziHa6r/CZJIHbmcm4+0qrXiVdxegAH0F6yddEVQ7zdkjcGCgCzUu+BcbhQxw== dependencies: - "@jridgewell/resolve-uri" "3.1.0" - "@jridgewell/sourcemap-codec" "1.4.14" - -"@nicolo-ribaudo/semver-v6@^6.3.3": - version "6.3.3" - resolved "https://registry.yarnpkg.com/@nicolo-ribaudo/semver-v6/-/semver-v6-6.3.3.tgz#ea6d23ade78a325f7a52750aab1526b02b628c29" - integrity sha512-3Yc1fUTs69MG/uZbJlLSI3JISMn2UV2rg+1D/vROUqZyh3l6iYHCs7GMp+M40ZD7yOdDbYjJcU1oTJhrc+dGKg== + "@jridgewell/resolve-uri" "^3.1.0" + "@jridgewell/sourcemap-codec" "^1.4.14" "@nodelib/fs.scandir@2.1.5": version "2.1.5" @@ -857,18 +840,6 @@ "@nodelib/fs.scandir" "2.1.5" fastq "^1.6.0" -"@pkgr/utils@^2.3.1": - version "2.4.2" - resolved "https://registry.yarnpkg.com/@pkgr/utils/-/utils-2.4.2.tgz#9e638bbe9a6a6f165580dc943f138fd3309a2cbc" - integrity sha512-POgTXhjrTfbTV63DiFXav4lBHiICLKKwDeaKn9Nphwj7WH6m0hMMCaJkMyRWjgtPFyRKRVoMXXjczsTQRDEhYw== - dependencies: - cross-spawn "^7.0.3" - fast-glob "^3.3.0" - is-glob "^4.0.3" - open "^9.1.0" - picocolors "^1.0.0" - tslib "^2.6.0" - "@protobufjs/aspromise@^1.1.1", "@protobufjs/aspromise@^1.1.2": version "1.1.2" resolved "https://registry.yarnpkg.com/@protobufjs/aspromise/-/aspromise-1.1.2.tgz#9b8b0cc663d669a7d8f6f5d0893a14d348f30fbf" @@ -1003,23 +974,23 @@ "@types/node" "*" "@types/connect@*": - version "3.4.35" - resolved "https://registry.yarnpkg.com/@types/connect/-/connect-3.4.35.tgz#5fcf6ae445e4021d1fc2219a4873cc73a3bb2ad1" - integrity sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ== + version "3.4.36" + resolved "https://registry.yarnpkg.com/@types/connect/-/connect-3.4.36.tgz#e511558c15a39cb29bd5357eebb57bd1459cd1ab" + integrity sha512-P63Zd/JUGq+PdrM1lv0Wv5SBYeA2+CORvbrXbngriYY0jzLUWfQMQQxOhjONEz/wlHOAxOdY7CY65rgQdTjq2w== dependencies: "@types/node" "*" "@types/cors@^2.8.13": - version "2.8.13" - resolved "https://registry.yarnpkg.com/@types/cors/-/cors-2.8.13.tgz#b8ade22ba455a1b8cb3b5d3f35910fd204f84f94" - integrity sha512-RG8AStHlUiV5ysZQKq97copd2UmVYw3/pRMLefISZ3S1hK104Cwm7iLQ3fTKx+lsUH2CE8FlLaYeEA2LSeqYUA== + version "2.8.14" + resolved "https://registry.yarnpkg.com/@types/cors/-/cors-2.8.14.tgz#94eeb1c95eda6a8ab54870a3bf88854512f43a92" + integrity sha512-RXHUvNWYICtbP6s18PnOCaqToK8y14DnLd75c6HfyKf228dxy7pHNOQkxPtvXKp/hINFMDjbYzsj63nnpPMSRQ== dependencies: "@types/node" "*" "@types/express-serve-static-core@^4.17.30", "@types/express-serve-static-core@^4.17.33": - version "4.17.35" - resolved "https://registry.yarnpkg.com/@types/express-serve-static-core/-/express-serve-static-core-4.17.35.tgz#c95dd4424f0d32e525d23812aa8ab8e4d3906c4f" - integrity sha512-wALWQwrgiB2AWTT91CB62b6Yt0sNHpznUXeZEcnPU3DRdlDIz74x8Qg1UUYKSVFi+va5vKOLYRBI1bRKiLLKIg== + version "4.17.36" + resolved "https://registry.yarnpkg.com/@types/express-serve-static-core/-/express-serve-static-core-4.17.36.tgz#baa9022119bdc05a4adfe740ffc97b5f9360e545" + integrity sha512-zbivROJ0ZqLAtMzgzIUC4oNqDG9iF0lSsAqpOD9kbs5xcIM3dTiyuHvBc7R8MtWBp3AAWGaovJa+wzWPjLYW7Q== dependencies: "@types/node" "*" "@types/qs" "*" @@ -1108,15 +1079,15 @@ "@types/node" "*" form-data "^3.0.0" -"@types/node@*", "@types/node@^20.1.2": - version "20.4.1" - resolved "https://registry.yarnpkg.com/@types/node/-/node-20.4.1.tgz#a6033a8718653c50ac4962977e14d0f984d9527d" - integrity sha512-JIzsAvJeA/5iY6Y/OxZbv1lUcc8dNSE77lb2gnBH+/PJ3lFR1Ccvgwl5JWnHAkNHcRsT0TbpVOsiMKZ1F/yyJg== +"@types/node@*", "@types/node@^20.4.9": + version "20.5.9" + resolved "https://registry.yarnpkg.com/@types/node/-/node-20.5.9.tgz#a70ec9d8fa0180a314c3ede0e20ea56ff71aed9a" + integrity sha512-PcGNd//40kHAS3sTlzKB9C9XL4K0sTup8nbG5lC14kzEteTNuAFh9u5nA0o5TWnSG2r/JNPRXFVcHJIIeRlmqQ== "@types/node@^18.11.18": - version "18.16.19" - resolved "https://registry.yarnpkg.com/@types/node/-/node-18.16.19.tgz#cb03fca8910fdeb7595b755126a8a78144714eea" - integrity sha512-IXl7o+R9iti9eBW4Wg2hx1xQDig183jj7YLn8F7udNceyfkbn1ZxmzZXuak20gR40D7pIkIY1kYGx5VIGbaHKA== + version "18.17.14" + resolved "https://registry.yarnpkg.com/@types/node/-/node-18.17.14.tgz#a621ad26e7eb076d6846dd3d39557ddf9d89f04b" + integrity sha512-ZE/5aB73CyGqgQULkLG87N9GnyGe5TcQjv34pwS8tfBs1IkCh0ASM69mydb2znqd6v0eX+9Ytvk6oQRqu8T1Vw== "@types/prettier@^2.1.5": version "2.7.3" @@ -1124,9 +1095,9 @@ integrity sha512-+68kP9yzs4LMp7VNh8gdzMSPZFL44MLGqiHWvttYJe+6qnuVr4Ek9wSBQoveqY/r+LwjCcU29kNVkidwim+kYA== "@types/qs@*": - version "6.9.7" - resolved "https://registry.yarnpkg.com/@types/qs/-/qs-6.9.7.tgz#63bb7d067db107cc1e457c303bc25d511febf6cb" - integrity sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw== + version "6.9.8" + resolved "https://registry.yarnpkg.com/@types/qs/-/qs-6.9.8.tgz#f2a7de3c107b89b441e071d5472e6b726b4adf45" + integrity sha512-u95svzDlTysU5xecFNTgfFG5RUWu1A9P0VzgpcIiGZA9iraHOdSzcxMxQ55DyeRaGCSxQi7LxXDI4rzq/MYfdg== "@types/range-parser@*": version "1.2.4" @@ -1134,9 +1105,9 @@ integrity sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw== "@types/semver@^7.3.12", "@types/semver@^7.5.0": - version "7.5.0" - resolved "https://registry.yarnpkg.com/@types/semver/-/semver-7.5.0.tgz#591c1ce3a702c45ee15f47a42ade72c2fd78978a" - integrity sha512-G8hZ6XJiHnuhQKR7ZmysCeJWE08o8T0AXtk5darsCaTVsYZhhgUrq53jizaR2FvsoeCwJhlmwTjkXBY5Pn/ZHw== + version "7.5.1" + resolved "https://registry.yarnpkg.com/@types/semver/-/semver-7.5.1.tgz#0480eeb7221eb9bc398ad7432c9d7e14b1a5a367" + integrity sha512-cJRQXpObxfNKkFAZbJl2yjWtJCqELQIdShsogr1d2MilP8dKD9TE/nEKHkJgUNHdGKCQaf9HbIynuV2csLGVLg== "@types/send@*": version "0.17.1" @@ -1166,9 +1137,9 @@ integrity sha512-c/I8ZRb51j+pYGAu5CrFMRxqZ2ke4y2grEBO5AUjgSkSk+qT2Ea+OdWElz/OiMf5MNpn2b17kuVBwZLQJXzihw== "@types/validator@^13.7.10": - version "13.7.17" - resolved "https://registry.yarnpkg.com/@types/validator/-/validator-13.7.17.tgz#0a6d1510395065171e3378a4afc587a3aefa7cc1" - integrity sha512-aqayTNmeWrZcvnG2MG9eGYI6b7S5fl+yKgPs6bAjOTwPS316R5SxBGKvtSExfyoJU7pIeHJfsHI0Ji41RVMkvQ== + version "13.11.1" + resolved "https://registry.yarnpkg.com/@types/validator/-/validator-13.11.1.tgz#6560af76ed54490e68c42f717ab4e742ba7be74b" + integrity sha512-d/MUkJYdOeKycmm75Arql4M5+UuXmf4cHdHKsyw1GcvnNgL6s77UkgSgJ8TE/rI5PYsnwYq5jkcWBLuN/MpQ1A== "@types/yargs-parser@*": version "21.0.0" @@ -1324,7 +1295,7 @@ agent-base@6: dependencies: debug "4" -ajv@^6.10.0, ajv@^6.12.4: +ajv@^6.12.4: version "6.12.6" resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== @@ -1432,14 +1403,14 @@ array-flatten@1.1.1: integrity sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg== array-includes@^3.1.6: - version "3.1.6" - resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.1.6.tgz#9e9e720e194f198266ba9e18c29e6a9b0e4b225f" - integrity sha512-sgTbLvL6cNnw24FnbaDyjmvddQ2ML8arZsgaJhoABMoplz/4QRhtrYS+alr1BUM1Bwp6dhx8vVCBSLG+StwOFw== + version "3.1.7" + resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.1.7.tgz#8cd2e01b26f7a3086cbc87271593fe921c62abda" + integrity sha512-dlcsNBIiWhPkHdOEEKnehA+RNUWDc4UqFtnIXU4uuYDPtA4LDkr7qip2p0VvFAEXNDr0yWZ9PJyIRiGjRLQzwQ== dependencies: call-bind "^1.0.2" - define-properties "^1.1.4" - es-abstract "^1.20.4" - get-intrinsic "^1.1.3" + define-properties "^1.2.0" + es-abstract "^1.22.1" + get-intrinsic "^1.2.1" is-string "^1.0.7" array-union@^2.1.0: @@ -1447,14 +1418,25 @@ array-union@^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.prototype.flat@^1.3.1: - version "1.3.1" - resolved "https://registry.yarnpkg.com/array.prototype.flat/-/array.prototype.flat-1.3.1.tgz#ffc6576a7ca3efc2f46a143b9d1dda9b4b3cf5e2" - integrity sha512-roTU0KWIOmJ4DRLmwKd19Otg0/mT3qPNt0Qb3GWW8iObuZXxrjB/pzn0R3hqpRSWg4HCwqx+0vwOnWnvlOyeIA== +array.prototype.findlastindex@^1.2.2: + version "1.2.3" + resolved "https://registry.yarnpkg.com/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.3.tgz#b37598438f97b579166940814e2c0493a4f50207" + integrity sha512-LzLoiOMAxvy+Gd3BAq3B7VeIgPdo+Q8hthvKtXybMvRV0jrXfJM/t8mw7nNlpEcVlVUnCnM2KSX4XU5HmpodOA== dependencies: call-bind "^1.0.2" - define-properties "^1.1.4" - es-abstract "^1.20.4" + define-properties "^1.2.0" + es-abstract "^1.22.1" + es-shim-unscopables "^1.0.0" + get-intrinsic "^1.2.1" + +array.prototype.flat@^1.3.1: + version "1.3.2" + resolved "https://registry.yarnpkg.com/array.prototype.flat/-/array.prototype.flat-1.3.2.tgz#1476217df8cff17d72ee8f3ba06738db5b387d18" + integrity sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA== + dependencies: + call-bind "^1.0.2" + define-properties "^1.2.0" + es-abstract "^1.22.1" es-shim-unscopables "^1.0.0" array.prototype.flatmap@^1.3.1: @@ -1467,6 +1449,19 @@ array.prototype.flatmap@^1.3.1: es-abstract "^1.20.4" es-shim-unscopables "^1.0.0" +arraybuffer.prototype.slice@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.2.tgz#98bd561953e3e74bb34938e77647179dfe6e9f12" + integrity sha512-yMBKppFur/fbHu9/6USUe03bZ4knMYiwFBcyiaXB8Go0qNehwX6inYPzK9U0NeQvGxKthcmHcaR8P5MStSRBAw== + dependencies: + array-buffer-byte-length "^1.0.0" + call-bind "^1.0.2" + define-properties "^1.2.0" + es-abstract "^1.22.1" + get-intrinsic "^1.2.1" + is-array-buffer "^3.0.2" + is-shared-array-buffer "^1.0.2" + async-retry@^1.2.1: version "1.3.3" resolved "https://registry.yarnpkg.com/async-retry/-/async-retry-1.3.3.tgz#0e7f36c04d8478e7a58bdbed80cedf977785f280" @@ -1555,11 +1550,6 @@ base64-js@^1.3.1: resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a" integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== -big-integer@^1.6.44: - version "1.6.51" - resolved "https://registry.yarnpkg.com/big-integer/-/big-integer-1.6.51.tgz#0df92a5d9880560d3ff2d5fd20245c889d130686" - integrity sha512-GPEid2Y9QU1Exl1rpO9B2IPJGHPSupF5GnVIP0blYvNOMer2bTvSWs1jGOUg04hTmu67nmLsQ9TBo1puaotBHg== - binary-extensions@^2.0.0: version "2.2.0" resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.2.0.tgz#75f502eeaf9ffde42fc98829645be4ea76bd9e2d" @@ -1626,13 +1616,6 @@ body-parser@^1.20.0, body-parser@^1.20.2: type-is "~1.6.18" unpipe "1.0.0" -bplist-parser@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/bplist-parser/-/bplist-parser-0.2.0.tgz#43a9d183e5bf9d545200ceac3e712f79ebbe8d0e" - integrity sha512-z0M+byMThzQmD9NILRniCUXYsYpjwnlO8N5uCFaCqIOpqRsJCrQL9NK3JsD67CN5a08nF5oIL2bD6loTdHOuKw== - dependencies: - big-integer "^1.6.44" - brace-expansion@^1.1.7: version "1.1.11" resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" @@ -1654,13 +1637,13 @@ browser-process-hrtime@^1.0.0: integrity sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow== browserslist@^4.21.9: - version "4.21.9" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.21.9.tgz#e11bdd3c313d7e2a9e87e8b4b0c7872b13897635" - integrity sha512-M0MFoZzbUrRU4KNfCrDLnvyE7gub+peetoTid3TBIqtunaDJyXlwhakT+/VkvSXcfIzFfK/nkCs4nmyTmxdNSg== + version "4.21.10" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.21.10.tgz#dbbac576628c13d3b2231332cb2ec5a46e015bb0" + integrity sha512-bipEBdZfVH5/pwrvqc+Ub0kUPVfGUhlKxbvfD+z1BDnPEO/X98ruXGA1WP5ASpAFKan7Qr6j736IacbZQuAlKQ== dependencies: - caniuse-lite "^1.0.30001503" - electron-to-chromium "^1.4.431" - node-releases "^2.0.12" + caniuse-lite "^1.0.30001517" + electron-to-chromium "^1.4.477" + node-releases "^2.0.13" update-browserslist-db "^1.0.11" bs-logger@0.x: @@ -1702,13 +1685,6 @@ builtins@^5.0.1: dependencies: semver "^7.0.0" -bundle-name@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/bundle-name/-/bundle-name-3.0.0.tgz#ba59bcc9ac785fb67ccdbf104a2bf60c099f0e1a" - integrity sha512-PKA4BeSvBpQKQ8iPOGCSiell+N8P+Tf1DlwqmYhpe2gAhKPHn8EYOxVT+ShuGmhg8lN8XiSlS80yiExKXrURlw== - dependencies: - run-applescript "^5.0.0" - bytes@3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.0.tgz#f6cf7933a360e0588fa9fde85651cdc7f805d1f6" @@ -1742,12 +1718,12 @@ camelcase@^6.2.0: resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.3.0.tgz#5685b95eb209ac9c0c177467778c9c84df58ba9a" integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA== -caniuse-lite@^1.0.30001503: - version "1.0.30001515" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001515.tgz#418aefeed9d024cd3129bfae0ccc782d4cb8f12b" - integrity sha512-eEFDwUOZbE24sb+Ecsx3+OvNETqjWIdabMy52oOkIgcUtAsQifjUG9q4U9dgTHJM2mfk4uEPxc0+xuFdJ629QA== +caniuse-lite@^1.0.30001517: + version "1.0.30001527" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001527.tgz#813826554828245ccee776c850566dce12bdeaba" + integrity sha512-YkJi7RwPgWtXVSgK4lG9AHH57nSzvvOp9MesgXmw4Q7n0C3H04L0foHqfxcmSAm5AcWb8dW9AYj2tR7/5GnddQ== -chalk@^2.0.0, chalk@^2.4.2: +chalk@^2.4.2: version "2.4.2" resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== @@ -2079,29 +2055,6 @@ deepmerge@^4.2.2: resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-4.3.1.tgz#44b5f2147cd3b00d4b56137685966f26fd25dd4a" integrity sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A== -default-browser-id@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/default-browser-id/-/default-browser-id-3.0.0.tgz#bee7bbbef1f4e75d31f98f4d3f1556a14cea790c" - integrity sha512-OZ1y3y0SqSICtE8DE4S8YOE9UZOJ8wO16fKWVP5J1Qz42kV9jcnMVFrEE/noXb/ss3Q4pZIH79kxofzyNNtUNA== - dependencies: - bplist-parser "^0.2.0" - untildify "^4.0.0" - -default-browser@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/default-browser/-/default-browser-4.0.0.tgz#53c9894f8810bf86696de117a6ce9085a3cbc7da" - integrity sha512-wX5pXO1+BrhMkSbROFsyxUm0i/cJEScyNhA4PPxc41ICuv05ZZB/MX28s8aZx6xjmatvebIapF6hLEKEcpneUA== - dependencies: - bundle-name "^3.0.0" - default-browser-id "^3.0.0" - execa "^7.1.1" - titleize "^3.0.0" - -define-lazy-prop@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/define-lazy-prop/-/define-lazy-prop-3.0.0.tgz#dbb19adfb746d7fc6d734a06b72f4a00d021255f" - integrity sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg== - define-properties@^1.1.3, define-properties@^1.1.4, define-properties@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.2.0.tgz#52988570670c9eacedd8064f4a990f2405849bd5" @@ -2203,10 +2156,10 @@ ee-first@1.1.1: resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" integrity sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow== -electron-to-chromium@^1.4.431: - version "1.4.455" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.455.tgz#81fe4353ac970eb971c07088c8da8b7f6280ddc9" - integrity sha512-8tgdX0Odl24LtmLwxotpJCVjIndN559AvaOtd67u+2mo+IDsgsTF580NB+uuDCqsHw8yFg53l5+imFV9Fw3cbA== +electron-to-chromium@^1.4.477: + version "1.4.508" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.508.tgz#5641ff2f5ba11df4bd960fe6a2f9f70aa8b9af96" + integrity sha512-FFa8QKjQK/A5QuFr2167myhMesGrhlOBD+3cYNxO9/S4XzHEXesyTD/1/xF644gC8buFPz3ca6G1LOQD0tZrrg== emittery@^0.8.1: version "0.8.1" @@ -2245,18 +2198,19 @@ error-ex@^1.3.1: dependencies: is-arrayish "^0.2.1" -es-abstract@^1.19.0, es-abstract@^1.20.4: - version "1.21.2" - resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.21.2.tgz#a56b9695322c8a185dc25975aa3b8ec31d0e7eff" - integrity sha512-y/B5POM2iBnIxCiernH1G7rC9qQoM77lLIMQLuob0zhp8C56Po81+2Nj0WFKnd0pNReDTnkYryc+zhOzpEIROg== +es-abstract@^1.20.4, es-abstract@^1.22.1: + version "1.22.1" + resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.22.1.tgz#8b4e5fc5cefd7f1660f0f8e1a52900dfbc9d9ccc" + integrity sha512-ioRRcXMO6OFyRpyzV3kE1IIBd4WG5/kltnzdxSCqoP8CMGs/Li+M1uF5o7lOkZVFjDs+NLesthnF66Pg/0q0Lw== dependencies: array-buffer-byte-length "^1.0.0" + arraybuffer.prototype.slice "^1.0.1" available-typed-arrays "^1.0.5" call-bind "^1.0.2" es-set-tostringtag "^2.0.1" es-to-primitive "^1.2.1" function.prototype.name "^1.1.5" - get-intrinsic "^1.2.0" + get-intrinsic "^1.2.1" get-symbol-description "^1.0.0" globalthis "^1.0.3" gopd "^1.0.1" @@ -2276,14 +2230,18 @@ es-abstract@^1.19.0, es-abstract@^1.20.4: object-inspect "^1.12.3" object-keys "^1.1.1" object.assign "^4.1.4" - regexp.prototype.flags "^1.4.3" + regexp.prototype.flags "^1.5.0" + safe-array-concat "^1.0.0" safe-regex-test "^1.0.0" string.prototype.trim "^1.2.7" string.prototype.trimend "^1.0.6" string.prototype.trimstart "^1.0.6" + typed-array-buffer "^1.0.0" + typed-array-byte-length "^1.0.0" + typed-array-byte-offset "^1.0.0" typed-array-length "^1.0.4" unbox-primitive "^1.0.2" - which-typed-array "^1.1.9" + which-typed-array "^1.1.10" es-set-tostringtag@^2.0.1: version "2.0.1" @@ -2347,9 +2305,9 @@ escodegen@^2.0.0: source-map "~0.6.1" eslint-config-prettier@^8.8.0: - version "8.8.0" - resolved "https://registry.yarnpkg.com/eslint-config-prettier/-/eslint-config-prettier-8.8.0.tgz#bfda738d412adc917fd7b038857110efe98c9348" - integrity sha512-wLbQiFre3tdGgpDv67NQKnJuTlcUVYHas3k+DZCc2U2BadthoEY4B7hLPvAxaqdyOGCzuLfii2fqGph10va7oA== + version "8.10.0" + resolved "https://registry.yarnpkg.com/eslint-config-prettier/-/eslint-config-prettier-8.10.0.tgz#3a06a662130807e2502fc3ff8b4143d8a0658e11" + integrity sha512-SM8AMJdeQqRYT9O9zguiruQZaN7+z+E4eAP9oiLNGKMtomwaB1E9dcgUD6ZAn/eQAb52USbvezbiljfZUhbJcg== eslint-config-standard@^17.0.0: version "17.1.0" @@ -2357,29 +2315,28 @@ eslint-config-standard@^17.0.0: integrity sha512-IwHwmaBNtDK4zDHQukFDW5u/aTb8+meQWZvNFWkiGmbWjD6bqyuSSBxxXKkCftCUzc1zwCH2m/baCNDLGmuO5Q== eslint-import-resolver-node@^0.3.7: - version "0.3.7" - resolved "https://registry.yarnpkg.com/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.7.tgz#83b375187d412324a1963d84fa664377a23eb4d7" - integrity sha512-gozW2blMLJCeFpBwugLTGyvVjNoeo1knonXAcatC6bjPBZitotxdWf7Gimr25N4c0AAOo4eOUfaG82IJPDpqCA== + version "0.3.9" + resolved "https://registry.yarnpkg.com/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz#d4eaac52b8a2e7c3cd1903eb00f7e053356118ac" + integrity sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g== dependencies: debug "^3.2.7" - is-core-module "^2.11.0" - resolve "^1.22.1" + is-core-module "^2.13.0" + resolve "^1.22.4" eslint-import-resolver-typescript@^3.5.4: - version "3.5.5" - resolved "https://registry.yarnpkg.com/eslint-import-resolver-typescript/-/eslint-import-resolver-typescript-3.5.5.tgz#0a9034ae7ed94b254a360fbea89187b60ea7456d" - integrity sha512-TdJqPHs2lW5J9Zpe17DZNQuDnox4xo2o+0tE7Pggain9Rbc19ik8kFtXdxZ250FVx2kF4vlt2RSf4qlUpG7bhw== + version "3.6.0" + resolved "https://registry.yarnpkg.com/eslint-import-resolver-typescript/-/eslint-import-resolver-typescript-3.6.0.tgz#36f93e1eb65a635e688e16cae4bead54552e3bbd" + integrity sha512-QTHR9ddNnn35RTxlaEnx2gCxqFlF2SEN0SE2d17SqwyM7YOSI2GHWRYp5BiRkObTUNYPupC/3Fq2a0PpT+EKpg== dependencies: debug "^4.3.4" enhanced-resolve "^5.12.0" eslint-module-utils "^2.7.4" + fast-glob "^3.3.1" get-tsconfig "^4.5.0" - globby "^13.1.3" is-core-module "^2.11.0" is-glob "^4.0.3" - synckit "^0.8.5" -eslint-module-utils@^2.7.4: +eslint-module-utils@^2.7.4, eslint-module-utils@^2.8.0: version "2.8.0" resolved "https://registry.yarnpkg.com/eslint-module-utils/-/eslint-module-utils-2.8.0.tgz#e439fee65fc33f6bba630ff621efc38ec0375c49" integrity sha512-aWajIYfsqCKRDgUfjEXNN/JlrzauMuSEy5sbd7WXbtW3EH6A6MpwEh42c7qD+MqQo9QMJ6fWLAeIJynx0g6OAw== @@ -2395,30 +2352,32 @@ eslint-plugin-es@^4.1.0: regexpp "^3.0.0" eslint-plugin-import@^2.27.5: - version "2.27.5" - resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.27.5.tgz#876a6d03f52608a3e5bb439c2550588e51dd6c65" - integrity sha512-LmEt3GVofgiGuiE+ORpnvP+kAm3h6MLZJ4Q5HCyHADofsb4VzXFsRiWj3c0OFiV+3DWFh0qg3v9gcPlfc3zRow== + version "2.28.1" + resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.28.1.tgz#63b8b5b3c409bfc75ebaf8fb206b07ab435482c4" + integrity sha512-9I9hFlITvOV55alzoKBI+K9q74kv0iKMeY6av5+umsNwayt59fz692daGyjR+oStBQgx6nwR9rXldDev3Clw+A== dependencies: array-includes "^3.1.6" + array.prototype.findlastindex "^1.2.2" array.prototype.flat "^1.3.1" array.prototype.flatmap "^1.3.1" debug "^3.2.7" doctrine "^2.1.0" eslint-import-resolver-node "^0.3.7" - eslint-module-utils "^2.7.4" + eslint-module-utils "^2.8.0" has "^1.0.3" - is-core-module "^2.11.0" + is-core-module "^2.13.0" is-glob "^4.0.3" minimatch "^3.1.2" + object.fromentries "^2.0.6" + object.groupby "^1.0.0" object.values "^1.1.6" - resolve "^1.22.1" - semver "^6.3.0" - tsconfig-paths "^3.14.1" + semver "^6.3.1" + tsconfig-paths "^3.14.2" eslint-plugin-jest@^27.2.1: - version "27.2.2" - resolved "https://registry.yarnpkg.com/eslint-plugin-jest/-/eslint-plugin-jest-27.2.2.tgz#be4ded5f91905d9ec89aa8968d39c71f3b072c0c" - integrity sha512-euzbp06F934Z7UDl5ZUaRPLAc9MKjh0rMPERrHT7UhlCEwgb25kBj37TvMgWeHZVkR5I9CayswrpoaqZU1RImw== + version "27.2.3" + resolved "https://registry.yarnpkg.com/eslint-plugin-jest/-/eslint-plugin-jest-27.2.3.tgz#6f8a4bb2ca82c0c5d481d1b3be256ab001f5a3ec" + integrity sha512-sRLlSCpICzWuje66Gl9zvdF6mwD5X86I4u55hJyFBsxYOsBCmT5+kSUjf+fkFWVMMgpzNEupjW8WzUqi83hJAQ== dependencies: "@typescript-eslint/utils" "^5.10.0" @@ -2463,10 +2422,10 @@ eslint-scope@^5.1.1: esrecurse "^4.3.0" estraverse "^4.1.1" -eslint-scope@^7.2.0: - version "7.2.0" - resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-7.2.0.tgz#f21ebdafda02352f103634b96dd47d9f81ca117b" - integrity sha512-DYj5deGlHBfMt15J7rdtyKNq/Nqlv5KfU4iodrQ019XESsRnwXH9KAE0y3cwtUHDo2ob7CypAnCqefh6vioWRw== +eslint-scope@^7.2.2: + version "7.2.2" + resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-7.2.2.tgz#deb4f92563390f32006894af62a22dba1c46423f" + integrity sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg== dependencies: esrecurse "^4.3.0" estraverse "^5.2.0" @@ -2495,32 +2454,32 @@ eslint-visitor-keys@^2.0.0: resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz#f65328259305927392c938ed44eb0a5c9b2bd303" integrity sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw== -eslint-visitor-keys@^3.3.0, eslint-visitor-keys@^3.4.1: - version "3.4.1" - resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.4.1.tgz#c22c48f48942d08ca824cc526211ae400478a994" - integrity sha512-pZnmmLwYzf+kWaM/Qgrvpen51upAktaaiI01nsJD/Yr3lMOdNtq0cxkrrg16w64VtisN6okbs7Q8AfGqj4c9fA== +eslint-visitor-keys@^3.3.0, eslint-visitor-keys@^3.4.1, eslint-visitor-keys@^3.4.3: + version "3.4.3" + resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz#0cd72fe8550e3c2eae156a96a4dddcd1c8ac5800" + integrity sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag== eslint@^8.37.0: - version "8.44.0" - resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.44.0.tgz#51246e3889b259bbcd1d7d736a0c10add4f0e500" - integrity sha512-0wpHoUbDUHgNCyvFB5aXLiQVfK9B0at6gUvzy83k4kAsQ/u769TQDX6iKC+aO4upIHO9WSaA3QoXYQDHbNwf1A== + version "8.48.0" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.48.0.tgz#bf9998ba520063907ba7bfe4c480dc8be03c2155" + integrity sha512-sb6DLeIuRXxeM1YljSe1KEx9/YYeZFQWcV8Rq9HfigmdDEugjLEVEa1ozDjL6YDjBpQHPJxJzze+alxi4T3OLg== dependencies: "@eslint-community/eslint-utils" "^4.2.0" - "@eslint-community/regexpp" "^4.4.0" - "@eslint/eslintrc" "^2.1.0" - "@eslint/js" "8.44.0" + "@eslint-community/regexpp" "^4.6.1" + "@eslint/eslintrc" "^2.1.2" + "@eslint/js" "8.48.0" "@humanwhocodes/config-array" "^0.11.10" "@humanwhocodes/module-importer" "^1.0.1" "@nodelib/fs.walk" "^1.2.8" - ajv "^6.10.0" + ajv "^6.12.4" chalk "^4.0.0" cross-spawn "^7.0.2" debug "^4.3.2" doctrine "^3.0.0" escape-string-regexp "^4.0.0" - eslint-scope "^7.2.0" - eslint-visitor-keys "^3.4.1" - espree "^9.6.0" + eslint-scope "^7.2.2" + eslint-visitor-keys "^3.4.3" + espree "^9.6.1" esquery "^1.4.2" esutils "^2.0.2" fast-deep-equal "^3.1.3" @@ -2530,7 +2489,6 @@ eslint@^8.37.0: globals "^13.19.0" graphemer "^1.4.0" ignore "^5.2.0" - import-fresh "^3.0.0" imurmurhash "^0.1.4" is-glob "^4.0.0" is-path-inside "^3.0.3" @@ -2542,13 +2500,12 @@ eslint@^8.37.0: natural-compare "^1.4.0" optionator "^0.9.3" strip-ansi "^6.0.1" - strip-json-comments "^3.1.0" text-table "^0.2.0" -espree@^9.6.0: - version "9.6.0" - resolved "https://registry.yarnpkg.com/espree/-/espree-9.6.0.tgz#80869754b1c6560f32e3b6929194a3fe07c5b82f" - integrity sha512-1FH/IiruXZ84tpUlm0aCUEwMl2Ho5ilqVh0VvQXw+byAz/4SAciyHLlfmL5WYqsvD38oymdUwBss0LtK8m4s/A== +espree@^9.6.0, espree@^9.6.1: + version "9.6.1" + resolved "https://registry.yarnpkg.com/espree/-/espree-9.6.1.tgz#a2a17b8e434690a5432f2f8018ce71d331a48c6f" + integrity sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ== dependencies: acorn "^8.9.0" acorn-jsx "^5.3.2" @@ -2608,21 +2565,6 @@ execa@^5.0.0: signal-exit "^3.0.3" strip-final-newline "^2.0.0" -execa@^7.1.1: - version "7.1.1" - resolved "https://registry.yarnpkg.com/execa/-/execa-7.1.1.tgz#3eb3c83d239488e7b409d48e8813b76bb55c9c43" - integrity sha512-wH0eMf/UXckdUYnO21+HDztteVv05rq2GXksxT4fCGeHkBhw1DROXh40wcjMcRqDOWE7iPJ4n3M7e2+YFP+76Q== - dependencies: - cross-spawn "^7.0.3" - get-stream "^6.0.1" - human-signals "^4.3.0" - is-stream "^3.0.0" - merge-stream "^2.0.0" - npm-run-path "^5.1.0" - onetime "^6.0.0" - signal-exit "^3.0.7" - strip-final-newline "^3.0.0" - exit@^0.1.2: version "0.1.2" resolved "https://registry.yarnpkg.com/exit/-/exit-0.1.2.tgz#0632638f8d877cc82107d30a0fff1a17cba1cd0c" @@ -2735,10 +2677,10 @@ fast-diff@^1.1.2: resolved "https://registry.yarnpkg.com/fast-diff/-/fast-diff-1.3.0.tgz#ece407fa550a64d638536cd727e129c61616e0f0" integrity sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw== -fast-glob@^3.2.9, fast-glob@^3.3.0: - version "3.3.0" - resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.3.0.tgz#7c40cb491e1e2ed5664749e87bfb516dbe8727c0" - integrity sha512-ChDuvbOypPuNjO8yIDf36x7BlZX1smcUMTTcyoIjycexOxd6DFsKsg21qVBzEmr3G7fUKIRy2/psii+CIUt7FA== +fast-glob@^3.2.9, fast-glob@^3.3.1: + version "3.3.1" + resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.3.1.tgz#784b4e897340f3dbbef17413b3f11acf03c874c4" + integrity sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg== dependencies: "@nodelib/fs.stat" "^2.0.2" "@nodelib/fs.walk" "^1.2.3" @@ -2841,14 +2783,15 @@ find-up@^5.0.0: path-exists "^4.0.0" flat-cache@^3.0.4: - version "3.0.4" - resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-3.0.4.tgz#61b0338302b2fe9f957dcc32fc2a87f1c3048b11" - integrity sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg== + version "3.1.0" + resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-3.1.0.tgz#0e54ab4a1a60fe87e2946b6b00657f1c99e1af3f" + integrity sha512-OHx4Qwrrt0E4jEIcI5/Xb+f+QmJYNj2rrK8wiIdQOIrB9WrrJL8cjZvXdXuBTkkEwEqLycb5BeZDV1o2i9bTew== dependencies: - flatted "^3.1.0" + flatted "^3.2.7" + keyv "^4.5.3" rimraf "^3.0.2" -flatted@^3.1.0, flatted@^3.2.7: +flatted@^3.2.7: version "3.2.7" resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.2.7.tgz#609f39207cb614b89d0765b477cb2d437fbf9787" integrity sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ== @@ -2899,9 +2842,9 @@ fs.realpath@^1.0.0: integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== fsevents@^2.3.2, fsevents@~2.3.2: - version "2.3.2" - resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.2.tgz#8a526f78b8fdf4623b709e0b975c52c24c02fd1a" - integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA== + version "2.3.3" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.3.tgz#cac6407785d03675a2a5e1a5305c697b347d90d6" + integrity sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw== function-bind@^1.1.1: version "1.1.1" @@ -2909,16 +2852,16 @@ function-bind@^1.1.1: integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== function.prototype.name@^1.1.5: - version "1.1.5" - resolved "https://registry.yarnpkg.com/function.prototype.name/-/function.prototype.name-1.1.5.tgz#cce0505fe1ffb80503e6f9e46cc64e46a12a9621" - integrity sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA== + version "1.1.6" + resolved "https://registry.yarnpkg.com/function.prototype.name/-/function.prototype.name-1.1.6.tgz#cdf315b7d90ee77a4c6ee216c3c3362da07533fd" + integrity sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg== dependencies: call-bind "^1.0.2" - define-properties "^1.1.3" - es-abstract "^1.19.0" - functions-have-names "^1.2.2" + define-properties "^1.2.0" + es-abstract "^1.22.1" + functions-have-names "^1.2.3" -functions-have-names@^1.2.2, functions-have-names@^1.2.3: +functions-have-names@^1.2.3: version "1.2.3" resolved "https://registry.yarnpkg.com/functions-have-names/-/functions-have-names-1.2.3.tgz#0404fe4ee2ba2f607f0e0ec3c80bae994133b834" integrity sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ== @@ -2947,7 +2890,7 @@ get-caller-file@^2.0.5: resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== -get-intrinsic@^1.0.2, get-intrinsic@^1.1.1, get-intrinsic@^1.1.3, get-intrinsic@^1.2.0: +get-intrinsic@^1.0.2, get-intrinsic@^1.1.1, get-intrinsic@^1.1.3, get-intrinsic@^1.2.0, get-intrinsic@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.2.1.tgz#d295644fed4505fc9cde952c37ee12b477a83d82" integrity sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw== @@ -2962,7 +2905,7 @@ get-package-type@^0.1.0: resolved "https://registry.yarnpkg.com/get-package-type/-/get-package-type-0.1.0.tgz#8de2d803cff44df3bc6c456e6668b36c3926e11a" integrity sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q== -get-stream@^6.0.0, get-stream@^6.0.1: +get-stream@^6.0.0: version "6.0.1" resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-6.0.1.tgz#a262d8eef67aced57c2852ad6167526a43cbf7b7" integrity sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg== @@ -2976,9 +2919,9 @@ get-symbol-description@^1.0.0: get-intrinsic "^1.1.1" get-tsconfig@^4.5.0: - version "4.6.2" - resolved "https://registry.yarnpkg.com/get-tsconfig/-/get-tsconfig-4.6.2.tgz#831879a5e6c2aa24fe79b60340e2233a1e0f472e" - integrity sha512-E5XrT4CbbXcXWy+1jChlZmrmCwd5KGx502kDCXJJ7y898TtWW9FwoG5HfOLVRKmlmDGkWN2HM9Ho+/Y8F0sJDg== + version "4.7.0" + resolved "https://registry.yarnpkg.com/get-tsconfig/-/get-tsconfig-4.7.0.tgz#06ce112a1463e93196aa90320c35df5039147e34" + integrity sha512-pmjiZ7xtB8URYm74PlGJozDNyhvsVLUcpBa8DZBG3bWHwaHa9bPiRpiSfovw+fjhwONSCWKRyk+JQHEGZmMrzw== dependencies: resolve-pkg-maps "^1.0.0" @@ -3026,9 +2969,9 @@ globals@^11.1.0: integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== globals@^13.19.0: - version "13.20.0" - resolved "https://registry.yarnpkg.com/globals/-/globals-13.20.0.tgz#ea276a1e508ffd4f1612888f9d1bad1e2717bf82" - integrity sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ== + version "13.21.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-13.21.0.tgz#163aae12f34ef502f5153cfbdd3600f36c63c571" + integrity sha512-ybyme3s4yy/t/3s35bewwXKOf7cvzfreG2lH0lZl0JB7I4GxRP2ghxOK/Nb9EkRXdbBXZLfq/p/0W2JUONB/Gg== dependencies: type-fest "^0.20.2" @@ -3051,17 +2994,6 @@ globby@^11.1.0: merge2 "^1.4.1" slash "^3.0.0" -globby@^13.1.3: - version "13.2.2" - resolved "https://registry.yarnpkg.com/globby/-/globby-13.2.2.tgz#63b90b1bf68619c2135475cbd4e71e66aa090592" - integrity sha512-Y1zNGV+pzQdh7H39l9zgB4PJqjRNqydvdYCDG4HFXM4XuvSaQQlEc91IU1yALL8gUTDomgBAfz3XJdmUS+oo0w== - dependencies: - dir-glob "^3.0.1" - fast-glob "^3.3.0" - ignore "^5.2.4" - merge2 "^1.4.1" - slash "^4.0.0" - gopd@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/gopd/-/gopd-1.0.1.tgz#29ff76de69dac7489b7c0918a5788e56477c332c" @@ -3101,17 +3033,17 @@ graphql-subscriptions@^2.0.0: iterall "^1.3.0" graphql@^16.7.1: - version "16.7.1" - resolved "https://registry.yarnpkg.com/graphql/-/graphql-16.7.1.tgz#11475b74a7bff2aefd4691df52a0eca0abd9b642" - integrity sha512-DRYR9tf+UGU0KOsMcKAlXeFfX89UiiIZ0dRU3mR0yJfu6OjZqUcp68NnFLnqQU5RexygFoDy1EW+ccOYcPfmHg== + version "16.8.0" + resolved "https://registry.yarnpkg.com/graphql/-/graphql-16.8.0.tgz#374478b7f27b2dc6153c8f42c1b80157f79d79d4" + integrity sha512-0oKGaR+y3qcS5mCu1vb7KG+a89vjn06C7Ihq/dDl3jA+A8B3TKomvi3CiEcVLJQGalbu8F52LxkOym7U5sSfbg== handlebars@^4.7.6: - version "4.7.7" - resolved "https://registry.yarnpkg.com/handlebars/-/handlebars-4.7.7.tgz#9ce33416aad02dbd6c8fafa8240d5d98004945a1" - integrity sha512-aAcXm5OAfE/8IXkcZvCepKU3VzW1/39Fb5ZuqMtgI/hT8X2YgoMvBY5dLhq/cpOvw7Lk1nK/UF71aLG/ZnVYRA== + version "4.7.8" + resolved "https://registry.yarnpkg.com/handlebars/-/handlebars-4.7.8.tgz#41c42c18b1be2365439188c77c6afae71c0cd9e9" + integrity sha512-vafaFqs8MZkRrSX7sFVUdo3ap/eNiLnb4IakshzvP56X5Nr1iGKAIqdX6tMlm6HcNRIkr6AxO5jFEoJzzpT8aQ== dependencies: minimist "^1.2.5" - neo-async "^2.6.0" + neo-async "^2.6.2" source-map "^0.6.1" wordwrap "^1.0.0" optionalDependencies: @@ -3235,11 +3167,6 @@ human-signals@^2.1.0: resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-2.1.0.tgz#dc91fcba42e4d06e4abaed33b3e7a3c02f514ea0" integrity sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw== -human-signals@^4.3.0: - version "4.3.1" - resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-4.3.1.tgz#ab7f811e851fca97ffbd2c1fe9a958964de321b2" - integrity sha512-nZXjEF2nbo7lIw3mgYjItAfgQXog3OjJogSbKa2CQIIvSGWcKgeJnQlNXip6NglNzYH45nSRiEVimMvYL8DDqQ== - iconv-lite@0.4.24, iconv-lite@^0.4.24: version "0.4.24" resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" @@ -3262,7 +3189,7 @@ ignore@^5.1.1, ignore@^5.2.0, ignore@^5.2.4: resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.2.4.tgz#a291c0c6178ff1b960befe47fcdec301674a6324" integrity sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ== -import-fresh@^3.0.0, import-fresh@^3.2.1: +import-fresh@^3.2.1: version "3.3.0" resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.0.tgz#37162c25fcb9ebaa2e6e53d5b4d88ce17d9e0c2b" integrity sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw== @@ -3385,10 +3312,10 @@ is-callable@^1.1.3, is-callable@^1.1.4, is-callable@^1.2.7: resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.7.tgz#3bc2a85ea742d9e36205dcacdd72ca1fdc51b055" integrity sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA== -is-core-module@^2.11.0: - version "2.12.1" - resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.12.1.tgz#0c0b6885b6f80011c71541ce15c8d66cf5a4f9fd" - integrity sha512-Q4ZuBAe2FUsKtyQJoQHlvP8OvBERxO3jEmy1I7hcRXcJBGGHFh/aJBswbXuS9sgrDH2QUO8ilkwNPHvHMd8clg== +is-core-module@^2.11.0, is-core-module@^2.13.0: + version "2.13.0" + resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.13.0.tgz#bb52aa6e2cbd49a30c2ba68c42bf3435ba6072db" + integrity sha512-Z7dk6Qo8pOCp3l4tsX2C5ZVas4V+UxwQodwZhLopL91TX8UyyHEXafPcyoeeWuLrwzHcr3igO78wNLwHJHsMCQ== dependencies: has "^1.0.3" @@ -3399,16 +3326,6 @@ is-date-object@^1.0.1: dependencies: has-tostringtag "^1.0.0" -is-docker@^2.0.0: - version "2.2.1" - resolved "https://registry.yarnpkg.com/is-docker/-/is-docker-2.2.1.tgz#33eeabe23cfe86f14bde4408a02c0cfb853acdaa" - integrity sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ== - -is-docker@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/is-docker/-/is-docker-3.0.0.tgz#90093aa3106277d8a77a5910dbae71747e15a200" - integrity sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ== - is-extglob@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" @@ -3438,13 +3355,6 @@ is-glob@^4.0.0, is-glob@^4.0.1, is-glob@^4.0.3, is-glob@~4.0.1: dependencies: is-extglob "^2.1.1" -is-inside-container@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-inside-container/-/is-inside-container-1.0.0.tgz#e81fba699662eb31dbdaf26766a61d4814717ea4" - integrity sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA== - dependencies: - is-docker "^3.0.0" - is-negative-zero@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/is-negative-zero/-/is-negative-zero-2.0.2.tgz#7bf6f03a28003b8b3965de3ac26f664d765f3150" @@ -3492,11 +3402,6 @@ is-stream@^2.0.0: resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-2.0.1.tgz#fac1e3d53b97ad5a9d0ae9cef2389f5810a5c077" integrity sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg== -is-stream@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-3.0.0.tgz#e6bfd7aa6bef69f4f472ce9bb681e3e57b4319ac" - integrity sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA== - is-string@^1.0.5, is-string@^1.0.7: version "1.0.7" resolved "https://registry.yarnpkg.com/is-string/-/is-string-1.0.7.tgz#0dd12bf2006f255bb58f695110eff7491eebc0fd" @@ -3512,15 +3417,11 @@ is-symbol@^1.0.2, is-symbol@^1.0.3: has-symbols "^1.0.2" is-typed-array@^1.1.10, is-typed-array@^1.1.9: - version "1.1.10" - resolved "https://registry.yarnpkg.com/is-typed-array/-/is-typed-array-1.1.10.tgz#36a5b5cb4189b575d1a3e4b08536bfb485801e3f" - integrity sha512-PJqgEHiWZvMpaFZ3uTc8kHPM4+4ADTlDniuQL7cU/UDA0Ql7F70yGfHph3cLNe+c9toaigv+DFzTJKhc2CtO6A== + version "1.1.12" + resolved "https://registry.yarnpkg.com/is-typed-array/-/is-typed-array-1.1.12.tgz#d0bab5686ef4a76f7a73097b95470ab199c57d4a" + integrity sha512-Z14TF2JNG8Lss5/HMqt0//T9JeHXttXy5pH/DBU4vi98ozO2btxzq9MwYDZYnKwU8nRsz/+GVFVRDq3DkVuSPg== dependencies: - available-typed-arrays "^1.0.5" - call-bind "^1.0.2" - for-each "^0.3.3" - gopd "^1.0.1" - has-tostringtag "^1.0.0" + which-typed-array "^1.1.11" is-typedarray@^1.0.0: version "1.0.0" @@ -3534,12 +3435,10 @@ is-weakref@^1.0.2: dependencies: call-bind "^1.0.2" -is-wsl@^2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-2.2.0.tgz#74a4c76e77ca9fd3f932f290c17ea326cd157271" - integrity sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww== - dependencies: - is-docker "^2.0.0" +isarray@^2.0.5: + version "2.0.5" + resolved "https://registry.yarnpkg.com/isarray/-/isarray-2.0.5.tgz#8af1e4c1221244cc62459faf38940d4e644a5723" + integrity sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw== isarray@~1.0.0: version "1.0.0" @@ -3568,12 +3467,12 @@ istanbul-lib-instrument@^5.0.4, istanbul-lib-instrument@^5.1.0: semver "^6.3.0" istanbul-lib-report@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz#7518fe52ea44de372f460a76b5ecda9ffb73d8a6" - integrity sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw== + version "3.0.1" + resolved "https://registry.yarnpkg.com/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz#908305bac9a5bd175ac6a74489eafd0fc2445a7d" + integrity sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw== dependencies: istanbul-lib-coverage "^3.0.0" - make-dir "^3.0.0" + make-dir "^4.0.0" supports-color "^7.1.0" istanbul-lib-source-maps@^4.0.0: @@ -3586,9 +3485,9 @@ istanbul-lib-source-maps@^4.0.0: source-map "^0.6.1" istanbul-reports@^3.1.3: - version "3.1.5" - resolved "https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-3.1.5.tgz#cc9a6ab25cb25659810e4785ed9d9fb742578bae" - integrity sha512-nUsEMa9pBt/NOHqbcbeJEgqIlY/K7rVWUX6Lql2orY5e9roQOthbR3vtY4zzf2orPELg80fnxxk9zUyPlgwD1w== + version "3.1.6" + resolved "https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-3.1.6.tgz#2544bcab4768154281a2f0870471902704ccaa1a" + integrity sha512-TLgnMkKg3iTDsQ9PbPTdpfAK2DzjF9mqUG7RMgcQl8oFjad8ob4laGxv5XV5U9MAfx8D6tSJiUyuAwzLicaxlg== dependencies: html-escaper "^2.0.0" istanbul-lib-report "^3.0.0" @@ -4061,6 +3960,11 @@ jsesc@^2.5.1: resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.2.tgz#80564d2e483dacf6e8ef209650a67df3f0c283a4" integrity sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA== +json-buffer@3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/json-buffer/-/json-buffer-3.0.1.tgz#9338802a30d3b6605fbe0613e094008ca8c05a13" + integrity sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ== + json-parse-even-better-errors@^2.3.0: version "2.3.1" resolved "https://registry.yarnpkg.com/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz#7c47805a94319928e05777405dc12e1f7a4ee02d" @@ -4076,7 +3980,7 @@ json-stable-stringify-without-jsonify@^1.0.1: resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" integrity sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw== -json5@2.x, json5@^2.2.2: +json5@2.x, json5@^2.2.2, json5@^2.2.3: version "2.2.3" resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.3.tgz#78cd6f1a19bdc12b73db5ad0c61efd66c1e29283" integrity sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg== @@ -4095,6 +3999,13 @@ jsonfile@^4.0.0: optionalDependencies: graceful-fs "^4.1.6" +keyv@^4.5.3: + version "4.5.3" + resolved "https://registry.yarnpkg.com/keyv/-/keyv-4.5.3.tgz#00873d2b046df737963157bd04f294ca818c9c25" + integrity sha512-QCiSav9WaX1PgETJ+SpNnx2PRRapJ/oRSXM4VO5OGYGSjrxbKPVFVhB3l2OCbLCk329N8qyAtsJjSjvVBWzEug== + dependencies: + json-buffer "3.0.1" + kleur@^3.0.3: version "3.0.3" resolved "https://registry.yarnpkg.com/kleur/-/kleur-3.0.3.tgz#a79c9ecc86ee1ce3fa6206d1216c501f147fc07e" @@ -4114,9 +4025,9 @@ levn@^0.4.1: type-check "~0.4.0" libphonenumber-js@^1.10.14: - version "1.10.37" - resolved "https://registry.yarnpkg.com/libphonenumber-js/-/libphonenumber-js-1.10.37.tgz#185264130c9375f17d0c487a288223294579929c" - integrity sha512-Z10PCaOCiAxbUxLyR31DNeeNugSVP6iv/m7UrSKS5JHziEMApJtgku4e9Q69pzzSC9LnQiM09sqsGf2ticZnMw== + version "1.10.44" + resolved "https://registry.yarnpkg.com/libphonenumber-js/-/libphonenumber-js-1.10.44.tgz#6709722461173e744190494aaaec9c1c690d8ca8" + integrity sha512-svlRdNBI5WgBjRC20GrCfbFiclbF0Cx+sCcQob/C1r57nsoq0xg8r65QbTyVyweQIlB33P+Uahyho6EMYgcOyQ== lines-and-columns@^1.1.6: version "1.2.4" @@ -4207,12 +4118,12 @@ lru-cache@^7.10.1, lru-cache@^7.14.1: resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-7.18.3.tgz#f793896e0fd0e954a59dfdd82f0773808df6aa89" integrity sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA== -make-dir@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-3.1.0.tgz#415e967046b3a7f1d185277d84aa58203726a13f" - integrity sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw== +make-dir@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-4.0.0.tgz#c3c2307a771277cd9638305f915c29ae741b614e" + integrity sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw== dependencies: - semver "^6.0.0" + semver "^7.5.3" make-error@1.x, make-error@^1.1.1: version "1.3.6" @@ -4286,11 +4197,6 @@ mimic-fn@^2.1.0: resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== -mimic-fn@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-4.0.0.tgz#60a90550d5cb0b239cca65d893b1a53b29871ecc" - integrity sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw== - mimic-response@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-2.1.0.tgz#d13763d35f613d09ec37ebb30bac0469c0ee8f43" @@ -4358,7 +4264,7 @@ negotiator@0.6.3, negotiator@^0.6.3: resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.3.tgz#58e323a72fedc0d6f9cd4d31fe49f51479590ccd" integrity sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg== -neo-async@^2.6.0: +neo-async@^2.6.2: version "2.6.2" resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.2.tgz#b4aafb93e3aeb2d8174ca53cf163ab7d7308305f" integrity sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw== @@ -4396,9 +4302,9 @@ node-abort-controller@^3.1.1: integrity sha512-AGK2yQKIjRuqnc6VkX2Xj5d+QW8xZ87pa1UK6yA6ouUyuxfHuMP6umE5QK7UmTeOAymo+Zx1Fxiuw9rVx8taHQ== node-fetch@^2.6.7: - version "2.6.12" - resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.12.tgz#02eb8e22074018e3d5a83016649d04df0e348fba" - integrity sha512-C/fGU2E8ToujUivIO0H+tpQ6HWo4eEmchoPIoXtxCrVghxdKq+QOHqEZW7tuP3KlV3bC8FRMO5nMCC7Zm1VP6g== + version "2.7.0" + resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.7.0.tgz#d0f0fa6e3e2dc1d27efcd8ad99d550bda94d187d" + integrity sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A== dependencies: whatwg-url "^5.0.0" @@ -4407,7 +4313,7 @@ node-int64@^0.4.0: resolved "https://registry.yarnpkg.com/node-int64/-/node-int64-0.4.0.tgz#87a9065cdb355d3182d8f94ce11188b825c68a3b" integrity sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw== -node-releases@^2.0.12: +node-releases@^2.0.13: version "2.0.13" resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.13.tgz#d5ed1627c23e3461e819b02e57b75e4899b1c81d" integrity sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ== @@ -4447,13 +4353,6 @@ npm-run-path@^4.0.1: dependencies: path-key "^3.0.0" -npm-run-path@^5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-5.1.0.tgz#bc62f7f3f6952d9894bd08944ba011a6ee7b7e00" - integrity sha512-sJOdmRGrY2sjNTRMbSvluQqg+8X7ZK61yvzBEIDhz4f8z1TZFYABsqjjCBd/0PUNE9M6QDgHJXQkGUEm7Q+l9Q== - dependencies: - path-key "^4.0.0" - npmlog@^4.0.1: version "4.1.2" resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-4.1.2.tgz#08a7f2a8bf734604779a9efa4ad5cc717abb954b" @@ -4499,14 +4398,33 @@ object.assign@^4.1.4: has-symbols "^1.0.3" object-keys "^1.1.1" -object.values@^1.1.6: - version "1.1.6" - resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.1.6.tgz#4abbaa71eba47d63589d402856f908243eea9b1d" - integrity sha512-FVVTkD1vENCsAcwNs9k6jea2uHC/X0+JcjG8YA60FN5CMaJmG95wT9jek/xX9nornqGRrBkKtzuAu2wuHpKqvw== +object.fromentries@^2.0.6: + version "2.0.7" + resolved "https://registry.yarnpkg.com/object.fromentries/-/object.fromentries-2.0.7.tgz#71e95f441e9a0ea6baf682ecaaf37fa2a8d7e616" + integrity sha512-UPbPHML6sL8PI/mOqPwsH4G6iyXcCGzLin8KvEPenOZN5lpCNBZZQ+V62vdjB1mQHrmqGQt5/OJzemUA+KJmEA== dependencies: call-bind "^1.0.2" - define-properties "^1.1.4" - es-abstract "^1.20.4" + define-properties "^1.2.0" + es-abstract "^1.22.1" + +object.groupby@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/object.groupby/-/object.groupby-1.0.1.tgz#d41d9f3c8d6c778d9cbac86b4ee9f5af103152ee" + integrity sha512-HqaQtqLnp/8Bn4GL16cj+CUYbnpe1bh0TtEaWvybszDG4tgxCJuRpV8VGuvNaI1fAnI4lUJzDG55MXcOH4JZcQ== + dependencies: + call-bind "^1.0.2" + define-properties "^1.2.0" + es-abstract "^1.22.1" + get-intrinsic "^1.2.1" + +object.values@^1.1.6: + version "1.1.7" + resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.1.7.tgz#617ed13272e7e1071b43973aa1655d9291b8442a" + integrity sha512-aU6xnDFYT3x17e/f0IiiwlGPTy2jzMySGfUB4fq6z7CV8l85CWHDk5ErhyhpfDHhrOMwGFhSQkhMGHaIotA6Ng== + dependencies: + call-bind "^1.0.2" + define-properties "^1.2.0" + es-abstract "^1.22.1" on-finished@2.4.1: version "2.4.1" @@ -4536,23 +4454,6 @@ onetime@^5.1.0, onetime@^5.1.2: dependencies: mimic-fn "^2.1.0" -onetime@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/onetime/-/onetime-6.0.0.tgz#7c24c18ed1fd2e9bca4bd26806a33613c77d34b4" - integrity sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ== - dependencies: - mimic-fn "^4.0.0" - -open@^9.1.0: - version "9.1.0" - resolved "https://registry.yarnpkg.com/open/-/open-9.1.0.tgz#684934359c90ad25742f5a26151970ff8c6c80b6" - integrity sha512-OS+QTnw1/4vrf+9hh1jc1jnYjzSG4ttTBB8UxOwAnInG3Uo4ssetzC1ihqaIHjLJnA5GGlRl6QlZXOTQhRBUvg== - dependencies: - default-browser "^4.0.0" - define-lazy-prop "^3.0.0" - is-inside-container "^1.0.0" - is-wsl "^2.2.0" - optionator@^0.9.3: version "0.9.3" resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.9.3.tgz#007397d44ed1872fdc6ed31360190f81814e2c64" @@ -4645,11 +4546,6 @@ path-key@^3.0.0, path-key@^3.1.0: resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== -path-key@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/path-key/-/path-key-4.0.0.tgz#295588dc3aee64154f877adb9d780b81c554bf18" - integrity sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ== - path-parse@^1.0.7: version "1.0.7" resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" @@ -4892,7 +4788,7 @@ regexp-tree@~0.1.1: resolved "https://registry.yarnpkg.com/regexp-tree/-/regexp-tree-0.1.27.tgz#2198f0ef54518ffa743fe74d983b56ffd631b6cd" integrity sha512-iETxpjK6YoRWJG5o6hXLwvjYAoW+FEZn9os0PD/b6AP6xQwsa/Y7lCVgIixBbUPMfhu+i2LtdeAqVTgGlQarfA== -regexp.prototype.flags@^1.4.3: +regexp.prototype.flags@^1.5.0: version "1.5.0" resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.5.0.tgz#fe7ce25e7e4cca8db37b6634c8a2c7009199b9cb" integrity sha512-0SutC3pNudRKgquxGoRGIz946MZVHqbNfPjBdxeOhBrdgDKlRoXmYLQN9xRbrR09ZXWeGAdPuif7egofn6v5LA== @@ -4943,12 +4839,12 @@ resolve.exports@^1.1.0: resolved "https://registry.yarnpkg.com/resolve.exports/-/resolve.exports-1.1.1.tgz#05cfd5b3edf641571fd46fa608b610dda9ead999" integrity sha512-/NtpHNDN7jWhAaQ9BvBUYZ6YTXsRBgfqWFWP7BZBaoMJO/I3G5OFzvTuWNlZC3aPjins1F+TNrLKsGbH4rfsRQ== -resolve@^1.20.0, resolve@^1.22.1: - version "1.22.2" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.2.tgz#0ed0943d4e301867955766c9f3e1ae6d01c6845f" - integrity sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g== +resolve@^1.20.0, resolve@^1.22.1, resolve@^1.22.4: + version "1.22.4" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.4.tgz#1dc40df46554cdaf8948a486a10f6ba1e2026c34" + integrity sha512-PXNdCiPqDqeUou+w1C2eTQbNfxKSuMxqTCuvlmmMsk1NWHL5fRrhY6Pl0qEYYc6+QqGClco1Qj8XnjPego4wfg== dependencies: - is-core-module "^2.11.0" + is-core-module "^2.13.0" path-parse "^1.0.7" supports-preserve-symlinks-flag "^1.0.0" @@ -4982,13 +4878,6 @@ rimraf@^3.0.0, rimraf@^3.0.2: dependencies: glob "^7.1.3" -run-applescript@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/run-applescript/-/run-applescript-5.0.0.tgz#e11e1c932e055d5c6b40d98374e0268d9b11899c" - integrity sha512-XcT5rBksx1QdIhlFOCtgZkB99ZEouFZ1E2Kc2LHqNW13U3/74YGdkQRmThTwxy4QIyookibDKYZOPqX//6BlAg== - dependencies: - execa "^5.0.0" - run-async@^2.4.0: version "2.4.1" resolved "https://registry.yarnpkg.com/run-async/-/run-async-2.4.1.tgz#8440eccf99ea3e70bd409d49aab88e10c189a455" @@ -5008,6 +4897,16 @@ rxjs@^6.6.0: dependencies: tslib "^1.9.0" +safe-array-concat@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/safe-array-concat/-/safe-array-concat-1.0.1.tgz#91686a63ce3adbea14d61b14c99572a8ff84754c" + integrity sha512-6XbUAseYE2KtOuGueyeobCySj9L4+66Tn6KQMOPQJrAJEowYKW/YR/MGJZl7FdydUdaFu4LYyDZjxf4/Nmo23Q== + dependencies: + call-bind "^1.0.2" + get-intrinsic "^1.2.1" + has-symbols "^1.0.3" + isarray "^2.0.5" + safe-buffer@5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1: version "5.1.2" resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" @@ -5046,7 +4945,7 @@ saxes@^5.0.1: dependencies: xmlchars "^2.2.0" -semver@7.x, semver@^7.0.0, semver@^7.3.2, semver@^7.3.7, semver@^7.3.8, semver@^7.5.0: +semver@7.x, semver@^7.0.0, semver@^7.3.2, semver@^7.3.7, semver@^7.3.8, semver@^7.5.3, semver@^7.5.4: version "7.5.4" resolved "https://registry.yarnpkg.com/semver/-/semver-7.5.4.tgz#483986ec4ed38e1c6c48c34894a9182dbff68a6e" integrity sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA== @@ -5058,7 +4957,7 @@ semver@^5.4.1, semver@^5.7.1: resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.2.tgz#48d55db737c3287cd4835e17fa13feace1c41ef8" integrity sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g== -semver@^6.0.0, semver@^6.3.0: +semver@^6.3.0, semver@^6.3.1: version "6.3.1" resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.1.tgz#556d2ef8689146e46dcea4bfdd095f3434dffcb4" integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== @@ -5170,7 +5069,7 @@ side-channel@^1.0.4: get-intrinsic "^1.0.2" object-inspect "^1.9.0" -signal-exit@^3.0.0, signal-exit@^3.0.2, signal-exit@^3.0.3, signal-exit@^3.0.7: +signal-exit@^3.0.0, signal-exit@^3.0.2, signal-exit@^3.0.3: version "3.0.7" resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9" integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== @@ -5206,11 +5105,6 @@ slash@^3.0.0: resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== -slash@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/slash/-/slash-4.0.0.tgz#2422372176c4c6c5addb5e2ada885af984b396a7" - integrity sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew== - source-map-support@^0.5.6: version "0.5.21" resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.21.tgz#04fe7c7f9e1ed2d662233c28cb2b35b9f63f6e4f" @@ -5331,13 +5225,13 @@ string.prototype.trimend@^1.0.6: es-abstract "^1.20.4" string.prototype.trimstart@^1.0.6: - version "1.0.6" - resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.6.tgz#e90ab66aa8e4007d92ef591bbf3cd422c56bdcf4" - integrity sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA== + version "1.0.7" + resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.7.tgz#d4cdb44b83a4737ffbac2d406e405d43d0184298" + integrity sha512-NGhtDFu3jCEm7B4Fy0DpLewdJQOZcQ0rGbwQ/+stjnrp2i+rlKeCvos9hOIeCmqwratM47OBxY7uFZzjxHXmrg== dependencies: call-bind "^1.0.2" - define-properties "^1.1.4" - es-abstract "^1.20.4" + define-properties "^1.2.0" + es-abstract "^1.22.1" string_decoder@^1.1.1: version "1.3.0" @@ -5382,12 +5276,7 @@ strip-final-newline@^2.0.0: resolved "https://registry.yarnpkg.com/strip-final-newline/-/strip-final-newline-2.0.0.tgz#89b852fb2fcbe936f6f4b3187afb0a12c1ab58ad" integrity sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA== -strip-final-newline@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/strip-final-newline/-/strip-final-newline-3.0.0.tgz#52894c313fbff318835280aed60ff71ebf12b8fd" - integrity sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw== - -strip-json-comments@^3.1.0, strip-json-comments@^3.1.1: +strip-json-comments@^3.1.1: version "3.1.1" resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== @@ -5436,14 +5325,6 @@ symbol-tree@^3.2.4: resolved "https://registry.yarnpkg.com/symbol-tree/-/symbol-tree-3.2.4.tgz#430637d248ba77e078883951fb9aa0eed7c63fa2" integrity sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw== -synckit@^0.8.5: - version "0.8.5" - resolved "https://registry.yarnpkg.com/synckit/-/synckit-0.8.5.tgz#b7f4358f9bb559437f9f167eb6bc46b3c9818fa3" - integrity sha512-L1dapNV6vu2s/4Sputv8xGsCdAVlb5nRDMFU/E27D44l5U6cw1g0dGd45uLc+OXjNMmF4ntiMdCimzcjFKQI8Q== - dependencies: - "@pkgr/utils" "^2.3.1" - tslib "^2.5.0" - table-layout@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/table-layout/-/table-layout-1.0.2.tgz#c4038a1853b0136d63365a734b6931cf4fad4a04" @@ -5512,11 +5393,6 @@ through@^2.3.6: resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" integrity sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg== -titleize@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/titleize/-/titleize-3.0.0.tgz#71c12eb7fdd2558aa8a44b0be83b8a76694acd53" - integrity sha512-KxVu8EYHDPBdUYdKZdKtU2aj2XfEx9AfjXxE/Aj0vT06w2icA09Vus1rh6eSu1y01akYg6BjIK/hxyLJINoMLQ== - tmp@^0.0.33: version "0.0.33" resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.33.tgz#6d34335889768d21b2bcda0aa277ced3b1bfadf9" @@ -5623,7 +5499,7 @@ ts-typed-json@^0.3.2: resolved "https://registry.yarnpkg.com/ts-typed-json/-/ts-typed-json-0.3.2.tgz#f4f20f45950bae0a383857f7b0a94187eca1b56a" integrity sha512-Tdu3BWzaer7R5RvBIJcg9r8HrTZgpJmsX+1meXMJzYypbkj8NK2oJN0yvm4Dp/Iv6tzFa/L5jKRmEVTga6K3nA== -tsconfig-paths@^3.14.1: +tsconfig-paths@^3.14.2: version "3.14.2" resolved "https://registry.yarnpkg.com/tsconfig-paths/-/tsconfig-paths-3.14.2.tgz#6e32f1f79412decd261f92d633a9dc1cfa99f088" integrity sha512-o/9iXgCYc5L/JxCHPe3Hvh8Q/2xm5Z+p18PESBU6Ff33695QnCHBEjcytY2q19ua7Mbl/DavtBOLq+oG0RCL+g== @@ -5648,9 +5524,9 @@ tslib@^1.8.1, tslib@^1.9.0: integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== tslib@^2.4.0, tslib@^2.5.0, tslib@^2.6.0: - version "2.6.0" - resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.6.0.tgz#b295854684dbda164e181d259a22cd779dcd7bc3" - integrity sha512-7At1WUettjcSRHXCyYtTselblcHl9PJFFVKiCAy/bY97+BPZXSQ2wbq0P9s8tK2G7dFQfNnlJnPAiArVBVBsfA== + version "2.6.2" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.6.2.tgz#703ac29425e7b37cd6fd456e92404d46d1f3e4ae" + integrity sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q== tsutils@^3.21.0: version "3.21.0" @@ -5689,16 +5565,16 @@ type-fest@^0.21.3: integrity sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w== type-graphql@^2.0.0-beta.2: - version "2.0.0-beta.2" - resolved "https://registry.yarnpkg.com/type-graphql/-/type-graphql-2.0.0-beta.2.tgz#498e8dee56b8ea1f5c3a5ed99aab8105dcb8f050" - integrity sha512-MCGxRvNADu5Wp9QEudI/WQgiqHJfjanGcKRk/ErCow6IaG04NNI7o3bjjxQVWC+qDundSOhmaquNdjDiiTbcqQ== + version "2.0.0-beta.3" + resolved "https://registry.yarnpkg.com/type-graphql/-/type-graphql-2.0.0-beta.3.tgz#71a796845dbb3f3cca5dfb97a38ffe30ee5aa1ea" + integrity sha512-5HEiQaWHPYhPmbJuMmT+IZgjsnbNWsW37osUISwgr5EpcHZ4krLl8eBoOfjFya4mxAWYshlpSO1ahaucJQqM5g== dependencies: - "@types/node" "^20.1.2" + "@types/node" "^20.4.9" "@types/semver" "^7.5.0" graphql-query-complexity "^0.12.0" graphql-subscriptions "^2.0.0" - semver "^7.5.0" - tslib "^2.5.0" + semver "^7.5.4" + tslib "^2.6.0" type-is@~1.6.17, type-is@~1.6.18: version "1.6.18" @@ -5708,6 +5584,36 @@ type-is@~1.6.17, type-is@~1.6.18: media-typer "0.3.0" mime-types "~2.1.24" +typed-array-buffer@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/typed-array-buffer/-/typed-array-buffer-1.0.0.tgz#18de3e7ed7974b0a729d3feecb94338d1472cd60" + integrity sha512-Y8KTSIglk9OZEr8zywiIHG/kmQ7KWyjseXs1CbSo8vC42w7hg2HgYTxSWwP0+is7bWDc1H+Fo026CpHFwm8tkw== + dependencies: + call-bind "^1.0.2" + get-intrinsic "^1.2.1" + is-typed-array "^1.1.10" + +typed-array-byte-length@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/typed-array-byte-length/-/typed-array-byte-length-1.0.0.tgz#d787a24a995711611fb2b87a4052799517b230d0" + integrity sha512-Or/+kvLxNpeQ9DtSydonMxCx+9ZXOswtwJn17SNLvhptaXYDJvkFFP5zbfU/uLmvnBJlI4yrnXRxpdWH/M5tNA== + dependencies: + call-bind "^1.0.2" + for-each "^0.3.3" + has-proto "^1.0.1" + is-typed-array "^1.1.10" + +typed-array-byte-offset@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/typed-array-byte-offset/-/typed-array-byte-offset-1.0.0.tgz#cbbe89b51fdef9cd6aaf07ad4707340abbc4ea0b" + integrity sha512-RD97prjEt9EL8YgAgpOkf3O4IF9lhJFr9g0htQkm0rchFp/Vx7LW5Q8fSXXub7BXAODyUQohRMyOc3faCPd0hg== + dependencies: + available-typed-arrays "^1.0.5" + call-bind "^1.0.2" + for-each "^0.3.3" + has-proto "^1.0.1" + is-typed-array "^1.1.10" + typed-array-length@^1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/typed-array-length/-/typed-array-length-1.0.4.tgz#89d83785e5c4098bec72e08b319651f0eac9c1bb" @@ -5774,11 +5680,6 @@ unpipe@1.0.0, unpipe@~1.0.0: resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" integrity sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ== -untildify@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/untildify/-/untildify-4.0.0.tgz#2bc947b953652487e4600949fb091e3ae8cd919b" - integrity sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw== - update-browserslist-db@^1.0.11: version "1.0.11" resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.0.11.tgz#9a2a641ad2907ae7b3616506f4b977851db5b940" @@ -5847,9 +5748,9 @@ validate-npm-package-name@^3.0.0: builtins "^1.0.3" validator@^13.7.0: - version "13.9.0" - resolved "https://registry.yarnpkg.com/validator/-/validator-13.9.0.tgz#33e7b85b604f3bbce9bb1a05d5c3e22e1c2ff855" - integrity sha512-B+dGG8U3fdtM0/aNK4/X8CXq/EcxU2WPrPEkJGslb47qyHsxmbggTWK0yEA4qnYVNF+nxNlN88o14hIcPmSIEA== + version "13.11.0" + resolved "https://registry.yarnpkg.com/validator/-/validator-13.11.0.tgz#23ab3fd59290c61248364eabf4067f04955fbb1b" + integrity sha512-Ii+sehpSfZy+At5nPdnyMhx78fEoPDkR2XW/zimHEL3MyGJQOCQ7WeP20jPYRz7ZCpcKLB21NxuXHF3bxjStBQ== value-or-promise@^1.0.12: version "1.0.12" @@ -5942,17 +5843,16 @@ which-boxed-primitive@^1.0.2: is-string "^1.0.5" is-symbol "^1.0.3" -which-typed-array@^1.1.9: - version "1.1.10" - resolved "https://registry.yarnpkg.com/which-typed-array/-/which-typed-array-1.1.10.tgz#74baa2789991905c2076abb317103b866c64e69e" - integrity sha512-uxoA5vLUfRPdjCuJ1h5LlYdmTLbYfums398v3WLkM+i/Wltl2/XyZpQWKbN++ck5L64SR/grOHqtXCUKmlZPNA== +which-typed-array@^1.1.10, which-typed-array@^1.1.11: + version "1.1.11" + resolved "https://registry.yarnpkg.com/which-typed-array/-/which-typed-array-1.1.11.tgz#99d691f23c72aab6768680805a271b69761ed61a" + integrity sha512-qe9UWWpkeG5yzZ0tNYxDmd7vo58HDBc39mZ0xWWpolAGADdFOzkfamWLDxkOWcvHQKVmdTyQdLD4NOfjLWTKew== dependencies: available-typed-arrays "^1.0.5" call-bind "^1.0.2" for-each "^0.3.3" gopd "^1.0.1" has-tostringtag "^1.0.0" - is-typed-array "^1.1.10" which@^2.0.1: version "2.0.2" diff --git a/docker-compose.yml b/docker-compose.yml index f3e0a7cea..95fcd4791 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -163,12 +163,12 @@ services: - internal-net - external-net ports: - - 6000:6000 + - 6010:6010 restart: always environment: # Envs used in Dockerfile # - DOCKER_WORKDIR="/app" - - PORT=6000 + - PORT=6010 - BUILD_DATE - BUILD_VERSION - BUILD_COMMIT From 6130a1606ad4711c6af7e98b8a45898345ad89c6 Mon Sep 17 00:00:00 2001 From: einhorn_b Date: Wed, 6 Sep 2023 13:15:53 +0200 Subject: [PATCH 5/9] fix lint --- .../resolver/util/sendTransactionsToDltConnector.ts | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/backend/src/graphql/resolver/util/sendTransactionsToDltConnector.ts b/backend/src/graphql/resolver/util/sendTransactionsToDltConnector.ts index 93280dbd6..98e1ffbe3 100644 --- a/backend/src/graphql/resolver/util/sendTransactionsToDltConnector.ts +++ b/backend/src/graphql/resolver/util/sendTransactionsToDltConnector.ts @@ -1,4 +1,5 @@ import { IsNull } from '@dbTools/typeorm' +import { Community } from '@entity/Community' import { DltTransaction } from '@entity/DltTransaction' import { Transaction } from '@entity/Transaction' @@ -6,8 +7,6 @@ import { DltConnectorClient } from '@/apis/DltConnectorClient' import { backendLogger as logger } from '@/server/logger' import { Monitor, MonitorNames } from '@/util/Monitor' -import { getHomeCommunityUuid } from './communities' - export async function sendTransactionsToDltConnector(): Promise { logger.info('sendTransactionsToDltConnector...') // check if this logic is still occupied, no concurrecy allowed @@ -19,7 +18,11 @@ export async function sendTransactionsToDltConnector(): Promise { await createDltTransactions() const dltConnector = DltConnectorClient.getInstance() // TODO: get actual communities from users - const senderCommunityUuid = await getHomeCommunityUuid() + const homeCommunity = await Community.findOneOrFail({ where: { foreign: false } }) + const senderCommunityUuid = homeCommunity.communityUuid + if (!senderCommunityUuid) { + throw new Error('Cannot find community uuid of home community') + } const recipientCommunityUuid = '' if (dltConnector) { logger.debug('with sending to DltConnector...') From 17e5b4638e9aff9444715d23c29ccca6f7ba243c Mon Sep 17 00:00:00 2001 From: Einhornimmond Date: Thu, 7 Sep 2023 12:47:07 +0200 Subject: [PATCH 6/9] fix createdAt Typ --- backend/src/apis/DltConnectorClient.ts | 3 +-- dlt-connector/src/graphql/input/TransactionDraft.ts | 2 +- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/backend/src/apis/DltConnectorClient.ts b/backend/src/apis/DltConnectorClient.ts index c020d1d9f..966db639b 100644 --- a/backend/src/apis/DltConnectorClient.ts +++ b/backend/src/apis/DltConnectorClient.ts @@ -84,7 +84,6 @@ export class DltConnectorClient { recipientCommunityUuid = '', ): Promise { const typeString = getTransactionTypeString(transaction.typeId) - const milliSecondsSinceEpoch = Math.round(transaction.balanceDate.getTime()) const amountString = transaction.amount.toString() try { // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment @@ -100,7 +99,7 @@ export class DltConnectorClient { }, amount: amountString, type: typeString, - createdAt: milliSecondsSinceEpoch, + createdAt: transaction.balanceDate.toString(), }, }) // eslint-disable-next-line @typescript-eslint/no-unsafe-return, @typescript-eslint/no-unsafe-member-access diff --git a/dlt-connector/src/graphql/input/TransactionDraft.ts b/dlt-connector/src/graphql/input/TransactionDraft.ts index 1e8819e51..2021dd9e1 100755 --- a/dlt-connector/src/graphql/input/TransactionDraft.ts +++ b/dlt-connector/src/graphql/input/TransactionDraft.ts @@ -30,7 +30,7 @@ export class TransactionDraft { @Field(() => String) @isValidDateString() - createdAt: string // in milliseconds + createdAt: string // only for creation transactions @Field(() => String, { nullable: true }) From e40ff0b05db3f545c482a83238cdf1db05f20b5c Mon Sep 17 00:00:00 2001 From: einhornimmond Date: Tue, 19 Sep 2023 15:41:49 +0200 Subject: [PATCH 7/9] Update backend/src/apis/DltConnectorClient.test.ts Co-authored-by: clauspeterhuebner <86960882+clauspeterhuebner@users.noreply.github.com> --- backend/src/apis/DltConnectorClient.test.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/backend/src/apis/DltConnectorClient.test.ts b/backend/src/apis/DltConnectorClient.test.ts index aa7cff2fc..c69ebbfb9 100644 --- a/backend/src/apis/DltConnectorClient.test.ts +++ b/backend/src/apis/DltConnectorClient.test.ts @@ -136,8 +136,8 @@ describe('transmitTransaction', () => { try { await DltConnectorClient.getInstance()?.transmitTransaction( localTransaction, - 'senderCommunityUUid', - 'recipientCommunity', + 'senderCommunityUuid', + 'recipientCommunityUuid', ) } catch (e) { expect(e).toMatchObject( From 04b62386125341324199cfb810a0da4737049001 Mon Sep 17 00:00:00 2001 From: einhornimmond Date: Tue, 19 Sep 2023 15:41:49 +0200 Subject: [PATCH 8/9] Update backend/src/apis/DltConnectorClient.test.ts Co-authored-by: clauspeterhuebner <86960882+clauspeterhuebner@users.noreply.github.com> --- backend/src/apis/DltConnectorClient.test.ts | 4 ++-- backend/src/apis/DltConnectorClient.ts | 4 ++-- dlt-connector/src/controller/TransactionBody.ts | 1 + 3 files changed, 5 insertions(+), 4 deletions(-) diff --git a/backend/src/apis/DltConnectorClient.test.ts b/backend/src/apis/DltConnectorClient.test.ts index aa7cff2fc..c69ebbfb9 100644 --- a/backend/src/apis/DltConnectorClient.test.ts +++ b/backend/src/apis/DltConnectorClient.test.ts @@ -136,8 +136,8 @@ describe('transmitTransaction', () => { try { await DltConnectorClient.getInstance()?.transmitTransaction( localTransaction, - 'senderCommunityUUid', - 'recipientCommunity', + 'senderCommunityUuid', + 'recipientCommunityUuid', ) } catch (e) { expect(e).toMatchObject( diff --git a/backend/src/apis/DltConnectorClient.ts b/backend/src/apis/DltConnectorClient.ts index 966db639b..f01a55d6c 100644 --- a/backend/src/apis/DltConnectorClient.ts +++ b/backend/src/apis/DltConnectorClient.ts @@ -80,8 +80,8 @@ export class DltConnectorClient { */ public async transmitTransaction( transaction: DbTransaction, - senderCommunityUuid = '', - recipientCommunityUuid = '', + senderCommunityUuid?: string, + recipientCommunityUuid?: string, ): Promise { const typeString = getTransactionTypeString(transaction.typeId) const amountString = transaction.amount.toString() diff --git a/dlt-connector/src/controller/TransactionBody.ts b/dlt-connector/src/controller/TransactionBody.ts index 4da53a5af..ae5f37710 100644 --- a/dlt-connector/src/controller/TransactionBody.ts +++ b/dlt-connector/src/controller/TransactionBody.ts @@ -30,6 +30,7 @@ export const determineCrossGroupType = ({ type, }: TransactionDraft): CrossGroupType => { if ( + !recipientUser.communityUuid || recipientUser.communityUuid === '' || senderUser.communityUuid === recipientUser.communityUuid || type === TransactionType.CREATION From 0c8c1cd7e07eab5c7c5afdc3f001d8e8c9b8b30a Mon Sep 17 00:00:00 2001 From: einhorn_b Date: Tue, 19 Sep 2023 16:17:46 +0200 Subject: [PATCH 9/9] =?UTF-8?q?remove=20irref=C3=BChrende=20Testdaten?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- backend/src/apis/DltConnectorClient.test.ts | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/backend/src/apis/DltConnectorClient.test.ts b/backend/src/apis/DltConnectorClient.test.ts index c69ebbfb9..56fa3d13f 100644 --- a/backend/src/apis/DltConnectorClient.test.ts +++ b/backend/src/apis/DltConnectorClient.test.ts @@ -134,11 +134,7 @@ describe('transmitTransaction', () => { const localTransaction = new DbTransaction() localTransaction.typeId = 12 try { - await DltConnectorClient.getInstance()?.transmitTransaction( - localTransaction, - 'senderCommunityUuid', - 'recipientCommunityUuid', - ) + await DltConnectorClient.getInstance()?.transmitTransaction(localTransaction) } catch (e) { expect(e).toMatchObject( new LogError('invalid transaction type id: ' + localTransaction.typeId.toString()),